From 4100b8e110b8b57442409d35a2105bf87580d750 Mon Sep 17 00:00:00 2001 From: PeytonPlayz595 <106421860+PeytonPlayz595@users.noreply.github.com> Date: Thu, 8 Feb 2024 20:09:35 -0500 Subject: [PATCH] Upload src --- .classpath | 20 + .project | 23 + .settings/org.eclipse.jdt.core.prefs | 14 + jars/jzlib-1.1.3.jar | Bin 0 -> 71976 bytes jars/teavm-interop-0.6.1.jar | Bin 0 -> 14994 bytes jars/teavm-jso-0.6.1.jar | Bin 0 -> 5620 bytes jars/teavm-jso-apis-0.6.1.jar | Bin 0 -> 125336 bytes md5/original.md5 | 458 ++++ .../glemu/FixedFunctionShader.java | 396 +++ .../net/PeytonPlayz585/glemu/GLObjectMap.java | 55 + .../net/PeytonPlayz585/glemu/ModeBuffer.java | 58 + .../PeytonPlayz585/glemu/vector/Matrix.java | 130 + .../PeytonPlayz585/glemu/vector/Matrix2f.java | 418 +++ .../PeytonPlayz585/glemu/vector/Matrix3f.java | 529 ++++ .../PeytonPlayz585/glemu/vector/Matrix4f.java | 902 ++++++ .../glemu/vector/Quaternion.java | 506 ++++ .../glemu/vector/ReadableVector.java | 57 + .../glemu/vector/ReadableVector2f.java | 47 + .../glemu/vector/ReadableVector3f.java | 42 + .../glemu/vector/ReadableVector4f.java | 44 + .../PeytonPlayz585/glemu/vector/Vector.java | 110 + .../PeytonPlayz585/glemu/vector/Vector2f.java | 319 +++ .../PeytonPlayz585/glemu/vector/Vector3f.java | 376 +++ .../PeytonPlayz585/glemu/vector/Vector4f.java | 377 +++ .../glemu/vector/WritableVector2f.java | 64 + .../glemu/vector/WritableVector3f.java | 58 + .../glemu/vector/WritableVector4f.java | 59 + .../net/PeytonPlayz585/math/MathHelper.java | 29 + .../storage/LocalStorageManager.java | 81 + .../java/net/PeytonPlayz595/nbt/NBTBase.java | 130 + .../net/PeytonPlayz595/nbt/NBTTagByte.java | 31 + .../PeytonPlayz595/nbt/NBTTagByteArray.java | 34 + .../PeytonPlayz595/nbt/NBTTagCompound.java | 194 ++ .../net/PeytonPlayz595/nbt/NBTTagDouble.java | 31 + .../net/PeytonPlayz595/nbt/NBTTagEnd.java | 23 + .../net/PeytonPlayz595/nbt/NBTTagFloat.java | 31 + .../net/PeytonPlayz595/nbt/NBTTagInt.java | 31 + .../net/PeytonPlayz595/nbt/NBTTagList.java | 63 + .../net/PeytonPlayz595/nbt/NBTTagLong.java | 31 + .../net/PeytonPlayz595/nbt/NBTTagShort.java | 31 + .../net/PeytonPlayz595/nbt/NBTTagString.java | 36 + .../lax1dude/eaglercraft/AssetRepository.java | 55 + .../java/net/lax1dude/eaglercraft/Base64.java | 857 ++++++ .../net/lax1dude/eaglercraft/BaseNCodec.java | 694 +++++ .../java/net/lax1dude/eaglercraft/Client.java | 137 + .../net/lax1dude/eaglercraft/EaglerImage.java | 43 + .../lax1dude/eaglercraft/GLAllocation.java | 60 + .../lax1dude/eaglercraft/GeneralDigest.java | 108 + .../net/lax1dude/eaglercraft/SHA1Digest.java | 213 ++ .../adapter/EaglerAdapterImpl2.java | 1843 +++++++++++++ .../eaglercraft/adapter/Tessellator.java | 339 +++ .../adapter/teavm/BufferConverter.java | 34 + .../adapter/teavm/IDBObjectStorePatched.java | 79 + .../adapter/teavm/IndexedDBFilesystem.java | 407 +++ .../adapter/teavm/WebGL2RenderingContext.java | 42 + .../eaglercraft/adapter/teavm/WebGLQuery.java | 6 + .../adapter/teavm/WebGLVertexArray.java | 6 + .../java/net/minecraft/client/Minecraft.java | 952 +++++++ .../java/net/minecraft/src/AxisAlignedBB.java | 317 +++ src/main/java/net/minecraft/src/Block.java | 493 ++++ .../net/minecraft/src/BlockBloodStone.java | 7 + .../net/minecraft/src/BlockBookshelf.java | 17 + .../net/minecraft/src/BlockBreakable.java | 19 + .../java/net/minecraft/src/BlockButton.java | 236 ++ .../java/net/minecraft/src/BlockCactus.java | 86 + .../java/net/minecraft/src/BlockChest.java | 196 ++ .../java/net/minecraft/src/BlockClay.java | 17 + .../net/minecraft/src/BlockContainer.java | 24 + .../java/net/minecraft/src/BlockCrops.java | 110 + .../java/net/minecraft/src/BlockDirt.java | 7 + .../java/net/minecraft/src/BlockDoor.java | 195 ++ .../java/net/minecraft/src/BlockFence.java | 29 + .../java/net/minecraft/src/BlockFire.java | 228 ++ .../java/net/minecraft/src/BlockFlower.java | 58 + .../java/net/minecraft/src/BlockFlowing.java | 263 ++ .../java/net/minecraft/src/BlockFluids.java | 269 ++ .../java/net/minecraft/src/BlockFurnace.java | 130 + .../java/net/minecraft/src/BlockGlass.java | 13 + .../java/net/minecraft/src/BlockGrass.java | 51 + .../java/net/minecraft/src/BlockGravel.java | 13 + src/main/java/net/minecraft/src/BlockIce.java | 39 + .../java/net/minecraft/src/BlockJukeBox.java | 44 + .../java/net/minecraft/src/BlockLadder.java | 121 + .../java/net/minecraft/src/BlockLeaves.java | 128 + .../net/minecraft/src/BlockLeavesBase.java | 19 + .../java/net/minecraft/src/BlockLever.java | 200 ++ .../net/minecraft/src/BlockLightStone.java | 13 + src/main/java/net/minecraft/src/BlockLog.java | 22 + .../net/minecraft/src/BlockMinecartTrack.java | 101 + .../net/minecraft/src/BlockMobSpawner.java | 25 + .../java/net/minecraft/src/BlockMushroom.java | 17 + .../java/net/minecraft/src/BlockObsidian.java | 17 + src/main/java/net/minecraft/src/BlockOre.java | 17 + .../java/net/minecraft/src/BlockOreBlock.java | 12 + .../java/net/minecraft/src/BlockPortal.java | 167 ++ .../net/minecraft/src/BlockPressurePlate.java | 151 + .../java/net/minecraft/src/BlockPumpkin.java | 45 + .../net/minecraft/src/BlockRedstoneOre.java | 104 + .../net/minecraft/src/BlockRedstoneTorch.java | 153 ++ .../net/minecraft/src/BlockRedstoneWire.java | 308 +++ .../java/net/minecraft/src/BlockReed.java | 73 + .../java/net/minecraft/src/BlockSand.java | 53 + .../java/net/minecraft/src/BlockSapling.java | 32 + .../java/net/minecraft/src/BlockSign.java | 113 + .../java/net/minecraft/src/BlockSlowSand.java | 17 + .../java/net/minecraft/src/BlockSnow.java | 75 + .../net/minecraft/src/BlockSnowBlock.java | 26 + .../java/net/minecraft/src/BlockSoil.java | 93 + .../java/net/minecraft/src/BlockSponge.java | 35 + .../java/net/minecraft/src/BlockStairs.java | 188 ++ .../net/minecraft/src/BlockStationary.java | 57 + .../java/net/minecraft/src/BlockStep.java | 59 + .../java/net/minecraft/src/BlockStone.java | 13 + src/main/java/net/minecraft/src/BlockTNT.java | 39 + .../java/net/minecraft/src/BlockTorch.java | 166 ++ .../net/minecraft/src/BlockWorkbench.java | 17 + src/main/java/net/minecraft/src/ChatLine.java | 11 + src/main/java/net/minecraft/src/Chunk.java | 598 ++++ .../java/net/minecraft/src/ChunkCache.java | 127 + .../net/minecraft/src/ChunkCoordIntPair.java | 20 + .../net/minecraft/src/ChunkCoordinates.java | 24 + .../java/net/minecraft/src/ChunkLoader.java | 207 ++ .../java/net/minecraft/src/ChunkPosition.java | 26 + .../minecraft/src/ChunkProviderClient.java | 67 + .../minecraft/src/ChunkProviderGenerate.java | 546 ++++ .../net/minecraft/src/ChunkProviderHell.java | 370 +++ .../net/minecraft/src/ChunkProviderIso.java | 66 + .../src/ChunkProviderLoadOrGenerate.java | 201 ++ .../net/minecraft/src/ClippingHelper.java | 18 + .../src/ClippingHelperImplementation.java | 82 + .../net/minecraft/src/ColorizerFoliage.java | 25 + .../net/minecraft/src/ColorizerGrass.java | 25 + .../minecraft/src/CompressedStreamTools.java | 78 + .../minecraft/src/CraftingInventoryCB.java | 19 + .../src/CraftingInventoryPlayerCB.java | 43 + .../src/CraftingInventoryWorkbenchCB.java | 36 + .../net/minecraft/src/CraftingManager.java | 129 + .../net/minecraft/src/CraftingRecipe.java | 64 + .../net/minecraft/src/EffectRenderer.java | 166 ++ src/main/java/net/minecraft/src/Entity.java | 901 ++++++ .../java/net/minecraft/src/EntityAnimals.java | 30 + .../java/net/minecraft/src/EntityArrow.java | 248 ++ .../java/net/minecraft/src/EntityBoat.java | 319 +++ .../net/minecraft/src/EntityBubbleFX.java | 36 + .../java/net/minecraft/src/EntityChicken.java | 77 + .../java/net/minecraft/src/EntityCow.java | 49 + .../net/minecraft/src/EntityCreature.java | 151 + .../java/net/minecraft/src/EntityCreeper.java | 126 + .../net/minecraft/src/EntityDiggingFX.java | 47 + .../net/minecraft/src/EntityExplodeFX.java | 38 + src/main/java/net/minecraft/src/EntityFX.java | 99 + .../net/minecraft/src/EntityFallingSand.java | 82 + .../net/minecraft/src/EntityFireball.java | 207 ++ .../java/net/minecraft/src/EntityFish.java | 367 +++ .../java/net/minecraft/src/EntityFlameFX.java | 59 + .../java/net/minecraft/src/EntityFlying.java | 66 + .../java/net/minecraft/src/EntityGhast.java | 139 + .../java/net/minecraft/src/EntityItem.java | 191 ++ .../java/net/minecraft/src/EntityLavaFX.java | 54 + .../java/net/minecraft/src/EntityList.java | 106 + .../java/net/minecraft/src/EntityLiving.java | 787 ++++++ .../net/minecraft/src/EntityMinecart.java | 707 +++++ .../java/net/minecraft/src/EntityMobs.java | 80 + .../net/minecraft/src/EntityPainting.java | 213 ++ .../net/minecraft/src/EntityPickupFX.java | 54 + .../java/net/minecraft/src/EntityPig.java | 47 + .../net/minecraft/src/EntityPigZombie.java | 92 + .../java/net/minecraft/src/EntityPlayer.java | 281 ++ .../net/minecraft/src/EntityPlayerSP.java | 156 ++ .../net/minecraft/src/EntityPortalFX.java | 60 + .../java/net/minecraft/src/EntityRainFX.java | 53 + .../net/minecraft/src/EntityReddustFX.java | 63 + .../net/minecraft/src/EntityRenderer.java | 560 ++++ .../java/net/minecraft/src/EntitySheep.java | 49 + .../net/minecraft/src/EntitySkeleton.java | 70 + .../java/net/minecraft/src/EntitySlime.java | 129 + .../java/net/minecraft/src/EntitySlimeFX.java | 32 + .../java/net/minecraft/src/EntitySmokeFX.java | 63 + .../net/minecraft/src/EntitySnowball.java | 231 ++ .../java/net/minecraft/src/EntitySorter.java | 19 + .../java/net/minecraft/src/EntitySpider.java | 69 + .../net/minecraft/src/EntitySplashFX.java | 15 + .../net/minecraft/src/EntityTNTPrimed.java | 72 + .../java/net/minecraft/src/EntityZombie.java | 37 + .../net/minecraft/src/EntityZombieSimple.java | 17 + src/main/java/net/minecraft/src/EnumArt.java | 42 + .../net/minecraft/src/EnumCreatureType.java | 14 + .../java/net/minecraft/src/EnumMobType.java | 7 + .../java/net/minecraft/src/EnumSkyBlock.java | 12 + .../java/net/minecraft/src/Explosion.java | 166 ++ .../minecraft/src/FontAllowedCharacters.java | 27 + .../java/net/minecraft/src/FontRenderer.java | 183 ++ src/main/java/net/minecraft/src/Frustrum.java | 22 + .../java/net/minecraft/src/GLAllocation.java | 60 + .../java/net/minecraft/src/GameSettings.java | 229 ++ .../net/minecraft/src/GameWindowListener.java | 27 + src/main/java/net/minecraft/src/Gui.java | 76 + .../java/net/minecraft/src/GuiButton.java | 74 + src/main/java/net/minecraft/src/GuiChat.java | 62 + src/main/java/net/minecraft/src/GuiChest.java | 54 + .../net/minecraft/src/GuiConflictWarning.java | 33 + .../net/minecraft/src/GuiConnectFailed.java | 36 + .../java/net/minecraft/src/GuiContainer.java | 229 ++ .../java/net/minecraft/src/GuiControls.java | 52 + .../java/net/minecraft/src/GuiCrafting.java | 49 + .../net/minecraft/src/GuiDeleteWorld.java | 32 + .../java/net/minecraft/src/GuiEditSign.java | 100 + .../java/net/minecraft/src/GuiFurnace.java | 48 + .../java/net/minecraft/src/GuiGameOver.java | 48 + .../java/net/minecraft/src/GuiIngame.java | 371 +++ .../java/net/minecraft/src/GuiIngameMenu.java | 50 + .../java/net/minecraft/src/GuiInventory.java | 85 + .../java/net/minecraft/src/GuiMainMenu.java | 220 ++ .../java/net/minecraft/src/GuiOptions.java | 52 + .../java/net/minecraft/src/GuiScreen.java | 161 ++ .../net/minecraft/src/GuiSelectWorld.java | 71 + .../java/net/minecraft/src/GuiSlider.java | 66 + .../net/minecraft/src/GuiSmallButton.java | 7 + .../java/net/minecraft/src/GuiUnused.java | 19 + src/main/java/net/minecraft/src/GuiYesNo.java | 31 + .../java/net/minecraft/src/HashEntry.java | 50 + .../java/net/minecraft/src/IBlockAccess.java | 17 + src/main/java/net/minecraft/src/ICamera.java | 7 + .../java/net/minecraft/src/IChunkLoader.java | 15 + .../net/minecraft/src/IChunkProvider.java | 15 + .../java/net/minecraft/src/IInventory.java | 17 + src/main/java/net/minecraft/src/IMobs.java | 4 + .../net/minecraft/src/IProgressUpdate.java | 9 + .../java/net/minecraft/src/IWorldAccess.java | 21 + .../minecraft/src/InventoryCraftResult.java | 38 + .../net/minecraft/src/InventoryCrafting.java | 65 + .../minecraft/src/InventoryLargeChest.java | 47 + .../net/minecraft/src/InventoryPlayer.java | 403 +++ src/main/java/net/minecraft/src/Item.java | 178 ++ .../java/net/minecraft/src/ItemArmor.java | 20 + src/main/java/net/minecraft/src/ItemAxe.java | 9 + .../java/net/minecraft/src/ItemBlock.java | 57 + src/main/java/net/minecraft/src/ItemBoat.java | 43 + src/main/java/net/minecraft/src/ItemBow.java | 19 + .../java/net/minecraft/src/ItemBucket.java | 101 + src/main/java/net/minecraft/src/ItemDoor.java | 72 + .../net/minecraft/src/ItemFishingRod.java | 33 + .../net/minecraft/src/ItemFlintAndSteel.java | 44 + src/main/java/net/minecraft/src/ItemFood.java | 17 + src/main/java/net/minecraft/src/ItemHoe.java | 45 + .../java/net/minecraft/src/ItemMinecart.java | 25 + .../java/net/minecraft/src/ItemPainting.java | 37 + .../java/net/minecraft/src/ItemPickaxe.java | 15 + .../java/net/minecraft/src/ItemRecord.java | 22 + .../java/net/minecraft/src/ItemRedstone.java | 44 + src/main/java/net/minecraft/src/ItemReed.java | 55 + .../java/net/minecraft/src/ItemRenderer.java | 350 +++ .../java/net/minecraft/src/ItemSaddle.java | 24 + .../java/net/minecraft/src/ItemSeeds.java | 25 + src/main/java/net/minecraft/src/ItemSign.java | 55 + .../java/net/minecraft/src/ItemSnowball.java | 18 + src/main/java/net/minecraft/src/ItemSoup.java | 12 + .../java/net/minecraft/src/ItemSpade.java | 13 + .../java/net/minecraft/src/ItemStack.java | 132 + .../java/net/minecraft/src/ItemSword.java | 36 + src/main/java/net/minecraft/src/ItemTool.java | 48 + .../java/net/minecraft/src/KeyBinding.java | 11 + .../minecraft/src/LoadingScreenRenderer.java | 124 + .../minecraft/src/LogoEffectRandomizer.java | 28 + .../java/net/minecraft/src/MCHashTable.java | 135 + .../java/net/minecraft/src/MapGenBase.java | 26 + .../java/net/minecraft/src/MapGenCaves.java | 185 ++ .../net/minecraft/src/MapGenCavesHell.java | 173 ++ src/main/java/net/minecraft/src/Material.java | 54 + .../net/minecraft/src/MaterialLiquid.java | 15 + .../java/net/minecraft/src/MaterialLogic.java | 15 + .../minecraft/src/MaterialTransparent.java | 15 + .../java/net/minecraft/src/MathHelper.java | 58 + .../net/minecraft/src/MetadataChunkBlock.java | 175 ++ .../net/minecraft/src/MinecartTrackLogic.java | 323 +++ .../net/minecraft/src/MinecraftError.java | 4 + .../net/minecraft/src/MinecraftException.java | 7 + .../net/minecraft/src/MobSpawnerBase.java | 88 + .../net/minecraft/src/MobSpawnerDesert.java | 4 + .../net/minecraft/src/MobSpawnerHell.java | 8 + .../net/minecraft/src/MobSpawnerSwamp.java | 4 + .../java/net/minecraft/src/ModelBase.java | 12 + .../java/net/minecraft/src/ModelBiped.java | 141 + .../java/net/minecraft/src/ModelBoat.java | 41 + .../java/net/minecraft/src/ModelChicken.java | 66 + src/main/java/net/minecraft/src/ModelCow.java | 50 + .../java/net/minecraft/src/ModelCreeper.java | 56 + .../java/net/minecraft/src/ModelGhast.java | 45 + .../java/net/minecraft/src/ModelMinecart.java | 47 + src/main/java/net/minecraft/src/ModelPig.java | 11 + .../net/minecraft/src/ModelQuadraped.java | 50 + .../java/net/minecraft/src/ModelRenderer.java | 165 ++ .../java/net/minecraft/src/ModelSheep1.java | 26 + .../java/net/minecraft/src/ModelSheep2.java | 13 + .../java/net/minecraft/src/ModelSkeleton.java | 21 + .../java/net/minecraft/src/ModelSlime.java | 38 + .../java/net/minecraft/src/ModelSpider.java | 116 + .../java/net/minecraft/src/ModelZombie.java | 21 + .../java/net/minecraft/src/MouseHelper.java | 26 + .../java/net/minecraft/src/MovementInput.java | 18 + .../src/MovementInputFromOptions.java | 77 + .../minecraft/src/MovingObjectPosition.java | 26 + src/main/java/net/minecraft/src/NBTBase.java | 102 + .../java/net/minecraft/src/NBTTagByte.java | 32 + .../net/minecraft/src/NBTTagByteArray.java | 35 + .../net/minecraft/src/NBTTagCompound.java | 136 + .../java/net/minecraft/src/NBTTagDouble.java | 32 + .../java/net/minecraft/src/NBTTagEnd.java | 21 + .../java/net/minecraft/src/NBTTagFloat.java | 32 + .../java/net/minecraft/src/NBTTagInt.java | 32 + .../java/net/minecraft/src/NBTTagList.java | 62 + .../java/net/minecraft/src/NBTTagLong.java | 32 + .../java/net/minecraft/src/NBTTagShort.java | 32 + .../java/net/minecraft/src/NBTTagString.java | 35 + .../net/minecraft/src/NextTickListEntry.java | 44 + .../java/net/minecraft/src/NibbleArray.java | 36 + .../net/minecraft/src/NoiseGenerator.java | 4 + .../net/minecraft/src/NoiseGenerator2.java | 114 + .../minecraft/src/NoiseGeneratorOctaves.java | 53 + .../minecraft/src/NoiseGeneratorOctaves2.java | 45 + .../minecraft/src/NoiseGeneratorPerlin.java | 221 ++ src/main/java/net/minecraft/src/Path.java | 119 + .../java/net/minecraft/src/PathEntity.java | 27 + .../java/net/minecraft/src/PathPoint.java | 44 + .../java/net/minecraft/src/Pathfinder.java | 193 ++ .../net/minecraft/src/PlayerController.java | 90 + .../net/minecraft/src/PlayerControllerSP.java | 116 + .../minecraft/src/PlayerControllerTest.java | 32 + .../minecraft/src/PositionTexureVertex.java | 27 + .../java/net/minecraft/src/RecipeSorter.java | 19 + .../java/net/minecraft/src/RecipesArmor.java | 18 + .../net/minecraft/src/RecipesCrafting.java | 9 + .../java/net/minecraft/src/RecipesFood.java | 8 + .../java/net/minecraft/src/RecipesIngots.java | 15 + .../java/net/minecraft/src/RecipesTools.java | 18 + .../net/minecraft/src/RecipesWeapons.java | 20 + .../net/minecraft/src/RedstoneUpdateInfo.java | 15 + src/main/java/net/minecraft/src/Render.java | 228 ++ .../java/net/minecraft/src/RenderArrow.java | 67 + .../java/net/minecraft/src/RenderBiped.java | 47 + .../java/net/minecraft/src/RenderBlocks.java | 1908 +++++++++++++ .../java/net/minecraft/src/RenderBoat.java | 40 + .../java/net/minecraft/src/RenderChicken.java | 29 + .../java/net/minecraft/src/RenderCow.java | 19 + .../java/net/minecraft/src/RenderCreeper.java | 56 + .../java/net/minecraft/src/RenderEngine.java | 195 ++ .../java/net/minecraft/src/RenderEntity.java | 11 + .../net/minecraft/src/RenderFallingSand.java | 27 + .../net/minecraft/src/RenderFireball.java | 39 + .../java/net/minecraft/src/RenderFish.java | 80 + .../java/net/minecraft/src/RenderGhast.java | 26 + .../java/net/minecraft/src/RenderGlobal.java | 1023 +++++++ .../java/net/minecraft/src/RenderHelper.java | 49 + .../java/net/minecraft/src/RenderItem.java | 195 ++ .../java/net/minecraft/src/RenderList.java | 61 + .../java/net/minecraft/src/RenderLiving.java | 150 + .../java/net/minecraft/src/RenderManager.java | 120 + .../net/minecraft/src/RenderMinecart.java | 82 + .../net/minecraft/src/RenderPainting.java | 119 + .../java/net/minecraft/src/RenderPig.java | 17 + .../java/net/minecraft/src/RenderPlayer.java | 207 ++ .../java/net/minecraft/src/RenderSheep.java | 17 + .../java/net/minecraft/src/RenderSlime.java | 44 + .../net/minecraft/src/RenderSnowball.java | 38 + .../java/net/minecraft/src/RenderSorter.java | 29 + .../java/net/minecraft/src/RenderSpider.java | 38 + .../net/minecraft/src/RenderTNTPrimed.java | 54 + .../net/minecraft/src/RenderZombieSimple.java | 20 + .../net/minecraft/src/ScaledResolution.java | 26 + src/main/java/net/minecraft/src/Session.java | 46 + .../java/net/minecraft/src/SignModel.java | 17 + src/main/java/net/minecraft/src/Slot.java | 40 + .../java/net/minecraft/src/SlotArmor.java | 29 + .../java/net/minecraft/src/SlotCrafting.java | 23 + .../java/net/minecraft/src/SlotInventory.java | 22 + .../net/minecraft/src/SpawnerAnimals.java | 133 + .../java/net/minecraft/src/StepSound.java | 29 + .../java/net/minecraft/src/StepSoundSand.java | 11 + .../net/minecraft/src/StepSoundStone.java | 11 + .../java/net/minecraft/src/Teleporter.java | 262 ++ .../minecraft/src/TerrainTextureManager.java | 87 + .../java/net/minecraft/src/Tessellator.java | 268 ++ .../net/minecraft/src/TextureCompassFX.java | 142 + .../java/net/minecraft/src/TextureFX.java | 28 + .../net/minecraft/src/TextureFlamesFX.java | 77 + .../java/net/minecraft/src/TextureLavaFX.java | 81 + .../net/minecraft/src/TextureLavaFlowFX.java | 85 + .../net/minecraft/src/TexturePortalFX.java | 88 + .../net/minecraft/src/TextureWatchFX.java | 99 + .../net/minecraft/src/TextureWaterFX.java | 85 + .../java/net/minecraft/src/TexturedQuad.java | 53 + .../net/minecraft/src/TexureWaterFlowFX.java | 86 + .../net/minecraft/src/ThreadSleepForever.java | 24 + .../java/net/minecraft/src/TileEntity.java | 90 + .../net/minecraft/src/TileEntityChest.java | 83 + .../net/minecraft/src/TileEntityFurnace.java | 187 ++ .../minecraft/src/TileEntityMobSpawner.java | 93 + .../src/TileEntityMobSpawnerRenderer.java | 37 + .../net/minecraft/src/TileEntityRenderer.java | 86 + .../net/minecraft/src/TileEntitySign.java | 26 + .../minecraft/src/TileEntitySignRenderer.java | 70 + .../src/TileEntitySpecialRenderer.java | 20 + src/main/java/net/minecraft/src/Timer.java | 58 + .../minecraft/src/UnexpectedThrowable.java | 11 + src/main/java/net/minecraft/src/Vec3D.java | 157 ++ src/main/java/net/minecraft/src/World.java | 2047 ++++++++++++++ .../net/minecraft/src/WorldChunkManager.java | 117 + .../minecraft/src/WorldChunkManagerHell.java | 54 + .../net/minecraft/src/WorldGenBigTree.java | 348 +++ .../net/minecraft/src/WorldGenCactus.java | 24 + .../java/net/minecraft/src/WorldGenClay.java | 53 + .../net/minecraft/src/WorldGenDungeons.java | 116 + .../java/net/minecraft/src/WorldGenFire.java | 18 + .../net/minecraft/src/WorldGenFlowers.java | 24 + .../net/minecraft/src/WorldGenHellLava.java | 70 + .../java/net/minecraft/src/WorldGenLakes.java | 88 + .../minecraft/src/WorldGenLightStone1.java | 61 + .../minecraft/src/WorldGenLightStone2.java | 61 + .../net/minecraft/src/WorldGenLiquids.java | 64 + .../net/minecraft/src/WorldGenMinable.java | 47 + .../net/minecraft/src/WorldGenPumpkin.java | 18 + .../java/net/minecraft/src/WorldGenReed.java | 24 + .../java/net/minecraft/src/WorldGenTrees.java | 78 + .../net/minecraft/src/WorldGenerator.java | 10 + .../java/net/minecraft/src/WorldProvider.java | 109 + .../net/minecraft/src/WorldProviderHell.java | 50 + .../java/net/minecraft/src/WorldRenderer.java | 214 ++ src/main/java/org/lwjgl/input/Keyboard.java | 15 + src/main/java/org/lwjgl/input/Mouse.java | 55 + .../org/lwjgl/opengl/EaglerAdapterGL30.java | 1228 +++++++++ src/main/java/org/lwjgl/opengl/GL11.java | 9 + src/main/java/org/lwjgl/opengl/GL12.java | 5 + .../org/lwjgl/opengl/RealOpenGLEnums.java | 2417 +++++++++++++++++ src/main/java/org/lwjgl/util/glu/GLU.java | 7 + 434 files changed, 52242 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 jars/jzlib-1.1.3.jar create mode 100644 jars/teavm-interop-0.6.1.jar create mode 100644 jars/teavm-jso-0.6.1.jar create mode 100644 jars/teavm-jso-apis-0.6.1.jar create mode 100644 md5/original.md5 create mode 100644 src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java create mode 100644 src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java create mode 100644 src/main/java/net/PeytonPlayz585/math/MathHelper.java create mode 100644 src/main/java/net/PeytonPlayz585/storage/LocalStorageManager.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTBase.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java create mode 100644 src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/AssetRepository.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/Base64.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/Client.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/EaglerImage.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/GLAllocation.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java create mode 100644 src/main/java/net/minecraft/client/Minecraft.java create mode 100644 src/main/java/net/minecraft/src/AxisAlignedBB.java create mode 100644 src/main/java/net/minecraft/src/Block.java create mode 100644 src/main/java/net/minecraft/src/BlockBloodStone.java create mode 100644 src/main/java/net/minecraft/src/BlockBookshelf.java create mode 100644 src/main/java/net/minecraft/src/BlockBreakable.java create mode 100644 src/main/java/net/minecraft/src/BlockButton.java create mode 100644 src/main/java/net/minecraft/src/BlockCactus.java create mode 100644 src/main/java/net/minecraft/src/BlockChest.java create mode 100644 src/main/java/net/minecraft/src/BlockClay.java create mode 100644 src/main/java/net/minecraft/src/BlockContainer.java create mode 100644 src/main/java/net/minecraft/src/BlockCrops.java create mode 100644 src/main/java/net/minecraft/src/BlockDirt.java create mode 100644 src/main/java/net/minecraft/src/BlockDoor.java create mode 100644 src/main/java/net/minecraft/src/BlockFence.java create mode 100644 src/main/java/net/minecraft/src/BlockFire.java create mode 100644 src/main/java/net/minecraft/src/BlockFlower.java create mode 100644 src/main/java/net/minecraft/src/BlockFlowing.java create mode 100644 src/main/java/net/minecraft/src/BlockFluids.java create mode 100644 src/main/java/net/minecraft/src/BlockFurnace.java create mode 100644 src/main/java/net/minecraft/src/BlockGlass.java create mode 100644 src/main/java/net/minecraft/src/BlockGrass.java create mode 100644 src/main/java/net/minecraft/src/BlockGravel.java create mode 100644 src/main/java/net/minecraft/src/BlockIce.java create mode 100644 src/main/java/net/minecraft/src/BlockJukeBox.java create mode 100644 src/main/java/net/minecraft/src/BlockLadder.java create mode 100644 src/main/java/net/minecraft/src/BlockLeaves.java create mode 100644 src/main/java/net/minecraft/src/BlockLeavesBase.java create mode 100644 src/main/java/net/minecraft/src/BlockLever.java create mode 100644 src/main/java/net/minecraft/src/BlockLightStone.java create mode 100644 src/main/java/net/minecraft/src/BlockLog.java create mode 100644 src/main/java/net/minecraft/src/BlockMinecartTrack.java create mode 100644 src/main/java/net/minecraft/src/BlockMobSpawner.java create mode 100644 src/main/java/net/minecraft/src/BlockMushroom.java create mode 100644 src/main/java/net/minecraft/src/BlockObsidian.java create mode 100644 src/main/java/net/minecraft/src/BlockOre.java create mode 100644 src/main/java/net/minecraft/src/BlockOreBlock.java create mode 100644 src/main/java/net/minecraft/src/BlockPortal.java create mode 100644 src/main/java/net/minecraft/src/BlockPressurePlate.java create mode 100644 src/main/java/net/minecraft/src/BlockPumpkin.java create mode 100644 src/main/java/net/minecraft/src/BlockRedstoneOre.java create mode 100644 src/main/java/net/minecraft/src/BlockRedstoneTorch.java create mode 100644 src/main/java/net/minecraft/src/BlockRedstoneWire.java create mode 100644 src/main/java/net/minecraft/src/BlockReed.java create mode 100644 src/main/java/net/minecraft/src/BlockSand.java create mode 100644 src/main/java/net/minecraft/src/BlockSapling.java create mode 100644 src/main/java/net/minecraft/src/BlockSign.java create mode 100644 src/main/java/net/minecraft/src/BlockSlowSand.java create mode 100644 src/main/java/net/minecraft/src/BlockSnow.java create mode 100644 src/main/java/net/minecraft/src/BlockSnowBlock.java create mode 100644 src/main/java/net/minecraft/src/BlockSoil.java create mode 100644 src/main/java/net/minecraft/src/BlockSponge.java create mode 100644 src/main/java/net/minecraft/src/BlockStairs.java create mode 100644 src/main/java/net/minecraft/src/BlockStationary.java create mode 100644 src/main/java/net/minecraft/src/BlockStep.java create mode 100644 src/main/java/net/minecraft/src/BlockStone.java create mode 100644 src/main/java/net/minecraft/src/BlockTNT.java create mode 100644 src/main/java/net/minecraft/src/BlockTorch.java create mode 100644 src/main/java/net/minecraft/src/BlockWorkbench.java create mode 100644 src/main/java/net/minecraft/src/ChatLine.java create mode 100644 src/main/java/net/minecraft/src/Chunk.java create mode 100644 src/main/java/net/minecraft/src/ChunkCache.java create mode 100644 src/main/java/net/minecraft/src/ChunkCoordIntPair.java create mode 100644 src/main/java/net/minecraft/src/ChunkCoordinates.java create mode 100644 src/main/java/net/minecraft/src/ChunkLoader.java create mode 100644 src/main/java/net/minecraft/src/ChunkPosition.java create mode 100644 src/main/java/net/minecraft/src/ChunkProviderClient.java create mode 100644 src/main/java/net/minecraft/src/ChunkProviderGenerate.java create mode 100644 src/main/java/net/minecraft/src/ChunkProviderHell.java create mode 100644 src/main/java/net/minecraft/src/ChunkProviderIso.java create mode 100644 src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java create mode 100644 src/main/java/net/minecraft/src/ClippingHelper.java create mode 100644 src/main/java/net/minecraft/src/ClippingHelperImplementation.java create mode 100644 src/main/java/net/minecraft/src/ColorizerFoliage.java create mode 100644 src/main/java/net/minecraft/src/ColorizerGrass.java create mode 100644 src/main/java/net/minecraft/src/CompressedStreamTools.java create mode 100644 src/main/java/net/minecraft/src/CraftingInventoryCB.java create mode 100644 src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java create mode 100644 src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java create mode 100644 src/main/java/net/minecraft/src/CraftingManager.java create mode 100644 src/main/java/net/minecraft/src/CraftingRecipe.java create mode 100644 src/main/java/net/minecraft/src/EffectRenderer.java create mode 100644 src/main/java/net/minecraft/src/Entity.java create mode 100644 src/main/java/net/minecraft/src/EntityAnimals.java create mode 100644 src/main/java/net/minecraft/src/EntityArrow.java create mode 100644 src/main/java/net/minecraft/src/EntityBoat.java create mode 100644 src/main/java/net/minecraft/src/EntityBubbleFX.java create mode 100644 src/main/java/net/minecraft/src/EntityChicken.java create mode 100644 src/main/java/net/minecraft/src/EntityCow.java create mode 100644 src/main/java/net/minecraft/src/EntityCreature.java create mode 100644 src/main/java/net/minecraft/src/EntityCreeper.java create mode 100644 src/main/java/net/minecraft/src/EntityDiggingFX.java create mode 100644 src/main/java/net/minecraft/src/EntityExplodeFX.java create mode 100644 src/main/java/net/minecraft/src/EntityFX.java create mode 100644 src/main/java/net/minecraft/src/EntityFallingSand.java create mode 100644 src/main/java/net/minecraft/src/EntityFireball.java create mode 100644 src/main/java/net/minecraft/src/EntityFish.java create mode 100644 src/main/java/net/minecraft/src/EntityFlameFX.java create mode 100644 src/main/java/net/minecraft/src/EntityFlying.java create mode 100644 src/main/java/net/minecraft/src/EntityGhast.java create mode 100644 src/main/java/net/minecraft/src/EntityItem.java create mode 100644 src/main/java/net/minecraft/src/EntityLavaFX.java create mode 100644 src/main/java/net/minecraft/src/EntityList.java create mode 100644 src/main/java/net/minecraft/src/EntityLiving.java create mode 100644 src/main/java/net/minecraft/src/EntityMinecart.java create mode 100644 src/main/java/net/minecraft/src/EntityMobs.java create mode 100644 src/main/java/net/minecraft/src/EntityPainting.java create mode 100644 src/main/java/net/minecraft/src/EntityPickupFX.java create mode 100644 src/main/java/net/minecraft/src/EntityPig.java create mode 100644 src/main/java/net/minecraft/src/EntityPigZombie.java create mode 100644 src/main/java/net/minecraft/src/EntityPlayer.java create mode 100644 src/main/java/net/minecraft/src/EntityPlayerSP.java create mode 100644 src/main/java/net/minecraft/src/EntityPortalFX.java create mode 100644 src/main/java/net/minecraft/src/EntityRainFX.java create mode 100644 src/main/java/net/minecraft/src/EntityReddustFX.java create mode 100644 src/main/java/net/minecraft/src/EntityRenderer.java create mode 100644 src/main/java/net/minecraft/src/EntitySheep.java create mode 100644 src/main/java/net/minecraft/src/EntitySkeleton.java create mode 100644 src/main/java/net/minecraft/src/EntitySlime.java create mode 100644 src/main/java/net/minecraft/src/EntitySlimeFX.java create mode 100644 src/main/java/net/minecraft/src/EntitySmokeFX.java create mode 100644 src/main/java/net/minecraft/src/EntitySnowball.java create mode 100644 src/main/java/net/minecraft/src/EntitySorter.java create mode 100644 src/main/java/net/minecraft/src/EntitySpider.java create mode 100644 src/main/java/net/minecraft/src/EntitySplashFX.java create mode 100644 src/main/java/net/minecraft/src/EntityTNTPrimed.java create mode 100644 src/main/java/net/minecraft/src/EntityZombie.java create mode 100644 src/main/java/net/minecraft/src/EntityZombieSimple.java create mode 100644 src/main/java/net/minecraft/src/EnumArt.java create mode 100644 src/main/java/net/minecraft/src/EnumCreatureType.java create mode 100644 src/main/java/net/minecraft/src/EnumMobType.java create mode 100644 src/main/java/net/minecraft/src/EnumSkyBlock.java create mode 100644 src/main/java/net/minecraft/src/Explosion.java create mode 100644 src/main/java/net/minecraft/src/FontAllowedCharacters.java create mode 100644 src/main/java/net/minecraft/src/FontRenderer.java create mode 100644 src/main/java/net/minecraft/src/Frustrum.java create mode 100644 src/main/java/net/minecraft/src/GLAllocation.java create mode 100644 src/main/java/net/minecraft/src/GameSettings.java create mode 100644 src/main/java/net/minecraft/src/GameWindowListener.java create mode 100644 src/main/java/net/minecraft/src/Gui.java create mode 100644 src/main/java/net/minecraft/src/GuiButton.java create mode 100644 src/main/java/net/minecraft/src/GuiChat.java create mode 100644 src/main/java/net/minecraft/src/GuiChest.java create mode 100644 src/main/java/net/minecraft/src/GuiConflictWarning.java create mode 100644 src/main/java/net/minecraft/src/GuiConnectFailed.java create mode 100644 src/main/java/net/minecraft/src/GuiContainer.java create mode 100644 src/main/java/net/minecraft/src/GuiControls.java create mode 100644 src/main/java/net/minecraft/src/GuiCrafting.java create mode 100644 src/main/java/net/minecraft/src/GuiDeleteWorld.java create mode 100644 src/main/java/net/minecraft/src/GuiEditSign.java create mode 100644 src/main/java/net/minecraft/src/GuiFurnace.java create mode 100644 src/main/java/net/minecraft/src/GuiGameOver.java create mode 100644 src/main/java/net/minecraft/src/GuiIngame.java create mode 100644 src/main/java/net/minecraft/src/GuiIngameMenu.java create mode 100644 src/main/java/net/minecraft/src/GuiInventory.java create mode 100644 src/main/java/net/minecraft/src/GuiMainMenu.java create mode 100644 src/main/java/net/minecraft/src/GuiOptions.java create mode 100644 src/main/java/net/minecraft/src/GuiScreen.java create mode 100644 src/main/java/net/minecraft/src/GuiSelectWorld.java create mode 100644 src/main/java/net/minecraft/src/GuiSlider.java create mode 100644 src/main/java/net/minecraft/src/GuiSmallButton.java create mode 100644 src/main/java/net/minecraft/src/GuiUnused.java create mode 100644 src/main/java/net/minecraft/src/GuiYesNo.java create mode 100644 src/main/java/net/minecraft/src/HashEntry.java create mode 100644 src/main/java/net/minecraft/src/IBlockAccess.java create mode 100644 src/main/java/net/minecraft/src/ICamera.java create mode 100644 src/main/java/net/minecraft/src/IChunkLoader.java create mode 100644 src/main/java/net/minecraft/src/IChunkProvider.java create mode 100644 src/main/java/net/minecraft/src/IInventory.java create mode 100644 src/main/java/net/minecraft/src/IMobs.java create mode 100644 src/main/java/net/minecraft/src/IProgressUpdate.java create mode 100644 src/main/java/net/minecraft/src/IWorldAccess.java create mode 100644 src/main/java/net/minecraft/src/InventoryCraftResult.java create mode 100644 src/main/java/net/minecraft/src/InventoryCrafting.java create mode 100644 src/main/java/net/minecraft/src/InventoryLargeChest.java create mode 100644 src/main/java/net/minecraft/src/InventoryPlayer.java create mode 100644 src/main/java/net/minecraft/src/Item.java create mode 100644 src/main/java/net/minecraft/src/ItemArmor.java create mode 100644 src/main/java/net/minecraft/src/ItemAxe.java create mode 100644 src/main/java/net/minecraft/src/ItemBlock.java create mode 100644 src/main/java/net/minecraft/src/ItemBoat.java create mode 100644 src/main/java/net/minecraft/src/ItemBow.java create mode 100644 src/main/java/net/minecraft/src/ItemBucket.java create mode 100644 src/main/java/net/minecraft/src/ItemDoor.java create mode 100644 src/main/java/net/minecraft/src/ItemFishingRod.java create mode 100644 src/main/java/net/minecraft/src/ItemFlintAndSteel.java create mode 100644 src/main/java/net/minecraft/src/ItemFood.java create mode 100644 src/main/java/net/minecraft/src/ItemHoe.java create mode 100644 src/main/java/net/minecraft/src/ItemMinecart.java create mode 100644 src/main/java/net/minecraft/src/ItemPainting.java create mode 100644 src/main/java/net/minecraft/src/ItemPickaxe.java create mode 100644 src/main/java/net/minecraft/src/ItemRecord.java create mode 100644 src/main/java/net/minecraft/src/ItemRedstone.java create mode 100644 src/main/java/net/minecraft/src/ItemReed.java create mode 100644 src/main/java/net/minecraft/src/ItemRenderer.java create mode 100644 src/main/java/net/minecraft/src/ItemSaddle.java create mode 100644 src/main/java/net/minecraft/src/ItemSeeds.java create mode 100644 src/main/java/net/minecraft/src/ItemSign.java create mode 100644 src/main/java/net/minecraft/src/ItemSnowball.java create mode 100644 src/main/java/net/minecraft/src/ItemSoup.java create mode 100644 src/main/java/net/minecraft/src/ItemSpade.java create mode 100644 src/main/java/net/minecraft/src/ItemStack.java create mode 100644 src/main/java/net/minecraft/src/ItemSword.java create mode 100644 src/main/java/net/minecraft/src/ItemTool.java create mode 100644 src/main/java/net/minecraft/src/KeyBinding.java create mode 100644 src/main/java/net/minecraft/src/LoadingScreenRenderer.java create mode 100644 src/main/java/net/minecraft/src/LogoEffectRandomizer.java create mode 100644 src/main/java/net/minecraft/src/MCHashTable.java create mode 100644 src/main/java/net/minecraft/src/MapGenBase.java create mode 100644 src/main/java/net/minecraft/src/MapGenCaves.java create mode 100644 src/main/java/net/minecraft/src/MapGenCavesHell.java create mode 100644 src/main/java/net/minecraft/src/Material.java create mode 100644 src/main/java/net/minecraft/src/MaterialLiquid.java create mode 100644 src/main/java/net/minecraft/src/MaterialLogic.java create mode 100644 src/main/java/net/minecraft/src/MaterialTransparent.java create mode 100644 src/main/java/net/minecraft/src/MathHelper.java create mode 100644 src/main/java/net/minecraft/src/MetadataChunkBlock.java create mode 100644 src/main/java/net/minecraft/src/MinecartTrackLogic.java create mode 100644 src/main/java/net/minecraft/src/MinecraftError.java create mode 100644 src/main/java/net/minecraft/src/MinecraftException.java create mode 100644 src/main/java/net/minecraft/src/MobSpawnerBase.java create mode 100644 src/main/java/net/minecraft/src/MobSpawnerDesert.java create mode 100644 src/main/java/net/minecraft/src/MobSpawnerHell.java create mode 100644 src/main/java/net/minecraft/src/MobSpawnerSwamp.java create mode 100644 src/main/java/net/minecraft/src/ModelBase.java create mode 100644 src/main/java/net/minecraft/src/ModelBiped.java create mode 100644 src/main/java/net/minecraft/src/ModelBoat.java create mode 100644 src/main/java/net/minecraft/src/ModelChicken.java create mode 100644 src/main/java/net/minecraft/src/ModelCow.java create mode 100644 src/main/java/net/minecraft/src/ModelCreeper.java create mode 100644 src/main/java/net/minecraft/src/ModelGhast.java create mode 100644 src/main/java/net/minecraft/src/ModelMinecart.java create mode 100644 src/main/java/net/minecraft/src/ModelPig.java create mode 100644 src/main/java/net/minecraft/src/ModelQuadraped.java create mode 100644 src/main/java/net/minecraft/src/ModelRenderer.java create mode 100644 src/main/java/net/minecraft/src/ModelSheep1.java create mode 100644 src/main/java/net/minecraft/src/ModelSheep2.java create mode 100644 src/main/java/net/minecraft/src/ModelSkeleton.java create mode 100644 src/main/java/net/minecraft/src/ModelSlime.java create mode 100644 src/main/java/net/minecraft/src/ModelSpider.java create mode 100644 src/main/java/net/minecraft/src/ModelZombie.java create mode 100644 src/main/java/net/minecraft/src/MouseHelper.java create mode 100644 src/main/java/net/minecraft/src/MovementInput.java create mode 100644 src/main/java/net/minecraft/src/MovementInputFromOptions.java create mode 100644 src/main/java/net/minecraft/src/MovingObjectPosition.java create mode 100644 src/main/java/net/minecraft/src/NBTBase.java create mode 100644 src/main/java/net/minecraft/src/NBTTagByte.java create mode 100644 src/main/java/net/minecraft/src/NBTTagByteArray.java create mode 100644 src/main/java/net/minecraft/src/NBTTagCompound.java create mode 100644 src/main/java/net/minecraft/src/NBTTagDouble.java create mode 100644 src/main/java/net/minecraft/src/NBTTagEnd.java create mode 100644 src/main/java/net/minecraft/src/NBTTagFloat.java create mode 100644 src/main/java/net/minecraft/src/NBTTagInt.java create mode 100644 src/main/java/net/minecraft/src/NBTTagList.java create mode 100644 src/main/java/net/minecraft/src/NBTTagLong.java create mode 100644 src/main/java/net/minecraft/src/NBTTagShort.java create mode 100644 src/main/java/net/minecraft/src/NBTTagString.java create mode 100644 src/main/java/net/minecraft/src/NextTickListEntry.java create mode 100644 src/main/java/net/minecraft/src/NibbleArray.java create mode 100644 src/main/java/net/minecraft/src/NoiseGenerator.java create mode 100644 src/main/java/net/minecraft/src/NoiseGenerator2.java create mode 100644 src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java create mode 100644 src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java create mode 100644 src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java create mode 100644 src/main/java/net/minecraft/src/Path.java create mode 100644 src/main/java/net/minecraft/src/PathEntity.java create mode 100644 src/main/java/net/minecraft/src/PathPoint.java create mode 100644 src/main/java/net/minecraft/src/Pathfinder.java create mode 100644 src/main/java/net/minecraft/src/PlayerController.java create mode 100644 src/main/java/net/minecraft/src/PlayerControllerSP.java create mode 100644 src/main/java/net/minecraft/src/PlayerControllerTest.java create mode 100644 src/main/java/net/minecraft/src/PositionTexureVertex.java create mode 100644 src/main/java/net/minecraft/src/RecipeSorter.java create mode 100644 src/main/java/net/minecraft/src/RecipesArmor.java create mode 100644 src/main/java/net/minecraft/src/RecipesCrafting.java create mode 100644 src/main/java/net/minecraft/src/RecipesFood.java create mode 100644 src/main/java/net/minecraft/src/RecipesIngots.java create mode 100644 src/main/java/net/minecraft/src/RecipesTools.java create mode 100644 src/main/java/net/minecraft/src/RecipesWeapons.java create mode 100644 src/main/java/net/minecraft/src/RedstoneUpdateInfo.java create mode 100644 src/main/java/net/minecraft/src/Render.java create mode 100644 src/main/java/net/minecraft/src/RenderArrow.java create mode 100644 src/main/java/net/minecraft/src/RenderBiped.java create mode 100644 src/main/java/net/minecraft/src/RenderBlocks.java create mode 100644 src/main/java/net/minecraft/src/RenderBoat.java create mode 100644 src/main/java/net/minecraft/src/RenderChicken.java create mode 100644 src/main/java/net/minecraft/src/RenderCow.java create mode 100644 src/main/java/net/minecraft/src/RenderCreeper.java create mode 100644 src/main/java/net/minecraft/src/RenderEngine.java create mode 100644 src/main/java/net/minecraft/src/RenderEntity.java create mode 100644 src/main/java/net/minecraft/src/RenderFallingSand.java create mode 100644 src/main/java/net/minecraft/src/RenderFireball.java create mode 100644 src/main/java/net/minecraft/src/RenderFish.java create mode 100644 src/main/java/net/minecraft/src/RenderGhast.java create mode 100644 src/main/java/net/minecraft/src/RenderGlobal.java create mode 100644 src/main/java/net/minecraft/src/RenderHelper.java create mode 100644 src/main/java/net/minecraft/src/RenderItem.java create mode 100644 src/main/java/net/minecraft/src/RenderList.java create mode 100644 src/main/java/net/minecraft/src/RenderLiving.java create mode 100644 src/main/java/net/minecraft/src/RenderManager.java create mode 100644 src/main/java/net/minecraft/src/RenderMinecart.java create mode 100644 src/main/java/net/minecraft/src/RenderPainting.java create mode 100644 src/main/java/net/minecraft/src/RenderPig.java create mode 100644 src/main/java/net/minecraft/src/RenderPlayer.java create mode 100644 src/main/java/net/minecraft/src/RenderSheep.java create mode 100644 src/main/java/net/minecraft/src/RenderSlime.java create mode 100644 src/main/java/net/minecraft/src/RenderSnowball.java create mode 100644 src/main/java/net/minecraft/src/RenderSorter.java create mode 100644 src/main/java/net/minecraft/src/RenderSpider.java create mode 100644 src/main/java/net/minecraft/src/RenderTNTPrimed.java create mode 100644 src/main/java/net/minecraft/src/RenderZombieSimple.java create mode 100644 src/main/java/net/minecraft/src/ScaledResolution.java create mode 100644 src/main/java/net/minecraft/src/Session.java create mode 100644 src/main/java/net/minecraft/src/SignModel.java create mode 100644 src/main/java/net/minecraft/src/Slot.java create mode 100644 src/main/java/net/minecraft/src/SlotArmor.java create mode 100644 src/main/java/net/minecraft/src/SlotCrafting.java create mode 100644 src/main/java/net/minecraft/src/SlotInventory.java create mode 100644 src/main/java/net/minecraft/src/SpawnerAnimals.java create mode 100644 src/main/java/net/minecraft/src/StepSound.java create mode 100644 src/main/java/net/minecraft/src/StepSoundSand.java create mode 100644 src/main/java/net/minecraft/src/StepSoundStone.java create mode 100644 src/main/java/net/minecraft/src/Teleporter.java create mode 100644 src/main/java/net/minecraft/src/TerrainTextureManager.java create mode 100644 src/main/java/net/minecraft/src/Tessellator.java create mode 100644 src/main/java/net/minecraft/src/TextureCompassFX.java create mode 100644 src/main/java/net/minecraft/src/TextureFX.java create mode 100644 src/main/java/net/minecraft/src/TextureFlamesFX.java create mode 100644 src/main/java/net/minecraft/src/TextureLavaFX.java create mode 100644 src/main/java/net/minecraft/src/TextureLavaFlowFX.java create mode 100644 src/main/java/net/minecraft/src/TexturePortalFX.java create mode 100644 src/main/java/net/minecraft/src/TextureWatchFX.java create mode 100644 src/main/java/net/minecraft/src/TextureWaterFX.java create mode 100644 src/main/java/net/minecraft/src/TexturedQuad.java create mode 100644 src/main/java/net/minecraft/src/TexureWaterFlowFX.java create mode 100644 src/main/java/net/minecraft/src/ThreadSleepForever.java create mode 100644 src/main/java/net/minecraft/src/TileEntity.java create mode 100644 src/main/java/net/minecraft/src/TileEntityChest.java create mode 100644 src/main/java/net/minecraft/src/TileEntityFurnace.java create mode 100644 src/main/java/net/minecraft/src/TileEntityMobSpawner.java create mode 100644 src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java create mode 100644 src/main/java/net/minecraft/src/TileEntityRenderer.java create mode 100644 src/main/java/net/minecraft/src/TileEntitySign.java create mode 100644 src/main/java/net/minecraft/src/TileEntitySignRenderer.java create mode 100644 src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java create mode 100644 src/main/java/net/minecraft/src/Timer.java create mode 100644 src/main/java/net/minecraft/src/UnexpectedThrowable.java create mode 100644 src/main/java/net/minecraft/src/Vec3D.java create mode 100644 src/main/java/net/minecraft/src/World.java create mode 100644 src/main/java/net/minecraft/src/WorldChunkManager.java create mode 100644 src/main/java/net/minecraft/src/WorldChunkManagerHell.java create mode 100644 src/main/java/net/minecraft/src/WorldGenBigTree.java create mode 100644 src/main/java/net/minecraft/src/WorldGenCactus.java create mode 100644 src/main/java/net/minecraft/src/WorldGenClay.java create mode 100644 src/main/java/net/minecraft/src/WorldGenDungeons.java create mode 100644 src/main/java/net/minecraft/src/WorldGenFire.java create mode 100644 src/main/java/net/minecraft/src/WorldGenFlowers.java create mode 100644 src/main/java/net/minecraft/src/WorldGenHellLava.java create mode 100644 src/main/java/net/minecraft/src/WorldGenLakes.java create mode 100644 src/main/java/net/minecraft/src/WorldGenLightStone1.java create mode 100644 src/main/java/net/minecraft/src/WorldGenLightStone2.java create mode 100644 src/main/java/net/minecraft/src/WorldGenLiquids.java create mode 100644 src/main/java/net/minecraft/src/WorldGenMinable.java create mode 100644 src/main/java/net/minecraft/src/WorldGenPumpkin.java create mode 100644 src/main/java/net/minecraft/src/WorldGenReed.java create mode 100644 src/main/java/net/minecraft/src/WorldGenTrees.java create mode 100644 src/main/java/net/minecraft/src/WorldGenerator.java create mode 100644 src/main/java/net/minecraft/src/WorldProvider.java create mode 100644 src/main/java/net/minecraft/src/WorldProviderHell.java create mode 100644 src/main/java/net/minecraft/src/WorldRenderer.java create mode 100644 src/main/java/org/lwjgl/input/Keyboard.java create mode 100644 src/main/java/org/lwjgl/input/Mouse.java create mode 100644 src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java create mode 100644 src/main/java/org/lwjgl/opengl/GL11.java create mode 100644 src/main/java/org/lwjgl/opengl/GL12.java create mode 100644 src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java create mode 100644 src/main/java/org/lwjgl/util/glu/GLU.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..82a7522 --- /dev/null +++ b/.classpath @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..0a88f72 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + Minecraft Client + Project Infdev created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..fb58fda --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabledorg.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/jars/jzlib-1.1.3.jar b/jars/jzlib-1.1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..2fa60b1972e2a3ea442ab493a46dfb91fe05c7ae GIT binary patch literal 71976 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 <$H6b+ji|HT$cS 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 WHur+{g&AT=!fjX(=k$k#R`>(WE{^s9 literal 0 HcmV?d00001 diff --git a/jars/teavm-interop-0.6.1.jar b/jars/teavm-interop-0.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..2264a3f05f5baeab5cf0d608272f11f023ba6766 GIT binary patch literal 14994 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 XmqG?S3OG0#;4cL@8~aZaWpMuoM{I)N literal 0 HcmV?d00001 diff --git a/jars/teavm-jso-0.6.1.jar b/jars/teavm-jso-0.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..34907c76a9e4d3da1edbe94a0a5fccf0b3c5d6c5 GIT binary patch literal 5620 zcma)A2RN1O8$VVy$4FKvR2*Ao+2L@kgRJa5GBUC=FO>Bso;y|9j5$T%M>Q{r=wjdG6nHtHH3a2|##wcp%pZIaNio=YxhI5XcIc zl)zM$)s*5?P?6(SmQqoWlhx4VQkGj*ZfjM7adN#QhH=v3g$%>41KeN()6vOm5nv*`WwQMSB^{EIQo@5VsHT>mc~=6`eh z;mmm$6^_$hf>7|-UcpNc)FPzehQ$~-m&iN&wbwF^Me>n^TS=Mn#tC^kj+&45uQ#3d zw=2Xd#H7a-X3^AcF;}uSG8Aj?RSc9H5Kh>*GPDuYRbJHRIaO33=Bpj|6&w7C;t?zV z>uxzMy2uCciI{|q%8Ftp`bhry)!RmHShz-iN1ICrSdvyj{ZF$U^r)XS(bR#r?74E$sCA;}1o zU^-hT)hY9#&OgsBgU}$EA_30BTzYC+i)>BW;Q9R2S*#l-(!;VQ+Jq9VqF!+?3VSl~hD%^2M5bV4DvXsUf>96DZ%9J#Y zy#~hDW@maTYA9C~OF7XZgFG`T+QMYkZ}D#QX~(tXEcePqPlb*I;y4|7X@ zE=z##gJ@}NQnkM>!uz^O2H&01P&oz{2o8HFO%J;amP05{c4^AX-H$}0Px93vrNJ3X z%DB|)@{^8!OT2mpGR@c22BqwyZbJ#_beYBsji)5p!R0vw%?~B5pAKzZ@riwl>-hoq zom~@t=bW5u-!vuuFiziYfm?35d5%qduy;$8pa=xB=he_=Z~NJ*IPhnuxp4L_J)RA3 zPU5ST4hZclic11;P7ka>P-mtHjqpg6Lzt`jl$G&nqrh-VMn%PVd2oz#2GIV{( z_I0T^*3%^T**WH@(B+kir^+AVM zF&8YwRnEZXN|#?-rOT!@v(Pj=d`EhLexX%*;L)Tn0qciU(Zss>sngzM%4u`LOx){Q z4DUwT;ukM}F%=cFsvaH5aLxZnk(o2E$;Uvp``&Bj1yxeF5%h##5ORn^_&md@C^41i z)1^H$R8{p9epCgBmlUe{@0K3IZatV7o-L2J!fyzt|7Ji_a0db^z2RIJ$Sm*YJAr@C zfYFE6hcU5f!8l0f4$jHSy8dDN2Nz7?lmJ3nJ%flCOxQEeE4EOE&Cv9f^zIso@A#!8 z0%jYL)pELL;c*gQoM`m?ddT9V&h-U7j)|^0y~I&a7#Bjz#wNmfS4KwU_Qy(D{EB|l z@LVZP@VBTM6&C_qr#6-4FzE>b1vf=#p${Y?S8z^f54rn~p2GUm)jGqK;AidU@1^(S zWNODm)GgkNAYM*HCaKTp^}iBU%4h$SKOY+h(V^=8;^o_~r?Ijgu% zKb0_kzqmHJ!PBzq=7w}%BGhRU=+`blL&So@t!2#CuwA{9Zzd%X_Kz+=ax2xaHcF&J z9~tfCPp^=kZI|z}TNT;47_0f@Iln%9S;K%1(Z51Z_)Ph+u*L(f*B}p$7@uOj7BT8K z)fdU;ZG22<_sAk~^)i)0_mYEO5Ia~a?rEm1-N`BU95Td=T>J2N`$7W_&C+z@fGTxBuP!Nb zz}hu<`uMx~$Jl?06#>vUqO$j)-(ZB7HLfp*zF$>Tr)YI9BM(*N>n48y^S^D3F_JTJ zi|dCFK@aL^xL5BDSbhP*L;&0TY2b=d82j}aRdN+I6dcSgJS?1lR#8=DSe+!;N5ekt zs-4)~;0p|1uH2)S@#XaLwcgJ*bPJN0)LClZSI+Zmzavq@$U5R-&5eO;IsInae|>p- zm3WL+9^(WC2^JCl_p%ou0gDeUYsXB)c^7w@8?K(SQxLw(KB?L9GE0-Ny`)j+eB!GN z7X8bDw5jO|f%+6@O`9^LgaRBm-KJdR_n^ryw3^@3-JYFdOHz`l)vaKSk!|UKa1U*& zxqRWDoWk{nJJL2z4xAoGQe`@E%#Oj5mVG^@bJ_`a%#P!IgHw38fj84x{;=%&1MNj~wy#^-zABa=7aJ6u3;48_r~#wPz*MmFQE|7NQDdHGbh_VPN2{`)hGJ0@@8=>H@i?0 zNLtLnZ z?sAbcXNiJH-M_k3%Oj0mlV@Kv;ciKry4AU)d3kb^F7$cdVuSV_E|aEog<0M9jBys1 z@lN-E=~@e(_$8fJ!aBB<9%VB3wG^^Anl%E|q^@SfD@_q0)F7BJ9a)2|q!fWvNSNEj zJb2A{uo*?WBZ^#f3XhWe)ORjp8z42~FIg$)=3wUPc#xI%Bvb+A(eUA6j3lBskLiSF zeHR(`btR%q&H7|^VrXzP@w2hF`S6J=pR~=!u$EH6Br+A)CUXnjRUf=xeVN~$q^Mzy zz$C&7!=xwQBD{7IUlo;@mb@>NCa&LzYStrHdD0^MaQOjyuljNkZ=b@m95#Hb5@P1U zi<$TAq^>L=FOHl{)rJ{t4mV584%@cdS3Kq@dJ&Tm*% z@K5>I<;y$E&-j-c1D$t1HJe>~TAQEa67^6kXI+xozLK;xj6$Beq|rWx{|s34b#Ye$ zNqMz9>Co=!ZJV*8(~VqPNV~yPU^7NsYLEnqMRcx?vPgrRml*>vm>c>jG2P9mdWGaGt28Tdz%u`{p>=88f8FdN8&8Hl+`d z2k9l>+R^7`lZ+^m(5W~|QsemrpDlo-2!JHIKdfVEPjw5+gJt|i5w-o%*_+w*vU@Bs zQIU$3pK?r64|}e2?Z^HXw!i-|RZqVmT}rDD53a(dkB!4!Y^SpnuO5{E=})|ELPX|A z$^?zKXv#_psgu>s`U=>c^{RS%g_Bz4iQ=`m?gEY}J$On{eyw5}ET~x~dt7lgI#lAe zytzWjY)Gm$;Z>3TIf?h_a6X%1e?~E}M)&1=qG>3T@?HFCF(g7-@w?$9*S)isEw)$=8|eL>zbX{i}28-J4@U_Gr~@Jiz#y{tZKS%b%O3nW_Kr!c2236>&YQ5<>!aoCPXw^P|`qN z@WGP}EwVWOA(zl1q-s|Y;?_uvy|^}~XG8vcL^-#uHS5tPHc69>`Bi8qJDgwHPS|LC zg%q|+HO#9U!q@QeoBF5d)X#o7k#Z2f1`Mm6m9Y^LT+F6TGSx;5-J3~M{kZYcmR{L7 z`I&t59ztp2?hX?*MJ$g}FR6xYcc)4Ev{ScFe_W_7pesLcPvC0|%T~d;OzmqtmJe!@#7(qWo)r17Q8f zc#1$>ejV7+x*hunK#Sln9f*B@FzB;X3OWM1+n+iT2X5b`ntS!D~ z+y3qh#PO@Y@pl+hhvN_?_1|F7`yD92!*7m$R!4O_4n`qj;x|H$_dky35Bk}Z=>Q10 z79ym9bLmlX6*Z2Z_0iG(be=r`EJP#$U8`esA2N3Msy|P+=(vB<(ucTSKo_dCd$%rTm&`QXP z(#r_QN{EUmDbvY_{*oCQl$N5U8%LC)r5YI;tyW~1Vp`j_ry3rj9Cs?IQS2KTr5+iT zpe?2mr`_1Lr<0VSk&po$WXB>UH_4~EB2O&Xp~OB&={PIcb1yLbFjP6l6vFn7VPkt^ z8w^BV3L575DCB>S4+I9}_xONA`u7hk@YBD?_kWL})lkU&`x)Q|2w=0ZH=+OEPr&{C zgrgC_+3FvjLwfO?xr5EKXP>|W{`ucOn7~g@Z~g0kK0RvyuyzJG{6iP)Kf1UW={wjM zSQt6}Lof6{dI8JK^#Q$^*)_;B8z~P@v|L=WVtt_97>p$Ov^IzX%{F85yffoHc z@>l_YKK+MbJrUtQ9tNU8_n*P$KS%ZUpSu0-ObeVDv;bSPe_{Wx7@jRmF4PU|eFbdf z!1faRzr&ESk*lMOk)yqtfdid^CBVT!Tdr9aoDn5`coRSNwE}Tq7+PwBL=u%u{%d)Z z&}`?Z>2IIH3FbXMomgOaf)E9sghIV_R%PPK8~65Z^#Ms<*8&tVC}N{SK@Ns{CGg~U zI5d+;XPQ%7w2!hbXn%v>ZNaWw5$T+6MGnMb9TrF$KWH8{I1xko$x4C1)`rAEZ}lx8 zoHlFAk8F-xR%#Nv^L*9PTFW5!VOy$rrkHvYu5~3L9e(|%&*muc8x&5nru{eHQQh|_ z63G$^$}}-Q1Q4Wqfj_Ms&#nI}vYO2dfi#s~nDjL~2 z896xq1x$vj#d|yv4Bp8AOISbow|exd*)@pSGOZRJRHSA(JN^>wn)FVw(p{a#Y)7&v z50O3{^yigCH{hOkGQ4d}&8$*Ysy~8%q&VzotvZZYKU^JL!;{?j4w2%V*~0Bg#)_JX z@wB}w;uK{m!K<+tBh34_Y+ojC(p`rWxr@ITx0L9y^gR?CAygr^O6l#ZpJ4_O#0b(fyk9HOF?RUcRB_~b1k6u5OMUrli!K_3)a4R}Q8rx-y*?4~E`#nYwM zy}jf_T%U34@;5BmV{WYN)mA$7W1zc~i5@@C-K?utJjs*2Xm_Z(^CdDNN(g(e==^!( zQ|8GQZhS_01Swk`=w>cxLw#63;aX6BiQC| zrsSQUo7!S=_zwVO6YMB5#WoZ?#Nd5(5H_%{q80?L)m2qowGn(zzVYAd8@sWC<-uER z6PFI|87tE%^f1BbR(@vSDwd!Vu_l@|b#!JhTiy_8rM0f7S^q9br{Yn^%%wkiCOtF| zWW^=V{1G#6PzdHn12&Rc=Ig+ZZ&+5a*?XN6eB`cepxj6axON?z5@YmsI#r0%%Yqc4 z`HrFR<-;aGM@Bx{YFCp<_EmaM1nx9I9c6``3F;k85VId_sJ}~vkzm-0z#0#kgse@M zy=X8n`XyUEi&~fZP#J@Xg8j~o12RH1r^J5G&0Fzd9y#+uaDT5xj;x3*l-ySda|t^P ztu>`usL_&>b~-#@)^V7wQ^zUrN8?2ct#>A$Ri=h2&n99ofv<5roM|ELidoH-;#Vsv z7kLaSbHYSdHrGf}3)xYtu-iiYLb=)(L!n&Pn}^IF@N(W?xfO>@N0`)*QyCuKCC8FDN-7sl ztUd*>=V9t)0Ba5F-S7hi0m%ge0ipgQfIZLR1fG&PK__ElBm2LCSc2l9ESLaF>3Zc` zUU_8<-L(#w(qg}MHp#Rp3q_FmfD6A+K{Y=5GtfgXh8Ik0c5&PQjou& zCA`F2>MP2MfxRUG56Wv|C76Zd-D_OtZ+4!0MQe>f1a)KtF=BE;#uY%O961U^4iW!G@#>k%N|Sehy;gwAfz*H5@sNN=3wAw^P@ z8=Y~ec@L*MUi;FMzy`0|7DnVpGnbF5^tM_!2a3VkPv-POhk|$Sk&F@LzyJ6;pGR3~ zsxcsfLBkE&BQF?xr-<{-yI{AH@J-PCN`7s}k+;38Vv;<|4E3bs3mMfWMeJMhlg(ZR?iHbDqU~LvaUf#mnfy9omJzJgs(?+1rJH0x`#wDg zu6=CK6HlqNEhZqG?T`-pZP&70DasmJkTi@c6UOn!-S$-uQ7G)~Kt8KPt;BFN$#TU3 z@-O{^+-1}R#}SOUSDv%<*MxM@8ZBS$gBn-W-<8Ho+txE2q zYVCfwepYGncd})=@zt=HcjxER5V=COj;D0pDQjAb*GOAH+Xu6@I=ys+2!8ove!-O7 z@7g!1{U~tf7}_TvL3KbKC9}i$;nGCL5<4<6)tkGiI0{p&l(W(tzCVCIaqBsQUUCcH z3VmZ47&YjD++zGkZmF1AJF*K|0<3`B!Dkdph|{(KQY;8aF(V^}xomk}CcU@I(Cc8N zq$m@tu#`m`{(}6r+jZ8v#g){H^K+vcaG~(tAbjQvmFUI(B#B#{L^gz9cWa~WZqIh< zL0qAt-^&LF%eYPjAc8$m(>1usWD`20gRQjTGlEg`(9Jc|5HOtkAr%&tUTnq4qL(x* zzsfa1Y9Ozej59~W5sjYMlOOC$ADRoH5|MK}`w0I_-$zm@-nr}yO-d%YqYJQfh`!e{ z8n8|&)v#mQL><69WlK5M@GI$b(VIr}2cFW5@cTGX>|WM-KII79h%*dr>K-$C<@vZb zw_RBZB1%K+aw*Bl;97e*8%(9mIm!L;Fc4fwSlnIs$GIYC4-^p}E~`$l>6KY(_-uDa zq+*p=`;%fN&_<%DKV55Gq}pvCUDR8o5;QW~1~$I8Fk{;V%JvBB zNMkz)T0aVYgu!ouG=(~5TmRN^6mSV&%F}DkVVnXo?c{O^ZSusO=L~tt9k~8oM@S%d zz<{xd^CKBHltE^Y}?6`cFXo1^w)KL)Ov^cSnVopUx!n>jqgejOP}M3wVMFBepOF5E?SW)g#Dl`JZH1Ag$_e-$$hDtL6;NGGJC5M z402F@gLDXrbYPIz!>U&4-W1s3vitz{1nP6>{sUA(WKKIEsQS<#AaDK`sG?5R22cCe zzfhf4X?}g72aR~5@jVPR#7`JK5r{fEJ14|| zpFlQ!(@^{|teGV%e;N7gq#ZBn?`+?n!h%HQ7z&L0^T1!A#uBO_(s4V5qtL32pum;+ z$$Ka1UVD8dI6)^C{1#6X#w%EfDmki}j@az{iD<#;6J-}+lDV=-MaXx5Cl0}KEi=ct zn0Zk2%)__)@X>_bT38S;V%r>vgU-RtC7K$Je)77>hWs-RtSJH?n~A9Pp3+>7@q)6=VgWfFA4wwm+Bazo&(Wy}gY+sj|HrFrqp+{A+r|3`&9v zporM)GHyoX^+5ZVSBtY=^r(>dhoB1a+d^Gt$$lA?szlXdvGl;uJnQIFjNZsBvFr>g8Q zo?Bk+X(x3a!TG~$3W21RIlBmhpodXwv(ha**RK_y7eyh&z~gM(F0yNDw$kI6voAeh zgC-yAvu~}kuoxL?-Yz(L%mDVXrRYdz1*MOu7X^M6Q#wn$asT-7;;mvStOt8YEb`O* zc#h#qbT2z@IM#vlVh@Ne?H}{wN!WT)-h}03B&=*LjjVuz+HZyD?|ew1(He{q#jC3} zfch=uR}ixeaspaG5-RFtx~ygjDMTRH#(OzCh z92XzIK3?4*wj1EP7v*fO6CRluu~8#y{b-zXL1mcA6el}W3X&WnU|=6T57ko-%}4uE z*e{>#;>n&f;+`+&`EE_r_%?TcPATPG%^RzYF*shSPP>w>oblaa2EeL$mw{ckd~{%B zK-i&~^^}2WTLu+1I%7;RX_<+n*&XqB8Z~#(7-p2lK87%Unj1*8G45GN#Tr@9R)ureV60xOUq4E!Qj|uyh zxH8E}Q`{^eVXSs%L3juH@YXK191=4;_#`%ESLUbe3ZKp@$QsxM_#CVrn=cROd9j^i z@JK%lBz|pEk0^1@P^|5SwCmzmA{krh!^s@qsyAj5{FU1-n{(_J%8@!(quw_}GHCii zsakU>5^5ZRkuzCpho8lzBx$*zADwg_hPOvgTyF<-?M`CM6=9JQl=85@)UuLF;2c8W zKMX8X8;2$8ETq%L*>TDxc@|jE#5$L<%)I(ZJ_29cCUJ;uqderw6ztJ6aV>1D*nWD6 zmlf$H*z9_RV7Q2YXi%JI%j*G3F(}3q!zx$;gCf7CvL#2C1QDN&(5~s%ejr({QpBic zQUdb1qDRw2?Za%-2Xb({L0_3f+SP>zh$nYE2mPfx`b!)_>VfX~2Ar{!e?+^#lyaFT zyLYKjuS@2C;=zfXNcP!tdnxkO7-&E;oy^U+}!K0S>KdsH*umMqHVenJh;=cA3E2HOqhhS>1(j_uUH22*G2oJnb=1H zAH|y_M-);ZA&(Tws6S&E_mCONhiO`Mat41WTK>*t8q*SKV68MMbFJSV?80N+w>tJ{ z*8o^hrA-5%z z^6h})A-l;y0{f1@+D{dyQpg1HTGg)%Y%wSU%wv80(B094P#e=6@&fGw{zrS>XOEu* z?%!G0RQy^mhCCp8AuoFJxcurNFOX#6fADy!XPO+5F63WAd3yfN4WIk`B^w~BzE$M` z*?{$5~OPbKl+ySj!8TS)}|ZQKwaN<&!LV{Vf9rR?@XqroPPAVySpH0XTraBUE9ow7V^tx z3u&g$^_J7)N*zc+P%?{UaBgJncknw`vVfzA#Otrg2Z@GgsTTM$%ZGfT-X1+l$BQtc z3+YNy5gUW|)^B;lZnEg&c7i=)T>O=Ly5cPMLH;DSt{z{N8yaV9HBCAet0%$N!9$9H zWi>1)ZnjthNjIWTHZ|*H7A(vXl<29y>Qz-VPPrBjXmsqjQ!g_UyWewp?wz;dP||i0 zd)akq$@1F2&xcpLZqGgH-p3g($W#tv^81wW7*$kXz7s#MNjny1l_IxSAlo>1HR-OH zL2Y|7>IU}S=j(TU?t)Ns_9i+7R(Lbf9!$VjIH8nZ*OvJcfrbb3yvK^vB85K>CcKR; zxIz8MylqYVf-7U*m@ITh##S!k@0&!ku~oU&Vk4b|b!l|j`lw>#s` z(OqE8SuJVkx!|ee-8!|Xi4`R{)&DdN$$$AgKfK2m81o*#`F9~5m zpxdn-0M9lCUWzhuo%|>n+n?2i6;L6+(h0BY)32QP`zw6tfLU)VKvz_B?sq1>ndQC$ zzfu-?6aYf_csEV z8eXq{V^w3n3X3v$j~tl>HM_LK8%rV+R;Z}R`1Z@IK<)fKagPwM<#9y?|APU0-&)qg zMo#SHMMX2HQ_0%i_A`Zg5gz}N1RtwZC5)R)_+B9u_<(-OOLFE&;%`F?c$&)t<8wkX z5tJf6-Z1?dmJ@nsCeB;J=cgm*MJCb4hg5W)E6A)qIQfRQZRGP`tf3mORdc%$;C$$h zg5T1kMd52;lb+>eYnSiEDk5Na?}ZEb6RL0u6cdXi3w+8h1cg}yaey6c-$6?ZEUT~< zqATU9;5z6J;Hd#2`YHV53kjSseklo3F$Qdyz&_qnaDVQ=m#+QN&s{zObm<$Qd;e5y zU$|Dx$nnLolUKBW1<OOWArj!4tBg-qxvhE0i+DmI*JqP-dgh zm|iY$#k}*L(#o=jYotm!BN_HXPr0O(!?_36`VqoSuLy)7^^}Nf=0X4~r+|on2%u*e zD=DXbjOTaMdk)4+nDWf)S>6F5Y6rGIGyWH+xHb-EPut?(o2$R#pSJv8Qy@niQv?+C zgAaehTsWH?rn#b$sgU1i4ckc?%4XwcvePeaPdG(XyP^yk^R1+@9b4@j+-{(~e1pyb4Lo3U36G_YI!Ayp`YTQD`}LBis5gIPMP5rRDIa< z{?&koEPB~W1M4v|jMF>ZU%7fXZcaBJOo!`+22+Mwrc8;MK1-++tKCU#<(pBIpv-WL zY3_4Ti#6~__caVmn5Ns+JB$G!XX${>p#LKr z{WoWb1FQ}Iot6Z~beIEq8}vAyJf~a$jp_-OCUrTHMnRt=-l5-qi<{)wWegn~iM*SG zJQhr)J?Y;6t!wD+1o4q?=yG%$zMZ-dbps|El{{enQw>EPZ^O83HCbuqY9n2M(oe0> zDuBXU*7QMY%=%g<``6t#^-krARu}+pA)5@{d&PljQku&$rzS<{<-I%wJd1fJ)ku@p zY^%gNRu`==u>JRV4I~)V422{LRlasNk-Mc_Ka{R43RQVBMe353J=GFFm770NQ!_=RJJnsKbzi#SdH-`N{|w&?;ada(*z4^Zj!?J#n+FMv;(juICWTseNFmZWY#eNy zWZ&czPzY=sbzf3+aO&Uwe?I(|hB0r7yFD3}2W)?e8_x_AwFg)k{r|LU{K+n&`rPiN zsTXD?{5P{4YoE-Ter{F-f_@Qat3NTCWduS5f;9io5C~WV0u6s`s2}EUyPl8!|Lj_d z6qTD^1#>e4rd7hgy0Ir-|IeC?|0u4owXvcD3J$F*QVxr(C~XI7mMk1KOytDPDTG=< zOeKf1DGRZ^%CS3Be(ji$Nf7EFQwHy@kF~+#X*HtKgz$9wmhYWU58GaN%$Q@sxklno3ITG4OJNlBs{qEoY}fUgJ{{q{A{?Q8cV z_H_<7W>VUVkL}uehgk&km zyLpY}DwGeAg+3kjMF4M&4D%DnC$0&LHyO&?udo zHsOLc@vA&xzDE3_;X75}HLPAOJT^W7c)GA<4pn`|FLbeG%+NBfw&WzzH2-mu%PAs^o1RvEnser;t6n3Ufl34W?%RAf+rG}zg91ilfmS)GLFD~aX} z^9hqfuS5SZt|tQfvO)xN6l#0pxA=^`AjJ!6CNf&Bu%@5v;Cl+Y&*$p@&ElsLsXEJ$C-hLUt3@dQGlna323uf~^ zu1Yb^Pf))I_j%kxaAbJ{{{|c$oI2!NI}~XO_T2AX!gKRp8cx|}=h_1_8Wp%KGXQ_T ztm^t*y`*RaFmzJ_s-Z?grT}XbqZjM4Q?yLjQ$DGC9aogcKrL_r^1XAVA#M6~2m-i2 z=%taOY49APgjmn##uE@iNlPc0O)JiXFP+{(CJhcAGI= z5gmA9L>4VL89kmvsz`*qJb|g%ckZ(s3if^R*8!okV$Af|p!7;Vz&!Sgb;?eTRSzA& zK#>B-BBTwYGBYncw^k&rQ1)TrO6E`r^ghiag!Et~&X4s$JX)-h5Z-w`6!{WrQZ_422fBB{MNBDnRfOCwyFlSF$HiCM^ZPA<7S!C>s-?Ngqh*_7u@!F2ZB|+3ZUdtJL>u|k}TS3%9clAYv z(lsCKI`oTPp>YRY;Ha>H1|vslrTCNgunPlmpB~{fzSI^xp zYWZH|xu|lDgl17bkf`pW+;&jZvOc!#u*b@1e28VKcHwR2Vu{bvToJqg9a2BGF!~6$ z1wZ5|D!v9#L0H2c6*Dz?eFyopus!F^OGZUWiVoERnFIrz>|}p1>X{C#WaDIS@b}q` zRdg$oKR-%<38a8PUP2iyvyOq~9t{mbkbn2X782Mxg}~Z64X|8yz%@WnnuaxPXr#XS z)}1dCU?nyJO{##!~z(75pf+9=H6Dc(hdhn2MKjucT0I^FDSsR&2e90_Az4zZJdJ8+@0XA zEjBhpr*J}HTlyXZffBzHc%dRpwNCHd?<(Er*1p8SXZn`|DG-BNVEc1sJ;ULJ1TZWM zT-!3AB!G4zgjCm=@K)Pj0f(vCf)e4bmRNJlR+6)puh4XdKOnCO;h3EApEAtfdm9^H z-acI4f%y_@&Dk1vH6juOT*SD2@b311{hjZsBft%Yo!_+K9X<2tdAtcVK!NBeSs%z2&8e4eN>lrz(ue zd~xHHz1_wsEs8VTfWcSA`eN{HI-F+28J}!Rx0>Z|HVJbG2NF`ldr9*&hI7I{mD^uB?AV&8LYU!tDC3mZZ4H|l@ZjK2`7p5Yz{ zlwQCXG15Cbzr*Fikh&|%t##=fK=%4Gu5TET z+pKtG?BD)gYXW3_-=*@_dDeK=;FM5EQo9VuA6-BptOQDs3cXR*yr6KSIm`=TQcTUk z3A21%nmP?X?jUDAR6&HBW>4{rc{i_eU6SIb2)V?N4c+J$;Bj_xhg`uyczT`YvJN|% zQU_Cx5+TQDM@jHSWb{L2I%xCKy>q6rNOV~o86++#r26qzmeGkOHBAH(rb;2VGUJcm zza|DVh2v5cz5DTy6b;yk89 zg0aFibm>{c$q6Il*sEGacesA9=jdt-I=MP%nB3}k|7joX-T2A-sODV=!6Oz^;Vj|4 zim8(i;9MIc3cb7tUhiG49s=tZWp2M!m#N*k_MReLc?FGw6SCZma_c2mntKV*yVR!z zw_u{$xKmt^jIVo;VC4Vm{&m+E8gTq^W+=3R&2M#Ez_Ao^#i?0QPdY%-ym^pEWvQ)m zY8HaYbCk!})zAoM-z8Z^bz9h<_ABjSvNnY+ry-}$Rs-YtAi{gUJy8S)(CCf!&ljYc z3C=Vkr3#k)2}kvJa~4e8BWDeKrTr~w%qu4|$OgCE}kTTwUicr89YzS+7hqY}Bj@8wPQcRg5t=C*ri7w|D2%W~VvtP^5 zA)j5JFU=G>p`M!|!<5IN`-pTAiS-6MZ(La~uulR6)fUPG^aCMg1iHOWH8}<=2S~GT zI7NjdUr$&=0A-}i1h)*5F|U7ML&Q9aS_uF0cz~oNHmm|7BR$9LYYwHRT$UR;#I*Az zf#lp*ib60_`q)nfn;U21hGu=#Is*2965C>ANpFXWz13;TNWTOoT+-f!9^fJ=)zyp%uc&ff$fa7tNDD*uHmXVl{g%ppYbYSaPT9LG z+?$`T)|m+PLB73qim`I1AHUInMNO&zY%o{>Z(}>Q6+~3jLDIsRmzX{G z8MNwcXxKj2H@i_j8_!H-yGczhB|02Mwn_>50;PhQI645C-yt+29k6&t%y5YoeUJw8 z`;ai{$+}w^>$0Jt$+Wb#k$JDUkx@J~Y>Q8(&llEczj>?JQ>#8v4bQm#=zNvRElqPQ z(fh0ZhmPd+hMx0X`vF{8Ht!JVe z-}t#a%8BURk9d7%%MQuO^Kq*ryotZ9QEDbIV~40?C&B#H02Y|Mj0FjSb>-1vfe11cWIE!G@QBDRKce%~!z`yAEGPKA@@5J06Ry^HnKJcw3?!EYAp{oTn< zWiYPIB03w_UkdVb_r7%eost{b8PM_Yz~q?qk5uM`dK4phz>}Wn2)s-7 zS9r^a9eq02?D;B_k=jH_OPgFLLA?G2k2FG_1Jh3vr3ghpSRQG+CRA-d$gp1X3pG`@ z&*$;5VzF z{a{6j+YkVix(yS%oFggr4xVDDT7Sixq4z5|@`jZ;&7NaBqJ_5#W0fB7j2l+R3SVh< zAO`{XW^$B2UcJsOLO;#ZXOlje~QETuXe7*KtF-tF}TqFpy(9 zs2-b4TTrvDYA)h`hu;3G%!+`ZP-L_G<85LGQzyBo3ZHjw(X9?XYvZzkD`AVp*)=FK zwAOiNB8%cVD@E)sN?bfmMyEmYX6Q6m7&!w**c3O6GX+(rb8(#dT$0b(?WgabJhTbY z#3%Q>0G6Bykb;&3YFjZRoIACS`b`@t(l#E4G-NK5v1ASGYJxZkXyt2EU9FE+Apv)j znI`gL6i&N*>A0<%BzvO!esXc2HVjQnU&Weig`eB#>6$6{vPpt@4#m=L!*1<@uzvWJ z{HYJ@n{mHxwhdzs8t*0vU1U)-tkUb_nPdDM`NyA02S)4f#;I@?MwemC!Q#B;=7q(`8gi7i0p;;%?LN1M10oUTfszQ&SZqH+!NnESF~a7{PtKtW7o0c zVKmJ!XlkVvc%jNen`lVVxqsy0jSCAVC?>1cMsrAfrYEONLiLdg5@p5)a7$}B))_== zIn{~eoH8X;Ou&BgTQ_+Q-%DT-;EJTyfS_&zBlVx!(lg2bsRjjDeIVcnyf~=u^lx+% zVx??=Q?=LR{j4=%O+n3mxY!_5nY`CJl%V8$zW|aV7&t{63zJmotC$D{jLAl}9DnTA0DXZuqY3h(~ z!CEFAeZf?l^G~dJL*;#96gmgo*&>Z5l2XHfIvf|tn>91G>8`QdblJ{Ii7x7hAc-r~ zyxHYRWsN&St{L+%`|zDcUtej8e$lE@H)6eAuW}lh3b~-Ux;$m`f&%5r^P}|hw3S9# zrl|`iJX*Y(gt*zZw^5@rCdu>TmSw3keP{a0jAUTnX)Y}jn6F-IX^@jPDp%Xyrdh{u z%(C~ROKAwQ7r|M*+n%VGT*}VeNJ&)752Co&l16Qu|;~ zg7dBWMw+^k@wFVwg4XAIdR>jO%L%RCtFW;5iw@0%(c8+b09a2@u}5!gP>XLp3?I$0 z+roRW9ZqNN_Ko3JKxs~HHxD*?8#+IRpJLl$*<;`*MYVmn>WPC?-x;U>hBf7CIRa87 z1m3<0{{gSGRC&t0xU6H?Vxj3n^Y$7m{!-xw3yua_==#GoXZ)q|4~uEL!id&g8Il&Z zErY8(;J5fl1J28jzjtiUIr5S{*von|p1?4l25f)s9iFl0sc^-~{_pJd|3P!>_hxF-wpKv`N-phgC z=UX3o00*22Y=0(PFSK!afFp3F{aZ2oe{coyZ^?VZw>vg=D))crpN17^UKszOeg5r< zn}71e^I^X& ziXv6=$+GGGMN*k z5*~>YSW>1!yrZ*6+h&))YUzL0(EqB1c3bH3Jp3GyD7xr4fAu?nJtxykn(ZBwX)gem zzhA(7_0IyV=QIx8TV=z;kh~ckf z(~(&;!)t5g+Ip&yV=m$crMb z8Ubn$chOq54*ai)W)>h?HYXAq=BabXoMGIZWY$*-Ezg1!=-pgeb$&hm&6Aaa7ThU}=OQ zNF+zKQ$|gwuoU%B{)&UOa;@YT7A-H%Lk4_LjLX}GNSxdof_lR+A29XDQJnk5bnVgD zoCGJ`NDaDY-3$7!2bt}50%W=gFX z?olkmj!!9yxHBQ5vdXRL(?`@-sSWc=d7OhBWh6N{)c}9*;|4tQlKhaNq_BU6NP&8~ zgZ9!baa+$y2lTw5Kbh+%9HiwSANSqC8Lsm)LR;sZo&sup&U+oRO>12KoF^O8QzaMx9?fW*90IdlOJ zVd-G)*6;_?<>Ky%E=BwVi(`<-#0V9!z>9Q z<5I2Og9+!EOLcicmp)>ezF+eLCwxG5RR%dkD;mcX=ho#v>B7kRj4ugs?}67Zv4i;P%?1Ya3_b|<0&o`9 zIc0?7P}s617N4&8b|AH`4_GaaC|Ri0Raa(x!$f;^3wrmq+k`^V#dm$XGnhVl^|Cet zc*XY@KFCV@XWV!|BOJAgIvGmau74UW*mlD_Im(X#!Z!?)8~$Dcq6CFVrY0c?jfp=d z0BKa#yCRGXV!)FS3keo+gglD8E%m|f^hk|pDv?n~`@X<=&t@x%<1xc_1iJ7^W6A8w zB-k#o(qR^{Ml0g{oFFN`*huPFqD!T5gVp4x2&25gTpQX|u0N%h?4*2-r1-V)>l=>? z5%$8cCq`EZAd&~Uz9HVE4j*_q=_^1BZ~1oa!M zN7o()-fR0SJ3r2_U@tt`5>__ugyxT%Eu^iNW<=v1@W!`dzPj$7Mpy47bT-Xi7!@}C z0Iy$t`~i7!&d8H9iNYV)UXn!bS9s|KDJ9>zI>YPYtNzMTD4lE${Ri~{pRZ@H0Bp%z zQ27-Mz;_?tm$C>H0^+D?pw++W*qn*MqfxYQ4Ri>z*6qix!u7h^Yh0BBTtcq3eqFyH zNG$x5GoSWqFjHyYcVM`guSDtb>(uqmVO0kh2ZhzOfg$D^`iV2onemb{;eC8K@IcO7 z1KXd=(u-SWLI6ht(--&56rOHtV5Cnq9ayWC5y8N%2%qWmbJvoHSL##39BuF*0%YdN zV-0UNf9vuapDz@hkfZwzgK!9sH-8-xv}0ZvSbm!etsF#wrJT0VYv9Ivul6&$+q37> z%1?y{_7p0dn_U?&q1c0o5P7a|woCZ(7+bAh>D*h%2Zvp$cKp>k<2|pZmr{4?oD~tB zL~7^XesvgW3Ks$CT3532&nz}MJkM9G@0ok;U)K|NL1C|shf{jcJ7>VIty16=M&Bg| zMbeifKxQtNkb#-VgPn)Zc#N6g=tJLWd-6z*AT}I{3N93G94XtgfM8XM9v)JQf`02} z_4>L8gP=169|w>`{*45HzNql?_p#e^C|`msjKZ*C2~05oz{{A#z`Xfo$-v(r%Q{)< z|LfXCu~bIR2AVs0U3LkyZKflg)GBv$3A6$SpS7@ybMjd1l@v$l@6>zRq>Lp_ z{m@z*t>L7nb??%Z6I^|Se)WqjF8}CX$#6-;F{0foEk4W9iJg|RcklO;)yFU#q+R65 zY2tCSt5Dgrvew5h48>Vus0`pDSFJGDN4%6S-Si7(X2rq!A~DKP@KfFCC|#4H0G9>- z+^M3h8G2mh#tJ>#e~&0jM7Yu{A%B`RGNNaEI7^Su6s-e7F`iFj8bx; zUF!GDL$V6-d6^UVkH_~Al_NVFDojjMQj;UYNU!}l+;_hEx&>&S*rrK`RRnDF`klkR z(FG4^&VguB-~m7uqX;sKyJAabj}}mrD!8e^<_UBsiGNPP_E;C$;GfuCa{L+aVXlZU{9Z4u^>|M7uA z7KcITQpOuS0Nh`VT@D-6M_cl|vD*426P>)QPy%Vmk@&vdB1D93FJ`@W^2yF?(Lb@Ra|L zv8#;Avdh|ZcT0;P-QCjNoze)>-5t{1-6;an-AH#gNOzaQ_ki!r2lLL%njiPV<*(;l zd!K!FUK={FFNc}dU}-&hgk5~K3FnffFwmMWN&mg5Vp(1Z6||FNK6y$SJkL0)3&}v^ zeM;5JO1vWurVUM}{2te@iW(JGRE4?FBgMX@LtTb)Wg1~(QUlrqdJxS0+N27!GHZ~p zt^ObdkE|{rAj}^259jIvncjHH_>>U^h~>2*UP)WgZOg|No_VcHptxmQW6u?-m-xL# z_ATe5&n^JfJHU;3_n&TzyrHp>lNB-jpBw@p=6Xn+LK4%&J6o5j;m>D$mvbGs>BA0!Vh)%G-g$rb)j6|#CSgB!TJ3=Bd>=C zC-4c7qiJ2R3p%=HNpyATYH;{IOeux6KyPw5e1Q3YCyr5j-9Q9&QfR5<$y^k(SRVQh zLDiAp-1Iifc#cFodSti_aB-x3Xgz?&&#YN9Ji6F<8!{}6COVAf-LVhE_ijj0#$z$S z5eQBw6u)}ekBzyU1a@sC9rX%tZIZ#VQMc|3$d9FOLKRd=5r~okP75h3D{%Mfiu5PE z{HZ~i2jA5B2YA0%ha1@Yf_LgYp%s@|pN6B*KtWM4s|A{)R_ZVT$DavEP>3z#zEODUO^%yC>i@Oeu9()#vj z)~i2zgIGxuql00wTlZZ?%GT%9+DrX- ztvOh!{$24;f${e3w=gRE5`PhgL{pM!8v~}IMSDDUOt4rl?XD!p}*X)OA$LbCoOi)wy-?TqN%}X7Wf&~rN??! zT0P7AcNynq!@cU46-l0qbbs5)O?;xlIj=*Xhr;r9cv@=3>pi1BJ?(B_6V0Ixr3(aV z6{?ZNb;|tDMA|)-W)aT$=6q+epjy)uXCw8#krg)GS}HrG^GpU9&I&?kT$-OvF}9W| z7eB)xJ}?Vl*=F}>zGLMO#>c37R2x-aq;Xu*?CggxDKZMDlUJY<>0vdSkl(3HUeH;P zTrf};o8a!P65mzSPv9?@0&Q%BUtqxU83re9uC0t`r_@XHtppKj98Jzv&(`I-B%-Ox z+WryDYp!AqNqUw04wdt4vi0a>k~1;O@-YVvk3F#UftUS2r#Q#3G4$B8yV%{OVNq(L zE!;|as3!5g+bYDxOOAOVcvl`ahC^v_ZDG+m%OZCT^i5_HlBq0dXnl<@yK!=9cKFzB zu;G`(Z%QOg2O^MGRjm|D7WEBqwUNpBuA+5B=w*5zP2Mfai^d8FXA}xsDzx3b1;dq} z&801sGXLlxyYQA-=5T5;|3Etx*mjY^nJupSq`zv$`k01DGggBP+Vu(uy?qnd)i=gD<4RI_*BRzg0~@jh)bkB$Kd)z| zk(T|X-fL=W5JVp_*v`gN@&IjNCZ6f|Vvo_H37O$uTNalDYO-~A$>1JHMua#CNCoM1 z`k^v?-MX|Zv2CH*wwAn3Jna)uj&}srltpV`%?ZpCu?jRU?B}YxF8ndgMng169`x&* z-O3u6bR^0vO*cW*WX)$1zor|Pc_)|odyT?Zv zUO7qR{xw?^cVrHsf-#5Ab#Qi;557)i;b~D$KYBY+GA^y<*D>9>K->_r_nqKwxU?dh zws*75XvYjae+73HM<}2~+&l5FC%FA$I5F`02)i={;!^FUO`Um-o_uzy6!h)(hU28f zuCtfb+j8tPPkOx5qZ7w!M*bUum3XJ=-ft3I+Z&->j&5$4H|d&Jci2Oyz3e69m*$|EkX`o2vkLF9!;%5^J!SfcLqi%j z#zBLtd90+8Q>XdNQk#M+O8%xdDOH`;8ea)iC0{WX*lH^h43dZI2DY+ zIscZfl#zy(3y#twXv8JnD|Z^LU26h?#hr@9V(zse)J-iWkYiCjAK;j!wvqb-C2jU9 z*g`GQMCTR*U|x#DljIo#ocsIIx8OEMv(k@E3?de*4s=11y`O89+P^nf@cRd|Stbnp zUdoe6#8IVNTx;QKE4#Rp-_z6n9M{RkfxAjSWhXd`97gGJt?04)&iFlYXtN#r4x6Lg4ie@wmT{&GC%>kP8Tz4{ z%Nh@9Dz{>2s`AoC_q|3OXU0mB)p|p-w{r3w(HLFO@EA?EkvHT90&=zz#ayVDB*&qo zqV;&ew2jMhFx!6JVPvO|M=CsF0l8jT#>34T*kuogbq!eA>EN@v=%$e7I z+|kzsbCek)NN0$tTV#=zWymL?2!%>oSbLNGv-(Re$l*G@X*;tzpjkzEX$4awUS(g9LL96@J)1(ks4|V@ zCXrhG7Ydn;ByGfM>k8ED+7H&nAFQ>#vkRX8(a>hyr&M_2UZsP5+{kE2eizxKSt6Vp z`ctEN51}VP^J4|ot{xGJuuo#%UZ~%9W13#`_lQmkcv!t_a&$z_T|HDWJ&EDPS*)w? z5jkjv2hN;Hhnx+=rphDWYj%qeeKnnA%gC15-~=EnuV?TJFf^GTid_SpXgB;fa@48e1p3w=8wT!e8rVP}%BT)q@qZ|)QWD>~L2w)=CQErp!ZbUz~K(!n`k$)@G zmJ-Z?sc?+MY+1OQNTH)$aZc~*Ju4BwooWE9st6%b(XPdy$^wyu4+?Bap0YW+WnM{+ zm2#kl16;#E89B%86gZe4_J&M23hTI|zn+_heB7O=8S?o0@D!5%xIGi!6H9@&;X?#( z_#7hb^oER{uMF+t#?-9QAp`e=WKtfr6BwXE}otCJd7?-Xd8i zbc3$zZ>r z>=eIHtBi6Xrw^+9a0_Vy7blKnt160BL8EUkyx;ZtymQa~b@dz;zcf~_&6rQoO2%)1 z`T7oU^#7ij2b81#P>_p>$qSp90g9l~mIi-Ww6BpPPuyia#`E*DcaTLsD#(bJ>pm{~ z~j zc0qF1yMJCMr>xu*TP-Q>@m>I3gC$FTK03}q+i&9I(lMr^MbgZh4yP=f7#m`V+9?B` zh%}pvoZ*||Oy;+mc4P3QlLqo3;h1Yb8im9tFlEHri-g$jec{|MCXs-%wk=kEyIOkD zdEt3waM?|@DMj2%A8?F?y+drfc^+hc3EgW@4|YGj@dSYSR9gP~*wsHll{K_6u{1Ez zR{?Nh|9K_;huU(x*JSqKuh_w#Cta2QDD(fzI2EAG-!&dP=;m(lG*d;`{jZh&SEE(` zIuiQwx4%Bs&Q3PL)4WhB;QM>Q{GX?Kre9I8voX{)|DO*9yfPU(*aes%o9xp3_v1qU zJQH!;2lp4_LjOz2{N)dSeI&$@M#ccZacThHzis9Dqy0|TkOar(faqoA)N#OEEy#dxP_abTP~a)QU`Su~YQC@%n-5BankC z*-sd8U1`<$7Q|{?PD;PawT|H+YRj4sxsE zr{vK~1YTofvhDNr10cOo@ox)F|HMYdR^P}lWJdroW4T?;W5!@C)`Cq4ySOZi}L`2xhbp?cS&zIshXyA3PwU|O#Fv?#okb))Jx>HtfG?Mb{B27@8u zeP~+)&+V>w%7-F!=x*22A%W#nH6^H`!u6dmZNgd*=~-BK7oiqpVYJGOk?t6UZyTnY zDlU?>>x)W-h;bnfsPsDCppd=WFJ5HdAN{d8UfAc*<*kFtYjVpSJ={5F(NWO!$}X6MxXct!uAQ zi?$12!D#pIUkO$y4582&zaQB`Tv}rT5B?y``(*nwsFo^cKHMS*{}Q2|6U=l%BB~X@{Px8VK0dNm3v<86SiSS0{lT0#jE# z+VDG?Tr1>LJs8@zEpZ(KvV%JCR*>%~vHI3qV7w}rRWrUU`MaW4+_QFxmwV46M$>Xh z4hQ$W@fLZ@CES5J+eFOO98?ZIf&zH@(+@UbHCx(fS4rOMj-Uqhe|%ERm+JRgF(urE zQJ$z!o@gch&hhb2#Z&-TBSTBsC+qY=HQiPso;8`&?xXi@_Bq8I+=In$7D0f zD#~L$;3@a1?rAtO_}r+4@Y`~bwlT=jI7`$HLxpWyemwv?b&~ba_2`F^^2dhA%p&EV zcL&Wg_e^BQ_%4LbOVNbHsFs(*Tsb6aR?Q0P7n1X(n`+PGMEDxRTm5kqlV@Dl&VYF0POC`TU`iTpzXGt)W zpLC+dj<<^+K0ZhYNJvNc0_7brCzj@O81@p5*Fd?dLCfd>8lEx%siyz()bc$oQu(VN z^Utf)tfJ;PA&l1IQ%W2OWJqnUMYf9cWwrr04_>=%(t42$I?qIc^sFmMFn;jU&sBv7 znT-2M+q+SMQG%%n&JbS%k(yohi}t(HvFjz*?cub;W6y_Qus}y3ydZ(?IDtKEHycQ* zbQ`5KWfTS%fXBq}qa{nL$$O^_9v+ zu@n)ct9jrG4dg1?4lt;6mhH2kTa2fpKAm&*_OQY>d|}xm4Cf{!re^Xj;w;=0?hrJm z)6m9eOHAQk%rVrh>TypRsL4#257Ow$uXo-DnNpQwZlZ3WT*S2@MNAd_n2@E*fWo-J zn4PO{8ON&kvCayzrHrCg^)34zsS6d-LI8D%*U7eGxL>5O$rocY7Qf54f?&eL-M|l~ zv_!r4#RhqM60_u!60^QfL3#ZkKc9O)^$&zEm7RjLsN*5B2+IOfz@1Du@)ZY^(iS+a zgtj~jhAkLOX7e41{EdXVE8e(SVu4fiB*-F$_Ntq{RR~mL*zbZ}9Q!e%!dz!95msrGd^3n&%dVUiP)E&*-ybm~a zAYQ!tLBFu*lYPFh78SFWhaeKH$G&vsCsva%E9v>HX0rA#6SzO)gh*|)umjlFom0A& z@Y-ms@K4;2A}b#6EQs*N@5jrR1FHaO<1f-k)|et!TVC~8#wjElr8PMvy*cou8R6BK zkV6^fV*C4mU?)mqCm!nw+{%A)?BfV0cSGC|FN1 zBX=Quf&(?OIaKuP53aY3j2UHNs9`~G%(E5McXvKsYLEnLf9OhEFs<0p&XspAIz4b@ zZXev!Nsq#?uMtx?hAY}*WqQY&A|7|Mr)b5lRZQMT#eoG0&#}&<7K$39*5#{6d7=&) zPJB=GjzvM*VxH$RHNV#n`-_KdRtT394K5X1l2x;yvld4S{cJ@(HsuUtgVgAdO@`%t zZu=q~CR4JTXPnr#dwiG5Pw@f?&iKfDkJ-)w65$?kHW-tMlp&^VLF>Fj-jm{?w@TNb z;hzJcCblItz1A!ZSc7r89Swi$ozZdgENtelm2J6xq$bhw9x17U z8^E7n9`&RYU5=H$cHk)N`#h*x=zs@1t?p+WN_ehh6meUvWBJzN{rR1J!JDN6hNzRM zHMCQd?+p%qL$%0sFBhyqJoKub zvinlAWc#zZ93qx`sKlzdg%|Z)ud(qIFat}siFqM6wY8I*v74(JD=w(nO)NR!UoM$r zuKK3eAg<-4*TDUt(N;XwlwZjQ@YLl9)P?#{TG?kra(|%<)QXKSdy~rQgojFK4cu6E zn%}MgW7&!4@3^MmpV7Vz)9OWwzU+GsL(rxIL4f^hew7slb1kX^_a{0==BJa24pLe9 z8?+WB)c_KIbX8?l|6{Z=uN*7%X}B^;0YFgk%xCqq7wV5050mAV>HGk9Sxu6)Rze9Ux}>uP zF`GyPh5|*FjWU?f6-<-6-R}s!{*C?w^hOSvo!quaOw{@8pXcg`~{Xthb zPG`DLU6+*%I0YLwM+*s!{f7w}yG^lHJ)`7~XlYKj_a1ylRfv-8E;4RqI*%3B?KCHS zE-6!q93t&t62p{iJC}_~A+|xd%Ux{otDkGle4r3#vTgOy-22TqtcljuP(3F5Qn80m z`==Q$t5_GnHz*z|g)pTlCa~uYJU{=gq)4MQ&ZNZnY@S)c2rgUUMU2F2KN(w zbG$Rk2iZ&%T@1aC02HbgdV`r}*VaeF2XyuU;>nA6iREjQ>k#|WjsfT@0#IiCpHO}t zD-txc)weOR0=T<>Ft(TFmH^N&yT^2Cgb`FA@!>4wS|cBng1q$ygU9c3ImV6PK6dC_ z*6wOGT0=Y$39?lc1q(@9YffVQnDOzL0H};!o=uibk&UR(XCtjB$%-MJO8h&014G%U z3EVU~tKav)X(5gCeioJzr@hpO_v**k9k(5U{30wV>Iq>pwYv;A%z-!WJEH8;PrsX# z)G;VgqTX%vrP4{dCp0nw0v3kAAnfaEgL$smz5MmB z&($a2rw|0t6Xbt8fB5=FzTA}(_7|rjcrJ(!nK~G^v(L?#V6!ub7%Ciq6E36x9FoeU z(O^#RpQMUK!aNALHH_y*%S~x>9`2rQAZ>W5CbHw1rS0Ut2UtoGoC-LNns0rb@=O`X z?73Cc5U#!^F_%|tHSk*-LOb?kE~40&k^QvoO&s()o!u9u7b^PY3PElruleg$>*+xyjXF#=1hL5=y=PjCIO{=zGS_DsYur z)@nkc-QQV>cll`2lfLbSh8hmv=Zzyvn-a5ZTe#c#G9R=dt%ZFh%U5N)8PL z*r`Y1o6YDtzTe;wE}^F5W}D1iFx)0zn+7$oVrMm_pRiN!xT$U9L2?z+KPaKl7BZV1 zg@;|~_y}}=_}F|$6lKsxC`>BdD#p@I2+WB_LM|RX1q8L=KZzY5Fo<1Kn?(a#KYAp< zQwbT%nVYOgs6l89Odxc{CT_gmx=WWO;^xlyG2-SxNA-)#xY^S*D z6K!T8Alm&eYWr+(pN+tut8XqZA@jr)fSwzSs0ikUf1!vlFW79&FNWA72;vt~kQJ(0 zY1iiva`q3(OlPb}sfHDMHsJ_K97916d51Z4tHm!M z8;FI6fgU3A%uum>8zqEjR%f|(BlLbb-V=y%=d-1snTgGN(3JsOzf2aWYr%i2HVS{k z>QmEm>?umdxJD|sXsk|DkM{Ubh{J|eGYPU0$`e3Am=3)eY!{BMQCL4g6|LKs>+Ugq z@OC`MxjnA=0*Vn|9<#c~dZ$i4tG>CYM>{WG(rAwMsH;J9Q4)_C;YXyls@(2M@KG_Zbw?Xe;F?tZEeeqO!RI1q z<(LY1L3|_5M;CpJAi)C@k|=M0L8fmcP7$M|&XLN8wF8>ra=_av;Aekf4wS8$w>$W7 zDlDeyAzYy>2Kth3)o(?9u9Y`KBVcVy$kh;)7BC7uSp?lm^gLmF%eyf``o#Ab`oG61IgS$S4Dt+QNF&6a4 zu~j(N6}>*=XOAS@qzRzFtG6mTiQFk$%R~U*Rr-$CfRqklssT zWWf+tcA8Mn$B>v)N6Dr$!tL#tV=`%YSn(=C7EwDCq^ZT7{?7kdhq2F|Te{x=oTR)J zZ6n46EPVvz0TdB~J_Cat6l3S3;!K27B3kZxjN0tjJD!F4pn-ew3LA|pIuh@*=<%M< z@5)2szByUD)*7KpApY_i>hJ22qJ;@K@HN~xJxqbt?2?1RU122$iLgB1^%b-E9=F-E zjq@f@8rlrOeDB80E}hO>%6$P_y^h+CCuc>~3m*0~w_H5_-3J}eRyZy%3Il7B$WC4> z(6b-@;15X7y55#Vo>gtNk(RV4cw~kZ9%LZIs^S%?>lVQ>D5Y%^XxH*o1%UrZTwmnn z{OIpK=;Zar_R9#$Av^B!Sh(`1Udk%Wle6$EQ?<@Z`|*vw=lsM=^?I#%Nuw^y#sG7o z2T(q|zj+qVOGw2PWTgM{AEHLY`2kHht*4eVR8kTXMCzu33599Milanbgq>0)a-=w8 zZ<07+c$7;rg%C#tgp7~Ef(K!3N0Jy@ZCfIet|MkxfeL1a2*bs(rx2nQ7&P^)#oc_Gvhh>*KaQ&E5S%DZR8-ZjvuxLL*EmF28b)9cw2&Jg#FgdT#|o~ zy04kiIRW{ci~XaQy;JuPQB=~A%%w)o65%%V{#_Y_2d7!)bpMi~8aoEw8`0=SS#b@E zJY`}v^+da(ds|a+sk$|NB6$v6DX~#T8~(m@WCzp97F&l4^AZee`#mXnOG5q(SckoV zQciCq-NFY9DC4Q@cdT3!(+U%)GvivRm_*XVAz;yPn~?oyCU;F1Bhga%0tonE0Mt>q}#Yk1LByA(aFnD(_DdIBYTCtK!AnJ z9$?MbGX?W(3afuZKly?$o$@P*9K+5m}x0N(e%Plr9ReLZb;6;M!6uyZyu6f^{^ zxwLt?DdL~cygZs557=bMcu2DoeL7qZm;g~lfUCEd*7#BKl7HLB^HqQg_$E*tbRM6} z?&H>B3#+B$-RbQW0+5Q85nrzlDy;OIS>WXK>5)1nxIHanx^v7HoI4^b?wmR(3#_V) zt&S5Y5zTY!FSY!l8#pxnMx$>;(d!_73;i6fvLk59ivCtO80=TG%wTCZu{`{RF9-!r z7HrF(uVw$@4O(6MC+Z#JUa{(f5ONy1G3~fP50KDbR^f2N-|viWr)#PNy7ShJx-&~z zseD7=z8`$ndfYdtsVP>dE!-`&Lidl-Tz#K$*jJyt%8e*CvFDs_to(L)jrc-|t8&0z z0Al!`>#_MqR2+Omga%pG0vk#fZt@_hW^-@5uMc18(=`#hm zWUK)3{e36ZKSU?=XS)YLf?^hCCKiUza{TKRmj(2<^TD|n+1DzA%Yfg*#%9}|Zi)Q@ z%G25Py541>`aU@PLsEU`kMM%N?|;3B^h-!cz&ty@zl2{!*e2;Ak(NkB7G@5KPt)%h zn!4obQio14FG)t5R?l?H%h9vO|k1K z>Dj|8hXmz|D{}jmi5Sj0RW3>{3P4j!-|y@d!~3M}FOhkTnMYnHm^T2k0>Jn85t4t9 z+X-3NnbA*deOp*ww>eCB;NW21CEDf)F!76`ieG!?l3rx+NVeqPi%q5!n0B%Mo z;3@h$9{wF&L!%mLyXTQ z#nQ<^p9IbQJvd`i?Br?3qn;%Z1<%QNwU(kiCinf>-36QuY>2Y~9gYr7o0}K7_hLB9 z{4tC{a9;6;tG4O54_T#Q9AfIsLYS4)21cc3@8(Ly$4wrkjeb`V zcXCRw25YL;$LH=Pq*2<7G)FBnxUM%FTziK7Oh%glEz`B6@Jlv<6$KWvd`-_!u&DS3V^k?WPvbhNME>&aSU|Gin;Ic8ojAa(`}QRcTYJVMm>_2aR~eJVaI2fYB7n-xs+QXtwjmE5ZmB|cq^ z50=$yI+75duV|%BB#6wF@>?<7SmHr6+{q~d!!HCk(*9{Jt4fasnvrkIyrF9w;dXubjuch_klF` z3ZM0}ZQTR(jZtq5>fz1-$2S|QDnEl$23Ym%P{Xs;txV;x?uS6OvyXyI%CrUZ5|&?a zVZ>x=&~v1xixjowh_kaA$d%-JidvP`ex~BalNZUA^{YYeLq}1EZ)&pj#BYO!R`(0r z6Qpprdg;Yv^ZMcx&0iMnhGxL)!v*DDNi%CyS~_h#ZfCm0OmL?H&&?aP&hx+_|tB8Kx&rq za|aieQX^f1f|H*{DzRR~Db|7j0*?q=XJJ>;B;q@EThI_MK~r*3oVT6iEUkOwN}Yy- z4Md1>kEX@l4ZVBqaW<4ux{|d5$ja{;5{W59f1r5dC@iqBf0m~~Jb%C2LWrq}-b-vN z5LoZpOSZR^H94G@pNQ(P2LncX$?n#y_(^GvXLzoKera|=AmL#deeB(M`mpS`HP!-F z9V2E#_ir7^cl=U8?*^z`W&{SmqxHO{FzgtD)W2VW=3Sy5jm6`OL#@r9Iy8RB+JQLrMI zL0r{!JlwcLcFS^(Sgq(GyZQ#n!Gm|@AVG)o^@)d+D88~OUkx&N{J0et^)d3qBv zB%}skLUvTOY9CYCcy1l0sf$a6euTb@+58?^9ATlM^Gcz=1~`R$VFaO>K~cVjdeDCK zDn!6?A?vz7>v}%xx~F}?`ozP2(r^aZaYimdOGL}Vw(Iv2@-<@beT#h;2|{zR0Ik)| z6t2r;R_*p^38xc0B&}W7l4F1B-9L~d|w#?hd=T&(xP2X#ySnJvc zW(o*@T4Dan^dg{h31AEVn7}+`4F$mPIS;JFXIP45*%RfavFu81B-%VB!BIW%KnlhV zg@#-b$&>>Fg)YxL84jMO(Zz7mIkY!fTK<7o1MK%{F|?${F~4v3?-79#{koazWW@z& zsfgF?QToN4Ha_SjTjvKOTo~C>BGi4?OXIL=8f4QlV=hr_c{c^&A|3B9gH0*OV6IV6 z!lJs<)?FECFC$kub-^OAcFQksnI$h5ed@C8{V*D;ESlrbSMa_5?EM^(w(m(ptw2M{ zVY1;$;@T#LN~xHN>JQmbxNUyqZZHu!0na>*LN3hx3_3DoB(dZlJ3?xo0$L2b`QxIC zz*QtLqkEa z8|ZTncDP%Iw^#NcaD5`Mxy&JWBp{V);Fe~wkMW~R5t4Flg)obv8uTt%@V1Wk7QuU< zil-LOPM+=^$(Tk$aXAO+EaEIy3FHXVl9C(!iki_if3=}Q^cCXR>3DQB1pNBMFt-t< zRpHk%eBx`HT(g#LcXt{*r|7cgyVe+De(_w3W@+vP3#@~=mhyHxLy_-!v*$&$aM*B& z!Tgf*)rnkb>kByOm>&;#Ja^lmsowJN5t%6s9YzO3>~zn3463{l-K2u9$V~Wdy(#!` zPx$Fv%Z~Nb&qy~YFxaY@eEV^_URJHxV*N07!WW1-5tB&4rd~x6S*naEdi!Zw7iH*F93jx1@r9()>#~ThLo!O+%;$0iFigV$% zEEY*O4D0HfR;7*O0x{-@F-LmhXak>$B;CG?G~9+1Eq}A4$z_5id_|HrlM9>tbG;Tt zvyzy4ukzH8PIiM#limrvOs&b{G@zaS2lk*EZeU8{M!edVxxUQ7EdIRXYT4S7w=2ds zjV4Pg6nxdtGbuGZg_F_McTQ%fLETN=CcfYUw5lFs^Fp6_{f!}vsd#3-_$T{g-eZ_b zW14DX!Vt7F4LDss_fx*Sp06*ihC~jcKES<)1~hsQ{oR`Z(BaVnvQ5wAcz-dNxdXN^ zqdXCf$ih&6HP5>WnQr*1jA5o0rd^#EgxyT%hs`H>Fa-pP2LjmQUK4=j8LRUCufgL+ z0Xdi@1IL#1^A=m9;fIIwb4;KnFMb%KRWTHV7%M?S>wfSVV=$vd&9D!@s?8Wc21saB z*>|RripO0rjmJsmGMBKG7DEpWG(Xy8v{{H1*A%>I-gCzL=mKAqcwJ_reOw-JB?DDj zlf?5#v`jf?ERNV;)k}Bq11|(8AoVAWIG&48GYz`=w`_DwbH%wkB&Z?R(jNElD_Z}^ zWK$Y&z&gQ57m^fEIPr_3Y;Ix{hRL4r71^eUv?e_c*^VGdSk$W>VS4t-x%*x(*de6z z{>qM&1E~_j2}vfj9PAO2jjjAVVV#za1)pq2pZkKTjSZ8Xq?8h6dP2kN+e;jT@u*(X zGFrn->sob`*$3VjC~Kk7!{o2DR*yNKDlxQ8Q0I0F9+KL;mBxK}VyH>`SI99!q*<^` z4Wv-oMXmdKG{u(f(vxlJ#IGkB!-!_4dlwio_Ff+SO(BHqfYchTmWpHh7ixZ7Bj|(0D;y-%H@CvJCvbW< zw8_T!u7$u(PHZmW)a?!|kDxys54s40R?upIaG)$YaIY}lLHQ~G8Q^1dByqk)^(Apj zp!K>b2XS;4?KFj2@@3XkMHFJ?cVhPo@@Ao~vd4+77-cz-tZlT+(o!VafI&RS26df4 zzoNc4!B+2ffOGL{1LmsvV3dm@&=y##tNG4PkVca9@p*XirDDETS#<|GPA)*?f(=kx zn!l;+>&(2Yjio+df#i#7p?lOn*GFo61rQRroHT*c>ohx4d}=4EQ5_SInOn*-YfOnH zZmjeidg47Nkyb~nK}SqFX&GcZ4{-Bn_5^BU#&xw?ZO?)ffm2tg$`M5KhT0yn4u(Wmh%(cmwbECsGZt6Xc!3xKPeN#w;J$cEA z6K09^g(?{Rxc;vA0=IgfgiBCA_I-==uVzhycnqzZv_1p<0BQ^@=&wS$PP}p*4&Pj) zk>?5R66eqt>=04ab3e&7j%t`dZ0OQ;j&j(PGT`a)N|RmpF)YdCH{#|srv_=#ojke@ z9eY5Si<}7lApc0MYtkQEW%v@vRaQg*&El(6GnPgEf?v2(Td1@N70TA4lvQjWH2^5abH z_Y$q!>x_(6pjD{w$`cCMZ{Mv%GZ#Nin_YK3oK4wi3|ZF5=yc+ZlQRoYfPDW-MB{@9 zHXV_NMMMtuXRa0; z5SEc=CDP_rG^9qZIP3?8+Fe2N=oP3bz^2C{3#hsTdu;rtXuP#NiO_iUwRpCgBh~mt zh0uFD=tC%T+7v^jM+VnalQR~+iiWG^(wy4l5vJ)46z(<1_Nbe39SLL%{je!FK#w|` zTg{Ll)MvAH?OtbHg^^qrR;dZHSots<*lzxLccqAPRo*||f@sRw) z7QGF}86UJlgMnw$PPRvdseloNOj#a+yo{QG3O@sdq}pzYZqY_#VAYNFD@K_xgrhdo zGJBYI2V_qJ)&3r$fs_I7 zk+QBOF~{uuD=FVt5?v0nHY%NezC75J@Vr3&1AIR@S^g>+I0*>5e?#X&A)0+;n@}D} zuD(gG!U#5{ZkV6(8d|;bv=)-Oq{&aR{V5*rsv%tIYFha3jWp*RKCa!smm-p?=D76O z{QIoB_wpm#$eM;xr$#sON;8uy{AmN7Ml|1*j6&t|!rc0t@r9n)NEXDl&7p)4eFC`!vaFBgoW6zv zAuXu`rWEt~FqjH|K80!xVlA4;Wm1Wit25D6T9iN3NA?5z147M~*Wn`&XC!N18F{Y$ z7Ew7Q63_8t7ype5k^|eXXI9Xc0(&h=GL7w$dVnbN0HXYFji?s7X3n;+x^<%^WN_$_ zdV9etkv?@$B8@|SlOQ5i20@6k5&uFY2P~Ak+0iE!&^=a$*Mv~+#)R-2=(ns=??Pr% zJpT0buixi`o<_g#NA_uf*u1qMTiD7E+Yo#uzvNpRC$EFQ8H^w9XN9XNyC44oWGP6d z&ZC^C7=V*y@FUZytZEzkXN30xeBAw4=R76E>L9?3Gmcn1McfEhsfO5w0D&QAF|>0r z8LKZeeLC z=P~AGrH8O$j5nz#@(&pa8T`rL1W0i#f6ub)Q>-%evx#{`y2_6*DSfQ1ctZhWpyJB*Yy1aM%^|(9|;T4P9autxyC5 ztAq^D7MZw0Z2l53p*cQAewCz84U~k!Jme2)lX@@ta%=W&*u!3uNp z9zEci^=3A&V6jmVShWx5sp#ODSKRL!oPUbYB&LO9#2&n)De(ggcd`XY7BjUUw$U`Hy+h2+#u zhl5HL47*FGR+`CmtIEPuNLq`;Ns^6wRB4+l^NBQn2RSV_aWv|0^McH-%+8xTXEC9c zsi@`0tqEMkP&+0sggSTjM8M98c63JBKD>oapr)*1s#hfex9r^65*>yu5XUbEWHbFZ zpuc6)WQAy3$yv$mSaWupj3NwQJ!OGkg7q3kh`Me^Q2>NZfH(WUOz0>)H>~~TNWC1> zh?9Tzq|z=vn}7bikGa>UU!p^^Ou-Kho~LS^m04@YsU=?{CRRy#H}Qwt=^&e^TAZ7> z(_lHpIihcW;T#qSx3dNk2j9%4ygTzv_I`;4SM*)a4$xOat5MVID(HHFD9PI{Q=V~! zaA*qSTW4&SaSp{#9B}iH`g2gnoO3b7$6!n^y{C$I5tf$N40sm$G;*rAopbXn%l`R|3BO;_d!5MVa5Z>ydinbldKDy){7U|yfQ>K}ESwd^ zO!?IJy!z|UC1GoLT{`v9ZNG_vnjraeO&_wIViV0@LSP+p&FB6>W{vZ)?MaPulZ}{H zr-$-!AyWOn$DH`EhBfzXTjGMDw-v6|O!oMkTxll^M#f&?|)2U^g_a~VrtPet9 ztbOWcj5CKhPmD_y={SAVdc=nI9#z=iw{!t*#?eS7NhZNo`0#mQR_$96LD|Xd@8@dW zOSoPGDHj@}GzkFkX@M=ne+ClJe*ozBRj}883XBAF&CK-vxxw2Wurd{}u}iQd>_|A~ zgEa7OU{t6i35)c})wf_EG)@_K8c9QJ@QsXjmiTADw}p}PTg0cMQ}E!I!4G%Ko*+&= zQsLU+CAc$wWj93Fol*i=%dKL~%HEd_ImN=0;SzWW%9A&lF?H(J+%Bp}F8*EfCxaaC z;k0LeL_g}~&)3VRL==cyGH3Bd@XW%~n(0gQ>K~Kr=ya26KZ0GW4`#FS?IEw7O2&Aq z`7MA-u^-OtHJ8qUbu5|OjQxP}Q%(-KfHg&(-^nfUKTxsN%ugd}h5hwh@qLNRYs}`v zSEj)Lc=Z9k|1zTsP&fxmGl!QqD=d;;rjriM@3{JH7Rd*4R7p6fXmDDyG#C_6esH-W z0oDThcOpSyxTNU6m>@iWcwyGQ0Qcstd|dKZp^lQgNwdYB1aq_zD3OS`%1R_gwSHnu{b%}qC6sVas`@k@ ztlz|;?)dd}7o0~_!H+Q_P+Gk~EZ`%XA%sq2O}j|>)bnBM>{+~1acW<1k~o=~ri-VY zsRspVyM=l_OSAnZsoW%i!)6_*7oT&F4)P~S{iRgnyom~h=h$$R!ac&=9iQUHdV7R` zOKg@?+kQ7Yr}NffVQ@En0^y4HSsz~__!?VrpPSGP0Iu19c<{gILk zPRe$I4oRz8OmduG!o)iuB0rBndUqAJmToZCnw`$uAUO%&MPc1sxIKy^9yi}J43yW4 zpu0R;3f5ZOwtVJz_i*n}{NXu8>;xN#kL$GRI%*(`mwg+lt*O(Yvtn7J!~h3(*2jir zg6`JIBl9lHNB@4Rctx%AX`}YNJ z-VviAMhMEE6*%W5JOpmsn-Fgfme#5UPk+jgHE(v@96-e{a6k~(Ga7NQKD;ca8`l_O*cqfwA0eopnDe6a zz-mBF_)RrVKiZfZ#$BW?lh+5t8=Qz;^k^@`@DLJwGW11;%{Qm8+$yGztWS^MOGSCDLIQws^QUHvXn-31y*=l35cijd0;n*&%=XB(O9Ps0 z-6blN6jy^;X(9C1wVSLv$e@KmkvH5m0*pS-ksMmUw{ATzAOzKv48sQu+YY!g#@s$F zrMC*R@SA`-gu?Td7Pp8mkt&UzF>WUE&g88_-{E%NNNnAa?`01Qt&nCnmm;^i(g{)I zke?Da%8R=`SJRzQtQ(Te90DaZI$R3-NK=GVw}WWVlb#@O_#|iqadQDDlIOSSO;eUmYrB zKV-I}pCJ0?e?WyCClGGi1~yk=dnY!RUO9e_iS3XA zQz0V+ZF5gS{&pe z+g*px>Ak(EGYT32bQ04KVK8R~5Hf*?Cm!(AX$+GdA>+4F&^zkveDY(*fUnBdy%yBu zNE^B7Fd-*R;5N}Z(te9kTm4zQ6F&sKh%_-oebJG9Wn?GUi{*1Ye6x=G;Q9loUr?mf!4By<3Xr;Qxxi9+V?o6zLM}otv3`n zT#Q_-I44^8cFwp^eonbivF+N>e)kl2c}}30)S|9&b!`JY)RCb6-GH)xRfj#Z@d`?x z<^j#3-cVuXiXtE+c;a(k#Kq>i7ULswX}*bxg>Hy^Lvmb&Iq!fOwXc*KbD!)!&kT3n z4&U9u7M`JnZ0O$F9=cdeY#2<%csTu;?he#4Z7JmkY}=8i;uFvBDDUG695p6$jy%aO zS5?pBfewnQI}OFN>!W7OU*r)C<=L5Jv^#hZmft}K#>ShWOIkXBC;hJM{j`bx!HAS@ zMSec-Ai1Z!?HK(9oLx@lb`WX!zACnNpFxA{bXu;u5p61!GbP=PJC69 z*1lImSnD)H9i2cNbpf8yVU1we7E}=|18h?@U3E!Fm)u}cs8cNU6cDt0&9Iy?9WWDV zaxs##NFk~nxIF$@9o@|PvJydw9;Hu6QN=xcb6A?#8EdC?qBD-ob$-6D&RbnfkefY^ zmNE2(U~E96R!Mu5d4mc|!dmu5?RRmCdzG>BtY9ZizO=1tJl;|`8)uHZ8-9W;AWLsx zxZu&zWJ9){=;>RS?p8yrn&|m#1#3rs?O6dOfvWSu_S^dTU{iLM=r^rbSYmo5!{n%0 ztx7BsZuy<%Zz5egT%y;GySqZ0?DL1gBzk9$60)b~Wy5k1#+ESm8*C>VR|VX{8ERh< z((IIf4FXL*67s@bfm)*egxNtL$S@Hmp$HeP+Te&s_`1;-ni?9k#1nLn8iF571C5C* z27cJU5~Dn(6*>To&JpU^8ob%tk*Q%Q@lJwc)F+gok)?lvawzq6;66NUm?l&#y1NN|NXvPO%Py zu@3vO4#`}mhFx84xGyMN(E5MM28JT^7t3+_;_6(H$8xovDo$y##nDda<)qKOAfz>f8f0L`=RTxoQUCg)o@t@MCyjd&EDTV z6M==f32V3(DG|qm=@uv+Sf>jsj9(ISh5LAgKR@*^?ZGE>9E-;aTMEDxPVmR8VLQ_-j0@o#gNFu&}LuKJS9)rKEV<8Eo?nBR)z8Xb0Y#mKIeUdJgRc+`a|FZ4ty9 z0`~csHKR6YXs>^9aQ6eHg(1vF%m(X60zxiqe?3)k{-JT(?V9!MZn1*GjQ|Q_s0FIe zxcJXbW;gm&5{hL2;?=xNM-=Epng`>a|_wUR+2-9Z+i zdTpk^epoSpA`ZFFPqgM67);g#S)SO;@XlHjlH4?>CeZ8{Ty@NU;(LpPI~eVPVN z`m23Se7`F6DIH>3m~B;6D85g^Ye41?L{!%qG1LvSAyyN~>)(zJ6=RYvz792*t$$xTMIW1_L&6l7zmV*= zrc7ekb;UDFRas%X0t<1{jAs+`t7C zrYc`+Q}i=1*rnV|*{fv z=mGp+d!xUn@VbW4JT{j4E)yI}=zIiAp2>kUTxZ;onN<|}c>L~eNssxwcE9Iv)60FZ z4R<9RaqFG(7t0`wrS;Err;i~KO;6!4t1z23`N8}Z^wi7u!etCd`ZW$@P*uXF4aG)T z3A8<&*3=NX!U^9GU945q8@Bu6a2w-wqs;?-lC#fbj}bRQd7Yw{Jp)yb67aZp51SFM}BTR(8 zl!y^!J~KH5a`5B@t9ZF0XhkW349o)nVxfMT*0_j<;^O#8)+d&; zK^>}Lda zb;KgKcS}5tWuP;1WiipA{Kn%4b@CI*)}ZSO_jI4q-tKKPmZaWV;eAtO-Ix|{>I^bt zaBv!j<4CX#0u`AT3aB2pj7| z|B&Kvg$obagwD3z{Zlr*ESP)WnYysif3<+<;n4&=hvp?{x>C&Wy8zI>0YLjRssCR< z`vO)O6HzxXs~LmoA?nEIm1V&3yCQ!rCacj63qeDz;`%C_kj6cYxItZK-0UIvS86 zrFK=(%|X}XP$ntIN2yHZH@e^o_*iL+ce<_m99@g9tma1y2sYg`QdU*UTnQ}O66&G7 zyH)`-A})WJ9y&geW=3NsWx&w&;+T4R%1c*Qy1xTkY2(^#&E_734rbqzCXR6-|#5_ zthU7y>3-kqW)aPRdmX-u>q1gSIRlK806ihvm)ulLEy6?SofoaGO_c0L#0;?&>9H{k z`ztu#+BSF;+ROc$MTf27`=_XdZ%!~iS~sNxXcx=uyqMzt$JrGy61S9dsp3_dfzcW$ zN&8}8SYunVK2P(?9GQBKHxIc(hk3MkOh-KQVw8h~u-H^%{G@C#9cw>#o~iU7EPDvY zUa^d~O0mJxJcfNF=5zdBB1>PgE7uPoCOiPyKgT$|(01juurs%Pq3r7#&Se4!bayU) ztvi(jMrBl<`x**}vlAk4Bg7!>Uo@`HtS?N?a|CJ(zQ=usOIqtCE~7XA^YhpZZgcD6 z8dlS*27VB}7{1g;ppQ~pWiw0)I}FvwT+TS}O{1(rCrh)5S&D6+q3Cw8Smf*O6BqbI z2JN~<HBNy3@yr^PKgA;Nn@8-raD0i!(BL6axa1#5CLtLb9Z?)nE-{zXChkfytezCbo@4P6B{k|A-^X!@ zIe_nfLdnkB#=`n{2=+G-{};(41WB|HTVq*kx9F%M8o8e&%pp@uoZVHcq`n7P3VXY@wf*iAA653Yq69ub=NIh8DtWK();l|QQex@Lcouq_T zk&K7p2>j}BP(1F_)my5Gx(1oA#5=WQy3~!xwS7hb1?z0c+1vGLYkkM6K^4t}LoRyK z&f<8JtSpBF8#mgnk%e110u>Td$QhHI1iVwd4C-(JzQ5kvY6)3f(!p#HrQ2!8N43H2 z25D(HY-6Kz9-zTFjw1)|4wSK3Y6vgEXa&if*!k^D72J7lV>y=%x=a=BbjW_ENF}oB z6UhYL3ERyz#EFp-cHo&#E|}iB?EL6NI31UTr>duXA2X%@ad@)Cwtj4X@)zMTE&O-N zZm|pY8gTfns<(PdNOqZDb*w~!GcVo0I{41Ll9;n=C2Z%L&#={s%GI*j0^a$&VV70& z$*_9$=IfRqk9Q55^Us~`iV$N9a~%MOLV*o5N33K8C^7d z7Mfo;<<|H3YZlZomtGywj`v7WFn|(PxWW^A(g&dVr6|1xsh#OdW-(BKz&`Zib-yXi z0MxOp8Xaang^(qX`4%_Li8l1$9q@bp1LC`|tAq^pFid0jE$&ZbMDwjIo ztaIrhxz*Ia zmj~DGZHGh~z#Ki!DEiY4`{&?3Me+Yjn`Ki_n-sk7@MU!Ey~jNHjEZ4J&8#_DFbV>< zR9UkycoW``?*`GOsmkRm&KSqgQ00L{&!5x=o7Q(+AeXK0_?Y;p_|iw%425a$3l*_4 zSrQK+7mF!Q6SjzS+6+QbtH>TC>~f&8#Yu*+oD5zg>9He~OR(wW9GU8!Hdz-HW{W@< z#?3pClvi9)Y25~e5V))n1Wwq1YdK0vC&o1?3zBr-mz7@Rz`?^q!fJ>=pjSasRNhT| zlrjkj`{}ub+wyd!JzxJzWX{jw4tfBn-~g_)Kcn)`Wu>JoY>b|VOE?~HGuQ0Rp>W82 zP>SM8D@-;rs4tK}ogg>Au);WouxHhLZ>x~6fUcz1(zNlvBw#EJ+-TlYay7r&+|Jw1 z-Oh0&w0-^N=X>*?P~*L4qNT<0z!X@4ah34cscACxaV3fV$J&gB;MDzwq|ip2!gt+a+EF9&*3y_yL`BWh(1!Vk=Q5atBO?xXT8Qw2ATw^9iRIHSx2ZgR_2myzrl6@DiQ6V@t&W06IJXbpEUp z_;={=TU%SaY}5^n7&LBs)TRk#EUyORhIaw+T{B&%+s%5PGm^F97Q&lCJ>=Wl;lI}g zag^C1yi251SIc#TJyf^Q|LZ4=W>^jA9Viu)I#j!N<>zd-x)Jq?JKHeqRo9b2N+k8( zap?`PV6pO5IR(Vg5z1T@9{2Vf(McIhesreGf@+5f)ihnry)kE3ITf|-RB7C)Z>8eF zEy|G^$$CbzxbGn=AWG}<5WwZrsK@lz4B`tXkOa(b+~JWRrN2sC!rDQpvHMc+s9u0J zQLne8dp>1&o@4S7Ez6C=n>7GhYX253K<3QAl1|xg?gu zCy*mWH{Ij7;ZV7M^58?=ywttcK|lDIw`%2^wK{YmX7v}Uw9Q)UdFNj((GwLq>J~$@ zq8nhgT@76EfKBZw$A-#|+paFs-5fbrnB+3~q-FSSsj8+pI>^+Vu!M_u`UFD^5mlTC zbA5YA#9-6dqbC2QjO5pR(P*h4x9g6gb(A9;TlDF)XhZeu_?=2KCXMGvRKNzdbn-}- zXNIB_IRlUn+pRa-+!lcYLCwhGQ{CZnq+Vj!KSi4UztWQigkB7+{|_^nf9pwmWZj-+ z{XLZV|2IA9=fC>pdYF~_q?`eq$OU|Vmc+j3TopD0M3nxIz97w$G_&^bLdTh0K0cUEvKH31 z0(Ry)&rGI7s|W}UysNCqv|82cH1@z6XBr5ODw!i0LlQ{+<21io-C1#hVrN_#Rg*Ad!D=$2}(eG~3t?=doqPVXSLY1epOdAz@{N;^oQ})M7 zH+|&h+VW@Yp>~LeKismZE&NzNrd+pGDyTw?wf4P?gG@X#8`0M%3u9Fg+Tl&9k`UZm zv}2NFb~jb4taADmswTg=#DXh7ZBct+G268dBB*gYcY%~&P!~+ZPG;t~W<6izO09hZ z+P1Tt4FSpnx0ubT1?ReXGvJI)eN%vlWlGK8m0)Gp;|S{V#PjD!y~J?+3U`MQkO^)E zxYBq4EdNVK^Y0#@-)dBU`OospvY7Jd989yi(PfH7U(nqufxKa*0?q`LuW}-Ipuv=d z!6>LGd!s0c8WIZuCvHIb5T3dW)obCuus$ zIme!Kj2{%LDTa&C3v*4PZ0Ek2N?wS~zd!cX`HXf#XMYUct2l|>#N(qp$uVq6?ziBj zqrl-w*?m-vO=g548O;!9i%s8>+EkiDPa$w%tUo)H%&%i_GfwPCNmB>jefbjt+AQuD zBH?*z!IsFFzmU=uc+B1)wq|uk51EM?G?MP5ES}cDQzs@*nW|J<2f;yp(i=nAaN12x2vJWB;QbO2rmzcRs0yDo_ zmY!l~tW3T5t%7t0TPmiZ_H}>(E~K$!I%pVKlS^y&N2F8ljN?9Q8}oJ2_QDkg`b*$7 zgC)=-qOCIA{g$h1aNr}`d8|M?NVL>#>(S6O)@^O<2`9+c@EdDU z9fX8$mJz2_WZxHb@L_yLO@WaBtLPh1Bu1DU_VZR^DCuhF(q=^nD*V*_zWH55z&;-H z3D!ycW(2S|mKv6Dn46w88b#j(Wt)h?l?X~h>AAcA2|!P*i)WE5gAl=(>;SKEO16RN zhpTEn1*tVn0^|Yr9ZF>S?Zh{t{-RgJOdgzW^vj+>$i3HAnDI1%7^mnR954t>Vq|$` ze$p;}g~V%b`)WN&zsH@R_qLbZ%g-#N0*P3j%kL!M9Pde{B*1y zoO>iH>QqJ9>!$&N-mvt}KAW37IQfHijbr6{ISr1yW?Rh^!L;mUOSt4JFBjv%FrDEK zd1txkJd5Dlr%1(fQ}faYz3M$j<^YtWPHqvH}3m{~XxDBh&1HfP7ymFdCW zS)+P_SX({6ULMDmh=Oh2Z$k<>hz*POya}upl|8f?lQb6CmiS1nhGKR2Mi^5CbM*Kh z980mWRj@nf0u1xchtSP}VkA<&RP?9rkEUj~QP{f0C>=BI^0;;$A=b*yn_vacNNY9| zB?mQ>WR@+9{yI2F9yxJjiQWCB?X=JVZYf08ev(&W{f*+ym)MC~CJ`gSgOQ-5_=czn z6<0@|_%UpA$7IOm)NqrL{?Q{-Q{8Tw7)U5LbndDGO&_$jHKUPccw|0i*5(zjflgU) z$vL-sn8J8AnqBG3#I>FKG%eR{;|vHHrEYohv*{Jn?Q!u{MN$kRTVYt5 zoS0#3wv_f^p?lRdDB3q2W%YZ)Pq)4>Qgi=|QHSA}qZby5n<6(t5EigD-b0&_oD*9a zf(MSXjGx+n)k41cYI7ZDGf;WEBDhwPR*)~OGKVUm%u%yE1SMErd-^D12vL7EMGG|? zQIn$+UQ-8>01p>L_p@~ z7eK*x0H5MN6vqE9qrPCXt1mj!nlA zd5UYjI|T*P@mn`u^rD==xcDJDtx8QY6;51EjGv-97ZrV2uv(4AJk}6PwR5p)xV#a% zQPENc=aOZnUgC&bK06w=Yh&~(AFjOuEl=0SmV8q0LxpOaQkveuE7#3k+3dozZf_R* zt}UQAJE10Ccs@;$c@D-)m^wWYMF#;e5dmQObBfI0#d&;srdm$_)ce@|Eq{^c(S=Hi ziDb6W6&B>9i0%yvd50xN`MGYM;qzy7x6n4YqwEkHWK;s=QzDC#rN+ec<#r|yw1qF* zIoo;Y@ZfbF`7w zTT2PYDt2Jdvi-Jd#sYUQ%d=2eUUMcs(^E*naB!Z$eyZX`>DcXaLpS@t+NM@WPuQ^F zqU&qA<}`i0HWdpGiCqkRmtOBfNf}Gnhj?Jb))}h}G5y4&=PNNT7E3Q6AG*d@pI;JhFbgt&dF*~EMR!D1%9oU&_W$sl@Y30H4YsL6-pRL?Q zYTY$3O5@olebe;Vsk@wiR55_9Y8k4%byC>Vt0Xo(W5i%ft~gCbBT2-GW#9Xy!z1b} zZoPT6t)u-(pHj@ZhrWZZ+Lsa&!Al*>!r$mMhjr4RIVexD+@N1CGr z0QWT@GW_Roo|lmSP6rE`T4-yT%Ia8H{v{L?D%&rCNrT+98F}<3^M}0hj6{$oBP1Re z9^Tx$%*sIYKtM}6-6#A!I(yyE;KwFv01aE@UF=gs*2ZsToD56(~BJvhIeNLqNJAYc9 z+cNP3`L;2`N3+som|Z~2E{;K@lpO3Ryw*G!&HLEvgzU<$2X!$sEpm~G!7ecGosS(+ z^J3A7hhGQU5f5K~Zai9fXc4l6FvDTF>P`88AxuTQ1Me*u|Ld~uv{YS3ZV!eP-&@e8 zKVy^fG%x6gFMDq&B};-2os-G%FYMMt%LHYFu?nL*zl=fOvVtM;WGw zbZp?5*cnmVa;55qeao#)Zy!Pd8iPsYN8}0u6b-8zi_DK$na#|hm8F5I`7#|4ZhE& z{?2R$w!dn6bp!MUauMSu&uPfqeB8%!3U^`N1=U%hkX)4+^ZSV$N?^5?+^*0M(uVg~ zq0sAgUBh!bMtzYqQ)H#ZRzB;YZ)&2Y&Er#UsysX!9SjnnC<40(Pfr7BKJcsBzni%6 z#>=G8-)IWbfK2`A6%&h8Mpw>{b1Ib=m9kJ2+Go38VpbhPlQM{F+J**QCF66-rJwHy z*@Or!tEa!ZZrfV^A?3a%EXo)Wl7Yoe$-IKwP*e1qeqt~7tFW4@h~i9BJoh2p%es8<)muM_Jh&lXG9N!!B228@ha$K;z~HgeG+0gV5l%bws8iRQ z)QT+^2)Fy|dyrRQD^0*uD2_QTCcx0K!$0qjHT`aZ)^Ozv7uKog%~*0EmXoztp~mYw3{Nm0_E z?GQG%ukR`R3@uhoK9s;`?BWBKIf#mVR<+F_&Y>cD!JKK?9ivjk${o4cq?Igqk)%n-G`ZMGX5Qrs1laMNw%FgK%qhctkF>S)up4)eywSD-_@ z+hLE~U=}cvd2cQc7F01~n||iIZA#0M26+?Nhq7A({v74xNifg6hq>-|qUEW{l)uWP zQSeJU_sOun=`pCZE5;s6NoP0GK*myLYaAPRG_))2QRsd(>#ra#LC`;9gC-@w1GYgI zJhos0d9BUhqZ6=>#~#j%&<3cM;HQ1TO#7)z4^kXpYs4!L2yp>%(#*R@YB02G1Gz zlAFHTr!7hVV?YVGF&O@Mcl^!GXQl9uzRch4kbgZ!Wcnq50e1$!=0@h)4T=NhN2G>` zMRX+8`giX-XlgCxSM+64jD+Vg)=TRi14=pua)^PviVG?97b){L<~L76T*a9!HK#o} zAkLxW7?RSqv!(_Ffwz8z$#F9DtVKvve$l~@36Vw@w?N#sG?U7(#smQ-48QS86jIW2 zSNbuD^%KmW{H={}1M?<%PW|-GW&4c~I?kGh2`5Y$p%49lB?-M}b{&aXY3T-XtdkuS zvNkH;l&o;j5tGv71JYU1k|HCC=hE25k2Zv_VmXX-bc0umRZUBlUij;rdJIu_s``DX z`C)YO!ZrK7LZL@-5L45_WXJc!lXL}aECLN{k-x|%JAFDsUJXJf6XHvW`p|2(v;%qo|2)kb`X@b}_CJ0O90Q>0upW8SNv#M_BjP{xQ~^dLCn@%Cd- zGFPphFle=G@6b~t@bevdxpxxmR9jz!Pdz9smSynXVf)(Py$#Q##izx zQM#j}Y&=#p6v|;e45c;VCqd)1_`kQENrXo;vq^IMkk@>Z zj_o0++O^$L8!$?ECiBMThCx~7Ckw9d50FeJ2QEC-=6p*`H-{WiYaC~)R`3ts2^I#v z2#ISpEG85o)2TJ0p0x5`;=r>)=LZpns}1ea7AZ)i)xr$n?ieUpaaE{@I$oNb^ad7( z50dy;%JUM{a57K{cZtF}-=uSk^Mms67Urh|awt41@?S{DFs4;fj4W1ux4S)uy^Rjc=+!jz2^;h6eM$H89=;nwvM@(icRwy*P`}$t!+Vf^jMI=+e zH9|8dlATT1d@W`%ks5dOzK9d*X>8Y8Dg$T{KPsC2;X;4iRvO&`E?2WF#1U{frea$= zE6!v&nG~Ch@|BKf&Xl^wyPX6Cs3M2hTn9Ydh`Vi;*><&LVj~@R( z?V8oE#5#?B)?Ti5K^BR^wQPZ;-ySDcR*_gn0Ilg@U3=+VX+-_U#3zaJ9i-yWc!Z8F zhmw)+2Te8lB2yY=gS%q-p8SjKCsE*3%FS+hs7qL(kbK!HmFFfO0 znbn{}Qw8hor^Z2BGmca3nUz@tW6}dw51%T$^a@RbvKO+DQ%x*3v0uBYOX-y-_oTNWL<`_^uVg8gEFoaun&{NxT&76KjtS!9{x zrSGZM&f1M4u(0tE*A5P1zCHw8=7haMd59vWGVpet(H@<^vf0q-=qVZdeA{0VA~fAN zz#njex&YsQXr&j|(>2oitN8fI68_gtz5hk22-t58j+BW7fC@+Vqljiek%pT{!C#32 z>6eKDCu5oSLaCfMsgJ$JP0xFcKNeahfJ{M;b$0c%^t6C>48Xht`~@aRL|1&O5`Dg; zmy2Dx!EHANus;sqiu_ql`?slo)C>h=#VlWRdjcj&0Q$(f0fnIa2pgGR;f^#w;-+2; z%nYD!z)3QpoavxVjfH0k=goXe0lj1^{~#}l&G1FN#g>_;QbwtH zdX+isZGZ&iHm7XyN57C3y(+RVI>Z9)i8Q}_GvjOk(yU`S7Pjo%lXix_rD|C5KSWH><&$L1REbT<4d!XR`C$IvL=64R4pi> zdXE@qwdTZ+b<*E8Rt>q4V7EY=XDP_5&m}W4gM?&{@&k!E+~l)1{#!9st&V7@jqmd+ z*(8``zy|IyNs)I&W3?;Wh`+#+y50-F;#h)Z*BjA9S{A;AgKBAhbuH59YvoM11TKzW z27*D*AQZJ-@d_~Xrl#veN>PWOxD#XUE_?~%=VNH*`9{6mLI>(Szem1y0KWeqyYs|X zz_>wxQ0o6zx;j16P5sT*FVEPj^>5i~9{R}E;^%A)fqBgw0<;IVqphQ>sjCUBtq%?l z_zM&z22=D@uljsNFV~9r6Z>cuuudreW!V9LU#4aLrt5!Q>%YC|d?U&qCo=mz1Rf9Z zfvL#mz|)9VBP7cKl|vfyyxG67ZZGd%EZHCAcVP%-_kbgu4Hl1h6dJ zuH4A4lBh&CFlk$X(~cu={A@s#-Z~?xy8h`_SA=L`pF8g$POzkN277x_kDc;N842f} zYbPSva`IX}->hWQsFe&4CcMnvV+sWUG8O*As_X=zt<_sOWI1Hx1$!%0YltR_N4h)* z>Lr98fu8_v2CbHF%}MEq#^?@e2~|Vhsus3Jp;# z+m8{ak>cQs`S@YdL0r%8**^$*jwV?+jL}RtCr$BJbFNRKJ2#fQ?JfRvK4I2!?^NO9 zvs-55n4^+;baM~_Njg49217)TfM#MA$ccVZ;yIeZ=Kn=Yh!!ESNXGM-S^2$c5$S;( z_i%ySUdpC2=7&_;dcImyf(3ucsm4e<6@ezP?BmPQ*A?%gF-ffRWshrzi0z~OI2hy5 zS!)!`KM^2(lQn12aipS;4K>QNHeW8a@+4g}gXOEe=BTvCgGp+IWO^X{3<*i$X2$7M z*zWHKqM%;fV&Dp?HpMZ8Gn{>Qzjc9redBcURIc(I!k6H-&XW}G0YG&CfcvNS^)GP$ zY0DLU9NJ*_ED37{khumVVg235r$UP#oJYJ}y--_K8=Vk?GLTU|IZM{GN9i#|5~!R_ zvOgB|FmnXVoJVLRXl>qTe*ezJ38bp^)$)sFktL55VP3wlpCxPB0BHqnJ!8p))9b0& zX`j=rDZ=@q1%ZaIS6wXWV&9hd+YC2(^O2I}vkSL>x!xn+lKG!e29w@L4R_72^rnoU zT?9i#`EVc3OC1##E7f|DFbiNb+R*q`D?(FE!?$(1Z;dfs7w7*PLTNi1zODUQ3qNVd zw9-n&f)CGnQg8j$Jba`*O)gO`@%DAZ66du_Q|o5RhNmusKi4BopX2os$tIsNL2v+y zRsWWzekuty5Z~u}{W`N>qDI6Z*yG)$ ztGFk;Zi;CDPm`RDb(k?#dKFZBwwH)NJ9v5c(em8srN)?U&`9!3tmtGYB{Gk@s!Zv9UWfxb?E#PvCPFL9m5GGuZDFf<AqnV~~Dvs~eng81ACYtwwAI4XD%N z&Y5h^iy8d=-|G78=B*)%)OcOunrR!vF)pZSLVu9z&u4Io>B9GfmpGs6QKLfzbGK(D zkFOwj7Don9gCa%43dl<|u-wcVi#Ev-@>bCcZ;I7awjIQXecZ8?(l0<=v938(`+!Q4 z?~ye^re2X;d-@q6>A1pq?@Bj$bQ+21Y92#IB1l9!H&pXIZg$2sZDbA3k>v*LE^~rn zIo8kuJUJYYq`EONvdItxLon9(9%XoKs@q#01s5U=Tb#2YpXAthYfEyfYrIluMh6TH;xIQ2YBVF$}{|mi1ru?K7%bfTInqXWhP~m`?8LHMXUAHL`iq8tS8CjDJ+x-6Ck_76|{*O5FxOm8lOVqKJe9Syc8`P=a@M3&&$t(8FP z{7RK=8%q~sn~dEem6sO80Tk|A_HDD|}XRmUlduT&^&#>UxEB59!Oq@hn(ieP^W)^P^1%wzDC%2xyhE^_XK`{}cJO`o~#Kq#{8CdwG| zL{6={Mb9N<_VD2v<(QJAoJ^QDW-j7pv9B#UjIBj&ieSu}I@ZLfE90-Y(3pL9fQB@y zTk3#@&|EmTQW`woes)>Cd#iKr1eftS=Fm}8kv!;CLn9?kT-ojG$K8Fthc9x^M{t6CjuMRK>!N?zX8L-gEY|}h(n+p z+Ki*y5uVH$NR1t?j**K#mKb`QV6xQDaG zUVrGP>WHr^KxxyhT2<+1sVm?|XE0VGj_$o7$eX~&Dpk3{CrV!4khT)|?(Z=IWdL2j z`ne4AmY1sIJskMq!w9L(uoA4aUmmn|Sgj4JQ01gI((f>@i{%$6E z-oWjbp z>vEl6#nrtX5h=GBO|^Dix8~LaBc!vXXr$&0-lpp~bP}=Q+r{I_QykgjJFnC1a~^;P zB1%5W6@n|T@2o0w*yD@{N^Yn)yyzk5zJ;hTVx+Y(-ePY*@T-Ro9Si9uHPbEGmF=9{ zwK=JhT$xDR6+#`Y?8y!jEA)bLRTvv6V)oM~FQnBoVDFAHaqt#wxX>pDJ-@&CC?%-* z%gtjeUMEgl)ZZM$)C)y^f&?9CO~%*ciobhtdYdyWh(A^%N_8PLY@7InEnwhXRnN4DkKwLi{Gr(_8sP zCmNs+pBmZE{UYiNxbmYfD2UCs2;b0r5TTC*@Z8w-EP;9~1dP@xBCZVJI3E5yDPDZ? zJu5otKUHtjPak92D~NQs{+wYhSafGOmNhKx%=cPvftAC61MY z+6m@)&O*?UEPm0=_3pqpAiVw(@zoo@gn+I$oG`=9ao;f-YPF*>8f)q7-|5^i&*btqAiRz?aYlRE1G{0Nl$w!1w2fzJEFzg!y>>>O%WJR@O>OqUB{ww2e)yAqJHF z6)zKb8G-nx&8pt{(eZrqkK_5f&1&&KwOKu1!OOK(b$l>f0<7yJfHr^TOJA%_LC^ZJ zg8Xq3p@H7B8BAsoO%i~Yichz2t@lTG3gii?7DijSTmIKPpa>*)>Qk)ewl%@_Oc0H4 z!QfhW@mxG2yogQv*ROJqZo2m{J&;VdW(LY*b@UA;G z<_&|BhEq<3KhW^CErr76h!o8W$d4B8&8i)RV~zFiI4n?b-F3klxM85OS2IAf)UiL* zsj?e>I+5?E#Qs!2>61MP$cb}R(D+`Xz2CP@DBzbK&sy^px+z5HVhUojk<$Y z`owq1gSsWjG|@D101Mviu9V0%`&8%hNgD7uNH5_-WP@n>2=I7f0OR#Z05HCc;kX9s&pVhl1@g;EI<#8202IGmgBZeHe!ZaYMej7-b z1v=0;Z3Q&()8gn)$MhTX@%Aunv7NeZrD*y6PsTT5_jx0GOcrJ$ zsZ{Y_Z?VzJ?Ty(=Y0MCM-XvIW2WUb2B`OrpVc4LAC{hJ@x%HS1`DT%}ph99*`d}#r zjrR7u6=-u_PZK^46t)X%V`sfc2(cvdv}-p-oZ&54#HE$26A@x84yHtDcS%>M+YlB& zNk)KQ={gzmB?3OIpc=TiQK-1L7H|d>1IMaYbwuhA+r6wYx+U8p*oG zbV|M8z18;XB~T8=1F$9i2`w-Ef!xjbS37$<;{97j8%NOagT?&=*AnaH)=u9?w0~NM z#z{k(NuuQH|Cp&|RWb+z1Z;At)-8#`sEIUYc#4Dab-Lvp*p=HEM6=>-PN8WYu+MHv?1z~pRx#*Tf$Tu`r zF>$s2fj35h5RiU2y|+)ad``ZXw8Z{pTP6=U(dGbZ{tp&Q(o)a-Z@cx|qX>-xWX))h zeJ!pqucYDiGDVqq#8N`pLIMK>U=ctfW0T)BVFdFAn;B%4Zay~Bgv5J>q6Y?V=5C#{ zZB_4VP2WJgO8MCCT@S&AvrkLxw+(K%-b2G|TJ1dN^PM+M>@INfyBx5FbU;hY zv4@H&-3(?&UoT16msoBefNF7f>O>#yjK*;-_7Wxs@A?vCk)o~ZWZ>B)2AH?P>2OOw zXl%o#2%q6xF@m>q5a$3-JJ=FlP+jY20bsx;?$%c|=Cdz$U*k|aGht910E1-19|$F< zn|dKbb4)bYtx&Xss)onDy0m2{Xcs7V21ia>Z;VNG>xX=z&9e7qzowI09D1dpU3uu( zhBTB>M|9fl1YX6mDoF3K3`fLFw4({zwDB4SUDr@=M^x7a#yTQT&C?#N0Oyqvrqpdt zY=)SsZzYUrZj<$#PMKb&NKRaJb@Nl|;`z3`+%WP3)%sk(W*q@szdu{UUf2-*Hvzm@FB>&{5X|-tQ%=B443Xc4e-} zAjfAb2Jz?wEYOqlmeBfC)RB5yPnSUZ$<3B^WGhq22t{^*6VKzF?4n;Pw``1*I9UiHoH=q7WeqONUb(({bE&C$6I$b>*a2av(53e}CB4z>E$g_-hSOcX4E;fe2W4&D-h zISyL1wky}aoR8S8a_Nna`G~~}mC~&XoENE|a0o?_m}_VmeJ&jIxuM?jmP4!Of>n4u z?@qd@9a|2zumYK3+Wd3duhCNKfqU0`7<`VkFh}K{dwCk&>t7WG10#YMAnos5i@)cM z^$=}~;}7@1ZNRl~j_^VXe~WyV&`Leaw*@SNj>i=sE94Me3ijdSE1d~v*I4})y4r1=G6N!h)6SyX#U*{qx(Qtd*!n9txy*afF zT;-7(ZIgU_TRvy_OYSdM?MeLr+?|i(zW=;K0eO&rwX$&oV$1e=!shxGzwMOSqhKL5 zyz6ufdfz7qA5b#Uh82MK3jLKBm=AtH!d5X1vB7#F<76D5R(MP7QwZ}FrG2sK^Ti?W z#og%@*ve}iPhL-aPaUrjEbG%&A6?p1q@lDp#sohNF_WMqgQ@xqFRN<86oVlX3`M)p zBIOT1PXvFW?zivOigt-DLGZ}ww?1(S3E*^@X@GCFI^#Y?GO4!17ql5 z@O6vswHzUgb=w!&xGO8az5f5l-dje+wRPK~xCeI$?(PJ44esvlPH=a3C%8j!cMVQ( z2^1DWa0qU<$lm*Y$=&C?cYfUVe!U;7wN&Si5>X*@X>3@R|fDR z|JVHEH|+i@1N;lO|G^$;z}Y;RdmbQqFnONj?|sm_Klec|=8Jyf`;eIm$`XbAc_3y~ zmf89LQ0w*kEC1P;0K?l|1UwKBf2IFQXZg3r{GYmue>JOG2ijYE;cBt#BK(*uhz?cQ z{}aA6?24d2iS;t0MZVz(B9V!<8$`1S-8;dN9?(QK+eAdIcFtn2)2{CZO~u6_cHc|9 zPOo03KB&v@OVt}I1Jq-?oloDn=XiBr+I_rv-Y?Ai>A|brm7#W;QoT{B)um25ohZnZ z`(x6jR3zVkWX`rYSweGc?tl?fde0_*J&ho5>I2`~GCoQ&<-W2_xTp;aOW|=;KRSGw z)~ht3P1HEeSryc9Ube7mi}(PgTn?}d2Rcm35Vc%4H8N$`D0V%UK70K}N}Dw{>gj^W zg4Jrx518Dm@r=^#n0uDE2oy$RJ27HGXG!mGS$RboJ(&|s70gN0*m5RXGm{Sv;YYlD zie_AWawszOi83l^GIe}(WhYB&Srue-^-IfBuG?4?C=O(b(YjUQwJ@os0~NRRxK0>wdL`soL!?{B)y)Q54GE7Oo=K zI|_1DC#pUjscNx|_QtfO1f>gx@_mk?`MWY?-ry9mmdflL+5n%Whn!H9}Ey z<+2CbiKocjdupT&5Z}*5K*)lXro){~-72-xxv+&z_4^=@8!2}8FUOSF<-IuF$JlBN zzQG}MD=iQ^Yr31;Vme9B%XWt_n8uR?gth(vrCk`un>z>jrX+LX+6q=j&~*qBql`ovjGiSeZL`h4guFp5hLmddrPf2O=#gj{n5~g zAG^_5qs*1Hqh&$ed!~eNa;A?M$Cn}WIzblPf#1x?f~F!7U*0FlvXaRIK5X&*Hw6Taq7vBJ`Bk7y9qABy)J6C{sRmJ!1ZnFAZzCg?F zE=SgA55w+b#4#tvz$kDRv`b`J^H6>0Bewe*VxhX(HxF z>~RTv69jxi+lr43{1Pd}5!8Xx)CH*RS@ax|Z!v_a7eYeB8tTEvV#>iO~T)z>$f zaB7K)`dFWu2U2jb5}5;;nHLd;`799yUvOtsmA1Kz4vK~!ilX9gtY9+V2dn4S)a0)9Hvb25K zdB;%@09wP5s%-XNB8khE8@DjH@|#I5f!%n7N6y<=%!HGsuk_HBbS~W3x~#Kuz+K^) zZ88ci;_sOcRiQiI;1p}c32Sv_tHdqmgY&8=_~A#anxpYF(H}VgZV|$YMAXiLrL?Em*7>bdPTmf;N5PngG z7Bn$K8~vW_w7%nxY1D|GoyXdaX~|Fdc}vw?3EYu8g|w`X2b?NcNu|Cpbua(AkdW%c zDZd?Z?Q`&<^HnDXEY#ZG<;?|by!9fXsQbEXC8I_LbR`n;DRxuW=L7W39@6QOZP0Ix zL54F%nT$l)D}%nfRHh=z)I(@>xxsN2L8K$d;fgf=pll4HXf>>Nb1q0_i6xJsy%e-R zDANv^^puG#UWP5`zY=x@MW+a(9>10ceHT_ZWAyIQWLn6C=Kn` zo@Lgz){bzlDuYz-({_=qVjV`qWa(Iis!XUeTPDM{yi@6>`K}U+MjWXoa{=D{oue9K z(7fqYm0s&O?w;o4=h81a%Ha4qQOhjtm*u`sE*Q#Ad}kRn8}Dx$R69e?bXDJ%-}mlU zq@$h%Osk)}_3M{y69o5Y3}GR6cSJIhc_Vc(rr(`GoMOP`ZutoJDR=5qdBp0Y!sYI! zg#?=4VdMiW`H9eZr)%LL<$qcW_p$nXs#u<2eQH-Yd*4Hh&N~+t9B6+3>Gcye@RL0( zN05K*sP0QJ6ZCR%}Pqgnp={f;_1Fr5E9 z5cD~;?E@)`%V0q*7gNC8&7#!(bG}ocM|i3)83TLcHL1Gf8~SG$nh8j?MysSMqh?7} z<{NosUGyl$G5#+SO;o--!%xC}iya|>lhE0)A5Dz2gvt#I`IH9K)P;@HLST7t2--4f zvV%p`vsv1)F{JyxK_nOB> zlMMUQmxPLwo8@J_%F>pKJMenmj1~4Dbpi!J%q*D##6-)32HuFSA5kMAa+W?Crx}uE z$y9O^jzQ39v@ITyik}{Aq@FuEuE;YZwdUAu*5&_b@hC?9=IwZy^K;0g+vw9h5lWxc zHd|U^%}$+OP19(YWntx&J91%m>Lrn56<$hlWie+s#>K@W)wPbSx1gf_vbUQ;9*E@n zLKs5{Y`Jl3aHUSn^^Hz34yRLbWrn~BO?8Bp@g=%dW>V9n*<=ZhyL(e*TfJfmV(Y}= z(2D8NeWLZM#tnl?L&_)q`(8&c@mWc}gu&_beDe^jfiltq(O8n6Jg@9-#PUpuoI)h- zyz_;PWP>>VADsYoJd1>jrj4&oG$-}6((A`9{>xbfk2c*pQ;GeFV;;EZF3y=YBA+d_ zzIMk3hH^~IFdLC4sgSq5d7Hc9+$&63@&2HI5K_B3k>ETdHFi!Jyfm|rsKB(oEt4y@ z8wK8ZM6c;sHr$fNYW>`JWHMkRd4G4T^5f5APvW95pG#jvD`m(P)pi=@Min{mkg2a_}dIp2pMp@zHZ4ME9AIU8`tI?qcpF zi+Q`_C>MrhR-`AkYZ^62)0o$$GB86mZ??AQmxrAgI_!;hnu@oF6SfD3yY?c^W4g*E zmrpS9r)78H_HtaBO5pb%MQa%K$B<(7y+efSvg!AuAX~MRcP!Ld_*JtfWK-+|x8S02 z(#JO98KYh0<6^&+++ULJb=@|ft{M>I%{O0vyD;_|=c389s#BQys&Sn%u6&n&;DjiW zqt1DV=OkjhgZJPp!nf7_jNQ$u&+@~ePUV{+^s!;mTvF0dxsx54hw(dgsuh`cg;OsM zjx=EycO@nDoa9a`3G4H6_X7ow8pPVUxntCEeuxxUoF@r`qVUE%j3FcJZ_Ec7K85Mx zT?f}ro{Zb!Ph$>q;Igjox5vcoj(J6qT3BsJ`1wLx1?rCw>OH70kI-4=FiN_od;NTrWm z7ssfB|LsgE7ycXItJNo(TWd-`Hy!Hf4Bf?v*dsZc#`I|6vrIge)cpxFYR~#RR2KPN zI1S~YXQ_sj@tUKLLHJxezKb@^C25+6T)cNtJ7Uqxs~G+IMJFb%XZMy3S+qJ_8Cer@ zrsLS9ZR6X8wma7|E{50>JC8Nj)?xx3<{f^?^?gMfh@7!xB+-~H&)^~r#^RbC%Psf`LwjoM=RYyFXe4|f^$Q?1ysaszQo~Uto z=D`r9Yj18D+Y1%2PDb8Q!oVLLQYEv^fw(_Xw=^)%o=C4N@xUG4tjUN|R>DQg#fM3+FtxT$!&-u{wdjF6PaQU$>`tkvs>1DX zdDn8wR1tdo+%e+sG+4JkSDbp@F*ps1*TAo{XBBt$Ha^(cp~{d7Tg3aux7o1XbZs(a zRUdBfSXaMoXOF6W=Vsn4*PQO!oMICopSg8#ey-q_errg^nOk{sZqr9$H>k8W*7O1oY&C9mZkQKi-nyz^gZbLjUVqXGVS5{%nY;3eRF6*4=@P>7;wJcR^`fUoh9SuX!FIDTY|zu6F-*Kt8Xj;6@=eX_}vKF z-+#2q<0y>Duh;tVSkv5+HgvP%w*O$0tM93+8&ef}C*(-lQHtb#(q3+;z9d41r?Nr( z+3fP%c0Dfbu}=}x(sJIn7G{Bc*OsnFh?DKv*RC~lGUj2bJDc8_sX||Vtue=&Bj!ui z_jPCV+P1IE8>PGlA2g;>Ve-$7nmbKdN5H3%CbKjZ$=!@i{@OR*5_Jsxr!_^eDH1d zPBTm=pgjX@!7(K-k9NF?C+o6*Ayv_nKYO}LXKt0Gw253mKtI(>PkXnsIabLkd#O_g zZHzO z4P!)xmdLm!pLP`=PVG)co?OC&)0C*|2&<%J&=d+U{Uf_&_fGelcH{Dwq;MP#9cH8C^9+e)dSZQ_r_RZ?~mhQ{c_9>SGOo#pZjn2#QA__gxEx93Uyz`rn zKBkyQB5y?ff+b#{kg$C6dHH6lQOKFBxG$j-_Z6$d;C8s!ofkmP73h(U;|TUNS8i#` zLY_PL?$y=1e%MS~$)mksG1C7eT>qdIfCaM-wa(xGeI^{h6MzNViR}^5D-$4(?16LU z6rc`Li|&DO76Dc}ylHJU%u{aG*#wq{&?yH{_Ls-FWdmG+ zKGYFfE8a4r0|*zD15B#~K+ix1pxc`Uj}H|KgAW-Cix1r`41jP@0-!r+0r&yF0q)>P zFuX9G5&+tOTGU%BKy>dCh&kk2u(y~V5L}dJRA=eEUICY2`taU4y*s^VU|9Z9VDe!4 zjA!T$QUI2-#@+{i`?81^Jjia?+j200H@631K)$^f2w#db-vE24ZZUv%01}Kh@@;(Y zG#EeKSwlb`=@|;35R4Gqx2AU*+_$@z5u{rdfCbhg30Mozr#qAJ*QYrf_t$4QqxILP zKCATCr$4jy*QY%@^auW1f?j*%TR8wH+#>~m6aEns&;s|!0ce4LLcV_932m&#)k# zNzT54ZGwB(_TGSQGM=UR_t2fG`x7GHR`%+n-3kF};UC`s!XSLHZ?nMs;BVK!{Ge|; z!2FPIAHW2_9?NL0QMpU5CDG>1N4Bs$O3x6Uqk?YU@tNNKkyd`z>B9Etvm)TWEJE!Sd^zAJ9rCB z^u1ujyQw-kKCL1l)jYKHJT%-@0PumZ&qq<8j|zlT|2+Od zW}t{fH4iR54-R+bk9y@V%=b~0@1p_|)jy9_7^(lc{r6v-^#Fge3f8F#ueRkEW43_3U4kizNigpWS(DwrOSPSt&3w*`L+TIuGGa!_- z|Nq1PtAJSdz2H99LcUm^^18GJ(V93jV1Cee6{3m4Z zHlLtA#Ov+QuUoj+ThrHDckrki5CRa)Q&8^L?_C%_0e{-z5Bw?OuWzortE3LnW4)5Q z!7?#NA)Yq54vOR!4!*o`@oCT7v*YV^QaBY_OF4Q1I;QLJvWuWz(2J>zC-NH+&-6Fq zF0p%MZ;jj3_ciq@YmML4P-?QwF#%J4;Q`-@`OzHNVs>zPll<4%om0C#&iNT0(}=r zC7Y$ukB!d=Y0u-sjoTiU9CQM%DSz4WF5C&H!q)W**^wILv@VA+PAM$PGLB<5-}^W z!-cwluJ}DMv&JZ^2?i_PRk_n4I!5L~T_s~TshwGdEB>L;@$3`+;jblL&|+2#z4i!? z>`>1c2w=lR3dYFkpNTALghxl;+B3?GcZ`pY6G#{iCy3KVc^cF04AbcuV*({AL(*^- zve?W%<2INWHzadT)=#HjEu>$ua~$5Bn7tERLR}T&SiXFDJ#qd0IPK4aHc@B}RuJH6 zt0nOIceVlWpv~Fd*xJ;EQN+gH`S(mO(|Cbb(UGCe-NcSZMYJJtc=*bqS1#Ij=*j+x z;P4%?EcjSAZhLOdeYIv=&}SkMNg^5o8Lhou4y0~G^}g%h16zb3-Y zdRz!{WmVf!N&8ZJGjn=d0|`UXr#$=b=2hF^st%Q^JC);BocA``;0S?iq4=3~*Hfr+ zBS{C+OIkR#&M6@kpV~Cq@s5=TRyj;-gXO9xwJIJmwAJCe8Kc7ut+Mw!GHqK|-xBMb zEZKRSeBF)-T73swsJk`iJp?a=_0U#Ki(x;h$DWZcXz^L}BBe~$qL7pZ6JuNs#8CI= za~(gFpUn(Ye*l&w7y5kv>@O{V-?94>RnkyZlvghHa^UrE`ptjprT!`65C>|y{HK`X ze{dwLnD)5)<+U!QrC`tnxjHRHBXxB2W2$~~jecULMrviAYIbd2VqT?wLRMj1O=f}+ zNRgfZB{QS$rT{f9I}R0Dh;A*g!jT4#6r2u0jJ$Q293p=Rc|aKmlK~S8`c9$CMJK zaaKna-ic&If00m<^6ID3w0FUt%sCWfqG>EbT{@pZ`^xXp$ zsrVYbt!E8}H=D~tf*W699*N<)wqg4!LfgdJy4Z=mQwoSsM@ zq5*;dnhtSvZox6p}+ z#oIb>mh)d#(Yf@hYM46|9qvGT_}-YA`8_^f6Z9(M&)0>Au^%nXpp@}1iHBimNHjtcgl}qs1g(zq0=F)^*$AZyerhy?MC~;1T_nPA^_rqse zth}*uIg?K(8NKz_<`m?viw8ly*BuiOe2U=5?1q%X%S1uVp}p5{0Bg@OUe6iH6@>46 za3Gqq;WAhWE<1+m*zYE)EXip)6*=}g-^mgE5a;yx+=P!MZMi|~nAG#L`5JQIv&xU3 zKd9bL#(W(J-1<}qUl#rh6?Q0?puxi;8)i94fhw8950SAknlE z!@n`S{6smRTzzBvP5ejGl!X0LTj>t|yeOm$*uzVkazN8zv-vA$qiogg$Y%L!CcvkE{5{$^Hk8ZxtU@gE453X)PvL+|#X@nr~}7s}x(KuIe4) z`iE^}W#Md_sbICyo9mP@-EiJc46i@@BIx;fzRmmp`al)rMQ-Ft?jU=j(Z3i2)%Acqn4z>0Taj9uOr(kX8RL3(mHljB)=X70p+wV-!c9ZecA#wuGd1^ z=KpfI{XbLle@Fj!ksa`E|8VH8*0c>0VMs`FqV(?GOoG%HSxk;B!9L1MAVaspHU$4H5`EKI{?v1SBE^BCPX(;hyTVXUB(`;2|-sGPTc5710xcEh$nA z%KI@0RjW#vO-ba|mAmz`i&tr|hMAhmoli<0p441Op9KXwl$^#@%l35D)y590@g*7HNWBJU3Te8q$cGVS{*tpB%n+^ryg*?j)-6dU%o68 zW!qgc6C;Z=yD`NIYH!A&R2ei=}!R5SJq<|fdIae?frMP4Jwwl zrb@4w>3>Vc>&o-V14$aQ_xij72^BIdgxi_xTX5%E;6AYDx4^8mZbwvR%=j&= zw_TB!c8s0S8QyZ%ZZ$Q0+a*Cj!#HsWh%IPa#4jT}s|Ch91kzZ;se~9LU#Q$&6oG1#= zEc6ltnAKLEuU}MHO!A#fdt3L3yD3+ z${!{fweT3bSXNQqPN8n>vs$a!Jh?;gIHMf}mR6YcKT)&nxEkzBq^wK!1GZsDe1vZV z!?k`Wd4I!TEV#Nw^4UcN%SWli=@FtAhF4c4S0r~VfyP>@$a1zCe z`BEts45-AfTs%T|=r3UUg4JIxR_yEPyz29rh=D}lC9GYg9rAe_8Bgbj zT1dD;)=+{SNBX}~6||Zgt{$0BBt2lh)$p*`N(j*mJ&SfJ^6f>Aj;Ur1PPCI_YAh}y zRT~?MR$%lf5zL)R&e{ucttnbj&mrz2<_pbFuDpPyzjb4-J7|MF*agxNjGLm$Tsq5` zu}&K7h3IXGMRKFz$=F`l=2AIO=1E$U=kS8wFOJ2g0?V}cq*lxcMiz8rmh$1u4{3O% zYH3=?k~i{u)y5uGj;frx>Qv}3U}PbGoKLf4kyOHdZJdM$%1PVa5hElFc!bt0FK3A# z^-Fu~1)6>5<9C(Ox;$EBVN~5E4#D9bo8lRg@y*mMzC|1`Ici0Zk#Q#sm~MMF=dnCa zqe&vyjM`q64a$mmvGzrqqQ%{y zEF%=eoG~?q89)H1%o)r?^*#I<%DxzE_;Zl@zDqIbi?$Q*BtgT0fS#!*nuz9!;z^mh zVUJy`u|>RH2@IHv=88*FQy`9^g>9j3ARXx%TQ|~m!ZXB-oOSE=kq~rsGm;>s95`{i z(TrH`2~9WeVFCn2E&j4YK5r0P!s-Uw$o27u>KwVZ;_s zzt^WP9XsbfY^SI!8u?!=FLp>!u!(4b8WGhkTpw1vwSKxFW5I|i7wEDs%OhxDn}D*m z3zX>=Y?>mG&W}(Tx%x0gv!BI~>NTNZ@MwOOPw*JlD_^Z_Rcl(J&Yh(kDEn~vi(l>c zzVc@;0tz3wypk<`2F@@4y*T)z7yT7;{+?kf>DtdRp?7VxlO6M88{-|`;uDgZhIgKY z21D2;u!yg*TMw=6a;Q0`tmf>99_sG|5cb9i>u{FQ7ezxK-oM@4@j9vdHM<1a=%odg z2|3sdz=LVC_vqH@-A)dh7C!F<_D-$Dm&`|%VS5Cq=^$*NE>}sTSkt(qiNiYgl7G6P zJg=WSo91zartuhhEL*5?e=?(V0FVbbz0I4IgF%OW56z&X!_7V=Fuu#T)*z zLt?T-hv1c~|DYhNLZ_-0eKB?{YQb-$`}R_AaO1TS5}zH7>+vvm?ql(8IyIlrHdJ$! z4CeZEs9)&w9r@$s`hsfJ4G%diH>`3=_zV=@;W z-2jU;gurr9C@C@Sm z1k^+7u@J7N4#NBJzSo&7$EpyYR!GrJ7KS?;ttQBc@}r8kc?x-6Yo;JjCU8)+m!FCiS1rbo*p*ty|6g`(`I_T6rajY2{p+TFAYg>=KJi;-HA}`V% zPLe)UP%4hX;>%oKkY4#kq3n^*(Y%A)L*I1#k@5UT$~JTWnCFdi8I@PR76QNH`X}N^ z_mG&uz!^d%@cQ=*;kOiPRXfYq)%^QEK>r`?QhffEI6l)k(fC-PllQngm^kss`*#L; z%zu?ZZu0{N2SSkhr!(s1m#e3wdZi>8Y@9&_S1(8rvSn->Y@Bre^bAl4Y#a@LGBj}7 zUt1Nwx8l$CIp$67|Bv$Fg-q4%zw)1rX}cK^It6wO zCg}evwEkzCPTkZ<`PYWsU!k=+`4@A(|Fj@us#A|jpEfOtw%{Usq!tlqpp+C!QFsKe zt$V3!UCzqH1m>M4f5t5U=}ZD=daA}>MoidynUB@H+c{@EE^o6NycewMryysivjJaZe%s16dsxnNiLv1O@6upN z7!0^21!^6pZ>8J}VtNo&%%x0dFHo=jD1d^y+6qizwq(LFFyt&DawrA}k5vLX3q*3eGc zDiOjx9GGZZd7!MDPJkI&_=dQZ=#%S$=#EY@nP*A}GCC5-IICx}fTIbKvS^`G7;jCc<}jL$V-_cKSa}a*&Ul`J(BmZHIWUJ( zkcC?swh-S&Y>LYL3|&V>DnrDeYVIw-Nk6E9Jxz1l<8)cXy-@s|H$43j4G(VO(K83` zM^!VI9>Nn-vPc+S-Z|6fGcyy%ZZub7ov+2I&N{017DW!v49k60w3Xfaj`?MUx;{h( zqCTqFiA(a@S&Vdy`=vhLX1Kfgr`WzNDerZEIzpU@gAfaf4@L1|-RzOCT#Ht_Q-6w>lGvFspJ3<`vvVrXX zb`*>ZX6hmS$I=l9Lcs(HbMWS;U=#@PX%J&aqOjg8*4`K{rr6#=v0mB40Br|6%D#S> zF`n?Rd>|ymNRY5MY)m+yZOR|vL1Aye&7@h87|fWGENvhyEJf?f_7Enl-a#Xg5>n?F ze#{zaYMly}*msHJS>`|Z=(XDCMm&|E=K(cMs;jmn5=ern*f|s9efMko>-V1WXCE3` zkc3+T4l!%M!n%JGSGas|Ff}oBax(nj%qV5&!ptG`djD590t!&P&QM0;*4Ru<6_!6L zFpvf*7F%es!JdN&ug1p*(%5C(_b08j=aeqi*qEoqHBlDvoq^segd0;T4cc-cb>qK0 zzT_G6Z2IYVgZuB#SPK#4vKdyw%EJcNwgSGf2Y9X%qQY#9!jjIsb?DpJk3vy~c3~SC zT@{Qy@Rr1Axn#jk7pZ~$38gfNI`I9Rf`JplakzY5_H%-gaKPi_~g*TJLa826uZ)q@FF{SZW+ym1* zM11w-j)Yr_A{m$h9Hs^*@V5oyF!T$yLX9ZYNl=f-Dh9U$4|g_@&dIM4H>OLK>H2sk z9dzwi1xd1giTFvpjgGCZ7E7G)~nh zoY~Fn+kCE$;l92r7;(V>vp`nQ$g^?9pB-m zR&WXI2H)YuuQv$wyP6;Y=o=)N!Z%@jG<9+z3vd%GDB_&D$8mnYq>_Gjia*`u&OvbO z7ZDS1P5AGPvfth1wVYec($xKLXHn68-7xK%OFa%Ff`b%O)DpCiYnu>KP-Y`XGM8`uwweM;+VERC$>$rT%9`cgG*@2zGeWum92IywX1~ORCUy!)Z4zjp=O{(NTd{A((Q_I4e@l$6M_TRH^F`fM?$5! zX2hgcMwq3LDN13c;wrr$ay5LfV0w+SzSRD<1y}-BR^&$C(uA{Hku37Qg4PeaJZnj^ ze8xaJWD0-cZI+AHn`*@kPsOFqGHboF<;?N{aI0&7ChK*BX6coRNp5<5hnVTd?z24T z4c1Sar!K+z)Z%!9>!sb5rt)k>iCiOmOIK`5Uz{CN8~g~)Pb@aAkv@&S+vh*c@3&kv zYgMGz&$WiS?4I%2oNU`>abGAwE{oK-V=nMHWZ1^w7xh8KH)%v8sGaL`1eDOOqxp<| z{CR4f;uO%H3_tiSGc18#%%zdHz2_k7-Nn7H%zV)u31v-irTJrEoCw%3HeIaU$VcoC z;t{-qXN-f77rpP{bqGvMMMJroF9?=7*9VCrDvg6QCAYZW!VtZ|@rMY)!)E3J<)oJj z^%&o_O()52PAAVL=NIt~y`@_x?zDD9JVDuL;X*>9<0sRBVK!%$=au(PxFtC!-6eLUG%J6qup2Q`;U(=x9o%K&Q&h}{1Sp-JCX<*d*cS+^%ZVZfiTz>>T zd7vL-4{utwXj8+$DV0Yu7)>q`d7TRuFy~WHSmUx8c%HM_mYPcP%uP%Ldeh01;opLI zQw{Jm;Ne0#UNiaSK22VBvNm|#Jpc(&H~J27lMNf-YAa^QkbMDxS#c0!j+HV*w`9=K zy-H#5&1tfp?|n+Um}$ldR!VmmRM)5AnVG_L&@9}FaLGewcch$(OpWA9Z3I&aO1Y&% zR#ut@Zm^k+ps@O}>nF zL~B3g|JW}CTd^D}rz3`KKn!hwXax*&+h){0=?m>k2>4sL zR9kx-`8R0?ghJ+W0S;dL%^_#fK}{jps<4En39buzf3Q|18>dDne0A{h`|xW`@ViU= z=`3ky1S4xeXSoDA%fHVpe|Hvf8+$_+4z}O?B_(Ox4viT-G%o3LaOf8qxcmU667&jK zmG@YxoGOxCWl9w=5hW%AV^Z1kibfL6rNwbWa1mmJKrR`+>*!=BMed9cMsxm`7klmJ ztB3tJAV>Xbuos^+gO|iSM0z*(UmfPcuv)B_ClN@nU)KlufF8H{K4zQHI?^UDaBV^lbeex3 zEB>v^_?M=jxQ(It-=n0`sXUOafY1JLu?Bs3Of-WkkZMiv2ZVqv@q3n0NmE!z)NSZX z4(sDDO(hQ~FLXE&*fF8g&x*qjKa2z;W+-m1yS+}@_PaNL1moV&pJK1j$>_>Q3yDZ+ z3(Jha#`~+NBrB73P{JwUSo&*eWTXzCuI<{W&|(jr9~Zg&Xt#LtU0aX0A~TFV%5ZDpO?V>s$<;B# zfKj&tT4y6hXC2O$lEXExC%HL9pl)^{+B*`fPE(Iu&Nc7eH*pWKhF8K%?qeZ%3WsJh z+Z!lIx_w*)Dc&1(Vkd;sU-TS(T3Y&;e8fgPx56vDPIWTrP1|Cpy`JLJw?8B((9qkf zbh_m?f4kvHu`ae#uwQ_?Hyqz^3mKgl`dRUDj)@$Ts4_p;9Km@>!79BkGxQ;SE`GQu zG@6N<0*8X3(pa*wv$wQl#d|C8LcGDY#dEL6&To9@tKD72rej7^r)B|P_DAwm4)b6z ze{Zv0*DXqCBeDQNxE7{2p=;>$@mO)(5D&r2@3skn<%c31ID0Pr(?p#8wWOFi740gI z(Sz^E0^)T0H_0oX#0@cT3V3zjX!a=xXX^!yUm(aSQU$$C2|ZdYAT>Pje3vtFTV%D^*fN~?kc)Y+)fLX|!d#E9AiJOI zt8(m#MTDGD;kPIc^t+LsUjyFnPWPufLJ!)>4FdNxh=FnJ-_!j6?T!vMhQ_9UDutTH zbwmOsgF|0-$j{-lVXsM6xnjPmabS|bKpl-R1;g&VPk#^gV1>yKWKGU(9op8)J{<95 zxEZ;EGKg`E7K%2EM#-m*>VHK37UjcWOsAsM*D@u2713==e{%CD+zi*8si6I;QQ zcsN!f#M5C#7JN`wFQh*&m3D74KdgmiG9Y8-waH5#5`kt&~ zWzkTM3ahshCd$gVQm0wRtPgP?GOHRT+zmy+a5fY{Ye=0k1<|Z{{9M?|Jj?e zbAv*3gOYQDVi1R#+78T~NQ|G4L=}hn@J3!X@6VmJe>iI6!K}rhY5Of&n_djv&i0kdoc(v|2CjvNz0#t3W)>zECQxS9nYw7YXaqWhDk4m9yw^M-=wF@i z_ZIxwwwDZrpj}{_i%+AHqNwVYBmoXMLZ zSAASvzC|!|^`&t&+hn#e_WE$44l`nh=k<;<`mXPCX`v_Cmx^M?x|9xeKl2k3=7-0c zFE7e9pkJhk5u!JTTdWi%R^9b8Kg4Fw3dQchj}#?zToa8I|d*9(((Qs znLja;()Du>1>)5KJU;pNg7Y7LkTV2k3B1yn%NjcT_? zbqqR+#s%ofz z221{Y;MZ@s3>2;v+*{+GQpNN7B39m>F}H;Bp3zCrqIkF!(x;eP?iz3627mb>v*~#q zrY3PcYo_27jOD453z^ zjv2!4CYs&j8&tv))Dlz`Wwc1E9}~75ewV!R0Q(N`Bg==ix`so(@^}u$U*CA>fs}B-^uB^#jLL7?bn@Xbx1rC~o3{EG!xtuQo_|(hjZ5oyz0{ZJPlMy#Kvz|49f`0q#ZpW!vI}zw$oJt!Fdu;gJjd3k~%gg2CW*>?Io^aMINI+R*SCuy=A*PW7Ail~~eRdm0azd&-{KqNNu z@mtnJ=yDS5@lrdpVTnS=zIWjM(6qTjXZt}xl92PWLR=rV2$=ig8$81h&>+;DH=fVZ z8A3Q5QmSxbEzp8>^ks>q;&rI=X-+XA>(@$l=8)FzVpVPUh4$9s>wg8|-{Jq$FwT1R z$cRA0i~z6yJ_rlBxcr?C=L%#v1oC8t#66@vgU~BLEiWfRGTOW+Fc4IY3QrE0lx0Y$ z9IU}_>8)fw1K~yARule6V|vzfI@@-`bMZ=t=5HMhjt|WR>p+9NyK7!S7T}02n`TvL zlK-B;__Xn}J;W5@((qv-s_uc95Snq7x}LT&tj_!D@nXs*>b?5<3w~b*H?gUnbAX`w zd8E=)6*Zbg=xmZ;nq>sdV)UU}&ve5l#8}h-;*NdB&~;lOavVm7&p7T08T5PBnxlm9 z&JT6E9myvyeU)Blr(YM`cuKztw7J4WKch}y$w)u-JZDUnkrK@S=5~>6TOhP7oR_w0 z2HZhDEsE8aT;1G4ag|wyajh=2BDQfb-9x?3HhxF&Pi(oHZE$LUxFP}r8rgq22$;G7 z+1Q;Ke`ApJN&H0w9lA-*Mqx=TcxNXAzlY3l6{0OKmnp0`FJAYV7^@LBsw1JH*=;G| z)*AmF{JxOJEGO~{cLm+4$J@yfo`&bU!)IuJ)@%>13x}gEK9NF#p9PiAX|?-HT~S0w zOrPQnn{sH3+v>q{cMF6yqw_IEmlS6NPDK&vn5&vI2Y>dA@gLPBBY+iKb6kCxA2mP zU{}wu=EliXc{rWPa`_RJp|E&MVE!#3xmm6x$NFj1f}cC;Ky%z9tbJ{~IZJciaI?)wz+f`4VIg{&4)g;JgfJlkEYQ#8tgUzV{+S>|w)ws8kt zBV~W72k)dgI^4W|gZR}ix+P@89qHBnzgziF`{!(^Ab$ngoge4}|2|=S9nk)^zoenF z#lN^jU0*4^1QC1~$n*C^5a^hg(n7SCxrrf!Rp-@W40@W?JQbb7PHKdJdGo#?0&rW6 z-~~$1YZnchUa38P{5>G+TXaK?kxA&K!Fqj;O7!|>I9o;zNh$5K6>R0{dolkODqGsw~l`P-oWlSg#s(sAdW8e7Dru_gZkP$ib zT{CQ9Kw9Uv&JfRDTfHC9v-o8pa?MeJ=OOsAhllbq5erQB)YP5}Hee=!E1u8=s3eP6 zEK?*?RN`+S(UHEZ*Ae&pD}DTTc>V+~{_;2z1_)XY@cQ>*_;0`|1JiU3|6pKs1u9ko ziO@p*(l`PzrK28QGepHVER)vZvOBAym)=df=I=yP3~SVO zHkTlC|G^SKOqtLkN6zM0 z1Tl4oAv?Fc;wmJ!XnM3BcQi)-UGINU_Lfm~waM0KAh^3jaCe7b0fIXOcXxLQzHxVl zAi>=&xVyU(+$|)?-Q?}lCv^Ae_qz<%PsU))S*xC^`IMMgvX$R!iTCNKyoJ(a#ZP2U zQo_f)w5jUYcUe+2&BG>_nISV1%KG3rwX^#(6k@=1MV8^)ZC-rHji z?Ebfr_;7#ah=0QP8ep>gRr#+#aI1il1;c;yOd`NN3l6{ClaijjiP1lIqYWy&WJ7N$ zHI#%qy+F7cl~TeuX8aTJN(&(=Pv3?!DT$R5o zoJ5VBpJkXa0<$C<_HY6$G%cgRIRJKpExt`7RrletyHx|0cbqdMB^TeCjI`9m_qYaT z2MZMR8j+dj*88x7#~d!G+|&5JEnFX-mgQP?V}oDCc(6)EBB zs{J^PdrUU_t~=#qnsCZrbzS0Fk@hXJ{Iw=SGj zFWJNi&`qeeyv``a&?hBz^3$OniFHqFyg6>G5PiyBOgSc8tcY?jFXtT7LZ+AJ=(P zEeXX?7GKIZwEFip1&}wK7pYYU zg{SH7yDo$&(zTWC+}#?yAPg`fN2XYRsD=1^*Us#v$P`pWP!er*$*odC1$fWy3XNrZ zp^~HpL&(^gZ;;7g&kb-8hRam*%eXWRwJ}?Y3`zr4vHPOc{4Ol>=d9&x(uR|!56mkw zWopgFg_`STrI)b{@%w{0$*?=vUfA$6B#(JKgHCACA7V-|s`EesuV7k!_)1~i85-#c zw{uoYx42Y(SUPp3kf3~9RUaZ6Unbc6!TxxW*edNBF5^poOK`lGSTTwjKbsjtNWA3f zfsa^Fk@)P#ynxKeV8`^-+ALvp$$&fbcm<{nOvFN=nWkKx2k{g9HGoUTL zM(f!*#x)7+R&ninR9}Kh#3~oyL2g0PuD?=)??%+KZ#7y}h@(utWUf^u1S^|qLORPHAm>)5!j<8LG#?NvoW#$Xoje`s|PwKZqYi&Ze}gC0bHw}nI) z0q9x@tEEY0$CKVv;kQaut%f)1i>zovEcbs1O<-QogYd}cTr;f9^)8KOY!>$?v2X2d z*`aXDqJ7-_UFrX)4ZOAvm?*FaW?;701UzE?v()yF;78iV=~ZW4M7)LKG*E?H&!5Pf z5bUKXbnTQp3UuvUzDBM6NJD3oTC4w!F-Ob7oL;KAs9WdirJ`-uHC8p4oZFB*&MULV z<95f8f`Z>0@2zV8d+2deo}_a>y>jiTJkXIRhU5dSM_k-8Rw!zwAT$(d%HA=>}&AHVaJK+T=<)|8{n!D9A(ylRy z^!W~QSS}+sGwxeqB_2h-mjj#cPh`g98WMGycS2~QiIkYs%o3tZgJ|g0Mk7bwOkIAU zT&R{@y;Awi)*jqp6wE$idn{{ho0A2>&P#;%UR6wbEY1u#<)yXafF49BNA96ypxuDV zQz|VgzW5o+M4?lSzlr6$vMO1A=>t{Kl3O=>a2qn>9P=^eR#x6}#7({%;|{NU@x4kC z{f*~G^!L|e#oJB1?MBJzdYhJKY~DJ6S#R>t#1wuSX4*i#-DmWPoTC(xGu)fSOVpc; zvl$aAERP^m$qYLRgD@WirG4I*0{ZUw*yvKGc0N2nqoKP7LR z1#@BOTH@l{{~GJ4 zm>L;b{`(=P@OvHR)7)hN%q5CvHY6fpNSmur8x}8HEL7)}AV+>4Vhvh2|8OqB1IQEQ zc5OBUe1ZGoy|MG{FJt4qo0EI+4rm00g&|^qx$R8sf{Z>zh!&vKO4@UCEi#}ITOEEi zuHZW?pF{0M&otclWRFzilW+@MIDs+jqV+AdK4vBnmVNVX=ur_1QguHh`$w2&jvePL zNt$!a&Sd^-a?&bwB3k1313NRAZ==!Gn0|0Ek_LseNBk>ZGZP^Lb~yP1w_M`+Er|#A z-qazFhA2kweoXe!DRGWWlFBKtl2u($3$X!a5uQs2s(n2Hc^ z3-J+7TArq=n=q1_0lL?J{q!7!Hz<+^)Bv77&fnzkrk;E|R+We8PYcNp1EWLT(iNMq zu85H){>Uz^jR-?T=%A!qMo~)TN-Fz-JUEbpY>0+LvXFT^Ak>La73~q-(Q6LafN5=2-4LJ8*XN)ra|=KI~$ zlP+3mC|*jjdw|=QuR)7j5#zRnNsU`Ejy*2qE;4^?CE>Gp9hYorulPsy%()}j^at(3 zLG)O2ydBw+j*YzvmoRiXHSQMms$ zR-pCR*X+Ld5Rc#J@gVVV7ao6KpZp2zYsh~UgTzq-;r{V=kpJ(e^cUn_(ZeqiE#Mg> z&yUy@v%%WYfa6pXSp&WR3fX@j0B7rGH56|4l@z#p`dvp5b0#}ed_eNxNc!{phLo$n z22@MKieg04r9;hRSexuLt|?l~SRiW23e{$b%=(2Rlvu9@d4iS6NmsWEPBSQCEFQv2B* z@uN)4edAby``}^)=(4x7s4Ue{7h=V&6N>cy93u8?)_Sm@%ZDLN2zw&%G38%UH!B4* z_{+m`z9Kl5K?e^t46~=;9?F zNM@#(Sg5YFAd}hVDp%Po5r370kNcP2ZvIY;|AhH90aMj^E6>1KT@84!{`=kDA0gMj zxv_kC;C>qcq!oB^sgYry9z=l{Ia~M)abXzBXfha*P{*J)?y*p>eb0;jd|>|^WzSNg zfE@@5l}vL=6ZYt-muLAp$OeuK59cM}`34qIw3)k#{3fv$H}wGVNS{184OL>b9I>-9 zCUtoDr>>Y%`7Kti71k5;-0Qu5SM5{w6T@TNC97#3oHq9S%mb_cEg1EP4 z6s)NaEe{E2chejPExJk4qn?A|DPY0)*=f=y+O#h}`vJUTm1A0pHHbAIGAG-O_Qs{6 z7_iBtGOW1YZ7E|B6JGx~KEFf!3FU>wh{Js7JHN4N!=r!f;`lB1tdnou?Fqp3@H>+I z6TH{3`mv0#p#p8X8~FTJy+PW@!Qo%@2D#t3rVn>RfV#bbM{^X*+r;6fCdn2cM2gvG zxag}kTL0)`BKgDy!{-wvXqg@y1lns>$MU|$;n&l}PlydrNFo4{2+=KgSHMHvrNqV$ zOHUh1V&0r2j2)9(!6k(rVw(|+0tNiq(hwd~sWGp7Ar@QZP5u+{Cxo4P0O znnD_iWWW&IWDBUt9P&|{1l=k%idsp1WmfVIybp*iKG89*1@9e!_nHrKFT!ahTyd%0 zE~O+-jqS6KF4|rTj1>h~Q%^m4HmPk~Hz-=dh)XUFW_5#hpJkUQLZv^@Sg`_ShcKNq z+11l??}=Ud4f+in&~Pg~kBA$baMbtL$qT(}@4%Aygy`V-e#eD>BKjI@G;sSy6Clp9 zz~lJ8iegeWdjBEi1n$XuQ66B$?iG+gI-}Ac1A4SuKLJnUEeUqAxzc?<`OqtbPYUsKH8d zH&y-oz6UR8%5kR$%>j9TqBYnL9~0IH9|4PbZweXCXc@L=)RGykcsz)Y>61oeBmc%w z*dJ{z#Qhr4A(8We!!C>!)6PTwJE5&HES!?tyXiZOauoCQ2L+Ri7|Hg%CXjiS zk6rWPEt1)I()CzS^Oz)UKN19G$7aMd-6wI)bqX9=zdOiG--OWXVS2C@=b;)G3O7h+ zL6*C{$BQHB?i|Peys{HnbIA&ru79MOpB{qMq`Bua!nQJofU~GAp$b*QLUV|}IUxO5 zHBnT3N}^!KBbO+`x3v|Av&pTOT~#QIOhzbjv_M$Lyou5au1Hji{Ywej>anv(yz$27 zt9tmM&CALACsD5{gvzB=z65%q6d;ZNHSzoHgh$xg;2VQ9ic0$##Eol#&h)-|4mF#eD6!HlGDQ+xhqXvBJHfL{686)jb zwpshI^{%OJnz!D# zTRxvZiDEgr1P_WEM(yTnzbqHt&LlMrrI6v}7|moz zdpv1a{N6uqvkqdZtI~am1gIqbtjxBLGsjwL;aa#E1AvE5Q{x%i635Vh6RMxRZK|=+ zxQT+3H0r)dZ5|($k>s~&aqqS|Xzj-TR`xD54B6PBLY>QCf87N)J;ziP!5hEUeC0ix z1v?d4cUjtP%7NMzUfAOkWQlaJV^<7rty?e`TO0XZ30x}vTWojh2)!?9&-Yu^LE8it z$G204H&i+H6w1>~j~%&(XYN*2^OyPq;6WT#+IQO=tT^yH9qvE0E@NxB$g+c-F#K@xe>ZgJxc zMN}=ZoE_Pfj*=_PMAxEil{@2`mE&Z%w@yqUpuoWb0_g8+r6W?cqWa=2LV|EM(W>?E zG&PH@_o?6Y@f`AUFUb3=$CKd{UAK;~l20aDr^zVtmuJMi1KfL`4WChrisV}OV%-k) zW!Y1-n{bUDK0mnh^Q;kPX>mXtIQW2?((MZ|3(o7IO^PDhhQfUm_*~VK*#3pVpTTiR zSIKlU<7hw+k1Uk@i&S_FfDwlxViThGi+i4w0_#V+ch(AyG!gOlX{_RTR7O*^;WG?( ztkQYdMpIHa;#+2kVh%%j%gj?gE7LqN81dpRQ(`ExM#P`u#cP~ILKTPc^5^5h*P1DgIwC`Z zy!c25aw*q@5u_K_v0@eR;zrn140nb|2VyBo;w0icz^*wvv&ZW{~Xo4R9-qT2+K+<*;p7^|L<4;Cpl?ZP$r}d&{NRQzA(_4ydAyTt#-^z zrf6oiukx zkvl;o25I}1PZqbiuw%^JFKK~K#XR;MRK{Shj#Q~cYRsO(CieXq#=aRZnjA|&ijNFG zP7h0+f_-^uBD9+U+j3jk(m=rvzs$CuGinM2rjrLYn1}>!oCyWbjRqjT{Uc@3Z|&8` zxlGBe55Bru!A!N|tnxLQ)K(21w7P!iSUj^+ND^0PU`$GD0#)aK6p6!@Q9FEk97sZj zLXz85+@*tL(}p@`goWwD0I2Nt)@d!!*u6uL;Cbj%&T&vqJA=XV`VIM?z`lmO z4sUw?JJ5wE0wMp;5s#^(l_i6ilC+eNjisg0AFIqGqNRb`xRC;NdXt%$o_sK)1qc@x zU~6!Zh0#bz{Bj}pN6-uqAKzM0?9XcMydj`oNJ;4XsHwzDdFWM9STVbY(g7w4{Sz7i z1rKG3x{?S^WZLe#CmHB)Ao5KbYCg->s;OP>VkJCPjz#{a{Swxgs2Uxnf~grz3}l66 z!jpe=$<+W`JY24(Iq5-?vNc&pcJMi#nF#jp5jBE2CbW4HEs)aV>j6 z$4h4T7ek9RPNaH2k}h$Gzuz%$x?Tx(9n_<~2NR^3lX-9|!RHUxA~c5_boXm3aGA7l zeEwak@+U~I;Y-4JHueE}ZF*ok8smS|&i@JDOa0OZdn3J%mPY?ONm6f}*jypkR zY>?keR^@(yRQwv^NAo0s%Qs$1%CXnYA=y75Y_ zK+$POas}Ll7<;p-;{qK%Cu61|g>D}&;|N~!6K$YT0+VtZ=XN4IQB;65|Ia?qnc++`1?cNA}NQs`FgyCznvDlTy zoX=H_&3exjW5E_Rmu!m>IG)RxVp%NP20T{6>0~6e`crn_>9HGOu@R&)Bu@$IwnHJ_9bib-Db%VPJJqhRI{h@HO6bY~J>CE{-T=LZ@8^=Ve?l<1OuTuFwBgs*9nZkh=mm5P62K6h?!Q~NxV5d5<7?B7`F%GC@Bj8j&adFeUJO^KPj6EmUC2WwiLS&eOp+lgpdO3+Olf zwz{3=;2s#qECaAkb6tI~?AV6KL#Y0BL8|7+x>}SM$J<5mIp5U-6qr<9x(6IsFXubV zN+z1hS4H(8NmhCF*pMp`Cm2K&Z$4JLDV?2 z9q7m0Bti~k8>+0Zd+$b$=kLuplIDp{CjMlLKe@i^Bt#rYbD283g~Tq(^N?;e_%@nN ze7kT0r}{0GSb6Vrdc3*nceI}i6K!uvx#}1raa^e$43kUxaT}=LSGAur2^2-eE@I(D zuIsbFr6(eI?p0)TcI`8|jGt(aJ@KbO{<4R|lA4IidDa@4;_V_W!YjgSqkE&T7%f}n z*U4dZKH6a!I@;+ON+-b7i=ju=D*;%kCURMfZqXmmV%sUlwx5S@hxfNZtrufiC~yLG z{`|WL>reJx^P1_~j5iD9v=A6;{%6JPpI+;KDzW~OZ!(mZm6t`(R+;IURl(u})d%p! z^x=f91k-9KYWt!E&GB&F=Y{b>yKMyzpd=Xjsd$HeEuZ?mTe-x;uwR9)|6n*hg=Me$ zj?2XG`RYu^`>kp>gE(nrMvvkHXC(gd&~D1iBWY5r=B*N%5|2t%#g++p5)JW!{iymU z&dz$eJh^CbhFz_SFOXfFWrzLkB}uErPvnJ5KV{4qzI97aJ8N|whoz#bezMcOpNpZZ zj@*V2(QS&X&@HDJso84Z%YUZ?Ei4yB3K&M8nt9R2>>p(<@-wjwfPC41f z*qO!npgLL1DI#};b#WJUJQ6JqI9?}{ak;8hTc@k}u4LJ~`xDYc6Q^!ltN~vyp8tW> zbjCR?TVwKCb9pRm-f~>b-Au)IZYpsFwU6B*6O+%!!{5Lqe5}WYZF4rP3&VKBUO+)> zuhfc0759=YgUQ`jF|)xF`+oj;v%ZSw*f39wcNmaWuk*OtnYY|KL+dU1BfYfkT)H|j zh&Et+TqTG-lTVXdE*j0GYouwmc(c;v07@nZne~7Z^<&mgCeZPwQ;jgLf)LKFw#a*{ zIIvMkWx_0_E*mS8!c`YK3M7Je8_UYjxHk%n(%*FI1dST%|#w)eXM0ffER8;3G{ixut>?av>boGLLjnLICJe32=L-%{>w%L^0ic#|un?|zMXEt0ws2`0$wBYoluzG5 z)TtkxlAl@Iz3a9DO-=Hl#KdaAJjP!+nO+rYmTj0RG58Lb*pvij14se6kqv+F{oyv? z-E0QOqwkYI9{g$LYdMI_-aV}6V$v}P!R^7^`KPQ?3m)^K{+tJh_1neLt8$eFWW77B zfYmrC%k^zY!UVD`%eaTP%pvmRhA#Xen>;&n#{9VKHIwPWxhdCKQMd2#=lIc2D&USP z^lG>=Vsl#+Suo`id{50CFy8O^Jktn9l|BFV6@Pk!*S_MITyLHkcm^Z_qn!Voc90HqR!`20&6yw;h|l5mxfdZH$`)Y?CW*JiNeu|p=?pzb zvnPQ!APRUeBqGpjVnvpQfw6#2w`|7|I+3t=*@!K~&0J-c8E5gp_WMIk8*2`0cxP* z9|a5MupRvc29jF96yxjL+-d!Xztu=94P{xSp2MepxG`y5GYvHerGF|KJ>&tF(bhWe z%MQ6gxGj+F#a!)QgHY0RtSKuy+LA%4INSb0DBs#Zz|)-V#OH1#fplpdoYc_kq!lneL>Agtp&AzNg0aPKhD>&Cx@4K*DuT#8;n8iG=)_JId0R_h=Kt)tD3 z>`=z2j1VA!UHG8O0lOenV*}jv_Cn&HRJ|r~WPOsy9~ewE0H41Js($aLf5qbewmtxx z9@w2BoPiAxui6=x4ZcB9bUiPEWfcZDbPe&fbQaN-tPBs#aD0V z71Q}*qW}{Ss%%1P(`#@`hSOeL3Pc=6G8Bt*&HX&f>C;qa!i!m+7x~JrSjmr-z?uE( z?Cv>k^$|E26LO+cws*0n(`Aj-op;M*!mjTWeVLm?KIa~5f(NMU&QJeRRa@w;Q{p> zRO3p!f-Xu^Hff@_9mwivbdXwr!_Re|K7o4+2Q42Tm+?_rjjdbkjgpA z$<&FZ$y>=y$#4NYwu_kV{1n%&7v^0QW{z4UoI?3mfZ%p zCwbpl_B@#f-7%pdn-KG5EWbyTf0(?9WgjbvtICG`pr#dKiV z%HJR<0vrnT3dsnC-yOhh)=O|+0T5z2bWwu7&Y&nYdcHlyf@M$=u*9D*R=HSISP)p8 z4d0{Rvta-;puomV^20&{5ZL9rbPrFR+lqDm&!8O|uJ{620vtXna7$E6xtx6=kI{Bk z6U_Sot53-~my~Vri&iO&|^l$GcJpi60%YKKyK9D*T-!<*!VeKA*&hQlns}eo%e7a&)B^Q^P(wB zrN_Db*=7Z~f(s}Lk2E;LN#?!Sed|NF0U49Jkmkh(Jjh%(OLiY*cc{V5DOuLE&IG}ZCz{ylB-PuqBHH4*RM^}Nixt^_`RV>Mz%z-z5PwV?k8-;Vs^ z+oNWB&|bUty8pwqv(CP__M1Oky8saxk9*F~|7(cUpa1^r7du;CC0PT$lrr#>_#3~j zWaeo3ubzeXWk$Le>ULS*xF9T@l@v}xRZX>=ungLn*td}GrvA?ZYoz-+HNQLB;3-kS z!%{YR*C0oJ^&jE-C>~QDshKy zBOg-%%G?0BF`_@~6pV`a9kcxj&uie4E$I5qfuNxQW48Z%&H2yxS<&c4Uwvg0UNQe@ zX@gRr{Zi=T=Nu9s3pswl7Bb)GHV$7OfFsw7b9bg_bS6< z&#=9npATdMFA|=Uabv=V1e82!UURBlR|pilWRgVABh<5(cWyT}_w&Io-!Gw%?WA%x z;5imFA{3dtvA$ksJb=#Rz{3+ife*}VHi>oa5vPsadz{5h^jGCpK`fA2Zlnrw3 z7|)L}ccFisHm#=GsrVvUW;bw-3p~HQsZ_)sCE?Dg&u+JPPrcJ#0&)+lRJzmDo?*Rt z?!rF07LIS1QJ0ECY36f~V!3b~bc{}x5`8J=R1`dsl;o{34gJNo!@3DUW0p#PIYO7< zYPP5y8N@>T(3?jl(`5fz)Kzf9FvR2gFfw7KpALl1x8z>a%Fs^;C3sKpZ)Pql6DLN{ z%A>o=gqU)yI*bKrI+X>N0T}_x013g80^1g<744ywr7ca(qsH=%r{AZ+pIp6Wu>zA4 zBp=A4?BBB}=;Y{VWBrQ7z*tGy?U!Du9M*h%f^J*@$6E;w!|q7*Kw^l5AhAL)+#L)> zO)~aSe9|WzSYQ)}Ico!5)Rc(-7t*`WTz5MQgGcLom~Y-M*jFCvj&^bj5jAo%tjE*) zZyd+#eVN*cT7hjccWsZzH$P?$KejNURjD897T&4sjJA>0ihs0^?mlzDe6Du94C){U zF}p=6IdkM?g7de&NY#5HmRA<}LLE^Ws4q)p)s$d3Rw*}W*InbsFQPqddbYqHb>km= zf(rgaFW|&}xN*Lh+9>+F0FI1I!!=*5r?ZUEf)KtaoQ8E(|Gl#4T3dwR86{^?ybv<9 zk;{9MuRJJlimb8Ku#s+=4-@)HyW`==om5wirTb& zCgH8ObEZ?0IBc}Pp1rHEd1H$}f#FEUS-p`gkTOg|e;{0m?c2JFi@MK4p0fplYd47e z4X#^EzBgA6WxrYe_#+Q$OK(PZ)y7#bHk<%4%bf(V>53 zHpG=$C^~n8JJ;F--JR;@VA|8Eb_hBZ@S;|7sIY{A z?x}%y4W2{KOsOD{JFtpvTxXp+>BPM8#mnURY*6Pz1E4DnRYkw3e}hER=?p<5MCN}Y zz~+B~bA1cv&i1y#dV>wl;SSy*4MKak!=k&B9B_eTfWV#g62bjR%xlUP!;-xvft2z*QXM7(IBSe4ZTE}jE%S)ej_5iCNw6@!f zs$J|a@tXVrPsZlW5hU48^pZNF!>bdoX5)4MjJzPaK-R*wT$ zFiff#X^sQr83hw*kf;o$mW5AorX6R(9neE%dyo~KJMp~@Ac##fDm5seCSHd*Fb85m zAkybx`Jdu?XQ9S8l%8j2=W;rE66m{@iLUPTCwM?U^m(f7jEo!XLDffdWE#n^(7oxa zk(Y8^rdpAKX$Wh}KOL_N@XsfpzZp3H{&6(5bCBVMra#GeO%uc}1v5C1rk7y*Z$c(% zBgcQaK6`16V?^RjQV^n&YlpzXmTTDvEJGFih%NzwJhMvob%U~A(lew-$6y2UJQoQQ z8qA6WBI{f3>MO64| zQ&LX?pa)Xl3DLR6NltL50JRLH%kp-5;mCG`f1#dr7jO+ z;xWRRL)xxy=74|AMn}@e2jUxByJ-nkHuO=rI{KClC}RT%aBFIdNW-VxqnZ8sBqvRm zMt0r1-$QBs1o1Vzx+W7vpZ^~tQs7PRt8d`{IU)t>2!9)q!etYC{r?U~|NQS?zZXiC zz!x{5$?*LBi7XD>D`WL95h?IQ{;h_&B_zQN2%RHue{5U;dSqcT({p4dTY5*u#M%~P z7ubsuphNzV6RwCHT)R0ja_as0IVEHDvzNCgXa`w3maS<=3`jqi1j6jRpT*Ek1lBJC z5zxI+Wmz#`Qkv@aT?u*`Ba>?~)52Njox9|DsK8_IUaFg82O4fu?P$|PqOl(hXha0g z-J=QBTH(x@DQ)R51nh?1^bWJaBeBq?FH@RG`x3bp1D3o*aw6{LqqNg?jRv=MhAYre zb--hkaRLWvKsScoXbg;EwD4w0;BoSjvV6uK9j}JLldHgLIZJ|pI^vOjM7k(j0T(bStpr~<-?l}qAhSDqR7)31~9k@DQj zTTfT{P)Na>nEl^Kvk0SoNKX|SCG}W=GLR5?o)Hn|)MX{=lru?V8&o+`Cpt;vROs-d zIoK_FJd?ayCvJ#&d@dlwpHdWF2tOZ-^{9EV8ow-tj!pUN_rwK8;HFlevi(^BMXjFh2vXq z`>g#-=ChZ_XAmD$PRGrTz;ak#P?-^_Y+_KlZ~W;&!_nk9!DhN>m={#Or;mbInbl15 zo~f0-NK*j-$sFiwfI{y~rESVoQ{pvuqaw4x(2l92qn+I{!}{_&RNE$keN967n_sA) zPONBxqgiM@TpospSEXWFmag$8a4e4rZiN}6f`OnIKSis)EXGmofBFt?pF`|Ch+6Ah zF2d1GsKCR52`!nz*#B-7<=lJxmQazK#Y|9=$M^f4XTvmCm>l=deytyPpkUOE#XqPb zaAe>uRJl~S8e85J&g!-0xmC(f;Z&+k)zhxj2U@7FtyZYkx26iCeuC#{QYudd2)z^gaHj-Uq5M+ppO!$LM$2_ZJX< z{nE}GIdb6WJOg706rI0v7(`5>i9Xhp;iR+ld)c2aRo`zoY^{Yx0nPAV+0&6LL5)*$ zh~(^WR+%ysIP!>Xd2<_~tf6PL$-B;jZ<@aQN3#V+190dA$>q)@&>I1hW;>B}j_+Dc z$ktPs->I4&7;P7$o-OaA4r~qEc$$iUP08f?3sea79gM`|QCs!-Bi9ce+%yF|grtUi z*{sfPCHJ1PWR|@TBfSzr7MBz+^9Y61B%IJ7JR1zTT;xT>hOqg@=lmWSenD%1n0(~M z5&={tO%c&(CsGQnd6~OF9dQjeJSA#>D{Jf1>Tbb~B2)g7)o8;#Y*;b|2q@LVRCK4e z#sJa+2y9A3!(t}5K%&2A_=zA<-)%OQK|WYT`o;-`DL4FCnYLzgGApC@x!13n1~P;ZRtC!tXAjQC|Du znHoU5mINq$A`FKMEExJluAPs&*pko|vh;1Mjt4kb1x?=>or`qXb_y4Z$?d}L z0+kJXZRIK-%-aP@gPQO%=6Y-%GvU5UT;WmGy~hbCzM-xUIo-l0n<0Z!=hGKSKh9^w z%J}k#QHPG1XsI(pNbMKyKJaXi5EN+Mbk`5&AD)fQTIL`Da?piq{8RA(v$;9U%&7Qk z1J=~H2~&XOFMjsVwLe!Pm59fLt@|&46+Z+cd?y7%!{O=<*Wt9fE(ktlcMdTJF@%et zK^1p_W?@R#a3Ok_c_)6xJrl`G&l=^jAFam@Ko5J-4o|{yGLh>-Y}b5cf=BFW6Mk@y zG!yfG&jah0DD~huIoDjevzuU{h|M#5^xoYP_?k%2#A>wt)8>jgA-|sBJMV@3l6ZuL zM%^)hO{r4VKZ?0~j7NBXiJZf60bed&?-u|8wNSRW<83$HPvjDUnrV<~;oe0uB`S^F zQrX-3u+`4Xg}MIQ@*0}Py<;z)#sIf{{U}NoGUfHJ*inNz`3t!5`ykX6+B!Z7=l%~U zINRoO-`Kb<#ws?TGr3!%Oca0A!NwbR#eF+1&V2qo_wY~4cx^LEJQ2saKzkX4`&*eu z+Q`uCbu^Zte58!aft1<%-53wgG@Gn#njCAX&noU(gu(8ZE&7MDhZTyu-MqFQ*pZg# z64|ER634#mPZGq5pu+>PmcBk3D2o0)Q`RhF5tb`)_2*yf{0tx)1g**bX12W(nB6Q) zj7+vnuG1T`-50Dp^Mp+qR)=Nwy$fqpHfGr;rnYo@+$${j6=q9(A$kG=a!U!0Bx&O~ zY9Qt~v|^0&g|pYylQ^_ernXx2XgDId1zDR_AmvFk5oISVJdu;b%~cvjyw(T##TRHb zIQ#GKzm$J4&&HrxY#njX^NFV^bI+F_&Y6`;a^*IlpVnn-({@zj*hao;Oyb(HE)b

+ * This class implements section 6.8. Base64 + * Content-Transfer-Encoding from RFC 2045 Multipurpose Internet + * Mail Extensions (MIME) Part One: Format of Internet Message Bodies by + * Freed and Borenstein. + *

+ *

+ * The class can be parameterized in the following manner with various + * constructors: + *

+ *
    + *
  • URL-safe mode: Default off.
  • + *
  • Line length: Default 76. Line length that aren't multiples of 4 will + * still essentially end up being multiples of 4 in the encoded data. + *
  • Line separator: Default is CRLF ("\r\n")
  • + *
+ *

+ * The URL-safe parameter is only applied to encode operations. Decoding + * seamlessly handles both modes. + *

+ *

+ * Since this class operates directly on byte streams, and not character + * streams, it is hard-coded to only encode/decode character encodings which are + * compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, + * etc). + *

+ *

+ * This class is thread-safe. + *

+ * + * @see RFC 2045 + * @since 1.0 + */ +public class Base64 extends BaseNCodec { + + /** + * BASE32 characters are 6 bits in length. They are formed by taking a block of + * 3 octets to form a 24-bit string, which is converted into 4 BASE64 + * characters. + */ + private static final int BITS_PER_ENCODED_BYTE = 6; + private static final int BYTES_PER_UNENCODED_BLOCK = 3; + private static final int BYTES_PER_ENCODED_BLOCK = 4; + + /** + * This array is a lookup table that translates 6-bit positive integer index + * values into their "Base64 Alphabet" equivalents as specified in Table 1 of + * RFC 2045. + * + * Thanks to "commons" project in ws.apache.org for this code. + * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ + */ + private static final byte[] STANDARD_ENCODE_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', + 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', + '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; + + /** + * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / changed + * to - and _ to make the encoded Base64 results more URL-SAFE. This table is + * only used when the Base64's mode is set to URL-SAFE. + */ + private static final byte[] URL_SAFE_ENCODE_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', + 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', + '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' }; + + /** + * This array is a lookup table that translates Unicode characters drawn from + * the "Base64 Alphabet" (as specified in Table 1 of RFC 2045) into their 6-bit + * positive integer equivalents. Characters that are not in the Base64 alphabet + * but fall within the bounds of the array are translated to -1. + * + * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This + * means decoder seamlessly handles both URL_SAFE and STANDARD base64. (The + * encoder, on the other hand, needs to know ahead of time what to emit). + * + * Thanks to "commons" project in ws.apache.org for this code. + * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ + */ + private static final byte[] DECODE_TABLE = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00-0f + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-1f + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, // 20-2f + - / + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 30-3f 0-9 + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 40-4f A-O + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, // 50-5f P-Z _ + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 60-6f a-o + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 // 70-7a p-z + }; + + /** + * Base64 uses 6-bit fields. + */ + /** Mask used to extract 6 bits, used when encoding */ + private static final int MASK_6BITS = 0x3f; + /** Mask used to extract 4 bits, used when decoding final trailing character. */ + private static final int MASK_4BITS = 0xf; + /** Mask used to extract 2 bits, used when decoding final trailing character. */ + private static final int MASK_2BITS = 0x3; + + // The static final fields above are used for the original static byte[] methods + // on Base64. + // The private member fields below are used with the new streaming approach, + // which requires + // some state be preserved between calls of encode() and decode(). + + /** + * Decodes Base64 data into octets. + *

+ * Note: this method seamlessly handles data encoded in URL-safe or + * normal mode. + *

+ * + * @param base64Data Byte array containing Base64 data + * @return Array containing decoded data. + */ + public static byte[] decodeBase64(final byte[] base64Data) { + return new Base64().decode(base64Data); + } + + /** + * Decodes a Base64 String into octets. + *

+ * Note: this method seamlessly handles data encoded in URL-safe or + * normal mode. + *

+ * + * @param base64String String containing Base64 data + * @return Array containing decoded data. + * @since 1.4 + */ + public static byte[] decodeBase64(final String base64String) { + return new Base64().decode(base64String); + } + + // Implementation of integer encoding used for crypto + /** + * Decodes a byte64-encoded integer according to crypto standards such as W3C's + * XML-Signature. + * + * @param pArray a byte array containing base64 character data + * @return A BigInteger + * @since 1.4 + */ + public static BigInteger decodeInteger(final byte[] pArray) { + return new BigInteger(1, decodeBase64(pArray)); + } + + /** + * Encodes binary data using the base64 algorithm but does not chunk the output. + * + * @param binaryData binary data to encode + * @return byte[] containing Base64 characters in their UTF-8 representation. + */ + public static byte[] encodeBase64(final byte[] binaryData) { + return encodeBase64(binaryData, false); + } + + /** + * Encodes binary data using the base64 algorithm, optionally chunking the + * output into 76 character blocks. + * + * @param binaryData Array containing binary data to encode. + * @param isChunked if {@code true} this encoder will chunk the base64 output + * into 76 character blocks + * @return Base64-encoded data. + * @throws IllegalArgumentException Thrown when the input array needs an output + * array bigger than {@link Integer#MAX_VALUE} + */ + public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked) { + return encodeBase64(binaryData, isChunked, false); + } + + /** + * Encodes binary data using the base64 algorithm, optionally chunking the + * output into 76 character blocks. + * + * @param binaryData Array containing binary data to encode. + * @param isChunked if {@code true} this encoder will chunk the base64 output + * into 76 character blocks + * @param urlSafe if {@code true} this encoder will emit - and _ instead of + * the usual + and / characters. Note: no padding is added + * when encoding using the URL-safe alphabet. + * @return Base64-encoded data. + * @throws IllegalArgumentException Thrown when the input array needs an output + * array bigger than {@link Integer#MAX_VALUE} + * @since 1.4 + */ + public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe) { + return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE); + } + + /** + * Encodes binary data using the base64 algorithm, optionally chunking the + * output into 76 character blocks. + * + * @param binaryData Array containing binary data to encode. + * @param isChunked if {@code true} this encoder will chunk the base64 + * output into 76 character blocks + * @param urlSafe if {@code true} this encoder will emit - and _ instead + * of the usual + and / characters. Note: no padding is + * added when encoding using the URL-safe alphabet. + * @param maxResultSize The maximum result size to accept. + * @return Base64-encoded data. + * @throws IllegalArgumentException Thrown when the input array needs an output + * array bigger than maxResultSize + * @since 1.4 + */ + public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe, + final int maxResultSize) { + if (binaryData == null || binaryData.length == 0) { + return binaryData; + } + + // Create this so can use the super-class method + // Also ensures that the same roundings are performed by the ctor and the code + final Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe); + final long len = b64.getEncodedLength(binaryData); + if (len > maxResultSize) { + throw new IllegalArgumentException("Input array too big, the output array would be bigger (" + len + + ") than the specified maximum size of " + maxResultSize); + } + + return b64.encode(binaryData); + } + + /** + * Encodes binary data using the base64 algorithm and chunks the encoded output + * into 76 character blocks + * + * @param binaryData binary data to encode + * @return Base64 characters chunked in 76 character blocks + */ + public static byte[] encodeBase64Chunked(final byte[] binaryData) { + return encodeBase64(binaryData, true); + } + + /** + * Encodes binary data using the base64 algorithm but does not chunk the output. + * + * NOTE: We changed the behavior of this method from multi-line chunking + * (commons-codec-1.4) to single-line non-chunking (commons-codec-1.5). + * + * @param binaryData binary data to encode + * @return String containing Base64 characters. + * @since 1.4 (NOTE: 1.4 chunked the output, whereas 1.5 does not). + */ + public static String encodeBase64String(final byte[] binaryData) { + return new String(encodeBase64(binaryData, false), Charset.forName("UTF-8")); + } + + /** + * Encodes binary data using a URL-safe variation of the base64 algorithm but + * does not chunk the output. The url-safe variation emits - and _ instead of + + * and / characters. Note: no padding is added. + * + * @param binaryData binary data to encode + * @return byte[] containing Base64 characters in their UTF-8 representation. + * @since 1.4 + */ + public static byte[] encodeBase64URLSafe(final byte[] binaryData) { + return encodeBase64(binaryData, false, true); + } + + /** + * Encodes binary data using a URL-safe variation of the base64 algorithm but + * does not chunk the output. The url-safe variation emits - and _ instead of + + * and / characters. Note: no padding is added. + * + * @param binaryData binary data to encode + * @return String containing Base64 characters + * @since 1.4 + */ + public static String encodeBase64URLSafeString(final byte[] binaryData) { + return new String(encodeBase64(binaryData, false, true), Charset.forName("UTF-8")); + } + + /** + * Encodes to a byte64-encoded integer according to crypto standards such as + * W3C's XML-Signature. + * + * @param bigInteger a BigInteger + * @return A byte array containing base64 character data + * @throws NullPointerException if null is passed in + * @since 1.4 + */ + public static byte[] encodeInteger(final BigInteger bigInteger) { + return encodeBase64(toIntegerBytes(bigInteger), false); + } + + /** + * Tests a given byte array to see if it contains only valid characters within + * the Base64 alphabet. Currently the method treats whitespace as valid. + * + * @param arrayOctet byte array to test + * @return {@code true} if all bytes are valid characters in the Base64 alphabet + * or if the byte array is empty; {@code false}, otherwise + * @deprecated 1.5 Use {@link #isBase64(byte[])}, will be removed in 2.0. + */ + @Deprecated + public static boolean isArrayByteBase64(final byte[] arrayOctet) { + return isBase64(arrayOctet); + } + + /** + * Returns whether or not the {@code octet} is in the base 64 alphabet. + * + * @param octet The value to test + * @return {@code true} if the value is defined in the the base 64 alphabet, + * {@code false} otherwise. + * @since 1.4 + */ + public static boolean isBase64(final byte octet) { + return octet == PAD_DEFAULT || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1); + } + + /** + * Tests a given byte array to see if it contains only valid characters within + * the Base64 alphabet. Currently the method treats whitespace as valid. + * + * @param arrayOctet byte array to test + * @return {@code true} if all bytes are valid characters in the Base64 alphabet + * or if the byte array is empty; {@code false}, otherwise + * @since 1.5 + */ + public static boolean isBase64(final byte[] arrayOctet) { + for (int i = 0; i < arrayOctet.length; i++) { + if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) { + return false; + } + } + return true; + } + + /** + * Tests a given String to see if it contains only valid characters within the + * Base64 alphabet. Currently the method treats whitespace as valid. + * + * @param base64 String to test + * @return {@code true} if all characters in the String are valid characters in + * the Base64 alphabet or if the String is empty; {@code false}, + * otherwise + * @since 1.5 + */ + public static boolean isBase64(final String base64) { + return isBase64(base64.getBytes(Charset.forName("UTF-8"))); + } + + /** + * Returns a byte-array representation of a {@code BigInteger} without sign bit. + * + * @param bigInt {@code BigInteger} to be converted + * @return a byte array representation of the BigInteger parameter + */ + static byte[] toIntegerBytes(final BigInteger bigInt) { + int bitlen = bigInt.bitLength(); + // round bitlen + bitlen = ((bitlen + 7) >> 3) << 3; + final byte[] bigBytes = bigInt.toByteArray(); + + if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) { + return bigBytes; + } + // set up params for copying everything but sign bit + int startSrc = 0; + int len = bigBytes.length; + + // if bigInt is exactly byte-aligned, just skip signbit in copy + if ((bigInt.bitLength() % 8) == 0) { + startSrc = 1; + len--; + } + final int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec + final byte[] resizedBytes = new byte[bitlen / 8]; + System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len); + return resizedBytes; + } + + /** + * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE + * above remains static because it is able to decode both STANDARD and URL_SAFE + * streams, but the encodeTable must be a member variable so we can switch + * between the two modes. + */ + private final byte[] encodeTable; + + // Only one decode table currently; keep for consistency with Base32 code + private final byte[] decodeTable = DECODE_TABLE; + + /** + * Line separator for encoding. Not used when decoding. Only used if lineLength + * > 0. + */ + private final byte[] lineSeparator; + + /** + * Convenience variable to help us determine when our buffer is going to run out + * of room and needs resizing. {@code decodeSize = 3 + lineSeparator.length;} + */ + private final int decodeSize; + + /** + * Convenience variable to help us determine when our buffer is going to run out + * of room and needs resizing. {@code encodeSize = 4 + lineSeparator.length;} + */ + private final int encodeSize; + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in + * URL-unsafe mode. + *

+ * When encoding the line length is 0 (no chunking), and the encoding table is + * STANDARD_ENCODE_TABLE. + *

+ * + *

+ * When decoding all variants are supported. + *

+ */ + public Base64() { + this(0); + } + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in the + * given URL-safe mode. + *

+ * When encoding the line length is 76, the line separator is CRLF, and the + * encoding table is STANDARD_ENCODE_TABLE. + *

+ * + *

+ * When decoding all variants are supported. + *

+ * + * @param urlSafe if {@code true}, URL-safe encoding is used. In most cases this + * should be set to {@code false}. + * @since 1.4 + */ + public Base64(final boolean urlSafe) { + this(MIME_CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe); + } + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in + * URL-unsafe mode. + *

+ * When encoding the line length is given in the constructor, the line separator + * is CRLF, and the encoding table is STANDARD_ENCODE_TABLE. + *

+ *

+ * Line lengths that aren't multiples of 4 will still essentially end up being + * multiples of 4 in the encoded data. + *

+ *

+ * When decoding all variants are supported. + *

+ * + * @param lineLength Each line of encoded data will be at most of the given + * length (rounded down to nearest multiple of 4). If + * lineLength <= 0, then the output will not be divided + * into lines (chunks). Ignored when decoding. + * @since 1.4 + */ + public Base64(final int lineLength) { + this(lineLength, CHUNK_SEPARATOR); + } + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in + * URL-unsafe mode. + *

+ * When encoding the line length and line separator are given in the + * constructor, and the encoding table is STANDARD_ENCODE_TABLE. + *

+ *

+ * Line lengths that aren't multiples of 4 will still essentially end up being + * multiples of 4 in the encoded data. + *

+ *

+ * When decoding all variants are supported. + *

+ * + * @param lineLength Each line of encoded data will be at most of the given + * length (rounded down to nearest multiple of 4). If + * lineLength <= 0, then the output will not be divided + * into lines (chunks). Ignored when decoding. + * @param lineSeparator Each line of encoded data will end with this sequence of + * bytes. + * @throws IllegalArgumentException Thrown when the provided lineSeparator + * included some base64 characters. + * @since 1.4 + */ + public Base64(final int lineLength, final byte[] lineSeparator) { + this(lineLength, lineSeparator, false); + } + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in + * URL-unsafe mode. + *

+ * When encoding the line length and line separator are given in the + * constructor, and the encoding table is STANDARD_ENCODE_TABLE. + *

+ *

+ * Line lengths that aren't multiples of 4 will still essentially end up being + * multiples of 4 in the encoded data. + *

+ *

+ * When decoding all variants are supported. + *

+ * + * @param lineLength Each line of encoded data will be at most of the given + * length (rounded down to nearest multiple of 4). If + * lineLength <= 0, then the output will not be divided + * into lines (chunks). Ignored when decoding. + * @param lineSeparator Each line of encoded data will end with this sequence of + * bytes. + * @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_' + * respectively. urlSafe is only applied to encode + * operations. Decoding seamlessly handles both modes. + * Note: no padding is added when using the URL-safe + * alphabet. + * @throws IllegalArgumentException Thrown when the {@code lineSeparator} + * contains Base64 characters. + * @since 1.4 + */ + public Base64(final int lineLength, final byte[] lineSeparator, final boolean urlSafe) { + this(lineLength, lineSeparator, urlSafe, CodecPolicy.LENIANT); + } + + /** + * Creates a Base64 codec used for decoding (all modes) and encoding in + * URL-unsafe mode. + *

+ * When encoding the line length and line separator are given in the + * constructor, and the encoding table is STANDARD_ENCODE_TABLE. + *

+ *

+ * Line lengths that aren't multiples of 4 will still essentially end up being + * multiples of 4 in the encoded data. + *

+ *

+ * When decoding all variants are supported. + *

+ * + * @param lineLength Each line of encoded data will be at most of the given + * length (rounded down to nearest multiple of 4). If + * lineLength <= 0, then the output will not be divided + * into lines (chunks). Ignored when decoding. + * @param lineSeparator Each line of encoded data will end with this sequence + * of bytes. + * @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_' + * respectively. urlSafe is only applied to encode + * operations. Decoding seamlessly handles both modes. + * Note: no padding is added when using the URL-safe + * alphabet. + * @param decodingPolicy The decoding policy. + * @throws IllegalArgumentException Thrown when the {@code lineSeparator} + * contains Base64 characters. + * @since 1.15 + */ + public Base64(final int lineLength, final byte[] lineSeparator, final boolean urlSafe, + final CodecPolicy decodingPolicy) { + super(BYTES_PER_UNENCODED_BLOCK, BYTES_PER_ENCODED_BLOCK, lineLength, + lineSeparator == null ? 0 : lineSeparator.length, PAD_DEFAULT, decodingPolicy); + // TODO could be simplified if there is no requirement to reject invalid line + // sep when length <=0 + // @see test case Base64Test.testConstructors() + if (lineSeparator != null) { + if (containsAlphabetOrPad(lineSeparator)) { + final String sep = new String(lineSeparator, Charset.forName("UTF-8")); + throw new IllegalArgumentException("lineSeparator must not contain base64 characters: [" + sep + "]"); + } + if (lineLength > 0) { // null line-sep forces no chunking rather than throwing IAE + this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length; + this.lineSeparator = new byte[lineSeparator.length]; + System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); + } else { + this.encodeSize = BYTES_PER_ENCODED_BLOCK; + this.lineSeparator = null; + } + } else { + this.encodeSize = BYTES_PER_ENCODED_BLOCK; + this.lineSeparator = null; + } + this.decodeSize = this.encodeSize - 1; + this.encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE; + } + + // Implementation of the Encoder Interface + + /** + *

+ * Decodes all of the provided data, starting at inPos, for inAvail bytes. + * Should be called at least twice: once with the data to decode, and once with + * inAvail set to "-1" to alert decoder that EOF has been reached. The "-1" call + * is not necessary when decoding, but it doesn't hurt, either. + *

+ *

+ * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) + * data is handled, since CR and LF are silently ignored, but has implications + * for other bytes, too. This method subscribes to the garbage-in, garbage-out + * philosophy: it will not check the provided data for validity. + *

+ *

+ * Thanks to "commons" project in ws.apache.org for the bitwise operations, and + * general approach. + * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ + *

+ * + * @param in byte[] array of ascii data to base64 decode. + * @param inPos Position to start reading data from. + * @param inAvail Amount of bytes available from input for decoding. + * @param context the context to be used + */ + @Override + void decode(final byte[] in, int inPos, final int inAvail, final Context context) { + if (context.eof) { + return; + } + if (inAvail < 0) { + context.eof = true; + } + for (int i = 0; i < inAvail; i++) { + final byte[] buffer = ensureBufferSize(decodeSize, context); + final byte b = in[inPos++]; + if (b == pad) { + // We're done. + context.eof = true; + break; + } + if (b >= 0 && b < DECODE_TABLE.length) { + final int result = DECODE_TABLE[b]; + if (result >= 0) { + context.modulus = (context.modulus + 1) % BYTES_PER_ENCODED_BLOCK; + context.ibitWorkArea = (context.ibitWorkArea << BITS_PER_ENCODED_BYTE) + result; + if (context.modulus == 0) { + buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 16) & MASK_8BITS); + buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS); + buffer[context.pos++] = (byte) (context.ibitWorkArea & MASK_8BITS); + } + } + } + } + + // Two forms of EOF as far as base64 decoder is concerned: actual + // EOF (-1) and first time '=' character is encountered in stream. + // This approach makes the '=' padding characters completely optional. + if (context.eof && context.modulus != 0) { + final byte[] buffer = ensureBufferSize(decodeSize, context); + + // We have some spare bits remaining + // Output all whole multiples of 8 bits and ignore the rest + switch (context.modulus) { +// case 0 : // impossible, as excluded above + case 1: // 6 bits - either ignore entirely, or raise an exception + validateTrailingCharacter(); + break; + case 2: // 12 bits = 8 + 4 + validateCharacter(MASK_4BITS, context); + context.ibitWorkArea = context.ibitWorkArea >> 4; // dump the extra 4 bits + buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS); + break; + case 3: // 18 bits = 8 + 8 + 2 + validateCharacter(MASK_2BITS, context); + context.ibitWorkArea = context.ibitWorkArea >> 2; // dump 2 bits + buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS); + buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS); + break; + default: + throw new IllegalStateException("Impossible modulus " + context.modulus); + } + } + } + + /** + *

+ * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must + * be called at least twice: once with the data to encode, and once with inAvail + * set to "-1" to alert encoder that EOF has been reached, to flush last + * remaining bytes (if not multiple of 3). + *

+ *

+ * Note: no padding is added when encoding using the URL-safe alphabet. + *

+ *

+ * Thanks to "commons" project in ws.apache.org for the bitwise operations, and + * general approach. + * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ + *

+ * + * @param in byte[] array of binary data to base64 encode. + * @param inPos Position to start reading data from. + * @param inAvail Amount of bytes available from input for encoding. + * @param context the context to be used + */ + @Override + void encode(final byte[] in, int inPos, final int inAvail, final Context context) { + if (context.eof) { + return; + } + // inAvail < 0 is how we're informed of EOF in the underlying data we're + // encoding. + if (inAvail < 0) { + context.eof = true; + if (0 == context.modulus && lineLength == 0) { + return; // no leftovers to process and not using chunking + } + final byte[] buffer = ensureBufferSize(encodeSize, context); + final int savedPos = context.pos; + switch (context.modulus) { // 0-2 + case 0: // nothing to do here + break; + case 1: // 8 bits = 6 + 2 + // top 6 bits: + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 2) & MASK_6BITS]; + // remaining 2: + buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 4) & MASK_6BITS]; + // URL-SAFE skips the padding to further reduce size. + if (encodeTable == STANDARD_ENCODE_TABLE) { + buffer[context.pos++] = pad; + buffer[context.pos++] = pad; + } + break; + + case 2: // 16 bits = 6 + 6 + 4 + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 10) & MASK_6BITS]; + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 4) & MASK_6BITS]; + buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 2) & MASK_6BITS]; + // URL-SAFE skips the padding to further reduce size. + if (encodeTable == STANDARD_ENCODE_TABLE) { + buffer[context.pos++] = pad; + } + break; + default: + throw new IllegalStateException("Impossible modulus " + context.modulus); + } + context.currentLinePos += context.pos - savedPos; // keep track of current line position + // if currentPos == 0 we are at the start of a line, so don't add CRLF + if (lineLength > 0 && context.currentLinePos > 0) { + System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length); + context.pos += lineSeparator.length; + } + } else { + for (int i = 0; i < inAvail; i++) { + final byte[] buffer = ensureBufferSize(encodeSize, context); + context.modulus = (context.modulus + 1) % BYTES_PER_UNENCODED_BLOCK; + int b = in[inPos++]; + if (b < 0) { + b += 256; + } + context.ibitWorkArea = (context.ibitWorkArea << 8) + b; // BITS_PER_BYTE + if (0 == context.modulus) { // 3 bytes = 24 bits = 4 * 6 bits to extract + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 18) & MASK_6BITS]; + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 12) & MASK_6BITS]; + buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 6) & MASK_6BITS]; + buffer[context.pos++] = encodeTable[context.ibitWorkArea & MASK_6BITS]; + context.currentLinePos += BYTES_PER_ENCODED_BLOCK; + if (lineLength > 0 && lineLength <= context.currentLinePos) { + System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length); + context.pos += lineSeparator.length; + context.currentLinePos = 0; + } + } + } + } + } + + /** + * Returns whether or not the {@code octet} is in the Base64 alphabet. + * + * @param octet The value to test + * @return {@code true} if the value is defined in the the Base64 alphabet + * {@code false} otherwise. + */ + @Override + protected boolean isInAlphabet(final byte octet) { + return octet >= 0 && octet < decodeTable.length && decodeTable[octet] != -1; + } + + /** + * Returns our current encode mode. True if we're URL-SAFE, false otherwise. + * + * @return true if we're in URL-SAFE mode, false otherwise. + * @since 1.4 + */ + public boolean isUrlSafe() { + return this.encodeTable == URL_SAFE_ENCODE_TABLE; + } + + /** + * Validates whether decoding the final trailing character is possible in the + * context of the set of possible base 64 values. + * + *

+ * The character is valid if the lower bits within the provided mask are zero. + * This is used to test the final trailing base-64 digit is zero in the bits + * that will be discarded. + * + * @param emptyBitsMask The mask of the lower bits that should be empty + * @param context the context to be used + * + * @throws IllegalArgumentException if the bits being checked contain any + * non-zero value + */ + private void validateCharacter(final int emptyBitsMask, final Context context) { + if (isStrictDecoding() && (context.ibitWorkArea & emptyBitsMask) != 0) { + throw new IllegalArgumentException( + "Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. " + + "Expected the discarded bits from the character to be zero."); + } + } + + /** + * Validates whether decoding allows an entire final trailing character that + * cannot be used for a complete byte. + * + * @throws IllegalArgumentException if strict decoding is enabled + */ + private void validateTrailingCharacter() { + if (isStrictDecoding()) { + throw new IllegalArgumentException( + "Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. " + + "Decoding requires at least two trailing 6-bit characters to create bytes."); + } + } + +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java b/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java new file mode 100644 index 0000000..9ab019c --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java @@ -0,0 +1,694 @@ +package net.lax1dude.eaglercraft; + +import java.nio.charset.Charset; +import java.util.Arrays; + +import net.lax1dude.eaglercraft.BaseNCodec.CodecPolicy; + +public abstract class BaseNCodec { + + static enum CodecPolicy { + STRICT, LENIANT; + } + + /** + * Holds thread context so classes can be thread-safe. + * + * This class is not itself thread-safe; each thread must allocate its own copy. + * + * @since 1.7 + */ + static class Context { + + /** + * Place holder for the bytes we're dealing with for our based logic. Bitwise + * operations store and extract the encoding or decoding from this variable. + */ + int ibitWorkArea; + + /** + * Place holder for the bytes we're dealing with for our based logic. Bitwise + * operations store and extract the encoding or decoding from this variable. + */ + long lbitWorkArea; + + /** + * Buffer for streaming. + */ + byte[] buffer; + + /** + * Position where next character should be written in the buffer. + */ + int pos; + + /** + * Position where next character should be read from the buffer. + */ + int readPos; + + /** + * Boolean flag to indicate the EOF has been reached. Once EOF has been reached, + * this object becomes useless, and must be thrown away. + */ + boolean eof; + + /** + * Variable tracks how many characters have been written to the current line. + * Only used when encoding. We use it to make sure each encoded line never goes + * beyond lineLength (if lineLength > 0). + */ + int currentLinePos; + + /** + * Writes to the buffer only occur after every 3/5 reads when encoding, and + * every 4/8 reads when decoding. This variable helps track that. + */ + int modulus; + + Context() { + } + + /** + * Returns a String useful for debugging (especially within a debugger.) + * + * @return a String useful for debugging. + */ + @SuppressWarnings("boxing") // OK to ignore boxing here + @Override + public String toString() { + return String.format( + "%s[buffer=%s, currentLinePos=%s, eof=%s, ibitWorkArea=%s, lbitWorkArea=%s, " + + "modulus=%s, pos=%s, readPos=%s]", + this.getClass().getSimpleName(), Arrays.toString(buffer), currentLinePos, eof, ibitWorkArea, + lbitWorkArea, modulus, pos, readPos); + } + } + + /** + * EOF + * + * @since 1.7 + */ + static final int EOF = -1; + + /** + * MIME chunk size per RFC 2045 section 6.8. + * + *

+ * The {@value} character limit does not count the trailing CRLF, but counts all + * other characters, including any equal signs. + *

+ * + * @see RFC 2045 section 6.8 + */ + public static final int MIME_CHUNK_SIZE = 76; + + /** + * PEM chunk size per RFC 1421 section 4.3.2.4. + * + *

+ * The {@value} character limit does not count the trailing CRLF, but counts all + * other characters, including any equal signs. + *

+ * + * @see RFC 1421 section + * 4.3.2.4 + */ + public static final int PEM_CHUNK_SIZE = 64; + + private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2; + + /** + * Defines the default buffer size - currently {@value} - must be large enough + * for at least one encoded block+separator + */ + private static final int DEFAULT_BUFFER_SIZE = 8192; + + /** + * The maximum size buffer to allocate. + * + *

+ * This is set to the same size used in the JDK {@code java.util.ArrayList}: + *

+ *
Some VMs reserve some header words in an array. Attempts to + * allocate larger arrays may result in OutOfMemoryError: Requested array size + * exceeds VM limit.
+ */ + private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; + + /** Mask used to extract 8 bits, used in decoding bytes */ + protected static final int MASK_8BITS = 0xff; + + /** + * Byte used to pad output. + */ + protected static final byte PAD_DEFAULT = '='; // Allow static access to default + + /** + * Chunk separator per RFC 2045 section 2.1. + * + * @see RFC 2045 section 2.1 + */ + static final byte[] CHUNK_SEPARATOR = { '\r', '\n' }; + + /** + * Compares two {@code int} values numerically treating the values as unsigned. + * Taken from JDK 1.8. + * + *

+ * TODO: Replace with JDK 1.8 Integer::compareUnsigned(int, int). + *

+ * + * @param x the first {@code int} to compare + * @param y the second {@code int} to compare + * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if + * {@code x < y} as unsigned values; and a value greater than {@code 0} + * if {@code x > y} as unsigned values + */ + private static int compareUnsigned(final int xx, final int yy) { + int x = xx + Integer.MIN_VALUE; + int y = yy + Integer.MIN_VALUE; + return (x < y) ? -1 : ((x == y) ? 0 : 1); + } + + /** + * Create a positive capacity at least as large the minimum required capacity. + * If the minimum capacity is negative then this throws an OutOfMemoryError as + * no array can be allocated. + * + * @param minCapacity the minimum capacity + * @return the capacity + * @throws OutOfMemoryError if the {@code minCapacity} is negative + */ + private static int createPositiveCapacity(final int minCapacity) { + if (minCapacity < 0) { + // overflow + throw new OutOfMemoryError("Unable to allocate array size: " + (minCapacity & 0xffffffffL)); + } + // This is called when we require buffer expansion to a very big array. + // Use the conservative maximum buffer size if possible, otherwise the biggest + // required. + // + // Note: In this situation JDK 1.8 java.util.ArrayList returns + // Integer.MAX_VALUE. + // This excludes some VMs that can exceed MAX_BUFFER_SIZE but not allocate a + // full + // Integer.MAX_VALUE length array. + // The result is that we may have to allocate an array of this size more than + // once if + // the capacity must be expanded again. + return (minCapacity > MAX_BUFFER_SIZE) ? minCapacity : MAX_BUFFER_SIZE; + } + + /** + * Gets a copy of the chunk separator per RFC 2045 section 2.1. + * + * @return the chunk separator + * @see RFC 2045 section 2.1 + * @since 1.15 + */ + public static byte[] getChunkSeparator() { + return CHUNK_SEPARATOR.clone(); + } + + /** + * Checks if a byte value is whitespace or not. Whitespace is taken to mean: + * space, tab, CR, LF + * + * @param byteToCheck the byte to check + * @return true if byte is whitespace, false otherwise + */ + protected static boolean isWhiteSpace(final byte byteToCheck) { + switch (byteToCheck) { + case ' ': + case '\n': + case '\r': + case '\t': + return true; + default: + return false; + } + } + + /** + * Increases our buffer by the {@link #DEFAULT_BUFFER_RESIZE_FACTOR}. + * + * @param context the context to be used + * @param minCapacity the minimum required capacity + * @return the resized byte[] buffer + * @throws OutOfMemoryError if the {@code minCapacity} is negative + */ + private static byte[] resizeBuffer(final Context context, final int minCapacity) { + // Overflow-conscious code treats the min and new capacity as unsigned. + final int oldCapacity = context.buffer.length; + int newCapacity = oldCapacity * DEFAULT_BUFFER_RESIZE_FACTOR; + if (compareUnsigned(newCapacity, minCapacity) < 0) { + newCapacity = minCapacity; + } + if (compareUnsigned(newCapacity, MAX_BUFFER_SIZE) > 0) { + newCapacity = createPositiveCapacity(minCapacity); + } + + final byte[] b = new byte[newCapacity]; + System.arraycopy(context.buffer, 0, b, 0, context.buffer.length); + context.buffer = b; + return b; + } + + /** + * @deprecated Use {@link #pad}. Will be removed in 2.0. + */ + @Deprecated + protected final byte PAD = PAD_DEFAULT; // instance variable just in case it needs to vary later + + protected final byte pad; // instance variable just in case it needs to vary later + + /** + * Number of bytes in each full block of unencoded data, e.g. 4 for Base64 and 5 + * for Base32 + */ + private final int unencodedBlockSize; + + /** + * Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 + * for Base32 + */ + private final int encodedBlockSize; + + /** + * Chunksize for encoding. Not used when decoding. A value of zero or less + * implies no chunking of the encoded data. Rounded down to nearest multiple of + * encodedBlockSize. + */ + protected final int lineLength; + + /** + * Size of chunk separator. Not used unless {@link #lineLength} > 0. + */ + private final int chunkSeparatorLength; + + /** + * Defines the decoding behavior when the input bytes contain leftover trailing + * bits that cannot be created by a valid encoding. These can be bits that are + * unused from the final character or entire characters. The default mode is + * lenient decoding. Set this to {@code true} to enable strict decoding. + *
    + *
  • Lenient: Any trailing bits are composed into 8-bit bytes where possible. + * The remainder are discarded. + *
  • Strict: The decoding will raise an {@link IllegalArgumentException} if + * trailing bits are not part of a valid encoding. Any unused bits from the + * final character must be zero. Impossible counts of entire final characters + * are not allowed. + *
+ * + *

+ * When strict decoding is enabled it is expected that the decoded bytes will be + * re-encoded to a byte array that matches the original, i.e. no changes occur + * on the final character. This requires that the input bytes use the same + * padding and alphabet as the encoder. + */ + private final CodecPolicy decodingPolicy; + + /** + * Note {@code lineLength} is rounded down to the nearest multiple of the + * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is + * disabled. + * + * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3) + * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4) + * @param lineLength if > 0, use chunking with a length + * {@code lineLength} + * @param chunkSeparatorLength the chunk separator length, if relevant + */ + protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength, + final int chunkSeparatorLength) { + this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, PAD_DEFAULT); + } + + /** + * Note {@code lineLength} is rounded down to the nearest multiple of the + * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is + * disabled. + * + * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3) + * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4) + * @param lineLength if > 0, use chunking with a length + * {@code lineLength} + * @param chunkSeparatorLength the chunk separator length, if relevant + * @param pad byte used as padding byte. + */ + protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength, + final int chunkSeparatorLength, final byte pad) { + this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, pad, CodecPolicy.LENIANT); + } + + /** + * Note {@code lineLength} is rounded down to the nearest multiple of the + * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is + * disabled. + * + * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3) + * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4) + * @param lineLength if > 0, use chunking with a length + * {@code lineLength} + * @param chunkSeparatorLength the chunk separator length, if relevant + * @param pad byte used as padding byte. + * @param decodingPolicy Decoding policy. + * @since 1.15 + */ + protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength, + final int chunkSeparatorLength, final byte pad, final CodecPolicy decodingPolicy) { + this.unencodedBlockSize = unencodedBlockSize; + this.encodedBlockSize = encodedBlockSize; + final boolean useChunking = lineLength > 0 && chunkSeparatorLength > 0; + this.lineLength = useChunking ? (lineLength / encodedBlockSize) * encodedBlockSize : 0; + this.chunkSeparatorLength = chunkSeparatorLength; + this.pad = pad; + this.decodingPolicy = decodingPolicy; + } + + /** + * Returns the amount of buffered data available for reading. + * + * @param context the context to be used + * @return The amount of buffered data available for reading. + */ + int available(final Context context) { // package protected for access from I/O streams + return context.buffer != null ? context.pos - context.readPos : 0; + } + + /** + * Tests a given byte array to see if it contains any characters within the + * alphabet or PAD. + * + * Intended for use in checking line-ending arrays + * + * @param arrayOctet byte array to test + * @return {@code true} if any byte is a valid character in the alphabet or PAD; + * {@code false} otherwise + */ + protected boolean containsAlphabetOrPad(final byte[] arrayOctet) { + if (arrayOctet == null) { + return false; + } + for (final byte element : arrayOctet) { + if (pad == element || isInAlphabet(element)) { + return true; + } + } + return false; + } + + /** + * Decodes a byte[] containing characters in the Base-N alphabet. + * + * @param pArray A byte array containing Base-N character data + * @return a byte array containing binary data + */ + public byte[] decode(final byte[] pArray) { + if (pArray == null || pArray.length == 0) { + return pArray; + } + final Context context = new Context(); + decode(pArray, 0, pArray.length, context); + decode(pArray, 0, EOF, context); // Notify decoder of EOF. + final byte[] result = new byte[context.pos]; + readResults(result, 0, result.length, context); + return result; + } + + // package protected for access from I/O streams + abstract void decode(byte[] pArray, int i, int length, Context context); + + /** + * Decodes an Object using the Base-N algorithm. This method is provided in + * order to satisfy the requirements of the Decoder interface, and will throw a + * DecoderException if the supplied object is not of type byte[] or String. + * + * @param obj Object to decode + * @return An object (of type byte[]) containing the binary data which + * corresponds to the byte[] or String supplied. + * @throws DecoderException if the parameter supplied is not of type byte[] + */ + public Object decode(final Object obj) { + if (obj instanceof byte[]) { + return decode((byte[]) obj); + } else if (obj instanceof String) { + return decode((String) obj); + } else { + return null; + } + } + + /** + * Decodes a String containing characters in the Base-N alphabet. + * + * @param pArray A String containing Base-N character data + * @return a byte array containing binary data + */ + public byte[] decode(final String pArray) { + return decode(pArray.getBytes(Charset.forName("UTF-8"))); + } + + /** + * Encodes a byte[] containing binary data, into a byte[] containing characters + * in the alphabet. + * + * @param pArray a byte array containing binary data + * @return A byte array containing only the base N alphabetic character data + */ + public byte[] encode(final byte[] pArray) { + if (pArray == null || pArray.length == 0) { + return pArray; + } + return encode(pArray, 0, pArray.length); + } + + /** + * Encodes a byte[] containing binary data, into a byte[] containing characters + * in the alphabet. + * + * @param pArray a byte array containing binary data + * @param offset initial offset of the subarray. + * @param length length of the subarray. + * @return A byte array containing only the base N alphabetic character data + * @since 1.11 + */ + public byte[] encode(final byte[] pArray, final int offset, final int length) { + if (pArray == null || pArray.length == 0) { + return pArray; + } + final Context context = new Context(); + encode(pArray, offset, length, context); + encode(pArray, offset, EOF, context); // Notify encoder of EOF. + final byte[] buf = new byte[context.pos - context.readPos]; + readResults(buf, 0, buf.length, context); + return buf; + } + + // package protected for access from I/O streams + abstract void encode(byte[] pArray, int i, int length, Context context); + + /** + * Encodes an Object using the Base-N algorithm. This method is provided in + * order to satisfy the requirements of the Encoder interface, and will throw an + * EncoderException if the supplied object is not of type byte[]. + * + * @param obj Object to encode + * @return An object (of type byte[]) containing the Base-N encoded data which + * corresponds to the byte[] supplied. + * @throws EncoderException if the parameter supplied is not of type byte[] + */ + public Object encode(final Object obj) { + return encode((byte[]) obj); + } + + /** + * Encodes a byte[] containing binary data, into a String containing characters + * in the appropriate alphabet. Uses UTF8 encoding. + * + * @param pArray a byte array containing binary data + * @return String containing only character data in the appropriate alphabet. + * @since 1.5 This is a duplicate of {@link #encodeToString(byte[])}; it was + * merged during refactoring. + */ + public String encodeAsString(final byte[] pArray) { + return new String(encode(pArray), Charset.forName("UTF-8")); + } + + /** + * Encodes a byte[] containing binary data, into a String containing characters + * in the Base-N alphabet. Uses UTF8 encoding. + * + * @param pArray a byte array containing binary data + * @return A String containing only Base-N character data + */ + public String encodeToString(final byte[] pArray) { + return new String(encode(pArray), Charset.forName("UTF-8")); + } + + /** + * Ensure that the buffer has room for {@code size} bytes + * + * @param size minimum spare space required + * @param context the context to be used + * @return the buffer + */ + protected byte[] ensureBufferSize(final int size, final Context context) { + if (context.buffer == null) { + context.buffer = new byte[Math.max(size, getDefaultBufferSize())]; + context.pos = 0; + context.readPos = 0; + + // Overflow-conscious: + // x + y > z == x + y - z > 0 + } else if (context.pos + size - context.buffer.length > 0) { + return resizeBuffer(context, context.pos + size); + } + return context.buffer; + } + + /** + * Returns the decoding behavior policy. + * + *

+ * The default is lenient. If the decoding policy is strict, then decoding will + * raise an {@link IllegalArgumentException} if trailing bits are not part of a + * valid encoding. Decoding will compose trailing bits into 8-bit bytes and + * discard the remainder. + *

+ * + * @return true if using strict decoding + * @since 1.15 + */ + public CodecPolicy getCodecPolicy() { + return decodingPolicy; + } + + /** + * Get the default buffer size. Can be overridden. + * + * @return the default buffer size. + */ + protected int getDefaultBufferSize() { + return DEFAULT_BUFFER_SIZE; + } + + /** + * Calculates the amount of space needed to encode the supplied array. + * + * @param pArray byte[] array which will later be encoded + * + * @return amount of space needed to encoded the supplied array. Returns a long + * since a max-len array will require > Integer.MAX_VALUE + */ + public long getEncodedLength(final byte[] pArray) { + // Calculate non-chunked size - rounded up to allow for padding + // cast to long is needed to avoid possibility of overflow + long len = ((pArray.length + unencodedBlockSize - 1) / unencodedBlockSize) * (long) encodedBlockSize; + if (lineLength > 0) { // We're using chunking + // Round up to nearest multiple + len += ((len + lineLength - 1) / lineLength) * chunkSeparatorLength; + } + return len; + } + + /** + * Returns true if this object has buffered data for reading. + * + * @param context the context to be used + * @return true if there is data still available for reading. + */ + boolean hasData(final Context context) { // package protected for access from I/O streams + return context.buffer != null; + } + + /** + * Returns whether or not the {@code octet} is in the current alphabet. Does not + * allow whitespace or pad. + * + * @param value The value to test + * + * @return {@code true} if the value is defined in the current alphabet, + * {@code false} otherwise. + */ + protected abstract boolean isInAlphabet(byte value); + + /** + * Tests a given byte array to see if it contains only valid characters within + * the alphabet. The method optionally treats whitespace and pad as valid. + * + * @param arrayOctet byte array to test + * @param allowWSPad if {@code true}, then whitespace and PAD are also allowed + * + * @return {@code true} if all bytes are valid characters in the alphabet or if + * the byte array is empty; {@code false}, otherwise + */ + public boolean isInAlphabet(final byte[] arrayOctet, final boolean allowWSPad) { + for (final byte octet : arrayOctet) { + if (!isInAlphabet(octet) && (!allowWSPad || (octet != pad) && !isWhiteSpace(octet))) { + return false; + } + } + return true; + } + + /** + * Tests a given String to see if it contains only valid characters within the + * alphabet. The method treats whitespace and PAD as valid. + * + * @param basen String to test + * @return {@code true} if all characters in the String are valid characters in + * the alphabet or if the String is empty; {@code false}, otherwise + * @see #isInAlphabet(byte[], boolean) + */ + public boolean isInAlphabet(final String basen) { + return isInAlphabet(basen.getBytes(Charset.forName("UTF-8")), true); + } + + /** + * Returns true if decoding behavior is strict. Decoding will raise an + * {@link IllegalArgumentException} if trailing bits are not part of a valid + * encoding. + * + *

+ * The default is false for lenient decoding. Decoding will compose trailing + * bits into 8-bit bytes and discard the remainder. + *

+ * + * @return true if using strict decoding + * @since 1.15 + */ + public boolean isStrictDecoding() { + return decodingPolicy == CodecPolicy.STRICT; + } + + /** + * Extracts buffered data into the provided byte[] array, starting at position + * bPos, up to a maximum of bAvail bytes. Returns how many bytes were actually + * extracted. + *

+ * Package protected for access from I/O streams. + * + * @param b byte[] array to extract the buffered data into. + * @param bPos position in byte[] array to start extraction at. + * @param bAvail amount of bytes we're allowed to extract. We may extract fewer + * (if fewer are available). + * @param context the context to be used + * @return The number of bytes successfully extracted into the provided byte[] + * array. + */ + int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) { + if (context.buffer != null) { + final int len = Math.min(available(context), bAvail); + System.arraycopy(context.buffer, context.readPos, b, bPos, len); + context.readPos += len; + if (context.readPos >= context.pos) { + context.buffer = null; // so hasData() will return false, and this method can return -1 + } + return len; + } + return context.eof ? EOF : 0; + } +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/Client.java b/src/main/java/net/lax1dude/eaglercraft/Client.java new file mode 100644 index 0000000..01defbb --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/Client.java @@ -0,0 +1,137 @@ +package net.lax1dude.eaglercraft; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.lwjgl.opengl.GL11; +import org.teavm.jso.JSBody; +import org.teavm.jso.browser.Window; +import org.teavm.jso.core.JSError; +import org.teavm.jso.dom.html.HTMLDocument; +import org.teavm.jso.dom.html.HTMLElement; + +import net.PeytonPlayz585.storage.LocalStorageManager; +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2; +import net.minecraft.client.Minecraft; +import net.minecraft.src.Session; + +public class Client { + private static final String crashImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAABxCAYAAAC9SpSwAAAQtnpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjarZlrkly7jYT/cxVeAt8gl0OAZMTsYJY/H1jdsqQrh+2Y2yXV4/QpPoBEZoIdzv/+zw3/4KemFkNtMvrsPfJTZ5158WbEz896zynW9/x+Svp6l369HuTrTcxcKn7n5+Pon9f0ff37vq/XtHjXfhpo2Ncv9NdfzPo1/vhtoPLTyjJv9tdA82ugkj+/SF8DrM+2Yp9Dft6Cns/r1/c/YeB/8Kcib+wfg/z+uQrR242LJedTUok851I/Cyj+P4eyeJN45hfZ39V35fM8v1ZCQP4Up/jTqsLvWfnx7restPPnpJT+uSNw4ddg9h+vf7wOZP4Y/PBC/DNO7Otd/vX6rfH8vp3v//fuEe49n92t2glp/9rU9xbfO25UQl7e1zoP4X/jvbzH5DEC6DWys6NF5WFppkxabqppp5VuOu/VkrHEmk8WXnO2XN61USTPbCWGlyce6WYps+wyyJ+R3sLV/GMt6c0733SWBhPvxJ05MVj6pD//PY9/OdC9DvmUPJikPr38pOxAZRmeOX/mLhKS7jeO2gvw9+P3H89rIYPthXmwwRX1M4S29IUtx1F5iS7c2Hj9lEWS/TUAIWLuxmJSIQOxp9JST1FylpSI4yA/i4GG14aSgtRa3qwy11I6yRnZ5+Y7kt69ueXPZTiLRLTSi5CaWRa5qhAb+JE6wNBqpdXWWm/SRptt9dJrb7136U5+S4pUadJFZMiUNcqoo40+ZIww5lgzzwI5ttmnzDHnXItJFyMvvr24YS3NWrRq066iQ6cuAz5WrVk3sRFs2tp5lw1P7L5ljz33OukApVNPO/3IGWeedYHaLbfedvuVO+6860fWUvik9S+P/zxr6Ttr+WXKb5QfWeOrIt9DJKeT5jkjYxnFIGOeAQCdPWdxpFpz8NR5zuLMVEXLrLJ5cnbyjJHBelJuN/3I3T8z90veQq3/r7zl78wFT93fkbngqfsXmftr3v6Qte1qY7GElyEvQw9qLJQfN608+Icm/eev4b/9wt8/0In35Clj53MtbQbay3TJha/Pkal9UOin9o2snXLdVJzrX8x6El9Up6p2YeDZ7wV5Y/ZWZzDrsVZAxUREcEtXINlSba6zTUo7DqNNZZ7E0GlIa3OfMnNv2cYao2mOEnZWMnx6MUFcO2kfd3QoZ7IO65tFgligM06VYamjx10GGcZxALBZbupiJbS1j5a+V9tDt/GvGR/r3nEymiW+cplN17qzsLtxyazNKjvJParJP+8Y0tKjru0vjl+vc9j299JPInSpnbbXGwBy3FFMWMZI5Uw7N5pqa6FLzXXavN2aLGB6zMbTnLuwLg3RomLPiV3HgUku87QbJ/vPsqlllauVYKcDOZfiTyyjorvMlm2f3G+8RnHU26nhpTqhsBk7QSEPiSKACKic+QARYJfY662kSbJyz20y4WC4mxqDTLRvdiqn4XOONR0EhnG4or7ZVKSV3SRYHcXIcdzjpK7spLVzqLEac1lnJ7T3trXSAgEbJb917dLbbgUs5cy+0mgiQa2kju+LR8HSIRLpggxyCUvEO5hWkQyq/UJFkMvIOmO9ZkIOtggga2opgLhVd2LLrZ6LMPGFTTjGXQBFsi8/GtWg+xxlaYQtH4WpABhgjToaKW0BWEBqZ7Y9xSprJzQ4EBIz9EBImNHdT7FThzuVx8CT7d25bm06r5Y7TGu4MJT0wm74vCZBJPbp4jZI7ny5A1NsEWq8x86u0RbOxjTLOXgVIZTNDfssWH8lcOSOaDIXN5OAWiFCpBuA4hObzbQJ2jLbnaKdN1H96XZFoVm6BGh3b2Pxslg5TpdBdNiNwEFbnxTSYvEwY1WBMoou0quCj2erCyAMT/EM5c4tk7ITRwOpJb98gV0Il6/gw4jLnqSA/MbVxAVtuan02dhz39d6C8uBxw0yG4qguQ8tE9Jm3Y1NqxiqA4OkzSC7rmOJSQ0FA6+TYqSCZM4bjl1+2TcoQAQQiWK9wts5euIHQkcNIQwogqJEiaVFG6cpl7rXy6vIuAP1VJ0J7yC3G7Xy3XXwnNGTm/CratGOxFJ8InCPUc3crSdDUCmfyZ1XQ+sehTxAakljQkbCHUTrIcSUhXU2v+m72mUcWwqiL5AZaA52YBaWoTnI7dBKVmOjR0gmpWJOfqwuFp8ecJTuAiaiS/ds2PPqVhqkZmQZ+WaTgUZIWTLEjKceUE2bxicDi9PrCi43qCEDowuMjkcOXrnQQKJEIK6tCoeFTmhZy4QzjTXCgQDTOerenNAaalzHI4ziLMR64mnMRN8KDUKviZqL47hkAzKzBUHYxXAcah6yVw88vlPGrWUkoRYzvgP/Oy+sQ8sCA+anbvRz17B+SM51PQdXw43GKZBNupUqE+e2jQRUihD2jXclhnCpS9QJXFkzHQN0SLAHqM6Z5oAqhb1ZdzN3FUtBdFEh+g1CgvNJ+GoQBby22qMXaoqw5IbDD/V5N5g68zUS2+eN+0IxOKFxk+3nahRGavBX1kwG8c3XnRD5Rwevl9IIWg60XPMS7FWOw5BK7W8+34HrNGFs6AKiuTtQRS4vrdHqUrQn6BI1GiVQ29QxSrQoLFKEgG7WfZR9fqSvbnG12rhGw+wutwG7Yc4obQqqysLVUWvMCTq8PduHQAHBtSfM53L44Hv6E3Hg4ClgEmpTLh1lX5fpG8WzzgxbcocKWyeLKH1TYuOKEtn8rAXD3fZW58hbKmZPF/fiRvGJ+EDA5/3xXCeQdAHTdKLU4llYinQGxd8Nwpm44WTUlYzM0BiBYy5q1SGZ4fiizmbQggZEkU2fgzftJR13OLaEeihuGy8a1yCjBjZc24kRECWrCZuCYaaqWK5SO2FNInPp7SbaQSdKr4XngTInYZuQhPL+uvt+RiY197sHtYRmV4Z+J6leOYcN7hy2hdmJ3HCa2Smz45pWgc2nIuUT6UTz6HmxEr65thqqTn43ecYfWJB6pvusxL1EcbVJvdaCaaCCqLlqVBob2cTVzf+HOROZ6PkSnYc4nDdbW1R5r3WjZvKYHi5sh8LGasG7/QMFGGS5HyMh4/g01IU12spNOMlQKLSOJBsNeZhRDBq2Ca6wS+3rvhvwIWp1RAhK6CeQlLMbdxUnvUFoFSCEjq5hHYSFetT4Fc0nOXJeZ6x2n/oPNL9UrJnrMqNHdzlVend/tolGDriXJWAYm+RcstiIk8XO6xL3jmO79BNwILKp0H0GynCHw2Gft4erFLqFg+JUcrEhNDaxoPl89vCTMfxCLwvYu7Ok/vVQDKVgYeFT/Dfliu/FqhYBR3i1ZUxQKoveQhAVycoHW00NemeHVzF5fvVO2ATGplIaUKLrmS6IlNXIwXPhEQJLhtPyksOctOc7PVeveGFurBNcBXkPLJnLMI3SPngyJEqIBlmrhYLYyzuJPPBr0BtWZMC3eCqaUQiFNvJiHRIG5Sz6OfqHXeVspDaxKN9bwONqMTfVbAUVceMH8zZc3jVwCaxhLLKeGMNPG/B9mD6bznYXT4xIYPopEYp8u1+l9pTmoj92nJAQVUuJbLzTQCUIO9saYB2rh33FUdOcQnnUo1dkeF0IvhSM2RCMEp4P37SIK87IDtx4rpNjceB2DCCQEDwm8xwcNrwPZ5F+BlbvZ+iUKGndCyCYpYVwUpYlOp2s6oLGXgZb78N5Zafup1V1Is6VPuu1WVRDnt3GhtwEIcN2swl3R03rwr3jOTdNG6R1n5O9NPzg0/ud5ITrDBeIuLnpXMC+Og/Q7R8luPA1C4sbQdw7pwhJ4liQABaNYRKmBwZ0/4YvXjmgG7sBb8xlN0jQCwmvTHjhw4yPw0ZGsEchK734RqoWcVsULPn1rlAJ69ru2FwNuHczIXJeux54qcA2NHrY0lxeR6Bkb7P749pB0XunMyr1pd614vx1jF3gmOLOFWX1GhOY/uM09wD43swqRZxrtuOIoorpNWlmMNMVZJPHAPXofVEyPfgAmOMg+AkePn7wiF+ODmt7ZYuPw3YDnF1KBUg0Xi6PuOWAn8gdssLzOjTbddueqHPtiDhMTysJVTvNA1bnDYonejAj6fEAgsYlNTDngDDZRaK5modo0JRdvvIQHmH/V76NFt2dAyWApSHTNMjcKJWVOSWFpuiMa1k3P2RB2jAqQ2DlgssUsASTYRZ3Nu/wsBxEFV+DVLUBj2IP8Z5lhEML/XBh8fXPM2HDvH1GN+4krwRoAdbsfPZO2WkycKDChN40J9wiYk0LwRLhgyOVBG9kBmntrMzQtVgRlaW9REcw5YO2YAc+PZxC4cttFyigJwh4KGI9xTkKDp6XIeGSwjS5K5bfT7kSfQglvDZ9pzCsxgqQysRl5EnJE2eK1k0QqtH+DSMeVJE0Z0KcjsdiFUV01TsinsN0MmeWnDo4XN7HDe8NvUEin+4QsFKUA02X293xBIuUj5Kun3O/1n1D/gN+IH6wJyPSqy7NsE3OTn14xNYoqwZ+/ESBRtAgEqz+PYOdT6KKGPspRUD8Bshj0bTMluEwgtGxl158e08/KLm0ITgFmhTgMG+rNICG7uNvsQk4MmoeHOHCqhFm2hBGY4HtyEe/5dElQJfh6MOtdAoMLLjppIvGmyJLfr78VkQzd8gpJVCQNkoP64jBwznSiqsfeOIX8B74EUQeaoFIWTEstV4vTDOGHQh92XQS8aaXqhx+lKXkkShCYpimC5N6t3fBGETtWe3s3Q8mqF2ak4NFKjN4Xlitx571mru5Nb271cL4F5iyYD8qEidIKAqFhsgu6k4m0BznhqkW8Jcld6GIbHnVwjjdMD5IS8EBDRejTmvvUMM/k0L2Qsil9kd2uI0Kn/Xg1cDOlcjSs0PHNRr0QKzxiGPhI1FJPx6dyc2EL2awLcKOTPixghGwjYdEDUQxA6Wiu62MMUgVvouX1q8f1A03jEx6HCUIip8OY/KgrARQAVrbADc4wg6qh8yiQXCyHyusipfJljJU54koJTZfG7J1SCqmFRkg+Xt6tSeKd2G0WCXRYmgWMhD8RABpAJ2GQJQSDoLdhe5Y+/BjSHx4MUgCZqKxYXr3RQFCzB+yYe90qd3PEJEhP/zFmFLyaCnvWuJuqET84A+6O9WJaNDcQ1l9WsDLGGaGrn/7qWAmngb7l4+N1te44P38EBk/SI/FvntzlgL04qfJpIAbQ8emODPjRtJEjpA0erPKenW8v86hJ6D8xzmt/w2odn/ClBI6NoT1ySmgy7dxlzcEP91ObRjLJrXIEf4yAZtJC71sNbgAoHdcVHdf1RcdxA1YL2/DIC7aBqrAOnLrR/XJkQi1OpfNzDfdjoEQPN3BCezs1AsY/IQVyQmV9orsT8yf/3HU/BO9Y4I9GIwGiYL2Y2B6H/WWEUR5awuPszBvaYr/daJL8NOHCQrdHuF6EadM9yfU2hp0hKy60KdTfMSK1g+w4QUajQkyDWpaxt3glWfAkk0ylLxeBw4isbTkHRI9ZYMxZcJg6SMJ5gaT5tvTNegyS+0oPxaymQZECg+qa0HX9dI6M/Eq8C0+kWD4oYafVHrcticUeio06LAhyMOLXBjX5SewUOQLeMRBHw/Nt/SOX18Oc0yuNRmX43iPBam3TosB1vG96acj9PDjLP23V8OwMW4rER1BD+iK4vKDk11fK1l68WOfsRs6ktd6f6YvxGxi4djsB3OsxTHy3/w9IfwNf8n440BILET+f7LnjZBrgBfeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw1AUhU9TRZGKg0GKOGSoThZERRylikWwUNoKrTqYvPQPmjQkKS6OgmvBwZ/FqoOLs64OroIg+APi6OSk6CIl3pcUWsR44fE+zrvn8N59gNCoMM3qmgA03TZT8ZiUza1KPa8IIIwhCBBlZhmJ9GIGvvV1T91Ud1Ge5d/3Z/WreYsBAYl4jhmmTbxBPLNpG5z3iUVWklXic+Jxky5I/Mh1xeM3zkWXBZ4pmpnUPLFILBU7WOlgVjI14mniiKrplC9kPVY5b3HWKjXWuid/YSivr6S5TmsEcSwhgSQkKKihjApsRGnXSbGQovOYj3/Y9SfJpZCrDEaOBVShQXb94H/we7ZWYWrSSwrFgO4Xx/kYBXp2gWbdcb6PHad5AgSfgSu97a82gNlP0uttLXIEDGwDF9dtTdkDLneA8JMhm7IrBWkJhQLwfkbflAMGb4G+NW9urXOcPgAZmtXyDXBwCIwVKXvd5929nXP7t6c1vx8743KRRjbQVgAADfdpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6NDJlMTU3MGEtNmMyZS00Y2E1LWI3ZTMtOGI4ODI1MmMwZDMwIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1NGY3N2UwLTc4NmEtNGFlZS1iYjhmLWNhYTBiZGNiYzE3MSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmNmMWYyMjUxLWIwY2QtNDE1NS1hMjAyLTExNGI0ZGM2MmFhNSIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IldpbmRvd3MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNjQzMDYxODUwNDk0OTc0IgogICBHSU1QOlZlcnNpb249IjIuMTAuMjQiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODUyMGQ4YTMtMWRhZC00ZjIwLWFjOTktODg4OTJkZDExNDQ0IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKFdpbmRvd3MpIgogICAgICBzdEV2dDp3aGVuPSIyMDIxLTEyLTE3VDE3OjIyOjQ4Ii8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJkY2U5N2M4LTBkZjItNGQzNi1iMzE1LWE0YjdmMmUyMjJiNSIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0wMS0yNFQxNDowNDoxMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz61xwk6AAAABmJLR0QAnQCdAJ2roJyEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5gEYFgQKOBb3JwAAIABJREFUeNrtvXl0lFWePv7UvlelKvu+koSQRQiyBJGISEB0hFYZwW1sp4/2csaZ1jlz5sz80cc5c7rnaI8zju2o09qiIrKowEGURXYI+5IASQjZl0plT2rff3/073O/byVVlUQSRPs+5+QkkMpbb9333ud+lufzuaJgMBgEBwcHxw8UYj4EHBwcnMQ4ODg4OIlxcHBwcBLj4ODgJMbBwcHBSYyDg4ODkxgHBwcHJzEODg5OYhwcHBycxDg4ODg4iXFw/GWAqgHHfv+ufyv8+q7XvVMh4rWTHBwc3BLj4ODg4CTGwcHBwUmMg4ODkxgHBwcHJzEODg4OTmIcHBwcnMQ4ODg4iXFwcHBwEuPg4ODgJMbBwcHBSYyDg+NHBCkfAo6/ZAiLov1+P3w+H/x+P/x+P4LBIDQaDWQyGR+oSYyjSCSK+G9OYhwctwiHw4Guri44HA54vV74fD72FQgE4Pf74Xa74XA44Ha74Xa7EQgEsGrVKqSnp9+2BTlT5EJETT+PJZxgMAixWMx+FwgEIBb/2VGjn4W/o78P9/qxPSXo2pFez0mMg2MSC7mrqwt/+MMfYDabYbfb4XQ64XQ64XA42HeHw4HBwUFIJBJIJBLExMRg4cKFSEtL+0GSmJAwxsLn80EqlSIQCIRYomKxGD6fD2KxGH6/n31un88HiUQCv98fcm26Pr2H0LIlkhLeg/B3RIbCa30XS46TGMePHn6/HxaLBVu2bIFcLg9ZXLRQpFIpDAYDDAYDW0RyufwHRV7ChU9kQeQhtHyInLxeL7OwyFoS/o7caCI1+k7XlEgkjIiEJOXz+SASiSCVStl9SKX/j2pE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"; + + public static class AbortedLaunchException extends RuntimeException { + // yee + } + + public static HTMLElement rootElement = null; + public static Minecraft instance = null; + public static void main(String[] args) { + registerErrorHandler(); + String[] e = getOpts(); + try { + try { + EaglerAdapterImpl2.initializeContext(rootElement = Window.current().getDocument().getElementById(e[0]), e[1]); + }catch(AbortedLaunchException ex) { + return; + } + }catch(Throwable ex2) { + StringWriter s = new StringWriter(); + ex2.printStackTrace(new PrintWriter(s)); + return; + } + run0(); + } + + private static void run0() { + System.out.println(" -------- starting minecraft -------- "); + instance = new Minecraft(); + instance.field_6320_i = new Session("Player"); + LocalStorageManager.loadStorage(); + run1(); + } + + private static void run1() { + GL11.canvas.focus(); + GL11.canvasBack.focus(); + instance.run(); + } + + @JSBody(params = { }, script = "return window.classicConfig;") + public static native String[] getOpts(); + + @JSBody(params = { }, script = "window.minecraftError = null; window.onerror = function(message, file, line, column, errorObj) { if(errorObj) { window.minecraftError = errorObj; window.minecraftErrorL = \"\"+line+\":\"+column; javaMethods.get(\"net.lax1dude.eaglercraft.Client.handleNativeError()V\").invoke(); } else { alert(\"a native browser exception was thrown but your browser does not support fith argument in onerror\"); } };") + public static native void registerErrorHandler(); + + @JSBody(params = { }, script = "return window.minecraftError;") + public static native JSError getWindowError(); + + @JSBody(params = { }, script = "return window.minecraftErrorL;") + public static native String getWindowErrorL(); + + public static void handleNativeError() { + JSError e = getWindowError(); + StringBuilder str = new StringBuilder(); + str.append("Native Browser Exception\n"); + str.append("----------------------------------\n"); + str.append(" Line: ").append(getWindowErrorL()).append('\n'); + str.append(" Type: ").append(e.getName()).append('\n'); + str.append(" Message: ").append(e.getMessage()).append('\n'); + str.append("----------------------------------\n\n"); + str.append(e.getStack()).append('\n'); + } + + private static boolean isCrashed = false; + + public static void showDatabaseLockedScreen(String msg) { + String s = rootElement.getAttribute("style"); + rootElement.setAttribute("style", (s == null ? "" : s) + "position:relative;"); + HTMLDocument doc = Window.current().getDocument(); + HTMLElement img = doc.createElement("img"); + HTMLElement div = doc.createElement("div"); + img.setAttribute("style", "z-index:100;position:absolute;top:10px;left:calc(50% - 151px);"); + img.setAttribute("src", crashImage); + div.setAttribute("style", "z-index:100;position:absolute;top:135px;left:10%;right:10%;bottom:30px;background-color:white;border:1px solid #cccccc;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font: 24px sans-serif;padding:10px;"); + rootElement.appendChild(img); + rootElement.appendChild(div); + div.appendChild(doc.createTextNode(msg)); + } + + @JSBody(params = { "v" }, script = "try { return \"\"+window[v]; } catch(e) { return \"\"; }") + private static native String getString(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.navigator[v]; } catch(e) { return \"\"; }") + private static native String getStringNav(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.screen[v]; } catch(e) { return \"\"; }") + private static native String getStringScreen(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.location[v]; } catch(e) { return \"\"; }") + private static native String getStringLocation(String var); + + @JSBody(params = { }, script = "for(var i = 0; i < window.minecraftOpts.length; ++i) { if(window.minecraftOpts[i].length > 2048) window.minecraftOpts[i] = \"[\" + Math.floor(window.minecraftOpts[i].length * 0.001) + \"k characters]\"; }") + private static native void shortenMinecraftOpts(); + + private static void addDebug(StringBuilder str, String var) { + str.append("window.").append(var).append(" = ").append(getString(var)).append('\n'); + } + + private static void addDebugNav(StringBuilder str, String var) { + str.append("window.navigator.").append(var).append(" = ").append(getStringNav(var)).append('\n'); + } + + private static void addDebugScreen(StringBuilder str, String var) { + str.append("window.screen.").append(var).append(" = ").append(getStringScreen(var)).append('\n'); + } + + private static void addDebugLocation(StringBuilder str, String var) { + str.append("window.location.").append(var).append(" = ").append(getStringLocation(var)).append('\n'); + } + + private static void addArray(StringBuilder str, String var) { + str.append("window.").append(var).append(" = ").append(getArray(var)).append('\n'); + } + + @JSBody(params = { "v" }, script = "try { return (typeof window[v] !== \"undefined\") ? JSON.stringify(window[v]) : \"[\\\"\\\"]\"; } catch(e) { return \"[\\\"\\\"]\"; }") + private static native String getArray(String var); + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java b/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java new file mode 100644 index 0000000..a96c393 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java @@ -0,0 +1,43 @@ +package net.lax1dude.eaglercraft; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class EaglerImage { + + public final int[] data; + public final int w; + public final int h; + public final boolean alpha; + + public EaglerImage(int pw, int ph, boolean palpha) { + this.w = pw; + this.h = ph; + this.alpha = palpha; + this.data = new int[pw * ph]; + } + + public EaglerImage(int[] pdata, int pw, int ph, boolean palpha) { + if (pdata.length != pw * ph) { + throw new IllegalArgumentException("array size does not equal image size"); + } + this.w = pw; + this.h = ph; + this.alpha = palpha; + if (!palpha) { + for (int i = 0; i < pdata.length; ++i) { + pdata[i] = pdata[i] | 0xFF000000; + } + } + this.data = pdata; + } + + public EaglerImage getSubImage(int x, int y, int pw, int ph) { + int[] img = new int[pw * ph]; + for (int i = 0; i < ph; ++i) { + System.arraycopy(data, (i + y) * this.w + x, img, i * pw, pw); + } + return new EaglerImage(img, pw, ph, alpha); + } + +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java b/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java new file mode 100644 index 0000000..0352944 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java @@ -0,0 +1,60 @@ +package net.lax1dude.eaglercraft; + +import java.nio.*; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +public class GLAllocation { + + public GLAllocation() { + } + + public static synchronized int generateDisplayLists(int i) { + int j = GL11.glGenLists(i); + displayLists.add(Integer.valueOf(j)); + displayLists.add(Integer.valueOf(i)); + return j; + } + + public static synchronized void generateTextureNames(IntBuffer intbuffer) { + + for (int i = intbuffer.position(); i < intbuffer.limit(); i++) { + int tx = GL11.glGenTextures(); + intbuffer.put(i, tx); + textureNames.add(Integer.valueOf(tx)); + } + + } + + public static synchronized void deleteTexturesAndDisplayLists() { + for (int i = 0; i < displayLists.size(); i += 2) { + GL11.glDeleteLists(((Integer) displayLists.get(i)).intValue(), + ((Integer) displayLists.get(i + 1)).intValue()); + } + + for (int j = 0; j < textureNames.size(); j++) { + GL11.glDeleteTextures(((Integer) textureNames.get(j)).intValue()); + } + + displayLists.clear(); + textureNames.clear(); + } + + public static ByteBuffer createDirectByteBuffer(int par0) { + return GL11.isWebGL ? ByteBuffer.wrap(new byte[par0]).order(ByteOrder.nativeOrder()) : ByteBuffer.allocateDirect(par0).order(ByteOrder.nativeOrder()); + } + + public static IntBuffer createDirectIntBuffer(int par0) { + return GL11.isWebGL ? IntBuffer.wrap(new int[par0]) : createDirectByteBuffer(par0 << 2).asIntBuffer(); + } + + public static FloatBuffer createDirectFloatBuffer(int par0) { + return GL11.isWebGL ? FloatBuffer.wrap(new float[par0]) : createDirectByteBuffer(par0 << 2).asFloatBuffer(); + } + + private static List displayLists = new ArrayList(); + private static List textureNames = new ArrayList(); + +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java b/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java new file mode 100644 index 0000000..079352d --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java @@ -0,0 +1,108 @@ +package net.lax1dude.eaglercraft; + +/** + * base implementation of MD4 family style digest as outlined in "Handbook of + * Applied Cryptography", pages 344 - 347. + */ +public abstract class GeneralDigest { + private byte[] xBuf; + private int xBufOff; + + private long byteCount; + + /** + * Standard constructor + */ + protected GeneralDigest() { + xBuf = new byte[4]; + xBufOff = 0; + } + + /** + * Copy constructor. We are using copy constructors in place of the + * Object.clone() interface as this interface is not supported by J2ME. + */ + protected GeneralDigest(GeneralDigest t) { + xBuf = new byte[t.xBuf.length]; + System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length); + + xBufOff = t.xBufOff; + byteCount = t.byteCount; + } + + public void update(byte in) { + xBuf[xBufOff++] = in; + + if (xBufOff == xBuf.length) { + processWord(xBuf, 0); + xBufOff = 0; + } + + byteCount++; + } + + public void update(byte[] in, int inOff, int len) { + // + // fill the current word + // + while ((xBufOff != 0) && (len > 0)) { + update(in[inOff]); + + inOff++; + len--; + } + + // + // process whole words. + // + while (len > xBuf.length) { + processWord(in, inOff); + + inOff += xBuf.length; + len -= xBuf.length; + byteCount += xBuf.length; + } + + // + // load in the remainder. + // + while (len > 0) { + update(in[inOff]); + + inOff++; + len--; + } + } + + public void finish() { + long bitLength = (byteCount << 3); + + // + // add the pad bytes. + // + update((byte) 128); + + while (xBufOff != 0) { + update((byte) 0); + } + + processLength(bitLength); + + processBlock(); + } + + public void reset() { + byteCount = 0; + + xBufOff = 0; + for (int i = 0; i < xBuf.length; i++) { + xBuf[i] = 0; + } + } + + protected abstract void processWord(byte[] in, int inOff); + + protected abstract void processLength(long bitLength); + + protected abstract void processBlock(); +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java b/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java new file mode 100644 index 0000000..9ba1d4d --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java @@ -0,0 +1,213 @@ +package net.lax1dude.eaglercraft; + +/** + * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", + * pages 346 - 349. + * + * It is interesting to ponder why the, apart from the extra IV, the other + * difference here from MD5 is the "endienness" of the word processing! + */ +public class SHA1Digest extends GeneralDigest { + private static final int DIGEST_LENGTH = 20; + + private int H1, H2, H3, H4, H5; + + private int[] X = new int[80]; + private int xOff; + + /** + * Standard constructor + */ + public SHA1Digest() { + reset(); + } + + /** + * Copy constructor. This will copy the state of the provided message digest. + */ + public SHA1Digest(SHA1Digest t) { + super(t); + + H1 = t.H1; + H2 = t.H2; + H3 = t.H3; + H4 = t.H4; + H5 = t.H5; + + System.arraycopy(t.X, 0, X, 0, t.X.length); + xOff = t.xOff; + } + + public String getAlgorithmName() { + return "SHA-1"; + } + + public int getDigestSize() { + return DIGEST_LENGTH; + } + + protected void processWord(byte[] in, int inOff) { + X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16) | ((in[inOff + 2] & 0xff) << 8) + | ((in[inOff + 3] & 0xff)); + + if (xOff == 16) { + processBlock(); + } + } + + private void unpackWord(int word, byte[] out, int outOff) { + out[outOff] = (byte) (word >>> 24); + out[outOff + 1] = (byte) (word >>> 16); + out[outOff + 2] = (byte) (word >>> 8); + out[outOff + 3] = (byte) word; + } + + protected void processLength(long bitLength) { + if (xOff > 14) { + processBlock(); + } + + X[14] = (int) (bitLength >>> 32); + X[15] = (int) (bitLength & 0xffffffff); + } + + public int doFinal(byte[] out, int outOff) { + finish(); + + unpackWord(H1, out, outOff); + unpackWord(H2, out, outOff + 4); + unpackWord(H3, out, outOff + 8); + unpackWord(H4, out, outOff + 12); + unpackWord(H5, out, outOff + 16); + + reset(); + + return DIGEST_LENGTH; + } + + /** + * reset the chaining variables + */ + public void reset() { + super.reset(); + + H1 = 0x67452301; + H2 = 0xefcdab89; + H3 = 0x98badcfe; + H4 = 0x10325476; + H5 = 0xc3d2e1f0; + + xOff = 0; + for (int i = 0; i != X.length; i++) { + X[i] = 0; + } + } + + // + // Additive constants + // + private static final int Y1 = 0x5a827999; + private static final int Y2 = 0x6ed9eba1; + private static final int Y3 = 0x8f1bbcdc; + private static final int Y4 = 0xca62c1d6; + + private int f(int u, int v, int w) { + return ((u & v) | ((~u) & w)); + } + + private int h(int u, int v, int w) { + return (u ^ v ^ w); + } + + private int g(int u, int v, int w) { + return ((u & v) | (u & w) | (v & w)); + } + + private int rotateLeft(int x, int n) { + return (x << n) | (x >>> (32 - n)); + } + + protected void processBlock() { + // + // expand 16 word block into 80 word block. + // + for (int i = 16; i <= 79; i++) { + X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1); + } + + // + // set up working variables. + // + int A = H1; + int B = H2; + int C = H3; + int D = H4; + int E = H5; + + // + // round 1 + // + for (int j = 0; j <= 19; j++) { + int t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 2 + // + for (int j = 20; j <= 39; j++) { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 3 + // + for (int j = 40; j <= 59; j++) { + int t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 4 + // + for (int j = 60; j <= 79; j++) { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + H1 += A; + H2 += B; + H3 += C; + H4 += D; + H5 += E; + + // + // reset the offset and clean out the word buffer. + // + xOff = 0; + for (int i = 0; i != X.length; i++) { + X[i] = 0; + } + } +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java b/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java new file mode 100644 index 0000000..4da020c --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java @@ -0,0 +1,1843 @@ +package net.lax1dude.eaglercraft.adapter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.charset.Charset; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; + +import org.teavm.interop.Async; +import org.teavm.interop.AsyncCallback; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSFunctor; +import org.teavm.jso.JSObject; +import org.teavm.jso.ajax.ReadyStateChangeHandler; +import org.teavm.jso.ajax.XMLHttpRequest; +import org.teavm.jso.browser.TimerHandler; +import org.teavm.jso.browser.Window; +import org.teavm.jso.canvas.CanvasRenderingContext2D; +import org.teavm.jso.canvas.ImageData; +import org.teavm.jso.dom.events.Event; +import org.teavm.jso.dom.events.EventListener; +import org.teavm.jso.dom.events.KeyboardEvent; +import org.teavm.jso.dom.events.MessageEvent; +import org.teavm.jso.dom.events.MouseEvent; +import org.teavm.jso.dom.events.WheelEvent; +import org.teavm.jso.dom.html.HTMLCanvasElement; +import org.teavm.jso.dom.html.HTMLDocument; +import org.teavm.jso.dom.html.HTMLElement; +import org.teavm.jso.dom.html.HTMLImageElement; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Float32Array; +import org.teavm.jso.typedarrays.Int32Array; +import org.teavm.jso.typedarrays.Uint8Array; +import org.teavm.jso.typedarrays.Uint8ClampedArray; +import org.teavm.jso.webaudio.AudioBuffer; +import org.teavm.jso.webaudio.AudioBufferSourceNode; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.AudioListener; +import org.teavm.jso.webaudio.DecodeErrorCallback; +import org.teavm.jso.webaudio.DecodeSuccessCallback; +import org.teavm.jso.webaudio.GainNode; +import org.teavm.jso.webaudio.MediaEvent; +import org.teavm.jso.webaudio.PannerNode; +import org.teavm.jso.webgl.WebGLBuffer; +import org.teavm.jso.webgl.WebGLFramebuffer; +import org.teavm.jso.webgl.WebGLProgram; +import org.teavm.jso.webgl.WebGLRenderbuffer; +import org.teavm.jso.webgl.WebGLShader; +import org.teavm.jso.webgl.WebGLTexture; +import org.teavm.jso.webgl.WebGLUniformLocation; +import org.teavm.jso.websocket.CloseEvent; +import org.teavm.jso.websocket.WebSocket; + +import net.lax1dude.eaglercraft.adapter.teavm.WebGLQuery; +import net.lax1dude.eaglercraft.adapter.teavm.WebGLVertexArray; +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.storage.LocalStorageManager; +import net.lax1dude.eaglercraft.AssetRepository; +import net.lax1dude.eaglercraft.Base64; +import net.lax1dude.eaglercraft.Client; +import net.lax1dude.eaglercraft.EaglerImage; +import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem; +import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem.OpenState; +import net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext; +import static net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext.*; + +public class EaglerAdapterImpl2 { + + public static final boolean _wisWebGL() { + return true; + } + private static boolean isAnisotropicPatched = false; + public static final boolean _wisAnisotropicPatched() { + return isAnisotropicPatched; + } + public static final String _wgetShaderHeader() { + return "#version 300 es"; + } + + @JSBody(params = { }, script = "return window.location.href;") + private static native String getLocationString(); + + public static final boolean isSSLPage() { + return getLocationString().startsWith("https"); + } + + public static final InputStream loadResource(String path) { + byte[] file = loadResourceBytes(path); + if (file != null) { + return new ByteArrayInputStream(file); + } else { + return null; + } + } + + public static final byte[] loadResourceBytes(String path) { + return AssetRepository.getResource(path); + } + + public static final String fileContents(String path) { + byte[] contents = loadResourceBytes(path); + if(contents == null) { + return null; + }else { + return new String(contents, Charset.forName("UTF-8")); + } + } + + public static void onWindowUnload() { + LocalStorageManager.saveStorageG(); + LocalStorageManager.saveStorageP(); + } + + @JSBody(params = { }, script = "window.onbeforeunload = function(){javaMethods.get('net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.onWindowUnload()V').invoke();return false;};") + private static native void onBeforeCloseRegister(); + + public static final String[] fileContentsLines(String path) { + String contents = fileContents(path); + if(contents == null) { + return null; + }else { + return contents.replace("\r\n", "\n").split("[\r\n]"); + } + } + + @Async + public static native String downloadAssetPack(String assetPackageURI); + + private static void downloadAssetPack(String assetPackageURI, final AsyncCallback cb) { + final XMLHttpRequest request = XMLHttpRequest.create(); + request.setResponseType("arraybuffer"); + request.open("GET", assetPackageURI, true); + request.setOnReadyStateChange(new ReadyStateChangeHandler() { + public void stateChanged() { + if(request.getReadyState() == XMLHttpRequest.DONE) { + Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse()); + loadedPackage = new byte[bl.getByteLength()]; + for(int i = 0; i < loadedPackage.length; ++i) { + loadedPackage[i] = (byte) bl.get(i); + } + cb.complete("yee"); + } + } + }); + request.send(); + } + + @JSBody(params = { "obj" }, script = "window.currentContext = obj;") + private static native int setContextVar(JSObject obj); + + @JSBody(params = { "v", "s" }, script = "window[v] = s;") + public static native void setDebugVar(String v, String s); + + @JSBody(params = { }, script = "if(window.navigator.userActivation){return window.navigator.userActivation.hasBeenActive;}else{return false;}") + public static native boolean hasBeenActive(); + + public static HTMLDocument doc = null; + public static HTMLElement parent = null; + public static HTMLCanvasElement canvas = null; + public static CanvasRenderingContext2D canvasContext = null; + public static HTMLCanvasElement canvasBack = null; + public static WebGL2RenderingContext webgl = null; + public static Window win = null; + private static byte[] loadedPackage = null; + private static EventListener contextmenu = null; + private static EventListener mousedown = null; + private static EventListener mouseup = null; + private static EventListener mousemove = null; + private static EventListener keydown = null; + private static EventListener keyup = null; + private static EventListener keypress = null; + private static EventListener wheel = null; + private static String[] identifier = new String[0]; + + public static final String[] getIdentifier() { + return identifier; + } + + @JSBody(params = { }, script = "return window.navigator.userAgent;") + private static native String getUA(); + + @JSBody(params = { }, script = "return window.navigator.platform;") + private static native String getPlaf(); + + @JSBody(params = { "m" }, script = "return m.offsetX;") + private static native int getOffsetX(MouseEvent m); + + @JSBody(params = { "m" }, script = "return m.offsetY;") + private static native int getOffsetY(MouseEvent m); + + @JSBody(params = { "e" }, script = "return e.which;") + private static native int getWhich(KeyboardEvent e); + + public static final void initializeContext(HTMLElement rootElement, String assetPackageURI) { + parent = rootElement; + String s = parent.getAttribute("style"); + parent.setAttribute("style", (s == null ? "" : s)+"overflow-x:hidden;overflow-y:hidden;"); + win = Window.current(); + doc = win.getDocument(); + canvas = (HTMLCanvasElement)doc.createElement("canvas"); + width = rootElement.getClientWidth(); + height = rootElement.getClientHeight(); + canvas.setWidth(width); + canvas.setHeight(height); + canvasContext = (CanvasRenderingContext2D) canvas.getContext("2d"); + canvas.setAttribute("id", "deevis589723589"); + rootElement.appendChild(canvas); + canvasBack = (HTMLCanvasElement)doc.createElement("canvas"); + canvasBack.setWidth(width); + canvasBack.setHeight(height); + webgl = (WebGL2RenderingContext) canvasBack.getContext("webgl2", youEagler()); + if(webgl == null) { + throw new RuntimeException("WebGL 2.0 is not supported in your browser ("+getUA()+")"); + } + setContextVar(webgl); + + webgl.getExtension("EXT_texture_filter_anisotropic"); + + win.addEventListener("contextmenu", contextmenu = new EventListener() { + public void handleEvent(MouseEvent evt) { + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("mousedown", mousedown = new EventListener() { + public void handleEvent(MouseEvent evt) { + int b = evt.getButton(); + buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = true; + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + forceMouseGrabbed(); + } + }); + canvas.addEventListener("mouseup", mouseup = new EventListener() { + public void handleEvent(MouseEvent evt) { + int b = evt.getButton(); + buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = false; + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("mousemove", mousemove = new EventListener() { + public void handleEvent(MouseEvent evt) { + mouseX = getOffsetX(evt); + mouseY = canvas.getClientHeight() - getOffsetY(evt); + mouseDX += evt.getMovementX(); + mouseDY += -evt.getMovementY(); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("keydown", keydown = new EventListener() { + public void handleEvent(KeyboardEvent evt) { + //keyStates[remapKey(evt.getKeyCode())] = true; + keyStates[remapKey(getWhich(evt))] = true; + keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + forceMouseGrabbed(); + } + }); + win.addEventListener("keyup", keyup = new EventListener() { + public void handleEvent(KeyboardEvent evt) { + //keyStates[remapKey(evt.getKeyCode())] = false; + keyStates[remapKey(getWhich(evt))] = false; + keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("keypress", keypress = new EventListener() { + public void handleEvent(KeyboardEvent evt) { + if(enableRepeatEvents && evt.isRepeat()) keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("wheel", wheel = new EventListener() { + public void handleEvent(WheelEvent evt) { + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("blur", new EventListener() { + public void handleEvent(WheelEvent evt) { + isWindowFocused = false; + } + }); + win.addEventListener("focus", new EventListener() { + public void handleEvent(WheelEvent evt) { + isWindowFocused = true; + forceMouseGrabbed(); + } + }); + onBeforeCloseRegister(); + initFileChooser(); + + OpenState st = IndexedDBFilesystem.initialize(); + if(st != OpenState.OPENED) { + if(st == OpenState.LOCKED) { + Client.showDatabaseLockedScreen("\nError: World folder is locked!\n\nYou are already playing Eaglercraft in a different tab.\nClose all other Eaglercraft tabs and reload"); + }else { + Client.showDatabaseLockedScreen("\nError: World folder could not be loaded!\n\n" + IndexedDBFilesystem.errorDetail()); + } + throw new Client.AbortedLaunchException(); + } + + downloadAssetPack(assetPackageURI); + + try { + AssetRepository.install(loadedPackage); + } catch (IOException e) { + e.printStackTrace(); + } + + audioctx = AudioContext.create(); + + mouseEvents.clear(); + keyEvents.clear(); + } + + @JSBody(params = { }, script = + "window.eagsFileChooser = {\r\n" + + "inputElement: null,\r\n" + + "openFileChooser: function(ext, mime){\r\n" + + "var el = window.eagsFileChooser.inputElement = document.createElement(\"input\");\r\n" + + "el.type = \"file\";\r\n" + + "el.multiple = false;\r\n" + + "el.addEventListener(\"change\", function(evt){\r\n" + + "var f = window.eagsFileChooser.inputElement.files;\r\n" + + "if(f.length == 0){\r\n" + + "window.eagsFileChooser.getFileChooserResult = null;\r\n" + + "}else{\r\n" + + "(async function(){\r\n" + + "window.eagsFileChooser.getFileChooserResult = await f[0].arrayBuffer();\r\n" + + "window.eagsFileChooser.getFileChooserResultName = f[0].name;\r\n" + + "})();\r\n" + + "}\r\n" + + "});\r\n" + + "window.eagsFileChooser.getFileChooserResult = null;\r\n" + + "window.eagsFileChooser.getFileChooserResultName = null;\r\n" + + "el.accept = mime;\r\n" + + "el.click();\r\n" + + "},\r\n" + + "getFileChooserResult: null,\r\n" + + "getFileChooserResultName: null\r\n" + + "};") + private static native void initFileChooser(); + + public static final void destroyContext() { + + } + + public static final void removeEventHandlers() { + win.removeEventListener("contextmenu", contextmenu); + win.removeEventListener("mousedown", mousedown); + win.removeEventListener("mouseup", mouseup); + win.removeEventListener("mousemove", mousemove); + win.removeEventListener("keydown", keydown); + win.removeEventListener("keyup", keyup); + win.removeEventListener("keypress", keypress); + win.removeEventListener("wheel", wheel); + } + + private static LinkedList mouseEvents = new LinkedList(); + private static LinkedList keyEvents = new LinkedList(); + + private static int mouseX = 0; + private static int mouseY = 0; + private static double mouseDX = 0.0D; + private static double mouseDY = 0.0D; + private static int width = 0; + private static int height = 0; + private static boolean enableRepeatEvents = false; + private static boolean isWindowFocused = true; + + @JSBody(params = { }, script = "return {antialias: false, depth: true, powerPreference: \"high-performance\", desynchronized: false, preserveDrawingBuffer: false, premultipliedAlpha: false, alpha: false};") + public static native JSObject youEagler(); + + public static final int _wGL_TEXTURE_2D = TEXTURE_2D; + public static final int _wGL_DEPTH_TEST = DEPTH_TEST; + public static final int _wGL_LEQUAL = LEQUAL; + public static final int _wGL_GEQUAL = GEQUAL; + public static final int _wGL_GREATER = GREATER; + public static final int _wGL_LESS = LESS; + public static final int _wGL_BACK = BACK; + public static final int _wGL_FRONT = FRONT; + public static final int _wGL_FRONT_AND_BACK = FRONT_AND_BACK; + public static final int _wGL_COLOR_BUFFER_BIT = COLOR_BUFFER_BIT; + public static final int _wGL_DEPTH_BUFFER_BIT = DEPTH_BUFFER_BIT; + public static final int _wGL_BLEND = BLEND; + public static final int _wGL_RGBA = RGBA; + public static final int _wGL_RGB = RGB; + public static final int _wGL_RGB8 = RGB8; + public static final int _wGL_RGBA8 = RGBA8; + public static final int _wGL_UNSIGNED_BYTE = UNSIGNED_BYTE; + public static final int _wGL_UNSIGNED_SHORT = UNSIGNED_SHORT; + public static final int _wGL_SRC_ALPHA = SRC_ALPHA; + public static final int _wGL_ONE_MINUS_SRC_ALPHA = ONE_MINUS_SRC_ALPHA; + public static final int _wGL_ONE_MINUS_DST_COLOR = ONE_MINUS_DST_COLOR; + public static final int _wGL_ONE_MINUS_SRC_COLOR = ONE_MINUS_SRC_COLOR; + public static final int _wGL_ZERO = ZERO; + public static final int _wGL_CULL_FACE = CULL_FACE; + public static final int _wGL_TEXTURE_MIN_FILTER = TEXTURE_MIN_FILTER; + public static final int _wGL_TEXTURE_MAG_FILTER = TEXTURE_MAG_FILTER; + public static final int _wGL_LINEAR = LINEAR; + public static final int _wGL_EQUAL = EQUAL; + public static final int _wGL_SRC_COLOR = SRC_COLOR; + public static final int _wGL_ONE = ONE; + public static final int _wGL_NEAREST = NEAREST; + public static final int _wGL_CLAMP = CLAMP_TO_EDGE; + public static final int _wGL_TEXTURE_WRAP_S = TEXTURE_WRAP_S; + public static final int _wGL_TEXTURE_WRAP_T = TEXTURE_WRAP_T; + public static final int _wGL_REPEAT = REPEAT; + public static final int _wGL_DST_COLOR = DST_COLOR; + public static final int _wGL_DST_ALPHA = DST_ALPHA; + public static final int _wGL_FLOAT = FLOAT; + public static final int _wGL_SHORT = SHORT; + public static final int _wGL_TRIANGLES = TRIANGLES; + public static final int _wGL_TRIANGLE_STRIP = TRIANGLE_STRIP; + public static final int _wGL_TRIANGLE_FAN = TRIANGLE_FAN; + public static final int _wGL_LINE_STRIP = LINE_STRIP; + public static final int _wGL_LINES = LINES; + public static final int _wGL_PACK_ALIGNMENT = PACK_ALIGNMENT; + public static final int _wGL_UNPACK_ALIGNMENT = UNPACK_ALIGNMENT; + public static final int _wGL_TEXTURE0 = TEXTURE0; + public static final int _wGL_TEXTURE1 = TEXTURE1; + public static final int _wGL_TEXTURE2 = TEXTURE2; + public static final int _wGL_TEXTURE3 = TEXTURE3; + public static final int _wGL_VIEWPORT = VIEWPORT; + public static final int _wGL_VERTEX_SHADER = VERTEX_SHADER; + public static final int _wGL_FRAGMENT_SHADER = FRAGMENT_SHADER; + public static final int _wGL_ARRAY_BUFFER = ARRAY_BUFFER; + public static final int _wGL_ELEMENT_ARRAY_BUFFER = ELEMENT_ARRAY_BUFFER; + public static final int _wGL_STATIC_DRAW = STATIC_DRAW; + public static final int _wGL_DYNAMIC_DRAW = DYNAMIC_DRAW; + public static final int _wGL_INVALID_ENUM = INVALID_ENUM; + public static final int _wGL_INVALID_VALUE= INVALID_VALUE; + public static final int _wGL_INVALID_OPERATION = INVALID_OPERATION; + public static final int _wGL_OUT_OF_MEMORY = OUT_OF_MEMORY; + public static final int _wGL_CONTEXT_LOST_WEBGL = CONTEXT_LOST_WEBGL; + public static final int _wGL_FRAMEBUFFER_COMPLETE = FRAMEBUFFER_COMPLETE; + public static final int _wGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_ATTACHMENT; + public static final int _wGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; + public static final int _wGL_COLOR_ATTACHMENT0 = COLOR_ATTACHMENT0; + public static final int _wGL_DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL_ATTACHMENT; + public static final int _wGL_DEPTH_STENCIL = DEPTH_STENCIL; + public static final int _wGL_NEAREST_MIPMAP_LINEAR = NEAREST_MIPMAP_LINEAR; + public static final int _wGL_LINEAR_MIPMAP_LINEAR = LINEAR_MIPMAP_LINEAR; + public static final int _wGL_LINEAR_MIPMAP_NEAREST = LINEAR_MIPMAP_NEAREST; + public static final int _wGL_NEAREST_MIPMAP_NEAREST = NEAREST_MIPMAP_NEAREST; + public static final int _wGL_TEXTURE_MAX_LEVEL = TEXTURE_MAX_LEVEL; + public static final int _wGL_UNSIGNED_INT_24_8 = UNSIGNED_INT_24_8; + public static final int _wGL_UNSIGNED_INT = UNSIGNED_INT; + public static final int _wGL_ANY_SAMPLES_PASSED = ANY_SAMPLES_PASSED; + public static final int _wGL_QUERY_RESULT = QUERY_RESULT; + public static final int _wGL_QUERY_RESULT_AVAILABLE = QUERY_RESULT_AVAILABLE; + public static final int _wGL_TEXTURE_MAX_ANISOTROPY = TEXTURE_MAX_ANISOTROPY_EXT; + public static final int _wGL_DEPTH24_STENCIL8 = DEPTH24_STENCIL8; + public static final int _wGL_DEPTH_COMPONENT32F = DEPTH_COMPONENT32F; + public static final int _wGL_DEPTH_ATTACHMENT = DEPTH_ATTACHMENT; + public static final int _wGL_MULTISAMPLE = -1; + public static final int _wGL_LINE_SMOOTH = -1; + public static final int _wGL_READ_FRAMEBUFFER = READ_FRAMEBUFFER; + public static final int _wGL_DRAW_FRAMEBUFFER = DRAW_FRAMEBUFFER; + public static final int _wGL_FRAMEBUFFER = FRAMEBUFFER; + public static final int _wGL_POLYGON_OFFSET_FILL = POLYGON_OFFSET_FILL; + + public static final class TextureGL { + protected final WebGLTexture obj; + public int w = -1; + public int h = -1; + public boolean nearest = true; + public boolean anisotropic = false; + protected TextureGL(WebGLTexture obj) { + this.obj = obj; + } + } + public static final class BufferGL { + protected final WebGLBuffer obj; + protected BufferGL(WebGLBuffer obj) { + this.obj = obj; + } + } + public static final class ShaderGL { + protected final WebGLShader obj; + protected ShaderGL(WebGLShader obj) { + this.obj = obj; + } + } + private static int progId = 0; + public static final class ProgramGL { + protected final WebGLProgram obj; + protected final int hashcode; + protected ProgramGL(WebGLProgram obj) { + this.obj = obj; + this.hashcode = ++progId; + } + } + public static final class UniformGL { + protected final WebGLUniformLocation obj; + protected UniformGL(WebGLUniformLocation obj) { + this.obj = obj; + } + } + public static final class BufferArrayGL { + protected final WebGLVertexArray obj; + public boolean isQuadBufferBound; + protected BufferArrayGL(WebGLVertexArray obj) { + this.obj = obj; + this.isQuadBufferBound = false; + } + } + public static final class FramebufferGL { + protected final WebGLFramebuffer obj; + protected FramebufferGL(WebGLFramebuffer obj) { + this.obj = obj; + } + } + public static final class RenderbufferGL { + protected final WebGLRenderbuffer obj; + protected RenderbufferGL(WebGLRenderbuffer obj) { + this.obj = obj; + } + } + public static final class QueryGL { + protected final WebGLQuery obj; + protected QueryGL(WebGLQuery obj) { + this.obj = obj; + } + } + + public static final void _wglEnable(int p1) { + webgl.enable(p1); + } + public static final void _wglClearDepth(float p1) { + webgl.clearDepth(p1); + } + public static final void _wglDepthFunc(int p1) { + webgl.depthFunc(p1); + } + public static final void _wglCullFace(int p1) { + webgl.cullFace(p1); + } + private static int[] viewportCache = new int[4]; + public static final void _wglViewport(int p1, int p2, int p3, int p4) { + viewportCache[0] = p1; viewportCache[1] = p2; + viewportCache[2] = p3; viewportCache[3] = p4; + webgl.viewport(p1, p2, p3, p4); + } + public static final void _wglClear(int p1) { + webgl.clear(p1); + } + public static final void _wglClearColor(float p1, float p2, float p3, float p4) { + webgl.clearColor(p1, p2, p3, p4); + } + public static final void _wglDisable(int p1) { + webgl.disable(p1); + } + public static final int _wglGetError() { + return webgl.getError(); + } + public static final void _wglFlush() { + //webgl.flush(); + } + private static Uint8Array uploadBuffer = Uint8Array.create(ArrayBuffer.create(4 * 1024 * 1024)); + public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) { + if(p9 == null) { + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, null); + }else { + int len = p9.remaining(); + Uint8Array uploadBuffer1 = uploadBuffer; + for(int i = 0; i < len; ++i) { + uploadBuffer1.set(i, (short) ((int)p9.get() & 0xff)); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + } + public static final void _wglBlendFunc(int p1, int p2) { + webgl.blendFunc(p1, p2); + } + public static final void _wglBlendFuncSeparate(int p1, int p2, int p3, int p4) { + webgl.blendFuncSeparate(p1, p2, p3, p4); + } + public static final void _wglDepthMask(boolean p1) { + webgl.depthMask(p1); + } + public static final void _wglColorMask(boolean p1, boolean p2, boolean p3, boolean p4) { + webgl.colorMask(p1, p2, p3, p4); + } + public static final void _wglBindTexture(int p1, TextureGL p2) { + webgl.bindTexture(p1, p2 == null ? null : p2.obj); + } + public static final void _wglCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) { + webgl.copyTexSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8); + } + public static final void _wglTexParameteri(int p1, int p2, int p3) { + webgl.texParameteri(p1, p2, p3); + } + public static final void _wglTexParameterf(int p1, int p2, float p3) { + webgl.texParameterf(p1, p2, p3); + } + public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { + int len = p9.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p9.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { + int len = p9.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p9.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglDeleteTextures(TextureGL p1) { + webgl.deleteTexture(p1.obj); + } + public static final void _wglDrawArrays(int p1, int p2, int p3) { + webgl.drawArrays(p1, p2, p3); + } + public static final void _wglDrawElements(int p1, int p2, int p3, int p4) { + webgl.drawElements(p1, p2, p3, p4); + } + public static final TextureGL _wglGenTextures() { + return new TextureGL(webgl.createTexture()); + } + public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) { + int len = p9.remaining(); + for(int i = 0; i < len; ++i) { + uploadBuffer.set(i, (short) ((int)p9.get() & 0xff)); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglActiveTexture(int p1) { + webgl.activeTexture(p1); + } + public static final ProgramGL _wglCreateProgram() { + return new ProgramGL(webgl.createProgram()); + } + public static final ShaderGL _wglCreateShader(int p1) { + return new ShaderGL(webgl.createShader(p1)); + } + public static final void _wglAttachShader(ProgramGL p1, ShaderGL p2) { + webgl.attachShader(p1.obj, p2.obj); + } + public static final void _wglDetachShader(ProgramGL p1, ShaderGL p2) { + webgl.detachShader(p1.obj, p2.obj); + } + public static final void _wglCompileShader(ShaderGL p1) { + webgl.compileShader(p1.obj); + } + public static final void _wglLinkProgram(ProgramGL p1) { + webgl.linkProgram(p1.obj); + } + public static final void _wglShaderSource(ShaderGL p1, String p2) { + webgl.shaderSource(p1.obj, p2); + } + public static final String _wglGetShaderInfoLog(ShaderGL p1) { + return webgl.getShaderInfoLog(p1.obj); + } + public static final String _wglGetProgramInfoLog(ProgramGL p1) { + return webgl.getProgramInfoLog(p1.obj); + } + public static final boolean _wglGetShaderCompiled(ShaderGL p1) { + return webgl.getShaderParameteri(p1.obj, COMPILE_STATUS) == 1; + } + public static final boolean _wglGetProgramLinked(ProgramGL p1) { + return webgl.getProgramParameteri(p1.obj, LINK_STATUS) == 1; + } + public static final void _wglDeleteShader(ShaderGL p1) { + webgl.deleteShader(p1.obj); + } + public static final void _wglDeleteProgram(ProgramGL p1) { + webgl.deleteProgram(p1.obj); + } + public static final BufferGL _wglCreateBuffer() { + return new BufferGL(webgl.createBuffer()); + } + public static final void _wglDeleteBuffer(BufferGL p1) { + webgl.deleteBuffer(p1.obj); + } + public static final void _wglBindBuffer(int p1, BufferGL p2) { + webgl.bindBuffer(p1, p2 == null ? null : p2.obj); + } + public static final void _wglBufferData0(int p1, IntBuffer p2, int p3) { + int len = p2.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p2.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.bufferData(p1, data, p3); + } + public static final void _wglBufferSubData0(int p1, int p2, IntBuffer p3) { + int len = p3.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p3.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.bufferSubData(p1, p2, data); + } + public static final void _wglBufferData(int p1, Object p2, int p3) { + webgl.bufferData(p1, (Int32Array)p2, p3); + } + public static final void _wglBufferSubData(int p1, int p2, Object p3) { + webgl.bufferSubData(p1, p2, (Int32Array)p3); + } + public static final void _wglBindAttribLocation(ProgramGL p1, int p2, String p3) { + webgl.bindAttribLocation(p1.obj, p2, p3); + } + public static final void _wglEnableVertexAttribArray(int p1) { + webgl.enableVertexAttribArray(p1); + } + public static final void _wglDisableVertexAttribArray(int p1) { + webgl.disableVertexAttribArray(p1); + } + public static final UniformGL _wglGetUniformLocation(ProgramGL p1, String p2) { + WebGLUniformLocation u = webgl.getUniformLocation(p1.obj, p2); + return u == null ? null : new UniformGL(u); + } + public static final void _wglBindAttributeLocation(ProgramGL p1, int p2, String p3) { + webgl.bindAttribLocation(p1.obj, p2, p3); + } + public static final void _wglUniform1f(UniformGL p1, float p2) { + if(p1 != null) webgl.uniform1f(p1.obj, p2); + } + public static final void _wglUniform2f(UniformGL p1, float p2, float p3) { + if(p1 != null) webgl.uniform2f(p1.obj, p2, p3); + } + public static final void _wglUniform3f(UniformGL p1, float p2, float p3, float p4) { + if(p1 != null) webgl.uniform3f(p1.obj, p2, p3, p4); + } + public static final void _wglUniform4f(UniformGL p1, float p2, float p3, float p4, float p5) { + if(p1 != null) webgl.uniform4f(p1.obj, p2, p3, p4, p5); + } + public static final void _wglUniform1i(UniformGL p1, int p2) { + if(p1 != null) webgl.uniform1i(p1.obj, p2); + } + public static final void _wglUniform2i(UniformGL p1, int p2, int p3) { + if(p1 != null) webgl.uniform2i(p1.obj, p2, p3); + } + public static final void _wglUniform3i(UniformGL p1, int p2, int p3, int p4) { + if(p1 != null) webgl.uniform3i(p1.obj, p2, p3, p4); + } + public static final void _wglUniform4i(UniformGL p1, int p2, int p3, int p4, int p5) { + if(p1 != null) webgl.uniform4i(p1.obj, p2, p3, p4, p5); + } + private static Float32Array mat2 = Float32Array.create(4); + private static Float32Array mat3 = Float32Array.create(9); + private static Float32Array mat4 = Float32Array.create(16); + public static final void _wglUniformMat2fv(UniformGL p1, float[] mat) { + mat2.set(mat); + if(p1 != null) webgl.uniformMatrix2fv(p1.obj, false, mat2); + } + public static final void _wglUniformMat3fv(UniformGL p1, float[] mat) { + mat3.set(mat); + if(p1 != null) webgl.uniformMatrix3fv(p1.obj, false, mat3); + } + public static final void _wglUniformMat4fv(UniformGL p1, float[] mat) { + mat4.set(mat); + if(p1 != null) webgl.uniformMatrix4fv(p1.obj, false, mat4); + } + private static int currentProgram = -1; + public static final void _wglUseProgram(ProgramGL p1) { + if(p1 != null && currentProgram != p1.hashcode) { + currentProgram = p1.hashcode; + webgl.useProgram(p1.obj); + } + } + public static final void _wglGetParameter(int p1, int size, int[] ret) { + if(p1 == _wGL_VIEWPORT) { + ret[0] = viewportCache[0]; + ret[1] = viewportCache[1]; + ret[2] = viewportCache[2]; + ret[3] = viewportCache[3]; + } + } + public static final void _wglPolygonOffset(float p1, float p2) { + webgl.polygonOffset(p1, p2); + } + public static final void _wglVertexAttribPointer(int p1, int p2, int p3, boolean p4, int p5, int p6) { + webgl.vertexAttribPointer(p1, p2, p3, p4, p5, p6); + } + public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) { + webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj); + } + public static final FramebufferGL _wglCreateFramebuffer() { + return new FramebufferGL(webgl.createFramebuffer()); + } + public static final void _wglDeleteFramebuffer(FramebufferGL p1) { + webgl.deleteFramebuffer(p1.obj); + } + public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) { + webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0); + } + public static final QueryGL _wglCreateQuery() { + return new QueryGL(webgl.createQuery()); + } + public static final void _wglBeginQuery(int p1, QueryGL p2) { + webgl.beginQuery(p1, p2.obj); + } + public static final void _wglEndQuery(int p1) { + webgl.endQuery(p1); + } + public static final void _wglDeleteQuery(QueryGL p1) { + webgl.deleteQuery(p1.obj); + } + public static final int _wglGetQueryObjecti(QueryGL p1, int p2) { + return webgl.getQueryParameter(p1.obj, p2); + } + public static final BufferArrayGL _wglCreateVertexArray() { + return new BufferArrayGL(webgl.createVertexArray()); + } + public static final void _wglDeleteVertexArray(BufferArrayGL p1) { + webgl.deleteVertexArray(p1.obj); + } + public static final void _wglBindVertexArray(BufferArrayGL p1) { + webgl.bindVertexArray(p1 == null ? null : p1.obj); + } + public static final void _wglDrawBuffer(int p1) { + webgl.drawBuffers(new int[] { p1 }); + } + public static final RenderbufferGL _wglCreateRenderBuffer() { + return new RenderbufferGL(webgl.createRenderbuffer()); + } + public static final void _wglBindRenderbuffer(RenderbufferGL p1) { + webgl.bindRenderbuffer(RENDERBUFFER, p1 == null ? null : p1.obj); + } + public static final void _wglRenderbufferStorage(int p1, int p2, int p3) { + webgl.renderbufferStorage(RENDERBUFFER, p1, p2, p3); + } + public static final void _wglFramebufferRenderbuffer(int p1, RenderbufferGL p2) { + webgl.framebufferRenderbuffer(FRAMEBUFFER, p1, RENDERBUFFER, p2 == null ? null : p2.obj); + } + public static final void _wglDeleteRenderbuffer(RenderbufferGL p1) { + webgl.deleteRenderbuffer(p1.obj); + } + public static final void _wglRenderbufferStorageMultisample(int p1, int p2, int p3, int p4) { + webgl.renderbufferStorageMultisample(RENDERBUFFER, p1, p2, p3, p4); + } + public static final void _wglBlitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10) { + webgl.blitFramebuffer(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); + } + public static final int _wglGetAttribLocation(ProgramGL p1, String p2) { + return webgl.getAttribLocation(p1.obj, p2); + } + + @JSBody(params = { "ctx", "p" }, script = "return ctx.getTexParameter(0x0DE1, p) | 0;") + private static final native int __wglGetTexParameteri(WebGL2RenderingContext ctx, int p); + public static final int _wglGetTexParameteri(int p1) { + return __wglGetTexParameteri(webgl, p1); + } + @JSBody(params = { "ctx", "p" }, script = "return (0.0 + ctx.getTexParameter(0x0DE1, p));") + private static final native float __wglGetTexParameterf(WebGL2RenderingContext ctx, int p); + public static final float _wglGetTexParameterf(int p1) { + return __wglGetTexParameterf(webgl, p1); + } + public static final boolean isWindows() { + return getPlaf().toLowerCase().contains("win"); + } + private static HTMLCanvasElement imageLoadCanvas = null; + private static CanvasRenderingContext2D imageLoadContext = null; + + @JSBody(params = { "buf", "mime" }, script = "return URL.createObjectURL(new Blob([buf], {type: mime}));") + private static native String getDataURL(ArrayBuffer buf, String mime); + + @JSBody(params = { "url" }, script = "URL.revokeObjectURL(url);") + private static native void freeDataURL(String url); + + public static final EaglerImage loadPNG(byte[] data) { + ArrayBuffer arr = ArrayBuffer.create(data.length); + Uint8Array.create(arr).set(data); + return loadPNG0(arr); + } + + @Async + private static native EaglerImage loadPNG0(ArrayBuffer data); + + private static void loadPNG0(ArrayBuffer data, final AsyncCallback ret) { + final HTMLImageElement toLoad = (HTMLImageElement) doc.createElement("img"); + toLoad.addEventListener("load", new EventListener() { + public void handleEvent(Event evt) { + if(imageLoadCanvas == null) { + imageLoadCanvas = (HTMLCanvasElement) doc.createElement("canvas"); + } + if(imageLoadCanvas.getWidth() < toLoad.getWidth()) { + imageLoadCanvas.setWidth(toLoad.getWidth()); + } + if(imageLoadCanvas.getHeight() < toLoad.getHeight()) { + imageLoadCanvas.setHeight(toLoad.getHeight()); + } + if(imageLoadContext == null) { + imageLoadContext = (CanvasRenderingContext2D) imageLoadCanvas.getContext("2d"); + } + imageLoadContext.clearRect(0, 0, toLoad.getWidth(), toLoad.getHeight()); + imageLoadContext.drawImage(toLoad, 0, 0, toLoad.getWidth(), toLoad.getHeight()); + ImageData pxlsDat = imageLoadContext.getImageData(0, 0, toLoad.getWidth(), toLoad.getHeight()); + Uint8ClampedArray pxls = pxlsDat.getData(); + int totalPixels = pxlsDat.getWidth() * pxlsDat.getHeight(); + freeDataURL(toLoad.getSrc()); + if(pxls.getByteLength() < totalPixels * 4) { + ret.complete(null); + return; + } + int[] pixels = new int[totalPixels]; + for(int i = 0; i < pixels.length; ++i) { + pixels[i] = (pxls.get(i * 4) << 16) | (pxls.get(i * 4 + 1) << 8) | pxls.get(i * 4 + 2) | (pxls.get(i * 4 + 3) << 24); + } + ret.complete(new EaglerImage(pixels, pxlsDat.getWidth(), pxlsDat.getHeight(), true)); + } + }); + toLoad.addEventListener("error", new EventListener() { + public void handleEvent(Event evt) { + freeDataURL(toLoad.getSrc()); + ret.complete(null); + } + }); + String src = getDataURL(data, "image/png"); + if(src == null) { + ret.complete(null); + }else { + toLoad.setSrc(src); + } + } + + private static MouseEvent currentEvent = null; + private static KeyboardEvent currentEventK = null; + private static boolean[] buttonStates = new boolean[8]; + private static boolean[] keyStates = new boolean[256]; + public static final boolean mouseNext() { + currentEvent = null; + return !mouseEvents.isEmpty() && (currentEvent = mouseEvents.remove(0)) != null; + } + public static final int mouseGetEventButton() { + if(currentEvent == null) return -1; + int b = currentEvent.getButton(); + return b == 1 ? 2 : (b == 2 ? 1 : b); + } + public static final boolean mouseGetEventButtonState() { + return currentEvent == null ? false : currentEvent.getType().equals(MouseEvent.MOUSEDOWN); + } + public static final boolean mouseIsButtonDown(int p1) { + return buttonStates[p1]; + } + public static final int mouseGetEventDWheel() { + return ("wheel".equals(currentEvent.getType())) ? (((WheelEvent)currentEvent).getDeltaY() == 0.0D ? 0 : (((WheelEvent)currentEvent).getDeltaY() > 0.0D ? -1 : 1)) : 0; + } + public static final void mouseSetCursorPosition(int x, int y) { + + } + private static long mouseUngrabTimer = 0l; + private static int mouseUngrabTimeout = 0; + private static boolean needsPointerLock = false; + public static final void mouseSetGrabbed(boolean grabbed) { + needsPointerLock = grabbed; + if(grabbed) { + mouseDX = 0.0D; + mouseDY = 0.0D; + Window.setTimeout(new TimerHandler() { + public void onTimer() { + canvas.requestPointerLock(); + long t = System.currentTimeMillis(); + if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); + mouseUngrabTimeout = 0; + if(t - mouseUngrabTimer < 3000l) { + mouseUngrabTimeout = Window.setTimeout(new TimerHandler() { + public void onTimer() { + canvas.requestPointerLock(); + mouseUngrabTimeout = 0; + } + }, 3000 - (int)(t - mouseUngrabTimer)); + } + } + }, 200); + }else { + mouseUngrabTimer = System.currentTimeMillis(); + if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); + mouseUngrabTimeout = 0; + doc.exitPointerLock(); + } + } + private static void forceMouseGrabbed() { + long t = System.currentTimeMillis(); + if(t - mouseUngrabTimer > 3000l) { + if(needsPointerLock && !isPointerLocked()) { + canvas.requestPointerLock(); + if(isPointerLocked()) { + needsPointerLock = false; + } + } + } + } + public static final int mouseGetDX() { + double dx = mouseDX; + mouseDX = 0.0D; + return (int)dx; + } + public static final int mouseGetDY() { + double dy = mouseDY; + mouseDY = 0.0D; + return (int)dy; + } + public static final int mouseGetX() { + return mouseX; + } + public static final int mouseGetY() { + return mouseY; + } + public static final int mouseGetEventX() { + return currentEvent == null ? -1 : currentEvent.getClientX(); + } + public static final int mouseGetEventY() { + return currentEvent == null ? -1 : canvas.getClientHeight() - currentEvent.getClientY(); + } + public static final boolean keysNext() { + if(unpressCTRL) { //un-press ctrl after copy/paste permission + keyEvents.clear(); + currentEventK = null; + keyStates[29] = false; + keyStates[157] = false; + keyStates[28] = false; + keyStates[219] = false; + keyStates[220] = false; + unpressCTRL = false; + return false; + } + currentEventK = null; + return !keyEvents.isEmpty() && (currentEventK = keyEvents.remove(0)) != null; + } + public static final int getEventKey() { + return currentEventK == null ? -1 : remapKey(getWhich(currentEventK)); + } + public static final char getEventChar() { + if(currentEventK == null) return '\0'; + String s = currentEventK.getKey(); + return currentEventK == null ? ' ' : (char) (s.length() > 1 ? '\0' : s.charAt(0)); + } + public static final boolean getEventKeyState() { + return currentEventK == null? false : !currentEventK.getType().equals("keyup"); + } + public static final boolean isKeyDown(int p1) { + if(unpressCTRL) { //un-press ctrl after copy/paste permission + keyStates[28] = false; + keyStates[29] = false; + keyStates[157] = false; + keyStates[219] = false; + keyStates[220] = false; + } + return keyStates[p1]; + } + public static final String getKeyName(int p1) { + return (p1 >= 0 && p1 < 256) ? LWJGLKeyNames[p1] : "null"; + } + public static final void setFullscreen(boolean p1) { + if(p1) { + fullscreen(); + } else { + exitFullscreen(); + } + } + + @JSBody(script = "if(!document.fullscreenElement){document.documentElement.requestFullscreen();}") + public static final native void fullscreen(); + + @JSBody(script = "if(document.fullscreenElement){document.exitFullscreen();}") + public static final native void exitFullscreen(); + + public static final boolean shouldShutdown() { + return false; + } + public static final boolean isFunctionKeyDown(boolean mod, int p1) { + return mod && p1 >= 59 && p1 <= 67 && getEventKey() == (2 + (p1 - 59)); + } + public static final boolean isFunctionKeyDown(int mod, int p1) { + return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & getEventKey() == (2 + (p1 - 59)); + } + public static final boolean isFunctionKeyHeldDown(int mod, int p1) { + return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & isKeyDown(2 + (p1 - 59)); + } + + @JSBody(params = { "obj" }, script = "if(obj.commit) obj.commit();") + private static native int commitContext(JSObject obj); + + public static final void updateDisplay() { + commitContext(webgl); + canvasContext.drawImage(canvasBack, 0d, 0d, canvas.getWidth(), canvas.getHeight()); + + int ww = canvas.getClientWidth(); + int hh = canvas.getClientHeight(); + if(ww != width || hh != height) { + width = ww; + height = hh; + canvasBack.setWidth(ww); + canvasBack.setHeight(hh); + } + + try { + Thread.sleep(1l); + } catch (InterruptedException e) { + ; + } + } + public static final void setVSyncEnabled(boolean p1) { + + } + public static final void enableRepeatEvents(boolean b) { + enableRepeatEvents = b; + } + + public static boolean isPointerLocked2() { + return mouseUngrabTimeout != 0 || isPointerLocked(); + } + + @JSBody(params = { }, script = "return document.pointerLockElement != null;") + public static native boolean isPointerLocked(); + + private static boolean pointerLockFlag = false; + + public static final boolean isFocused() { + boolean yee = isPointerLocked(); + boolean dee = pointerLockFlag; + pointerLockFlag = yee; + if(!dee && yee) { + mouseDX = 0.0D; + mouseDY = 0.0D; + } + return isWindowFocused && !(dee && !yee); + } + public static final int getScreenWidth() { + return win.getScreen().getAvailWidth(); + } + public static final int getScreenHeight() { + return win.getScreen().getAvailHeight(); + } + public static final int getCanvasWidth() { + int w = parent.getClientWidth(); + if(w != width) { + canvas.setWidth(w); + canvasBack.setWidth(w); + width = w; + } + return w; + } + public static final int getCanvasHeight() { + int h = parent.getClientHeight(); + if(h != height) { + canvas.setHeight(h); + canvasBack.setHeight(h); + height = h; + } + return h; + } + public static final void setDisplaySize(int x, int y) { + + } + public static final void syncDisplay(int performanceToFps) { + + } + + private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + public static final void saveScreenshot() { + saveScreenshot("screenshot_" + dateFormatSS.format(new Date()).toString() + ".png", canvas); + } + + @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=cvs.toDataURL(\"image/png\");a.download=name;a.click();") + private static native void saveScreenshot(String name, HTMLCanvasElement cvs); + + public static final byte[] loadLocalStorage(String key) { + String s = win.getLocalStorage().getItem("_eaglercraft_beta."+key); + if(s != null) { + return Base64.decodeBase64(s); + }else { + return null; + } + } + public static final void saveLocalStorage(String key, byte[] data) { + win.getLocalStorage().setItem("_eaglercraft_beta."+key, Base64.encodeBase64String(data)); + } + public static final void openLink(String url) { + win.open(url, "_blank"); + } + public static final void redirectTo(String url) { + Window.current().getLocation().setFullURL(url); + } + + @JSBody(params = { "ext", "mime" }, script = "window.eagsFileChooser.openFileChooser(ext, mime);") + public static native void openFileChooser(String ext, String mime); + + public static final byte[] getFileChooserResult() { + ArrayBuffer b = getFileChooserResult0(); + if(b == null) return null; + Uint8Array array = Uint8Array.create(b); + byte[] ret = new byte[array.getByteLength()]; + for(int i = 0; i < ret.length; ++i) { + ret[i] = (byte) array.get(i); + } + return ret; + } + + @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResult; window.eagsFileChooser.getFileChooserResult = null; return ret;") + private static native ArrayBuffer getFileChooserResult0(); + + @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResultName; window.eagsFileChooser.getFileChooserResultName = null; return ret;") + public static native String getFileChooserResultName(); + + public static final void setListenerPos(float x, float y, float z, float vx, float vy, float vz, float pitch, float yaw) { + float var2 = MathHelper.cos(-yaw * 0.017453292F); + float var3 = MathHelper.sin(-yaw * 0.017453292F); + float var4 = -MathHelper.cos(pitch * 0.017453292F); + float var5 = MathHelper.sin(pitch * 0.017453292F); + AudioListener l = audioctx.getListener(); + l.setPosition(x, y, z); + l.setOrientation(-var3 * var4, -var5, -var2 * var4, 0.0f, 1.0f, 0.0f); + } + + private static int playbackId = 0; + private static final HashMap loadedSoundFiles = new HashMap(); + private static AudioContext audioctx = null; + private static float playbackOffsetDelay = 0.03f; + + public static final void setPlaybackOffsetDelay(float f) { + playbackOffsetDelay = f; + } + + @Async + public static native AudioBuffer decodeAudioAsync(ArrayBuffer buffer); + + private static void decodeAudioAsync(ArrayBuffer buffer, final AsyncCallback cb) { + audioctx.decodeAudioData(buffer, new DecodeSuccessCallback() { + public void onSuccess(AudioBuffer decodedData) { + cb.complete(decodedData); + } + }, new DecodeErrorCallback() { + public void onError(JSObject error) { + cb.complete(null); + } + }); + } + + private static final HashMap activeSoundEffects = new HashMap(); + + private static class AudioBufferX { + private final AudioBuffer buffer; + private AudioBufferX(AudioBuffer buffer) { + this.buffer = buffer; + } + } + + private static class AudioBufferSourceNodeX { + private final AudioBufferSourceNode source; + private final PannerNode panner; + private final GainNode gain; + private AudioBufferSourceNodeX(AudioBufferSourceNode source, PannerNode panner, GainNode gain) { + this.source = source; + this.panner = panner; + this.gain = gain; + } + } + + private static final AudioBuffer getBufferFor(String fileName) { + AudioBufferX ret = loadedSoundFiles.get(fileName); + if(ret == null) { + byte[] file = loadResourceBytes(fileName); + if(file == null) return null; + Uint8Array buf = Uint8Array.create(file.length); + buf.set(file); + ret = new AudioBufferX(decodeAudioAsync(buf.getBuffer())); + loadedSoundFiles.put(fileName, ret); + } + return ret.buffer; + } + + public static int beginPlayback(String fileName) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return -1; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + PannerNode p = audioctx.createPanner(); + GainNode g = audioctx.createGain(); + g.getGain().setValue(1.0f); + s.connect(g); + g.connect(p); + p.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + final int theId = ++playbackId; + activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g)); + s.setOnEnded(new EventListener() { + + public void handleEvent(MediaEvent evt) { + activeSoundEffects.remove(theId); + } + + }); + return theId; + } + public static void beginPlayback(String fileName, float volume) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + PannerNode p = audioctx.createPanner(); + GainNode g = audioctx.createGain(); + g.getGain().setValue(volume > 1.0f ? 1.0f : volume); + s.connect(g); + g.connect(p); + p.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + } + public static final int beginPlayback(String fileName, float x, float y, float z, float volume) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return -1; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + //s.getPlaybackRate().setValue(pitch); + PannerNode p = audioctx.createPanner(); + p.setPosition(x, y, z); + p.setMaxDistance(volume * 16f + 0.1f); + p.setRolloffFactor(1f); + //p.setVelocity(0f, 0f, 0f); + p.setDistanceModel("linear"); + p.setPanningModel("HRTF"); + p.setConeInnerAngle(360f); + p.setConeOuterAngle(0f); + p.setConeOuterGain(0f); + p.setOrientation(0f, 1f, 0f); + GainNode g = audioctx.createGain(); + g.getGain().setValue(volume > 1.0f ? 1.0f : volume); + s.connect(g); + g.connect(p); + p.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + final int theId = ++playbackId; + activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g)); + s.setOnEnded(new EventListener() { + + public void handleEvent(MediaEvent evt) { + activeSoundEffects.remove(theId); + } + + }); + return theId; + } + public static final int beginPlaybackStatic(String fileName, float volume, float pitch) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return -1; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + s.getPlaybackRate().setValue(pitch); + GainNode g = audioctx.createGain(); + g.getGain().setValue(volume > 1.0f ? 1.0f : volume); + s.connect(g); + g.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + final int theId = ++playbackId; + activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, null, g)); + s.setOnEnded(new EventListener() { + public void handleEvent(MediaEvent evt) { + activeSoundEffects.remove(theId); + } + + }); + return playbackId; + } + public static final void setPitch(int id, float pitch) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.source.getPlaybackRate().setValue(pitch); + } + } + public static final void setVolume(int id, float volume) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.gain.getGain().setValue(volume > 1.0f ? 1.0f : volume); + if(b.panner != null) b.panner.setMaxDistance(volume * 16f + 0.1f); + } + } + public static final void moveSound(int id, float x, float y, float z, float vx, float vy, float vz) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null && b.panner != null) { + b.panner.setPosition(x, y, z); + //b.panner.setVelocity(vx, vy, vz); + } + } + public static final void endSound(int id) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.source.stop(); + activeSoundEffects.remove(id); + } + } + public static final boolean isPlaying(int id) { + return activeSoundEffects.containsKey(id); + } + public static final void openConsole() { + + } + private static boolean connected = false; + public static final void voiceConnect(String channel) { + win.alert("voice channels are not implemented yet"); + connected = true; + } + public static final void voiceVolume(float volume) { + + } + public static final boolean voiceActive() { + return connected; + } + public static final boolean voiceRelayed() { + return connected; + } + public static final String[] voiceUsers() { + return new String[0]; + } + public static final String[] voiceUsersTalking() { + return new String[0]; + } + public static final void voiceEnd() { + connected = false; + } + public static final void doJavascriptCoroutines() { + + } + public static final long maxMemory() { + return 1024*1024*1024; + } + public static final long totalMemory() { + return 1024*1024*1024; + } + public static final long freeMemory() { + return 0l; + } + public static final void exit() { + + } + + @JSBody(params = { }, script = "return window.navigator.userAgent;") + public static native String getUserAgent(); + + private static String[] LWJGLKeyNames = new String[] {"NONE", "ESCAPE", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "MINUS", "EQUALS", "BACK", "TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LBRACKET", "RBRACKET", "RETURN", "LCONTROL", "A", "S", "D", "F", "G", "H", "J", "K", "L", "SEMICOLON", "APOSTROPHE", "GRAVE", "LSHIFT", "BACKSLASH", "Z", "X", "C", "V", "B", "N", "M", "COMMA", "PERIOD", "SLASH", "RSHIFT", "MULTIPLY", "LMENU", "SPACE", "CAPITAL", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "NUMLOCK", "SCROLL", "NUMPAD7", "NUMPAD8", "NUMPAD9", "SUBTRACT", "NUMPAD4", "NUMPAD5", "NUMPAD6", "ADD", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD0", "DECIMAL", "null", "null", "null", "F11", "F12", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "F13", "F14", "F15", "F16", "F17", "F18", "null", "null", "null", "null", "null", "null", "KANA", "F19", "null", "null", "null", "null", "null", "null", "null", "CONVERT", "null", "NOCONVERT", "null", "YEN", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADEQUALS", "null", "null", "CIRCUMFLEX", "AT", "COLON", "UNDERLINE", "KANJI", "STOP", "AX", "UNLABELED", "null", "null", "null", "null", "NUMPADENTER", "RCONTROL", "null", "null", "null", "null", "null", "null", "null", "null", "null", "SECTION", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADCOMMA", "null", "DIVIDE", "null", "SYSRQ", "RMENU", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "FUNCTION", "PAUSE", "null", "HOME", "UP", "PRIOR", "null", "LEFT", "null", "RIGHT", "null", "END", "DOWN", "NEXT", "INSERT", "DELETE", "null", "null", "null", "null", "null", "null", "CLEAR", "LMETA", "RMETA", "APPS", "POWER", "SLEEP", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"}; + + private static int[] LWJGLKeyCodes = new int[] { + /* 0 */ -1, + /* 1 */ -1, + /* 2 */ -1, + /* 3 */ -1, + /* 4 */ -1, + /* 5 */ -1, + /* 6 */ -1, + /* 7 */ -1, + /* 8 */ 14, + /* 9 */ 15, + /* 10 */ -1, + /* 11 */ -1, + /* 12 */ -1, + /* 13 */ 28, + /* 14 */ -1, + /* 15 */ -1, + /* 16 */ 42, + /* 17 */ 29, + /* 18 */ 56, + /* 19 */ -1, + /* 20 */ -1, + /* 21 */ -1, + /* 22 */ -1, + /* 23 */ -1, + /* 24 */ -1, + /* 25 */ -1, + /* 26 */ -1, + /* 27 */ 1, + /* 28 */ -1, + /* 29 */ -1, + /* 30 */ -1, + /* 31 */ -1, + /* 32 */ 57, + /* 33 */ 210, + /* 34 */ 201, + /* 35 */ 207, + /* 36 */ 199, + /* 37 */ 203, + /* 38 */ 200, + /* 39 */ 205, + /* 40 */ 208, + /* 41 */ 205, + /* 42 */ 208, + /* 43 */ -1, + /* 44 */ -1, + /* 45 */ 210, + /* 46 */ 211, + /* 47 */ 211, + /* 48 */ 11, + /* 49 */ 2, + /* 50 */ 3, + /* 51 */ 4, + /* 52 */ 5, + /* 53 */ 6, + /* 54 */ 7, + /* 55 */ 8, + /* 56 */ 9, + /* 57 */ 10, + /* 58 */ -1, + /* 59 */ -1, + /* 60 */ -1, + /* 61 */ -1, + /* 62 */ -1, + /* 63 */ -1, + /* 64 */ -1, + /* 65 */ 30, + /* 66 */ 48, + /* 67 */ 46, + /* 68 */ 32, + /* 69 */ 18, + /* 70 */ 33, + /* 71 */ 34, + /* 72 */ 35, + /* 73 */ 23, + /* 74 */ 36, + /* 75 */ 37, + /* 76 */ 38, + /* 77 */ 50, + /* 78 */ 49, + /* 79 */ 24, + /* 80 */ 25, + /* 81 */ 16, + /* 82 */ 19, + /* 83 */ 31, + /* 84 */ 20, + /* 85 */ 22, + /* 86 */ 47, + /* 87 */ 17, + /* 88 */ 45, + /* 89 */ 21, + /* 90 */ 44, + /* 91 */ -1, + /* 92 */ -1, + /* 93 */ -1, + /* 94 */ -1, + /* 95 */ -1, + /* 96 */ -1, + /* 97 */ -1, + /* 98 */ -1, + /* 99 */ -1, + /* 100 */ -1, + /* 101 */ -1, + /* 102 */ -1, + /* 103 */ -1, + /* 104 */ -1, + /* 105 */ -1, + /* 106 */ -1, + /* 107 */ -1, + /* 108 */ -1, + /* 109 */ 12, + /* 110 */ 52, + /* 111 */ 53, + /* 112 */ -1, + /* 113 */ -1, + /* 114 */ -1, + /* 115 */ -1, + /* 116 */ -1, + /* 117 */ -1, + /* 118 */ -1, + /* 119 */ -1, + /* 120 */ -1, + /* 121 */ -1, + /* 122 */ -1, + /* 123 */ -1, + /* 124 */ -1, + /* 125 */ -1, + /* 126 */ -1, + /* 127 */ -1, + /* 128 */ -1, + /* 129 */ -1, + /* 130 */ -1, + /* 131 */ -1, + /* 132 */ -1, + /* 133 */ -1, + /* 134 */ -1, + /* 135 */ -1, + /* 136 */ -1, + /* 137 */ -1, + /* 138 */ -1, + /* 139 */ -1, + /* 140 */ -1, + /* 141 */ -1, + /* 142 */ -1, + /* 143 */ -1, + /* 144 */ -1, + /* 145 */ -1, + /* 146 */ -1, + /* 147 */ -1, + /* 148 */ -1, + /* 149 */ -1, + /* 150 */ -1, + /* 151 */ -1, + /* 152 */ -1, + /* 153 */ -1, + /* 154 */ -1, + /* 155 */ -1, + /* 156 */ -1, + /* 157 */ -1, + /* 158 */ -1, + /* 159 */ -1, + /* 160 */ -1, + /* 161 */ -1, + /* 162 */ -1, + /* 163 */ -1, + /* 164 */ -1, + /* 165 */ -1, + /* 166 */ -1, + /* 167 */ -1, + /* 168 */ -1, + /* 169 */ -1, + /* 170 */ -1, + /* 171 */ -1, + /* 172 */ -1, + /* 173 */ -1, + /* 174 */ -1, + /* 175 */ -1, + /* 176 */ -1, + /* 177 */ -1, + /* 178 */ -1, + /* 179 */ -1, + /* 180 */ -1, + /* 181 */ -1, + /* 182 */ -1, + /* 183 */ -1, + /* 184 */ -1, + /* 185 */ -1, + /* 186 */ 39, + /* 187 */ 13, + /* 188 */ 51, + /* 189 */ 12, + /* 190 */ 52, + /* 191 */ 53, + /* 192 */ -1, + /* 193 */ -1, + /* 194 */ -1, + /* 195 */ -1, + /* 196 */ -1, + /* 197 */ -1, + /* 198 */ -1, + /* 199 */ -1, + /* 200 */ -1, + /* 200 */ -1, + /* 201 */ -1, + /* 202 */ -1, + /* 203 */ -1, + /* 204 */ -1, + /* 205 */ -1, + /* 206 */ -1, + /* 207 */ -1, + /* 208 */ -1, + /* 209 */ -1, + /* 210 */ -1, + /* 211 */ -1, + /* 212 */ -1, + /* 213 */ -1, + /* 214 */ -1, + /* 215 */ -1, + /* 216 */ -1, + /* 217 */ -1, + /* 218 */ -1, + /* 219 */ 26, + /* 220 */ 43, + /* 221 */ 27, + /* 222 */ 40 + }; + + public static final int _wArrayByteLength(Object obj) { + return ((Int32Array)obj).getByteLength(); + } + + public static final Object _wCreateLowLevelIntBuffer(int len) { + return Int32Array.create(len); + } + + private static int appendbufferindex = 0; + private static Int32Array appendbuffer = Int32Array.create(ArrayBuffer.create(525000*4)); + + public static final void _wAppendLowLevelBuffer(Object arr) { + Int32Array a = ((Int32Array)arr); + if(appendbufferindex + a.getLength() < appendbuffer.getLength()) { + appendbuffer.set(a, appendbufferindex); + appendbufferindex += a.getLength(); + } + } + + public static final Object _wGetLowLevelBuffersAppended() { + Int32Array ret = Int32Array.create(appendbuffer.getBuffer(), 0, appendbufferindex); + appendbufferindex = 0; + return ret; + } + + private static int remapKey(int k) { + return (k > LWJGLKeyCodes.length || k < 0) ? -1 : LWJGLKeyCodes[k]; + } + + @JSFunctor + private static interface StupidFunctionResolveString extends JSObject { + void resolveStr(String s); + } + + private static boolean unpressCTRL = false; + + @Async + public static native String getClipboard(); + + private static void getClipboard(final AsyncCallback cb) { + final long start = System.currentTimeMillis(); + getClipboard0(new StupidFunctionResolveString() { + public void resolveStr(String s) { + if(System.currentTimeMillis() - start > 500l) { + unpressCTRL = true; + } + cb.complete(s); + } + }); + } + + @JSBody(params = { "cb" }, script = "if(!window.navigator.clipboard) cb(null); else window.navigator.clipboard.readText().then(function(s) { cb(s); }, function(s) { cb(null); });") + private static native void getClipboard0(StupidFunctionResolveString cb); + + @JSBody(params = { "str" }, script = "if(window.navigator.clipboard) window.navigator.clipboard.writeText(str);") + public static native void setClipboard(String str); + + @JSBody(params = { "obj" }, script = "return typeof obj === \"string\";") + private static native boolean isString(JSObject obj); + + public static final boolean fileExists(String path) { + return IndexedDBFilesystem.fileExists(path); + } + + public static final boolean directoryExists(String path) { + return IndexedDBFilesystem.directoryExists(path); + } + + public static final boolean pathExists(String path) { + return IndexedDBFilesystem.pathExists(path); + } + + public static final void writeFile(String path, byte[] data) { + IndexedDBFilesystem.writeFile(path, data); + } + + public static final byte[] readFile(String path) { + return IndexedDBFilesystem.readFile(path); + } + + public static final long getLastModified(String path) { + return IndexedDBFilesystem.getLastModified(path); + } + + public static final int getFileSize(String path) { + return IndexedDBFilesystem.getFileSize(path); + } + + public static final void renameFile(String oldPath, String newPath) { + IndexedDBFilesystem.renameFile(oldPath, newPath); + } + + public static final void copyFile(String oldPath, String newPath) { + IndexedDBFilesystem.copyFile(oldPath, newPath); + } + + public static final void deleteFile(String path) { + IndexedDBFilesystem.deleteFile(path); + } + + public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) { + return IndexedDBFilesystem.listFiles(path, listDirs, recursiveDirs); + } + + public static final Collection listFilesAndDirectories(String path) { + return listFiles(path, true, false); + } + + public static final Collection listFilesRecursive(String path) { + return listFiles(path, false, true); + } + + public static class FileEntry { + + public final String path; + public final boolean isDirectory; + public final long lastModified; + + public FileEntry(String path, boolean isDirectory, long lastModified) { + this.path = path; + this.isDirectory = isDirectory; + this.lastModified = lastModified; + } + + public String getName() { + int i = path.indexOf('/'); + if(i >= 0) { + return path.substring(i + 1); + }else { + return path; + } + } + + } + + private static String stripPath(String str) { + if(str.startsWith("/")) { + str = str.substring(1); + } + if(str.endsWith("/")) { + str = str.substring(0, str.length() - 1); + } + return str; + } + + @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=URL.createObjectURL(new Blob([cvs],{type:\"application/octet-stream\"}));a.download=name;a.click();URL.revokeObjectURL(a.href);") + private static native void downloadFile0(String name, ArrayBuffer cvs); + + public static final void downloadFile(String filename, byte[] data) { + Uint8Array b = Uint8Array.create(data.length); + b.set(data); + downloadFile0(filename, b.getBuffer()); + } + +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java b/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java new file mode 100644 index 0000000..d061bfd --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java @@ -0,0 +1,339 @@ +package net.lax1dude.eaglercraft.adapter; + +import org.lwjgl.opengl.GL11; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Float32Array; +import org.teavm.jso.typedarrays.Int32Array; + +public class Tessellator { + + /** The byte buffer used for GL allocation. */ + private Int32Array intBuffer; + private Float32Array floatBuffer; + + /** + * The number of vertices to be drawn in the next draw call. Reset to 0 between + * draw calls. + */ + private int vertexCount = 0; + + /** The first coordinate to be used for the texture. */ + private float textureU; + + /** The second coordinate to be used for the texture. */ + private float textureV; + + /** The color (RGBA) value to be used for the following draw call. */ + private int color; + + /** + * Whether the current draw object for this tessellator has color values. + */ + private boolean hasColor = false; + + /** + * Whether the current draw object for this tessellator has texture coordinates. + */ + private boolean hasTexture = false; + + /** + * Whether the current draw object for this tessellator has normal values. + */ + private boolean hasNormals = false; + + /** The index into the raw buffer to be used for the next data. */ + private int rawBufferIndex = 0; + + /** + * The number of vertices manually added to the given draw call. This differs + * from vertexCount because it adds extra vertices when converting quads to + * triangles. + */ + private int addedVertices = 0; + + /** Disables all color information for the following draw call. */ + private boolean isColorDisabled = false; + + /** + * An offset to be applied along the x-axis for all vertices in this draw call. + */ + private double xOffset; + + /** + * An offset to be applied along the y-axis for all vertices in this draw call. + */ + private double yOffset; + + /** + * An offset to be applied along the z-axis for all vertices in this draw call. + */ + private 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(525000); + + /** Whether this tessellator is currently in draw mode. */ + private boolean isDrawing = false; + + /** Whether we are currently using VBO or not. */ + private boolean useVBO = false; + + /** The size of the buffers used (in integers). */ + private int bufferSize; + + private int drawMode; + + private Tessellator(int par1) { + this.bufferSize = par1; + ArrayBuffer a = ArrayBuffer.create(par1 * 4); + this.intBuffer = Int32Array.create(a); + this.floatBuffer = Float32Array.create(a); + } + + /** + * Draws the data set up in this tessellator and resets the state to prepare for + * new drawing. + */ + public int draw() { + if (!this.isDrawing) { + return 0; + } else { + this.isDrawing = false; + + if (this.vertexCount > 0) { + + if (this.hasTexture) { + GL11.glEnableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if (this.hasColor) { + GL11.glEnableVertexAttrib(GL11.GL_COLOR_ARRAY); + } + + if (this.hasNormals) { + GL11.glEnableVertexAttrib(GL11.GL_NORMAL_ARRAY); + } + + GL11.glDrawArrays(drawMode, 0, this.vertexCount, Int32Array.create(intBuffer.getBuffer(), 0, this.vertexCount * 7)); + + if (this.hasTexture) { + GL11.glDisableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if (this.hasColor) { + GL11.glDisableVertexAttrib(GL11.GL_COLOR_ARRAY); + } + + if (this.hasNormals) { + GL11.glDisableVertexAttrib(GL11.GL_NORMAL_ARRAY); + } + } + + int var1 = this.rawBufferIndex * 4; + this.reset(); + return var1; + } + } + + /** + * Clears the tessellator state in preparation for new drawing. + */ + private void reset() { + this.vertexCount = 0; + //this.byteBuffer.clear(); + this.rawBufferIndex = 0; + this.addedVertices = 0; + } + + /** + * Resets tessellator state and prepares for drawing (with the specified draw + * mode). + */ + public void startDrawing(int drawMode) { + this.drawMode = drawMode; + this.isDrawing = true; + this.reset(); + this.hasNormals = false; + this.hasColor = false; + this.hasTexture = false; + this.isColorDisabled = false; + } + + /** + * Sets the texture coordinates. + */ + public void setTextureUV(double par1, double par3) { + this.hasTexture = true; + this.textureU = (float) par1; + this.textureV = (float) par3; + } + + /** + * Sets the RGB values as specified, converting from floats between 0 and 1 to + * integers from 0-255. + */ + public void setColorOpaque_F(float par1, float par2, float par3) { + this.setColorOpaque((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F)); + } + + /** + * Sets the RGBA values for the color, converting from floats between 0 and 1 to + * integers from 0-255. + */ + public void setColorRGBA_F(float par1, float par2, float par3, float par4) { + this.setColorRGBA((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F), (int) (par4 * 255.0F)); + } + + /** + * Sets the RGB values as specified, and sets alpha to opaque. + */ + public void setColorOpaque(int par1, int par2, int par3) { + this.setColorRGBA(par1, par2, par3, 255); + } + + /** + * Sets the RGBA values for the color. Also clamps them to 0-255. + */ + public void setColorRGBA(int par1, int par2, int par3, int par4) { + if (!this.isColorDisabled) { + if (par1 > 255) { + par1 = 255; + } + + if (par2 > 255) { + par2 = 255; + } + + if (par3 > 255) { + par3 = 255; + } + + if (par4 > 255) { + par4 = 255; + } + + if (par1 < 0) { + par1 = 0; + } + + if (par2 < 0) { + par2 = 0; + } + + if (par3 < 0) { + par3 = 0; + } + + if (par4 < 0) { + par4 = 0; + } + + this.hasColor = true; + this.color = par4 << 24 | par3 << 16 | par2 << 8 | par1; + } + } + + /** + * Adds a vertex specifying both x,y,z and the texture u,v for it. + */ + public void addVertexWithUV(double par1, double par3, double par5, double par7, double par9) { + this.setTextureUV(par7, par9); + this.addVertex(par1, par3, par5); + } + + /** + * Adds a vertex with the specified x,y,z to the current draw call. It will + * trigger a draw() if the buffer gets full. + */ + public void addVertex(double par1, double par3, double par5) { + if(this.addedVertices > 65534) return; + ++this.addedVertices; + ++this.vertexCount; + + int bufferIndex = this.rawBufferIndex; + Int32Array intBuffer0 = intBuffer; + Float32Array floatBuffer0 = floatBuffer; + + floatBuffer0.set(bufferIndex + 0, (float) (par1 + this.xOffset)); + floatBuffer0.set(bufferIndex + 1, (float) (par3 + this.yOffset)); + floatBuffer0.set(bufferIndex + 2, (float) (par5 + this.zOffset)); + + if (this.hasTexture) { + floatBuffer0.set(bufferIndex + 3, this.textureU); + floatBuffer0.set(bufferIndex + 4, this.textureV); + } + + if (this.hasColor) { + intBuffer0.set(bufferIndex + 5, this.color); + } + + if (this.hasNormals) { + intBuffer0.set(bufferIndex + 6, this.normal); + } + + this.rawBufferIndex += 7; + } + + /** + * Sets the color to the given opaque value (stored as byte values packed in an + * integer). + */ + public void setColorOpaque_I(int par1) { + int var2 = par1 >> 16 & 255; + int var3 = par1 >> 8 & 255; + int var4 = par1 & 255; + this.setColorOpaque(var2, var3, var4); + } + + /** + * Sets the color to the given color (packed as bytes in integer) and alpha + * values. + */ + public void setColorRGBA_I(int par1, int par2) { + int var3 = par1 >> 16 & 255; + int var4 = par1 >> 8 & 255; + int var5 = par1 & 255; + this.setColorRGBA(var3, var4, var5, par2); + } + + /** + * Disables colors for the current draw call. + */ + public void disableColor() { + this.isColorDisabled = true; + } + + /** + * Sets the normal for the current draw call. + */ + public void setNormal(float par1, float par2, float par3) { + this.hasNormals = true; + float len = (float) Math.sqrt(par1 * par1 + par2 * par2 + par3 * par3); + int var4 = (int)((par1 / len) * 125.0F) + 125; + int var5 = (int)((par2 / len) * 125.0F) + 125; + int var6 = (int)((par3 / len) * 125.0F) + 125; + this.normal = var4 & 255 | (var5 & 255) << 8 | (var6 & 255) << 16; + GL11.glNormal3f(par1, par2, par3); + } + + /** + * Sets the translation for all vertices in the current draw call. + */ + public void setTranslationD(double par1, double par3, double par5) { + this.xOffset = par1; + this.yOffset = par3; + this.zOffset = par5; + } + + /** + * Offsets the translation for all vertices in the current draw call. + */ + public void setTranslationF(float par1, float par2, float par3) { + this.xOffset += (float) par1; + this.yOffset += (float) par2; + this.zOffset += (float) par3; + } +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java new file mode 100644 index 0000000..6125bc7 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java @@ -0,0 +1,34 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +public class BufferConverter { + + public static final byte[] convertByteBuffer(ByteBuffer b) { + byte[] ret = new byte[b.limit() - b.position()]; + b.get(ret); + return ret; + } + + public static final short[] convertShortBuffer(ShortBuffer b) { + short[] ret = new short[b.limit() - b.position()]; + b.get(ret); + return ret; + } + + public static final int[] convertIntBuffer(IntBuffer b) { + int[] ret = new int[b.limit() - b.position()]; + b.get(ret); + return ret; + } + + public static final float[] convertFloatBuffer(FloatBuffer b) { + float[] ret = new float[b.limit() - b.position()]; + b.get(ret); + return ret; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java new file mode 100644 index 0000000..963ee3a --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java @@ -0,0 +1,79 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSProperty; +import org.teavm.jso.core.JSString; +import org.teavm.jso.indexeddb.IDBCountRequest; +import org.teavm.jso.indexeddb.IDBCursorRequest; +import org.teavm.jso.indexeddb.IDBCursorSource; +import org.teavm.jso.indexeddb.IDBDatabase; +import org.teavm.jso.indexeddb.IDBGetRequest; +import org.teavm.jso.indexeddb.IDBIndex; +import org.teavm.jso.indexeddb.IDBKeyRange; +import org.teavm.jso.indexeddb.IDBObjectStoreParameters; +import org.teavm.jso.indexeddb.IDBRequest; +import org.teavm.jso.indexeddb.IDBTransaction; + +public abstract class IDBObjectStorePatched implements JSObject, IDBCursorSource { + + @JSBody(params = { "db", "name", "optionalParameters" }, script = "return db.createObjectStore(name, optionalParameters);") + public static native IDBObjectStorePatched createObjectStorePatch(IDBDatabase db, String name, IDBObjectStoreParameters optionalParameters); + + @JSBody(params = { "tx", "name" }, script = "return tx.objectStore(name);") + public static native IDBObjectStorePatched objectStorePatch(IDBTransaction tx, String name); + + @JSProperty + public abstract String getName(); + + @JSProperty("keyPath") + abstract JSObject getKeyPathImpl(); + + public final String[] getKeyPath() { + JSObject result = getKeyPathImpl(); + if (JSString.isInstance(result)) { + return new String[] { result.cast().stringValue() }; + } else { + return unwrapStringArray(result); + } + } + + @JSBody(params = { "obj" }, script = "return this;") + private static native String[] unwrapStringArray(JSObject obj); + + @JSProperty + public abstract String[] getIndexNames(); + + @JSProperty + public abstract boolean isAutoIncrement(); + + public abstract IDBRequest put(JSObject value, JSObject key); + + public abstract IDBRequest put(JSObject value); + + public abstract IDBRequest add(JSObject value, JSObject key); + + public abstract IDBRequest add(JSObject value); + + public abstract IDBRequest delete(JSObject key); + + public abstract IDBGetRequest get(JSObject key); + + public abstract IDBRequest clear(); + + public abstract IDBCursorRequest openCursor(); + + public abstract IDBCursorRequest openCursor(IDBKeyRange range); + + public abstract IDBIndex createIndex(String name, String key); + + public abstract IDBIndex createIndex(String name, String[] keys); + + public abstract IDBIndex index(String name); + + public abstract void deleteIndex(String name); + + public abstract IDBCountRequest count(); + + public abstract IDBCountRequest count(JSObject key); +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java new file mode 100644 index 0000000..8818206 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java @@ -0,0 +1,407 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import java.util.Collection; +import java.util.LinkedList; + +import org.teavm.interop.Async; +import org.teavm.interop.AsyncCallback; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.jso.dom.events.EventListener; +import org.teavm.jso.indexeddb.EventHandler; +import org.teavm.jso.indexeddb.IDBCountRequest; +import org.teavm.jso.indexeddb.IDBCursor; +import org.teavm.jso.indexeddb.IDBCursorRequest; +import org.teavm.jso.indexeddb.IDBDatabase; +import org.teavm.jso.indexeddb.IDBFactory; +import org.teavm.jso.indexeddb.IDBGetRequest; +import org.teavm.jso.indexeddb.IDBObjectStoreParameters; +import org.teavm.jso.indexeddb.IDBOpenDBRequest; +import org.teavm.jso.indexeddb.IDBRequest; +import org.teavm.jso.indexeddb.IDBTransaction; +import org.teavm.jso.indexeddb.IDBVersionChangeEvent; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Uint8Array; + +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2; +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.FileEntry; + +public class IndexedDBFilesystem { + + public static enum OpenState { + OPENED, LOCKED, ERROR + } + + private static String err = ""; + private static IDBDatabase db = null; + + public static final OpenState initialize() { + DatabaseOpen dbo = AsyncHandlers.openDB("_net_PeytonPlayz585_ClassicCraft_IndexedDBFilesystem_1_3"); + if(dbo == null) { + err = "Unknown Error"; + return OpenState.ERROR; + } + if(dbo.failedLocked) { + return OpenState.LOCKED; + } + if(dbo.failedInit || dbo.database == null) { + err = dbo.failedError == null ? "Initialization Failed" : dbo.failedError; + return OpenState.ERROR; + } + db = dbo.database; + return OpenState.OPENED; + } + + public static final String errorDetail() { + return err; + } + + public static final boolean fileExists(String path) { + return AsyncHandlers.fileGetType(db, path) == FileExists.FILE; + } + + public static final boolean directoryExists(String path) { + return AsyncHandlers.fileGetType(db, path) == FileExists.DIRECTORY; + } + + public static final boolean pathExists(String path) { + return AsyncHandlers.fileExists(db, path).bool; + } + + private static final void mkdir(String dir) { + if(directoryExists(dir)) { + return; + } + int i = dir.lastIndexOf('/'); + if(i > 0) { + mkdir(dir.substring(0, i)); + } + AsyncHandlers.writeWholeFile(db, dir, true, ArrayBuffer.create(0)); + } + + public static final void writeFile(String path, byte[] data) { + int i = path.lastIndexOf('/'); + if(i > 0) { + mkdir(path.substring(0, i)); + } + Uint8Array arr = Uint8Array.create(data.length); + arr.set(data); + AsyncHandlers.writeWholeFile(db, path, false, arr.getBuffer()); + } + + public static final byte[] readFile(String path) { + ArrayBuffer arr = AsyncHandlers.readWholeFile(db, path); + if(arr == null) { + return null; + } + byte[] data = new byte[arr.getByteLength()]; + Uint8Array arrr = Uint8Array.create(arr); + for(int i = 0; i < data.length; ++i) { + data[i] = (byte) arrr.get(i); + } + return data; + } + + public static final long getLastModified(String path) { + int lm = AsyncHandlers.fileGetLastModified(db, path); + return lm == -1 ? -1l : AsyncHandlers.eaglercraftEpoch + lm; + } + + public static final int getFileSize(String path) { + ArrayBuffer arr = AsyncHandlers.readWholeFile(db, path); + if(arr == null) { + return -1; + }else { + return arr.getByteLength(); + } + } + + public static final void renameFile(String oldPath, String newPath) { + copyFile(oldPath, newPath); + AsyncHandlers.deleteFile(db, oldPath); + } + + public static final void copyFile(String oldPath, String newPath) { + ArrayBuffer arr = AsyncHandlers.readWholeFile(db, oldPath); + int i = newPath.lastIndexOf('/'); + if(i > 0) { + mkdir(newPath.substring(0, i)); + } + AsyncHandlers.writeWholeFile(db, newPath, false, arr); + } + + public static final void deleteFile(String path) { + AsyncHandlers.deleteFile(db, path); + } + + public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) { + LinkedList lst = new LinkedList(); + AsyncHandlers.iterateFiles(db, path, listDirs, recursiveDirs, lst); + return lst; + } + + protected static class BooleanResult { + + protected static final BooleanResult TRUE = new BooleanResult(true); + protected static final BooleanResult FALSE = new BooleanResult(false); + + protected final boolean bool; + + private BooleanResult(boolean b) { + bool = b; + } + + protected static BooleanResult _new(boolean b) { + return b ? TRUE : FALSE; + } + + } + + protected static class DatabaseOpen { + + protected final boolean failedInit; + protected final boolean failedLocked; + protected final String failedError; + + protected final IDBDatabase database; + + protected DatabaseOpen(boolean init, boolean locked, String error, IDBDatabase db) { + failedInit = init; + failedLocked = locked; + failedError = error; + database = db; + } + + } + + protected static enum FileExists { + FILE, DIRECTORY, FALSE + } + + @JSBody(script = "return ((typeof indexedDB) !== 'undefined') ? indexedDB : null;") + protected static native IDBFactory createIDBFactory(); + + protected static class AsyncHandlers { + + protected static final long eaglercraftEpoch = 1645568542000l; + + @Async + protected static native DatabaseOpen openDB(String name); + + private static void openDB(String name, final AsyncCallback cb) { + IDBFactory i = createIDBFactory(); + if(i == null) { + cb.complete(new DatabaseOpen(false, false, "window.indexedDB was null or undefined", null)); + return; + } + final IDBOpenDBRequest f = i.open(name, 1); + f.setOnBlocked(new EventHandler() { + public void handleEvent() { + cb.complete(new DatabaseOpen(false, true, null, null)); + } + }); + f.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(new DatabaseOpen(false, false, null, f.getResult())); + } + }); + f.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(new DatabaseOpen(true, false, "open error", null)); + } + }); + f.setOnUpgradeNeeded(new EventListener() { + public void handleEvent(IDBVersionChangeEvent evt) { + IDBObjectStorePatched.createObjectStorePatch(f.getResult(), "filesystem", IDBObjectStoreParameters.create().keyPath("path")); + } + }); + } + + @Async + protected static native BooleanResult deleteFile(IDBDatabase db, String name); + + private static void deleteFile(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readwrite"); + final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").delete(makeTheFuckingKeyWork(name)); + + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(true)); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(false)); + } + }); + } + + @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? null : ((typeof obj.data === 'undefined') ? null : obj.data);") + protected static native ArrayBuffer readRow(JSObject obj); + + @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? false : ((typeof obj.directory === 'undefined') ? false : obj.directory);") + protected static native boolean isRowDirectory(JSObject obj); + + @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? -1 : ((typeof obj.lastModified === 'undefined') ? -1 : obj.lastModified);") + protected static native int readLastModified(JSObject obj); + + @JSBody(params = { "obj" }, script = "return [obj];") + private static native JSObject makeTheFuckingKeyWork(String k); + + @Async + protected static native ArrayBuffer readWholeFile(IDBDatabase db, String name); + + private static void readWholeFile(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(isRowDirectory(r.getResult()) ? null : readRow(r.getResult())); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(null); + } + }); + + } + + @Async + protected static native Integer readLastModified(IDBDatabase db, String name); + + private static void readLastModified(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(readLastModified(r.getResult())); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(-1); + } + }); + + } + + @JSBody(params = { "k" }, script = "return ((typeof k) === \"string\") ? k : (((typeof k) === \"undefined\") ? null : (((typeof k[0]) === \"string\") ? k[0] : null));") + private static native String readKey(JSObject k); + + @Async + protected static native Integer iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst); + + private static void iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBCursorRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").openCursor(); + final int[] res = new int[1]; + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + IDBCursor c = r.getResult(); + if(c == null || c.getKey() == null || c.getValue() == null) { + cb.complete(res[0]); + return; + } + String k = readKey(c.getKey()); + if(k != null) { + if(k.startsWith(prefix)) { + if(recursiveDirs || k.indexOf('/', prefix.length() + 1) == -1) { + boolean dir = isRowDirectory(c.getValue()); + if(dir) { + if(listDirs) { + lst.add(new EaglerAdapterImpl2.FileEntry(k, true, -1)); + } + }else { + lst.add(new EaglerAdapterImpl2.FileEntry(k, false, eaglercraftEpoch + readLastModified(c.getValue()))); + } + } + } + } + c.doContinue(); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(res[0] > 0 ? res[0] : -1); + } + }); + } + + @Async + protected static native BooleanResult fileExists(IDBDatabase db, String name); + + private static void fileExists(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBCountRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").count(makeTheFuckingKeyWork(name)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(r.getResult() > 0)); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(false)); + } + }); + } + + @Async + protected static native Integer fileGetLastModified(IDBDatabase db, String name); + + private static void fileGetLastModified(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(readLastModified(r.getResult())); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(-1); + } + }); + } + + @Async + protected static native FileExists fileGetType(IDBDatabase db, String name); + + private static void fileGetType(IDBDatabase db, String name, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readonly"); + final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(r.getResult() == null ? FileExists.FALSE : (isRowDirectory(r.getResult()) ? FileExists.DIRECTORY : FileExists.FILE)); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(FileExists.FALSE); + } + }); + } + + @JSBody(params = { "pat", "dir", "lm", "dat" }, script = "return { path: pat, directory: dir, lastModified: lm, data: dat };") + protected static native JSObject writeRow(String name, boolean directory, int lm, ArrayBuffer data); + + @Async + protected static native BooleanResult writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data); + + private static void writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data, final AsyncCallback cb) { + IDBTransaction tx = db.transaction("filesystem", "readwrite"); + final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").put(writeRow(name, directory, (int)(System.currentTimeMillis() - eaglercraftEpoch), data)); + r.setOnSuccess(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(true)); + } + }); + r.setOnError(new EventHandler() { + public void handleEvent() { + cb.complete(BooleanResult._new(false)); + } + }); + } + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java new file mode 100644 index 0000000..91c0487 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java @@ -0,0 +1,42 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import org.teavm.jso.webgl.WebGLRenderingContext; + +public interface WebGL2RenderingContext extends WebGLRenderingContext { + + int TEXTURE_MAX_LEVEL = 0x0000813D; + int TEXTURE_MAX_ANISOTROPY_EXT = 0x000084FE; + int UNSIGNED_INT_24_8 = 0x000084FA; + int ANY_SAMPLES_PASSED = 0x00008D6A; + int QUERY_RESULT = 0x00008866; + int QUERY_RESULT_AVAILABLE = 0x00008867; + int DEPTH24_STENCIL8 = 0x000088F0; + int DEPTH_COMPONENT32F = 0x00008CAC; + int READ_FRAMEBUFFER = 0x00008CA8; + int DRAW_FRAMEBUFFER = 0x00008CA9; + int RGB8 = 0x00008051; + int RGBA8 = 0x00008058; + + WebGLQuery createQuery(); + + void beginQuery(int p1, WebGLQuery obj); + + void endQuery(int p1); + + void deleteQuery(WebGLQuery obj); + + int getQueryParameter(WebGLQuery obj, int p2); + + WebGLVertexArray createVertexArray(); + + void deleteVertexArray(WebGLVertexArray obj); + + void bindVertexArray(WebGLVertexArray obj); + + void renderbufferStorageMultisample(int p1, int p2, int p3, int p4, int p5); + + void blitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10); + + void drawBuffers(int[] p1); + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java new file mode 100644 index 0000000..40c65c0 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java @@ -0,0 +1,6 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import org.teavm.jso.JSObject; + +public interface WebGLQuery extends JSObject { +} diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java new file mode 100644 index 0000000..34d1c5f --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java @@ -0,0 +1,6 @@ +package net.lax1dude.eaglercraft.adapter.teavm; + +import org.teavm.jso.JSObject; + +public interface WebGLVertexArray extends JSObject { +} diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java new file mode 100644 index 0000000..3410599 --- /dev/null +++ b/src/main/java/net/minecraft/client/Minecraft.java @@ -0,0 +1,952 @@ +package net.minecraft.client; + +import java.io.File; +import net.minecraft.src.AxisAlignedBB; +import net.minecraft.src.Block; +import net.minecraft.src.EffectRenderer; +import net.minecraft.src.EntityPlayer; +import net.minecraft.src.EntityPlayerSP; +import net.minecraft.src.EntityRenderer; +import net.minecraft.src.FontRenderer; +import net.minecraft.src.GLAllocation; +import net.minecraft.src.GameSettings; +import net.minecraft.src.GameWindowListener; +import net.minecraft.src.GuiChat; +import net.minecraft.src.GuiConflictWarning; +import net.minecraft.src.GuiGameOver; +import net.minecraft.src.GuiIngame; +import net.minecraft.src.GuiIngameMenu; +import net.minecraft.src.GuiInventory; +import net.minecraft.src.GuiMainMenu; +import net.minecraft.src.GuiScreen; +import net.minecraft.src.GuiUnused; +import net.minecraft.src.ItemRenderer; +import net.minecraft.src.ItemStack; +import net.minecraft.src.LoadingScreenRenderer; +import net.minecraft.src.MathHelper; +import net.minecraft.src.MinecraftError; +import net.minecraft.src.MinecraftException; +import net.minecraft.src.ModelBiped; +import net.minecraft.src.MouseHelper; +import net.minecraft.src.MovementInputFromOptions; +import net.minecraft.src.MovingObjectPosition; +import net.minecraft.src.PlayerController; +import net.minecraft.src.PlayerControllerTest; +import net.minecraft.src.RenderEngine; +import net.minecraft.src.RenderGlobal; +import net.minecraft.src.RenderManager; +import net.minecraft.src.ScaledResolution; +import net.minecraft.src.Session; +import net.minecraft.src.Teleporter; +import net.minecraft.src.Tessellator; +import net.minecraft.src.TextureCompassFX; +import net.minecraft.src.TextureFlamesFX; +import net.minecraft.src.TextureLavaFX; +import net.minecraft.src.TextureLavaFlowFX; +import net.minecraft.src.TexturePortalFX; +import net.minecraft.src.TextureWatchFX; +import net.minecraft.src.TextureWaterFX; +import net.minecraft.src.TexureWaterFlowFX; +import net.minecraft.src.ThreadSleepForever; +import net.minecraft.src.Timer; +import net.minecraft.src.UnexpectedThrowable; +import net.minecraft.src.Vec3D; +import net.minecraft.src.World; +import net.minecraft.src.WorldProvider; +import net.minecraft.src.WorldProviderHell; +import net.minecraft.src.WorldRenderer; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +public class Minecraft implements Runnable { + public PlayerController field_6327_b; + public int displayWidth; + public int displayHeight; + private Timer timer = new Timer(20.0F); + public World theWorld; + public RenderGlobal field_6323_f; + public EntityPlayerSP thePlayer; + public EffectRenderer field_6321_h; + public Session field_6320_i = null; + public String field_6319_j; + public boolean field_6317_l = true; + public volatile boolean field_6316_m = false; + public RenderEngine renderEngine; + public FontRenderer fontRenderer; + public GuiScreen currentScreen = null; + public LoadingScreenRenderer loadingScreen = new LoadingScreenRenderer(this); + public EntityRenderer field_9243_r = new EntityRenderer(this); + private int ticksRan = 0; + private int field_6282_S = 0; + private int field_9236_T; + private int field_9235_U; + public String field_6310_s = null; + public int field_6309_t = 0; + public GuiIngame ingameGUI; + public boolean field_6307_v = false; + public ModelBiped field_9242_w = new ModelBiped(0.0F); + public MovingObjectPosition objectMouseOver = null; + public GameSettings gameSettings; + public MouseHelper mouseHelper; + public File field_6297_D; + public static long[] field_9240_E = new long[512]; + public static long[] field_9239_F = new long[512]; + public static int field_9238_G = 0; + private String field_9234_V; + private int field_9233_W; + private TextureWaterFX field_9232_X = new TextureWaterFX(); + private TextureLavaFX field_9231_Y = new TextureLavaFX(); + private static File minecraftDir = null; + public volatile boolean running = true; + public String field_6292_I = ""; + boolean field_6291_J = false; + long field_6290_K = -1L; + public boolean field_6289_L = false; + private int field_6302_aa = 0; + public boolean field_6288_M = false; + long field_6287_N = System.currentTimeMillis(); + private int field_6300_ab = 0; + + public Minecraft() { + this.field_9236_T = GL11.getCanvasWidth(); + this.field_9235_U = GL11.getCanvasHeight(); + new ThreadSleepForever(this, "Timer hack thread"); + this.displayWidth = GL11.getCanvasWidth(); + this.displayHeight = GL11.getCanvasHeight(); + } + + public void func_6258_a(String var1, int var2) { + this.field_9234_V = var1; + this.field_9233_W = var2; + } + + public void startGame() { + + RenderManager.instance.field_4236_f = new ItemRenderer(this); + this.field_6297_D = getMinecraftDir(); + this.gameSettings = new GameSettings(this, this.field_6297_D); + this.renderEngine = new RenderEngine(this.gameSettings); + this.fontRenderer = new FontRenderer(this.gameSettings, "/font/default.png", this.renderEngine); + this.loadScreen(); + this.mouseHelper = new MouseHelper(); + + this.checkGLError("Pre startup"); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glClearDepth(1.0F); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glCullFace(GL11.GL_BACK); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + this.checkGLError("Startup"); + this.renderEngine.registerTextureFX(this.field_9231_Y); + this.renderEngine.registerTextureFX(this.field_9232_X); + this.renderEngine.registerTextureFX(new TexturePortalFX()); + this.renderEngine.registerTextureFX(new TextureCompassFX(this)); + this.renderEngine.registerTextureFX(new TextureWatchFX(this)); + this.renderEngine.registerTextureFX(new TexureWaterFlowFX()); + this.renderEngine.registerTextureFX(new TextureLavaFlowFX()); + this.renderEngine.registerTextureFX(new TextureFlamesFX(0)); + this.renderEngine.registerTextureFX(new TextureFlamesFX(1)); + this.field_6323_f = new RenderGlobal(this, this.renderEngine); + GL11.glViewport(0, 0, this.displayWidth, this.displayHeight); + this.field_6321_h = new EffectRenderer(this.theWorld, this.renderEngine); + + this.checkGLError("Post startup"); + this.ingameGUI = new GuiIngame(this); + this.displayGuiScreen(new GuiMainMenu()); + } + + private void loadScreen() { + ScaledResolution var1 = new ScaledResolution(this.displayWidth, this.displayHeight); + int var2 = var1.getScaledWidth(); + int var3 = var1.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var2, (double)var3, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + GL11.glViewport(0, 0, this.displayWidth, this.displayHeight); + GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); + Tessellator var4 = Tessellator.instance; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_FOG); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/title/mojang.png")); + var4.startDrawingQuads(); + var4.setColorOpaque_I(16777215); + var4.addVertexWithUV(0.0D, (double)this.displayHeight, 0.0D, 0.0D, 0.0D); + var4.addVertexWithUV((double)this.displayWidth, (double)this.displayHeight, 0.0D, 0.0D, 0.0D); + var4.addVertexWithUV((double)this.displayWidth, 0.0D, 0.0D, 0.0D, 0.0D); + var4.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + var4.draw(); + short var5 = 256; + short var6 = 256; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var4.setColorOpaque_I(16777215); + this.func_6274_a((this.displayWidth / 2 - var5) / 2, (this.displayHeight / 2 - var6) / 2, 0, 0, var5, var6); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_FOG); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + } + + public void func_6274_a(int var1, int var2, int var3, int var4, int var5, int var6) { + float var7 = 0.00390625F; + float var8 = 0.00390625F; + Tessellator var9 = Tessellator.instance; + var9.startDrawingQuads(); + var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), 0.0D, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + var6) * var8)); + var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), 0.0D, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + var6) * var8)); + var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), 0.0D, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + 0) * var8)); + var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), 0.0D, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + 0) * var8)); + var9.draw(); + } + + public static File getMinecraftDir() { + if(minecraftDir == null) { + minecraftDir = new File("minecraft"); + } + + return minecraftDir; + } + + public void displayGuiScreen(GuiScreen var1) { + if(!(this.currentScreen instanceof GuiUnused)) { + if(this.currentScreen != null) { + this.currentScreen.onGuiClosed(); + } + + if(var1 == null && this.theWorld == null) { + var1 = new GuiMainMenu(); + } else if(var1 == null && this.thePlayer.health <= 0) { + var1 = new GuiGameOver(); + } + + this.currentScreen = (GuiScreen)var1; + if(var1 != null) { + this.func_6273_f(); + ScaledResolution var2 = new ScaledResolution(this.displayWidth, this.displayHeight); + int var3 = var2.getScaledWidth(); + int var4 = var2.getScaledHeight(); + ((GuiScreen)var1).setWorldAndResolution(this, var3, var4); + this.field_6307_v = false; + } else { + this.func_6259_e(); + } + + } + } + + private void checkGLError(String var1) { + int var2 = GL11.glGetError(); + if(var2 != 0) { + String var3 = GLU.gluErrorString(var2); + System.out.println("########## GL ERROR ##########"); + System.out.println("@ " + var1); + System.out.println(var2 + ": " + var3); + System.exit(0); + } + + } + + public void func_6266_c() { + System.out.println("Stopping!"); + this.func_6261_a((World)null); + GLAllocation.deleteTexturesAndDisplayLists(); + System.gc(); + } + + public void run() { + this.running = true; + + try { + this.startGame(); + } catch (Exception var15) { + var15.printStackTrace(); + new UnexpectedThrowable("Failed to start game", var15); + return; + } + + try { + try { + long var1 = System.currentTimeMillis(); + int var3 = 0; + + while(this.running) { + AxisAlignedBB.clearBoundingBoxPool(); + Vec3D.initialize(); + + if(this.field_6316_m && this.theWorld != null) { + float var4 = this.timer.renderPartialTicks; + this.timer.updateTimer(); + this.timer.renderPartialTicks = var4; + } else { + this.timer.updateTimer(); + } + + long var19 = System.nanoTime(); + + for(int var6 = 0; var6 < this.timer.elapsedTicks; ++var6) { + ++this.ticksRan; + + try { + this.runTick(); + } catch (MinecraftException var14) { + this.theWorld = null; + this.func_6261_a((World)null); + this.displayGuiScreen(new GuiConflictWarning()); + } + } + + long var20 = System.nanoTime() - var19; + this.checkGLError("Pre render"); + GL11.glEnable(GL11.GL_TEXTURE_2D); + if(this.theWorld != null) { + while(this.theWorld.func_6465_g()) { + } + } + + if(this.gameSettings.limitFramerate) { + Thread.sleep(5L); + } + + if(!this.field_6307_v) { + if(this.field_6327_b != null) { + this.field_6327_b.func_6467_a(this.timer.renderPartialTicks); + } + + this.field_9243_r.func_4136_b(this.timer.renderPartialTicks); + } + + if(!GL11.isFocused()) { + Thread.sleep(10L); + } + + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(4)) { + this.func_6238_a(var20); + } else { + this.field_6290_K = System.nanoTime(); + } + + Thread.yield(); + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(8)) { + GL11.updateDisplay(); + } + + if((GL11.getCanvasWidth() != this.displayWidth || GL11.getCanvasHeight() != this.displayHeight)) { + this.displayWidth = GL11.getCanvasWidth(); + this.displayHeight = GL11.getCanvasHeight(); + if(this.displayWidth <= 0) { + this.displayWidth = 1; + } + + if(this.displayHeight <= 0) { + this.displayHeight = 1; + } + + this.resize(this.displayWidth, this.displayHeight); + } + + this.checkGLError("Post render"); + ++var3; + + for(this.field_6316_m = true && this.currentScreen != null && this.currentScreen.doesGuiPauseGame(); System.currentTimeMillis() >= var1 + 1000L; var3 = 0) { + this.field_6292_I = var3 + " fps, " + WorldRenderer.field_1762_b + " chunk updates"; + WorldRenderer.field_1762_b = 0; + var1 += 1000L; + } + } + } catch (MinecraftError var16) { + } catch (Throwable var17) { + this.theWorld = null; + var17.printStackTrace(); + new UnexpectedThrowable("Unexpected error", var17); + } + + } finally { + } + } + + private void func_6238_a(long var1) { + long var3 = 16666666L; + if(this.field_6290_K == -1L) { + this.field_6290_K = System.nanoTime(); + } + + long var5 = System.nanoTime(); + field_9239_F[field_9238_G & field_9240_E.length - 1] = var1; + field_9240_E[field_9238_G++ & field_9240_E.length - 1] = var5 - this.field_6290_K; + this.field_6290_K = var5; + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)this.displayWidth, (double)this.displayHeight, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + GL11.glLineWidth(1.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + Tessellator var7 = Tessellator.instance; + var7.startDrawing(7); + int var8 = (int)(var3 / 200000L); + var7.setColorOpaque_I(536870912); + var7.addVertex(0.0D, (double)(this.displayHeight - var8), 0.0D); + var7.addVertex(0.0D, (double)this.displayHeight, 0.0D); + var7.addVertex((double)field_9240_E.length, (double)this.displayHeight, 0.0D); + var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8), 0.0D); + var7.setColorOpaque_I(538968064); + var7.addVertex(0.0D, (double)(this.displayHeight - var8 * 2), 0.0D); + var7.addVertex(0.0D, (double)(this.displayHeight - var8), 0.0D); + var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8), 0.0D); + var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8 * 2), 0.0D); + var7.draw(); + long var9 = 0L; + + int var11; + for(var11 = 0; var11 < field_9240_E.length; ++var11) { + var9 += field_9240_E[var11]; + } + + var11 = (int)(var9 / 200000L / (long)field_9240_E.length); + var7.startDrawing(7); + var7.setColorOpaque_I(541065216); + var7.addVertex(0.0D, (double)(this.displayHeight - var11), 0.0D); + var7.addVertex(0.0D, (double)this.displayHeight, 0.0D); + var7.addVertex((double)field_9240_E.length, (double)this.displayHeight, 0.0D); + var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var11), 0.0D); + var7.draw(); + var7.startDrawing(1); + + for(int var12 = 0; var12 < field_9240_E.length; ++var12) { + int var13 = (var12 - field_9238_G & field_9240_E.length - 1) * 255 / field_9240_E.length; + int var14 = var13 * var13 / 255; + var14 = var14 * var14 / 255; + int var15 = var14 * var14 / 255; + var15 = var15 * var15 / 255; + if(field_9240_E[var12] > var3) { + var7.setColorOpaque_I(-16777216 + var14 * 65536); + } else { + var7.setColorOpaque_I(-16777216 + var14 * 256); + } + + long var16 = field_9240_E[var12] / 200000L; + long var18 = field_9239_F[var12] / 200000L; + var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - var16) + 0.5F), 0.0D); + var7.addVertex((double)((float)var12 + 0.5F), (double)((float)this.displayHeight + 0.5F), 0.0D); + var7.setColorOpaque_I(-16777216 + var14 * 65536 + var14 * 256 + var14 * 1); + var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - var16) + 0.5F), 0.0D); + var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - (var16 - var18)) + 0.5F), 0.0D); + } + + var7.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public void shutdown() { + this.running = false; + } + + public void func_6259_e() { + if(GL11.isFocused()) { + if(!this.field_6289_L) { + this.field_6289_L = true; + this.mouseHelper.func_774_a(); + this.displayGuiScreen((GuiScreen)null); + this.field_6302_aa = this.ticksRan + 10000; + } + } + } + + public void func_6273_f() { + if(this.field_6289_L) { + if(this.thePlayer != null) { + this.thePlayer.func_458_k(); + } + + this.field_6289_L = false; + this.mouseHelper.func_773_b(); + } + } + + public void func_6252_g() { + if(this.currentScreen == null) { + this.displayGuiScreen(new GuiIngameMenu()); + } + } + + private void func_6254_a(int var1, boolean var2) { + if(!this.field_6327_b.field_1064_b) { + if(var1 != 0 || this.field_6282_S <= 0) { + if(var2 && this.objectMouseOver != null && this.objectMouseOver.typeOfHit == 0 && var1 == 0) { + int var3 = this.objectMouseOver.blockX; + int var4 = this.objectMouseOver.blockY; + int var5 = this.objectMouseOver.blockZ; + this.field_6327_b.sendBlockRemoving(var3, var4, var5, this.objectMouseOver.sideHit); + this.field_6321_h.func_1191_a(var3, var4, var5, this.objectMouseOver.sideHit); + } else { + this.field_6327_b.func_6468_a(); + } + + } + } + } + + private void clickMouse(int var1) { + if(var1 != 0 || this.field_6282_S <= 0) { + if(var1 == 0) { + this.thePlayer.func_457_w(); + } + + boolean var2 = true; + if(this.objectMouseOver == null) { + if(var1 == 0 && !(this.field_6327_b instanceof PlayerControllerTest)) { + this.field_6282_S = 10; + } + } else if(this.objectMouseOver.typeOfHit == 1) { + if(var1 == 0) { + this.field_6327_b.func_6472_b(this.thePlayer, this.objectMouseOver.entityHit); + } + + if(var1 == 1) { + this.field_6327_b.func_6475_a(this.thePlayer, this.objectMouseOver.entityHit); + } + } else if(this.objectMouseOver.typeOfHit == 0) { + int var3 = this.objectMouseOver.blockX; + int var4 = this.objectMouseOver.blockY; + int var5 = this.objectMouseOver.blockZ; + int var6 = this.objectMouseOver.sideHit; + Block var7 = Block.blocksList[this.theWorld.getBlockId(var3, var4, var5)]; + if(var1 == 0) { + this.theWorld.onBlockHit(var3, var4, var5, this.objectMouseOver.sideHit); + if(var7 != Block.bedrock || this.thePlayer.field_9371_f >= 100) { + this.field_6327_b.clickBlock(var3, var4, var5, this.objectMouseOver.sideHit); + } + } else { + ItemStack var8 = this.thePlayer.inventory.getCurrentItem(); + int var9 = var8 != null ? var8.stackSize : 0; + if(this.field_6327_b.sendPlaceBlock(this.thePlayer, this.theWorld, var8, var3, var4, var5, var6)) { + var2 = false; + this.thePlayer.func_457_w(); + } + + if(var8 == null) { + return; + } + + if(var8.stackSize == 0) { + this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null; + } else if(var8.stackSize != var9) { + this.field_9243_r.field_1395_a.func_9449_b(); + } + } + } + + if(var2 && var1 == 1) { + ItemStack var10 = this.thePlayer.inventory.getCurrentItem(); + if(var10 != null && this.field_6327_b.sendUseItem(this.thePlayer, this.theWorld, var10)) { + this.field_9243_r.field_1395_a.func_9450_c(); + } + } + + } + } + + private void resize(int var1, int var2) { + if(var1 <= 0) { + var1 = 1; + } + + if(var2 <= 0) { + var2 = 1; + } + + this.displayWidth = var1; + this.displayHeight = var2; + if(this.currentScreen != null) { + ScaledResolution var3 = new ScaledResolution(var1, var2); + int var4 = var3.getScaledWidth(); + int var5 = var3.getScaledHeight(); + this.currentScreen.setWorldAndResolution(this, var4, var5); + } + + } + + private void clickMiddleMouseButton() { + if(this.objectMouseOver != null) { + int var1 = this.theWorld.getBlockId(this.objectMouseOver.blockX, this.objectMouseOver.blockY, this.objectMouseOver.blockZ); + if(var1 == Block.grass.blockID) { + var1 = Block.dirt.blockID; + } + + if(var1 == Block.stairDouble.blockID) { + var1 = Block.stairSingle.blockID; + } + + if(var1 == Block.bedrock.blockID) { + var1 = Block.stone.blockID; + } + + this.thePlayer.inventory.setCurrentItem(var1, this.field_6327_b instanceof PlayerControllerTest); + } + + } + + public void runTick() { + this.ingameGUI.func_555_a(); + this.field_9243_r.func_910_a(1.0F); + if(this.thePlayer != null) { + this.thePlayer.func_6420_o(); + } + + if(!this.field_6316_m && this.theWorld != null) { + this.field_6327_b.func_6474_c(); + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain.png")); +// if(!this.field_6316_m) { +// this.renderEngine.func_1067_a(); +// } + + if(this.currentScreen == null && this.thePlayer != null && this.thePlayer.health <= 0) { + this.displayGuiScreen((GuiScreen)null); + } + + if(this.currentScreen != null) { + this.field_6302_aa = this.ticksRan + 10000; + } + + if(this.currentScreen != null) { + this.currentScreen.handleInput(); + if(this.currentScreen != null) { + this.currentScreen.updateScreen(); + } + } + + if(this.currentScreen == null || this.currentScreen.field_948_f) { + label238: + while(true) { + while(true) { + while(true) { + long var1; + do { + if(!Mouse.next()) { + if(this.field_6282_S > 0) { + --this.field_6282_S; + } + + while(true) { + while(true) { + do { + if(!Keyboard.next()) { + if(this.currentScreen == null) { + if(Mouse.isButtonDown(0) && (float)(this.ticksRan - this.field_6302_aa) >= this.timer.ticksPerSecond / 4.0F && this.field_6289_L) { + this.clickMouse(0); + this.field_6302_aa = this.ticksRan; + } + + if(Mouse.isButtonDown(1) && (float)(this.ticksRan - this.field_6302_aa) >= this.timer.ticksPerSecond / 4.0F && this.field_6289_L) { + this.clickMouse(1); + this.field_6302_aa = this.ticksRan; + } + } + + this.func_6254_a(0, this.currentScreen == null && Mouse.isButtonDown(0) && this.field_6289_L); + break label238; + } + + this.thePlayer.func_460_a(Keyboard.getEventKey(), Keyboard.getEventKeyState()); + } while(!Keyboard.getEventKeyState()); + + if(this.currentScreen != null) { + this.currentScreen.handleKeyboardInput(); + } else { + if(Keyboard.getEventKey() == 1) { + this.func_6252_g(); + } + + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(6)) { + this.gameSettings.thirdPersonView = !this.gameSettings.thirdPersonView; + } + + if(Keyboard.getEventKey() == this.gameSettings.keyBindInventory.keyCode) { + this.displayGuiScreen(new GuiInventory(this.thePlayer.inventory, this.thePlayer.inventory.craftingInventory)); + } + + if(Keyboard.getEventKey() == this.gameSettings.keyBindDrop.keyCode) { + this.thePlayer.dropPlayerItemWithRandomChoice(this.thePlayer.inventory.decrStackSize(this.thePlayer.inventory.currentItem, 1), false); + } + } + + for(int var4 = 0; var4 < 9; ++var4) { + if(Keyboard.getEventKey() == 2 + var4) { + this.thePlayer.inventory.currentItem = var4; + } + } + + if(Keyboard.getEventKey() == this.gameSettings.keyBindToggleFog.keyCode) { + this.gameSettings.setOptionValue(4, !Keyboard.isKeyDown(42) && !Keyboard.isKeyDown(54) ? 1 : -1); + } + } + } + } + + var1 = System.currentTimeMillis() - this.field_6287_N; + } while(var1 > 200L); + + int var3 = Mouse.getEventDWheel(); + if(var3 != 0) { + this.thePlayer.inventory.changeCurrentItem(var3); + } + + if(this.currentScreen == null) { + if(!this.field_6289_L && Mouse.getEventButtonState()) { + this.func_6259_e(); + } else { + if(Mouse.getEventButton() == 0 && Mouse.getEventButtonState()) { + this.clickMouse(0); + this.field_6302_aa = this.ticksRan; + } + + if(Mouse.getEventButton() == 1 && Mouse.getEventButtonState()) { + this.clickMouse(1); + this.field_6302_aa = this.ticksRan; + } + + if(Mouse.getEventButton() == 2 && Mouse.getEventButtonState()) { + this.clickMiddleMouseButton(); + } + } + } else if(this.currentScreen != null) { + this.currentScreen.handleMouseInput(); + } + } + } + } + } + + if(this.theWorld != null) { + if(this.thePlayer != null) { + ++this.field_6300_ab; + if(this.field_6300_ab == 30) { + this.field_6300_ab = 0; + this.theWorld.func_705_f(this.thePlayer); + } + } + + this.theWorld.difficultySetting = this.gameSettings.difficulty; + + if(!this.field_6316_m) { + this.field_9243_r.func_911_a(); + } + + if(!this.field_6316_m) { + this.field_6323_f.func_945_d(); + } + + if(!this.field_6316_m) { + this.theWorld.func_633_c(); + } + + if(!this.field_6316_m) { + this.theWorld.tick(); + } + + if(!this.field_6316_m && this.theWorld != null) { + this.theWorld.randomDisplayUpdates(MathHelper.floor_double(this.thePlayer.posX), MathHelper.floor_double(this.thePlayer.posY), MathHelper.floor_double(this.thePlayer.posZ)); + } + + if(!this.field_6316_m) { + this.field_6321_h.func_1193_a(); + } + } + + this.field_6287_N = System.currentTimeMillis(); + } + + public void func_6247_b(String var1) { + this.func_6261_a((World)null); + System.gc(); + World var2 = new World(new File(getMinecraftDir(), "saves"), var1); + if(var2.field_1033_r) { + this.func_6263_a(var2, "Generating level"); + } else { + this.func_6263_a(var2, "Loading level"); + } + + } + + public void func_6237_k() { + if(this.thePlayer.dimension == -1) { + this.thePlayer.dimension = 0; + } else { + this.thePlayer.dimension = -1; + } + + this.theWorld.setEntityDead(this.thePlayer); + this.thePlayer.isDead = false; + double var1 = this.thePlayer.posX; + double var3 = this.thePlayer.posZ; + double var5 = 8.0D; + World var7; + if(this.thePlayer.dimension == -1) { + var1 /= var5; + var3 /= var5; + this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); + this.theWorld.func_4084_a(this.thePlayer, false); + var7 = new World(this.theWorld, new WorldProviderHell()); + this.func_6256_a(var7, "Entering the Nether", this.thePlayer); + } else { + var1 *= var5; + var3 *= var5; + this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); + this.theWorld.func_4084_a(this.thePlayer, false); + var7 = new World(this.theWorld, new WorldProvider()); + this.func_6256_a(var7, "Leaving the Nether", this.thePlayer); + } + + this.thePlayer.worldObj = this.theWorld; + this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); + this.theWorld.func_4084_a(this.thePlayer, false); + (new Teleporter()).func_4107_a(this.theWorld, this.thePlayer); + } + + public void func_6261_a(World var1) { + this.func_6263_a(var1, ""); + } + + public void func_6263_a(World var1, String var2) { + this.func_6256_a(var1, var2, (EntityPlayer)null); + } + + public void func_6256_a(World var1, String var2, EntityPlayer var3) { + this.loadingScreen.func_596_a(var2); + this.loadingScreen.displayLoadingString(""); + if(this.theWorld != null) { + this.theWorld.func_651_a(this.loadingScreen); + } + + this.theWorld = var1; + System.out.println("Player is " + this.thePlayer); + if(var1 != null) { + this.field_6327_b.func_717_a(var1); + //if(!this.isMultiplayerWorld()) { + if(var3 == null) { + this.thePlayer = (EntityPlayerSP)var1.func_4085_a(EntityPlayerSP.class); + } + //} + + //if(!var1.multiplayerWorld) { + this.func_6255_d(var2); + //} + + System.out.println("Player is now " + this.thePlayer); + if(this.thePlayer == null) { + this.thePlayer = (EntityPlayerSP)this.field_6327_b.func_4087_b(var1); + this.thePlayer.preparePlayerToSpawn(); + this.field_6327_b.flipPlayer(this.thePlayer); + } + + this.thePlayer.field_787_a = new MovementInputFromOptions(this.gameSettings); + if(this.field_6323_f != null) { + this.field_6323_f.func_946_a(var1); + } + + if(this.field_6321_h != null) { + this.field_6321_h.func_1188_a(var1); + } + + this.field_6327_b.func_6473_b(this.thePlayer); + if(var3 != null) { + var1.func_6464_c(); + } + + var1.func_608_a(this.thePlayer); + if(var1.field_1033_r) { + var1.func_651_a(this.loadingScreen); + } + } else { + this.thePlayer = null; + } + + System.gc(); + this.field_6287_N = 0L; + } + + private void func_6255_d(String var1) { + this.loadingScreen.func_596_a(var1); + this.loadingScreen.displayLoadingString("Building terrain"); + short var2 = 128; + int var3 = 0; + int var4 = var2 * 2 / 16 + 1; + var4 *= var4; + + for(int var5 = -var2; var5 <= var2; var5 += 16) { + int var6 = this.theWorld.spawnX; + int var7 = this.theWorld.spawnZ; + if(this.thePlayer != null) { + var6 = (int)this.thePlayer.posX; + var7 = (int)this.thePlayer.posZ; + } + + for(int var8 = -var2; var8 <= var2; var8 += 16) { + this.loadingScreen.setLoadingProgress(var3++ * 100 / var4); + this.theWorld.getBlockId(var6 + var5, 64, var7 + var8); + + while(this.theWorld.func_6465_g()) { + } + } + } + + this.loadingScreen.displayLoadingString("Simulating world for a bit"); + boolean var9 = true; + this.theWorld.func_656_j(); + } + + public String func_6241_m() { + return this.field_6323_f.func_953_b(); + } + + public String func_6262_n() { + return this.field_6323_f.func_957_c(); + } + + public String func_6245_o() { + return "P: " + this.field_6321_h.func_1190_b() + ". T: " + this.theWorld.func_687_d(); + } + + public void respawn() { + if(!this.theWorld.worldProvider.func_6477_d()) { + this.func_6237_k(); + } + + this.theWorld.func_4076_b(); + this.theWorld.func_9424_o(); + int var1 = 0; + if(this.thePlayer != null) { + var1 = this.thePlayer.field_620_ab; + this.theWorld.setEntityDead(this.thePlayer); + } + + this.thePlayer = (EntityPlayerSP)this.field_6327_b.func_4087_b(this.theWorld); + this.thePlayer.preparePlayerToSpawn(); + this.field_6327_b.flipPlayer(this.thePlayer); + this.theWorld.func_608_a(this.thePlayer); + this.thePlayer.field_787_a = new MovementInputFromOptions(this.gameSettings); + this.thePlayer.field_620_ab = var1; + this.field_6327_b.func_6473_b(this.thePlayer); + this.func_6255_d("Respawning"); + if(this.currentScreen instanceof GuiGameOver) { + this.displayGuiScreen((GuiScreen)null); + } + + } +} diff --git a/src/main/java/net/minecraft/src/AxisAlignedBB.java b/src/main/java/net/minecraft/src/AxisAlignedBB.java new file mode 100644 index 0000000..5112e40 --- /dev/null +++ b/src/main/java/net/minecraft/src/AxisAlignedBB.java @@ -0,0 +1,317 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +public class AxisAlignedBB { + private static List boundingBoxes = new ArrayList(); + private static int numBoundingBoxesInUse = 0; + public double minX; + public double minY; + public double minZ; + public double maxX; + public double maxY; + public double maxZ; + + public static AxisAlignedBB getBoundingBox(double var0, double var2, double var4, double var6, double var8, double var10) { + return new AxisAlignedBB(var0, var2, var4, var6, var8, var10); + } + + public static void clearBoundingBoxPool() { + numBoundingBoxesInUse = 0; + } + + public static AxisAlignedBB getBoundingBoxFromPool(double var0, double var2, double var4, double var6, double var8, double var10) { + if(numBoundingBoxesInUse >= boundingBoxes.size()) { + boundingBoxes.add(getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D)); + } + + return ((AxisAlignedBB)boundingBoxes.get(numBoundingBoxesInUse++)).setBounds(var0, var2, var4, var6, var8, var10); + } + + private AxisAlignedBB(double var1, double var3, double var5, double var7, double var9, double var11) { + this.minX = var1; + this.minY = var3; + this.minZ = var5; + this.maxX = var7; + this.maxY = var9; + this.maxZ = var11; + } + + public AxisAlignedBB setBounds(double var1, double var3, double var5, double var7, double var9, double var11) { + this.minX = var1; + this.minY = var3; + this.minZ = var5; + this.maxX = var7; + this.maxY = var9; + this.maxZ = var11; + return this; + } + + public AxisAlignedBB addCoord(double var1, double var3, double var5) { + double var7 = this.minX; + double var9 = this.minY; + double var11 = this.minZ; + double var13 = this.maxX; + double var15 = this.maxY; + double var17 = this.maxZ; + if(var1 < 0.0D) { + var7 += var1; + } + + if(var1 > 0.0D) { + var13 += var1; + } + + if(var3 < 0.0D) { + var9 += var3; + } + + if(var3 > 0.0D) { + var15 += var3; + } + + if(var5 < 0.0D) { + var11 += var5; + } + + if(var5 > 0.0D) { + var17 += var5; + } + + return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17); + } + + public AxisAlignedBB expands(double var1, double var3, double var5) { + double var7 = this.minX - var1; + double var9 = this.minY - var3; + double var11 = this.minZ - var5; + double var13 = this.maxX + var1; + double var15 = this.maxY + var3; + double var17 = this.maxZ + var5; + return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17); + } + + public AxisAlignedBB getOffsetBoundingBox(double var1, double var3, double var5) { + return getBoundingBoxFromPool(this.minX + var1, this.minY + var3, this.minZ + var5, this.maxX + var1, this.maxY + var3, this.maxZ + var5); + } + + public double func_1163_a(AxisAlignedBB var1, double var2) { + if(var1.maxY > this.minY && var1.minY < this.maxY) { + if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) { + double var4; + if(var2 > 0.0D && var1.maxX <= this.minX) { + var4 = this.minX - var1.maxX; + if(var4 < var2) { + var2 = var4; + } + } + + if(var2 < 0.0D && var1.minX >= this.maxX) { + var4 = this.maxX - var1.minX; + if(var4 > var2) { + var2 = var4; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public double func_1172_b(AxisAlignedBB var1, double var2) { + if(var1.maxX > this.minX && var1.minX < this.maxX) { + if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) { + double var4; + if(var2 > 0.0D && var1.maxY <= this.minY) { + var4 = this.minY - var1.maxY; + if(var4 < var2) { + var2 = var4; + } + } + + if(var2 < 0.0D && var1.minY >= this.maxY) { + var4 = this.maxY - var1.minY; + if(var4 > var2) { + var2 = var4; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public double func_1162_c(AxisAlignedBB var1, double var2) { + if(var1.maxX > this.minX && var1.minX < this.maxX) { + if(var1.maxY > this.minY && var1.minY < this.maxY) { + double var4; + if(var2 > 0.0D && var1.maxZ <= this.minZ) { + var4 = this.minZ - var1.maxZ; + if(var4 < var2) { + var2 = var4; + } + } + + if(var2 < 0.0D && var1.minZ >= this.maxZ) { + var4 = this.maxZ - var1.minZ; + if(var4 > var2) { + var2 = var4; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public boolean intersectsWith(AxisAlignedBB var1) { + return var1.maxX > this.minX && var1.minX < this.maxX ? (var1.maxY > this.minY && var1.minY < this.maxY ? var1.maxZ > this.minZ && var1.minZ < this.maxZ : false) : false; + } + + public AxisAlignedBB offset(double var1, double var3, double var5) { + this.minX += var1; + this.minY += var3; + this.minZ += var5; + this.maxX += var1; + this.maxY += var3; + this.maxZ += var5; + return this; + } + + public boolean isVecInside(Vec3D var1) { + return var1.xCoord > this.minX && var1.xCoord < this.maxX ? (var1.yCoord > this.minY && var1.yCoord < this.maxY ? var1.zCoord > this.minZ && var1.zCoord < this.maxZ : false) : false; + } + + public double getAverageEdgeLength() { + double var1 = this.maxX - this.minX; + double var3 = this.maxY - this.minY; + double var5 = this.maxZ - this.minZ; + return (var1 + var3 + var5) / 3.0D; + } + + public AxisAlignedBB copy() { + return getBoundingBoxFromPool(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + } + + public MovingObjectPosition func_1169_a(Vec3D var1, Vec3D var2) { + Vec3D var3 = var1.getIntermediateWithXValue(var2, this.minX); + Vec3D var4 = var1.getIntermediateWithXValue(var2, this.maxX); + Vec3D var5 = var1.getIntermediateWithYValue(var2, this.minY); + Vec3D var6 = var1.getIntermediateWithYValue(var2, this.maxY); + Vec3D var7 = var1.getIntermediateWithZValue(var2, this.minZ); + Vec3D var8 = var1.getIntermediateWithZValue(var2, this.maxZ); + if(!this.isVecInYZ(var3)) { + var3 = null; + } + + if(!this.isVecInYZ(var4)) { + var4 = null; + } + + if(!this.isVecInXZ(var5)) { + var5 = null; + } + + if(!this.isVecInXZ(var6)) { + var6 = null; + } + + if(!this.isVecInXY(var7)) { + var7 = null; + } + + if(!this.isVecInXY(var8)) { + var8 = null; + } + + Vec3D var9 = null; + if(var3 != null && (var9 == null || var1.squareDistanceTo(var3) < var1.squareDistanceTo(var9))) { + var9 = var3; + } + + if(var4 != null && (var9 == null || var1.squareDistanceTo(var4) < var1.squareDistanceTo(var9))) { + var9 = var4; + } + + if(var5 != null && (var9 == null || var1.squareDistanceTo(var5) < var1.squareDistanceTo(var9))) { + var9 = var5; + } + + if(var6 != null && (var9 == null || var1.squareDistanceTo(var6) < var1.squareDistanceTo(var9))) { + var9 = var6; + } + + if(var7 != null && (var9 == null || var1.squareDistanceTo(var7) < var1.squareDistanceTo(var9))) { + var9 = var7; + } + + if(var8 != null && (var9 == null || var1.squareDistanceTo(var8) < var1.squareDistanceTo(var9))) { + var9 = var8; + } + + if(var9 == null) { + return null; + } else { + byte var10 = -1; + if(var9 == var3) { + var10 = 4; + } + + if(var9 == var4) { + var10 = 5; + } + + if(var9 == var5) { + var10 = 0; + } + + if(var9 == var6) { + var10 = 1; + } + + if(var9 == var7) { + var10 = 2; + } + + if(var9 == var8) { + var10 = 3; + } + + return new MovingObjectPosition(0, 0, 0, var10, var9); + } + } + + private boolean isVecInYZ(Vec3D var1) { + return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ; + } + + private boolean isVecInXZ(Vec3D var1) { + return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ; + } + + private boolean isVecInXY(Vec3D var1) { + return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY; + } + + public void setBB(AxisAlignedBB var1) { + this.minX = var1.minX; + this.minY = var1.minY; + this.minZ = var1.minZ; + this.maxX = var1.maxX; + this.maxY = var1.maxY; + this.maxZ = var1.maxZ; + } +} diff --git a/src/main/java/net/minecraft/src/Block.java b/src/main/java/net/minecraft/src/Block.java new file mode 100644 index 0000000..51908e0 --- /dev/null +++ b/src/main/java/net/minecraft/src/Block.java @@ -0,0 +1,493 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.Random; + +public class Block { + public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F); + public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F); + public static final StepSound soundGravelFootstep = new StepSound("gravel", 1.0F, 1.0F); + public static final StepSound soundGrassFootstep = new StepSound("grass", 1.0F, 1.0F); + public static final StepSound soundStoneFootstep = new StepSound("stone", 1.0F, 1.0F); + public static final StepSound soundMetalFootstep = new StepSound("stone", 1.0F, 1.5F); + public static final StepSound soundGlassFootstep = new StepSoundStone("stone", 1.0F, 1.0F); + public static final StepSound soundClothFootstep = new StepSound("cloth", 1.0F, 1.0F); + public static final StepSound soundSandFootstep = new StepSoundSand("sand", 1.0F, 1.0F); + public static final Block[] blocksList = new Block[256]; + public static final boolean[] tickOnLoad = new boolean[256]; + public static final boolean[] opaqueCubeLookup = new boolean[256]; + public static final boolean[] isBlockContainer = new boolean[256]; + public static final int[] lightOpacity = new int[256]; + public static final boolean[] field_340_s = new boolean[256]; + public static final int[] lightValue = new int[256]; + public static final Block stone = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final BlockGrass grass = (BlockGrass)(new BlockGrass(2)).setHardness(0.6F).setStepSound(soundGrassFootstep); + public static final Block dirt = (new BlockDirt(3, 2)).setHardness(0.5F).setStepSound(soundGravelFootstep); + public static final Block cobblestone = (new Block(4, 16, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block planks = (new Block(5, 4, Material.wood)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep); + public static final Block sapling = (new BlockSapling(6, 15)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final Block bedrock = (new Block(7, 17, Material.rock)).setHardness(-1.0F).setResistance(6000000.0F).setStepSound(soundStoneFootstep); + public static final Block waterStill = (new BlockFlowing(8, Material.water)).setHardness(100.0F).setLightOpacity(3); + public static final Block waterMoving = (new BlockStationary(9, Material.water)).setHardness(100.0F).setLightOpacity(3); + public static final Block lavaStill = (new BlockFlowing(10, Material.lava)).setHardness(0.0F).setLightValue(1.0F).setLightOpacity(255); + public static final Block lavaMoving = (new BlockStationary(11, Material.lava)).setHardness(100.0F).setLightValue(1.0F).setLightOpacity(255); + public static final Block sand = (new BlockSand(12, 18)).setHardness(0.5F).setStepSound(soundSandFootstep); + public static final Block gravel = (new BlockGravel(13, 19)).setHardness(0.6F).setStepSound(soundGravelFootstep); + public static final Block oreGold = (new BlockOre(14, 32)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block oreIron = (new BlockOre(15, 33)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block oreCoal = (new BlockOre(16, 34)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block wood = (new BlockLog(17)).setHardness(2.0F).setStepSound(soundWoodFootstep); + public static final BlockLeaves leaves = (BlockLeaves)(new BlockLeaves(18, 52)).setHardness(0.2F).setLightOpacity(1).setStepSound(soundGrassFootstep); + public static final Block sponge = (new BlockSponge(19)).setHardness(0.6F).setStepSound(soundGrassFootstep); + public static final Block glass = (new BlockGlass(20, 49, Material.glass, false)).setHardness(0.3F).setStepSound(soundGlassFootstep); + public static final Block field_9267_N = null; + public static final Block field_9266_O = null; + public static final Block field_9265_P = null; + public static final Block field_9264_Q = null; + public static final Block field_9263_R = null; + public static final Block field_9262_S = null; + public static final Block field_9261_T = null; + public static final Block field_9260_U = null; + public static final Block field_9259_V = null; + public static final Block field_9258_W = null; + public static final Block field_9257_X = null; + public static final Block field_9256_Y = null; + public static final Block field_9255_Z = null; + public static final Block field_9269_aa = null; + public static final Block cloth = (new Block(35, 64, Material.cloth)).setHardness(0.8F).setStepSound(soundClothFootstep); + public static final Block field_9268_ac = null; + public static final BlockFlower plantYellow = (BlockFlower)(new BlockFlower(37, 13)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final BlockFlower plantRed = (BlockFlower)(new BlockFlower(38, 12)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final BlockFlower mushroomBrown = (BlockFlower)(new BlockMushroom(39, 29)).setHardness(0.0F).setStepSound(soundGrassFootstep).setLightValue(2.0F / 16.0F); + public static final BlockFlower mushroomRed = (BlockFlower)(new BlockMushroom(40, 28)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final Block blockGold = (new BlockOreBlock(41, 39)).setHardness(3.0F).setResistance(10.0F).setStepSound(soundMetalFootstep); + public static final Block blockSteel = (new BlockOreBlock(42, 38)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep); + public static final Block stairDouble = (new BlockStep(43, true)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block stairSingle = (new BlockStep(44, false)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block brick = (new Block(45, 7, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block tnt = (new BlockTNT(46, 8)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final Block bookShelf = (new BlockBookshelf(47, 35)).setHardness(1.5F).setStepSound(soundWoodFootstep); + public static final Block cobblestoneMossy = (new Block(48, 36, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block obsidian = (new BlockObsidian(49, 37)).setHardness(10.0F).setResistance(2000.0F).setStepSound(soundStoneFootstep); + public static final Block torchWood = (new BlockTorch(50, 80)).setHardness(0.0F).setLightValue(15.0F / 16.0F).setStepSound(soundWoodFootstep); + public static final BlockFire fire = (BlockFire)((BlockFire)(new BlockFire(51, 31)).setHardness(0.0F).setLightValue(1.0F).setStepSound(soundWoodFootstep)); + public static final Block mobSpawner = (new BlockMobSpawner(52, 65)).setHardness(5.0F).setStepSound(soundMetalFootstep); + public static final Block stairCompactPlanks = new BlockStairs(53, planks); + public static final Block crate = (new BlockChest(54)).setHardness(2.5F).setStepSound(soundWoodFootstep); + public static final Block redstoneWire = (new BlockRedstoneWire(55, 84)).setHardness(0.0F).setStepSound(soundPowderFootstep); + public static final Block oreDiamond = (new BlockOre(56, 50)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block blockDiamond = (new BlockOreBlock(57, 40)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep); + public static final Block workbench = (new BlockWorkbench(58)).setHardness(2.5F).setStepSound(soundWoodFootstep); + public static final Block crops = (new BlockCrops(59, 88)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final Block tilledField = (new BlockSoil(60)).setHardness(0.6F).setStepSound(soundGravelFootstep); + public static final Block stoneOvenIdle = (new BlockFurnace(61, false)).setHardness(3.5F).setStepSound(soundStoneFootstep); + public static final Block stoneOvenActive = (new BlockFurnace(62, true)).setHardness(3.5F).setStepSound(soundStoneFootstep).setLightValue(14.0F / 16.0F); + public static final Block signPost = (new BlockSign(63, TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundWoodFootstep); + public static final Block doorWood = (new BlockDoor(64, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep); + public static final Block ladder = (new BlockLadder(65, 83)).setHardness(0.4F).setStepSound(soundWoodFootstep); + public static final Block minecartTrack = (new BlockMinecartTrack(66, 128)).setHardness(0.7F).setStepSound(soundMetalFootstep); + public static final Block stairCompactCobblestone = new BlockStairs(67, cobblestone); + public static final Block signWall = (new BlockSign(68, TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundWoodFootstep); + public static final Block lever = (new BlockLever(69, 96)).setHardness(0.5F).setStepSound(soundWoodFootstep); + public static final Block pressurePlateStone = (new BlockPressurePlate(70, stone.blockIndexInTexture, EnumMobType.mobs)).setHardness(0.5F).setStepSound(soundStoneFootstep); + public static final Block doorSteel = (new BlockDoor(71, Material.iron)).setHardness(5.0F).setStepSound(soundMetalFootstep); + public static final Block pressurePlatePlanks = (new BlockPressurePlate(72, planks.blockIndexInTexture, EnumMobType.everything)).setHardness(0.5F).setStepSound(soundWoodFootstep); + public static final Block oreRedstone = (new BlockRedstoneOre(73, 51, false)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block oreRedstoneGlowing = (new BlockRedstoneOre(74, 51, true)).setLightValue(10.0F / 16.0F).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep); + public static final Block torchRedstoneIdle = (new BlockRedstoneTorch(75, 115, false)).setHardness(0.0F).setStepSound(soundWoodFootstep); + public static final Block torchRedstoneActive = (new BlockRedstoneTorch(76, 99, true)).setHardness(0.0F).setLightValue(0.5F).setStepSound(soundWoodFootstep); + public static final Block button = (new BlockButton(77, stone.blockIndexInTexture)).setHardness(0.5F).setStepSound(soundStoneFootstep); + public static final Block snow = (new BlockSnow(78, 66)).setHardness(0.1F).setStepSound(soundClothFootstep); + public static final Block blockIce = (new BlockIce(79, 67)).setHardness(0.5F).setLightOpacity(3).setStepSound(soundGlassFootstep); + public static final Block blockSnow = (new BlockSnowBlock(80, 66)).setHardness(0.2F).setStepSound(soundClothFootstep); + public static final Block cactus = (new BlockCactus(81, 70)).setHardness(0.4F).setStepSound(soundClothFootstep); + public static final Block blockClay = (new BlockClay(82, 72)).setHardness(0.6F).setStepSound(soundGravelFootstep); + public static final Block reed = (new BlockReed(83, 73)).setHardness(0.0F).setStepSound(soundGrassFootstep); + public static final Block jukebox = (new BlockJukeBox(84, 74)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep); + public static final Block fence = (new BlockFence(85, 4)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep); + public static final Block pumpkin = (new BlockPumpkin(86, 102, false)).setHardness(1.0F).setStepSound(soundWoodFootstep); + public static final Block bloodStone = (new BlockBloodStone(87, 103)).setHardness(0.4F).setStepSound(soundStoneFootstep); + public static final Block slowSand = (new BlockSlowSand(88, 104)).setHardness(0.5F).setStepSound(soundSandFootstep); + public static final Block lightStone = (new BlockLightStone(89, 105, Material.glass)).setHardness(0.3F).setStepSound(soundGlassFootstep).setLightValue(1.0F); + public static final BlockPortal portal = (BlockPortal)((BlockPortal)(new BlockPortal(90, 14)).setHardness(-1.0F).setStepSound(soundGlassFootstep).setLightValue(12.0F / 16.0F)); + public static final Block pumpkinLantern = (new BlockPumpkin(91, 102, true)).setHardness(1.0F).setStepSound(soundWoodFootstep).setLightValue(1.0F); + public int blockIndexInTexture; + public final int blockID; + protected float blockHardness; + protected float blockResistance; + public double field_370_bf; + public double minY; + public double minZ; + public double maxX; + public double maxY; + public double maxZ; + public StepSound stepSound; + public float field_357_bm; + public final Material blockMaterial; + public float slipperiness; + + protected Block(int var1, Material var2) { + this.stepSound = soundPowderFootstep; + this.field_357_bm = 1.0F; + this.slipperiness = 0.6F; + if(blocksList[var1] != null) { + throw new IllegalArgumentException("Slot " + var1 + " is already occupied by " + blocksList[var1] + " when adding " + this); + } else { + this.blockMaterial = var2; + blocksList[var1] = this; + this.blockID = var1; + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + opaqueCubeLookup[var1] = this.isOpaqueCube(); + lightOpacity[var1] = this.isOpaqueCube() ? 255 : 0; + field_340_s[var1] = this.unusedMethod(); + isBlockContainer[var1] = false; + } + } + + protected Block(int var1, int var2, Material var3) { + this(var1, var3); + this.blockIndexInTexture = var2; + } + + protected Block setStepSound(StepSound var1) { + this.stepSound = var1; + return this; + } + + protected Block setLightOpacity(int var1) { + lightOpacity[this.blockID] = var1; + return this; + } + + protected Block setLightValue(float var1) { + lightValue[this.blockID] = (int)(15.0F * var1); + return this; + } + + protected Block setResistance(float var1) { + this.blockResistance = var1 * 3.0F; + return this; + } + + private boolean unusedMethod() { + return false; + } + + public boolean renderAsNormalBlock() { + return true; + } + + public int getRenderType() { + return 0; + } + + protected Block setHardness(float var1) { + this.blockHardness = var1; + if(this.blockResistance < var1 * 5.0F) { + this.blockResistance = var1 * 5.0F; + } + + return this; + } + + protected void setTickOnLoad(boolean var1) { + tickOnLoad[this.blockID] = var1; + } + + public void setBlockBounds(float var1, float var2, float var3, float var4, float var5, float var6) { + this.field_370_bf = (double)var1; + this.minY = (double)var2; + this.minZ = (double)var3; + this.maxX = (double)var4; + this.maxY = (double)var5; + this.maxZ = (double)var6; + } + + public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) { + return var1.getLightBrightness(var2, var3, var4); + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return var5 == 0 && this.minY > 0.0D ? true : (var5 == 1 && this.maxY < 1.0D ? true : (var5 == 2 && this.minZ > 0.0D ? true : (var5 == 3 && this.maxZ < 1.0D ? true : (var5 == 4 && this.field_370_bf > 0.0D ? true : (var5 == 5 && this.maxX < 1.0D ? true : !var1.isBlockOpaqueCube(var2, var3, var4)))))); + } + + public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return this.getBlockTextureFromSideAndMetadata(var5, var1.getBlockMetadata(var2, var3, var4)); + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return this.getBlockTextureFromSide(var1); + } + + public int getBlockTextureFromSide(int var1) { + return this.blockIndexInTexture; + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.field_370_bf, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)var3 + this.maxY, (double)var4 + this.maxZ); + } + + public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) { + AxisAlignedBB var7 = this.getCollisionBoundingBoxFromPool(var1, var2, var3, var4); + if(var7 != null && var5.intersectsWith(var7)) { + var6.add(var7); + } + + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.field_370_bf, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)var3 + this.maxY, (double)var4 + this.maxZ); + } + + public boolean isOpaqueCube() { + return true; + } + + public boolean canCollideCheck(int var1, boolean var2) { + return this.isCollidable(); + } + + public boolean isCollidable() { + return true; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + } + + public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + } + + public int tickRate() { + return 10; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + } + + public int quantityDropped(Random var1) { + return 1; + } + + public int idDropped(int var1, Random var2) { + return this.blockID; + } + + public float func_225_a(EntityPlayer var1) { + return this.blockHardness < 0.0F ? 0.0F : (!var1.canHarvestBlock(this) ? 1.0F / this.blockHardness / 100.0F : var1.getCurrentPlayerStrVsBlock(this) / this.blockHardness / 30.0F); + } + + public void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) { + this.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, 1.0F); + } + + public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) { + //if(!var1.multiplayerWorld) { + int var7 = this.quantityDropped(var1.rand); + + for(int var8 = 0; var8 < var7; ++var8) { + if(var1.rand.nextFloat() <= var6) { + int var9 = this.idDropped(var5, var1.rand); + if(var9 > 0) { + float var10 = 0.7F; + double var11 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D; + double var13 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D; + double var15 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D; + EntityItem var17 = new EntityItem(var1, (double)var2 + var11, (double)var3 + var13, (double)var4 + var15, new ItemStack(var9)); + var17.field_805_c = 10; + var1.entityJoinedWorld(var17); + } + } + } + + //} + } + + public float func_227_a(Entity var1) { + return this.blockResistance / 5.0F; + } + + public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + var5 = var5.addVector((double)(-var2), (double)(-var3), (double)(-var4)); + var6 = var6.addVector((double)(-var2), (double)(-var3), (double)(-var4)); + Vec3D var7 = var5.getIntermediateWithXValue(var6, this.field_370_bf); + Vec3D var8 = var5.getIntermediateWithXValue(var6, this.maxX); + Vec3D var9 = var5.getIntermediateWithYValue(var6, this.minY); + Vec3D var10 = var5.getIntermediateWithYValue(var6, this.maxY); + Vec3D var11 = var5.getIntermediateWithZValue(var6, this.minZ); + Vec3D var12 = var5.getIntermediateWithZValue(var6, this.maxZ); + if(!this.isVecInsideYZBounds(var7)) { + var7 = null; + } + + if(!this.isVecInsideYZBounds(var8)) { + var8 = null; + } + + if(!this.isVecInsideXZBounds(var9)) { + var9 = null; + } + + if(!this.isVecInsideXZBounds(var10)) { + var10 = null; + } + + if(!this.isVecInsideXYBounds(var11)) { + var11 = null; + } + + if(!this.isVecInsideXYBounds(var12)) { + var12 = null; + } + + Vec3D var13 = null; + if(var7 != null && (var13 == null || var5.distanceTo(var7) < var5.distanceTo(var13))) { + var13 = var7; + } + + if(var8 != null && (var13 == null || var5.distanceTo(var8) < var5.distanceTo(var13))) { + var13 = var8; + } + + if(var9 != null && (var13 == null || var5.distanceTo(var9) < var5.distanceTo(var13))) { + var13 = var9; + } + + if(var10 != null && (var13 == null || var5.distanceTo(var10) < var5.distanceTo(var13))) { + var13 = var10; + } + + if(var11 != null && (var13 == null || var5.distanceTo(var11) < var5.distanceTo(var13))) { + var13 = var11; + } + + if(var12 != null && (var13 == null || var5.distanceTo(var12) < var5.distanceTo(var13))) { + var13 = var12; + } + + if(var13 == null) { + return null; + } else { + byte var14 = -1; + if(var13 == var7) { + var14 = 4; + } + + if(var13 == var8) { + var14 = 5; + } + + if(var13 == var9) { + var14 = 0; + } + + if(var13 == var10) { + var14 = 1; + } + + if(var13 == var11) { + var14 = 2; + } + + if(var13 == var12) { + var14 = 3; + } + + return new MovingObjectPosition(var2, var3, var4, var14, var13.addVector((double)var2, (double)var3, (double)var4)); + } + } + + private boolean isVecInsideYZBounds(Vec3D var1) { + return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ; + } + + private boolean isVecInsideXZBounds(Vec3D var1) { + return var1 == null ? false : var1.xCoord >= this.field_370_bf && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ; + } + + private boolean isVecInsideXYBounds(Vec3D var1) { + return var1 == null ? false : var1.xCoord >= this.field_370_bf && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY; + } + + public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) { + } + + public int func_234_g() { + return 0; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3, var4); + return var5 == 0 || blocksList[var5].blockMaterial.getIsLiquid(); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + return false; + } + + public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) { + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + } + + public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) { + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + } + + public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) { + return 16777215; + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return false; + } + + public boolean canProvidePower() { + return false; + } + + public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + return false; + } + + public void func_237_e() { + } + + public void harvestBlock(World var1, int var2, int var3, int var4, int var5) { + this.dropBlockAsItem(var1, var2, var3, var4, var5); + } + + public boolean canBlockStay(World var1, int var2, int var3, int var4) { + return true; + } + + public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) { + } + + static { + for(int var0 = 0; var0 < 256; ++var0) { + if(blocksList[var0] != null) { + Item.itemsList[var0] = new ItemBlock(var0 - 256); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockBloodStone.java b/src/main/java/net/minecraft/src/BlockBloodStone.java new file mode 100644 index 0000000..5e05c8b --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockBloodStone.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public class BlockBloodStone extends Block { + public BlockBloodStone(int var1, int var2) { + super(var1, var2, Material.rock); + } +} diff --git a/src/main/java/net/minecraft/src/BlockBookshelf.java b/src/main/java/net/minecraft/src/BlockBookshelf.java new file mode 100644 index 0000000..e91f8a9 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockBookshelf.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockBookshelf extends Block { + public BlockBookshelf(int var1, int var2) { + super(var1, var2, Material.wood); + } + + public int getBlockTextureFromSide(int var1) { + return var1 <= 1 ? 4 : this.blockIndexInTexture; + } + + public int quantityDropped(Random var1) { + return 0; + } +} diff --git a/src/main/java/net/minecraft/src/BlockBreakable.java b/src/main/java/net/minecraft/src/BlockBreakable.java new file mode 100644 index 0000000..a395108 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockBreakable.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +public class BlockBreakable extends Block { + private boolean field_6363_a; + + protected BlockBreakable(int var1, int var2, Material var3, boolean var4) { + super(var1, var2, var3); + this.field_6363_a = var4; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockId(var2, var3, var4); + return !this.field_6363_a && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } +} diff --git a/src/main/java/net/minecraft/src/BlockButton.java b/src/main/java/net/minecraft/src/BlockButton.java new file mode 100644 index 0000000..0e6320e --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockButton.java @@ -0,0 +1,236 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockButton extends Block { + protected BlockButton(int var1, int var2) { + super(var1, var2, Material.circuits); + this.setTickOnLoad(true); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public int tickRate() { + return 20; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : var1.isBlockOpaqueCube(var2, var3, var4 + 1))); + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + int var7 = var6 & 8; + var6 &= 7; + if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var6 = 4; + } + + if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var6 = 3; + } + + if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var6 = 2; + } + + if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var6 = 1; + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 2); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 3); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 4); + } + + this.func_305_h(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this.func_305_h(var1, var2, var3, var4)) { + int var6 = var1.getBlockMetadata(var2, var3, var4) & 7; + boolean var7 = false; + if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) { + var7 = true; + } + + if(var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + } + + private boolean func_305_h(World var1, int var2, int var3, int var4) { + if(!this.canPlaceBlockAt(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + return false; + } else { + return true; + } + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + int var6 = var5 & 7; + boolean var7 = (var5 & 8) > 0; + float var8 = 6.0F / 16.0F; + float var9 = 10.0F / 16.0F; + float var10 = 3.0F / 16.0F; + float var11 = 2.0F / 16.0F; + if(var7) { + var11 = 1.0F / 16.0F; + } + + if(var6 == 1) { + this.setBlockBounds(0.0F, var8, 0.5F - var10, var11, var9, 0.5F + var10); + } else if(var6 == 2) { + this.setBlockBounds(1.0F - var11, var8, 0.5F - var10, 1.0F, var9, 0.5F + var10); + } else if(var6 == 3) { + this.setBlockBounds(0.5F - var10, var8, 0.0F, 0.5F + var10, var9, var11); + } else if(var6 == 4) { + this.setBlockBounds(0.5F - var10, var8, 1.0F - var11, 0.5F + var10, var9, 1.0F); + } + + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.blockActivated(var1, var2, var3, var4, var5); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + //if(var1.multiplayerWorld) { + //return true; + //} else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + int var7 = var6 & 7; + int var8 = 8 - (var6 & 8); + if(var8 == 0) { + return true; + } else { + var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + if(var7 == 1) { + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + } else if(var7 == 2) { + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + } else if(var7 == 3) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + } else if(var7 == 4) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } else { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + return true; + } + //} + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + if((var5 & 8) > 0) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + int var6 = var5 & 7; + if(var6 == 1) { + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + } else if(var6 == 2) { + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + } else if(var6 == 3) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + } else if(var6 == 4) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } else { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + } + + super.onBlockRemoval(var1, var2, var3, var4); + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0; + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) == 0) { + return false; + } else { + int var7 = var6 & 7; + return var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5))); + } + } + + public boolean canProvidePower() { + return true; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + //if(!var1.multiplayerWorld) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) != 0) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 & 7); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + int var7 = var6 & 7; + if(var7 == 1) { + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + } else if(var7 == 2) { + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + } else if(var7 == 3) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + } else if(var7 == 4) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } else { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + } + //} + } + + public void func_237_e() { + float var1 = 3.0F / 16.0F; + float var2 = 2.0F / 16.0F; + float var3 = 2.0F / 16.0F; + this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3); + } +} diff --git a/src/main/java/net/minecraft/src/BlockCactus.java b/src/main/java/net/minecraft/src/BlockCactus.java new file mode 100644 index 0000000..3aa84cf --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockCactus.java @@ -0,0 +1,86 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockCactus extends Block { + protected BlockCactus(int var1, int var2) { + super(var1, var2, Material.cactus); + this.setTickOnLoad(true); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getBlockId(var2, var3 + 1, var4) == 0) { + int var6; + for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) { + } + + if(var6 < 3) { + int var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 == 15) { + var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID); + var1.setBlockMetadataWithNotify(var2, var3, var4, 0); + } else { + var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1); + } + } + } + + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + float var5 = 1.0F / 16.0F; + return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var5), (double)var3, (double)((float)var4 + var5), (double)((float)(var2 + 1) - var5), (double)((float)(var3 + 1) - var5), (double)((float)(var4 + 1) - var5)); + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + float var5 = 1.0F / 16.0F; + return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var5), (double)var3, (double)((float)var4 + var5), (double)((float)(var2 + 1) - var5), (double)(var3 + 1), (double)((float)(var4 + 1) - var5)); + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture); + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isOpaqueCube() { + return false; + } + + public int getRenderType() { + return 13; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return !super.canPlaceBlockAt(var1, var2, var3, var4) ? false : this.canBlockStay(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(!this.canBlockStay(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public boolean canBlockStay(World var1, int var2, int var3, int var4) { + if(var1.getBlockMaterial(var2 - 1, var3, var4).func_878_a()) { + return false; + } else if(var1.getBlockMaterial(var2 + 1, var3, var4).func_878_a()) { + return false; + } else if(var1.getBlockMaterial(var2, var3, var4 - 1).func_878_a()) { + return false; + } else if(var1.getBlockMaterial(var2, var3, var4 + 1).func_878_a()) { + return false; + } else { + int var5 = var1.getBlockId(var2, var3 - 1, var4); + return var5 == Block.cactus.blockID || var5 == Block.sand.blockID; + } + } + + public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { + var5.canAttackEntity((Entity)null, 1); + } +} diff --git a/src/main/java/net/minecraft/src/BlockChest.java b/src/main/java/net/minecraft/src/BlockChest.java new file mode 100644 index 0000000..5700c28 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockChest.java @@ -0,0 +1,196 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockChest extends BlockContainer { + private Random field_457_a = new Random(); + + protected BlockChest(int var1) { + super(var1, Material.wood); + this.blockIndexInTexture = 26; + } + + public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(var5 == 1) { + return this.blockIndexInTexture - 1; + } else if(var5 == 0) { + return this.blockIndexInTexture - 1; + } else { + int var6 = var1.getBlockId(var2, var3, var4 - 1); + int var7 = var1.getBlockId(var2, var3, var4 + 1); + int var8 = var1.getBlockId(var2 - 1, var3, var4); + int var9 = var1.getBlockId(var2 + 1, var3, var4); + int var10; + int var11; + int var12; + byte var13; + if(var6 != this.blockID && var7 != this.blockID) { + if(var8 != this.blockID && var9 != this.blockID) { + byte var14 = 3; + if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var7]) { + var14 = 3; + } + + if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var6]) { + var14 = 2; + } + + if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var9]) { + var14 = 5; + } + + if(Block.opaqueCubeLookup[var9] && !Block.opaqueCubeLookup[var8]) { + var14 = 4; + } + + return var5 == var14 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture; + } else if(var5 != 4 && var5 != 5) { + var10 = 0; + if(var8 == this.blockID) { + var10 = -1; + } + + var11 = var1.getBlockId(var8 == this.blockID ? var2 - 1 : var2 + 1, var3, var4 - 1); + var12 = var1.getBlockId(var8 == this.blockID ? var2 - 1 : var2 + 1, var3, var4 + 1); + if(var5 == 3) { + var10 = -1 - var10; + } + + var13 = 3; + if((Block.opaqueCubeLookup[var6] || Block.opaqueCubeLookup[var11]) && !Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var12]) { + var13 = 3; + } + + if((Block.opaqueCubeLookup[var7] || Block.opaqueCubeLookup[var12]) && !Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var11]) { + var13 = 2; + } + + return (var5 == var13 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture + 32) + var10; + } else { + return this.blockIndexInTexture; + } + } else if(var5 != 2 && var5 != 3) { + var10 = 0; + if(var6 == this.blockID) { + var10 = -1; + } + + var11 = var1.getBlockId(var2 - 1, var3, var6 == this.blockID ? var4 - 1 : var4 + 1); + var12 = var1.getBlockId(var2 + 1, var3, var6 == this.blockID ? var4 - 1 : var4 + 1); + if(var5 == 4) { + var10 = -1 - var10; + } + + var13 = 5; + if((Block.opaqueCubeLookup[var8] || Block.opaqueCubeLookup[var11]) && !Block.opaqueCubeLookup[var9] && !Block.opaqueCubeLookup[var12]) { + var13 = 5; + } + + if((Block.opaqueCubeLookup[var9] || Block.opaqueCubeLookup[var12]) && !Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var11]) { + var13 = 4; + } + + return (var5 == var13 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture + 32) + var10; + } else { + return this.blockIndexInTexture; + } + } + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture - 1 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture)); + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + int var5 = 0; + if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) { + ++var5; + } + + if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) { + ++var5; + } + + if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) { + ++var5; + } + + if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) { + ++var5; + } + + return var5 > 1 ? false : (this.isThereANeighborChest(var1, var2 - 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2 + 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2, var3, var4 - 1) ? false : !this.isThereANeighborChest(var1, var2, var3, var4 + 1)))); + } + + private boolean isThereANeighborChest(World var1, int var2, int var3, int var4) { + return var1.getBlockId(var2, var3, var4) != this.blockID ? false : (var1.getBlockId(var2 - 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2 + 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2, var3, var4 - 1) == this.blockID ? true : var1.getBlockId(var2, var3, var4 + 1) == this.blockID))); + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + TileEntityChest var5 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4); + + for(int var6 = 0; var6 < var5.getSizeInventory(); ++var6) { + ItemStack var7 = var5.getStackInSlot(var6); + if(var7 != null) { + float var8 = this.field_457_a.nextFloat() * 0.8F + 0.1F; + float var9 = this.field_457_a.nextFloat() * 0.8F + 0.1F; + float var10 = this.field_457_a.nextFloat() * 0.8F + 0.1F; + + while(var7.stackSize > 0) { + int var11 = this.field_457_a.nextInt(21) + 10; + if(var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(var7.itemID, var11, var7.itemDamage)); + float var13 = 0.05F; + var12.motionX = (double)((float)this.field_457_a.nextGaussian() * var13); + var12.motionY = (double)((float)this.field_457_a.nextGaussian() * var13 + 0.2F); + var12.motionZ = (double)((float)this.field_457_a.nextGaussian() * var13); + var1.entityJoinedWorld(var12); + } + } + } + + super.onBlockRemoval(var1, var2, var3, var4); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + Object var6 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4); + if(var1.isBlockOpaqueCube(var2, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.isBlockOpaqueCube(var2 - 1, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.isBlockOpaqueCube(var2 + 1, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.isBlockOpaqueCube(var2, var3 + 1, var4 - 1)) { + return true; + } else if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.isBlockOpaqueCube(var2, var3 + 1, var4 + 1)) { + return true; + } else { + if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) { + var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2 - 1, var3, var4), (IInventory)var6); + } + + if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) { + var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2 + 1, var3, var4)); + } + + if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) { + var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 - 1), (IInventory)var6); + } + + if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) { + var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 + 1)); + } + + var5.displayGUIChest((IInventory)var6); + return true; + } + } + + protected TileEntity SetBlockEntity() { + return new TileEntityChest(); + } +} diff --git a/src/main/java/net/minecraft/src/BlockClay.java b/src/main/java/net/minecraft/src/BlockClay.java new file mode 100644 index 0000000..89b79b7 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockClay.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockClay extends Block { + public BlockClay(int var1, int var2) { + super(var1, var2, Material.clay); + } + + public int idDropped(int var1, Random var2) { + return Item.clay.shiftedIndex; + } + + public int quantityDropped(Random var1) { + return 4; + } +} diff --git a/src/main/java/net/minecraft/src/BlockContainer.java b/src/main/java/net/minecraft/src/BlockContainer.java new file mode 100644 index 0000000..1172af6 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockContainer.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +public abstract class BlockContainer extends Block { + protected BlockContainer(int var1, Material var2) { + super(var1, var2); + isBlockContainer[var1] = true; + } + + protected BlockContainer(int var1, int var2, Material var3) { + super(var1, var2, var3); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + var1.setBlockTileEntity(var2, var3, var4, this.SetBlockEntity()); + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + super.onBlockRemoval(var1, var2, var3, var4); + var1.removeBlockTileEntity(var2, var3, var4); + } + + protected abstract TileEntity SetBlockEntity(); +} diff --git a/src/main/java/net/minecraft/src/BlockCrops.java b/src/main/java/net/minecraft/src/BlockCrops.java new file mode 100644 index 0000000..0f1d3ea --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockCrops.java @@ -0,0 +1,110 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockCrops extends BlockFlower { + protected BlockCrops(int var1, int var2) { + super(var1, var2); + this.blockIndexInTexture = var2; + this.setTickOnLoad(true); + float var3 = 0.5F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3); + } + + protected boolean canThisPlantGrowOnThisBlockID(int var1) { + return var1 == Block.tilledField.blockID; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 < 7) { + float var7 = this.getGrowthRate(var1, var2, var3, var4); + if(var5.nextInt((int)(100.0F / var7)) == 0) { + ++var6; + var1.setBlockMetadataWithNotify(var2, var3, var4, var6); + } + } + } + + } + + private float getGrowthRate(World var1, int var2, int var3, int var4) { + float var5 = 1.0F; + int var6 = var1.getBlockId(var2, var3, var4 - 1); + int var7 = var1.getBlockId(var2, var3, var4 + 1); + int var8 = var1.getBlockId(var2 - 1, var3, var4); + int var9 = var1.getBlockId(var2 + 1, var3, var4); + int var10 = var1.getBlockId(var2 - 1, var3, var4 - 1); + int var11 = var1.getBlockId(var2 + 1, var3, var4 - 1); + int var12 = var1.getBlockId(var2 + 1, var3, var4 + 1); + int var13 = var1.getBlockId(var2 - 1, var3, var4 + 1); + boolean var14 = var8 == this.blockID || var9 == this.blockID; + boolean var15 = var6 == this.blockID || var7 == this.blockID; + boolean var16 = var10 == this.blockID || var11 == this.blockID || var12 == this.blockID || var13 == this.blockID; + + for(int var17 = var2 - 1; var17 <= var2 + 1; ++var17) { + for(int var18 = var4 - 1; var18 <= var4 + 1; ++var18) { + int var19 = var1.getBlockId(var17, var3 - 1, var18); + float var20 = 0.0F; + if(var19 == Block.tilledField.blockID) { + var20 = 1.0F; + if(var1.getBlockMetadata(var17, var3 - 1, var18) > 0) { + var20 = 3.0F; + } + } + + if(var17 != var2 || var18 != var4) { + var20 /= 4.0F; + } + + var5 += var20; + } + } + + if(var16 || var14 && var15) { + var5 /= 2.0F; + } + + return var5; + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + if(var2 < 0) { + var2 = 7; + } + + return this.blockIndexInTexture + var2; + } + + public int getRenderType() { + return 6; + } + + public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + super.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5); + //if(!var1.multiplayerWorld) { + for(int var6 = 0; var6 < 3; ++var6) { + if(var1.rand.nextInt(15) <= var5) { + float var7 = 0.7F; + float var8 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F; + float var9 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F; + float var10 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F; + EntityItem var11 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(Item.seeds)); + var11.field_805_c = 10; + var1.entityJoinedWorld(var11); + } + } + //} + + } + + public int idDropped(int var1, Random var2) { + return var1 == 7 ? Item.wheat.shiftedIndex : -1; + } + + public int quantityDropped(Random var1) { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/BlockDirt.java b/src/main/java/net/minecraft/src/BlockDirt.java new file mode 100644 index 0000000..d3b8a7a --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockDirt.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public class BlockDirt extends Block { + protected BlockDirt(int var1, int var2) { + super(var1, var2, Material.ground); + } +} diff --git a/src/main/java/net/minecraft/src/BlockDoor.java b/src/main/java/net/minecraft/src/BlockDoor.java new file mode 100644 index 0000000..2d356cd --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockDoor.java @@ -0,0 +1,195 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockDoor extends Block { + protected BlockDoor(int var1, Material var2) { + super(var1, var2); + this.blockIndexInTexture = 97; + if(var2 == Material.iron) { + ++this.blockIndexInTexture; + } + + float var3 = 0.5F; + float var4 = 1.0F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var4, 0.5F + var3); + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + if(var1 != 0 && var1 != 1) { + int var3 = this.func_312_c(var2); + if((var3 == 0 || var3 == 2) ^ var1 <= 3) { + return this.blockIndexInTexture; + } else { + int var4 = var3 / 2 + (var1 & 1 ^ var3); + var4 += (var2 & 4) / 4; + int var5 = this.blockIndexInTexture - (var2 & 8) * 2; + if((var4 & 1) != 0) { + var5 = -var5; + } + + return var5; + } + } else { + return this.blockIndexInTexture; + } + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 7; + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4); + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + this.func_313_b(this.func_312_c(var1.getBlockMetadata(var2, var3, var4))); + } + + public void func_313_b(int var1) { + float var2 = 3.0F / 16.0F; + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); + if(var1 == 0) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); + } + + if(var1 == 1) { + this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + if(var1 == 2) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); + } + + if(var1 == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); + } + + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.blockActivated(var1, var2, var3, var4, var5); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + if(this.blockMaterial == Material.iron) { + return true; + } else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) != 0) { + if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) { + this.blockActivated(var1, var2, var3 - 1, var4, var5); + } + + return true; + } else { + if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) { + var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8); + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4); + var1.func_701_b(var2, var3 - 1, var4, var2, var3, var4); + if(Math.random() < 0.5D) { + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_open", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F); + } else { + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_close", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F); + } + + return true; + } + } + } + + public void func_311_a(World var1, int var2, int var3, int var4, boolean var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) != 0) { + if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) { + this.func_311_a(var1, var2, var3 - 1, var4, var5); + } + + } else { + boolean var7 = (var1.getBlockMetadata(var2, var3, var4) & 4) > 0; + if(var7 != var5) { + if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) { + var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8); + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4); + var1.func_701_b(var2, var3 - 1, var4, var2, var3, var4); + if(Math.random() < 0.5D) { + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_open", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F); + } else { + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_close", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F); + } + + } + } + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) != 0) { + if(var1.getBlockId(var2, var3 - 1, var4) != this.blockID) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + if(var5 > 0 && Block.blocksList[var5].canProvidePower()) { + this.onNeighborBlockChange(var1, var2, var3 - 1, var4, var5); + } + } else { + boolean var7 = false; + if(var1.getBlockId(var2, var3 + 1, var4) != this.blockID) { + var1.setBlockWithNotify(var2, var3, var4, 0); + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + var7 = true; + if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) { + var1.setBlockWithNotify(var2, var3 + 1, var4, 0); + } + } + + if(var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var6); + } else if(var5 > 0 && Block.blocksList[var5].canProvidePower()) { + boolean var8 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4); + this.func_311_a(var1, var2, var3, var4, var8); + } + } + + } + + public int idDropped(int var1, Random var2) { + return (var1 & 8) != 0 ? 0 : (this.blockMaterial == Material.iron ? Item.doorSteel.shiftedIndex : Item.doorWood.shiftedIndex); + } + + public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + return super.collisionRayTrace(var1, var2, var3, var4, var5, var6); + } + + public int func_312_c(int var1) { + return (var1 & 4) == 0 ? var1 - 1 & 3 : var1 & 3; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var3 >= 127 ? false : var1.isBlockOpaqueCube(var2, var3 - 1, var4) && super.canPlaceBlockAt(var1, var2, var3, var4) && super.canPlaceBlockAt(var1, var2, var3 + 1, var4); + } +} diff --git a/src/main/java/net/minecraft/src/BlockFence.java b/src/main/java/net/minecraft/src/BlockFence.java new file mode 100644 index 0000000..d2c2e60 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFence.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +import java.util.ArrayList; + +public class BlockFence extends Block { + public BlockFence(int var1, int var2) { + super(var1, var2, Material.wood); + } + + public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) { + var6.add(AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)var3 + 1.5D, (double)(var4 + 1))); + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.getBlockId(var2, var3 - 1, var4) == this.blockID ? false : (!var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a() ? false : super.canPlaceBlockAt(var1, var2, var3, var4)); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 11; + } +} diff --git a/src/main/java/net/minecraft/src/BlockFire.java b/src/main/java/net/minecraft/src/BlockFire.java new file mode 100644 index 0000000..b217a04 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFire.java @@ -0,0 +1,228 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockFire extends Block { + private int[] chanceToEncourageFire = new int[256]; + private int[] abilityToCatchFire = new int[256]; + + protected BlockFire(int var1, int var2) { + super(var1, var2, Material.fire); + this.setBurnRate(Block.planks.blockID, 5, 20); + this.setBurnRate(Block.wood.blockID, 5, 5); + this.setBurnRate(Block.leaves.blockID, 30, 60); + this.setBurnRate(Block.bookShelf.blockID, 30, 20); + this.setBurnRate(Block.tnt.blockID, 15, 100); + this.setBurnRate(Block.cloth.blockID, 30, 60); + this.setTickOnLoad(true); + } + + private void setBurnRate(int var1, int var2, int var3) { + this.chanceToEncourageFire[var1] = var2; + this.abilityToCatchFire[var1] = var3; + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 3; + } + + public int quantityDropped(Random var1) { + return 0; + } + + public int tickRate() { + return 10; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + boolean var6 = var1.getBlockId(var2, var3 - 1, var4) == Block.bloodStone.blockID; + int var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 < 15) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1); + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + if(!var6 && !this.func_263_h(var1, var2, var3, var4)) { + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) || var7 > 3) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } else if(!var6 && !this.canBlockCatchFire(var1, var2, var3 - 1, var4) && var7 == 15 && var5.nextInt(4) == 0) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + if(var7 % 2 == 0 && var7 > 2) { + this.tryToCatchBlockOnFire(var1, var2 + 1, var3, var4, 300, var5); + this.tryToCatchBlockOnFire(var1, var2 - 1, var3, var4, 300, var5); + this.tryToCatchBlockOnFire(var1, var2, var3 - 1, var4, 250, var5); + this.tryToCatchBlockOnFire(var1, var2, var3 + 1, var4, 250, var5); + this.tryToCatchBlockOnFire(var1, var2, var3, var4 - 1, 300, var5); + this.tryToCatchBlockOnFire(var1, var2, var3, var4 + 1, 300, var5); + + for(int var8 = var2 - 1; var8 <= var2 + 1; ++var8) { + for(int var9 = var4 - 1; var9 <= var4 + 1; ++var9) { + for(int var10 = var3 - 1; var10 <= var3 + 4; ++var10) { + if(var8 != var2 || var10 != var3 || var9 != var4) { + int var11 = 100; + if(var10 > var3 + 1) { + var11 += (var10 - (var3 + 1)) * 100; + } + + int var12 = this.getChanceOfNeighborsEncouragingFire(var1, var8, var10, var9); + if(var12 > 0 && var5.nextInt(var11) <= var12) { + var1.setBlockWithNotify(var8, var10, var9, this.blockID); + } + } + } + } + } + } + + } + } + + private void tryToCatchBlockOnFire(World var1, int var2, int var3, int var4, int var5, Random var6) { + int var7 = this.abilityToCatchFire[var1.getBlockId(var2, var3, var4)]; + if(var6.nextInt(var5) < var7) { + boolean var8 = var1.getBlockId(var2, var3, var4) == Block.tnt.blockID; + if(var6.nextInt(2) == 0) { + var1.setBlockWithNotify(var2, var3, var4, this.blockID); + } else { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + if(var8) { + Block.tnt.onBlockDestroyedByPlayer(var1, var2, var3, var4, 0); + } + } + + } + + private boolean func_263_h(World var1, int var2, int var3, int var4) { + return this.canBlockCatchFire(var1, var2 + 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2 - 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 - 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 + 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3, var4 - 1) ? true : this.canBlockCatchFire(var1, var2, var3, var4 + 1))))); + } + + private int getChanceOfNeighborsEncouragingFire(World var1, int var2, int var3, int var4) { + byte var5 = 0; + if(var1.getBlockId(var2, var3, var4) != 0) { + return 0; + } else { + int var6 = this.getChanceToEncourageFire(var1, var2 + 1, var3, var4, var5); + var6 = this.getChanceToEncourageFire(var1, var2 - 1, var3, var4, var6); + var6 = this.getChanceToEncourageFire(var1, var2, var3 - 1, var4, var6); + var6 = this.getChanceToEncourageFire(var1, var2, var3 + 1, var4, var6); + var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 - 1, var6); + var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 + 1, var6); + return var6; + } + } + + public boolean isCollidable() { + return false; + } + + public boolean canBlockCatchFire(IBlockAccess var1, int var2, int var3, int var4) { + return this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)] > 0; + } + + public int getChanceToEncourageFire(World var1, int var2, int var3, int var4, int var5) { + int var6 = this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)]; + return var6 > var5 ? var6 : var5; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2, var3 - 1, var4) || this.func_263_h(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !this.func_263_h(var1, var2, var3, var4)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.getBlockId(var2, var3 - 1, var4) != Block.obsidian.blockID || !Block.portal.tryToCreatePortal(var1, var2, var3, var4)) { + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !this.func_263_h(var1, var2, var3, var4)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + } + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(var5.nextInt(24) == 0) { + var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "fire.fire", 1.0F + var5.nextFloat(), var5.nextFloat() * 0.7F + 0.3F); + } + + int var6; + float var7; + float var8; + float var9; + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !Block.fire.canBlockCatchFire(var1, var2, var3 - 1, var4)) { + if(Block.fire.canBlockCatchFire(var1, var2 - 1, var3, var4)) { + for(var6 = 0; var6 < 2; ++var6) { + var7 = (float)var2 + var5.nextFloat() * 0.1F; + var8 = (float)var3 + var5.nextFloat(); + var9 = (float)var4 + var5.nextFloat(); + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + + if(Block.fire.canBlockCatchFire(var1, var2 + 1, var3, var4)) { + for(var6 = 0; var6 < 2; ++var6) { + var7 = (float)(var2 + 1) - var5.nextFloat() * 0.1F; + var8 = (float)var3 + var5.nextFloat(); + var9 = (float)var4 + var5.nextFloat(); + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + + if(Block.fire.canBlockCatchFire(var1, var2, var3, var4 - 1)) { + for(var6 = 0; var6 < 2; ++var6) { + var7 = (float)var2 + var5.nextFloat(); + var8 = (float)var3 + var5.nextFloat(); + var9 = (float)var4 + var5.nextFloat() * 0.1F; + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + + if(Block.fire.canBlockCatchFire(var1, var2, var3, var4 + 1)) { + for(var6 = 0; var6 < 2; ++var6) { + var7 = (float)var2 + var5.nextFloat(); + var8 = (float)var3 + var5.nextFloat(); + var9 = (float)(var4 + 1) - var5.nextFloat() * 0.1F; + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + + if(Block.fire.canBlockCatchFire(var1, var2, var3 + 1, var4)) { + for(var6 = 0; var6 < 2; ++var6) { + var7 = (float)var2 + var5.nextFloat(); + var8 = (float)(var3 + 1) - var5.nextFloat() * 0.1F; + var9 = (float)var4 + var5.nextFloat(); + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + } else { + for(var6 = 0; var6 < 3; ++var6) { + var7 = (float)var2 + var5.nextFloat(); + var8 = (float)var3 + var5.nextFloat() * 0.5F + 0.5F; + var9 = (float)var4 + var5.nextFloat(); + var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockFlower.java b/src/main/java/net/minecraft/src/BlockFlower.java new file mode 100644 index 0000000..5fa5127 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFlower.java @@ -0,0 +1,58 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockFlower extends Block { + protected BlockFlower(int var1, int var2) { + super(var1, Material.plants); + this.blockIndexInTexture = var2; + this.setTickOnLoad(true); + float var3 = 0.2F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 3.0F, 0.5F + var3); + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4)); + } + + protected boolean canThisPlantGrowOnThisBlockID(int var1) { + return var1 == Block.grass.blockID || var1 == Block.dirt.blockID || var1 == Block.tilledField.blockID; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + this.func_268_h(var1, var2, var3, var4); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.func_268_h(var1, var2, var3, var4); + } + + protected final void func_268_h(World var1, int var2, int var3, int var4) { + if(!this.canBlockStay(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public boolean canBlockStay(World var1, int var2, int var3, int var4) { + return (var1.getBlockLightValue(var2, var3, var4) >= 8 || var1.canBlockSeeTheSky(var2, var3, var4)) && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4)); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/BlockFlowing.java b/src/main/java/net/minecraft/src/BlockFlowing.java new file mode 100644 index 0000000..a067f7a --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFlowing.java @@ -0,0 +1,263 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockFlowing extends BlockFluids { + int field_460_a = 0; + boolean[] field_459_b = new boolean[4]; + int[] field_461_c = new int[4]; + + protected BlockFlowing(int var1, Material var2) { + super(var1, var2); + } + + private void func_15233_j(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + var1.setBlockAndMetadata(var2, var3, var4, this.blockID + 1, var5); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.func_665_h(var2, var3, var4); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + int var6 = this.func_290_h(var1, var2, var3, var4); + byte var7 = 1; + if(this.blockMaterial == Material.lava && !var1.worldProvider.field_6479_d) { + var7 = 2; + } + + boolean var8 = true; + int var10; + if(var6 > 0) { + byte var9 = -100; + this.field_460_a = 0; + int var12 = this.func_296_f(var1, var2 - 1, var3, var4, var9); + var12 = this.func_296_f(var1, var2 + 1, var3, var4, var12); + var12 = this.func_296_f(var1, var2, var3, var4 - 1, var12); + var12 = this.func_296_f(var1, var2, var3, var4 + 1, var12); + var10 = var12 + var7; + if(var10 >= 8 || var12 < 0) { + var10 = -1; + } + + if(this.func_290_h(var1, var2, var3 + 1, var4) >= 0) { + int var11 = this.func_290_h(var1, var2, var3 + 1, var4); + if(var11 >= 8) { + var10 = var11; + } else { + var10 = var11 + 8; + } + } + + if(this.field_460_a >= 2 && this.blockMaterial == Material.water) { + if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var10 = 0; + } else if(var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3, var4) == 0) { + var10 = 0; + } + } + + if(this.blockMaterial == Material.lava && var6 < 8 && var10 < 8 && var10 > var6 && var5.nextInt(4) != 0) { + var10 = var6; + var8 = false; + } + + if(var10 != var6) { + var6 = var10; + if(var10 < 0) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + var1.setBlockMetadataWithNotify(var2, var3, var4, var10); + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + } + } else if(var8) { + this.func_15233_j(var1, var2, var3, var4); + } + } else { + this.func_15233_j(var1, var2, var3, var4); + } + + if(this.func_298_m(var1, var2, var3 - 1, var4)) { + if(var6 >= 8) { + var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6); + } else { + var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6 + 8); + } + } else if(var6 >= 0 && (var6 == 0 || this.func_295_l(var1, var2, var3 - 1, var4))) { + boolean[] var13 = this.func_297_k(var1, var2, var3, var4); + var10 = var6 + var7; + if(var6 >= 8) { + var10 = 1; + } + + if(var10 >= 8) { + return; + } + + if(var13[0]) { + this.func_299_g(var1, var2 - 1, var3, var4, var10); + } + + if(var13[1]) { + this.func_299_g(var1, var2 + 1, var3, var4, var10); + } + + if(var13[2]) { + this.func_299_g(var1, var2, var3, var4 - 1, var10); + } + + if(var13[3]) { + this.func_299_g(var1, var2, var3, var4 + 1, var10); + } + } + + } + + private void func_299_g(World var1, int var2, int var3, int var4, int var5) { + if(this.func_298_m(var1, var2, var3, var4)) { + int var6 = var1.getBlockId(var2, var3, var4); + if(var6 > 0) { + if(this.blockMaterial == Material.lava) { + this.func_292_i(var1, var2, var3, var4); + } else { + Block.blocksList[var6].dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + } + } + + var1.setBlockAndMetadataWithNotify(var2, var3, var4, this.blockID, var5); + } + + } + + private int func_300_a(World var1, int var2, int var3, int var4, int var5, int var6) { + int var7 = 1000; + + for(int var8 = 0; var8 < 4; ++var8) { + if((var8 != 0 || var6 != 1) && (var8 != 1 || var6 != 0) && (var8 != 2 || var6 != 3) && (var8 != 3 || var6 != 2)) { + int var9 = var2; + int var11 = var4; + if(var8 == 0) { + var9 = var2 - 1; + } + + if(var8 == 1) { + ++var9; + } + + if(var8 == 2) { + var11 = var4 - 1; + } + + if(var8 == 3) { + ++var11; + } + + if(!this.func_295_l(var1, var9, var3, var11) && (var1.getBlockMaterial(var9, var3, var11) != this.blockMaterial || var1.getBlockMetadata(var9, var3, var11) != 0)) { + if(!this.func_295_l(var1, var9, var3 - 1, var11)) { + return var5; + } + + if(var5 < 4) { + int var12 = this.func_300_a(var1, var9, var3, var11, var5 + 1, var8); + if(var12 < var7) { + var7 = var12; + } + } + } + } + } + + return var7; + } + + private boolean[] func_297_k(World var1, int var2, int var3, int var4) { + int var5; + int var6; + for(var5 = 0; var5 < 4; ++var5) { + this.field_461_c[var5] = 1000; + var6 = var2; + int var8 = var4; + if(var5 == 0) { + var6 = var2 - 1; + } + + if(var5 == 1) { + ++var6; + } + + if(var5 == 2) { + var8 = var4 - 1; + } + + if(var5 == 3) { + ++var8; + } + + if(!this.func_295_l(var1, var6, var3, var8) && (var1.getBlockMaterial(var6, var3, var8) != this.blockMaterial || var1.getBlockMetadata(var6, var3, var8) != 0)) { + if(!this.func_295_l(var1, var6, var3 - 1, var8)) { + this.field_461_c[var5] = 0; + } else { + this.field_461_c[var5] = this.func_300_a(var1, var6, var3, var8, 1, var5); + } + } + } + + var5 = this.field_461_c[0]; + + for(var6 = 1; var6 < 4; ++var6) { + if(this.field_461_c[var6] < var5) { + var5 = this.field_461_c[var6]; + } + } + + for(var6 = 0; var6 < 4; ++var6) { + this.field_459_b[var6] = this.field_461_c[var6] == var5; + } + + return this.field_459_b; + } + + private boolean func_295_l(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3, var4); + if(var5 != Block.doorWood.blockID && var5 != Block.doorSteel.blockID && var5 != Block.signPost.blockID && var5 != Block.ladder.blockID && var5 != Block.reed.blockID) { + if(var5 == 0) { + return false; + } else { + Material var6 = Block.blocksList[var5].blockMaterial; + return var6.func_878_a(); + } + } else { + return true; + } + } + + protected int func_296_f(World var1, int var2, int var3, int var4, int var5) { + int var6 = this.func_290_h(var1, var2, var3, var4); + if(var6 < 0) { + return var5; + } else { + if(var6 == 0) { + ++this.field_460_a; + } + + if(var6 >= 8) { + var6 = 0; + } + + return var5 >= 0 && var6 >= var5 ? var5 : var6; + } + } + + private boolean func_298_m(World var1, int var2, int var3, int var4) { + Material var5 = var1.getBlockMaterial(var2, var3, var4); + return var5 == this.blockMaterial ? false : (var5 == Material.lava ? false : !this.func_295_l(var1, var2, var3, var4)); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + if(var1.getBlockId(var2, var3, var4) == this.blockID) { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockFluids.java b/src/main/java/net/minecraft/src/BlockFluids.java new file mode 100644 index 0000000..0d96a5f --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFluids.java @@ -0,0 +1,269 @@ +package net.minecraft.src; + +import java.util.Random; + +public abstract class BlockFluids extends Block { + protected BlockFluids(int var1, Material var2) { + super(var1, (var2 == Material.lava ? 14 : 12) * 16 + 13, var2); + float var3 = 0.0F; + float var4 = 0.0F; + this.setBlockBounds(0.0F + var4, 0.0F + var3, 0.0F + var4, 1.0F + var4, 1.0F + var3, 1.0F + var4); + this.setTickOnLoad(true); + } + + public static float func_288_b(int var0) { + if(var0 >= 8) { + var0 = 0; + } + + float var1 = (float)(var0 + 1) / 9.0F; + return var1; + } + + public int getBlockTextureFromSide(int var1) { + return var1 != 0 && var1 != 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture; + } + + protected int func_290_h(World var1, int var2, int var3, int var4) { + return var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial ? -1 : var1.getBlockMetadata(var2, var3, var4); + } + + protected int func_289_b(IBlockAccess var1, int var2, int var3, int var4) { + if(var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial) { + return -1; + } else { + int var5 = var1.getBlockMetadata(var2, var3, var4); + if(var5 >= 8) { + var5 = 0; + } + + return var5; + } + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean canCollideCheck(int var1, boolean var2) { + return var2 && var1 == 0; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + Material var6 = var1.getBlockMaterial(var2, var3, var4); + return var6 == this.blockMaterial ? false : (var6 == Material.ice ? false : (var5 == 1 ? true : super.shouldSideBeRendered(var1, var2, var3, var4, var5))); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public int getRenderType() { + return 4; + } + + public int idDropped(int var1, Random var2) { + return 0; + } + + public int quantityDropped(Random var1) { + return 0; + } + + private Vec3D func_291_e(IBlockAccess var1, int var2, int var3, int var4) { + Vec3D var5 = Vec3D.createVector(0.0D, 0.0D, 0.0D); + int var6 = this.func_289_b(var1, var2, var3, var4); + + for(int var7 = 0; var7 < 4; ++var7) { + int var8 = var2; + int var10 = var4; + if(var7 == 0) { + var8 = var2 - 1; + } + + if(var7 == 1) { + var10 = var4 - 1; + } + + if(var7 == 2) { + ++var8; + } + + if(var7 == 3) { + ++var10; + } + + int var11 = this.func_289_b(var1, var8, var3, var10); + int var12; + if(var11 < 0) { + if(!var1.getBlockMaterial(var8, var3, var10).func_880_c()) { + var11 = this.func_289_b(var1, var8, var3 - 1, var10); + if(var11 >= 0) { + var12 = var11 - (var6 - 8); + var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12)); + } + } + } else if(var11 >= 0) { + var12 = var11 - var6; + var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12)); + } + } + + if(var1.getBlockMetadata(var2, var3, var4) >= 8) { + boolean var13 = false; + if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 - 1, 2)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 + 1, 3)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3, var4, 4)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3, var4, 5)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 - 1, 2)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 + 1, 3)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3 + 1, var4, 4)) { + var13 = true; + } + + if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3 + 1, var4, 5)) { + var13 = true; + } + + if(var13) { + var5 = var5.normalize().addVector(0.0D, -6.0D, 0.0D); + } + } + + var5 = var5.normalize(); + return var5; + } + + public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) { + Vec3D var7 = this.func_291_e(var1, var2, var3, var4); + var6.xCoord += var7.xCoord; + var6.yCoord += var7.yCoord; + var6.zCoord += var7.zCoord; + } + + public int tickRate() { + return this.blockMaterial == Material.water ? 5 : (this.blockMaterial == Material.lava ? 30 : 0); + } + + public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) { + float var5 = var1.getLightBrightness(var2, var3, var4); + float var6 = var1.getLightBrightness(var2, var3 + 1, var4); + return var5 > var6 ? var5 : var6; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + } + + public int func_234_g() { + return this.blockMaterial == Material.water ? 1 : 0; + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.blockMaterial == Material.water && var5.nextInt(64) == 0) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 > 0 && var6 < 8) { + var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "liquid.water", var5.nextFloat() * 0.25F + 12.0F / 16.0F, var5.nextFloat() * 1.0F + 0.5F); + } + } + + if(this.blockMaterial == Material.lava && var1.getBlockMaterial(var2, var3 + 1, var4) == Material.air && !var1.isBlockOpaqueCube(var2, var3 + 1, var4) && var5.nextInt(100) == 0) { + double var12 = (double)((float)var2 + var5.nextFloat()); + double var8 = (double)var3 + this.maxY; + double var10 = (double)((float)var4 + var5.nextFloat()); + var1.spawnParticle("lava", var12, var8, var10, 0.0D, 0.0D, 0.0D); + } + + } + + public static double func_293_a(IBlockAccess var0, int var1, int var2, int var3, Material var4) { + Vec3D var5 = null; + if(var4 == Material.water) { + var5 = ((BlockFluids)Block.waterStill).func_291_e(var0, var1, var2, var3); + } + + if(var4 == Material.lava) { + var5 = ((BlockFluids)Block.lavaStill).func_291_e(var0, var1, var2, var3); + } + + return var5.xCoord == 0.0D && var5.zCoord == 0.0D ? -1000.0D : Math.atan2(var5.zCoord, var5.xCoord) - Math.PI * 0.5D; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + this.checkForHarden(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + this.checkForHarden(var1, var2, var3, var4); + } + + private void checkForHarden(World var1, int var2, int var3, int var4) { + if(var1.getBlockId(var2, var3, var4) == this.blockID) { + if(this.blockMaterial == Material.lava) { + boolean var5 = false; + if(var5 || var1.getBlockMaterial(var2, var3, var4 - 1) == Material.water) { + var5 = true; + } + + if(var5 || var1.getBlockMaterial(var2, var3, var4 + 1) == Material.water) { + var5 = true; + } + + if(var5 || var1.getBlockMaterial(var2 - 1, var3, var4) == Material.water) { + var5 = true; + } + + if(var5 || var1.getBlockMaterial(var2 + 1, var3, var4) == Material.water) { + var5 = true; + } + + if(var5 || var1.getBlockMaterial(var2, var3 + 1, var4) == Material.water) { + var5 = true; + } + + if(var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 == 0) { + var1.setBlockWithNotify(var2, var3, var4, Block.obsidian.blockID); + } else if(var6 <= 4) { + var1.setBlockWithNotify(var2, var3, var4, Block.cobblestone.blockID); + } + + this.func_292_i(var1, var2, var3, var4); + } + } + + } + } + + protected void func_292_i(World var1, int var2, int var3, int var4) { + var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F); + + for(int var5 = 0; var5 < 8; ++var5) { + var1.spawnParticle("largesmoke", (double)var2 + Math.random(), (double)var3 + 1.2D, (double)var4 + Math.random(), 0.0D, 0.0D, 0.0D); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockFurnace.java b/src/main/java/net/minecraft/src/BlockFurnace.java new file mode 100644 index 0000000..4bc3d78 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockFurnace.java @@ -0,0 +1,130 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockFurnace extends BlockContainer { + private final boolean isActive; + + protected BlockFurnace(int var1, boolean var2) { + super(var1, Material.rock); + this.isActive = var2; + this.blockIndexInTexture = 45; + } + + public int idDropped(int var1, Random var2) { + return Block.stoneOvenIdle.blockID; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + this.func_284_h(var1, var2, var3, var4); + } + + private void func_284_h(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3, var4 - 1); + int var6 = var1.getBlockId(var2, var3, var4 + 1); + int var7 = var1.getBlockId(var2 - 1, var3, var4); + int var8 = var1.getBlockId(var2 + 1, var3, var4); + byte var9 = 3; + if(Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6]) { + var9 = 3; + } + + if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5]) { + var9 = 2; + } + + if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8]) { + var9 = 5; + } + + if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7]) { + var9 = 4; + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var9); + } + + public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(var5 == 1) { + return Block.stone.blockIndexInTexture; + } else if(var5 == 0) { + return Block.stone.blockIndexInTexture; + } else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + return var5 != var6 ? this.blockIndexInTexture : (this.isActive ? this.blockIndexInTexture + 16 : this.blockIndexInTexture - 1); + } + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.isActive) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + float var7 = (float)var2 + 0.5F; + float var8 = (float)var3 + 0.0F + var5.nextFloat() * 6.0F / 16.0F; + float var9 = (float)var4 + 0.5F; + float var10 = 0.52F; + float var11 = var5.nextFloat() * 0.6F - 0.3F; + if(var6 == 4) { + var1.spawnParticle("smoke", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D); + } else if(var6 == 5) { + var1.spawnParticle("smoke", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D); + } else if(var6 == 2) { + var1.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D); + } else if(var6 == 3) { + var1.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D); + } + + } + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? Block.stone.blockID : (var1 == 0 ? Block.stone.blockID : (var1 == 3 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture)); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + TileEntityFurnace var6 = (TileEntityFurnace)var1.getBlockTileEntity(var2, var3, var4); + var5.displayGUIFurnace(var6); + return true; + } + + public static void updateFurnaceBlockState(boolean var0, World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + TileEntity var6 = var1.getBlockTileEntity(var2, var3, var4); + if(var0) { + var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenActive.blockID); + } else { + var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenIdle.blockID); + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var5); + var1.setBlockTileEntity(var2, var3, var4, var6); + } + + protected TileEntity SetBlockEntity() { + return new TileEntityFurnace(); + } + + public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) { + int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + if(var6 == 0) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 2); + } + + if(var6 == 1) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 5); + } + + if(var6 == 2) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 3); + } + + if(var6 == 3) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 4); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockGlass.java b/src/main/java/net/minecraft/src/BlockGlass.java new file mode 100644 index 0000000..c2672d1 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockGlass.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockGlass extends BlockBreakable { + public BlockGlass(int var1, int var2, Material var3, boolean var4) { + super(var1, var2, var3, var4); + } + + public int quantityDropped(Random var1) { + return 0; + } +} diff --git a/src/main/java/net/minecraft/src/BlockGrass.java b/src/main/java/net/minecraft/src/BlockGrass.java new file mode 100644 index 0000000..637bf79 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockGrass.java @@ -0,0 +1,51 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockGrass extends Block { + protected BlockGrass(int var1) { + super(var1, Material.ground); + this.blockIndexInTexture = 3; + this.setTickOnLoad(true); + } + + public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(var5 == 1) { + return 0; + } else if(var5 == 0) { + return 2; + } else { + Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4); + return var6 != Material.snow && var6 != Material.builtSnow ? 3 : 68; + } + } + + public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) { + var1.func_4075_a().func_4069_a(var2, var4, 1, 1); + double var5 = var1.func_4075_a().temperature[0]; + double var7 = var1.func_4075_a().humidity[0]; + return ColorizerGrass.func_4147_a(var5, var7); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getBlockLightValue(var2, var3 + 1, var4) < 4 && var1.getBlockMaterial(var2, var3 + 1, var4).getCanBlockGrass()) { + if(var5.nextInt(4) != 0) { + return; + } + + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } else if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) { + int var6 = var2 + var5.nextInt(3) - 1; + int var7 = var3 + var5.nextInt(5) - 3; + int var8 = var4 + var5.nextInt(3) - 1; + if(var1.getBlockId(var6, var7, var8) == Block.dirt.blockID && var1.getBlockLightValue(var6, var7 + 1, var8) >= 4 && !var1.getBlockMaterial(var6, var7 + 1, var8).getCanBlockGrass()) { + var1.setBlockWithNotify(var6, var7, var8, Block.grass.blockID); + } + } + + } + + public int idDropped(int var1, Random var2) { + return Block.dirt.idDropped(0, var2); + } +} diff --git a/src/main/java/net/minecraft/src/BlockGravel.java b/src/main/java/net/minecraft/src/BlockGravel.java new file mode 100644 index 0000000..c0fd641 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockGravel.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockGravel extends BlockSand { + public BlockGravel(int var1, int var2) { + super(var1, var2); + } + + public int idDropped(int var1, Random var2) { + return var2.nextInt(10) == 0 ? Item.flint.shiftedIndex : this.blockID; + } +} diff --git a/src/main/java/net/minecraft/src/BlockIce.java b/src/main/java/net/minecraft/src/BlockIce.java new file mode 100644 index 0000000..f32f78f --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockIce.java @@ -0,0 +1,39 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockIce extends BlockBreakable { + public BlockIce(int var1, int var2) { + super(var1, var2, Material.ice, false); + this.slipperiness = 0.98F; + this.setTickOnLoad(true); + } + + public int func_234_g() { + return 1; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return super.shouldSideBeRendered(var1, var2, var3, var4, 1 - var5); + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + Material var5 = var1.getBlockMaterial(var2, var3 - 1, var4); + if(var5.func_880_c() || var5.getIsLiquid()) { + var1.setBlockWithNotify(var2, var3, var4, Block.waterStill.blockID); + } + + } + + public int quantityDropped(Random var1) { + return 0; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11 - Block.lightOpacity[this.blockID]) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, Block.waterMoving.blockID); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockJukeBox.java b/src/main/java/net/minecraft/src/BlockJukeBox.java new file mode 100644 index 0000000..06781b1 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockJukeBox.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +public class BlockJukeBox extends Block { + protected BlockJukeBox(int var1, int var2) { + super(var1, var2, Material.wood); + } + + public int getBlockTextureFromSide(int var1) { + return this.blockIndexInTexture + (var1 == 1 ? 1 : 0); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 > 0) { + this.ejectRecord(var1, var2, var3, var4, var6); + return true; + } else { + return false; + } + } + + public void ejectRecord(World var1, int var2, int var3, int var4, int var5) { + var1.playRecord((String)null, var2, var3, var4); + var1.setBlockMetadataWithNotify(var2, var3, var4, 0); + int var6 = Item.record13.shiftedIndex + var5 - 1; + float var7 = 0.7F; + double var8 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D; + double var10 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.2D + 0.6D; + double var12 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D; + EntityItem var14 = new EntityItem(var1, (double)var2 + var8, (double)var3 + var10, (double)var4 + var12, new ItemStack(var6)); + var14.field_805_c = 10; + var1.entityJoinedWorld(var14); + } + + public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) { + //if(!var1.multiplayerWorld) { + if(var5 > 0) { + this.ejectRecord(var1, var2, var3, var4, var5); + } + + super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6); + //} + } +} diff --git a/src/main/java/net/minecraft/src/BlockLadder.java b/src/main/java/net/minecraft/src/BlockLadder.java new file mode 100644 index 0000000..678f29e --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLadder.java @@ -0,0 +1,121 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockLadder extends Block { + protected BlockLadder(int var1, int var2) { + super(var1, var2, Material.circuits); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + float var6 = 2.0F / 16.0F; + if(var5 == 2) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var6, 1.0F, 1.0F, 1.0F); + } + + if(var5 == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var6); + } + + if(var5 == 4) { + this.setBlockBounds(1.0F - var6, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + if(var5 == 5) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var6, 1.0F, 1.0F); + } + + return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4); + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + float var6 = 2.0F / 16.0F; + if(var5 == 2) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var6, 1.0F, 1.0F, 1.0F); + } + + if(var5 == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var6); + } + + if(var5 == 4) { + this.setBlockBounds(1.0F - var6, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + if(var5 == 5) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var6, 1.0F, 1.0F); + } + + return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 8; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : var1.isBlockOpaqueCube(var2, var3, var4 + 1))); + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 == 0 || var5 == 2) && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var6 = 2; + } + + if((var6 == 0 || var5 == 3) && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var6 = 3; + } + + if((var6 == 0 || var5 == 4) && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var6 = 4; + } + + if((var6 == 0 || var5 == 5) && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var6 = 5; + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + boolean var7 = false; + if(var6 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var7 = true; + } + + if(var6 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var7 = true; + } + + if(var6 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var7 = true; + } + + if(var6 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var7 = true; + } + + if(!var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var6); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + } + + public int quantityDropped(Random var1) { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/BlockLeaves.java b/src/main/java/net/minecraft/src/BlockLeaves.java new file mode 100644 index 0000000..edb9bc7 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLeaves.java @@ -0,0 +1,128 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockLeaves extends BlockLeavesBase { + private int baseIndexInPNG; + private int field_464_c = 0; + + protected BlockLeaves(int var1, int var2) { + super(var1, var2, Material.leaves, false); + this.baseIndexInPNG = var2; + } + + public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) { + var1.func_4075_a().func_4069_a(var2, var4, 1, 1); + double var5 = var1.func_4075_a().temperature[0]; + double var7 = var1.func_4075_a().humidity[0]; + return ColorizerFoliage.func_4146_a(var5, var7); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this == null) { + this.field_464_c = 0; + this.func_308_h(var1, var2, var3, var4); + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + } + } + + public void func_6361_f(World var1, int var2, int var3, int var4, int var5) { + if(var1.getBlockId(var2, var3, var4) == this.blockID) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 != 0 && var6 == var5 - 1) { + this.func_308_h(var1, var2, var3, var4); + } + } + } + + public void func_308_h(World var1, int var2, int var3, int var4) { + if(this == null) { + if(this.field_464_c++ < 100) { + int var5 = var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a() ? 16 : 0; + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 == 0) { + var6 = 1; + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + } + + var5 = this.func_6362_g(var1, var2, var3 - 1, var4, var5); + var5 = this.func_6362_g(var1, var2, var3, var4 - 1, var5); + var5 = this.func_6362_g(var1, var2, var3, var4 + 1, var5); + var5 = this.func_6362_g(var1, var2 - 1, var3, var4, var5); + var5 = this.func_6362_g(var1, var2 + 1, var3, var4, var5); + int var7 = var5 - 1; + if(var7 < 10) { + var7 = 1; + } + + if(var7 != var6) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var7); + this.func_6361_f(var1, var2, var3 - 1, var4, var6); + this.func_6361_f(var1, var2, var3 + 1, var4, var6); + this.func_6361_f(var1, var2, var3, var4 - 1, var6); + this.func_6361_f(var1, var2, var3, var4 + 1, var6); + this.func_6361_f(var1, var2 - 1, var3, var4, var6); + this.func_6361_f(var1, var2 + 1, var3, var4, var6); + } + + } + } + } + + private int func_6362_g(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockId(var2, var3, var4); + if(var6 == Block.wood.blockID) { + return 16; + } else { + if(var6 == this.blockID) { + int var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 != 0 && var7 > var5) { + return var7; + } + } + + return var5; + } + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(this == null) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 == 0) { + this.field_464_c = 0; + this.func_308_h(var1, var2, var3, var4); + } else if(var6 == 1) { + this.func_6360_i(var1, var2, var3, var4); + } else if(var5.nextInt(10) == 0) { + this.func_308_h(var1, var2, var3, var4); + } + + } + } + + private void func_6360_i(World var1, int var2, int var3, int var4) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + public int quantityDropped(Random var1) { + return var1.nextInt(20) == 0 ? 1 : 0; + } + + public int idDropped(int var1, Random var2) { + return Block.sapling.blockID; + } + + public boolean isOpaqueCube() { + return !this.graphicsLevel; + } + + public void setGraphicsLevel(boolean var1) { + this.graphicsLevel = var1; + this.blockIndexInTexture = this.baseIndexInPNG + (var1 ? 0 : 1); + } + + public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) { + super.onEntityWalking(var1, var2, var3, var4, var5); + } +} diff --git a/src/main/java/net/minecraft/src/BlockLeavesBase.java b/src/main/java/net/minecraft/src/BlockLeavesBase.java new file mode 100644 index 0000000..c719d88 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLeavesBase.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +public class BlockLeavesBase extends Block { + protected boolean graphicsLevel; + + protected BlockLeavesBase(int var1, int var2, Material var3, boolean var4) { + super(var1, var2, var3); + this.graphicsLevel = var4; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockId(var2, var3, var4); + return !this.graphicsLevel && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } +} diff --git a/src/main/java/net/minecraft/src/BlockLever.java b/src/main/java/net/minecraft/src/BlockLever.java new file mode 100644 index 0000000..ed23dbc --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLever.java @@ -0,0 +1,200 @@ +package net.minecraft.src; + +public class BlockLever extends Block { + protected BlockLever(int var1, int var2) { + super(var1, var2, Material.circuits); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 12; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 + 1) ? true : var1.isBlockOpaqueCube(var2, var3 - 1, var4)))); + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + int var7 = var6 & 8; + var6 &= 7; + if(var5 == 1 && var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var6 = 5 + var1.rand.nextInt(2); + } + + if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var6 = 4; + } + + if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var6 = 3; + } + + if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var6 = 2; + } + + if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var6 = 1; + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 2); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 3); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 4); + } else if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 5 + var1.rand.nextInt(2)); + } + + this.checkIfAttachedToBlock(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this.checkIfAttachedToBlock(var1, var2, var3, var4)) { + int var6 = var1.getBlockMetadata(var2, var3, var4) & 7; + boolean var7 = false; + if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && var6 == 5) { + var7 = true; + } + + if(var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + } + + private boolean checkIfAttachedToBlock(World var1, int var2, int var3, int var4) { + if(!this.canPlaceBlockAt(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + return false; + } else { + return true; + } + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4) & 7; + float var6 = 3.0F / 16.0F; + if(var5 == 1) { + this.setBlockBounds(0.0F, 0.2F, 0.5F - var6, var6 * 2.0F, 0.8F, 0.5F + var6); + } else if(var5 == 2) { + this.setBlockBounds(1.0F - var6 * 2.0F, 0.2F, 0.5F - var6, 1.0F, 0.8F, 0.5F + var6); + } else if(var5 == 3) { + this.setBlockBounds(0.5F - var6, 0.2F, 0.0F, 0.5F + var6, 0.8F, var6 * 2.0F); + } else if(var5 == 4) { + this.setBlockBounds(0.5F - var6, 0.2F, 1.0F - var6 * 2.0F, 0.5F + var6, 0.8F, 1.0F); + } else { + var6 = 0.25F; + this.setBlockBounds(0.5F - var6, 0.0F, 0.5F - var6, 0.5F + var6, 0.6F, 0.5F + var6); + } + + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.blockActivated(var1, var2, var3, var4, var5); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + //if(var1.multiplayerWorld) { + //return true; + //} else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + int var7 = var6 & 7; + int var8 = 8 - (var6 & 8); + var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, var8 > 0 ? 0.6F : 0.5F); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + if(var7 == 1) { + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + } else if(var7 == 2) { + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + } else if(var7 == 3) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + } else if(var7 == 4) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } else { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + + return true; + //} + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + if((var5 & 8) > 0) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + int var6 = var5 & 7; + if(var6 == 1) { + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + } else if(var6 == 2) { + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + } else if(var6 == 3) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + } else if(var6 == 4) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } else { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + } + + super.onBlockRemoval(var1, var2, var3, var4); + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0; + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if((var6 & 8) == 0) { + return false; + } else { + int var7 = var6 & 7; + return var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5))); + } + } + + public boolean canProvidePower() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/BlockLightStone.java b/src/main/java/net/minecraft/src/BlockLightStone.java new file mode 100644 index 0000000..3bd1e61 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLightStone.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockLightStone extends Block { + public BlockLightStone(int var1, int var2, Material var3) { + super(var1, var2, var3); + } + + public int idDropped(int var1, Random var2) { + return Item.lightStoneDust.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/BlockLog.java b/src/main/java/net/minecraft/src/BlockLog.java new file mode 100644 index 0000000..357e5a0 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockLog.java @@ -0,0 +1,22 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockLog extends Block { + protected BlockLog(int var1) { + super(var1, Material.wood); + this.blockIndexInTexture = 20; + } + + public int quantityDropped(Random var1) { + return 1; + } + + public int idDropped(int var1, Random var2) { + return Block.wood.blockID; + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? 21 : (var1 == 0 ? 21 : 20); + } +} diff --git a/src/main/java/net/minecraft/src/BlockMinecartTrack.java b/src/main/java/net/minecraft/src/BlockMinecartTrack.java new file mode 100644 index 0000000..707effb --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockMinecartTrack.java @@ -0,0 +1,101 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockMinecartTrack extends Block { + protected BlockMinecartTrack(int var1, int var2) { + super(var1, var2, Material.circuits); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + return super.collisionRayTrace(var1, var2, var3, var4, var5, var6); + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + if(var5 >= 2 && var5 <= 5) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 10.0F / 16.0F, 1.0F); + } else { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F); + } + + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return var2 >= 6 ? this.blockIndexInTexture - 16 : this.blockIndexInTexture; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 9; + } + + public int quantityDropped(Random var1) { + return 1; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2, var3 - 1, var4); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + //if(!var1.multiplayerWorld) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 15); + this.func_4031_h(var1, var2, var3, var4); + //} + + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + //if(!var1.multiplayerWorld) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + boolean var7 = false; + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var7 = true; + } + + if(var6 == 2 && !var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var7 = true; + } + + if(var6 == 3 && !var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var7 = true; + } + + if(var6 == 4 && !var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var7 = true; + } + + if(var6 == 5 && !var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var7 = true; + } + + if(var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } else if(var5 > 0 && Block.blocksList[var5].canProvidePower() && MinecartTrackLogic.func_791_a(new MinecartTrackLogic(this, var1, var2, var3, var4)) == 3) { + this.func_4031_h(var1, var2, var3, var4); + } + + //} + } + + private void func_4031_h(World var1, int var2, int var3, int var4) { + //if(!var1.multiplayerWorld) { + (new MinecartTrackLogic(this, var1, var2, var3, var4)).func_792_a(var1.isBlockIndirectlyGettingPowered(var2, var3, var4)); + //} + } +} diff --git a/src/main/java/net/minecraft/src/BlockMobSpawner.java b/src/main/java/net/minecraft/src/BlockMobSpawner.java new file mode 100644 index 0000000..909aaa6 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockMobSpawner.java @@ -0,0 +1,25 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockMobSpawner extends BlockContainer { + protected BlockMobSpawner(int var1, int var2) { + super(var1, var2, Material.rock); + } + + protected TileEntity SetBlockEntity() { + return new TileEntityMobSpawner(); + } + + public int idDropped(int var1, Random var2) { + return 0; + } + + public int quantityDropped(Random var1) { + return 0; + } + + public boolean isOpaqueCube() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/BlockMushroom.java b/src/main/java/net/minecraft/src/BlockMushroom.java new file mode 100644 index 0000000..f129b7b --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockMushroom.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class BlockMushroom extends BlockFlower { + protected BlockMushroom(int var1, int var2) { + super(var1, var2); + float var3 = 0.2F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3); + } + + protected boolean canThisPlantGrowOnThisBlockID(int var1) { + return Block.opaqueCubeLookup[var1]; + } + + public boolean canBlockStay(World var1, int var2, int var3, int var4) { + return var1.getBlockLightValue(var2, var3, var4) <= 13 && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4)); + } +} diff --git a/src/main/java/net/minecraft/src/BlockObsidian.java b/src/main/java/net/minecraft/src/BlockObsidian.java new file mode 100644 index 0000000..c75b227 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockObsidian.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockObsidian extends BlockStone { + public BlockObsidian(int var1, int var2) { + super(var1, var2); + } + + public int quantityDropped(Random var1) { + return 1; + } + + public int idDropped(int var1, Random var2) { + return Block.obsidian.blockID; + } +} diff --git a/src/main/java/net/minecraft/src/BlockOre.java b/src/main/java/net/minecraft/src/BlockOre.java new file mode 100644 index 0000000..a66fd91 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockOre.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockOre extends Block { + public BlockOre(int var1, int var2) { + super(var1, var2, Material.rock); + } + + public int idDropped(int var1, Random var2) { + return this.blockID == Block.oreCoal.blockID ? Item.coal.shiftedIndex : (this.blockID == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : this.blockID); + } + + public int quantityDropped(Random var1) { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/BlockOreBlock.java b/src/main/java/net/minecraft/src/BlockOreBlock.java new file mode 100644 index 0000000..cf05675 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockOreBlock.java @@ -0,0 +1,12 @@ +package net.minecraft.src; + +public class BlockOreBlock extends Block { + public BlockOreBlock(int var1, int var2) { + super(var1, Material.iron); + this.blockIndexInTexture = var2; + } + + public int getBlockTextureFromSide(int var1) { + return this.blockIndexInTexture - 16; + } +} diff --git a/src/main/java/net/minecraft/src/BlockPortal.java b/src/main/java/net/minecraft/src/BlockPortal.java new file mode 100644 index 0000000..e84d1b6 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockPortal.java @@ -0,0 +1,167 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockPortal extends BlockBreakable { + public BlockPortal(int var1, int var2) { + super(var1, var2, Material.field_4260_x, false); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + float var5; + float var6; + if(var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID) { + var5 = 2.0F / 16.0F; + var6 = 0.5F; + this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6); + } else { + var5 = 0.5F; + var6 = 2.0F / 16.0F; + this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6); + } + + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean tryToCreatePortal(World var1, int var2, int var3, int var4) { + byte var5 = 0; + byte var6 = 0; + if(var1.getBlockId(var2 - 1, var3, var4) == Block.obsidian.blockID || var1.getBlockId(var2 + 1, var3, var4) == Block.obsidian.blockID) { + var5 = 1; + } + + if(var1.getBlockId(var2, var3, var4 - 1) == Block.obsidian.blockID || var1.getBlockId(var2, var3, var4 + 1) == Block.obsidian.blockID) { + var6 = 1; + } + + System.out.println(var5 + ", " + var6); + if(var5 == var6) { + return false; + } else { + if(var1.getBlockId(var2 - var5, var3, var4 - var6) == 0) { + var2 -= var5; + var4 -= var6; + } + + int var7; + int var8; + for(var7 = -1; var7 <= 2; ++var7) { + for(var8 = -1; var8 <= 3; ++var8) { + boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3; + if(var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3) { + int var10 = var1.getBlockId(var2 + var5 * var7, var3 + var8, var4 + var6 * var7); + if(var9) { + if(var10 != Block.obsidian.blockID) { + return false; + } + } else if(var10 != 0 && var10 != Block.fire.blockID) { + return false; + } + } + } + } + + var1.field_1043_h = true; + + for(var7 = 0; var7 < 2; ++var7) { + for(var8 = 0; var8 < 3; ++var8) { + var1.setBlockWithNotify(var2 + var5 * var7, var3 + var8, var4 + var6 * var7, Block.portal.blockID); + } + } + + var1.field_1043_h = false; + return true; + } + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + byte var6 = 0; + byte var7 = 1; + if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID) { + var6 = 1; + var7 = 0; + } + + int var8; + for(var8 = var3; var1.getBlockId(var2, var8 - 1, var4) == this.blockID; --var8) { + } + + if(var1.getBlockId(var2, var8 - 1, var4) != Block.obsidian.blockID) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + int var9; + for(var9 = 1; var9 < 4 && var1.getBlockId(var2, var8 + var9, var4) == this.blockID; ++var9) { + } + + if(var9 == 3 && var1.getBlockId(var2, var8 + var9, var4) == Block.obsidian.blockID) { + boolean var10 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID; + boolean var11 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID || var1.getBlockId(var2, var3, var4 + 1) == this.blockID; + if(var10 && var11) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else if((var1.getBlockId(var2 + var6, var3, var4 + var7) != Block.obsidian.blockID || var1.getBlockId(var2 - var6, var3, var4 - var7) != this.blockID) && (var1.getBlockId(var2 - var6, var3, var4 - var7) != Block.obsidian.blockID || var1.getBlockId(var2 + var6, var3, var4 + var7) != this.blockID)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } else { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return true; + } + + public int quantityDropped(Random var1) { + return 0; + } + + public int func_234_g() { + return 1; + } + + public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { + //if(!var1.multiplayerWorld) { + var5.func_4039_q(); + //} + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(var5.nextInt(100) == 0) { + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "portal.portal", 1.0F, var5.nextFloat() * 0.4F + 0.8F); + } + + for(int var6 = 0; var6 < 4; ++var6) { + double var7 = (double)((float)var2 + var5.nextFloat()); + double var9 = (double)((float)var3 + var5.nextFloat()); + double var11 = (double)((float)var4 + var5.nextFloat()); + double var13 = 0.0D; + double var15 = 0.0D; + double var17 = 0.0D; + int var19 = var5.nextInt(2) * 2 - 1; + var13 = ((double)var5.nextFloat() - 0.5D) * 0.5D; + var15 = ((double)var5.nextFloat() - 0.5D) * 0.5D; + var17 = ((double)var5.nextFloat() - 0.5D) * 0.5D; + if(var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID) { + var7 = (double)var2 + 0.5D + 0.25D * (double)var19; + var13 = (double)(var5.nextFloat() * 2.0F * (float)var19); + } else { + var11 = (double)var4 + 0.5D + 0.25D * (double)var19; + var17 = (double)(var5.nextFloat() * 2.0F * (float)var19); + } + + var1.spawnParticle("portal", var7, var9, var11, var13, var15, var17); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockPressurePlate.java b/src/main/java/net/minecraft/src/BlockPressurePlate.java new file mode 100644 index 0000000..583e62f --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockPressurePlate.java @@ -0,0 +1,151 @@ +package net.minecraft.src; + +import java.util.List; +import java.util.Random; + +public class BlockPressurePlate extends Block { + private EnumMobType triggerMobType; + + protected BlockPressurePlate(int var1, int var2, EnumMobType var3) { + super(var1, var2, Material.rock); + this.triggerMobType = var3; + this.setTickOnLoad(true); + float var4 = 1.0F / 16.0F; + this.setBlockBounds(var4, 0.0F, var4, 1.0F - var4, 0.03125F, 1.0F - var4); + } + + public int tickRate() { + return 20; + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2, var3 - 1, var4); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + boolean var6 = false; + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var6 = true; + } + + if(var6) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + //if(!var1.multiplayerWorld) { + if(var1.getBlockMetadata(var2, var3, var4) != 0) { + this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4); + } + //} + } + + public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { + //if(!var1.multiplayerWorld) { + if(var1.getBlockMetadata(var2, var3, var4) != 1) { + this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4); + } + //} + } + + private void setStateIfMobInteractsWithPlate(World var1, int var2, int var3, int var4) { + boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1; + boolean var6 = false; + float var7 = 2.0F / 16.0F; + List var8 = null; + if(this.triggerMobType == EnumMobType.everything) { + var8 = var1.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7))); + } + + if(this.triggerMobType == EnumMobType.mobs) { + var8 = var1.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7))); + } + + if(this.triggerMobType == EnumMobType.players) { + var8 = var1.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7))); + } + + if(var8.size() > 0) { + var6 = true; + } + + if(var6 && !var5) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F); + } + + if(!var6 && var5) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 0); + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F); + } + + if(var6) { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + if(var5 > 0) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + } + + super.onBlockRemoval(var1, var2, var3, var4); + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1; + float var6 = 1.0F / 16.0F; + if(var5) { + this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.03125F, 1.0F - var6); + } else { + this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 1.0F / 16.0F, 1.0F - var6); + } + + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return var1.getBlockMetadata(var2, var3, var4) > 0; + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + return var1.getBlockMetadata(var2, var3, var4) == 0 ? false : var5 == 1; + } + + public boolean canProvidePower() { + return true; + } + + public void func_237_e() { + float var1 = 0.5F; + float var2 = 2.0F / 16.0F; + float var3 = 0.5F; + this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3); + } +} diff --git a/src/main/java/net/minecraft/src/BlockPumpkin.java b/src/main/java/net/minecraft/src/BlockPumpkin.java new file mode 100644 index 0000000..c2557f3 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockPumpkin.java @@ -0,0 +1,45 @@ +package net.minecraft.src; + +public class BlockPumpkin extends Block { + private boolean field_4072_a; + + protected BlockPumpkin(int var1, int var2, boolean var3) { + super(var1, Material.pumpkin); + this.blockIndexInTexture = var2; + this.setTickOnLoad(true); + this.field_4072_a = var3; + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + if(var1 == 1) { + return this.blockIndexInTexture; + } else if(var1 == 0) { + return this.blockIndexInTexture; + } else { + int var3 = this.blockIndexInTexture + 1 + 16; + if(this.field_4072_a) { + ++var3; + } + + return var2 == 0 && var1 == 2 ? var3 : (var2 == 1 && var1 == 5 ? var3 : (var2 == 2 && var1 == 3 ? var3 : (var2 == 3 && var1 == 4 ? var3 : this.blockIndexInTexture + 16))); + } + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture : (var1 == 3 ? this.blockIndexInTexture + 1 + 16 : this.blockIndexInTexture + 16)); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3, var4); + return (var5 == 0 || Block.blocksList[var5].blockMaterial.getIsLiquid()) && var1.isBlockOpaqueCube(var2, var3 - 1, var4); + } + + public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) { + int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + var1.setBlockMetadataWithNotify(var2, var3, var4, var6); + } +} diff --git a/src/main/java/net/minecraft/src/BlockRedstoneOre.java b/src/main/java/net/minecraft/src/BlockRedstoneOre.java new file mode 100644 index 0000000..a37f8f7 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockRedstoneOre.java @@ -0,0 +1,104 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockRedstoneOre extends Block { + private boolean field_468_a; + + public BlockRedstoneOre(int var1, int var2, boolean var3) { + super(var1, var2, Material.rock); + if(var3) { + this.setTickOnLoad(true); + } + + this.field_468_a = var3; + } + + public int tickRate() { + return 30; + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.func_320_h(var1, var2, var3, var4); + super.onBlockClicked(var1, var2, var3, var4, var5); + } + + public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) { + this.func_320_h(var1, var2, var3, var4); + super.onEntityWalking(var1, var2, var3, var4, var5); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.func_320_h(var1, var2, var3, var4); + return super.blockActivated(var1, var2, var3, var4, var5); + } + + private void func_320_h(World var1, int var2, int var3, int var4) { + this.func_319_i(var1, var2, var3, var4); + if(this.blockID == Block.oreRedstone.blockID) { + var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstoneGlowing.blockID); + } + + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.blockID == Block.oreRedstoneGlowing.blockID) { + var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstone.blockID); + } + + } + + public int idDropped(int var1, Random var2) { + return Item.redstone.shiftedIndex; + } + + public int quantityDropped(Random var1) { + return 4 + var1.nextInt(2); + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.field_468_a) { + this.func_319_i(var1, var2, var3, var4); + } + + } + + private void func_319_i(World var1, int var2, int var3, int var4) { + Random var5 = var1.rand; + double var6 = 1.0D / 16.0D; + + for(int var8 = 0; var8 < 6; ++var8) { + double var9 = (double)((float)var2 + var5.nextFloat()); + double var11 = (double)((float)var3 + var5.nextFloat()); + double var13 = (double)((float)var4 + var5.nextFloat()); + if(var8 == 0 && !var1.isBlockOpaqueCube(var2, var3 + 1, var4)) { + var11 = (double)(var3 + 1) + var6; + } + + if(var8 == 1 && !var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var11 = (double)(var3 + 0) - var6; + } + + if(var8 == 2 && !var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var13 = (double)(var4 + 1) + var6; + } + + if(var8 == 3 && !var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var13 = (double)(var4 + 0) - var6; + } + + if(var8 == 4 && !var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var9 = (double)(var2 + 1) + var6; + } + + if(var8 == 5 && !var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var9 = (double)(var2 + 0) - var6; + } + + if(var9 < (double)var2 || var9 > (double)(var2 + 1) || var11 < 0.0D || var11 > (double)(var3 + 1) || var13 < (double)var4 || var13 > (double)(var4 + 1)) { + var1.spawnParticle("reddust", var9, var11, var13, 0.0D, 0.0D, 0.0D); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockRedstoneTorch.java b/src/main/java/net/minecraft/src/BlockRedstoneTorch.java new file mode 100644 index 0000000..8c120f3 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockRedstoneTorch.java @@ -0,0 +1,153 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class BlockRedstoneTorch extends BlockTorch { + private boolean torchActive = false; + private static List torchUpdates = new ArrayList(); + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return var1 == 1 ? Block.redstoneWire.getBlockTextureFromSideAndMetadata(var1, var2) : super.getBlockTextureFromSideAndMetadata(var1, var2); + } + + private boolean checkForBurnout(World var1, int var2, int var3, int var4, boolean var5) { + if(var5) { + torchUpdates.add(new RedstoneUpdateInfo(var2, var3, var4, var1.worldTime)); + } + + int var6 = 0; + + for(int var7 = 0; var7 < torchUpdates.size(); ++var7) { + RedstoneUpdateInfo var8 = (RedstoneUpdateInfo)torchUpdates.get(var7); + if(var8.x == var2 && var8.y == var3 && var8.z == var4) { + ++var6; + if(var6 >= 8) { + return true; + } + } + } + + return false; + } + + protected BlockRedstoneTorch(int var1, int var2, boolean var3) { + super(var1, var2); + this.torchActive = var3; + this.setTickOnLoad(true); + } + + public int tickRate() { + return 2; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.getBlockMetadata(var2, var3, var4) == 0) { + super.onBlockAdded(var1, var2, var3, var4); + } + + if(this.torchActive) { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } + + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + if(this.torchActive) { + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + } + + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(!this.torchActive) { + return false; + } else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + return var6 == 5 && var5 == 1 ? false : (var6 == 3 && var5 == 3 ? false : (var6 == 4 && var5 == 2 ? false : (var6 == 1 && var5 == 5 ? false : var6 != 2 || var5 != 4))); + } + } + + private boolean func_15232_h(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + return var5 == 5 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3 - 1, var4, 0) ? true : (var5 == 3 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 - 1, 2) ? true : (var5 == 4 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 + 1, 3) ? true : (var5 == 1 && var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3, var4, 4) ? true : var5 == 2 && var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3, var4, 5)))); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + boolean var6 = this.func_15232_h(var1, var2, var3, var4); + + while(torchUpdates.size() > 0 && var1.worldTime - ((RedstoneUpdateInfo)torchUpdates.get(0)).updateTime > 100L) { + torchUpdates.remove(0); + } + + if(this.torchActive) { + if(var6) { + var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneIdle.blockID, var1.getBlockMetadata(var2, var3, var4)); + if(this.checkForBurnout(var1, var2, var3, var4, true)) { + var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F); + + for(int var7 = 0; var7 < 5; ++var7) { + double var8 = (double)var2 + var5.nextDouble() * 0.6D + 0.2D; + double var10 = (double)var3 + var5.nextDouble() * 0.6D + 0.2D; + double var12 = (double)var4 + var5.nextDouble() * 0.6D + 0.2D; + var1.spawnParticle("smoke", var8, var10, var12, 0.0D, 0.0D, 0.0D); + } + } + } + } else if(!var6 && !this.checkForBurnout(var1, var2, var3, var4, false)) { + var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneActive.blockID, var1.getBlockMetadata(var2, var3, var4)); + } + + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + return var5 == 0 ? this.isPoweringTo(var1, var2, var3, var4, var5) : false; + } + + public int idDropped(int var1, Random var2) { + return Block.torchRedstoneActive.blockID; + } + + public boolean canProvidePower() { + return true; + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.torchActive) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + double var7 = (double)((float)var2 + 0.5F) + (double)(var5.nextFloat() - 0.5F) * 0.2D; + double var9 = (double)((float)var3 + 0.7F) + (double)(var5.nextFloat() - 0.5F) * 0.2D; + double var11 = (double)((float)var4 + 0.5F) + (double)(var5.nextFloat() - 0.5F) * 0.2D; + double var13 = (double)0.22F; + double var15 = (double)0.27F; + if(var6 == 1) { + var1.spawnParticle("reddust", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + } else if(var6 == 2) { + var1.spawnParticle("reddust", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + } else if(var6 == 3) { + var1.spawnParticle("reddust", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D); + } else if(var6 == 4) { + var1.spawnParticle("reddust", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D); + } else { + var1.spawnParticle("reddust", var7, var9, var11, 0.0D, 0.0D, 0.0D); + } + + } + } +} diff --git a/src/main/java/net/minecraft/src/BlockRedstoneWire.java b/src/main/java/net/minecraft/src/BlockRedstoneWire.java new file mode 100644 index 0000000..56d7da7 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockRedstoneWire.java @@ -0,0 +1,308 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockRedstoneWire extends Block { + private boolean wiresProvidePower = true; + + public BlockRedstoneWire(int var1, int var2) { + super(var1, var2, Material.circuits); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F / 16.0F, 1.0F); + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return this.blockIndexInTexture + (var2 > 0 ? 16 : 0); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 5; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2, var3 - 1, var4); + } + + private void updateAndPropagateCurrentStrength(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + int var6 = 0; + this.wiresProvidePower = false; + boolean var7 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4); + this.wiresProvidePower = true; + int var8; + int var9; + int var10; + if(var7) { + var6 = 15; + } else { + for(var8 = 0; var8 < 4; ++var8) { + var9 = var2; + var10 = var4; + if(var8 == 0) { + var9 = var2 - 1; + } + + if(var8 == 1) { + ++var9; + } + + if(var8 == 2) { + var10 = var4 - 1; + } + + if(var8 == 3) { + ++var10; + } + + var6 = this.getMaxCurrentStrength(var1, var9, var3, var10, var6); + if(var1.isBlockOpaqueCube(var9, var3, var10) && !var1.isBlockOpaqueCube(var2, var3 + 1, var4)) { + var6 = this.getMaxCurrentStrength(var1, var9, var3 + 1, var10, var6); + } else if(!var1.isBlockOpaqueCube(var9, var3, var10)) { + var6 = this.getMaxCurrentStrength(var1, var9, var3 - 1, var10, var6); + } + } + + if(var6 > 0) { + --var6; + } else { + var6 = 0; + } + } + + if(var5 != var6) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var6); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + if(var6 > 0) { + --var6; + } + + for(var8 = 0; var8 < 4; ++var8) { + var9 = var2; + var10 = var4; + int var11 = var3 - 1; + if(var8 == 0) { + var9 = var2 - 1; + } + + if(var8 == 1) { + ++var9; + } + + if(var8 == 2) { + var10 = var4 - 1; + } + + if(var8 == 3) { + ++var10; + } + + if(var1.isBlockOpaqueCube(var9, var3, var10)) { + var11 += 2; + } + + int var12 = this.getMaxCurrentStrength(var1, var9, var3, var10, -1); + if(var12 >= 0 && var12 != var6) { + this.updateAndPropagateCurrentStrength(var1, var9, var3, var10); + } + + var12 = this.getMaxCurrentStrength(var1, var9, var11, var10, -1); + if(var12 >= 0 && var12 != var6) { + this.updateAndPropagateCurrentStrength(var1, var9, var11, var10); + } + } + + if(var5 == 0 || var6 == 0) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + } + } + + } + + private void notifyWireNeighborsOfNeighborChange(World var1, int var2, int var3, int var4) { + if(var1.getBlockId(var2, var3, var4) == this.blockID) { + var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + } + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + //if(!var1.multiplayerWorld) { + this.updateAndPropagateCurrentStrength(var1, var2, var3, var4); + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4); + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4); + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1); + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1); + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4); + } + + if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4); + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1); + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1); + } + + //} + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + super.onBlockRemoval(var1, var2, var3, var4); + //if(!var1.multiplayerWorld) { + var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID); + var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID); + this.updateAndPropagateCurrentStrength(var1, var2, var3, var4); + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4); + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4); + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1); + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1); + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4); + } + + if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4); + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1); + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1); + } else { + this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1); + } + + //} + } + + private int getMaxCurrentStrength(World var1, int var2, int var3, int var4, int var5) { + if(var1.getBlockId(var2, var3, var4) != this.blockID) { + return var5; + } else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + return var6 > var5 ? var6 : var5; + } + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + //if(!var1.multiplayerWorld) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + boolean var7 = this.canPlaceBlockAt(var1, var2, var3, var4); + if(!var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var6); + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + this.updateAndPropagateCurrentStrength(var1, var2, var3, var4); + } + + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + //} + } + + public int idDropped(int var1, Random var2) { + return Item.redstone.shiftedIndex; + } + + public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) { + return !this.wiresProvidePower ? false : this.isPoweringTo(var1, var2, var3, var4, var5); + } + + public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(!this.wiresProvidePower) { + return false; + } else if(var1.getBlockMetadata(var2, var3, var4) == 0) { + return false; + } else if(var5 == 1) { + return true; + } else { + boolean var6 = isPowerProviderOrWire(var1, var2 - 1, var3, var4) || !var1.isBlockOpaqueCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 - 1, var4); + boolean var7 = isPowerProviderOrWire(var1, var2 + 1, var3, var4) || !var1.isBlockOpaqueCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 - 1, var4); + boolean var8 = isPowerProviderOrWire(var1, var2, var3, var4 - 1) || !var1.isBlockOpaqueCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 - 1); + boolean var9 = isPowerProviderOrWire(var1, var2, var3, var4 + 1) || !var1.isBlockOpaqueCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 + 1); + if(!var1.isBlockOpaqueCube(var2, var3 + 1, var4)) { + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 + 1, var4)) { + var6 = true; + } + + if(var1.isBlockOpaqueCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 + 1, var4)) { + var7 = true; + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 - 1)) { + var8 = true; + } + + if(var1.isBlockOpaqueCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 + 1)) { + var9 = true; + } + } + + return !var8 && !var7 && !var6 && !var9 && var5 >= 2 && var5 <= 5 ? true : (var5 == 2 && var8 && !var6 && !var7 ? true : (var5 == 3 && var9 && !var6 && !var7 ? true : (var5 == 4 && var6 && !var8 && !var9 ? true : var5 == 5 && var7 && !var8 && !var9))); + } + } + + public boolean canProvidePower() { + return this.wiresProvidePower; + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getBlockMetadata(var2, var3, var4) > 0) { + double var6 = (double)var2 + 0.5D + ((double)var5.nextFloat() - 0.5D) * 0.2D; + double var8 = (double)((float)var3 + 1.0F / 16.0F); + double var10 = (double)var4 + 0.5D + ((double)var5.nextFloat() - 0.5D) * 0.2D; + var1.spawnParticle("reddust", var6, var8, var10, 0.0D, 0.0D, 0.0D); + } + + } + + public static boolean isPowerProviderOrWire(IBlockAccess var0, int var1, int var2, int var3) { + int var4 = var0.getBlockId(var1, var2, var3); + return var4 == Block.redstoneWire.blockID ? true : (var4 == 0 ? false : Block.blocksList[var4].canProvidePower()); + } +} diff --git a/src/main/java/net/minecraft/src/BlockReed.java b/src/main/java/net/minecraft/src/BlockReed.java new file mode 100644 index 0000000..faec2cf --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockReed.java @@ -0,0 +1,73 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockReed extends Block { + protected BlockReed(int var1, int var2) { + super(var1, Material.plants); + this.blockIndexInTexture = var2; + float var3 = 6.0F / 16.0F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 1.0F, 0.5F + var3); + this.setTickOnLoad(true); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getBlockId(var2, var3 + 1, var4) == 0) { + int var6; + for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) { + } + + if(var6 < 3) { + int var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 == 15) { + var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID); + var1.setBlockMetadataWithNotify(var2, var3, var4, 0); + } else { + var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1); + } + } + } + + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3 - 1, var4); + return var5 == this.blockID ? true : (var5 != Block.grass.blockID && var5 != Block.dirt.blockID ? false : (var1.getBlockMaterial(var2 - 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2 + 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2, var3 - 1, var4 - 1) == Material.water ? true : var1.getBlockMaterial(var2, var3 - 1, var4 + 1) == Material.water)))); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + this.checkBlockCoordValid(var1, var2, var3, var4); + } + + protected final void checkBlockCoordValid(World var1, int var2, int var3, int var4) { + if(!this.canBlockStay(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public boolean canBlockStay(World var1, int var2, int var3, int var4) { + return this.canPlaceBlockAt(var1, var2, var3, var4); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public int idDropped(int var1, Random var2) { + return Item.reed.shiftedIndex; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/BlockSand.java b/src/main/java/net/minecraft/src/BlockSand.java new file mode 100644 index 0000000..753f010 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSand.java @@ -0,0 +1,53 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSand extends Block { + public static boolean fallInstantly = false; + + public BlockSand(int var1, int var2) { + super(var1, var2, Material.sand); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.tryToFall(var1, var2, var3, var4); + } + + private void tryToFall(World var1, int var2, int var3, int var4) { + if(canFallBelow(var1, var2, var3 - 1, var4) && var3 >= 0) { + EntityFallingSand var8 = new EntityFallingSand(var1, (float)var2 + 0.5F, (float)var3 + 0.5F, (float)var4 + 0.5F, this.blockID); + if(fallInstantly) { + while(!var8.isDead) { + var8.onUpdate(); + } + } else { + var1.entityJoinedWorld(var8); + } + } + + } + + public int tickRate() { + return 3; + } + + public static boolean canFallBelow(World var0, int var1, int var2, int var3) { + int var4 = var0.getBlockId(var1, var2, var3); + if(var4 == 0) { + return true; + } else if(var4 == Block.fire.blockID) { + return true; + } else { + Material var5 = Block.blocksList[var4].blockMaterial; + return var5 == Material.water ? true : var5 == Material.lava; + } + } +} diff --git a/src/main/java/net/minecraft/src/BlockSapling.java b/src/main/java/net/minecraft/src/BlockSapling.java new file mode 100644 index 0000000..41458e0 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSapling.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSapling extends BlockFlower { + protected BlockSapling(int var1, int var2) { + super(var1, var2); + float var3 = 0.4F; + this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9 && var5.nextInt(5) == 0) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 < 15) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + 1); + } else { + var1.setBlock(var2, var3, var4, 0); + Object var7 = new WorldGenTrees(); + if(var5.nextInt(10) == 0) { + var7 = new WorldGenBigTree(); + } + + if(!((WorldGenerator)var7).generate(var1, var5, var2, var3, var4)) { + var1.setBlock(var2, var3, var4, this.blockID); + } + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockSign.java b/src/main/java/net/minecraft/src/BlockSign.java new file mode 100644 index 0000000..e8297dc --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSign.java @@ -0,0 +1,113 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSign extends BlockContainer { + private Class signEntityClass; + private boolean isFreestanding; + + protected BlockSign(int var1, Class var2, boolean var3) { + super(var1, Material.wood); + this.isFreestanding = var3; + this.blockIndexInTexture = 4; + this.signEntityClass = var2; + float var4 = 0.25F; + float var5 = 1.0F; + this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + this.setBlockBoundsBasedOnState(var1, var2, var3, var4); + return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4); + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + if(!this.isFreestanding) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + float var6 = 9.0F / 32.0F; + float var7 = 25.0F / 32.0F; + float var8 = 0.0F; + float var9 = 1.0F; + float var10 = 2.0F / 16.0F; + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + if(var5 == 2) { + this.setBlockBounds(var8, var6, 1.0F - var10, var9, var7, 1.0F); + } + + if(var5 == 3) { + this.setBlockBounds(var8, var6, 0.0F, var9, var7, var10); + } + + if(var5 == 4) { + this.setBlockBounds(1.0F - var10, var6, var8, 1.0F, var7, var9); + } + + if(var5 == 5) { + this.setBlockBounds(0.0F, var6, var8, var10, var7, var9); + } + + } + } + + public int getRenderType() { + return -1; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isOpaqueCube() { + return false; + } + + protected TileEntity SetBlockEntity() { + try { + return (TileEntity)this.signEntityClass.newInstance(); + } catch (Exception var2) { + throw new RuntimeException(var2); + } + } + + public int idDropped(int var1, Random var2) { + return Item.sign.shiftedIndex; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + boolean var6 = false; + if(this.isFreestanding) { + if(!var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a()) { + var6 = true; + } + } else { + int var7 = var1.getBlockMetadata(var2, var3, var4); + var6 = true; + if(var7 == 2 && var1.getBlockMaterial(var2, var3, var4 + 1).func_878_a()) { + var6 = false; + } + + if(var7 == 3 && var1.getBlockMaterial(var2, var3, var4 - 1).func_878_a()) { + var6 = false; + } + + if(var7 == 4 && var1.getBlockMaterial(var2 + 1, var3, var4).func_878_a()) { + var6 = false; + } + + if(var7 == 5 && var1.getBlockMaterial(var2 - 1, var3, var4).func_878_a()) { + var6 = false; + } + } + + if(var6) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + } +} diff --git a/src/main/java/net/minecraft/src/BlockSlowSand.java b/src/main/java/net/minecraft/src/BlockSlowSand.java new file mode 100644 index 0000000..2db3ad3 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSlowSand.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class BlockSlowSand extends Block { + public BlockSlowSand(int var1, int var2) { + super(var1, var2, Material.sand); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + float var5 = 2.0F / 16.0F; + return AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)((float)(var3 + 1) - var5), (double)(var4 + 1)); + } + + public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { + var5.motionX *= 0.4D; + var5.motionZ *= 0.4D; + } +} diff --git a/src/main/java/net/minecraft/src/BlockSnow.java b/src/main/java/net/minecraft/src/BlockSnow.java new file mode 100644 index 0000000..5018a3b --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSnow.java @@ -0,0 +1,75 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSnow extends Block { + protected BlockSnow(int var1, int var2) { + super(var1, var2, Material.snow); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F); + this.setTickOnLoad(true); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockId(var2, var3 - 1, var4); + return var5 != 0 && Block.blocksList[var5].isOpaqueCube() ? var1.getBlockMaterial(var2, var3 - 1, var4).func_880_c() : false; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + this.func_314_h(var1, var2, var3, var4); + } + + private boolean func_314_h(World var1, int var2, int var3, int var4) { + if(!this.canPlaceBlockAt(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + return false; + } else { + return true; + } + } + + public void harvestBlock(World var1, int var2, int var3, int var4, int var5) { + int var6 = Item.snowball.shiftedIndex; + float var7 = 0.7F; + double var8 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D; + double var10 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D; + double var12 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D; + EntityItem var14 = new EntityItem(var1, (double)var2 + var8, (double)var3 + var10, (double)var4 + var12, new ItemStack(var6)); + var14.field_805_c = 10; + var1.entityJoinedWorld(var14); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + public int idDropped(int var1, Random var2) { + return Item.snowball.shiftedIndex; + } + + public int quantityDropped(Random var1) { + return 0; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + Material var6 = var1.getBlockMaterial(var2, var3, var4); + return var5 == 1 ? true : (var6 == this.blockMaterial ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5)); + } +} diff --git a/src/main/java/net/minecraft/src/BlockSnowBlock.java b/src/main/java/net/minecraft/src/BlockSnowBlock.java new file mode 100644 index 0000000..0e1275b --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSnowBlock.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSnowBlock extends Block { + protected BlockSnowBlock(int var1, int var2) { + super(var1, var2, Material.builtSnow); + this.setTickOnLoad(true); + } + + public int idDropped(int var1, Random var2) { + return Item.snowball.shiftedIndex; + } + + public int quantityDropped(Random var1) { + return 4; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockSoil.java b/src/main/java/net/minecraft/src/BlockSoil.java new file mode 100644 index 0000000..71e869e --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSoil.java @@ -0,0 +1,93 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockSoil extends Block { + protected BlockSoil(int var1) { + super(var1, Material.ground); + this.blockIndexInTexture = 87; + this.setTickOnLoad(true); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 15.0F / 16.0F, 1.0F); + this.setLightOpacity(255); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return AxisAlignedBB.getBoundingBoxFromPool((double)(var2 + 0), (double)(var3 + 0), (double)(var4 + 0), (double)(var2 + 1), (double)(var3 + 1), (double)(var4 + 1)); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return var1 == 1 && var2 > 0 ? this.blockIndexInTexture - 1 : (var1 == 1 ? this.blockIndexInTexture : 2); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var5.nextInt(5) == 0) { + if(this.func_274_i(var1, var2, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 7); + } else { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 > 0) { + var1.setBlockMetadataWithNotify(var2, var3, var4, var6 - 1); + } else if(!this.func_275_h(var1, var2, var3, var4)) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + } + } + + } + + public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) { + if(var1.rand.nextInt(4) == 0) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + + } + + private boolean func_275_h(World var1, int var2, int var3, int var4) { + byte var5 = 0; + + for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) { + for(int var7 = var4 - var5; var7 <= var4 + var5; ++var7) { + if(var1.getBlockId(var6, var3 + 1, var7) == Block.crops.blockID) { + return true; + } + } + } + + return false; + } + + private boolean func_274_i(World var1, int var2, int var3, int var4) { + for(int var5 = var2 - 4; var5 <= var2 + 4; ++var5) { + for(int var6 = var3; var6 <= var3 + 1; ++var6) { + for(int var7 = var4 - 4; var7 <= var4 + 4; ++var7) { + if(var1.getBlockMaterial(var5, var6, var7) == Material.water) { + return true; + } + } + } + } + + return false; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4); + if(var6.func_878_a()) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + + } + + public int idDropped(int var1, Random var2) { + return Block.dirt.idDropped(0, var2); + } +} diff --git a/src/main/java/net/minecraft/src/BlockSponge.java b/src/main/java/net/minecraft/src/BlockSponge.java new file mode 100644 index 0000000..d8a441d --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockSponge.java @@ -0,0 +1,35 @@ +package net.minecraft.src; + +public class BlockSponge extends Block { + protected BlockSponge(int var1) { + super(var1, Material.sponge); + this.blockIndexInTexture = 48; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + byte var5 = 2; + + for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) { + for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) { + for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) { + if(var1.getBlockMaterial(var6, var7, var8) == Material.water) { + } + } + } + } + + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + byte var5 = 2; + + for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) { + for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) { + for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) { + var1.notifyBlocksOfNeighborChange(var6, var7, var8, var1.getBlockId(var6, var7, var8)); + } + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockStairs.java b/src/main/java/net/minecraft/src/BlockStairs.java new file mode 100644 index 0000000..05e2709 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockStairs.java @@ -0,0 +1,188 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.Random; + +public class BlockStairs extends Block { + private Block modelBlock; + + protected BlockStairs(int var1, Block var2) { + super(var1, var2.blockIndexInTexture, var2.blockMaterial); + this.modelBlock = var2; + this.setHardness(var2.blockHardness); + this.setResistance(var2.blockResistance / 3.0F); + this.setStepSound(var2.stepSound); + } + + public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 10; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } + + public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) { + int var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 == 0) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 0.5F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + } else if(var7 == 1) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 1.0F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + } else if(var7 == 2) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 1.0F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + } else if(var7 == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F); + super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6); + } + + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + this.modelBlock.randomDisplayTick(var1, var2, var3, var4, var5); + } + + public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) { + this.modelBlock.onBlockClicked(var1, var2, var3, var4, var5); + } + + public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + this.modelBlock.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5); + } + + public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) { + return this.modelBlock.getBlockBrightness(var1, var2, var3, var4); + } + + public float func_227_a(Entity var1) { + return this.modelBlock.func_227_a(var1); + } + + public int func_234_g() { + return this.modelBlock.func_234_g(); + } + + public int idDropped(int var1, Random var2) { + return this.modelBlock.idDropped(var1, var2); + } + + public int quantityDropped(Random var1) { + return this.modelBlock.quantityDropped(var1); + } + + public int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return this.modelBlock.getBlockTextureFromSideAndMetadata(var1, var2); + } + + public int getBlockTextureFromSide(int var1) { + return this.modelBlock.getBlockTextureFromSide(var1); + } + + public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) { + return this.modelBlock.getBlockTexture(var1, var2, var3, var4, var5); + } + + public int tickRate() { + return this.modelBlock.tickRate(); + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return this.modelBlock.getSelectedBoundingBoxFromPool(var1, var2, var3, var4); + } + + public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) { + this.modelBlock.velocityToAddToEntity(var1, var2, var3, var4, var5, var6); + } + + public boolean isCollidable() { + return this.modelBlock.isCollidable(); + } + + public boolean canCollideCheck(int var1, boolean var2) { + return this.modelBlock.canCollideCheck(var1, var2); + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return this.modelBlock.canPlaceBlockAt(var1, var2, var3, var4); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + this.onNeighborBlockChange(var1, var2, var3, var4, 0); + this.modelBlock.onBlockAdded(var1, var2, var3, var4); + } + + public void onBlockRemoval(World var1, int var2, int var3, int var4) { + this.modelBlock.onBlockRemoval(var1, var2, var3, var4); + } + + public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) { + this.modelBlock.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6); + } + + public void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) { + this.modelBlock.dropBlockAsItem(var1, var2, var3, var4, var5); + } + + public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) { + this.modelBlock.onEntityWalking(var1, var2, var3, var4, var5); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.modelBlock.updateTick(var1, var2, var3, var4, var5); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + return this.modelBlock.blockActivated(var1, var2, var3, var4, var5); + } + + public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) { + this.modelBlock.onBlockDestroyedByExplosion(var1, var2, var3, var4); + } + + public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) { + int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + if(var6 == 0) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 2); + } + + if(var6 == 1) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + } + + if(var6 == 2) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 3); + } + + if(var6 == 3) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 0); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockStationary.java b/src/main/java/net/minecraft/src/BlockStationary.java new file mode 100644 index 0000000..8241ab5 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockStationary.java @@ -0,0 +1,57 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockStationary extends BlockFluids { + protected BlockStationary(int var1, Material var2) { + super(var1, var2); + this.setTickOnLoad(false); + if(var2 == Material.lava) { + this.setTickOnLoad(true); + } + + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + if(var1.getBlockId(var2, var3, var4) == this.blockID) { + this.func_15234_j(var1, var2, var3, var4); + } + + } + + private void func_15234_j(World var1, int var2, int var3, int var4) { + int var5 = var1.getBlockMetadata(var2, var3, var4); + var1.field_1043_h = true; + var1.setBlockAndMetadata(var2, var3, var4, this.blockID - 1, var5); + var1.func_701_b(var2, var3, var4, var2, var3, var4); + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID - 1); + var1.field_1043_h = false; + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.blockMaterial == Material.lava) { + int var6 = var5.nextInt(3); + + for(int var7 = 0; var7 < var6; ++var7) { + var2 += var5.nextInt(3) - 1; + ++var3; + var4 += var5.nextInt(3) - 1; + int var8 = var1.getBlockId(var2, var3, var4); + if(var8 == 0) { + if(this.func_301_k(var1, var2 - 1, var3, var4) || this.func_301_k(var1, var2 + 1, var3, var4) || this.func_301_k(var1, var2, var3, var4 - 1) || this.func_301_k(var1, var2, var3, var4 + 1) || this.func_301_k(var1, var2, var3 - 1, var4) || this.func_301_k(var1, var2, var3 + 1, var4)) { + var1.setBlockWithNotify(var2, var3, var4, Block.fire.blockID); + return; + } + } else if(Block.blocksList[var8].blockMaterial.func_880_c()) { + return; + } + } + } + + } + + private boolean func_301_k(World var1, int var2, int var3, int var4) { + return var1.getBlockMaterial(var2, var3, var4).getBurning(); + } +} diff --git a/src/main/java/net/minecraft/src/BlockStep.java b/src/main/java/net/minecraft/src/BlockStep.java new file mode 100644 index 0000000..b446197 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockStep.java @@ -0,0 +1,59 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockStep extends Block { + private boolean field_469_a; + + public BlockStep(int var1, boolean var2) { + super(var1, 6, Material.rock); + this.field_469_a = var2; + if(!var2) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + this.setLightOpacity(255); + } + + public int getBlockTextureFromSide(int var1) { + return var1 <= 1 ? 6 : 5; + } + + public boolean isOpaqueCube() { + return this.field_469_a; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this == Block.stairSingle) { + } + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(this != Block.stairSingle) { + super.onBlockAdded(var1, var2, var3, var4); + } + + int var5 = var1.getBlockId(var2, var3 - 1, var4); + if(var5 == stairSingle.blockID) { + var1.setBlockWithNotify(var2, var3, var4, 0); + var1.setBlockWithNotify(var2, var3 - 1, var4, Block.stairDouble.blockID); + } + + } + + public int idDropped(int var1, Random var2) { + return Block.stairSingle.blockID; + } + + public boolean renderAsNormalBlock() { + return this.field_469_a; + } + + public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) { + if(this != Block.stairSingle) { + super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } + + return var5 == 1 ? true : (!super.shouldSideBeRendered(var1, var2, var3, var4, var5) ? false : (var5 == 0 ? true : var1.getBlockId(var2, var3, var4) != this.blockID)); + } +} diff --git a/src/main/java/net/minecraft/src/BlockStone.java b/src/main/java/net/minecraft/src/BlockStone.java new file mode 100644 index 0000000..eae4ecd --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockStone.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockStone extends Block { + public BlockStone(int var1, int var2) { + super(var1, var2, Material.rock); + } + + public int idDropped(int var1, Random var2) { + return Block.cobblestone.blockID; + } +} diff --git a/src/main/java/net/minecraft/src/BlockTNT.java b/src/main/java/net/minecraft/src/BlockTNT.java new file mode 100644 index 0000000..e297b06 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockTNT.java @@ -0,0 +1,39 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockTNT extends Block { + public BlockTNT(int var1, int var2) { + super(var1, var2, Material.tnt); + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 0 ? this.blockIndexInTexture + 2 : (var1 == 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(var5 > 0 && Block.blocksList[var5].canProvidePower() && var1.isBlockIndirectlyGettingPowered(var2, var3, var4)) { + this.onBlockDestroyedByPlayer(var1, var2, var3, var4, 0); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } + + public int quantityDropped(Random var1) { + return 0; + } + + public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) { + EntityTNTPrimed var5 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F)); + var5.fuse = var1.rand.nextInt(var5.fuse / 4) + var5.fuse / 8; + var1.entityJoinedWorld(var5); + } + + public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + //if(!var1.multiplayerWorld) { + EntityTNTPrimed var6 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F)); + var1.entityJoinedWorld(var6); + var1.playSoundAtEntity(var6, "random.fuse", 1.0F, 1.0F); + //} + } +} diff --git a/src/main/java/net/minecraft/src/BlockTorch.java b/src/main/java/net/minecraft/src/BlockTorch.java new file mode 100644 index 0000000..98712f6 --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockTorch.java @@ -0,0 +1,166 @@ +package net.minecraft.src; + +import java.util.Random; + +public class BlockTorch extends Block { + protected BlockTorch(int var1, int var2) { + super(var1, var2, Material.circuits); + this.setTickOnLoad(true); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 2; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 + 1) ? true : var1.isBlockOpaqueCube(var2, var3 - 1, var4)))); + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + if(var5 == 1 && var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var6 = 5; + } + + if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var6 = 4; + } + + if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var6 = 3; + } + + if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var6 = 2; + } + + if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var6 = 1; + } + + var1.setBlockMetadataWithNotify(var2, var3, var4, var6); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockMetadata(var2, var3, var4) == 0) { + this.onBlockAdded(var1, var2, var3, var4); + } + + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 1); + } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 2); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 3); + } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 4); + } else if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) { + var1.setBlockMetadataWithNotify(var2, var3, var4, 5); + } + + this.func_271_h(var1, var2, var3, var4); + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this.func_271_h(var1, var2, var3, var4)) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + boolean var7 = false; + if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) { + var7 = true; + } + + if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && var6 == 5) { + var7 = true; + } + + if(var7) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + } + + private boolean func_271_h(World var1, int var2, int var3, int var4) { + if(!this.canPlaceBlockAt(var1, var2, var3, var4)) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + return false; + } else { + return true; + } + } + + public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + int var7 = var1.getBlockMetadata(var2, var3, var4) & 7; + float var8 = 0.15F; + if(var7 == 1) { + this.setBlockBounds(0.0F, 0.2F, 0.5F - var8, var8 * 2.0F, 0.8F, 0.5F + var8); + } else if(var7 == 2) { + this.setBlockBounds(1.0F - var8 * 2.0F, 0.2F, 0.5F - var8, 1.0F, 0.8F, 0.5F + var8); + } else if(var7 == 3) { + this.setBlockBounds(0.5F - var8, 0.2F, 0.0F, 0.5F + var8, 0.8F, var8 * 2.0F); + } else if(var7 == 4) { + this.setBlockBounds(0.5F - var8, 0.2F, 1.0F - var8 * 2.0F, 0.5F + var8, 0.8F, 1.0F); + } else { + var8 = 0.1F; + this.setBlockBounds(0.5F - var8, 0.0F, 0.5F - var8, 0.5F + var8, 0.6F, 0.5F + var8); + } + + return super.collisionRayTrace(var1, var2, var3, var4, var5, var6); + } + + public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + int var6 = var1.getBlockMetadata(var2, var3, var4); + double var7 = (double)((float)var2 + 0.5F); + double var9 = (double)((float)var3 + 0.7F); + double var11 = (double)((float)var4 + 0.5F); + double var13 = (double)0.22F; + double var15 = (double)0.27F; + if(var6 == 1) { + var1.spawnParticle("smoke", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + } else if(var6 == 2) { + var1.spawnParticle("smoke", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D); + } else if(var6 == 3) { + var1.spawnParticle("smoke", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D); + } else if(var6 == 4) { + var1.spawnParticle("smoke", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D); + } else { + var1.spawnParticle("smoke", var7, var9, var11, 0.0D, 0.0D, 0.0D); + var1.spawnParticle("flame", var7, var9, var11, 0.0D, 0.0D, 0.0D); + } + + } +} diff --git a/src/main/java/net/minecraft/src/BlockWorkbench.java b/src/main/java/net/minecraft/src/BlockWorkbench.java new file mode 100644 index 0000000..8b02c5f --- /dev/null +++ b/src/main/java/net/minecraft/src/BlockWorkbench.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class BlockWorkbench extends Block { + protected BlockWorkbench(int var1) { + super(var1, Material.wood); + this.blockIndexInTexture = 59; + } + + public int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? Block.planks.getBlockTextureFromSide(0) : (var1 != 2 && var1 != 4 ? this.blockIndexInTexture : this.blockIndexInTexture + 1)); + } + + public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + var5.displayWorkbenchGUI(); + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ChatLine.java b/src/main/java/net/minecraft/src/ChatLine.java new file mode 100644 index 0000000..98635da --- /dev/null +++ b/src/main/java/net/minecraft/src/ChatLine.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +public class ChatLine { + public String message; + public int updateCounter; + + public ChatLine(String var1) { + this.message = var1; + this.updateCounter = 0; + } +} diff --git a/src/main/java/net/minecraft/src/Chunk.java b/src/main/java/net/minecraft/src/Chunk.java new file mode 100644 index 0000000..0b653a9 --- /dev/null +++ b/src/main/java/net/minecraft/src/Chunk.java @@ -0,0 +1,598 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +public class Chunk { + public static boolean field_1540_a; + public byte[] blocks; + public boolean isChunkLoaded; + public World worldObj; + public NibbleArray data; + public NibbleArray skylightMap; + public NibbleArray blocklightMap; + public byte[] heightMap; + public int field_1532_i; + public final int xPosition; + public final int zPosition; + public Map chunkTileEntityMap; + public List[] entities; + public boolean isTerrainPopulated; + public boolean isModified; + public boolean neverSave; + public boolean field_1524_q; + public boolean hasEntities; + public long lastSaveTime; + + public Chunk(World var1, int var2, int var3) { + this.chunkTileEntityMap = new HashMap(); + this.entities = new List[8]; + this.isTerrainPopulated = false; + this.isModified = false; + this.field_1524_q = false; + this.hasEntities = false; + this.lastSaveTime = 0L; + this.worldObj = var1; + this.xPosition = var2; + this.zPosition = var3; + this.heightMap = new byte[256]; + + for(int var4 = 0; var4 < this.entities.length; ++var4) { + this.entities[var4] = new ArrayList(); + } + + } + + public Chunk(World var1, byte[] var2, int var3, int var4) { + this(var1, var3, var4); + this.blocks = var2; + this.data = new NibbleArray(var2.length); + this.skylightMap = new NibbleArray(var2.length); + this.blocklightMap = new NibbleArray(var2.length); + } + + public boolean isAtLocation(int var1, int var2) { + return var1 == this.xPosition && var2 == this.zPosition; + } + + public int getHeightValue(int var1, int var2) { + return this.heightMap[var2 << 4 | var1] & 255; + } + + public void func_1014_a() { + } + + public void generateHeightMap() { + int var1 = 127; + + for(int var2 = 0; var2 < 16; ++var2) { + for(int var3 = 0; var3 < 16; ++var3) { + int var4 = 127; + + for(int var5 = var2 << 11 | var3 << 7; var4 > 0 && Block.lightOpacity[this.blocks[var5 + var4 - 1]] == 0; --var4) { + } + + this.heightMap[var3 << 4 | var2] = (byte)var4; + if(var4 < var1) { + var1 = var4; + } + } + } + + this.field_1532_i = var1; + this.isModified = true; + } + + public void func_1024_c() { + int var1 = 127; + + int var2; + int var3; + for(var2 = 0; var2 < 16; ++var2) { + for(var3 = 0; var3 < 16; ++var3) { + this.heightMap[var3 << 4 | var2] = -128; + this.func_1003_g(var2, 127, var3); + if((this.heightMap[var3 << 4 | var2] & 255) < var1) { + var1 = this.heightMap[var3 << 4 | var2] & 255; + } + } + } + + this.field_1532_i = var1; + + for(var2 = 0; var2 < 16; ++var2) { + for(var3 = 0; var3 < 16; ++var3) { + this.func_996_c(var2, var3); + } + } + + this.isModified = true; + } + + public void func_4143_d() { + byte var1 = 32; + + for(int var2 = 0; var2 < 16; ++var2) { + for(int var3 = 0; var3 < 16; ++var3) { + int var4 = var2 << 11 | var3 << 7; + + int var5; + int var6; + for(var5 = 0; var5 < 128; ++var5) { + var6 = Block.lightValue[this.blocks[var4 + var5]]; + if(var6 > 0) { + this.blocklightMap.setNibble(var2, var5, var3, var6); + } + } + + var5 = 15; + + for(var6 = var1 - 2; var6 < 128 && var5 > 0; this.blocklightMap.setNibble(var2, var6, var3, var5)) { + ++var6; + byte var7 = this.blocks[var4 + var6]; + int var8 = Block.lightOpacity[var7]; + int var9 = Block.lightValue[var7]; + if(var8 == 0) { + var8 = 1; + } + + var5 -= var8; + if(var9 > var5) { + var5 = var9; + } + + if(var5 < 0) { + var5 = 0; + } + } + } + } + + this.worldObj.func_616_a(EnumSkyBlock.Block, this.xPosition * 16, var1 - 1, this.zPosition * 16, this.xPosition * 16 + 16, var1 + 1, this.zPosition * 16 + 16); + this.isModified = true; + } + + private void func_996_c(int var1, int var2) { + int var3 = this.getHeightValue(var1, var2); + int var4 = this.xPosition * 16 + var1; + int var5 = this.zPosition * 16 + var2; + this.func_1020_f(var4 - 1, var5, var3); + this.func_1020_f(var4 + 1, var5, var3); + this.func_1020_f(var4, var5 - 1, var3); + this.func_1020_f(var4, var5 + 1, var3); + } + + private void func_1020_f(int var1, int var2, int var3) { + int var4 = this.worldObj.getHeightValue(var1, var2); + if(var4 > var3) { + this.worldObj.func_616_a(EnumSkyBlock.Sky, var1, var3, var2, var1, var4, var2); + } else if(var4 < var3) { + this.worldObj.func_616_a(EnumSkyBlock.Sky, var1, var4, var2, var1, var3, var2); + } + + this.isModified = true; + } + + private void func_1003_g(int var1, int var2, int var3) { + int var4 = this.heightMap[var3 << 4 | var1] & 255; + int var5 = var4; + if(var2 > var4) { + var5 = var2; + } + + for(int var6 = var1 << 11 | var3 << 7; var5 > 0 && Block.lightOpacity[this.blocks[var6 + var5 - 1]] == 0; --var5) { + } + + if(var5 != var4) { + this.worldObj.func_680_f(var1, var3, var5, var4); + this.heightMap[var3 << 4 | var1] = (byte)var5; + int var7; + int var8; + int var9; + if(var5 < this.field_1532_i) { + this.field_1532_i = var5; + } else { + var7 = 127; + + for(var8 = 0; var8 < 16; ++var8) { + for(var9 = 0; var9 < 16; ++var9) { + if((this.heightMap[var9 << 4 | var8] & 255) < var7) { + var7 = this.heightMap[var9 << 4 | var8] & 255; + } + } + } + + this.field_1532_i = var7; + } + + var7 = this.xPosition * 16 + var1; + var8 = this.zPosition * 16 + var3; + if(var5 < var4) { + for(var9 = var5; var9 < var4; ++var9) { + this.skylightMap.setNibble(var1, var9, var3, 15); + } + } else { + this.worldObj.func_616_a(EnumSkyBlock.Sky, var7, var4, var8, var7, var5, var8); + + for(var9 = var4; var9 < var5; ++var9) { + this.skylightMap.setNibble(var1, var9, var3, 0); + } + } + + var9 = 15; + + int var10; + for(var10 = var5; var5 > 0 && var9 > 0; this.skylightMap.setNibble(var1, var5, var3, var9)) { + --var5; + int var11 = Block.lightOpacity[this.getBlockID(var1, var5, var3)]; + if(var11 == 0) { + var11 = 1; + } + + var9 -= var11; + if(var9 < 0) { + var9 = 0; + } + } + + while(var5 > 0 && Block.lightOpacity[this.getBlockID(var1, var5 - 1, var3)] == 0) { + --var5; + } + + if(var5 != var10) { + this.worldObj.func_616_a(EnumSkyBlock.Sky, var7 - 1, var5, var8 - 1, var7 + 1, var10, var8 + 1); + } + + this.isModified = true; + } + } + + public int getBlockID(int var1, int var2, int var3) { + return this.blocks[var1 << 11 | var3 << 7 | var2]; + } + + public boolean setBlockIDWithMetadata(int var1, int var2, int var3, int var4, int var5) { + byte var6 = (byte)var4; + int var7 = this.heightMap[var3 << 4 | var1] & 255; + int var8 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255; + if(var8 == var4 && this.data.getNibble(var1, var2, var3) == var5) { + return false; + } else { + int var9 = this.xPosition * 16 + var1; + int var10 = this.zPosition * 16 + var3; + this.blocks[var1 << 11 | var3 << 7 | var2] = var6; + if(var8 != 0) { + Block.blocksList[var8].onBlockRemoval(this.worldObj, var9, var2, var10); + } + + this.data.setNibble(var1, var2, var3, var5); + if(!this.worldObj.worldProvider.field_6478_e) { + if(Block.lightOpacity[var6] != 0) { + if(var2 >= var7) { + this.func_1003_g(var1, var2 + 1, var3); + } + } else if(var2 == var7 - 1) { + this.func_1003_g(var1, var2, var3); + } + + this.worldObj.func_616_a(EnumSkyBlock.Sky, var9, var2, var10, var9, var2, var10); + } + + this.worldObj.func_616_a(EnumSkyBlock.Block, var9, var2, var10, var9, var2, var10); + this.func_996_c(var1, var3); + if(var4 != 0) { + Block.blocksList[var4].onBlockAdded(this.worldObj, var9, var2, var10); + } + + this.data.setNibble(var1, var2, var3, var5); + this.isModified = true; + return true; + } + } + + public boolean setBlockID(int var1, int var2, int var3, int var4) { + byte var5 = (byte)var4; + int var6 = this.heightMap[var3 << 4 | var1] & 255; + int var7 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255; + if(var7 == var4) { + return false; + } else { + int var8 = this.xPosition * 16 + var1; + int var9 = this.zPosition * 16 + var3; + this.blocks[var1 << 11 | var3 << 7 | var2] = var5; + if(var7 != 0) { + Block.blocksList[var7].onBlockRemoval(this.worldObj, var8, var2, var9); + } + + this.data.setNibble(var1, var2, var3, 0); + if(Block.lightOpacity[var5] != 0) { + if(var2 >= var6) { + this.func_1003_g(var1, var2 + 1, var3); + } + } else if(var2 == var6 - 1) { + this.func_1003_g(var1, var2, var3); + } + + this.worldObj.func_616_a(EnumSkyBlock.Sky, var8, var2, var9, var8, var2, var9); + this.worldObj.func_616_a(EnumSkyBlock.Block, var8, var2, var9, var8, var2, var9); + this.func_996_c(var1, var3); + if(var4 != 0) { + Block.blocksList[var4].onBlockAdded(this.worldObj, var8, var2, var9); + } + + this.isModified = true; + return true; + } + } + + public int getBlockMetadata(int var1, int var2, int var3) { + return this.data.getNibble(var1, var2, var3); + } + + public void setBlockMetadata(int var1, int var2, int var3, int var4) { + this.isModified = true; + this.data.setNibble(var1, var2, var3, var4); + } + + public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) { + return var1 == EnumSkyBlock.Sky ? this.skylightMap.getNibble(var2, var3, var4) : (var1 == EnumSkyBlock.Block ? this.blocklightMap.getNibble(var2, var3, var4) : 0); + } + + public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) { + this.isModified = true; + if(var1 == EnumSkyBlock.Sky) { + this.skylightMap.setNibble(var2, var3, var4, var5); + } else { + if(var1 != EnumSkyBlock.Block) { + return; + } + + this.blocklightMap.setNibble(var2, var3, var4, var5); + } + + } + + public int getBlockLightValue(int var1, int var2, int var3, int var4) { + int var5 = this.skylightMap.getNibble(var1, var2, var3); + if(var5 > 0) { + field_1540_a = true; + } + + var5 -= var4; + int var6 = this.blocklightMap.getNibble(var1, var2, var3); + if(var6 > var5) { + var5 = var6; + } + + return var5; + } + + public void addEntity(Entity var1) { + if(!this.field_1524_q) { + this.hasEntities = true; + int var2 = MathHelper.floor_double(var1.posX / 16.0D); + int var3 = MathHelper.floor_double(var1.posZ / 16.0D); + if(var2 != this.xPosition || var3 != this.zPosition) { + System.out.println("Wrong location! " + var1); + Thread.dumpStack(); + } + + int var4 = MathHelper.floor_double(var1.posY / 16.0D); + if(var4 < 0) { + var4 = 0; + } + + if(var4 >= this.entities.length) { + var4 = this.entities.length - 1; + } + + var1.field_621_aZ = true; + var1.field_657_ba = this.xPosition; + var1.field_656_bb = var4; + var1.field_654_bc = this.zPosition; + this.entities[var4].add(var1); + } + } + + public void func_1015_b(Entity var1) { + this.func_1016_a(var1, var1.field_656_bb); + } + + public void func_1016_a(Entity var1, int var2) { + if(var2 < 0) { + var2 = 0; + } + + if(var2 >= this.entities.length) { + var2 = this.entities.length - 1; + } + + this.entities[var2].remove(var1); + } + + public boolean canBlockSeeTheSky(int var1, int var2, int var3) { + return var2 >= (this.heightMap[var3 << 4 | var1] & 255); + } + + public TileEntity getChunkBlockTileEntity(int var1, int var2, int var3) { + ChunkPosition var4 = new ChunkPosition(var1, var2, var3); + TileEntity var5 = (TileEntity)this.chunkTileEntityMap.get(var4); + if(var5 == null) { + int var6 = this.getBlockID(var1, var2, var3); + if(!Block.isBlockContainer[var6]) { + return null; + } + + BlockContainer var7 = (BlockContainer)Block.blocksList[var6]; + var7.onBlockAdded(this.worldObj, this.xPosition * 16 + var1, var2, this.zPosition * 16 + var3); + var5 = (TileEntity)this.chunkTileEntityMap.get(var4); + } + + return var5; + } + + public void func_1001_a(TileEntity var1) { + int var2 = var1.xCoord - this.xPosition * 16; + int var3 = var1.yCoord; + int var4 = var1.zCoord - this.zPosition * 16; + this.setChunkBlockTileEntity(var2, var3, var4, var1); + } + + public void setChunkBlockTileEntity(int var1, int var2, int var3, TileEntity var4) { + ChunkPosition var5 = new ChunkPosition(var1, var2, var3); + var4.worldObj = this.worldObj; + var4.xCoord = this.xPosition * 16 + var1; + var4.yCoord = var2; + var4.zCoord = this.zPosition * 16 + var3; + if(this.getBlockID(var1, var2, var3) != 0 && Block.blocksList[this.getBlockID(var1, var2, var3)] instanceof BlockContainer) { + if(this.isChunkLoaded) { + if(this.chunkTileEntityMap.get(var5) != null) { + this.worldObj.loadedTileEntityList.remove(this.chunkTileEntityMap.get(var5)); + } + + this.worldObj.loadedTileEntityList.add(var4); + } + + this.chunkTileEntityMap.put(var5, var4); + } else { + System.out.println("Attempted to place a tile entity where there was no entity tile!"); + } + } + + public void removeChunkBlockTileEntity(int var1, int var2, int var3) { + ChunkPosition var4 = new ChunkPosition(var1, var2, var3); + if(this.isChunkLoaded) { + this.worldObj.loadedTileEntityList.remove(this.chunkTileEntityMap.remove(var4)); + } + + } + + public void onChunkLoad() { + this.isChunkLoaded = true; + this.worldObj.loadedTileEntityList.addAll(this.chunkTileEntityMap.values()); + + for(int var1 = 0; var1 < this.entities.length; ++var1) { + this.worldObj.func_636_a(this.entities[var1]); + } + + } + + public void onChunkUnload() { + this.isChunkLoaded = false; + this.worldObj.loadedTileEntityList.removeAll(this.chunkTileEntityMap.values()); + + for(int var1 = 0; var1 < this.entities.length; ++var1) { + this.worldObj.func_632_b(this.entities[var1]); + } + + } + + public void setChunkModified() { + this.isModified = true; + } + + public void getEntitiesWithinAABBForEntity(Entity var1, AxisAlignedBB var2, List var3) { + int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D); + int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D); + if(var4 < 0) { + var4 = 0; + } + + if(var5 >= this.entities.length) { + var5 = this.entities.length - 1; + } + + for(int var6 = var4; var6 <= var5; ++var6) { + List var7 = this.entities[var6]; + + for(int var8 = 0; var8 < var7.size(); ++var8) { + Entity var9 = (Entity)var7.get(var8); + if(var9 != var1 && var9.boundingBox.intersectsWith(var2)) { + var3.add(var9); + } + } + } + + } + + public void getEntitiesOfTypeWithinAAAB(Class var1, AxisAlignedBB var2, List var3) { + int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D); + int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D); + if(var4 < 0) { + var4 = 0; + } + + if(var5 >= this.entities.length) { + var5 = this.entities.length - 1; + } + + for(int var6 = var4; var6 <= var5; ++var6) { + List var7 = this.entities[var6]; + + for(int var8 = 0; var8 < var7.size(); ++var8) { + Entity var9 = (Entity)var7.get(var8); + if(var1.isAssignableFrom(var9.getClass()) && var9.boundingBox.intersectsWith(var2)) { + var3.add(var9); + } + } + } + + } + + public boolean needsSaving(boolean var1) { + return this.neverSave ? false : (this.hasEntities && this.worldObj.worldTime != this.lastSaveTime ? true : this.isModified); + } + + public int func_1004_a(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + int var9; + int var10; + int var11; + int var12; + for(var9 = var2; var9 < var5; ++var9) { + for(var10 = var4; var10 < var7; ++var10) { + var11 = var9 << 11 | var10 << 7 | var3; + var12 = var6 - var3; + System.arraycopy(var1, var8, this.blocks, var11, var12); + var8 += var12; + } + } + + this.generateHeightMap(); + + for(var9 = var2; var9 < var5; ++var9) { + for(var10 = var4; var10 < var7; ++var10) { + var11 = (var9 << 11 | var10 << 7 | var3) >> 1; + var12 = (var6 - var3) / 2; + System.arraycopy(var1, var8, this.data.data, var11, var12); + var8 += var12; + } + } + + for(var9 = var2; var9 < var5; ++var9) { + for(var10 = var4; var10 < var7; ++var10) { + var11 = (var9 << 11 | var10 << 7 | var3) >> 1; + var12 = (var6 - var3) / 2; + System.arraycopy(var1, var8, this.blocklightMap.data, var11, var12); + var8 += var12; + } + } + + for(var9 = var2; var9 < var5; ++var9) { + for(var10 = var4; var10 < var7; ++var10) { + var11 = (var9 << 11 | var10 << 7 | var3) >> 1; + var12 = (var6 - var3) / 2; + System.arraycopy(var1, var8, this.skylightMap.data, var11, var12); + var8 += var12; + } + } + + return var8; + } + + public Random func_997_a(long var1) { + return new Random(this.worldObj.randomSeed + (long)(this.xPosition * this.xPosition * 4987142) + (long)(this.xPosition * 5947611) + (long)(this.zPosition * this.zPosition) * 4392871L + (long)(this.zPosition * 389711) ^ var1); + } +} diff --git a/src/main/java/net/minecraft/src/ChunkCache.java b/src/main/java/net/minecraft/src/ChunkCache.java new file mode 100644 index 0000000..55d28c2 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkCache.java @@ -0,0 +1,127 @@ +package net.minecraft.src; + +public class ChunkCache implements IBlockAccess { + private int field_1060_a; + private int field_1059_b; + private Chunk[][] field_1062_c; + private World worldObj; + + public ChunkCache(World var1, int var2, int var3, int var4, int var5, int var6, int var7) { + this.worldObj = var1; + this.field_1060_a = var2 >> 4; + this.field_1059_b = var4 >> 4; + int var8 = var5 >> 4; + int var9 = var7 >> 4; + this.field_1062_c = new Chunk[var8 - this.field_1060_a + 1][var9 - this.field_1059_b + 1]; + + for(int var10 = this.field_1060_a; var10 <= var8; ++var10) { + for(int var11 = this.field_1059_b; var11 <= var9; ++var11) { + this.field_1062_c[var10 - this.field_1060_a][var11 - this.field_1059_b] = var1.getChunkFromChunkCoords(var10, var11); + } + } + + } + + public int getBlockId(int var1, int var2, int var3) { + if(var2 < 0) { + return 0; + } else if(var2 >= 128) { + return 0; + } else { + int var4 = (var1 >> 4) - this.field_1060_a; + int var5 = (var3 >> 4) - this.field_1059_b; + return this.field_1062_c[var4][var5].getBlockID(var1 & 15, var2, var3 & 15); + } + } + + public TileEntity getBlockTileEntity(int var1, int var2, int var3) { + int var4 = (var1 >> 4) - this.field_1060_a; + int var5 = (var3 >> 4) - this.field_1059_b; + return this.field_1062_c[var4][var5].getChunkBlockTileEntity(var1 & 15, var2, var3 & 15); + } + + public float getLightBrightness(int var1, int var2, int var3) { + return this.worldObj.worldProvider.lightBrightnessTable[this.func_4086_d(var1, var2, var3)]; + } + + public int func_4086_d(int var1, int var2, int var3) { + return this.func_716_a(var1, var2, var3, true); + } + + public int func_716_a(int var1, int var2, int var3, boolean var4) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + int var5; + int var6; + if(var4) { + var5 = this.getBlockId(var1, var2, var3); + if(var5 == Block.stairSingle.blockID || var5 == Block.tilledField.blockID) { + var6 = this.func_716_a(var1, var2 + 1, var3, false); + int var7 = this.func_716_a(var1 + 1, var2, var3, false); + int var8 = this.func_716_a(var1 - 1, var2, var3, false); + int var9 = this.func_716_a(var1, var2, var3 + 1, false); + int var10 = this.func_716_a(var1, var2, var3 - 1, false); + if(var7 > var6) { + var6 = var7; + } + + if(var8 > var6) { + var6 = var8; + } + + if(var9 > var6) { + var6 = var9; + } + + if(var10 > var6) { + var6 = var10; + } + + return var6; + } + } + + if(var2 < 0) { + return 0; + } else if(var2 >= 128) { + var5 = 15 - this.worldObj.skylightSubtracted; + if(var5 < 0) { + var5 = 0; + } + + return var5; + } else { + var5 = (var1 >> 4) - this.field_1060_a; + var6 = (var3 >> 4) - this.field_1059_b; + return this.field_1062_c[var5][var6].getBlockLightValue(var1 & 15, var2, var3 & 15, this.worldObj.skylightSubtracted); + } + } else { + return 15; + } + } + + public int getBlockMetadata(int var1, int var2, int var3) { + if(var2 < 0) { + return 0; + } else if(var2 >= 128) { + return 0; + } else { + int var4 = (var1 >> 4) - this.field_1060_a; + int var5 = (var3 >> 4) - this.field_1059_b; + return this.field_1062_c[var4][var5].getBlockMetadata(var1 & 15, var2, var3 & 15); + } + } + + public Material getBlockMaterial(int var1, int var2, int var3) { + int var4 = this.getBlockId(var1, var2, var3); + return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial; + } + + public boolean isBlockOpaqueCube(int var1, int var2, int var3) { + Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)]; + return var4 == null ? false : var4.isOpaqueCube(); + } + + public WorldChunkManager func_4075_a() { + return this.worldObj.func_4075_a(); + } +} diff --git a/src/main/java/net/minecraft/src/ChunkCoordIntPair.java b/src/main/java/net/minecraft/src/ChunkCoordIntPair.java new file mode 100644 index 0000000..694e1de --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkCoordIntPair.java @@ -0,0 +1,20 @@ +package net.minecraft.src; + +public class ChunkCoordIntPair { + public int chunkXPos; + public int chunkZPos; + + public ChunkCoordIntPair(int var1, int var2) { + this.chunkXPos = var1; + this.chunkZPos = var2; + } + + public int hashCode() { + return this.chunkXPos << 8 | this.chunkZPos; + } + + public boolean equals(Object var1) { + ChunkCoordIntPair var2 = (ChunkCoordIntPair)var1; + return var2.chunkXPos == this.chunkXPos && var2.chunkZPos == this.chunkZPos; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkCoordinates.java b/src/main/java/net/minecraft/src/ChunkCoordinates.java new file mode 100644 index 0000000..9ffaa35 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkCoordinates.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +final class ChunkCoordinates { + public final int field_1518_a; + public final int field_1517_b; + + public ChunkCoordinates(int var1, int var2) { + this.field_1518_a = var1; + this.field_1517_b = var2; + } + + public boolean equals(Object var1) { + if(!(var1 instanceof ChunkCoordinates)) { + return false; + } else { + ChunkCoordinates var2 = (ChunkCoordinates)var1; + return this.field_1518_a == var2.field_1518_a && this.field_1517_b == var2.field_1517_b; + } + } + + public int hashCode() { + return this.field_1518_a << 16 ^ this.field_1517_b; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkLoader.java b/src/main/java/net/minecraft/src/ChunkLoader.java new file mode 100644 index 0000000..f5bb61d --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkLoader.java @@ -0,0 +1,207 @@ +package net.minecraft.src; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Iterator; + +public class ChunkLoader implements IChunkLoader { + private File saveDir; + private boolean createIfNecessary; + + public ChunkLoader(File var1, boolean var2) { + this.saveDir = var1; + this.createIfNecessary = var2; + } + + private File chunkFileForXZ(int var1, int var2) { + String var3 = "c." + Integer.toString(var1, 36) + "." + Integer.toString(var2, 36) + ".dat"; + String var4 = Integer.toString(var1 & 63, 36); + String var5 = Integer.toString(var2 & 63, 36); + File var6 = new File(this.saveDir, var4); + if(!var6.exists()) { + if(!this.createIfNecessary) { + return null; + } + + var6.mkdir(); + } + + var6 = new File(var6, var5); + if(!var6.exists()) { + if(!this.createIfNecessary) { + return null; + } + + var6.mkdir(); + } + + var6 = new File(var6, var3); + return !var6.exists() && !this.createIfNecessary ? null : var6; + } + + public Chunk loadChunk(World var1, int var2, int var3) throws IOException { + File var4 = this.chunkFileForXZ(var2, var3); + if(var4 != null && var4.exists()) { + try { + FileInputStream var5 = new FileInputStream(var4); + NBTTagCompound var6 = CompressedStreamTools.func_1138_a(var5); + if(!var6.hasKey("Level")) { + System.out.println("Chunk file at " + var2 + "," + var3 + " is missing level data, skipping"); + return null; + } + + if(!var6.getCompoundTag("Level").hasKey("Blocks")) { + System.out.println("Chunk file at " + var2 + "," + var3 + " is missing block data, skipping"); + return null; + } + + Chunk var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level")); + if(!var7.isAtLocation(var2, var3)) { + System.out.println("Chunk file at " + var2 + "," + var3 + " is in the wrong location; relocating. (Expected " + var2 + ", " + var3 + ", got " + var7.xPosition + ", " + var7.zPosition + ")"); + var6.setInteger("xPos", var2); + var6.setInteger("zPos", var3); + var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level")); + } + + return var7; + } catch (Exception var8) { + var8.printStackTrace(); + } + } + + return null; + } + + public void saveChunk(World var1, Chunk var2) throws IOException { + var1.func_663_l(); + File var3 = this.chunkFileForXZ(var2.xPosition, var2.zPosition); + if(var3.exists()) { + var1.sizeOnDisk -= var3.length(); + } + + try { + File var4 = new File(this.saveDir, "tmp_chunk.dat"); + FileOutputStream var5 = new FileOutputStream(var4); + NBTTagCompound var6 = new NBTTagCompound(); + NBTTagCompound var7 = new NBTTagCompound(); + var6.setTag("Level", var7); + this.storeChunkInCompound(var2, var1, var7); + CompressedStreamTools.writeGzippedCompoundToOutputStream(var6, var5); + var5.close(); + if(var3.exists()) { + var3.delete(); + } + + var4.renameTo(var3); + var1.sizeOnDisk += var3.length(); + } catch (Exception var8) { + var8.printStackTrace(); + } + + } + + public void storeChunkInCompound(Chunk var1, World var2, NBTTagCompound var3) { + var2.func_663_l(); + var3.setInteger("xPos", var1.xPosition); + var3.setInteger("zPos", var1.zPosition); + var3.setLong("LastUpdate", var2.worldTime); + var3.setByteArray("Blocks", var1.blocks); + var3.setByteArray("Data", var1.data.data); + var3.setByteArray("SkyLight", var1.skylightMap.data); + var3.setByteArray("BlockLight", var1.blocklightMap.data); + var3.setByteArray("HeightMap", var1.heightMap); + var3.setBoolean("TerrainPopulated", var1.isTerrainPopulated); + var1.hasEntities = false; + NBTTagList var4 = new NBTTagList(); + + Iterator var6; + NBTTagCompound var8; + for(int var5 = 0; var5 < var1.entities.length; ++var5) { + var6 = var1.entities[var5].iterator(); + + while(var6.hasNext()) { + Entity var7 = (Entity)var6.next(); + var1.hasEntities = true; + var8 = new NBTTagCompound(); + if(var7.func_358_c(var8)) { + var4.setTag(var8); + } + } + } + + var3.setTag("Entities", var4); + NBTTagList var9 = new NBTTagList(); + var6 = var1.chunkTileEntityMap.values().iterator(); + + while(var6.hasNext()) { + TileEntity var10 = (TileEntity)var6.next(); + var8 = new NBTTagCompound(); + var10.writeToNBT(var8); + var9.setTag(var8); + } + + var3.setTag("TileEntities", var9); + } + + public static Chunk loadChunkIntoWorldFromCompound(World var0, NBTTagCompound var1) { + int var2 = var1.getInteger("xPos"); + int var3 = var1.getInteger("zPos"); + Chunk var4 = new Chunk(var0, var2, var3); + var4.blocks = var1.getByteArray("Blocks"); + var4.data = new NibbleArray(var1.getByteArray("Data")); + var4.skylightMap = new NibbleArray(var1.getByteArray("SkyLight")); + var4.blocklightMap = new NibbleArray(var1.getByteArray("BlockLight")); + var4.heightMap = var1.getByteArray("HeightMap"); + var4.isTerrainPopulated = var1.getBoolean("TerrainPopulated"); + if(!var4.data.isValid()) { + var4.data = new NibbleArray(var4.blocks.length); + } + + if(var4.heightMap == null || !var4.skylightMap.isValid()) { + var4.heightMap = new byte[256]; + var4.skylightMap = new NibbleArray(var4.blocks.length); + var4.func_1024_c(); + } + + if(!var4.blocklightMap.isValid()) { + var4.blocklightMap = new NibbleArray(var4.blocks.length); + var4.func_1014_a(); + } + + NBTTagList var5 = var1.getTagList("Entities"); + if(var5 != null) { + for(int var6 = 0; var6 < var5.tagCount(); ++var6) { + NBTTagCompound var7 = (NBTTagCompound)var5.tagAt(var6); + Entity var8 = EntityList.createEntityFromNBT(var7, var0); + var4.hasEntities = true; + if(var8 != null) { + var4.addEntity(var8); + } + } + } + + NBTTagList var10 = var1.getTagList("TileEntities"); + if(var10 != null) { + for(int var11 = 0; var11 < var10.tagCount(); ++var11) { + NBTTagCompound var12 = (NBTTagCompound)var10.tagAt(var11); + TileEntity var9 = TileEntity.createAndLoadEntity(var12); + if(var9 != null) { + var4.func_1001_a(var9); + } + } + } + + return var4; + } + + public void func_814_a() { + } + + public void saveExtraData() { + } + + public void saveExtraChunkData(World var1, Chunk var2) throws IOException { + } +} diff --git a/src/main/java/net/minecraft/src/ChunkPosition.java b/src/main/java/net/minecraft/src/ChunkPosition.java new file mode 100644 index 0000000..8b19854 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkPosition.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +public class ChunkPosition { + public final int x; + public final int y; + public final int z; + + public ChunkPosition(int var1, int var2, int var3) { + this.x = var1; + this.y = var2; + this.z = var3; + } + + public boolean equals(Object var1) { + if(!(var1 instanceof ChunkPosition)) { + return false; + } else { + ChunkPosition var2 = (ChunkPosition)var1; + return var2.x == this.x && var2.y == this.y && var2.z == this.z; + } + } + + public int hashCode() { + return this.x * 8976890 + this.y * 981131 + this.z; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkProviderClient.java b/src/main/java/net/minecraft/src/ChunkProviderClient.java new file mode 100644 index 0000000..491d7b2 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkProviderClient.java @@ -0,0 +1,67 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ChunkProviderClient implements IChunkProvider { + private Chunk blankChunk; + private Map chunkMapping = new HashMap(); + private List unusedChunkList = new ArrayList(); + private World worldObj; + + public ChunkProviderClient(World var1) { + this.blankChunk = new Chunk(var1, new byte[-Short.MIN_VALUE], 0, 0); + this.blankChunk.field_1524_q = true; + this.blankChunk.neverSave = true; + this.worldObj = var1; + } + + public boolean chunkExists(int var1, int var2) { + ChunkCoordinates var3 = new ChunkCoordinates(var1, var2); + return this.chunkMapping.containsKey(var3); + } + + public void func_539_c(int var1, int var2) { + Chunk var3 = this.provideChunk(var1, var2); + if(!var3.field_1524_q) { + var3.onChunkUnload(); + } + + this.chunkMapping.remove(new ChunkCoordinates(var1, var2)); + this.unusedChunkList.remove(var3); + } + + public Chunk func_538_d(int var1, int var2) { + ChunkCoordinates var3 = new ChunkCoordinates(var1, var2); + byte[] var4 = new byte[-Short.MIN_VALUE]; + Chunk var5 = new Chunk(this.worldObj, var4, var1, var2); + Arrays.fill(var5.skylightMap.data, (byte)-1); + this.chunkMapping.put(var3, var5); + var5.isChunkLoaded = true; + return var5; + } + + public Chunk provideChunk(int var1, int var2) { + ChunkCoordinates var3 = new ChunkCoordinates(var1, var2); + Chunk var4 = (Chunk)this.chunkMapping.get(var3); + return var4 == null ? this.blankChunk : var4; + } + + public boolean saveChunks(boolean var1, IProgressUpdate var2) { + return true; + } + + public boolean func_532_a() { + return false; + } + + public boolean func_536_b() { + return false; + } + + public void populate(IChunkProvider var1, int var2, int var3) { + } +} diff --git a/src/main/java/net/minecraft/src/ChunkProviderGenerate.java b/src/main/java/net/minecraft/src/ChunkProviderGenerate.java new file mode 100644 index 0000000..2fd3056 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkProviderGenerate.java @@ -0,0 +1,546 @@ +package net.minecraft.src; + +import java.util.Random; + +public class ChunkProviderGenerate implements IChunkProvider { + private Random rand; + private NoiseGeneratorOctaves field_912_k; + private NoiseGeneratorOctaves field_911_l; + private NoiseGeneratorOctaves field_910_m; + private NoiseGeneratorOctaves field_909_n; + private NoiseGeneratorOctaves field_908_o; + public NoiseGeneratorOctaves field_922_a; + public NoiseGeneratorOctaves field_921_b; + public NoiseGeneratorOctaves field_920_c; + private World worldObj; + private double[] field_4180_q; + private double[] field_905_r = new double[256]; + private double[] field_904_s = new double[256]; + private double[] field_903_t = new double[256]; + private MapGenBase field_902_u = new MapGenCaves(); + private MobSpawnerBase[] biomesForGeneration; + double[] field_4185_d; + double[] field_4184_e; + double[] field_4183_f; + double[] field_4182_g; + double[] field_4181_h; + int[][] field_914_i = new int[32][32]; + private double[] field_4178_w; + + public ChunkProviderGenerate(World var1, long var2) { + this.worldObj = var1; + this.rand = new Random(var2); + this.field_912_k = new NoiseGeneratorOctaves(this.rand, 16); + this.field_911_l = new NoiseGeneratorOctaves(this.rand, 16); + this.field_910_m = new NoiseGeneratorOctaves(this.rand, 8); + this.field_909_n = new NoiseGeneratorOctaves(this.rand, 4); + this.field_908_o = new NoiseGeneratorOctaves(this.rand, 4); + this.field_922_a = new NoiseGeneratorOctaves(this.rand, 10); + this.field_921_b = new NoiseGeneratorOctaves(this.rand, 16); + this.field_920_c = new NoiseGeneratorOctaves(this.rand, 8); + } + + public void generateTerrain(int var1, int var2, byte[] var3, MobSpawnerBase[] var4, double[] var5) { + byte var6 = 4; + byte var7 = 64; + int var8 = var6 + 1; + byte var9 = 17; + int var10 = var6 + 1; + this.field_4180_q = this.func_4061_a(this.field_4180_q, var1 * var6, 0, var2 * var6, var8, var9, var10); + + for(int var11 = 0; var11 < var6; ++var11) { + for(int var12 = 0; var12 < var6; ++var12) { + for(int var13 = 0; var13 < 16; ++var13) { + double var14 = 0.125D; + double var16 = this.field_4180_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 0]; + double var18 = this.field_4180_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 0]; + double var20 = this.field_4180_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 0]; + double var22 = this.field_4180_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 0]; + double var24 = (this.field_4180_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 1] - var16) * var14; + double var26 = (this.field_4180_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 1] - var18) * var14; + double var28 = (this.field_4180_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 1] - var20) * var14; + double var30 = (this.field_4180_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 1] - var22) * var14; + + for(int var32 = 0; var32 < 8; ++var32) { + double var33 = 0.25D; + double var35 = var16; + double var37 = var18; + double var39 = (var20 - var16) * var33; + double var41 = (var22 - var18) * var33; + + for(int var43 = 0; var43 < 4; ++var43) { + int var44 = var43 + var11 * 4 << 11 | 0 + var12 * 4 << 7 | var13 * 8 + var32; + short var45 = 128; + double var46 = 0.25D; + double var48 = var35; + double var50 = (var37 - var35) * var46; + + for(int var52 = 0; var52 < 4; ++var52) { + double var53 = var5[(var11 * 4 + var43) * 16 + var12 * 4 + var52]; + int var55 = 0; + if(var13 * 8 + var32 < var7) { + if(var53 < 0.5D && var13 * 8 + var32 >= var7 - 1) { + var55 = Block.blockIce.blockID; + } else { + var55 = Block.waterMoving.blockID; + } + } + + if(var48 > 0.0D) { + var55 = Block.stone.blockID; + } + + var3[var44] = (byte)var55; + var44 += var45; + var48 += var50; + } + + var35 += var39; + var37 += var41; + } + + var16 += var24; + var18 += var26; + var20 += var28; + var22 += var30; + } + } + } + } + + } + + public void replaceBlocksForBiome(int var1, int var2, byte[] var3, MobSpawnerBase[] var4) { + byte var5 = 64; + double var6 = 1.0D / 32.0D; + this.field_905_r = this.field_909_n.func_807_a(this.field_905_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6, var6, 1.0D); + this.field_904_s = this.field_909_n.func_807_a(this.field_904_s, (double)(var2 * 16), 109.0134D, (double)(var1 * 16), 16, 1, 16, var6, 1.0D, var6); + this.field_903_t = this.field_908_o.func_807_a(this.field_903_t, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D); + + for(int var8 = 0; var8 < 16; ++var8) { + for(int var9 = 0; var9 < 16; ++var9) { + MobSpawnerBase var10 = var4[var8 * 16 + var9]; + boolean var11 = this.field_905_r[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 0.0D; + boolean var12 = this.field_904_s[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 3.0D; + int var13 = (int)(this.field_903_t[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D); + int var14 = -1; + byte var15 = var10.topBlock; + byte var16 = var10.fillerBlock; + + for(int var17 = 127; var17 >= 0; --var17) { + int var18 = (var8 * 16 + var9) * 128 + var17; + if(var17 <= 0 + this.rand.nextInt(5)) { + var3[var18] = (byte)Block.bedrock.blockID; + } else { + byte var19 = var3[var18]; + if(var19 == 0) { + var14 = -1; + } else if(var19 == Block.stone.blockID) { + if(var14 == -1) { + if(var13 <= 0) { + var15 = 0; + var16 = (byte)Block.stone.blockID; + } else if(var17 >= var5 - 4 && var17 <= var5 + 1) { + var15 = var10.topBlock; + var16 = var10.fillerBlock; + if(var12) { + var15 = 0; + } + + if(var12) { + var16 = (byte)Block.gravel.blockID; + } + + if(var11) { + var15 = (byte)Block.sand.blockID; + } + + if(var11) { + var16 = (byte)Block.sand.blockID; + } + } + + if(var17 < var5 && var15 == 0) { + var15 = (byte)Block.waterMoving.blockID; + } + + var14 = var13; + if(var17 >= var5 - 1) { + var3[var18] = var15; + } else { + var3[var18] = var16; + } + } else if(var14 > 0) { + --var14; + var3[var18] = var16; + } + } + } + } + } + } + + } + + public Chunk provideChunk(int var1, int var2) { + this.rand.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L); + byte[] var3 = new byte[-Short.MIN_VALUE]; + Chunk var4 = new Chunk(this.worldObj, var3, var1, var2); + this.biomesForGeneration = this.worldObj.func_4075_a().loadBlockGeneratorData(this.biomesForGeneration, var1 * 16, var2 * 16, 16, 16); + double[] var5 = this.worldObj.func_4075_a().temperature; + this.generateTerrain(var1, var2, var3, this.biomesForGeneration, var5); + this.replaceBlocksForBiome(var1, var2, var3, this.biomesForGeneration); + this.field_902_u.func_867_a(this, this.worldObj, var1, var2, var3); + var4.func_1024_c(); + return var4; + } + + private double[] func_4061_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) { + if(var1 == null) { + var1 = new double[var5 * var6 * var7]; + } + + double var8 = 684.412D; + double var10 = 684.412D; + double[] var12 = this.worldObj.func_4075_a().temperature; + double[] var13 = this.worldObj.func_4075_a().humidity; + this.field_4182_g = this.field_922_a.func_4109_a(this.field_4182_g, var2, var4, var5, var7, 1.121D, 1.121D, 0.5D); + this.field_4181_h = this.field_921_b.func_4109_a(this.field_4181_h, var2, var4, var5, var7, 200.0D, 200.0D, 0.5D); + this.field_4185_d = this.field_910_m.func_807_a(this.field_4185_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 160.0D, var8 / 80.0D); + this.field_4184_e = this.field_912_k.func_807_a(this.field_4184_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8); + this.field_4183_f = this.field_911_l.func_807_a(this.field_4183_f, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8); + int var14 = 0; + int var15 = 0; + int var16 = 16 / var5; + + for(int var17 = 0; var17 < var5; ++var17) { + int var18 = var17 * var16 + var16 / 2; + + for(int var19 = 0; var19 < var7; ++var19) { + int var20 = var19 * var16 + var16 / 2; + double var21 = var12[var18 * 16 + var20]; + double var23 = var13[var18 * 16 + var20] * var21; + double var25 = 1.0D - var23; + var25 *= var25; + var25 *= var25; + var25 = 1.0D - var25; + double var27 = (this.field_4182_g[var15] + 256.0D) / 512.0D; + var27 *= var25; + if(var27 > 1.0D) { + var27 = 1.0D; + } + + double var29 = this.field_4181_h[var15] / 8000.0D; + if(var29 < 0.0D) { + var29 = -var29 * 0.3D; + } + + var29 = var29 * 3.0D - 2.0D; + if(var29 < 0.0D) { + var29 /= 2.0D; + if(var29 < -1.0D) { + var29 = -1.0D; + } + + var29 /= 1.4D; + var29 /= 2.0D; + var27 = 0.0D; + } else { + if(var29 > 1.0D) { + var29 = 1.0D; + } + + var29 /= 8.0D; + } + + if(var27 < 0.0D) { + var27 = 0.0D; + } + + var27 += 0.5D; + var29 = var29 * (double)var6 / 16.0D; + double var31 = (double)var6 / 2.0D + var29 * 4.0D; + ++var15; + + for(int var33 = 0; var33 < var6; ++var33) { + double var34 = 0.0D; + double var36 = ((double)var33 - var31) * 12.0D / var27; + if(var36 < 0.0D) { + var36 *= 4.0D; + } + + double var38 = this.field_4184_e[var14] / 512.0D; + double var40 = this.field_4183_f[var14] / 512.0D; + double var42 = (this.field_4185_d[var14] / 10.0D + 1.0D) / 2.0D; + if(var42 < 0.0D) { + var34 = var38; + } else if(var42 > 1.0D) { + var34 = var40; + } else { + var34 = var38 + (var40 - var38) * var42; + } + + var34 -= var36; + if(var33 > var6 - 4) { + double var44 = (double)((float)(var33 - (var6 - 4)) / 3.0F); + var34 = var34 * (1.0D - var44) + -10.0D * var44; + } + + var1[var14] = var34; + ++var14; + } + } + } + + return var1; + } + + public boolean chunkExists(int var1, int var2) { + return true; + } + + public void populate(IChunkProvider var1, int var2, int var3) { + BlockSand.fallInstantly = true; + int var4 = var2 * 16; + int var5 = var3 * 16; + MobSpawnerBase var6 = this.worldObj.func_4075_a().func_4073_a(var4 + 16, var5 + 16); + this.rand.setSeed(this.worldObj.randomSeed); + long var7 = this.rand.nextLong() / 2L * 2L + 1L; + long var9 = this.rand.nextLong() / 2L * 2L + 1L; + this.rand.setSeed((long)var2 * var7 + (long)var3 * var9 ^ this.worldObj.randomSeed); + double var11 = 0.25D; + int var13; + int var14; + int var15; + if(this.rand.nextInt(4) == 0) { + var13 = var4 + this.rand.nextInt(16) + 8; + var14 = this.rand.nextInt(128); + var15 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenLakes(Block.waterMoving.blockID)).generate(this.worldObj, this.rand, var13, var14, var15); + } + + if(this.rand.nextInt(8) == 0) { + var13 = var4 + this.rand.nextInt(16) + 8; + var14 = this.rand.nextInt(this.rand.nextInt(120) + 8); + var15 = var5 + this.rand.nextInt(16) + 8; + if(var14 < 64 || this.rand.nextInt(10) == 0) { + (new WorldGenLakes(Block.lavaMoving.blockID)).generate(this.worldObj, this.rand, var13, var14, var15); + } + } + + int var16; + for(var13 = 0; var13 < 8; ++var13) { + var14 = var4 + this.rand.nextInt(16) + 8; + var15 = this.rand.nextInt(128); + var16 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenDungeons()).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 10; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(128); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenClay(32)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 20; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(128); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.dirt.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 10; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(128); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.gravel.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 20; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(128); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.oreCoal.blockID, 16)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 20; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(64); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.oreIron.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 2; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(32); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.oreGold.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 8; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(16); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.oreRedstone.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + for(var13 = 0; var13 < 1; ++var13) { + var14 = var4 + this.rand.nextInt(16); + var15 = this.rand.nextInt(16); + var16 = var5 + this.rand.nextInt(16); + (new WorldGenMinable(Block.oreDiamond.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16); + } + + var11 = 0.5D; + var13 = (int)((this.field_920_c.func_806_a((double)var4 * var11, (double)var5 * var11) / 8.0D + this.rand.nextDouble() * 4.0D + 4.0D) / 3.0D); + var14 = 0; + if(this.rand.nextInt(10) == 0) { + ++var14; + } + + if(var6 == MobSpawnerBase.forest) { + var14 += var13 + 5; + } + + if(var6 == MobSpawnerBase.rainforest) { + var14 += var13 + 5; + } + + if(var6 == MobSpawnerBase.seasonalForest) { + var14 += var13 + 2; + } + + if(var6 == MobSpawnerBase.taiga) { + var14 += var13 + 5; + } + + if(var6 == MobSpawnerBase.desert) { + var14 -= 20; + } + + if(var6 == MobSpawnerBase.tundra) { + var14 -= 20; + } + + if(var6 == MobSpawnerBase.plains) { + var14 -= 20; + } + + Object var24 = new WorldGenTrees(); + if(this.rand.nextInt(10) == 0) { + var24 = new WorldGenBigTree(); + } + + if(var6 == MobSpawnerBase.rainforest && this.rand.nextInt(3) == 0) { + var24 = new WorldGenBigTree(); + } + + int var17; + int var18; + for(var16 = 0; var16 < var14; ++var16) { + var17 = var4 + this.rand.nextInt(16) + 8; + var18 = var5 + this.rand.nextInt(16) + 8; + ((WorldGenerator)var24).func_517_a(1.0D, 1.0D, 1.0D); + ((WorldGenerator)var24).generate(this.worldObj, this.rand, var17, this.worldObj.getHeightValue(var17, var18), var18); + } + + int var19; + for(var16 = 0; var16 < 2; ++var16) { + var17 = var4 + this.rand.nextInt(16) + 8; + var18 = this.rand.nextInt(128); + var19 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenFlowers(Block.plantYellow.blockID)).generate(this.worldObj, this.rand, var17, var18, var19); + } + + if(this.rand.nextInt(2) == 0) { + var16 = var4 + this.rand.nextInt(16) + 8; + var17 = this.rand.nextInt(128); + var18 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenFlowers(Block.plantRed.blockID)).generate(this.worldObj, this.rand, var16, var17, var18); + } + + if(this.rand.nextInt(4) == 0) { + var16 = var4 + this.rand.nextInt(16) + 8; + var17 = this.rand.nextInt(128); + var18 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.worldObj, this.rand, var16, var17, var18); + } + + if(this.rand.nextInt(8) == 0) { + var16 = var4 + this.rand.nextInt(16) + 8; + var17 = this.rand.nextInt(128); + var18 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.worldObj, this.rand, var16, var17, var18); + } + + for(var16 = 0; var16 < 10; ++var16) { + var17 = var4 + this.rand.nextInt(16) + 8; + var18 = this.rand.nextInt(128); + var19 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenReed()).generate(this.worldObj, this.rand, var17, var18, var19); + } + + if(this.rand.nextInt(32) == 0) { + var16 = var4 + this.rand.nextInt(16) + 8; + var17 = this.rand.nextInt(128); + var18 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenPumpkin()).generate(this.worldObj, this.rand, var16, var17, var18); + } + + var16 = 0; + if(var6 == MobSpawnerBase.desert) { + var16 += 10; + } + + int var20; + for(var17 = 0; var17 < var16; ++var17) { + var18 = var4 + this.rand.nextInt(16) + 8; + var19 = this.rand.nextInt(128); + var20 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenCactus()).generate(this.worldObj, this.rand, var18, var19, var20); + } + + for(var17 = 0; var17 < 50; ++var17) { + var18 = var4 + this.rand.nextInt(16) + 8; + var19 = this.rand.nextInt(this.rand.nextInt(120) + 8); + var20 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenLiquids(Block.waterStill.blockID)).generate(this.worldObj, this.rand, var18, var19, var20); + } + + for(var17 = 0; var17 < 20; ++var17) { + var18 = var4 + this.rand.nextInt(16) + 8; + var19 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(112) + 8) + 8); + var20 = var5 + this.rand.nextInt(16) + 8; + (new WorldGenLiquids(Block.lavaStill.blockID)).generate(this.worldObj, this.rand, var18, var19, var20); + } + + this.field_4178_w = this.worldObj.func_4075_a().getTemperatures(this.field_4178_w, var4 + 8, var5 + 8, 16, 16); + + for(var17 = var4 + 8; var17 < var4 + 8 + 16; ++var17) { + for(var18 = var5 + 8; var18 < var5 + 8 + 16; ++var18) { + var19 = var17 - (var4 + 8); + var20 = var18 - (var5 + 8); + int var21 = this.worldObj.func_4083_e(var17, var18); + double var22 = this.field_4178_w[var19 * 16 + var20] - (double)(var21 - 64) / 64.0D * 0.3D; + if(var22 < 0.5D && var21 > 0 && var21 < 128 && this.worldObj.getBlockId(var17, var21, var18) == 0 && this.worldObj.getBlockMaterial(var17, var21 - 1, var18).func_880_c() && this.worldObj.getBlockMaterial(var17, var21 - 1, var18) != Material.ice) { + this.worldObj.setBlockWithNotify(var17, var21, var18, Block.snow.blockID); + } + } + } + + BlockSand.fallInstantly = false; + } + + public boolean saveChunks(boolean var1, IProgressUpdate var2) { + return true; + } + + public boolean func_532_a() { + return false; + } + + public boolean func_536_b() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkProviderHell.java b/src/main/java/net/minecraft/src/ChunkProviderHell.java new file mode 100644 index 0000000..cf1ac9a --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkProviderHell.java @@ -0,0 +1,370 @@ +package net.minecraft.src; + +import java.util.Random; + +public class ChunkProviderHell implements IChunkProvider { + private Random field_4170_h; + private NoiseGeneratorOctaves field_4169_i; + private NoiseGeneratorOctaves field_4168_j; + private NoiseGeneratorOctaves field_4167_k; + private NoiseGeneratorOctaves field_4166_l; + private NoiseGeneratorOctaves field_4165_m; + public NoiseGeneratorOctaves field_4177_a; + public NoiseGeneratorOctaves field_4176_b; + private World field_4164_n; + private double[] field_4163_o; + private double[] field_4162_p = new double[256]; + private double[] field_4161_q = new double[256]; + private double[] field_4160_r = new double[256]; + private MapGenBase field_4159_s = new MapGenCavesHell(); + double[] field_4175_c; + double[] field_4174_d; + double[] field_4173_e; + double[] field_4172_f; + double[] field_4171_g; + + public ChunkProviderHell(World var1, long var2) { + this.field_4164_n = var1; + this.field_4170_h = new Random(var2); + this.field_4169_i = new NoiseGeneratorOctaves(this.field_4170_h, 16); + this.field_4168_j = new NoiseGeneratorOctaves(this.field_4170_h, 16); + this.field_4167_k = new NoiseGeneratorOctaves(this.field_4170_h, 8); + this.field_4166_l = new NoiseGeneratorOctaves(this.field_4170_h, 4); + this.field_4165_m = new NoiseGeneratorOctaves(this.field_4170_h, 4); + this.field_4177_a = new NoiseGeneratorOctaves(this.field_4170_h, 10); + this.field_4176_b = new NoiseGeneratorOctaves(this.field_4170_h, 16); + } + + public void func_4059_a(int var1, int var2, byte[] var3) { + byte var4 = 4; + byte var5 = 32; + int var6 = var4 + 1; + byte var7 = 17; + int var8 = var4 + 1; + this.field_4163_o = this.func_4057_a(this.field_4163_o, var1 * var4, 0, var2 * var4, var6, var7, var8); + + for(int var9 = 0; var9 < var4; ++var9) { + for(int var10 = 0; var10 < var4; ++var10) { + for(int var11 = 0; var11 < 16; ++var11) { + double var12 = 0.125D; + double var14 = this.field_4163_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 0]; + double var16 = this.field_4163_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 0]; + double var18 = this.field_4163_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 0]; + double var20 = this.field_4163_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 0]; + double var22 = (this.field_4163_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 1] - var14) * var12; + double var24 = (this.field_4163_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 1] - var16) * var12; + double var26 = (this.field_4163_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 1] - var18) * var12; + double var28 = (this.field_4163_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 1] - var20) * var12; + + for(int var30 = 0; var30 < 8; ++var30) { + double var31 = 0.25D; + double var33 = var14; + double var35 = var16; + double var37 = (var18 - var14) * var31; + double var39 = (var20 - var16) * var31; + + for(int var41 = 0; var41 < 4; ++var41) { + int var42 = var41 + var9 * 4 << 11 | 0 + var10 * 4 << 7 | var11 * 8 + var30; + short var43 = 128; + double var44 = 0.25D; + double var46 = var33; + double var48 = (var35 - var33) * var44; + + for(int var50 = 0; var50 < 4; ++var50) { + int var51 = 0; + if(var11 * 8 + var30 < var5) { + var51 = Block.lavaMoving.blockID; + } + + if(var46 > 0.0D) { + var51 = Block.bloodStone.blockID; + } + + var3[var42] = (byte)var51; + var42 += var43; + var46 += var48; + } + + var33 += var37; + var35 += var39; + } + + var14 += var22; + var16 += var24; + var18 += var26; + var20 += var28; + } + } + } + } + + } + + public void func_4058_b(int var1, int var2, byte[] var3) { + byte var4 = 64; + double var5 = 1.0D / 32.0D; + this.field_4162_p = this.field_4166_l.func_807_a(this.field_4162_p, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5, var5, 1.0D); + this.field_4161_q = this.field_4166_l.func_807_a(this.field_4161_q, (double)(var2 * 16), 109.0134D, (double)(var1 * 16), 16, 1, 16, var5, 1.0D, var5); + this.field_4160_r = this.field_4165_m.func_807_a(this.field_4160_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5 * 2.0D, var5 * 2.0D, var5 * 2.0D); + + for(int var7 = 0; var7 < 16; ++var7) { + for(int var8 = 0; var8 < 16; ++var8) { + boolean var9 = this.field_4162_p[var7 + var8 * 16] + this.field_4170_h.nextDouble() * 0.2D > 0.0D; + boolean var10 = this.field_4161_q[var7 + var8 * 16] + this.field_4170_h.nextDouble() * 0.2D > 0.0D; + int var11 = (int)(this.field_4160_r[var7 + var8 * 16] / 3.0D + 3.0D + this.field_4170_h.nextDouble() * 0.25D); + int var12 = -1; + byte var13 = (byte)Block.bloodStone.blockID; + byte var14 = (byte)Block.bloodStone.blockID; + + for(int var15 = 127; var15 >= 0; --var15) { + int var16 = (var7 * 16 + var8) * 128 + var15; + if(var15 >= 127 - this.field_4170_h.nextInt(5)) { + var3[var16] = (byte)Block.bedrock.blockID; + } else if(var15 <= 0 + this.field_4170_h.nextInt(5)) { + var3[var16] = (byte)Block.bedrock.blockID; + } else { + byte var17 = var3[var16]; + if(var17 == 0) { + var12 = -1; + } else if(var17 == Block.bloodStone.blockID) { + if(var12 == -1) { + if(var11 <= 0) { + var13 = 0; + var14 = (byte)Block.bloodStone.blockID; + } else if(var15 >= var4 - 4 && var15 <= var4 + 1) { + var13 = (byte)Block.bloodStone.blockID; + var14 = (byte)Block.bloodStone.blockID; + if(var10) { + var13 = (byte)Block.gravel.blockID; + } + + if(var10) { + var14 = (byte)Block.bloodStone.blockID; + } + + if(var9) { + var13 = (byte)Block.slowSand.blockID; + } + + if(var9) { + var14 = (byte)Block.slowSand.blockID; + } + } + + if(var15 < var4 && var13 == 0) { + var13 = (byte)Block.lavaMoving.blockID; + } + + var12 = var11; + if(var15 >= var4 - 1) { + var3[var16] = var13; + } else { + var3[var16] = var14; + } + } else if(var12 > 0) { + --var12; + var3[var16] = var14; + } + } + } + } + } + } + + } + + public Chunk provideChunk(int var1, int var2) { + this.field_4170_h.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L); + byte[] var3 = new byte[-Short.MIN_VALUE]; + this.func_4059_a(var1, var2, var3); + this.func_4058_b(var1, var2, var3); + this.field_4159_s.func_867_a(this, this.field_4164_n, var1, var2, var3); + Chunk var4 = new Chunk(this.field_4164_n, var3, var1, var2); + var4.func_1024_c(); + var4.func_4143_d(); + return var4; + } + + private double[] func_4057_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) { + if(var1 == null) { + var1 = new double[var5 * var6 * var7]; + } + + double var8 = 684.412D; + double var10 = 2053.236D; + this.field_4172_f = this.field_4177_a.func_807_a(this.field_4172_f, (double)var2, (double)var3, (double)var4, var5, 1, var7, 1.0D, 0.0D, 1.0D); + this.field_4171_g = this.field_4176_b.func_807_a(this.field_4171_g, (double)var2, (double)var3, (double)var4, var5, 1, var7, 100.0D, 0.0D, 100.0D); + this.field_4175_c = this.field_4167_k.func_807_a(this.field_4175_c, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 60.0D, var8 / 80.0D); + this.field_4174_d = this.field_4169_i.func_807_a(this.field_4174_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8); + this.field_4173_e = this.field_4168_j.func_807_a(this.field_4173_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8); + int var12 = 0; + int var13 = 0; + double[] var14 = new double[var6]; + + int var15; + for(var15 = 0; var15 < var6; ++var15) { + var14[var15] = Math.cos((double)var15 * Math.PI * 6.0D / (double)var6) * 2.0D; + double var16 = (double)var15; + if(var15 > var6 / 2) { + var16 = (double)(var6 - 1 - var15); + } + + if(var16 < 4.0D) { + var16 = 4.0D - var16; + var14[var15] -= var16 * var16 * var16 * 10.0D; + } + } + + for(var15 = 0; var15 < var5; ++var15) { + for(int var36 = 0; var36 < var7; ++var36) { + double var17 = (this.field_4172_f[var13] + 256.0D) / 512.0D; + if(var17 > 1.0D) { + var17 = 1.0D; + } + + double var19 = 0.0D; + double var21 = this.field_4171_g[var13] / 8000.0D; + if(var21 < 0.0D) { + var21 = -var21; + } + + var21 = var21 * 3.0D - 3.0D; + if(var21 < 0.0D) { + var21 /= 2.0D; + if(var21 < -1.0D) { + var21 = -1.0D; + } + + var21 /= 1.4D; + var21 /= 2.0D; + var17 = 0.0D; + } else { + if(var21 > 1.0D) { + var21 = 1.0D; + } + + var21 /= 6.0D; + } + + var17 += 0.5D; + var21 = var21 * (double)var6 / 16.0D; + ++var13; + + for(int var23 = 0; var23 < var6; ++var23) { + double var24 = 0.0D; + double var26 = var14[var23]; + double var28 = this.field_4174_d[var12] / 512.0D; + double var30 = this.field_4173_e[var12] / 512.0D; + double var32 = (this.field_4175_c[var12] / 10.0D + 1.0D) / 2.0D; + if(var32 < 0.0D) { + var24 = var28; + } else if(var32 > 1.0D) { + var24 = var30; + } else { + var24 = var28 + (var30 - var28) * var32; + } + + var24 -= var26; + double var34; + if(var23 > var6 - 4) { + var34 = (double)((float)(var23 - (var6 - 4)) / 3.0F); + var24 = var24 * (1.0D - var34) + -10.0D * var34; + } + + if((double)var23 < var19) { + var34 = (var19 - (double)var23) / 4.0D; + if(var34 < 0.0D) { + var34 = 0.0D; + } + + if(var34 > 1.0D) { + var34 = 1.0D; + } + + var24 = var24 * (1.0D - var34) + -10.0D * var34; + } + + var1[var12] = var24; + ++var12; + } + } + } + + return var1; + } + + public boolean chunkExists(int var1, int var2) { + return true; + } + + public void populate(IChunkProvider var1, int var2, int var3) { + BlockSand.fallInstantly = true; + int var4 = var2 * 16; + int var5 = var3 * 16; + + int var6; + int var7; + int var8; + int var9; + for(var6 = 0; var6 < 8; ++var6) { + var7 = var4 + this.field_4170_h.nextInt(16) + 8; + var8 = this.field_4170_h.nextInt(120) + 4; + var9 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenHellLava(Block.lavaStill.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9); + } + + var6 = this.field_4170_h.nextInt(this.field_4170_h.nextInt(10) + 1) + 1; + + int var10; + for(var7 = 0; var7 < var6; ++var7) { + var8 = var4 + this.field_4170_h.nextInt(16) + 8; + var9 = this.field_4170_h.nextInt(120) + 4; + var10 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenFire()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10); + } + + var6 = this.field_4170_h.nextInt(this.field_4170_h.nextInt(10) + 1); + + for(var7 = 0; var7 < var6; ++var7) { + var8 = var4 + this.field_4170_h.nextInt(16) + 8; + var9 = this.field_4170_h.nextInt(120) + 4; + var10 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenLightStone1()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10); + } + + for(var7 = 0; var7 < 10; ++var7) { + var8 = var4 + this.field_4170_h.nextInt(16) + 8; + var9 = this.field_4170_h.nextInt(128); + var10 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenLightStone2()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10); + } + + if(this.field_4170_h.nextInt(1) == 0) { + var7 = var4 + this.field_4170_h.nextInt(16) + 8; + var8 = this.field_4170_h.nextInt(128); + var9 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9); + } + + if(this.field_4170_h.nextInt(1) == 0) { + var7 = var4 + this.field_4170_h.nextInt(16) + 8; + var8 = this.field_4170_h.nextInt(128); + var9 = var5 + this.field_4170_h.nextInt(16) + 8; + (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9); + } + + BlockSand.fallInstantly = false; + } + + public boolean saveChunks(boolean var1, IProgressUpdate var2) { + return true; + } + + public boolean func_532_a() { + return false; + } + + public boolean func_536_b() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkProviderIso.java b/src/main/java/net/minecraft/src/ChunkProviderIso.java new file mode 100644 index 0000000..76a51c5 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkProviderIso.java @@ -0,0 +1,66 @@ +package net.minecraft.src; + +import java.io.IOException; + +public class ChunkProviderIso implements IChunkProvider { + private Chunk[] chunks = new Chunk[256]; + private World worldObj; + private IChunkLoader chunkLoader; + byte[] field_899_a = new byte[-Short.MIN_VALUE]; + + public ChunkProviderIso(World var1, IChunkLoader var2) { + this.worldObj = var1; + this.chunkLoader = var2; + } + + public boolean chunkExists(int var1, int var2) { + int var3 = var1 & 15 | (var2 & 15) * 16; + return this.chunks[var3] != null && this.chunks[var3].isAtLocation(var1, var2); + } + + public Chunk provideChunk(int var1, int var2) { + int var3 = var1 & 15 | (var2 & 15) * 16; + + try { + if(!this.chunkExists(var1, var2)) { + Chunk var4 = this.func_543_c(var1, var2); + if(var4 == null) { + var4 = new Chunk(this.worldObj, this.field_899_a, var1, var2); + var4.field_1524_q = true; + var4.neverSave = true; + } + + this.chunks[var3] = var4; + } + + return this.chunks[var3]; + } catch (Exception var5) { + var5.printStackTrace(); + return null; + } + } + + private synchronized Chunk func_543_c(int var1, int var2) { + try { + return this.chunkLoader.loadChunk(this.worldObj, var1, var2); + } catch (IOException var4) { + var4.printStackTrace(); + return null; + } + } + + public void populate(IChunkProvider var1, int var2, int var3) { + } + + public boolean saveChunks(boolean var1, IProgressUpdate var2) { + return true; + } + + public boolean func_532_a() { + return false; + } + + public boolean func_536_b() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java b/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java new file mode 100644 index 0000000..976c237 --- /dev/null +++ b/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java @@ -0,0 +1,201 @@ +package net.minecraft.src; + +import java.io.IOException; + +public class ChunkProviderLoadOrGenerate implements IChunkProvider { + private Chunk blankChunk; + private IChunkProvider chunkProvider; + private IChunkLoader chunkLoader; + private Chunk[] chunks = new Chunk[1024]; + private World worldObj; + int lastQueriedChunkXPos = -999999999; + int lastQueriedChunkZPos = -999999999; + private Chunk lastQueriedChunk; + + public ChunkProviderLoadOrGenerate(World var1, IChunkLoader var2, IChunkProvider var3) { + this.blankChunk = new Chunk(var1, new byte[-Short.MIN_VALUE], 0, 0); + this.blankChunk.field_1524_q = true; + this.blankChunk.neverSave = true; + this.worldObj = var1; + this.chunkLoader = var2; + this.chunkProvider = var3; + } + + public boolean chunkExists(int var1, int var2) { + if(var1 == this.lastQueriedChunkXPos && var2 == this.lastQueriedChunkZPos && this.lastQueriedChunk != null) { + return true; + } else { + int var3 = var1 & 31; + int var4 = var2 & 31; + int var5 = var3 + var4 * 32; + return this.chunks[var5] != null && (this.chunks[var5] == this.blankChunk || this.chunks[var5].isAtLocation(var1, var2)); + } + } + + public Chunk provideChunk(int var1, int var2) { + if(var1 == this.lastQueriedChunkXPos && var2 == this.lastQueriedChunkZPos && this.lastQueriedChunk != null) { + return this.lastQueriedChunk; + } else { + int var3 = var1 & 31; + int var4 = var2 & 31; + int var5 = var3 + var4 * 32; + if(!this.chunkExists(var1, var2)) { + if(this.chunks[var5] != null) { + this.chunks[var5].onChunkUnload(); + this.saveChunk(this.chunks[var5]); + this.saveExtraChunkData(this.chunks[var5]); + } + + Chunk var6 = this.func_542_c(var1, var2); + if(var6 == null) { + if(this.chunkProvider == null) { + var6 = this.blankChunk; + } else { + var6 = this.chunkProvider.provideChunk(var1, var2); + } + } + + this.chunks[var5] = var6; + var6.func_4143_d(); + if(this.chunks[var5] != null) { + this.chunks[var5].onChunkLoad(); + } + + if(!this.chunks[var5].isTerrainPopulated && this.chunkExists(var1 + 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 + 1, var2)) { + this.populate(this, var1, var2); + } + + if(this.chunkExists(var1 - 1, var2) && !this.provideChunk(var1 - 1, var2).isTerrainPopulated && this.chunkExists(var1 - 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 - 1, var2)) { + this.populate(this, var1 - 1, var2); + } + + if(this.chunkExists(var1, var2 - 1) && !this.provideChunk(var1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 + 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 + 1, var2)) { + this.populate(this, var1, var2 - 1); + } + + if(this.chunkExists(var1 - 1, var2 - 1) && !this.provideChunk(var1 - 1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 - 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 - 1, var2)) { + this.populate(this, var1 - 1, var2 - 1); + } + } + + this.lastQueriedChunkXPos = var1; + this.lastQueriedChunkZPos = var2; + this.lastQueriedChunk = this.chunks[var5]; + return this.chunks[var5]; + } + } + + private Chunk func_542_c(int var1, int var2) { + if(this.chunkLoader == null) { + return null; + } else { + try { + Chunk var3 = this.chunkLoader.loadChunk(this.worldObj, var1, var2); + if(var3 != null) { + var3.lastSaveTime = this.worldObj.worldTime; + } + + return var3; + } catch (Exception var4) { + var4.printStackTrace(); + return null; + } + } + } + + private void saveExtraChunkData(Chunk var1) { + if(this.chunkLoader != null) { + try { + this.chunkLoader.saveExtraChunkData(this.worldObj, var1); + } catch (Exception var3) { + var3.printStackTrace(); + } + + } + } + + private void saveChunk(Chunk var1) { + if(this.chunkLoader != null) { + try { + var1.lastSaveTime = this.worldObj.worldTime; + this.chunkLoader.saveChunk(this.worldObj, var1); + } catch (IOException var3) { + var3.printStackTrace(); + } + + } + } + + public void populate(IChunkProvider var1, int var2, int var3) { + Chunk var4 = this.provideChunk(var2, var3); + if(!var4.isTerrainPopulated) { + var4.isTerrainPopulated = true; + if(this.chunkProvider != null) { + this.chunkProvider.populate(var1, var2, var3); + var4.setChunkModified(); + } + } + + } + + public boolean saveChunks(boolean var1, IProgressUpdate var2) { + int var3 = 0; + int var4 = 0; + int var5; + if(var2 != null) { + for(var5 = 0; var5 < this.chunks.length; ++var5) { + if(this.chunks[var5] != null && this.chunks[var5].needsSaving(var1)) { + ++var4; + } + } + } + + var5 = 0; + + for(int var6 = 0; var6 < this.chunks.length; ++var6) { + if(this.chunks[var6] != null) { + if(var1 && !this.chunks[var6].neverSave) { + this.saveExtraChunkData(this.chunks[var6]); + } + + if(this.chunks[var6].needsSaving(var1)) { + this.saveChunk(this.chunks[var6]); + this.chunks[var6].isModified = false; + ++var3; + if(var3 == 2 && !var1) { + return false; + } + + if(var2 != null) { + ++var5; + if(var5 % 10 == 0) { + var2.setLoadingProgress(var5 * 100 / var4); + } + } + } + } + } + + if(var1) { + if(this.chunkLoader == null) { + return true; + } + + this.chunkLoader.saveExtraData(); + } + + return true; + } + + public boolean func_532_a() { + if(this.chunkLoader != null) { + this.chunkLoader.func_814_a(); + } + + return this.chunkProvider.func_532_a(); + } + + public boolean func_536_b() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ClippingHelper.java b/src/main/java/net/minecraft/src/ClippingHelper.java new file mode 100644 index 0000000..6940a40 --- /dev/null +++ b/src/main/java/net/minecraft/src/ClippingHelper.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +public class ClippingHelper { + public float[][] field_1688_a = new float[16][16]; + public float[] field_1687_b = new float[16]; + public float[] field_1690_c = new float[16]; + public float[] field_1689_d = new float[16]; + + public boolean func_1152_a(double var1, double var3, double var5, double var7, double var9, double var11) { + for(int var13 = 0; var13 < 6; ++var13) { + if((double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D) { + return false; + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ClippingHelperImplementation.java b/src/main/java/net/minecraft/src/ClippingHelperImplementation.java new file mode 100644 index 0000000..d511d32 --- /dev/null +++ b/src/main/java/net/minecraft/src/ClippingHelperImplementation.java @@ -0,0 +1,82 @@ +package net.minecraft.src; + +import java.nio.FloatBuffer; +import org.lwjgl.opengl.GL11; + +public class ClippingHelperImplementation extends ClippingHelper { + private static ClippingHelperImplementation field_1694_e = new ClippingHelperImplementation(); + private FloatBuffer field_1693_f = GLAllocation.createDirectFloatBuffer(16); + private FloatBuffer field_1692_g = GLAllocation.createDirectFloatBuffer(16); + private FloatBuffer field_1691_h = GLAllocation.createDirectFloatBuffer(16); + + public static ClippingHelper func_1155_a() { + field_1694_e.func_1153_b(); + return field_1694_e; + } + + private void func_1154_a(float[][] var1, int var2) { + float var3 = MathHelper.sqrt_float(var1[var2][0] * var1[var2][0] + var1[var2][1] * var1[var2][1] + var1[var2][2] * var1[var2][2]); + var1[var2][0] /= var3; + var1[var2][1] /= var3; + var1[var2][2] /= var3; + var1[var2][3] /= var3; + } + + private void func_1153_b() { + this.field_1693_f.clear(); + this.field_1692_g.clear(); + this.field_1691_h.clear(); + GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, this.field_1693_f); + GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, this.field_1692_g); + this.field_1693_f.flip().limit(16); + this.field_1693_f.get(this.field_1687_b); + this.field_1692_g.flip().limit(16); + this.field_1692_g.get(this.field_1690_c); + this.field_1689_d[0] = this.field_1690_c[0] * this.field_1687_b[0] + this.field_1690_c[1] * this.field_1687_b[4] + this.field_1690_c[2] * this.field_1687_b[8] + this.field_1690_c[3] * this.field_1687_b[12]; + this.field_1689_d[1] = this.field_1690_c[0] * this.field_1687_b[1] + this.field_1690_c[1] * this.field_1687_b[5] + this.field_1690_c[2] * this.field_1687_b[9] + this.field_1690_c[3] * this.field_1687_b[13]; + this.field_1689_d[2] = this.field_1690_c[0] * this.field_1687_b[2] + this.field_1690_c[1] * this.field_1687_b[6] + this.field_1690_c[2] * this.field_1687_b[10] + this.field_1690_c[3] * this.field_1687_b[14]; + this.field_1689_d[3] = this.field_1690_c[0] * this.field_1687_b[3] + this.field_1690_c[1] * this.field_1687_b[7] + this.field_1690_c[2] * this.field_1687_b[11] + this.field_1690_c[3] * this.field_1687_b[15]; + this.field_1689_d[4] = this.field_1690_c[4] * this.field_1687_b[0] + this.field_1690_c[5] * this.field_1687_b[4] + this.field_1690_c[6] * this.field_1687_b[8] + this.field_1690_c[7] * this.field_1687_b[12]; + this.field_1689_d[5] = this.field_1690_c[4] * this.field_1687_b[1] + this.field_1690_c[5] * this.field_1687_b[5] + this.field_1690_c[6] * this.field_1687_b[9] + this.field_1690_c[7] * this.field_1687_b[13]; + this.field_1689_d[6] = this.field_1690_c[4] * this.field_1687_b[2] + this.field_1690_c[5] * this.field_1687_b[6] + this.field_1690_c[6] * this.field_1687_b[10] + this.field_1690_c[7] * this.field_1687_b[14]; + this.field_1689_d[7] = this.field_1690_c[4] * this.field_1687_b[3] + this.field_1690_c[5] * this.field_1687_b[7] + this.field_1690_c[6] * this.field_1687_b[11] + this.field_1690_c[7] * this.field_1687_b[15]; + this.field_1689_d[8] = this.field_1690_c[8] * this.field_1687_b[0] + this.field_1690_c[9] * this.field_1687_b[4] + this.field_1690_c[10] * this.field_1687_b[8] + this.field_1690_c[11] * this.field_1687_b[12]; + this.field_1689_d[9] = this.field_1690_c[8] * this.field_1687_b[1] + this.field_1690_c[9] * this.field_1687_b[5] + this.field_1690_c[10] * this.field_1687_b[9] + this.field_1690_c[11] * this.field_1687_b[13]; + this.field_1689_d[10] = this.field_1690_c[8] * this.field_1687_b[2] + this.field_1690_c[9] * this.field_1687_b[6] + this.field_1690_c[10] * this.field_1687_b[10] + this.field_1690_c[11] * this.field_1687_b[14]; + this.field_1689_d[11] = this.field_1690_c[8] * this.field_1687_b[3] + this.field_1690_c[9] * this.field_1687_b[7] + this.field_1690_c[10] * this.field_1687_b[11] + this.field_1690_c[11] * this.field_1687_b[15]; + this.field_1689_d[12] = this.field_1690_c[12] * this.field_1687_b[0] + this.field_1690_c[13] * this.field_1687_b[4] + this.field_1690_c[14] * this.field_1687_b[8] + this.field_1690_c[15] * this.field_1687_b[12]; + this.field_1689_d[13] = this.field_1690_c[12] * this.field_1687_b[1] + this.field_1690_c[13] * this.field_1687_b[5] + this.field_1690_c[14] * this.field_1687_b[9] + this.field_1690_c[15] * this.field_1687_b[13]; + this.field_1689_d[14] = this.field_1690_c[12] * this.field_1687_b[2] + this.field_1690_c[13] * this.field_1687_b[6] + this.field_1690_c[14] * this.field_1687_b[10] + this.field_1690_c[15] * this.field_1687_b[14]; + this.field_1689_d[15] = this.field_1690_c[12] * this.field_1687_b[3] + this.field_1690_c[13] * this.field_1687_b[7] + this.field_1690_c[14] * this.field_1687_b[11] + this.field_1690_c[15] * this.field_1687_b[15]; + this.field_1688_a[0][0] = this.field_1689_d[3] - this.field_1689_d[0]; + this.field_1688_a[0][1] = this.field_1689_d[7] - this.field_1689_d[4]; + this.field_1688_a[0][2] = this.field_1689_d[11] - this.field_1689_d[8]; + this.field_1688_a[0][3] = this.field_1689_d[15] - this.field_1689_d[12]; + this.func_1154_a(this.field_1688_a, 0); + this.field_1688_a[1][0] = this.field_1689_d[3] + this.field_1689_d[0]; + this.field_1688_a[1][1] = this.field_1689_d[7] + this.field_1689_d[4]; + this.field_1688_a[1][2] = this.field_1689_d[11] + this.field_1689_d[8]; + this.field_1688_a[1][3] = this.field_1689_d[15] + this.field_1689_d[12]; + this.func_1154_a(this.field_1688_a, 1); + this.field_1688_a[2][0] = this.field_1689_d[3] + this.field_1689_d[1]; + this.field_1688_a[2][1] = this.field_1689_d[7] + this.field_1689_d[5]; + this.field_1688_a[2][2] = this.field_1689_d[11] + this.field_1689_d[9]; + this.field_1688_a[2][3] = this.field_1689_d[15] + this.field_1689_d[13]; + this.func_1154_a(this.field_1688_a, 2); + this.field_1688_a[3][0] = this.field_1689_d[3] - this.field_1689_d[1]; + this.field_1688_a[3][1] = this.field_1689_d[7] - this.field_1689_d[5]; + this.field_1688_a[3][2] = this.field_1689_d[11] - this.field_1689_d[9]; + this.field_1688_a[3][3] = this.field_1689_d[15] - this.field_1689_d[13]; + this.func_1154_a(this.field_1688_a, 3); + this.field_1688_a[4][0] = this.field_1689_d[3] - this.field_1689_d[2]; + this.field_1688_a[4][1] = this.field_1689_d[7] - this.field_1689_d[6]; + this.field_1688_a[4][2] = this.field_1689_d[11] - this.field_1689_d[10]; + this.field_1688_a[4][3] = this.field_1689_d[15] - this.field_1689_d[14]; + this.func_1154_a(this.field_1688_a, 4); + this.field_1688_a[5][0] = this.field_1689_d[3] + this.field_1689_d[2]; + this.field_1688_a[5][1] = this.field_1689_d[7] + this.field_1689_d[6]; + this.field_1688_a[5][2] = this.field_1689_d[11] + this.field_1689_d[10]; + this.field_1688_a[5][3] = this.field_1689_d[15] + this.field_1689_d[14]; + this.func_1154_a(this.field_1688_a, 5); + } +} diff --git a/src/main/java/net/minecraft/src/ColorizerFoliage.java b/src/main/java/net/minecraft/src/ColorizerFoliage.java new file mode 100644 index 0000000..0be3e69 --- /dev/null +++ b/src/main/java/net/minecraft/src/ColorizerFoliage.java @@ -0,0 +1,25 @@ +package net.minecraft.src; + +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; + +public class ColorizerFoliage { + private static final int[] field_6529_a = new int[65536]; + + public static int func_4146_a(double var0, double var2) { + var2 *= var0; + int var4 = (int)((1.0D - var0) * 255.0D); + int var5 = (int)((1.0D - var2) * 255.0D); + return field_6529_a[var5 << 8 | var4]; + } + + static { + try { + BufferedImage var0 = ImageIO.read(ColorizerFoliage.class.getResource("/misc/foliagecolor.png")); + var0.getRGB(0, 0, 256, 256, field_6529_a, 0, 256); + } catch (Exception var1) { + var1.printStackTrace(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/ColorizerGrass.java b/src/main/java/net/minecraft/src/ColorizerGrass.java new file mode 100644 index 0000000..7d4cedf --- /dev/null +++ b/src/main/java/net/minecraft/src/ColorizerGrass.java @@ -0,0 +1,25 @@ +package net.minecraft.src; + +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; + +public class ColorizerGrass { + private static final int[] field_6540_a = new int[65536]; + + public static int func_4147_a(double var0, double var2) { + var2 *= var0; + int var4 = (int)((1.0D - var0) * 255.0D); + int var5 = (int)((1.0D - var2) * 255.0D); + return field_6540_a[var5 << 8 | var4]; + } + + static { + try { + BufferedImage var0 = ImageIO.read(ColorizerFoliage.class.getResource("/misc/grasscolor.png")); + var0.getRGB(0, 0, 256, 256, field_6540_a, 0, 256); + } catch (Exception var1) { + var1.printStackTrace(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/CompressedStreamTools.java b/src/main/java/net/minecraft/src/CompressedStreamTools.java new file mode 100644 index 0000000..586637d --- /dev/null +++ b/src/main/java/net/minecraft/src/CompressedStreamTools.java @@ -0,0 +1,78 @@ +package net.minecraft.src; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class CompressedStreamTools { + public static NBTTagCompound func_1138_a(InputStream var0) throws IOException { + DataInputStream var1 = new DataInputStream(new GZIPInputStream(var0)); + + NBTTagCompound var2; + try { + var2 = func_1141_a(var1); + } finally { + var1.close(); + } + + return var2; + } + + public static void writeGzippedCompoundToOutputStream(NBTTagCompound var0, OutputStream var1) throws IOException { + DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1)); + + try { + func_1139_a(var0, var2); + } finally { + var2.close(); + } + + } + + public static NBTTagCompound func_1140_a(byte[] var0) throws IOException { + DataInputStream var1 = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(var0))); + + NBTTagCompound var2; + try { + var2 = func_1141_a(var1); + } finally { + var1.close(); + } + + return var2; + } + + public static byte[] func_1142_a(NBTTagCompound var0) throws IOException { + ByteArrayOutputStream var1 = new ByteArrayOutputStream(); + DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1)); + + try { + func_1139_a(var0, var2); + } finally { + var2.close(); + } + + return var1.toByteArray(); + } + + public static NBTTagCompound func_1141_a(DataInput var0) throws IOException { + NBTBase var1 = NBTBase.readTag(var0); + if(var1 instanceof NBTTagCompound) { + return (NBTTagCompound)var1; + } else { + throw new IOException("Root tag must be a named compound tag"); + } + } + + public static void func_1139_a(NBTTagCompound var0, DataOutput var1) throws IOException { + NBTBase.writeTag(var0, var1); + } +} diff --git a/src/main/java/net/minecraft/src/CraftingInventoryCB.java b/src/main/java/net/minecraft/src/CraftingInventoryCB.java new file mode 100644 index 0000000..d71c7a8 --- /dev/null +++ b/src/main/java/net/minecraft/src/CraftingInventoryCB.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +public class CraftingInventoryCB { + protected List unusedList = new ArrayList(); + + public void onCraftGuiClosed(EntityPlayer var1) { + InventoryPlayer var2 = var1.inventory; + if(var2.draggingItemStack != null) { + var1.dropPlayerItem(var2.draggingItemStack); + } + + } + + public void onCraftMatrixChanged(IInventory var1) { + } +} diff --git a/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java b/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java new file mode 100644 index 0000000..9232b6d --- /dev/null +++ b/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java @@ -0,0 +1,43 @@ +package net.minecraft.src; + +public class CraftingInventoryPlayerCB extends CraftingInventoryCB { + public InventoryCrafting craftMatrix; + public IInventory craftResult = new InventoryCraftResult(); + + public CraftingInventoryPlayerCB(ItemStack[] var1) { + this.craftMatrix = new InventoryCrafting(this, var1); + this.onCraftMatrixChanged(this.craftMatrix); + } + + public void onCraftMatrixChanged(IInventory var1) { + int[] var2 = new int[9]; + + for(int var3 = 0; var3 < 3; ++var3) { + for(int var4 = 0; var4 < 3; ++var4) { + int var5 = -1; + if(var3 < 2 && var4 < 2) { + ItemStack var6 = this.craftMatrix.getStackInSlot(var3 + var4 * 2); + if(var6 != null) { + var5 = var6.itemID; + } + } + + var2[var3 + var4 * 3] = var5; + } + } + + this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().craft(var2)); + } + + public void onCraftGuiClosed(EntityPlayer var1) { + super.onCraftGuiClosed(var1); + + for(int var2 = 0; var2 < 9; ++var2) { + ItemStack var3 = this.craftMatrix.getStackInSlot(var2); + if(var3 != null) { + var1.dropPlayerItem(var3); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java b/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java new file mode 100644 index 0000000..56106a8 --- /dev/null +++ b/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +public class CraftingInventoryWorkbenchCB extends CraftingInventoryCB { + public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3); + public IInventory craftResult = new InventoryCraftResult(); + + public void onCraftMatrixChanged(IInventory var1) { + int[] var2 = new int[9]; + + for(int var3 = 0; var3 < 3; ++var3) { + for(int var4 = 0; var4 < 3; ++var4) { + int var5 = var3 + var4 * 3; + ItemStack var6 = this.craftMatrix.getStackInSlot(var5); + if(var6 == null) { + var2[var5] = -1; + } else { + var2[var5] = var6.itemID; + } + } + } + + this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().craft(var2)); + } + + public void onCraftGuiClosed(EntityPlayer var1) { + super.onCraftGuiClosed(var1); + + for(int var2 = 0; var2 < 9; ++var2) { + ItemStack var3 = this.craftMatrix.getStackInSlot(var2); + if(var3 != null) { + var1.dropPlayerItem(var3); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/CraftingManager.java b/src/main/java/net/minecraft/src/CraftingManager.java new file mode 100644 index 0000000..9b1f293 --- /dev/null +++ b/src/main/java/net/minecraft/src/CraftingManager.java @@ -0,0 +1,129 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class CraftingManager { + private static final CraftingManager instance = new CraftingManager(); + private List recipes = new ArrayList(); + + public static final CraftingManager getInstance() { + return instance; + } + + private CraftingManager() { + (new RecipesTools()).func_1122_a(this); + (new RecipesWeapons()).func_766_a(this); + (new RecipesIngots()).func_810_a(this); + (new RecipesFood()).func_976_a(this); + (new RecipesCrafting()).func_1051_a(this); + (new RecipesArmor()).func_1148_a(this); + this.addRecipe(new ItemStack(Item.paper, 3), new Object[]{"###", Character.valueOf('#'), Item.reed}); + this.addRecipe(new ItemStack(Item.book, 1), new Object[]{"#", "#", "#", Character.valueOf('#'), Item.paper}); + this.addRecipe(new ItemStack(Block.fence, 2), new Object[]{"###", "###", Character.valueOf('#'), Item.stick}); + this.addRecipe(new ItemStack(Block.jukebox, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.diamond}); + this.addRecipe(new ItemStack(Block.bookShelf, 1), new Object[]{"###", "XXX", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.book}); + this.addRecipe(new ItemStack(Block.blockSnow, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.snowball}); + this.addRecipe(new ItemStack(Block.blockClay, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.clay}); + this.addRecipe(new ItemStack(Block.brick, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.brick}); + this.addRecipe(new ItemStack(Block.lightStone, 1), new Object[]{"###", "###", "###", Character.valueOf('#'), Item.lightStoneDust}); + this.addRecipe(new ItemStack(Block.cloth, 1), new Object[]{"###", "###", "###", Character.valueOf('#'), Item.silk}); + this.addRecipe(new ItemStack(Block.tnt, 1), new Object[]{"X#X", "#X#", "X#X", Character.valueOf('X'), Item.gunpowder, Character.valueOf('#'), Block.sand}); + this.addRecipe(new ItemStack(Block.stairSingle, 3), new Object[]{"###", Character.valueOf('#'), Block.cobblestone}); + this.addRecipe(new ItemStack(Block.ladder, 1), new Object[]{"# #", "###", "# #", Character.valueOf('#'), Item.stick}); + this.addRecipe(new ItemStack(Item.doorWood, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Item.doorSteel, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Item.ingotIron}); + this.addRecipe(new ItemStack(Item.sign, 1), new Object[]{"###", "###", " X ", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.stick}); + this.addRecipe(new ItemStack(Block.planks, 4), new Object[]{"#", Character.valueOf('#'), Block.wood}); + this.addRecipe(new ItemStack(Item.stick, 4), new Object[]{"#", "#", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[]{"X", "#", Character.valueOf('X'), Item.coal, Character.valueOf('#'), Item.stick}); + this.addRecipe(new ItemStack(Item.bowlEmpty, 4), new Object[]{"# #", " # ", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Block.minecartTrack, 16), new Object[]{"X X", "X#X", "X X", Character.valueOf('X'), Item.ingotIron, Character.valueOf('#'), Item.stick}); + this.addRecipe(new ItemStack(Item.minecartEmpty, 1), new Object[]{"# #", "###", Character.valueOf('#'), Item.ingotIron}); + this.addRecipe(new ItemStack(Block.pumpkinLantern, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.pumpkin, Character.valueOf('B'), Block.torchWood}); + this.addRecipe(new ItemStack(Item.minecartCrate, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.crate, Character.valueOf('B'), Item.minecartEmpty}); + this.addRecipe(new ItemStack(Item.minecartPowered, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.stoneOvenIdle, Character.valueOf('B'), Item.minecartEmpty}); + this.addRecipe(new ItemStack(Item.boat, 1), new Object[]{"# #", "###", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Item.bucketEmpty, 1), new Object[]{"# #", " # ", Character.valueOf('#'), Item.ingotIron}); + this.addRecipe(new ItemStack(Item.flintAndSteel, 1), new Object[]{"A ", " B", Character.valueOf('A'), Item.ingotIron, Character.valueOf('B'), Item.flint}); + this.addRecipe(new ItemStack(Item.bread, 1), new Object[]{"###", Character.valueOf('#'), Item.wheat}); + this.addRecipe(new ItemStack(Block.stairCompactPlanks, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Item.fishingRod, 1), new Object[]{" #", " #X", "# X", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.silk}); + this.addRecipe(new ItemStack(Block.stairCompactCobblestone, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.cobblestone}); + this.addRecipe(new ItemStack(Item.painting, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Block.cloth}); + this.addRecipe(new ItemStack(Item.appleGold, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.blockGold, Character.valueOf('X'), Item.appleRed}); + this.addRecipe(new ItemStack(Block.lever, 1), new Object[]{"X", "#", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Item.stick}); + this.addRecipe(new ItemStack(Block.torchRedstoneActive, 1), new Object[]{"X", "#", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.redstone}); + this.addRecipe(new ItemStack(Item.pocketSundial, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotGold, Character.valueOf('X'), Item.redstone}); + this.addRecipe(new ItemStack(Item.compass, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.redstone}); + this.addRecipe(new ItemStack(Block.button, 1), new Object[]{"#", "#", Character.valueOf('#'), Block.stone}); + this.addRecipe(new ItemStack(Block.pressurePlateStone, 1), new Object[]{"###", Character.valueOf('#'), Block.stone}); + this.addRecipe(new ItemStack(Block.pressurePlatePlanks, 1), new Object[]{"###", Character.valueOf('#'), Block.planks}); + Collections.sort(this.recipes, new RecipeSorter(this)); + System.out.println(this.recipes.size() + " recipes"); + } + + void addRecipe(ItemStack var1, Object... var2) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + if(var2[var4] instanceof String[]) { + String[] var11 = (String[])((String[])var2[var4++]); + + for(int var8 = 0; var8 < var11.length; ++var8) { + String var9 = var11[var8]; + ++var6; + var5 = var9.length(); + var3 = var3 + var9; + } + } else { + while(var2[var4] instanceof String) { + String var7 = (String)var2[var4++]; + ++var6; + var5 = var7.length(); + var3 = var3 + var7; + } + } + + HashMap var12; + int var15; + for(var12 = new HashMap(); var4 < var2.length; var4 += 2) { + Character var13 = (Character)var2[var4]; + var15 = 0; + if(var2[var4 + 1] instanceof Item) { + var15 = ((Item)var2[var4 + 1]).shiftedIndex; + } else if(var2[var4 + 1] instanceof Block) { + var15 = ((Block)var2[var4 + 1]).blockID; + } + + var12.put(var13, Integer.valueOf(var15)); + } + + int[] var14 = new int[var5 * var6]; + + for(var15 = 0; var15 < var5 * var6; ++var15) { + char var10 = var3.charAt(var15); + if(var12.containsKey(Character.valueOf(var10))) { + var14[var15] = ((Integer)var12.get(Character.valueOf(var10))).intValue(); + } else { + var14[var15] = -1; + } + } + + this.recipes.add(new CraftingRecipe(var5, var6, var14, var1)); + } + + public ItemStack craft(int[] var1) { + for(int var2 = 0; var2 < this.recipes.size(); ++var2) { + CraftingRecipe var3 = (CraftingRecipe)this.recipes.get(var2); + if(var3.matchRecipe(var1)) { + return var3.createResult(var1); + } + } + + return null; + } +} diff --git a/src/main/java/net/minecraft/src/CraftingRecipe.java b/src/main/java/net/minecraft/src/CraftingRecipe.java new file mode 100644 index 0000000..c124413 --- /dev/null +++ b/src/main/java/net/minecraft/src/CraftingRecipe.java @@ -0,0 +1,64 @@ +package net.minecraft.src; + +public class CraftingRecipe { + private int width; + private int height; + private int[] ingredientMap; + private ItemStack resultStack; + public final int resultId; + + public CraftingRecipe(int var1, int var2, int[] var3, ItemStack var4) { + this.resultId = var4.itemID; + this.width = var1; + this.height = var2; + this.ingredientMap = var3; + this.resultStack = var4; + } + + public boolean matchRecipe(int[] var1) { + for(int var2 = 0; var2 <= 3 - this.width; ++var2) { + for(int var3 = 0; var3 <= 3 - this.height; ++var3) { + if(this.matches(var1, var2, var3, true)) { + return true; + } + + if(this.matches(var1, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + private boolean matches(int[] var1, int var2, int var3, boolean var4) { + for(int var5 = 0; var5 < 3; ++var5) { + for(int var6 = 0; var6 < 3; ++var6) { + int var7 = var5 - var2; + int var8 = var6 - var3; + int var9 = -1; + if(var7 >= 0 && var8 >= 0 && var7 < this.width && var8 < this.height) { + if(var4) { + var9 = this.ingredientMap[this.width - var7 - 1 + var8 * this.width]; + } else { + var9 = this.ingredientMap[var7 + var8 * this.width]; + } + } + + if(var1[var5 + var6 * 3] != var9) { + return false; + } + } + } + + return true; + } + + public ItemStack createResult(int[] var1) { + return new ItemStack(this.resultStack.itemID, this.resultStack.stackSize); + } + + public int getRecipeSize() { + return this.width * this.height; + } +} diff --git a/src/main/java/net/minecraft/src/EffectRenderer.java b/src/main/java/net/minecraft/src/EffectRenderer.java new file mode 100644 index 0000000..80099f5 --- /dev/null +++ b/src/main/java/net/minecraft/src/EffectRenderer.java @@ -0,0 +1,166 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import org.lwjgl.opengl.GL11; + +public class EffectRenderer { + protected World worldObj; + private List[] field_1728_b = new List[4]; + private RenderEngine field_1731_c; + private Random rand = new Random(); + + public EffectRenderer(World var1, RenderEngine var2) { + if(var1 != null) { + this.worldObj = var1; + } + + this.field_1731_c = var2; + + for(int var3 = 0; var3 < 4; ++var3) { + this.field_1728_b[var3] = new ArrayList(); + } + + } + + public void func_1192_a(EntityFX var1) { + int var2 = var1.func_404_c(); + this.field_1728_b[var2].add(var1); + } + + public void func_1193_a() { + for(int var1 = 0; var1 < 4; ++var1) { + for(int var2 = 0; var2 < this.field_1728_b[var1].size(); ++var2) { + EntityFX var3 = (EntityFX)this.field_1728_b[var1].get(var2); + var3.onUpdate(); + if(var3.isDead) { + this.field_1728_b[var1].remove(var2--); + } + } + } + + } + + public void func_1189_a(Entity var1, float var2) { + float var3 = MathHelper.cos(var1.rotationYaw * (float)Math.PI / 180.0F); + float var4 = MathHelper.sin(var1.rotationYaw * (float)Math.PI / 180.0F); + float var5 = -var4 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F); + float var6 = var3 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F); + float var7 = MathHelper.cos(var1.rotationPitch * (float)Math.PI / 180.0F); + EntityFX.field_660_l = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var2; + EntityFX.field_659_m = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var2; + EntityFX.field_658_n = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var2; + + for(int var8 = 0; var8 < 3; ++var8) { + if(this.field_1728_b[var8].size() != 0) { + int var9 = 0; + if(var8 == 0) { + var9 = this.field_1731_c.getTexture("/particles.png"); + } + + if(var8 == 1) { + var9 = this.field_1731_c.getTexture("/terrain.png"); + } + + if(var8 == 2) { + var9 = this.field_1731_c.getTexture("/gui/items.png"); + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var9); + Tessellator var10 = Tessellator.instance; + var10.startDrawingQuads(); + + for(int var11 = 0; var11 < this.field_1728_b[var8].size(); ++var11) { + EntityFX var12 = (EntityFX)this.field_1728_b[var8].get(var11); + var12.func_406_a(var10, var2, var3, var7, var4, var5, var6); + } + + var10.draw(); + } + } + + } + + public void func_1187_b(Entity var1, float var2) { + byte var3 = 3; + if(this.field_1728_b[var3].size() != 0) { + Tessellator var4 = Tessellator.instance; + + for(int var5 = 0; var5 < this.field_1728_b[var3].size(); ++var5) { + EntityFX var6 = (EntityFX)this.field_1728_b[var3].get(var5); + var6.func_406_a(var4, var2, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F); + } + + } + } + + public void func_1188_a(World var1) { + this.worldObj = var1; + + for(int var2 = 0; var2 < 4; ++var2) { + this.field_1728_b[var2].clear(); + } + + } + + public void func_1186_a(int var1, int var2, int var3) { + int var4 = this.worldObj.getBlockId(var1, var2, var3); + if(var4 != 0) { + Block var5 = Block.blocksList[var4]; + byte var6 = 4; + + for(int var7 = 0; var7 < var6; ++var7) { + for(int var8 = 0; var8 < var6; ++var8) { + for(int var9 = 0; var9 < var6; ++var9) { + double var10 = (double)var1 + ((double)var7 + 0.5D) / (double)var6; + double var12 = (double)var2 + ((double)var8 + 0.5D) / (double)var6; + double var14 = (double)var3 + ((double)var9 + 0.5D) / (double)var6; + this.func_1192_a((new EntityDiggingFX(this.worldObj, var10, var12, var14, var10 - (double)var1 - 0.5D, var12 - (double)var2 - 0.5D, var14 - (double)var3 - 0.5D, var5)).func_4041_a(var1, var2, var3)); + } + } + } + + } + } + + public void func_1191_a(int var1, int var2, int var3, int var4) { + int var5 = this.worldObj.getBlockId(var1, var2, var3); + if(var5 != 0) { + Block var6 = Block.blocksList[var5]; + float var7 = 0.1F; + double var8 = (double)var1 + this.rand.nextDouble() * (var6.maxX - var6.field_370_bf - (double)(var7 * 2.0F)) + (double)var7 + var6.field_370_bf; + double var10 = (double)var2 + this.rand.nextDouble() * (var6.maxY - var6.minY - (double)(var7 * 2.0F)) + (double)var7 + var6.minY; + double var12 = (double)var3 + this.rand.nextDouble() * (var6.maxZ - var6.minZ - (double)(var7 * 2.0F)) + (double)var7 + var6.minZ; + if(var4 == 0) { + var10 = (double)var2 + var6.minY - (double)var7; + } + + if(var4 == 1) { + var10 = (double)var2 + var6.maxY + (double)var7; + } + + if(var4 == 2) { + var12 = (double)var3 + var6.minZ - (double)var7; + } + + if(var4 == 3) { + var12 = (double)var3 + var6.maxZ + (double)var7; + } + + if(var4 == 4) { + var8 = (double)var1 + var6.field_370_bf - (double)var7; + } + + if(var4 == 5) { + var8 = (double)var1 + var6.maxX + (double)var7; + } + + this.func_1192_a((new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6)).func_4041_a(var1, var2, var3).func_407_b(0.2F).func_405_d(0.6F)); + } + } + + public String func_1190_b() { + return "" + (this.field_1728_b[0].size() + this.field_1728_b[1].size() + this.field_1728_b[2].size()); + } +} diff --git a/src/main/java/net/minecraft/src/Entity.java b/src/main/java/net/minecraft/src/Entity.java new file mode 100644 index 0000000..c67ea1f --- /dev/null +++ b/src/main/java/net/minecraft/src/Entity.java @@ -0,0 +1,901 @@ +package net.minecraft.src; + +import java.util.List; +import java.util.Random; + +public abstract class Entity { + private static int field_864_a = 0; + public int field_620_ab = field_864_a++; + public double field_619_ac = 1.0D; + public boolean field_618_ad = false; + public Entity riddenByEntity; + public Entity ridingEntity; + public World worldObj; + public double prevPosX; + public double prevPosY; + public double prevPosZ; + public double posX; + public double posY; + public double posZ; + public double motionX; + public double motionY; + public double motionZ; + public float rotationYaw; + public float rotationPitch; + public float prevRotationYaw; + public float prevRotationPitch; + public final AxisAlignedBB boundingBox = AxisAlignedBB.getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + public boolean onGround = false; + public boolean field_9297_aI; + public boolean field_9296_aJ; + public boolean field_9295_aK = false; + public boolean field_9294_aL = false; + public boolean field_9293_aM = true; + public boolean isDead = false; + public float yOffset = 0.0F; + public float width = 0.6F; + public float height = 1.8F; + public float field_9291_aR = 0.0F; + public float field_9290_aS = 0.0F; + protected boolean entityWalks = true; + protected float fallDistance = 0.0F; + private int field_863_b = 1; + public double lastTickPosX; + public double lastTickPosY; + public double lastTickPosZ; + public float field_9287_aY = 0.0F; + public float field_9286_aZ = 0.0F; + public boolean field_9314_ba = false; + public float field_632_aO = 0.0F; + public boolean field_9313_bc = false; + protected Random rand = new Random(); + public int field_9311_be = 0; + public int field_9310_bf = 1; + public int fire = 0; + protected int field_9308_bh = 300; + protected boolean field_9307_bi = false; + public int field_9306_bj = 0; + public int air = 300; + private boolean field_862_c = true; + public String skinUrl; + protected boolean isImmuneToFire = false; + private double minecartType; + private double field_667_e; + public boolean field_621_aZ = false; + public int field_657_ba; + public int field_656_bb; + public int field_654_bc; + public int field_9303_br; + public int field_9302_bs; + public int field_9301_bt; + public boolean field_9300_bu; + public boolean field_9299_bv; + public boolean field_12240_bw; + + public Entity(World var1) { + this.worldObj = var1; + this.setPosition(0.0D, 0.0D, 0.0D); + } + + public boolean equals(Object var1) { + return var1 instanceof Entity ? ((Entity)var1).field_620_ab == this.field_620_ab : false; + } + + public int hashCode() { + return this.field_620_ab; + } + + protected void preparePlayerToSpawn() { + if(this.worldObj != null) { + while(this.posY > 0.0D) { + this.setPosition(this.posX, this.posY, this.posZ); + if(this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0) { + break; + } + + ++this.posY; + } + + this.motionX = this.motionY = this.motionZ = 0.0D; + this.rotationPitch = 0.0F; + } + } + + public void setEntityDead() { + this.isDead = true; + } + + protected void setSize(float var1, float var2) { + this.width = var1; + this.height = var2; + } + + protected void setRotation(float var1, float var2) { + this.rotationYaw = var1; + this.rotationPitch = var2; + } + + public void setPosition(double var1, double var3, double var5) { + this.posX = var1; + this.posY = var3; + this.posZ = var5; + float var7 = this.width / 2.0F; + float var8 = this.height; + this.boundingBox.setBounds(var1 - (double)var7, var3 - (double)this.yOffset + (double)this.field_9287_aY, var5 - (double)var7, var1 + (double)var7, var3 - (double)this.yOffset + (double)this.field_9287_aY + (double)var8, var5 + (double)var7); + } + + public void func_346_d(float var1, float var2) { + float var3 = this.rotationPitch; + float var4 = this.rotationYaw; + this.rotationYaw = (float)((double)this.rotationYaw + (double)var1 * 0.15D); + this.rotationPitch = (float)((double)this.rotationPitch - (double)var2 * 0.15D); + if(this.rotationPitch < -90.0F) { + this.rotationPitch = -90.0F; + } + + if(this.rotationPitch > 90.0F) { + this.rotationPitch = 90.0F; + } + + this.prevRotationPitch += this.rotationPitch - var3; + this.prevRotationYaw += this.rotationYaw - var4; + } + + public void onUpdate() { + this.func_391_y(); + } + + public void func_391_y() { + if(this.ridingEntity != null && this.ridingEntity.isDead) { + this.ridingEntity = null; + } + + ++this.field_9311_be; + this.field_9291_aR = this.field_9290_aS; + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + if(this.handleWaterMovement()) { + if(!this.field_9307_bi && !this.field_862_c) { + float var1 = MathHelper.sqrt_double(this.motionX * this.motionX * (double)0.2F + this.motionY * this.motionY + this.motionZ * this.motionZ * (double)0.2F) * 0.2F; + if(var1 > 1.0F) { + var1 = 1.0F; + } + + this.worldObj.playSoundAtEntity(this, "random.splash", var1, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F); + float var2 = (float)MathHelper.floor_double(this.boundingBox.minY); + + int var3; + float var4; + float var5; + for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) { + var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("bubble", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ); + } + + for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) { + var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("splash", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY, this.motionZ); + } + } + + this.fallDistance = 0.0F; + this.field_9307_bi = true; + this.fire = 0; + } else { + this.field_9307_bi = false; + } + + if(this.fire > 0) { + if(this.isImmuneToFire) { + this.fire -= 4; + if(this.fire < 0) { + this.fire = 0; + } + } else { + if(this.fire % 20 == 0) { + this.canAttackEntity((Entity)null, 1); + } + + --this.fire; + } + } + + if(this.handleLavaMovement()) { + this.func_4038_J(); + } + + if(this.posY < -64.0D) { + this.func_4034_G(); + } + + this.field_862_c = false; + } + + protected void func_4038_J() { + if(!this.isImmuneToFire) { + this.canAttackEntity((Entity)null, 4); + this.fire = 600; + } + + } + + protected void func_4034_G() { + this.setEntityDead(); + } + + public boolean func_403_b(double var1, double var3, double var5) { + AxisAlignedBB var7 = this.boundingBox.getOffsetBoundingBox(var1, var3, var5); + List var8 = this.worldObj.getCollidingBoundingBoxes(this, var7); + return var8.size() > 0 ? false : !this.worldObj.getIsAnyLiquid(var7); + } + + public void moveEntity(double var1, double var3, double var5) { + if(this.field_9314_ba) { + this.boundingBox.offset(var1, var3, var5); + this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D; + this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.field_9287_aY; + this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D; + } else { + double var7 = this.posX; + double var9 = this.posZ; + double var11 = var1; + double var13 = var3; + double var15 = var5; + AxisAlignedBB var17 = this.boundingBox.copy(); + boolean var18 = this.onGround && this.func_381_o(); + if(var18) { + double var19; + for(var19 = 0.05D; var1 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(var1, -1.0D, 0.0D)).size() == 0; var11 = var1) { + if(var1 < var19 && var1 >= -var19) { + var1 = 0.0D; + } else if(var1 > 0.0D) { + var1 -= var19; + } else { + var1 += var19; + } + } + + for(; var5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(0.0D, -1.0D, var5)).size() == 0; var15 = var5) { + if(var5 < var19 && var5 >= -var19) { + var5 = 0.0D; + } else if(var5 > 0.0D) { + var5 -= var19; + } else { + var5 += var19; + } + } + } + + List var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var1, var3, var5)); + + for(int var20 = 0; var20 < var35.size(); ++var20) { + var3 = ((AxisAlignedBB)var35.get(var20)).func_1172_b(this.boundingBox, var3); + } + + this.boundingBox.offset(0.0D, var3, 0.0D); + if(!this.field_9293_aM && var13 != var3) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + boolean var36 = this.onGround || var13 != var3 && var13 < 0.0D; + + int var21; + for(var21 = 0; var21 < var35.size(); ++var21) { + var1 = ((AxisAlignedBB)var35.get(var21)).func_1163_a(this.boundingBox, var1); + } + + this.boundingBox.offset(var1, 0.0D, 0.0D); + if(!this.field_9293_aM && var11 != var1) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + for(var21 = 0; var21 < var35.size(); ++var21) { + var5 = ((AxisAlignedBB)var35.get(var21)).func_1162_c(this.boundingBox, var5); + } + + this.boundingBox.offset(0.0D, 0.0D, var5); + if(!this.field_9293_aM && var15 != var5) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + double var23; + int var28; + double var37; + if(this.field_9286_aZ > 0.0F && var36 && this.field_9287_aY < 0.05F && (var11 != var1 || var15 != var5)) { + var37 = var1; + var23 = var3; + double var25 = var5; + var1 = var11; + var3 = (double)this.field_9286_aZ; + var5 = var15; + AxisAlignedBB var27 = this.boundingBox.copy(); + this.boundingBox.setBB(var17); + var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var11, var3, var15)); + + for(var28 = 0; var28 < var35.size(); ++var28) { + var3 = ((AxisAlignedBB)var35.get(var28)).func_1172_b(this.boundingBox, var3); + } + + this.boundingBox.offset(0.0D, var3, 0.0D); + if(!this.field_9293_aM && var13 != var3) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + for(var28 = 0; var28 < var35.size(); ++var28) { + var1 = ((AxisAlignedBB)var35.get(var28)).func_1163_a(this.boundingBox, var1); + } + + this.boundingBox.offset(var1, 0.0D, 0.0D); + if(!this.field_9293_aM && var11 != var1) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + for(var28 = 0; var28 < var35.size(); ++var28) { + var5 = ((AxisAlignedBB)var35.get(var28)).func_1162_c(this.boundingBox, var5); + } + + this.boundingBox.offset(0.0D, 0.0D, var5); + if(!this.field_9293_aM && var15 != var5) { + var5 = 0.0D; + var3 = var5; + var1 = var5; + } + + if(var37 * var37 + var25 * var25 >= var1 * var1 + var5 * var5) { + var1 = var37; + var3 = var23; + var5 = var25; + this.boundingBox.setBB(var27); + } else { + this.field_9287_aY = (float)((double)this.field_9287_aY + 0.5D); + } + } + + this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D; + this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.field_9287_aY; + this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D; + this.field_9297_aI = var11 != var1 || var15 != var5; + this.field_9296_aJ = var13 != var3; + this.onGround = var13 != var3 && var13 < 0.0D; + this.field_9295_aK = this.field_9297_aI || this.field_9296_aJ; + this.func_9279_a(var3, this.onGround); + if(var11 != var1) { + this.motionX = 0.0D; + } + + if(var13 != var3) { + this.motionY = 0.0D; + } + + if(var15 != var5) { + this.motionZ = 0.0D; + } + + var37 = this.posX - var7; + var23 = this.posZ - var9; + int var26; + int var38; + int var40; + if(this.entityWalks && !var18) { + this.field_9290_aS = (float)((double)this.field_9290_aS + (double)MathHelper.sqrt_double(var37 * var37 + var23 * var23) * 0.6D); + var38 = MathHelper.floor_double(this.posX); + var26 = MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset); + var40 = MathHelper.floor_double(this.posZ); + var28 = this.worldObj.getBlockId(var38, var26, var40); + if(this.field_9290_aS > (float)this.field_863_b && var28 > 0) { + ++this.field_863_b; + StepSound var29 = Block.blocksList[var28].stepSound; + if(this.worldObj.getBlockId(var38, var26 + 1, var40) == Block.snow.blockID) { + var29 = Block.snow.stepSound; + this.worldObj.playSoundAtEntity(this, var29.func_1145_d(), var29.func_1147_b() * 0.15F, var29.func_1144_c()); + } else if(!Block.blocksList[var28].blockMaterial.getIsLiquid()) { + this.worldObj.playSoundAtEntity(this, var29.func_1145_d(), var29.func_1147_b() * 0.15F, var29.func_1144_c()); + } + + Block.blocksList[var28].onEntityWalking(this.worldObj, var38, var26, var40, this); + } + } + + var38 = MathHelper.floor_double(this.boundingBox.minX); + var26 = MathHelper.floor_double(this.boundingBox.minY); + var40 = MathHelper.floor_double(this.boundingBox.minZ); + var28 = MathHelper.floor_double(this.boundingBox.maxX); + int var41 = MathHelper.floor_double(this.boundingBox.maxY); + int var30 = MathHelper.floor_double(this.boundingBox.maxZ); + + for(int var31 = var38; var31 <= var28; ++var31) { + for(int var32 = var26; var32 <= var41; ++var32) { + for(int var33 = var40; var33 <= var30; ++var33) { + int var34 = this.worldObj.getBlockId(var31, var32, var33); + if(var34 > 0) { + Block.blocksList[var34].onEntityCollidedWithBlock(this.worldObj, var31, var32, var33, this); + } + } + } + } + + this.field_9287_aY *= 0.4F; + boolean var39 = this.handleWaterMovement(); + if(this.worldObj.isBoundingBoxBurning(this.boundingBox)) { + this.func_355_a(1); + if(!var39) { + ++this.fire; + if(this.fire == 0) { + this.fire = 300; + } + } + } else if(this.fire <= 0) { + this.fire = -this.field_9310_bf; + } + + if(var39 && this.fire > 0) { + this.worldObj.playSoundAtEntity(this, "random.fizz", 0.7F, 1.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F); + this.fire = -this.field_9310_bf; + } + + } + } + + protected void func_9279_a(double var1, boolean var3) { + if(var3) { + if(this.fallDistance > 0.0F) { + this.fall(this.fallDistance); + this.fallDistance = 0.0F; + } + } else if(var1 < 0.0D) { + this.fallDistance = (float)((double)this.fallDistance - var1); + } + + } + + public boolean func_381_o() { + return false; + } + + public AxisAlignedBB func_372_f_() { + return null; + } + + protected void func_355_a(int var1) { + if(!this.isImmuneToFire) { + this.canAttackEntity((Entity)null, var1); + } + + } + + protected void fall(float var1) { + } + + public boolean handleWaterMovement() { + return this.worldObj.func_682_a(this.boundingBox.expands(0.0D, (double)-0.4F, 0.0D), Material.water, this); + } + + public boolean isInsideOfMaterial(Material var1) { + double var2 = this.posY + (double)this.func_373_s(); + int var4 = MathHelper.floor_double(this.posX); + int var5 = MathHelper.floor_float((float)MathHelper.floor_double(var2)); + int var6 = MathHelper.floor_double(this.posZ); + int var7 = this.worldObj.getBlockId(var4, var5, var6); + if(var7 != 0 && Block.blocksList[var7].blockMaterial == var1) { + float var8 = BlockFluids.func_288_b(this.worldObj.getBlockMetadata(var4, var5, var6)) - 1.0F / 9.0F; + float var9 = (float)(var5 + 1) - var8; + return var2 < (double)var9; + } else { + return false; + } + } + + public float func_373_s() { + return 0.0F; + } + + public boolean handleLavaMovement() { + return this.worldObj.func_689_a(this.boundingBox.expands(0.0D, (double)-0.4F, 0.0D), Material.lava); + } + + public void func_351_a(float var1, float var2, float var3) { + float var4 = MathHelper.sqrt_float(var1 * var1 + var2 * var2); + if(var4 >= 0.01F) { + if(var4 < 1.0F) { + var4 = 1.0F; + } + + var4 = var3 / var4; + var1 *= var4; + var2 *= var4; + float var5 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F); + float var6 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F); + this.motionX += (double)(var1 * var6 - var2 * var5); + this.motionZ += (double)(var2 * var6 + var1 * var5); + } + } + + public float getEntityBrightness(float var1) { + int var2 = MathHelper.floor_double(this.posX); + double var3 = (this.boundingBox.maxY - this.boundingBox.minY) * 0.66D; + int var5 = MathHelper.floor_double(this.posY - (double)this.yOffset + var3); + int var6 = MathHelper.floor_double(this.posZ); + return this.worldObj.getLightBrightness(var2, var5, var6); + } + + public void setWorld(World var1) { + this.worldObj = var1; + } + + public void setPositionAndRotation(double var1, double var3, double var5, float var7, float var8) { + this.prevPosX = this.posX = var1; + this.prevPosY = this.posY = var3; + this.prevPosZ = this.posZ = var5; + this.prevRotationYaw = this.rotationYaw = var7; + this.prevRotationPitch = this.rotationPitch = var8; + this.field_9287_aY = 0.0F; + double var9 = (double)(this.prevRotationYaw - var7); + if(var9 < -180.0D) { + this.prevRotationYaw += 360.0F; + } + + if(var9 >= 180.0D) { + this.prevRotationYaw -= 360.0F; + } + + this.setPosition(this.posX, this.posY, this.posZ); + this.setRotation(var7, var8); + } + + public void setLocationAndAngles(double var1, double var3, double var5, float var7, float var8) { + this.prevPosX = this.posX = var1; + this.prevPosY = this.posY = var3 + (double)this.yOffset; + this.prevPosZ = this.posZ = var5; + this.rotationYaw = var7; + this.rotationPitch = var8; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public float getDistanceToEntity(Entity var1) { + float var2 = (float)(this.posX - var1.posX); + float var3 = (float)(this.posY - var1.posY); + float var4 = (float)(this.posZ - var1.posZ); + return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4); + } + + public double getDistanceSq(double var1, double var3, double var5) { + double var7 = this.posX - var1; + double var9 = this.posY - var3; + double var11 = this.posZ - var5; + return var7 * var7 + var9 * var9 + var11 * var11; + } + + public double getDistance(double var1, double var3, double var5) { + double var7 = this.posX - var1; + double var9 = this.posY - var3; + double var11 = this.posZ - var5; + return (double)MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + + public double getDistanceSqToEntity(Entity var1) { + double var2 = this.posX - var1.posX; + double var4 = this.posY - var1.posY; + double var6 = this.posZ - var1.posZ; + return var2 * var2 + var4 * var4 + var6 * var6; + } + + public void onCollideWithPlayer(EntityPlayer var1) { + } + + public void applyEntityCollision(Entity var1) { + if(var1.riddenByEntity != this && var1.ridingEntity != this) { + double var2 = var1.posX - this.posX; + double var4 = var1.posZ - this.posZ; + double var6 = MathHelper.abs_max(var2, var4); + if(var6 >= (double)0.01F) { + var6 = (double)MathHelper.sqrt_double(var6); + var2 /= var6; + var4 /= var6; + double var8 = 1.0D / var6; + if(var8 > 1.0D) { + var8 = 1.0D; + } + + var2 *= var8; + var4 *= var8; + var2 *= (double)0.05F; + var4 *= (double)0.05F; + var2 *= (double)(1.0F - this.field_632_aO); + var4 *= (double)(1.0F - this.field_632_aO); + this.addVelocity(-var2, 0.0D, -var4); + var1.addVelocity(var2, 0.0D, var4); + } + + } + } + + public void addVelocity(double var1, double var3, double var5) { + this.motionX += var1; + this.motionY += var3; + this.motionZ += var5; + } + + protected void func_9281_M() { + this.field_9294_aL = true; + } + + public boolean canAttackEntity(Entity var1, int var2) { + this.func_9281_M(); + return false; + } + + public boolean canBeCollidedWith() { + return false; + } + + public boolean canBePushed() { + return false; + } + + public void addToPlayerScore(Entity var1, int var2) { + } + + public boolean func_390_a(Vec3D var1) { + double var2 = this.posX - var1.xCoord; + double var4 = this.posY - var1.yCoord; + double var6 = this.posZ - var1.zCoord; + double var8 = var2 * var2 + var4 * var4 + var6 * var6; + return this.func_384_a(var8); + } + + public boolean func_384_a(double var1) { + double var3 = this.boundingBox.getAverageEdgeLength(); + var3 *= 64.0D * this.field_619_ac; + return var1 < var3 * var3; + } + + public String getEntityTexture() { + return null; + } + + public boolean func_358_c(NBTTagCompound var1) { + String var2 = this.getEntityString(); + if(!this.isDead && var2 != null) { + var1.setString("id", var2); + this.writeToNBT(var1); + return true; + } else { + return false; + } + } + + public void writeToNBT(NBTTagCompound var1) { + var1.setTag("Pos", this.func_375_a(new double[]{this.posX, this.posY, this.posZ})); + var1.setTag("Motion", this.func_375_a(new double[]{this.motionX, this.motionY, this.motionZ})); + var1.setTag("Rotation", this.func_377_a(new float[]{this.rotationYaw, this.rotationPitch})); + var1.setFloat("FallDistance", this.fallDistance); + var1.setShort("Fire", (short)this.fire); + var1.setShort("Air", (short)this.air); + var1.setBoolean("OnGround", this.onGround); + this.writeEntityToNBT(var1); + } + + public void readFromNBT(NBTTagCompound var1) { + NBTTagList var2 = var1.getTagList("Pos"); + NBTTagList var3 = var1.getTagList("Motion"); + NBTTagList var4 = var1.getTagList("Rotation"); + this.setPosition(0.0D, 0.0D, 0.0D); + this.motionX = ((NBTTagDouble)var3.tagAt(0)).doubleValue; + this.motionY = ((NBTTagDouble)var3.tagAt(1)).doubleValue; + this.motionZ = ((NBTTagDouble)var3.tagAt(2)).doubleValue; + this.prevPosX = this.lastTickPosX = this.posX = ((NBTTagDouble)var2.tagAt(0)).doubleValue; + this.prevPosY = this.lastTickPosY = this.posY = ((NBTTagDouble)var2.tagAt(1)).doubleValue; + this.prevPosZ = this.lastTickPosZ = this.posZ = ((NBTTagDouble)var2.tagAt(2)).doubleValue; + this.prevRotationYaw = this.rotationYaw = ((NBTTagFloat)var4.tagAt(0)).floatValue; + this.prevRotationPitch = this.rotationPitch = ((NBTTagFloat)var4.tagAt(1)).floatValue; + this.fallDistance = var1.getFloat("FallDistance"); + this.fire = var1.getShort("Fire"); + this.air = var1.getShort("Air"); + this.onGround = var1.getBoolean("OnGround"); + this.setPosition(this.posX, this.posY, this.posZ); + this.readEntityFromNBT(var1); + } + + protected final String getEntityString() { + return EntityList.getEntityString(this); + } + + protected abstract void readEntityFromNBT(NBTTagCompound var1); + + protected abstract void writeEntityToNBT(NBTTagCompound var1); + + protected NBTTagList func_375_a(double... var1) { + NBTTagList var2 = new NBTTagList(); + double[] var3 = var1; + int var4 = var1.length; + + for(int var5 = 0; var5 < var4; ++var5) { + double var6 = var3[var5]; + var2.setTag(new NBTTagDouble(var6)); + } + + return var2; + } + + protected NBTTagList func_377_a(float... var1) { + NBTTagList var2 = new NBTTagList(); + float[] var3 = var1; + int var4 = var1.length; + + for(int var5 = 0; var5 < var4; ++var5) { + float var6 = var3[var5]; + var2.setTag(new NBTTagFloat(var6)); + } + + return var2; + } + + public float func_392_h_() { + return this.height / 2.0F; + } + + public EntityItem dropItem(int var1, int var2) { + return this.dropItemWithOffset(var1, var2, 0.0F); + } + + public EntityItem dropItemWithOffset(int var1, int var2, float var3) { + EntityItem var4 = new EntityItem(this.worldObj, this.posX, this.posY + (double)var3, this.posZ, new ItemStack(var1, var2)); + var4.field_805_c = 10; + this.worldObj.entityJoinedWorld(var4); + return var4; + } + + public boolean isEntityAlive() { + return !this.isDead; + } + + public boolean func_345_I() { + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.posY + (double)this.func_373_s()); + int var3 = MathHelper.floor_double(this.posZ); + return this.worldObj.isBlockOpaqueCube(var1, var2, var3); + } + + public boolean interact(EntityPlayer var1) { + return false; + } + + public AxisAlignedBB func_383_b_(Entity var1) { + return null; + } + + public void func_350_p() { + if(this.ridingEntity.isDead) { + this.ridingEntity = null; + } else { + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.onUpdate(); + this.ridingEntity.func_366_i_(); + this.field_667_e += (double)(this.ridingEntity.rotationYaw - this.ridingEntity.prevRotationYaw); + + for(this.minecartType += (double)(this.ridingEntity.rotationPitch - this.ridingEntity.prevRotationPitch); this.field_667_e >= 180.0D; this.field_667_e -= 360.0D) { + } + + while(this.field_667_e < -180.0D) { + this.field_667_e += 360.0D; + } + + while(this.minecartType >= 180.0D) { + this.minecartType -= 360.0D; + } + + while(this.minecartType < -180.0D) { + this.minecartType += 360.0D; + } + + double var1 = this.field_667_e * 0.5D; + double var3 = this.minecartType * 0.5D; + float var5 = 10.0F; + if(var1 > (double)var5) { + var1 = (double)var5; + } + + if(var1 < (double)(-var5)) { + var1 = (double)(-var5); + } + + if(var3 > (double)var5) { + var3 = (double)var5; + } + + if(var3 < (double)(-var5)) { + var3 = (double)(-var5); + } + + this.field_667_e -= var1; + this.minecartType -= var3; + this.rotationYaw = (float)((double)this.rotationYaw + var1); + this.rotationPitch = (float)((double)this.rotationPitch + var3); + } + } + + public void func_366_i_() { + this.riddenByEntity.setPosition(this.posX, this.posY + this.func_402_h() + this.riddenByEntity.func_388_v(), this.posZ); + } + + public double func_388_v() { + return (double)this.yOffset; + } + + public double func_402_h() { + return (double)this.height * 0.75D; + } + + public void mountEntity(Entity var1) { + this.minecartType = 0.0D; + this.field_667_e = 0.0D; + if(var1 == null) { + if(this.ridingEntity != null) { + this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch); + this.ridingEntity.riddenByEntity = null; + } + + this.ridingEntity = null; + } else if(this.ridingEntity == var1) { + this.ridingEntity.riddenByEntity = null; + this.ridingEntity = null; + this.setLocationAndAngles(var1.posX, var1.boundingBox.minY + (double)var1.height, var1.posZ, this.rotationYaw, this.rotationPitch); + } else { + if(this.ridingEntity != null) { + this.ridingEntity.riddenByEntity = null; + } + + if(var1.riddenByEntity != null) { + var1.riddenByEntity.ridingEntity = null; + } + + this.ridingEntity = var1; + var1.riddenByEntity = this; + } + } + + public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) { + this.setPosition(var1, var3, var5); + this.setRotation(var7, var8); + } + + public float func_4035_j_() { + return 0.1F; + } + + public Vec3D func_4037_H() { + return null; + } + + public void func_4039_q() { + } + + public void setVelocity(double var1, double var3, double var5) { + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + } + + public void func_9282_a(byte var1) { + } + + public void func_9280_g() { + } +} diff --git a/src/main/java/net/minecraft/src/EntityAnimals.java b/src/main/java/net/minecraft/src/EntityAnimals.java new file mode 100644 index 0000000..85e2824 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityAnimals.java @@ -0,0 +1,30 @@ +package net.minecraft.src; + +public abstract class EntityAnimals extends EntityCreature { + public EntityAnimals(World var1) { + super(var1); + } + + protected float func_439_a(int var1, int var2, int var3) { + return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID ? 10.0F : this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + public boolean getCanSpawnHere() { + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.boundingBox.minY); + int var3 = MathHelper.floor_double(this.posZ); + return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID && this.worldObj.getBlockLightValue(var1, var2, var3) > 8 && super.getCanSpawnHere(); + } + + public int func_421_b() { + return 120; + } +} diff --git a/src/main/java/net/minecraft/src/EntityArrow.java b/src/main/java/net/minecraft/src/EntityArrow.java new file mode 100644 index 0000000..e9e3aae --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityArrow.java @@ -0,0 +1,248 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityArrow extends Entity { + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private int inTile = 0; + private boolean inGround = false; + public int arrowShake = 0; + public EntityLiving field_682_g; + private int field_681_h; + private int field_680_i = 0; + + public EntityArrow(World var1) { + super(var1); + this.setSize(0.5F, 0.5F); + } + + public EntityArrow(World var1, double var2, double var4, double var6) { + super(var1); + this.setSize(0.5F, 0.5F); + this.setPosition(var2, var4, var6); + this.yOffset = 0.0F; + } + + public EntityArrow(World var1, EntityLiving var2) { + super(var1); + this.field_682_g = var2; + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.func_373_s(), var2.posZ, var2.rotationYaw, var2.rotationPitch); + this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.posY -= (double)0.1F; + this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); + this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI)); + this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); + this.func_408_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F); + } + + public void func_408_a(double var1, double var3, double var5, float var7, float var8) { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= (double)var9; + var3 /= (double)var9; + var5 /= (double)var9; + var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var1 *= (double)var7; + var3 *= (double)var7; + var5 *= (double)var7; + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI)); + this.field_681_h = 0; + } + + public void setVelocity(double var1, double var3, double var5) { + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float var7 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var7) * 180.0D / (double)((float)Math.PI)); + } + + } + + public void onUpdate() { + super.onUpdate(); + if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var1) * 180.0D / (double)((float)Math.PI)); + } + + if(this.arrowShake > 0) { + --this.arrowShake; + } + + if(this.inGround) { + int var15 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile); + if(var15 == this.inTile) { + ++this.field_681_h; + if(this.field_681_h == 1200) { + this.setEntityDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.field_681_h = 0; + this.field_680_i = 0; + } else { + ++this.field_680_i; + } + + Vec3D var16 = Vec3D.createVector(this.posX, this.posY, this.posZ); + Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var16, var2); + var16 = Vec3D.createVector(this.posX, this.posY, this.posZ); + var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + if(var3 != null) { + var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord); + } + + Entity var4 = null; + List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D)); + double var6 = 0.0D; + + float var10; + for(int var8 = 0; var8 < var5.size(); ++var8) { + Entity var9 = (Entity)var5.get(var8); + if(var9.canBeCollidedWith() && (var9 != this.field_682_g || this.field_680_i >= 5)) { + var10 = 0.3F; + AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10); + MovingObjectPosition var12 = var11.func_1169_a(var16, var2); + if(var12 != null) { + double var13 = var16.distanceTo(var12.hitVec); + if(var13 < var6 || var6 == 0.0D) { + var4 = var9; + var6 = var13; + } + } + } + } + + if(var4 != null) { + var3 = new MovingObjectPosition(var4); + } + + float var17; + if(var3 != null) { + if(var3.entityHit != null) { + if(var3.entityHit.canAttackEntity(this.field_682_g, 4)) { + this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + this.setEntityDead(); + } else { + this.motionX *= (double)-0.1F; + this.motionY *= (double)-0.1F; + this.motionZ *= (double)-0.1F; + this.rotationYaw += 180.0F; + this.prevRotationYaw += 180.0F; + this.field_680_i = 0; + } + } else { + this.xTile = var3.blockX; + this.yTile = var3.blockY; + this.zTile = var3.blockZ; + this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile); + this.motionX = (double)((float)(var3.hitVec.xCoord - this.posX)); + this.motionY = (double)((float)(var3.hitVec.yCoord - this.posY)); + this.motionZ = (double)((float)(var3.hitVec.zCoord - this.posZ)); + var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / (double)var17 * (double)0.05F; + this.posY -= this.motionY / (double)var17 * (double)0.05F; + this.posZ -= this.motionZ / (double)var17 * (double)0.05F; + this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + this.inGround = true; + this.arrowShake = 7; + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI)); + + for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float var18 = 0.99F; + var10 = 0.03F; + if(this.handleWaterMovement()) { + for(int var19 = 0; var19 < 4; ++var19) { + float var20 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var20, this.posY - this.motionY * (double)var20, this.posZ - this.motionZ * (double)var20, this.motionX, this.motionY, this.motionZ); + } + + var18 = 0.8F; + } + + this.motionX *= (double)var18; + this.motionY *= (double)var18; + this.motionZ *= (double)var18; + this.motionY -= (double)var10; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("xTile", (short)this.xTile); + var1.setShort("yTile", (short)this.yTile); + var1.setShort("zTile", (short)this.zTile); + var1.setByte("inTile", (byte)this.inTile); + var1.setByte("shake", (byte)this.arrowShake); + var1.setByte("inGround", (byte)(this.inGround ? 1 : 0)); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.xTile = var1.getShort("xTile"); + this.yTile = var1.getShort("yTile"); + this.zTile = var1.getShort("zTile"); + this.inTile = var1.getByte("inTile") & 255; + this.arrowShake = var1.getByte("shake") & 255; + this.inGround = var1.getByte("inGround") == 1; + } + + public void onCollideWithPlayer(EntityPlayer var1) { + //if(!this.worldObj.multiplayerWorld) { + if(this.inGround && this.field_682_g == var1 && this.arrowShake <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow.shiftedIndex, 1))) { + this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + var1.func_443_a_(this, 1); + this.setEntityDead(); + } + + //} + } + + public float func_392_h_() { + return 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/EntityBoat.java b/src/main/java/net/minecraft/src/EntityBoat.java new file mode 100644 index 0000000..db99230 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityBoat.java @@ -0,0 +1,319 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityBoat extends Entity { + public int field_807_a; + public int field_806_b; + public int field_808_c; + private int field_9394_d; + private double field_9393_e; + private double field_9392_f; + private double field_9391_g; + private double field_9390_h; + private double field_9389_i; + private double field_9388_j; + private double field_9387_k; + private double field_9386_l; + + public EntityBoat(World var1) { + super(var1); + this.field_807_a = 0; + this.field_806_b = 0; + this.field_808_c = 1; + this.field_618_ad = true; + this.setSize(1.5F, 0.6F); + this.yOffset = this.height / 2.0F; + this.entityWalks = false; + } + + public AxisAlignedBB func_383_b_(Entity var1) { + return var1.boundingBox; + } + + public AxisAlignedBB func_372_f_() { + return this.boundingBox; + } + + public boolean canBePushed() { + return true; + } + + public EntityBoat(World var1, double var2, double var4, double var6) { + this(var1); + this.setPosition(var2, var4 + (double)this.yOffset, var6); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.prevPosX = var2; + this.prevPosY = var4; + this.prevPosZ = var6; + } + + public double func_402_h() { + return (double)this.height * 0.0D - (double)0.3F; + } + + public boolean canAttackEntity(Entity var1, int var2) { + if(!this.isDead) { + this.field_808_c = -this.field_808_c; + this.field_806_b = 10; + this.field_807_a += var2 * 10; + this.func_9281_M(); + if(this.field_807_a > 40) { + int var3; + for(var3 = 0; var3 < 3; ++var3) { + this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F); + } + + for(var3 = 0; var3 < 2; ++var3) { + this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F); + } + + this.setEntityDead(); + } + + return true; + } else { + return true; + } + } + + public void func_9280_g() { + this.field_808_c = -this.field_808_c; + this.field_806_b = 10; + this.field_807_a += this.field_807_a * 10; + } + + public boolean canBeCollidedWith() { + return !this.isDead; + } + + public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) { + this.field_9393_e = var1; + this.field_9392_f = var3; + this.field_9391_g = var5; + this.field_9390_h = (double)var7; + this.field_9389_i = (double)var8; + this.field_9394_d = var9 + 4; + this.motionX = this.field_9388_j; + this.motionY = this.field_9387_k; + this.motionZ = this.field_9386_l; + } + + public void setVelocity(double var1, double var3, double var5) { + this.field_9388_j = this.motionX = var1; + this.field_9387_k = this.motionY = var3; + this.field_9386_l = this.motionZ = var5; + } + + public void onUpdate() { + super.onUpdate(); + if(this.field_806_b > 0) { + --this.field_806_b; + } + + if(this.field_807_a > 0) { + --this.field_807_a; + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + byte var1 = 5; + double var2 = 0.0D; + + for(int var4 = 0; var4 < var1; ++var4) { + double var5 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 0) / (double)var1 - 0.125D; + double var7 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 1) / (double)var1 - 0.125D; + AxisAlignedBB var9 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var5, this.boundingBox.minZ, this.boundingBox.maxX, var7, this.boundingBox.maxZ); + if(this.worldObj.func_707_b(var9, Material.water)) { + var2 += 1.0D / (double)var1; + } + } + + double var6; + double var8; + double var10; + double var23; + //if(this.worldObj.multiplayerWorld) { + //if(this.field_9394_d > 0) { + //var23 = this.posX + (this.field_9393_e - this.posX) / (double)this.field_9394_d; + //var6 = this.posY + (this.field_9392_f - this.posY) / (double)this.field_9394_d; + //var8 = this.posZ + (this.field_9391_g - this.posZ) / (double)this.field_9394_d; + + //for(var10 = this.field_9390_h - (double)this.rotationYaw; var10 < -180.0D; var10 += 360.0D) { + //} + + //while(var10 >= 180.0D) { + //var10 -= 360.0D; + //} + + //this.rotationYaw = (float)((double)this.rotationYaw + var10 / (double)this.field_9394_d); + //this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9389_i - (double)this.rotationPitch) / (double)this.field_9394_d); + //--this.field_9394_d; + //this.setPosition(var23, var6, var8); + //this.setRotation(this.rotationYaw, this.rotationPitch); + //} else { + //var23 = this.posX + this.motionX; + //var6 = this.posY + this.motionY; + //var8 = this.posZ + this.motionZ; + //this.setPosition(var23, var6, var8); + //if(this.onGround) { + //this.motionX *= 0.5D; + //this.motionY *= 0.5D; + //this.motionZ *= 0.5D; + //} + + //this.motionX *= (double)0.99F; + //this.motionY *= (double)0.95F; + //this.motionZ *= (double)0.99F; + //} + + //} else { + var23 = var2 * 2.0D - 1.0D; + this.motionY += (double)0.04F * var23; + if(this.riddenByEntity != null) { + this.motionX += this.riddenByEntity.motionX * 0.2D; + this.motionZ += this.riddenByEntity.motionZ * 0.2D; + } + + var6 = 0.4D; + if(this.motionX < -var6) { + this.motionX = -var6; + } + + if(this.motionX > var6) { + this.motionX = var6; + } + + if(this.motionZ < -var6) { + this.motionZ = -var6; + } + + if(this.motionZ > var6) { + this.motionZ = var6; + } + + if(this.onGround) { + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + var8 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + double var12; + if(var8 > 0.15D) { + var10 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D); + var12 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D); + + for(int var14 = 0; (double)var14 < 1.0D + var8 * 60.0D; ++var14) { + double var15 = (double)(this.rand.nextFloat() * 2.0F - 1.0F); + double var17 = (double)(this.rand.nextInt(2) * 2 - 1) * 0.7D; + double var19; + double var21; + if(this.rand.nextBoolean()) { + var19 = this.posX - var10 * var15 * 0.8D + var12 * var17; + var21 = this.posZ - var12 * var15 * 0.8D - var10 * var17; + this.worldObj.spawnParticle("splash", var19, this.posY - 0.125D, var21, this.motionX, this.motionY, this.motionZ); + } else { + var19 = this.posX + var10 + var12 * var15 * 0.7D; + var21 = this.posZ + var12 - var10 * var15 * 0.7D; + this.worldObj.spawnParticle("splash", var19, this.posY - 0.125D, var21, this.motionX, this.motionY, this.motionZ); + } + } + } + + if(this.field_9297_aI && var8 > 0.15D) { + //if(!this.worldObj.multiplayerWorld) { + this.setEntityDead(); + + int var24; + for(var24 = 0; var24 < 3; ++var24) { + this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F); + } + + for(var24 = 0; var24 < 2; ++var24) { + this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F); + } + //} + } else { + this.motionX *= (double)0.99F; + this.motionY *= (double)0.95F; + this.motionZ *= (double)0.99F; + } + + this.rotationPitch = 0.0F; + var10 = (double)this.rotationYaw; + var12 = this.prevPosX - this.posX; + double var25 = this.prevPosZ - this.posZ; + if(var12 * var12 + var25 * var25 > 0.001D) { + var10 = (double)((float)(Math.atan2(var25, var12) * 180.0D / Math.PI)); + } + + double var16; + for(var16 = var10 - (double)this.rotationYaw; var16 >= 180.0D; var16 -= 360.0D) { + } + + while(var16 < -180.0D) { + var16 += 360.0D; + } + + if(var16 > 20.0D) { + var16 = 20.0D; + } + + if(var16 < -20.0D) { + var16 = -20.0D; + } + + this.rotationYaw = (float)((double)this.rotationYaw + var16); + this.setRotation(this.rotationYaw, this.rotationPitch); + List var18 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F)); + if(var18 != null && var18.size() > 0) { + for(int var26 = 0; var26 < var18.size(); ++var26) { + Entity var20 = (Entity)var18.get(var26); + if(var20 != this.riddenByEntity && var20.canBePushed() && var20 instanceof EntityBoat) { + var20.applyEntityCollision(this); + } + } + } + + if(this.riddenByEntity != null && this.riddenByEntity.isDead) { + this.riddenByEntity = null; + } + + //} + } + + public void func_366_i_() { + if(this.riddenByEntity != null) { + double var1 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D; + double var3 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D; + this.riddenByEntity.setPosition(this.posX + var1, this.posY + this.func_402_h() + this.riddenByEntity.func_388_v(), this.posZ + var3); + } + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + } + + public float func_392_h_() { + return 0.0F; + } + + public boolean interact(EntityPlayer var1) { + if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) { + return true; + } else { + //if(!this.worldObj.multiplayerWorld) { + var1.mountEntity(this); + //} + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/EntityBubbleFX.java b/src/main/java/net/minecraft/src/EntityBubbleFX.java new file mode 100644 index 0000000..65cc2b8 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityBubbleFX.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +public class EntityBubbleFX extends EntityFX { + public EntityBubbleFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1, var2, var4, var6, var8, var10, var12); + this.field_663_i = 1.0F; + this.field_662_j = 1.0F; + this.field_661_k = 1.0F; + this.field_670_b = 32; + this.setSize(0.02F, 0.02F); + this.field_665_g *= this.rand.nextFloat() * 0.6F + 0.2F; + this.motionX = var8 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F); + this.motionY = var10 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F); + this.motionZ = var12 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F); + this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY += 0.002D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.85F; + this.motionY *= (double)0.85F; + this.motionZ *= (double)0.85F; + if(this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) != Material.water) { + this.setEntityDead(); + } + + if(this.field_666_f-- <= 0) { + this.setEntityDead(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityChicken.java b/src/main/java/net/minecraft/src/EntityChicken.java new file mode 100644 index 0000000..a7d2776 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityChicken.java @@ -0,0 +1,77 @@ +package net.minecraft.src; + +public class EntityChicken extends EntityAnimals { + public boolean field_753_a = false; + public float field_752_b = 0.0F; + public float field_758_c = 0.0F; + public float field_757_d; + public float field_756_e; + public float field_755_h = 1.0F; + public int timeUntilNextEgg; + + public EntityChicken(World var1) { + super(var1); + this.texture = "/mob/chicken.png"; + this.setSize(0.3F, 0.4F); + this.health = 4; + this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000; + } + + public void onLivingUpdate() { + super.onLivingUpdate(); + this.field_756_e = this.field_752_b; + this.field_757_d = this.field_758_c; + this.field_758_c = (float)((double)this.field_758_c + (double)(this.onGround ? -1 : 4) * 0.3D); + if(this.field_758_c < 0.0F) { + this.field_758_c = 0.0F; + } + + if(this.field_758_c > 1.0F) { + this.field_758_c = 1.0F; + } + + if(!this.onGround && this.field_755_h < 1.0F) { + this.field_755_h = 1.0F; + } + + this.field_755_h = (float)((double)this.field_755_h * 0.9D); + if(!this.onGround && this.motionY < 0.0D) { + this.motionY *= 0.6D; + } + + this.field_752_b += this.field_755_h * 2.0F; + if(--this.timeUntilNextEgg <= 0) { + this.worldObj.playSoundAtEntity(this, "mob.chickenplop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + this.dropItem(Item.egg.shiftedIndex, 1); + this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000; + } + + } + + protected void fall(float var1) { + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected String getLivingSound() { + return "mob.chicken"; + } + + protected String getHurtSound() { + return "mob.chickenhurt"; + } + + protected String getDeathSound() { + return "mob.chickenhurt"; + } + + protected int getDropItemId() { + return Item.feather.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/EntityCow.java b/src/main/java/net/minecraft/src/EntityCow.java new file mode 100644 index 0000000..2f63ca7 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityCow.java @@ -0,0 +1,49 @@ +package net.minecraft.src; + +public class EntityCow extends EntityAnimals { + public boolean unusedBoolean = false; + + public EntityCow(World var1) { + super(var1); + this.texture = "/mob/cow.png"; + this.setSize(0.9F, 1.3F); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected String getLivingSound() { + return "mob.cow"; + } + + protected String getHurtSound() { + return "mob.cowhurt"; + } + + protected String getDeathSound() { + return "mob.cowhurt"; + } + + protected float getSoundVolume() { + return 0.4F; + } + + protected int getDropItemId() { + return Item.leather.shiftedIndex; + } + + public boolean interact(EntityPlayer var1) { + ItemStack var2 = var1.inventory.getCurrentItem(); + if(var2 != null && var2.itemID == Item.bucketEmpty.shiftedIndex) { + var1.inventory.setInventorySlotContents(var1.inventory.currentItem, new ItemStack(Item.bucketMilk)); + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/net/minecraft/src/EntityCreature.java b/src/main/java/net/minecraft/src/EntityCreature.java new file mode 100644 index 0000000..ae54fb3 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityCreature.java @@ -0,0 +1,151 @@ +package net.minecraft.src; + +public class EntityCreature extends EntityLiving { + private PathEntity pathToEntity; + protected Entity playerToAttack; + protected boolean hasAttacked = false; + + public EntityCreature(World var1) { + super(var1); + } + + protected void func_418_b_() { + this.hasAttacked = false; + float var1 = 16.0F; + if(this.playerToAttack == null) { + this.playerToAttack = this.findPlayerToAttack(); + if(this.playerToAttack != null) { + this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1); + } + } else if(!this.playerToAttack.isEntityAlive()) { + this.playerToAttack = null; + } else { + float var2 = this.playerToAttack.getDistanceToEntity(this); + if(this.canEntityBeSeen(this.playerToAttack)) { + this.attackEntity(this.playerToAttack, var2); + } + } + + if(this.hasAttacked || this.playerToAttack == null || this.pathToEntity != null && this.rand.nextInt(20) != 0) { + if(this.pathToEntity == null && this.rand.nextInt(80) == 0 || this.rand.nextInt(80) == 0) { + boolean var21 = false; + int var3 = -1; + int var4 = -1; + int var5 = -1; + float var6 = -99999.0F; + + for(int var7 = 0; var7 < 10; ++var7) { + int var8 = MathHelper.floor_double(this.posX + (double)this.rand.nextInt(13) - 6.0D); + int var9 = MathHelper.floor_double(this.posY + (double)this.rand.nextInt(7) - 3.0D); + int var10 = MathHelper.floor_double(this.posZ + (double)this.rand.nextInt(13) - 6.0D); + float var11 = this.func_439_a(var8, var9, var10); + if(var11 > var6) { + var6 = var11; + var3 = var8; + var4 = var9; + var5 = var10; + var21 = true; + } + } + + if(var21) { + this.pathToEntity = this.worldObj.getEntityPathToXYZ(this, var3, var4, var5, 10.0F); + } + } + } else { + this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1); + } + + int var22 = MathHelper.floor_double(this.boundingBox.minY); + boolean var23 = this.handleWaterMovement(); + boolean var24 = this.handleLavaMovement(); + this.rotationPitch = 0.0F; + if(this.pathToEntity != null && this.rand.nextInt(100) != 0) { + Vec3D var25 = this.pathToEntity.getPosition(this); + double var26 = (double)(this.width * 2.0F); + + while(var25 != null && var25.squareDistanceTo(this.posX, var25.yCoord, this.posZ) < var26 * var26) { + this.pathToEntity.incrementPathIndex(); + if(this.pathToEntity.isFinished()) { + var25 = null; + this.pathToEntity = null; + } else { + var25 = this.pathToEntity.getPosition(this); + } + } + + this.isJumping = false; + if(var25 != null) { + double var27 = var25.xCoord - this.posX; + double var28 = var25.zCoord - this.posZ; + double var12 = var25.yCoord - (double)var22; + float var14 = (float)(Math.atan2(var28, var27) * 180.0D / (double)((float)Math.PI)) - 90.0F; + float var15 = var14 - this.rotationYaw; + + for(this.field_9340_ai = this.field_9333_am; var15 < -180.0F; var15 += 360.0F) { + } + + while(var15 >= 180.0F) { + var15 -= 360.0F; + } + + if(var15 > 30.0F) { + var15 = 30.0F; + } + + if(var15 < -30.0F) { + var15 = -30.0F; + } + + this.rotationYaw += var15; + if(this.hasAttacked && this.playerToAttack != null) { + double var16 = this.playerToAttack.posX - this.posX; + double var18 = this.playerToAttack.posZ - this.posZ; + float var20 = this.rotationYaw; + this.rotationYaw = (float)(Math.atan2(var18, var16) * 180.0D / (double)((float)Math.PI)) - 90.0F; + var15 = (var20 - this.rotationYaw + 90.0F) * (float)Math.PI / 180.0F; + this.field_9342_ah = -MathHelper.sin(var15) * this.field_9340_ai * 1.0F; + this.field_9340_ai = MathHelper.cos(var15) * this.field_9340_ai * 1.0F; + } + + if(var12 > 0.0D) { + this.isJumping = true; + } + } + + if(this.playerToAttack != null) { + this.faceEntity(this.playerToAttack, 30.0F); + } + + if(this.field_9297_aI) { + this.isJumping = true; + } + + if(this.rand.nextFloat() < 0.8F && (var23 || var24)) { + this.isJumping = true; + } + + } else { + super.func_418_b_(); + this.pathToEntity = null; + } + } + + protected void attackEntity(Entity var1, float var2) { + } + + protected float func_439_a(int var1, int var2, int var3) { + return 0.0F; + } + + protected Entity findPlayerToAttack() { + return null; + } + + public boolean getCanSpawnHere() { + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.boundingBox.minY); + int var3 = MathHelper.floor_double(this.posZ); + return super.getCanSpawnHere() && this.func_439_a(var1, var2, var3) >= 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/EntityCreeper.java b/src/main/java/net/minecraft/src/EntityCreeper.java new file mode 100644 index 0000000..a43f99b --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityCreeper.java @@ -0,0 +1,126 @@ +package net.minecraft.src; + +public class EntityCreeper extends EntityMobs { + int timeSinceIgnited; + int lastActiveTime; + int fuseTime = 30; + int creeperState = -1; + int field_12241_e = -1; + + public EntityCreeper(World var1) { + super(var1); + this.texture = "/mob/creeper.png"; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + public void func_9282_a(byte var1) { + super.func_9282_a(var1); + if(var1 == 4) { + if(this.timeSinceIgnited == 0) { + this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F); + } + + this.creeperState = 1; + } + + if(var1 == 5) { + this.creeperState = -1; + } + + } + + public void onUpdate() { + this.lastActiveTime = this.timeSinceIgnited; +// if(this.worldObj.multiplayerWorld) { +// this.timeSinceIgnited += this.creeperState; +// if(this.timeSinceIgnited < 0) { +// this.timeSinceIgnited = 0; +// } +// +// if(this.timeSinceIgnited >= this.fuseTime) { +// this.timeSinceIgnited = this.fuseTime; +// } +// } + + super.onUpdate(); + } + + protected void func_418_b_() { + if(this.field_12241_e != this.creeperState) { + this.field_12241_e = this.creeperState; + if(this.creeperState > 0) { + this.worldObj.func_9425_a(this, (byte)4); + } else { + this.worldObj.func_9425_a(this, (byte)5); + } + } + + this.lastActiveTime = this.timeSinceIgnited; + //if(this.worldObj.multiplayerWorld) { + //super.func_418_b_(); + //} else { + if(this.timeSinceIgnited > 0 && this.creeperState < 0) { + --this.timeSinceIgnited; + } + + if(this.creeperState >= 0) { + this.creeperState = 2; + } + + super.func_418_b_(); + if(this.creeperState != 1) { + this.creeperState = -1; + } + //} + + } + + protected String getHurtSound() { + return "mob.creeper"; + } + + protected String getDeathSound() { + return "mob.creeperdeath"; + } + + public void onDeath(Entity var1) { + super.onDeath(var1); + if(var1 instanceof EntitySkeleton) { + this.dropItem(Item.record13.shiftedIndex + this.rand.nextInt(2), 1); + } + + } + + protected void attackEntity(Entity var1, float var2) { + if(this.creeperState <= 0 && var2 < 3.0F || this.creeperState > 0 && var2 < 7.0F) { + if(this.timeSinceIgnited == 0) { + this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F); + } + + this.creeperState = 1; + ++this.timeSinceIgnited; + if(this.timeSinceIgnited == this.fuseTime) { + this.worldObj.func_12243_a(this, this.posX, this.posY, this.posZ, 3.0F); + this.setEntityDead(); + } + + this.hasAttacked = true; + } + + } + + public float func_440_b(float var1) { + return ((float)this.lastActiveTime + (float)(this.timeSinceIgnited - this.lastActiveTime) * var1) / (float)(this.fuseTime - 2); + } + + protected int getDropItemId() { + return Item.gunpowder.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/EntityDiggingFX.java b/src/main/java/net/minecraft/src/EntityDiggingFX.java new file mode 100644 index 0000000..02dc04c --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityDiggingFX.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +public class EntityDiggingFX extends EntityFX { + private Block field_4082_a; + + public EntityDiggingFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12, Block var14) { + super(var1, var2, var4, var6, var8, var10, var12); + this.field_4082_a = var14; + this.field_670_b = var14.blockIndexInTexture; + this.field_664_h = var14.field_357_bm; + this.field_663_i = this.field_662_j = this.field_661_k = 0.6F; + this.field_665_g /= 2.0F; + } + + public EntityDiggingFX func_4041_a(int var1, int var2, int var3) { + if(this.field_4082_a == Block.grass) { + return this; + } else { + int var4 = this.field_4082_a.colorMultiplier(this.worldObj, var1, var2, var3); + this.field_663_i *= (float)(var4 >> 16 & 255) / 255.0F; + this.field_662_j *= (float)(var4 >> 8 & 255) / 255.0F; + this.field_661_k *= (float)(var4 & 255) / 255.0F; + return this; + } + } + + public int func_404_c() { + return 1; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)(this.field_670_b % 16) + this.field_669_c / 4.0F) / 16.0F; + float var9 = var8 + 0.999F / 64.0F; + float var10 = ((float)(this.field_670_b / 16) + this.field_668_d / 4.0F) / 16.0F; + float var11 = var10 + 0.999F / 64.0F; + float var12 = 0.1F * this.field_665_g; + float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l); + float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m); + float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n); + float var16 = this.getEntityBrightness(var2); + var1.setColorOpaque_F(var16 * this.field_663_i, var16 * this.field_662_j, var16 * this.field_661_k); + var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11); + var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11); + } +} diff --git a/src/main/java/net/minecraft/src/EntityExplodeFX.java b/src/main/java/net/minecraft/src/EntityExplodeFX.java new file mode 100644 index 0000000..26bee93 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityExplodeFX.java @@ -0,0 +1,38 @@ +package net.minecraft.src; + +public class EntityExplodeFX extends EntityFX { + public EntityExplodeFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1, var2, var4, var6, var8, var10, var12); + this.motionX = var8 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F); + this.motionY = var10 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F); + this.motionZ = var12 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F); + this.field_663_i = this.field_662_j = this.field_661_k = this.rand.nextFloat() * 0.3F + 0.7F; + this.field_665_g = this.rand.nextFloat() * this.rand.nextFloat() * 6.0F + 1.0F; + this.field_666_f = (int)(16.0D / ((double)this.rand.nextFloat() * 0.8D + 0.2D)) + 2; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + this.field_670_b = 7 - this.e * 8 / this.field_666_f; + this.motionY += 0.004D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.9F; + this.motionY *= (double)0.9F; + this.motionZ *= (double)0.9F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityFX.java b/src/main/java/net/minecraft/src/EntityFX.java new file mode 100644 index 0000000..9e64ab9 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFX.java @@ -0,0 +1,99 @@ +package net.minecraft.src; + +public class EntityFX extends Entity { + protected int field_670_b; + protected float field_669_c; + protected float field_668_d; + protected int e = 0; + protected int field_666_f = 0; + protected float field_665_g; + protected float field_664_h; + protected float field_663_i; + protected float field_662_j; + protected float field_661_k; + public static double field_660_l; + public static double field_659_m; + public static double field_658_n; + + public EntityFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1); + this.setSize(0.2F, 0.2F); + this.yOffset = this.height / 2.0F; + this.setPosition(var2, var4, var6); + this.field_663_i = this.field_662_j = this.field_661_k = 1.0F; + this.motionX = var8 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F); + this.motionY = var10 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F); + this.motionZ = var12 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F); + float var14 = (float)(Math.random() + Math.random() + 1.0D) * 0.15F; + float var15 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.motionX = this.motionX / (double)var15 * (double)var14 * (double)0.4F; + this.motionY = this.motionY / (double)var15 * (double)var14 * (double)0.4F + (double)0.1F; + this.motionZ = this.motionZ / (double)var15 * (double)var14 * (double)0.4F; + this.field_669_c = this.rand.nextFloat() * 3.0F; + this.field_668_d = this.rand.nextFloat() * 3.0F; + this.field_665_g = (this.rand.nextFloat() * 0.5F + 0.5F) * 2.0F; + this.field_666_f = (int)(4.0F / (this.rand.nextFloat() * 0.9F + 0.1F)); + this.e = 0; + this.entityWalks = false; + } + + public EntityFX func_407_b(float var1) { + this.motionX *= (double)var1; + this.motionY = (this.motionY - (double)0.1F) * (double)var1 + (double)0.1F; + this.motionZ *= (double)var1; + return this; + } + + public EntityFX func_405_d(float var1) { + this.setSize(0.2F * var1, 0.2F * var1); + this.field_665_g *= var1; + return this; + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + this.motionY -= 0.04D * (double)this.field_664_h; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.98F; + this.motionY *= (double)0.98F; + this.motionZ *= (double)0.98F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = (float)(this.field_670_b % 16) / 16.0F; + float var9 = var8 + 0.999F / 16.0F; + float var10 = (float)(this.field_670_b / 16) / 16.0F; + float var11 = var10 + 0.999F / 16.0F; + float var12 = 0.1F * this.field_665_g; + float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l); + float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m); + float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n); + float var16 = this.getEntityBrightness(var2); + var1.setColorOpaque_F(this.field_663_i * var16, this.field_662_j * var16, this.field_661_k * var16); + var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11); + var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11); + } + + public int func_404_c() { + return 0; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + } + + public void readEntityFromNBT(NBTTagCompound var1) { + } +} diff --git a/src/main/java/net/minecraft/src/EntityFallingSand.java b/src/main/java/net/minecraft/src/EntityFallingSand.java new file mode 100644 index 0000000..c72839b --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFallingSand.java @@ -0,0 +1,82 @@ +package net.minecraft.src; + +public class EntityFallingSand extends Entity { + public int field_799_a; + public int field_798_b = 0; + + public EntityFallingSand(World var1) { + super(var1); + } + + public EntityFallingSand(World var1, float var2, float var3, float var4, int var5) { + super(var1); + this.field_799_a = var5; + this.field_618_ad = true; + this.setSize(0.98F, 0.98F); + this.yOffset = this.height / 2.0F; + this.setPosition((double)var2, (double)var3, (double)var4); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.entityWalks = false; + this.prevPosX = (double)var2; + this.prevPosY = (double)var3; + this.prevPosZ = (double)var4; + } + + public boolean canBeCollidedWith() { + return !this.isDead; + } + + public void onUpdate() { + if(this.field_799_a == 0) { + this.setEntityDead(); + } else { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + ++this.field_798_b; + this.motionY -= (double)0.04F; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.98F; + this.motionY *= (double)0.98F; + this.motionZ *= (double)0.98F; + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.posY); + int var3 = MathHelper.floor_double(this.posZ); + if(this.worldObj.getBlockId(var1, var2, var3) == this.field_799_a) { + this.worldObj.setBlockWithNotify(var1, var2, var3, 0); + } + + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + this.motionY *= -0.5D; + this.setEntityDead(); + if(!this.worldObj.canBlockBePlacedAt(this.field_799_a, var1, var2, var3, true) || !this.worldObj.setBlockWithNotify(var1, var2, var3, this.field_799_a)) { + this.dropItem(this.field_799_a, 1); + } + } else if(this.field_798_b > 100) { + this.dropItem(this.field_799_a, 1); + this.setEntityDead(); + } + + } + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + var1.setByte("Tile", (byte)this.field_799_a); + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + this.field_799_a = var1.getByte("Tile") & 255; + } + + public float func_392_h_() { + return 0.0F; + } + + public World func_465_i() { + return this.worldObj; + } +} diff --git a/src/main/java/net/minecraft/src/EntityFireball.java b/src/main/java/net/minecraft/src/EntityFireball.java new file mode 100644 index 0000000..b912338 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFireball.java @@ -0,0 +1,207 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityFireball extends Entity { + private int field_9402_e = -1; + private int field_9401_f = -1; + private int field_9400_g = -1; + private int field_9399_h = 0; + private boolean field_9398_i = false; + public int field_9406_a = 0; + private EntityLiving field_9397_j; + private int field_9396_k; + private int field_9395_l = 0; + public double field_9405_b; + public double field_9404_c; + public double field_9403_d; + + public EntityFireball(World var1) { + super(var1); + this.setSize(1.0F, 1.0F); + } + + public boolean func_384_a(double var1) { + double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D; + var3 *= 64.0D; + return var1 < var3 * var3; + } + + public EntityFireball(World var1, EntityLiving var2, double var3, double var5, double var7) { + super(var1); + this.field_9397_j = var2; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(var2.posX, var2.posY, var2.posZ, var2.rotationYaw, var2.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = this.motionY = this.motionZ = 0.0D; + var3 += this.rand.nextGaussian() * 0.4D; + var5 += this.rand.nextGaussian() * 0.4D; + var7 += this.rand.nextGaussian() * 0.4D; + double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7); + this.field_9405_b = var3 / var9 * 0.1D; + this.field_9404_c = var5 / var9 * 0.1D; + this.field_9403_d = var7 / var9 * 0.1D; + } + + public void onUpdate() { + super.onUpdate(); + this.fire = 10; + if(this.field_9406_a > 0) { + --this.field_9406_a; + } + + if(this.field_9398_i) { + int var1 = this.worldObj.getBlockId(this.field_9402_e, this.field_9401_f, this.field_9400_g); + if(var1 == this.field_9399_h) { + ++this.field_9396_k; + if(this.field_9396_k == 1200) { + this.setEntityDead(); + } + + return; + } + + this.field_9398_i = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.field_9396_k = 0; + this.field_9395_l = 0; + } else { + ++this.field_9395_l; + } + + Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ); + Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2); + var15 = Vec3D.createVector(this.posX, this.posY, this.posZ); + var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + if(var3 != null) { + var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord); + } + + Entity var4 = null; + List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D)); + double var6 = 0.0D; + + for(int var8 = 0; var8 < var5.size(); ++var8) { + Entity var9 = (Entity)var5.get(var8); + if(var9.canBeCollidedWith() && (var9 != this.field_9397_j || this.field_9395_l >= 25)) { + float var10 = 0.3F; + AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10); + MovingObjectPosition var12 = var11.func_1169_a(var15, var2); + if(var12 != null) { + double var13 = var15.distanceTo(var12.hitVec); + if(var13 < var6 || var6 == 0.0D) { + var4 = var9; + var6 = var13; + } + } + } + } + + if(var4 != null) { + var3 = new MovingObjectPosition(var4); + } + + if(var3 != null) { + if(var3.entityHit != null && var3.entityHit.canAttackEntity(this.field_9397_j, 0)) { + } + + this.worldObj.func_12244_a((Entity)null, this.posX, this.posY, this.posZ, 1.0F, true); + this.setEntityDead(); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float var16 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI)); + + for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var16) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float var17 = 0.95F; + if(this.handleWaterMovement()) { + for(int var18 = 0; var18 < 4; ++var18) { + float var19 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var19, this.posY - this.motionY * (double)var19, this.posZ - this.motionZ * (double)var19, this.motionX, this.motionY, this.motionZ); + } + + var17 = 0.8F; + } + + this.motionX += this.field_9405_b; + this.motionY += this.field_9404_c; + this.motionZ += this.field_9403_d; + this.motionX *= (double)var17; + this.motionY *= (double)var17; + this.motionZ *= (double)var17; + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + this.setPosition(this.posX, this.posY, this.posZ); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("xTile", (short)this.field_9402_e); + var1.setShort("yTile", (short)this.field_9401_f); + var1.setShort("zTile", (short)this.field_9400_g); + var1.setByte("inTile", (byte)this.field_9399_h); + var1.setByte("shake", (byte)this.field_9406_a); + var1.setByte("inGround", (byte)(this.field_9398_i ? 1 : 0)); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.field_9402_e = var1.getShort("xTile"); + this.field_9401_f = var1.getShort("yTile"); + this.field_9400_g = var1.getShort("zTile"); + this.field_9399_h = var1.getByte("inTile") & 255; + this.field_9406_a = var1.getByte("shake") & 255; + this.field_9398_i = var1.getByte("inGround") == 1; + } + + public boolean canBeCollidedWith() { + return true; + } + + public float func_4035_j_() { + return 1.0F; + } + + public boolean canAttackEntity(Entity var1, int var2) { + this.func_9281_M(); + if(var1 != null) { + Vec3D var3 = var1.func_4037_H(); + if(var3 != null) { + this.motionX = var3.xCoord; + this.motionY = var3.yCoord; + this.motionZ = var3.zCoord; + this.field_9405_b = this.motionX * 0.1D; + this.field_9404_c = this.motionY * 0.1D; + this.field_9403_d = this.motionZ * 0.1D; + } + + return true; + } else { + return false; + } + } + + public float func_392_h_() { + return 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/EntityFish.java b/src/main/java/net/minecraft/src/EntityFish.java new file mode 100644 index 0000000..f90b1d0 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFish.java @@ -0,0 +1,367 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityFish extends Entity { + private int field_4095_d; + private int field_4094_e; + private int field_4093_f; + private int field_4092_g; + private boolean field_4091_h; + public int field_4098_a; + public EntityPlayer field_4097_b; + private int field_4090_i; + private int field_4089_j; + private int field_4088_k; + public Entity field_4096_c; + private int field_6388_l; + private double field_6387_m; + private double field_6386_n; + private double field_6385_o; + private double field_6384_p; + private double field_6383_q; + private double velocityX; + private double velocityY; + private double velocityZ; + + public EntityFish(World var1) { + super(var1); + this.field_4095_d = -1; + this.field_4094_e = -1; + this.field_4093_f = -1; + this.field_4092_g = 0; + this.field_4091_h = false; + this.field_4098_a = 0; + this.field_4089_j = 0; + this.field_4088_k = 0; + this.field_4096_c = null; + this.setSize(0.25F, 0.25F); + } + + public boolean func_384_a(double var1) { + double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D; + var3 *= 64.0D; + return var1 < var3 * var3; + } + + public EntityFish(World var1, double var2, double var4, double var6) { + this(var1); + this.setPosition(var2, var4, var6); + } + + public EntityFish(World var1, EntityPlayer var2) { + super(var1); + this.field_4095_d = -1; + this.field_4094_e = -1; + this.field_4093_f = -1; + this.field_4092_g = 0; + this.field_4091_h = false; + this.field_4098_a = 0; + this.field_4089_j = 0; + this.field_4088_k = 0; + this.field_4096_c = null; + this.field_4097_b = var2; + this.field_4097_b.fishEntity = this; + this.setSize(0.25F, 0.25F); + this.setLocationAndAngles(var2.posX, var2.posY + 1.62D - (double)var2.yOffset, var2.posZ, var2.rotationYaw, var2.rotationPitch); + this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.posY -= (double)0.1F; + this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + float var3 = 0.4F; + this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.func_4042_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F); + } + + public void func_4042_a(double var1, double var3, double var5, float var7, float var8) { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= (double)var9; + var3 /= (double)var9; + var5 /= (double)var9; + var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var1 *= (double)var7; + var3 *= (double)var7; + var5 *= (double)var7; + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI)); + this.field_4090_i = 0; + } + + public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) { + this.field_6387_m = var1; + this.field_6386_n = var3; + this.field_6385_o = var5; + this.field_6384_p = (double)var7; + this.field_6383_q = (double)var8; + this.field_6388_l = var9; + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + public void setVelocity(double var1, double var3, double var5) { + this.velocityX = this.motionX = var1; + this.velocityY = this.motionY = var3; + this.velocityZ = this.motionZ = var5; + } + + public void onUpdate() { + super.onUpdate(); + if(this.field_6388_l > 0) { + double var21 = this.posX + (this.field_6387_m - this.posX) / (double)this.field_6388_l; + double var22 = this.posY + (this.field_6386_n - this.posY) / (double)this.field_6388_l; + double var23 = this.posZ + (this.field_6385_o - this.posZ) / (double)this.field_6388_l; + + double var7; + for(var7 = this.field_6384_p - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) { + } + + while(var7 >= 180.0D) { + var7 -= 360.0D; + } + + this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_6388_l); + this.rotationPitch = (float)((double)this.rotationPitch + (this.field_6383_q - (double)this.rotationPitch) / (double)this.field_6388_l); + --this.field_6388_l; + this.setPosition(var21, var22, var23); + this.setRotation(this.rotationYaw, this.rotationPitch); + } else { + //if(!this.worldObj.multiplayerWorld) { + ItemStack var1 = this.field_4097_b.getCurrentEquippedItem(); + if(this.field_4097_b.isDead || !this.field_4097_b.isEntityAlive() || var1 == null || var1.getItem() != Item.fishingRod || this.getDistanceSqToEntity(this.field_4097_b) > 1024.0D) { + this.setEntityDead(); + this.field_4097_b.fishEntity = null; + return; + } + + if(this.field_4096_c != null) { + if(!this.field_4096_c.isDead) { + this.posX = this.field_4096_c.posX; + this.posY = this.field_4096_c.boundingBox.minY + (double)this.field_4096_c.height * 0.8D; + this.posZ = this.field_4096_c.posZ; + return; + } + + this.field_4096_c = null; + } + //} + + if(this.field_4098_a > 0) { + --this.field_4098_a; + } + + if(this.field_4091_h) { + int var19 = this.worldObj.getBlockId(this.field_4095_d, this.field_4094_e, this.field_4093_f); + if(var19 == this.field_4092_g) { + ++this.field_4090_i; + if(this.field_4090_i == 1200) { + this.setEntityDead(); + } + + return; + } + + this.field_4091_h = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.field_4090_i = 0; + this.field_4089_j = 0; + } else { + ++this.field_4089_j; + } + + Vec3D var20 = Vec3D.createVector(this.posX, this.posY, this.posZ); + Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var20, var2); + var20 = Vec3D.createVector(this.posX, this.posY, this.posZ); + var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + if(var3 != null) { + var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord); + } + + Entity var4 = null; + List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D)); + double var6 = 0.0D; + + double var13; + for(int var8 = 0; var8 < var5.size(); ++var8) { + Entity var9 = (Entity)var5.get(var8); + if(var9.canBeCollidedWith() && (var9 != this.field_4097_b || this.field_4089_j >= 5)) { + float var10 = 0.3F; + AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10); + MovingObjectPosition var12 = var11.func_1169_a(var20, var2); + if(var12 != null) { + var13 = var20.distanceTo(var12.hitVec); + if(var13 < var6 || var6 == 0.0D) { + var4 = var9; + var6 = var13; + } + } + } + } + + if(var4 != null) { + var3 = new MovingObjectPosition(var4); + } + + if(var3 != null) { + if(var3.entityHit != null) { + if(var3.entityHit.canAttackEntity(this.field_4097_b, 0)) { + this.field_4096_c = var3.entityHit; + } + } else { + this.field_4091_h = true; + } + } + + if(!this.field_4091_h) { + this.moveEntity(this.motionX, this.motionY, this.motionZ); + float var24 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI)); + + for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var24) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float var25 = 0.92F; + if(this.onGround || this.field_9297_aI) { + var25 = 0.5F; + } + + byte var26 = 5; + double var27 = 0.0D; + + for(int var28 = 0; var28 < var26; ++var28) { + double var14 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 0) / (double)var26 - 0.125D + 0.125D; + double var16 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 1) / (double)var26 - 0.125D + 0.125D; + AxisAlignedBB var18 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var14, this.boundingBox.minZ, this.boundingBox.maxX, var16, this.boundingBox.maxZ); + if(this.worldObj.func_707_b(var18, Material.water)) { + var27 += 1.0D / (double)var26; + } + } + + if(var27 > 0.0D) { + if(this.field_4088_k > 0) { + --this.field_4088_k; + } else if(this.rand.nextInt(500) == 0) { + this.field_4088_k = this.rand.nextInt(30) + 10; + this.motionY -= (double)0.2F; + this.worldObj.playSoundAtEntity(this, "random.splash", 0.25F, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F); + float var29 = (float)MathHelper.floor_double(this.boundingBox.minY); + + float var15; + int var30; + float var31; + for(var30 = 0; (float)var30 < 1.0F + this.width * 20.0F; ++var30) { + var15 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("bubble", this.posX + (double)var15, (double)(var29 + 1.0F), this.posZ + (double)var31, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ); + } + + for(var30 = 0; (float)var30 < 1.0F + this.width * 20.0F; ++var30) { + var15 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("splash", this.posX + (double)var15, (double)(var29 + 1.0F), this.posZ + (double)var31, this.motionX, this.motionY, this.motionZ); + } + } + } + + if(this.field_4088_k > 0) { + this.motionY -= (double)(this.rand.nextFloat() * this.rand.nextFloat() * this.rand.nextFloat()) * 0.2D; + } + + var13 = var27 * 2.0D - 1.0D; + this.motionY += (double)0.04F * var13; + if(var27 > 0.0D) { + var25 = (float)((double)var25 * 0.9D); + this.motionY *= 0.8D; + } + + this.motionX *= (double)var25; + this.motionY *= (double)var25; + this.motionZ *= (double)var25; + this.setPosition(this.posX, this.posY, this.posZ); + } + } + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("xTile", (short)this.field_4095_d); + var1.setShort("yTile", (short)this.field_4094_e); + var1.setShort("zTile", (short)this.field_4093_f); + var1.setByte("inTile", (byte)this.field_4092_g); + var1.setByte("shake", (byte)this.field_4098_a); + var1.setByte("inGround", (byte)(this.field_4091_h ? 1 : 0)); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.field_4095_d = var1.getShort("xTile"); + this.field_4094_e = var1.getShort("yTile"); + this.field_4093_f = var1.getShort("zTile"); + this.field_4092_g = var1.getByte("inTile") & 255; + this.field_4098_a = var1.getByte("shake") & 255; + this.field_4091_h = var1.getByte("inGround") == 1; + } + + public float func_392_h_() { + return 0.0F; + } + + public int func_4043_i() { + byte var1 = 0; + if(this.field_4096_c != null) { + double var2 = this.field_4097_b.posX - this.posX; + double var4 = this.field_4097_b.posY - this.posY; + double var6 = this.field_4097_b.posZ - this.posZ; + double var8 = (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6); + double var10 = 0.1D; + this.field_4096_c.motionX += var2 * var10; + this.field_4096_c.motionY += var4 * var10 + (double)MathHelper.sqrt_double(var8) * 0.08D; + this.field_4096_c.motionZ += var6 * var10; + var1 = 3; + } else if(this.field_4088_k > 0) { + EntityItem var13 = new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.fishRaw.shiftedIndex)); + double var3 = this.field_4097_b.posX - this.posX; + double var5 = this.field_4097_b.posY - this.posY; + double var7 = this.field_4097_b.posZ - this.posZ; + double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7); + double var11 = 0.1D; + var13.motionX = var3 * var11; + var13.motionY = var5 * var11 + (double)MathHelper.sqrt_double(var9) * 0.08D; + var13.motionZ = var7 * var11; + this.worldObj.entityJoinedWorld(var13); + var1 = 1; + } + + if(this.field_4091_h) { + var1 = 2; + } + + this.setEntityDead(); + this.field_4097_b.fishEntity = null; + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/EntityFlameFX.java b/src/main/java/net/minecraft/src/EntityFlameFX.java new file mode 100644 index 0000000..7c6e850 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFlameFX.java @@ -0,0 +1,59 @@ +package net.minecraft.src; + +public class EntityFlameFX extends EntityFX { + private float field_672_a; + + public EntityFlameFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1, var2, var4, var6, var8, var10, var12); + this.motionX = this.motionX * (double)0.01F + var8; + this.motionY = this.motionY * (double)0.01F + var10; + this.motionZ = this.motionZ * (double)0.01F + var12; + double var10000 = var2 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F); + var10000 = var4 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F); + var10000 = var6 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F); + this.field_672_a = this.field_665_g; + this.field_663_i = this.field_662_j = this.field_661_k = 1.0F; + this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)) + 4; + this.field_9314_ba = true; + this.field_670_b = 48; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.e + var2) / (float)this.field_666_f; + this.field_665_g = this.field_672_a * (1.0F - var8 * var8 * 0.5F); + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public float getEntityBrightness(float var1) { + float var2 = ((float)this.e + var1) / (float)this.field_666_f; + if(var2 < 0.0F) { + var2 = 0.0F; + } + + if(var2 > 1.0F) { + var2 = 1.0F; + } + + float var3 = super.getEntityBrightness(var1); + return var3 * var2 + (1.0F - var2); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.96F; + this.motionY *= (double)0.96F; + this.motionZ *= (double)0.96F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityFlying.java b/src/main/java/net/minecraft/src/EntityFlying.java new file mode 100644 index 0000000..ea3b6ef --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityFlying.java @@ -0,0 +1,66 @@ +package net.minecraft.src; + +public class EntityFlying extends EntityLiving { + public EntityFlying(World var1) { + super(var1); + } + + protected void fall(float var1) { + } + + public void func_435_b(float var1, float var2) { + if(this.handleWaterMovement()) { + this.func_351_a(var1, var2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.8F; + this.motionY *= (double)0.8F; + this.motionZ *= (double)0.8F; + } else if(this.handleLavaMovement()) { + this.func_351_a(var1, var2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } else { + float var3 = 0.91F; + if(this.onGround) { + var3 = 546.0F * 0.1F * 0.1F * 0.1F; + int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + if(var4 > 0) { + var3 = Block.blocksList[var4].slipperiness * 0.91F; + } + } + + float var8 = 0.16277136F / (var3 * var3 * var3); + this.func_351_a(var1, var2, this.onGround ? 0.1F * var8 : 0.02F); + var3 = 0.91F; + if(this.onGround) { + var3 = 546.0F * 0.1F * 0.1F * 0.1F; + int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + if(var5 > 0) { + var3 = Block.blocksList[var5].slipperiness * 0.91F; + } + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)var3; + this.motionY *= (double)var3; + this.motionZ *= (double)var3; + } + + this.field_705_Q = this.field_704_R; + double var10 = this.posX - this.prevPosX; + double var9 = this.posZ - this.prevPosZ; + float var7 = MathHelper.sqrt_double(var10 * var10 + var9 * var9) * 4.0F; + if(var7 > 1.0F) { + var7 = 1.0F; + } + + this.field_704_R += (var7 - this.field_704_R) * 0.4F; + this.field_703_S += this.field_704_R; + } + + public boolean isOnLadder() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/EntityGhast.java b/src/main/java/net/minecraft/src/EntityGhast.java new file mode 100644 index 0000000..82c7ef1 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityGhast.java @@ -0,0 +1,139 @@ +package net.minecraft.src; + +public class EntityGhast extends EntityFlying implements IMobs { + public int field_4121_a = 0; + public double field_4120_b; + public double field_4127_c; + public double field_4126_d; + private Entity field_4123_g = null; + private int field_4122_h = 0; + public int field_4125_e = 0; + public int field_4124_f = 0; + + public EntityGhast(World var1) { + super(var1); + this.texture = "/mob/ghast.png"; + this.setSize(4.0F, 4.0F); + this.isImmuneToFire = true; + } + + protected void func_418_b_() { + if(this.worldObj.difficultySetting == 0) { + this.setEntityDead(); + } + + this.field_4125_e = this.field_4124_f; + double var1 = this.field_4120_b - this.posX; + double var3 = this.field_4127_c - this.posY; + double var5 = this.field_4126_d - this.posZ; + double var7 = (double)MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + if(var7 < 1.0D || var7 > 60.0D) { + this.field_4120_b = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.field_4127_c = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.field_4126_d = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + } + + if(this.field_4121_a-- <= 0) { + this.field_4121_a += this.rand.nextInt(5) + 2; + if(this.func_4050_a(this.field_4120_b, this.field_4127_c, this.field_4126_d, var7)) { + this.motionX += var1 / var7 * 0.1D; + this.motionY += var3 / var7 * 0.1D; + this.motionZ += var5 / var7 * 0.1D; + } else { + this.field_4120_b = this.posX; + this.field_4127_c = this.posY; + this.field_4126_d = this.posZ; + } + } + + if(this.field_4123_g != null && this.field_4123_g.isDead) { + this.field_4123_g = null; + } + + if(this.field_4123_g == null || this.field_4122_h-- <= 0) { + this.field_4123_g = this.worldObj.getClosestPlayerToEntity(this, 100.0D); + if(this.field_4123_g != null) { + this.field_4122_h = 20; + } + } + + double var9 = 64.0D; + if(this.field_4123_g != null && this.field_4123_g.getDistanceSqToEntity(this) < var9 * var9) { + double var11 = this.field_4123_g.posX - this.posX; + double var13 = this.field_4123_g.boundingBox.minY + (double)(this.field_4123_g.height / 2.0F) - (this.posY + (double)(this.height / 2.0F)); + double var15 = this.field_4123_g.posZ - this.posZ; + this.field_735_n = this.rotationYaw = -((float)Math.atan2(var11, var15)) * 180.0F / (float)Math.PI; + if(this.canEntityBeSeen(this.field_4123_g)) { + if(this.field_4124_f == 10) { + this.worldObj.playSoundAtEntity(this, "mob.ghast.charge", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + ++this.field_4124_f; + if(this.field_4124_f == 20) { + this.worldObj.playSoundAtEntity(this, "mob.ghast.fireball", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + EntityFireball var17 = new EntityFireball(this.worldObj, this, var11, var13, var15); + double var18 = 4.0D; + Vec3D var20 = this.getLook(1.0F); + var17.posX = this.posX + var20.xCoord * var18; + var17.posY = this.posY + (double)(this.height / 2.0F) + 0.5D; + var17.posZ = this.posZ + var20.zCoord * var18; + this.worldObj.entityJoinedWorld(var17); + this.field_4124_f = -40; + } + } else if(this.field_4124_f > 0) { + --this.field_4124_f; + } + } else { + this.field_735_n = this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI; + if(this.field_4124_f > 0) { + --this.field_4124_f; + } + } + + this.texture = this.field_4124_f > 10 ? "/mob/ghast_fire.png" : "/mob/ghast.png"; + } + + private boolean func_4050_a(double var1, double var3, double var5, double var7) { + double var9 = (this.field_4120_b - this.posX) / var7; + double var11 = (this.field_4127_c - this.posY) / var7; + double var13 = (this.field_4126_d - this.posZ) / var7; + AxisAlignedBB var15 = this.boundingBox.copy(); + + for(int var16 = 1; (double)var16 < var7; ++var16) { + var15.offset(var9, var11, var13); + if(this.worldObj.getCollidingBoundingBoxes(this, var15).size() > 0) { + return false; + } + } + + return true; + } + + protected String getLivingSound() { + return "mob.ghast.moan"; + } + + protected String getHurtSound() { + return "mob.ghast.scream"; + } + + protected String getDeathSound() { + return "mob.ghast.death"; + } + + protected int getDropItemId() { + return Item.gunpowder.shiftedIndex; + } + + protected float getSoundVolume() { + return 10.0F; + } + + public boolean getCanSpawnHere() { + return this.rand.nextInt(20) == 0 && super.getCanSpawnHere() && this.worldObj.difficultySetting > 0; + } + + public int func_6391_i() { + return 1; + } +} diff --git a/src/main/java/net/minecraft/src/EntityItem.java b/src/main/java/net/minecraft/src/EntityItem.java new file mode 100644 index 0000000..d95a206 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityItem.java @@ -0,0 +1,191 @@ +package net.minecraft.src; + +public class EntityItem extends Entity { + public ItemStack item; + private int field_803_e; + public int age = 0; + public int field_805_c; + private int health = 5; + public float field_804_d = (float)(Math.random() * Math.PI * 2.0D); + + public EntityItem(World var1, double var2, double var4, double var6, ItemStack var8) { + super(var1); + this.setSize(0.25F, 0.25F); + this.yOffset = this.height / 2.0F; + this.setPosition(var2, var4, var6); + this.item = var8; + this.rotationYaw = (float)(Math.random() * 360.0D); + this.motionX = (double)((float)(Math.random() * (double)0.2F - (double)0.1F)); + this.motionY = (double)0.2F; + this.motionZ = (double)((float)(Math.random() * (double)0.2F - (double)0.1F)); + this.entityWalks = false; + } + + public EntityItem(World var1) { + super(var1); + this.setSize(0.25F, 0.25F); + this.yOffset = this.height / 2.0F; + } + + public void onUpdate() { + super.onUpdate(); + if(this.field_805_c > 0) { + --this.field_805_c; + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (double)0.04F; + if(this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) == Material.lava) { + this.motionY = (double)0.2F; + this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); + this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); + this.worldObj.playSoundAtEntity(this, "random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F); + } + + this.func_466_g(this.posX, this.posY, this.posZ); + this.handleWaterMovement(); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + float var1 = 0.98F; + if(this.onGround) { + var1 = 0.1F * 0.1F * 58.8F; + int var2 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + if(var2 > 0) { + var1 = Block.blocksList[var2].slipperiness * 0.98F; + } + } + + this.motionX *= (double)var1; + this.motionY *= (double)0.98F; + this.motionZ *= (double)var1; + if(this.onGround) { + this.motionY *= -0.5D; + } + + ++this.field_803_e; + ++this.age; + if(this.age >= 6000) { + this.setEntityDead(); + } + + } + + public boolean handleWaterMovement() { + return this.worldObj.func_682_a(this.boundingBox, Material.water, this); + } + + private boolean func_466_g(double var1, double var3, double var5) { + int var7 = MathHelper.floor_double(var1); + int var8 = MathHelper.floor_double(var3); + int var9 = MathHelper.floor_double(var5); + double var10 = var1 - (double)var7; + double var12 = var3 - (double)var8; + double var14 = var5 - (double)var9; + if(Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9)]) { + boolean var16 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7 - 1, var8, var9)]; + boolean var17 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7 + 1, var8, var9)]; + boolean var18 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8 - 1, var9)]; + boolean var19 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8 + 1, var9)]; + boolean var20 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9 - 1)]; + boolean var21 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9 + 1)]; + byte var22 = -1; + double var23 = 9999.0D; + if(var16 && var10 < var23) { + var23 = var10; + var22 = 0; + } + + if(var17 && 1.0D - var10 < var23) { + var23 = 1.0D - var10; + var22 = 1; + } + + if(var18 && var12 < var23) { + var23 = var12; + var22 = 2; + } + + if(var19 && 1.0D - var12 < var23) { + var23 = 1.0D - var12; + var22 = 3; + } + + if(var20 && var14 < var23) { + var23 = var14; + var22 = 4; + } + + if(var21 && 1.0D - var14 < var23) { + var23 = 1.0D - var14; + var22 = 5; + } + + float var25 = this.rand.nextFloat() * 0.2F + 0.1F; + if(var22 == 0) { + this.motionX = (double)(-var25); + } + + if(var22 == 1) { + this.motionX = (double)var25; + } + + if(var22 == 2) { + this.motionY = (double)(-var25); + } + + if(var22 == 3) { + this.motionY = (double)var25; + } + + if(var22 == 4) { + this.motionZ = (double)(-var25); + } + + if(var22 == 5) { + this.motionZ = (double)var25; + } + } + + return false; + } + + protected void func_355_a(int var1) { + this.canAttackEntity((Entity)null, var1); + } + + public boolean canAttackEntity(Entity var1, int var2) { + this.func_9281_M(); + this.health -= var2; + if(this.health <= 0) { + this.setEntityDead(); + } + + return false; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("Health", (short)((byte)this.health)); + var1.setShort("Age", (short)this.age); + var1.setCompoundTag("Item", this.item.writeToNBT(new NBTTagCompound())); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.health = var1.getShort("Health") & 255; + this.age = var1.getShort("Age"); + NBTTagCompound var2 = var1.getCompoundTag("Item"); + this.item = new ItemStack(var2); + } + + public void onCollideWithPlayer(EntityPlayer var1) { + //if(!this.worldObj.multiplayerWorld) { + int var2 = this.item.stackSize; + if(this.field_805_c == 0 && var1.inventory.addItemStackToInventory(this.item)) { + this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + var1.func_443_a_(this, var2); + this.setEntityDead(); + } + + //} + } +} diff --git a/src/main/java/net/minecraft/src/EntityLavaFX.java b/src/main/java/net/minecraft/src/EntityLavaFX.java new file mode 100644 index 0000000..359286a --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityLavaFX.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +public class EntityLavaFX extends EntityFX { + private float field_674_a; + + public EntityLavaFX(World var1, double var2, double var4, double var6) { + super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D); + this.motionX *= (double)0.8F; + this.motionY *= (double)0.8F; + this.motionZ *= (double)0.8F; + this.motionY = (double)(this.rand.nextFloat() * 0.4F + 0.05F); + this.field_663_i = this.field_662_j = this.field_661_k = 1.0F; + this.field_665_g *= this.rand.nextFloat() * 2.0F + 0.2F; + this.field_674_a = this.field_665_g; + this.field_666_f = (int)(16.0D / (Math.random() * 0.8D + 0.2D)); + this.field_9314_ba = false; + this.field_670_b = 49; + } + + public float getEntityBrightness(float var1) { + return 1.0F; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.e + var2) / (float)this.field_666_f; + this.field_665_g = this.field_674_a * (1.0F - var8 * var8); + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + float var1 = (float)this.e / (float)this.field_666_f; + if(this.rand.nextFloat() > var1) { + this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, this.motionX, this.motionY, this.motionZ); + } + + this.motionY -= 0.03D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.999F; + this.motionY *= (double)0.999F; + this.motionZ *= (double)0.999F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityList.java b/src/main/java/net/minecraft/src/EntityList.java new file mode 100644 index 0000000..bfca2d4 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityList.java @@ -0,0 +1,106 @@ +package net.minecraft.src; + +import java.util.HashMap; +import java.util.Map; + +public class EntityList { + private static Map stringToClassMapping = new HashMap(); + private static Map classToStringMapping = new HashMap(); + private static Map IDtoClassMapping = new HashMap(); + private static Map classToIDMapping = new HashMap(); + + private static void addMapping(Class var0, String var1, int var2) { + stringToClassMapping.put(var1, var0); + classToStringMapping.put(var0, var1); + IDtoClassMapping.put(Integer.valueOf(var2), var0); + classToIDMapping.put(var0, Integer.valueOf(var2)); + } + + public static Entity createEntityInWorld(String var0, World var1) { + Entity var2 = null; + + try { + Class var3 = (Class)stringToClassMapping.get(var0); + if(var3 != null) { + var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1}); + } + } catch (Exception var4) { + var4.printStackTrace(); + } + + return var2; + } + + public static Entity createEntityFromNBT(NBTTagCompound var0, World var1) { + Entity var2 = null; + + try { + Class var3 = (Class)stringToClassMapping.get(var0.getString("id")); + if(var3 != null) { + var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1}); + } + } catch (Exception var4) { + var4.printStackTrace(); + } + + if(var2 != null) { + var2.readFromNBT(var0); + } else { + System.out.println("Skipping Entity with id " + var0.getString("id")); + } + + return var2; + } + + public static Entity createEntity(int var0, World var1) { + Entity var2 = null; + + try { + Class var3 = (Class)IDtoClassMapping.get(Integer.valueOf(var0)); + if(var3 != null) { + var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1}); + } + } catch (Exception var4) { + var4.printStackTrace(); + } + + if(var2 == null) { + System.out.println("Skipping Entity with id " + var0); + } + + return var2; + } + + public static int getEntityID(Entity var0) { + return ((Integer)classToIDMapping.get(var0.getClass())).intValue(); + } + + public static String getEntityString(Entity var0) { + return (String)classToStringMapping.get(var0.getClass()); + } + + static { + addMapping(EntityArrow.class, "Arrow", 10); + addMapping(EntitySnowball.class, "Snowball", 11); + addMapping(EntityItem.class, "Item", 1); + addMapping(EntityPainting.class, "Painting", 9); + addMapping(EntityLiving.class, "Mob", 48); + addMapping(EntityMobs.class, "Monster", 49); + addMapping(EntityCreeper.class, "Creeper", 50); + addMapping(EntitySkeleton.class, "Skeleton", 51); + addMapping(EntitySpider.class, "Spider", 52); + addMapping(EntityZombieSimple.class, "Giant", 53); + addMapping(EntityZombie.class, "Zombie", 54); + addMapping(EntitySlime.class, "Slime", 55); + addMapping(EntityGhast.class, "Ghast", 56); + addMapping(EntityPigZombie.class, "PigZombie", 57); + addMapping(EntityPig.class, "Pig", 90); + addMapping(EntitySheep.class, "Sheep", 91); + addMapping(EntityCow.class, "Cow", 92); + addMapping(EntityChicken.class, "Chicken", 93); + addMapping(EntityTNTPrimed.class, "PrimedTnt", 20); + addMapping(EntityFallingSand.class, "FallingSand", 21); + addMapping(EntityMinecart.class, "Minecart", 40); + addMapping(EntityBoat.class, "Boat", 41); + } +} diff --git a/src/main/java/net/minecraft/src/EntityLiving.java b/src/main/java/net/minecraft/src/EntityLiving.java new file mode 100644 index 0000000..2ed3776 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityLiving.java @@ -0,0 +1,787 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityLiving extends Entity { + public int field_9366_o = 20; + public float field_9365_p; + public float field_9364_q; + public float field_9363_r; + public float field_735_n = 0.0F; + public float field_734_o = 0.0F; + protected float field_9362_u; + protected float field_9361_v; + protected float field_9360_w; + protected float field_9359_x; + protected boolean field_9358_y = true; + protected String texture = "/mob/char.png"; + protected boolean field_9355_A = true; + protected float field_9353_B = 0.0F; + protected String field_9351_C = null; + protected float field_9349_D = 1.0F; + protected int field_9347_E = 0; + protected float field_9345_F = 0.0F; + public boolean field_9343_G = false; + public float prevSwingProgress; + public float swingProgress; + public int health = 10; + public int field_9335_K; + private int a; + public int hurtTime; + public int field_9332_M; + public float field_9331_N = 0.0F; + public int deathTime = 0; + public int attackTime = 0; + public float field_9329_Q; + public float field_9328_R; + protected boolean field_9327_S = false; + public int field_9326_T = -1; + public float field_9325_U = (float)(Math.random() * (double)0.9F + (double)0.1F); + public float field_705_Q; + public float field_704_R; + public float field_703_S; + protected int field_9324_Y; + protected double field_9323_Z; + protected double field_9356_aa; + protected double field_9354_ab; + protected double field_9352_ac; + protected double field_9350_ad; + float field_9348_ae = 0.0F; + protected int field_9346_af = 0; + protected int field_9344_ag = 0; + protected float field_9342_ah; + protected float field_9340_ai; + protected float field_9338_aj; + protected boolean isJumping = false; + protected float field_9334_al = 0.0F; + protected float field_9333_am = 0.7F; + private Entity b; + private int c = 0; + + public EntityLiving(World var1) { + super(var1); + this.field_618_ad = true; + this.field_9363_r = (float)(Math.random() + 1.0D) * 0.01F; + this.setPosition(this.posX, this.posY, this.posZ); + this.field_9365_p = (float)Math.random() * 12398.0F; + this.rotationYaw = (float)(Math.random() * (double)((float)Math.PI) * 2.0D); + this.field_9364_q = 1.0F; + this.field_9286_aZ = 0.5F; + } + + public boolean canEntityBeSeen(Entity var1) { + return this.worldObj.rayTraceBlocks(Vec3D.createVector(this.posX, this.posY + (double)this.func_373_s(), this.posZ), Vec3D.createVector(var1.posX, var1.posY + (double)var1.func_373_s(), var1.posZ)) == null; + } + + public String getEntityTexture() { + return this.texture; + } + + public boolean canBeCollidedWith() { + return !this.isDead; + } + + public boolean canBePushed() { + return !this.isDead; + } + + public float func_373_s() { + return this.height * 0.85F; + } + + public int func_421_b() { + return 80; + } + + public void func_391_y() { + this.prevSwingProgress = this.swingProgress; + super.func_391_y(); + if(this.rand.nextInt(1000) < this.a++) { + this.a = -this.func_421_b(); + String var1 = this.getLivingSound(); + if(var1 != null) { + this.worldObj.playSoundAtEntity(this, var1, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + } + + if(this.isEntityAlive() && this.func_345_I()) { + this.canAttackEntity((Entity)null, 1); + } + + if(this.isImmuneToFire) { + this.fire = 0; + } + + int var8; + if(this.isEntityAlive() && this.isInsideOfMaterial(Material.water)) { + --this.air; + if(this.air == -20) { + this.air = 0; + + for(var8 = 0; var8 < 8; ++var8) { + float var2 = this.rand.nextFloat() - this.rand.nextFloat(); + float var3 = this.rand.nextFloat() - this.rand.nextFloat(); + float var4 = this.rand.nextFloat() - this.rand.nextFloat(); + this.worldObj.spawnParticle("bubble", this.posX + (double)var2, this.posY + (double)var3, this.posZ + (double)var4, this.motionX, this.motionY, this.motionZ); + } + + this.canAttackEntity((Entity)null, 2); + } + + this.fire = 0; + } else { + this.air = this.field_9308_bh; + } + + this.field_9329_Q = this.field_9328_R; + if(this.attackTime > 0) { + --this.attackTime; + } + + if(this.hurtTime > 0) { + --this.hurtTime; + } + + if(this.field_9306_bj > 0) { + --this.field_9306_bj; + } + + if(this.health <= 0) { + ++this.deathTime; + if(this.deathTime > 20) { + this.func_6392_F(); + this.setEntityDead(); + + for(var8 = 0; var8 < 20; ++var8) { + double var9 = this.rand.nextGaussian() * 0.02D; + double var10 = this.rand.nextGaussian() * 0.02D; + double var6 = this.rand.nextGaussian() * 0.02D; + this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var9, var10, var6); + } + } + } + + this.field_9359_x = this.field_9360_w; + this.field_734_o = this.field_735_n; + this.prevRotationYaw = this.rotationYaw; + this.prevRotationPitch = this.rotationPitch; + } + + public void spawnExplosionParticle() { + for(int var1 = 0; var1 < 20; ++var1) { + double var2 = this.rand.nextGaussian() * 0.02D; + double var4 = this.rand.nextGaussian() * 0.02D; + double var6 = this.rand.nextGaussian() * 0.02D; + double var8 = 10.0D; + this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var2 * var8, this.posY + (double)(this.rand.nextFloat() * this.height) - var4 * var8, this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var6 * var8, var2, var4, var6); + } + + } + + public void func_350_p() { + super.func_350_p(); + this.field_9362_u = this.field_9361_v; + this.field_9361_v = 0.0F; + } + + public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) { + this.yOffset = 0.0F; + this.field_9323_Z = var1; + this.field_9356_aa = var3; + this.field_9354_ab = var5; + this.field_9352_ac = (double)var7; + this.field_9350_ad = (double)var8; + this.field_9324_Y = var9; + } + + public void onUpdate() { + super.onUpdate(); + this.onLivingUpdate(); + double var1 = this.posX - this.prevPosX; + double var3 = this.posZ - this.prevPosZ; + float var5 = MathHelper.sqrt_double(var1 * var1 + var3 * var3); + float var6 = this.field_735_n; + float var7 = 0.0F; + this.field_9362_u = this.field_9361_v; + float var8 = 0.0F; + if(var5 > 0.05F) { + var8 = 1.0F; + var7 = var5 * 3.0F; + var6 = (float)Math.atan2(var3, var1) * 180.0F / (float)Math.PI - 90.0F; + } + + if(this.swingProgress > 0.0F) { + var6 = this.rotationYaw; + } + + if(!this.onGround) { + var8 = 0.0F; + } + + this.field_9361_v += (var8 - this.field_9361_v) * 0.3F; + + float var9; + for(var9 = var6 - this.field_735_n; var9 < -180.0F; var9 += 360.0F) { + } + + while(var9 >= 180.0F) { + var9 -= 360.0F; + } + + this.field_735_n += var9 * 0.3F; + + float var10; + for(var10 = this.rotationYaw - this.field_735_n; var10 < -180.0F; var10 += 360.0F) { + } + + while(var10 >= 180.0F) { + var10 -= 360.0F; + } + + boolean var11 = var10 < -90.0F || var10 >= 90.0F; + if(var10 < -75.0F) { + var10 = -75.0F; + } + + if(var10 >= 75.0F) { + var10 = 75.0F; + } + + this.field_735_n = this.rotationYaw - var10; + if(var10 * var10 > 2500.0F) { + this.field_735_n += var10 * 0.2F; + } + + if(var11) { + var7 *= -1.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + while(this.field_735_n - this.field_734_o < -180.0F) { + this.field_734_o -= 360.0F; + } + + while(this.field_735_n - this.field_734_o >= 180.0F) { + this.field_734_o += 360.0F; + } + + while(this.rotationPitch - this.prevRotationPitch < -180.0F) { + this.prevRotationPitch -= 360.0F; + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + this.field_9360_w += var7; + } + + protected void setSize(float var1, float var2) { + super.setSize(var1, var2); + } + + public void heal(int var1) { + if(this.health > 0) { + this.health += var1; + if(this.health > 20) { + this.health = 20; + } + + this.field_9306_bj = this.field_9366_o / 2; + } + } + + public boolean canAttackEntity(Entity var1, int var2) { + //if(this.worldObj.multiplayerWorld) { + //return false; + //} else { + this.field_9344_ag = 0; + if(this.health <= 0) { + return false; + } else { + this.field_704_R = 1.5F; + boolean var3 = true; + if((float)this.field_9306_bj > (float)this.field_9366_o / 2.0F) { + if(var2 <= this.field_9346_af) { + return false; + } + + this.damageEntity(var2 - this.field_9346_af); + this.field_9346_af = var2; + var3 = false; + } else { + this.field_9346_af = var2; + this.field_9335_K = this.health; + this.field_9306_bj = this.field_9366_o; + this.damageEntity(var2); + this.hurtTime = this.field_9332_M = 10; + } + + this.field_9331_N = 0.0F; + if(var3) { + this.worldObj.func_9425_a(this, (byte)2); + this.func_9281_M(); + if(var1 != null) { + double var4 = var1.posX - this.posX; + + double var6; + for(var6 = var1.posZ - this.posZ; var4 * var4 + var6 * var6 < 1.0E-4D; var6 = (Math.random() - Math.random()) * 0.01D) { + var4 = (Math.random() - Math.random()) * 0.01D; + } + + this.field_9331_N = (float)(Math.atan2(var6, var4) * 180.0D / (double)((float)Math.PI)) - this.rotationYaw; + this.func_434_a(var1, var2, var4, var6); + } else { + this.field_9331_N = (float)((int)(Math.random() * 2.0D) * 180); + } + } + + if(this.health <= 0) { + if(var3) { + this.worldObj.playSoundAtEntity(this, this.getDeathSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + this.onDeath(var1); + } else if(var3) { + this.worldObj.playSoundAtEntity(this, this.getHurtSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + return true; + } + //} + } + + public void func_9280_g() { + this.hurtTime = this.field_9332_M = 10; + this.field_9331_N = 0.0F; + } + + protected void damageEntity(int var1) { + this.health -= var1; + } + + protected float getSoundVolume() { + return 1.0F; + } + + protected String getLivingSound() { + return null; + } + + protected String getHurtSound() { + return "random.hurt"; + } + + protected String getDeathSound() { + return "random.hurt"; + } + + public void func_434_a(Entity var1, int var2, double var3, double var5) { + float var7 = MathHelper.sqrt_double(var3 * var3 + var5 * var5); + float var8 = 0.4F; + this.motionX /= 2.0D; + this.motionY /= 2.0D; + this.motionZ /= 2.0D; + this.motionX -= var3 / (double)var7 * (double)var8; + this.motionY += (double)0.4F; + this.motionZ -= var5 / (double)var7 * (double)var8; + if(this.motionY > (double)0.4F) { + this.motionY = (double)0.4F; + } + + } + + public void onDeath(Entity var1) { + if(this.field_9347_E > 0 && var1 != null) { + var1.addToPlayerScore(this, this.field_9347_E); + } + + this.field_9327_S = true; + //if(!this.worldObj.multiplayerWorld) { + int var2 = this.getDropItemId(); + if(var2 > 0) { + int var3 = this.rand.nextInt(3); + + for(int var4 = 0; var4 < var3; ++var4) { + this.dropItem(var2, 1); + } + } + //} + + this.worldObj.func_9425_a(this, (byte)3); + } + + protected int getDropItemId() { + return 0; + } + + protected void fall(float var1) { + int var2 = (int)Math.ceil((double)(var1 - 3.0F)); + if(var2 > 0) { + this.canAttackEntity((Entity)null, var2); + int var3 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset), MathHelper.floor_double(this.posZ)); + if(var3 > 0) { + StepSound var4 = Block.blocksList[var3].stepSound; + this.worldObj.playSoundAtEntity(this, var4.func_1145_d(), var4.func_1147_b() * 0.5F, var4.func_1144_c() * (12.0F / 16.0F)); + } + } + + } + + public void func_435_b(float var1, float var2) { + double var3; + if(this.handleWaterMovement()) { + var3 = this.posY; + this.func_351_a(var1, var2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.8F; + this.motionY *= (double)0.8F; + this.motionZ *= (double)0.8F; + this.motionY -= 0.02D; + if(this.field_9297_aI && this.func_403_b(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) { + this.motionY = (double)0.3F; + } + } else if(this.handleLavaMovement()) { + var3 = this.posY; + this.func_351_a(var1, var2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + this.motionY -= 0.02D; + if(this.field_9297_aI && this.func_403_b(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) { + this.motionY = (double)0.3F; + } + } else { + float var8 = 0.91F; + if(this.onGround) { + var8 = 546.0F * 0.1F * 0.1F * 0.1F; + int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + if(var4 > 0) { + var8 = Block.blocksList[var4].slipperiness * 0.91F; + } + } + + float var9 = 0.16277136F / (var8 * var8 * var8); + this.func_351_a(var1, var2, this.onGround ? 0.1F * var9 : 0.02F); + var8 = 0.91F; + if(this.onGround) { + var8 = 546.0F * 0.1F * 0.1F * 0.1F; + int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + if(var5 > 0) { + var8 = Block.blocksList[var5].slipperiness * 0.91F; + } + } + + if(this.isOnLadder()) { + this.fallDistance = 0.0F; + if(this.motionY < -0.15D) { + this.motionY = -0.15D; + } + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + if(this.field_9297_aI && this.isOnLadder()) { + this.motionY = 0.2D; + } + + this.motionY -= 0.08D; + this.motionY *= (double)0.98F; + this.motionX *= (double)var8; + this.motionZ *= (double)var8; + } + + this.field_705_Q = this.field_704_R; + var3 = this.posX - this.prevPosX; + double var10 = this.posZ - this.prevPosZ; + float var7 = MathHelper.sqrt_double(var3 * var3 + var10 * var10) * 4.0F; + if(var7 > 1.0F) { + var7 = 1.0F; + } + + this.field_704_R += (var7 - this.field_704_R) * 0.4F; + this.field_703_S += this.field_704_R; + } + + public boolean isOnLadder() { + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.boundingBox.minY); + int var3 = MathHelper.floor_double(this.posZ); + return this.worldObj.getBlockId(var1, var2, var3) == Block.ladder.blockID || this.worldObj.getBlockId(var1, var2 + 1, var3) == Block.ladder.blockID; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("Health", (short)this.health); + var1.setShort("HurtTime", (short)this.hurtTime); + var1.setShort("DeathTime", (short)this.deathTime); + var1.setShort("AttackTime", (short)this.attackTime); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.health = var1.getShort("Health"); + if(!var1.hasKey("Health")) { + this.health = 10; + } + + this.hurtTime = var1.getShort("HurtTime"); + this.deathTime = var1.getShort("DeathTime"); + this.attackTime = var1.getShort("AttackTime"); + } + + public boolean isEntityAlive() { + return !this.isDead && this.health > 0; + } + + public void onLivingUpdate() { + if(this.field_9324_Y > 0) { + double var1 = this.posX + (this.field_9323_Z - this.posX) / (double)this.field_9324_Y; + double var3 = this.posY + (this.field_9356_aa - this.posY) / (double)this.field_9324_Y; + double var5 = this.posZ + (this.field_9354_ab - this.posZ) / (double)this.field_9324_Y; + + double var7; + for(var7 = this.field_9352_ac - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) { + } + + while(var7 >= 180.0D) { + var7 -= 360.0D; + } + + this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9324_Y); + this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9350_ad - (double)this.rotationPitch) / (double)this.field_9324_Y); + --this.field_9324_Y; + this.setPosition(var1, var3, var5); + this.setRotation(this.rotationYaw, this.rotationPitch); + } + + if(this.health <= 0) { + this.isJumping = false; + this.field_9342_ah = 0.0F; + this.field_9340_ai = 0.0F; + this.field_9338_aj = 0.0F; + } else if(!this.field_9343_G) { + this.func_418_b_(); + } + + boolean var9 = this.handleWaterMovement(); + boolean var2 = this.handleLavaMovement(); + if(this.isJumping) { + if(var9) { + this.motionY += (double)0.04F; + } else if(var2) { + this.motionY += (double)0.04F; + } else if(this.onGround) { + this.func_424_C(); + } + } + + this.field_9342_ah *= 0.98F; + this.field_9340_ai *= 0.98F; + this.field_9338_aj *= 0.9F; + this.func_435_b(this.field_9342_ah, this.field_9340_ai); + List var10 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F)); + if(var10 != null && var10.size() > 0) { + for(int var4 = 0; var4 < var10.size(); ++var4) { + Entity var11 = (Entity)var10.get(var4); + if(var11.canBePushed()) { + var11.applyEntityCollision(this); + } + } + } + + } + + protected void func_424_C() { + this.motionY = (double)0.42F; + } + + protected void func_418_b_() { + ++this.field_9344_ag; + EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, -1.0D); + if(var1 != null) { + double var2 = var1.posX - this.posX; + double var4 = var1.posY - this.posY; + double var6 = var1.posZ - this.posZ; + double var8 = var2 * var2 + var4 * var4 + var6 * var6; + if(var8 > 16384.0D) { + this.setEntityDead(); + } + + if(this.field_9344_ag > 600 && this.rand.nextInt(800) == 0) { + if(var8 < 1024.0D) { + this.field_9344_ag = 0; + } else { + this.setEntityDead(); + } + } + } + + this.field_9342_ah = 0.0F; + this.field_9340_ai = 0.0F; + float var10 = 8.0F; + if(this.rand.nextFloat() < 0.02F) { + var1 = this.worldObj.getClosestPlayerToEntity(this, (double)var10); + if(var1 != null) { + this.b = var1; + this.c = 10 + this.rand.nextInt(20); + } else { + this.field_9338_aj = (this.rand.nextFloat() - 0.5F) * 20.0F; + } + } + + if(this.b != null) { + this.faceEntity(this.b, 10.0F); + if(this.c-- <= 0 || this.b.isDead || this.b.getDistanceSqToEntity(this) > (double)(var10 * var10)) { + this.b = null; + } + } else { + if(this.rand.nextFloat() < 0.05F) { + this.field_9338_aj = (this.rand.nextFloat() - 0.5F) * 20.0F; + } + + this.rotationYaw += this.field_9338_aj; + this.rotationPitch = this.field_9334_al; + } + + boolean var3 = this.handleWaterMovement(); + boolean var11 = this.handleLavaMovement(); + if(var3 || var11) { + this.isJumping = this.rand.nextFloat() < 0.8F; + } + + } + + public void faceEntity(Entity var1, float var2) { + double var3 = var1.posX - this.posX; + double var7 = var1.posZ - this.posZ; + double var5; + if(var1 instanceof EntityLiving) { + EntityLiving var9 = (EntityLiving)var1; + var5 = var9.posY + (double)var9.func_373_s() - (this.posY + (double)this.func_373_s()); + } else { + var5 = (var1.boundingBox.minY + var1.boundingBox.maxY) / 2.0D - (this.posY + (double)this.func_373_s()); + } + + double var13 = (double)MathHelper.sqrt_double(var3 * var3 + var7 * var7); + float var11 = (float)(Math.atan2(var7, var3) * 180.0D / (double)((float)Math.PI)) - 90.0F; + float var12 = (float)(Math.atan2(var5, var13) * 180.0D / (double)((float)Math.PI)); + this.rotationPitch = -this.updateRotation(this.rotationPitch, var12, var2); + this.rotationYaw = this.updateRotation(this.rotationYaw, var11, var2); + } + + private float updateRotation(float var1, float var2, float var3) { + float var4; + for(var4 = var2 - var1; var4 < -180.0F; var4 += 360.0F) { + } + + while(var4 >= 180.0F) { + var4 -= 360.0F; + } + + if(var4 > var3) { + var4 = var3; + } + + if(var4 < -var3) { + var4 = -var3; + } + + return var1 + var4; + } + + public void func_6392_F() { + } + + public boolean getCanSpawnHere() { + return this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox); + } + + protected void func_4034_G() { + this.canAttackEntity((Entity)null, 4); + } + + public float getSwingProgress(float var1) { + float var2 = this.swingProgress - this.prevSwingProgress; + if(var2 < 0.0F) { + ++var2; + } + + return this.prevSwingProgress + var2 * var1; + } + + public Vec3D getPosition(float var1) { + if(var1 == 1.0F) { + return Vec3D.createVector(this.posX, this.posY, this.posZ); + } else { + double var2 = this.prevPosX + (this.posX - this.prevPosX) * (double)var1; + double var4 = this.prevPosY + (this.posY - this.prevPosY) * (double)var1; + double var6 = this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var1; + return Vec3D.createVector(var2, var4, var6); + } + } + + public Vec3D func_4037_H() { + return this.getLook(1.0F); + } + + public Vec3D getLook(float var1) { + float var2; + float var3; + float var4; + float var5; + if(var1 == 1.0F) { + var2 = MathHelper.cos(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI); + var3 = MathHelper.sin(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI); + var4 = -MathHelper.cos(-this.rotationPitch * ((float)Math.PI / 180.0F)); + var5 = MathHelper.sin(-this.rotationPitch * ((float)Math.PI / 180.0F)); + return Vec3D.createVector((double)(var3 * var4), (double)var5, (double)(var2 * var4)); + } else { + var2 = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * var1; + var3 = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * var1; + var4 = MathHelper.cos(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI); + var5 = MathHelper.sin(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var6 = -MathHelper.cos(-var2 * ((float)Math.PI / 180.0F)); + float var7 = MathHelper.sin(-var2 * ((float)Math.PI / 180.0F)); + return Vec3D.createVector((double)(var5 * var6), (double)var7, (double)(var4 * var6)); + } + } + + public MovingObjectPosition rayTrace(double var1, float var3) { + Vec3D var4 = this.getPosition(var3); + Vec3D var5 = this.getLook(var3); + Vec3D var6 = var4.addVector(var5.xCoord * var1, var5.yCoord * var1, var5.zCoord * var1); + return this.worldObj.rayTraceBlocks(var4, var6); + } + + public int func_6391_i() { + return 4; + } + + public ItemStack getHeldItem() { + return null; + } + + public void func_9282_a(byte var1) { + if(var1 == 2) { + this.field_704_R = 1.5F; + this.field_9306_bj = this.field_9366_o; + this.hurtTime = this.field_9332_M = 10; + this.field_9331_N = 0.0F; + this.worldObj.playSoundAtEntity(this, this.getHurtSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + this.canAttackEntity((Entity)null, 0); + } else if(var1 == 3) { + this.worldObj.playSoundAtEntity(this, this.getDeathSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + this.health = 0; + this.onDeath((Entity)null); + } else { + super.func_9282_a(var1); + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityMinecart.java b/src/main/java/net/minecraft/src/EntityMinecart.java new file mode 100644 index 0000000..223f377 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityMinecart.java @@ -0,0 +1,707 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityMinecart extends Entity implements IInventory { + private ItemStack[] cargoItems; + public int a; + public int b; + public int c; + private boolean field_856_i; + public int d; + public int fuel; + 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}}}; + private int field_9415_k; + private double field_9414_l; + private double field_9413_m; + private double field_9412_n; + private double field_9411_o; + private double field_9410_p; + private double field_9409_q; + private double field_9408_r; + private double field_9407_s; + + public EntityMinecart(World var1) { + super(var1); + this.cargoItems = new ItemStack[36]; + this.a = 0; + this.b = 0; + this.c = 1; + this.field_856_i = false; + this.field_618_ad = true; + this.setSize(0.98F, 0.7F); + this.yOffset = this.height / 2.0F; + this.entityWalks = false; + } + + public AxisAlignedBB func_383_b_(Entity var1) { + return var1.boundingBox; + } + + public AxisAlignedBB func_372_f_() { + return null; + } + + public boolean canBePushed() { + return true; + } + + public EntityMinecart(World var1, double var2, double var4, double var6, int var8) { + this(var1); + this.setPosition(var2, var4 + (double)this.yOffset, var6); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.prevPosX = var2; + this.prevPosY = var4; + this.prevPosZ = var6; + this.d = var8; + } + + public double func_402_h() { + return (double)this.height * 0.0D - (double)0.3F; + } + + public boolean canAttackEntity(Entity var1, int var2) { + if(!this.isDead) { + this.c = -this.c; + this.b = 10; + this.func_9281_M(); + this.a += var2 * 10; + if(this.a > 40) { + this.dropItemWithOffset(Item.minecartEmpty.shiftedIndex, 1, 0.0F); + if(this.d == 1) { + this.dropItemWithOffset(Block.crate.blockID, 1, 0.0F); + } else if(this.d == 2) { + this.dropItemWithOffset(Block.stoneOvenIdle.blockID, 1, 0.0F); + } + + this.setEntityDead(); + } + + return true; + } else { + return true; + } + } + + public void func_9280_g() { + System.out.println("Animating hurt"); + this.c = -this.c; + this.b = 10; + this.a += this.a * 10; + } + + public boolean canBeCollidedWith() { + return !this.isDead; + } + + public void setEntityDead() { + for(int var1 = 0; var1 < this.getSizeInventory(); ++var1) { + ItemStack var2 = this.getStackInSlot(var1); + if(var2 != null) { + float var3 = this.rand.nextFloat() * 0.8F + 0.1F; + float var4 = this.rand.nextFloat() * 0.8F + 0.1F; + float var5 = this.rand.nextFloat() * 0.8F + 0.1F; + + while(var2.stackSize > 0) { + int var6 = this.rand.nextInt(21) + 10; + if(var6 > var2.stackSize) { + var6 = var2.stackSize; + } + + var2.stackSize -= var6; + EntityItem var7 = new EntityItem(this.worldObj, this.posX + (double)var3, this.posY + (double)var4, this.posZ + (double)var5, new ItemStack(var2.itemID, var6, var2.itemDamage)); + float var8 = 0.05F; + var7.motionX = (double)((float)this.rand.nextGaussian() * var8); + var7.motionY = (double)((float)this.rand.nextGaussian() * var8 + 0.2F); + var7.motionZ = (double)((float)this.rand.nextGaussian() * var8); + this.worldObj.entityJoinedWorld(var7); + } + } + } + + super.setEntityDead(); + } + + public void onUpdate() { + if(this.b > 0) { + --this.b; + } + + if(this.a > 0) { + --this.a; + } + + double var7; + //if(this.worldObj.multiplayerWorld && this.field_9415_k > 0) { + //if(this.field_9415_k > 0) { + //double var41 = this.posX + (this.field_9414_l - this.posX) / (double)this.field_9415_k; + //double var42 = this.posY + (this.field_9413_m - this.posY) / (double)this.field_9415_k; + //double var5 = this.posZ + (this.field_9412_n - this.posZ) / (double)this.field_9415_k; + + //for(var7 = this.field_9411_o - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) { + //} + + //while(var7 >= 180.0D) { + //var7 -= 360.0D; + //} + + //this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9415_k); + //this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9410_p - (double)this.rotationPitch) / (double)this.field_9415_k); + //--this.field_9415_k; + //this.setPosition(var41, var42, var5); + //this.setRotation(this.rotationYaw, this.rotationPitch); + //} else { + //this.setPosition(this.posX, this.posY, this.posZ); + //this.setRotation(this.rotationYaw, this.rotationPitch); + //} + + //} else { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (double)0.04F; + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.posY); + int var3 = MathHelper.floor_double(this.posZ); + if(this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.minecartTrack.blockID) { + --var2; + } + + double var4 = 0.4D; + boolean var6 = false; + var7 = 1.0D / 128.0D; + if(this.worldObj.getBlockId(var1, var2, var3) == Block.minecartTrack.blockID) { + Vec3D var9 = this.func_514_g(this.posX, this.posY, this.posZ); + int var10 = this.worldObj.getBlockMetadata(var1, var2, var3); + this.posY = (double)var2; + if(var10 >= 2 && var10 <= 5) { + this.posY = (double)(var2 + 1); + } + + if(var10 == 2) { + this.motionX -= var7; + } + + if(var10 == 3) { + this.motionX += var7; + } + + if(var10 == 4) { + this.motionZ += var7; + } + + if(var10 == 5) { + this.motionZ -= var7; + } + + int[][] var11 = field_855_j[var10]; + double var12 = (double)(var11[1][0] - var11[0][0]); + double var14 = (double)(var11[1][2] - var11[0][2]); + double var16 = Math.sqrt(var12 * var12 + var14 * var14); + double var18 = this.motionX * var12 + this.motionZ * var14; + if(var18 < 0.0D) { + var12 = -var12; + var14 = -var14; + } + + double var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.motionX = var20 * var12 / var16; + this.motionZ = var20 * var14 / var16; + double var22 = 0.0D; + double var24 = (double)var1 + 0.5D + (double)var11[0][0] * 0.5D; + double var26 = (double)var3 + 0.5D + (double)var11[0][2] * 0.5D; + double var28 = (double)var1 + 0.5D + (double)var11[1][0] * 0.5D; + double var30 = (double)var3 + 0.5D + (double)var11[1][2] * 0.5D; + var12 = var28 - var24; + var14 = var30 - var26; + double var32; + double var34; + double var36; + if(var12 == 0.0D) { + this.posX = (double)var1 + 0.5D; + var22 = this.posZ - (double)var3; + } else if(var14 == 0.0D) { + this.posZ = (double)var3 + 0.5D; + var22 = this.posX - (double)var1; + } else { + var32 = this.posX - var24; + var34 = this.posZ - var26; + var36 = (var32 * var12 + var34 * var14) * 2.0D; + var22 = var36; + } + + this.posX = var24 + var12 * var22; + this.posZ = var26 + var14 * var22; + this.setPosition(this.posX, this.posY + (double)this.yOffset, this.posZ); + var32 = this.motionX; + var34 = this.motionZ; + if(this.riddenByEntity != null) { + var32 *= 0.75D; + var34 *= 0.75D; + } + + if(var32 < -var4) { + var32 = -var4; + } + + if(var32 > var4) { + var32 = var4; + } + + if(var34 < -var4) { + var34 = -var4; + } + + if(var34 > var4) { + var34 = var4; + } + + this.moveEntity(var32, 0.0D, var34); + if(var11[0][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var11[0][0] && MathHelper.floor_double(this.posZ) - var3 == var11[0][2]) { + this.setPosition(this.posX, this.posY + (double)var11[0][1], this.posZ); + } else if(var11[1][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var11[1][0] && MathHelper.floor_double(this.posZ) - var3 == var11[1][2]) { + this.setPosition(this.posX, this.posY + (double)var11[1][1], this.posZ); + } + + if(this.riddenByEntity != null) { + this.motionX *= (double)0.997F; + this.motionY *= 0.0D; + this.motionZ *= (double)0.997F; + } else { + if(this.d == 2) { + var36 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); + if(var36 > 0.01D) { + var6 = true; + this.pushX /= var36; + this.pushZ /= var36; + double var38 = 0.04D; + this.motionX *= (double)0.8F; + this.motionY *= 0.0D; + this.motionZ *= (double)0.8F; + this.motionX += this.pushX * var38; + this.motionZ += this.pushZ * var38; + } else { + this.motionX *= (double)0.9F; + this.motionY *= 0.0D; + this.motionZ *= (double)0.9F; + } + } + + this.motionX *= (double)0.96F; + this.motionY *= 0.0D; + this.motionZ *= (double)0.96F; + } + + Vec3D var46 = this.func_514_g(this.posX, this.posY, this.posZ); + if(var46 != null && var9 != null) { + double var37 = (var9.yCoord - var46.yCoord) * 0.05D; + var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + if(var20 > 0.0D) { + this.motionX = this.motionX / var20 * (var20 + var37); + this.motionZ = this.motionZ / var20 * (var20 + var37); + } + + this.setPosition(this.posX, var46.yCoord, this.posZ); + } + + int var47 = MathHelper.floor_double(this.posX); + int var48 = MathHelper.floor_double(this.posZ); + if(var47 != var1 || var48 != var3) { + var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.motionX = var20 * (double)(var47 - var1); + this.motionZ = var20 * (double)(var48 - var3); + } + + if(this.d == 2) { + double var39 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); + if(var39 > 0.01D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) { + this.pushX /= var39; + this.pushZ /= var39; + 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; + } + } + } + } else { + if(this.motionX < -var4) { + this.motionX = -var4; + } + + if(this.motionX > var4) { + this.motionX = var4; + } + + if(this.motionZ < -var4) { + this.motionZ = -var4; + } + + if(this.motionZ > var4) { + this.motionZ = var4; + } + + if(this.onGround) { + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + if(!this.onGround) { + this.motionX *= (double)0.95F; + this.motionY *= (double)0.95F; + this.motionZ *= (double)0.95F; + } + } + + this.rotationPitch = 0.0F; + double var43 = this.prevPosX - this.posX; + double var44 = this.prevPosZ - this.posZ; + if(var43 * var43 + var44 * var44 > 0.001D) { + this.rotationYaw = (float)(Math.atan2(var44, var43) * 180.0D / Math.PI); + if(this.field_856_i) { + this.rotationYaw += 180.0F; + } + } + + double var13; + for(var13 = (double)(this.rotationYaw - this.prevRotationYaw); var13 >= 180.0D; var13 -= 360.0D) { + } + + while(var13 < -180.0D) { + var13 += 360.0D; + } + + if(var13 < -170.0D || var13 >= 170.0D) { + this.rotationYaw += 180.0F; + this.field_856_i = !this.field_856_i; + } + + this.setRotation(this.rotationYaw, this.rotationPitch); + List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F)); + if(var15 != null && var15.size() > 0) { + for(int var45 = 0; var45 < var15.size(); ++var45) { + Entity var17 = (Entity)var15.get(var45); + if(var17 != this.riddenByEntity && var17.canBePushed() && var17 instanceof EntityMinecart) { + var17.applyEntityCollision(this); + } + } + } + + if(this.riddenByEntity != null && this.riddenByEntity.isDead) { + this.riddenByEntity = null; + } + + if(var6 && this.rand.nextInt(4) == 0) { + --this.fuel; + if(this.fuel < 0) { + this.pushX = this.pushZ = 0.0D; + } + + this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D); + } + + //} + } + + public Vec3D func_515_a(double var1, double var3, double var5, double var7) { + int var9 = MathHelper.floor_double(var1); + int var10 = MathHelper.floor_double(var3); + int var11 = MathHelper.floor_double(var5); + if(this.worldObj.getBlockId(var9, var10 - 1, var11) == Block.minecartTrack.blockID) { + --var10; + } + + if(this.worldObj.getBlockId(var9, var10, var11) == Block.minecartTrack.blockID) { + int var12 = this.worldObj.getBlockMetadata(var9, var10, var11); + var3 = (double)var10; + if(var12 >= 2 && var12 <= 5) { + var3 = (double)(var10 + 1); + } + + int[][] var13 = field_855_j[var12]; + double var14 = (double)(var13[1][0] - var13[0][0]); + double var16 = (double)(var13[1][2] - var13[0][2]); + double var18 = Math.sqrt(var14 * var14 + var16 * var16); + var14 /= var18; + var16 /= var18; + var1 += var14 * var7; + var5 += var16 * var7; + if(var13[0][1] != 0 && MathHelper.floor_double(var1) - var9 == var13[0][0] && MathHelper.floor_double(var5) - var11 == var13[0][2]) { + var3 += (double)var13[0][1]; + } else if(var13[1][1] != 0 && MathHelper.floor_double(var1) - var9 == var13[1][0] && MathHelper.floor_double(var5) - var11 == var13[1][2]) { + var3 += (double)var13[1][1]; + } + + return this.func_514_g(var1, var3, var5); + } else { + return null; + } + } + + public Vec3D func_514_g(double var1, double var3, double var5) { + int var7 = MathHelper.floor_double(var1); + int var8 = MathHelper.floor_double(var3); + int var9 = MathHelper.floor_double(var5); + if(this.worldObj.getBlockId(var7, var8 - 1, var9) == Block.minecartTrack.blockID) { + --var8; + } + + if(this.worldObj.getBlockId(var7, var8, var9) == Block.minecartTrack.blockID) { + int var10 = this.worldObj.getBlockMetadata(var7, var8, var9); + var3 = (double)var8; + if(var10 >= 2 && var10 <= 5) { + var3 = (double)(var8 + 1); + } + + int[][] var11 = field_855_j[var10]; + double var12 = 0.0D; + double var14 = (double)var7 + 0.5D + (double)var11[0][0] * 0.5D; + double var16 = (double)var8 + 0.5D + (double)var11[0][1] * 0.5D; + double var18 = (double)var9 + 0.5D + (double)var11[0][2] * 0.5D; + double var20 = (double)var7 + 0.5D + (double)var11[1][0] * 0.5D; + double var22 = (double)var8 + 0.5D + (double)var11[1][1] * 0.5D; + double var24 = (double)var9 + 0.5D + (double)var11[1][2] * 0.5D; + double var26 = var20 - var14; + double var28 = (var22 - var16) * 2.0D; + double var30 = var24 - var18; + if(var26 == 0.0D) { + var1 = (double)var7 + 0.5D; + var12 = var5 - (double)var9; + } else if(var30 == 0.0D) { + var5 = (double)var9 + 0.5D; + var12 = var1 - (double)var7; + } else { + double var32 = var1 - var14; + double var34 = var5 - var18; + double var36 = (var32 * var26 + var34 * var30) * 2.0D; + var12 = var36; + } + + var1 = var14 + var26 * var12; + var3 = var16 + var28 * var12; + var5 = var18 + var30 * var12; + if(var28 < 0.0D) { + ++var3; + } + + if(var28 > 0.0D) { + var3 += 0.5D; + } + + return Vec3D.createVector(var1, var3, var5); + } else { + return null; + } + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + var1.setInteger("Type", this.d); + if(this.d == 2) { + var1.setDouble("PushX", this.pushX); + var1.setDouble("PushZ", this.pushZ); + var1.setShort("Fuel", (short)this.fuel); + } else if(this.d == 1) { + NBTTagList var2 = new NBTTagList(); + + for(int var3 = 0; var3 < this.cargoItems.length; ++var3) { + if(this.cargoItems[var3] != null) { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.cargoItems[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Items", var2); + } + + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + this.d = var1.getInteger("Type"); + if(this.d == 2) { + this.pushX = var1.getDouble("PushX"); + this.pushZ = var1.getDouble("PushZ"); + this.fuel = var1.getShort("Fuel"); + } else if(this.d == 1) { + NBTTagList var2 = var1.getTagList("Items"); + this.cargoItems = new ItemStack[this.getSizeInventory()]; + + for(int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + int var5 = var4.getByte("Slot") & 255; + if(var5 >= 0 && var5 < this.cargoItems.length) { + this.cargoItems[var5] = new ItemStack(var4); + } + } + } + + } + + public float func_392_h_() { + return 0.0F; + } + + public void applyEntityCollision(Entity var1) { + //if(!this.worldObj.multiplayerWorld) { + if(var1 != this.riddenByEntity) { + if(var1 instanceof EntityLiving && !(var1 instanceof EntityPlayer) && this.d == 0 && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && var1.ridingEntity == null) { + var1.mountEntity(this); + } + + double var2 = var1.posX - this.posX; + double var4 = var1.posZ - this.posZ; + double var6 = var2 * var2 + var4 * var4; + if(var6 >= (double)1.0E-4F) { + var6 = (double)MathHelper.sqrt_double(var6); + var2 /= var6; + var4 /= var6; + double var8 = 1.0D / var6; + if(var8 > 1.0D) { + var8 = 1.0D; + } + + var2 *= var8; + var4 *= var8; + var2 *= (double)0.1F; + var4 *= (double)0.1F; + var2 *= (double)(1.0F - this.field_632_aO); + var4 *= (double)(1.0F - this.field_632_aO); + var2 *= 0.5D; + var4 *= 0.5D; + if(var1 instanceof EntityMinecart) { + double var10 = var1.motionX + this.motionX; + double var12 = var1.motionZ + this.motionZ; + if(((EntityMinecart)var1).d == 2 && this.d != 2) { + this.motionX *= (double)0.2F; + this.motionZ *= (double)0.2F; + this.addVelocity(var1.motionX - var2, 0.0D, var1.motionZ - var4); + var1.motionX *= (double)0.7F; + var1.motionZ *= (double)0.7F; + } else if(((EntityMinecart)var1).d != 2 && this.d == 2) { + var1.motionX *= (double)0.2F; + var1.motionZ *= (double)0.2F; + var1.addVelocity(this.motionX + var2, 0.0D, this.motionZ + var4); + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } else { + var10 /= 2.0D; + var12 /= 2.0D; + this.motionX *= (double)0.2F; + this.motionZ *= (double)0.2F; + this.addVelocity(var10 - var2, 0.0D, var12 - var4); + var1.motionX *= (double)0.2F; + var1.motionZ *= (double)0.2F; + var1.addVelocity(var10 + var2, 0.0D, var12 + var4); + } + } else { + this.addVelocity(-var2, 0.0D, -var4); + var1.addVelocity(var2 / 4.0D, 0.0D, var4 / 4.0D); + } + } + + } + //} + } + + public int getSizeInventory() { + return 27; + } + + public ItemStack getStackInSlot(int var1) { + return this.cargoItems[var1]; + } + + public ItemStack decrStackSize(int var1, int var2) { + if(this.cargoItems[var1] != null) { + ItemStack var3; + if(this.cargoItems[var1].stackSize <= var2) { + var3 = this.cargoItems[var1]; + this.cargoItems[var1] = null; + return var3; + } else { + var3 = this.cargoItems[var1].splitStack(var2); + if(this.cargoItems[var1].stackSize == 0) { + this.cargoItems[var1] = null; + } + + return var3; + } + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + this.cargoItems[var1] = var2; + if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) { + var2.stackSize = this.getInventoryStackLimit(); + } + + } + + public String getInvName() { + return "Minecart"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public void onInventoryChanged() { + } + + public boolean interact(EntityPlayer var1) { + if(this.d == 0) { + if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) { + return true; + } + + //if(!this.worldObj.multiplayerWorld) { + var1.mountEntity(this); + //} + } else if(this.d == 1) { + var1.displayGUIChest(this); + } else if(this.d == 2) { + ItemStack var2 = var1.inventory.getCurrentItem(); + if(var2 != null && var2.itemID == Item.coal.shiftedIndex) { + if(--var2.stackSize == 0) { + var1.inventory.setInventorySlotContents(var1.inventory.currentItem, (ItemStack)null); + } + + this.fuel += 1200; + } + + this.pushX = this.posX - var1.posX; + this.pushZ = this.posZ - var1.posZ; + } + + return true; + } + + public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) { + this.field_9414_l = var1; + this.field_9413_m = var3; + this.field_9412_n = var5; + this.field_9411_o = (double)var7; + this.field_9410_p = (double)var8; + this.field_9415_k = var9 + 2; + this.motionX = this.field_9409_q; + this.motionY = this.field_9408_r; + this.motionZ = this.field_9407_s; + } + + public void setVelocity(double var1, double var3, double var5) { + this.field_9409_q = this.motionX = var1; + this.field_9408_r = this.motionY = var3; + this.field_9407_s = this.motionZ = var5; + } +} diff --git a/src/main/java/net/minecraft/src/EntityMobs.java b/src/main/java/net/minecraft/src/EntityMobs.java new file mode 100644 index 0000000..72ef820 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityMobs.java @@ -0,0 +1,80 @@ +package net.minecraft.src; + +public class EntityMobs extends EntityCreature implements IMobs { + protected int field_762_e = 2; + + public EntityMobs(World var1) { + super(var1); + this.health = 20; + } + + public void onLivingUpdate() { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F) { + this.field_9344_ag += 2; + } + + super.onLivingUpdate(); + } + + public void onUpdate() { + super.onUpdate(); + if(this.worldObj.difficultySetting == 0) { + this.setEntityDead(); + } + + } + + protected Entity findPlayerToAttack() { + EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D); + return var1 != null && this.canEntityBeSeen(var1) ? var1 : null; + } + + public boolean canAttackEntity(Entity var1, int var2) { + if(super.canAttackEntity(var1, var2)) { + if(this.riddenByEntity != var1 && this.ridingEntity != var1) { + if(var1 != this) { + this.playerToAttack = var1; + } + + return true; + } else { + return true; + } + } else { + return false; + } + } + + protected void attackEntity(Entity var1, float var2) { + if((double)var2 < 2.5D && var1.boundingBox.maxY > this.boundingBox.minY && var1.boundingBox.minY < this.boundingBox.maxY) { + this.attackTime = 20; + var1.canAttackEntity(this, this.field_762_e); + } + + } + + protected float func_439_a(int var1, int var2, int var3) { + return 0.5F - this.worldObj.getLightBrightness(var1, var2, var3); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + public boolean getCanSpawnHere() { + int var1 = MathHelper.floor_double(this.posX); + int var2 = MathHelper.floor_double(this.boundingBox.minY); + int var3 = MathHelper.floor_double(this.posZ); + if(this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, var1, var2, var3) > this.rand.nextInt(32)) { + return false; + } else { + int var4 = this.worldObj.getBlockLightValue(var1, var2, var3); + return var4 <= this.rand.nextInt(8) && super.getCanSpawnHere(); + } + } +} diff --git a/src/main/java/net/minecraft/src/EntityPainting.java b/src/main/java/net/minecraft/src/EntityPainting.java new file mode 100644 index 0000000..94715ae --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPainting.java @@ -0,0 +1,213 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +public class EntityPainting extends Entity { + private int field_695_c; + public int field_691_a; + private int field_9322_d; + private int field_9321_e; + private int field_9320_f; + public EnumArt field_690_b; + + public EntityPainting(World var1) { + super(var1); + this.field_695_c = 0; + this.field_691_a = 0; + this.yOffset = 0.0F; + this.setSize(0.5F, 0.5F); + } + + public EntityPainting(World var1, int var2, int var3, int var4, int var5) { + this(var1); + this.field_9322_d = var2; + this.field_9321_e = var3; + this.field_9320_f = var4; + ArrayList var6 = new ArrayList(); + EnumArt[] var7 = EnumArt.values(); + int var8 = var7.length; + + for(int var9 = 0; var9 < var8; ++var9) { + EnumArt var10 = var7[var9]; + this.field_690_b = var10; + this.func_412_b(var5); + if(this.func_410_i()) { + var6.add(var10); + } + } + + if(var6.size() > 0) { + this.field_690_b = (EnumArt)var6.get(this.rand.nextInt(var6.size())); + } + + this.func_412_b(var5); + } + + public void func_412_b(int var1) { + this.field_691_a = var1; + this.prevRotationYaw = this.rotationYaw = (float)(var1 * 90); + float var2 = (float)this.field_690_b.field_1623_z; + float var3 = (float)this.field_690_b.field_1636_A; + float var4 = (float)this.field_690_b.field_1623_z; + if(var1 != 0 && var1 != 2) { + var2 = 0.5F; + } else { + var4 = 0.5F; + } + + var2 /= 32.0F; + var3 /= 32.0F; + var4 /= 32.0F; + float var5 = (float)this.field_9322_d + 0.5F; + float var6 = (float)this.field_9321_e + 0.5F; + float var7 = (float)this.field_9320_f + 0.5F; + float var8 = 9.0F / 16.0F; + if(var1 == 0) { + var7 -= var8; + } + + if(var1 == 1) { + var5 -= var8; + } + + if(var1 == 2) { + var7 += var8; + } + + if(var1 == 3) { + var5 += var8; + } + + if(var1 == 0) { + var5 -= this.func_411_c(this.field_690_b.field_1623_z); + } + + if(var1 == 1) { + var7 += this.func_411_c(this.field_690_b.field_1623_z); + } + + if(var1 == 2) { + var5 += this.func_411_c(this.field_690_b.field_1623_z); + } + + if(var1 == 3) { + var7 -= this.func_411_c(this.field_690_b.field_1623_z); + } + + var6 += this.func_411_c(this.field_690_b.field_1636_A); + this.setPosition((double)var5, (double)var6, (double)var7); + float var9 = -(0.1F / 16.0F); + this.boundingBox.setBounds((double)(var5 - var2 - var9), (double)(var6 - var3 - var9), (double)(var7 - var4 - var9), (double)(var5 + var2 + var9), (double)(var6 + var3 + var9), (double)(var7 + var4 + var9)); + } + + private float func_411_c(int var1) { + return var1 == 32 ? 0.5F : (var1 == 64 ? 0.5F : 0.0F); + } + + public void onUpdate() { + if(this.field_695_c++ == 100 && !this.func_410_i()) { + this.field_695_c = 0; + this.setEntityDead(); + this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting))); + } + + } + + public boolean func_410_i() { + if(this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() > 0) { + return false; + } else { + int var1 = this.field_690_b.field_1623_z / 16; + int var2 = this.field_690_b.field_1636_A / 16; + int var3 = this.field_9322_d; + int var4 = this.field_9321_e; + int var5 = this.field_9320_f; + if(this.field_691_a == 0) { + var3 = MathHelper.floor_double(this.posX - (double)((float)this.field_690_b.field_1623_z / 32.0F)); + } + + if(this.field_691_a == 1) { + var5 = MathHelper.floor_double(this.posZ - (double)((float)this.field_690_b.field_1623_z / 32.0F)); + } + + if(this.field_691_a == 2) { + var3 = MathHelper.floor_double(this.posX - (double)((float)this.field_690_b.field_1623_z / 32.0F)); + } + + if(this.field_691_a == 3) { + var5 = MathHelper.floor_double(this.posZ - (double)((float)this.field_690_b.field_1623_z / 32.0F)); + } + + var4 = MathHelper.floor_double(this.posY - (double)((float)this.field_690_b.field_1636_A / 32.0F)); + + int var7; + for(int var6 = 0; var6 < var1; ++var6) { + for(var7 = 0; var7 < var2; ++var7) { + Material var8; + if(this.field_691_a != 0 && this.field_691_a != 2) { + var8 = this.worldObj.getBlockMaterial(this.field_9322_d, var4 + var7, var5 + var6); + } else { + var8 = this.worldObj.getBlockMaterial(var3 + var6, var4 + var7, this.field_9320_f); + } + + if(!var8.func_878_a()) { + return false; + } + } + } + + List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox); + + for(var7 = 0; var7 < var9.size(); ++var7) { + if(var9.get(var7) instanceof EntityPainting) { + return false; + } + } + + return true; + } + } + + public boolean canBeCollidedWith() { + return true; + } + + public boolean canAttackEntity(Entity var1, int var2) { + this.setEntityDead(); + this.func_9281_M(); + this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting))); + return true; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setByte("Dir", (byte)this.field_691_a); + var1.setString("Motive", this.field_690_b.field_1624_y); + var1.setInteger("TileX", this.field_9322_d); + var1.setInteger("TileY", this.field_9321_e); + var1.setInteger("TileZ", this.field_9320_f); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.field_691_a = var1.getByte("Dir"); + this.field_9322_d = var1.getInteger("TileX"); + this.field_9321_e = var1.getInteger("TileY"); + this.field_9320_f = var1.getInteger("TileZ"); + String var2 = var1.getString("Motive"); + EnumArt[] var3 = EnumArt.values(); + int var4 = var3.length; + + for(int var5 = 0; var5 < var4; ++var5) { + EnumArt var6 = var3[var5]; + if(var6.field_1624_y.equals(var2)) { + this.field_690_b = var6; + } + } + + if(this.field_690_b == null) { + this.field_690_b = EnumArt.Kebab; + } + + this.func_412_b(this.field_691_a); + } +} diff --git a/src/main/java/net/minecraft/src/EntityPickupFX.java b/src/main/java/net/minecraft/src/EntityPickupFX.java new file mode 100644 index 0000000..d5f3bd3 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPickupFX.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class EntityPickupFX extends EntityFX { + private Entity field_675_a; + private Entity field_679_o; + private int field_678_p = 0; + private int field_677_q = 0; + private float field_676_r; + + public EntityPickupFX(World var1, Entity var2, Entity var3, float var4) { + super(var1, var2.posX, var2.posY, var2.posZ, var2.motionX, var2.motionY, var2.motionZ); + this.field_675_a = var2; + this.field_679_o = var3; + this.field_677_q = 3; + this.field_676_r = var4; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.field_678_p + var2) / (float)this.field_677_q; + var8 *= var8; + double var9 = this.field_675_a.posX; + double var11 = this.field_675_a.posY; + double var13 = this.field_675_a.posZ; + double var15 = this.field_679_o.lastTickPosX + (this.field_679_o.posX - this.field_679_o.lastTickPosX) * (double)var2; + double var17 = this.field_679_o.lastTickPosY + (this.field_679_o.posY - this.field_679_o.lastTickPosY) * (double)var2 + (double)this.field_676_r; + double var19 = this.field_679_o.lastTickPosZ + (this.field_679_o.posZ - this.field_679_o.lastTickPosZ) * (double)var2; + double var21 = var9 + (var15 - var9) * (double)var8; + double var23 = var11 + (var17 - var11) * (double)var8; + double var25 = var13 + (var19 - var13) * (double)var8; + int var27 = MathHelper.floor_double(var21); + int var28 = MathHelper.floor_double(var23 + (double)(this.yOffset / 2.0F)); + int var29 = MathHelper.floor_double(var25); + float var30 = this.worldObj.getLightBrightness(var27, var28, var29); + var21 -= field_660_l; + var23 -= field_659_m; + var25 -= field_658_n; + GL11.glColor4f(var30, var30, var30, 1.0F); + RenderManager.instance.func_853_a(this.field_675_a, (double)((float)var21), (double)((float)var23), (double)((float)var25), this.field_675_a.rotationYaw, var2); + } + + public void onUpdate() { + ++this.field_678_p; + if(this.field_678_p == this.field_677_q) { + this.setEntityDead(); + } + + } + + public int func_404_c() { + return 3; + } +} diff --git a/src/main/java/net/minecraft/src/EntityPig.java b/src/main/java/net/minecraft/src/EntityPig.java new file mode 100644 index 0000000..5f32afc --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPig.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +public class EntityPig extends EntityAnimals { + public boolean rideable = false; + + public EntityPig(World var1) { + super(var1); + this.texture = "/mob/pig.png"; + this.setSize(0.9F, 0.9F); + this.rideable = false; + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setBoolean("Saddle", this.rideable); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.rideable = var1.getBoolean("Saddle"); + } + + protected String getLivingSound() { + return "mob.pig"; + } + + protected String getHurtSound() { + return "mob.pig"; + } + + protected String getDeathSound() { + return "mob.pigdeath"; + } + + public boolean interact(EntityPlayer var1) { + if(this.rideable) { + var1.mountEntity(this); + return true; + } else { + return false; + } + } + + protected int getDropItemId() { + return Item.porkRaw.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/EntityPigZombie.java b/src/main/java/net/minecraft/src/EntityPigZombie.java new file mode 100644 index 0000000..0812686 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPigZombie.java @@ -0,0 +1,92 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityPigZombie extends EntityZombie { + private int angerLevel = 0; + private int randomSoundDelay = 0; + private static final ItemStack defaultHeldItem = new ItemStack(Item.swordGold, 1); + + public EntityPigZombie(World var1) { + super(var1); + this.texture = "/mob/pigzombie.png"; + this.field_9333_am = 0.5F; + this.field_762_e = 5; + this.isImmuneToFire = true; + } + + public void onUpdate() { + this.field_9333_am = this.playerToAttack != null ? 0.95F : 0.5F; + if(this.randomSoundDelay > 0 && --this.randomSoundDelay == 0) { + this.worldObj.playSoundAtEntity(this, "mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F); + } + + super.onUpdate(); + } + + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setShort("Anger", (short)this.angerLevel); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.angerLevel = var1.getShort("Anger"); + } + + protected Entity findPlayerToAttack() { + return this.angerLevel == 0 ? null : super.findPlayerToAttack(); + } + + public void onLivingUpdate() { + super.onLivingUpdate(); + } + + public boolean canAttackEntity(Entity var1, int var2) { + if(var1 instanceof EntityPlayer) { + List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands(32.0D, 32.0D, 32.0D)); + + for(int var4 = 0; var4 < var3.size(); ++var4) { + Entity var5 = (Entity)var3.get(var4); + if(var5 instanceof EntityPigZombie) { + EntityPigZombie var6 = (EntityPigZombie)var5; + var6.becomeAngryAt(var1); + } + } + + this.becomeAngryAt(var1); + } + + return super.canAttackEntity(var1, var2); + } + + private void becomeAngryAt(Entity var1) { + this.playerToAttack = var1; + this.angerLevel = 400 + this.rand.nextInt(400); + this.randomSoundDelay = this.rand.nextInt(40); + } + + protected String getLivingSound() { + return "mob.zombiepig.zpig"; + } + + protected String getHurtSound() { + return "mob.zombiepig.zpighurt"; + } + + protected String getDeathSound() { + return "mob.zombiepig.zpigdeath"; + } + + protected int getDropItemId() { + return Item.porkCooked.shiftedIndex; + } + + public ItemStack getHeldItem() { + return defaultHeldItem; + } +} diff --git a/src/main/java/net/minecraft/src/EntityPlayer.java b/src/main/java/net/minecraft/src/EntityPlayer.java new file mode 100644 index 0000000..1b503df --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPlayer.java @@ -0,0 +1,281 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntityPlayer extends EntityLiving { + public InventoryPlayer inventory = new InventoryPlayer(this); + public byte field_9371_f = 0; + public int score = 0; + public float field_775_e; + public float field_774_f; + public boolean field_9369_j = false; + public int field_9368_k = 0; + public String field_771_i; + public int dimension; + private int field_781_a = 0; + public EntityFish fishEntity = null; + + public EntityPlayer(World var1) { + super(var1); + this.yOffset = 1.62F; + this.setLocationAndAngles((double)var1.spawnX + 0.5D, (double)(var1.spawnY + 1), (double)var1.spawnZ + 0.5D, 0.0F, 0.0F); + this.health = 20; + this.field_9351_C = "humanoid"; + this.field_9353_B = 180.0F; + this.field_9310_bf = 20; + this.texture = "/mob/char.png"; + } + + public void func_350_p() { + super.func_350_p(); + this.field_775_e = this.field_774_f; + this.field_774_f = 0.0F; + } + + public void preparePlayerToSpawn() { + this.yOffset = 1.62F; + this.setSize(0.6F, 1.8F); + super.preparePlayerToSpawn(); + this.health = 20; + this.deathTime = 0; + } + + protected void func_418_b_() { + if(this.field_9369_j) { + ++this.field_9368_k; + if(this.field_9368_k == 8) { + this.field_9368_k = 0; + this.field_9369_j = false; + } + } else { + this.field_9368_k = 0; + } + + this.swingProgress = (float)this.field_9368_k / 8.0F; + } + + public void onLivingUpdate() { + if(this.worldObj.difficultySetting == 0 && this.health < 20 && this.field_9311_be % 20 * 4 == 0) { + this.heal(1); + } + + this.inventory.decrementAnimations(); + this.field_775_e = this.field_774_f; + super.onLivingUpdate(); + float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + float var2 = (float)Math.atan(-this.motionY * (double)0.2F) * 15.0F; + if(var1 > 0.1F) { + var1 = 0.1F; + } + + if(!this.onGround || this.health <= 0) { + var1 = 0.0F; + } + + if(this.onGround || this.health <= 0) { + var2 = 0.0F; + } + + this.field_774_f += (var1 - this.field_774_f) * 0.4F; + this.field_9328_R += (var2 - this.field_9328_R) * 0.8F; + if(this.health > 0) { + List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands(1.0D, 0.0D, 1.0D)); + if(var3 != null) { + for(int var4 = 0; var4 < var3.size(); ++var4) { + this.func_451_h((Entity)var3.get(var4)); + } + } + } + + } + + private void func_451_h(Entity var1) { + var1.onCollideWithPlayer(this); + } + + public int func_6417_t() { + return this.score; + } + + public void onDeath(Entity var1) { + super.onDeath(var1); + this.setSize(0.2F, 0.2F); + this.setPosition(this.posX, this.posY, this.posZ); + this.motionY = (double)0.1F; + if(this.field_771_i.equals("Notch")) { + this.dropPlayerItemWithRandomChoice(new ItemStack(Item.appleRed, 1), true); + } + + this.inventory.dropAllItems(); + if(var1 != null) { + this.motionX = (double)(-MathHelper.cos((this.field_9331_N + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F); + this.motionZ = (double)(-MathHelper.sin((this.field_9331_N + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F); + } else { + this.motionX = this.motionZ = 0.0D; + } + + this.yOffset = 0.1F; + } + + public void addToPlayerScore(Entity var1, int var2) { + this.score += var2; + } + + public void dropPlayerItem(ItemStack var1) { + this.dropPlayerItemWithRandomChoice(var1, false); + } + + public void dropPlayerItemWithRandomChoice(ItemStack var1, boolean var2) { + if(var1 != null) { + EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY - (double)0.3F + (double)this.func_373_s(), this.posZ, var1); + var3.field_805_c = 40; + float var4 = 0.1F; + float var5; + if(var2) { + var5 = this.rand.nextFloat() * 0.5F; + float var6 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + var3.motionX = (double)(-MathHelper.sin(var6) * var5); + var3.motionZ = (double)(MathHelper.cos(var6) * var5); + var3.motionY = (double)0.2F; + } else { + var4 = 0.3F; + var3.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4); + var3.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4); + var3.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var4 + 0.1F); + var4 = 0.02F; + var5 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + var4 *= this.rand.nextFloat(); + var3.motionX += Math.cos((double)var5) * (double)var4; + var3.motionY += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F); + var3.motionZ += Math.sin((double)var5) * (double)var4; + } + + this.joinEntityItemWithWorld(var3); + } + } + + protected void joinEntityItemWithWorld(EntityItem var1) { + this.worldObj.entityJoinedWorld(var1); + } + + public float getCurrentPlayerStrVsBlock(Block var1) { + float var2 = this.inventory.getStrVsBlock(var1); + if(this.isInsideOfMaterial(Material.water)) { + var2 /= 5.0F; + } + + if(!this.onGround) { + var2 /= 5.0F; + } + + return var2; + } + + public boolean canHarvestBlock(Block var1) { + return this.inventory.canHarvestBlock(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + NBTTagList var2 = var1.getTagList("Inventory"); + this.inventory.readFromNBT(var2); + this.dimension = var1.getInteger("Dimension"); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setTag("Inventory", this.inventory.writeToNBT(new NBTTagList())); + var1.setInteger("Dimension", this.dimension); + } + + public void displayGUIChest(IInventory var1) { + } + + public void displayWorkbenchGUI() { + } + + public void func_443_a_(Entity var1, int var2) { + } + + public float func_373_s() { + return 0.12F; + } + + public boolean canAttackEntity(Entity var1, int var2) { + this.field_9344_ag = 0; + if(this.health <= 0) { + return false; + } else { + if(var1 instanceof EntityMobs || var1 instanceof EntityArrow) { + if(this.worldObj.difficultySetting == 0) { + var2 = 0; + } + + if(this.worldObj.difficultySetting == 1) { + var2 = var2 / 3 + 1; + } + + if(this.worldObj.difficultySetting == 3) { + var2 = var2 * 3 / 2; + } + } + + return var2 == 0 ? false : super.canAttackEntity(var1, var2); + } + } + + protected void damageEntity(int var1) { + int var2 = 25 - this.inventory.getTotalArmorValue(); + int var3 = var1 * var2 + this.field_781_a; + this.inventory.damageArmor(var1); + var1 = var3 / 25; + this.field_781_a = var3 % 25; + super.damageEntity(var1); + } + + public void displayGUIFurnace(TileEntityFurnace var1) { + } + + public void displayGUIEditSign(TileEntitySign var1) { + } + + public void func_6415_a_(Entity var1) { + var1.interact(this); + } + + public ItemStack getCurrentEquippedItem() { + return this.inventory.getCurrentItem(); + } + + public void destroyCurrentEquippedItem() { + this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null); + } + + public double func_388_v() { + return (double)(this.yOffset - 0.5F); + } + + public void func_457_w() { + this.field_9368_k = -1; + this.field_9369_j = true; + } + + public void attackTargetEntityWithCurrentItem(Entity var1) { + int var2 = this.inventory.getDamageVsEntity(var1); + if(var2 > 0) { + var1.canAttackEntity(this, var2); + ItemStack var3 = this.getCurrentEquippedItem(); + if(var3 != null && var1 instanceof EntityLiving) { + var3.hitEntity((EntityLiving)var1); + if(var3.stackSize <= 0) { + var3.func_1097_a(this); + this.destroyCurrentEquippedItem(); + } + } + } + + } + + public void func_9367_r() { + } +} diff --git a/src/main/java/net/minecraft/src/EntityPlayerSP.java b/src/main/java/net/minecraft/src/EntityPlayerSP.java new file mode 100644 index 0000000..2f833e0 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPlayerSP.java @@ -0,0 +1,156 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +public class EntityPlayerSP extends EntityPlayer { + public MovementInput field_787_a; + private Minecraft mc; + public int field_9373_b = 20; + private boolean field_9374_bx = false; + public float field_4134_c; + public float field_4133_d; + + public EntityPlayerSP(Minecraft var1, World var2, Session var3, int var4) { + super(var2); + this.mc = var1; + this.dimension = var4; + if(var3 != null && var3.inventory != null && var3.inventory.length() > 0) { + this.skinUrl = "http://www.minecraft.net/skin/" + var3.inventory + ".png"; + System.out.println("Loading texture " + this.skinUrl); + } + + this.field_771_i = var3.inventory; + } + + public void func_418_b_() { + super.func_418_b_(); + this.field_9342_ah = this.field_787_a.field_1174_a; + this.field_9340_ai = this.field_787_a.field_1173_b; + this.isJumping = this.field_787_a.field_1176_d; + } + + public void onLivingUpdate() { + this.field_4133_d = this.field_4134_c; + if(this.field_9374_bx) { + this.field_4134_c += 0.0125F; + if(this.field_4134_c >= 1.0F) { + this.field_4134_c = 1.0F; + this.field_9373_b = 10; + this.mc.func_6237_k(); + } + + this.field_9374_bx = false; + } else { + if(this.field_4134_c > 0.0F) { + this.field_4134_c -= 0.05F; + } + + if(this.field_4134_c < 0.0F) { + this.field_4134_c = 0.0F; + } + } + + if(this.field_9373_b > 0) { + --this.field_9373_b; + } + + this.field_787_a.func_797_a(this); + if(this.field_787_a.field_1175_e && this.field_9287_aY < 0.2F) { + this.field_9287_aY = 0.2F; + } + + super.onLivingUpdate(); + } + + public void func_458_k() { + this.field_787_a.func_798_a(); + } + + public void func_460_a(int var1, boolean var2) { + this.field_787_a.func_796_a(var1, var2); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setInteger("Score", this.score); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.score = var1.getInteger("Score"); + } + + public void displayGUIChest(IInventory var1) { + this.mc.displayGuiScreen(new GuiChest(this.inventory, var1)); + } + + public void displayGUIEditSign(TileEntitySign var1) { + this.mc.displayGuiScreen(new GuiEditSign(var1)); + } + + public void displayWorkbenchGUI() { + this.mc.displayGuiScreen(new GuiCrafting(this.inventory)); + } + + public void displayGUIFurnace(TileEntityFurnace var1) { + this.mc.displayGuiScreen(new GuiFurnace(this.inventory, var1)); + } + + public void func_443_a_(Entity var1, int var2) { + this.mc.field_6321_h.func_1192_a(new EntityPickupFX(this.mc.theWorld, var1, this, -0.5F)); + } + + public int getPlayerArmorValue() { + return this.inventory.getTotalArmorValue(); + } + + public void func_6415_a_(Entity var1) { + if(!var1.interact(this)) { + ItemStack var2 = this.getCurrentEquippedItem(); + if(var2 != null && var1 instanceof EntityLiving) { + var2.useItemOnEntity((EntityLiving)var1); + if(var2.stackSize <= 0) { + var2.func_1097_a(this); + this.destroyCurrentEquippedItem(); + } + } + + } + } + + public void sendChatMessage(String var1) { + } + + public void func_6420_o() { + } + + public boolean func_381_o() { + return this.field_787_a.field_1175_e; + } + + public void func_4039_q() { + if(this.field_9373_b > 0) { + this.field_9373_b = 10; + } else { + this.field_9374_bx = true; + } + } + + public void setHealth(int var1) { + int var2 = this.health - var1; + if(var2 <= 0) { + this.health = var1; + } else { + this.field_9346_af = var2; + this.field_9335_K = this.health; + this.field_9306_bj = this.field_9366_o; + this.damageEntity(var2); + this.hurtTime = this.field_9332_M = 10; + } + + } + + public void func_9367_r() { + this.mc.respawn(); + } +} diff --git a/src/main/java/net/minecraft/src/EntityPortalFX.java b/src/main/java/net/minecraft/src/EntityPortalFX.java new file mode 100644 index 0000000..484d5b7 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityPortalFX.java @@ -0,0 +1,60 @@ +package net.minecraft.src; + +public class EntityPortalFX extends EntityFX { + private float field_4083_a; + private double field_4086_p; + private double field_4085_q; + private double field_4084_r; + + public EntityPortalFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1, var2, var4, var6, var8, var10, var12); + this.motionX = var8; + this.motionY = var10; + this.motionZ = var12; + this.field_4086_p = this.posX = var2; + this.field_4085_q = this.posY = var4; + this.field_4084_r = this.posZ = var6; + float var14 = this.rand.nextFloat() * 0.6F + 0.4F; + this.field_4083_a = this.field_665_g = this.rand.nextFloat() * 0.2F + 0.5F; + this.field_663_i = this.field_662_j = this.field_661_k = 1.0F * var14; + this.field_662_j *= 0.3F; + this.field_663_i *= 0.9F; + this.field_666_f = (int)(Math.random() * 10.0D) + 40; + this.field_9314_ba = true; + this.field_670_b = (int)(Math.random() * 8.0D); + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.e + var2) / (float)this.field_666_f; + var8 = 1.0F - var8; + var8 *= var8; + var8 = 1.0F - var8; + this.field_665_g = this.field_4083_a * var8; + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public float getEntityBrightness(float var1) { + float var2 = super.getEntityBrightness(var1); + float var3 = (float)this.e / (float)this.field_666_f; + var3 *= var3; + var3 *= var3; + return var2 * (1.0F - var3) + var3; + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + float var1 = (float)this.e / (float)this.field_666_f; + float var2 = var1; + var1 = -var1 + var1 * var1 * 2.0F; + var1 = 1.0F - var1; + this.posX = this.field_4086_p + this.motionX * (double)var1; + this.posY = this.field_4085_q + this.motionY * (double)var1 + (double)(1.0F - var2); + this.posZ = this.field_4084_r + this.motionZ * (double)var1; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityRainFX.java b/src/main/java/net/minecraft/src/EntityRainFX.java new file mode 100644 index 0000000..3bd6ffa --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityRainFX.java @@ -0,0 +1,53 @@ +package net.minecraft.src; + +public class EntityRainFX extends EntityFX { + public EntityRainFX(World var1, double var2, double var4, double var6) { + super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D); + this.motionX *= (double)0.3F; + this.motionY = (double)((float)Math.random() * 0.2F + 0.1F); + this.motionZ *= (double)0.3F; + this.field_663_i = 1.0F; + this.field_662_j = 1.0F; + this.field_661_k = 1.0F; + this.field_670_b = 19 + this.rand.nextInt(4); + this.setSize(0.01F, 0.01F); + this.field_664_h = 0.06F; + this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (double)this.field_664_h; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.98F; + this.motionY *= (double)0.98F; + this.motionZ *= (double)0.98F; + if(this.field_666_f-- <= 0) { + this.setEntityDead(); + } + + if(this.onGround) { + if(Math.random() < 0.5D) { + this.setEntityDead(); + } + + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + Material var1 = this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)); + if(var1.getIsLiquid() || var1.func_878_a()) { + double var2 = (double)((float)(MathHelper.floor_double(this.posY) + 1) - BlockFluids.func_288_b(this.worldObj.getBlockMetadata(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)))); + if(this.posY < var2) { + this.setEntityDead(); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityReddustFX.java b/src/main/java/net/minecraft/src/EntityReddustFX.java new file mode 100644 index 0000000..c1a1ca4 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityReddustFX.java @@ -0,0 +1,63 @@ +package net.minecraft.src; + +public class EntityReddustFX extends EntityFX { + float field_673_a; + + public EntityReddustFX(World var1, double var2, double var4, double var6) { + this(var1, var2, var4, var6, 1.0F); + } + + public EntityReddustFX(World var1, double var2, double var4, double var6, float var8) { + super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D); + this.motionX *= (double)0.1F; + this.motionY *= (double)0.1F; + this.motionZ *= (double)0.1F; + this.field_663_i = (float)(Math.random() * (double)0.3F) + 0.7F; + this.field_662_j = this.field_661_k = (float)(Math.random() * (double)0.1F); + this.field_665_g *= 12.0F / 16.0F; + this.field_665_g *= var8; + this.field_673_a = this.field_665_g; + this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + this.field_666_f = (int)((float)this.field_666_f * var8); + this.field_9314_ba = false; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.e + var2) / (float)this.field_666_f * 32.0F; + if(var8 < 0.0F) { + var8 = 0.0F; + } + + if(var8 > 1.0F) { + var8 = 1.0F; + } + + this.field_665_g = this.field_673_a * var8; + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + this.field_670_b = 7 - this.e * 8 / this.field_666_f; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + if(this.posY == this.prevPosY) { + this.motionX *= 1.1D; + this.motionZ *= 1.1D; + } + + this.motionX *= (double)0.96F; + this.motionY *= (double)0.96F; + this.motionZ *= (double)0.96F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityRenderer.java b/src/main/java/net/minecraft/src/EntityRenderer.java new file mode 100644 index 0000000..54120ba --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityRenderer.java @@ -0,0 +1,560 @@ +package net.minecraft.src; + +import java.nio.FloatBuffer; +import java.util.List; +import java.util.Random; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +public class EntityRenderer { + private Minecraft mc; + private float field_1387_i = 0.0F; + public ItemRenderer field_1395_a; + private int field_1386_j; + private Entity field_1385_k = null; + private long field_1384_l = System.currentTimeMillis(); + private Random field_1383_m = new Random(); + volatile int field_1394_b = 0; + volatile int field_1393_c = 0; + FloatBuffer field_1392_d = GLAllocation.createDirectFloatBuffer(16); + float field_4270_e; + float field_4269_f; + float field_4268_g; + private float field_1382_n; + private float field_1381_o; + + public EntityRenderer(Minecraft var1) { + this.mc = var1; + this.field_1395_a = new ItemRenderer(var1); + } + + public void func_911_a() { + this.field_1382_n = this.field_1381_o; + float var1 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(this.mc.thePlayer.posX), MathHelper.floor_double(this.mc.thePlayer.posY), MathHelper.floor_double(this.mc.thePlayer.posZ)); + float var2 = (float)(3 - this.mc.gameSettings.renderDistance) / 3.0F; + float var3 = var1 * (1.0F - var2) + var2; + this.field_1381_o += (var3 - this.field_1381_o) * 0.1F; + ++this.field_1386_j; + this.field_1395_a.func_895_a(); + if(this.mc.field_6288_M) { + this.func_916_c(); + } + + } + + public void func_910_a(float var1) { + if(this.mc.thePlayer != null) { + double var2 = (double)this.mc.field_6327_b.getBlockReachDistance(); + this.mc.objectMouseOver = this.mc.thePlayer.rayTrace(var2, var1); + double var4 = var2; + Vec3D var6 = this.mc.thePlayer.getPosition(var1); + if(this.mc.objectMouseOver != null) { + var4 = this.mc.objectMouseOver.hitVec.distanceTo(var6); + } + + if(this.mc.field_6327_b instanceof PlayerControllerTest) { + var2 = 32.0D; + } else { + if(var4 > 3.0D) { + var4 = 3.0D; + } + + var2 = var4; + } + + Vec3D var7 = this.mc.thePlayer.getLook(var1); + Vec3D var8 = var6.addVector(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2); + this.field_1385_k = null; + float var9 = 1.0F; + List var10 = this.mc.theWorld.getEntitiesWithinAABBExcludingEntity(this.mc.thePlayer, this.mc.thePlayer.boundingBox.addCoord(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2).expands((double)var9, (double)var9, (double)var9)); + double var11 = 0.0D; + + for(int var13 = 0; var13 < var10.size(); ++var13) { + Entity var14 = (Entity)var10.get(var13); + if(var14.canBeCollidedWith()) { + float var15 = var14.func_4035_j_(); + AxisAlignedBB var16 = var14.boundingBox.expands((double)var15, (double)var15, (double)var15); + MovingObjectPosition var17 = var16.func_1169_a(var6, var8); + if(var16.isVecInside(var6)) { + if(0.0D < var11 || var11 == 0.0D) { + this.field_1385_k = var14; + var11 = 0.0D; + } + } else if(var17 != null) { + double var18 = var6.distanceTo(var17.hitVec); + if(var18 < var11 || var11 == 0.0D) { + this.field_1385_k = var14; + var11 = var18; + } + } + } + } + + if(this.field_1385_k != null && !(this.mc.field_6327_b instanceof PlayerControllerTest)) { + this.mc.objectMouseOver = new MovingObjectPosition(this.field_1385_k); + } + + } + } + + private float func_914_d(float var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = 70.0F; + if(var2.isInsideOfMaterial(Material.water)) { + var3 = 60.0F; + } + + if(var2.health <= 0) { + float var4 = (float)var2.deathTime + var1; + var3 /= (1.0F - 500.0F / (var4 + 500.0F)) * 2.0F + 1.0F; + } + + return var3; + } + + private void hurtCameraEffect(float var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = (float)var2.hurtTime - var1; + float var4; + if(var2.health <= 0) { + var4 = (float)var2.deathTime + var1; + GL11.glRotatef(40.0F - 8000.0F / (var4 + 200.0F), 0.0F, 0.0F, 1.0F); + } + + if(var3 >= 0.0F) { + var3 /= (float)var2.field_9332_M; + var3 = MathHelper.sin(var3 * var3 * var3 * var3 * (float)Math.PI); + var4 = var2.field_9331_N; + GL11.glRotatef(-var4, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var3 * 14.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(var4, 0.0F, 1.0F, 0.0F); + } + } + + private void func_917_f(float var1) { + if(!this.mc.gameSettings.thirdPersonView) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = var2.field_9290_aS - var2.field_9291_aR; + float var4 = var2.field_9290_aS + var3 * var1; + float var5 = var2.field_775_e + (var2.field_774_f - var2.field_775_e) * var1; + float var6 = var2.field_9329_Q + (var2.field_9328_R - var2.field_9329_Q) * var1; + GL11.glTranslatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 0.5F, -Math.abs(MathHelper.cos(var4 * (float)Math.PI) * var5), 0.0F); + GL11.glRotatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 3.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(Math.abs(MathHelper.cos(var4 * (float)Math.PI + 0.2F) * var5) * 5.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var6, 1.0F, 0.0F, 0.0F); + } + } + + private void orientCamera(float var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + double var3 = var2.prevPosX + (var2.posX - var2.prevPosX) * (double)var1; + double var5 = var2.prevPosY + (var2.posY - var2.prevPosY) * (double)var1; + double var7 = var2.prevPosZ + (var2.posZ - var2.prevPosZ) * (double)var1; + if(this.mc.gameSettings.thirdPersonView) { + double var9 = 4.0D; + float var11 = var2.rotationYaw; + float var12 = var2.rotationPitch; + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2)) { + var12 += 180.0F; + var9 += 2.0D; + } + + double var13 = (double)(-MathHelper.sin(var11 / 180.0F * (float)Math.PI) * MathHelper.cos(var12 / 180.0F * (float)Math.PI)) * var9; + double var15 = (double)(MathHelper.cos(var11 / 180.0F * (float)Math.PI) * MathHelper.cos(var12 / 180.0F * (float)Math.PI)) * var9; + double var17 = (double)(-MathHelper.sin(var12 / 180.0F * (float)Math.PI)) * var9; + + for(int var19 = 0; var19 < 8; ++var19) { + float var20 = (float)((var19 & 1) * 2 - 1); + float var21 = (float)((var19 >> 1 & 1) * 2 - 1); + float var22 = (float)((var19 >> 2 & 1) * 2 - 1); + var20 *= 0.1F; + var21 *= 0.1F; + var22 *= 0.1F; + MovingObjectPosition var23 = this.mc.theWorld.rayTraceBlocks(Vec3D.createVector(var3 + (double)var20, var5 + (double)var21, var7 + (double)var22), Vec3D.createVector(var3 - var13 + (double)var20 + (double)var22, var5 - var17 + (double)var21, var7 - var15 + (double)var22)); + if(var23 != null) { + double var24 = var23.hitVec.distanceTo(Vec3D.createVector(var3, var5, var7)); + if(var24 < var9) { + var9 = var24; + } + } + } + + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2)) { + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + } + + GL11.glRotatef(var2.rotationPitch - var12, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var2.rotationYaw - var11, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, 0.0F, (float)(-var9)); + GL11.glRotatef(var11 - var2.rotationYaw, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(var12 - var2.rotationPitch, 1.0F, 0.0F, 0.0F); + } else { + GL11.glTranslatef(0.0F, 0.0F, -0.1F); + } + + GL11.glRotatef(var2.prevRotationPitch + (var2.rotationPitch - var2.prevRotationPitch) * var1, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var2.prevRotationYaw + (var2.rotationYaw - var2.prevRotationYaw) * var1 + 180.0F, 0.0F, 1.0F, 0.0F); + } + + private void setupCameraTransform(float var1, int var2) { + this.field_1387_i = (float)(256 >> this.mc.gameSettings.renderDistance); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + float var3 = 0.07F; + if(this.mc.gameSettings.anaglyph) { + GL11.glTranslatef((float)(-(var2 * 2 - 1)) * var3, 0.0F, 0.0F); + } + + GLU.gluPerspective(this.func_914_d(var1), (float)this.mc.displayWidth / (float)this.mc.displayHeight, 0.05F, this.field_1387_i); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + if(this.mc.gameSettings.anaglyph) { + GL11.glTranslatef((float)(var2 * 2 - 1) * 0.1F, 0.0F, 0.0F); + } + + this.hurtCameraEffect(var1); + if(this.mc.gameSettings.viewBobbing) { + this.func_917_f(var1); + } + + float var4 = this.mc.thePlayer.field_4133_d + (this.mc.thePlayer.field_4134_c - this.mc.thePlayer.field_4133_d) * var1; + if(var4 > 0.0F) { + float var5 = 5.0F / (var4 * var4 + 5.0F) - var4 * 0.04F; + var5 *= var5; + GL11.glRotatef(var4 * var4 * 1500.0F, 0.0F, 1.0F, 1.0F); + GL11.glScalef(1.0F / var5, 1.0F, 1.0F); + GL11.glRotatef(-var4 * var4 * 1500.0F, 0.0F, 1.0F, 1.0F); + } + + this.orientCamera(var1); + } + + private void func_4135_b(float var1, int var2) { + GL11.glLoadIdentity(); + if(this.mc.gameSettings.anaglyph) { + GL11.glTranslatef((float)(var2 * 2 - 1) * 0.1F, 0.0F, 0.0F); + } + + GL11.glPushMatrix(); + this.hurtCameraEffect(var1); + if(this.mc.gameSettings.viewBobbing) { + this.func_917_f(var1); + } + + if(!this.mc.gameSettings.thirdPersonView && !(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2))) { + this.field_1395_a.renderItemInFirstPerson(var1); + } + + GL11.glPopMatrix(); + if(!this.mc.gameSettings.thirdPersonView) { + this.field_1395_a.renderOverlays(var1); + this.hurtCameraEffect(var1); + } + + if(this.mc.gameSettings.viewBobbing) { + this.func_917_f(var1); + } + + } + + public void func_4136_b(float var1) { + if(!GL11.isFocused()) { + if(System.currentTimeMillis() - this.field_1384_l > 500L) { + this.mc.func_6252_g(); + } + } else { + this.field_1384_l = System.currentTimeMillis(); + } + + if(this.mc.field_6289_L) { + this.mc.mouseHelper.func_772_c(); + float var2 = this.mc.gameSettings.mouseSensitivity * 0.6F + 0.2F; + float var3 = var2 * var2 * var2 * 8.0F; + float var4 = (float)this.mc.mouseHelper.field_1114_a * var3; + float var5 = (float)this.mc.mouseHelper.field_1113_b * var3; + byte var6 = 1; + if(this.mc.gameSettings.invertMouse) { + var6 = -1; + } + + this.mc.thePlayer.func_346_d(var4, var5 * (float)var6); + } + + if(!this.mc.field_6307_v) { + ScaledResolution var7 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var8 = var7.getScaledWidth(); + int var9 = var7.getScaledHeight(); + int var10 = Mouse.getX() * var8 / this.mc.displayWidth; + int var11 = var9 - Mouse.getY() * var9 / this.mc.displayHeight - 1; + if(this.mc.theWorld != null) { + this.func_4134_c(var1); + if(!(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2))) { + this.mc.ingameGUI.renderGameOverlay(var1, this.mc.currentScreen != null, var10, var11); + } + } else { + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + this.func_905_b(); + } + + if(this.mc.currentScreen != null) { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + this.mc.currentScreen.drawScreen(var10, var11, var1); + } + + } + } + + public void func_4134_c(float var1) { + this.func_910_a(var1); + EntityPlayerSP var2 = this.mc.thePlayer; + RenderGlobal var3 = this.mc.field_6323_f; + EffectRenderer var4 = this.mc.field_6321_h; + double var5 = var2.lastTickPosX + (var2.posX - var2.lastTickPosX) * (double)var1; + double var7 = var2.lastTickPosY + (var2.posY - var2.lastTickPosY) * (double)var1; + double var9 = var2.lastTickPosZ + (var2.posZ - var2.lastTickPosZ) * (double)var1; + + for(int var11 = 0; var11 < 2; ++var11) { + if(this.mc.gameSettings.anaglyph) { + if(var11 == 0) { + GL11.glColorMask(false, true, true, false); + } else { + GL11.glColorMask(true, false, false, false); + } + } + + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + this.updateFogColor(var1); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + this.setupCameraTransform(var1, var11); + ClippingHelperImplementation.func_1155_a(); + if(this.mc.gameSettings.renderDistance < 2) { + this.func_4140_a(-1); + var3.func_4142_a(var1); + } + + GL11.glEnable(GL11.GL_FOG); + this.func_4140_a(1); + Frustrum var12 = new Frustrum(); + var12.func_343_a(var5, var7, var9); + this.mc.field_6323_f.func_960_a(var12, var1); + this.mc.field_6323_f.func_948_a(var2, false); + this.func_4140_a(0); + GL11.glEnable(GL11.GL_FOG); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + RenderHelper.disableStandardItemLighting(); + var3.func_943_a(var2, 0, (double)var1); + RenderHelper.enableStandardItemLighting(); + var3.func_951_a(var2.getPosition(var1), var12, var1); + var4.func_1187_b(var2, var1); + RenderHelper.disableStandardItemLighting(); + this.func_4140_a(0); + var4.func_1189_a(var2, var1); + if(this.mc.objectMouseOver != null && var2.isInsideOfMaterial(Material.water)) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + var3.func_959_a(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1); + var3.drawSelectionBox(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + this.func_4140_a(0); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + if(this.mc.gameSettings.fancyGraphics) { + GL11.glColorMask(false, false, false, false); + int var13 = var3.func_943_a(var2, 1, (double)var1); + GL11.glColorMask(true, true, true, true); + if(this.mc.gameSettings.anaglyph) { + if(var11 == 0) { + GL11.glColorMask(false, true, true, false); + } else { + GL11.glColorMask(true, false, false, false); + } + } + + if(var13 > 0) { + var3.func_944_a(1, (double)var1); + } + } else { + var3.func_943_a(var2, 1, (double)var1); + } + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_BLEND); + if(this.mc.objectMouseOver != null && !var2.isInsideOfMaterial(Material.water)) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + var3.func_959_a(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1); + var3.drawSelectionBox(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + GL11.glDisable(GL11.GL_FOG); + if(this.field_1385_k != null) { + } + + this.func_4140_a(0); + GL11.glEnable(GL11.GL_FOG); + var3.func_4141_b(var1); + GL11.glDisable(GL11.GL_FOG); + this.func_4140_a(1); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + this.func_4135_b(var1, var11); + if(!this.mc.gameSettings.anaglyph) { + return; + } + } + + GL11.glColorMask(true, true, true, false); + } + + private void func_916_c() { + if(this.mc.gameSettings.fancyGraphics) { + EntityPlayerSP var1 = this.mc.thePlayer; + World var2 = this.mc.theWorld; + int var3 = MathHelper.floor_double(var1.posX); + int var4 = MathHelper.floor_double(var1.posY); + int var5 = MathHelper.floor_double(var1.posZ); + byte var6 = 16; + + for(int var7 = 0; var7 < 150; ++var7) { + int var8 = var3 + this.field_1383_m.nextInt(var6) - this.field_1383_m.nextInt(var6); + int var9 = var5 + this.field_1383_m.nextInt(var6) - this.field_1383_m.nextInt(var6); + int var10 = var2.func_696_e(var8, var9); + int var11 = var2.getBlockId(var8, var10 - 1, var9); + if(var10 <= var4 + var6 && var10 >= var4 - var6) { + float var12 = this.field_1383_m.nextFloat(); + float var13 = this.field_1383_m.nextFloat(); + if(var11 > 0) { + this.mc.field_6321_h.func_1192_a(new EntityRainFX(var2, (double)((float)var8 + var12), (double)((float)var10 + 0.1F) - Block.blocksList[var11].minY, (double)((float)var9 + var13))); + } + } + } + + } + } + + public void func_905_b() { + ScaledResolution var1 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var2 = var1.getScaledWidth(); + int var3 = var1.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var2, (double)var3, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + } + + private void updateFogColor(float var1) { + World var2 = this.mc.theWorld; + EntityPlayerSP var3 = this.mc.thePlayer; + float var4 = 1.0F / (float)(4 - this.mc.gameSettings.renderDistance); + var4 = 1.0F - (float)Math.pow((double)var4, 0.25D); + Vec3D var5 = var2.func_4079_a(this.mc.thePlayer, var1); + float var6 = (float)var5.xCoord; + float var7 = (float)var5.yCoord; + float var8 = (float)var5.zCoord; + Vec3D var9 = var2.func_4082_d(var1); + this.field_4270_e = (float)var9.xCoord; + this.field_4269_f = (float)var9.yCoord; + this.field_4268_g = (float)var9.zCoord; + this.field_4270_e += (var6 - this.field_4270_e) * var4; + this.field_4269_f += (var7 - this.field_4269_f) * var4; + this.field_4268_g += (var8 - this.field_4268_g) * var4; + if(var3.isInsideOfMaterial(Material.water)) { + this.field_4270_e = 0.02F; + this.field_4269_f = 0.02F; + this.field_4268_g = 0.2F; + } else if(var3.isInsideOfMaterial(Material.lava)) { + this.field_4270_e = 0.6F; + this.field_4269_f = 0.1F; + this.field_4268_g = 0.0F; + } + + float var10 = this.field_1382_n + (this.field_1381_o - this.field_1382_n) * var1; + this.field_4270_e *= var10; + this.field_4269_f *= var10; + this.field_4268_g *= var10; + if(this.mc.gameSettings.anaglyph) { + float var11 = (this.field_4270_e * 30.0F + this.field_4269_f * 59.0F + this.field_4268_g * 11.0F) / 100.0F; + float var12 = (this.field_4270_e * 30.0F + this.field_4269_f * 70.0F) / 100.0F; + float var13 = (this.field_4270_e * 30.0F + this.field_4268_g * 70.0F) / 100.0F; + this.field_4270_e = var11; + this.field_4269_f = var12; + this.field_4268_g = var13; + } + + GL11.glClearColor(this.field_4270_e, this.field_4269_f, this.field_4268_g, 0.0F); + } + + private void func_4140_a(int var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + GL11.glFog(GL11.GL_FOG_COLOR, this.func_908_a(this.field_4270_e, this.field_4269_f, this.field_4268_g, 1.0F)); + GL11.glNormal3f(0.0F, -1.0F, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + float var3; + float var4; + float var5; + float var6; + float var7; + float var8; + if(var2.isInsideOfMaterial(Material.water)) { + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); + GL11.glFogf(GL11.GL_FOG_DENSITY, 0.1F); + var3 = 0.4F; + var4 = 0.4F; + var5 = 0.9F; + if(this.mc.gameSettings.anaglyph) { + var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F; + var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; + var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F; + } + } else if(var2.isInsideOfMaterial(Material.lava)) { + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); + GL11.glFogf(GL11.GL_FOG_DENSITY, 2.0F); + var3 = 0.4F; + var4 = 0.3F; + var5 = 0.3F; + if(this.mc.gameSettings.anaglyph) { + var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F; + var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; + var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F; + } + } else { + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GL11.glFogf(GL11.GL_FOG_START, this.field_1387_i * 0.25F); + GL11.glFogf(GL11.GL_FOG_END, this.field_1387_i); + if(var1 < 0) { + GL11.glFogf(GL11.GL_FOG_START, 0.0F); + GL11.glFogf(GL11.GL_FOG_END, this.field_1387_i * 0.8F); + } + + if(this.mc.theWorld.worldProvider.field_4220_c) { + GL11.glFogf(GL11.GL_FOG_START, 0.0F); + } + } + + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); + } + + private FloatBuffer func_908_a(float var1, float var2, float var3, float var4) { + this.field_1392_d.clear(); + this.field_1392_d.put(var1).put(var2).put(var3).put(var4); + this.field_1392_d.flip(); + return this.field_1392_d; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySheep.java b/src/main/java/net/minecraft/src/EntitySheep.java new file mode 100644 index 0000000..fe680e2 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySheep.java @@ -0,0 +1,49 @@ +package net.minecraft.src; + +public class EntitySheep extends EntityAnimals { + public boolean sheared = false; + + public EntitySheep(World var1) { + super(var1); + this.texture = "/mob/sheep.png"; + this.setSize(0.9F, 1.3F); + } + + public boolean canAttackEntity(Entity var1, int var2) { + if(!this.sheared && var1 instanceof EntityLiving) { + this.sheared = true; + int var3 = 1 + this.rand.nextInt(3); + + for(int var4 = 0; var4 < var3; ++var4) { + EntityItem var5 = this.dropItemWithOffset(Block.cloth.blockID, 1, 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); + } + } + + return super.canAttackEntity(var1, var2); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setBoolean("Sheared", this.sheared); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.sheared = var1.getBoolean("Sheared"); + } + + protected String getLivingSound() { + return "mob.sheep"; + } + + protected String getHurtSound() { + return "mob.sheep"; + } + + protected String getDeathSound() { + return "mob.sheep"; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySkeleton.java b/src/main/java/net/minecraft/src/EntitySkeleton.java new file mode 100644 index 0000000..59b837c --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySkeleton.java @@ -0,0 +1,70 @@ +package net.minecraft.src; + +public class EntitySkeleton extends EntityMobs { + private static final ItemStack defaultHeldItem = new ItemStack(Item.bow, 1); + + public EntitySkeleton(World var1) { + super(var1); + this.texture = "/mob/skeleton.png"; + } + + protected String getLivingSound() { + return "mob.skeleton"; + } + + protected String getHurtSound() { + return "mob.skeletonhurt"; + } + + protected String getDeathSound() { + return "mob.skeletonhurt"; + } + + public void onLivingUpdate() { + if(this.worldObj.isDaytime()) { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) { + this.fire = 300; + } + } + + super.onLivingUpdate(); + } + + protected void attackEntity(Entity var1, float var2) { + if(var2 < 10.0F) { + double var3 = var1.posX - this.posX; + double var5 = var1.posZ - this.posZ; + if(this.attackTime == 0) { + EntityArrow var7 = new EntityArrow(this.worldObj, this); + var7.posY += (double)1.4F; + double var8 = var1.posY - (double)0.2F - var7.posY; + float var10 = MathHelper.sqrt_double(var3 * var3 + var5 * var5) * 0.2F; + this.worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (this.rand.nextFloat() * 0.4F + 0.8F)); + this.worldObj.entityJoinedWorld(var7); + var7.func_408_a(var3, var8 + (double)var10, var5, 0.6F, 12.0F); + this.attackTime = 30; + } + + this.rotationYaw = (float)(Math.atan2(var5, var3) * 180.0D / (double)((float)Math.PI)) - 90.0F; + this.hasAttacked = true; + } + + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected int getDropItemId() { + return Item.arrow.shiftedIndex; + } + + public ItemStack getHeldItem() { + return defaultHeldItem; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySlime.java b/src/main/java/net/minecraft/src/EntitySlime.java new file mode 100644 index 0000000..0bbea93 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySlime.java @@ -0,0 +1,129 @@ +package net.minecraft.src; + +public class EntitySlime extends EntityLiving implements IMobs { + public float field_768_a; + public float field_767_b; + private int field_769_d = 0; + public int field_770_c = 1; + + public EntitySlime(World var1) { + super(var1); + this.texture = "/mob/slime.png"; + this.field_770_c = 1 << this.rand.nextInt(3); + this.yOffset = 0.0F; + this.field_769_d = this.rand.nextInt(20) + 10; + this.func_441_c(this.field_770_c); + } + + public void func_441_c(int var1) { + this.field_770_c = var1; + this.setSize(0.6F * (float)var1, 0.6F * (float)var1); + this.health = var1 * var1; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setInteger("Size", this.field_770_c - 1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.field_770_c = var1.getInteger("Size") + 1; + } + + public void onUpdate() { + this.field_767_b = this.field_768_a; + boolean var1 = this.onGround; + super.onUpdate(); + if(this.onGround && !var1) { + for(int var2 = 0; var2 < this.field_770_c * 8; ++var2) { + float var3 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + float var4 = this.rand.nextFloat() * 0.5F + 0.5F; + float var5 = MathHelper.sin(var3) * (float)this.field_770_c * 0.5F * var4; + float var6 = MathHelper.cos(var3) * (float)this.field_770_c * 0.5F * var4; + this.worldObj.spawnParticle("slime", this.posX + (double)var5, this.boundingBox.minY, this.posZ + (double)var6, 0.0D, 0.0D, 0.0D); + } + + if(this.field_770_c > 2) { + this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) / 0.8F); + } + + this.field_768_a = -0.5F; + } + + this.field_768_a *= 0.6F; + } + + protected void func_418_b_() { + EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D); + if(var1 != null) { + this.faceEntity(var1, 10.0F); + } + + if(this.onGround && this.field_769_d-- <= 0) { + this.field_769_d = this.rand.nextInt(20) + 10; + if(var1 != null) { + this.field_769_d /= 3; + } + + this.isJumping = true; + if(this.field_770_c > 1) { + this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 0.8F); + } + + this.field_768_a = 1.0F; + this.field_9342_ah = 1.0F - this.rand.nextFloat() * 2.0F; + this.field_9340_ai = (float)(1 * this.field_770_c); + } else { + this.isJumping = false; + if(this.onGround) { + this.field_9342_ah = this.field_9340_ai = 0.0F; + } + } + + } + + public void setEntityDead() { + if(this.field_770_c > 1 && this.health == 0) { + for(int var1 = 0; var1 < 4; ++var1) { + float var2 = ((float)(var1 % 2) - 0.5F) * (float)this.field_770_c / 4.0F; + float var3 = ((float)(var1 / 2) - 0.5F) * (float)this.field_770_c / 4.0F; + EntitySlime var4 = new EntitySlime(this.worldObj); + var4.func_441_c(this.field_770_c / 2); + var4.setLocationAndAngles(this.posX + (double)var2, this.posY + 0.5D, this.posZ + (double)var3, this.rand.nextFloat() * 360.0F, 0.0F); + this.worldObj.entityJoinedWorld(var4); + } + } + + super.setEntityDead(); + } + + public void onCollideWithPlayer(EntityPlayer var1) { + if(this.field_770_c > 1 && this.canEntityBeSeen(var1) && (double)this.getDistanceToEntity(var1) < 0.6D * (double)this.field_770_c && var1.canAttackEntity(this, this.field_770_c)) { + this.worldObj.playSoundAtEntity(this, "mob.slimeattack", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + } + + protected String getHurtSound() { + return "mob.slime"; + } + + protected String getDeathSound() { + return "mob.slime"; + } + + protected int getDropItemId() { + return this.field_770_c == 1 ? Item.slimeBall.shiftedIndex : 0; + } + + public boolean getCanSpawnHere() { + Chunk var1 = this.worldObj.getChunkFromBlockCoords(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ)); + return (this.field_770_c == 1 || this.worldObj.difficultySetting > 0) && this.rand.nextInt(10) == 0 && var1.func_997_a(987234911L).nextInt(10) == 0 && this.posY < 16.0D; + } + + protected float getSoundVolume() { + return 0.6F; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySlimeFX.java b/src/main/java/net/minecraft/src/EntitySlimeFX.java new file mode 100644 index 0000000..9b5ae4a --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySlimeFX.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +public class EntitySlimeFX extends EntityFX { + public EntitySlimeFX(World var1, double var2, double var4, double var6, Item var8) { + super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D); + this.field_670_b = var8.getIconIndex((ItemStack)null); + this.field_663_i = this.field_662_j = this.field_661_k = 1.0F; + this.field_664_h = Block.blockSnow.field_357_bm; + this.field_665_g /= 2.0F; + } + + public int func_404_c() { + return 2; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)(this.field_670_b % 16) + this.field_669_c / 4.0F) / 16.0F; + float var9 = var8 + 0.999F / 64.0F; + float var10 = ((float)(this.field_670_b / 16) + this.field_668_d / 4.0F) / 16.0F; + float var11 = var10 + 0.999F / 64.0F; + float var12 = 0.1F * this.field_665_g; + float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l); + float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m); + float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n); + float var16 = this.getEntityBrightness(var2); + var1.setColorOpaque_F(var16 * this.field_663_i, var16 * this.field_662_j, var16 * this.field_661_k); + var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11); + var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10); + var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11); + } +} diff --git a/src/main/java/net/minecraft/src/EntitySmokeFX.java b/src/main/java/net/minecraft/src/EntitySmokeFX.java new file mode 100644 index 0000000..556eddf --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySmokeFX.java @@ -0,0 +1,63 @@ +package net.minecraft.src; + +public class EntitySmokeFX extends EntityFX { + float field_671_a; + + public EntitySmokeFX(World var1, double var2, double var4, double var6) { + this(var1, var2, var4, var6, 1.0F); + } + + public EntitySmokeFX(World var1, double var2, double var4, double var6, float var8) { + super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D); + this.motionX *= (double)0.1F; + this.motionY *= (double)0.1F; + this.motionZ *= (double)0.1F; + this.field_663_i = this.field_662_j = this.field_661_k = (float)(Math.random() * (double)0.3F); + this.field_665_g *= 12.0F / 16.0F; + this.field_665_g *= var8; + this.field_671_a = this.field_665_g; + this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + this.field_666_f = (int)((float)this.field_666_f * var8); + this.field_9314_ba = false; + } + + public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.e + var2) / (float)this.field_666_f * 32.0F; + if(var8 < 0.0F) { + var8 = 0.0F; + } + + if(var8 > 1.0F) { + var8 = 1.0F; + } + + this.field_665_g = this.field_671_a * var8; + super.func_406_a(var1, var2, var3, var4, var5, var6, var7); + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.e++ >= this.field_666_f) { + this.setEntityDead(); + } + + this.field_670_b = 7 - this.e * 8 / this.field_666_f; + this.motionY += 0.004D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + if(this.posY == this.prevPosY) { + this.motionX *= 1.1D; + this.motionZ *= 1.1D; + } + + this.motionX *= (double)0.96F; + this.motionY *= (double)0.96F; + this.motionZ *= (double)0.96F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntitySnowball.java b/src/main/java/net/minecraft/src/EntitySnowball.java new file mode 100644 index 0000000..b24c7a7 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySnowball.java @@ -0,0 +1,231 @@ +package net.minecraft.src; + +import java.util.List; + +public class EntitySnowball extends Entity { + private int field_816_b = -1; + private int field_815_c = -1; + private int field_814_d = -1; + private int field_813_e = 0; + private boolean field_812_f = false; + public int field_817_a = 0; + private EntityLiving field_811_g; + private int field_810_h; + private int field_809_i = 0; + + public EntitySnowball(World var1) { + super(var1); + this.setSize(0.25F, 0.25F); + } + + public boolean func_384_a(double var1) { + double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D; + var3 *= 64.0D; + return var1 < var3 * var3; + } + + public EntitySnowball(World var1, EntityLiving var2) { + super(var1); + this.field_811_g = var2; + this.setSize(0.25F, 0.25F); + this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.func_373_s(), var2.posZ, var2.rotationYaw, var2.rotationPitch); + this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.posY -= (double)0.1F; + this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + float var3 = 0.4F; + this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3); + this.func_467_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F); + } + + public EntitySnowball(World var1, double var2, double var4, double var6) { + super(var1); + this.field_810_h = 0; + this.setSize(0.25F, 0.25F); + this.setPosition(var2, var4, var6); + this.yOffset = 0.0F; + } + + public void func_467_a(double var1, double var3, double var5, float var7, float var8) { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= (double)var9; + var3 /= (double)var9; + var5 /= (double)var9; + var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8; + var1 *= (double)var7; + var3 *= (double)var7; + var5 *= (double)var7; + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI)); + this.field_810_h = 0; + } + + public void setVelocity(double var1, double var3, double var5) { + this.motionX = var1; + this.motionY = var3; + this.motionZ = var5; + if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float var7 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var7) * 180.0D / (double)((float)Math.PI)); + } + + } + + public void onUpdate() { + this.lastTickPosX = this.posX; + this.lastTickPosY = this.posY; + this.lastTickPosZ = this.posZ; + super.onUpdate(); + if(this.field_817_a > 0) { + --this.field_817_a; + } + + if(this.field_812_f) { + int var1 = this.worldObj.getBlockId(this.field_816_b, this.field_815_c, this.field_814_d); + if(var1 == this.field_813_e) { + ++this.field_810_h; + if(this.field_810_h == 1200) { + this.setEntityDead(); + } + + return; + } + + this.field_812_f = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.field_810_h = 0; + this.field_809_i = 0; + } else { + ++this.field_809_i; + } + + Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ); + Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2); + var15 = Vec3D.createVector(this.posX, this.posY, this.posZ); + var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + if(var3 != null) { + var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord); + } + + //if(!this.worldObj.multiplayerWorld) { + Entity var4 = null; + List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D)); + double var6 = 0.0D; + + for(int var8 = 0; var8 < var5.size(); ++var8) { + Entity var9 = (Entity)var5.get(var8); + if(var9.canBeCollidedWith() && (var9 != this.field_811_g || this.field_809_i >= 5)) { + float var10 = 0.3F; + AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10); + MovingObjectPosition var12 = var11.func_1169_a(var15, var2); + if(var12 != null) { + double var13 = var15.distanceTo(var12.hitVec); + if(var13 < var6 || var6 == 0.0D) { + var4 = var9; + var6 = var13; + } + } + } + } + + if(var4 != null) { + var3 = new MovingObjectPosition(var4); + } + //} + + if(var3 != null) { + if(var3.entityHit != null && var3.entityHit.canAttackEntity(this.field_811_g, 0)) { + } + + for(int var16 = 0; var16 < 8; ++var16) { + this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); + } + + this.setEntityDead(); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI)); + + for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float var18 = 0.99F; + float var19 = 0.03F; + if(this.handleWaterMovement()) { + for(int var7 = 0; var7 < 4; ++var7) { + float var20 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var20, this.posY - this.motionY * (double)var20, this.posZ - this.motionZ * (double)var20, this.motionX, this.motionY, this.motionZ); + } + + var18 = 0.8F; + } + + this.motionX *= (double)var18; + this.motionY *= (double)var18; + this.motionZ *= (double)var18; + this.motionY -= (double)var19; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("xTile", (short)this.field_816_b); + var1.setShort("yTile", (short)this.field_815_c); + var1.setShort("zTile", (short)this.field_814_d); + var1.setByte("inTile", (byte)this.field_813_e); + var1.setByte("shake", (byte)this.field_817_a); + var1.setByte("inGround", (byte)(this.field_812_f ? 1 : 0)); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + this.field_816_b = var1.getShort("xTile"); + this.field_815_c = var1.getShort("yTile"); + this.field_814_d = var1.getShort("zTile"); + this.field_813_e = var1.getByte("inTile") & 255; + this.field_817_a = var1.getByte("shake") & 255; + this.field_812_f = var1.getByte("inGround") == 1; + } + + public void onCollideWithPlayer(EntityPlayer var1) { + if(this.field_812_f && this.field_811_g == var1 && this.field_817_a <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow.shiftedIndex, 1))) { + this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + var1.func_443_a_(this, 1); + this.setEntityDead(); + } + + } + + public float func_392_h_() { + return 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySorter.java b/src/main/java/net/minecraft/src/EntitySorter.java new file mode 100644 index 0000000..603143a --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySorter.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +import java.util.Comparator; + +public class EntitySorter implements Comparator { + private Entity field_1594_a; + + public EntitySorter(Entity var1) { + this.field_1594_a = var1; + } + + public int a(WorldRenderer var1, WorldRenderer var2) { + return var1.func_1202_a(this.field_1594_a) < var2.func_1202_a(this.field_1594_a) ? -1 : 1; + } + + public int compare(Object var1, Object var2) { + return this.a((WorldRenderer)var1, (WorldRenderer)var2); + } +} diff --git a/src/main/java/net/minecraft/src/EntitySpider.java b/src/main/java/net/minecraft/src/EntitySpider.java new file mode 100644 index 0000000..aaa832b --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySpider.java @@ -0,0 +1,69 @@ +package net.minecraft.src; + +public class EntitySpider extends EntityMobs { + public EntitySpider(World var1) { + super(var1); + this.texture = "/mob/spider.png"; + this.setSize(1.4F, 0.9F); + this.field_9333_am = 0.8F; + } + + public double func_402_h() { + return (double)this.height * 0.75D - 0.5D; + } + + protected Entity findPlayerToAttack() { + float var1 = this.getEntityBrightness(1.0F); + if(var1 < 0.5F) { + double var2 = 16.0D; + return this.worldObj.getClosestPlayerToEntity(this, var2); + } else { + return null; + } + } + + protected String getLivingSound() { + return "mob.spider"; + } + + protected String getHurtSound() { + return "mob.spider"; + } + + protected String getDeathSound() { + return "mob.spiderdeath"; + } + + protected void attackEntity(Entity var1, float var2) { + float var3 = this.getEntityBrightness(1.0F); + if(var3 > 0.5F && this.rand.nextInt(100) == 0) { + this.playerToAttack = null; + } else { + if(var2 > 2.0F && var2 < 6.0F && this.rand.nextInt(10) == 0) { + if(this.onGround) { + double var4 = var1.posX - this.posX; + double var6 = var1.posZ - this.posZ; + float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6); + this.motionX = var4 / (double)var8 * 0.5D * (double)0.8F + this.motionX * (double)0.2F; + this.motionZ = var6 / (double)var8 * 0.5D * (double)0.8F + this.motionZ * (double)0.2F; + this.motionY = (double)0.4F; + } + } else { + super.attackEntity(var1, var2); + } + + } + } + + public void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + public void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected int getDropItemId() { + return Item.silk.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/EntitySplashFX.java b/src/main/java/net/minecraft/src/EntitySplashFX.java new file mode 100644 index 0000000..6db11b5 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntitySplashFX.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class EntitySplashFX extends EntityRainFX { + public EntitySplashFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) { + super(var1, var2, var4, var6); + this.field_664_h = 0.04F; + ++this.field_670_b; + if(var10 == 0.0D && (var8 != 0.0D || var12 != 0.0D)) { + this.motionX = var8; + this.motionY = var10 + 0.1D; + this.motionZ = var12; + } + + } +} diff --git a/src/main/java/net/minecraft/src/EntityTNTPrimed.java b/src/main/java/net/minecraft/src/EntityTNTPrimed.java new file mode 100644 index 0000000..3b4949e --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityTNTPrimed.java @@ -0,0 +1,72 @@ +package net.minecraft.src; + +public class EntityTNTPrimed extends Entity { + public int fuse; + + public EntityTNTPrimed(World var1) { + super(var1); + this.fuse = 0; + this.field_618_ad = true; + this.setSize(0.98F, 0.98F); + this.yOffset = this.height / 2.0F; + } + + public EntityTNTPrimed(World var1, double var2, double var4, double var6) { + this(var1); + this.setPosition(var2, var4, var6); + float var8 = (float)(Math.random() * (double)((float)Math.PI) * 2.0D); + this.motionX = (double)(-MathHelper.sin(var8 * (float)Math.PI / 180.0F) * 0.02F); + this.motionY = (double)0.2F; + this.motionZ = (double)(-MathHelper.cos(var8 * (float)Math.PI / 180.0F) * 0.02F); + this.entityWalks = false; + this.fuse = 80; + this.prevPosX = var2; + this.prevPosY = var4; + this.prevPosZ = var6; + } + + public boolean canBeCollidedWith() { + return !this.isDead; + } + + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (double)0.04F; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double)0.98F; + this.motionY *= (double)0.98F; + this.motionZ *= (double)0.98F; + if(this.onGround) { + this.motionX *= (double)0.7F; + this.motionZ *= (double)0.7F; + this.motionY *= -0.5D; + } + + if(this.fuse-- <= 0) { + this.setEntityDead(); + this.explode(); + } else { + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + } + + } + + private void explode() { + float var1 = 4.0F; + this.worldObj.func_12243_a((Entity)null, this.posX, this.posY, this.posZ, var1); + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + var1.setByte("Fuse", (byte)this.fuse); + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + this.fuse = var1.getByte("Fuse"); + } + + public float func_392_h_() { + return 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/EntityZombie.java b/src/main/java/net/minecraft/src/EntityZombie.java new file mode 100644 index 0000000..f81990f --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityZombie.java @@ -0,0 +1,37 @@ +package net.minecraft.src; + +public class EntityZombie extends EntityMobs { + public EntityZombie(World var1) { + super(var1); + this.texture = "/mob/zombie.png"; + this.field_9333_am = 0.5F; + this.field_762_e = 5; + } + + public void onLivingUpdate() { + if(this.worldObj.isDaytime()) { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) { + this.fire = 300; + } + } + + super.onLivingUpdate(); + } + + protected String getLivingSound() { + return "mob.zombie"; + } + + protected String getHurtSound() { + return "mob.zombiehurt"; + } + + protected String getDeathSound() { + return "mob.zombiedeath"; + } + + protected int getDropItemId() { + return Item.feather.shiftedIndex; + } +} diff --git a/src/main/java/net/minecraft/src/EntityZombieSimple.java b/src/main/java/net/minecraft/src/EntityZombieSimple.java new file mode 100644 index 0000000..f80a076 --- /dev/null +++ b/src/main/java/net/minecraft/src/EntityZombieSimple.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class EntityZombieSimple extends EntityMobs { + public EntityZombieSimple(World var1) { + super(var1); + this.texture = "/mob/zombie.png"; + this.field_9333_am = 0.5F; + this.field_762_e = 50; + this.health *= 10; + this.yOffset *= 6.0F; + this.setSize(this.width * 6.0F, this.height * 6.0F); + } + + protected float func_439_a(int var1, int var2, int var3) { + return this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F; + } +} diff --git a/src/main/java/net/minecraft/src/EnumArt.java b/src/main/java/net/minecraft/src/EnumArt.java new file mode 100644 index 0000000..4ed300d --- /dev/null +++ b/src/main/java/net/minecraft/src/EnumArt.java @@ -0,0 +1,42 @@ +package net.minecraft.src; + +public enum EnumArt { + Kebab("Kebab", 16, 16, 0, 0), + Aztec("Aztec", 16, 16, 16, 0), + Alban("Alban", 16, 16, 32, 0), + Aztec2("Aztec2", 16, 16, 48, 0), + Bomb("Bomb", 16, 16, 64, 0), + Plant("Plant", 16, 16, 80, 0), + Wasteland("Wasteland", 16, 16, 96, 0), + Pool("Pool", 32, 16, 0, 32), + Courbet("Courbet", 32, 16, 32, 32), + Sea("Sea", 32, 16, 64, 32), + Sunset("Sunset", 32, 16, 96, 32), + Creebet("Creebet", 32, 16, 128, 32), + Wanderer("Wanderer", 16, 32, 0, 64), + Graham("Graham", 16, 32, 16, 64), + Match("Match", 32, 32, 0, 128), + Bust("Bust", 32, 32, 32, 128), + Stage("Stage", 32, 32, 64, 128), + Void("Void", 32, 32, 96, 128), + SkullAndRoses("SkullAndRoses", 32, 32, 128, 128), + Fighters("Fighters", 64, 32, 0, 96), + Pointer("Pointer", 64, 64, 0, 192), + Pigscene("Pigscene", 64, 64, 64, 192), + Skeleton("Skeleton", 64, 48, 192, 64), + DonkeyKong("DonkeyKong", 64, 48, 192, 112); + + public final String field_1624_y; + public final int field_1623_z; + public final int field_1636_A; + public final int field_1634_B; + public final int field_1632_C; + + private EnumArt(String var3, int var4, int var5, int var6, int var7) { + this.field_1624_y = var3; + this.field_1623_z = var4; + this.field_1636_A = var5; + this.field_1634_B = var6; + this.field_1632_C = var7; + } +} diff --git a/src/main/java/net/minecraft/src/EnumCreatureType.java b/src/main/java/net/minecraft/src/EnumCreatureType.java new file mode 100644 index 0000000..3302563 --- /dev/null +++ b/src/main/java/net/minecraft/src/EnumCreatureType.java @@ -0,0 +1,14 @@ +package net.minecraft.src; + +public enum EnumCreatureType { + monster(IMobs.class, 100), + creature(EntityAnimals.class, 20); + + public final Class field_4278_c; + public final int maxNumberOfEntityType; + + private EnumCreatureType(Class var3, int var4) { + this.field_4278_c = var3; + this.maxNumberOfEntityType = var4; + } +} diff --git a/src/main/java/net/minecraft/src/EnumMobType.java b/src/main/java/net/minecraft/src/EnumMobType.java new file mode 100644 index 0000000..a4a69b6 --- /dev/null +++ b/src/main/java/net/minecraft/src/EnumMobType.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public enum EnumMobType { + everything, + mobs, + players; +} diff --git a/src/main/java/net/minecraft/src/EnumSkyBlock.java b/src/main/java/net/minecraft/src/EnumSkyBlock.java new file mode 100644 index 0000000..6d45b0b --- /dev/null +++ b/src/main/java/net/minecraft/src/EnumSkyBlock.java @@ -0,0 +1,12 @@ +package net.minecraft.src; + +public enum EnumSkyBlock { + Sky(15), + Block(0); + + public final int field_1722_c; + + private EnumSkyBlock(int var3) { + this.field_1722_c = var3; + } +} diff --git a/src/main/java/net/minecraft/src/Explosion.java b/src/main/java/net/minecraft/src/Explosion.java new file mode 100644 index 0000000..7e35a55 --- /dev/null +++ b/src/main/java/net/minecraft/src/Explosion.java @@ -0,0 +1,166 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public class Explosion { + public boolean field_12257_a = false; + private Random field_12250_h = new Random(); + private World field_12249_i; + public double field_12256_b; + public double field_12255_c; + public double field_12254_d; + public Entity field_12253_e; + public float field_12252_f; + public Set field_12251_g = new HashSet(); + + public Explosion(World var1, Entity var2, double var3, double var5, double var7, float var9) { + this.field_12249_i = var1; + this.field_12253_e = var2; + this.field_12252_f = var9; + this.field_12256_b = var3; + this.field_12255_c = var5; + this.field_12254_d = var7; + } + + public void func_12248_a() { + float var1 = this.field_12252_f; + byte var2 = 16; + + int var3; + int var4; + int var5; + double var15; + double var17; + double var19; + for(var3 = 0; var3 < var2; ++var3) { + for(var4 = 0; var4 < var2; ++var4) { + for(var5 = 0; var5 < var2; ++var5) { + if(var3 == 0 || var3 == var2 - 1 || var4 == 0 || var4 == var2 - 1 || var5 == 0 || var5 == var2 - 1) { + double var6 = (double)((float)var3 / ((float)var2 - 1.0F) * 2.0F - 1.0F); + double var8 = (double)((float)var4 / ((float)var2 - 1.0F) * 2.0F - 1.0F); + double var10 = (double)((float)var5 / ((float)var2 - 1.0F) * 2.0F - 1.0F); + double var12 = Math.sqrt(var6 * var6 + var8 * var8 + var10 * var10); + var6 /= var12; + var8 /= var12; + var10 /= var12; + float var14 = this.field_12252_f * (0.7F + this.field_12249_i.rand.nextFloat() * 0.6F); + var15 = this.field_12256_b; + var17 = this.field_12255_c; + var19 = this.field_12254_d; + + for(float var21 = 0.3F; var14 > 0.0F; var14 -= var21 * (12.0F / 16.0F)) { + int var22 = MathHelper.floor_double(var15); + int var23 = MathHelper.floor_double(var17); + int var24 = MathHelper.floor_double(var19); + int var25 = this.field_12249_i.getBlockId(var22, var23, var24); + if(var25 > 0) { + var14 -= (Block.blocksList[var25].func_227_a(this.field_12253_e) + 0.3F) * var21; + } + + if(var14 > 0.0F) { + this.field_12251_g.add(new ChunkPosition(var22, var23, var24)); + } + + var15 += var6 * (double)var21; + var17 += var8 * (double)var21; + var19 += var10 * (double)var21; + } + } + } + } + } + + this.field_12252_f *= 2.0F; + var3 = MathHelper.floor_double(this.field_12256_b - (double)this.field_12252_f - 1.0D); + var4 = MathHelper.floor_double(this.field_12256_b + (double)this.field_12252_f + 1.0D); + var5 = MathHelper.floor_double(this.field_12255_c - (double)this.field_12252_f - 1.0D); + int var29 = MathHelper.floor_double(this.field_12255_c + (double)this.field_12252_f + 1.0D); + int var7 = MathHelper.floor_double(this.field_12254_d - (double)this.field_12252_f - 1.0D); + int var30 = MathHelper.floor_double(this.field_12254_d + (double)this.field_12252_f + 1.0D); + List var9 = this.field_12249_i.getEntitiesWithinAABBExcludingEntity(this.field_12253_e, AxisAlignedBB.getBoundingBoxFromPool((double)var3, (double)var5, (double)var7, (double)var4, (double)var29, (double)var30)); + Vec3D var31 = Vec3D.createVector(this.field_12256_b, this.field_12255_c, this.field_12254_d); + + for(int var11 = 0; var11 < var9.size(); ++var11) { + Entity var33 = (Entity)var9.get(var11); + double var13 = var33.getDistance(this.field_12256_b, this.field_12255_c, this.field_12254_d) / (double)this.field_12252_f; + if(var13 <= 1.0D) { + var15 = var33.posX - this.field_12256_b; + var17 = var33.posY - this.field_12255_c; + var19 = var33.posZ - this.field_12254_d; + double var39 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19); + var15 /= var39; + var17 /= var39; + var19 /= var39; + double var40 = (double)this.field_12249_i.func_675_a(var31, var33.boundingBox); + double var41 = (1.0D - var13) * var40; + var33.canAttackEntity(this.field_12253_e, (int)((var41 * var41 + var41) / 2.0D * 8.0D * (double)this.field_12252_f + 1.0D)); + var33.motionX += var15 * var41; + var33.motionY += var17 * var41; + var33.motionZ += var19 * var41; + } + } + + this.field_12252_f = var1; + ArrayList var32 = new ArrayList(); + var32.addAll(this.field_12251_g); + if(this.field_12257_a) { + for(int var34 = var32.size() - 1; var34 >= 0; --var34) { + ChunkPosition var35 = (ChunkPosition)var32.get(var34); + int var36 = var35.x; + int var37 = var35.y; + int var16 = var35.z; + int var38 = this.field_12249_i.getBlockId(var36, var37, var16); + int var18 = this.field_12249_i.getBlockId(var36, var37 - 1, var16); + if(var38 == 0 && Block.opaqueCubeLookup[var18] && this.field_12250_h.nextInt(3) == 0) { + this.field_12249_i.setBlockWithNotify(var36, var37, var16, Block.fire.blockID); + } + } + } + + } + + public void func_12247_b() { + this.field_12249_i.playSoundEffect(this.field_12256_b, this.field_12255_c, this.field_12254_d, "random.explode", 4.0F, (1.0F + (this.field_12249_i.rand.nextFloat() - this.field_12249_i.rand.nextFloat()) * 0.2F) * 0.7F); + ArrayList var1 = new ArrayList(); + var1.addAll(this.field_12251_g); + + for(int var2 = var1.size() - 1; var2 >= 0; --var2) { + ChunkPosition var3 = (ChunkPosition)var1.get(var2); + int var4 = var3.x; + int var5 = var3.y; + int var6 = var3.z; + int var7 = this.field_12249_i.getBlockId(var4, var5, var6); + + for(int var8 = 0; var8 < 1; ++var8) { + double var9 = (double)((float)var4 + this.field_12249_i.rand.nextFloat()); + double var11 = (double)((float)var5 + this.field_12249_i.rand.nextFloat()); + double var13 = (double)((float)var6 + this.field_12249_i.rand.nextFloat()); + double var15 = var9 - this.field_12256_b; + double var17 = var11 - this.field_12255_c; + double var19 = var13 - this.field_12254_d; + double var21 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19); + var15 /= var21; + var17 /= var21; + var19 /= var21; + double var23 = 0.5D / (var21 / (double)this.field_12252_f + 0.1D); + var23 *= (double)(this.field_12249_i.rand.nextFloat() * this.field_12249_i.rand.nextFloat() + 0.3F); + var15 *= var23; + var17 *= var23; + var19 *= var23; + this.field_12249_i.spawnParticle("explode", (var9 + this.field_12256_b * 1.0D) / 2.0D, (var11 + this.field_12255_c * 1.0D) / 2.0D, (var13 + this.field_12254_d * 1.0D) / 2.0D, var15, var17, var19); + this.field_12249_i.spawnParticle("smoke", var9, var11, var13, var15, var17, var19); + } + + if(var7 > 0) { + Block.blocksList[var7].dropBlockAsItemWithChance(this.field_12249_i, var4, var5, var6, this.field_12249_i.getBlockMetadata(var4, var5, var6), 0.3F); + this.field_12249_i.setBlockWithNotify(var4, var5, var6, 0); + Block.blocksList[var7].onBlockDestroyedByExplosion(this.field_12249_i, var4, var5, var6); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/FontAllowedCharacters.java b/src/main/java/net/minecraft/src/FontAllowedCharacters.java new file mode 100644 index 0000000..8214d53 --- /dev/null +++ b/src/main/java/net/minecraft/src/FontAllowedCharacters.java @@ -0,0 +1,27 @@ +package net.minecraft.src; + +public class FontAllowedCharacters { + + public static int isAllowed(char c) { + int cc = (int) c; + for(int i = 0; i < allowedChars.length; ++i) { + if(cc == allowedChars[i]) { + return i; + } + } + return -1; + } + + public static final int[] allowedChars = new int[]{ + 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58, + 59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85, + 86,87,88,89,90,91,92,93,94,95,39,97,98,99,100,101,102,103,104,105,106,107,108,109, + 110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,8962,199,252, + 233,226,228,224,229,231,234,235,232,239,238,236,196,197,201,230,198,244,246,242, + 251,249,255,214,220,248,163,216,215,402,225,237,243,250,241,209,170,186,191,174, + 172,189,188,161,171,187 + }; + + public static final char field_22286_b[] = { '/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '"', ':' }; + +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/src/FontRenderer.java b/src/main/java/net/minecraft/src/FontRenderer.java new file mode 100644 index 0000000..b87c9d1 --- /dev/null +++ b/src/main/java/net/minecraft/src/FontRenderer.java @@ -0,0 +1,183 @@ +package net.minecraft.src; + +import java.nio.IntBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import net.lax1dude.eaglercraft.EaglerImage; + +public class FontRenderer { + + public FontRenderer(GameSettings gamesettings, String s, RenderEngine renderengine) { + charWidth = new int[256]; + fontTextureName = 0; + EaglerImage bufferedimage = GL11.loadPNG(GL11.loadResourceBytes(s)); + int i = bufferedimage.w; + int j = bufferedimage.h; + int ai[] = bufferedimage.data; + for (int k = 0; k < 256; k++) { + int l = k % 16; + int k1 = k / 16; + int j2 = 7; + do { + if (j2 < 0) { + break; + } + int i3 = l * 8 + j2; + boolean flag = true; + for (int l3 = 0; l3 < 8 && flag; l3++) { + int i4 = (k1 * 8 + l3) * i; + int k4 = ai[i3 + i4] & 0xff; + if (k4 > 0) { + flag = false; + } + } + + if (!flag) { + break; + } + j2--; + } while (true); + if (k == 32) { + j2 = 2; + } + charWidth[k] = j2 + 2; + } + + fontTextureName = renderengine.allocateAndSetupTexture(bufferedimage); + fontDisplayLists = GLAllocation.generateDisplayLists(288); + Tessellator tessellator = Tessellator.instance; + for (int i1 = 0; i1 < 256; i1++) { + GL11.glNewList(fontDisplayLists + i1, 4864 /* GL_COMPILE */); + tessellator.startDrawingQuads(); + int l1 = (i1 % 16) * 8; + int k2 = (i1 / 16) * 8; + float f = 7.99F; + float f1 = 0.0F; + float f2 = 0.0F; + tessellator.addVertexWithUV(0.0D, 0.0F + f, 0.0D, (float) l1 / 128F + f1, ((float) k2 + f) / 128F + f2); + tessellator.addVertexWithUV(0.0F + f, 0.0F + f, 0.0D, ((float) l1 + f) / 128F + f1, + ((float) k2 + f) / 128F + f2); + tessellator.addVertexWithUV(0.0F + f, 0.0D, 0.0D, ((float) l1 + f) / 128F + f1, (float) k2 / 128F + f2); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (float) l1 / 128F + f1, (float) k2 / 128F + f2); + tessellator.draw(); + GL11.glEndList(); + } + + for (int j1 = 0; j1 < 32; j1++) { + int i2 = (j1 >> 3 & 1) * 85; + int l2 = (j1 >> 2 & 1) * 170 + i2; + int j3 = (j1 >> 1 & 1) * 170 + i2; + int k3 = (j1 >> 0 & 1) * 170 + i2; + if (j1 == 6) { + l2 += 85; + } + boolean flag1 = j1 >= 16; + if (gamesettings.anaglyph) { + int j4 = (l2 * 30 + j3 * 59 + k3 * 11) / 100; + int l4 = (l2 * 30 + j3 * 70) / 100; + int i5 = (l2 * 30 + k3 * 70) / 100; + l2 = j4; + j3 = l4; + k3 = i5; + } + if (flag1) { + l2 /= 4; + j3 /= 4; + k3 /= 4; + } + GL11.glNewList(fontDisplayLists + 256 + j1, 4864 /* GL_COMPILE */); + GL11.glColor3f((float) l2 / 255F, (float) j3 / 255F, (float) k3 / 255F); + GL11.glEndList(); + } + + } + + public void drawStringWithShadow(String s, int i, int j, int k) { + renderString(s, i + 1, j + 1, k, true); + drawString(s, i, j, k); + } + + public void drawString(String s, int i, int j, int k) { + renderString(s, i, j, k, false); + } + + public void renderString(String s, int i, int j, int k, boolean flag) { + if (s == null) { + return; + } + if (flag) { + int l = k & 0xff000000; + k = (k & 0xfcfcfc) >> 2; + k += l; + } + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, fontTextureName); + float f = (float) (k >> 16 & 0xff) / 255F; + float f1 = (float) (k >> 8 & 0xff) / 255F; + float f2 = (float) (k & 0xff) / 255F; + float f3 = (float) (k >> 24 & 0xff) / 255F; + if (f3 == 0.0F) { + f3 = 1.0F; + } + GL11.glColor4f(f, f1, f2, f3); + GL11.glPushMatrix(); + GL11.glTranslatef(i, j, 0.0F); + for (int i1 = 0; i1 < s.length(); i1++) { + for (; s.length() > i1 + 1 && s.charAt(i1) == '\247'; i1 += 2) { + int j1 = "0123456789abcdef".indexOf(s.toLowerCase().charAt(i1 + 1)); + if (j1 < 0 || j1 > 15) { + j1 = 15; + } + continue; + } + + if (i1 < s.length()) { + int k1 = FontAllowedCharacters.isAllowed(s.charAt(i1)); + if (k1 >= 0) { + GL11.glCallList(fontDisplayLists + k1 + 32); + GL11.glTranslatef(charWidth[k1 + 32], 0.0F, 0.0F); + } + } + } + + GL11.glPopMatrix(); + } + + public int getStringWidth(String s) { + if (s == null) { + return 0; + } + int i = 0; + for (int j = 0; j < s.length(); j++) { + if (s.charAt(j) == '\247') { + j++; + continue; + } + int k = FontAllowedCharacters.isAllowed(s.charAt(j)); + if (k >= 0) { + i += charWidth[k + 32]; + } + } + + return i; + } + + private int charWidth[]; + public int fontTextureName; + private int fontDisplayLists; + private IntBuffer buffer; + + public static final char formatChar = '\247'; + + public List listFormattedStringToWidth(String title2) { + java.util.ArrayList arraylist = new java.util.ArrayList(); + String[] string = title2.split("\n"); + for (String list : string) { + arraylist.add(list); + } + return arraylist; + } +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/src/Frustrum.java b/src/main/java/net/minecraft/src/Frustrum.java new file mode 100644 index 0000000..82e71c1 --- /dev/null +++ b/src/main/java/net/minecraft/src/Frustrum.java @@ -0,0 +1,22 @@ +package net.minecraft.src; + +public class Frustrum implements ICamera { + private ClippingHelper field_593_a = ClippingHelperImplementation.func_1155_a(); + private double field_592_b; + private double field_595_c; + private double field_594_d; + + public void func_343_a(double var1, double var3, double var5) { + this.field_592_b = var1; + this.field_595_c = var3; + this.field_594_d = var5; + } + + public boolean func_344_a(double var1, double var3, double var5, double var7, double var9, double var11) { + return this.field_593_a.func_1152_a(var1 - this.field_592_b, var3 - this.field_595_c, var5 - this.field_594_d, var7 - this.field_592_b, var9 - this.field_595_c, var11 - this.field_594_d); + } + + public boolean func_342_a(AxisAlignedBB var1) { + return this.func_344_a(var1.minX, var1.minY, var1.minZ, var1.maxX, var1.maxY, var1.maxZ); + } +} diff --git a/src/main/java/net/minecraft/src/GLAllocation.java b/src/main/java/net/minecraft/src/GLAllocation.java new file mode 100644 index 0000000..4df398c --- /dev/null +++ b/src/main/java/net/minecraft/src/GLAllocation.java @@ -0,0 +1,60 @@ +package net.minecraft.src; + +import java.nio.*; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +public class GLAllocation { + + public GLAllocation() { + } + + public static synchronized int generateDisplayLists(int i) { + int j = GL11.glGenLists(i); + displayLists.add(Integer.valueOf(j)); + displayLists.add(Integer.valueOf(i)); + return j; + } + + public static synchronized void generateTextureNames(IntBuffer intbuffer) { + + for (int i = intbuffer.position(); i < intbuffer.limit(); i++) { + int tx = GL11.glGenTextures(); + intbuffer.put(i, tx); + textureNames.add(Integer.valueOf(tx)); + } + + } + + public static synchronized void deleteTexturesAndDisplayLists() { + for (int i = 0; i < displayLists.size(); i += 2) { + GL11.glDeleteLists(((Integer) displayLists.get(i)).intValue(), + ((Integer) displayLists.get(i + 1)).intValue()); + } + + for (int j = 0; j < textureNames.size(); j++) { + GL11.glDeleteTextures(((Integer) textureNames.get(j)).intValue()); + } + + displayLists.clear(); + textureNames.clear(); + } + + public static ByteBuffer createDirectByteBuffer(int par0) { + return ByteBuffer.wrap(new byte[par0]).order(ByteOrder.nativeOrder()); + } + + public static IntBuffer createDirectIntBuffer(int par0) { + return IntBuffer.wrap(new int[par0]); + } + + public static FloatBuffer createDirectFloatBuffer(int par0) { + return FloatBuffer.wrap(new float[par0]); + } + + private static List displayLists = new ArrayList(); + private static List textureNames = new ArrayList(); + +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/src/GameSettings.java b/src/main/java/net/minecraft/src/GameSettings.java new file mode 100644 index 0000000..edd10d3 --- /dev/null +++ b/src/main/java/net/minecraft/src/GameSettings.java @@ -0,0 +1,229 @@ +package net.minecraft.src; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.PrintWriter; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; + +public class GameSettings { + private static final String[] RENDER_DISTANCES = new String[]{"FAR", "NORMAL", "SHORT", "TINY"}; + private static final String[] DIFFICULTY_LEVELS = new String[]{"Peaceful", "Easy", "Normal", "Hard"}; + public float musicVolume = 1.0F; + public float soundVolume = 1.0F; + public float mouseSensitivity = 0.5F; + public boolean invertMouse = false; + public int renderDistance = 0; + public boolean viewBobbing = true; + public boolean anaglyph = false; + public boolean limitFramerate = false; + public boolean fancyGraphics = true; + public String skin = "Default"; + public KeyBinding keyBindForward = new KeyBinding("Forward", 17); + public KeyBinding keyBindLeft = new KeyBinding("Left", 30); + public KeyBinding keyBindBack = new KeyBinding("Back", 31); + public KeyBinding keyBindRight = new KeyBinding("Right", 32); + public KeyBinding keyBindJump = new KeyBinding("Jump", 57); + public KeyBinding keyBindInventory = new KeyBinding("Inventory", 23); + public KeyBinding keyBindDrop = new KeyBinding("Drop", 16); + public KeyBinding keyBindChat = new KeyBinding("Chat", 20); + public KeyBinding keyBindToggleFog = new KeyBinding("Toggle fog", 33); + public KeyBinding keyBindSneak = new KeyBinding("Sneak", 42); + public KeyBinding[] keyBindings = new KeyBinding[]{this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory, this.keyBindChat, this.keyBindToggleFog}; + protected Minecraft mc; + private File optionsFile; + public int numberOfOptions = 10; + public int difficulty = 2; + public boolean thirdPersonView = false; + public String field_12259_z = ""; + + public GameSettings(Minecraft var1, File var2) { + this.mc = var1; + this.optionsFile = new File(var2, "options.txt"); + this.loadOptions(); + } + + public GameSettings() { + } + + public String getKeyBinding(int var1) { + return this.keyBindings[var1].keyDescription + ": " + Keyboard.getKeyName(this.keyBindings[var1].keyCode); + } + + public void setKeyBinding(int var1, int var2) { + this.keyBindings[var1].keyCode = var2; + this.saveOptions(); + } + + public void setOptionFloatValue(int var1, float var2) { + if(var1 == 0) { + this.musicVolume = var2; + } + + if(var1 == 1) { + this.soundVolume = var2; + } + + if(var1 == 3) { + this.mouseSensitivity = var2; + } + + } + + public void setOptionValue(int var1, int var2) { + if(var1 == 2) { + this.invertMouse = !this.invertMouse; + } + + if(var1 == 4) { + this.renderDistance = this.renderDistance + var2 & 3; + } + + if(var1 == 5) { + this.viewBobbing = !this.viewBobbing; + } + + if(var1 == 6) { + this.anaglyph = !this.anaglyph; + } + + if(var1 == 7) { + this.limitFramerate = !this.limitFramerate; + } + + if(var1 == 8) { + this.difficulty = this.difficulty + var2 & 3; + } + + if(var1 == 9) { + this.fancyGraphics = !this.fancyGraphics; + this.mc.field_6323_f.func_958_a(); + } + + this.saveOptions(); + } + + public int getOptionControlType(int var1) { + return var1 == 0 ? 1 : (var1 == 1 ? 1 : (var1 == 3 ? 1 : 0)); + } + + public float getOptionFloatValue(int var1) { + return var1 == 0 ? this.musicVolume : (var1 == 1 ? this.soundVolume : (var1 == 3 ? this.mouseSensitivity : 0.0F)); + } + + public String getOptionDisplayString(int var1) { + return var1 == 0 ? "Music: " + (this.musicVolume > 0.0F ? (int)(this.musicVolume * 100.0F) + "%" : "OFF") : (var1 == 1 ? "Sound: " + (this.soundVolume > 0.0F ? (int)(this.soundVolume * 100.0F) + "%" : "OFF") : (var1 == 2 ? "Invert mouse: " + (this.invertMouse ? "ON" : "OFF") : (var1 == 3 ? (this.mouseSensitivity == 0.0F ? "Sensitivity: *yawn*" : (this.mouseSensitivity == 1.0F ? "Sensitivity: HYPERSPEED!!!" : "Sensitivity: " + (int)(this.mouseSensitivity * 200.0F) + "%")) : (var1 == 4 ? "Render distance: " + RENDER_DISTANCES[this.renderDistance] : (var1 == 5 ? "View bobbing: " + (this.viewBobbing ? "ON" : "OFF") : (var1 == 6 ? "3d anaglyph: " + (this.anaglyph ? "ON" : "OFF") : (var1 == 7 ? "Limit framerate: " + (this.limitFramerate ? "ON" : "OFF") : (var1 == 8 ? "Difficulty: " + DIFFICULTY_LEVELS[this.difficulty] : (var1 == 9 ? "Graphics: " + (this.fancyGraphics ? "FANCY" : "FAST") : ""))))))))); + } + + public void loadOptions() { + try { + if(!this.optionsFile.exists()) { + return; + } + + BufferedReader var1 = new BufferedReader(new FileReader(this.optionsFile)); + String var2 = ""; + + while(true) { + var2 = var1.readLine(); + if(var2 == null) { + var1.close(); + break; + } + + String[] var3 = var2.split(":"); + if(var3[0].equals("music")) { + this.musicVolume = this.parseFloat(var3[1]); + } + + if(var3[0].equals("sound")) { + this.soundVolume = this.parseFloat(var3[1]); + } + + if(var3[0].equals("mouseSensitivity")) { + this.mouseSensitivity = this.parseFloat(var3[1]); + } + + if(var3[0].equals("invertYMouse")) { + this.invertMouse = var3[1].equals("true"); + } + + if(var3[0].equals("viewDistance")) { + this.renderDistance = Integer.parseInt(var3[1]); + } + + if(var3[0].equals("bobView")) { + this.viewBobbing = var3[1].equals("true"); + } + + if(var3[0].equals("anaglyph3d")) { + this.anaglyph = var3[1].equals("true"); + } + + if(var3[0].equals("limitFramerate")) { + this.limitFramerate = var3[1].equals("true"); + } + + if(var3[0].equals("difficulty")) { + this.difficulty = Integer.parseInt(var3[1]); + } + + if(var3[0].equals("fancyGraphics")) { + this.fancyGraphics = var3[1].equals("true"); + } + + if(var3[0].equals("skin")) { + this.skin = var3[1]; + } + + if(var3[0].equals("lastServer")) { + this.field_12259_z = var3[1]; + } + + for(int var4 = 0; var4 < this.keyBindings.length; ++var4) { + if(var3[0].equals("key_" + this.keyBindings[var4].keyDescription)) { + this.keyBindings[var4].keyCode = Integer.parseInt(var3[1]); + } + } + } + } catch (Exception var5) { + System.out.println("Failed to load options"); + var5.printStackTrace(); + } + + } + + private float parseFloat(String var1) { + return var1.equals("true") ? 1.0F : (var1.equals("false") ? 0.0F : Float.parseFloat(var1)); + } + + public void saveOptions() { + try { + PrintWriter var1 = new PrintWriter(new FileWriter(this.optionsFile)); + var1.println("music:" + this.musicVolume); + var1.println("sound:" + this.soundVolume); + var1.println("invertYMouse:" + this.invertMouse); + var1.println("mouseSensitivity:" + this.mouseSensitivity); + var1.println("viewDistance:" + this.renderDistance); + var1.println("bobView:" + this.viewBobbing); + var1.println("anaglyph3d:" + this.anaglyph); + var1.println("limitFramerate:" + this.limitFramerate); + var1.println("difficulty:" + this.difficulty); + var1.println("fancyGraphics:" + this.fancyGraphics); + var1.println("skin:" + this.skin); + var1.println("lastServer:" + this.field_12259_z); + + for(int var2 = 0; var2 < this.keyBindings.length; ++var2) { + var1.println("key_" + this.keyBindings[var2].keyDescription + ":" + this.keyBindings[var2].keyCode); + } + + var1.close(); + } catch (Exception var3) { + System.out.println("Failed to save options"); + var3.printStackTrace(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/GameWindowListener.java b/src/main/java/net/minecraft/src/GameWindowListener.java new file mode 100644 index 0000000..5ef7d0f --- /dev/null +++ b/src/main/java/net/minecraft/src/GameWindowListener.java @@ -0,0 +1,27 @@ +package net.minecraft.src; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import net.minecraft.client.Minecraft; + +public final class GameWindowListener extends WindowAdapter { + final Minecraft mc; + final Thread mcThread; + + public GameWindowListener(Minecraft var1, Thread var2) { + this.mc = var1; + this.mcThread = var2; + } + + public void windowClosing(WindowEvent var1) { + this.mc.shutdown(); + + try { + this.mcThread.join(); + } catch (InterruptedException var3) { + var3.printStackTrace(); + } + + System.exit(0); + } +} diff --git a/src/main/java/net/minecraft/src/Gui.java b/src/main/java/net/minecraft/src/Gui.java new file mode 100644 index 0000000..88dd25b --- /dev/null +++ b/src/main/java/net/minecraft/src/Gui.java @@ -0,0 +1,76 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class Gui { + protected float zLevel = 0.0F; + + protected void drawRect(int var1, int var2, int var3, int var4, int var5) { + float var6 = (float)(var5 >> 24 & 255) / 255.0F; + float var7 = (float)(var5 >> 16 & 255) / 255.0F; + float var8 = (float)(var5 >> 8 & 255) / 255.0F; + float var9 = (float)(var5 & 255) / 255.0F; + Tessellator var10 = Tessellator.instance; + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(var7, var8, var9, var6); + var10.startDrawingQuads(); + var10.addVertex((double)var1, (double)var4, 0.0D); + var10.addVertex((double)var3, (double)var4, 0.0D); + var10.addVertex((double)var3, (double)var2, 0.0D); + var10.addVertex((double)var1, (double)var2, 0.0D); + var10.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + } + + protected void drawGradientRect(int var1, int var2, int var3, int var4, int var5, int var6) { + float var7 = (float)(var5 >> 24 & 255) / 255.0F; + float var8 = (float)(var5 >> 16 & 255) / 255.0F; + float var9 = (float)(var5 >> 8 & 255) / 255.0F; + float var10 = (float)(var5 & 255) / 255.0F; + float var11 = (float)(var6 >> 24 & 255) / 255.0F; + float var12 = (float)(var6 >> 16 & 255) / 255.0F; + float var13 = (float)(var6 >> 8 & 255) / 255.0F; + float var14 = (float)(var6 & 255) / 255.0F; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator var15 = Tessellator.instance; + var15.startDrawingQuads(); + var15.setColorRGBA_F(var8, var9, var10, var7); + var15.addVertex((double)var3, (double)var2, 0.0D); + var15.addVertex((double)var1, (double)var2, 0.0D); + var15.setColorRGBA_F(var12, var13, var14, var11); + var15.addVertex((double)var1, (double)var4, 0.0D); + var15.addVertex((double)var3, (double)var4, 0.0D); + var15.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public void drawCenteredString(FontRenderer var1, String var2, int var3, int var4, int var5) { + var1.drawStringWithShadow(var2, var3 - var1.getStringWidth(var2) / 2, var4, var5); + } + + public void drawString(FontRenderer var1, String var2, int var3, int var4, int var5) { + var1.drawStringWithShadow(var2, var3, var4, var5); + } + + public void drawTexturedModalRect(int var1, int var2, int var3, int var4, int var5, int var6) { + float var7 = 0.00390625F; + float var8 = 0.00390625F; + Tessellator var9 = Tessellator.instance; + var9.startDrawingQuads(); + var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), (double)this.zLevel, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + var6) * var8)); + var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), (double)this.zLevel, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + var6) * var8)); + var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), (double)this.zLevel, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + 0) * var8)); + var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), (double)this.zLevel, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + 0) * var8)); + var9.draw(); + } +} diff --git a/src/main/java/net/minecraft/src/GuiButton.java b/src/main/java/net/minecraft/src/GuiButton.java new file mode 100644 index 0000000..3620a0e --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiButton.java @@ -0,0 +1,74 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; + +public class GuiButton extends Gui { + protected int width; + protected int height; + public int xPosition; + public int yPosition; + public String displayString; + public int id; + public boolean enabled; + public boolean enabled2; + + public GuiButton(int var1, int var2, int var3, String var4) { + this(var1, var2, var3, 200, 20, var4); + } + + protected GuiButton(int var1, int var2, int var3, int var4, int var5, String var6) { + this.width = 200; + this.height = 20; + this.enabled = true; + this.enabled2 = true; + this.id = var1; + this.xPosition = var2; + this.yPosition = var3; + this.width = var4; + this.height = var5; + this.displayString = var6; + } + + protected int getHoverState(boolean var1) { + byte var2 = 1; + if(!this.enabled) { + var2 = 0; + } else if(var1) { + var2 = 2; + } + + return var2; + } + + public void drawButton(Minecraft var1, int var2, int var3) { + if(this.enabled2) { + FontRenderer var4 = var1.fontRenderer; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.renderEngine.getTexture("/gui/gui.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + boolean var5 = var2 >= this.xPosition && var3 >= this.yPosition && var2 < this.xPosition + this.width && var3 < this.yPosition + this.height; + int var6 = this.getHoverState(var5); + this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 46 + var6 * 20, this.width / 2, this.height); + this.drawTexturedModalRect(this.xPosition + this.width / 2, this.yPosition, 200 - this.width / 2, 46 + var6 * 20, this.width / 2, this.height); + this.mouseDragged(var1, var2, var3); + if(!this.enabled) { + this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, -6250336); + } else if(var5) { + this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 16777120); + } else { + this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 14737632); + } + + } + } + + protected void mouseDragged(Minecraft var1, int var2, int var3) { + } + + public void mouseReleased(int var1, int var2) { + } + + public boolean mousePressed(Minecraft var1, int var2, int var3) { + return this.enabled && var2 >= this.xPosition && var3 >= this.yPosition && var2 < this.xPosition + this.width && var3 < this.yPosition + this.height; + } +} diff --git a/src/main/java/net/minecraft/src/GuiChat.java b/src/main/java/net/minecraft/src/GuiChat.java new file mode 100644 index 0000000..662dacf --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiChat.java @@ -0,0 +1,62 @@ +package net.minecraft.src; + +import org.lwjgl.input.Keyboard; + +public class GuiChat extends GuiScreen { + private String message = ""; + private int updateCounter = 0; + + public void initGui() { + Keyboard.enableRepeatEvents(true); + } + + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } + + public void updateScreen() { + ++this.updateCounter; + } + + protected void keyTyped(char var1, int var2) { + if(var2 == 1) { + this.mc.displayGuiScreen((GuiScreen)null); + } else if(var2 == 28) { + String var3 = this.message.trim(); + if(var3.length() > 0) { + this.mc.thePlayer.sendChatMessage(this.message.trim()); + } + + this.mc.displayGuiScreen((GuiScreen)null); + } else { + if(var2 == 14 && this.message.length() > 0) { + this.message = this.message.substring(0, this.message.length() - 1); + } + + if(" !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\'abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb".indexOf(var1) >= 0 && this.message.length() < 100) { + this.message = this.message + var1; + } + + } + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawRect(2, this.height - 14, this.width - 2, this.height - 2, Integer.MIN_VALUE); + this.drawString(this.fontRenderer, "> " + this.message + (this.updateCounter / 6 % 2 == 0 ? "_" : ""), 4, this.height - 12, 14737632); + } + + protected void mouseClicked(int var1, int var2, int var3) { + if(var3 == 0 && this.mc.ingameGUI.field_933_a != null) { + if(this.message.length() > 0 && !this.message.endsWith(" ")) { + this.message = this.message + " "; + } + + this.message = this.message + this.mc.ingameGUI.field_933_a; + byte var4 = 100; + if(this.message.length() > var4) { + this.message = this.message.substring(0, var4); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/GuiChest.java b/src/main/java/net/minecraft/src/GuiChest.java new file mode 100644 index 0000000..d6f312f --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiChest.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class GuiChest extends GuiContainer { + private IInventory field_982_j; + private IInventory field_981_l; + private int field_980_m = 0; + + public GuiChest(IInventory var1, IInventory var2) { + this.field_982_j = var1; + this.field_981_l = var2; + this.field_948_f = false; + short var3 = 222; + int var4 = var3 - 108; + this.field_980_m = var2.getSizeInventory() / 9; + this.ySize = var4 + this.field_980_m * 18; + int var5 = (this.field_980_m - 4) * 18; + + int var6; + int var7; + for(var6 = 0; var6 < this.field_980_m; ++var6) { + for(var7 = 0; var7 < 9; ++var7) { + this.inventorySlots.add(new SlotInventory(this, var2, var7 + var6 * 9, 8 + var7 * 18, 18 + var6 * 18)); + } + } + + for(var6 = 0; var6 < 3; ++var6) { + for(var7 = 0; var7 < 9; ++var7) { + this.inventorySlots.add(new SlotInventory(this, var1, var7 + (var6 + 1) * 9, 8 + var7 * 18, 103 + var6 * 18 + var5)); + } + } + + for(var6 = 0; var6 < 9; ++var6) { + this.inventorySlots.add(new SlotInventory(this, var1, var6, 8 + var6 * 18, 161 + var5)); + } + + } + + protected void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString(this.field_981_l.getInvName(), 8, 6, 4210752); + this.fontRenderer.drawString(this.field_982_j.getInvName(), 8, this.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float var1) { + int var2 = this.mc.renderEngine.getTexture("/gui/container.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(var2); + int var3 = (this.width - this.xSize) / 2; + int var4 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.field_980_m * 18 + 17); + this.drawTexturedModalRect(var3, var4 + this.field_980_m * 18 + 17, 0, 126, this.xSize, 96); + } +} diff --git a/src/main/java/net/minecraft/src/GuiConflictWarning.java b/src/main/java/net/minecraft/src/GuiConflictWarning.java new file mode 100644 index 0000000..9abddce --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiConflictWarning.java @@ -0,0 +1,33 @@ +package net.minecraft.src; + +public class GuiConflictWarning extends GuiScreen { + private int updateCounter = 0; + + public void updateScreen() { + ++this.updateCounter; + } + + public void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Back to title screen")); + } + + protected void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + } + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, "Level save conflict", this.width / 2, this.height / 4 - 60 + 20, 16777215); + this.drawString(this.fontRenderer, "Minecraft detected a conflict in the level save data.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 0, 10526880); + this.drawString(this.fontRenderer, "This could be caused by two copies of the game", this.width / 2 - 140, this.height / 4 - 60 + 60 + 18, 10526880); + this.drawString(this.fontRenderer, "accessing the same level.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 27, 10526880); + this.drawString(this.fontRenderer, "To prevent level corruption, the current game has quit.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 45, 10526880); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiConnectFailed.java b/src/main/java/net/minecraft/src/GuiConnectFailed.java new file mode 100644 index 0000000..da51556 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiConnectFailed.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +public class GuiConnectFailed extends GuiScreen { + private String errorMessage; + private String errorDetail; + + public GuiConnectFailed(String var1, String var2) { + this.errorMessage = var1; + this.errorDetail = var2; + } + + public void updateScreen() { + } + + protected void keyTyped(char var1, int var2) { + } + + public void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Back to title screen")); + } + + protected void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.errorMessage, this.width / 2, this.height / 2 - 50, 16777215); + this.drawCenteredString(this.fontRenderer, this.errorDetail, this.width / 2, this.height / 2 - 10, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiContainer.java b/src/main/java/net/minecraft/src/GuiContainer.java new file mode 100644 index 0000000..5a2b603 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiContainer.java @@ -0,0 +1,229 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public abstract class GuiContainer extends GuiScreen { + private static RenderItem itemRenderer = new RenderItem(); + protected int xSize = 176; + protected int ySize = 166; + protected List inventorySlots = new ArrayList(); + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + int var4 = (this.width - this.xSize) / 2; + int var5 = (this.height - this.ySize) / 2; + this.drawGuiContainerBackgroundLayer(var3); + GL11.glPushMatrix(); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var4, (float)var5, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + for(int var6 = 0; var6 < this.inventorySlots.size(); ++var6) { + SlotInventory var7 = (SlotInventory)this.inventorySlots.get(var6); + this.drawSlotInventory(var7); + if(var7.isAtCursorPos(var1, var2)) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + int var8 = var7.xPos; + int var9 = var7.yPos; + this.drawGradientRect(var8, var9, var8 + 16, var9 + 16, -2130706433, -2130706433); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + + InventoryPlayer var10 = this.mc.thePlayer.inventory; + if(var10.draggingItemStack != null) { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + itemRenderer.renderItemIntoGUI(this.fontRenderer, this.mc.renderEngine, var10.draggingItemStack, var1 - var4 - 8, var2 - var5 - 8); + itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var10.draggingItemStack, var1 - var4 - 8, var2 - var5 - 8); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + this.drawGuiContainerForegroundLayer(); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + } + + protected void drawGuiContainerForegroundLayer() { + } + + protected abstract void drawGuiContainerBackgroundLayer(float var1); + + private void drawSlotInventory(SlotInventory var1) { + IInventory var2 = var1.inventory; + int var3 = var1.slotIndex; + int var4 = var1.xPos; + int var5 = var1.yPos; + ItemStack var6 = var2.getStackInSlot(var3); + if(var6 == null) { + int var7 = var1.func_775_c(); + if(var7 >= 0) { + GL11.glDisable(GL11.GL_LIGHTING); + this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture("/gui/items.png")); + this.drawTexturedModalRect(var4, var5, var7 % 16 * 16, var7 / 16 * 16, 16, 16); + GL11.glEnable(GL11.GL_LIGHTING); + return; + } + } + + itemRenderer.renderItemIntoGUI(this.fontRenderer, this.mc.renderEngine, var6, var4, var5); + itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var6, var4, var5); + } + + private Slot getSlotAtPosition(int var1, int var2) { + for(int var3 = 0; var3 < this.inventorySlots.size(); ++var3) { + SlotInventory var4 = (SlotInventory)this.inventorySlots.get(var3); + if(var4.isAtCursorPos(var1, var2)) { + return var4; + } + } + + return null; + } + + protected void mouseClicked(int var1, int var2, int var3) { + if(var3 == 0 || var3 == 1) { + Slot var4 = this.getSlotAtPosition(var1, var2); + InventoryPlayer var5 = this.mc.thePlayer.inventory; + int var7; + if(var4 != null) { + ItemStack var6 = var4.getStack(); + if(var6 != null || var5.draggingItemStack != null) { + if(var6 != null && var5.draggingItemStack == null) { + var7 = var3 == 0 ? var6.stackSize : (var6.stackSize + 1) / 2; + var5.draggingItemStack = var4.inventory.decrStackSize(var4.slotIndex, var7); + if(var6.stackSize == 0) { + var4.putStack((ItemStack)null); + } + + var4.onPickupFromSlot(); + } else if(var6 == null && var5.draggingItemStack != null && var4.isItemValid(var5.draggingItemStack)) { + var7 = var3 == 0 ? var5.draggingItemStack.stackSize : 1; + if(var7 > var4.getSlotStackLimit()) { + var7 = var4.getSlotStackLimit(); + } + + var4.putStack(var5.draggingItemStack.splitStack(var7)); + if(var5.draggingItemStack.stackSize == 0) { + var5.draggingItemStack = null; + } + } else if(var6 != null && var5.draggingItemStack != null) { + if(var4.isItemValid(var5.draggingItemStack)) { + if(var6.itemID != var5.draggingItemStack.itemID) { + if(var5.draggingItemStack.stackSize <= var4.getSlotStackLimit()) { + var4.putStack(var5.draggingItemStack); + var5.draggingItemStack = var6; + } + } else if(var6.itemID == var5.draggingItemStack.itemID) { + if(var3 == 0) { + var7 = var5.draggingItemStack.stackSize; + if(var7 > var4.getSlotStackLimit() - var6.stackSize) { + var7 = var4.getSlotStackLimit() - var6.stackSize; + } + + if(var7 > var5.draggingItemStack.getMaxStackSize() - var6.stackSize) { + var7 = var5.draggingItemStack.getMaxStackSize() - var6.stackSize; + } + + var5.draggingItemStack.splitStack(var7); + if(var5.draggingItemStack.stackSize == 0) { + var5.draggingItemStack = null; + } + + var6.stackSize += var7; + } else if(var3 == 1) { + var7 = 1; + if(var7 > var4.getSlotStackLimit() - var6.stackSize) { + var7 = var4.getSlotStackLimit() - var6.stackSize; + } + + if(var7 > var5.draggingItemStack.getMaxStackSize() - var6.stackSize) { + var7 = var5.draggingItemStack.getMaxStackSize() - var6.stackSize; + } + + var5.draggingItemStack.splitStack(var7); + if(var5.draggingItemStack.stackSize == 0) { + var5.draggingItemStack = null; + } + + var6.stackSize += var7; + } + } + } else if(var6.itemID == var5.draggingItemStack.itemID && var5.draggingItemStack.getMaxStackSize() > 1) { + var7 = var6.stackSize; + if(var7 > 0 && var7 + var5.draggingItemStack.stackSize <= var5.draggingItemStack.getMaxStackSize()) { + var5.draggingItemStack.stackSize += var7; + var6.splitStack(var7); + if(var6.stackSize == 0) { + var4.putStack((ItemStack)null); + } + + var4.onPickupFromSlot(); + } + } + } + } + + var4.onSlotChanged(); + } else if(var5.draggingItemStack != null) { + int var9 = (this.width - this.xSize) / 2; + var7 = (this.height - this.ySize) / 2; + if(var1 < var9 || var2 < var7 || var1 >= var9 + this.xSize || var2 >= var7 + this.xSize) { + EntityPlayerSP var8 = this.mc.thePlayer; + if(var3 == 0) { + var8.dropPlayerItem(var5.draggingItemStack); + var5.draggingItemStack = null; + } + + if(var3 == 1) { + var8.dropPlayerItem(var5.draggingItemStack.splitStack(1)); + if(var5.draggingItemStack.stackSize == 0) { + var5.draggingItemStack = null; + } + } + } + } + } + + } + + protected void mouseMovedOrUp(int var1, int var2, int var3) { + if(var3 == 0) { + } + + } + + protected void keyTyped(char var1, int var2) { + if(var2 == 1 || var2 == this.mc.gameSettings.keyBindInventory.keyCode) { + this.mc.displayGuiScreen((GuiScreen)null); + } + + } + + public void onGuiClosed() { + if(this.mc.thePlayer != null) { + InventoryPlayer var1 = this.mc.thePlayer.inventory; + if(var1.draggingItemStack != null) { + this.mc.thePlayer.dropPlayerItem(var1.draggingItemStack); + var1.draggingItemStack = null; + } + + } + } + + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/GuiControls.java b/src/main/java/net/minecraft/src/GuiControls.java new file mode 100644 index 0000000..53580ed --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiControls.java @@ -0,0 +1,52 @@ +package net.minecraft.src; + +public class GuiControls extends GuiScreen { + private GuiScreen parentScreen; + protected String screenTitle = "Controls"; + private GameSettings options; + private int buttonId = -1; + + public GuiControls(GuiScreen var1, GameSettings var2) { + this.parentScreen = var1; + this.options = var2; + } + + public void initGui() { + for(int var1 = 0; var1 < this.options.keyBindings.length; ++var1) { + this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.getKeyBinding(var1))); + } + + this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done")); + } + + protected void actionPerformed(GuiButton var1) { + for(int var2 = 0; var2 < this.options.keyBindings.length; ++var2) { + ((GuiButton)this.controlList.get(var2)).displayString = this.options.getKeyBinding(var2); + } + + if(var1.id == 200) { + this.mc.displayGuiScreen(this.parentScreen); + } else { + this.buttonId = var1.id; + var1.displayString = "> " + this.options.getKeyBinding(var1.id) + " <"; + } + + } + + protected void keyTyped(char var1, int var2) { + if(this.buttonId >= 0) { + this.options.setKeyBinding(this.buttonId, var2); + ((GuiButton)this.controlList.get(this.buttonId)).displayString = this.options.getKeyBinding(this.buttonId); + this.buttonId = -1; + } else { + super.keyTyped(var1, var2); + } + + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiCrafting.java b/src/main/java/net/minecraft/src/GuiCrafting.java new file mode 100644 index 0000000..7a3deca --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiCrafting.java @@ -0,0 +1,49 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class GuiCrafting extends GuiContainer { + public CraftingInventoryWorkbenchCB field_979_j = new CraftingInventoryWorkbenchCB(); + + public GuiCrafting(InventoryPlayer var1) { + this.inventorySlots.add(new SlotCrafting(this, this.field_979_j.craftMatrix, this.field_979_j.craftResult, 0, 124, 35)); + + int var2; + int var3; + for(var2 = 0; var2 < 3; ++var2) { + for(var3 = 0; var3 < 3; ++var3) { + this.inventorySlots.add(new SlotInventory(this, this.field_979_j.craftMatrix, var3 + var2 * 3, 30 + var3 * 18, 17 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 3; ++var2) { + for(var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new SlotInventory(this, var1, var3 + (var2 + 1) * 9, 8 + var3 * 18, 84 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 9; ++var2) { + this.inventorySlots.add(new SlotInventory(this, var1, var2, 8 + var2 * 18, 142)); + } + + } + + public void onGuiClosed() { + super.onGuiClosed(); + this.field_979_j.onCraftGuiClosed(this.mc.thePlayer); + } + + protected void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Crafting", 28, 6, 4210752); + this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float var1) { + int var2 = this.mc.renderEngine.getTexture("/gui/crafting.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(var2); + int var3 = (this.width - this.xSize) / 2; + int var4 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize); + } +} diff --git a/src/main/java/net/minecraft/src/GuiDeleteWorld.java b/src/main/java/net/minecraft/src/GuiDeleteWorld.java new file mode 100644 index 0000000..5da0735 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiDeleteWorld.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.File; +import net.minecraft.client.Minecraft; + +public class GuiDeleteWorld extends GuiSelectWorld { + public GuiDeleteWorld(GuiScreen var1) { + super(var1); + this.screenTitle = "Delete world"; + } + + public void initGui2() { + this.controlList.add(new GuiButton(6, this.width / 2 - 100, this.height / 6 + 168, "Cancel")); + } + + public void selectWorld(int var1) { + String var2 = this.getWorldName(var1); + if(var2 != null) { + this.mc.displayGuiScreen(new GuiYesNo(this, "Are you sure you want to delete this world?", "\'" + var2 + "\' will be lost forever!", var1)); + } + + } + + public void deleteWorld(boolean var1, int var2) { + if(var1) { + File var3 = Minecraft.getMinecraftDir(); + World.deleteWorld(var3, this.getWorldName(var2)); + } + + this.mc.displayGuiScreen(this.parentScreen); + } +} diff --git a/src/main/java/net/minecraft/src/GuiEditSign.java b/src/main/java/net/minecraft/src/GuiEditSign.java new file mode 100644 index 0000000..7e1d435 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiEditSign.java @@ -0,0 +1,100 @@ +package net.minecraft.src; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +public class GuiEditSign extends GuiScreen { + protected String screenTitle = "Edit sign message:"; + private TileEntitySign entitySign; + private int updateCounter; + private int editLine = 0; + + public GuiEditSign(TileEntitySign var1) { + this.entitySign = var1; + } + + public void initGui() { + this.controlList.clear(); + Keyboard.enableRepeatEvents(true); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Done")); + } + + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } + + public void updateScreen() { + ++this.updateCounter; + } + + protected void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id == 0) { + this.entitySign.onInventoryChanged(); + this.mc.displayGuiScreen((GuiScreen)null); + } + + } + } + + protected void keyTyped(char var1, int var2) { + if(var2 == 200) { + this.editLine = this.editLine - 1 & 3; + } + + if(var2 == 208 || var2 == 28) { + this.editLine = this.editLine + 1 & 3; + } + + if(var2 == 14 && this.entitySign.signText[this.editLine].length() > 0) { + this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine].substring(0, this.entitySign.signText[this.editLine].length() - 1); + } + + if(" !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\'abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb".indexOf(var1) >= 0 && this.entitySign.signText[this.editLine].length() < 15) { + this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine] + var1; + } + + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 40, 16777215); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(this.width / 2), (float)(this.height / 2), 50.0F); + float var4 = 93.75F; + GL11.glScalef(-var4, -var4, -var4); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + Block var5 = this.entitySign.getBlockType(); + if(var5 == Block.signPost) { + float var6 = (float)(this.entitySign.getBlockMetadata() * 360) / 16.0F; + GL11.glRotatef(var6, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F); + } else { + int var8 = this.entitySign.getBlockMetadata(); + float var7 = 0.0F; + if(var8 == 2) { + var7 = 180.0F; + } + + if(var8 == 4) { + var7 = 90.0F; + } + + if(var8 == 5) { + var7 = -90.0F; + } + + GL11.glRotatef(var7, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F); + } + + if(this.updateCounter / 6 % 2 == 0) { + this.entitySign.lineBeingEdited = this.editLine; + } + + TileEntityRenderer.instance.renderTileEntityAt(this.entitySign, -0.5D, -0.75D, -0.5D, 0.0F); + this.entitySign.lineBeingEdited = -1; + GL11.glPopMatrix(); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiFurnace.java b/src/main/java/net/minecraft/src/GuiFurnace.java new file mode 100644 index 0000000..f576c7e --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiFurnace.java @@ -0,0 +1,48 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class GuiFurnace extends GuiContainer { + private TileEntityFurnace field_978_j; + + public GuiFurnace(InventoryPlayer var1, TileEntityFurnace var2) { + this.field_978_j = var2; + this.inventorySlots.add(new SlotInventory(this, var2, 0, 56, 17)); + this.inventorySlots.add(new SlotInventory(this, var2, 1, 56, 53)); + this.inventorySlots.add(new SlotInventory(this, var2, 2, 116, 35)); + + int var3; + for(var3 = 0; var3 < 3; ++var3) { + for(int var4 = 0; var4 < 9; ++var4) { + this.inventorySlots.add(new SlotInventory(this, var1, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18)); + } + } + + for(var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new SlotInventory(this, var1, var3, 8 + var3 * 18, 142)); + } + + } + + protected void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Furnace", 60, 6, 4210752); + this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float var1) { + int var2 = this.mc.renderEngine.getTexture("/gui/furnace.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(var2); + int var3 = (this.width - this.xSize) / 2; + int var4 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize); + int var5; + if(this.field_978_j.isBurning()) { + var5 = this.field_978_j.getBurnTimeRemainingScaled(12); + this.drawTexturedModalRect(var3 + 56, var4 + 36 + 12 - var5, 176, 12 - var5, 14, var5 + 2); + } + + var5 = this.field_978_j.getCookProgressScaled(24); + this.drawTexturedModalRect(var3 + 79, var4 + 34, 176, 14, var5 + 1, 16); + } +} diff --git a/src/main/java/net/minecraft/src/GuiGameOver.java b/src/main/java/net/minecraft/src/GuiGameOver.java new file mode 100644 index 0000000..7e3d706 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiGameOver.java @@ -0,0 +1,48 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class GuiGameOver extends GuiScreen { + public void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 72, "Respawn")); + this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 96, "Title menu")); + if(this.mc.field_6320_i == null) { + ((GuiButton)this.controlList.get(1)).enabled = false; + } + + } + + protected void keyTyped(char var1, int var2) { + } + + protected void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + } + + if(var1.id == 1) { + this.mc.thePlayer.func_9367_r(); + this.mc.displayGuiScreen((GuiScreen)null); + } + + if(var1.id == 2) { + this.mc.func_6261_a((World)null); + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawGradientRect(0, 0, this.width, this.height, 1615855616, -1602211792); + GL11.glPushMatrix(); + GL11.glScalef(2.0F, 2.0F, 2.0F); + this.drawCenteredString(this.fontRenderer, "Game over!", this.width / 2 / 2, 30, 16777215); + GL11.glPopMatrix(); + this.drawCenteredString(this.fontRenderer, "Score: &e" + this.mc.thePlayer.func_6417_t(), this.width / 2, 100, 16777215); + super.drawScreen(var1, var2, var3); + } + + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/GuiIngame.java b/src/main/java/net/minecraft/src/GuiIngame.java new file mode 100644 index 0000000..fa1ff18 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiIngame.java @@ -0,0 +1,371 @@ +package net.minecraft.src; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class GuiIngame extends Gui { + private static RenderItem itemRenderer = new RenderItem(); + private List chatMessageList = new ArrayList(); + private Random rand = new Random(); + private Minecraft mc; + public String field_933_a = null; + private int updateCounter = 0; + private String field_9420_i = ""; + private int field_9419_j = 0; + public float field_6446_b; + float field_931_c = 1.0F; + + public GuiIngame(Minecraft var1) { + this.mc = var1; + } + + public void renderGameOverlay(float var1, boolean var2, int var3, int var4) { + ScaledResolution var5 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var6 = var5.getScaledWidth(); + int var7 = var5.getScaledHeight(); + FontRenderer var8 = this.mc.fontRenderer; + this.mc.field_9243_r.func_905_b(); + GL11.glEnable(GL11.GL_BLEND); + if(this.mc.gameSettings.fancyGraphics) { + this.func_4064_a(this.mc.thePlayer.getEntityBrightness(var1), var6, var7); + } + + ItemStack var9 = this.mc.thePlayer.inventory.armorItemInSlot(3); + if(!this.mc.gameSettings.thirdPersonView && var9 != null && var9.itemID == Block.pumpkin.blockID) { + this.func_4063_a(var6, var7); + } + + float var10 = this.mc.thePlayer.field_4133_d + (this.mc.thePlayer.field_4134_c - this.mc.thePlayer.field_4133_d) * var1; + if(var10 > 0.0F) { + this.func_4065_b(var10, var6, var7); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/gui.png")); + InventoryPlayer var11 = this.mc.thePlayer.inventory; + this.zLevel = -90.0F; + this.drawTexturedModalRect(var6 / 2 - 91, var7 - 22, 0, 0, 182, 22); + this.drawTexturedModalRect(var6 / 2 - 91 - 1 + var11.currentItem * 20, var7 - 22 - 1, 0, 22, 24, 22); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/icons.png")); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR); + this.drawTexturedModalRect(var6 / 2 - 7, var7 / 2 - 7, 0, 0, 16, 16); + GL11.glDisable(GL11.GL_BLEND); + boolean var12 = this.mc.thePlayer.field_9306_bj / 3 % 2 == 1; + if(this.mc.thePlayer.field_9306_bj < 10) { + var12 = false; + } + + int var13 = this.mc.thePlayer.health; + int var14 = this.mc.thePlayer.field_9335_K; + this.rand.setSeed((long)(this.updateCounter * 312871)); + int var15; + int var16; + int var17; + if(this.mc.field_6327_b.func_6469_d()) { + var15 = this.mc.thePlayer.getPlayerArmorValue(); + + int var18; + for(var16 = 0; var16 < 10; ++var16) { + var17 = var7 - 32; + if(var15 > 0) { + var18 = var6 / 2 + 91 - var16 * 8 - 9; + if(var16 * 2 + 1 < var15) { + this.drawTexturedModalRect(var18, var17, 34, 9, 9, 9); + } + + if(var16 * 2 + 1 == var15) { + this.drawTexturedModalRect(var18, var17, 25, 9, 9, 9); + } + + if(var16 * 2 + 1 > var15) { + this.drawTexturedModalRect(var18, var17, 16, 9, 9, 9); + } + } + + byte var27 = 0; + if(var12) { + var27 = 1; + } + + int var19 = var6 / 2 - 91 + var16 * 8; + if(var13 <= 4) { + var17 += this.rand.nextInt(2); + } + + this.drawTexturedModalRect(var19, var17, 16 + var27 * 9, 0, 9, 9); + if(var12) { + if(var16 * 2 + 1 < var14) { + this.drawTexturedModalRect(var19, var17, 70, 0, 9, 9); + } + + if(var16 * 2 + 1 == var14) { + this.drawTexturedModalRect(var19, var17, 79, 0, 9, 9); + } + } + + if(var16 * 2 + 1 < var13) { + this.drawTexturedModalRect(var19, var17, 52, 0, 9, 9); + } + + if(var16 * 2 + 1 == var13) { + this.drawTexturedModalRect(var19, var17, 61, 0, 9, 9); + } + } + + if(this.mc.thePlayer.isInsideOfMaterial(Material.water)) { + var16 = (int)Math.ceil((double)(this.mc.thePlayer.air - 2) * 10.0D / 300.0D); + var17 = (int)Math.ceil((double)this.mc.thePlayer.air * 10.0D / 300.0D) - var16; + + for(var18 = 0; var18 < var16 + var17; ++var18) { + if(var18 < var16) { + this.drawTexturedModalRect(var6 / 2 - 91 + var18 * 8, var7 - 32 - 9, 16, 18, 9, 9); + } else { + this.drawTexturedModalRect(var6 / 2 - 91 + var18 * 8, var7 - 32 - 9, 25, 18, 9, 9); + } + } + } + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glPushMatrix(); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + + for(var15 = 0; var15 < 9; ++var15) { + var16 = var6 / 2 - 90 + var15 * 20 + 2; + var17 = var7 - 16 - 3; + this.func_554_a(var15, var16, var17, var1); + } + + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + String var23; + if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(4)) { + var8.drawStringWithShadow("Minecraft Alpha v1.2.6 (" + this.mc.field_6292_I + ")", 2, 2, 16777215); + var8.drawStringWithShadow(this.mc.func_6241_m(), 2, 12, 16777215); + var8.drawStringWithShadow(this.mc.func_6262_n(), 2, 22, 16777215); + var8.drawStringWithShadow(this.mc.func_6245_o(), 2, 32, 16777215); + long var24 = Runtime.getRuntime().maxMemory(); + long var29 = Runtime.getRuntime().totalMemory(); + long var30 = Runtime.getRuntime().freeMemory(); + long var21 = var29 - var30; + var23 = "Used memory: " + var21 * 100L / var24 + "% (" + var21 / 1024L / 1024L + "MB) of " + var24 / 1024L / 1024L + "MB"; + this.drawString(var8, var23, var6 - var8.getStringWidth(var23) - 2, 2, 14737632); + var23 = "Allocated memory: " + var29 * 100L / var24 + "% (" + var29 / 1024L / 1024L + "MB)"; + this.drawString(var8, var23, var6 - var8.getStringWidth(var23) - 2, 12, 14737632); + this.drawString(var8, "x: " + this.mc.thePlayer.posX, 2, 64, 14737632); + this.drawString(var8, "y: " + this.mc.thePlayer.posY, 2, 72, 14737632); + this.drawString(var8, "z: " + this.mc.thePlayer.posZ, 2, 80, 14737632); + } else { + var8.drawStringWithShadow("Minecraft Alpha v1.2.6", 2, 2, 16777215); + } + + if(this.field_9419_j > 0) { + float var25 = (float)this.field_9419_j - var1; + var16 = (int)(var25 * 256.0F / 20.0F); + if(var16 > 255) { + var16 = 255; + } + + if(var16 > 0) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)(var6 / 2), (float)(var7 - 48), 0.0F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + var17 = Color.HSBtoRGB(var25 / 50.0F, 0.7F, 0.6F) & 16777215; + var8.drawString(this.field_9420_i, -var8.getStringWidth(this.field_9420_i) / 2, -4, var17 + (var16 << 24)); + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + } + } + + byte var26 = 10; + boolean var28 = false; + if(this.mc.currentScreen instanceof GuiChat) { + var26 = 20; + var28 = true; + } + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, (float)(var7 - 48), 0.0F); + + for(var17 = 0; var17 < this.chatMessageList.size() && var17 < var26; ++var17) { + if(((ChatLine)this.chatMessageList.get(var17)).updateCounter < 200 || var28) { + double var31 = (double)((ChatLine)this.chatMessageList.get(var17)).updateCounter / 200.0D; + var31 = 1.0D - var31; + var31 *= 10.0D; + if(var31 < 0.0D) { + var31 = 0.0D; + } + + if(var31 > 1.0D) { + var31 = 1.0D; + } + + var31 *= var31; + int var20 = (int)(255.0D * var31); + if(var28) { + var20 = 255; + } + + if(var20 > 0) { + byte var32 = 2; + int var22 = -var17 * 9; + var23 = ((ChatLine)this.chatMessageList.get(var17)).message; + this.drawRect(var32, var22 - 1, var32 + 320, var22 + 8, var20 / 2 << 24); + GL11.glEnable(GL11.GL_BLEND); + var8.drawStringWithShadow(var23, var32, var22, 16777215 + (var20 << 24)); + } + } + } + + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + } + + private void func_4063_a(int var1, int var2) { + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/misc/pumpkinblur.png")); + Tessellator var3 = Tessellator.instance; + var3.startDrawingQuads(); + var3.addVertexWithUV(0.0D, (double)var2, -90.0D, 0.0D, 1.0D); + var3.addVertexWithUV((double)var1, (double)var2, -90.0D, 1.0D, 1.0D); + var3.addVertexWithUV((double)var1, 0.0D, -90.0D, 1.0D, 0.0D); + var3.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + var3.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + private void func_4064_a(float var1, int var2, int var3) { + var1 = 1.0F - var1; + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + this.field_931_c = (float)((double)this.field_931_c + (double)(var1 - this.field_931_c) * 0.01D); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_COLOR); + GL11.glColor4f(this.field_931_c, this.field_931_c, this.field_931_c, 1.0F); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/misc/vignette.png")); + Tessellator var4 = Tessellator.instance; + var4.startDrawingQuads(); + var4.addVertexWithUV(0.0D, (double)var3, -90.0D, 0.0D, 1.0D); + var4.addVertexWithUV((double)var2, (double)var3, -90.0D, 1.0D, 1.0D); + var4.addVertexWithUV((double)var2, 0.0D, -90.0D, 1.0D, 0.0D); + var4.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + var4.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + private void func_4065_b(float var1, int var2, int var3) { + var1 *= var1; + var1 *= var1; + var1 = var1 * 0.8F + 0.2F; + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, var1); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + float var4 = (float)(Block.portal.blockIndexInTexture % 16) / 16.0F; + float var5 = (float)(Block.portal.blockIndexInTexture / 16) / 16.0F; + float var6 = (float)(Block.portal.blockIndexInTexture % 16 + 1) / 16.0F; + float var7 = (float)(Block.portal.blockIndexInTexture / 16 + 1) / 16.0F; + Tessellator var8 = Tessellator.instance; + var8.startDrawingQuads(); + var8.addVertexWithUV(0.0D, (double)var3, -90.0D, (double)var4, (double)var7); + var8.addVertexWithUV((double)var2, (double)var3, -90.0D, (double)var6, (double)var7); + var8.addVertexWithUV((double)var2, 0.0D, -90.0D, (double)var6, (double)var5); + var8.addVertexWithUV(0.0D, 0.0D, -90.0D, (double)var4, (double)var5); + var8.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + private void func_554_a(int var1, int var2, int var3, float var4) { + ItemStack var5 = this.mc.thePlayer.inventory.mainInventory[var1]; + if(var5 != null) { + float var6 = (float)var5.animationsToGo - var4; + if(var6 > 0.0F) { + GL11.glPushMatrix(); + float var7 = 1.0F + var6 / 5.0F; + GL11.glTranslatef((float)(var2 + 8), (float)(var3 + 12), 0.0F); + GL11.glScalef(1.0F / var7, (var7 + 1.0F) / 2.0F, 1.0F); + GL11.glTranslatef((float)(-(var2 + 8)), (float)(-(var3 + 12)), 0.0F); + } + + itemRenderer.renderItemIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, var5, var2, var3); + if(var6 > 0.0F) { + GL11.glPopMatrix(); + } + + itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, var5, var2, var3); + } + } + + public void func_555_a() { + if(this.field_9419_j > 0) { + --this.field_9419_j; + } + + ++this.updateCounter; + + for(int var1 = 0; var1 < this.chatMessageList.size(); ++var1) { + ++((ChatLine)this.chatMessageList.get(var1)).updateCounter; + } + + } + + public void addChatMessage(String var1) { + while(this.mc.fontRenderer.getStringWidth(var1) > 320) { + int var2; + for(var2 = 1; var2 < var1.length() && this.mc.fontRenderer.getStringWidth(var1.substring(0, var2 + 1)) <= 320; ++var2) { + } + + this.addChatMessage(var1.substring(0, var2)); + var1 = var1.substring(var2); + } + + this.chatMessageList.add(0, new ChatLine(var1)); + + while(this.chatMessageList.size() > 50) { + this.chatMessageList.remove(this.chatMessageList.size() - 1); + } + + } + + public void func_553_b(String var1) { + this.field_9420_i = "Now playing: " + var1; + this.field_9419_j = 60; + } +} diff --git a/src/main/java/net/minecraft/src/GuiIngameMenu.java b/src/main/java/net/minecraft/src/GuiIngameMenu.java new file mode 100644 index 0000000..1295abd --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiIngameMenu.java @@ -0,0 +1,50 @@ +package net.minecraft.src; + +public class GuiIngameMenu extends GuiScreen { + private int updateCounter2 = 0; + private int updateCounter = 0; + + public void initGui() { + this.updateCounter2 = 0; + this.controlList.clear(); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 48, "Save and quit to title")); + this.controlList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 24, "Back to game")); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96, "Options...")); + } + + protected void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiOptions(this, this.mc.gameSettings)); + } + + if(var1.id == 1) { + this.mc.func_6261_a((World)null); + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + if(var1.id == 4) { + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.func_6259_e(); + } + + } + + public void updateScreen() { + super.updateScreen(); + ++this.updateCounter; + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + boolean var4 = !this.mc.theWorld.func_650_a(this.updateCounter2++); + if(var4 || this.updateCounter < 20) { + float var5 = ((float)(this.updateCounter % 10) + var3) / 10.0F; + var5 = MathHelper.sin(var5 * (float)Math.PI * 2.0F) * 0.2F + 0.8F; + int var6 = (int)(255.0F * var5); + this.drawString(this.fontRenderer, "Saving level..", 8, this.height - 16, var6 << 16 | var6 << 8 | var6); + } + + this.drawCenteredString(this.fontRenderer, "Game menu", this.width / 2, 40, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiInventory.java b/src/main/java/net/minecraft/src/GuiInventory.java new file mode 100644 index 0000000..ec5fa5c --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiInventory.java @@ -0,0 +1,85 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class GuiInventory extends GuiContainer { + private CraftingInventoryPlayerCB field_977_j; + private float xSize_lo; + private float ySize_lo; + + public GuiInventory(IInventory var1, ItemStack[] var2) { + this.field_948_f = true; + this.field_977_j = new CraftingInventoryPlayerCB(var2); + this.inventorySlots.add(new SlotCrafting(this, this.field_977_j.craftMatrix, this.field_977_j.craftResult, 0, 144, 36)); + + int var3; + int var4; + for(var3 = 0; var3 < 2; ++var3) { + for(var4 = 0; var4 < 2; ++var4) { + this.inventorySlots.add(new SlotInventory(this, this.field_977_j.craftMatrix, var4 + var3 * 2, 88 + var4 * 18, 26 + var3 * 18)); + } + } + + for(var3 = 0; var3 < 4; ++var3) { + this.inventorySlots.add(new SlotArmor(this, this, var1, var1.getSizeInventory() - 1 - var3, 8, 8 + var3 * 18, var3)); + } + + for(var3 = 0; var3 < 3; ++var3) { + for(var4 = 0; var4 < 9; ++var4) { + this.inventorySlots.add(new SlotInventory(this, var1, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18)); + } + } + + for(var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new SlotInventory(this, var1, var3, 8 + var3 * 18, 142)); + } + + } + + protected void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Crafting", 86, 16, 4210752); + } + + public void drawScreen(int var1, int var2, float var3) { + super.drawScreen(var1, var2, var3); + this.xSize_lo = (float)var1; + this.ySize_lo = (float)var2; + } + + protected void drawGuiContainerBackgroundLayer(float var1) { + int var2 = this.mc.renderEngine.getTexture("/gui/inventory.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(var2); + int var3 = (this.width - this.xSize) / 2; + int var4 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(var3 + 51), (float)(var4 + 75), 50.0F); + float var5 = 30.0F; + GL11.glScalef(-var5, var5, var5); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + float var6 = this.mc.thePlayer.field_735_n; + float var7 = this.mc.thePlayer.rotationYaw; + float var8 = this.mc.thePlayer.rotationPitch; + float var9 = (float)(var3 + 51) - this.xSize_lo; + float var10 = (float)(var4 + 75 - 50) - this.ySize_lo; + GL11.glRotatef(135.0F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-((float)Math.atan((double)(var10 / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F); + this.mc.thePlayer.field_735_n = (float)Math.atan((double)(var9 / 40.0F)) * 20.0F; + this.mc.thePlayer.rotationYaw = (float)Math.atan((double)(var9 / 40.0F)) * 40.0F; + this.mc.thePlayer.rotationPitch = -((float)Math.atan((double)(var10 / 40.0F))) * 20.0F; + GL11.glTranslatef(0.0F, this.mc.thePlayer.yOffset, 0.0F); + RenderManager.instance.func_853_a(this.mc.thePlayer, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F); + this.mc.thePlayer.field_735_n = var6; + this.mc.thePlayer.rotationYaw = var7; + this.mc.thePlayer.rotationPitch = var8; + GL11.glPopMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } +} diff --git a/src/main/java/net/minecraft/src/GuiMainMenu.java b/src/main/java/net/minecraft/src/GuiMainMenu.java new file mode 100644 index 0000000..502113a --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiMainMenu.java @@ -0,0 +1,220 @@ +package net.minecraft.src; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.Random; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +public class GuiMainMenu extends GuiScreen { + private static final Random rand = new Random(); + String[] minecraftLogo = new String[]{" * * * * * *** *** *** *** *** ***", " ** ** * ** * * * * * * * * * ", " * * * * * * * ** * ** *** ** * ", " * * * * ** * * * * * * * * ", " * * * * * *** *** * * * * * * "}; + private LogoEffectRandomizer[][] logoEffects; + private float updateCounter = 0.0F; + private String splashText = "missingno"; + + public GuiMainMenu() { + try { + ArrayList var1 = new ArrayList(); + BufferedReader var2 = new BufferedReader(new InputStreamReader(GuiMainMenu.class.getResourceAsStream("/title/splashes.txt"))); + String var3 = ""; + + while(true) { + var3 = var2.readLine(); + if(var3 == null) { + this.splashText = (String)var1.get(rand.nextInt(var1.size())); + break; + } + + var3 = var3.trim(); + if(var3.length() > 0) { + var1.add(var3); + } + } + } catch (Exception var4) { + } + + } + + public void updateScreen() { + ++this.updateCounter; + if(this.logoEffects != null) { + for(int var1 = 0; var1 < this.logoEffects.length; ++var1) { + for(int var2 = 0; var2 < this.logoEffects[var1].length; ++var2) { + this.logoEffects[var1][var2].func_875_a(); + } + } + } + + } + + protected void keyTyped(char var1, int var2) { + } + + public void initGui() { + Calendar var1 = Calendar.getInstance(); + var1.setTime(new Date()); + if(var1.get(2) + 1 == 11 && var1.get(5) == 9) { + this.splashText = "Happy birthday, ez!"; + } else if(var1.get(2) + 1 == 6 && var1.get(5) == 1) { + this.splashText = "Happy birthday, Notch!"; + } else if(var1.get(2) + 1 == 12 && var1.get(5) == 24) { + this.splashText = "Merry X-mas!"; + } else if(var1.get(2) + 1 == 1 && var1.get(5) == 1) { + this.splashText = "Happy new year!"; + } + + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 48, "Singleplayer")); + GuiButton button; + this.controlList.add(button = new GuiButton(2, this.width / 2 - 100, this.height / 4 + 72, "Multiplayer")); + button.enabled = false; + this.controlList.add(button = new GuiButton(3, this.width / 2 - 100, this.height / 4 + 96, "Mods and Texture Packs")); + button.enabled = false; + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Options...")); + if(this.mc.field_6320_i == null) { + ((GuiButton)this.controlList.get(1)).enabled = false; + } + + } + + protected void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiOptions(this, this.mc.gameSettings)); + } + + if(var1.id == 1) { + this.mc.displayGuiScreen(new GuiSelectWorld(this)); + } + + if(var1.id == 2) { + //this.mc.displayGuiScreen(new GuiMultiplayer(this)); + } + + if(var1.id == 3) { + //.mc.displayGuiScreen(new GuiTexturePacks(this)); + } + + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + Tessellator var4 = Tessellator.instance; + this.drawLogo(var3); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/logo.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var4.setColorOpaque_I(16777215); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(this.width / 2 + 90), 70.0F, 0.0F); + GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F); + float var5 = 1.8F - MathHelper.abs(MathHelper.sin((float)(System.currentTimeMillis() % 1000L) / 1000.0F * (float)Math.PI * 2.0F) * 0.1F); + var5 = var5 * 100.0F / (float)(this.fontRenderer.getStringWidth(this.splashText) + 32); + GL11.glScalef(var5, var5, var5); + this.drawCenteredString(this.fontRenderer, this.splashText, 0, -8, 16776960); + GL11.glPopMatrix(); + this.drawString(this.fontRenderer, "Minecraft Alpha v1.2.6", 2, 2, 5263440); + String var6 = "Copyright Mojang Specifications. Do not distribute."; + this.drawString(this.fontRenderer, var6, this.width - this.fontRenderer.getStringWidth(var6) - 2, this.height - 10, 16777215); + super.drawScreen(var1, var2, var3); + } + + private void drawLogo(float var1) { + int var3; + if(this.logoEffects == null) { + this.logoEffects = new LogoEffectRandomizer[this.minecraftLogo[0].length()][this.minecraftLogo.length]; + + for(int var2 = 0; var2 < this.logoEffects.length; ++var2) { + for(var3 = 0; var3 < this.logoEffects[var2].length; ++var3) { + this.logoEffects[var2][var3] = new LogoEffectRandomizer(this, var2, var3); + } + } + } + + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glPushMatrix(); + GL11.glLoadIdentity(); + ScaledResolution var14 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + var3 = 120 * var14.scaleFactor; + GLU.gluPerspective(70.0F, (float)this.mc.displayWidth / (float)var3, 0.05F, 100.0F); + GL11.glViewport(0, this.mc.displayHeight - var3, this.mc.displayWidth, var3); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glPushMatrix(); + GL11.glLoadIdentity(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glCullFace(GL11.GL_BACK); + GL11.glDepthMask(true); + RenderBlocks var4 = new RenderBlocks(); + + for(int var5 = 0; var5 < 3; ++var5) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.4F, 0.6F, -13.0F); + if(var5 == 0) { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glTranslatef(0.0F, -0.4F, 0.0F); + GL11.glScalef(0.98F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + if(var5 == 1) { + GL11.glDisable(GL11.GL_BLEND); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + } + + if(var5 == 2) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + } + + GL11.glScalef(1.0F, -1.0F, 1.0F); + GL11.glRotatef(15.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(0.89F, 1.0F, 0.4F); + GL11.glTranslatef((float)(-this.minecraftLogo[0].length()) * 0.5F, (float)(-this.minecraftLogo.length) * 0.5F, 0.0F); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + if(var5 == 0) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/title/black.png")); + } + + for(int var6 = 0; var6 < this.minecraftLogo.length; ++var6) { + for(int var7 = 0; var7 < this.minecraftLogo[var6].length(); ++var7) { + char var8 = this.minecraftLogo[var6].charAt(var7); + if(var8 != 32) { + GL11.glPushMatrix(); + LogoEffectRandomizer var9 = this.logoEffects[var7][var6]; + float var10 = (float)(var9.field_1311_b + (var9.field_1312_a - var9.field_1311_b) * (double)var1); + float var11 = 1.0F; + float var12 = 1.0F; + float var13 = 0.0F; + if(var5 == 0) { + var11 = var10 * 0.04F + 1.0F; + var12 = 1.0F / var11; + var10 = 0.0F; + } + + GL11.glTranslatef((float)var7, (float)var6, var10); + GL11.glScalef(var11, var11, var11); + GL11.glRotatef(var13, 0.0F, 1.0F, 0.0F); + var4.func_1238_a(Block.stone, var12); + GL11.glPopMatrix(); + } + } + } + + GL11.glPopMatrix(); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glPopMatrix(); + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + GL11.glEnable(GL11.GL_CULL_FACE); + } + + static Random getRand() { + return rand; + } +} diff --git a/src/main/java/net/minecraft/src/GuiOptions.java b/src/main/java/net/minecraft/src/GuiOptions.java new file mode 100644 index 0000000..790e818 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiOptions.java @@ -0,0 +1,52 @@ +package net.minecraft.src; + +public class GuiOptions extends GuiScreen { + private GuiScreen parentScreen; + protected String screenTitle = "Options"; + private GameSettings options; + + public GuiOptions(GuiScreen var1, GameSettings var2) { + this.parentScreen = var1; + this.options = var2; + } + + public void initGui() { + for(int var1 = 0; var1 < this.options.numberOfOptions; ++var1) { + int var2 = this.options.getOptionControlType(var1); + if(var2 == 0) { + this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.getOptionDisplayString(var1))); + } else { + this.controlList.add(new GuiSlider(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), var1, this.options.getOptionDisplayString(var1), this.options.getOptionFloatValue(var1))); + } + } + + this.controlList.add(new GuiButton(100, this.width / 2 - 100, this.height / 6 + 120 + 12, "Controls...")); + this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done")); + } + + protected void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id < 100) { + this.options.setOptionValue(var1.id, 1); + var1.displayString = this.options.getOptionDisplayString(var1.id); + } + + if(var1.id == 100) { + this.mc.gameSettings.saveOptions(); + this.mc.displayGuiScreen(new GuiControls(this, this.options)); + } + + if(var1.id == 200) { + this.mc.gameSettings.saveOptions(); + this.mc.displayGuiScreen(this.parentScreen); + } + + } + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiScreen.java b/src/main/java/net/minecraft/src/GuiScreen.java new file mode 100644 index 0000000..87d0719 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiScreen.java @@ -0,0 +1,161 @@ +package net.minecraft.src; + +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +public class GuiScreen extends Gui { + protected Minecraft mc; + public int width; + public int height; + protected List controlList = new ArrayList(); + public boolean field_948_f = false; + protected FontRenderer fontRenderer; + private GuiButton selectedButton = null; + + public void drawScreen(int var1, int var2, float var3) { + for(int var4 = 0; var4 < this.controlList.size(); ++var4) { + GuiButton var5 = (GuiButton)this.controlList.get(var4); + var5.drawButton(this.mc, var1, var2); + } + + } + + protected void keyTyped(char var1, int var2) { + if(var2 == 1) { + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.func_6259_e(); + } + + } + + public static String getClipboardString() { + try { + Transferable var0 = Toolkit.getDefaultToolkit().getSystemClipboard().getContents((Object)null); + if(var0 != null && var0.isDataFlavorSupported(DataFlavor.stringFlavor)) { + String var1 = (String)var0.getTransferData(DataFlavor.stringFlavor); + return var1; + } + } catch (Exception var2) { + } + + return null; + } + + protected void mouseClicked(int var1, int var2, int var3) { + if(var3 == 0) { + for(int var4 = 0; var4 < this.controlList.size(); ++var4) { + GuiButton var5 = (GuiButton)this.controlList.get(var4); + if(var5.mousePressed(this.mc, var1, var2)) { + this.selectedButton = var5; + this.actionPerformed(var5); + } + } + } + + } + + protected void mouseMovedOrUp(int var1, int var2, int var3) { + if(this.selectedButton != null && var3 == 0) { + this.selectedButton.mouseReleased(var1, var2); + this.selectedButton = null; + } + + } + + protected void actionPerformed(GuiButton var1) { + } + + public void setWorldAndResolution(Minecraft var1, int var2, int var3) { + this.mc = var1; + this.fontRenderer = var1.fontRenderer; + this.width = var2; + this.height = var3; + this.controlList.clear(); + this.initGui(); + } + + public void initGui() { + } + + public void handleInput() { + while(Mouse.next()) { + this.handleMouseInput(); + } + + while(Keyboard.next()) { + this.handleKeyboardInput(); + } + + } + + public void handleMouseInput() { + int var1; + int var2; + if(Mouse.getEventButtonState()) { + var1 = Mouse.getEventX() * this.width / this.mc.displayWidth; + var2 = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; + this.mouseClicked(var1, var2, Mouse.getEventButton()); + } else { + var1 = Mouse.getEventX() * this.width / this.mc.displayWidth; + var2 = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; + this.mouseMovedOrUp(var1, var2, Mouse.getEventButton()); + } + + } + + public void handleKeyboardInput() { + if(Keyboard.getEventKeyState()) { + this.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + } + + } + + public void updateScreen() { + } + + public void onGuiClosed() { + } + + public void drawDefaultBackground() { + this.func_567_a(0); + } + + public void func_567_a(int var1) { + if(this.mc.theWorld != null) { + this.drawGradientRect(0, 0, this.width, this.height, -1072689136, -804253680); + } else { + this.drawBackground(var1); + } + + } + + public void drawBackground(int var1) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_FOG); + Tessellator var2 = Tessellator.instance; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/background.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + float var3 = 32.0F; + var2.startDrawingQuads(); + var2.setColorOpaque_I(4210752); + var2.addVertexWithUV(0.0D, (double)this.height, 0.0D, 0.0D, (double)((float)this.height / var3 + (float)var1)); + var2.addVertexWithUV((double)this.width, (double)this.height, 0.0D, (double)((float)this.width / var3), (double)((float)this.height / var3 + (float)var1)); + var2.addVertexWithUV((double)this.width, 0.0D, 0.0D, (double)((float)this.width / var3), (double)(0 + var1)); + var2.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, (double)(0 + var1)); + var2.draw(); + } + + public boolean doesGuiPauseGame() { + return true; + } + + public void deleteWorld(boolean var1, int var2) { + } +} diff --git a/src/main/java/net/minecraft/src/GuiSelectWorld.java b/src/main/java/net/minecraft/src/GuiSelectWorld.java new file mode 100644 index 0000000..0a6eb68 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiSelectWorld.java @@ -0,0 +1,71 @@ +package net.minecraft.src; + +import java.io.File; +import net.minecraft.client.Minecraft; + +public class GuiSelectWorld extends GuiScreen { + protected GuiScreen parentScreen; + protected String screenTitle = "Select world"; + private boolean selected = false; + + public GuiSelectWorld(GuiScreen var1) { + this.parentScreen = var1; + } + + public void initGui() { + File var1 = Minecraft.getMinecraftDir(); + + for(int var2 = 0; var2 < 5; ++var2) { + NBTTagCompound var3 = World.func_629_a(var1, "World" + (var2 + 1)); + if(var3 == null) { + this.controlList.add(new GuiButton(var2, this.width / 2 - 100, this.height / 6 + 24 * var2, "- empty -")); + } else { + String var4 = "World " + (var2 + 1); + long var5 = var3.getLong("SizeOnDisk"); + var4 = var4 + " (" + (float)(var5 / 1024L * 100L / 1024L) / 100.0F + " MB)"; + this.controlList.add(new GuiButton(var2, this.width / 2 - 100, this.height / 6 + 24 * var2, var4)); + } + } + + this.initGui2(); + } + + protected String getWorldName(int var1) { + File var2 = Minecraft.getMinecraftDir(); + return World.func_629_a(var2, "World" + var1) != null ? "World" + var1 : null; + } + + public void initGui2() { + this.controlList.add(new GuiButton(5, this.width / 2 - 100, this.height / 6 + 120 + 12, "Delete world...")); + this.controlList.add(new GuiButton(6, this.width / 2 - 100, this.height / 6 + 168, "Cancel")); + } + + protected void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id < 5) { + this.selectWorld(var1.id + 1); + } else if(var1.id == 5) { + this.mc.displayGuiScreen(new GuiDeleteWorld(this)); + } else if(var1.id == 6) { + this.mc.displayGuiScreen(this.parentScreen); + } + + } + } + + public void selectWorld(int var1) { + this.mc.displayGuiScreen((GuiScreen)null); + if(!this.selected) { + this.selected = true; + this.mc.field_6327_b = new PlayerControllerSP(this.mc); + this.mc.func_6247_b("World" + var1); + this.mc.displayGuiScreen((GuiScreen)null); + } + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiSlider.java b/src/main/java/net/minecraft/src/GuiSlider.java new file mode 100644 index 0000000..494e584 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiSlider.java @@ -0,0 +1,66 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; + +public class GuiSlider extends GuiButton { + public float sliderValue = 1.0F; + public boolean dragging = false; + private int idFloat = 0; + + public GuiSlider(int var1, int var2, int var3, int var4, String var5, float var6) { + super(var1, var2, var3, 150, 20, var5); + this.idFloat = var4; + this.sliderValue = var6; + } + + protected int getHoverState(boolean var1) { + return 0; + } + + protected void mouseDragged(Minecraft var1, int var2, int var3) { + if(this.enabled2) { + if(this.dragging) { + this.sliderValue = (float)(var2 - (this.xPosition + 4)) / (float)(this.width - 8); + if(this.sliderValue < 0.0F) { + this.sliderValue = 0.0F; + } + + if(this.sliderValue > 1.0F) { + this.sliderValue = 1.0F; + } + + var1.gameSettings.setOptionFloatValue(this.idFloat, this.sliderValue); + this.displayString = var1.gameSettings.getOptionDisplayString(this.idFloat); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)), this.yPosition, 0, 66, 4, 20); + this.drawTexturedModalRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)) + 4, this.yPosition, 196, 66, 4, 20); + } + } + + public boolean mousePressed(Minecraft var1, int var2, int var3) { + if(super.mousePressed(var1, var2, var3)) { + this.sliderValue = (float)(var2 - (this.xPosition + 4)) / (float)(this.width - 8); + if(this.sliderValue < 0.0F) { + this.sliderValue = 0.0F; + } + + if(this.sliderValue > 1.0F) { + this.sliderValue = 1.0F; + } + + var1.gameSettings.setOptionFloatValue(this.idFloat, this.sliderValue); + this.displayString = var1.gameSettings.getOptionDisplayString(this.idFloat); + this.dragging = true; + return true; + } else { + return false; + } + } + + public void mouseReleased(int var1, int var2) { + this.dragging = false; + } +} diff --git a/src/main/java/net/minecraft/src/GuiSmallButton.java b/src/main/java/net/minecraft/src/GuiSmallButton.java new file mode 100644 index 0000000..e64c277 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiSmallButton.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public class GuiSmallButton extends GuiButton { + public GuiSmallButton(int var1, int var2, int var3, String var4) { + super(var1, var2, var3, 150, 20, var4); + } +} diff --git a/src/main/java/net/minecraft/src/GuiUnused.java b/src/main/java/net/minecraft/src/GuiUnused.java new file mode 100644 index 0000000..922f513 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiUnused.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +public class GuiUnused extends GuiScreen { + private String message1; + private String message2; + + public void initGui() { + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawGradientRect(0, 0, this.width, this.height, -12574688, -11530224); + this.drawCenteredString(this.fontRenderer, this.message1, this.width / 2, 90, 16777215); + this.drawCenteredString(this.fontRenderer, this.message2, this.width / 2, 110, 16777215); + super.drawScreen(var1, var2, var3); + } + + protected void keyTyped(char var1, int var2) { + } +} diff --git a/src/main/java/net/minecraft/src/GuiYesNo.java b/src/main/java/net/minecraft/src/GuiYesNo.java new file mode 100644 index 0000000..3c22273 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiYesNo.java @@ -0,0 +1,31 @@ +package net.minecraft.src; + +public class GuiYesNo extends GuiScreen { + private GuiScreen parentScreen; + private String message1; + private String message2; + private int worldNumber; + + public GuiYesNo(GuiScreen var1, String var2, String var3, int var4) { + this.parentScreen = var1; + this.message1 = var2; + this.message2 = var3; + this.worldNumber = var4; + } + + public void initGui() { + this.controlList.add(new GuiSmallButton(0, this.width / 2 - 155 + 0, this.height / 6 + 96, "Yes")); + this.controlList.add(new GuiSmallButton(1, this.width / 2 - 155 + 160, this.height / 6 + 96, "No")); + } + + protected void actionPerformed(GuiButton var1) { + this.parentScreen.deleteWorld(var1.id == 0, this.worldNumber); + } + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, this.message1, this.width / 2, 70, 16777215); + this.drawCenteredString(this.fontRenderer, this.message2, this.width / 2, 90, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/HashEntry.java b/src/main/java/net/minecraft/src/HashEntry.java new file mode 100644 index 0000000..b7c9e6e --- /dev/null +++ b/src/main/java/net/minecraft/src/HashEntry.java @@ -0,0 +1,50 @@ +package net.minecraft.src; + +class HashEntry { + final int hashEntry; + Object valueEntry; + HashEntry nextEntry; + final int slotHash; + + HashEntry(int var1, int var2, Object var3, HashEntry var4) { + this.valueEntry = var3; + this.nextEntry = var4; + this.hashEntry = var2; + this.slotHash = var1; + } + + public final int getHash() { + return this.hashEntry; + } + + public final Object getValue() { + return this.valueEntry; + } + + public final boolean equals(Object var1) { + if(!(var1 instanceof HashEntry)) { + return false; + } else { + HashEntry var2 = (HashEntry)var1; + Integer var3 = Integer.valueOf(this.getHash()); + Integer var4 = Integer.valueOf(var2.getHash()); + if(var3 == var4 || var3 != null && var3.equals(var4)) { + Object var5 = this.getValue(); + Object var6 = var2.getValue(); + if(var5 == var6 || var5 != null && var5.equals(var6)) { + return true; + } + } + + return false; + } + } + + public final int hashCode() { + return MCHashTable.getHash(this.hashEntry); + } + + public final String toString() { + return this.getHash() + "=" + this.getValue(); + } +} diff --git a/src/main/java/net/minecraft/src/IBlockAccess.java b/src/main/java/net/minecraft/src/IBlockAccess.java new file mode 100644 index 0000000..12901ae --- /dev/null +++ b/src/main/java/net/minecraft/src/IBlockAccess.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public interface IBlockAccess { + int getBlockId(int var1, int var2, int var3); + + TileEntity getBlockTileEntity(int var1, int var2, int var3); + + float getLightBrightness(int var1, int var2, int var3); + + int getBlockMetadata(int var1, int var2, int var3); + + Material getBlockMaterial(int var1, int var2, int var3); + + boolean isBlockOpaqueCube(int var1, int var2, int var3); + + WorldChunkManager func_4075_a(); +} diff --git a/src/main/java/net/minecraft/src/ICamera.java b/src/main/java/net/minecraft/src/ICamera.java new file mode 100644 index 0000000..8ad4aa6 --- /dev/null +++ b/src/main/java/net/minecraft/src/ICamera.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public interface ICamera { + boolean func_342_a(AxisAlignedBB var1); + + void func_343_a(double var1, double var3, double var5); +} diff --git a/src/main/java/net/minecraft/src/IChunkLoader.java b/src/main/java/net/minecraft/src/IChunkLoader.java new file mode 100644 index 0000000..68ffd66 --- /dev/null +++ b/src/main/java/net/minecraft/src/IChunkLoader.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +import java.io.IOException; + +public interface IChunkLoader { + Chunk loadChunk(World var1, int var2, int var3) throws IOException; + + void saveChunk(World var1, Chunk var2) throws IOException; + + void saveExtraChunkData(World var1, Chunk var2) throws IOException; + + void func_814_a(); + + void saveExtraData(); +} diff --git a/src/main/java/net/minecraft/src/IChunkProvider.java b/src/main/java/net/minecraft/src/IChunkProvider.java new file mode 100644 index 0000000..cb78309 --- /dev/null +++ b/src/main/java/net/minecraft/src/IChunkProvider.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public interface IChunkProvider { + boolean chunkExists(int var1, int var2); + + Chunk provideChunk(int var1, int var2); + + void populate(IChunkProvider var1, int var2, int var3); + + boolean saveChunks(boolean var1, IProgressUpdate var2); + + boolean func_532_a(); + + boolean func_536_b(); +} diff --git a/src/main/java/net/minecraft/src/IInventory.java b/src/main/java/net/minecraft/src/IInventory.java new file mode 100644 index 0000000..b4564c7 --- /dev/null +++ b/src/main/java/net/minecraft/src/IInventory.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public interface IInventory { + int getSizeInventory(); + + ItemStack getStackInSlot(int var1); + + ItemStack decrStackSize(int var1, int var2); + + void setInventorySlotContents(int var1, ItemStack var2); + + String getInvName(); + + int getInventoryStackLimit(); + + void onInventoryChanged(); +} diff --git a/src/main/java/net/minecraft/src/IMobs.java b/src/main/java/net/minecraft/src/IMobs.java new file mode 100644 index 0000000..73e52bb --- /dev/null +++ b/src/main/java/net/minecraft/src/IMobs.java @@ -0,0 +1,4 @@ +package net.minecraft.src; + +public interface IMobs { +} diff --git a/src/main/java/net/minecraft/src/IProgressUpdate.java b/src/main/java/net/minecraft/src/IProgressUpdate.java new file mode 100644 index 0000000..86d30ba --- /dev/null +++ b/src/main/java/net/minecraft/src/IProgressUpdate.java @@ -0,0 +1,9 @@ +package net.minecraft.src; + +public interface IProgressUpdate { + void func_594_b(String var1); + + void displayLoadingString(String var1); + + void setLoadingProgress(int var1); +} diff --git a/src/main/java/net/minecraft/src/IWorldAccess.java b/src/main/java/net/minecraft/src/IWorldAccess.java new file mode 100644 index 0000000..1132fcd --- /dev/null +++ b/src/main/java/net/minecraft/src/IWorldAccess.java @@ -0,0 +1,21 @@ +package net.minecraft.src; + +public interface IWorldAccess { + void func_934_a(int var1, int var2, int var3); + + void func_937_b(int var1, int var2, int var3, int var4, int var5, int var6); + + void playSound(String var1, double var2, double var4, double var6, float var8, float var9); + + void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12); + + void obtainEntitySkin(Entity var1); + + void releaseEntitySkin(Entity var1); + + void func_936_e(); + + void playRecord(String var1, int var2, int var3, int var4); + + void func_935_a(int var1, int var2, int var3, TileEntity var4); +} diff --git a/src/main/java/net/minecraft/src/InventoryCraftResult.java b/src/main/java/net/minecraft/src/InventoryCraftResult.java new file mode 100644 index 0000000..de21b2a --- /dev/null +++ b/src/main/java/net/minecraft/src/InventoryCraftResult.java @@ -0,0 +1,38 @@ +package net.minecraft.src; + +public class InventoryCraftResult implements IInventory { + private ItemStack[] stackResult = new ItemStack[1]; + + public int getSizeInventory() { + return 1; + } + + public ItemStack getStackInSlot(int var1) { + return this.stackResult[var1]; + } + + public String getInvName() { + return "Result"; + } + + public ItemStack decrStackSize(int var1, int var2) { + if(this.stackResult[var1] != null) { + ItemStack var3 = this.stackResult[var1]; + this.stackResult[var1] = null; + return var3; + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + this.stackResult[var1] = var2; + } + + public int getInventoryStackLimit() { + return 64; + } + + public void onInventoryChanged() { + } +} diff --git a/src/main/java/net/minecraft/src/InventoryCrafting.java b/src/main/java/net/minecraft/src/InventoryCrafting.java new file mode 100644 index 0000000..51fe9f2 --- /dev/null +++ b/src/main/java/net/minecraft/src/InventoryCrafting.java @@ -0,0 +1,65 @@ +package net.minecraft.src; + +public class InventoryCrafting implements IInventory { + private ItemStack[] stackList; + private int nbrSlots; + private CraftingInventoryCB eventHandler; + + public InventoryCrafting(CraftingInventoryCB var1, int var2, int var3) { + this.nbrSlots = var2 * var3; + this.stackList = new ItemStack[this.nbrSlots]; + this.eventHandler = var1; + } + + public InventoryCrafting(CraftingInventoryCB var1, ItemStack[] var2) { + this.nbrSlots = var2.length; + this.stackList = var2; + this.eventHandler = var1; + } + + public int getSizeInventory() { + return this.nbrSlots; + } + + public ItemStack getStackInSlot(int var1) { + return this.stackList[var1]; + } + + public String getInvName() { + return "Crafting"; + } + + public ItemStack decrStackSize(int var1, int var2) { + if(this.stackList[var1] != null) { + ItemStack var3; + if(this.stackList[var1].stackSize <= var2) { + var3 = this.stackList[var1]; + this.stackList[var1] = null; + this.eventHandler.onCraftMatrixChanged(this); + return var3; + } else { + var3 = this.stackList[var1].splitStack(var2); + if(this.stackList[var1].stackSize == 0) { + this.stackList[var1] = null; + } + + this.eventHandler.onCraftMatrixChanged(this); + return var3; + } + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + this.stackList[var1] = var2; + this.eventHandler.onCraftMatrixChanged(this); + } + + public int getInventoryStackLimit() { + return 64; + } + + public void onInventoryChanged() { + } +} diff --git a/src/main/java/net/minecraft/src/InventoryLargeChest.java b/src/main/java/net/minecraft/src/InventoryLargeChest.java new file mode 100644 index 0000000..daced98 --- /dev/null +++ b/src/main/java/net/minecraft/src/InventoryLargeChest.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +public class InventoryLargeChest implements IInventory { + private String name; + private IInventory upperChest; + private IInventory lowerChest; + + public InventoryLargeChest(String var1, IInventory var2, IInventory var3) { + this.name = var1; + this.upperChest = var2; + this.lowerChest = var3; + } + + public int getSizeInventory() { + return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory(); + } + + public String getInvName() { + return this.name; + } + + public ItemStack getStackInSlot(int var1) { + return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(var1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(var1); + } + + public ItemStack decrStackSize(int var1, int var2) { + return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(var1 - this.upperChest.getSizeInventory(), var2) : this.upperChest.decrStackSize(var1, var2); + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + if(var1 >= this.upperChest.getSizeInventory()) { + this.lowerChest.setInventorySlotContents(var1 - this.upperChest.getSizeInventory(), var2); + } else { + this.upperChest.setInventorySlotContents(var1, var2); + } + + } + + public int getInventoryStackLimit() { + return this.upperChest.getInventoryStackLimit(); + } + + public void onInventoryChanged() { + this.upperChest.onInventoryChanged(); + this.lowerChest.onInventoryChanged(); + } +} diff --git a/src/main/java/net/minecraft/src/InventoryPlayer.java b/src/main/java/net/minecraft/src/InventoryPlayer.java new file mode 100644 index 0000000..ea8654f --- /dev/null +++ b/src/main/java/net/minecraft/src/InventoryPlayer.java @@ -0,0 +1,403 @@ +package net.minecraft.src; + +public class InventoryPlayer implements IInventory { + public ItemStack[] mainInventory = new ItemStack[37]; + public ItemStack[] armorInventory = new ItemStack[4]; + public ItemStack[] craftingInventory = new ItemStack[4]; + public int currentItem = 0; + private EntityPlayer player; + public ItemStack draggingItemStack; + public boolean field_845_f = false; + + public InventoryPlayer(EntityPlayer var1) { + this.player = var1; + } + + public ItemStack getCurrentItem() { + return this.mainInventory[this.currentItem]; + } + + private int getInventorySlotContainItem(int var1) { + for(int var2 = 0; var2 < this.mainInventory.length; ++var2) { + if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1) { + return var2; + } + } + + return -1; + } + + private int getFirstPartialMatchingStack(int var1) { + for(int var2 = 0; var2 < this.mainInventory.length; ++var2) { + if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1 && this.mainInventory[var2].stackSize < this.mainInventory[var2].getMaxStackSize() && this.mainInventory[var2].stackSize < this.getInventoryStackLimit()) { + return var2; + } + } + + return -1; + } + + private int getFirstEmptyStack() { + for(int var1 = 0; var1 < this.mainInventory.length; ++var1) { + if(this.mainInventory[var1] == null) { + return var1; + } + } + + return -1; + } + + public void setCurrentItem(int var1, boolean var2) { + int var3 = this.getInventorySlotContainItem(var1); + if(var3 >= 0 && var3 < 9) { + this.currentItem = var3; + } + } + + public void changeCurrentItem(int var1) { + if(var1 > 0) { + var1 = 1; + } + + if(var1 < 0) { + var1 = -1; + } + + for(this.currentItem -= var1; this.currentItem < 0; this.currentItem += 9) { + } + + while(this.currentItem >= 9) { + this.currentItem -= 9; + } + + } + + private int addItemsToInventory(int var1, int var2) { + int var3 = this.getFirstPartialMatchingStack(var1); + if(var3 < 0) { + var3 = this.getFirstEmptyStack(); + } + + if(var3 < 0) { + return var2; + } else { + if(this.mainInventory[var3] == null) { + this.mainInventory[var3] = new ItemStack(var1, 0); + } + + int var4 = var2; + if(var2 > this.mainInventory[var3].getMaxStackSize() - this.mainInventory[var3].stackSize) { + var4 = this.mainInventory[var3].getMaxStackSize() - this.mainInventory[var3].stackSize; + } + + if(var4 > this.getInventoryStackLimit() - this.mainInventory[var3].stackSize) { + var4 = this.getInventoryStackLimit() - this.mainInventory[var3].stackSize; + } + + if(var4 == 0) { + return var2; + } else { + var2 -= var4; + this.mainInventory[var3].stackSize += var4; + this.mainInventory[var3].animationsToGo = 5; + return var2; + } + } + } + + public void decrementAnimations() { + for(int var1 = 0; var1 < this.mainInventory.length; ++var1) { + if(this.mainInventory[var1] != null && this.mainInventory[var1].animationsToGo > 0) { + --this.mainInventory[var1].animationsToGo; + } + } + + } + + public boolean consumeInventoryItem(int var1) { + int var2 = this.getInventorySlotContainItem(var1); + if(var2 < 0) { + return false; + } else { + if(--this.mainInventory[var2].stackSize <= 0) { + this.mainInventory[var2] = null; + } + + return true; + } + } + + public boolean addItemStackToInventory(ItemStack var1) { + if(var1.itemDamage == 0) { + var1.stackSize = this.addItemsToInventory(var1.itemID, var1.stackSize); + if(var1.stackSize == 0) { + return true; + } + } + + int var2 = this.getFirstEmptyStack(); + if(var2 >= 0) { + this.mainInventory[var2] = var1; + this.mainInventory[var2].animationsToGo = 5; + return true; + } else { + return false; + } + } + + public ItemStack decrStackSize(int var1, int var2) { + ItemStack[] var3 = this.mainInventory; + if(var1 >= this.mainInventory.length) { + var3 = this.armorInventory; + var1 -= this.mainInventory.length; + } + + if(var3[var1] != null) { + ItemStack var4; + if(var3[var1].stackSize <= var2) { + var4 = var3[var1]; + var3[var1] = null; + return var4; + } else { + var4 = var3[var1].splitStack(var2); + if(var3[var1].stackSize == 0) { + var3[var1] = null; + } + + return var4; + } + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + ItemStack[] var3 = this.mainInventory; + if(var1 >= var3.length) { + var1 -= var3.length; + var3 = this.armorInventory; + } + + if(var1 >= var3.length) { + var1 -= var3.length; + var3 = this.craftingInventory; + } + + var3[var1] = var2; + } + + public float getStrVsBlock(Block var1) { + float var2 = 1.0F; + if(this.mainInventory[this.currentItem] != null) { + var2 *= this.mainInventory[this.currentItem].getStrVsBlock(var1); + } + + return var2; + } + + public NBTTagList writeToNBT(NBTTagList var1) { + int var2; + NBTTagCompound var3; + for(var2 = 0; var2 < this.mainInventory.length; ++var2) { + if(this.mainInventory[var2] != null) { + var3 = new NBTTagCompound(); + var3.setByte("Slot", (byte)var2); + this.mainInventory[var2].writeToNBT(var3); + var1.setTag(var3); + } + } + + for(var2 = 0; var2 < this.armorInventory.length; ++var2) { + if(this.armorInventory[var2] != null) { + var3 = new NBTTagCompound(); + var3.setByte("Slot", (byte)(var2 + 100)); + this.armorInventory[var2].writeToNBT(var3); + var1.setTag(var3); + } + } + + for(var2 = 0; var2 < this.craftingInventory.length; ++var2) { + if(this.craftingInventory[var2] != null) { + var3 = new NBTTagCompound(); + var3.setByte("Slot", (byte)(var2 + 80)); + this.craftingInventory[var2].writeToNBT(var3); + var1.setTag(var3); + } + } + + return var1; + } + + public void readFromNBT(NBTTagList var1) { + this.mainInventory = new ItemStack[36]; + this.armorInventory = new ItemStack[4]; + this.craftingInventory = new ItemStack[4]; + + for(int var2 = 0; var2 < var1.tagCount(); ++var2) { + NBTTagCompound var3 = (NBTTagCompound)var1.tagAt(var2); + int var4 = var3.getByte("Slot") & 255; + if(var4 >= 0 && var4 < this.mainInventory.length) { + this.mainInventory[var4] = new ItemStack(var3); + } + + if(var4 >= 80 && var4 < this.craftingInventory.length + 80) { + this.craftingInventory[var4 - 80] = new ItemStack(var3); + } + + if(var4 >= 100 && var4 < this.armorInventory.length + 100) { + this.armorInventory[var4 - 100] = new ItemStack(var3); + } + } + + } + + public int getSizeInventory() { + return this.mainInventory.length + 4; + } + + public ItemStack getStackInSlot(int var1) { + ItemStack[] var2 = this.mainInventory; + if(var1 >= var2.length) { + var1 -= var2.length; + var2 = this.armorInventory; + } + + if(var1 >= var2.length) { + var1 -= var2.length; + var2 = this.craftingInventory; + } + + return var2[var1]; + } + + public String getInvName() { + return "Inventory"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public int getDamageVsEntity(Entity var1) { + ItemStack var2 = this.getStackInSlot(this.currentItem); + return var2 != null ? var2.getDamageVsEntity(var1) : 1; + } + + public boolean canHarvestBlock(Block var1) { + if(var1.blockMaterial != Material.rock && var1.blockMaterial != Material.iron && var1.blockMaterial != Material.builtSnow && var1.blockMaterial != Material.snow) { + return true; + } else { + ItemStack var2 = this.getStackInSlot(this.currentItem); + return var2 != null ? var2.canHarvestBlock(var1) : false; + } + } + + public ItemStack armorItemInSlot(int var1) { + return this.armorInventory[var1]; + } + + public int getTotalArmorValue() { + int var1 = 0; + int var2 = 0; + int var3 = 0; + + for(int var4 = 0; var4 < this.armorInventory.length; ++var4) { + if(this.armorInventory[var4] != null && this.armorInventory[var4].getItem() instanceof ItemArmor) { + int var5 = this.armorInventory[var4].getMaxDamage(); + int var6 = this.armorInventory[var4].itemDamage; + int var7 = var5 - var6; + var2 += var7; + var3 += var5; + int var8 = ((ItemArmor)this.armorInventory[var4].getItem()).damageReduceAmmount; + var1 += var8; + } + } + + if(var3 == 0) { + return 0; + } else { + return (var1 - 1) * var2 / var3 + 1; + } + } + + public void damageArmor(int var1) { + for(int var2 = 0; var2 < this.armorInventory.length; ++var2) { + if(this.armorInventory[var2] != null && this.armorInventory[var2].getItem() instanceof ItemArmor) { + this.armorInventory[var2].damageItem(var1); + if(this.armorInventory[var2].stackSize == 0) { + this.armorInventory[var2].func_1097_a(this.player); + this.armorInventory[var2] = null; + } + } + } + + } + + public void dropAllItems() { + int var1; + for(var1 = 0; var1 < this.mainInventory.length; ++var1) { + if(this.mainInventory[var1] != null) { + this.player.dropPlayerItemWithRandomChoice(this.mainInventory[var1], true); + this.mainInventory[var1] = null; + } + } + + for(var1 = 0; var1 < this.armorInventory.length; ++var1) { + if(this.armorInventory[var1] != null) { + this.player.dropPlayerItemWithRandomChoice(this.armorInventory[var1], true); + this.armorInventory[var1] = null; + } + } + + } + + public void onInventoryChanged() { + this.field_845_f = true; + } + + public boolean compareInventory(InventoryPlayer var1) { + int var2; + for(var2 = 0; var2 < this.mainInventory.length; ++var2) { + if(!this.compareItemStack(var1.mainInventory[var2], this.mainInventory[var2])) { + return false; + } + } + + for(var2 = 0; var2 < this.armorInventory.length; ++var2) { + if(!this.compareItemStack(var1.armorInventory[var2], this.armorInventory[var2])) { + return false; + } + } + + for(var2 = 0; var2 < this.craftingInventory.length; ++var2) { + if(!this.compareItemStack(var1.craftingInventory[var2], this.craftingInventory[var2])) { + return false; + } + } + + return true; + } + + private boolean compareItemStack(ItemStack var1, ItemStack var2) { + return var1 == null && var2 == null ? true : (var1 != null && var2 != null ? var1.itemID == var2.itemID && var1.stackSize == var2.stackSize && var1.itemDamage == var2.itemDamage : false); + } + + public InventoryPlayer copyInventory() { + InventoryPlayer var1 = new InventoryPlayer((EntityPlayer)null); + + int var2; + for(var2 = 0; var2 < this.mainInventory.length; ++var2) { + var1.mainInventory[var2] = this.mainInventory[var2] != null ? this.mainInventory[var2].copy() : null; + } + + for(var2 = 0; var2 < this.armorInventory.length; ++var2) { + var1.armorInventory[var2] = this.armorInventory[var2] != null ? this.armorInventory[var2].copy() : null; + } + + for(var2 = 0; var2 < this.craftingInventory.length; ++var2) { + var1.craftingInventory[var2] = this.craftingInventory[var2] != null ? this.craftingInventory[var2].copy() : null; + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/Item.java b/src/main/java/net/minecraft/src/Item.java new file mode 100644 index 0000000..47da16c --- /dev/null +++ b/src/main/java/net/minecraft/src/Item.java @@ -0,0 +1,178 @@ +package net.minecraft.src; + +import java.util.Random; + +public class Item { + protected static Random itemRand = new Random(); + public static Item[] itemsList = new Item[32000]; + public static Item shovelSteel = (new ItemSpade(0, 2)).setIconIndex(82); + public static Item pickaxeSteel = (new ItemPickaxe(1, 2)).setIconIndex(98); + public static Item axeSteel = (new ItemAxe(2, 2)).setIconIndex(114); + public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconIndex(5); + public static Item appleRed = (new ItemFood(4, 4)).setIconIndex(10); + public static Item bow = (new ItemBow(5)).setIconIndex(21); + public static Item arrow = (new Item(6)).setIconIndex(37); + public static Item coal = (new Item(7)).setIconIndex(7); + public static Item diamond = (new Item(8)).setIconIndex(55); + public static Item ingotIron = (new Item(9)).setIconIndex(23); + public static Item ingotGold = (new Item(10)).setIconIndex(39); + public static Item swordSteel = (new ItemSword(11, 2)).setIconIndex(66); + public static Item swordWood = (new ItemSword(12, 0)).setIconIndex(64); + public static Item shovelWood = (new ItemSpade(13, 0)).setIconIndex(80); + public static Item pickaxeWood = (new ItemPickaxe(14, 0)).setIconIndex(96); + public static Item axeWood = (new ItemAxe(15, 0)).setIconIndex(112); + public static Item swordStone = (new ItemSword(16, 1)).setIconIndex(65); + public static Item shovelStone = (new ItemSpade(17, 1)).setIconIndex(81); + public static Item pickaxeStone = (new ItemPickaxe(18, 1)).setIconIndex(97); + public static Item axeStone = (new ItemAxe(19, 1)).setIconIndex(113); + public static Item swordDiamond = (new ItemSword(20, 3)).setIconIndex(67); + public static Item shovelDiamond = (new ItemSpade(21, 3)).setIconIndex(83); + public static Item pickaxeDiamond = (new ItemPickaxe(22, 3)).setIconIndex(99); + public static Item axeDiamond = (new ItemAxe(23, 3)).setIconIndex(115); + public static Item stick = (new Item(24)).setIconIndex(53).setFull3D(); + public static Item bowlEmpty = (new Item(25)).setIconIndex(71); + public static Item bowlSoup = (new ItemSoup(26, 10)).setIconIndex(72); + public static Item swordGold = (new ItemSword(27, 0)).setIconIndex(68); + public static Item shovelGold = (new ItemSpade(28, 0)).setIconIndex(84); + public static Item pickaxeGold = (new ItemPickaxe(29, 0)).setIconIndex(100); + public static Item axeGold = (new ItemAxe(30, 0)).setIconIndex(116); + public static Item silk = (new Item(31)).setIconIndex(8); + public static Item feather = (new Item(32)).setIconIndex(24); + public static Item gunpowder = (new Item(33)).setIconIndex(40); + public static Item hoeWood = (new ItemHoe(34, 0)).setIconIndex(128); + public static Item hoeStone = (new ItemHoe(35, 1)).setIconIndex(129); + public static Item hoeSteel = (new ItemHoe(36, 2)).setIconIndex(130); + public static Item hoeDiamond = (new ItemHoe(37, 3)).setIconIndex(131); + public static Item hoeGold = (new ItemHoe(38, 1)).setIconIndex(132); + public static Item seeds = (new ItemSeeds(39, Block.crops.blockID)).setIconIndex(9); + public static Item wheat = (new Item(40)).setIconIndex(25); + public static Item bread = (new ItemFood(41, 5)).setIconIndex(41); + public static Item helmetLeather = (new ItemArmor(42, 0, 0, 0)).setIconIndex(0); + public static Item plateLeather = (new ItemArmor(43, 0, 0, 1)).setIconIndex(16); + public static Item legsLeather = (new ItemArmor(44, 0, 0, 2)).setIconIndex(32); + public static Item bootsLeather = (new ItemArmor(45, 0, 0, 3)).setIconIndex(48); + public static Item helmetChain = (new ItemArmor(46, 1, 1, 0)).setIconIndex(1); + public static Item plateChain = (new ItemArmor(47, 1, 1, 1)).setIconIndex(17); + public static Item legsChain = (new ItemArmor(48, 1, 1, 2)).setIconIndex(33); + public static Item bootsChain = (new ItemArmor(49, 1, 1, 3)).setIconIndex(49); + public static Item helmetSteel = (new ItemArmor(50, 2, 2, 0)).setIconIndex(2); + public static Item plateSteel = (new ItemArmor(51, 2, 2, 1)).setIconIndex(18); + public static Item legsSteel = (new ItemArmor(52, 2, 2, 2)).setIconIndex(34); + public static Item bootsSteel = (new ItemArmor(53, 2, 2, 3)).setIconIndex(50); + public static Item helmetDiamond = (new ItemArmor(54, 3, 3, 0)).setIconIndex(3); + public static Item plateDiamond = (new ItemArmor(55, 3, 3, 1)).setIconIndex(19); + public static Item legsDiamond = (new ItemArmor(56, 3, 3, 2)).setIconIndex(35); + public static Item bootsDiamond = (new ItemArmor(57, 3, 3, 3)).setIconIndex(51); + public static Item helmetGold = (new ItemArmor(58, 1, 4, 0)).setIconIndex(4); + public static Item plateGold = (new ItemArmor(59, 1, 4, 1)).setIconIndex(20); + public static Item legsGold = (new ItemArmor(60, 1, 4, 2)).setIconIndex(36); + public static Item bootsGold = (new ItemArmor(61, 1, 4, 3)).setIconIndex(52); + public static Item flint = (new Item(62)).setIconIndex(6); + public static Item porkRaw = (new ItemFood(63, 3)).setIconIndex(87); + public static Item porkCooked = (new ItemFood(64, 8)).setIconIndex(88); + public static Item painting = (new ItemPainting(65)).setIconIndex(26); + public static Item appleGold = (new ItemFood(66, 42)).setIconIndex(11); + public static Item sign = (new ItemSign(67)).setIconIndex(42); + public static Item doorWood = (new ItemDoor(68, Material.wood)).setIconIndex(43); + public static Item bucketEmpty = (new ItemBucket(69, 0)).setIconIndex(74); + public static Item bucketWater = (new ItemBucket(70, Block.waterStill.blockID)).setIconIndex(75); + public static Item bucketLava = (new ItemBucket(71, Block.lavaStill.blockID)).setIconIndex(76); + public static Item minecartEmpty = (new ItemMinecart(72, 0)).setIconIndex(135); + public static Item saddle = (new ItemSaddle(73)).setIconIndex(104); + public static Item doorSteel = (new ItemDoor(74, Material.iron)).setIconIndex(44); + public static Item redstone = (new ItemRedstone(75)).setIconIndex(56); + public static Item snowball = (new ItemSnowball(76)).setIconIndex(14); + public static Item boat = (new ItemBoat(77)).setIconIndex(136); + public static Item leather = (new Item(78)).setIconIndex(103); + public static Item bucketMilk = (new ItemBucket(79, -1)).setIconIndex(77); + public static Item brick = (new Item(80)).setIconIndex(22); + public static Item clay = (new Item(81)).setIconIndex(57); + public static Item reed = (new ItemReed(82, Block.reed)).setIconIndex(27); + public static Item paper = (new Item(83)).setIconIndex(58); + public static Item book = (new Item(84)).setIconIndex(59); + public static Item slimeBall = (new Item(85)).setIconIndex(30); + public static Item minecartCrate = (new ItemMinecart(86, 1)).setIconIndex(151); + public static Item minecartPowered = (new ItemMinecart(87, 2)).setIconIndex(167); + public static Item egg = (new Item(88)).setIconIndex(12); + public static Item compass = (new Item(89)).setIconIndex(54); + public static Item fishingRod = (new ItemFishingRod(90)).setIconIndex(69); + public static Item pocketSundial = (new Item(91)).setIconIndex(70); + public static Item lightStoneDust = (new Item(92)).setIconIndex(73); + public static Item fishRaw = (new ItemFood(93, 2)).setIconIndex(89); + public static Item fishCooked = (new ItemFood(94, 5)).setIconIndex(90); + public static Item record13 = (new ItemRecord(2000, "13")).setIconIndex(240); + public static Item recordCat = (new ItemRecord(2001, "cat")).setIconIndex(241); + public final int shiftedIndex; + protected int maxStackSize = 64; + protected int maxDamage = 32; + protected int iconIndex; + protected boolean bFull3D = false; + + protected Item(int var1) { + this.shiftedIndex = 256 + var1; + if(itemsList[256 + var1] != null) { + System.out.println("CONFLICT @ " + var1); + } + + itemsList[256 + var1] = this; + } + + public Item setIconIndex(int var1) { + this.iconIndex = var1; + return this; + } + + public int getIconIndex(ItemStack var1) { + return this.iconIndex; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + return false; + } + + public float getStrVsBlock(ItemStack var1, Block var2) { + return 1.0F; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + return var1; + } + + public int getItemStackLimit() { + return this.maxStackSize; + } + + public int getMaxDamage() { + return this.maxDamage; + } + + public void hitEntity(ItemStack var1, EntityLiving var2) { + } + + public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) { + } + + public int getDamageVsEntity(Entity var1) { + return 1; + } + + public boolean canHarvestBlock(Block var1) { + return false; + } + + public void func_4019_b(ItemStack var1, EntityLiving var2) { + } + + public Item setFull3D() { + this.bFull3D = true; + return this; + } + + public boolean isFull3D() { + return this.bFull3D; + } + + public boolean shouldRotateAroundWhenRendering() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/ItemArmor.java b/src/main/java/net/minecraft/src/ItemArmor.java new file mode 100644 index 0000000..75bb557 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemArmor.java @@ -0,0 +1,20 @@ +package net.minecraft.src; + +public class ItemArmor extends Item { + private static final int[] damageReduceAmmountArray = new int[]{3, 8, 6, 3}; + private static final int[] maxDamageArray = new int[]{11, 16, 15, 13}; + public final int armorLevel; + public final int armorType; + public final int damageReduceAmmount; + public final int renderIndex; + + public ItemArmor(int var1, int var2, int var3, int var4) { + super(var1); + this.armorLevel = var2; + this.armorType = var4; + this.renderIndex = var3; + this.damageReduceAmmount = damageReduceAmmountArray[var4]; + this.maxDamage = maxDamageArray[var4] * 3 << var2; + this.maxStackSize = 1; + } +} diff --git a/src/main/java/net/minecraft/src/ItemAxe.java b/src/main/java/net/minecraft/src/ItemAxe.java new file mode 100644 index 0000000..e8027b2 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemAxe.java @@ -0,0 +1,9 @@ +package net.minecraft.src; + +public class ItemAxe extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.planks, Block.bookShelf, Block.wood, Block.crate}; + + public ItemAxe(int var1, int var2) { + super(var1, 3, var2, blocksEffectiveAgainst); + } +} diff --git a/src/main/java/net/minecraft/src/ItemBlock.java b/src/main/java/net/minecraft/src/ItemBlock.java new file mode 100644 index 0000000..4cb5ebc --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemBlock.java @@ -0,0 +1,57 @@ +package net.minecraft.src; + +public class ItemBlock extends Item { + private int blockID; + + public ItemBlock(int var1) { + super(var1); + this.blockID = var1 + 256; + this.setIconIndex(Block.blocksList[var1 + 256].getBlockTextureFromSide(2)); + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) { + var7 = 0; + } else { + if(var7 == 0) { + --var5; + } + + if(var7 == 1) { + ++var5; + } + + if(var7 == 2) { + --var6; + } + + if(var7 == 3) { + ++var6; + } + + if(var7 == 4) { + --var4; + } + + if(var7 == 5) { + ++var4; + } + } + + if(var1.stackSize == 0) { + return false; + } else { + if(var3.canBlockBePlacedAt(this.blockID, var4, var5, var6, false)) { + Block var8 = Block.blocksList[this.blockID]; + if(var3.setBlockWithNotify(var4, var5, var6, this.blockID)) { + Block.blocksList[this.blockID].onBlockPlaced(var3, var4, var5, var6, var7); + Block.blocksList[this.blockID].onBlockPlacedBy(var3, var4, var5, var6, var2); + var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_1145_d(), (var8.stepSound.func_1147_b() + 1.0F) / 2.0F, var8.stepSound.func_1144_c() * 0.8F); + --var1.stackSize; + } + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemBoat.java b/src/main/java/net/minecraft/src/ItemBoat.java new file mode 100644 index 0000000..1368b3b --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemBoat.java @@ -0,0 +1,43 @@ +package net.minecraft.src; + +public class ItemBoat extends Item { + public ItemBoat(int var1) { + super(var1); + this.maxStackSize = 1; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + float var4 = 1.0F; + float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4; + float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4; + double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4; + double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset; + double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4; + Vec3D var13 = Vec3D.createVector(var7, var9, var11); + float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F)); + float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F)); + float var18 = var15 * var16; + float var20 = var14 * var16; + double var21 = 5.0D; + Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); + MovingObjectPosition var24 = var2.rayTraceBlocks(var13, var23, true); + if(var24 == null) { + return var1; + } else { + if(var24.typeOfHit == 0) { + int var25 = var24.blockX; + int var26 = var24.blockY; + int var27 = var24.blockZ; + //if(!var2.multiplayerWorld) { + var2.entityJoinedWorld(new EntityBoat(var2, (double)((float)var25 + 0.5F), (double)((float)var26 + 1.5F), (double)((float)var27 + 0.5F))); + //} + + --var1.stackSize; + } + + return var1; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemBow.java b/src/main/java/net/minecraft/src/ItemBow.java new file mode 100644 index 0000000..1b9b4d6 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemBow.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +public class ItemBow extends Item { + public ItemBow(int var1) { + super(var1); + this.maxStackSize = 1; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + if(var3.inventory.consumeInventoryItem(Item.arrow.shiftedIndex)) { + var2.playSoundAtEntity(var3, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F)); + //if(!var2.multiplayerWorld) { + var2.entityJoinedWorld(new EntityArrow(var2, var3)); + //} + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/ItemBucket.java b/src/main/java/net/minecraft/src/ItemBucket.java new file mode 100644 index 0000000..c499b87 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemBucket.java @@ -0,0 +1,101 @@ +package net.minecraft.src; + +public class ItemBucket extends Item { + private int isFull; + + public ItemBucket(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 64; + this.isFull = var2; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + float var4 = 1.0F; + float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4; + float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4; + double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4; + double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset; + double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4; + Vec3D var13 = Vec3D.createVector(var7, var9, var11); + float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F)); + float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F)); + float var18 = var15 * var16; + float var20 = var14 * var16; + double var21 = 5.0D; + Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); + MovingObjectPosition var24 = var2.rayTraceBlocks(var13, var23, this.isFull == 0); + if(var24 == null) { + return var1; + } else { + if(var24.typeOfHit == 0) { + int var25 = var24.blockX; + int var26 = var24.blockY; + int var27 = var24.blockZ; + if(!var2.func_6466_a(var3, var25, var26, var27)) { + return var1; + } + + if(this.isFull == 0) { + if(var2.getBlockMaterial(var25, var26, var27) == Material.water && var2.getBlockMetadata(var25, var26, var27) == 0) { + var2.setBlockWithNotify(var25, var26, var27, 0); + return new ItemStack(Item.bucketWater); + } + + if(var2.getBlockMaterial(var25, var26, var27) == Material.lava && var2.getBlockMetadata(var25, var26, var27) == 0) { + var2.setBlockWithNotify(var25, var26, var27, 0); + return new ItemStack(Item.bucketLava); + } + } else { + if(this.isFull < 0) { + return new ItemStack(Item.bucketEmpty); + } + + if(var24.sideHit == 0) { + --var26; + } + + if(var24.sideHit == 1) { + ++var26; + } + + if(var24.sideHit == 2) { + --var27; + } + + if(var24.sideHit == 3) { + ++var27; + } + + if(var24.sideHit == 4) { + --var25; + } + + if(var24.sideHit == 5) { + ++var25; + } + + if(var2.getBlockId(var25, var26, var27) == 0 || !var2.getBlockMaterial(var25, var26, var27).func_878_a()) { + if(var2.worldProvider.field_6479_d && this.isFull == Block.waterStill.blockID) { + var2.playSoundEffect(var7 + 0.5D, var9 + 0.5D, var11 + 0.5D, "random.fizz", 0.5F, 2.6F + (var2.rand.nextFloat() - var2.rand.nextFloat()) * 0.8F); + + for(int var28 = 0; var28 < 8; ++var28) { + var2.spawnParticle("largesmoke", (double)var25 + Math.random(), (double)var26 + Math.random(), (double)var27 + Math.random(), 0.0D, 0.0D, 0.0D); + } + } else { + var2.setBlockAndMetadataWithNotify(var25, var26, var27, this.isFull, 0); + } + + return new ItemStack(Item.bucketEmpty); + } + } + } else if(this.isFull == 0 && var24.entityHit instanceof EntityCow) { + return new ItemStack(Item.bucketMilk); + } + + return var1; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemDoor.java b/src/main/java/net/minecraft/src/ItemDoor.java new file mode 100644 index 0000000..5ba8451 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemDoor.java @@ -0,0 +1,72 @@ +package net.minecraft.src; + +public class ItemDoor extends Item { + private Material field_321_a; + + public ItemDoor(int var1, Material var2) { + super(var1); + this.field_321_a = var2; + this.maxDamage = 64; + this.maxStackSize = 1; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 != 1) { + return false; + } else { + ++var5; + Block var8; + if(this.field_321_a == Material.wood) { + var8 = Block.doorWood; + } else { + var8 = Block.doorSteel; + } + + if(!var8.canPlaceBlockAt(var3, var4, var5, var6)) { + return false; + } else { + int var9 = MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + byte var10 = 0; + byte var11 = 0; + if(var9 == 0) { + var11 = 1; + } + + if(var9 == 1) { + var10 = -1; + } + + if(var9 == 2) { + var11 = -1; + } + + if(var9 == 3) { + var10 = 1; + } + + int var12 = (var3.isBlockOpaqueCube(var4 - var10, var5, var6 - var11) ? 1 : 0) + (var3.isBlockOpaqueCube(var4 - var10, var5 + 1, var6 - var11) ? 1 : 0); + int var13 = (var3.isBlockOpaqueCube(var4 + var10, var5, var6 + var11) ? 1 : 0) + (var3.isBlockOpaqueCube(var4 + var10, var5 + 1, var6 + var11) ? 1 : 0); + boolean var14 = var3.getBlockId(var4 - var10, var5, var6 - var11) == var8.blockID || var3.getBlockId(var4 - var10, var5 + 1, var6 - var11) == var8.blockID; + boolean var15 = var3.getBlockId(var4 + var10, var5, var6 + var11) == var8.blockID || var3.getBlockId(var4 + var10, var5 + 1, var6 + var11) == var8.blockID; + boolean var16 = false; + if(var14 && !var15) { + var16 = true; + } else if(var13 > var12) { + var16 = true; + } + + if(var16) { + var9 = var9 - 1 & 3; + var9 += 4; + } + + var3.setBlockWithNotify(var4, var5, var6, var8.blockID); + var3.setBlockMetadataWithNotify(var4, var5, var6, var9); + var3.setBlockWithNotify(var4, var5 + 1, var6, var8.blockID); + var3.setBlockMetadataWithNotify(var4, var5 + 1, var6, var9 + 8); + --var1.stackSize; + return true; + } + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemFishingRod.java b/src/main/java/net/minecraft/src/ItemFishingRod.java new file mode 100644 index 0000000..86aeadb --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemFishingRod.java @@ -0,0 +1,33 @@ +package net.minecraft.src; + +public class ItemFishingRod extends Item { + public ItemFishingRod(int var1) { + super(var1); + this.maxDamage = 64; + } + + public boolean isFull3D() { + return true; + } + + public boolean shouldRotateAroundWhenRendering() { + return true; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + if(var3.fishEntity != null) { + int var4 = var3.fishEntity.func_4043_i(); + var1.damageItem(var4); + var3.func_457_w(); + } else { + var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + //if(!var2.multiplayerWorld) { + var2.entityJoinedWorld(new EntityFish(var2, var3)); + //} + + var3.func_457_w(); + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/ItemFlintAndSteel.java b/src/main/java/net/minecraft/src/ItemFlintAndSteel.java new file mode 100644 index 0000000..cd682fc --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemFlintAndSteel.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +public class ItemFlintAndSteel extends Item { + public ItemFlintAndSteel(int var1) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 64; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 == 0) { + --var5; + } + + if(var7 == 1) { + ++var5; + } + + if(var7 == 2) { + --var6; + } + + if(var7 == 3) { + ++var6; + } + + if(var7 == 4) { + --var4; + } + + if(var7 == 5) { + ++var4; + } + + int var8 = var3.getBlockId(var4, var5, var6); + if(var8 == 0) { + var3.playSoundEffect((double)var4 + 0.5D, (double)var5 + 0.5D, (double)var6 + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); + var3.setBlockWithNotify(var4, var5, var6, Block.fire.blockID); + } + + var1.damageItem(1); + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ItemFood.java b/src/main/java/net/minecraft/src/ItemFood.java new file mode 100644 index 0000000..d0b8bf9 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemFood.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class ItemFood extends Item { + private int healAmount; + + public ItemFood(int var1, int var2) { + super(var1); + this.healAmount = var2; + this.maxStackSize = 1; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + --var1.stackSize; + var3.heal(this.healAmount); + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/ItemHoe.java b/src/main/java/net/minecraft/src/ItemHoe.java new file mode 100644 index 0000000..1fe9fe0 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemHoe.java @@ -0,0 +1,45 @@ +package net.minecraft.src; + +public class ItemHoe extends Item { + public ItemHoe(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 32 << var2; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + int var8 = var3.getBlockId(var4, var5, var6); + Material var9 = var3.getBlockMaterial(var4, var5 + 1, var6); + if((var9.func_878_a() || var8 != Block.grass.blockID) && var8 != Block.dirt.blockID) { + return false; + } else { + Block var10 = Block.tilledField; + var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var10.stepSound.func_1145_d(), (var10.stepSound.func_1147_b() + 1.0F) / 2.0F, var10.stepSound.func_1144_c() * 0.8F); + //if(var3.multiplayerWorld) { + //return true; + //} else { + var3.setBlockWithNotify(var4, var5, var6, var10.blockID); + var1.damageItem(1); + if(var3.rand.nextInt(8) == 0 && var8 == Block.grass.blockID) { + byte var11 = 1; + + for(int var12 = 0; var12 < var11; ++var12) { + float var13 = 0.7F; + float var14 = var3.rand.nextFloat() * var13 + (1.0F - var13) * 0.5F; + float var15 = 1.2F; + float var16 = var3.rand.nextFloat() * var13 + (1.0F - var13) * 0.5F; + EntityItem var17 = new EntityItem(var3, (double)((float)var4 + var14), (double)((float)var5 + var15), (double)((float)var6 + var16), new ItemStack(Item.seeds)); + var17.field_805_c = 10; + var3.entityJoinedWorld(var17); + } + } + + return true; + //} + } + } + + public boolean isFull3D() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ItemMinecart.java b/src/main/java/net/minecraft/src/ItemMinecart.java new file mode 100644 index 0000000..4d1fa48 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemMinecart.java @@ -0,0 +1,25 @@ +package net.minecraft.src; + +public class ItemMinecart extends Item { + public int field_317_a; + + public ItemMinecart(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.field_317_a = var2; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + int var8 = var3.getBlockId(var4, var5, var6); + if(var8 == Block.minecartTrack.blockID) { + //(!var3.multiplayerWorld) { + var3.entityJoinedWorld(new EntityMinecart(var3, (double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), this.field_317_a)); + //} + + --var1.stackSize; + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemPainting.java b/src/main/java/net/minecraft/src/ItemPainting.java new file mode 100644 index 0000000..dc84948 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemPainting.java @@ -0,0 +1,37 @@ +package net.minecraft.src; + +public class ItemPainting extends Item { + public ItemPainting(int var1) { + super(var1); + this.maxDamage = 64; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 == 0) { + return false; + } else if(var7 == 1) { + return false; + } else { + byte var8 = 0; + if(var7 == 4) { + var8 = 1; + } + + if(var7 == 3) { + var8 = 2; + } + + if(var7 == 5) { + var8 = 3; + } + + EntityPainting var9 = new EntityPainting(var3, var4, var5, var6, var8); + if(var9.func_410_i()) { + var3.entityJoinedWorld(var9); + --var1.stackSize; + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemPickaxe.java b/src/main/java/net/minecraft/src/ItemPickaxe.java new file mode 100644 index 0000000..31ca3e5 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemPickaxe.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class ItemPickaxe extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.blockIce, Block.bloodStone}; + private int field_328_aY; + + public ItemPickaxe(int var1, int var2) { + super(var1, 2, var2, blocksEffectiveAgainst); + this.field_328_aY = var2; + } + + public boolean canHarvestBlock(Block var1) { + return var1 == Block.obsidian ? this.field_328_aY == 3 : (var1 != Block.blockDiamond && var1 != Block.oreDiamond ? (var1 != Block.blockGold && var1 != Block.oreGold ? (var1 != Block.blockSteel && var1 != Block.oreIron ? (var1 != Block.oreRedstone && var1 != Block.oreRedstoneGlowing ? (var1.blockMaterial == Material.rock ? true : var1.blockMaterial == Material.iron) : this.field_328_aY >= 2) : this.field_328_aY >= 1) : this.field_328_aY >= 2) : this.field_328_aY >= 2); + } +} diff --git a/src/main/java/net/minecraft/src/ItemRecord.java b/src/main/java/net/minecraft/src/ItemRecord.java new file mode 100644 index 0000000..e7ef4ab --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemRecord.java @@ -0,0 +1,22 @@ +package net.minecraft.src; + +public class ItemRecord extends Item { + private String recordName; + + protected ItemRecord(int var1, String var2) { + super(var1); + this.recordName = var2; + this.maxStackSize = 1; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var3.getBlockId(var4, var5, var6) == Block.jukebox.blockID && var3.getBlockMetadata(var4, var5, var6) == 0) { + var3.setBlockMetadataWithNotify(var4, var5, var6, this.shiftedIndex - Item.record13.shiftedIndex + 1); + var3.playRecord(this.recordName, var4, var5, var6); + --var1.stackSize; + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemRedstone.java b/src/main/java/net/minecraft/src/ItemRedstone.java new file mode 100644 index 0000000..937521a --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemRedstone.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +public class ItemRedstone extends Item { + public ItemRedstone(int var1) { + super(var1); + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 == 0) { + --var5; + } + + if(var7 == 1) { + ++var5; + } + + if(var7 == 2) { + --var6; + } + + if(var7 == 3) { + ++var6; + } + + if(var7 == 4) { + --var4; + } + + if(var7 == 5) { + ++var4; + } + + if(var3.getBlockId(var4, var5, var6) != 0) { + return false; + } else { + if(Block.redstoneWire.canPlaceBlockAt(var3, var4, var5, var6)) { + --var1.stackSize; + var3.setBlockWithNotify(var4, var5, var6, Block.redstoneWire.blockID); + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemReed.java b/src/main/java/net/minecraft/src/ItemReed.java new file mode 100644 index 0000000..b7d6d90 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemReed.java @@ -0,0 +1,55 @@ +package net.minecraft.src; + +public class ItemReed extends Item { + private int field_320_a; + + public ItemReed(int var1, Block var2) { + super(var1); + this.field_320_a = var2.blockID; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) { + var7 = 0; + } else { + if(var7 == 0) { + --var5; + } + + if(var7 == 1) { + ++var5; + } + + if(var7 == 2) { + --var6; + } + + if(var7 == 3) { + ++var6; + } + + if(var7 == 4) { + --var4; + } + + if(var7 == 5) { + ++var4; + } + } + + if(var1.stackSize == 0) { + return false; + } else { + if(var3.canBlockBePlacedAt(this.field_320_a, var4, var5, var6, false)) { + Block var8 = Block.blocksList[this.field_320_a]; + if(var3.setBlockWithNotify(var4, var5, var6, this.field_320_a)) { + Block.blocksList[this.field_320_a].onBlockPlaced(var3, var4, var5, var6, var7); + var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_1145_d(), (var8.stepSound.func_1147_b() + 1.0F) / 2.0F, var8.stepSound.func_1144_c() * 0.8F); + --var1.stackSize; + } + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemRenderer.java b/src/main/java/net/minecraft/src/ItemRenderer.java new file mode 100644 index 0000000..ef6db25 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemRenderer.java @@ -0,0 +1,350 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class ItemRenderer { + private Minecraft mc; + private ItemStack field_9451_b = null; + private float field_9453_c = 0.0F; + private float field_9452_d = 0.0F; + private RenderBlocks field_1357_e = new RenderBlocks(); + + public ItemRenderer(Minecraft var1) { + this.mc = var1; + } + + public void renderItem(ItemStack var1) { + GL11.glPushMatrix(); + if(var1.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var1.itemID].getRenderType())) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + this.field_1357_e.func_1227_a(Block.blocksList[var1.itemID]); + } else { + if(var1.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")); + } + + Tessellator var2 = Tessellator.instance; + float var3 = ((float)(var1.getIconIndex() % 16 * 16) + 0.0F) / 256.0F; + float var4 = ((float)(var1.getIconIndex() % 16 * 16) + 15.99F) / 256.0F; + float var5 = ((float)(var1.getIconIndex() / 16 * 16) + 0.0F) / 256.0F; + float var6 = ((float)(var1.getIconIndex() / 16 * 16) + 15.99F) / 256.0F; + float var7 = 1.0F; + float var8 = 0.0F; + float var9 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-var8, -var9, 0.0F); + float var10 = 1.5F; + GL11.glScalef(var10, var10, var10); + GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-(15.0F / 16.0F), -(1.0F / 16.0F), 0.0F); + float var11 = 1.0F / 16.0F; + var2.startDrawingQuads(); + var2.setNormal(0.0F, 0.0F, 1.0F); + var2.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)var4, (double)var6); + var2.addVertexWithUV((double)var7, 0.0D, 0.0D, (double)var3, (double)var6); + var2.addVertexWithUV((double)var7, 1.0D, 0.0D, (double)var3, (double)var5); + var2.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)var4, (double)var5); + var2.draw(); + var2.startDrawingQuads(); + var2.setNormal(0.0F, 0.0F, -1.0F); + var2.addVertexWithUV(0.0D, 1.0D, (double)(0.0F - var11), (double)var4, (double)var5); + var2.addVertexWithUV((double)var7, 1.0D, (double)(0.0F - var11), (double)var3, (double)var5); + var2.addVertexWithUV((double)var7, 0.0D, (double)(0.0F - var11), (double)var3, (double)var6); + var2.addVertexWithUV(0.0D, 0.0D, (double)(0.0F - var11), (double)var4, (double)var6); + var2.draw(); + var2.startDrawingQuads(); + var2.setNormal(-1.0F, 0.0F, 0.0F); + + int var12; + float var13; + float var14; + float var15; + for(var12 = 0; var12 < 16; ++var12) { + var13 = (float)var12 / 16.0F; + var14 = var4 + (var3 - var4) * var13 - 0.001953125F; + var15 = var7 * var13; + var2.addVertexWithUV((double)var15, 0.0D, (double)(0.0F - var11), (double)var14, (double)var6); + var2.addVertexWithUV((double)var15, 0.0D, 0.0D, (double)var14, (double)var6); + var2.addVertexWithUV((double)var15, 1.0D, 0.0D, (double)var14, (double)var5); + var2.addVertexWithUV((double)var15, 1.0D, (double)(0.0F - var11), (double)var14, (double)var5); + } + + var2.draw(); + var2.startDrawingQuads(); + var2.setNormal(1.0F, 0.0F, 0.0F); + + for(var12 = 0; var12 < 16; ++var12) { + var13 = (float)var12 / 16.0F; + var14 = var4 + (var3 - var4) * var13 - 0.001953125F; + var15 = var7 * var13 + 1.0F / 16.0F; + var2.addVertexWithUV((double)var15, 1.0D, (double)(0.0F - var11), (double)var14, (double)var5); + var2.addVertexWithUV((double)var15, 1.0D, 0.0D, (double)var14, (double)var5); + var2.addVertexWithUV((double)var15, 0.0D, 0.0D, (double)var14, (double)var6); + var2.addVertexWithUV((double)var15, 0.0D, (double)(0.0F - var11), (double)var14, (double)var6); + } + + var2.draw(); + var2.startDrawingQuads(); + var2.setNormal(0.0F, 1.0F, 0.0F); + + for(var12 = 0; var12 < 16; ++var12) { + var13 = (float)var12 / 16.0F; + var14 = var6 + (var5 - var6) * var13 - 0.001953125F; + var15 = var7 * var13 + 1.0F / 16.0F; + var2.addVertexWithUV(0.0D, (double)var15, 0.0D, (double)var4, (double)var14); + var2.addVertexWithUV((double)var7, (double)var15, 0.0D, (double)var3, (double)var14); + var2.addVertexWithUV((double)var7, (double)var15, (double)(0.0F - var11), (double)var3, (double)var14); + var2.addVertexWithUV(0.0D, (double)var15, (double)(0.0F - var11), (double)var4, (double)var14); + } + + var2.draw(); + var2.startDrawingQuads(); + var2.setNormal(0.0F, -1.0F, 0.0F); + + for(var12 = 0; var12 < 16; ++var12) { + var13 = (float)var12 / 16.0F; + var14 = var6 + (var5 - var6) * var13 - 0.001953125F; + var15 = var7 * var13; + var2.addVertexWithUV((double)var7, (double)var15, 0.0D, (double)var3, (double)var14); + var2.addVertexWithUV(0.0D, (double)var15, 0.0D, (double)var4, (double)var14); + var2.addVertexWithUV(0.0D, (double)var15, (double)(0.0F - var11), (double)var4, (double)var14); + var2.addVertexWithUV((double)var7, (double)var15, (double)(0.0F - var11), (double)var3, (double)var14); + } + + var2.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } + + GL11.glPopMatrix(); + } + + public void renderItemInFirstPerson(float var1) { + float var2 = this.field_9452_d + (this.field_9453_c - this.field_9452_d) * var1; + EntityPlayerSP var3 = this.mc.thePlayer; + GL11.glPushMatrix(); + GL11.glRotatef(var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var1, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var1, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + float var4 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ)); + GL11.glColor4f(var4, var4, var4, 1.0F); + ItemStack var5 = this.field_9451_b; + if(var3.fishEntity != null) { + var5 = new ItemStack(Item.stick.shiftedIndex); + } + + float var6; + float var7; + float var8; + float var9; + if(var5 != null) { + GL11.glPushMatrix(); + var6 = 0.8F; + var7 = var3.getSwingProgress(var1); + var8 = MathHelper.sin(var7 * (float)Math.PI); + var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI); + GL11.glTranslatef(-var9 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.2F, -var8 * 0.2F); + GL11.glTranslatef(0.7F * var6, -0.65F * var6 - (1.0F - var2) * 0.6F, -0.9F * var6); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + var7 = var3.getSwingProgress(var1); + var8 = MathHelper.sin(var7 * var7 * (float)Math.PI); + var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI); + GL11.glRotatef(-var8 * 20.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var9 * 20.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-var9 * 80.0F, 1.0F, 0.0F, 0.0F); + var7 = 0.4F; + GL11.glScalef(var7, var7, var7); + if(var5.getItem().shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + } + + this.renderItem(var5); + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + var6 = 0.8F; + var7 = var3.getSwingProgress(var1); + var8 = MathHelper.sin(var7 * (float)Math.PI); + var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI); + GL11.glTranslatef(-var9 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.4F, -var8 * 0.4F); + GL11.glTranslatef(0.8F * var6, -(12.0F / 16.0F) * var6 - (1.0F - var2) * 0.6F, -0.9F * var6); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + var7 = var3.getSwingProgress(var1); + var8 = MathHelper.sin(var7 * var7 * (float)Math.PI); + var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI); + GL11.glRotatef(var9 * 70.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var8 * 20.0F, 0.0F, 0.0F, 1.0F); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getEntityTexture())); + GL11.glTranslatef(-1.0F, 3.6F, 3.5F); + GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, 1.0F, 1.0F); + GL11.glTranslatef(5.6F, 0.0F, 0.0F); + Render var10 = RenderManager.instance.func_855_a(this.mc.thePlayer); + RenderPlayer var11 = (RenderPlayer)var10; + var9 = 1.0F; + GL11.glScalef(var9, var9, var9); + var11.drawFirstPersonHand(); + GL11.glPopMatrix(); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + } + + public void renderOverlays(float var1) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + int var2; + if(this.mc.thePlayer.fire > 0 || this.mc.thePlayer.field_9299_bv) { + var2 = this.mc.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2); + this.renderFireInFirstPerson(var1); + } + + if(this.mc.thePlayer.func_345_I()) { + var2 = MathHelper.floor_double(this.mc.thePlayer.posX); + int var3 = MathHelper.floor_double(this.mc.thePlayer.posY); + int var4 = MathHelper.floor_double(this.mc.thePlayer.posZ); + int var5 = this.mc.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5); + int var6 = this.mc.theWorld.getBlockId(var2, var3, var4); + if(Block.blocksList[var6] != null) { + this.renderInsideOfBlock(var1, Block.blocksList[var6].getBlockTextureFromSide(2)); + } + } + + if(this.mc.thePlayer.isInsideOfMaterial(Material.water)) { + var2 = this.mc.renderEngine.getTexture("/misc/water.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2); + this.renderWarpedTextureOverlay(var1); + } + + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + private void renderInsideOfBlock(float var1, int var2) { + Tessellator var3 = Tessellator.instance; + this.mc.thePlayer.getEntityBrightness(var1); + float var4 = 0.1F; + GL11.glColor4f(var4, var4, var4, 0.5F); + GL11.glPushMatrix(); + float var5 = -1.0F; + float var6 = 1.0F; + float var7 = -1.0F; + float var8 = 1.0F; + float var9 = -0.5F; + float var10 = 0.0078125F; + float var11 = (float)(var2 % 16) / 256.0F - var10; + float var12 = ((float)(var2 % 16) + 15.99F) / 256.0F + var10; + float var13 = (float)(var2 / 16) / 256.0F - var10; + float var14 = ((float)(var2 / 16) + 15.99F) / 256.0F + var10; + var3.startDrawingQuads(); + var3.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)var12, (double)var14); + var3.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)var11, (double)var14); + var3.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)var11, (double)var13); + var3.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)var12, (double)var13); + var3.draw(); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + private void renderWarpedTextureOverlay(float var1) { + Tessellator var2 = Tessellator.instance; + float var3 = this.mc.thePlayer.getEntityBrightness(var1); + GL11.glColor4f(var3, var3, var3, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glPushMatrix(); + float var4 = 4.0F; + float var5 = -1.0F; + float var6 = 1.0F; + float var7 = -1.0F; + float var8 = 1.0F; + float var9 = -0.5F; + float var10 = -this.mc.thePlayer.rotationYaw / 64.0F; + float var11 = this.mc.thePlayer.rotationPitch / 64.0F; + var2.startDrawingQuads(); + var2.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)(var4 + var10), (double)(var4 + var11)); + var2.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)(0.0F + var10), (double)(var4 + var11)); + var2.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)(0.0F + var10), (double)(0.0F + var11)); + var2.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)(var4 + var10), (double)(0.0F + var11)); + var2.draw(); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + } + + private void renderFireInFirstPerson(float var1) { + Tessellator var2 = Tessellator.instance; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.9F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + float var3 = 1.0F; + + for(int var4 = 0; var4 < 2; ++var4) { + GL11.glPushMatrix(); + int var5 = Block.fire.blockIndexInTexture + var4 * 16; + int var6 = (var5 & 15) << 4; + int var7 = var5 & 240; + float var8 = (float)var6 / 256.0F; + float var9 = ((float)var6 + 15.99F) / 256.0F; + float var10 = (float)var7 / 256.0F; + float var11 = ((float)var7 + 15.99F) / 256.0F; + float var12 = (0.0F - var3) / 2.0F; + float var13 = var12 + var3; + float var14 = 0.0F - var3 / 2.0F; + float var15 = var14 + var3; + float var16 = -0.5F; + GL11.glTranslatef((float)(-(var4 * 2 - 1)) * 0.24F, -0.3F, 0.0F); + GL11.glRotatef((float)(var4 * 2 - 1) * 10.0F, 0.0F, 1.0F, 0.0F); + var2.startDrawingQuads(); + var2.addVertexWithUV((double)var12, (double)var14, (double)var16, (double)var9, (double)var11); + var2.addVertexWithUV((double)var13, (double)var14, (double)var16, (double)var8, (double)var11); + var2.addVertexWithUV((double)var13, (double)var15, (double)var16, (double)var8, (double)var10); + var2.addVertexWithUV((double)var12, (double)var15, (double)var16, (double)var9, (double)var10); + var2.draw(); + GL11.glPopMatrix(); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + } + + public void func_895_a() { + this.field_9452_d = this.field_9453_c; + EntityPlayerSP var1 = this.mc.thePlayer; + ItemStack var2 = var1.inventory.getCurrentItem(); + float var4 = 0.4F; + float var5 = var2 == this.field_9451_b ? 1.0F : 0.0F; + float var6 = var5 - this.field_9453_c; + if(var6 < -var4) { + var6 = -var4; + } + + if(var6 > var4) { + var6 = var4; + } + + this.field_9453_c += var6; + if(this.field_9453_c < 0.1F) { + this.field_9451_b = var2; + } + + } + + public void func_9449_b() { + this.field_9453_c = 0.0F; + } + + public void func_9450_c() { + this.field_9453_c = 0.0F; + } +} diff --git a/src/main/java/net/minecraft/src/ItemSaddle.java b/src/main/java/net/minecraft/src/ItemSaddle.java new file mode 100644 index 0000000..1afc4b5 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSaddle.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +public class ItemSaddle extends Item { + public ItemSaddle(int var1) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 64; + } + + public void func_4019_b(ItemStack var1, EntityLiving var2) { + if(var2 instanceof EntityPig) { + EntityPig var3 = (EntityPig)var2; + if(!var3.rideable) { + var3.rideable = true; + --var1.stackSize; + } + } + + } + + public void hitEntity(ItemStack var1, EntityLiving var2) { + this.func_4019_b(var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/ItemSeeds.java b/src/main/java/net/minecraft/src/ItemSeeds.java new file mode 100644 index 0000000..1710687 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSeeds.java @@ -0,0 +1,25 @@ +package net.minecraft.src; + +public class ItemSeeds extends Item { + private int field_318_a; + + public ItemSeeds(int var1, int var2) { + super(var1); + this.field_318_a = var2; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 != 1) { + return false; + } else { + int var8 = var3.getBlockId(var4, var5, var6); + if(var8 == Block.tilledField.blockID) { + var3.setBlockWithNotify(var4, var5 + 1, var6, this.field_318_a); + --var1.stackSize; + return true; + } else { + return false; + } + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemSign.java b/src/main/java/net/minecraft/src/ItemSign.java new file mode 100644 index 0000000..834426b --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSign.java @@ -0,0 +1,55 @@ +package net.minecraft.src; + +public class ItemSign extends Item { + public ItemSign(int var1) { + super(var1); + this.maxDamage = 64; + this.maxStackSize = 1; + } + + public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) { + if(var7 == 0) { + return false; + } else if(!var3.getBlockMaterial(var4, var5, var6).func_878_a()) { + return false; + } else { + if(var7 == 1) { + ++var5; + } + + if(var7 == 2) { + --var6; + } + + if(var7 == 3) { + ++var6; + } + + if(var7 == 4) { + --var4; + } + + if(var7 == 5) { + ++var4; + } + + if(!Block.signPost.canPlaceBlockAt(var3, var4, var5, var6)) { + return false; + } else { + if(var7 == 1) { + var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signPost.blockID, MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15); + } else { + var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signWall.blockID, var7); + } + + --var1.stackSize; + TileEntitySign var8 = (TileEntitySign)var3.getBlockTileEntity(var4, var5, var6); + if(var8 != null) { + var2.displayGUIEditSign(var8); + } + + return true; + } + } + } +} diff --git a/src/main/java/net/minecraft/src/ItemSnowball.java b/src/main/java/net/minecraft/src/ItemSnowball.java new file mode 100644 index 0000000..7b5efec --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSnowball.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +public class ItemSnowball extends Item { + public ItemSnowball(int var1) { + super(var1); + this.maxStackSize = 16; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + --var1.stackSize; + var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + //if(!var2.multiplayerWorld) { + var2.entityJoinedWorld(new EntitySnowball(var2, var3)); + //} + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/ItemSoup.java b/src/main/java/net/minecraft/src/ItemSoup.java new file mode 100644 index 0000000..7143549 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSoup.java @@ -0,0 +1,12 @@ +package net.minecraft.src; + +public class ItemSoup extends ItemFood { + public ItemSoup(int var1, int var2) { + super(var1, var2); + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + super.onItemRightClick(var1, var2, var3); + return new ItemStack(Item.bowlEmpty); + } +} diff --git a/src/main/java/net/minecraft/src/ItemSpade.java b/src/main/java/net/minecraft/src/ItemSpade.java new file mode 100644 index 0000000..2f85c9b --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSpade.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +public class ItemSpade extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay}; + + public ItemSpade(int var1, int var2) { + super(var1, 1, var2, blocksEffectiveAgainst); + } + + public boolean canHarvestBlock(Block var1) { + return var1 == Block.snow ? true : var1 == Block.blockSnow; + } +} diff --git a/src/main/java/net/minecraft/src/ItemStack.java b/src/main/java/net/minecraft/src/ItemStack.java new file mode 100644 index 0000000..39838fa --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemStack.java @@ -0,0 +1,132 @@ +package net.minecraft.src; + +public final class ItemStack { + public int stackSize; + public int animationsToGo; + public int itemID; + public int itemDamage; + + public ItemStack(Block var1) { + this((Block)var1, 1); + } + + public ItemStack(Block var1, int var2) { + this(var1.blockID, var2); + } + + public ItemStack(Item var1) { + this((Item)var1, 1); + } + + public ItemStack(Item var1, int var2) { + this(var1.shiftedIndex, var2); + } + + public ItemStack(int var1) { + this(var1, 1); + } + + public ItemStack(int var1, int var2) { + this.stackSize = 0; + this.itemID = var1; + this.stackSize = var2; + } + + public ItemStack(int var1, int var2, int var3) { + this.stackSize = 0; + this.itemID = var1; + this.stackSize = var2; + this.itemDamage = var3; + } + + public ItemStack(NBTTagCompound var1) { + this.stackSize = 0; + this.readFromNBT(var1); + } + + public ItemStack splitStack(int var1) { + this.stackSize -= var1; + return new ItemStack(this.itemID, var1, this.itemDamage); + } + + public Item getItem() { + return Item.itemsList[this.itemID]; + } + + public int getIconIndex() { + return this.getItem().getIconIndex(this); + } + + public boolean useItem(EntityPlayer var1, World var2, int var3, int var4, int var5, int var6) { + return this.getItem().onItemUse(this, var1, var2, var3, var4, var5, var6); + } + + public float getStrVsBlock(Block var1) { + return this.getItem().getStrVsBlock(this, var1); + } + + public ItemStack useItemRightClick(World var1, EntityPlayer var2) { + return this.getItem().onItemRightClick(this, var1, var2); + } + + public NBTTagCompound writeToNBT(NBTTagCompound var1) { + var1.setShort("id", (short)this.itemID); + var1.setByte("Count", (byte)this.stackSize); + var1.setShort("Damage", (short)this.itemDamage); + return var1; + } + + public void readFromNBT(NBTTagCompound var1) { + this.itemID = var1.getShort("id"); + this.stackSize = var1.getByte("Count"); + this.itemDamage = var1.getShort("Damage"); + } + + public int getMaxStackSize() { + return this.getItem().getItemStackLimit(); + } + + public int getMaxDamage() { + return Item.itemsList[this.itemID].getMaxDamage(); + } + + public void damageItem(int var1) { + this.itemDamage += var1; + if(this.itemDamage > this.getMaxDamage()) { + --this.stackSize; + if(this.stackSize < 0) { + this.stackSize = 0; + } + + this.itemDamage = 0; + } + + } + + public void hitEntity(EntityLiving var1) { + Item.itemsList[this.itemID].hitEntity(this, var1); + } + + public void hitBlock(int var1, int var2, int var3, int var4) { + Item.itemsList[this.itemID].hitBlock(this, var1, var2, var3, var4); + } + + public int getDamageVsEntity(Entity var1) { + return Item.itemsList[this.itemID].getDamageVsEntity(var1); + } + + public boolean canHarvestBlock(Block var1) { + return Item.itemsList[this.itemID].canHarvestBlock(var1); + } + + public void func_1097_a(EntityPlayer var1) { + } + + public void useItemOnEntity(EntityLiving var1) { + Item.itemsList[this.itemID].func_4019_b(this, var1); + } + + public ItemStack copy() { + return new ItemStack(this.itemID, this.stackSize, this.itemDamage); + } +} diff --git a/src/main/java/net/minecraft/src/ItemSword.java b/src/main/java/net/minecraft/src/ItemSword.java new file mode 100644 index 0000000..0bd7b56 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemSword.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +public class ItemSword extends Item { + private int weaponDamage; + + public ItemSword(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 32 << var2; + if(var2 == 3) { + this.maxDamage *= 4; + } + + this.weaponDamage = 4 + var2 * 2; + } + + public float getStrVsBlock(ItemStack var1, Block var2) { + return 1.5F; + } + + public void hitEntity(ItemStack var1, EntityLiving var2) { + var1.damageItem(1); + } + + public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) { + var1.damageItem(2); + } + + public int getDamageVsEntity(Entity var1) { + return this.weaponDamage; + } + + public boolean isFull3D() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/ItemTool.java b/src/main/java/net/minecraft/src/ItemTool.java new file mode 100644 index 0000000..a61fb01 --- /dev/null +++ b/src/main/java/net/minecraft/src/ItemTool.java @@ -0,0 +1,48 @@ +package net.minecraft.src; + +public class ItemTool extends Item { + private Block[] blocksEffectiveAgainst; + private float efficiencyOnProperMaterial = 4.0F; + private int damageVsEntity; + protected int ingredientQuality; + + public ItemTool(int var1, int var2, int var3, Block[] var4) { + super(var1); + this.ingredientQuality = var3; + this.blocksEffectiveAgainst = var4; + this.maxStackSize = 1; + this.maxDamage = 32 << var3; + if(var3 == 3) { + this.maxDamage *= 4; + } + + this.efficiencyOnProperMaterial = (float)((var3 + 1) * 2); + this.damageVsEntity = var2 + var3; + } + + public float getStrVsBlock(ItemStack var1, Block var2) { + for(int var3 = 0; var3 < this.blocksEffectiveAgainst.length; ++var3) { + if(this.blocksEffectiveAgainst[var3] == var2) { + return this.efficiencyOnProperMaterial; + } + } + + return 1.0F; + } + + public void hitEntity(ItemStack var1, EntityLiving var2) { + var1.damageItem(2); + } + + public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) { + var1.damageItem(1); + } + + public int getDamageVsEntity(Entity var1) { + return this.damageVsEntity; + } + + public boolean isFull3D() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/KeyBinding.java b/src/main/java/net/minecraft/src/KeyBinding.java new file mode 100644 index 0000000..6d27b38 --- /dev/null +++ b/src/main/java/net/minecraft/src/KeyBinding.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +public class KeyBinding { + public String keyDescription; + public int keyCode; + + public KeyBinding(String var1, int var2) { + this.keyDescription = var1; + this.keyCode = var2; + } +} diff --git a/src/main/java/net/minecraft/src/LoadingScreenRenderer.java b/src/main/java/net/minecraft/src/LoadingScreenRenderer.java new file mode 100644 index 0000000..2c21aaf --- /dev/null +++ b/src/main/java/net/minecraft/src/LoadingScreenRenderer.java @@ -0,0 +1,124 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; + +public class LoadingScreenRenderer implements IProgressUpdate { + private String field_1004_a = ""; + private Minecraft mc; + private String field_1007_c = ""; + private long field_1006_d = System.currentTimeMillis(); + private boolean field_1005_e = false; + + public LoadingScreenRenderer(Minecraft var1) { + this.mc = var1; + } + + public void func_596_a(String var1) { + this.field_1005_e = false; + this.func_597_c(var1); + } + + public void func_594_b(String var1) { + this.field_1005_e = true; + this.func_597_c(this.field_1007_c); + } + + public void func_597_c(String var1) { + if(!this.mc.running) { + if(!this.field_1005_e) { + throw new MinecraftError(); + } + } else { + this.field_1007_c = var1; + ScaledResolution var2 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var3 = var2.getScaledWidth(); + int var4 = var2.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var3, (double)var4, 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + } + } + + public void displayLoadingString(String var1) { + if(!this.mc.running) { + if(!this.field_1005_e) { + throw new MinecraftError(); + } + } else { + this.field_1006_d = 0L; + this.field_1004_a = var1; + this.setLoadingProgress(-1); + this.field_1006_d = 0L; + } + } + + public void setLoadingProgress(int var1) { + if(!this.mc.running) { + if(!this.field_1005_e) { + throw new MinecraftError(); + } + } else { + long var2 = System.currentTimeMillis(); + if(var2 - this.field_1006_d >= 20L) { + this.field_1006_d = var2; + ScaledResolution var4 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var5 = var4.getScaledWidth(); + int var6 = var4.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var5, (double)var6, 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + Tessellator var7 = Tessellator.instance; + int var8 = this.mc.renderEngine.getTexture("/gui/background.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8); + float var9 = 32.0F; + var7.startDrawingQuads(); + var7.setColorOpaque_I(4210752); + var7.addVertexWithUV(0.0D, (double)var6, 0.0D, 0.0D, (double)((float)var6 / var9)); + var7.addVertexWithUV((double)var5, (double)var6, 0.0D, (double)((float)var5 / var9), (double)((float)var6 / var9)); + var7.addVertexWithUV((double)var5, 0.0D, 0.0D, (double)((float)var5 / var9), 0.0D); + var7.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + var7.draw(); + if(var1 >= 0) { + byte var10 = 100; + byte var11 = 2; + int var12 = var5 / 2 - var10 / 2; + int var13 = var6 / 2 + 16; + GL11.glDisable(GL11.GL_TEXTURE_2D); + var7.startDrawingQuads(); + var7.setColorOpaque_I(8421504); + var7.addVertex((double)var12, (double)var13, 0.0D); + var7.addVertex((double)var12, (double)(var13 + var11), 0.0D); + var7.addVertex((double)(var12 + var10), (double)(var13 + var11), 0.0D); + var7.addVertex((double)(var12 + var10), (double)var13, 0.0D); + var7.setColorOpaque_I(8454016); + var7.addVertex((double)var12, (double)var13, 0.0D); + var7.addVertex((double)var12, (double)(var13 + var11), 0.0D); + var7.addVertex((double)(var12 + var1), (double)(var13 + var11), 0.0D); + var7.addVertex((double)(var12 + var1), (double)var13, 0.0D); + var7.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + this.mc.fontRenderer.drawStringWithShadow(this.field_1007_c, (var5 - this.mc.fontRenderer.getStringWidth(this.field_1007_c)) / 2, var6 / 2 - 4 - 16, 16777215); + this.mc.fontRenderer.drawStringWithShadow(this.field_1004_a, (var5 - this.mc.fontRenderer.getStringWidth(this.field_1004_a)) / 2, var6 / 2 - 4 + 8, 16777215); + GL11.updateDisplay(); + + try { + Thread.yield(); + } catch (Exception var14) { + } + + } + } + } +} diff --git a/src/main/java/net/minecraft/src/LogoEffectRandomizer.java b/src/main/java/net/minecraft/src/LogoEffectRandomizer.java new file mode 100644 index 0000000..29da6e7 --- /dev/null +++ b/src/main/java/net/minecraft/src/LogoEffectRandomizer.java @@ -0,0 +1,28 @@ +package net.minecraft.src; + +class LogoEffectRandomizer { + public double field_1312_a; + public double field_1311_b; + public double field_1314_c; + final GuiMainMenu mainMenu; + + public LogoEffectRandomizer(GuiMainMenu var1, int var2, int var3) { + this.mainMenu = var1; + this.field_1312_a = this.field_1311_b = (double)(10 + var3) + GuiMainMenu.getRand().nextDouble() * 32.0D + (double)var2; + } + + public void func_875_a() { + this.field_1311_b = this.field_1312_a; + if(this.field_1312_a > 0.0D) { + this.field_1314_c -= 0.6D; + } + + this.field_1312_a += this.field_1314_c; + this.field_1314_c *= 0.9D; + if(this.field_1312_a < 0.0D) { + this.field_1312_a = 0.0D; + this.field_1314_c = 0.0D; + } + + } +} diff --git a/src/main/java/net/minecraft/src/MCHashTable.java b/src/main/java/net/minecraft/src/MCHashTable.java new file mode 100644 index 0000000..ffe720b --- /dev/null +++ b/src/main/java/net/minecraft/src/MCHashTable.java @@ -0,0 +1,135 @@ +package net.minecraft.src; + +public class MCHashTable { + private transient HashEntry[] slots = new HashEntry[16]; + private transient int count; + private int threshold = 12; + private final float growFactor = 12.0F / 16.0F; + private transient volatile int versionStamp; + + private static int computeHash(int var0) { + var0 ^= var0 >>> 20 ^ var0 >>> 12; + return var0 ^ var0 >>> 7 ^ var0 >>> 4; + } + + private static int getSlotIndex(int var0, int var1) { + return var0 & var1 - 1; + } + + public Object lookup(int var1) { + int var2 = computeHash(var1); + + for(HashEntry var3 = this.slots[getSlotIndex(var2, this.slots.length)]; var3 != null; var3 = var3.nextEntry) { + if(var3.hashEntry == var1) { + return var3.valueEntry; + } + } + + return null; + } + + public void addKey(int var1, Object var2) { + int var3 = computeHash(var1); + int var4 = getSlotIndex(var3, this.slots.length); + + for(HashEntry var5 = this.slots[var4]; var5 != null; var5 = var5.nextEntry) { + if(var5.hashEntry == var1) { + var5.valueEntry = var2; + } + } + + ++this.versionStamp; + this.insert(var3, var1, var2, var4); + } + + private void grow(int var1) { + HashEntry[] var2 = this.slots; + int var3 = var2.length; + if(var3 == 1073741824) { + this.threshold = Integer.MAX_VALUE; + } else { + HashEntry[] var4 = new HashEntry[var1]; + this.copyTo(var4); + this.slots = var4; + this.threshold = (int)((float)var1 * this.growFactor); + } + } + + private void copyTo(HashEntry[] var1) { + HashEntry[] var2 = this.slots; + int var3 = var1.length; + + for(int var4 = 0; var4 < var2.length; ++var4) { + HashEntry var5 = var2[var4]; + if(var5 != null) { + var2[var4] = null; + + HashEntry var6; + do { + var6 = var5.nextEntry; + int var7 = getSlotIndex(var5.slotHash, var3); + var5.nextEntry = var1[var7]; + var1[var7] = var5; + var5 = var6; + } while(var6 != null); + } + } + + } + + public Object removeObject(int var1) { + HashEntry var2 = this.removeEntry(var1); + return var2 == null ? null : var2.valueEntry; + } + + final HashEntry removeEntry(int var1) { + int var2 = computeHash(var1); + int var3 = getSlotIndex(var2, this.slots.length); + HashEntry var4 = this.slots[var3]; + + HashEntry var5; + HashEntry var6; + for(var5 = var4; var5 != null; var5 = var6) { + var6 = var5.nextEntry; + if(var5.hashEntry == var1) { + ++this.versionStamp; + --this.count; + if(var4 == var5) { + this.slots[var3] = var6; + } else { + var4.nextEntry = var6; + } + + return var5; + } + + var4 = var5; + } + + return var5; + } + + public void clearMap() { + ++this.versionStamp; + HashEntry[] var1 = this.slots; + + for(int var2 = 0; var2 < var1.length; ++var2) { + var1[var2] = null; + } + + this.count = 0; + } + + private void insert(int var1, int var2, Object var3, int var4) { + HashEntry var5 = this.slots[var4]; + this.slots[var4] = new HashEntry(var1, var2, var3, var5); + if(this.count++ >= this.threshold) { + this.grow(2 * this.slots.length); + } + + } + + static int getHash(int var0) { + return computeHash(var0); + } +} diff --git a/src/main/java/net/minecraft/src/MapGenBase.java b/src/main/java/net/minecraft/src/MapGenBase.java new file mode 100644 index 0000000..604b462 --- /dev/null +++ b/src/main/java/net/minecraft/src/MapGenBase.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +import java.util.Random; + +public class MapGenBase { + protected int field_1306_a = 8; + protected Random field_1305_b = new Random(); + + public void func_867_a(IChunkProvider var1, World var2, int var3, int var4, byte[] var5) { + int var6 = this.field_1306_a; + this.field_1305_b.setSeed(var2.randomSeed); + long var7 = this.field_1305_b.nextLong() / 2L * 2L + 1L; + long var9 = this.field_1305_b.nextLong() / 2L * 2L + 1L; + + for(int var11 = var3 - var6; var11 <= var3 + var6; ++var11) { + for(int var12 = var4 - var6; var12 <= var4 + var6; ++var12) { + this.field_1305_b.setSeed((long)var11 * var7 + (long)var12 * var9 ^ var2.randomSeed); + this.func_868_a(var2, var11, var12, var3, var4, var5); + } + } + + } + + protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) { + } +} diff --git a/src/main/java/net/minecraft/src/MapGenCaves.java b/src/main/java/net/minecraft/src/MapGenCaves.java new file mode 100644 index 0000000..747c2ba --- /dev/null +++ b/src/main/java/net/minecraft/src/MapGenCaves.java @@ -0,0 +1,185 @@ +package net.minecraft.src; + +import java.util.Random; + +public class MapGenCaves extends MapGenBase { + protected void func_870_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) { + this.func_869_a(var1, var2, var3, var4, var6, var8, 1.0F + this.field_1305_b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + } + + protected void func_869_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + double var17 = (double)(var1 * 16 + 8); + double var19 = (double)(var2 * 16 + 8); + float var21 = 0.0F; + float var22 = 0.0F; + Random var23 = new Random(this.field_1305_b.nextLong()); + if(var14 <= 0) { + int var24 = this.field_1306_a * 16 - 16; + var14 = var24 - var23.nextInt(var24 / 4); + } + + boolean var52 = false; + if(var13 == -1) { + var13 = var14 / 2; + var52 = true; + } + + int var25 = var23.nextInt(var14 / 2) + var14 / 4; + + for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) { + double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F); + double var29 = var27 * var15; + float var31 = MathHelper.cos(var12); + float var32 = MathHelper.sin(var12); + var4 += (double)(MathHelper.cos(var11) * var31); + var6 += (double)var32; + var8 += (double)(MathHelper.sin(var11) * var31); + if(var26) { + var12 *= 0.92F; + } else { + var12 *= 0.7F; + } + + var12 += var22 * 0.1F; + var11 += var21 * 0.1F; + var22 *= 0.9F; + var21 *= 12.0F / 16.0F; + var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F; + var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F; + if(!var52 && var13 == var25 && var10 > 1.0F) { + this.func_869_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + this.func_869_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + return; + } + + if(var52 || var23.nextInt(4) != 0) { + double var33 = var4 - var17; + double var35 = var8 - var19; + double var37 = (double)(var14 - var13); + double var39 = (double)(var10 + 2.0F + 16.0F); + if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) { + return; + } + + if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) { + int var53 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1; + int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1; + int var54 = MathHelper.floor_double(var6 - var29) - 1; + int var36 = MathHelper.floor_double(var6 + var29) + 1; + int var55 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1; + int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1; + if(var53 < 0) { + var53 = 0; + } + + if(var34 > 16) { + var34 = 16; + } + + if(var54 < 1) { + var54 = 1; + } + + if(var36 > 120) { + var36 = 120; + } + + if(var55 < 0) { + var55 = 0; + } + + if(var38 > 16) { + var38 = 16; + } + + boolean var56 = false; + + int var40; + int var43; + for(var40 = var53; !var56 && var40 < var34; ++var40) { + for(int var41 = var55; !var56 && var41 < var38; ++var41) { + for(int var42 = var36 + 1; !var56 && var42 >= var54 - 1; --var42) { + var43 = (var40 * 16 + var41) * 128 + var42; + if(var42 >= 0 && var42 < 128) { + if(var3[var43] == Block.waterStill.blockID || var3[var43] == Block.waterMoving.blockID) { + var56 = true; + } + + if(var42 != var54 - 1 && var40 != var53 && var40 != var34 - 1 && var41 != var55 && var41 != var38 - 1) { + var42 = var54; + } + } + } + } + } + + if(!var56) { + for(var40 = var53; var40 < var34; ++var40) { + double var57 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27; + + for(var43 = var55; var43 < var38; ++var43) { + double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27; + int var46 = (var40 * 16 + var43) * 128 + var36; + boolean var47 = false; + + for(int var48 = var36 - 1; var48 >= var54; --var48) { + double var49 = ((double)var48 + 0.5D - var6) / var29; + if(var49 > -0.7D && var57 * var57 + var49 * var49 + var44 * var44 < 1.0D) { + byte var51 = var3[var46]; + if(var51 == Block.grass.blockID) { + var47 = true; + } + + if(var51 == Block.stone.blockID || var51 == Block.dirt.blockID || var51 == Block.grass.blockID) { + if(var48 < 10) { + var3[var46] = (byte)Block.lavaStill.blockID; + } else { + var3[var46] = 0; + if(var47 && var3[var46 - 1] == Block.dirt.blockID) { + var3[var46 - 1] = (byte)Block.grass.blockID; + } + } + } + } + + --var46; + } + } + } + + if(var52) { + break; + } + } + } + } + } + + } + + protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) { + int var7 = this.field_1305_b.nextInt(this.field_1305_b.nextInt(this.field_1305_b.nextInt(40) + 1) + 1); + if(this.field_1305_b.nextInt(15) != 0) { + var7 = 0; + } + + for(int var8 = 0; var8 < var7; ++var8) { + double var9 = (double)(var2 * 16 + this.field_1305_b.nextInt(16)); + double var11 = (double)this.field_1305_b.nextInt(this.field_1305_b.nextInt(120) + 8); + double var13 = (double)(var3 * 16 + this.field_1305_b.nextInt(16)); + int var15 = 1; + if(this.field_1305_b.nextInt(4) == 0) { + this.func_870_a(var4, var5, var6, var9, var11, var13); + var15 += this.field_1305_b.nextInt(4); + } + + for(int var16 = 0; var16 < var15; ++var16) { + float var17 = this.field_1305_b.nextFloat() * (float)Math.PI * 2.0F; + float var18 = (this.field_1305_b.nextFloat() - 0.5F) * 2.0F / 8.0F; + float var19 = this.field_1305_b.nextFloat() * 2.0F + this.field_1305_b.nextFloat(); + this.func_869_a(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/MapGenCavesHell.java b/src/main/java/net/minecraft/src/MapGenCavesHell.java new file mode 100644 index 0000000..4927c18 --- /dev/null +++ b/src/main/java/net/minecraft/src/MapGenCavesHell.java @@ -0,0 +1,173 @@ +package net.minecraft.src; + +import java.util.Random; + +public class MapGenCavesHell extends MapGenBase { + protected void func_4129_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) { + this.func_4128_a(var1, var2, var3, var4, var6, var8, 1.0F + this.field_1305_b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + } + + protected void func_4128_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) { + double var17 = (double)(var1 * 16 + 8); + double var19 = (double)(var2 * 16 + 8); + float var21 = 0.0F; + float var22 = 0.0F; + Random var23 = new Random(this.field_1305_b.nextLong()); + if(var14 <= 0) { + int var24 = this.field_1306_a * 16 - 16; + var14 = var24 - var23.nextInt(var24 / 4); + } + + boolean var51 = false; + if(var13 == -1) { + var13 = var14 / 2; + var51 = true; + } + + int var25 = var23.nextInt(var14 / 2) + var14 / 4; + + for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) { + double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F); + double var29 = var27 * var15; + float var31 = MathHelper.cos(var12); + float var32 = MathHelper.sin(var12); + var4 += (double)(MathHelper.cos(var11) * var31); + var6 += (double)var32; + var8 += (double)(MathHelper.sin(var11) * var31); + if(var26) { + var12 *= 0.92F; + } else { + var12 *= 0.7F; + } + + var12 += var22 * 0.1F; + var11 += var21 * 0.1F; + var22 *= 0.9F; + var21 *= 12.0F / 16.0F; + var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F; + var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F; + if(!var51 && var13 == var25 && var10 > 1.0F) { + this.func_4128_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + this.func_4128_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D); + return; + } + + if(var51 || var23.nextInt(4) != 0) { + double var33 = var4 - var17; + double var35 = var8 - var19; + double var37 = (double)(var14 - var13); + double var39 = (double)(var10 + 2.0F + 16.0F); + if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) { + return; + } + + if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) { + int var52 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1; + int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1; + int var53 = MathHelper.floor_double(var6 - var29) - 1; + int var36 = MathHelper.floor_double(var6 + var29) + 1; + int var54 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1; + int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1; + if(var52 < 0) { + var52 = 0; + } + + if(var34 > 16) { + var34 = 16; + } + + if(var53 < 1) { + var53 = 1; + } + + if(var36 > 120) { + var36 = 120; + } + + if(var54 < 0) { + var54 = 0; + } + + if(var38 > 16) { + var38 = 16; + } + + boolean var55 = false; + + int var40; + int var43; + for(var40 = var52; !var55 && var40 < var34; ++var40) { + for(int var41 = var54; !var55 && var41 < var38; ++var41) { + for(int var42 = var36 + 1; !var55 && var42 >= var53 - 1; --var42) { + var43 = (var40 * 16 + var41) * 128 + var42; + if(var42 >= 0 && var42 < 128) { + if(var3[var43] == Block.lavaStill.blockID || var3[var43] == Block.lavaMoving.blockID) { + var55 = true; + } + + if(var42 != var53 - 1 && var40 != var52 && var40 != var34 - 1 && var41 != var54 && var41 != var38 - 1) { + var42 = var53; + } + } + } + } + } + + if(!var55) { + for(var40 = var52; var40 < var34; ++var40) { + double var56 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27; + + for(var43 = var54; var43 < var38; ++var43) { + double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27; + int var46 = (var40 * 16 + var43) * 128 + var36; + + for(int var47 = var36 - 1; var47 >= var53; --var47) { + double var48 = ((double)var47 + 0.5D - var6) / var29; + if(var48 > -0.7D && var56 * var56 + var48 * var48 + var44 * var44 < 1.0D) { + byte var50 = var3[var46]; + if(var50 == Block.bloodStone.blockID || var50 == Block.dirt.blockID || var50 == Block.grass.blockID) { + var3[var46] = 0; + } + } + + --var46; + } + } + } + + if(var51) { + break; + } + } + } + } + } + + } + + protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) { + int var7 = this.field_1305_b.nextInt(this.field_1305_b.nextInt(this.field_1305_b.nextInt(10) + 1) + 1); + if(this.field_1305_b.nextInt(5) != 0) { + var7 = 0; + } + + for(int var8 = 0; var8 < var7; ++var8) { + double var9 = (double)(var2 * 16 + this.field_1305_b.nextInt(16)); + double var11 = (double)this.field_1305_b.nextInt(128); + double var13 = (double)(var3 * 16 + this.field_1305_b.nextInt(16)); + int var15 = 1; + if(this.field_1305_b.nextInt(4) == 0) { + this.func_4129_a(var4, var5, var6, var9, var11, var13); + var15 += this.field_1305_b.nextInt(4); + } + + for(int var16 = 0; var16 < var15; ++var16) { + float var17 = this.field_1305_b.nextFloat() * (float)Math.PI * 2.0F; + float var18 = (this.field_1305_b.nextFloat() - 0.5F) * 2.0F / 8.0F; + float var19 = this.field_1305_b.nextFloat() * 2.0F + this.field_1305_b.nextFloat(); + this.func_4128_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/Material.java b/src/main/java/net/minecraft/src/Material.java new file mode 100644 index 0000000..6e4f755 --- /dev/null +++ b/src/main/java/net/minecraft/src/Material.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +public class Material { + public static final Material air = new MaterialTransparent(); + public static final Material ground = new Material(); + public static final Material wood = (new Material()).setBurning(); + public static final Material rock = new Material(); + public static final Material iron = new Material(); + public static final Material water = new MaterialLiquid(); + public static final Material lava = new MaterialLiquid(); + public static final Material leaves = (new Material()).setBurning(); + public static final Material plants = new MaterialLogic(); + public static final Material sponge = new Material(); + public static final Material cloth = (new Material()).setBurning(); + public static final Material fire = new MaterialTransparent(); + public static final Material sand = new Material(); + public static final Material circuits = new MaterialLogic(); + public static final Material glass = new Material(); + public static final Material tnt = (new Material()).setBurning(); + public static final Material unused = new Material(); + public static final Material ice = new Material(); + public static final Material snow = new MaterialLogic(); + public static final Material builtSnow = new Material(); + public static final Material cactus = new Material(); + public static final Material clay = new Material(); + public static final Material pumpkin = new Material(); + public static final Material field_4260_x = new Material(); + private boolean canBurn; + + public boolean getIsLiquid() { + return false; + } + + public boolean func_878_a() { + return true; + } + + public boolean getCanBlockGrass() { + return true; + } + + public boolean func_880_c() { + return true; + } + + private Material setBurning() { + this.canBurn = true; + return this; + } + + public boolean getBurning() { + return this.canBurn; + } +} diff --git a/src/main/java/net/minecraft/src/MaterialLiquid.java b/src/main/java/net/minecraft/src/MaterialLiquid.java new file mode 100644 index 0000000..33fba01 --- /dev/null +++ b/src/main/java/net/minecraft/src/MaterialLiquid.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class MaterialLiquid extends Material { + public boolean getIsLiquid() { + return true; + } + + public boolean func_880_c() { + return false; + } + + public boolean func_878_a() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/MaterialLogic.java b/src/main/java/net/minecraft/src/MaterialLogic.java new file mode 100644 index 0000000..ffd1400 --- /dev/null +++ b/src/main/java/net/minecraft/src/MaterialLogic.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class MaterialLogic extends Material { + public boolean func_878_a() { + return false; + } + + public boolean getCanBlockGrass() { + return false; + } + + public boolean func_880_c() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/MaterialTransparent.java b/src/main/java/net/minecraft/src/MaterialTransparent.java new file mode 100644 index 0000000..9242549 --- /dev/null +++ b/src/main/java/net/minecraft/src/MaterialTransparent.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class MaterialTransparent extends Material { + public boolean func_878_a() { + return false; + } + + public boolean getCanBlockGrass() { + return false; + } + + public boolean func_880_c() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/MathHelper.java b/src/main/java/net/minecraft/src/MathHelper.java new file mode 100644 index 0000000..bd32d54 --- /dev/null +++ b/src/main/java/net/minecraft/src/MathHelper.java @@ -0,0 +1,58 @@ +package net.minecraft.src; + +public class MathHelper { + private static float[] SIN_TABLE = new float[65536]; + + public static final float sin(float var0) { + return SIN_TABLE[(int)(var0 * 10430.378F) & '\uffff']; + } + + public static final float cos(float var0) { + return SIN_TABLE[(int)(var0 * 10430.378F + 16384.0F) & '\uffff']; + } + + public static final float sqrt_float(float var0) { + return (float)Math.sqrt((double)var0); + } + + public static final float sqrt_double(double var0) { + return (float)Math.sqrt(var0); + } + + public static int floor_float(float var0) { + int var1 = (int)var0; + return var0 < (float)var1 ? var1 - 1 : var1; + } + + public static int floor_double(double var0) { + int var2 = (int)var0; + return var0 < (double)var2 ? var2 - 1 : var2; + } + + public static float abs(float var0) { + return var0 >= 0.0F ? var0 : -var0; + } + + public static double abs_max(double var0, double var2) { + if(var0 < 0.0D) { + var0 = -var0; + } + + if(var2 < 0.0D) { + var2 = -var2; + } + + return var0 > var2 ? var0 : var2; + } + + public static int bucketInt(int var0, int var1) { + return var0 < 0 ? -((-var0 - 1) / var1) - 1 : var0 / var1; + } + + static { + for(int var0 = 0; var0 < 65536; ++var0) { + SIN_TABLE[var0] = (float)Math.sin((double)var0 * Math.PI * 2.0D / 65536.0D); + } + + } +} diff --git a/src/main/java/net/minecraft/src/MetadataChunkBlock.java b/src/main/java/net/minecraft/src/MetadataChunkBlock.java new file mode 100644 index 0000000..6fcbc2c --- /dev/null +++ b/src/main/java/net/minecraft/src/MetadataChunkBlock.java @@ -0,0 +1,175 @@ +package net.minecraft.src; + +public class MetadataChunkBlock { + public final EnumSkyBlock field_1299_a; + public int field_1298_b; + public int field_1304_c; + public int field_1303_d; + public int field_1302_e; + public int field_1301_f; + public int field_1300_g; + + public MetadataChunkBlock(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) { + this.field_1299_a = var1; + this.field_1298_b = var2; + this.field_1304_c = var3; + this.field_1303_d = var4; + this.field_1302_e = var5; + this.field_1301_f = var6; + this.field_1300_g = var7; + } + + public void func_4127_a(World var1) { + int var2 = this.field_1302_e - this.field_1298_b + 1; + int var3 = this.field_1301_f - this.field_1304_c + 1; + int var4 = this.field_1300_g - this.field_1303_d + 1; + int var5 = var2 * var3 * var4; + if(var5 <= -Short.MIN_VALUE) { + for(int var6 = this.field_1298_b; var6 <= this.field_1302_e; ++var6) { + for(int var7 = this.field_1303_d; var7 <= this.field_1300_g; ++var7) { + if(var1.blockExists(var6, 0, var7)) { + for(int var8 = this.field_1304_c; var8 <= this.field_1301_f; ++var8) { + if(var8 >= 0 && var8 < 128) { + int var9 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7); + boolean var10 = false; + int var11 = var1.getBlockId(var6, var8, var7); + int var12 = Block.lightOpacity[var11]; + if(var12 == 0) { + var12 = 1; + } + + int var13 = 0; + if(this.field_1299_a == EnumSkyBlock.Sky) { + if(var1.canExistingBlockSeeTheSky(var6, var8, var7)) { + var13 = 15; + } + } else if(this.field_1299_a == EnumSkyBlock.Block) { + var13 = Block.lightValue[var11]; + } + + int var14; + int var20; + if(var12 >= 15 && var13 == 0) { + var20 = 0; + } else { + var14 = var1.getSavedLightValue(this.field_1299_a, var6 - 1, var8, var7); + int var15 = var1.getSavedLightValue(this.field_1299_a, var6 + 1, var8, var7); + int var16 = var1.getSavedLightValue(this.field_1299_a, var6, var8 - 1, var7); + int var17 = var1.getSavedLightValue(this.field_1299_a, var6, var8 + 1, var7); + int var18 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7 - 1); + int var19 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7 + 1); + var20 = var14; + if(var15 > var14) { + var20 = var15; + } + + if(var16 > var20) { + var20 = var16; + } + + if(var17 > var20) { + var20 = var17; + } + + if(var18 > var20) { + var20 = var18; + } + + if(var19 > var20) { + var20 = var19; + } + + var20 -= var12; + if(var20 < 0) { + var20 = 0; + } + + if(var13 > var20) { + var20 = var13; + } + } + + if(var9 != var20) { + var1.setLightValue(this.field_1299_a, var6, var8, var7, var20); + var14 = var20 - 1; + if(var14 < 0) { + var14 = 0; + } + + var1.neighborLightPropagationChanged(this.field_1299_a, var6 - 1, var8, var7, var14); + var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8 - 1, var7, var14); + var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8, var7 - 1, var14); + if(var6 + 1 >= this.field_1302_e) { + var1.neighborLightPropagationChanged(this.field_1299_a, var6 + 1, var8, var7, var14); + } + + if(var8 + 1 >= this.field_1301_f) { + var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8 + 1, var7, var14); + } + + if(var7 + 1 >= this.field_1300_g) { + var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8, var7 + 1, var14); + } + } + } + } + } + } + } + + } + } + + public boolean func_866_a(int var1, int var2, int var3, int var4, int var5, int var6) { + if(var1 >= this.field_1298_b && var2 >= this.field_1304_c && var3 >= this.field_1303_d && var4 <= this.field_1302_e && var5 <= this.field_1301_f && var6 <= this.field_1300_g) { + return true; + } else { + byte var7 = 1; + if(var1 >= this.field_1298_b - var7 && var2 >= this.field_1304_c - var7 && var3 >= this.field_1303_d - var7 && var4 <= this.field_1302_e + var7 && var5 <= this.field_1301_f + var7 && var6 <= this.field_1300_g + var7) { + int var8 = this.field_1302_e - this.field_1298_b; + int var9 = this.field_1301_f - this.field_1304_c; + int var10 = this.field_1300_g - this.field_1303_d; + if(var1 > this.field_1298_b) { + var1 = this.field_1298_b; + } + + if(var2 > this.field_1304_c) { + var2 = this.field_1304_c; + } + + if(var3 > this.field_1303_d) { + var3 = this.field_1303_d; + } + + if(var4 < this.field_1302_e) { + var4 = this.field_1302_e; + } + + if(var5 < this.field_1301_f) { + var5 = this.field_1301_f; + } + + if(var6 < this.field_1300_g) { + var6 = this.field_1300_g; + } + + int var11 = var4 - var1; + int var12 = var5 - var2; + int var13 = var6 - var3; + int var14 = var8 * var9 * var10; + int var15 = var11 * var12 * var13; + if(var15 - var14 <= 2) { + this.field_1298_b = var1; + this.field_1304_c = var2; + this.field_1303_d = var3; + this.field_1302_e = var4; + this.field_1301_f = var5; + this.field_1300_g = var6; + return true; + } + } + + return false; + } + } +} diff --git a/src/main/java/net/minecraft/src/MinecartTrackLogic.java b/src/main/java/net/minecraft/src/MinecartTrackLogic.java new file mode 100644 index 0000000..cf34e8f --- /dev/null +++ b/src/main/java/net/minecraft/src/MinecartTrackLogic.java @@ -0,0 +1,323 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +class MinecartTrackLogic { + private World worldObj; + private int field_1165_c; + private int field_1164_d; + private int field_1163_e; + private int field_1162_f; + private List field_1161_g; + final BlockMinecartTrack field_1160_a; + + public MinecartTrackLogic(BlockMinecartTrack var1, World var2, int var3, int var4, int var5) { + this.field_1160_a = var1; + this.field_1161_g = new ArrayList(); + this.worldObj = var2; + this.field_1165_c = var3; + this.field_1164_d = var4; + this.field_1163_e = var5; + this.field_1162_f = var2.getBlockMetadata(var3, var4, var5); + this.func_789_a(); + } + + private void func_789_a() { + this.field_1161_g.clear(); + if(this.field_1162_f == 0) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)); + } else if(this.field_1162_f == 1) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)); + } else if(this.field_1162_f == 2) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e)); + } else if(this.field_1162_f == 3) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)); + } else if(this.field_1162_f == 4) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)); + } else if(this.field_1162_f == 5) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1)); + } else if(this.field_1162_f == 6) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)); + } else if(this.field_1162_f == 7) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)); + } else if(this.field_1162_f == 8) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)); + } else if(this.field_1162_f == 9) { + this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)); + this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)); + } + + } + + private void func_785_b() { + for(int var1 = 0; var1 < this.field_1161_g.size(); ++var1) { + MinecartTrackLogic var2 = this.func_795_a((ChunkPosition)this.field_1161_g.get(var1)); + if(var2 != null && var2.func_793_b(this)) { + this.field_1161_g.set(var1, new ChunkPosition(var2.field_1165_c, var2.field_1164_d, var2.field_1163_e)); + } else { + this.field_1161_g.remove(var1--); + } + } + + } + + private boolean func_784_a(int var1, int var2, int var3) { + return this.worldObj.getBlockId(var1, var2, var3) == this.field_1160_a.blockID ? true : (this.worldObj.getBlockId(var1, var2 + 1, var3) == this.field_1160_a.blockID ? true : this.worldObj.getBlockId(var1, var2 - 1, var3) == this.field_1160_a.blockID); + } + + private MinecartTrackLogic func_795_a(ChunkPosition var1) { + return this.worldObj.getBlockId(var1.x, var1.y, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y, var1.z) : (this.worldObj.getBlockId(var1.x, var1.y + 1, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y + 1, var1.z) : (this.worldObj.getBlockId(var1.x, var1.y - 1, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y - 1, var1.z) : null)); + } + + private boolean func_793_b(MinecartTrackLogic var1) { + for(int var2 = 0; var2 < this.field_1161_g.size(); ++var2) { + ChunkPosition var3 = (ChunkPosition)this.field_1161_g.get(var2); + if(var3.x == var1.field_1165_c && var3.z == var1.field_1163_e) { + return true; + } + } + + return false; + } + + private boolean func_794_b(int var1, int var2, int var3) { + for(int var4 = 0; var4 < this.field_1161_g.size(); ++var4) { + ChunkPosition var5 = (ChunkPosition)this.field_1161_g.get(var4); + if(var5.x == var1 && var5.z == var3) { + return true; + } + } + + return false; + } + + private int func_790_c() { + int var1 = 0; + if(this.func_784_a(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)) { + ++var1; + } + + if(this.func_784_a(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)) { + ++var1; + } + + if(this.func_784_a(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)) { + ++var1; + } + + if(this.func_784_a(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)) { + ++var1; + } + + return var1; + } + + private boolean func_787_c(MinecartTrackLogic var1) { + if(this.func_793_b(var1)) { + return true; + } else if(this.field_1161_g.size() == 2) { + return false; + } else if(this.field_1161_g.size() == 0) { + return true; + } else { + ChunkPosition var2 = (ChunkPosition)this.field_1161_g.get(0); + return var1.field_1164_d == this.field_1164_d && var2.y == this.field_1164_d ? true : true; + } + } + + private void func_788_d(MinecartTrackLogic var1) { + this.field_1161_g.add(new ChunkPosition(var1.field_1165_c, var1.field_1164_d, var1.field_1163_e)); + boolean var2 = this.func_794_b(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1); + boolean var3 = this.func_794_b(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1); + boolean var4 = this.func_794_b(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e); + boolean var5 = this.func_794_b(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e); + byte var6 = -1; + if(var2 || var3) { + var6 = 0; + } + + if(var4 || var5) { + var6 = 1; + } + + if(var3 && var5 && !var2 && !var4) { + var6 = 6; + } + + if(var3 && var4 && !var2 && !var5) { + var6 = 7; + } + + if(var2 && var4 && !var3 && !var5) { + var6 = 8; + } + + if(var2 && var5 && !var3 && !var4) { + var6 = 9; + } + + if(var6 == 0) { + if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1) == this.field_1160_a.blockID) { + var6 = 4; + } + + if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1) == this.field_1160_a.blockID) { + var6 = 5; + } + } + + if(var6 == 1) { + if(this.worldObj.getBlockId(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) { + var6 = 2; + } + + if(this.worldObj.getBlockId(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) { + var6 = 3; + } + } + + if(var6 < 0) { + var6 = 0; + } + + this.worldObj.setBlockMetadataWithNotify(this.field_1165_c, this.field_1164_d, this.field_1163_e, var6); + } + + private boolean func_786_c(int var1, int var2, int var3) { + MinecartTrackLogic var4 = this.func_795_a(new ChunkPosition(var1, var2, var3)); + if(var4 == null) { + return false; + } else { + var4.func_785_b(); + return var4.func_787_c(this); + } + } + + public void func_792_a(boolean var1) { + boolean var2 = this.func_786_c(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1); + boolean var3 = this.func_786_c(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1); + boolean var4 = this.func_786_c(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e); + boolean var5 = this.func_786_c(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e); + byte var6 = -1; + if((var2 || var3) && !var4 && !var5) { + var6 = 0; + } + + if((var4 || var5) && !var2 && !var3) { + var6 = 1; + } + + if(var3 && var5 && !var2 && !var4) { + var6 = 6; + } + + if(var3 && var4 && !var2 && !var5) { + var6 = 7; + } + + if(var2 && var4 && !var3 && !var5) { + var6 = 8; + } + + if(var2 && var5 && !var3 && !var4) { + var6 = 9; + } + + if(var6 == -1) { + if(var2 || var3) { + var6 = 0; + } + + if(var4 || var5) { + var6 = 1; + } + + if(var1) { + if(var3 && var5) { + var6 = 6; + } + + if(var4 && var3) { + var6 = 7; + } + + if(var5 && var2) { + var6 = 9; + } + + if(var2 && var4) { + var6 = 8; + } + } else { + if(var2 && var4) { + var6 = 8; + } + + if(var5 && var2) { + var6 = 9; + } + + if(var4 && var3) { + var6 = 7; + } + + if(var3 && var5) { + var6 = 6; + } + } + } + + if(var6 == 0) { + if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1) == this.field_1160_a.blockID) { + var6 = 4; + } + + if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1) == this.field_1160_a.blockID) { + var6 = 5; + } + } + + if(var6 == 1) { + if(this.worldObj.getBlockId(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) { + var6 = 2; + } + + if(this.worldObj.getBlockId(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) { + var6 = 3; + } + } + + if(var6 < 0) { + var6 = 0; + } + + this.field_1162_f = var6; + this.func_789_a(); + this.worldObj.setBlockMetadataWithNotify(this.field_1165_c, this.field_1164_d, this.field_1163_e, var6); + + for(int var7 = 0; var7 < this.field_1161_g.size(); ++var7) { + MinecartTrackLogic var8 = this.func_795_a((ChunkPosition)this.field_1161_g.get(var7)); + if(var8 != null) { + var8.func_785_b(); + if(var8.func_787_c(this)) { + var8.func_788_d(this); + } + } + } + + } + + static int func_791_a(MinecartTrackLogic var0) { + return var0.func_790_c(); + } +} diff --git a/src/main/java/net/minecraft/src/MinecraftError.java b/src/main/java/net/minecraft/src/MinecraftError.java new file mode 100644 index 0000000..9a75dec --- /dev/null +++ b/src/main/java/net/minecraft/src/MinecraftError.java @@ -0,0 +1,4 @@ +package net.minecraft.src; + +public class MinecraftError extends Error { +} diff --git a/src/main/java/net/minecraft/src/MinecraftException.java b/src/main/java/net/minecraft/src/MinecraftException.java new file mode 100644 index 0000000..07cfee7 --- /dev/null +++ b/src/main/java/net/minecraft/src/MinecraftException.java @@ -0,0 +1,7 @@ +package net.minecraft.src; + +public class MinecraftException extends RuntimeException { + public MinecraftException(String var1) { + super(var1); + } +} diff --git a/src/main/java/net/minecraft/src/MobSpawnerBase.java b/src/main/java/net/minecraft/src/MobSpawnerBase.java new file mode 100644 index 0000000..23537da --- /dev/null +++ b/src/main/java/net/minecraft/src/MobSpawnerBase.java @@ -0,0 +1,88 @@ +package net.minecraft.src; + +import java.awt.Color; + +public class MobSpawnerBase { + public static final MobSpawnerBase rainforest = (new MobSpawnerBase()).func_4123_b(588342).setBiomeName("Rainforest").func_4124_a(2094168); + public static final MobSpawnerBase swampland = (new MobSpawnerSwamp()).func_4123_b(522674).setBiomeName("Swampland").func_4124_a(9154376); + public static final MobSpawnerBase seasonalForest = (new MobSpawnerBase()).func_4123_b(10215459).setBiomeName("Seasonal Forest"); + public static final MobSpawnerBase forest = (new MobSpawnerBase()).func_4123_b(353825).setBiomeName("Forest").func_4124_a(5159473); + public static final MobSpawnerBase savanna = (new MobSpawnerDesert()).func_4123_b(14278691).setBiomeName("Savanna"); + public static final MobSpawnerBase shrubland = (new MobSpawnerBase()).func_4123_b(10595616).setBiomeName("Shrubland"); + public static final MobSpawnerBase taiga = (new MobSpawnerBase()).func_4123_b(3060051).setBiomeName("Taiga").func_4122_b().func_4124_a(8107825); + public static final MobSpawnerBase desert = (new MobSpawnerDesert()).func_4123_b(16421912).setBiomeName("Desert"); + public static final MobSpawnerBase plains = (new MobSpawnerDesert()).func_4123_b(16767248).setBiomeName("Plains"); + public static final MobSpawnerBase iceDesert = (new MobSpawnerDesert()).func_4123_b(16772499).setBiomeName("Ice Desert").func_4122_b().func_4124_a(12899129); + public static final MobSpawnerBase tundra = (new MobSpawnerBase()).func_4123_b(5762041).setBiomeName("Tundra").func_4122_b().func_4124_a(12899129); + public static final MobSpawnerBase hell = (new MobSpawnerHell()).func_4123_b(16711680).setBiomeName("Hell"); + public String biomeName; + public int field_6503_n; + public byte topBlock = (byte)Block.grass.blockID; + public byte fillerBlock = (byte)Block.dirt.blockID; + public int field_6502_q = 5169201; + protected Class[] biomeMonsters = new Class[]{EntitySpider.class, EntityZombie.class, EntitySkeleton.class, EntityCreeper.class}; + protected Class[] biomeCreatures = new Class[]{EntitySheep.class, EntityPig.class, EntityChicken.class, EntityCow.class}; + private static MobSpawnerBase[] biomeLookupTable = new MobSpawnerBase[4096]; + + public static void generateBiomeLookup() { + for(int var0 = 0; var0 < 64; ++var0) { + for(int var1 = 0; var1 < 64; ++var1) { + biomeLookupTable[var0 + var1 * 64] = getBiome((float)var0 / 63.0F, (float)var1 / 63.0F); + } + } + + desert.topBlock = desert.fillerBlock = (byte)Block.sand.blockID; + iceDesert.topBlock = iceDesert.fillerBlock = (byte)Block.sand.blockID; + } + + protected MobSpawnerBase func_4122_b() { + return this; + } + + protected MobSpawnerBase setBiomeName(String var1) { + this.biomeName = var1; + return this; + } + + protected MobSpawnerBase func_4124_a(int var1) { + this.field_6502_q = var1; + return this; + } + + protected MobSpawnerBase func_4123_b(int var1) { + this.field_6503_n = var1; + return this; + } + + public static MobSpawnerBase getBiomeFromLookup(double var0, double var2) { + int var4 = (int)(var0 * 63.0D); + int var5 = (int)(var2 * 63.0D); + return biomeLookupTable[var4 + var5 * 64]; + } + + public static MobSpawnerBase getBiome(float var0, float var1) { + var1 *= var0; + return var0 < 0.1F ? tundra : (var1 < 0.2F ? (var0 < 0.5F ? tundra : (var0 < 0.95F ? savanna : desert)) : (var1 > 0.5F && var0 < 0.7F ? swampland : (var0 < 0.5F ? taiga : (var0 < 0.97F ? (var1 < 0.35F ? shrubland : forest) : (var1 < 0.45F ? plains : (var1 < 0.9F ? seasonalForest : rainforest)))))); + } + + public int getSkyColorByTemp(float var1) { + var1 /= 3.0F; + if(var1 < -1.0F) { + var1 = -1.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + return Color.getHSBColor(224.0F / 360.0F - var1 * 0.05F, 0.5F + var1 * 0.1F, 1.0F).getRGB(); + } + + public Class[] getEntitiesForType(EnumCreatureType var1) { + return var1 == EnumCreatureType.monster ? this.biomeMonsters : (var1 == EnumCreatureType.creature ? this.biomeCreatures : null); + } + + static { + generateBiomeLookup(); + } +} diff --git a/src/main/java/net/minecraft/src/MobSpawnerDesert.java b/src/main/java/net/minecraft/src/MobSpawnerDesert.java new file mode 100644 index 0000000..cb799d2 --- /dev/null +++ b/src/main/java/net/minecraft/src/MobSpawnerDesert.java @@ -0,0 +1,4 @@ +package net.minecraft.src; + +public class MobSpawnerDesert extends MobSpawnerBase { +} diff --git a/src/main/java/net/minecraft/src/MobSpawnerHell.java b/src/main/java/net/minecraft/src/MobSpawnerHell.java new file mode 100644 index 0000000..8a0b8c0 --- /dev/null +++ b/src/main/java/net/minecraft/src/MobSpawnerHell.java @@ -0,0 +1,8 @@ +package net.minecraft.src; + +public class MobSpawnerHell extends MobSpawnerBase { + public MobSpawnerHell() { + this.biomeMonsters = new Class[]{EntityGhast.class, EntityPigZombie.class}; + this.biomeCreatures = new Class[0]; + } +} diff --git a/src/main/java/net/minecraft/src/MobSpawnerSwamp.java b/src/main/java/net/minecraft/src/MobSpawnerSwamp.java new file mode 100644 index 0000000..36b46a5 --- /dev/null +++ b/src/main/java/net/minecraft/src/MobSpawnerSwamp.java @@ -0,0 +1,4 @@ +package net.minecraft.src; + +public class MobSpawnerSwamp extends MobSpawnerBase { +} diff --git a/src/main/java/net/minecraft/src/ModelBase.java b/src/main/java/net/minecraft/src/ModelBase.java new file mode 100644 index 0000000..4ca3632 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelBase.java @@ -0,0 +1,12 @@ +package net.minecraft.src; + +public abstract class ModelBase { + public float field_1244_k; + public boolean field_1243_l = false; + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + } +} diff --git a/src/main/java/net/minecraft/src/ModelBiped.java b/src/main/java/net/minecraft/src/ModelBiped.java new file mode 100644 index 0000000..5f38f26 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelBiped.java @@ -0,0 +1,141 @@ +package net.minecraft.src; + +public class ModelBiped extends ModelBase { + public ModelRenderer bipedHead; + public ModelRenderer field_1285_b; + public ModelRenderer field_1284_c; + public ModelRenderer bipedRightArm; + public ModelRenderer bipedLeftArm; + public ModelRenderer bipedRightLeg; + public ModelRenderer bipedLeftLeg; + public boolean field_1279_h; + public boolean field_1278_i; + public boolean field_1277_j; + + public ModelBiped() { + this(0.0F); + } + + public ModelBiped(float var1) { + this(var1, 0.0F); + } + + public ModelBiped(float var1, float var2) { + this.field_1279_h = false; + this.field_1278_i = false; + this.field_1277_j = false; + this.bipedHead = new ModelRenderer(0, 0); + this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1); + this.bipedHead.setPosition(0.0F, 0.0F + var2, 0.0F); + this.field_1285_b = new ModelRenderer(32, 0); + this.field_1285_b.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F); + this.field_1285_b.setPosition(0.0F, 0.0F + var2, 0.0F); + this.field_1284_c = new ModelRenderer(16, 16); + this.field_1284_c.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1); + this.field_1284_c.setPosition(0.0F, 0.0F + var2, 0.0F); + this.bipedRightArm = new ModelRenderer(40, 16); + this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, var1); + this.bipedRightArm.setPosition(-5.0F, 2.0F + var2, 0.0F); + this.bipedLeftArm = new ModelRenderer(40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, var1); + this.bipedLeftArm.setPosition(5.0F, 2.0F + var2, 0.0F); + this.bipedRightLeg = new ModelRenderer(0, 16); + this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1); + this.bipedRightLeg.setPosition(-2.0F, 12.0F + var2, 0.0F); + this.bipedLeftLeg = new ModelRenderer(0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1); + this.bipedLeftLeg.setPosition(2.0F, 12.0F + var2, 0.0F); + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.bipedHead.render(var6); + this.field_1284_c.render(var6); + this.bipedRightArm.render(var6); + this.bipedLeftArm.render(var6); + this.bipedRightLeg.render(var6); + this.bipedLeftLeg.render(var6); + this.field_1285_b.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.bipedHead.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.bipedHead.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.field_1285_b.rotateAngleY = this.bipedHead.rotateAngleY; + this.field_1285_b.rotateAngleX = this.bipedHead.rotateAngleX; + this.bipedRightArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 2.0F * var2 * 0.5F; + this.bipedLeftArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 2.0F * var2 * 0.5F; + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + this.bipedRightLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.bipedLeftLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + if(this.field_1243_l) { + this.bipedRightArm.rotateAngleX += (float)Math.PI * -0.2F; + this.bipedLeftArm.rotateAngleX += (float)Math.PI * -0.2F; + this.bipedRightLeg.rotateAngleX = (float)Math.PI * -0.4F; + this.bipedLeftLeg.rotateAngleX = (float)Math.PI * -0.4F; + this.bipedRightLeg.rotateAngleY = (float)Math.PI * 0.1F; + this.bipedLeftLeg.rotateAngleY = (float)Math.PI * -0.1F; + } + + if(this.field_1279_h) { + this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - (float)Math.PI * 0.1F; + } + + if(this.field_1278_i) { + this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - (float)Math.PI * 0.1F; + } + + this.bipedRightArm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + if(this.field_1244_k > -9990.0F) { + float var7 = this.field_1244_k; + this.field_1284_c.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.2F; + this.bipedRightArm.offsetZ = MathHelper.sin(this.field_1284_c.rotateAngleY) * 5.0F; + this.bipedRightArm.offsetX = -MathHelper.cos(this.field_1284_c.rotateAngleY) * 5.0F; + this.bipedLeftArm.offsetZ = -MathHelper.sin(this.field_1284_c.rotateAngleY) * 5.0F; + this.bipedLeftArm.offsetX = MathHelper.cos(this.field_1284_c.rotateAngleY) * 5.0F; + this.bipedRightArm.rotateAngleY += this.field_1284_c.rotateAngleY; + this.bipedLeftArm.rotateAngleY += this.field_1284_c.rotateAngleY; + this.bipedLeftArm.rotateAngleX += this.field_1284_c.rotateAngleY; + var7 = 1.0F - this.field_1244_k; + var7 *= var7; + var7 *= var7; + var7 = 1.0F - var7; + float var8 = MathHelper.sin(var7 * (float)Math.PI); + float var9 = MathHelper.sin(this.field_1244_k * (float)Math.PI) * -(this.bipedHead.rotateAngleX - 0.7F) * (12.0F / 16.0F); + this.bipedRightArm.rotateAngleX = (float)((double)this.bipedRightArm.rotateAngleX - ((double)var8 * 1.2D + (double)var9)); + this.bipedRightArm.rotateAngleY += this.field_1284_c.rotateAngleY * 2.0F; + this.bipedRightArm.rotateAngleZ = MathHelper.sin(this.field_1244_k * (float)Math.PI) * -0.4F; + } + + if(this.field_1277_j) { + this.field_1284_c.rotateAngleX = 0.5F; + this.bipedRightLeg.rotateAngleX -= 0.0F; + this.bipedLeftLeg.rotateAngleX -= 0.0F; + this.bipedRightArm.rotateAngleX += 0.4F; + this.bipedLeftArm.rotateAngleX += 0.4F; + this.bipedRightLeg.offsetZ = 4.0F; + this.bipedLeftLeg.offsetZ = 4.0F; + this.bipedRightLeg.offsetY = 9.0F; + this.bipedLeftLeg.offsetY = 9.0F; + this.bipedHead.offsetY = 1.0F; + } else { + this.field_1284_c.rotateAngleX = 0.0F; + this.bipedRightLeg.offsetZ = 0.0F; + this.bipedLeftLeg.offsetZ = 0.0F; + this.bipedRightLeg.offsetY = 12.0F; + this.bipedLeftLeg.offsetY = 12.0F; + this.bipedHead.offsetY = 0.0F; + } + + this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F; + this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F; + } +} diff --git a/src/main/java/net/minecraft/src/ModelBoat.java b/src/main/java/net/minecraft/src/ModelBoat.java new file mode 100644 index 0000000..4368265 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelBoat.java @@ -0,0 +1,41 @@ +package net.minecraft.src; + +public class ModelBoat extends ModelBase { + public ModelRenderer[] field_1287_a = new ModelRenderer[5]; + + public ModelBoat() { + this.field_1287_a[0] = new ModelRenderer(0, 8); + this.field_1287_a[1] = new ModelRenderer(0, 0); + this.field_1287_a[2] = new ModelRenderer(0, 0); + this.field_1287_a[3] = new ModelRenderer(0, 0); + this.field_1287_a[4] = new ModelRenderer(0, 0); + byte var1 = 24; + byte var2 = 6; + byte var3 = 20; + byte var4 = 4; + this.field_1287_a[0].addBox((float)(-var1 / 2), (float)(-var3 / 2 + 2), -3.0F, var1, var3 - 4, 4, 0.0F); + this.field_1287_a[0].setPosition(0.0F, (float)(0 + var4), 0.0F); + this.field_1287_a[1].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1287_a[1].setPosition((float)(-var1 / 2 + 1), (float)(0 + var4), 0.0F); + this.field_1287_a[2].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1287_a[2].setPosition((float)(var1 / 2 - 1), (float)(0 + var4), 0.0F); + this.field_1287_a[3].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1287_a[3].setPosition(0.0F, (float)(0 + var4), (float)(-var3 / 2 + 1)); + this.field_1287_a[4].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1287_a[4].setPosition(0.0F, (float)(0 + var4), (float)(var3 / 2 - 1)); + this.field_1287_a[0].rotateAngleX = (float)Math.PI * 0.5F; + this.field_1287_a[1].rotateAngleY = (float)Math.PI * 3.0F / 2.0F; + this.field_1287_a[2].rotateAngleY = (float)Math.PI * 0.5F; + this.field_1287_a[3].rotateAngleY = (float)Math.PI; + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + for(int var7 = 0; var7 < 5; ++var7) { + this.field_1287_a[var7].render(var6); + } + + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + } +} diff --git a/src/main/java/net/minecraft/src/ModelChicken.java b/src/main/java/net/minecraft/src/ModelChicken.java new file mode 100644 index 0000000..4a70767 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelChicken.java @@ -0,0 +1,66 @@ +package net.minecraft.src; + +public class ModelChicken extends ModelBase { + public ModelRenderer field_1289_a; + public ModelRenderer field_1288_b; + public ModelRenderer field_1295_c; + public ModelRenderer field_1294_d; + public ModelRenderer field_1293_e; + public ModelRenderer field_1292_f; + public ModelRenderer field_1291_g; + public ModelRenderer field_1290_h; + + public ModelChicken() { + byte var1 = 16; + this.field_1289_a = new ModelRenderer(0, 0); + this.field_1289_a.addBox(-2.0F, -6.0F, -2.0F, 4, 6, 3, 0.0F); + this.field_1289_a.setPosition(0.0F, (float)(-1 + var1), -4.0F); + this.field_1291_g = new ModelRenderer(14, 0); + this.field_1291_g.addBox(-2.0F, -4.0F, -4.0F, 4, 2, 2, 0.0F); + this.field_1291_g.setPosition(0.0F, (float)(-1 + var1), -4.0F); + this.field_1290_h = new ModelRenderer(14, 4); + this.field_1290_h.addBox(-1.0F, -2.0F, -3.0F, 2, 2, 2, 0.0F); + this.field_1290_h.setPosition(0.0F, (float)(-1 + var1), -4.0F); + this.field_1288_b = new ModelRenderer(0, 9); + this.field_1288_b.addBox(-3.0F, -4.0F, -3.0F, 6, 8, 6, 0.0F); + this.field_1288_b.setPosition(0.0F, (float)(0 + var1), 0.0F); + this.field_1295_c = new ModelRenderer(26, 0); + this.field_1295_c.func_921_a(-1.0F, 0.0F, -3.0F, 3, 5, 3); + this.field_1295_c.setPosition(-2.0F, (float)(3 + var1), 1.0F); + this.field_1294_d = new ModelRenderer(26, 0); + this.field_1294_d.func_921_a(-1.0F, 0.0F, -3.0F, 3, 5, 3); + this.field_1294_d.setPosition(1.0F, (float)(3 + var1), 1.0F); + this.field_1293_e = new ModelRenderer(24, 13); + this.field_1293_e.func_921_a(0.0F, 0.0F, -3.0F, 1, 4, 6); + this.field_1293_e.setPosition(-4.0F, (float)(-3 + var1), 0.0F); + this.field_1292_f = new ModelRenderer(24, 13); + this.field_1292_f.func_921_a(-1.0F, 0.0F, -3.0F, 1, 4, 6); + this.field_1292_f.setPosition(4.0F, (float)(-3 + var1), 0.0F); + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.field_1289_a.render(var6); + this.field_1291_g.render(var6); + this.field_1290_h.render(var6); + this.field_1288_b.render(var6); + this.field_1295_c.render(var6); + this.field_1294_d.render(var6); + this.field_1293_e.render(var6); + this.field_1292_f.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.field_1289_a.rotateAngleX = -(var5 / (180.0F / (float)Math.PI)); + this.field_1289_a.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.field_1291_g.rotateAngleX = this.field_1289_a.rotateAngleX; + this.field_1291_g.rotateAngleY = this.field_1289_a.rotateAngleY; + this.field_1290_h.rotateAngleX = this.field_1289_a.rotateAngleX; + this.field_1290_h.rotateAngleY = this.field_1289_a.rotateAngleY; + this.field_1288_b.rotateAngleX = (float)Math.PI * 0.5F; + this.field_1295_c.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.field_1294_d.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.field_1293_e.rotateAngleZ = var3; + this.field_1292_f.rotateAngleZ = -var3; + } +} diff --git a/src/main/java/net/minecraft/src/ModelCow.java b/src/main/java/net/minecraft/src/ModelCow.java new file mode 100644 index 0000000..fad53c6 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelCow.java @@ -0,0 +1,50 @@ +package net.minecraft.src; + +public class ModelCow extends ModelQuadraped { + ModelRenderer udders; + ModelRenderer horn1; + ModelRenderer horn2; + + public ModelCow() { + super(12, 0.0F); + this.head = new ModelRenderer(0, 0); + this.head.addBox(-4.0F, -4.0F, -6.0F, 8, 8, 6, 0.0F); + this.head.setPosition(0.0F, 4.0F, -8.0F); + this.horn1 = new ModelRenderer(22, 0); + this.horn1.addBox(-4.0F, -5.0F, -4.0F, 1, 3, 1, 0.0F); + this.horn1.setPosition(0.0F, 3.0F, -7.0F); + this.horn2 = new ModelRenderer(22, 0); + this.horn2.addBox(4.0F, -5.0F, -4.0F, 1, 3, 1, 0.0F); + this.horn2.setPosition(0.0F, 3.0F, -7.0F); + this.udders = new ModelRenderer(52, 0); + this.udders.addBox(-2.0F, -3.0F, 0.0F, 4, 6, 2, 0.0F); + this.udders.setPosition(0.0F, 14.0F, 6.0F); + this.udders.rotateAngleX = (float)Math.PI * 0.5F; + this.body = new ModelRenderer(18, 4); + this.body.addBox(-6.0F, -10.0F, -7.0F, 12, 18, 10, 0.0F); + this.body.setPosition(0.0F, 5.0F, 2.0F); + --this.leg1.offsetX; + ++this.leg2.offsetX; + this.leg1.offsetZ += 0.0F; + this.leg2.offsetZ += 0.0F; + --this.leg3.offsetX; + ++this.leg4.offsetX; + --this.leg3.offsetZ; + --this.leg4.offsetZ; + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + super.render(var1, var2, var3, var4, var5, var6); + this.horn1.render(var6); + this.horn2.render(var6); + this.udders.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + super.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.horn1.rotateAngleY = this.head.rotateAngleY; + this.horn1.rotateAngleX = this.head.rotateAngleX; + this.horn2.rotateAngleY = this.head.rotateAngleY; + this.horn2.rotateAngleX = this.head.rotateAngleX; + } +} diff --git a/src/main/java/net/minecraft/src/ModelCreeper.java b/src/main/java/net/minecraft/src/ModelCreeper.java new file mode 100644 index 0000000..797c6ea --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelCreeper.java @@ -0,0 +1,56 @@ +package net.minecraft.src; + +public class ModelCreeper extends ModelBase { + public ModelRenderer head; + public ModelRenderer unusedModel; + public ModelRenderer body; + public ModelRenderer leg1; + public ModelRenderer leg2; + public ModelRenderer leg3; + public ModelRenderer leg4; + + public ModelCreeper() { + float var1 = 0.0F; + byte var2 = 4; + this.head = new ModelRenderer(0, 0); + this.head.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1); + this.head.setPosition(0.0F, (float)var2, 0.0F); + this.unusedModel = new ModelRenderer(32, 0); + this.unusedModel.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F); + this.unusedModel.setPosition(0.0F, (float)var2, 0.0F); + this.body = new ModelRenderer(16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1); + this.body.setPosition(0.0F, (float)var2, 0.0F); + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg1.setPosition(-2.0F, (float)(12 + var2), 4.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg2.setPosition(2.0F, (float)(12 + var2), 4.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg3.setPosition(-2.0F, (float)(12 + var2), -4.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg4.setPosition(2.0F, (float)(12 + var2), -4.0F); + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.head.render(var6); + this.body.render(var6); + this.leg1.render(var6); + this.leg2.render(var6); + this.leg3.render(var6); + this.leg4.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.head.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + } +} diff --git a/src/main/java/net/minecraft/src/ModelGhast.java b/src/main/java/net/minecraft/src/ModelGhast.java new file mode 100644 index 0000000..89c7732 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelGhast.java @@ -0,0 +1,45 @@ +package net.minecraft.src; + +import java.util.Random; + +public class ModelGhast extends ModelBase { + ModelRenderer body; + ModelRenderer[] tentacles = new ModelRenderer[9]; + + public ModelGhast() { + byte var1 = -16; + this.body = new ModelRenderer(0, 0); + this.body.func_921_a(-8.0F, -8.0F, -8.0F, 16, 16, 16); + this.body.offsetY += (float)(24 + var1); + Random var2 = new Random(1660L); + + for(int var3 = 0; var3 < this.tentacles.length; ++var3) { + this.tentacles[var3] = new ModelRenderer(0, 0); + float var4 = (((float)(var3 % 3) - (float)(var3 / 3 % 2) * 0.5F + 0.25F) / 2.0F * 2.0F - 1.0F) * 5.0F; + float var5 = ((float)(var3 / 3) / 2.0F * 2.0F - 1.0F) * 5.0F; + int var6 = var2.nextInt(7) + 8; + this.tentacles[var3].func_921_a(-1.0F, 0.0F, -1.0F, 2, var6, 2); + this.tentacles[var3].offsetX = var4; + this.tentacles[var3].offsetZ = var5; + this.tentacles[var3].offsetY = (float)(31 + var1); + } + + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + for(int var7 = 0; var7 < this.tentacles.length; ++var7) { + this.tentacles[var7].rotateAngleX = 0.2F * MathHelper.sin(var3 * 0.3F + (float)var7) + 0.4F; + } + + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.body.render(var6); + + for(int var7 = 0; var7 < this.tentacles.length; ++var7) { + this.tentacles[var7].render(var6); + } + + } +} diff --git a/src/main/java/net/minecraft/src/ModelMinecart.java b/src/main/java/net/minecraft/src/ModelMinecart.java new file mode 100644 index 0000000..868524c --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelMinecart.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +public class ModelMinecart extends ModelBase { + public ModelRenderer[] field_1256_a = new ModelRenderer[7]; + + public ModelMinecart() { + this.field_1256_a[0] = new ModelRenderer(0, 10); + this.field_1256_a[1] = new ModelRenderer(0, 0); + this.field_1256_a[2] = new ModelRenderer(0, 0); + this.field_1256_a[3] = new ModelRenderer(0, 0); + this.field_1256_a[4] = new ModelRenderer(0, 0); + this.field_1256_a[5] = new ModelRenderer(44, 10); + byte var1 = 20; + byte var2 = 8; + byte var3 = 16; + byte var4 = 4; + this.field_1256_a[0].addBox((float)(-var1 / 2), (float)(-var3 / 2), -1.0F, var1, var3, 2, 0.0F); + this.field_1256_a[0].setPosition(0.0F, (float)(0 + var4), 0.0F); + this.field_1256_a[5].addBox((float)(-var1 / 2 + 1), (float)(-var3 / 2 + 1), -1.0F, var1 - 2, var3 - 2, 1, 0.0F); + this.field_1256_a[5].setPosition(0.0F, (float)(0 + var4), 0.0F); + this.field_1256_a[1].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1256_a[1].setPosition((float)(-var1 / 2 + 1), (float)(0 + var4), 0.0F); + this.field_1256_a[2].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1256_a[2].setPosition((float)(var1 / 2 - 1), (float)(0 + var4), 0.0F); + this.field_1256_a[3].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1256_a[3].setPosition(0.0F, (float)(0 + var4), (float)(-var3 / 2 + 1)); + this.field_1256_a[4].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F); + this.field_1256_a[4].setPosition(0.0F, (float)(0 + var4), (float)(var3 / 2 - 1)); + this.field_1256_a[0].rotateAngleX = (float)Math.PI * 0.5F; + this.field_1256_a[1].rotateAngleY = (float)Math.PI * 3.0F / 2.0F; + this.field_1256_a[2].rotateAngleY = (float)Math.PI * 0.5F; + this.field_1256_a[3].rotateAngleY = (float)Math.PI; + this.field_1256_a[5].rotateAngleX = (float)Math.PI * -0.5F; + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.field_1256_a[5].offsetY = 4.0F - var3; + + for(int var7 = 0; var7 < 6; ++var7) { + this.field_1256_a[var7].render(var6); + } + + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + } +} diff --git a/src/main/java/net/minecraft/src/ModelPig.java b/src/main/java/net/minecraft/src/ModelPig.java new file mode 100644 index 0000000..5bc7b47 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelPig.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +public class ModelPig extends ModelQuadraped { + public ModelPig() { + super(6, 0.0F); + } + + public ModelPig(float var1) { + super(6, var1); + } +} diff --git a/src/main/java/net/minecraft/src/ModelQuadraped.java b/src/main/java/net/minecraft/src/ModelQuadraped.java new file mode 100644 index 0000000..a2f2a40 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelQuadraped.java @@ -0,0 +1,50 @@ +package net.minecraft.src; + +public class ModelQuadraped extends ModelBase { + public ModelRenderer head = new ModelRenderer(0, 0); + public ModelRenderer body; + public ModelRenderer leg1; + public ModelRenderer leg2; + public ModelRenderer leg3; + public ModelRenderer leg4; + + public ModelQuadraped(int var1, float var2) { + this.head.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, var2); + this.head.setPosition(0.0F, (float)(18 - var1), -6.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-5.0F, -10.0F, -7.0F, 10, 16, 8, var2); + this.body.setPosition(0.0F, (float)(17 - var1), 2.0F); + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2); + this.leg1.setPosition(-3.0F, (float)(24 - var1), 7.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2); + this.leg2.setPosition(3.0F, (float)(24 - var1), 7.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2); + this.leg3.setPosition(-3.0F, (float)(24 - var1), -5.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2); + this.leg4.setPosition(3.0F, (float)(24 - var1), -5.0F); + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.head.render(var6); + this.body.render(var6); + this.leg1.render(var6); + this.leg2.render(var6); + this.leg3.render(var6); + this.leg4.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.head.rotateAngleX = -(var5 / (180.0F / (float)Math.PI)); + this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.body.rotateAngleX = (float)Math.PI * 0.5F; + this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + } +} diff --git a/src/main/java/net/minecraft/src/ModelRenderer.java b/src/main/java/net/minecraft/src/ModelRenderer.java new file mode 100644 index 0000000..96d8882 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelRenderer.java @@ -0,0 +1,165 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class ModelRenderer { + private PositionTexureVertex[] corners; + private TexturedQuad[] faces; + private int textureOffsetX; + private int textureOffsetY; + public float offsetX; + public float offsetY; + public float offsetZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + private boolean compiled = false; + private int displayList = 0; + public boolean mirror = false; + public boolean field_1403_h = true; + public boolean field_1402_i = false; + + public ModelRenderer(int var1, int var2) { + this.textureOffsetX = var1; + this.textureOffsetY = var2; + } + + public void func_921_a(float var1, float var2, float var3, int var4, int var5, int var6) { + this.addBox(var1, var2, var3, var4, var5, var6, 0.0F); + } + + public void addBox(float var1, float var2, float var3, int var4, int var5, int var6, float var7) { + this.corners = new PositionTexureVertex[8]; + this.faces = new TexturedQuad[6]; + float var8 = var1 + (float)var4; + float var9 = var2 + (float)var5; + float var10 = var3 + (float)var6; + var1 -= var7; + var2 -= var7; + var3 -= var7; + var8 += var7; + var9 += var7; + var10 += var7; + if(this.mirror) { + float var11 = var8; + var8 = var1; + var1 = var11; + } + + PositionTexureVertex var20 = new PositionTexureVertex(var1, var2, var3, 0.0F, 0.0F); + PositionTexureVertex var12 = new PositionTexureVertex(var8, var2, var3, 0.0F, 8.0F); + PositionTexureVertex var13 = new PositionTexureVertex(var8, var9, var3, 8.0F, 8.0F); + PositionTexureVertex var14 = new PositionTexureVertex(var1, var9, var3, 8.0F, 0.0F); + PositionTexureVertex var15 = new PositionTexureVertex(var1, var2, var10, 0.0F, 0.0F); + PositionTexureVertex var16 = new PositionTexureVertex(var8, var2, var10, 0.0F, 8.0F); + PositionTexureVertex var17 = new PositionTexureVertex(var8, var9, var10, 8.0F, 8.0F); + PositionTexureVertex var18 = new PositionTexureVertex(var1, var9, var10, 8.0F, 0.0F); + this.corners[0] = var20; + this.corners[1] = var12; + this.corners[2] = var13; + this.corners[3] = var14; + this.corners[4] = var15; + this.corners[5] = var16; + this.corners[6] = var17; + this.corners[7] = var18; + this.faces[0] = new TexturedQuad(new PositionTexureVertex[]{var16, var12, var13, var17}, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6 + var5); + this.faces[1] = new TexturedQuad(new PositionTexureVertex[]{var20, var15, var18, var14}, this.textureOffsetX + 0, this.textureOffsetY + var6, this.textureOffsetX + var6, this.textureOffsetY + var6 + var5); + this.faces[2] = new TexturedQuad(new PositionTexureVertex[]{var16, var15, var20, var12}, this.textureOffsetX + var6, this.textureOffsetY + 0, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6); + this.faces[3] = new TexturedQuad(new PositionTexureVertex[]{var13, var14, var18, var17}, this.textureOffsetX + var6 + var4, this.textureOffsetY + 0, this.textureOffsetX + var6 + var4 + var4, this.textureOffsetY + var6); + this.faces[4] = new TexturedQuad(new PositionTexureVertex[]{var12, var20, var14, var13}, this.textureOffsetX + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6 + var5); + this.faces[5] = new TexturedQuad(new PositionTexureVertex[]{var15, var16, var17, var18}, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6 + var4, this.textureOffsetY + var6 + var5); + if(this.mirror) { + for(int var19 = 0; var19 < this.faces.length; ++var19) { + this.faces[var19].func_809_a(); + } + } + + } + + public void setPosition(float var1, float var2, float var3) { + this.offsetX = var1; + this.offsetY = var2; + this.offsetZ = var3; + } + + public void render(float var1) { + if(!this.field_1402_i) { + if(this.field_1403_h) { + if(!this.compiled) { + this.compileDisplayList(var1); + } + + if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if(this.offsetX == 0.0F && this.offsetY == 0.0F && this.offsetZ == 0.0F) { + GL11.glCallList(this.displayList); + } else { + GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1); + GL11.glCallList(this.displayList); + GL11.glTranslatef(-this.offsetX * var1, -this.offsetY * var1, -this.offsetZ * var1); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1); + if(this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * (180.0F / (float)Math.PI), 0.0F, 0.0F, 1.0F); + } + + if(this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * (180.0F / (float)Math.PI), 0.0F, 1.0F, 0.0F); + } + + if(this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * (180.0F / (float)Math.PI), 1.0F, 0.0F, 0.0F); + } + + GL11.glCallList(this.displayList); + GL11.glPopMatrix(); + } + + } + } + } + + public void func_926_b(float var1) { + if(!this.field_1402_i) { + if(this.field_1403_h) { + if(!this.compiled) { + this.compileDisplayList(var1); + } + + if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if(this.offsetX != 0.0F || this.offsetY != 0.0F || this.offsetZ != 0.0F) { + GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1); + } + } else { + GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1); + if(this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * (180.0F / (float)Math.PI), 0.0F, 0.0F, 1.0F); + } + + if(this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * (180.0F / (float)Math.PI), 0.0F, 1.0F, 0.0F); + } + + if(this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * (180.0F / (float)Math.PI), 1.0F, 0.0F, 0.0F); + } + } + + } + } + } + + private void compileDisplayList(float var1) { + this.displayList = GLAllocation.generateDisplayLists(1); + GL11.glNewList(this.displayList, GL11.GL_COMPILE); + Tessellator var2 = Tessellator.instance; + + for(int var3 = 0; var3 < this.faces.length; ++var3) { + this.faces[var3].func_808_a(var2, var1); + } + + GL11.glEndList(); + this.compiled = true; + } +} diff --git a/src/main/java/net/minecraft/src/ModelSheep1.java b/src/main/java/net/minecraft/src/ModelSheep1.java new file mode 100644 index 0000000..6a5cb8a --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelSheep1.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +public class ModelSheep1 extends ModelQuadraped { + public ModelSheep1() { + super(12, 0.0F); + this.head = new ModelRenderer(0, 0); + this.head.addBox(-3.0F, -4.0F, -4.0F, 6, 6, 6, 0.6F); + this.head.setPosition(0.0F, 6.0F, -8.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 1.75F); + this.body.setPosition(0.0F, 5.0F, 2.0F); + float var1 = 0.5F; + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg1.setPosition(-3.0F, 12.0F, 7.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg2.setPosition(3.0F, 12.0F, 7.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg3.setPosition(-3.0F, 12.0F, -5.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1); + this.leg4.setPosition(3.0F, 12.0F, -5.0F); + } +} diff --git a/src/main/java/net/minecraft/src/ModelSheep2.java b/src/main/java/net/minecraft/src/ModelSheep2.java new file mode 100644 index 0000000..c80dd4b --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelSheep2.java @@ -0,0 +1,13 @@ +package net.minecraft.src; + +public class ModelSheep2 extends ModelQuadraped { + public ModelSheep2() { + super(12, 0.0F); + this.head = new ModelRenderer(0, 0); + this.head.addBox(-3.0F, -4.0F, -6.0F, 6, 6, 8, 0.0F); + this.head.setPosition(0.0F, 6.0F, -8.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 0.0F); + this.body.setPosition(0.0F, 5.0F, 2.0F); + } +} diff --git a/src/main/java/net/minecraft/src/ModelSkeleton.java b/src/main/java/net/minecraft/src/ModelSkeleton.java new file mode 100644 index 0000000..49b4c3d --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelSkeleton.java @@ -0,0 +1,21 @@ +package net.minecraft.src; + +public class ModelSkeleton extends ModelZombie { + public ModelSkeleton() { + float var1 = 0.0F; + this.bipedRightArm = new ModelRenderer(40, 16); + this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, var1); + this.bipedRightArm.setPosition(-5.0F, 2.0F, 0.0F); + this.bipedLeftArm = new ModelRenderer(40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, var1); + this.bipedLeftArm.setPosition(5.0F, 2.0F, 0.0F); + this.bipedRightLeg = new ModelRenderer(0, 16); + this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, var1); + this.bipedRightLeg.setPosition(-2.0F, 12.0F, 0.0F); + this.bipedLeftLeg = new ModelRenderer(0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, var1); + this.bipedLeftLeg.setPosition(2.0F, 12.0F, 0.0F); + } +} diff --git a/src/main/java/net/minecraft/src/ModelSlime.java b/src/main/java/net/minecraft/src/ModelSlime.java new file mode 100644 index 0000000..4c3b0be --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelSlime.java @@ -0,0 +1,38 @@ +package net.minecraft.src; + +public class ModelSlime extends ModelBase { + ModelRenderer field_1258_a; + ModelRenderer field_1257_b; + ModelRenderer field_1260_c; + ModelRenderer field_1259_d; + + public ModelSlime(int var1) { + this.field_1258_a = new ModelRenderer(0, var1); + this.field_1258_a.func_921_a(-4.0F, 16.0F, -4.0F, 8, 8, 8); + if(var1 > 0) { + this.field_1258_a = new ModelRenderer(0, var1); + this.field_1258_a.func_921_a(-3.0F, 17.0F, -3.0F, 6, 6, 6); + this.field_1257_b = new ModelRenderer(32, 0); + this.field_1257_b.func_921_a(-3.25F, 18.0F, -3.5F, 2, 2, 2); + this.field_1260_c = new ModelRenderer(32, 4); + this.field_1260_c.func_921_a(1.25F, 18.0F, -3.5F, 2, 2, 2); + this.field_1259_d = new ModelRenderer(32, 8); + this.field_1259_d.func_921_a(0.0F, 21.0F, -3.5F, 1, 1, 1); + } + + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.field_1258_a.render(var6); + if(this.field_1257_b != null) { + this.field_1257_b.render(var6); + this.field_1260_c.render(var6); + this.field_1259_d.render(var6); + } + + } +} diff --git a/src/main/java/net/minecraft/src/ModelSpider.java b/src/main/java/net/minecraft/src/ModelSpider.java new file mode 100644 index 0000000..1495995 --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelSpider.java @@ -0,0 +1,116 @@ +package net.minecraft.src; + +public class ModelSpider extends ModelBase { + public ModelRenderer field_1255_a; + public ModelRenderer field_1254_b; + public ModelRenderer field_1253_c; + public ModelRenderer field_1252_d; + public ModelRenderer field_1251_e; + public ModelRenderer field_1250_f; + public ModelRenderer field_1249_g; + public ModelRenderer field_1248_h; + public ModelRenderer field_1247_i; + public ModelRenderer field_1246_j; + public ModelRenderer field_1245_m; + + public ModelSpider() { + float var1 = 0.0F; + byte var2 = 15; + this.field_1255_a = new ModelRenderer(32, 4); + this.field_1255_a.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, var1); + this.field_1255_a.setPosition(0.0F, (float)(0 + var2), -3.0F); + this.field_1254_b = new ModelRenderer(0, 0); + this.field_1254_b.addBox(-3.0F, -3.0F, -3.0F, 6, 6, 6, var1); + this.field_1254_b.setPosition(0.0F, (float)var2, 0.0F); + this.field_1253_c = new ModelRenderer(0, 12); + this.field_1253_c.addBox(-5.0F, -4.0F, -6.0F, 10, 8, 12, var1); + this.field_1253_c.setPosition(0.0F, (float)(0 + var2), 9.0F); + this.field_1252_d = new ModelRenderer(18, 0); + this.field_1252_d.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1252_d.setPosition(-4.0F, (float)(0 + var2), 2.0F); + this.field_1251_e = new ModelRenderer(18, 0); + this.field_1251_e.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1251_e.setPosition(4.0F, (float)(0 + var2), 2.0F); + this.field_1250_f = new ModelRenderer(18, 0); + this.field_1250_f.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1250_f.setPosition(-4.0F, (float)(0 + var2), 1.0F); + this.field_1249_g = new ModelRenderer(18, 0); + this.field_1249_g.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1249_g.setPosition(4.0F, (float)(0 + var2), 1.0F); + this.field_1248_h = new ModelRenderer(18, 0); + this.field_1248_h.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1248_h.setPosition(-4.0F, (float)(0 + var2), 0.0F); + this.field_1247_i = new ModelRenderer(18, 0); + this.field_1247_i.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1247_i.setPosition(4.0F, (float)(0 + var2), 0.0F); + this.field_1246_j = new ModelRenderer(18, 0); + this.field_1246_j.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1246_j.setPosition(-4.0F, (float)(0 + var2), -1.0F); + this.field_1245_m = new ModelRenderer(18, 0); + this.field_1245_m.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1); + this.field_1245_m.setPosition(4.0F, (float)(0 + var2), -1.0F); + } + + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, var6); + this.field_1255_a.render(var6); + this.field_1254_b.render(var6); + this.field_1253_c.render(var6); + this.field_1252_d.render(var6); + this.field_1251_e.render(var6); + this.field_1250_f.render(var6); + this.field_1249_g.render(var6); + this.field_1248_h.render(var6); + this.field_1247_i.render(var6); + this.field_1246_j.render(var6); + this.field_1245_m.render(var6); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.field_1255_a.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.field_1255_a.rotateAngleX = var5 / (180.0F / (float)Math.PI); + float var7 = (float)Math.PI * 0.25F; + this.field_1252_d.rotateAngleZ = -var7; + this.field_1251_e.rotateAngleZ = var7; + this.field_1250_f.rotateAngleZ = -var7 * 0.74F; + this.field_1249_g.rotateAngleZ = var7 * 0.74F; + this.field_1248_h.rotateAngleZ = -var7 * 0.74F; + this.field_1247_i.rotateAngleZ = var7 * 0.74F; + this.field_1246_j.rotateAngleZ = -var7; + this.field_1245_m.rotateAngleZ = var7; + float var8 = -0.0F; + float var9 = (float)Math.PI * 0.125F; + this.field_1252_d.rotateAngleY = var9 * 2.0F + var8; + this.field_1251_e.rotateAngleY = -var9 * 2.0F - var8; + this.field_1250_f.rotateAngleY = var9 * 1.0F + var8; + this.field_1249_g.rotateAngleY = -var9 * 1.0F - var8; + this.field_1248_h.rotateAngleY = -var9 * 1.0F + var8; + this.field_1247_i.rotateAngleY = var9 * 1.0F - var8; + this.field_1246_j.rotateAngleY = -var9 * 2.0F + var8; + this.field_1245_m.rotateAngleY = var9 * 2.0F - var8; + float var10 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + 0.0F) * 0.4F) * var2; + float var11 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * var2; + float var12 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 0.5F) * 0.4F) * var2; + float var13 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2; + float var14 = Math.abs(MathHelper.sin(var1 * 0.6662F + 0.0F) * 0.4F) * var2; + float var15 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI) * 0.4F) * var2; + float var16 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 0.5F) * 0.4F) * var2; + float var17 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2; + this.field_1252_d.rotateAngleY += var10; + this.field_1251_e.rotateAngleY += -var10; + this.field_1250_f.rotateAngleY += var11; + this.field_1249_g.rotateAngleY += -var11; + this.field_1248_h.rotateAngleY += var12; + this.field_1247_i.rotateAngleY += -var12; + this.field_1246_j.rotateAngleY += var13; + this.field_1245_m.rotateAngleY += -var13; + this.field_1252_d.rotateAngleZ += var14; + this.field_1251_e.rotateAngleZ += -var14; + this.field_1250_f.rotateAngleZ += var15; + this.field_1249_g.rotateAngleZ += -var15; + this.field_1248_h.rotateAngleZ += var16; + this.field_1247_i.rotateAngleZ += -var16; + this.field_1246_j.rotateAngleZ += var17; + this.field_1245_m.rotateAngleZ += -var17; + } +} diff --git a/src/main/java/net/minecraft/src/ModelZombie.java b/src/main/java/net/minecraft/src/ModelZombie.java new file mode 100644 index 0000000..7d3a64c --- /dev/null +++ b/src/main/java/net/minecraft/src/ModelZombie.java @@ -0,0 +1,21 @@ +package net.minecraft.src; + +public class ModelZombie extends ModelBiped { + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + super.setRotationAngles(var1, var2, var3, var4, var5, var6); + float var7 = MathHelper.sin(this.field_1244_k * (float)Math.PI); + float var8 = MathHelper.sin((1.0F - (1.0F - this.field_1244_k) * (1.0F - this.field_1244_k)) * (float)Math.PI); + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = -(0.1F - var7 * 0.6F); + this.bipedLeftArm.rotateAngleY = 0.1F - var7 * 0.6F; + this.bipedRightArm.rotateAngleX = (float)Math.PI * -0.5F; + this.bipedLeftArm.rotateAngleX = (float)Math.PI * -0.5F; + this.bipedRightArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F; + this.bipedLeftArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F; + this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F; + } +} diff --git a/src/main/java/net/minecraft/src/MouseHelper.java b/src/main/java/net/minecraft/src/MouseHelper.java new file mode 100644 index 0000000..b6175c8 --- /dev/null +++ b/src/main/java/net/minecraft/src/MouseHelper.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +import org.lwjgl.input.Mouse; + +public class MouseHelper { + public int field_1114_a; + public int field_1113_b; + + public MouseHelper() { + } + + public void func_774_a() { + Mouse.setGrabbed(true); + this.field_1114_a = 0; + this.field_1113_b = 0; + } + + public void func_773_b() { + Mouse.setGrabbed(false); + } + + public void func_772_c() { + this.field_1114_a = Mouse.getDX(); + this.field_1113_b = Mouse.getDY(); + } +} diff --git a/src/main/java/net/minecraft/src/MovementInput.java b/src/main/java/net/minecraft/src/MovementInput.java new file mode 100644 index 0000000..b54a860 --- /dev/null +++ b/src/main/java/net/minecraft/src/MovementInput.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +public class MovementInput { + public float field_1174_a = 0.0F; + public float field_1173_b = 0.0F; + public boolean field_1177_c = false; + public boolean field_1176_d = false; + public boolean field_1175_e = false; + + public void func_797_a(EntityPlayer var1) { + } + + public void func_798_a() { + } + + public void func_796_a(int var1, boolean var2) { + } +} diff --git a/src/main/java/net/minecraft/src/MovementInputFromOptions.java b/src/main/java/net/minecraft/src/MovementInputFromOptions.java new file mode 100644 index 0000000..21ace24 --- /dev/null +++ b/src/main/java/net/minecraft/src/MovementInputFromOptions.java @@ -0,0 +1,77 @@ +package net.minecraft.src; + +public class MovementInputFromOptions extends MovementInput { + private boolean[] field_1179_f = new boolean[10]; + private GameSettings field_1178_g; + + public MovementInputFromOptions(GameSettings var1) { + this.field_1178_g = var1; + } + + public void func_796_a(int var1, boolean var2) { + byte var3 = -1; + if(var1 == this.field_1178_g.keyBindForward.keyCode) { + var3 = 0; + } + + if(var1 == this.field_1178_g.keyBindBack.keyCode) { + var3 = 1; + } + + if(var1 == this.field_1178_g.keyBindLeft.keyCode) { + var3 = 2; + } + + if(var1 == this.field_1178_g.keyBindRight.keyCode) { + var3 = 3; + } + + if(var1 == this.field_1178_g.keyBindJump.keyCode) { + var3 = 4; + } + + if(var1 == this.field_1178_g.keyBindSneak.keyCode) { + var3 = 5; + } + + if(var3 >= 0) { + this.field_1179_f[var3] = var2; + } + + } + + public void func_798_a() { + for(int var1 = 0; var1 < 10; ++var1) { + this.field_1179_f[var1] = false; + } + + } + + public void func_797_a(EntityPlayer var1) { + this.field_1174_a = 0.0F; + this.field_1173_b = 0.0F; + if(this.field_1179_f[0]) { + ++this.field_1173_b; + } + + if(this.field_1179_f[1]) { + --this.field_1173_b; + } + + if(this.field_1179_f[2]) { + ++this.field_1174_a; + } + + if(this.field_1179_f[3]) { + --this.field_1174_a; + } + + this.field_1176_d = this.field_1179_f[4]; + this.field_1175_e = this.field_1179_f[5]; + if(this.field_1175_e) { + this.field_1174_a = (float)((double)this.field_1174_a * 0.3D); + this.field_1173_b = (float)((double)this.field_1173_b * 0.3D); + } + + } +} diff --git a/src/main/java/net/minecraft/src/MovingObjectPosition.java b/src/main/java/net/minecraft/src/MovingObjectPosition.java new file mode 100644 index 0000000..764010a --- /dev/null +++ b/src/main/java/net/minecraft/src/MovingObjectPosition.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +public class MovingObjectPosition { + public int typeOfHit; + public int blockX; + public int blockY; + public int blockZ; + public int sideHit; + public Vec3D hitVec; + public Entity entityHit; + + public MovingObjectPosition(int var1, int var2, int var3, int var4, Vec3D var5) { + this.typeOfHit = 0; + this.blockX = var1; + this.blockY = var2; + this.blockZ = var3; + this.sideHit = var4; + this.hitVec = Vec3D.createVector(var5.xCoord, var5.yCoord, var5.zCoord); + } + + public MovingObjectPosition(Entity var1) { + this.typeOfHit = 1; + this.entityHit = var1; + this.hitVec = Vec3D.createVector(var1.posX, var1.posY, var1.posZ); + } +} diff --git a/src/main/java/net/minecraft/src/NBTBase.java b/src/main/java/net/minecraft/src/NBTBase.java new file mode 100644 index 0000000..454b4e7 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTBase.java @@ -0,0 +1,102 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public abstract class NBTBase { + private String key = null; + + abstract void writeTagContents(DataOutput var1) throws IOException; + + abstract void readTagContents(DataInput var1) throws IOException; + + public abstract byte getType(); + + public String getKey() { + return this.key == null ? "" : this.key; + } + + public NBTBase setKey(String var1) { + this.key = var1; + return this; + } + + public static NBTBase readTag(DataInput var0) throws IOException { + byte var1 = var0.readByte(); + if(var1 == 0) { + return new NBTTagEnd(); + } else { + NBTBase var2 = createTagOfType(var1); + var2.key = var0.readUTF(); + var2.readTagContents(var0); + return var2; + } + } + + public static void writeTag(NBTBase var0, DataOutput var1) throws IOException { + var1.writeByte(var0.getType()); + if(var0.getType() != 0) { + var1.writeUTF(var0.getKey()); + var0.writeTagContents(var1); + } + } + + public static NBTBase createTagOfType(byte var0) { + switch(var0) { + case 0: + return new NBTTagEnd(); + case 1: + return new NBTTagByte(); + case 2: + return new NBTTagShort(); + case 3: + return new NBTTagInt(); + case 4: + return new NBTTagLong(); + case 5: + return new NBTTagFloat(); + case 6: + return new NBTTagDouble(); + case 7: + return new NBTTagByteArray(); + case 8: + return new NBTTagString(); + case 9: + return new NBTTagList(); + case 10: + return new NBTTagCompound(); + default: + return null; + } + } + + public static String getTagName(byte var0) { + switch(var0) { + case 0: + return "TAG_End"; + case 1: + return "TAG_Byte"; + case 2: + return "TAG_Short"; + case 3: + return "TAG_Int"; + case 4: + return "TAG_Long"; + case 5: + return "TAG_Float"; + case 6: + return "TAG_Double"; + case 7: + return "TAG_Byte_Array"; + case 8: + return "TAG_String"; + case 9: + return "TAG_List"; + case 10: + return "TAG_Compound"; + default: + return "UNKNOWN"; + } + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagByte.java b/src/main/java/net/minecraft/src/NBTTagByte.java new file mode 100644 index 0000000..3260724 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagByte.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagByte extends NBTBase { + public byte byteValue; + + public NBTTagByte() { + } + + public NBTTagByte(byte var1) { + this.byteValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeByte(this.byteValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.byteValue = var1.readByte(); + } + + public byte getType() { + return (byte)1; + } + + public String toString() { + return "" + this.byteValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagByteArray.java b/src/main/java/net/minecraft/src/NBTTagByteArray.java new file mode 100644 index 0000000..0f58fe1 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagByteArray.java @@ -0,0 +1,35 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagByteArray extends NBTBase { + public byte[] byteArray; + + public NBTTagByteArray() { + } + + public NBTTagByteArray(byte[] var1) { + this.byteArray = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeInt(this.byteArray.length); + var1.write(this.byteArray); + } + + void readTagContents(DataInput var1) throws IOException { + int var2 = var1.readInt(); + this.byteArray = new byte[var2]; + var1.readFully(this.byteArray); + } + + public byte getType() { + return (byte)7; + } + + public String toString() { + return "[" + this.byteArray.length + " bytes]"; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagCompound.java b/src/main/java/net/minecraft/src/NBTTagCompound.java new file mode 100644 index 0000000..20cea63 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagCompound.java @@ -0,0 +1,136 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class NBTTagCompound extends NBTBase { + private Map tagMap = new HashMap(); + + void writeTagContents(DataOutput var1) throws IOException { + Iterator var2 = this.tagMap.values().iterator(); + + while(var2.hasNext()) { + NBTBase var3 = (NBTBase)var2.next(); + NBTBase.writeTag(var3, var1); + } + + var1.writeByte(0); + } + + void readTagContents(DataInput var1) throws IOException { + this.tagMap.clear(); + + while(true) { + NBTBase var2 = NBTBase.readTag(var1); + if(var2.getType() == 0) { + return; + } + + this.tagMap.put(var2.getKey(), var2); + } + } + + public byte getType() { + return (byte)10; + } + + public void setTag(String var1, NBTBase var2) { + this.tagMap.put(var1, var2.setKey(var1)); + } + + public void setByte(String var1, byte var2) { + this.tagMap.put(var1, (new NBTTagByte(var2)).setKey(var1)); + } + + public void setShort(String var1, short var2) { + this.tagMap.put(var1, (new NBTTagShort(var2)).setKey(var1)); + } + + public void setInteger(String var1, int var2) { + this.tagMap.put(var1, (new NBTTagInt(var2)).setKey(var1)); + } + + public void setLong(String var1, long var2) { + this.tagMap.put(var1, (new NBTTagLong(var2)).setKey(var1)); + } + + public void setFloat(String var1, float var2) { + this.tagMap.put(var1, (new NBTTagFloat(var2)).setKey(var1)); + } + + public void setDouble(String var1, double var2) { + this.tagMap.put(var1, (new NBTTagDouble(var2)).setKey(var1)); + } + + public void setString(String var1, String var2) { + this.tagMap.put(var1, (new NBTTagString(var2)).setKey(var1)); + } + + public void setByteArray(String var1, byte[] var2) { + this.tagMap.put(var1, (new NBTTagByteArray(var2)).setKey(var1)); + } + + public void setCompoundTag(String var1, NBTTagCompound var2) { + this.tagMap.put(var1, var2.setKey(var1)); + } + + public void setBoolean(String var1, boolean var2) { + this.setByte(var1, (byte)(var2 ? 1 : 0)); + } + + public boolean hasKey(String var1) { + return this.tagMap.containsKey(var1); + } + + public byte getByte(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagByte)this.tagMap.get(var1)).byteValue; + } + + public short getShort(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagShort)this.tagMap.get(var1)).shortValue; + } + + public int getInteger(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagInt)this.tagMap.get(var1)).intValue; + } + + public long getLong(String var1) { + return !this.tagMap.containsKey(var1) ? 0L : ((NBTTagLong)this.tagMap.get(var1)).longValue; + } + + public float getFloat(String var1) { + return !this.tagMap.containsKey(var1) ? 0.0F : ((NBTTagFloat)this.tagMap.get(var1)).floatValue; + } + + public double getDouble(String var1) { + return !this.tagMap.containsKey(var1) ? 0.0D : ((NBTTagDouble)this.tagMap.get(var1)).doubleValue; + } + + public String getString(String var1) { + return !this.tagMap.containsKey(var1) ? "" : ((NBTTagString)this.tagMap.get(var1)).stringValue; + } + + public byte[] getByteArray(String var1) { + return !this.tagMap.containsKey(var1) ? new byte[0] : ((NBTTagByteArray)this.tagMap.get(var1)).byteArray; + } + + public NBTTagCompound getCompoundTag(String var1) { + return !this.tagMap.containsKey(var1) ? new NBTTagCompound() : (NBTTagCompound)this.tagMap.get(var1); + } + + public NBTTagList getTagList(String var1) { + return !this.tagMap.containsKey(var1) ? new NBTTagList() : (NBTTagList)this.tagMap.get(var1); + } + + public boolean getBoolean(String var1) { + return this.getByte(var1) != 0; + } + + public String toString() { + return "" + this.tagMap.size() + " entries"; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagDouble.java b/src/main/java/net/minecraft/src/NBTTagDouble.java new file mode 100644 index 0000000..cd00968 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagDouble.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagDouble extends NBTBase { + public double doubleValue; + + public NBTTagDouble() { + } + + public NBTTagDouble(double var1) { + this.doubleValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeDouble(this.doubleValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.doubleValue = var1.readDouble(); + } + + public byte getType() { + return (byte)6; + } + + public String toString() { + return "" + this.doubleValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagEnd.java b/src/main/java/net/minecraft/src/NBTTagEnd.java new file mode 100644 index 0000000..a04e7d6 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagEnd.java @@ -0,0 +1,21 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagEnd extends NBTBase { + void readTagContents(DataInput var1) throws IOException { + } + + void writeTagContents(DataOutput var1) throws IOException { + } + + public byte getType() { + return (byte)0; + } + + public String toString() { + return "END"; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagFloat.java b/src/main/java/net/minecraft/src/NBTTagFloat.java new file mode 100644 index 0000000..cf59c93 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagFloat.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagFloat extends NBTBase { + public float floatValue; + + public NBTTagFloat() { + } + + public NBTTagFloat(float var1) { + this.floatValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeFloat(this.floatValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.floatValue = var1.readFloat(); + } + + public byte getType() { + return (byte)5; + } + + public String toString() { + return "" + this.floatValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagInt.java b/src/main/java/net/minecraft/src/NBTTagInt.java new file mode 100644 index 0000000..6dfdfe6 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagInt.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagInt extends NBTBase { + public int intValue; + + public NBTTagInt() { + } + + public NBTTagInt(int var1) { + this.intValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeInt(this.intValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.intValue = var1.readInt(); + } + + public byte getType() { + return (byte)3; + } + + public String toString() { + return "" + this.intValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagList.java b/src/main/java/net/minecraft/src/NBTTagList.java new file mode 100644 index 0000000..3ee8caf --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagList.java @@ -0,0 +1,62 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class NBTTagList extends NBTBase { + private List tagList = new ArrayList(); + private byte tagType; + + void writeTagContents(DataOutput var1) throws IOException { + if(this.tagList.size() > 0) { + this.tagType = ((NBTBase)this.tagList.get(0)).getType(); + } else { + this.tagType = 1; + } + + var1.writeByte(this.tagType); + var1.writeInt(this.tagList.size()); + + for(int var2 = 0; var2 < this.tagList.size(); ++var2) { + ((NBTBase)this.tagList.get(var2)).writeTagContents(var1); + } + + } + + void readTagContents(DataInput var1) throws IOException { + this.tagType = var1.readByte(); + int var2 = var1.readInt(); + this.tagList = new ArrayList(); + + for(int var3 = 0; var3 < var2; ++var3) { + NBTBase var4 = NBTBase.createTagOfType(this.tagType); + var4.readTagContents(var1); + this.tagList.add(var4); + } + + } + + public byte getType() { + return (byte)9; + } + + public String toString() { + return "" + this.tagList.size() + " entries of type " + NBTBase.getTagName(this.tagType); + } + + public void setTag(NBTBase var1) { + this.tagType = var1.getType(); + this.tagList.add(var1); + } + + public NBTBase tagAt(int var1) { + return (NBTBase)this.tagList.get(var1); + } + + public int tagCount() { + return this.tagList.size(); + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagLong.java b/src/main/java/net/minecraft/src/NBTTagLong.java new file mode 100644 index 0000000..646f80d --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagLong.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagLong extends NBTBase { + public long longValue; + + public NBTTagLong() { + } + + public NBTTagLong(long var1) { + this.longValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeLong(this.longValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.longValue = var1.readLong(); + } + + public byte getType() { + return (byte)4; + } + + public String toString() { + return "" + this.longValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagShort.java b/src/main/java/net/minecraft/src/NBTTagShort.java new file mode 100644 index 0000000..3345229 --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagShort.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagShort extends NBTBase { + public short shortValue; + + public NBTTagShort() { + } + + public NBTTagShort(short var1) { + this.shortValue = var1; + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeShort(this.shortValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.shortValue = var1.readShort(); + } + + public byte getType() { + return (byte)2; + } + + public String toString() { + return "" + this.shortValue; + } +} diff --git a/src/main/java/net/minecraft/src/NBTTagString.java b/src/main/java/net/minecraft/src/NBTTagString.java new file mode 100644 index 0000000..93fca6e --- /dev/null +++ b/src/main/java/net/minecraft/src/NBTTagString.java @@ -0,0 +1,35 @@ +package net.minecraft.src; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class NBTTagString extends NBTBase { + public String stringValue; + + public NBTTagString() { + } + + public NBTTagString(String var1) { + this.stringValue = var1; + if(var1 == null) { + throw new IllegalArgumentException("Empty string not allowed"); + } + } + + void writeTagContents(DataOutput var1) throws IOException { + var1.writeUTF(this.stringValue); + } + + void readTagContents(DataInput var1) throws IOException { + this.stringValue = var1.readUTF(); + } + + public byte getType() { + return (byte)8; + } + + public String toString() { + return "" + this.stringValue; + } +} diff --git a/src/main/java/net/minecraft/src/NextTickListEntry.java b/src/main/java/net/minecraft/src/NextTickListEntry.java new file mode 100644 index 0000000..3870d49 --- /dev/null +++ b/src/main/java/net/minecraft/src/NextTickListEntry.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +public class NextTickListEntry implements Comparable { + private static long nextTickEntryID = 0L; + public int xCoord; + public int yCoord; + public int zCoord; + public int blockID; + public long scheduledTime; + private long tickEntryID = nextTickEntryID++; + + public NextTickListEntry(int var1, int var2, int var3, int var4) { + this.xCoord = var1; + this.yCoord = var2; + this.zCoord = var3; + this.blockID = var4; + } + + public boolean equals(Object var1) { + if(!(var1 instanceof NextTickListEntry)) { + return false; + } else { + NextTickListEntry var2 = (NextTickListEntry)var1; + return this.xCoord == var2.xCoord && this.yCoord == var2.yCoord && this.zCoord == var2.zCoord && this.blockID == var2.blockID; + } + } + + public int hashCode() { + return (this.xCoord * 128 * 1024 + this.zCoord * 128 + this.yCoord) * 256 + this.blockID; + } + + public NextTickListEntry setScheduledTime(long var1) { + this.scheduledTime = var1; + return this; + } + + public int a(NextTickListEntry var1) { + return this.scheduledTime < var1.scheduledTime ? -1 : (this.scheduledTime > var1.scheduledTime ? 1 : (this.tickEntryID < var1.tickEntryID ? -1 : (this.tickEntryID > var1.tickEntryID ? 1 : 0))); + } + + public int compareTo(Object var1) { + return this.a((NextTickListEntry)var1); + } +} diff --git a/src/main/java/net/minecraft/src/NibbleArray.java b/src/main/java/net/minecraft/src/NibbleArray.java new file mode 100644 index 0000000..28a1f67 --- /dev/null +++ b/src/main/java/net/minecraft/src/NibbleArray.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +public class NibbleArray { + public final byte[] data; + + public NibbleArray(int var1) { + this.data = new byte[var1 >> 1]; + } + + public NibbleArray(byte[] var1) { + this.data = var1; + } + + public int getNibble(int var1, int var2, int var3) { + int var4 = var1 << 11 | var3 << 7 | var2; + int var5 = var4 >> 1; + int var6 = var4 & 1; + return var6 == 0 ? this.data[var5] & 15 : this.data[var5] >> 4 & 15; + } + + public void setNibble(int var1, int var2, int var3, int var4) { + int var5 = var1 << 11 | var3 << 7 | var2; + int var6 = var5 >> 1; + int var7 = var5 & 1; + if(var7 == 0) { + this.data[var6] = (byte)(this.data[var6] & 240 | var4 & 15); + } else { + this.data[var6] = (byte)(this.data[var6] & 15 | (var4 & 15) << 4); + } + + } + + public boolean isValid() { + return this.data != null; + } +} diff --git a/src/main/java/net/minecraft/src/NoiseGenerator.java b/src/main/java/net/minecraft/src/NoiseGenerator.java new file mode 100644 index 0000000..53e6d05 --- /dev/null +++ b/src/main/java/net/minecraft/src/NoiseGenerator.java @@ -0,0 +1,4 @@ +package net.minecraft.src; + +public abstract class NoiseGenerator { +} diff --git a/src/main/java/net/minecraft/src/NoiseGenerator2.java b/src/main/java/net/minecraft/src/NoiseGenerator2.java new file mode 100644 index 0000000..4ef2a4b --- /dev/null +++ b/src/main/java/net/minecraft/src/NoiseGenerator2.java @@ -0,0 +1,114 @@ +package net.minecraft.src; + +import java.util.Random; + +public class NoiseGenerator2 { + private static int[][] field_4296_d = new int[][]{{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}}; + private int[] field_4295_e; + public double field_4292_a; + public double field_4291_b; + public double field_4297_c; + private static final double field_4294_f = 0.5D * (Math.sqrt(3.0D) - 1.0D); + private static final double field_4293_g = (3.0D - Math.sqrt(3.0D)) / 6.0D; + + public NoiseGenerator2() { + this(new Random()); + } + + public NoiseGenerator2(Random var1) { + this.field_4295_e = new int[512]; + this.field_4292_a = var1.nextDouble() * 256.0D; + this.field_4291_b = var1.nextDouble() * 256.0D; + this.field_4297_c = var1.nextDouble() * 256.0D; + + int var2; + for(var2 = 0; var2 < 256; this.field_4295_e[var2] = var2++) { + } + + for(var2 = 0; var2 < 256; ++var2) { + int var3 = var1.nextInt(256 - var2) + var2; + int var4 = this.field_4295_e[var2]; + this.field_4295_e[var2] = this.field_4295_e[var3]; + this.field_4295_e[var3] = var4; + this.field_4295_e[var2 + 256] = this.field_4295_e[var2]; + } + + } + + private static int func_4155_a(double var0) { + return var0 > 0.0D ? (int)var0 : (int)var0 - 1; + } + + private static double func_4156_a(int[] var0, double var1, double var3) { + return (double)var0[0] * var1 + (double)var0[1] * var3; + } + + public void func_4157_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) { + int var14 = 0; + + for(int var15 = 0; var15 < var6; ++var15) { + double var16 = (var2 + (double)var15) * var8 + this.field_4292_a; + + for(int var18 = 0; var18 < var7; ++var18) { + double var19 = (var4 + (double)var18) * var10 + this.field_4291_b; + double var27 = (var16 + var19) * field_4294_f; + int var29 = func_4155_a(var16 + var27); + int var30 = func_4155_a(var19 + var27); + double var31 = (double)(var29 + var30) * field_4293_g; + double var33 = (double)var29 - var31; + double var35 = (double)var30 - var31; + double var37 = var16 - var33; + double var39 = var19 - var35; + byte var41; + byte var42; + if(var37 > var39) { + var41 = 1; + var42 = 0; + } else { + var41 = 0; + var42 = 1; + } + + double var43 = var37 - (double)var41 + field_4293_g; + double var45 = var39 - (double)var42 + field_4293_g; + double var47 = var37 - 1.0D + 2.0D * field_4293_g; + double var49 = var39 - 1.0D + 2.0D * field_4293_g; + int var51 = var29 & 255; + int var52 = var30 & 255; + int var53 = this.field_4295_e[var51 + this.field_4295_e[var52]] % 12; + int var54 = this.field_4295_e[var51 + var41 + this.field_4295_e[var52 + var42]] % 12; + int var55 = this.field_4295_e[var51 + 1 + this.field_4295_e[var52 + 1]] % 12; + double var56 = 0.5D - var37 * var37 - var39 * var39; + double var21; + if(var56 < 0.0D) { + var21 = 0.0D; + } else { + var56 *= var56; + var21 = var56 * var56 * func_4156_a(field_4296_d[var53], var37, var39); + } + + double var58 = 0.5D - var43 * var43 - var45 * var45; + double var23; + if(var58 < 0.0D) { + var23 = 0.0D; + } else { + var58 *= var58; + var23 = var58 * var58 * func_4156_a(field_4296_d[var54], var43, var45); + } + + double var60 = 0.5D - var47 * var47 - var49 * var49; + double var25; + if(var60 < 0.0D) { + var25 = 0.0D; + } else { + var60 *= var60; + var25 = var60 * var60 * func_4156_a(field_4296_d[var55], var47, var49); + } + + int var10001 = var14++; + var1[var10001] += 70.0D * (var21 + var23 + var25) * var12; + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java new file mode 100644 index 0000000..b159697 --- /dev/null +++ b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java @@ -0,0 +1,53 @@ +package net.minecraft.src; + +import java.util.Random; + +public class NoiseGeneratorOctaves extends NoiseGenerator { + private NoiseGeneratorPerlin[] generatorCollection; + private int field_1191_b; + + public NoiseGeneratorOctaves(Random var1, int var2) { + this.field_1191_b = var2; + this.generatorCollection = new NoiseGeneratorPerlin[var2]; + + for(int var3 = 0; var3 < var2; ++var3) { + this.generatorCollection[var3] = new NoiseGeneratorPerlin(var1); + } + + } + + public double func_806_a(double var1, double var3) { + double var5 = 0.0D; + double var7 = 1.0D; + + for(int var9 = 0; var9 < this.field_1191_b; ++var9) { + var5 += this.generatorCollection[var9].func_801_a(var1 * var7, var3 * var7) / var7; + var7 /= 2.0D; + } + + return var5; + } + + public double[] func_807_a(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15) { + if(var1 == null) { + var1 = new double[var8 * var9 * var10]; + } else { + for(int var17 = 0; var17 < var1.length; ++var17) { + var1[var17] = 0.0D; + } + } + + double var20 = 1.0D; + + for(int var19 = 0; var19 < this.field_1191_b; ++var19) { + this.generatorCollection[var19].func_805_a(var1, var2, var4, var6, var8, var9, var10, var11 * var20, var13 * var20, var15 * var20, var20); + var20 /= 2.0D; + } + + return var1; + } + + public double[] func_4109_a(double[] var1, int var2, int var3, int var4, int var5, double var6, double var8, double var10) { + return this.func_807_a(var1, (double)var2, 10.0D, (double)var3, var4, 1, var5, var6, 1.0D, var8); + } +} diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java new file mode 100644 index 0000000..b8b65f4 --- /dev/null +++ b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java @@ -0,0 +1,45 @@ +package net.minecraft.src; + +import java.util.Random; + +public class NoiseGeneratorOctaves2 extends NoiseGenerator { + private NoiseGenerator2[] field_4234_a; + private int field_4233_b; + + public NoiseGeneratorOctaves2(Random var1, int var2) { + this.field_4233_b = var2; + this.field_4234_a = new NoiseGenerator2[var2]; + + for(int var3 = 0; var3 < var2; ++var3) { + this.field_4234_a[var3] = new NoiseGenerator2(var1); + } + + } + + public double[] func_4112_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) { + return this.func_4111_a(var1, var2, var4, var6, var7, var8, var10, var12, 0.5D); + } + + public double[] func_4111_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12, double var14) { + var8 /= 1.5D; + var10 /= 1.5D; + if(var1 != null && var1.length >= var6 * var7) { + for(int var16 = 0; var16 < var1.length; ++var16) { + var1[var16] = 0.0D; + } + } else { + var1 = new double[var6 * var7]; + } + + double var21 = 1.0D; + double var18 = 1.0D; + + for(int var20 = 0; var20 < this.field_4233_b; ++var20) { + this.field_4234_a[var20].func_4157_a(var1, var2, var4, var6, var7, var8 * var18, var10 * var18, 0.55D / var21); + var18 *= var12; + var21 *= var14; + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java b/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java new file mode 100644 index 0000000..1a159fe --- /dev/null +++ b/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java @@ -0,0 +1,221 @@ +package net.minecraft.src; + +import java.util.Random; + +public class NoiseGeneratorPerlin extends NoiseGenerator { + private int[] permutations; + public double xCoord; + public double yCoord; + public double zCoord; + + public NoiseGeneratorPerlin() { + this(new Random()); + } + + public NoiseGeneratorPerlin(Random var1) { + this.permutations = new int[512]; + this.xCoord = var1.nextDouble() * 256.0D; + this.yCoord = var1.nextDouble() * 256.0D; + this.zCoord = var1.nextDouble() * 256.0D; + + int var2; + for(var2 = 0; var2 < 256; this.permutations[var2] = var2++) { + } + + for(var2 = 0; var2 < 256; ++var2) { + int var3 = var1.nextInt(256 - var2) + var2; + int var4 = this.permutations[var2]; + this.permutations[var2] = this.permutations[var3]; + this.permutations[var3] = var4; + this.permutations[var2 + 256] = this.permutations[var2]; + } + + } + + public double generateNoise(double var1, double var3, double var5) { + double var7 = var1 + this.xCoord; + double var9 = var3 + this.yCoord; + double var11 = var5 + this.zCoord; + int var13 = (int)var7; + int var14 = (int)var9; + int var15 = (int)var11; + if(var7 < (double)var13) { + --var13; + } + + if(var9 < (double)var14) { + --var14; + } + + if(var11 < (double)var15) { + --var15; + } + + int var16 = var13 & 255; + int var17 = var14 & 255; + int var18 = var15 & 255; + var7 -= (double)var13; + var9 -= (double)var14; + var11 -= (double)var15; + double var19 = var7 * var7 * var7 * (var7 * (var7 * 6.0D - 15.0D) + 10.0D); + double var21 = var9 * var9 * var9 * (var9 * (var9 * 6.0D - 15.0D) + 10.0D); + double var23 = var11 * var11 * var11 * (var11 * (var11 * 6.0D - 15.0D) + 10.0D); + int var25 = this.permutations[var16] + var17; + int var26 = this.permutations[var25] + var18; + int var27 = this.permutations[var25 + 1] + var18; + int var28 = this.permutations[var16 + 1] + var17; + int var29 = this.permutations[var28] + var18; + int var30 = this.permutations[var28 + 1] + var18; + return this.lerp(var23, this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26], var7, var9, var11), this.grad(this.permutations[var29], var7 - 1.0D, var9, var11)), this.lerp(var19, this.grad(this.permutations[var27], var7, var9 - 1.0D, var11), this.grad(this.permutations[var30], var7 - 1.0D, var9 - 1.0D, var11))), this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26 + 1], var7, var9, var11 - 1.0D), this.grad(this.permutations[var29 + 1], var7 - 1.0D, var9, var11 - 1.0D)), this.lerp(var19, this.grad(this.permutations[var27 + 1], var7, var9 - 1.0D, var11 - 1.0D), this.grad(this.permutations[var30 + 1], var7 - 1.0D, var9 - 1.0D, var11 - 1.0D)))); + } + + public final double lerp(double var1, double var3, double var5) { + return var3 + var1 * (var5 - var3); + } + + public final double func_4110_a(int var1, double var2, double var4) { + int var6 = var1 & 15; + double var7 = (double)(1 - ((var6 & 8) >> 3)) * var2; + double var9 = var6 < 4 ? 0.0D : (var6 != 12 && var6 != 14 ? var4 : var2); + return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9); + } + + public final double grad(int var1, double var2, double var4, double var6) { + int var8 = var1 & 15; + double var9 = var8 < 8 ? var2 : var4; + double var11 = var8 < 4 ? var4 : (var8 != 12 && var8 != 14 ? var6 : var2); + return ((var8 & 1) == 0 ? var9 : -var9) + ((var8 & 2) == 0 ? var11 : -var11); + } + + public double func_801_a(double var1, double var3) { + return this.generateNoise(var1, var3, 0.0D); + } + + public void func_805_a(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15, double var17) { + int var10001; + int var19; + int var22; + double var31; + double var35; + int var37; + double var38; + int var40; + int var41; + double var42; + int var75; + if(var9 == 1) { + boolean var64 = false; + boolean var65 = false; + boolean var21 = false; + boolean var68 = false; + double var70 = 0.0D; + double var73 = 0.0D; + var75 = 0; + double var77 = 1.0D / var17; + + for(int var30 = 0; var30 < var8; ++var30) { + var31 = (var2 + (double)var30) * var11 + this.xCoord; + int var78 = (int)var31; + if(var31 < (double)var78) { + --var78; + } + + int var34 = var78 & 255; + var31 -= (double)var78; + var35 = var31 * var31 * var31 * (var31 * (var31 * 6.0D - 15.0D) + 10.0D); + + for(var37 = 0; var37 < var10; ++var37) { + var38 = (var6 + (double)var37) * var15 + this.zCoord; + var40 = (int)var38; + if(var38 < (double)var40) { + --var40; + } + + var41 = var40 & 255; + var38 -= (double)var40; + var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D); + var19 = this.permutations[var34] + 0; + int var66 = this.permutations[var19] + var41; + int var67 = this.permutations[var34 + 1] + 0; + var22 = this.permutations[var67] + var41; + var70 = this.lerp(var35, this.func_4110_a(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); + double var79 = this.lerp(var42, var70, var73); + var10001 = var75++; + var1[var10001] += var79 * var77; + } + } + + } else { + var19 = 0; + double var20 = 1.0D / var17; + var22 = -1; + boolean var23 = false; + boolean var24 = false; + boolean var25 = false; + boolean var26 = false; + boolean var27 = false; + boolean var28 = false; + double var29 = 0.0D; + var31 = 0.0D; + double var33 = 0.0D; + var35 = 0.0D; + + for(var37 = 0; var37 < var8; ++var37) { + var38 = (var2 + (double)var37) * var11 + this.xCoord; + var40 = (int)var38; + if(var38 < (double)var40) { + --var40; + } + + var41 = var40 & 255; + var38 -= (double)var40; + var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D); + + for(int var44 = 0; var44 < var10; ++var44) { + double var45 = (var6 + (double)var44) * var15 + this.zCoord; + int var47 = (int)var45; + if(var45 < (double)var47) { + --var47; + } + + int var48 = var47 & 255; + var45 -= (double)var47; + double var49 = var45 * var45 * var45 * (var45 * (var45 * 6.0D - 15.0D) + 10.0D); + + for(int var51 = 0; var51 < var9; ++var51) { + double var52 = (var4 + (double)var51) * var13 + this.yCoord; + int var54 = (int)var52; + if(var52 < (double)var54) { + --var54; + } + + int var55 = var54 & 255; + var52 -= (double)var54; + double var56 = var52 * var52 * var52 * (var52 * (var52 * 6.0D - 15.0D) + 10.0D); + if(var51 == 0 || var55 != var22) { + var22 = var55; + int var69 = this.permutations[var41] + var55; + int var71 = this.permutations[var69] + var48; + int var72 = this.permutations[var69 + 1] + var48; + int var74 = this.permutations[var41 + 1] + var55; + var75 = this.permutations[var74] + var48; + int var76 = this.permutations[var74 + 1] + var48; + var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45)); + var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); + var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); + var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); + } + + double var58 = this.lerp(var56, var29, var31); + double var60 = this.lerp(var56, var33, var35); + double var62 = this.lerp(var49, var58, var60); + var10001 = var19++; + var1[var10001] += var62 * var20; + } + } + } + + } + } +} diff --git a/src/main/java/net/minecraft/src/Path.java b/src/main/java/net/minecraft/src/Path.java new file mode 100644 index 0000000..ce289f0 --- /dev/null +++ b/src/main/java/net/minecraft/src/Path.java @@ -0,0 +1,119 @@ +package net.minecraft.src; + +public class Path { + private PathPoint[] pathPoints = new PathPoint[1024]; + private int count = 0; + + public PathPoint addPoint(PathPoint var1) { + if(var1.index >= 0) { + throw new IllegalStateException("OW KNOWS!"); + } else { + if(this.count == this.pathPoints.length) { + PathPoint[] var2 = new PathPoint[this.count << 1]; + System.arraycopy(this.pathPoints, 0, var2, 0, this.count); + this.pathPoints = var2; + } + + this.pathPoints[this.count] = var1; + var1.index = this.count; + this.sortBack(this.count++); + return var1; + } + } + + public void clearPath() { + this.count = 0; + } + + public PathPoint dequeue() { + PathPoint var1 = this.pathPoints[0]; + this.pathPoints[0] = this.pathPoints[--this.count]; + this.pathPoints[this.count] = null; + if(this.count > 0) { + this.sortForward(0); + } + + var1.index = -1; + return var1; + } + + public void changeDistance(PathPoint var1, float var2) { + float var3 = var1.distanceToTarget; + var1.distanceToTarget = var2; + if(var2 < var3) { + this.sortBack(var1.index); + } else { + this.sortForward(var1.index); + } + + } + + private void sortBack(int var1) { + PathPoint var2 = this.pathPoints[var1]; + + int var4; + for(float var3 = var2.distanceToTarget; var1 > 0; var1 = var4) { + var4 = var1 - 1 >> 1; + PathPoint var5 = this.pathPoints[var4]; + if(var3 >= var5.distanceToTarget) { + break; + } + + this.pathPoints[var1] = var5; + var5.index = var1; + } + + this.pathPoints[var1] = var2; + var2.index = var1; + } + + private void sortForward(int var1) { + PathPoint var2 = this.pathPoints[var1]; + float var3 = var2.distanceToTarget; + + while(true) { + int var4 = 1 + (var1 << 1); + int var5 = var4 + 1; + if(var4 >= this.count) { + break; + } + + PathPoint var6 = this.pathPoints[var4]; + float var7 = var6.distanceToTarget; + PathPoint var8; + float var9; + if(var5 >= this.count) { + var8 = null; + var9 = Float.POSITIVE_INFINITY; + } else { + var8 = this.pathPoints[var5]; + var9 = var8.distanceToTarget; + } + + if(var7 < var9) { + if(var7 >= var3) { + break; + } + + this.pathPoints[var1] = var6; + var6.index = var1; + var1 = var4; + } else { + if(var9 >= var3) { + break; + } + + this.pathPoints[var1] = var8; + var8.index = var1; + var1 = var5; + } + } + + this.pathPoints[var1] = var2; + var2.index = var1; + } + + public boolean isPathEmpty() { + return this.count == 0; + } +} diff --git a/src/main/java/net/minecraft/src/PathEntity.java b/src/main/java/net/minecraft/src/PathEntity.java new file mode 100644 index 0000000..74eacc6 --- /dev/null +++ b/src/main/java/net/minecraft/src/PathEntity.java @@ -0,0 +1,27 @@ +package net.minecraft.src; + +public class PathEntity { + private final PathPoint[] points; + public final int pathLength; + private int pathIndex; + + public PathEntity(PathPoint[] var1) { + this.points = var1; + this.pathLength = var1.length; + } + + public void incrementPathIndex() { + ++this.pathIndex; + } + + public boolean isFinished() { + return this.pathIndex >= this.points.length; + } + + public Vec3D getPosition(Entity var1) { + double var2 = (double)this.points[this.pathIndex].xCoord + (double)((int)(var1.width + 1.0F)) * 0.5D; + double var4 = (double)this.points[this.pathIndex].yCoord; + double var6 = (double)this.points[this.pathIndex].zCoord + (double)((int)(var1.width + 1.0F)) * 0.5D; + return Vec3D.createVector(var2, var4, var6); + } +} diff --git a/src/main/java/net/minecraft/src/PathPoint.java b/src/main/java/net/minecraft/src/PathPoint.java new file mode 100644 index 0000000..7df70dd --- /dev/null +++ b/src/main/java/net/minecraft/src/PathPoint.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +public class PathPoint { + public final int xCoord; + public final int yCoord; + public final int zCoord; + public final int hash; + int index = -1; + float totalPathDistance; + float distanceToNext; + float distanceToTarget; + PathPoint previous; + public boolean isFirst = false; + + public PathPoint(int var1, int var2, int var3) { + this.xCoord = var1; + this.yCoord = var2; + this.zCoord = var3; + this.hash = var1 | var2 << 10 | var3 << 20; + } + + public float distanceTo(PathPoint var1) { + float var2 = (float)(var1.xCoord - this.xCoord); + float var3 = (float)(var1.yCoord - this.yCoord); + float var4 = (float)(var1.zCoord - this.zCoord); + return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4); + } + + public boolean equals(Object var1) { + return ((PathPoint)var1).hash == this.hash; + } + + public int hashCode() { + return this.hash; + } + + public boolean isAssigned() { + return this.index >= 0; + } + + public String toString() { + return this.xCoord + ", " + this.yCoord + ", " + this.zCoord; + } +} diff --git a/src/main/java/net/minecraft/src/Pathfinder.java b/src/main/java/net/minecraft/src/Pathfinder.java new file mode 100644 index 0000000..8ae9b07 --- /dev/null +++ b/src/main/java/net/minecraft/src/Pathfinder.java @@ -0,0 +1,193 @@ +package net.minecraft.src; + +public class Pathfinder { + private IBlockAccess worldMap; + private Path path = new Path(); + private MCHashTable pointMap = new MCHashTable(); + private PathPoint[] pathOptions = new PathPoint[32]; + + public Pathfinder(IBlockAccess var1) { + this.worldMap = var1; + } + + public PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) { + return this.createEntityPathTo(var1, var2.posX, var2.boundingBox.minY, var2.posZ, var3); + } + + public PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) { + return this.createEntityPathTo(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), var5); + } + + private PathEntity createEntityPathTo(Entity var1, double var2, double var4, double var6, float var8) { + this.path.clearPath(); + this.pointMap.clearMap(); + PathPoint var9 = this.openPoint(MathHelper.floor_double(var1.boundingBox.minX), MathHelper.floor_double(var1.boundingBox.minY), MathHelper.floor_double(var1.boundingBox.minZ)); + PathPoint var10 = this.openPoint(MathHelper.floor_double(var2 - (double)(var1.width / 2.0F)), MathHelper.floor_double(var4), MathHelper.floor_double(var6 - (double)(var1.width / 2.0F))); + PathPoint var11 = new PathPoint(MathHelper.floor_float(var1.width + 1.0F), MathHelper.floor_float(var1.height + 1.0F), MathHelper.floor_float(var1.width + 1.0F)); + PathEntity var12 = this.addToPath(var1, var9, var10, var11, var8); + return var12; + } + + private PathEntity addToPath(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) { + var2.totalPathDistance = 0.0F; + var2.distanceToNext = var2.distanceTo(var3); + var2.distanceToTarget = var2.distanceToNext; + this.path.clearPath(); + this.path.addPoint(var2); + PathPoint var6 = var2; + + while(!this.path.isPathEmpty()) { + PathPoint var7 = this.path.dequeue(); + if(var7.hash == var3.hash) { + return this.createEntityPath(var2, var3); + } + + if(var7.distanceTo(var3) < var6.distanceTo(var3)) { + var6 = var7; + } + + var7.isFirst = true; + int var8 = this.findPathOptions(var1, var7, var4, var3, var5); + + for(int var9 = 0; var9 < var8; ++var9) { + PathPoint var10 = this.pathOptions[var9]; + float var11 = var7.totalPathDistance + var7.distanceTo(var10); + if(!var10.isAssigned() || var11 < var10.totalPathDistance) { + var10.previous = var7; + var10.totalPathDistance = var11; + var10.distanceToNext = var10.distanceTo(var3); + if(var10.isAssigned()) { + this.path.changeDistance(var10, var10.totalPathDistance + var10.distanceToNext); + } else { + var10.distanceToTarget = var10.totalPathDistance + var10.distanceToNext; + this.path.addPoint(var10); + } + } + } + } + + if(var6 == var2) { + return null; + } else { + return this.createEntityPath(var2, var6); + } + } + + private int findPathOptions(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) { + int var6 = 0; + byte var7 = 0; + if(this.getVerticalOffset(var1, var2.xCoord, var2.yCoord + 1, var2.zCoord, var3) > 0) { + var7 = 1; + } + + PathPoint var8 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7); + PathPoint var9 = this.getSafePoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7); + PathPoint var10 = this.getSafePoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7); + PathPoint var11 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7); + if(var8 != null && !var8.isFirst && var8.distanceTo(var4) < var5) { + this.pathOptions[var6++] = var8; + } + + if(var9 != null && !var9.isFirst && var9.distanceTo(var4) < var5) { + this.pathOptions[var6++] = var9; + } + + if(var10 != null && !var10.isFirst && var10.distanceTo(var4) < var5) { + this.pathOptions[var6++] = var10; + } + + if(var11 != null && !var11.isFirst && var11.distanceTo(var4) < var5) { + this.pathOptions[var6++] = var11; + } + + return var6; + } + + private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) { + PathPoint var7 = null; + if(this.getVerticalOffset(var1, var2, var3, var4, var5) > 0) { + var7 = this.openPoint(var2, var3, var4); + } + + if(var7 == null && this.getVerticalOffset(var1, var2, var3 + var6, var4, var5) > 0) { + var7 = this.openPoint(var2, var3 + var6, var4); + var3 += var6; + } + + if(var7 != null) { + int var8 = 0; + + for(boolean var9 = false; var3 > 0; --var3) { + int var10 = this.getVerticalOffset(var1, var2, var3 - 1, var4, var5); + if(var10 <= 0) { + break; + } + + if(var10 < 0) { + return null; + } + + ++var8; + if(var8 >= 4) { + return null; + } + } + + if(var3 > 0) { + var7 = this.openPoint(var2, var3, var4); + } + } + + return var7; + } + + private final PathPoint openPoint(int var1, int var2, int var3) { + int var4 = var1 | var2 << 10 | var3 << 20; + PathPoint var5 = (PathPoint)this.pointMap.lookup(var4); + if(var5 == null) { + var5 = new PathPoint(var1, var2, var3); + this.pointMap.addKey(var4, var5); + } + + return var5; + } + + private int getVerticalOffset(Entity var1, int var2, int var3, int var4, PathPoint var5) { + for(int var6 = var2; var6 < var2 + var5.xCoord; ++var6) { + for(int var7 = var3; var7 < var3 + var5.yCoord; ++var7) { + for(int var8 = var4; var8 < var4 + var5.zCoord; ++var8) { + Material var9 = this.worldMap.getBlockMaterial(var2, var3, var4); + if(var9.func_880_c()) { + return 0; + } + + if(var9 == Material.water || var9 == Material.lava) { + return -1; + } + } + } + } + + return 1; + } + + private PathEntity createEntityPath(PathPoint var1, PathPoint var2) { + int var3 = 1; + + PathPoint var4; + for(var4 = var2; var4.previous != null; var4 = var4.previous) { + ++var3; + } + + PathPoint[] var5 = new PathPoint[var3]; + var4 = var2; + --var3; + + for(var5[var3] = var2; var4.previous != null; var5[var3] = var4) { + var4 = var4.previous; + --var3; + } + + return new PathEntity(var5); + } +} diff --git a/src/main/java/net/minecraft/src/PlayerController.java b/src/main/java/net/minecraft/src/PlayerController.java new file mode 100644 index 0000000..ea0f00b --- /dev/null +++ b/src/main/java/net/minecraft/src/PlayerController.java @@ -0,0 +1,90 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +public class PlayerController { + protected final Minecraft mc; + public boolean field_1064_b = false; + + public PlayerController(Minecraft var1) { + this.mc = var1; + } + + public void func_717_a(World var1) { + } + + public void clickBlock(int var1, int var2, int var3, int var4) { + this.sendBlockRemoved(var1, var2, var3, var4); + } + + public boolean sendBlockRemoved(int var1, int var2, int var3, int var4) { + this.mc.field_6321_h.func_1186_a(var1, var2, var3); + World var5 = this.mc.theWorld; + Block var6 = Block.blocksList[var5.getBlockId(var1, var2, var3)]; + int var7 = var5.getBlockMetadata(var1, var2, var3); + boolean var8 = var5.setBlockWithNotify(var1, var2, var3, 0); + if(var6 != null && var8) { + var6.onBlockDestroyedByPlayer(var5, var1, var2, var3, var7); + } + + return var8; + } + + public void sendBlockRemoving(int var1, int var2, int var3, int var4) { + } + + public void func_6468_a() { + } + + public void func_6467_a(float var1) { + } + + public float getBlockReachDistance() { + return 5.0F; + } + + public boolean sendUseItem(EntityPlayer var1, World var2, ItemStack var3) { + int var4 = var3.stackSize; + ItemStack var5 = var3.useItemRightClick(var2, var1); + if(var5 != var3 || var5 != null && var5.stackSize != var4) { + var1.inventory.mainInventory[var1.inventory.currentItem] = var5; + if(var5.stackSize == 0) { + var1.inventory.mainInventory[var1.inventory.currentItem] = null; + } + + return true; + } else { + return false; + } + } + + public void flipPlayer(EntityPlayer var1) { + } + + public void func_6474_c() { + } + + public boolean func_6469_d() { + return true; + } + + public void func_6473_b(EntityPlayer var1) { + } + + public boolean sendPlaceBlock(EntityPlayer var1, World var2, ItemStack var3, int var4, int var5, int var6, int var7) { + int var8 = var2.getBlockId(var4, var5, var6); + return var8 > 0 && Block.blocksList[var8].blockActivated(var2, var4, var5, var6, var1) ? true : (var3 == null ? false : var3.useItem(var1, var2, var4, var5, var6, var7)); + } + + public EntityPlayer func_4087_b(World var1) { + return new EntityPlayerSP(this.mc, var1, this.mc.field_6320_i, var1.worldProvider.field_4218_e); + } + + public void func_6475_a(EntityPlayer var1, Entity var2) { + var1.func_6415_a_(var2); + } + + public void func_6472_b(EntityPlayer var1, Entity var2) { + var1.attackTargetEntityWithCurrentItem(var2); + } +} diff --git a/src/main/java/net/minecraft/src/PlayerControllerSP.java b/src/main/java/net/minecraft/src/PlayerControllerSP.java new file mode 100644 index 0000000..16d31a0 --- /dev/null +++ b/src/main/java/net/minecraft/src/PlayerControllerSP.java @@ -0,0 +1,116 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +public class PlayerControllerSP extends PlayerController { + private int field_1074_c = -1; + private int field_1073_d = -1; + private int field_1072_e = -1; + private float field_1071_f = 0.0F; + private float field_1070_g = 0.0F; + private float field_1069_h = 0.0F; + private int field_1068_i = 0; + + public PlayerControllerSP(Minecraft var1) { + super(var1); + } + + public void flipPlayer(EntityPlayer var1) { + var1.rotationYaw = -180.0F; + } + + public boolean sendBlockRemoved(int var1, int var2, int var3, int var4) { + int var5 = this.mc.theWorld.getBlockId(var1, var2, var3); + int var6 = this.mc.theWorld.getBlockMetadata(var1, var2, var3); + boolean var7 = super.sendBlockRemoved(var1, var2, var3, var4); + ItemStack var8 = this.mc.thePlayer.getCurrentEquippedItem(); + boolean var9 = this.mc.thePlayer.canHarvestBlock(Block.blocksList[var5]); + if(var8 != null) { + var8.hitBlock(var5, var1, var2, var3); + if(var8.stackSize == 0) { + var8.func_1097_a(this.mc.thePlayer); + this.mc.thePlayer.destroyCurrentEquippedItem(); + } + } + + if(var7 && var9) { + Block.blocksList[var5].harvestBlock(this.mc.theWorld, var1, var2, var3, var6); + } + + return var7; + } + + public void clickBlock(int var1, int var2, int var3, int var4) { + int var5 = this.mc.theWorld.getBlockId(var1, var2, var3); + if(var5 > 0 && this.field_1071_f == 0.0F) { + Block.blocksList[var5].onBlockClicked(this.mc.theWorld, var1, var2, var3, this.mc.thePlayer); + } + + if(var5 > 0 && Block.blocksList[var5].func_225_a(this.mc.thePlayer) >= 1.0F) { + this.sendBlockRemoved(var1, var2, var3, var4); + } + + } + + public void func_6468_a() { + this.field_1071_f = 0.0F; + this.field_1068_i = 0; + } + + public void sendBlockRemoving(int var1, int var2, int var3, int var4) { + if(this.field_1068_i > 0) { + --this.field_1068_i; + } else { + if(var1 == this.field_1074_c && var2 == this.field_1073_d && var3 == this.field_1072_e) { + int var5 = this.mc.theWorld.getBlockId(var1, var2, var3); + if(var5 == 0) { + return; + } + + Block var6 = Block.blocksList[var5]; + this.field_1071_f += var6.func_225_a(this.mc.thePlayer); + + ++this.field_1069_h; + if(this.field_1071_f >= 1.0F) { + this.sendBlockRemoved(var1, var2, var3, var4); + this.field_1071_f = 0.0F; + this.field_1070_g = 0.0F; + this.field_1069_h = 0.0F; + this.field_1068_i = 5; + } + } else { + this.field_1071_f = 0.0F; + this.field_1070_g = 0.0F; + this.field_1069_h = 0.0F; + this.field_1074_c = var1; + this.field_1073_d = var2; + this.field_1072_e = var3; + } + + } + } + + public void func_6467_a(float var1) { + if(this.field_1071_f <= 0.0F) { + this.mc.ingameGUI.field_6446_b = 0.0F; + this.mc.field_6323_f.field_1450_i = 0.0F; + } else { + float var2 = this.field_1070_g + (this.field_1071_f - this.field_1070_g) * var1; + this.mc.ingameGUI.field_6446_b = var2; + this.mc.field_6323_f.field_1450_i = var2; + } + + } + + public float getBlockReachDistance() { + return 4.0F; + } + + public void func_717_a(World var1) { + super.func_717_a(var1); + } + + public void func_6474_c() { + this.field_1070_g = this.field_1071_f; + } +} diff --git a/src/main/java/net/minecraft/src/PlayerControllerTest.java b/src/main/java/net/minecraft/src/PlayerControllerTest.java new file mode 100644 index 0000000..f731076 --- /dev/null +++ b/src/main/java/net/minecraft/src/PlayerControllerTest.java @@ -0,0 +1,32 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +public class PlayerControllerTest extends PlayerController { + public PlayerControllerTest(Minecraft var1) { + super(var1); + this.field_1064_b = true; + } + + public void func_6473_b(EntityPlayer var1) { + for(int var2 = 0; var2 < 9; ++var2) { + if(var1.inventory.mainInventory[var2] == null) { + this.mc.thePlayer.inventory.mainInventory[var2] = new ItemStack(((Block)Session.registeredBlocksList.get(var2)).blockID); + } else { + this.mc.thePlayer.inventory.mainInventory[var2].stackSize = 1; + } + } + + } + + public boolean func_6469_d() { + return false; + } + + public void func_717_a(World var1) { + super.func_717_a(var1); + } + + public void func_6474_c() { + } +} diff --git a/src/main/java/net/minecraft/src/PositionTexureVertex.java b/src/main/java/net/minecraft/src/PositionTexureVertex.java new file mode 100644 index 0000000..381f550 --- /dev/null +++ b/src/main/java/net/minecraft/src/PositionTexureVertex.java @@ -0,0 +1,27 @@ +package net.minecraft.src; + +public class PositionTexureVertex { + public Vec3D vector3D; + public float texturePositionX; + public float texturePositionY; + + public PositionTexureVertex(float var1, float var2, float var3, float var4, float var5) { + this(Vec3D.createVectorHelper((double)var1, (double)var2, (double)var3), var4, var5); + } + + public PositionTexureVertex setTexturePosition(float var1, float var2) { + return new PositionTexureVertex(this, var1, var2); + } + + public PositionTexureVertex(PositionTexureVertex var1, float var2, float var3) { + this.vector3D = var1.vector3D; + this.texturePositionX = var2; + this.texturePositionY = var3; + } + + public PositionTexureVertex(Vec3D var1, float var2, float var3) { + this.vector3D = var1; + this.texturePositionX = var2; + this.texturePositionY = var3; + } +} diff --git a/src/main/java/net/minecraft/src/RecipeSorter.java b/src/main/java/net/minecraft/src/RecipeSorter.java new file mode 100644 index 0000000..c5f3f52 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipeSorter.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +import java.util.Comparator; + +class RecipeSorter implements Comparator { + final CraftingManager field_1557_a; + + RecipeSorter(CraftingManager var1) { + this.field_1557_a = var1; + } + + public int a(CraftingRecipe var1, CraftingRecipe var2) { + return var2.getRecipeSize() < var1.getRecipeSize() ? -1 : (var2.getRecipeSize() > var1.getRecipeSize() ? 1 : 0); + } + + public int compare(Object var1, Object var2) { + return this.a((CraftingRecipe)var1, (CraftingRecipe)var2); + } +} diff --git a/src/main/java/net/minecraft/src/RecipesArmor.java b/src/main/java/net/minecraft/src/RecipesArmor.java new file mode 100644 index 0000000..f461301 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesArmor.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +public class RecipesArmor { + private String[][] field_1681_a = new String[][]{{"XXX", "X X"}, {"X X", "XXX", "XXX"}, {"XXX", "X X", "X X"}, {"X X", "X X"}}; + private Object[][] field_1680_b = new Object[][]{{Item.leather, Block.fire, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.helmetLeather, Item.helmetChain, Item.helmetSteel, Item.helmetDiamond, Item.helmetGold}, {Item.plateLeather, Item.plateChain, Item.plateSteel, Item.plateDiamond, Item.plateGold}, {Item.legsLeather, Item.legsChain, Item.legsSteel, Item.legsDiamond, Item.legsGold}, {Item.bootsLeather, Item.bootsChain, Item.bootsSteel, Item.bootsDiamond, Item.bootsGold}}; + + public void func_1148_a(CraftingManager var1) { + for(int var2 = 0; var2 < this.field_1680_b[0].length; ++var2) { + Object var3 = this.field_1680_b[0][var2]; + + for(int var4 = 0; var4 < this.field_1680_b.length - 1; ++var4) { + Item var5 = (Item)this.field_1680_b[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1681_a[var4], Character.valueOf('X'), var3}); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/RecipesCrafting.java b/src/main/java/net/minecraft/src/RecipesCrafting.java new file mode 100644 index 0000000..a2e08d2 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesCrafting.java @@ -0,0 +1,9 @@ +package net.minecraft.src; + +public class RecipesCrafting { + public void func_1051_a(CraftingManager var1) { + var1.addRecipe(new ItemStack(Block.crate), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.planks}); + var1.addRecipe(new ItemStack(Block.stoneOvenIdle), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.cobblestone}); + var1.addRecipe(new ItemStack(Block.workbench), new Object[]{"##", "##", Character.valueOf('#'), Block.planks}); + } +} diff --git a/src/main/java/net/minecraft/src/RecipesFood.java b/src/main/java/net/minecraft/src/RecipesFood.java new file mode 100644 index 0000000..2dedf59 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesFood.java @@ -0,0 +1,8 @@ +package net.minecraft.src; + +public class RecipesFood { + public void func_976_a(CraftingManager var1) { + var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomBrown, Character.valueOf('Y'), Block.mushroomRed, Character.valueOf('#'), Item.bowlEmpty}); + var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomRed, Character.valueOf('Y'), Block.mushroomBrown, Character.valueOf('#'), Item.bowlEmpty}); + } +} diff --git a/src/main/java/net/minecraft/src/RecipesIngots.java b/src/main/java/net/minecraft/src/RecipesIngots.java new file mode 100644 index 0000000..3add041 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesIngots.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +public class RecipesIngots { + private Object[][] field_1198_a = new Object[][]{{Block.blockGold, Item.ingotGold}, {Block.blockSteel, Item.ingotIron}, {Block.blockDiamond, Item.diamond}}; + + public void func_810_a(CraftingManager var1) { + for(int var2 = 0; var2 < this.field_1198_a.length; ++var2) { + Block var3 = (Block)this.field_1198_a[var2][0]; + Item var4 = (Item)this.field_1198_a[var2][1]; + var1.addRecipe(new ItemStack(var3), new Object[]{"###", "###", "###", Character.valueOf('#'), var4}); + var1.addRecipe(new ItemStack(var4, 9), new Object[]{"#", Character.valueOf('#'), var3}); + } + + } +} diff --git a/src/main/java/net/minecraft/src/RecipesTools.java b/src/main/java/net/minecraft/src/RecipesTools.java new file mode 100644 index 0000000..773706b --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesTools.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +public class RecipesTools { + private String[][] field_1665_a = new String[][]{{"XXX", " # ", " # "}, {"X", "#", "#"}, {"XX", "X#", " #"}, {"XX", " #", " #"}}; + private Object[][] field_1664_b = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold}, {Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold}, {Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold}, {Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold}}; + + public void func_1122_a(CraftingManager var1) { + for(int var2 = 0; var2 < this.field_1664_b[0].length; ++var2) { + Object var3 = this.field_1664_b[0][var2]; + + for(int var4 = 0; var4 < this.field_1664_b.length - 1; ++var4) { + Item var5 = (Item)this.field_1664_b[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1665_a[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3}); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/RecipesWeapons.java b/src/main/java/net/minecraft/src/RecipesWeapons.java new file mode 100644 index 0000000..e2a6bd7 --- /dev/null +++ b/src/main/java/net/minecraft/src/RecipesWeapons.java @@ -0,0 +1,20 @@ +package net.minecraft.src; + +public class RecipesWeapons { + private String[][] field_1100_a = new String[][]{{"X", "X", "#"}}; + private Object[][] field_1099_b = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.swordWood, Item.swordStone, Item.swordSteel, Item.swordDiamond, Item.swordGold}}; + + public void func_766_a(CraftingManager var1) { + for(int var2 = 0; var2 < this.field_1099_b[0].length; ++var2) { + Object var3 = this.field_1099_b[0][var2]; + + for(int var4 = 0; var4 < this.field_1099_b.length - 1; ++var4) { + Item var5 = (Item)this.field_1099_b[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1100_a[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3}); + } + } + + var1.addRecipe(new ItemStack(Item.bow, 1), new Object[]{" #X", "# X", " #X", Character.valueOf('X'), Item.silk, Character.valueOf('#'), Item.stick}); + var1.addRecipe(new ItemStack(Item.arrow, 4), new Object[]{"X", "#", "Y", Character.valueOf('Y'), Item.feather, Character.valueOf('X'), Item.flint, Character.valueOf('#'), Item.stick}); + } +} diff --git a/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java b/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java new file mode 100644 index 0000000..b987ecb --- /dev/null +++ b/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java @@ -0,0 +1,15 @@ +package net.minecraft.src; + +class RedstoneUpdateInfo { + int x; + int y; + int z; + long updateTime; + + public RedstoneUpdateInfo(int var1, int var2, int var3, long var4) { + this.x = var1; + this.y = var2; + this.z = var3; + this.updateTime = var4; + } +} diff --git a/src/main/java/net/minecraft/src/Render.java b/src/main/java/net/minecraft/src/Render.java new file mode 100644 index 0000000..71f9dea --- /dev/null +++ b/src/main/java/net/minecraft/src/Render.java @@ -0,0 +1,228 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public abstract class Render { + protected RenderManager renderManager; + private ModelBase unusedModelBiped = new ModelBiped(); + private RenderBlocks unusedRenderBlocks = new RenderBlocks(); + protected float field_9246_c = 0.0F; + protected float field_194_c = 1.0F; + + public abstract void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9); + + protected void loadTexture(String var1) { + RenderEngine var2 = this.renderManager.renderEngine; + var2.bindTexture(var2.getTexture(var1)); + } + + protected void func_140_a(String var1, String var2) { + RenderEngine var3 = this.renderManager.renderEngine; + var3.bindTexture(var3.getTextureForDownloadableImage(var1, var2)); + } + + private void renderEntityOnFire(Entity var1, double var2, double var4, double var6, float var8) { + GL11.glDisable(GL11.GL_LIGHTING); + int var9 = Block.fire.blockIndexInTexture; + int var10 = (var9 & 15) << 4; + int var11 = var9 & 240; + float var12 = (float)var10 / 256.0F; + float var13 = ((float)var10 + 15.99F) / 256.0F; + float var14 = (float)var11 / 256.0F; + float var15 = ((float)var11 + 15.99F) / 256.0F; + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + float var16 = var1.width * 1.4F; + GL11.glScalef(var16, var16, var16); + this.loadTexture("/terrain.png"); + Tessellator var17 = Tessellator.instance; + float var18 = 1.0F; + float var19 = 0.5F; + float var20 = 0.0F; + float var21 = var1.height / var1.width; + GL11.glRotatef(-this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, 0.0F, -0.4F + (float)((int)var21) * 0.02F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var17.startDrawingQuads(); + + while(var21 > 0.0F) { + var17.addVertexWithUV((double)(var18 - var19), (double)(0.0F - var20), 0.0D, (double)var13, (double)var15); + var17.addVertexWithUV((double)(0.0F - var19), (double)(0.0F - var20), 0.0D, (double)var12, (double)var15); + var17.addVertexWithUV((double)(0.0F - var19), (double)(1.4F - var20), 0.0D, (double)var12, (double)var14); + var17.addVertexWithUV((double)(var18 - var19), (double)(1.4F - var20), 0.0D, (double)var13, (double)var14); + --var21; + --var20; + var18 *= 0.9F; + GL11.glTranslatef(0.0F, 0.0F, -0.04F); + } + + var17.draw(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void renderShadow(Entity var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderEngine var10 = this.renderManager.renderEngine; + var10.bindTexture(var10.getTexture("%clamp%/misc/shadow.png")); + World var11 = this.getWorldFromRenderManager(); + GL11.glDepthMask(false); + float var12 = this.field_9246_c; + double var13 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var9; + double var15 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var9 + (double)var1.func_392_h_(); + double var17 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var9; + int var19 = MathHelper.floor_double(var13 - (double)var12); + int var20 = MathHelper.floor_double(var13 + (double)var12); + int var21 = MathHelper.floor_double(var15 - (double)var12); + int var22 = MathHelper.floor_double(var15); + int var23 = MathHelper.floor_double(var17 - (double)var12); + int var24 = MathHelper.floor_double(var17 + (double)var12); + double var25 = var2 - var13; + double var27 = var4 - var15; + double var29 = var6 - var17; + Tessellator var31 = Tessellator.instance; + var31.startDrawingQuads(); + + for(int var32 = var19; var32 <= var20; ++var32) { + for(int var33 = var21; var33 <= var22; ++var33) { + for(int var34 = var23; var34 <= var24; ++var34) { + int var35 = var11.getBlockId(var32, var33 - 1, var34); + if(var35 > 0 && var11.getBlockLightValue(var32, var33, var34) > 3) { + this.renderShadowOnBlock(Block.blocksList[var35], var2, var4 + (double)var1.func_392_h_(), var6, var32, var33, var34, var8, var12, var25, var27 + (double)var1.func_392_h_(), var29); + } + } + } + } + + var31.draw(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + } + + private World getWorldFromRenderManager() { + return this.renderManager.worldObj; + } + + private void renderShadowOnBlock(Block var1, double var2, double var4, double var6, int var8, int var9, int var10, float var11, float var12, double var13, double var15, double var17) { + Tessellator var19 = Tessellator.instance; + if(var1.renderAsNormalBlock()) { + double var20 = ((double)var11 - (var4 - ((double)var9 + var15)) / 2.0D) * 0.5D * (double)this.getWorldFromRenderManager().getLightBrightness(var8, var9, var10); + if(var20 >= 0.0D) { + if(var20 > 1.0D) { + var20 = 1.0D; + } + + var19.setColorRGBA_F(1.0F, 1.0F, 1.0F, (float)var20); + double var22 = (double)var8 + var1.field_370_bf + var13; + double var24 = (double)var8 + var1.maxX + var13; + double var26 = (double)var9 + var1.minY + var15 + 1.0D / 64.0D; + double var28 = (double)var10 + var1.minZ + var17; + double var30 = (double)var10 + var1.maxZ + var17; + float var32 = (float)((var2 - var22) / 2.0D / (double)var12 + 0.5D); + float var33 = (float)((var2 - var24) / 2.0D / (double)var12 + 0.5D); + float var34 = (float)((var6 - var28) / 2.0D / (double)var12 + 0.5D); + float var35 = (float)((var6 - var30) / 2.0D / (double)var12 + 0.5D); + var19.addVertexWithUV(var22, var26, var28, (double)var32, (double)var34); + var19.addVertexWithUV(var22, var26, var30, (double)var32, (double)var35); + var19.addVertexWithUV(var24, var26, var30, (double)var33, (double)var35); + var19.addVertexWithUV(var24, var26, var28, (double)var33, (double)var34); + } + } + } + + public static void renderOffsetAABB(AxisAlignedBB var0, double var1, double var3, double var5) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + Tessellator var7 = Tessellator.instance; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var7.startDrawingQuads(); + var7.setTranslationD(var1, var3, var5); + var7.setNormal(0.0F, 0.0F, -1.0F); + var7.addVertex(var0.minX, var0.maxY, var0.minZ); + var7.addVertex(var0.maxX, var0.maxY, var0.minZ); + var7.addVertex(var0.maxX, var0.minY, var0.minZ); + var7.addVertex(var0.minX, var0.minY, var0.minZ); + var7.setNormal(0.0F, 0.0F, 1.0F); + var7.addVertex(var0.minX, var0.minY, var0.maxZ); + var7.addVertex(var0.maxX, var0.minY, var0.maxZ); + var7.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var7.addVertex(var0.minX, var0.maxY, var0.maxZ); + var7.setNormal(0.0F, -1.0F, 0.0F); + var7.addVertex(var0.minX, var0.minY, var0.minZ); + var7.addVertex(var0.maxX, var0.minY, var0.minZ); + var7.addVertex(var0.maxX, var0.minY, var0.maxZ); + var7.addVertex(var0.minX, var0.minY, var0.maxZ); + var7.setNormal(0.0F, 1.0F, 0.0F); + var7.addVertex(var0.minX, var0.maxY, var0.maxZ); + var7.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var7.addVertex(var0.maxX, var0.maxY, var0.minZ); + var7.addVertex(var0.minX, var0.maxY, var0.minZ); + var7.setNormal(-1.0F, 0.0F, 0.0F); + var7.addVertex(var0.minX, var0.minY, var0.maxZ); + var7.addVertex(var0.minX, var0.maxY, var0.maxZ); + var7.addVertex(var0.minX, var0.maxY, var0.minZ); + var7.addVertex(var0.minX, var0.minY, var0.minZ); + var7.setNormal(1.0F, 0.0F, 0.0F); + var7.addVertex(var0.maxX, var0.minY, var0.minZ); + var7.addVertex(var0.maxX, var0.maxY, var0.minZ); + var7.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var7.addVertex(var0.maxX, var0.minY, var0.maxZ); + var7.setTranslationD(0.0D, 0.0D, 0.0D); + var7.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public static void renderAABB(AxisAlignedBB var0) { + Tessellator var1 = Tessellator.instance; + var1.startDrawingQuads(); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.draw(); + } + + public void setRenderManager(RenderManager var1) { + this.renderManager = var1; + } + + public void doRenderShadowAndFire(Entity var1, double var2, double var4, double var6, float var8, float var9) { + if(this.renderManager.options.fancyGraphics && this.field_9246_c > 0.0F) { + double var10 = this.renderManager.func_851_a(var1.posX, var1.posY, var1.posZ); + float var12 = (float)((1.0D - var10 / 256.0D) * (double)this.field_194_c); + if(var12 > 0.0F) { + this.renderShadow(var1, var2, var4, var6, var12, var9); + } + } + + if(var1.fire > 0 || var1.field_9299_bv) { + this.renderEntityOnFire(var1, var2, var4, var6, var9); + } + + } + + public FontRenderer getFontRendererFromRenderManager() { + return this.renderManager.getFontRenderer(); + } +} diff --git a/src/main/java/net/minecraft/src/RenderArrow.java b/src/main/java/net/minecraft/src/RenderArrow.java new file mode 100644 index 0000000..6a50043 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderArrow.java @@ -0,0 +1,67 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderArrow extends Render { + public void a(EntityArrow var1, double var2, double var4, double var6, float var8, float var9) { + this.loadTexture("/item/arrows.png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glRotatef(var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var9 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9, 0.0F, 0.0F, 1.0F); + Tessellator var10 = Tessellator.instance; + byte var11 = 0; + float var12 = 0.0F; + float var13 = 0.5F; + float var14 = (float)(0 + var11 * 10) / 32.0F; + float var15 = (float)(5 + var11 * 10) / 32.0F; + float var16 = 0.0F; + float var17 = 0.15625F; + float var18 = (float)(5 + var11 * 10) / 32.0F; + float var19 = (float)(10 + var11 * 10) / 32.0F; + float var20 = 0.05625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var21 = (float)var1.arrowShake - var9; + if(var21 > 0.0F) { + float var22 = -MathHelper.sin(var21 * 3.0F) * var21; + GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); + } + + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(var20, var20, var20); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)var16, (double)var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)var17, (double)var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)var17, (double)var19); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)var16, (double)var19); + var10.draw(); + GL11.glNormal3f(-var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)var16, (double)var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)var17, (double)var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)var17, (double)var19); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)var16, (double)var19); + var10.draw(); + + for(int var23 = 0; var23 < 4; ++var23) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, var20); + var10.startDrawingQuads(); + var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)var12, (double)var14); + var10.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)var13, (double)var14); + var10.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)var13, (double)var15); + var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)var12, (double)var15); + var10.draw(); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityArrow)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderBiped.java b/src/main/java/net/minecraft/src/RenderBiped.java new file mode 100644 index 0000000..9e9ec8e --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderBiped.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderBiped extends RenderLiving { + protected ModelBiped field_4013_a; + + public RenderBiped(ModelBiped var1, float var2) { + super(var1, var2); + this.field_4013_a = var1; + } + + protected void func_6331_b(EntityLiving var1, float var2) { + ItemStack var3 = var1.getHeldItem(); + if(var3 != null) { + GL11.glPushMatrix(); + this.field_4013_a.bipedRightArm.func_926_b(1.0F / 16.0F); + GL11.glTranslatef(-(1.0F / 16.0F), 7.0F / 16.0F, 1.0F / 16.0F); + float var4; + if(var3.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) { + var4 = 0.5F; + GL11.glTranslatef(0.0F, 3.0F / 16.0F, -(5.0F / 16.0F)); + var4 *= 12.0F / 16.0F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(var4, -var4, var4); + } else if(Item.itemsList[var3.itemID].isFull3D()) { + var4 = 10.0F / 16.0F; + GL11.glTranslatef(0.0F, 3.0F / 16.0F, 0.0F); + GL11.glScalef(var4, -var4, var4); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + var4 = 6.0F / 16.0F; + GL11.glTranslatef(0.25F, 3.0F / 16.0F, -(3.0F / 16.0F)); + GL11.glScalef(var4, var4, var4); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + this.renderManager.field_4236_f.renderItem(var3); + GL11.glPopMatrix(); + } + + } +} diff --git a/src/main/java/net/minecraft/src/RenderBlocks.java b/src/main/java/net/minecraft/src/RenderBlocks.java new file mode 100644 index 0000000..8e33f94 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderBlocks.java @@ -0,0 +1,1908 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderBlocks { + private IBlockAccess blockAccess; + private int overrideBlockTexture = -1; + private boolean flipTexture = false; + private boolean renderAllFaces = false; + + public RenderBlocks(IBlockAccess var1) { + this.blockAccess = var1; + } + + public RenderBlocks() { + } + + public void renderBlockUsingTexture(Block var1, int var2, int var3, int var4, int var5) { + this.overrideBlockTexture = var5; + this.renderBlockByRenderType(var1, var2, var3, var4); + this.overrideBlockTexture = -1; + } + + public boolean renderBlockByRenderType(Block var1, int var2, int var3, int var4) { + int var5 = var1.getRenderType(); + var1.setBlockBoundsBasedOnState(this.blockAccess, var2, var3, var4); + return var5 == 0 ? this.renderStandardBlock(var1, var2, var3, var4) : (var5 == 4 ? this.renderBlockFluids(var1, var2, var3, var4) : (var5 == 13 ? this.renderBlockCactus(var1, var2, var3, var4) : (var5 == 1 ? this.renderBlockReed(var1, var2, var3, var4) : (var5 == 6 ? this.renderBlockCrops(var1, var2, var3, var4) : (var5 == 2 ? this.renderBlockTorch(var1, var2, var3, var4) : (var5 == 3 ? this.renderBlockFire(var1, var2, var3, var4) : (var5 == 5 ? this.renderBlockRedstoneWire(var1, var2, var3, var4) : (var5 == 8 ? this.renderBlockLadder(var1, var2, var3, var4) : (var5 == 7 ? this.renderBlockDoor(var1, var2, var3, var4) : (var5 == 9 ? this.renderBlockMinecartTrack(var1, var2, var3, var4) : (var5 == 10 ? this.renderBlockStairs(var1, var2, var3, var4) : (var5 == 11 ? this.renderBlockFence(var1, var2, var3, var4) : (var5 == 12 ? this.renderBlockLever(var1, var2, var3, var4) : false))))))))))))); + } + + public boolean renderBlockTorch(Block var1, int var2, int var3, int var4) { + int var5 = this.blockAccess.getBlockMetadata(var2, var3, var4); + Tessellator var6 = Tessellator.instance; + float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + if(Block.lightValue[var1.blockID] > 0) { + var7 = 1.0F; + } + + var6.setColorOpaque_F(var7, var7, var7); + double var8 = (double)0.4F; + double var10 = 0.5D - var8; + double var12 = (double)0.2F; + if(var5 == 1) { + this.renderTorchAtAngle(var1, (double)var2 - var10, (double)var3 + var12, (double)var4, -var8, 0.0D); + } else if(var5 == 2) { + this.renderTorchAtAngle(var1, (double)var2 + var10, (double)var3 + var12, (double)var4, var8, 0.0D); + } else if(var5 == 3) { + this.renderTorchAtAngle(var1, (double)var2, (double)var3 + var12, (double)var4 - var10, 0.0D, -var8); + } else if(var5 == 4) { + this.renderTorchAtAngle(var1, (double)var2, (double)var3 + var12, (double)var4 + var10, 0.0D, var8); + } else { + this.renderTorchAtAngle(var1, (double)var2, (double)var3, (double)var4, 0.0D, 0.0D); + } + + return true; + } + + public boolean renderBlockLever(Block var1, int var2, int var3, int var4) { + int var5 = this.blockAccess.getBlockMetadata(var2, var3, var4); + int var6 = var5 & 7; + boolean var7 = (var5 & 8) > 0; + Tessellator var8 = Tessellator.instance; + boolean var9 = this.overrideBlockTexture >= 0; + if(!var9) { + this.overrideBlockTexture = Block.cobblestone.blockIndexInTexture; + } + + float var10 = 0.25F; + float var11 = 3.0F / 16.0F; + float var12 = 3.0F / 16.0F; + if(var6 == 5) { + var1.setBlockBounds(0.5F - var11, 0.0F, 0.5F - var10, 0.5F + var11, var12, 0.5F + var10); + } else if(var6 == 6) { + var1.setBlockBounds(0.5F - var10, 0.0F, 0.5F - var11, 0.5F + var10, var12, 0.5F + var11); + } else if(var6 == 4) { + var1.setBlockBounds(0.5F - var11, 0.5F - var10, 1.0F - var12, 0.5F + var11, 0.5F + var10, 1.0F); + } else if(var6 == 3) { + var1.setBlockBounds(0.5F - var11, 0.5F - var10, 0.0F, 0.5F + var11, 0.5F + var10, var12); + } else if(var6 == 2) { + var1.setBlockBounds(1.0F - var12, 0.5F - var10, 0.5F - var11, 1.0F, 0.5F + var10, 0.5F + var11); + } else if(var6 == 1) { + var1.setBlockBounds(0.0F, 0.5F - var10, 0.5F - var11, var12, 0.5F + var10, 0.5F + var11); + } + + this.renderStandardBlock(var1, var2, var3, var4); + if(!var9) { + this.overrideBlockTexture = -1; + } + + float var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var8.setColorOpaque_F(var13, var13, var13); + int var14 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var14 = this.overrideBlockTexture; + } + + int var15 = (var14 & 15) << 4; + int var16 = var14 & 240; + float var17 = (float)var15 / 256.0F; + float var18 = ((float)var15 + 15.99F) / 256.0F; + float var19 = (float)var16 / 256.0F; + float var20 = ((float)var16 + 15.99F) / 256.0F; + Vec3D[] var21 = new Vec3D[8]; + float var22 = 1.0F / 16.0F; + float var23 = 1.0F / 16.0F; + float var24 = 10.0F / 16.0F; + var21[0] = Vec3D.createVector((double)(-var22), 0.0D, (double)(-var23)); + var21[1] = Vec3D.createVector((double)var22, 0.0D, (double)(-var23)); + var21[2] = Vec3D.createVector((double)var22, 0.0D, (double)var23); + var21[3] = Vec3D.createVector((double)(-var22), 0.0D, (double)var23); + var21[4] = Vec3D.createVector((double)(-var22), (double)var24, (double)(-var23)); + var21[5] = Vec3D.createVector((double)var22, (double)var24, (double)(-var23)); + var21[6] = Vec3D.createVector((double)var22, (double)var24, (double)var23); + var21[7] = Vec3D.createVector((double)(-var22), (double)var24, (double)var23); + + for(int var25 = 0; var25 < 8; ++var25) { + if(var7) { + var21[var25].zCoord -= 1.0D / 16.0D; + var21[var25].rotateAroundX((float)Math.PI * 2.0F / 9.0F); + } else { + var21[var25].zCoord += 1.0D / 16.0D; + var21[var25].rotateAroundX(-((float)Math.PI * 2.0F / 9.0F)); + } + + if(var6 == 6) { + var21[var25].rotateAroundY((float)Math.PI * 0.5F); + } + + if(var6 < 5) { + var21[var25].yCoord -= 0.375D; + var21[var25].rotateAroundX((float)Math.PI * 0.5F); + if(var6 == 4) { + var21[var25].rotateAroundY(0.0F); + } + + if(var6 == 3) { + var21[var25].rotateAroundY((float)Math.PI); + } + + if(var6 == 2) { + var21[var25].rotateAroundY((float)Math.PI * 0.5F); + } + + if(var6 == 1) { + var21[var25].rotateAroundY((float)Math.PI * -0.5F); + } + + var21[var25].xCoord += (double)var2 + 0.5D; + var21[var25].yCoord += (double)((float)var3 + 0.5F); + var21[var25].zCoord += (double)var4 + 0.5D; + } else { + var21[var25].xCoord += (double)var2 + 0.5D; + var21[var25].yCoord += (double)((float)var3 + 2.0F / 16.0F); + var21[var25].zCoord += (double)var4 + 0.5D; + } + } + + Vec3D var30 = null; + Vec3D var26 = null; + Vec3D var27 = null; + Vec3D var28 = null; + + for(int var29 = 0; var29 < 6; ++var29) { + if(var29 == 0) { + var17 = (float)(var15 + 7) / 256.0F; + var18 = ((float)(var15 + 9) - 0.01F) / 256.0F; + var19 = (float)(var16 + 6) / 256.0F; + var20 = ((float)(var16 + 8) - 0.01F) / 256.0F; + } else if(var29 == 2) { + var17 = (float)(var15 + 7) / 256.0F; + var18 = ((float)(var15 + 9) - 0.01F) / 256.0F; + var19 = (float)(var16 + 6) / 256.0F; + var20 = ((float)(var16 + 16) - 0.01F) / 256.0F; + } + + if(var29 == 0) { + var30 = var21[0]; + var26 = var21[1]; + var27 = var21[2]; + var28 = var21[3]; + } else if(var29 == 1) { + var30 = var21[7]; + var26 = var21[6]; + var27 = var21[5]; + var28 = var21[4]; + } else if(var29 == 2) { + var30 = var21[1]; + var26 = var21[0]; + var27 = var21[4]; + var28 = var21[5]; + } else if(var29 == 3) { + var30 = var21[2]; + var26 = var21[1]; + var27 = var21[5]; + var28 = var21[6]; + } else if(var29 == 4) { + var30 = var21[3]; + var26 = var21[2]; + var27 = var21[6]; + var28 = var21[7]; + } else if(var29 == 5) { + var30 = var21[0]; + var26 = var21[3]; + var27 = var21[7]; + var28 = var21[4]; + } + + var8.addVertexWithUV(var30.xCoord, var30.yCoord, var30.zCoord, (double)var17, (double)var20); + var8.addVertexWithUV(var26.xCoord, var26.yCoord, var26.zCoord, (double)var18, (double)var20); + var8.addVertexWithUV(var27.xCoord, var27.yCoord, var27.zCoord, (double)var18, (double)var19); + var8.addVertexWithUV(var28.xCoord, var28.yCoord, var28.zCoord, (double)var17, (double)var19); + } + + return true; + } + + public boolean renderBlockFire(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + int var6 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var6 = this.overrideBlockTexture; + } + + float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var7, var7, var7); + int var8 = (var6 & 15) << 4; + int var9 = var6 & 240; + double var10 = (double)((float)var8 / 256.0F); + double var12 = (double)(((float)var8 + 15.99F) / 256.0F); + double var14 = (double)((float)var9 / 256.0F); + double var16 = (double)(((float)var9 + 15.99F) / 256.0F); + float var18 = 1.4F; + double var21; + double var23; + double var25; + double var27; + double var29; + double var31; + double var33; + if(!this.blockAccess.isBlockOpaqueCube(var2, var3 - 1, var4) && !Block.fire.canBlockCatchFire(this.blockAccess, var2, var3 - 1, var4)) { + float var37 = 0.2F; + float var20 = 1.0F / 16.0F; + if((var2 + var3 + var4 & 1) == 1) { + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)(var9 + 16) / 256.0F); + var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F); + } + + if((var2 / 2 + var3 / 2 + var4 / 2 & 1) == 1) { + var21 = var12; + var12 = var10; + var10 = var21; + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var2 - 1, var3, var4)) { + var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14); + var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var2 + 1, var3, var4)) { + var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14); + var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3, var4 - 1)) { + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var12, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var10, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var10, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var12, var14); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3, var4 + 1)) { + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var10, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var12, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var10, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var10, var14); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3 + 1, var4)) { + var21 = (double)var2 + 0.5D + 0.5D; + var23 = (double)var2 + 0.5D - 0.5D; + var25 = (double)var4 + 0.5D + 0.5D; + var27 = (double)var4 + 0.5D - 0.5D; + var29 = (double)var2 + 0.5D - 0.5D; + var31 = (double)var2 + 0.5D + 0.5D; + var33 = (double)var4 + 0.5D - 0.5D; + double var35 = (double)var4 + 0.5D + 0.5D; + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)var9 / 256.0F); + var16 = (double)(((float)var9 + 15.99F) / 256.0F); + ++var3; + var18 = -0.2F; + if((var2 + var3 + var4 & 1) == 0) { + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16); + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14); + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)(var9 + 16) / 256.0F); + var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F); + var5.addVertexWithUV(var31, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV(var23, (double)(var3 + 0), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV(var23, (double)(var3 + 0), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV(var31, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14); + } else { + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var35, var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var27, var12, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var27, var10, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var35, var10, var14); + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)(var9 + 16) / 256.0F); + var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14); + } + } + } else { + double var19 = (double)var2 + 0.5D + 0.2D; + var21 = (double)var2 + 0.5D - 0.2D; + var23 = (double)var4 + 0.5D + 0.2D; + var25 = (double)var4 + 0.5D - 0.2D; + var27 = (double)var2 + 0.5D - 0.3D; + var29 = (double)var2 + 0.5D + 0.3D; + var31 = (double)var4 + 0.5D - 0.3D; + var33 = (double)var4 + 0.5D + 0.3D; + var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14); + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16); + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14); + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)(var9 + 16) / 256.0F); + var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var31, var12, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var23, var12, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var23, var10, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var31, var10, var14); + var19 = (double)var2 + 0.5D - 0.5D; + var21 = (double)var2 + 0.5D + 0.5D; + var23 = (double)var4 + 0.5D - 0.5D; + var25 = (double)var4 + 0.5D + 0.5D; + var27 = (double)var2 + 0.5D - 0.4D; + var29 = (double)var2 + 0.5D + 0.4D; + var31 = (double)var4 + 0.5D - 0.4D; + var33 = (double)var4 + 0.5D + 0.4D; + var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14); + var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 0), var10, var16); + var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 1), var12, var16); + var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14); + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16); + var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16); + var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14); + var10 = (double)((float)var8 / 256.0F); + var12 = (double)(((float)var8 + 15.99F) / 256.0F); + var14 = (double)((float)var9 / 256.0F); + var16 = (double)(((float)var9 + 15.99F) / 256.0F); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var31, var10, var14); + var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var23, var10, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var23, var12, var16); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var31, var12, var14); + } + + return true; + } + + public boolean renderBlockRedstoneWire(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + int var6 = var1.getBlockTextureFromSideAndMetadata(1, this.blockAccess.getBlockMetadata(var2, var3, var4)); + if(this.overrideBlockTexture >= 0) { + var6 = this.overrideBlockTexture; + } + + float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var7, var7, var7); + int var8 = (var6 & 15) << 4; + int var9 = var6 & 240; + double var10 = (double)((float)var8 / 256.0F); + double var12 = (double)(((float)var8 + 15.99F) / 256.0F); + double var14 = (double)((float)var9 / 256.0F); + double var16 = (double)(((float)var9 + 15.99F) / 256.0F); + float var18 = 0.0F; + float var19 = 0.03125F; + boolean var20 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3, var4) || !this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3 - 1, var4); + boolean var21 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3, var4) || !this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3 - 1, var4); + boolean var22 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3, var4 - 1) || !this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 - 1, var4 - 1); + boolean var23 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3, var4 + 1) || !this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 - 1, var4 + 1); + if(!this.blockAccess.isBlockOpaqueCube(var2, var3 + 1, var4)) { + if(this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3 + 1, var4)) { + var20 = true; + } + + if(this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3 + 1, var4)) { + var21 = true; + } + + if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 + 1, var4 - 1)) { + var22 = true; + } + + if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 + 1, var4 + 1)) { + var23 = true; + } + } + + float var24 = 5.0F / 16.0F; + float var25 = (float)(var2 + 0); + float var26 = (float)(var2 + 1); + float var27 = (float)(var4 + 0); + float var28 = (float)(var4 + 1); + byte var29 = 0; + if((var20 || var21) && !var22 && !var23) { + var29 = 1; + } + + if((var22 || var23) && !var21 && !var20) { + var29 = 2; + } + + if(var29 != 0) { + var10 = (double)((float)(var8 + 16) / 256.0F); + var12 = (double)(((float)(var8 + 16) + 15.99F) / 256.0F); + var14 = (double)((float)var9 / 256.0F); + var16 = (double)(((float)var9 + 15.99F) / 256.0F); + } + + if(var29 == 0) { + if(var21 || var22 || var23 || var20) { + if(!var20) { + var25 += var24; + } + + if(!var20) { + var10 += (double)(var24 / 16.0F); + } + + if(!var21) { + var26 -= var24; + } + + if(!var21) { + var12 -= (double)(var24 / 16.0F); + } + + if(!var22) { + var27 += var24; + } + + if(!var22) { + var14 += (double)(var24 / 16.0F); + } + + if(!var23) { + var28 -= var24; + } + + if(!var23) { + var16 -= (double)(var24 / 16.0F); + } + } + + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16); + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var12, var14); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var10, var16); + } + + if(var29 == 1) { + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16); + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var12, var14); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var10, var16); + } + + if(var29 == 2) { + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16); + var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var16); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14); + var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var14); + } + + var10 = (double)((float)(var8 + 16) / 256.0F); + var12 = (double)(((float)(var8 + 16) + 15.99F) / 256.0F); + var14 = (double)((float)var9 / 256.0F); + var16 = (double)(((float)var9 + 15.99F) / 256.0F); + if(!this.blockAccess.isBlockOpaqueCube(var2, var3 + 1, var4)) { + if(this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && this.blockAccess.getBlockId(var2 - 1, var3 + 1, var4) == Block.redstoneWire.blockID) { + var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) + var18), var12, var14); + var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) + var18), var10, var14); + var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 0) - var18), var10, var16); + var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 0) - var18), var12, var16); + } + + if(this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && this.blockAccess.getBlockId(var2 + 1, var3 + 1, var4) == Block.redstoneWire.blockID) { + var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) + var18), var10, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) + var18), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 0) - var18), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 0) - var18), var10, var14); + } + + if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && this.blockAccess.getBlockId(var2, var3 + 1, var4 - 1) == Block.redstoneWire.blockID) { + var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 0) - var18), (double)((float)var4 + var19), var10, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 1) + var18), (double)((float)var4 + var19), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 1) + var18), (double)((float)var4 + var19), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 0) - var18), (double)((float)var4 + var19), var10, var14); + } + + if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && this.blockAccess.getBlockId(var2, var3 + 1, var4 + 1) == Block.redstoneWire.blockID) { + var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) - var19), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) - var19), var10, var14); + var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) - var19), var10, var16); + var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) - var19), var12, var16); + } + } + + return true; + } + + public boolean renderBlockMinecartTrack(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + int var6 = this.blockAccess.getBlockMetadata(var2, var3, var4); + int var7 = var1.getBlockTextureFromSideAndMetadata(0, var6); + if(this.overrideBlockTexture >= 0) { + var7 = this.overrideBlockTexture; + } + + float var8 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var8, var8, var8); + int var9 = (var7 & 15) << 4; + int var10 = var7 & 240; + double var11 = (double)((float)var9 / 256.0F); + double var13 = (double)(((float)var9 + 15.99F) / 256.0F); + double var15 = (double)((float)var10 / 256.0F); + double var17 = (double)(((float)var10 + 15.99F) / 256.0F); + float var19 = 1.0F / 16.0F; + float var20 = (float)(var2 + 1); + float var21 = (float)(var2 + 1); + float var22 = (float)(var2 + 0); + float var23 = (float)(var2 + 0); + float var24 = (float)(var4 + 0); + float var25 = (float)(var4 + 1); + float var26 = (float)(var4 + 1); + float var27 = (float)(var4 + 0); + float var28 = (float)var3 + var19; + float var29 = (float)var3 + var19; + float var30 = (float)var3 + var19; + float var31 = (float)var3 + var19; + if(var6 != 1 && var6 != 2 && var6 != 3 && var6 != 7) { + if(var6 == 8) { + var21 = (float)(var2 + 0); + var20 = var21; + var23 = (float)(var2 + 1); + var22 = var23; + var27 = (float)(var4 + 1); + var24 = var27; + var26 = (float)(var4 + 0); + var25 = var26; + } else if(var6 == 9) { + var23 = (float)(var2 + 0); + var20 = var23; + var22 = (float)(var2 + 1); + var21 = var22; + var25 = (float)(var4 + 0); + var24 = var25; + var27 = (float)(var4 + 1); + var26 = var27; + } + } else { + var23 = (float)(var2 + 1); + var20 = var23; + var22 = (float)(var2 + 0); + var21 = var22; + var25 = (float)(var4 + 1); + var24 = var25; + var27 = (float)(var4 + 0); + var26 = var27; + } + + if(var6 != 2 && var6 != 4) { + if(var6 == 3 || var6 == 5) { + ++var29; + ++var30; + } + } else { + ++var28; + ++var31; + } + + var5.addVertexWithUV((double)var20, (double)var28, (double)var24, var13, var15); + var5.addVertexWithUV((double)var21, (double)var29, (double)var25, var13, var17); + var5.addVertexWithUV((double)var22, (double)var30, (double)var26, var11, var17); + var5.addVertexWithUV((double)var23, (double)var31, (double)var27, var11, var15); + var5.addVertexWithUV((double)var23, (double)var31, (double)var27, var11, var15); + var5.addVertexWithUV((double)var22, (double)var30, (double)var26, var11, var17); + var5.addVertexWithUV((double)var21, (double)var29, (double)var25, var13, var17); + var5.addVertexWithUV((double)var20, (double)var28, (double)var24, var13, var15); + return true; + } + + public boolean renderBlockLadder(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + int var6 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var6 = this.overrideBlockTexture; + } + + float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var7, var7, var7); + int var8 = (var6 & 15) << 4; + int var9 = var6 & 240; + double var10 = (double)((float)var8 / 256.0F); + double var12 = (double)(((float)var8 + 15.99F) / 256.0F); + double var14 = (double)((float)var9 / 256.0F); + double var16 = (double)(((float)var9 + 15.99F) / 256.0F); + int var18 = this.blockAccess.getBlockMetadata(var2, var3, var4); + float var19 = 0.0F; + float var20 = 0.05F; + if(var18 == 5) { + var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) + var19), var10, var14); + var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) + var19), var10, var16); + var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 0) - var19), var12, var16); + var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 0) - var19), var12, var14); + } + + if(var18 == 4) { + var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) + var19), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) + var19), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 0) - var19), var10, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 0) - var19), var10, var16); + } + + if(var18 == 3) { + var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 0) - var19), (double)((float)var4 + var20), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 1) + var19), (double)((float)var4 + var20), var12, var14); + var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 1) + var19), (double)((float)var4 + var20), var10, var14); + var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 0) - var19), (double)((float)var4 + var20), var10, var16); + } + + if(var18 == 2) { + var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) - var20), var10, var14); + var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) - var20), var10, var16); + var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) - var20), var12, var16); + var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) - var20), var12, var14); + } + + return true; + } + + public boolean renderBlockReed(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + float var6 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var6, var6, var6); + this.func_1239_a(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (double)var2, (double)var3, (double)var4); + return true; + } + + public boolean renderBlockCrops(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + float var6 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var6, var6, var6); + this.func_1245_b(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (double)var2, (double)((float)var3 - 1.0F / 16.0F), (double)var4); + return true; + } + + public void renderTorchAtAngle(Block var1, double var2, double var4, double var6, double var8, double var10) { + Tessellator var12 = Tessellator.instance; + int var13 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var13 = this.overrideBlockTexture; + } + + int var14 = (var13 & 15) << 4; + int var15 = var13 & 240; + float var16 = (float)var14 / 256.0F; + float var17 = ((float)var14 + 15.99F) / 256.0F; + float var18 = (float)var15 / 256.0F; + float var19 = ((float)var15 + 15.99F) / 256.0F; + double var20 = (double)var16 + 1.75D / 64.0D; + double var22 = (double)var18 + 6.0D / 256.0D; + double var24 = (double)var16 + 9.0D / 256.0D; + double var26 = (double)var18 + 1.0D / 32.0D; + var2 += 0.5D; + var6 += 0.5D; + double var28 = var2 - 0.5D; + double var30 = var2 + 0.5D; + double var32 = var6 - 0.5D; + double var34 = var6 + 0.5D; + double var36 = 1.0D / 16.0D; + double var38 = 0.625D; + var12.addVertexWithUV(var2 + var8 * (1.0D - var38) - var36, var4 + var38, var6 + var10 * (1.0D - var38) - var36, var20, var22); + var12.addVertexWithUV(var2 + var8 * (1.0D - var38) - var36, var4 + var38, var6 + var10 * (1.0D - var38) + var36, var20, var26); + var12.addVertexWithUV(var2 + var8 * (1.0D - var38) + var36, var4 + var38, var6 + var10 * (1.0D - var38) + var36, var24, var26); + var12.addVertexWithUV(var2 + var8 * (1.0D - var38) + var36, var4 + var38, var6 + var10 * (1.0D - var38) - var36, var24, var22); + var12.addVertexWithUV(var2 - var36, var4 + 1.0D, var32, (double)var16, (double)var18); + var12.addVertexWithUV(var2 - var36 + var8, var4 + 0.0D, var32 + var10, (double)var16, (double)var19); + var12.addVertexWithUV(var2 - var36 + var8, var4 + 0.0D, var34 + var10, (double)var17, (double)var19); + var12.addVertexWithUV(var2 - var36, var4 + 1.0D, var34, (double)var17, (double)var18); + var12.addVertexWithUV(var2 + var36, var4 + 1.0D, var34, (double)var16, (double)var18); + var12.addVertexWithUV(var2 + var8 + var36, var4 + 0.0D, var34 + var10, (double)var16, (double)var19); + var12.addVertexWithUV(var2 + var8 + var36, var4 + 0.0D, var32 + var10, (double)var17, (double)var19); + var12.addVertexWithUV(var2 + var36, var4 + 1.0D, var32, (double)var17, (double)var18); + var12.addVertexWithUV(var28, var4 + 1.0D, var6 + var36, (double)var16, (double)var18); + var12.addVertexWithUV(var28 + var8, var4 + 0.0D, var6 + var36 + var10, (double)var16, (double)var19); + var12.addVertexWithUV(var30 + var8, var4 + 0.0D, var6 + var36 + var10, (double)var17, (double)var19); + var12.addVertexWithUV(var30, var4 + 1.0D, var6 + var36, (double)var17, (double)var18); + var12.addVertexWithUV(var30, var4 + 1.0D, var6 - var36, (double)var16, (double)var18); + var12.addVertexWithUV(var30 + var8, var4 + 0.0D, var6 - var36 + var10, (double)var16, (double)var19); + var12.addVertexWithUV(var28 + var8, var4 + 0.0D, var6 - var36 + var10, (double)var17, (double)var19); + var12.addVertexWithUV(var28, var4 + 1.0D, var6 - var36, (double)var17, (double)var18); + } + + public void func_1239_a(Block var1, int var2, double var3, double var5, double var7) { + Tessellator var9 = Tessellator.instance; + int var10 = var1.getBlockTextureFromSideAndMetadata(0, var2); + if(this.overrideBlockTexture >= 0) { + var10 = this.overrideBlockTexture; + } + + int var11 = (var10 & 15) << 4; + int var12 = var10 & 240; + double var13 = (double)((float)var11 / 256.0F); + double var15 = (double)(((float)var11 + 15.99F) / 256.0F); + double var17 = (double)((float)var12 / 256.0F); + double var19 = (double)(((float)var12 + 15.99F) / 256.0F); + double var21 = var3 + 0.5D - (double)0.45F; + double var23 = var3 + 0.5D + (double)0.45F; + double var25 = var7 + 0.5D - (double)0.45F; + double var27 = var7 + 0.5D + (double)0.45F; + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17); + } + + public void func_1245_b(Block var1, int var2, double var3, double var5, double var7) { + Tessellator var9 = Tessellator.instance; + int var10 = var1.getBlockTextureFromSideAndMetadata(0, var2); + if(this.overrideBlockTexture >= 0) { + var10 = this.overrideBlockTexture; + } + + int var11 = (var10 & 15) << 4; + int var12 = var10 & 240; + double var13 = (double)((float)var11 / 256.0F); + double var15 = (double)(((float)var11 + 15.99F) / 256.0F); + double var17 = (double)((float)var12 / 256.0F); + double var19 = (double)(((float)var12 + 15.99F) / 256.0F); + double var21 = var3 + 0.5D - 0.25D; + double var23 = var3 + 0.5D + 0.25D; + double var25 = var7 + 0.5D - 0.5D; + double var27 = var7 + 0.5D + 0.5D; + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17); + var21 = var3 + 0.5D - 0.5D; + var23 = var3 + 0.5D + 0.5D; + var25 = var7 + 0.5D - 0.25D; + var27 = var7 + 0.5D + 0.25D; + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17); + var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17); + var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19); + var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19); + var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17); + } + + public boolean renderBlockFluids(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + boolean var6 = var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1); + boolean var7 = var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0); + boolean[] var8 = new boolean[]{var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2), var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3), var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4), var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)}; + if(!var6 && !var7 && !var8[0] && !var8[1] && !var8[2] && !var8[3]) { + return false; + } else { + boolean var9 = false; + float var10 = 0.5F; + float var11 = 1.0F; + float var12 = 0.8F; + float var13 = 0.6F; + double var14 = 0.0D; + double var16 = 1.0D; + Material var18 = var1.blockMaterial; + int var19 = this.blockAccess.getBlockMetadata(var2, var3, var4); + float var20 = this.func_1224_a(var2, var3, var4, var18); + float var21 = this.func_1224_a(var2, var3, var4 + 1, var18); + float var22 = this.func_1224_a(var2 + 1, var3, var4 + 1, var18); + float var23 = this.func_1224_a(var2 + 1, var3, var4, var18); + int var24; + int var27; + float var32; + float var33; + float var34; + if(this.renderAllFaces || var6) { + var9 = true; + var24 = var1.getBlockTextureFromSideAndMetadata(1, var19); + float var25 = (float)BlockFluids.func_293_a(this.blockAccess, var2, var3, var4, var18); + if(var25 > -999.0F) { + var24 = var1.getBlockTextureFromSideAndMetadata(2, var19); + } + + int var26 = (var24 & 15) << 4; + var27 = var24 & 240; + double var28 = ((double)var26 + 8.0D) / 256.0D; + double var30 = ((double)var27 + 8.0D) / 256.0D; + if(var25 < -999.0F) { + var25 = 0.0F; + } else { + var28 = (double)((float)(var26 + 16) / 256.0F); + var30 = (double)((float)(var27 + 16) / 256.0F); + } + + var32 = MathHelper.sin(var25) * 8.0F / 256.0F; + var33 = MathHelper.cos(var25) * 8.0F / 256.0F; + var34 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var5.setColorOpaque_F(var11 * var34, var11 * var34, var11 * var34); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var20), (double)(var4 + 0), var28 - (double)var33 - (double)var32, var30 - (double)var33 + (double)var32); + var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var21), (double)(var4 + 1), var28 - (double)var33 + (double)var32, var30 + (double)var33 + (double)var32); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var22), (double)(var4 + 1), var28 + (double)var33 + (double)var32, var30 + (double)var33 - (double)var32); + var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var23), (double)(var4 + 0), var28 + (double)var33 - (double)var32, var30 - (double)var33 - (double)var32); + } + + if(this.renderAllFaces || var7) { + float var48 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + var5.setColorOpaque_F(var10 * var48, var10 * var48, var10 * var48); + this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTextureFromSide(0)); + var9 = true; + } + + for(var24 = 0; var24 < 4; ++var24) { + int var49 = var2; + var27 = var4; + if(var24 == 0) { + var27 = var4 - 1; + } + + if(var24 == 1) { + ++var27; + } + + if(var24 == 2) { + var49 = var2 - 1; + } + + if(var24 == 3) { + ++var49; + } + + int var50 = var1.getBlockTextureFromSideAndMetadata(var24 + 2, var19); + int var29 = (var50 & 15) << 4; + int var51 = var50 & 240; + if(this.renderAllFaces || var8[var24]) { + float var31; + float var35; + float var36; + if(var24 == 0) { + var31 = var20; + var32 = var23; + var33 = (float)var2; + var35 = (float)(var2 + 1); + var34 = (float)var4; + var36 = (float)var4; + } else if(var24 == 1) { + var31 = var22; + var32 = var21; + var33 = (float)(var2 + 1); + var35 = (float)var2; + var34 = (float)(var4 + 1); + var36 = (float)(var4 + 1); + } else if(var24 == 2) { + var31 = var21; + var32 = var20; + var33 = (float)var2; + var35 = (float)var2; + var34 = (float)(var4 + 1); + var36 = (float)var4; + } else { + var31 = var23; + var32 = var22; + var33 = (float)(var2 + 1); + var35 = (float)(var2 + 1); + var34 = (float)var4; + var36 = (float)(var4 + 1); + } + + var9 = true; + double var37 = (double)((float)(var29 + 0) / 256.0F); + double var39 = ((double)(var29 + 16) - 0.01D) / 256.0D; + double var41 = (double)(((float)var51 + (1.0F - var31) * 16.0F) / 256.0F); + double var43 = (double)(((float)var51 + (1.0F - var32) * 16.0F) / 256.0F); + double var45 = ((double)(var51 + 16) - 0.01D) / 256.0D; + float var47 = var1.getBlockBrightness(this.blockAccess, var49, var3, var27); + if(var24 < 2) { + var47 *= var12; + } else { + var47 *= var13; + } + + var5.setColorOpaque_F(var11 * var47, var11 * var47, var11 * var47); + var5.addVertexWithUV((double)var33, (double)((float)var3 + var31), (double)var34, var37, var41); + var5.addVertexWithUV((double)var35, (double)((float)var3 + var32), (double)var36, var39, var43); + var5.addVertexWithUV((double)var35, (double)(var3 + 0), (double)var36, var39, var45); + var5.addVertexWithUV((double)var33, (double)(var3 + 0), (double)var34, var37, var45); + } + } + + var1.minY = var14; + var1.maxY = var16; + return var9; + } + } + + private float func_1224_a(int var1, int var2, int var3, Material var4) { + int var5 = 0; + float var6 = 0.0F; + + for(int var7 = 0; var7 < 4; ++var7) { + int var8 = var1 - (var7 & 1); + int var10 = var3 - (var7 >> 1 & 1); + if(this.blockAccess.getBlockMaterial(var8, var2 + 1, var10) == var4) { + return 1.0F; + } + + Material var11 = this.blockAccess.getBlockMaterial(var8, var2, var10); + if(var11 != var4) { + if(!var11.func_878_a()) { + ++var6; + ++var5; + } + } else { + int var12 = this.blockAccess.getBlockMetadata(var8, var2, var10); + if(var12 >= 8 || var12 == 0) { + var6 += BlockFluids.func_288_b(var12) * 10.0F; + var5 += 10; + } + + var6 += BlockFluids.func_288_b(var12); + ++var5; + } + } + + return 1.0F - var6 / (float)var5; + } + + public void func_1243_a(Block var1, World var2, int var3, int var4, int var5) { + float var6 = 0.5F; + float var7 = 1.0F; + float var8 = 0.8F; + float var9 = 0.6F; + Tessellator var10 = Tessellator.instance; + var10.startDrawingQuads(); + float var11 = var1.getBlockBrightness(var2, var3, var4, var5); + float var12 = var1.getBlockBrightness(var2, var3, var4 - 1, var5); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var6 * var12, var6 * var12, var6 * var12); + this.renderBottomFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(0)); + var12 = var1.getBlockBrightness(var2, var3, var4 + 1, var5); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var7 * var12, var7 * var12, var7 * var12); + this.renderTopFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(1)); + var12 = var1.getBlockBrightness(var2, var3, var4, var5 - 1); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var8 * var12, var8 * var12, var8 * var12); + this.renderEastFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(2)); + var12 = var1.getBlockBrightness(var2, var3, var4, var5 + 1); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var8 * var12, var8 * var12, var8 * var12); + this.renderWestFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(3)); + var12 = var1.getBlockBrightness(var2, var3 - 1, var4, var5); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var9 * var12, var9 * var12, var9 * var12); + this.renderNorthFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(4)); + var12 = var1.getBlockBrightness(var2, var3 + 1, var4, var5); + if(var12 < var11) { + var12 = var11; + } + + var10.setColorOpaque_F(var9 * var12, var9 * var12, var9 * var12); + this.renderSouthFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(5)); + var10.draw(); + } + + public boolean renderStandardBlock(Block var1, int var2, int var3, int var4) { + int var5 = var1.colorMultiplier(this.blockAccess, var2, var3, var4); + float var6 = (float)(var5 >> 16 & 255) / 255.0F; + float var7 = (float)(var5 >> 8 & 255) / 255.0F; + float var8 = (float)(var5 & 255) / 255.0F; + return this.renderStandardBlockWithColorMultiplier(var1, var2, var3, var4, var6, var7, var8); + } + + public boolean renderStandardBlockWithColorMultiplier(Block var1, int var2, int var3, int var4, float var5, float var6, float var7) { + Tessellator var8 = Tessellator.instance; + boolean var9 = false; + float var10 = 0.5F; + float var11 = 1.0F; + float var12 = 0.8F; + float var13 = 0.6F; + float var14 = var11 * var5; + float var15 = var11 * var6; + float var16 = var11 * var7; + if(var1 == Block.grass) { + var7 = 1.0F; + var6 = var7; + var5 = var7; + } + + float var17 = var10 * var5; + float var18 = var12 * var5; + float var19 = var13 * var5; + float var20 = var10 * var6; + float var21 = var12 * var6; + float var22 = var13 * var6; + float var23 = var10 * var7; + float var24 = var12 * var7; + float var25 = var13 * var7; + float var26 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + float var27; + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + var8.setColorOpaque_F(var17 * var27, var20 * var27, var23 * var27); + this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4); + if(var1.maxY != 1.0D && !var1.blockMaterial.getIsLiquid()) { + var27 = var26; + } + + var8.setColorOpaque_F(var14 * var27, var15 * var27, var16 * var27); + this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1); + if(var1.minZ > 0.0D) { + var27 = var26; + } + + var8.setColorOpaque_F(var18 * var27, var21 * var27, var24 * var27); + this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1); + if(var1.maxZ < 1.0D) { + var27 = var26; + } + + var8.setColorOpaque_F(var18 * var27, var21 * var27, var24 * var27); + this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4); + if(var1.field_370_bf > 0.0D) { + var27 = var26; + } + + var8.setColorOpaque_F(var19 * var27, var22 * var27, var25 * var27); + this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) { + var27 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4); + if(var1.maxX < 1.0D) { + var27 = var26; + } + + var8.setColorOpaque_F(var19 * var27, var22 * var27, var25 * var27); + this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5)); + var9 = true; + } + + return var9; + } + + public boolean renderBlockCactus(Block var1, int var2, int var3, int var4) { + int var5 = var1.colorMultiplier(this.blockAccess, var2, var3, var4); + float var6 = (float)(var5 >> 16 & 255) / 255.0F; + float var7 = (float)(var5 >> 8 & 255) / 255.0F; + float var8 = (float)(var5 & 255) / 255.0F; + return this.func_1230_b(var1, var2, var3, var4, var6, var7, var8); + } + + public boolean func_1230_b(Block var1, int var2, int var3, int var4, float var5, float var6, float var7) { + Tessellator var8 = Tessellator.instance; + boolean var9 = false; + float var10 = 0.5F; + float var11 = 1.0F; + float var12 = 0.8F; + float var13 = 0.6F; + float var14 = var10 * var5; + float var15 = var11 * var5; + float var16 = var12 * var5; + float var17 = var13 * var5; + float var18 = var10 * var6; + float var19 = var11 * var6; + float var20 = var12 * var6; + float var21 = var13 * var6; + float var22 = var10 * var7; + float var23 = var11 * var7; + float var24 = var12 * var7; + float var25 = var13 * var7; + float var26 = 1.0F / 16.0F; + float var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + float var28; + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + var8.setColorOpaque_F(var14 * var28, var18 * var28, var22 * var28); + this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4); + if(var1.maxY != 1.0D && !var1.blockMaterial.getIsLiquid()) { + var28 = var27; + } + + var8.setColorOpaque_F(var15 * var28, var19 * var28, var23 * var28); + this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1)); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1); + if(var1.minZ > 0.0D) { + var28 = var27; + } + + var8.setColorOpaque_F(var16 * var28, var20 * var28, var24 * var28); + var8.setTranslationF(0.0F, 0.0F, var26); + this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2)); + var8.setTranslationF(0.0F, 0.0F, -var26); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1); + if(var1.maxZ < 1.0D) { + var28 = var27; + } + + var8.setColorOpaque_F(var16 * var28, var20 * var28, var24 * var28); + var8.setTranslationF(0.0F, 0.0F, -var26); + this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3)); + var8.setTranslationF(0.0F, 0.0F, var26); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4); + if(var1.field_370_bf > 0.0D) { + var28 = var27; + } + + var8.setColorOpaque_F(var17 * var28, var21 * var28, var25 * var28); + var8.setTranslationF(var26, 0.0F, 0.0F); + this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4)); + var8.setTranslationF(-var26, 0.0F, 0.0F); + var9 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) { + var28 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4); + if(var1.maxX < 1.0D) { + var28 = var27; + } + + var8.setColorOpaque_F(var17 * var28, var21 * var28, var25 * var28); + var8.setTranslationF(-var26, 0.0F, 0.0F); + this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5)); + var8.setTranslationF(var26, 0.0F, 0.0F); + var9 = true; + } + + return var9; + } + + public boolean renderBlockFence(Block var1, int var2, int var3, int var4) { + boolean var5 = false; + float var6 = 6.0F / 16.0F; + float var7 = 10.0F / 16.0F; + var1.setBlockBounds(var6, 0.0F, var6, var7, 1.0F, var7); + this.renderStandardBlock(var1, var2, var3, var4); + boolean var8 = false; + boolean var9 = false; + if(this.blockAccess.getBlockId(var2 - 1, var3, var4) == var1.blockID || this.blockAccess.getBlockId(var2 + 1, var3, var4) == var1.blockID) { + var8 = true; + } + + if(this.blockAccess.getBlockId(var2, var3, var4 - 1) == var1.blockID || this.blockAccess.getBlockId(var2, var3, var4 + 1) == var1.blockID) { + var9 = true; + } + + boolean var10 = this.blockAccess.getBlockId(var2 - 1, var3, var4) == var1.blockID; + boolean var11 = this.blockAccess.getBlockId(var2 + 1, var3, var4) == var1.blockID; + boolean var12 = this.blockAccess.getBlockId(var2, var3, var4 - 1) == var1.blockID; + boolean var13 = this.blockAccess.getBlockId(var2, var3, var4 + 1) == var1.blockID; + if(!var8 && !var9) { + var8 = true; + } + + var6 = 7.0F / 16.0F; + var7 = 9.0F / 16.0F; + float var14 = 12.0F / 16.0F; + float var15 = 15.0F / 16.0F; + float var16 = var10 ? 0.0F : var6; + float var17 = var11 ? 1.0F : var7; + float var18 = var12 ? 0.0F : var6; + float var19 = var13 ? 1.0F : var7; + if(var8) { + var1.setBlockBounds(var16, var14, var6, var17, var15, var7); + this.renderStandardBlock(var1, var2, var3, var4); + } + + if(var9) { + var1.setBlockBounds(var6, var14, var18, var7, var15, var19); + this.renderStandardBlock(var1, var2, var3, var4); + } + + var14 = 6.0F / 16.0F; + var15 = 9.0F / 16.0F; + if(var8) { + var1.setBlockBounds(var16, var14, var6, var17, var15, var7); + this.renderStandardBlock(var1, var2, var3, var4); + } + + if(var9) { + var1.setBlockBounds(var6, var14, var18, var7, var15, var19); + this.renderStandardBlock(var1, var2, var3, var4); + } + + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + return var5; + } + + public boolean renderBlockStairs(Block var1, int var2, int var3, int var4) { + boolean var5 = false; + int var6 = this.blockAccess.getBlockMetadata(var2, var3, var4); + if(var6 == 0) { + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 0.5F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + var1.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + } else if(var6 == 1) { + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 1.0F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + var1.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + } else if(var6 == 2) { + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F); + this.renderStandardBlock(var1, var2, var3, var4); + var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 1.0F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + } else if(var6 == 3) { + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F); + this.renderStandardBlock(var1, var2, var3, var4); + var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F); + this.renderStandardBlock(var1, var2, var3, var4); + } + + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + return var5; + } + + public boolean renderBlockDoor(Block var1, int var2, int var3, int var4) { + Tessellator var5 = Tessellator.instance; + BlockDoor var6 = (BlockDoor)var1; + boolean var7 = false; + float var8 = 0.5F; + float var9 = 1.0F; + float var10 = 0.8F; + float var11 = 0.6F; + float var12 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + float var13 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + if(var6.minY > 0.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var8 * var13, var8 * var13, var8 * var13); + this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0)); + var7 = true; + var13 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4); + if(var6.maxY < 1.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var9 * var13, var9 * var13, var9 * var13); + this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1)); + var7 = true; + var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1); + if(var6.minZ > 0.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var10 * var13, var10 * var13, var10 * var13); + int var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2); + if(var14 < 0) { + this.flipTexture = true; + var14 = -var14; + } + + this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var14); + var7 = true; + this.flipTexture = false; + var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1); + if(var6.maxZ < 1.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var10 * var13, var10 * var13, var10 * var13); + var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3); + if(var14 < 0) { + this.flipTexture = true; + var14 = -var14; + } + + this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var14); + var7 = true; + this.flipTexture = false; + var13 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4); + if(var6.field_370_bf > 0.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var11 * var13, var11 * var13, var11 * var13); + var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4); + if(var14 < 0) { + this.flipTexture = true; + var14 = -var14; + } + + this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var14); + var7 = true; + this.flipTexture = false; + var13 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4); + if(var6.maxX < 1.0D) { + var13 = var12; + } + + if(Block.lightValue[var1.blockID] > 0) { + var13 = 1.0F; + } + + var5.setColorOpaque_F(var11 * var13, var11 * var13, var11 * var13); + var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5); + if(var14 < 0) { + this.flipTexture = true; + var14 = -var14; + } + + this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var14); + var7 = true; + this.flipTexture = false; + return var7; + } + + public void renderBottomFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minZ * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxZ * 16.0D - 0.01D) / 256.0D; + if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minZ < 0.0D || var1.maxZ > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + double var20 = var2 + var1.field_370_bf; + double var22 = var2 + var1.maxX; + double var24 = var4 + var1.minY; + double var26 = var6 + var1.minZ; + double var28 = var6 + var1.maxZ; + var9.addVertexWithUV(var20, var24, var28, var12, var18); + var9.addVertexWithUV(var20, var24, var26, var12, var16); + var9.addVertexWithUV(var22, var24, var26, var14, var16); + var9.addVertexWithUV(var22, var24, var28, var14, var18); + } + + public void renderTopFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minZ * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxZ * 16.0D - 0.01D) / 256.0D; + if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minZ < 0.0D || var1.maxZ > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + double var20 = var2 + var1.field_370_bf; + double var22 = var2 + var1.maxX; + double var24 = var4 + var1.maxY; + double var26 = var6 + var1.minZ; + double var28 = var6 + var1.maxZ; + var9.addVertexWithUV(var22, var24, var28, var14, var18); + var9.addVertexWithUV(var22, var24, var26, var14, var16); + var9.addVertexWithUV(var20, var24, var26, var12, var16); + var9.addVertexWithUV(var20, var24, var28, var12, var18); + } + + public void renderEastFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D; + double var20; + if(this.flipTexture) { + var20 = var12; + var12 = var14; + var14 = var20; + } + + if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minY < 0.0D || var1.maxY > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + var20 = var2 + var1.field_370_bf; + double var22 = var2 + var1.maxX; + double var24 = var4 + var1.minY; + double var26 = var4 + var1.maxY; + double var28 = var6 + var1.minZ; + var9.addVertexWithUV(var20, var26, var28, var14, var16); + var9.addVertexWithUV(var22, var26, var28, var12, var16); + var9.addVertexWithUV(var22, var24, var28, var12, var18); + var9.addVertexWithUV(var20, var24, var28, var14, var18); + } + + public void renderWestFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D; + double var20; + if(this.flipTexture) { + var20 = var12; + var12 = var14; + var14 = var20; + } + + if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minY < 0.0D || var1.maxY > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + var20 = var2 + var1.field_370_bf; + double var22 = var2 + var1.maxX; + double var24 = var4 + var1.minY; + double var26 = var4 + var1.maxY; + double var28 = var6 + var1.maxZ; + var9.addVertexWithUV(var20, var26, var28, var12, var16); + var9.addVertexWithUV(var20, var24, var28, var12, var18); + var9.addVertexWithUV(var22, var24, var28, var14, var18); + var9.addVertexWithUV(var22, var26, var28, var14, var16); + } + + public void renderNorthFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.minZ * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxZ * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D; + double var20; + if(this.flipTexture) { + var20 = var12; + var12 = var14; + var14 = var20; + } + + if(var1.minZ < 0.0D || var1.maxZ > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minY < 0.0D || var1.maxY > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + var20 = var2 + var1.field_370_bf; + double var22 = var4 + var1.minY; + double var24 = var4 + var1.maxY; + double var26 = var6 + var1.minZ; + double var28 = var6 + var1.maxZ; + var9.addVertexWithUV(var20, var24, var28, var14, var16); + var9.addVertexWithUV(var20, var24, var26, var12, var16); + var9.addVertexWithUV(var20, var22, var26, var12, var18); + var9.addVertexWithUV(var20, var22, var28, var14, var18); + } + + public void renderSouthFace(Block var1, double var2, double var4, double var6, int var8) { + Tessellator var9 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var8 = this.overrideBlockTexture; + } + + int var10 = (var8 & 15) << 4; + int var11 = var8 & 240; + double var12 = ((double)var10 + var1.minZ * 16.0D) / 256.0D; + double var14 = ((double)var10 + var1.maxZ * 16.0D - 0.01D) / 256.0D; + double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D; + double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D; + double var20; + if(this.flipTexture) { + var20 = var12; + var12 = var14; + var14 = var20; + } + + if(var1.minZ < 0.0D || var1.maxZ > 1.0D) { + var12 = (double)(((float)var10 + 0.0F) / 256.0F); + var14 = (double)(((float)var10 + 15.99F) / 256.0F); + } + + if(var1.minY < 0.0D || var1.maxY > 1.0D) { + var16 = (double)(((float)var11 + 0.0F) / 256.0F); + var18 = (double)(((float)var11 + 15.99F) / 256.0F); + } + + var20 = var2 + var1.maxX; + double var22 = var4 + var1.minY; + double var24 = var4 + var1.maxY; + double var26 = var6 + var1.minZ; + double var28 = var6 + var1.maxZ; + var9.addVertexWithUV(var20, var22, var28, var12, var18); + var9.addVertexWithUV(var20, var22, var26, var14, var18); + var9.addVertexWithUV(var20, var24, var26, var14, var16); + var9.addVertexWithUV(var20, var24, var28, var12, var16); + } + + public void func_1238_a(Block var1, float var2) { + int var3 = var1.getRenderType(); + Tessellator var4 = Tessellator.instance; + if(var3 == 0) { + var1.func_237_e(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + float var5 = 0.5F; + float var6 = 1.0F; + float var7 = 0.8F; + float var8 = 0.6F; + var4.startDrawingQuads(); + var4.setColorRGBA_F(var6, var6, var6, var2); + this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0)); + var4.setColorRGBA_F(var5, var5, var5, var2); + this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1)); + var4.setColorRGBA_F(var7, var7, var7, var2); + this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2)); + this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3)); + var4.setColorRGBA_F(var8, var8, var8, var2); + this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4)); + this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5)); + var4.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } + + } + + public void func_1227_a(Block var1) { + byte var2 = -1; + Tessellator var3 = Tessellator.instance; + int var4 = var1.getRenderType(); + if(var4 == 0) { + var1.func_237_e(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 1.0F, 0.0F); + this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, -1.0F); + this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, 1.0F); + this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(-1.0F, 0.0F, 0.0F); + this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(1.0F, 0.0F, 0.0F); + this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5)); + var3.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } else if(var4 == 1) { + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.func_1239_a(var1, var2, -0.5D, -0.5D, -0.5D); + var3.draw(); + } else if(var4 == 13) { + var1.func_237_e(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + float var5 = 1.0F / 16.0F; + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 1.0F, 0.0F); + this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, -1.0F); + var3.setTranslationF(0.0F, 0.0F, var5); + this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2)); + var3.setTranslationF(0.0F, 0.0F, -var5); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, 1.0F); + var3.setTranslationF(0.0F, 0.0F, -var5); + this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3)); + var3.setTranslationF(0.0F, 0.0F, var5); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(-1.0F, 0.0F, 0.0F); + var3.setTranslationF(var5, 0.0F, 0.0F); + this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4)); + var3.setTranslationF(-var5, 0.0F, 0.0F); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(1.0F, 0.0F, 0.0F); + var3.setTranslationF(-var5, 0.0F, 0.0F); + this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5)); + var3.setTranslationF(var5, 0.0F, 0.0F); + var3.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } else if(var4 == 6) { + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.func_1245_b(var1, var2, -0.5D, -0.5D, -0.5D); + var3.draw(); + } else if(var4 == 2) { + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.renderTorchAtAngle(var1, -0.5D, -0.5D, -0.5D, 0.0D, 0.0D); + var3.draw(); + } else { + int var7; + if(var4 == 10) { + for(var7 = 0; var7 < 2; ++var7) { + if(var7 == 0) { + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F); + } + + if(var7 == 1) { + var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F); + } + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 1.0F, 0.0F); + this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, -1.0F); + this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, 1.0F); + this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(-1.0F, 0.0F, 0.0F); + this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(1.0F, 0.0F, 0.0F); + this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5)); + var3.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } + } else if(var4 == 11) { + for(var7 = 0; var7 < 4; ++var7) { + float var6 = 2.0F / 16.0F; + if(var7 == 0) { + var1.setBlockBounds(0.5F - var6, 0.0F, 0.0F, 0.5F + var6, 1.0F, var6 * 2.0F); + } + + if(var7 == 1) { + var1.setBlockBounds(0.5F - var6, 0.0F, 1.0F - var6 * 2.0F, 0.5F + var6, 1.0F, 1.0F); + } + + var6 = 1.0F / 16.0F; + if(var7 == 2) { + var1.setBlockBounds(0.5F - var6, 1.0F - var6 * 3.0F, -var6 * 2.0F, 0.5F + var6, 1.0F - var6, 1.0F + var6 * 2.0F); + } + + if(var7 == 3) { + var1.setBlockBounds(0.5F - var6, 0.5F - var6 * 3.0F, -var6 * 2.0F, 0.5F + var6, 0.5F - var6, 1.0F + var6 * 2.0F); + } + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + var3.startDrawingQuads(); + var3.setNormal(0.0F, -1.0F, 0.0F); + this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 1.0F, 0.0F); + this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, -1.0F); + this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(0.0F, 0.0F, 1.0F); + this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(-1.0F, 0.0F, 0.0F); + this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4)); + var3.draw(); + var3.startDrawingQuads(); + var3.setNormal(1.0F, 0.0F, 0.0F); + this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5)); + var3.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } + + var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + + } + + public static boolean func_1219_a(int var0) { + return var0 == 0 ? true : (var0 == 13 ? true : (var0 == 10 ? true : var0 == 11)); + } +} diff --git a/src/main/java/net/minecraft/src/RenderBoat.java b/src/main/java/net/minecraft/src/RenderBoat.java new file mode 100644 index 0000000..0ddb923 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderBoat.java @@ -0,0 +1,40 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderBoat extends Render { + protected ModelBase field_198_d; + + public RenderBoat() { + this.field_9246_c = 0.5F; + this.field_198_d = new ModelBoat(); + } + + public void a(EntityBoat var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glRotatef(180.0F - var8, 0.0F, 1.0F, 0.0F); + float var10 = (float)var1.field_806_b - var9; + float var11 = (float)var1.field_807_a - var9; + if(var11 < 0.0F) { + var11 = 0.0F; + } + + if(var10 > 0.0F) { + GL11.glRotatef(MathHelper.sin(var10) * var10 * var11 / 10.0F * (float)var1.field_808_c, 1.0F, 0.0F, 0.0F); + } + + this.loadTexture("/terrain.png"); + float var12 = 12.0F / 16.0F; + GL11.glScalef(var12, var12, var12); + GL11.glScalef(1.0F / var12, 1.0F / var12, 1.0F / var12); + this.loadTexture("/item/boat.png"); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.field_198_d.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 1.0F / 16.0F); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityBoat)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderChicken.java b/src/main/java/net/minecraft/src/RenderChicken.java new file mode 100644 index 0000000..ae161a4 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderChicken.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +public class RenderChicken extends RenderLiving { + public RenderChicken(ModelBase var1, float var2) { + super(var1, var2); + } + + public void a(EntityChicken var1, double var2, double var4, double var6, float var8, float var9) { + super.a(var1, var2, var4, var6, var8, var9); + } + + protected float a(EntityChicken var1, float var2) { + float var3 = var1.field_756_e + (var1.field_752_b - var1.field_756_e) * var2; + float var4 = var1.field_757_d + (var1.field_758_c - var1.field_757_d) * var2; + return (MathHelper.sin(var3) + 1.0F) * var4; + } + + protected float func_170_d(EntityLiving var1, float var2) { + return this.a((EntityChicken)var1, var2); + } + + public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityChicken)var1, var2, var4, var6, var8, var9); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityChicken)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderCow.java b/src/main/java/net/minecraft/src/RenderCow.java new file mode 100644 index 0000000..dcd104a --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderCow.java @@ -0,0 +1,19 @@ +package net.minecraft.src; + +public class RenderCow extends RenderLiving { + public RenderCow(ModelBase var1, float var2) { + super(var1, var2); + } + + public void a(EntityCow var1, double var2, double var4, double var6, float var8, float var9) { + super.a(var1, var2, var4, var6, var8, var9); + } + + public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityCow)var1, var2, var4, var6, var8, var9); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityCow)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderCreeper.java b/src/main/java/net/minecraft/src/RenderCreeper.java new file mode 100644 index 0000000..08c349a --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderCreeper.java @@ -0,0 +1,56 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderCreeper extends RenderLiving { + public RenderCreeper() { + super(new ModelCreeper(), 0.5F); + } + + protected void a(EntityCreeper var1, float var2) { + float var4 = var1.func_440_b(var2); + float var5 = 1.0F + MathHelper.sin(var4 * 100.0F) * var4 * 0.01F; + if(var4 < 0.0F) { + var4 = 0.0F; + } + + if(var4 > 1.0F) { + var4 = 1.0F; + } + + var4 *= var4; + var4 *= var4; + float var6 = (1.0F + var4 * 0.4F) * var5; + float var7 = (1.0F + var4 * 0.1F) / var5; + GL11.glScalef(var6, var7, var6); + } + + protected int a(EntityCreeper var1, float var2, float var3) { + float var5 = var1.func_440_b(var3); + if((int)(var5 * 10.0F) % 2 == 0) { + return 0; + } else { + int var6 = (int)(var5 * 0.2F * 255.0F); + if(var6 < 0) { + var6 = 0; + } + + if(var6 > 255) { + var6 = 255; + } + + short var7 = 255; + short var8 = 255; + short var9 = 255; + return var6 << 24 | var7 << 16 | var8 << 8 | var9; + } + } + + protected void func_6330_a(EntityLiving var1, float var2) { + this.a((EntityCreeper)var1, var2); + } + + protected int func_173_a(EntityLiving var1, float var2, float var3) { + return this.a((EntityCreeper)var1, var2, var3); + } +} diff --git a/src/main/java/net/minecraft/src/RenderEngine.java b/src/main/java/net/minecraft/src/RenderEngine.java new file mode 100644 index 0000000..a23a08e --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderEngine.java @@ -0,0 +1,195 @@ +package net.minecraft.src; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.HashMap; + +import org.lwjgl.opengl.GL11; + +import net.lax1dude.eaglercraft.EaglerImage; + +public class RenderEngine { + + public RenderEngine(GameSettings gamesettings) { + textureMap = new HashMap(); + textureNameToImageMap = new HashMap(); + singleIntBuffer = GLAllocation.createDirectIntBuffer(1); + imageDataB1 = GLAllocation.createDirectByteBuffer(0x100000); + imageDataB2 = GLAllocation.createDirectByteBuffer(0x100000); + textureList = new ArrayList(); + clampTexture = false; + blurTexture = false; + options = gamesettings; + } + + public int getTexture(String s) { + Integer integer = (Integer) textureMap.get(s); + if (integer != null) { + return integer.intValue(); + } + try { + singleIntBuffer.clear(); + GLAllocation.generateTextureNames(singleIntBuffer); + int i = singleIntBuffer.get(0); + if (s.startsWith("%%")) { + clampTexture = true; + setupTexture(readTextureImage(GL11.loadResourceBytes(s.substring(7))), i); + clampTexture = false; + } else { + useMipmaps = true; + setupTexture(readTextureImage(GL11.loadResourceBytes(s)), i); + useMipmaps = false; + } + textureMap.put(s, Integer.valueOf(i)); + return i; + } catch (IOException ioexception) { + throw new RuntimeException("!!"); + } + } + + public int allocateAndSetupTexture(EaglerImage bufferedimage) { + singleIntBuffer.clear(); + GLAllocation.generateTextureNames(singleIntBuffer); + int i = singleIntBuffer.get(0); + setupTexture(bufferedimage, i); + textureNameToImageMap.put(Integer.valueOf(i), bufferedimage); + return i; + } + + public int allocateAndSetupTexture(byte[] data, int w, int h) { + int i = GL11.glGenTextures(); + bindTexture(i); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9729 /* GL_LINEAR */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9728 /* GL_NEAREST */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10497 /* GL_REPEAT */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10497 /* GL_REPEAT */); + imageDataB1.clear(); + imageDataB1.put(data); + imageDataB1.position(0).limit(data.length); + GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, 0, 6408 /* GL_RGBA */, w, h, 0, 6408 /* GL_RGBA */, + 5121 /* GL_UNSIGNED_BYTE */, imageDataB1); + return i; + } + + public void setupTexture(EaglerImage bufferedimage, int i) { + bindTexture(i); + if (useMipmaps) { + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, GL11.GL_NEAREST_MIPMAP_LINEAR); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, GL11.GL_NEAREST /* GL_LINEAR */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, GL11.GL_TEXTURE_MAX_LEVEL, 4); + } else { + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9728 /* GL_NEAREST */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9728 /* GL_NEAREST */); + } + if (blurTexture) { + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9729 /* GL_LINEAR */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9729 /* GL_LINEAR */); + } + if (clampTexture) { + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10496 /* GL_CLAMP */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10496 /* GL_CLAMP */); + } else { + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10497 /* GL_REPEAT */); + GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10497 /* GL_REPEAT */); + } + int j = bufferedimage.w; + int k = bufferedimage.h; + int ai[] = bufferedimage.data; + byte abyte0[] = new byte[j * k * 4]; + for (int l = 0; l < ai.length; l++) { + int j1 = ai[l] >> 24 & 0xff; + int l1 = ai[l] >> 16 & 0xff; + int j2 = ai[l] >> 8 & 0xff; + int l2 = ai[l] >> 0 & 0xff; + if (options != null && options.anaglyph) { + int j3 = (l1 * 30 + j2 * 59 + l2 * 11) / 100; + int l3 = (l1 * 30 + j2 * 70) / 100; + int j4 = (l1 * 30 + l2 * 70) / 100; + l1 = j3; + j2 = l3; + l2 = j4; + } + abyte0[l * 4 + 0] = (byte) l1; + abyte0[l * 4 + 1] = (byte) j2; + abyte0[l * 4 + 2] = (byte) l2; + abyte0[l * 4 + 3] = (byte) j1; + } + imageDataB1.clear(); + imageDataB1.put(abyte0); + imageDataB1.position(0).limit(abyte0.length); + GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, 0, 6408 /* GL_RGBA */, j, k, 0, 6408 /* GL_RGBA */, + 5121 /* GL_UNSIGNED_BYTE */, imageDataB1); + if (useMipmaps) { + for (int i1 = 1; i1 <= 4; i1++) { + int k1 = j >> i1 - 1; + int i2 = j >> i1; + int k2 = k >> i1; + imageDataB2.clear(); + for (int i3 = 0; i3 < i2; i3++) { + for (int k3 = 0; k3 < k2; k3++) { + int i4 = imageDataB1.getInt((i3 * 2 + 0 + (k3 * 2 + 0) * k1) * 4); + int k4 = imageDataB1.getInt((i3 * 2 + 1 + (k3 * 2 + 0) * k1) * 4); + int l4 = imageDataB1.getInt((i3 * 2 + 1 + (k3 * 2 + 1) * k1) * 4); + int i5 = imageDataB1.getInt((i3 * 2 + 0 + (k3 * 2 + 1) * k1) * 4); + int j5 = averageColor(averageColor(i4, k4), averageColor(l4, i5)); + imageDataB2.putInt((i3 + k3 * i2) * 4, j5); + } + + } + + GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, i1, 6408 /* GL_RGBA */, i2, k2, 0, 6408 /* GL_RGBA */, + 5121 /* GL_UNSIGNED_BYTE */, imageDataB2); + ByteBuffer tmp = imageDataB1; + imageDataB1 = imageDataB2; + imageDataB2 = tmp; + } + + } + } + + public void deleteTexture(int i) { + GL11.glDeleteTextures(i); + } + + public void registerTextureFX(TextureFX texturefx) { + textureList.add(texturefx); + texturefx.func_783_a(); + } + + private int averageColor(int i, int j) { + int k = (i & 0xff000000) >> 24 & 0xff; + int l = (j & 0xff000000) >> 24 & 0xff; + return ((k + l >> 1) << 24) + ((i & 0xfefefe) + (j & 0xfefefe) >> 1); + + } + + private EaglerImage readTextureImage(byte[] inputstream) throws IOException { + return GL11.loadPNG(inputstream); + } + + public void bindTexture(int i) { + if (i < 0) { + return; + } else { + GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, i); + return; + } + } + + public int getTextureForDownloadableImage(String s, String s1) { + return getTexture(s1); + } + + public static boolean useMipmaps = false; + private static HashMap textureMap; + private HashMap textureNameToImageMap; + private IntBuffer singleIntBuffer; + private ByteBuffer imageDataB1; + private ByteBuffer imageDataB2; + private java.util.List textureList; + private GameSettings options; + private boolean clampTexture; + private boolean blurTexture; +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/src/RenderEntity.java b/src/main/java/net/minecraft/src/RenderEntity.java new file mode 100644 index 0000000..52836e9 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderEntity.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderEntity extends Render { + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + renderOffsetAABB(var1.boundingBox, var2 - var1.lastTickPosX, var4 - var1.lastTickPosY, var6 - var1.lastTickPosZ); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/net/minecraft/src/RenderFallingSand.java b/src/main/java/net/minecraft/src/RenderFallingSand.java new file mode 100644 index 0000000..07fefad --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderFallingSand.java @@ -0,0 +1,27 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderFallingSand extends Render { + private RenderBlocks field_197_d = new RenderBlocks(); + + public RenderFallingSand() { + this.field_9246_c = 0.5F; + } + + public void a(EntityFallingSand var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + this.loadTexture("/terrain.png"); + Block var10 = Block.blocksList[var1.field_799_a]; + World var11 = var1.func_465_i(); + GL11.glDisable(GL11.GL_LIGHTING); + this.field_197_d.func_1243_a(var10, var11, MathHelper.floor_double(var1.posX), MathHelper.floor_double(var1.posY), MathHelper.floor_double(var1.posZ)); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityFallingSand)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderFireball.java b/src/main/java/net/minecraft/src/RenderFireball.java new file mode 100644 index 0000000..3461192 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderFireball.java @@ -0,0 +1,39 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderFireball extends Render { + public void a(EntityFireball var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var10 = 2.0F; + GL11.glScalef(var10 / 1.0F, var10 / 1.0F, var10 / 1.0F); + int var11 = Item.snowball.getIconIndex((ItemStack)null); + this.loadTexture("/gui/items.png"); + Tessellator var12 = Tessellator.instance; + float var13 = (float)(var11 % 16 * 16 + 0) / 256.0F; + float var14 = (float)(var11 % 16 * 16 + 16) / 256.0F; + float var15 = (float)(var11 / 16 * 16 + 0) / 256.0F; + float var16 = (float)(var11 / 16 * 16 + 16) / 256.0F; + float var17 = 1.0F; + float var18 = 0.5F; + float var19 = 0.25F; + GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F); + var12.startDrawingQuads(); + var12.setNormal(0.0F, 1.0F, 0.0F); + var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16); + var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16); + var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15); + var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15); + var12.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityFireball)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderFish.java b/src/main/java/net/minecraft/src/RenderFish.java new file mode 100644 index 0000000..2516387 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderFish.java @@ -0,0 +1,80 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderFish extends Render { + public void a(EntityFish var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(0.5F, 0.5F, 0.5F); + byte var10 = 1; + byte var11 = 2; + this.loadTexture("/particles.png"); + Tessellator var12 = Tessellator.instance; + float var13 = (float)(var10 * 8 + 0) / 128.0F; + float var14 = (float)(var10 * 8 + 8) / 128.0F; + float var15 = (float)(var11 * 8 + 0) / 128.0F; + float var16 = (float)(var11 * 8 + 8) / 128.0F; + float var17 = 1.0F; + float var18 = 0.5F; + float var19 = 0.5F; + GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F); + var12.startDrawingQuads(); + var12.setNormal(0.0F, 1.0F, 0.0F); + var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16); + var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16); + var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15); + var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15); + var12.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + if(var1.field_4097_b != null) { + float var20 = (var1.field_4097_b.prevRotationYaw + (var1.field_4097_b.rotationYaw - var1.field_4097_b.prevRotationYaw) * var9) * (float)Math.PI / 180.0F; + float var21 = (var1.field_4097_b.prevRotationPitch + (var1.field_4097_b.rotationPitch - var1.field_4097_b.prevRotationPitch) * var9) * (float)Math.PI / 180.0F; + double var22 = (double)MathHelper.sin(var20); + double var24 = (double)MathHelper.cos(var20); + double var26 = (double)MathHelper.sin(var21); + double var28 = (double)MathHelper.cos(var21); + double var30 = var1.field_4097_b.prevPosX + (var1.field_4097_b.posX - var1.field_4097_b.prevPosX) * (double)var9 - var24 * 0.7D - var22 * 0.5D * var28; + double var32 = var1.field_4097_b.prevPosY + (var1.field_4097_b.posY - var1.field_4097_b.prevPosY) * (double)var9 - var26 * 0.5D; + double var34 = var1.field_4097_b.prevPosZ + (var1.field_4097_b.posZ - var1.field_4097_b.prevPosZ) * (double)var9 - var22 * 0.7D + var24 * 0.5D * var28; + if(this.renderManager.options.thirdPersonView) { + var20 = (var1.field_4097_b.field_734_o + (var1.field_4097_b.field_735_n - var1.field_4097_b.field_734_o) * var9) * (float)Math.PI / 180.0F; + var22 = (double)MathHelper.sin(var20); + var24 = (double)MathHelper.cos(var20); + var30 = var1.field_4097_b.prevPosX + (var1.field_4097_b.posX - var1.field_4097_b.prevPosX) * (double)var9 - var24 * 0.35D - var22 * 0.85D; + var32 = var1.field_4097_b.prevPosY + (var1.field_4097_b.posY - var1.field_4097_b.prevPosY) * (double)var9 - 0.45D; + var34 = var1.field_4097_b.prevPosZ + (var1.field_4097_b.posZ - var1.field_4097_b.prevPosZ) * (double)var9 - var22 * 0.35D + var24 * 0.85D; + } + + double var36 = var1.prevPosX + (var1.posX - var1.prevPosX) * (double)var9; + double var38 = var1.prevPosY + (var1.posY - var1.prevPosY) * (double)var9 + 0.25D; + double var40 = var1.prevPosZ + (var1.posZ - var1.prevPosZ) * (double)var9; + double var42 = (double)((float)(var30 - var36)); + double var44 = (double)((float)(var32 - var38)); + double var46 = (double)((float)(var34 - var40)); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + var12.startDrawing(3); + var12.setColorOpaque_I(0); + byte var48 = 16; + + for(int var49 = 0; var49 <= var48; ++var49) { + float var50 = (float)var49 / (float)var48; + var12.addVertex(var2 + var42 * (double)var50, var4 + var44 * (double)(var50 * var50 + var50) * 0.5D + 0.25D, var6 + var46 * (double)var50); + } + + var12.draw(); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityFish)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderGhast.java b/src/main/java/net/minecraft/src/RenderGhast.java new file mode 100644 index 0000000..c75efc2 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderGhast.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderGhast extends RenderLiving { + public RenderGhast() { + super(new ModelGhast(), 0.5F); + } + + protected void a(EntityGhast var1, float var2) { + float var4 = ((float)var1.field_4125_e + (float)(var1.field_4124_f - var1.field_4125_e) * var2) / 20.0F; + if(var4 < 0.0F) { + var4 = 0.0F; + } + + var4 = 1.0F / (var4 * var4 * var4 * var4 * var4 * 2.0F + 1.0F); + float var5 = (8.0F + var4) / 2.0F; + float var6 = (8.0F + 1.0F / var4) / 2.0F; + GL11.glScalef(var6, var5, var6); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + protected void func_6330_a(EntityLiving var1, float var2) { + this.a((EntityGhast)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderGlobal.java b/src/main/java/net/minecraft/src/RenderGlobal.java new file mode 100644 index 0000000..4514826 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderGlobal.java @@ -0,0 +1,1023 @@ +package net.minecraft.src; + +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; + +public class RenderGlobal implements IWorldAccess { + public List field_1458_a = new ArrayList(); + private World worldObj; + private RenderEngine renderEngine; + private List field_1446_m = new ArrayList(); + private WorldRenderer[] field_1445_n; + private WorldRenderer[] field_1444_o; + private int field_1443_p; + private int field_1442_q; + private int field_1441_r; + private int field_1440_s; + private Minecraft mc; + private RenderBlocks field_1438_u; + private IntBuffer field_1437_v; + private int field_1435_x = 0; + private int field_1434_y; + private int field_1433_z; + private int field_1432_A; + private int field_1431_B; + private int field_1430_C; + private int field_1429_D; + private int field_1428_E; + private int field_1427_F; + private int field_1426_G; + private int field_1425_H = -1; + private int field_1424_I = 2; + private int field_1423_J; + private int field_1422_K; + private int field_1421_L; + int[] field_1457_b = new int['\uc350']; + IntBuffer field_1456_c = GLAllocation.createDirectIntBuffer(64); + private int field_1420_M; + private int field_1419_N; + private int field_1418_O; + private int field_1417_P; + private int field_1416_Q; + private List field_1415_R = new ArrayList(); + private RenderList[] field_1414_S = new RenderList[]{new RenderList(), new RenderList(), new RenderList(), new RenderList()}; + int field_1455_d = 0; + int field_1454_e = GLAllocation.generateDisplayLists(1); + double field_1453_f = -9999.0D; + double field_1452_g = -9999.0D; + double field_1451_h = -9999.0D; + public float field_1450_i; + int field_1449_j = 0; + + public RenderGlobal(Minecraft var1, RenderEngine var2) { + this.mc = var1; + this.renderEngine = var2; + byte var3 = 64; + this.field_1440_s = GLAllocation.generateDisplayLists(var3 * var3 * var3 * 3); + this.field_1434_y = GLAllocation.generateDisplayLists(3); + GL11.glPushMatrix(); + GL11.glNewList(this.field_1434_y, GL11.GL_COMPILE); + this.func_950_f(); + GL11.glEndList(); + GL11.glPopMatrix(); + Tessellator var4 = Tessellator.instance; + this.field_1433_z = this.field_1434_y + 1; + GL11.glNewList(this.field_1433_z, GL11.GL_COMPILE); + byte var6 = 64; + int var7 = 256 / var6 + 2; + float var5 = 16.0F; + + int var8; + int var9; + for(var8 = -var6 * var7; var8 <= var6 * var7; var8 += var6) { + for(var9 = -var6 * var7; var9 <= var6 * var7; var9 += var6) { + var4.startDrawingQuads(); + var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + 0)); + var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + 0)); + var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + var6)); + var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + var6)); + var4.draw(); + } + } + + GL11.glEndList(); + this.field_1432_A = this.field_1434_y + 2; + GL11.glNewList(this.field_1432_A, GL11.GL_COMPILE); + var5 = -16.0F; + var4.startDrawingQuads(); + + for(var8 = -var6 * var7; var8 <= var6 * var7; var8 += var6) { + for(var9 = -var6 * var7; var9 <= var6 * var7; var9 += var6) { + var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + 0)); + var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + 0)); + var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + var6)); + var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + var6)); + } + } + + var4.draw(); + GL11.glEndList(); + } + + private void func_950_f() { + Random var1 = new Random(10842L); + Tessellator var2 = Tessellator.instance; + var2.startDrawingQuads(); + + for(int var3 = 0; var3 < 1500; ++var3) { + double var4 = (double)(var1.nextFloat() * 2.0F - 1.0F); + double var6 = (double)(var1.nextFloat() * 2.0F - 1.0F); + double var8 = (double)(var1.nextFloat() * 2.0F - 1.0F); + double var10 = (double)(0.25F + var1.nextFloat() * 0.25F); + double var12 = var4 * var4 + var6 * var6 + var8 * var8; + if(var12 < 1.0D && var12 > 0.01D) { + var12 = 1.0D / Math.sqrt(var12); + var4 *= var12; + var6 *= var12; + var8 *= var12; + double var14 = var4 * 100.0D; + double var16 = var6 * 100.0D; + double var18 = var8 * 100.0D; + double var20 = Math.atan2(var4, var8); + double var22 = Math.sin(var20); + double var24 = Math.cos(var20); + double var26 = Math.atan2(Math.sqrt(var4 * var4 + var8 * var8), var6); + double var28 = Math.sin(var26); + double var30 = Math.cos(var26); + double var32 = var1.nextDouble() * Math.PI * 2.0D; + double var34 = Math.sin(var32); + double var36 = Math.cos(var32); + + for(int var38 = 0; var38 < 4; ++var38) { + double var39 = 0.0D; + double var41 = (double)((var38 & 2) - 1) * var10; + double var43 = (double)((var38 + 1 & 2) - 1) * var10; + double var47 = var41 * var36 - var43 * var34; + double var49 = var43 * var36 + var41 * var34; + double var53 = var47 * var28 + var39 * var30; + double var55 = var39 * var28 - var47 * var30; + double var57 = var55 * var22 - var49 * var24; + double var61 = var49 * var22 + var55 * var24; + var2.addVertex(var14 + var57, var16 + var53, var18 + var61); + } + } + } + + var2.draw(); + } + + public void func_946_a(World var1) { + if(this.worldObj != null) { + this.worldObj.removeWorldAccess(this); + } + + this.field_1453_f = -9999.0D; + this.field_1452_g = -9999.0D; + this.field_1451_h = -9999.0D; + RenderManager.instance.func_852_a(var1); + this.worldObj = var1; + this.field_1438_u = new RenderBlocks(var1); + if(var1 != null) { + var1.addWorldAccess(this); + this.func_958_a(); + } + + } + + public void func_958_a() { + Block.leaves.setGraphicsLevel(this.mc.gameSettings.fancyGraphics); + this.field_1425_H = this.mc.gameSettings.renderDistance; + int var1; + if(this.field_1444_o != null) { + for(var1 = 0; var1 < this.field_1444_o.length; ++var1) { + this.field_1444_o[var1].func_1204_c(); + } + } + + var1 = 64 << 3 - this.field_1425_H; + if(var1 > 400) { + var1 = 400; + } + + this.field_1443_p = var1 / 16 + 1; + this.field_1442_q = 8; + this.field_1441_r = var1 / 16 + 1; + this.field_1444_o = new WorldRenderer[this.field_1443_p * this.field_1442_q * this.field_1441_r]; + this.field_1445_n = new WorldRenderer[this.field_1443_p * this.field_1442_q * this.field_1441_r]; + int var2 = 0; + int var3 = 0; + this.field_1431_B = 0; + this.field_1430_C = 0; + this.field_1429_D = 0; + this.field_1428_E = this.field_1443_p; + this.field_1427_F = this.field_1442_q; + this.field_1426_G = this.field_1441_r; + + int var4; + for(var4 = 0; var4 < this.field_1446_m.size(); ++var4) { + ((WorldRenderer)this.field_1446_m.get(var4)).needsUpdate = false; + } + + this.field_1446_m.clear(); + this.field_1458_a.clear(); + + for(var4 = 0; var4 < this.field_1443_p; ++var4) { + for(int var5 = 0; var5 < this.field_1442_q; ++var5) { + for(int var6 = 0; var6 < this.field_1441_r; ++var6) { + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4] = new WorldRenderer(this.worldObj, this.field_1458_a, var4 * 16, var5 * 16, var6 * 16, 16, this.field_1440_s + var2); + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1733_y = false; + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1734_x = true; + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1749_o = true; + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1735_w = var3++; + this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].MarkDirty(); + this.field_1445_n[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4] = this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4]; + this.field_1446_m.add(this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4]); + var2 += 3; + } + } + } + + if(this.worldObj != null) { + EntityPlayerSP var7 = this.mc.thePlayer; + this.func_956_b(MathHelper.floor_double(var7.posX), MathHelper.floor_double(var7.posY), MathHelper.floor_double(var7.posZ)); + Arrays.sort(this.field_1445_n, new EntitySorter(var7)); + } + + this.field_1424_I = 2; + } + + public void func_951_a(Vec3D var1, ICamera var2, float var3) { + if(this.field_1424_I > 0) { + --this.field_1424_I; + } else { + TileEntityRenderer.instance.setRenderingContext(this.worldObj, this.renderEngine, this.mc.fontRenderer, this.mc.thePlayer, var3); + RenderManager.instance.func_857_a(this.worldObj, this.renderEngine, this.mc.fontRenderer, this.mc.thePlayer, this.mc.gameSettings, var3); + this.field_1423_J = 0; + this.field_1422_K = 0; + this.field_1421_L = 0; + EntityPlayerSP var4 = this.mc.thePlayer; + RenderManager.field_1232_b = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var3; + RenderManager.field_1231_c = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var3; + RenderManager.field_1230_d = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var3; + TileEntityRenderer.staticPlayerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var3; + TileEntityRenderer.staticPlayerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var3; + TileEntityRenderer.staticPlayerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var3; + List var5 = this.worldObj.func_658_i(); + this.field_1423_J = var5.size(); + + int var6; + for(var6 = 0; var6 < var5.size(); ++var6) { + Entity var7 = (Entity)var5.get(var6); + if(var7.func_390_a(var1) && var2.func_342_a(var7.boundingBox) && (var7 != this.mc.thePlayer || this.mc.gameSettings.thirdPersonView)) { + ++this.field_1422_K; + RenderManager.instance.func_854_a(var7, var3); + } + } + + for(var6 = 0; var6 < this.field_1458_a.size(); ++var6) { + TileEntityRenderer.instance.renderTileEntity((TileEntity)this.field_1458_a.get(var6), var3); + } + + } + } + + public String func_953_b() { + return "C: " + this.field_1417_P + "/" + this.field_1420_M + ". F: " + this.field_1419_N + ", O: " + this.field_1418_O + ", E: " + this.field_1416_Q; + } + + public String func_957_c() { + return "E: " + this.field_1422_K + "/" + this.field_1423_J + ". B: " + this.field_1421_L + ", I: " + (this.field_1423_J - this.field_1421_L - this.field_1422_K); + } + + private void func_956_b(int var1, int var2, int var3) { + var1 -= 8; + var2 -= 8; + var3 -= 8; + this.field_1431_B = Integer.MAX_VALUE; + this.field_1430_C = Integer.MAX_VALUE; + this.field_1429_D = Integer.MAX_VALUE; + this.field_1428_E = Integer.MIN_VALUE; + this.field_1427_F = Integer.MIN_VALUE; + this.field_1426_G = Integer.MIN_VALUE; + int var4 = this.field_1443_p * 16; + int var5 = var4 / 2; + + for(int var6 = 0; var6 < this.field_1443_p; ++var6) { + int var7 = var6 * 16; + int var8 = var7 + var5 - var1; + if(var8 < 0) { + var8 -= var4 - 1; + } + + var8 /= var4; + var7 -= var8 * var4; + if(var7 < this.field_1431_B) { + this.field_1431_B = var7; + } + + if(var7 > this.field_1428_E) { + this.field_1428_E = var7; + } + + for(int var9 = 0; var9 < this.field_1441_r; ++var9) { + int var10 = var9 * 16; + int var11 = var10 + var5 - var3; + if(var11 < 0) { + var11 -= var4 - 1; + } + + var11 /= var4; + var10 -= var11 * var4; + if(var10 < this.field_1429_D) { + this.field_1429_D = var10; + } + + if(var10 > this.field_1426_G) { + this.field_1426_G = var10; + } + + for(int var12 = 0; var12 < this.field_1442_q; ++var12) { + int var13 = var12 * 16; + if(var13 < this.field_1430_C) { + this.field_1430_C = var13; + } + + if(var13 > this.field_1427_F) { + this.field_1427_F = var13; + } + + WorldRenderer var14 = this.field_1444_o[(var9 * this.field_1442_q + var12) * this.field_1443_p + var6]; + boolean var15 = var14.needsUpdate; + var14.func_1197_a(var7, var13, var10); + if(!var15 && var14.needsUpdate) { + this.field_1446_m.add(var14); + } + } + } + } + + } + + public int func_943_a(EntityPlayer var1, int var2, double var3) { + if(this.mc.gameSettings.renderDistance != this.field_1425_H) { + this.func_958_a(); + } + + if(var2 == 0) { + this.field_1420_M = 0; + this.field_1419_N = 0; + this.field_1418_O = 0; + this.field_1417_P = 0; + this.field_1416_Q = 0; + } + + double var5 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * var3; + double var7 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * var3; + double var9 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * var3; + double var11 = var1.posX - this.field_1453_f; + double var13 = var1.posY - this.field_1452_g; + double var15 = var1.posZ - this.field_1451_h; + if(var11 * var11 + var13 * var13 + var15 * var15 > 16.0D) { + this.field_1453_f = var1.posX; + this.field_1452_g = var1.posY; + this.field_1451_h = var1.posZ; + this.func_956_b(MathHelper.floor_double(var1.posX), MathHelper.floor_double(var1.posY), MathHelper.floor_double(var1.posZ)); + Arrays.sort(this.field_1445_n, new EntitySorter(var1)); + } + + byte var17 = 0; + int var33 = var17 + this.func_952_a(0, this.field_1445_n.length, var2, var3); + return var33; + } + + private int func_952_a(int var1, int var2, int var3, double var4) { + this.field_1415_R.clear(); + int var6 = 0; + + for(int var7 = var1; var7 < var2; ++var7) { + if(var3 == 0) { + ++this.field_1420_M; + if(this.field_1445_n[var7].field_1748_p[var3]) { + ++this.field_1416_Q; + } else if(!this.field_1445_n[var7].field_1749_o) { + ++this.field_1419_N; + } else { + ++this.field_1417_P; + } + } + + if(!this.field_1445_n[var7].field_1748_p[var3] && this.field_1445_n[var7].field_1749_o && this.field_1445_n[var7].field_1734_x) { + int var8 = this.field_1445_n[var7].func_1200_a(var3); + if(var8 >= 0) { + this.field_1415_R.add(this.field_1445_n[var7]); + ++var6; + } + } + } + + EntityPlayerSP var19 = this.mc.thePlayer; + double var20 = var19.lastTickPosX + (var19.posX - var19.lastTickPosX) * var4; + double var10 = var19.lastTickPosY + (var19.posY - var19.lastTickPosY) * var4; + double var12 = var19.lastTickPosZ + (var19.posZ - var19.lastTickPosZ) * var4; + int var14 = 0; + + int var15; + for(var15 = 0; var15 < this.field_1414_S.length; ++var15) { + this.field_1414_S[var15].func_859_b(); + } + + for(var15 = 0; var15 < this.field_1415_R.size(); ++var15) { + WorldRenderer var16 = (WorldRenderer)this.field_1415_R.get(var15); + int var17 = -1; + + for(int var18 = 0; var18 < var14; ++var18) { + if(this.field_1414_S[var18].func_862_a(var16.field_1755_i, var16.field_1754_j, var16.field_1753_k)) { + var17 = var18; + } + } + + if(var17 < 0) { + var17 = var14++; + this.field_1414_S[var17].func_861_a(var16.field_1755_i, var16.field_1754_j, var16.field_1753_k, var20, var10, var12); + } + + this.field_1414_S[var17].func_858_a(var16.func_1200_a(var3)); + } + + this.func_944_a(var3, var4); + return var6; + } + + public void func_944_a(int var1, double var2) { + for(int var4 = 0; var4 < this.field_1414_S.length; ++var4) { + this.field_1414_S[var4].func_860_a(); + } + + } + + public void func_945_d() { + ++this.field_1435_x; + } + + public void func_4142_a(float var1) { + if(!this.mc.theWorld.worldProvider.field_4220_c) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + Vec3D var2 = this.worldObj.func_4079_a(this.mc.thePlayer, var1); + float var3 = (float)var2.xCoord; + float var4 = (float)var2.yCoord; + float var5 = (float)var2.zCoord; + float var7; + float var8; + if(this.mc.gameSettings.anaglyph) { + float var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F; + var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; + var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F; + var3 = var6; + var4 = var7; + var5 = var8; + } + + GL11.glColor3f(var3, var4, var5); + Tessellator var14 = Tessellator.instance; + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_FOG); + GL11.glColor3f(var3, var4, var5); + GL11.glCallList(this.field_1433_z); + GL11.glDisable(GL11.GL_FOG); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + float[] var15 = this.worldObj.worldProvider.func_4097_b(this.worldObj.getCelestialAngle(var1), var1); + float var11; + if(var15 != null) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glPushMatrix(); + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + var8 = this.worldObj.getCelestialAngle(var1); + GL11.glRotatef(var8 > 0.5F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); + var14.startDrawing(6); + var14.setColorRGBA_F(var15[0], var15[1], var15[2], var15[3]); + var14.addVertex(0.0D, 100.0D, 0.0D); + byte var9 = 16; + var14.setColorRGBA_F(var15[0], var15[1], var15[2], 0.0F); + + for(int var10 = 0; var10 <= var9; ++var10) { + var11 = (float)var10 * (float)Math.PI * 2.0F / (float)var9; + float var12 = MathHelper.sin(var11); + float var13 = MathHelper.cos(var11); + var14.addVertex((double)(var12 * 120.0F), (double)(var13 * 120.0F), (double)(-var13 * 40.0F * var15[3])); + } + + var14.draw(); + GL11.glPopMatrix(); + GL11.glShadeModel(GL11.GL_FLAT); + } + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GL11.glPushMatrix(); + var7 = 0.0F; + var8 = 0.0F; + float var16 = 0.0F; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glTranslatef(var7, var8, var16); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(this.worldObj.getCelestialAngle(var1) * 360.0F, 1.0F, 0.0F, 0.0F); + float var17 = 30.0F; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png")); + var14.startDrawingQuads(); + var14.addVertexWithUV((double)(-var17), 100.0D, (double)(-var17), 0.0D, 0.0D); + var14.addVertexWithUV((double)var17, 100.0D, (double)(-var17), 1.0D, 0.0D); + var14.addVertexWithUV((double)var17, 100.0D, (double)var17, 1.0D, 1.0D); + var14.addVertexWithUV((double)(-var17), 100.0D, (double)var17, 0.0D, 1.0D); + var14.draw(); + var17 = 20.0F; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon.png")); + var14.startDrawingQuads(); + var14.addVertexWithUV((double)(-var17), -100.0D, (double)var17, 1.0D, 1.0D); + var14.addVertexWithUV((double)var17, -100.0D, (double)var17, 0.0D, 1.0D); + var14.addVertexWithUV((double)var17, -100.0D, (double)(-var17), 0.0D, 0.0D); + var14.addVertexWithUV((double)(-var17), -100.0D, (double)(-var17), 1.0D, 0.0D); + var14.draw(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + var11 = this.worldObj.func_679_f(var1); + if(var11 > 0.0F) { + GL11.glColor4f(var11, var11, var11, var11); + GL11.glCallList(this.field_1434_y); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_FOG); + GL11.glPopMatrix(); + GL11.glColor3f(var3 * 0.2F + 0.04F, var4 * 0.2F + 0.04F, var5 * 0.6F + 0.1F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glCallList(this.field_1432_A); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(true); + } + } + + public void func_4141_b(float var1) { + if(!this.mc.theWorld.worldProvider.field_4220_c) { + if(this.mc.gameSettings.fancyGraphics) { + this.func_6510_c(var1); + } else { + GL11.glDisable(GL11.GL_CULL_FACE); + float var2 = (float)(this.mc.thePlayer.lastTickPosY + (this.mc.thePlayer.posY - this.mc.thePlayer.lastTickPosY) * (double)var1); + byte var3 = 32; + int var4 = 256 / var3; + Tessellator var5 = Tessellator.instance; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png")); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + Vec3D var6 = this.worldObj.func_628_d(var1); + float var7 = (float)var6.xCoord; + float var8 = (float)var6.yCoord; + float var9 = (float)var6.zCoord; + float var10; + if(this.mc.gameSettings.anaglyph) { + var10 = (var7 * 30.0F + var8 * 59.0F + var9 * 11.0F) / 100.0F; + float var11 = (var7 * 30.0F + var8 * 70.0F) / 100.0F; + float var12 = (var7 * 30.0F + var9 * 70.0F) / 100.0F; + var7 = var10; + var8 = var11; + var9 = var12; + } + + var10 = 0.5F / 1024.0F; + double var22 = this.mc.thePlayer.prevPosX + (this.mc.thePlayer.posX - this.mc.thePlayer.prevPosX) * (double)var1 + (double)(((float)this.field_1435_x + var1) * 0.03F); + double var13 = this.mc.thePlayer.prevPosZ + (this.mc.thePlayer.posZ - this.mc.thePlayer.prevPosZ) * (double)var1; + int var15 = MathHelper.floor_double(var22 / 2048.0D); + int var16 = MathHelper.floor_double(var13 / 2048.0D); + var22 -= (double)(var15 * 2048); + var13 -= (double)(var16 * 2048); + float var17 = 120.0F - var2 + 0.33F; + float var18 = (float)(var22 * (double)var10); + float var19 = (float)(var13 * (double)var10); + var5.startDrawingQuads(); + var5.setColorRGBA_F(var7, var8, var9, 0.8F); + + for(int var20 = -var3 * var4; var20 < var3 * var4; var20 += var3) { + for(int var21 = -var3 * var4; var21 < var3 * var4; var21 += var3) { + var5.addVertexWithUV((double)(var20 + 0), (double)var17, (double)(var21 + var3), (double)((float)(var20 + 0) * var10 + var18), (double)((float)(var21 + var3) * var10 + var19)); + var5.addVertexWithUV((double)(var20 + var3), (double)var17, (double)(var21 + var3), (double)((float)(var20 + var3) * var10 + var18), (double)((float)(var21 + var3) * var10 + var19)); + var5.addVertexWithUV((double)(var20 + var3), (double)var17, (double)(var21 + 0), (double)((float)(var20 + var3) * var10 + var18), (double)((float)(var21 + 0) * var10 + var19)); + var5.addVertexWithUV((double)(var20 + 0), (double)var17, (double)(var21 + 0), (double)((float)(var20 + 0) * var10 + var18), (double)((float)(var21 + 0) * var10 + var19)); + } + } + + var5.draw(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); + } + } + } + + public void func_6510_c(float var1) { + GL11.glDisable(GL11.GL_CULL_FACE); + float var2 = (float)(this.mc.thePlayer.lastTickPosY + (this.mc.thePlayer.posY - this.mc.thePlayer.lastTickPosY) * (double)var1); + Tessellator var3 = Tessellator.instance; + float var4 = 12.0F; + float var5 = 4.0F; + double var6 = (this.mc.thePlayer.prevPosX + (this.mc.thePlayer.posX - this.mc.thePlayer.prevPosX) * (double)var1 + (double)(((float)this.field_1435_x + var1) * 0.03F)) / (double)var4; + double var8 = (this.mc.thePlayer.prevPosZ + (this.mc.thePlayer.posZ - this.mc.thePlayer.prevPosZ) * (double)var1) / (double)var4 + (double)0.33F; + float var10 = 108.0F - var2 + 0.33F; + int var11 = MathHelper.floor_double(var6 / 2048.0D); + int var12 = MathHelper.floor_double(var8 / 2048.0D); + var6 -= (double)(var11 * 2048); + var8 -= (double)(var12 * 2048); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png")); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + Vec3D var13 = this.worldObj.func_628_d(var1); + float var14 = (float)var13.xCoord; + float var15 = (float)var13.yCoord; + float var16 = (float)var13.zCoord; + float var17; + float var18; + float var19; + if(this.mc.gameSettings.anaglyph) { + var17 = (var14 * 30.0F + var15 * 59.0F + var16 * 11.0F) / 100.0F; + var18 = (var14 * 30.0F + var15 * 70.0F) / 100.0F; + var19 = (var14 * 30.0F + var16 * 70.0F) / 100.0F; + var14 = var17; + var15 = var18; + var16 = var19; + } + + var17 = (float)(var6 * 0.0D); + var18 = (float)(var8 * 0.0D); + var19 = 0.00390625F; + var17 = (float)MathHelper.floor_double(var6) * var19; + var18 = (float)MathHelper.floor_double(var8) * var19; + float var20 = (float)(var6 - (double)MathHelper.floor_double(var6)); + float var21 = (float)(var8 - (double)MathHelper.floor_double(var8)); + byte var22 = 8; + byte var23 = 3; + float var24 = 1.0F / 1024.0F; + GL11.glScalef(var4, 1.0F, var4); + + for(int var25 = 0; var25 < 2; ++var25) { + if(var25 == 0) { + GL11.glColorMask(false, false, false, false); + } else { + GL11.glColorMask(true, true, true, true); + } + + for(int var26 = -var23 + 1; var26 <= var23; ++var26) { + for(int var27 = -var23 + 1; var27 <= var23; ++var27) { + var3.startDrawingQuads(); + float var28 = (float)(var26 * var22); + float var29 = (float)(var27 * var22); + float var30 = var28 - var20; + float var31 = var29 - var21; + if(var10 > -var5 - 1.0F) { + var3.setColorRGBA_F(var14 * 0.7F, var15 * 0.7F, var16 * 0.7F, 0.8F); + var3.setNormal(0.0F, -1.0F, 0.0F); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + } + + if(var10 <= var5 + 1.0F) { + var3.setColorRGBA_F(var14, var15, var16, 0.8F); + var3.setNormal(0.0F, 1.0F, 0.0F); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5 - var24), (double)(var31 + (float)var22), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5 - var24), (double)(var31 + (float)var22), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5 - var24), (double)(var31 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5 - var24), (double)(var31 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + } + + var3.setColorRGBA_F(var14 * 0.9F, var15 * 0.9F, var16 * 0.9F, 0.8F); + int var32; + if(var26 > -1) { + var3.setNormal(-1.0F, 0.0F, 0.0F); + + for(var32 = 0; var32 < var22; ++var32) { + var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + var5), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + } + } + + if(var26 <= 1) { + var3.setNormal(1.0F, 0.0F, 0.0F); + + for(var32 = 0; var32 < var22; ++var32) { + var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + var5), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + var5), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18)); + } + } + + var3.setColorRGBA_F(var14 * 0.8F, var15 * 0.8F, var16 * 0.8F, 0.8F); + if(var27 > -1) { + var3.setNormal(0.0F, 0.0F, -1.0F); + + for(var32 = 0; var32 < var22; ++var32) { + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + } + } + + if(var27 <= 1) { + var3.setNormal(0.0F, 0.0F, 1.0F); + + for(var32 = 0; var32 < var22; ++var32) { + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18)); + } + } + + var3.draw(); + } + } + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); + } + + public boolean func_948_a(EntityPlayer var1, boolean var2) { + Collections.sort(this.field_1446_m, new RenderSorter(var1)); + int var3 = this.field_1446_m.size() - 1; + int var4 = this.field_1446_m.size(); + + for(int var5 = 0; var5 < var4; ++var5) { + WorldRenderer var6 = (WorldRenderer)this.field_1446_m.get(var3 - var5); + if(!var2) { + if(var6.func_1202_a(var1) > 1024.0F) { + if(var6.field_1749_o) { + if(var5 >= 3) { + return false; + } + } else if(var5 >= 1) { + return false; + } + } + } else if(!var6.field_1749_o) { + continue; + } + + var6.func_1198_a(); + this.field_1446_m.remove(var6); + var6.needsUpdate = false; + } + + return this.field_1446_m.size() == 0; + } + + public void func_959_a(EntityPlayer var1, MovingObjectPosition var2, int var3, ItemStack var4, float var5) { + Tessellator var6 = Tessellator.instance; + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)System.currentTimeMillis() / 100.0F) * 0.2F + 0.4F) * 0.5F); + int var8; + if(var3 == 0) { + if(this.field_1450_i > 0.0F) { + GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR); + int var7 = this.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var7); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GL11.glPushMatrix(); + var8 = this.worldObj.getBlockId(var2.blockX, var2.blockY, var2.blockZ); + Block var9 = var8 > 0 ? Block.blocksList[var8] : null; + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glPolygonOffset(-3.0F, -3.0F); + GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + var6.startDrawingQuads(); + double var10 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var5; + double var12 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var5; + double var14 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var5; + var6.setTranslationD(-var10, -var12, -var14); + var6.disableColor(); + if(var9 == null) { + var9 = Block.stone; + } + + this.field_1438_u.renderBlockUsingTexture(var9, var2.blockX, var2.blockY, var2.blockZ, 240 + (int)(this.field_1450_i * 10.0F)); + var6.draw(); + var6.setTranslationD(0.0D, 0.0D, 0.0D); + GL11.glPolygonOffset(0.0F, 0.0F); + GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + } + } else if(var4 != null) { + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + float var16 = MathHelper.sin((float)System.currentTimeMillis() / 100.0F) * 0.2F + 0.8F; + GL11.glColor4f(var16, var16, var16, MathHelper.sin((float)System.currentTimeMillis() / 200.0F) * 0.2F + 0.5F); + var8 = this.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8); + int var17 = var2.blockX; + int var18 = var2.blockY; + int var11 = var2.blockZ; + if(var2.sideHit == 0) { + --var18; + } + + if(var2.sideHit == 1) { + ++var18; + } + + if(var2.sideHit == 2) { + --var11; + } + + if(var2.sideHit == 3) { + ++var11; + } + + if(var2.sideHit == 4) { + --var17; + } + + if(var2.sideHit == 5) { + ++var17; + } + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + } + + public void drawSelectionBox(EntityPlayer var1, MovingObjectPosition var2, int var3, ItemStack var4, float var5) { + if(var3 == 0 && var2.typeOfHit == 0) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + float var6 = 0.002F; + int var7 = this.worldObj.getBlockId(var2.blockX, var2.blockY, var2.blockZ); + if(var7 > 0) { + Block.blocksList[var7].setBlockBoundsBasedOnState(this.worldObj, var2.blockX, var2.blockY, var2.blockZ); + double var8 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var5; + double var10 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var5; + double var12 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var5; + this.drawOutlinedBoundingBox(Block.blocksList[var7].getSelectedBoundingBoxFromPool(this.worldObj, var2.blockX, var2.blockY, var2.blockZ).expands((double)var6, (double)var6, (double)var6).getOffsetBoundingBox(-var8, -var10, -var12)); + } + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + } + + } + + private void drawOutlinedBoundingBox(AxisAlignedBB var1) { + Tessellator var2 = Tessellator.instance; + var2.startDrawing(3); + var2.addVertex(var1.minX, var1.minY, var1.minZ); + var2.addVertex(var1.maxX, var1.minY, var1.minZ); + var2.addVertex(var1.maxX, var1.minY, var1.maxZ); + var2.addVertex(var1.minX, var1.minY, var1.maxZ); + var2.addVertex(var1.minX, var1.minY, var1.minZ); + var2.draw(); + var2.startDrawing(3); + var2.addVertex(var1.minX, var1.maxY, var1.minZ); + var2.addVertex(var1.maxX, var1.maxY, var1.minZ); + var2.addVertex(var1.maxX, var1.maxY, var1.maxZ); + var2.addVertex(var1.minX, var1.maxY, var1.maxZ); + var2.addVertex(var1.minX, var1.maxY, var1.minZ); + var2.draw(); + var2.startDrawing(1); + var2.addVertex(var1.minX, var1.minY, var1.minZ); + var2.addVertex(var1.minX, var1.maxY, var1.minZ); + var2.addVertex(var1.maxX, var1.minY, var1.minZ); + var2.addVertex(var1.maxX, var1.maxY, var1.minZ); + var2.addVertex(var1.maxX, var1.minY, var1.maxZ); + var2.addVertex(var1.maxX, var1.maxY, var1.maxZ); + var2.addVertex(var1.minX, var1.minY, var1.maxZ); + var2.addVertex(var1.minX, var1.maxY, var1.maxZ); + var2.draw(); + } + + public void func_949_a(int var1, int var2, int var3, int var4, int var5, int var6) { + int var7 = MathHelper.bucketInt(var1, 16); + int var8 = MathHelper.bucketInt(var2, 16); + int var9 = MathHelper.bucketInt(var3, 16); + int var10 = MathHelper.bucketInt(var4, 16); + int var11 = MathHelper.bucketInt(var5, 16); + int var12 = MathHelper.bucketInt(var6, 16); + + for(int var13 = var7; var13 <= var10; ++var13) { + int var14 = var13 % this.field_1443_p; + if(var14 < 0) { + var14 += this.field_1443_p; + } + + for(int var15 = var8; var15 <= var11; ++var15) { + int var16 = var15 % this.field_1442_q; + if(var16 < 0) { + var16 += this.field_1442_q; + } + + for(int var17 = var9; var17 <= var12; ++var17) { + int var18 = var17 % this.field_1441_r; + if(var18 < 0) { + var18 += this.field_1441_r; + } + + int var19 = (var18 * this.field_1442_q + var16) * this.field_1443_p + var14; + WorldRenderer var20 = this.field_1444_o[var19]; + if(!var20.needsUpdate) { + this.field_1446_m.add(var20); + } + + var20.MarkDirty(); + } + } + } + + } + + public void func_934_a(int var1, int var2, int var3) { + this.func_949_a(var1 - 1, var2 - 1, var3 - 1, var1 + 1, var2 + 1, var3 + 1); + } + + public void func_937_b(int var1, int var2, int var3, int var4, int var5, int var6) { + this.func_949_a(var1 - 1, var2 - 1, var3 - 1, var4 + 1, var5 + 1, var6 + 1); + } + + public void func_960_a(ICamera var1, float var2) { + for(int var3 = 0; var3 < this.field_1444_o.length; ++var3) { + if(!this.field_1444_o[var3].func_1196_e() && (!this.field_1444_o[var3].field_1749_o || (var3 + this.field_1449_j & 15) == 0)) { + this.field_1444_o[var3].func_1199_a(var1); + } + } + + ++this.field_1449_j; + } + + public void playRecord(String var1, int var2, int var3, int var4) { + if(var1 != null) { + this.mc.ingameGUI.func_553_b("C418 - " + var1); + } + + } + + public void playSound(String var1, double var2, double var4, double var6, float var8, float var9) { + float var10 = 16.0F; + if(var8 > 1.0F) { + var10 *= var8; + } + } + + public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) { + double var14 = this.mc.thePlayer.posX - var2; + double var16 = this.mc.thePlayer.posY - var4; + double var18 = this.mc.thePlayer.posZ - var6; + if(var14 * var14 + var16 * var16 + var18 * var18 <= 256.0D) { + if(var1 == "bubble") { + this.mc.field_6321_h.func_1192_a(new EntityBubbleFX(this.worldObj, var2, var4, var6, var8, var10, var12)); + } else if(var1 == "smoke") { + this.mc.field_6321_h.func_1192_a(new EntitySmokeFX(this.worldObj, var2, var4, var6)); + } else if(var1 == "portal") { + this.mc.field_6321_h.func_1192_a(new EntityPortalFX(this.worldObj, var2, var4, var6, var8, var10, var12)); + } else if(var1 == "explode") { + this.mc.field_6321_h.func_1192_a(new EntityExplodeFX(this.worldObj, var2, var4, var6, var8, var10, var12)); + } else if(var1 == "flame") { + this.mc.field_6321_h.func_1192_a(new EntityFlameFX(this.worldObj, var2, var4, var6, var8, var10, var12)); + } else if(var1 == "lava") { + this.mc.field_6321_h.func_1192_a(new EntityLavaFX(this.worldObj, var2, var4, var6)); + } else if(var1 == "splash") { + this.mc.field_6321_h.func_1192_a(new EntitySplashFX(this.worldObj, var2, var4, var6, var8, var10, var12)); + } else if(var1 == "largesmoke") { + this.mc.field_6321_h.func_1192_a(new EntitySmokeFX(this.worldObj, var2, var4, var6, 2.5F)); + } else if(var1 == "reddust") { + this.mc.field_6321_h.func_1192_a(new EntityReddustFX(this.worldObj, var2, var4, var6)); + } else if(var1 == "snowballpoof") { + this.mc.field_6321_h.func_1192_a(new EntitySlimeFX(this.worldObj, var2, var4, var6, Item.snowball)); + } else if(var1 == "slime") { + this.mc.field_6321_h.func_1192_a(new EntitySlimeFX(this.worldObj, var2, var4, var6, Item.slimeBall)); + } + + } + } + + public void obtainEntitySkin(Entity var1) { + + } + + public void releaseEntitySkin(Entity var1) { + + } + + public void func_936_e() { + for(int var1 = 0; var1 < this.field_1444_o.length; ++var1) { + if(this.field_1444_o[var1].field_1747_A) { + if(!this.field_1444_o[var1].needsUpdate) { + this.field_1446_m.add(this.field_1444_o[var1]); + } + + this.field_1444_o[var1].MarkDirty(); + } + } + + } + + public void func_935_a(int var1, int var2, int var3, TileEntity var4) { + } +} diff --git a/src/main/java/net/minecraft/src/RenderHelper.java b/src/main/java/net/minecraft/src/RenderHelper.java new file mode 100644 index 0000000..c93e990 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderHelper.java @@ -0,0 +1,49 @@ +package net.minecraft.src; + +import java.nio.FloatBuffer; +import org.lwjgl.opengl.GL11; + +public class RenderHelper { + private static FloatBuffer field_1695_a = GLAllocation.createDirectFloatBuffer(16); + + public static void disableStandardItemLighting() { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_LIGHT0); + GL11.glDisable(GL11.GL_LIGHT1); + GL11.glDisable(GL11.GL_COLOR_MATERIAL); + } + + public static void enableStandardItemLighting() { + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHT0); + GL11.glEnable(GL11.GL_LIGHT1); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + float var0 = 0.4F; + float var1 = 0.6F; + float var2 = 0.0F; + Vec3D var3 = Vec3D.createVector((double)0.2F, 1.0D, (double)-0.7F).normalize(); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, func_1157_a(var3.xCoord, var3.yCoord, var3.zCoord, 0.0D)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, func_1156_a(var1, var1, var1, 1.0F)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, func_1156_a(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, func_1156_a(var2, var2, var2, 1.0F)); + var3 = Vec3D.createVector((double)-0.2F, 1.0D, (double)0.7F).normalize(); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, func_1157_a(var3.xCoord, var3.yCoord, var3.zCoord, 0.0D)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, func_1156_a(var1, var1, var1, 1.0F)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, func_1156_a(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, func_1156_a(var2, var2, var2, 1.0F)); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, func_1156_a(var0, var0, var0, 1.0F)); + } + + private static FloatBuffer func_1157_a(double var0, double var2, double var4, double var6) { + return func_1156_a((float)var0, (float)var2, (float)var4, (float)var6); + } + + private static FloatBuffer func_1156_a(float var0, float var1, float var2, float var3) { + field_1695_a.clear(); + field_1695_a.put(var0).put(var1).put(var2).put(var3); + field_1695_a.flip(); + return field_1695_a; + } +} diff --git a/src/main/java/net/minecraft/src/RenderItem.java b/src/main/java/net/minecraft/src/RenderItem.java new file mode 100644 index 0000000..2d20c35 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderItem.java @@ -0,0 +1,195 @@ +package net.minecraft.src; + +import java.util.Random; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderItem extends Render { + private RenderBlocks renderBlocks = new RenderBlocks(); + private Random random = new Random(); + + public RenderItem() { + this.field_9246_c = 0.15F; + this.field_194_c = 12.0F / 16.0F; + } + + public void a(EntityItem var1, double var2, double var4, double var6, float var8, float var9) { + this.random.setSeed(187L); + ItemStack var10 = var1.item; + GL11.glPushMatrix(); + float var11 = MathHelper.sin(((float)var1.age + var9) / 10.0F + var1.field_804_d) * 0.1F + 0.1F; + float var12 = (((float)var1.age + var9) / 20.0F + var1.field_804_d) * (180.0F / (float)Math.PI); + byte var13 = 1; + if(var1.item.stackSize > 1) { + var13 = 2; + } + + if(var1.item.stackSize > 5) { + var13 = 3; + } + + if(var1.item.stackSize > 20) { + var13 = 4; + } + + GL11.glTranslatef((float)var2, (float)var4 + var11, (float)var6); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var16; + float var17; + float var18; + if(var10.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var10.itemID].getRenderType())) { + GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F); + this.loadTexture("/terrain.png"); + float var27 = 0.25F; + if(!Block.blocksList[var10.itemID].renderAsNormalBlock() && var10.itemID != Block.stairSingle.blockID) { + var27 = 0.5F; + } + + GL11.glScalef(var27, var27, var27); + + for(int var28 = 0; var28 < var13; ++var28) { + GL11.glPushMatrix(); + if(var28 > 0) { + var16 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27; + var17 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27; + var18 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27; + GL11.glTranslatef(var16, var17, var18); + } + + this.renderBlocks.func_1227_a(Block.blocksList[var10.itemID]); + GL11.glPopMatrix(); + } + } else { + GL11.glScalef(0.5F, 0.5F, 0.5F); + int var14 = var10.getIconIndex(); + if(var10.itemID < 256) { + this.loadTexture("/terrain.png"); + } else { + this.loadTexture("/gui/items.png"); + } + + Tessellator var15 = Tessellator.instance; + var16 = (float)(var14 % 16 * 16 + 0) / 256.0F; + var17 = (float)(var14 % 16 * 16 + 16) / 256.0F; + var18 = (float)(var14 / 16 * 16 + 0) / 256.0F; + float var19 = (float)(var14 / 16 * 16 + 16) / 256.0F; + float var20 = 1.0F; + float var21 = 0.5F; + float var22 = 0.25F; + + for(int var23 = 0; var23 < var13; ++var23) { + GL11.glPushMatrix(); + if(var23 > 0) { + float var24 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + float var25 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + float var26 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + GL11.glTranslatef(var24, var25, var26); + } + + GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + var15.startDrawingQuads(); + var15.setNormal(0.0F, 1.0F, 0.0F); + var15.addVertexWithUV((double)(0.0F - var21), (double)(0.0F - var22), 0.0D, (double)var16, (double)var19); + var15.addVertexWithUV((double)(var20 - var21), (double)(0.0F - var22), 0.0D, (double)var17, (double)var19); + var15.addVertexWithUV((double)(var20 - var21), (double)(1.0F - var22), 0.0D, (double)var17, (double)var18); + var15.addVertexWithUV((double)(0.0F - var21), (double)(1.0F - var22), 0.0D, (double)var16, (double)var18); + var15.draw(); + GL11.glPopMatrix(); + } + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void renderItemIntoGUI(FontRenderer var1, RenderEngine var2, ItemStack var3, int var4, int var5) { + if(var3 != null) { + if(var3.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) { + int var6 = var3.itemID; + var2.bindTexture(var2.getTexture("/terrain.png")); + Block var7 = Block.blocksList[var6]; + GL11.glPushMatrix(); + GL11.glTranslatef((float)(var4 - 2), (float)(var5 + 3), 0.0F); + GL11.glScalef(10.0F, 10.0F, 10.0F); + GL11.glTranslatef(1.0F, 0.5F, 8.0F); + GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glScalef(1.0F, 1.0F, 1.0F); + this.renderBlocks.func_1227_a(var7); + GL11.glPopMatrix(); + } else if(var3.getIconIndex() >= 0) { + GL11.glDisable(GL11.GL_LIGHTING); + if(var3.itemID < 256) { + var2.bindTexture(var2.getTexture("/terrain.png")); + } else { + var2.bindTexture(var2.getTexture("/gui/items.png")); + } + + this.renderTexturedQuad(var4, var5, var3.getIconIndex() % 16 * 16, var3.getIconIndex() / 16 * 16, 16, 16); + GL11.glEnable(GL11.GL_LIGHTING); + } + + GL11.glEnable(GL11.GL_CULL_FACE); + } + } + + public void renderItemOverlayIntoGUI(FontRenderer var1, RenderEngine var2, ItemStack var3, int var4, int var5) { + if(var3 != null) { + if(var3.stackSize > 1) { + String var6 = "" + var3.stackSize; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + var1.drawStringWithShadow(var6, var4 + 19 - 2 - var1.getStringWidth(var6), var5 + 6 + 3, 16777215); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + + if(var3.itemDamage > 0) { + int var11 = 13 - var3.itemDamage * 13 / var3.getMaxDamage(); + int var7 = 255 - var3.itemDamage * 255 / var3.getMaxDamage(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_TEXTURE_2D); + Tessellator var8 = Tessellator.instance; + int var9 = 255 - var7 << 16 | var7 << 8; + int var10 = (255 - var7) / 4 << 16 | 16128; + this.renderQuad(var8, var4 + 2, var5 + 13, 13, 2, 0); + this.renderQuad(var8, var4 + 2, var5 + 13, 12, 1, var10); + this.renderQuad(var8, var4 + 2, var5 + 13, var11, 1, var9); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + } + } + + private void renderQuad(Tessellator var1, int var2, int var3, int var4, int var5, int var6) { + var1.startDrawingQuads(); + var1.setColorOpaque_I(var6); + var1.addVertex((double)(var2 + 0), (double)(var3 + 0), 0.0D); + var1.addVertex((double)(var2 + 0), (double)(var3 + var5), 0.0D); + var1.addVertex((double)(var2 + var4), (double)(var3 + var5), 0.0D); + var1.addVertex((double)(var2 + var4), (double)(var3 + 0), 0.0D); + var1.draw(); + } + + public void renderTexturedQuad(int var1, int var2, int var3, int var4, int var5, int var6) { + float var7 = 0.0F; + float var8 = 0.00390625F; + float var9 = 0.00390625F; + Tessellator var10 = Tessellator.instance; + var10.startDrawingQuads(); + var10.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), (double)var7, (double)((float)(var3 + 0) * var8), (double)((float)(var4 + var6) * var9)); + var10.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), (double)var7, (double)((float)(var3 + var5) * var8), (double)((float)(var4 + var6) * var9)); + var10.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), (double)var7, (double)((float)(var3 + var5) * var8), (double)((float)(var4 + 0) * var9)); + var10.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), (double)var7, (double)((float)(var3 + 0) * var8), (double)((float)(var4 + 0) * var9)); + var10.draw(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityItem)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderList.java b/src/main/java/net/minecraft/src/RenderList.java new file mode 100644 index 0000000..5b68a1c --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderList.java @@ -0,0 +1,61 @@ +package net.minecraft.src; + +import java.nio.IntBuffer; +import org.lwjgl.opengl.GL11; + +public class RenderList { + private int field_1242_a; + private int field_1241_b; + private int field_1240_c; + private float field_1239_d; + private float field_1238_e; + private float field_1237_f; + private IntBuffer field_1236_g = GLAllocation.createDirectIntBuffer(65536); + private boolean field_1235_h = false; + private boolean field_1234_i = false; + + public void func_861_a(int var1, int var2, int var3, double var4, double var6, double var8) { + this.field_1235_h = true; + this.field_1236_g.clear(); + this.field_1242_a = var1; + this.field_1241_b = var2; + this.field_1240_c = var3; + this.field_1239_d = (float)var4; + this.field_1238_e = (float)var6; + this.field_1237_f = (float)var8; + } + + public boolean func_862_a(int var1, int var2, int var3) { + return !this.field_1235_h ? false : var1 == this.field_1242_a && var2 == this.field_1241_b && var3 == this.field_1240_c; + } + + public void func_858_a(int var1) { + this.field_1236_g.put(var1); + if(this.field_1236_g.remaining() == 0) { + this.func_860_a(); + } + + } + + public void func_860_a() { + if(this.field_1235_h) { + if(!this.field_1234_i) { + this.field_1236_g.flip(); + this.field_1234_i = true; + } + + if(this.field_1236_g.remaining() > 0) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)this.field_1242_a - this.field_1239_d, (float)this.field_1241_b - this.field_1238_e, (float)this.field_1240_c - this.field_1237_f); + GL11.glCallLists(this.field_1236_g); + GL11.glPopMatrix(); + } + + } + } + + public void func_859_b() { + this.field_1235_h = false; + this.field_1234_i = false; + } +} diff --git a/src/main/java/net/minecraft/src/RenderLiving.java b/src/main/java/net/minecraft/src/RenderLiving.java new file mode 100644 index 0000000..f5dc5f3 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderLiving.java @@ -0,0 +1,150 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderLiving extends Render { + protected ModelBase e; + protected ModelBase field_6332_f; + + public RenderLiving(ModelBase var1, float var2) { + this.e = var1; + this.field_9246_c = var2; + } + + public void func_4013_a(ModelBase var1) { + this.field_6332_f = var1; + } + + public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + this.e.field_1244_k = this.func_167_c(var1, var9); + this.e.field_1243_l = var1.ridingEntity != null || var1.field_9300_bu; + if(this.field_6332_f != null) { + this.field_6332_f.field_1243_l = this.e.field_1243_l; + } + + try { + float var10 = var1.field_734_o + (var1.field_735_n - var1.field_734_o) * var9; + float var11 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var9; + float var12 = var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9; + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + float var13 = this.func_170_d(var1, var9); + GL11.glRotatef(180.0F - var10, 0.0F, 1.0F, 0.0F); + float var14; + if(var1.deathTime > 0) { + var14 = ((float)var1.deathTime + var9 - 1.0F) / 20.0F * 1.6F; + var14 = MathHelper.sqrt_float(var14); + if(var14 > 1.0F) { + var14 = 1.0F; + } + + GL11.glRotatef(var14 * this.func_172_a(var1), 0.0F, 0.0F, 1.0F); + } + + var14 = 1.0F / 16.0F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.func_6330_a(var1, var9); + GL11.glTranslatef(0.0F, -24.0F * var14 - 0.0078125F, 0.0F); + float var15 = var1.field_705_Q + (var1.field_704_R - var1.field_705_Q) * var9; + float var16 = var1.field_703_S - var1.field_704_R * (1.0F - var9); + if(var15 > 1.0F) { + var15 = 1.0F; + } + + this.func_140_a(var1.skinUrl, var1.getEntityTexture()); + GL11.glEnable(GL11.GL_ALPHA_TEST); + this.e.render(var16, var15, var13, var11 - var10, var12, var14); + + for(int var17 = 0; var17 < 4; ++var17) { + if(this.func_166_a(var1, var17)) { + this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + } + + this.func_6331_b(var1, var9); + float var25 = var1.getEntityBrightness(var9); + int var18 = this.func_173_a(var1, var25, var9); + if((var18 >> 24 & 255) > 0 || var1.hurtTime > 0 || var1.deathTime > 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + if(var1.hurtTime > 0 || var1.deathTime > 0) { + GL11.glColor4f(var25, 0.0F, 0.0F, 0.4F); + this.e.render(var16, var15, var13, var11 - var10, var12, var14); + + for(int var19 = 0; var19 < 4; ++var19) { + if(this.func_166_a(var1, var19)) { + GL11.glColor4f(var25, 0.0F, 0.0F, 0.4F); + this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14); + } + } + } + + if((var18 >> 24 & 255) > 0) { + float var26 = (float)(var18 >> 16 & 255) / 255.0F; + float var20 = (float)(var18 >> 8 & 255) / 255.0F; + float var21 = (float)(var18 & 255) / 255.0F; + float var22 = (float)(var18 >> 24 & 255) / 255.0F; + GL11.glColor4f(var26, var20, var21, var22); + this.e.render(var16, var15, var13, var11 - var10, var12, var14); + + for(int var23 = 0; var23 < 4; ++var23) { + if(this.func_166_a(var1, var23)) { + GL11.glColor4f(var26, var20, var21, var22); + this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14); + } + } + } + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } catch (Exception var24) { + var24.printStackTrace(); + } + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + } + + protected float func_167_c(EntityLiving var1, float var2) { + return var1.getSwingProgress(var2); + } + + protected float func_170_d(EntityLiving var1, float var2) { + return (float)var1.field_9311_be + var2; + } + + protected void func_6331_b(EntityLiving var1, float var2) { + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return false; + } + + protected float func_172_a(EntityLiving var1) { + return 90.0F; + } + + protected int func_173_a(EntityLiving var1, float var2, float var3) { + return 0; + } + + protected void func_6330_a(EntityLiving var1, float var2) { + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityLiving)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderManager.java b/src/main/java/net/minecraft/src/RenderManager.java new file mode 100644 index 0000000..696db98 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderManager.java @@ -0,0 +1,120 @@ +package net.minecraft.src; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.lwjgl.opengl.GL11; + +public class RenderManager { + private Map entityRenderMap = new HashMap(); + public static RenderManager instance = new RenderManager(); + private FontRenderer field_1218_p; + public static double field_1232_b; + public static double field_1231_c; + public static double field_1230_d; + public RenderEngine renderEngine; + public ItemRenderer field_4236_f; + public World worldObj; + public EntityPlayer field_1226_h; + public float field_1225_i; + public float field_1224_j; + public GameSettings options; + public double field_1222_l; + public double field_1221_m; + public double field_1220_n; + + private RenderManager() { + this.entityRenderMap.put(EntitySpider.class, new RenderSpider()); + this.entityRenderMap.put(EntityPig.class, new RenderPig(new ModelPig(), new ModelPig(0.5F), 0.7F)); + this.entityRenderMap.put(EntitySheep.class, new RenderSheep(new ModelSheep2(), new ModelSheep1(), 0.7F)); + this.entityRenderMap.put(EntityCow.class, new RenderCow(new ModelCow(), 0.7F)); + this.entityRenderMap.put(EntityChicken.class, new RenderChicken(new ModelChicken(), 0.3F)); + this.entityRenderMap.put(EntityCreeper.class, new RenderCreeper()); + this.entityRenderMap.put(EntitySkeleton.class, new RenderBiped(new ModelSkeleton(), 0.5F)); + this.entityRenderMap.put(EntityZombie.class, new RenderBiped(new ModelZombie(), 0.5F)); + this.entityRenderMap.put(EntitySlime.class, new RenderSlime(new ModelSlime(16), new ModelSlime(0), 0.25F)); + this.entityRenderMap.put(EntityPlayer.class, new RenderPlayer()); + this.entityRenderMap.put(EntityZombieSimple.class, new RenderZombieSimple(new ModelZombie(), 0.5F, 6.0F)); + this.entityRenderMap.put(EntityGhast.class, new RenderGhast()); + this.entityRenderMap.put(EntityLiving.class, new RenderLiving(new ModelBiped(), 0.5F)); + this.entityRenderMap.put(Entity.class, new RenderEntity()); + this.entityRenderMap.put(EntityPainting.class, new RenderPainting()); + this.entityRenderMap.put(EntityArrow.class, new RenderArrow()); + this.entityRenderMap.put(EntitySnowball.class, new RenderSnowball()); + this.entityRenderMap.put(EntityFireball.class, new RenderFireball()); + this.entityRenderMap.put(EntityItem.class, new RenderItem()); + this.entityRenderMap.put(EntityTNTPrimed.class, new RenderTNTPrimed()); + this.entityRenderMap.put(EntityFallingSand.class, new RenderFallingSand()); + this.entityRenderMap.put(EntityMinecart.class, new RenderMinecart()); + this.entityRenderMap.put(EntityBoat.class, new RenderBoat()); + this.entityRenderMap.put(EntityFish.class, new RenderFish()); + Iterator var1 = this.entityRenderMap.values().iterator(); + + while(var1.hasNext()) { + Render var2 = (Render)var1.next(); + var2.setRenderManager(this); + } + + } + + public Render func_4117_a(Class var1) { + Render var2 = (Render)this.entityRenderMap.get(var1); + if(var2 == null && var1 != Entity.class) { + var2 = this.func_4117_a(var1.getSuperclass()); + this.entityRenderMap.put(var1, var2); + } + + return var2; + } + + public Render func_855_a(Entity var1) { + return this.func_4117_a(var1.getClass()); + } + + public void func_857_a(World var1, RenderEngine var2, FontRenderer var3, EntityPlayer var4, GameSettings var5, float var6) { + this.worldObj = var1; + this.renderEngine = var2; + this.options = var5; + this.field_1226_h = var4; + this.field_1218_p = var3; + this.field_1225_i = var4.prevRotationYaw + (var4.rotationYaw - var4.prevRotationYaw) * var6; + this.field_1224_j = var4.prevRotationPitch + (var4.rotationPitch - var4.prevRotationPitch) * var6; + this.field_1222_l = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var6; + this.field_1221_m = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var6; + this.field_1220_n = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var6; + } + + public void func_854_a(Entity var1, float var2) { + double var3 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var2; + double var5 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var2; + double var7 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var2; + float var9 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var2; + float var10 = var1.getEntityBrightness(var2); + GL11.glColor3f(var10, var10, var10); + this.func_853_a(var1, var3 - field_1232_b, var5 - field_1231_c, var7 - field_1230_d, var9, var2); + } + + public void func_853_a(Entity var1, double var2, double var4, double var6, float var8, float var9) { + Render var10 = this.func_855_a(var1); + if(var10 != null) { + var10.doRender(var1, var2, var4, var6, var8, var9); + var10.doRenderShadowAndFire(var1, var2, var4, var6, var8, var9); + } + + } + + public void func_852_a(World var1) { + this.worldObj = var1; + } + + public double func_851_a(double var1, double var3, double var5) { + double var7 = var1 - this.field_1222_l; + double var9 = var3 - this.field_1221_m; + double var11 = var5 - this.field_1220_n; + return var7 * var7 + var9 * var9 + var11 * var11; + } + + public FontRenderer getFontRenderer() { + return this.field_1218_p; + } +} diff --git a/src/main/java/net/minecraft/src/RenderMinecart.java b/src/main/java/net/minecraft/src/RenderMinecart.java new file mode 100644 index 0000000..f6b2c8f --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderMinecart.java @@ -0,0 +1,82 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderMinecart extends Render { + protected ModelBase a; + + public RenderMinecart() { + this.field_9246_c = 0.5F; + this.a = new ModelMinecart(); + } + + public void a(EntityMinecart var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + double var10 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var9; + double var12 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var9; + double var14 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var9; + double var16 = (double)0.3F; + Vec3D var18 = var1.func_514_g(var10, var12, var14); + float var19 = var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9; + if(var18 != null) { + Vec3D var20 = var1.func_515_a(var10, var12, var14, var16); + Vec3D var21 = var1.func_515_a(var10, var12, var14, -var16); + if(var20 == null) { + var20 = var18; + } + + if(var21 == null) { + var21 = var18; + } + + var2 += var18.xCoord - var10; + var4 += (var20.yCoord + var21.yCoord) / 2.0D - var12; + var6 += var18.zCoord - var14; + Vec3D var22 = var21.addVector(-var20.xCoord, -var20.yCoord, -var20.zCoord); + if(var22.lengthVector() != 0.0D) { + var22 = var22.normalize(); + var8 = (float)(Math.atan2(var22.zCoord, var22.xCoord) * 180.0D / Math.PI); + var19 = (float)(Math.atan(var22.yCoord) * 73.0D); + } + } + + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glRotatef(180.0F - var8, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var19, 0.0F, 0.0F, 1.0F); + float var23 = (float)var1.b - var9; + float var24 = (float)var1.a - var9; + if(var24 < 0.0F) { + var24 = 0.0F; + } + + if(var23 > 0.0F) { + GL11.glRotatef(MathHelper.sin(var23) * var23 * var24 / 10.0F * (float)var1.c, 1.0F, 0.0F, 0.0F); + } + + if(var1.d != 0) { + this.loadTexture("/terrain.png"); + float var25 = 12.0F / 16.0F; + GL11.glScalef(var25, var25, var25); + GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + if(var1.d == 1) { + (new RenderBlocks()).func_1227_a(Block.crate); + } else if(var1.d == 2) { + (new RenderBlocks()).func_1227_a(Block.stoneOvenIdle); + } + + GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, -(5.0F / 16.0F), 0.0F); + GL11.glScalef(1.0F / var25, 1.0F / var25, 1.0F / var25); + } + + this.loadTexture("/item/cart.png"); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.a.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 1.0F / 16.0F); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityMinecart)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderPainting.java b/src/main/java/net/minecraft/src/RenderPainting.java new file mode 100644 index 0000000..3ee1545 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderPainting.java @@ -0,0 +1,119 @@ +package net.minecraft.src; + +import java.util.Random; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderPainting extends Render { + private Random rand = new Random(); + + public void a(EntityPainting var1, double var2, double var4, double var6, float var8, float var9) { + this.rand.setSeed(187L); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glRotatef(var8, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + this.loadTexture("/art/kz.png"); + EnumArt var10 = var1.field_690_b; + float var11 = 1.0F / 16.0F; + GL11.glScalef(var11, var11, var11); + this.func_159_a(var1, var10.field_1623_z, var10.field_1636_A, var10.field_1634_B, var10.field_1632_C); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + private void func_159_a(EntityPainting var1, int var2, int var3, int var4, int var5) { + float var6 = (float)(-var2) / 2.0F; + float var7 = (float)(-var3) / 2.0F; + float var8 = -0.5F; + float var9 = 0.5F; + + for(int var10 = 0; var10 < var2 / 16; ++var10) { + for(int var11 = 0; var11 < var3 / 16; ++var11) { + float var12 = var6 + (float)((var10 + 1) * 16); + float var13 = var6 + (float)(var10 * 16); + float var14 = var7 + (float)((var11 + 1) * 16); + float var15 = var7 + (float)(var11 * 16); + this.func_160_a(var1, (var12 + var13) / 2.0F, (var14 + var15) / 2.0F); + float var16 = (float)(var4 + var2 - var10 * 16) / 256.0F; + float var17 = (float)(var4 + var2 - (var10 + 1) * 16) / 256.0F; + float var18 = (float)(var5 + var3 - var11 * 16) / 256.0F; + float var19 = (float)(var5 + var3 - (var11 + 1) * 16) / 256.0F; + float var20 = 12.0F / 16.0F; + float var21 = 13.0F / 16.0F; + float var22 = 0.0F; + float var23 = 1.0F / 16.0F; + float var24 = 12.0F / 16.0F; + float var25 = 13.0F / 16.0F; + float var26 = 0.001953125F; + float var27 = 0.001953125F; + float var28 = 385.0F / 512.0F; + float var29 = 385.0F / 512.0F; + float var30 = 0.0F; + float var31 = 1.0F / 16.0F; + Tessellator var32 = Tessellator.instance; + var32.startDrawingQuads(); + var32.setNormal(0.0F, 0.0F, -1.0F); + var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var17, (double)var18); + var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var16, (double)var18); + var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var16, (double)var19); + var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var17, (double)var19); + var32.setNormal(0.0F, 0.0F, 1.0F); + var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var20, (double)var22); + var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var21, (double)var22); + var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var21, (double)var23); + var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var20, (double)var23); + var32.setNormal(0.0F, -1.0F, 0.0F); + var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var24, (double)var26); + var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var25, (double)var26); + var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var25, (double)var27); + var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var24, (double)var27); + var32.setNormal(0.0F, 1.0F, 0.0F); + var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var24, (double)var26); + var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var25, (double)var26); + var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var25, (double)var27); + var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var24, (double)var27); + var32.setNormal(-1.0F, 0.0F, 0.0F); + var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var29, (double)var30); + var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var29, (double)var31); + var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var28, (double)var31); + var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var28, (double)var30); + var32.setNormal(1.0F, 0.0F, 0.0F); + var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var29, (double)var30); + var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var29, (double)var31); + var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var28, (double)var31); + var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var28, (double)var30); + var32.draw(); + } + } + + } + + private void func_160_a(EntityPainting var1, float var2, float var3) { + int var4 = MathHelper.floor_double(var1.posX); + int var5 = MathHelper.floor_double(var1.posY + (double)(var3 / 16.0F)); + int var6 = MathHelper.floor_double(var1.posZ); + if(var1.field_691_a == 0) { + var4 = MathHelper.floor_double(var1.posX + (double)(var2 / 16.0F)); + } + + if(var1.field_691_a == 1) { + var6 = MathHelper.floor_double(var1.posZ - (double)(var2 / 16.0F)); + } + + if(var1.field_691_a == 2) { + var4 = MathHelper.floor_double(var1.posX - (double)(var2 / 16.0F)); + } + + if(var1.field_691_a == 3) { + var6 = MathHelper.floor_double(var1.posZ + (double)(var2 / 16.0F)); + } + + float var7 = this.renderManager.worldObj.getLightBrightness(var4, var5, var6); + GL11.glColor3f(var7, var7, var7); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityPainting)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderPig.java b/src/main/java/net/minecraft/src/RenderPig.java new file mode 100644 index 0000000..0eb8b38 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderPig.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class RenderPig extends RenderLiving { + public RenderPig(ModelBase var1, ModelBase var2, float var3) { + super(var1, var3); + this.func_4013_a(var2); + } + + protected boolean a(EntityPig var1, int var2) { + this.loadTexture("/mob/saddle.png"); + return var2 == 0 && var1.rideable; + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return this.a((EntityPig)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderPlayer.java b/src/main/java/net/minecraft/src/RenderPlayer.java new file mode 100644 index 0000000..7eddfa9 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderPlayer.java @@ -0,0 +1,207 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderPlayer extends RenderLiving { + private ModelBiped field_209_f = (ModelBiped)this.e; + private ModelBiped field_208_g = new ModelBiped(1.0F); + private ModelBiped field_207_h = new ModelBiped(0.5F); + private static final String[] armorFilenamePrefix = new String[]{"cloth", "chain", "iron", "diamond", "gold"}; + + public RenderPlayer() { + super(new ModelBiped(0.0F), 0.5F); + } + + protected boolean a(EntityPlayer var1, int var2) { + ItemStack var3 = var1.inventory.armorItemInSlot(3 - var2); + if(var3 != null) { + Item var4 = var3.getItem(); + if(var4 instanceof ItemArmor) { + ItemArmor var5 = (ItemArmor)var4; + this.loadTexture("/armor/" + armorFilenamePrefix[var5.renderIndex] + "_" + (var2 == 2 ? 2 : 1) + ".png"); + ModelBiped var6 = var2 == 2 ? this.field_207_h : this.field_208_g; + var6.bipedHead.field_1403_h = var2 == 0; + var6.field_1285_b.field_1403_h = var2 == 0; + var6.field_1284_c.field_1403_h = var2 == 1 || var2 == 2; + var6.bipedRightArm.field_1403_h = var2 == 1; + var6.bipedLeftArm.field_1403_h = var2 == 1; + var6.bipedRightLeg.field_1403_h = var2 == 2 || var2 == 3; + var6.bipedLeftLeg.field_1403_h = var2 == 2 || var2 == 3; + this.func_4013_a(var6); + return true; + } + } + + return false; + } + + public void a(EntityPlayer var1, double var2, double var4, double var6, float var8, float var9) { + ItemStack var10 = var1.inventory.getCurrentItem(); + this.field_208_g.field_1278_i = this.field_207_h.field_1278_i = this.field_209_f.field_1278_i = var10 != null; + this.field_208_g.field_1277_j = this.field_207_h.field_1277_j = this.field_209_f.field_1277_j = var1.func_381_o(); + double var11 = var4 - (double)var1.yOffset; + if(var1.field_12240_bw) { + var11 -= 0.125D; + } + + super.a(var1, var2, var11, var6, var8, var9); + this.field_208_g.field_1277_j = this.field_207_h.field_1277_j = this.field_209_f.field_1277_j = false; + this.field_208_g.field_1278_i = this.field_207_h.field_1278_i = this.field_209_f.field_1278_i = false; + float var13 = 1.6F; + float var14 = (float)(1.0D / 60.0D) * var13; + float var15 = var1.getDistanceToEntity(this.renderManager.field_1226_h); + float var16 = var1.func_381_o() ? 32.0F : 64.0F; + if(var15 < var16) { + var14 = (float)((double)var14 * (Math.sqrt((double)var15) / 2.0D)); + FontRenderer var17 = this.getFontRendererFromRenderManager(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2 + 0.0F, (float)var4 + 2.3F, (float)var6); + GL11.glNormal3f(0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F); + GL11.glScalef(-var14, -var14, var14); + String var18 = var1.field_771_i; + GL11.glDisable(GL11.GL_LIGHTING); + Tessellator var19; + int var20; + if(!var1.func_381_o()) { + GL11.glDepthMask(false); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + var19 = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + var19.startDrawingQuads(); + var20 = var17.getStringWidth(var18) / 2; + var19.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F); + var19.addVertex((double)(-var20 - 1), -1.0D, 0.0D); + var19.addVertex((double)(-var20 - 1), 8.0D, 0.0D); + var19.addVertex((double)(var20 + 1), 8.0D, 0.0D); + var19.addVertex((double)(var20 + 1), -1.0D, 0.0D); + var19.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, 553648127); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(true); + var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, -1); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } else { + GL11.glTranslatef(0.0F, 0.25F / var14, 0.0F); + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + var19 = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + var19.startDrawingQuads(); + var20 = var17.getStringWidth(var18) / 2; + var19.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F); + var19.addVertex((double)(-var20 - 1), -1.0D, 0.0D); + var19.addVertex((double)(-var20 - 1), 8.0D, 0.0D); + var19.addVertex((double)(var20 + 1), 8.0D, 0.0D); + var19.addVertex((double)(var20 + 1), -1.0D, 0.0D); + var19.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(true); + var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, 553648127); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } + } + + } + + protected void a(EntityPlayer var1, float var2) { + ItemStack var3 = var1.inventory.armorItemInSlot(3); + if(var3 != null && var3.getItem().shiftedIndex < 256) { + GL11.glPushMatrix(); + this.field_209_f.bipedHead.func_926_b(1.0F / 16.0F); + if(RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) { + float var4 = 10.0F / 16.0F; + GL11.glTranslatef(0.0F, -0.25F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(var4, -var4, var4); + } + + this.renderManager.field_4236_f.renderItem(var3); + GL11.glPopMatrix(); + } + + ItemStack var6 = var1.inventory.getCurrentItem(); + if(var6 != null) { + GL11.glPushMatrix(); + this.field_209_f.bipedRightArm.func_926_b(1.0F / 16.0F); + GL11.glTranslatef(-(1.0F / 16.0F), 7.0F / 16.0F, 1.0F / 16.0F); + if(var1.fishEntity != null) { + var6 = new ItemStack(Item.stick.shiftedIndex); + } + + float var5; + if(var6.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var6.itemID].getRenderType())) { + var5 = 0.5F; + GL11.glTranslatef(0.0F, 3.0F / 16.0F, -(5.0F / 16.0F)); + var5 *= 12.0F / 16.0F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(var5, -var5, var5); + } else if(Item.itemsList[var6.itemID].isFull3D()) { + var5 = 10.0F / 16.0F; + if(Item.itemsList[var6.itemID].shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -(2.0F / 16.0F), 0.0F); + } + + GL11.glTranslatef(0.0F, 3.0F / 16.0F, 0.0F); + GL11.glScalef(var5, -var5, var5); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + var5 = 6.0F / 16.0F; + GL11.glTranslatef(0.25F, 3.0F / 16.0F, -(3.0F / 16.0F)); + GL11.glScalef(var5, var5, var5); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + this.renderManager.field_4236_f.renderItem(var6); + GL11.glPopMatrix(); + } + + } + + protected void b(EntityPlayer var1, float var2) { + float var3 = 15.0F / 16.0F; + GL11.glScalef(var3, var3, var3); + } + + public void drawFirstPersonHand() { + this.field_209_f.field_1244_k = 0.0F; + this.field_209_f.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 1.0F / 16.0F); + this.field_209_f.bipedRightArm.render(1.0F / 16.0F); + } + + protected void func_6330_a(EntityLiving var1, float var2) { + this.b((EntityPlayer)var1, var2); + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return this.a((EntityPlayer)var1, var2); + } + + protected void func_6331_b(EntityLiving var1, float var2) { + this.a((EntityPlayer)var1, var2); + } + + public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityPlayer)var1, var2, var4, var6, var8, var9); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityPlayer)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderSheep.java b/src/main/java/net/minecraft/src/RenderSheep.java new file mode 100644 index 0000000..7758c59 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderSheep.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class RenderSheep extends RenderLiving { + public RenderSheep(ModelBase var1, ModelBase var2, float var3) { + super(var1, var3); + this.func_4013_a(var2); + } + + protected boolean a(EntitySheep var1, int var2) { + this.loadTexture("/mob/sheep_fur.png"); + return var2 == 0 && !var1.sheared; + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return this.a((EntitySheep)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderSlime.java b/src/main/java/net/minecraft/src/RenderSlime.java new file mode 100644 index 0000000..da4aed6 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderSlime.java @@ -0,0 +1,44 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderSlime extends RenderLiving { + private ModelBase field_205_f; + + public RenderSlime(ModelBase var1, ModelBase var2, float var3) { + super(var1, var3); + this.field_205_f = var2; + } + + protected boolean a(EntitySlime var1, int var2) { + if(var2 == 0) { + this.func_4013_a(this.field_205_f); + GL11.glEnable(GL11.GL_NORMALIZE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + return true; + } else { + if(var2 == 1) { + GL11.glDisable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + return false; + } + } + + protected void a(EntitySlime var1, float var2) { + float var3 = (var1.field_767_b + (var1.field_768_a - var1.field_767_b) * var2) / ((float)var1.field_770_c * 0.5F + 1.0F); + float var4 = 1.0F / (var3 + 1.0F); + float var5 = (float)var1.field_770_c; + GL11.glScalef(var4 * var5, 1.0F / var4 * var5, var4 * var5); + } + + protected void func_6330_a(EntityLiving var1, float var2) { + this.a((EntitySlime)var1, var2); + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return this.a((EntitySlime)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderSnowball.java b/src/main/java/net/minecraft/src/RenderSnowball.java new file mode 100644 index 0000000..09cfde3 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderSnowball.java @@ -0,0 +1,38 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderSnowball extends Render { + public void a(EntitySnowball var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(0.5F, 0.5F, 0.5F); + int var10 = Item.snowball.getIconIndex((ItemStack)null); + this.loadTexture("/gui/items.png"); + Tessellator var11 = Tessellator.instance; + float var12 = (float)(var10 % 16 * 16 + 0) / 256.0F; + float var13 = (float)(var10 % 16 * 16 + 16) / 256.0F; + float var14 = (float)(var10 / 16 * 16 + 0) / 256.0F; + float var15 = (float)(var10 / 16 * 16 + 16) / 256.0F; + float var16 = 1.0F; + float var17 = 0.5F; + float var18 = 0.25F; + GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F); + var11.startDrawingQuads(); + var11.setNormal(0.0F, 1.0F, 0.0F); + var11.addVertexWithUV((double)(0.0F - var17), (double)(0.0F - var18), 0.0D, (double)var12, (double)var15); + var11.addVertexWithUV((double)(var16 - var17), (double)(0.0F - var18), 0.0D, (double)var13, (double)var15); + var11.addVertexWithUV((double)(var16 - var17), (double)(1.0F - var18), 0.0D, (double)var13, (double)var14); + var11.addVertexWithUV((double)(0.0F - var17), (double)(1.0F - var18), 0.0D, (double)var12, (double)var14); + var11.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntitySnowball)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderSorter.java b/src/main/java/net/minecraft/src/RenderSorter.java new file mode 100644 index 0000000..d8681a4 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderSorter.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +import java.util.Comparator; + +public class RenderSorter implements Comparator { + private EntityPlayer field_4274_a; + + public RenderSorter(EntityPlayer var1) { + this.field_4274_a = var1; + } + + public int a(WorldRenderer var1, WorldRenderer var2) { + boolean var3 = var1.field_1749_o; + boolean var4 = var2.field_1749_o; + if(var3 && !var4) { + return 1; + } else if(var4 && !var3) { + return -1; + } else { + double var5 = (double)var1.func_1202_a(this.field_4274_a); + double var7 = (double)var2.func_1202_a(this.field_4274_a); + return var5 < var7 ? 1 : (var5 > var7 ? -1 : (var1.field_1735_w < var2.field_1735_w ? 1 : -1)); + } + } + + public int compare(Object var1, Object var2) { + return this.a((WorldRenderer)var1, (WorldRenderer)var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderSpider.java b/src/main/java/net/minecraft/src/RenderSpider.java new file mode 100644 index 0000000..bae9d17 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderSpider.java @@ -0,0 +1,38 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderSpider extends RenderLiving { + public RenderSpider() { + super(new ModelSpider(), 1.0F); + this.func_4013_a(new ModelSpider()); + } + + protected float a(EntitySpider var1) { + return 180.0F; + } + + protected boolean a(EntitySpider var1, int var2) { + if(var2 != 0) { + return false; + } else if(var2 != 0) { + return false; + } else { + this.loadTexture("/mob/spider_eyes.png"); + float var3 = (1.0F - var1.getEntityBrightness(1.0F)) * 0.5F; + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, var3); + return true; + } + } + + protected float func_172_a(EntityLiving var1) { + return this.a((EntitySpider)var1); + } + + protected boolean func_166_a(EntityLiving var1, int var2) { + return this.a((EntitySpider)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/RenderTNTPrimed.java b/src/main/java/net/minecraft/src/RenderTNTPrimed.java new file mode 100644 index 0000000..d726ea0 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderTNTPrimed.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderTNTPrimed extends Render { + private RenderBlocks field_196_d = new RenderBlocks(); + + public RenderTNTPrimed() { + this.field_9246_c = 0.5F; + } + + public void a(EntityTNTPrimed var1, double var2, double var4, double var6, float var8, float var9) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var4, (float)var6); + float var10; + if((float)var1.fuse - var9 + 1.0F < 10.0F) { + var10 = 1.0F - ((float)var1.fuse - var9 + 1.0F) / 10.0F; + if(var10 < 0.0F) { + var10 = 0.0F; + } + + if(var10 > 1.0F) { + var10 = 1.0F; + } + + var10 *= var10; + var10 *= var10; + float var11 = 1.0F + var10 * 0.3F; + GL11.glScalef(var11, var11, var11); + } + + var10 = (1.0F - ((float)var1.fuse - var9 + 1.0F) / 100.0F) * 0.8F; + this.loadTexture("/terrain.png"); + this.field_196_d.func_1227_a(Block.tnt); + if(var1.fuse / 5 % 2 == 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, var10); + this.field_196_d.func_1227_a(Block.tnt); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glPopMatrix(); + } + + public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) { + this.a((EntityTNTPrimed)var1, var2, var4, var6, var8, var9); + } +} diff --git a/src/main/java/net/minecraft/src/RenderZombieSimple.java b/src/main/java/net/minecraft/src/RenderZombieSimple.java new file mode 100644 index 0000000..81df327 --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderZombieSimple.java @@ -0,0 +1,20 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class RenderZombieSimple extends RenderLiving { + private float field_204_f; + + public RenderZombieSimple(ModelBase var1, float var2, float var3) { + super(var1, var2 * var3); + this.field_204_f = var3; + } + + protected void a(EntityZombieSimple var1, float var2) { + GL11.glScalef(this.field_204_f, this.field_204_f, this.field_204_f); + } + + protected void func_6330_a(EntityLiving var1, float var2) { + this.a((EntityZombieSimple)var1, var2); + } +} diff --git a/src/main/java/net/minecraft/src/ScaledResolution.java b/src/main/java/net/minecraft/src/ScaledResolution.java new file mode 100644 index 0000000..d5ee8b8 --- /dev/null +++ b/src/main/java/net/minecraft/src/ScaledResolution.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +public class ScaledResolution { + private int scaledWidth; + private int scaledHeight; + public int scaleFactor; + + public ScaledResolution(int var1, int var2) { + this.scaledWidth = var1; + this.scaledHeight = var2; + + for(this.scaleFactor = 1; this.scaledWidth / (this.scaleFactor + 1) >= 320 && this.scaledHeight / (this.scaleFactor + 1) >= 240; ++this.scaleFactor) { + } + + this.scaledWidth /= this.scaleFactor; + this.scaledHeight /= this.scaleFactor; + } + + public int getScaledWidth() { + return this.scaledWidth; + } + + public int getScaledHeight() { + return this.scaledHeight; + } +} diff --git a/src/main/java/net/minecraft/src/Session.java b/src/main/java/net/minecraft/src/Session.java new file mode 100644 index 0000000..3f7ba86 --- /dev/null +++ b/src/main/java/net/minecraft/src/Session.java @@ -0,0 +1,46 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +public class Session { + public static List registeredBlocksList = new ArrayList(); + public String inventory; + public String field_6542_d; + + public Session(String var1) { + this.inventory = var1; + } + + static { + registeredBlocksList.add(Block.stone); + registeredBlocksList.add(Block.cobblestone); + registeredBlocksList.add(Block.brick); + registeredBlocksList.add(Block.dirt); + registeredBlocksList.add(Block.planks); + registeredBlocksList.add(Block.wood); + registeredBlocksList.add(Block.leaves); + registeredBlocksList.add(Block.torchWood); + registeredBlocksList.add(Block.stairSingle); + registeredBlocksList.add(Block.glass); + registeredBlocksList.add(Block.cobblestoneMossy); + registeredBlocksList.add(Block.sapling); + registeredBlocksList.add(Block.plantYellow); + registeredBlocksList.add(Block.plantRed); + registeredBlocksList.add(Block.mushroomBrown); + registeredBlocksList.add(Block.mushroomRed); + registeredBlocksList.add(Block.sand); + registeredBlocksList.add(Block.gravel); + registeredBlocksList.add(Block.sponge); + registeredBlocksList.add(Block.cloth); + registeredBlocksList.add(Block.oreCoal); + registeredBlocksList.add(Block.oreIron); + registeredBlocksList.add(Block.oreGold); + registeredBlocksList.add(Block.blockSteel); + registeredBlocksList.add(Block.blockGold); + registeredBlocksList.add(Block.bookShelf); + registeredBlocksList.add(Block.tnt); + registeredBlocksList.add(Block.obsidian); + System.out.println(registeredBlocksList.size()); + } +} diff --git a/src/main/java/net/minecraft/src/SignModel.java b/src/main/java/net/minecraft/src/SignModel.java new file mode 100644 index 0000000..927b6dc --- /dev/null +++ b/src/main/java/net/minecraft/src/SignModel.java @@ -0,0 +1,17 @@ +package net.minecraft.src; + +public class SignModel { + public ModelRenderer field_1346_a = new ModelRenderer(0, 0); + public ModelRenderer field_1345_b; + + public SignModel() { + this.field_1346_a.addBox(-12.0F, -14.0F, -1.0F, 24, 12, 2, 0.0F); + this.field_1345_b = new ModelRenderer(0, 14); + this.field_1345_b.addBox(-1.0F, -2.0F, -1.0F, 2, 14, 2, 0.0F); + } + + public void func_887_a() { + this.field_1346_a.render(1.0F / 16.0F); + this.field_1345_b.render(1.0F / 16.0F); + } +} diff --git a/src/main/java/net/minecraft/src/Slot.java b/src/main/java/net/minecraft/src/Slot.java new file mode 100644 index 0000000..3bc7e95 --- /dev/null +++ b/src/main/java/net/minecraft/src/Slot.java @@ -0,0 +1,40 @@ +package net.minecraft.src; + +public class Slot { + public final int slotIndex; + public final IInventory inventory; + + public Slot(IInventory var1, int var2) { + this.inventory = var1; + this.slotIndex = var2; + } + + public void onPickupFromSlot() { + this.onSlotChanged(); + } + + public boolean isItemValid(ItemStack var1) { + return true; + } + + public ItemStack getStack() { + return this.inventory.getStackInSlot(this.slotIndex); + } + + public void putStack(ItemStack var1) { + this.inventory.setInventorySlotContents(this.slotIndex, var1); + this.onSlotChanged(); + } + + public int func_775_c() { + return -1; + } + + public void onSlotChanged() { + this.inventory.onInventoryChanged(); + } + + public int getSlotStackLimit() { + return this.inventory.getInventoryStackLimit(); + } +} diff --git a/src/main/java/net/minecraft/src/SlotArmor.java b/src/main/java/net/minecraft/src/SlotArmor.java new file mode 100644 index 0000000..9e45e94 --- /dev/null +++ b/src/main/java/net/minecraft/src/SlotArmor.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +class SlotArmor extends SlotInventory { + final int field_1124_c; + final GuiInventory field_1123_d; + + SlotArmor(GuiInventory var1, GuiContainer var2, IInventory var3, int var4, int var5, int var6, int var7) { + super(var2, var3, var4, var5, var6); + this.field_1123_d = var1; + this.field_1124_c = var7; + } + + public int getSlotStackLimit() { + return 1; + } + + public boolean isItemValid(ItemStack var1) { + if(var1.getItem() instanceof ItemArmor) { + return ((ItemArmor)var1.getItem()).armorType == this.field_1124_c; + } else { + System.out.println(var1.getItem().shiftedIndex + ", " + this.field_1124_c); + return var1.getItem().shiftedIndex == Block.pumpkin.blockID ? this.field_1124_c == 0 : false; + } + } + + public int func_775_c() { + return 15 + this.field_1124_c * 16; + } +} diff --git a/src/main/java/net/minecraft/src/SlotCrafting.java b/src/main/java/net/minecraft/src/SlotCrafting.java new file mode 100644 index 0000000..82c363d --- /dev/null +++ b/src/main/java/net/minecraft/src/SlotCrafting.java @@ -0,0 +1,23 @@ +package net.minecraft.src; + +public class SlotCrafting extends SlotInventory { + private final IInventory craftMatrix; + + public SlotCrafting(GuiContainer var1, IInventory var2, IInventory var3, int var4, int var5, int var6) { + super(var1, var3, var4, var5, var6); + this.craftMatrix = var2; + } + + public boolean isItemValid(ItemStack var1) { + return false; + } + + public void onPickupFromSlot() { + for(int var1 = 0; var1 < this.craftMatrix.getSizeInventory(); ++var1) { + if(this.craftMatrix.getStackInSlot(var1) != null) { + this.craftMatrix.decrStackSize(var1, 1); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/SlotInventory.java b/src/main/java/net/minecraft/src/SlotInventory.java new file mode 100644 index 0000000..1a25104 --- /dev/null +++ b/src/main/java/net/minecraft/src/SlotInventory.java @@ -0,0 +1,22 @@ +package net.minecraft.src; + +public class SlotInventory extends Slot { + private final GuiContainer guiHandler; + public final int xPos; + public final int yPos; + + public SlotInventory(GuiContainer var1, IInventory var2, int var3, int var4, int var5) { + super(var2, var3); + this.guiHandler = var1; + this.xPos = var4; + this.yPos = var5; + } + + public boolean isAtCursorPos(int var1, int var2) { + int var3 = (this.guiHandler.width - this.guiHandler.xSize) / 2; + int var4 = (this.guiHandler.height - this.guiHandler.ySize) / 2; + var1 -= var3; + var2 -= var4; + return var1 >= this.xPos - 1 && var1 < this.xPos + 16 + 1 && var2 >= this.yPos - 1 && var2 < this.yPos + 16 + 1; + } +} diff --git a/src/main/java/net/minecraft/src/SpawnerAnimals.java b/src/main/java/net/minecraft/src/SpawnerAnimals.java new file mode 100644 index 0000000..e562ce6 --- /dev/null +++ b/src/main/java/net/minecraft/src/SpawnerAnimals.java @@ -0,0 +1,133 @@ +package net.minecraft.src; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +public final class SpawnerAnimals { + private static Set eligibleChunksForSpawning = new HashSet(); + + protected static ChunkPosition getRandomSpawningPointInChunk(World var0, int var1, int var2) { + int var3 = var1 + var0.rand.nextInt(16); + int var4 = var0.rand.nextInt(128); + int var5 = var2 + var0.rand.nextInt(16); + return new ChunkPosition(var3, var4, var5); + } + + public static final int performSpawning(World var0) { + eligibleChunksForSpawning.clear(); + + int var1; + for(var1 = 0; var1 < var0.playerEntities.size(); ++var1) { + EntityPlayer var2 = (EntityPlayer)var0.playerEntities.get(var1); + int var3 = MathHelper.floor_double(var2.posX / 16.0D); + int var4 = MathHelper.floor_double(var2.posZ / 16.0D); + byte var5 = 8; + + for(int var6 = -var5; var6 <= var5; ++var6) { + for(int var7 = -var5; var7 <= var5; ++var7) { + eligibleChunksForSpawning.add(new ChunkCoordIntPair(var6 + var3, var7 + var4)); + } + } + } + + var1 = 0; + + label113: + for(int var28 = 0; var28 < EnumCreatureType.values().length; ++var28) { + EnumCreatureType var29 = EnumCreatureType.values()[var28]; + if(var0.countEntities(var29.field_4278_c) <= var29.maxNumberOfEntityType * eligibleChunksForSpawning.size() / 256) { + Iterator var30 = eligibleChunksForSpawning.iterator(); + + label110: + while(true) { + int var8; + int var10; + int var11; + int var12; + Class[] var33; + do { + do { + ChunkCoordIntPair var31; + do { + do { + do { + if(!var30.hasNext()) { + continue label113; + } + + var31 = (ChunkCoordIntPair)var30.next(); + } while(var0.rand.nextInt(50) != 0); + + MobSpawnerBase var32 = var0.func_4075_a().func_4074_a(var31); + var33 = var32.getEntitiesForType(var29); + } while(var33 == null); + } while(var33.length == 0); + + var8 = var0.rand.nextInt(var33.length); + ChunkPosition var9 = getRandomSpawningPointInChunk(var0, var31.chunkXPos * 16, var31.chunkZPos * 16); + var10 = var9.x; + var11 = var9.y; + var12 = var9.z; + } while(var0.isBlockOpaqueCube(var10, var11, var12)); + } while(var0.getBlockMaterial(var10, var11, var12) != Material.air); + + int var13 = 0; + + for(int var14 = 0; var14 < 3; ++var14) { + int var15 = var10; + int var16 = var11; + int var17 = var12; + byte var18 = 6; + + for(int var19 = 0; var19 < 4; ++var19) { + var15 += var0.rand.nextInt(var18) - var0.rand.nextInt(var18); + var16 += var0.rand.nextInt(1) - var0.rand.nextInt(1); + var17 += var0.rand.nextInt(var18) - var0.rand.nextInt(var18); + if(var0.isBlockOpaqueCube(var15, var16 - 1, var17) && !var0.isBlockOpaqueCube(var15, var16, var17) && !var0.getBlockMaterial(var15, var16, var17).getIsLiquid() && !var0.isBlockOpaqueCube(var15, var16 + 1, var17)) { + float var20 = (float)var15 + 0.5F; + float var21 = (float)var16; + float var22 = (float)var17 + 0.5F; + if(var0.getClosestPlayer((double)var20, (double)var21, (double)var22, 24.0D) == null) { + float var23 = var20 - (float)var0.spawnX; + float var24 = var21 - (float)var0.spawnY; + float var25 = var22 - (float)var0.spawnZ; + float var26 = var23 * var23 + var24 * var24 + var25 * var25; + if(var26 >= 576.0F) { + EntityLiving var34; + try { + var34 = (EntityLiving)var33[var8].getConstructor(new Class[]{World.class}).newInstance(new Object[]{var0}); + } catch (Exception var27) { + var27.printStackTrace(); + return var1; + } + + var34.setLocationAndAngles((double)var20, (double)var21, (double)var22, var0.rand.nextFloat() * 360.0F, 0.0F); + if(var34.getCanSpawnHere()) { + ++var13; + var0.entityJoinedWorld(var34); + if(var34 instanceof EntitySpider && var0.rand.nextInt(100) == 0) { + EntitySkeleton var35 = new EntitySkeleton(var0); + var35.setLocationAndAngles((double)var20, (double)var21, (double)var22, var34.rotationYaw, 0.0F); + var0.entityJoinedWorld(var35); + var35.mountEntity(var34); + } + + if(var13 >= var34.func_6391_i()) { + continue label110; + } + } + + var1 += var13; + } + } + } + } + } + } + } + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/StepSound.java b/src/main/java/net/minecraft/src/StepSound.java new file mode 100644 index 0000000..1f27cbe --- /dev/null +++ b/src/main/java/net/minecraft/src/StepSound.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +public class StepSound { + public final String field_1678_a; + public final float field_1677_b; + public final float field_1679_c; + + public StepSound(String var1, float var2, float var3) { + this.field_1678_a = var1; + this.field_1677_b = var2; + this.field_1679_c = var3; + } + + public float func_1147_b() { + return this.field_1677_b; + } + + public float func_1144_c() { + return this.field_1679_c; + } + + public String func_1146_a() { + return "step." + this.field_1678_a; + } + + public String func_1145_d() { + return "step." + this.field_1678_a; + } +} diff --git a/src/main/java/net/minecraft/src/StepSoundSand.java b/src/main/java/net/minecraft/src/StepSoundSand.java new file mode 100644 index 0000000..04ecafa --- /dev/null +++ b/src/main/java/net/minecraft/src/StepSoundSand.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +final class StepSoundSand extends StepSound { + StepSoundSand(String var1, float var2, float var3) { + super(var1, var2, var3); + } + + public String func_1146_a() { + return "step.gravel"; + } +} diff --git a/src/main/java/net/minecraft/src/StepSoundStone.java b/src/main/java/net/minecraft/src/StepSoundStone.java new file mode 100644 index 0000000..992cb3d --- /dev/null +++ b/src/main/java/net/minecraft/src/StepSoundStone.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +final class StepSoundStone extends StepSound { + StepSoundStone(String var1, float var2, float var3) { + super(var1, var2, var3); + } + + public String func_1146_a() { + return "random.glass"; + } +} diff --git a/src/main/java/net/minecraft/src/Teleporter.java b/src/main/java/net/minecraft/src/Teleporter.java new file mode 100644 index 0000000..71860bd --- /dev/null +++ b/src/main/java/net/minecraft/src/Teleporter.java @@ -0,0 +1,262 @@ +package net.minecraft.src; + +import java.util.Random; + +public class Teleporter { + private Random field_4232_a = new Random(); + + public void func_4107_a(World var1, Entity var2) { + if(!this.func_4106_b(var1, var2)) { + this.func_4108_c(var1, var2); + this.func_4106_b(var1, var2); + } + } + + public boolean func_4106_b(World var1, Entity var2) { + short var3 = 128; + double var4 = -1.0D; + int var6 = 0; + int var7 = 0; + int var8 = 0; + int var9 = MathHelper.floor_double(var2.posX); + int var10 = MathHelper.floor_double(var2.posZ); + + double var18; + for(int var11 = var9 - var3; var11 <= var9 + var3; ++var11) { + double var12 = (double)var11 + 0.5D - var2.posX; + + for(int var14 = var10 - var3; var14 <= var10 + var3; ++var14) { + double var15 = (double)var14 + 0.5D - var2.posZ; + + for(int var17 = 127; var17 >= 0; --var17) { + if(var1.getBlockId(var11, var17, var14) == Block.portal.blockID) { + while(var1.getBlockId(var11, var17 - 1, var14) == Block.portal.blockID) { + --var17; + } + + var18 = (double)var17 + 0.5D - var2.posY; + double var20 = var12 * var12 + var18 * var18 + var15 * var15; + if(var4 < 0.0D || var20 < var4) { + var4 = var20; + var6 = var11; + var7 = var17; + var8 = var14; + } + } + } + } + } + + if(var4 >= 0.0D) { + double var22 = (double)var6 + 0.5D; + double var16 = (double)var7 + 0.5D; + var18 = (double)var8 + 0.5D; + if(var1.getBlockId(var6 - 1, var7, var8) == Block.portal.blockID) { + var22 -= 0.5D; + } + + if(var1.getBlockId(var6 + 1, var7, var8) == Block.portal.blockID) { + var22 += 0.5D; + } + + if(var1.getBlockId(var6, var7, var8 - 1) == Block.portal.blockID) { + var18 -= 0.5D; + } + + if(var1.getBlockId(var6, var7, var8 + 1) == Block.portal.blockID) { + var18 += 0.5D; + } + + System.out.println("Teleporting to " + var22 + ", " + var16 + ", " + var18); + var2.setLocationAndAngles(var22, var16, var18, var2.rotationYaw, 0.0F); + var2.motionX = var2.motionY = var2.motionZ = 0.0D; + return true; + } else { + return false; + } + } + + public boolean func_4108_c(World var1, Entity var2) { + byte var3 = 16; + double var4 = -1.0D; + int var6 = MathHelper.floor_double(var2.posX); + int var7 = MathHelper.floor_double(var2.posY); + int var8 = MathHelper.floor_double(var2.posZ); + int var9 = var6; + int var10 = var7; + int var11 = var8; + int var12 = 0; + int var13 = this.field_4232_a.nextInt(4); + + int var14; + double var15; + int var17; + double var18; + int var20; + int var21; + int var22; + int var23; + int var24; + int var25; + int var26; + int var27; + int var28; + double var32; + double var33; + for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) { + var15 = (double)var14 + 0.5D - var2.posX; + + for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) { + var18 = (double)var17 + 0.5D - var2.posZ; + + label293: + for(var20 = 127; var20 >= 0; --var20) { + if(var1.getBlockId(var14, var20, var17) == 0) { + while(var20 > 0 && var1.getBlockId(var14, var20 - 1, var17) == 0) { + --var20; + } + + for(var21 = var13; var21 < var13 + 4; ++var21) { + var22 = var21 % 2; + var23 = 1 - var22; + if(var21 % 4 >= 2) { + var22 = -var22; + var23 = -var23; + } + + for(var24 = 0; var24 < 3; ++var24) { + for(var25 = 0; var25 < 4; ++var25) { + for(var26 = -1; var26 < 4; ++var26) { + var27 = var14 + (var25 - 1) * var22 + var24 * var23; + var28 = var20 + var26; + int var29 = var17 + (var25 - 1) * var23 - var24 * var22; + if(var26 < 0 && !var1.getBlockMaterial(var27, var28, var29).func_878_a() || var26 >= 0 && var1.getBlockId(var27, var28, var29) != 0) { + continue label293; + } + } + } + } + + var32 = (double)var20 + 0.5D - var2.posY; + var33 = var15 * var15 + var32 * var32 + var18 * var18; + if(var4 < 0.0D || var33 < var4) { + var4 = var33; + var9 = var14; + var10 = var20; + var11 = var17; + var12 = var21 % 4; + } + } + } + } + } + } + + if(var4 < 0.0D) { + for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) { + var15 = (double)var14 + 0.5D - var2.posX; + + for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) { + var18 = (double)var17 + 0.5D - var2.posZ; + + label231: + for(var20 = 127; var20 >= 0; --var20) { + if(var1.getBlockId(var14, var20, var17) == 0) { + while(var1.getBlockId(var14, var20 - 1, var17) == 0) { + --var20; + } + + for(var21 = var13; var21 < var13 + 2; ++var21) { + var22 = var21 % 2; + var23 = 1 - var22; + + for(var24 = 0; var24 < 4; ++var24) { + for(var25 = -1; var25 < 4; ++var25) { + var26 = var14 + (var24 - 1) * var22; + var27 = var20 + var25; + var28 = var17 + (var24 - 1) * var23; + if(var25 < 0 && !var1.getBlockMaterial(var26, var27, var28).func_878_a() || var25 >= 0 && var1.getBlockId(var26, var27, var28) != 0) { + continue label231; + } + } + } + + var32 = (double)var20 + 0.5D - var2.posY; + var33 = var15 * var15 + var32 * var32 + var18 * var18; + if(var4 < 0.0D || var33 < var4) { + var4 = var33; + var9 = var14; + var10 = var20; + var11 = var17; + var12 = var21 % 2; + } + } + } + } + } + } + } + + int var30 = var9; + int var16 = var10; + var17 = var11; + int var31 = var12 % 2; + int var19 = 1 - var31; + if(var12 % 4 >= 2) { + var31 = -var31; + var19 = -var19; + } + + boolean var34; + if(var4 < 0.0D) { + if(var10 < 70) { + var10 = 70; + } + + if(var10 > 118) { + var10 = 118; + } + + var16 = var10; + + for(var20 = -1; var20 <= 1; ++var20) { + for(var21 = 1; var21 < 3; ++var21) { + for(var22 = -1; var22 < 3; ++var22) { + var23 = var30 + (var21 - 1) * var31 + var20 * var19; + var24 = var16 + var22; + var25 = var17 + (var21 - 1) * var19 - var20 * var31; + var34 = var22 < 0; + var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : 0); + } + } + } + } + + for(var20 = 0; var20 < 4; ++var20) { + var1.field_1043_h = true; + + for(var21 = 0; var21 < 4; ++var21) { + for(var22 = -1; var22 < 4; ++var22) { + var23 = var30 + (var21 - 1) * var31; + var24 = var16 + var22; + var25 = var17 + (var21 - 1) * var19; + var34 = var21 == 0 || var21 == 3 || var22 == -1 || var22 == 3; + var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : Block.portal.blockID); + } + } + + var1.field_1043_h = false; + + for(var21 = 0; var21 < 4; ++var21) { + for(var22 = -1; var22 < 4; ++var22) { + var23 = var30 + (var21 - 1) * var31; + var24 = var16 + var22; + var25 = var17 + (var21 - 1) * var19; + var1.notifyBlocksOfNeighborChange(var23, var24, var25, var1.getBlockId(var23, var24, var25)); + } + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/TerrainTextureManager.java b/src/main/java/net/minecraft/src/TerrainTextureManager.java new file mode 100644 index 0000000..6e1b295 --- /dev/null +++ b/src/main/java/net/minecraft/src/TerrainTextureManager.java @@ -0,0 +1,87 @@ +package net.minecraft.src; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Arrays; +import javax.imageio.ImageIO; + +public class TerrainTextureManager { + private float[] field_1181_a = new float[768]; + private int[] field_1180_b = new int[5120]; + private int[] field_1186_c = new int[5120]; + private int[] field_1185_d = new int[5120]; + private int[] field_1184_e = new int[5120]; + private int[] field_1183_f = new int[34]; + private int[] field_1182_g = new int[768]; + + public TerrainTextureManager() { + try { + BufferedImage var1 = ImageIO.read(TerrainTextureManager.class.getResource("/terrain.png")); + int[] var2 = new int[65536]; + var1.getRGB(0, 0, 256, 256, var2, 0, 256); + + for(int var3 = 0; var3 < 256; ++var3) { + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var7 = var3 % 16 * 16; + int var8 = var3 / 16 * 16; + int var9 = 0; + + for(int var10 = 0; var10 < 16; ++var10) { + for(int var11 = 0; var11 < 16; ++var11) { + int var12 = var2[var11 + var7 + (var10 + var8) * 256]; + int var13 = var12 >> 24 & 255; + if(var13 > 128) { + var4 += var12 >> 16 & 255; + var5 += var12 >> 8 & 255; + var6 += var12 & 255; + ++var9; + } + } + + if(var9 == 0) { + ++var9; + } + + this.field_1181_a[var3 * 3 + 0] = (float)(var4 / var9); + this.field_1181_a[var3 * 3 + 1] = (float)(var5 / var9); + this.field_1181_a[var3 * 3 + 2] = (float)(var6 / var9); + } + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + for(int var15 = 0; var15 < 256; ++var15) { + if(Block.blocksList[var15] != null) { + this.field_1182_g[var15 * 3 + 0] = Block.blocksList[var15].getBlockTextureFromSide(1); + this.field_1182_g[var15 * 3 + 1] = Block.blocksList[var15].getBlockTextureFromSide(2); + this.field_1182_g[var15 * 3 + 2] = Block.blocksList[var15].getBlockTextureFromSide(3); + } + } + + } + + private void func_800_a() { + for(int var1 = 0; var1 < 32; ++var1) { + for(int var2 = 0; var2 < 160; ++var2) { + int var3 = var1 + var2 * 32; + if(this.field_1186_c[var3] == 0) { + this.field_1180_b[var3] = 0; + } + + if(this.field_1185_d[var3] > this.field_1186_c[var3]) { + int var4 = this.field_1180_b[var3] >> 24 & 255; + this.field_1180_b[var3] = ((this.field_1180_b[var3] & 16711422) >> 1) + this.field_1184_e[var3]; + if(var4 < 128) { + this.field_1180_b[var3] = Integer.MIN_VALUE + this.field_1184_e[var3] * 2; + } else { + this.field_1180_b[var3] |= -16777216; + } + } + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/Tessellator.java b/src/main/java/net/minecraft/src/Tessellator.java new file mode 100644 index 0000000..b5605a4 --- /dev/null +++ b/src/main/java/net/minecraft/src/Tessellator.java @@ -0,0 +1,268 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Float32Array; +import org.teavm.jso.typedarrays.Int32Array; + +public class Tessellator { + + private Int32Array intBuffer; + private Float32Array floatBuffer; + private int vertexCount = 0; + private float textureU; + private float textureV; + private int color; + private boolean hasColor = false; + private boolean hasTexture = false; + private int rawBufferIndex = 0; + private int addedVertices = 0; + private boolean isColorDisabled = false; + private int drawMode; + private double xOffset; + private double yOffset; + private double zOffset; + public static final Tessellator instance = new Tessellator(524288); + private boolean isDrawing = false; + + private Tessellator(int par1) { + ArrayBuffer a = ArrayBuffer.create(par1 * 4); + this.intBuffer = Int32Array.create(a); + this.floatBuffer = Float32Array.create(a); + } + + /** + * Draws the data set up in this tessellator and resets the state to prepare for + * new drawing. + */ + public int draw() { + if (!this.isDrawing) { + return 0; + } else { + this.isDrawing = false; + + if (this.vertexCount > 0) { + + if (this.hasTexture) { + GL11.glEnableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if (this.hasColor) { + GL11.glEnableVertexAttrib(GL11.GL_COLOR_ARRAY); + } + + GL11.glDrawArrays(this.drawMode, 0, this.vertexCount, Int32Array.create(intBuffer.getBuffer(), 0, this.vertexCount * 7)); + + if (this.hasTexture) { + GL11.glDisableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if (this.hasColor) { + GL11.glDisableVertexAttrib(GL11.GL_COLOR_ARRAY); + } + } + + int var1 = this.rawBufferIndex * 4; + this.reset(); + return var1; + } + } + + /** + * Clears the tessellator state in preparation for new drawing. + */ + private void reset() { + this.vertexCount = 0; + //this.byteBuffer.clear(); + this.rawBufferIndex = 0; + this.addedVertices = 0; + } + + /** + * Sets draw mode in the tessellator to draw quads. + */ + public void startDrawingQuads() { + this.startDrawing(GL11.GL_QUADS); + } + + /** + * Resets tessellator state and prepares for drawing (with the specified draw + * mode). + */ + public void startDrawing(int par1) { + if (this.isDrawing) { + this.draw(); + } + this.isDrawing = true; + this.reset(); + this.drawMode = par1; + this.hasColor = false; + this.hasTexture = false; + this.isColorDisabled = false; + } + + /** + * Sets the texture coordinates. + */ + public void setTextureUV(double par1, double par3) { + this.hasTexture = true; + this.textureU = (float) par1; + this.textureV = (float) par3; + } + + /** + * Sets the RGB values as specified, converting from floats between 0 and 1 to + * integers from 0-255. + */ + public void setColorOpaque_F(float par1, float par2, float par3) { + this.setColorOpaque((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F)); + } + + /** + * Sets the RGBA values for the color, converting from floats between 0 and 1 to + * integers from 0-255. + */ + public void setColorRGBA_F(float par1, float par2, float par3, float par4) { + this.setColorRGBA((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F), (int) (par4 * 255.0F)); + } + + /** + * Sets the RGB values as specified, and sets alpha to opaque. + */ + public void setColorOpaque(int par1, int par2, int par3) { + this.setColorRGBA(par1, par2, par3, 255); + } + + /** + * Sets the RGBA values for the color. Also clamps them to 0-255. + */ + public void setColorRGBA(int par1, int par2, int par3, int par4) { + if (!this.isColorDisabled) { + if (par1 > 255) { + par1 = 255; + } + + if (par2 > 255) { + par2 = 255; + } + + if (par3 > 255) { + par3 = 255; + } + + if (par4 > 255) { + par4 = 255; + } + + if (par1 < 0) { + par1 = 0; + } + + if (par2 < 0) { + par2 = 0; + } + + if (par3 < 0) { + par3 = 0; + } + + if (par4 < 0) { + par4 = 0; + } + + this.hasColor = true; + this.color = par4 << 24 | par3 << 16 | par2 << 8 | par1; + } + } + + /** + * Adds a vertex specifying both x,y,z and the texture u,v for it. + */ + public void addVertexWithUV(double par1, double par3, double par5, double par7, double par9) { + this.setTextureUV(par7, par9); + this.addVertex(par1, par3, par5); + } + + /** + * Adds a vertex with the specified x,y,z to the current draw call. It will + * trigger a draw() if the buffer gets full. + */ + public void addVertex(double par1, double par3, double par5) { + if(this.addedVertices > 65534) return; + ++this.addedVertices; + ++this.vertexCount; + + int bufferIndex = this.rawBufferIndex; + Int32Array intBuffer0 = intBuffer; + Float32Array floatBuffer0 = floatBuffer; + + floatBuffer0.set(bufferIndex + 0, (float) (par1 + this.xOffset)); + floatBuffer0.set(bufferIndex + 1, (float) (par3 + this.yOffset)); + floatBuffer0.set(bufferIndex + 2, (float) (par5 + this.zOffset)); + + if (this.hasTexture) { + floatBuffer0.set(bufferIndex + 3, this.textureU); + floatBuffer0.set(bufferIndex + 4, this.textureV); + } + + if (this.hasColor) { + intBuffer0.set(bufferIndex + 5, this.color); + } + + this.rawBufferIndex += 7; + } + + /** + * Sets the color to the given opaque value (stored as byte values packed in an + * integer). + */ + public void setColorOpaque_I(int par1) { + int var2 = par1 >> 16 & 255; + int var3 = par1 >> 8 & 255; + int var4 = par1 & 255; + this.setColorOpaque(var2, var3, var4); + } + + /** + * Sets the color to the given color (packed as bytes in integer) and alpha + * values. + */ + public void setColorRGBA_I(int par1, int par2) { + int var3 = par1 >> 16 & 255; + int var4 = par1 >> 8 & 255; + int var5 = par1 & 255; + this.setColorRGBA(var3, var4, var5, par2); + } + + /** + * Disables colors for the current draw call. + */ + public void disableColor() { + this.isColorDisabled = true; + } + + /** + * Sets the normal for the current draw call. + */ + public void setNormal(float par1, float par2, float par3) { + GL11.glNormal3f(par1, par2, par3); + } + + /** + * Sets the translation for all vertices in the current draw call. + */ + public void setTranslationD(double par1, double par3, double par5) { + this.xOffset = par1; + this.yOffset = par3; + this.zOffset = par5; + } + + /** + * Offsets the translation for all vertices in the current draw call. + */ + public void setTranslationF(float par1, float par2, float par3) { + this.xOffset += (float) par1; + this.yOffset += (float) par2; + this.zOffset += (float) par3; + } +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/src/TextureCompassFX.java b/src/main/java/net/minecraft/src/TextureCompassFX.java new file mode 100644 index 0000000..6bd1afd --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureCompassFX.java @@ -0,0 +1,142 @@ +package net.minecraft.src; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import javax.imageio.ImageIO; +import net.minecraft.client.Minecraft; + +public class TextureCompassFX extends TextureFX { + private Minecraft mc; + private int[] field_4230_h = new int[256]; + private double field_4229_i; + private double field_4228_j; + + public TextureCompassFX(Minecraft var1) { + super(Item.compass.getIconIndex((ItemStack)null)); + this.mc = var1; + this.field_1128_f = 1; + + try { + BufferedImage var2 = ImageIO.read(Minecraft.class.getResource("/gui/items.png")); + int var3 = this.field_1126_b % 16 * 16; + int var4 = this.field_1126_b / 16 * 16; + var2.getRGB(var3, var4, 16, 16, this.field_4230_h, 0, 16); + } catch (IOException var5) { + var5.printStackTrace(); + } + + } + + public void func_783_a() { + for(int var1 = 0; var1 < 256; ++var1) { + int var2 = this.field_4230_h[var1] >> 24 & 255; + int var3 = this.field_4230_h[var1] >> 16 & 255; + int var4 = this.field_4230_h[var1] >> 8 & 255; + int var5 = this.field_4230_h[var1] >> 0 & 255; + if(this.field_1131_c) { + int var6 = (var3 * 30 + var4 * 59 + var5 * 11) / 100; + int var7 = (var3 * 30 + var4 * 70) / 100; + int var8 = (var3 * 30 + var5 * 70) / 100; + var3 = var6; + var4 = var7; + var5 = var8; + } + + this.field_1127_a[var1 * 4 + 0] = (byte)var3; + this.field_1127_a[var1 * 4 + 1] = (byte)var4; + this.field_1127_a[var1 * 4 + 2] = (byte)var5; + this.field_1127_a[var1 * 4 + 3] = (byte)var2; + } + + double var20 = 0.0D; + double var21; + double var22; + if(this.mc.theWorld != null && this.mc.thePlayer != null) { + var21 = (double)this.mc.theWorld.spawnX - this.mc.thePlayer.posX; + var22 = (double)this.mc.theWorld.spawnZ - this.mc.thePlayer.posZ; + var20 = (double)(this.mc.thePlayer.rotationYaw - 90.0F) * Math.PI / 180.0D - Math.atan2(var22, var21); + if(this.mc.theWorld.worldProvider.field_4220_c) { + var20 = Math.random() * (double)((float)Math.PI) * 2.0D; + } + } + + for(var21 = var20 - this.field_4229_i; var21 < -Math.PI; var21 += Math.PI * 2.0D) { + } + + while(var21 >= Math.PI) { + var21 -= Math.PI * 2.0D; + } + + if(var21 < -1.0D) { + var21 = -1.0D; + } + + if(var21 > 1.0D) { + var21 = 1.0D; + } + + this.field_4228_j += var21 * 0.1D; + this.field_4228_j *= 0.8D; + this.field_4229_i += this.field_4228_j; + var22 = Math.sin(this.field_4229_i); + double var23 = Math.cos(this.field_4229_i); + + int var9; + int var10; + int var11; + int var12; + int var13; + int var14; + int var15; + short var16; + int var17; + int var18; + int var19; + for(var9 = -4; var9 <= 4; ++var9) { + var10 = (int)(8.5D + var23 * (double)var9 * 0.3D); + var11 = (int)(7.5D - var22 * (double)var9 * 0.3D * 0.5D); + var12 = var11 * 16 + var10; + var13 = 100; + var14 = 100; + var15 = 100; + var16 = 255; + if(this.field_1131_c) { + var17 = (var13 * 30 + var14 * 59 + var15 * 11) / 100; + var18 = (var13 * 30 + var14 * 70) / 100; + var19 = (var13 * 30 + var15 * 70) / 100; + var13 = var17; + var14 = var18; + var15 = var19; + } + + this.field_1127_a[var12 * 4 + 0] = (byte)var13; + this.field_1127_a[var12 * 4 + 1] = (byte)var14; + this.field_1127_a[var12 * 4 + 2] = (byte)var15; + this.field_1127_a[var12 * 4 + 3] = (byte)var16; + } + + for(var9 = -8; var9 <= 16; ++var9) { + var10 = (int)(8.5D + var22 * (double)var9 * 0.3D); + var11 = (int)(7.5D + var23 * (double)var9 * 0.3D * 0.5D); + var12 = var11 * 16 + var10; + var13 = var9 >= 0 ? 255 : 100; + var14 = var9 >= 0 ? 20 : 100; + var15 = var9 >= 0 ? 20 : 100; + var16 = 255; + if(this.field_1131_c) { + var17 = (var13 * 30 + var14 * 59 + var15 * 11) / 100; + var18 = (var13 * 30 + var14 * 70) / 100; + var19 = (var13 * 30 + var15 * 70) / 100; + var13 = var17; + var14 = var18; + var15 = var19; + } + + this.field_1127_a[var12 * 4 + 0] = (byte)var13; + this.field_1127_a[var12 * 4 + 1] = (byte)var14; + this.field_1127_a[var12 * 4 + 2] = (byte)var15; + this.field_1127_a[var12 * 4 + 3] = (byte)var16; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureFX.java b/src/main/java/net/minecraft/src/TextureFX.java new file mode 100644 index 0000000..a203af8 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureFX.java @@ -0,0 +1,28 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class TextureFX { + public byte[] field_1127_a = new byte[1024]; + public int field_1126_b; + public boolean field_1131_c = false; + public int field_1130_d = 0; + public int field_1129_e = 1; + public int field_1128_f = 0; + + public TextureFX(int var1) { + this.field_1126_b = var1; + } + + public void func_783_a() { + } + + public void func_782_a(RenderEngine var1) { + if(this.field_1128_f == 0) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.getTexture("/terrain.png")); + } else if(this.field_1128_f == 1) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.getTexture("/gui/items.png")); + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureFlamesFX.java b/src/main/java/net/minecraft/src/TextureFlamesFX.java new file mode 100644 index 0000000..4b529e5 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureFlamesFX.java @@ -0,0 +1,77 @@ +package net.minecraft.src; + +public class TextureFlamesFX extends TextureFX { + protected float[] field_1133_g = new float[320]; + protected float[] field_1132_h = new float[320]; + + public TextureFlamesFX(int var1) { + super(Block.fire.blockIndexInTexture + var1 * 16); + } + + public void func_783_a() { + int var2; + float var4; + int var5; + int var6; + for(int var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 20; ++var2) { + int var3 = 18; + var4 = this.field_1133_g[var1 + (var2 + 1) % 20 * 16] * (float)var3; + + for(var5 = var1 - 1; var5 <= var1 + 1; ++var5) { + for(var6 = var2; var6 <= var2 + 1; ++var6) { + if(var5 >= 0 && var6 >= 0 && var5 < 16 && var6 < 20) { + var4 += this.field_1133_g[var5 + var6 * 16]; + } + + ++var3; + } + } + + this.field_1132_h[var1 + var2 * 16] = var4 / ((float)var3 * 1.06F); + if(var2 >= 19) { + this.field_1132_h[var1 + var2 * 16] = (float)(Math.random() * Math.random() * Math.random() * 4.0D + Math.random() * (double)0.1F + (double)0.2F); + } + } + } + + float[] var12 = this.field_1132_h; + this.field_1132_h = this.field_1133_g; + this.field_1133_g = var12; + + for(var2 = 0; var2 < 256; ++var2) { + float var13 = this.field_1133_g[var2] * 1.8F; + if(var13 > 1.0F) { + var13 = 1.0F; + } + + if(var13 < 0.0F) { + var13 = 0.0F; + } + + var5 = (int)(var13 * 155.0F + 100.0F); + var6 = (int)(var13 * var13 * 255.0F); + int var7 = (int)(var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * 255.0F); + short var8 = 255; + if(var13 < 0.5F) { + var8 = 0; + } + + var4 = (var13 - 0.5F) * 2.0F; + if(this.field_1131_c) { + int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + int var10 = (var5 * 30 + var6 * 70) / 100; + int var11 = (var5 * 30 + var7 * 70) / 100; + var5 = var9; + var6 = var10; + var7 = var11; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var5; + this.field_1127_a[var2 * 4 + 1] = (byte)var6; + this.field_1127_a[var2 * 4 + 2] = (byte)var7; + this.field_1127_a[var2 * 4 + 3] = (byte)var8; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureLavaFX.java b/src/main/java/net/minecraft/src/TextureLavaFX.java new file mode 100644 index 0000000..cd21f29 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureLavaFX.java @@ -0,0 +1,81 @@ +package net.minecraft.src; + +public class TextureLavaFX extends TextureFX { + protected float[] field_1147_g = new float[256]; + protected float[] field_1146_h = new float[256]; + protected float[] field_1145_i = new float[256]; + protected float[] field_1144_j = new float[256]; + + public TextureLavaFX() { + super(Block.lavaStill.blockIndexInTexture); + } + + public void func_783_a() { + int var2; + float var3; + int var5; + int var6; + int var7; + int var8; + int var9; + for(int var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + int var4 = (int)(MathHelper.sin((float)var2 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + var5 = (int)(MathHelper.sin((float)var1 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + + for(var6 = var1 - 1; var6 <= var1 + 1; ++var6) { + for(var7 = var2 - 1; var7 <= var2 + 1; ++var7) { + var8 = var6 + var4 & 15; + var9 = var7 + var5 & 15; + var3 += this.field_1147_g[var8 + var9 * 16]; + } + } + + this.field_1146_h[var1 + var2 * 16] = var3 / 10.0F + (this.field_1145_i[(var1 + 0 & 15) + (var2 + 0 & 15) * 16] + this.field_1145_i[(var1 + 1 & 15) + (var2 + 0 & 15) * 16] + this.field_1145_i[(var1 + 1 & 15) + (var2 + 1 & 15) * 16] + this.field_1145_i[(var1 + 0 & 15) + (var2 + 1 & 15) * 16]) / 4.0F * 0.8F; + this.field_1145_i[var1 + var2 * 16] += this.field_1144_j[var1 + var2 * 16] * 0.01F; + if(this.field_1145_i[var1 + var2 * 16] < 0.0F) { + this.field_1145_i[var1 + var2 * 16] = 0.0F; + } + + this.field_1144_j[var1 + var2 * 16] -= 0.06F; + if(Math.random() < 0.005D) { + this.field_1144_j[var1 + var2 * 16] = 1.5F; + } + } + } + + float[] var11 = this.field_1146_h; + this.field_1146_h = this.field_1147_g; + this.field_1147_g = var11; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.field_1147_g[var2] * 2.0F; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + var5 = (int)(var3 * 100.0F + 155.0F); + var6 = (int)(var3 * var3 * 255.0F); + var7 = (int)(var3 * var3 * var3 * var3 * 128.0F); + if(this.field_1131_c) { + var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + var9 = (var5 * 30 + var6 * 70) / 100; + int var10 = (var5 * 30 + var7 * 70) / 100; + var5 = var8; + var6 = var9; + var7 = var10; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var5; + this.field_1127_a[var2 * 4 + 1] = (byte)var6; + this.field_1127_a[var2 * 4 + 2] = (byte)var7; + this.field_1127_a[var2 * 4 + 3] = -1; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureLavaFlowFX.java b/src/main/java/net/minecraft/src/TextureLavaFlowFX.java new file mode 100644 index 0000000..82379f4 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureLavaFlowFX.java @@ -0,0 +1,85 @@ +package net.minecraft.src; + +public class TextureLavaFlowFX extends TextureFX { + protected float[] field_1143_g = new float[256]; + protected float[] field_1142_h = new float[256]; + protected float[] field_1141_i = new float[256]; + protected float[] field_1140_j = new float[256]; + int field_1139_k = 0; + + public TextureLavaFlowFX() { + super(Block.lavaStill.blockIndexInTexture + 1); + this.field_1129_e = 2; + } + + public void func_783_a() { + ++this.field_1139_k; + + int var2; + float var3; + int var5; + int var6; + int var7; + int var8; + int var9; + for(int var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + int var4 = (int)(MathHelper.sin((float)var2 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + var5 = (int)(MathHelper.sin((float)var1 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + + for(var6 = var1 - 1; var6 <= var1 + 1; ++var6) { + for(var7 = var2 - 1; var7 <= var2 + 1; ++var7) { + var8 = var6 + var4 & 15; + var9 = var7 + var5 & 15; + var3 += this.field_1143_g[var8 + var9 * 16]; + } + } + + this.field_1142_h[var1 + var2 * 16] = var3 / 10.0F + (this.field_1141_i[(var1 + 0 & 15) + (var2 + 0 & 15) * 16] + this.field_1141_i[(var1 + 1 & 15) + (var2 + 0 & 15) * 16] + this.field_1141_i[(var1 + 1 & 15) + (var2 + 1 & 15) * 16] + this.field_1141_i[(var1 + 0 & 15) + (var2 + 1 & 15) * 16]) / 4.0F * 0.8F; + this.field_1141_i[var1 + var2 * 16] += this.field_1140_j[var1 + var2 * 16] * 0.01F; + if(this.field_1141_i[var1 + var2 * 16] < 0.0F) { + this.field_1141_i[var1 + var2 * 16] = 0.0F; + } + + this.field_1140_j[var1 + var2 * 16] -= 0.06F; + if(Math.random() < 0.005D) { + this.field_1140_j[var1 + var2 * 16] = 1.5F; + } + } + } + + float[] var11 = this.field_1142_h; + this.field_1142_h = this.field_1143_g; + this.field_1143_g = var11; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.field_1143_g[var2 - this.field_1139_k / 3 * 16 & 255] * 2.0F; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + var5 = (int)(var3 * 100.0F + 155.0F); + var6 = (int)(var3 * var3 * 255.0F); + var7 = (int)(var3 * var3 * var3 * var3 * 128.0F); + if(this.field_1131_c) { + var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + var9 = (var5 * 30 + var6 * 70) / 100; + int var10 = (var5 * 30 + var7 * 70) / 100; + var5 = var8; + var6 = var9; + var7 = var10; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var5; + this.field_1127_a[var2 * 4 + 1] = (byte)var6; + this.field_1127_a[var2 * 4 + 2] = (byte)var7; + this.field_1127_a[var2 * 4 + 3] = -1; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TexturePortalFX.java b/src/main/java/net/minecraft/src/TexturePortalFX.java new file mode 100644 index 0000000..3cf2d95 --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturePortalFX.java @@ -0,0 +1,88 @@ +package net.minecraft.src; + +import java.util.Random; + +public class TexturePortalFX extends TextureFX { + private int field_4227_g = 0; + private byte[][] field_4226_h = new byte[32][1024]; + + public TexturePortalFX() { + super(Block.portal.blockIndexInTexture); + Random var1 = new Random(100L); + + for(int var2 = 0; var2 < 32; ++var2) { + for(int var3 = 0; var3 < 16; ++var3) { + for(int var4 = 0; var4 < 16; ++var4) { + float var5 = 0.0F; + + int var6; + for(var6 = 0; var6 < 2; ++var6) { + float var7 = (float)(var6 * 8); + float var8 = (float)(var6 * 8); + float var9 = ((float)var3 - var7) / 16.0F * 2.0F; + float var10 = ((float)var4 - var8) / 16.0F * 2.0F; + if(var9 < -1.0F) { + var9 += 2.0F; + } + + if(var9 >= 1.0F) { + var9 -= 2.0F; + } + + if(var10 < -1.0F) { + var10 += 2.0F; + } + + if(var10 >= 1.0F) { + var10 -= 2.0F; + } + + float var11 = var9 * var9 + var10 * var10; + float var12 = (float)Math.atan2((double)var10, (double)var9) + ((float)var2 / 32.0F * (float)Math.PI * 2.0F - var11 * 10.0F + (float)(var6 * 2)) * (float)(var6 * 2 - 1); + var12 = (MathHelper.sin(var12) + 1.0F) / 2.0F; + var12 /= var11 + 1.0F; + var5 += var12 * 0.5F; + } + + var5 += var1.nextFloat() * 0.1F; + var6 = (int)(var5 * 100.0F + 155.0F); + int var13 = (int)(var5 * var5 * 200.0F + 55.0F); + int var14 = (int)(var5 * var5 * var5 * var5 * 255.0F); + int var15 = (int)(var5 * 100.0F + 155.0F); + int var16 = var4 * 16 + var3; + this.field_4226_h[var2][var16 * 4 + 0] = (byte)var13; + this.field_4226_h[var2][var16 * 4 + 1] = (byte)var14; + this.field_4226_h[var2][var16 * 4 + 2] = (byte)var6; + this.field_4226_h[var2][var16 * 4 + 3] = (byte)var15; + } + } + } + + } + + public void func_783_a() { + ++this.field_4227_g; + byte[] var1 = this.field_4226_h[this.field_4227_g & 31]; + + for(int var2 = 0; var2 < 256; ++var2) { + int var3 = var1[var2 * 4 + 0] & 255; + int var4 = var1[var2 * 4 + 1] & 255; + int var5 = var1[var2 * 4 + 2] & 255; + int var6 = var1[var2 * 4 + 3] & 255; + if(this.field_1131_c) { + int var7 = (var3 * 30 + var4 * 59 + var5 * 11) / 100; + int var8 = (var3 * 30 + var4 * 70) / 100; + int var9 = (var3 * 30 + var5 * 70) / 100; + var3 = var7; + var4 = var8; + var5 = var9; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var3; + this.field_1127_a[var2 * 4 + 1] = (byte)var4; + this.field_1127_a[var2 * 4 + 2] = (byte)var5; + this.field_1127_a[var2 * 4 + 3] = (byte)var6; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureWatchFX.java b/src/main/java/net/minecraft/src/TextureWatchFX.java new file mode 100644 index 0000000..8386887 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureWatchFX.java @@ -0,0 +1,99 @@ +package net.minecraft.src; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import javax.imageio.ImageIO; +import net.minecraft.client.Minecraft; + +public class TextureWatchFX extends TextureFX { + private Minecraft field_4225_g; + private int[] field_4224_h = new int[256]; + private int[] field_4223_i = new int[256]; + private double field_4222_j; + private double field_4221_k; + + public TextureWatchFX(Minecraft var1) { + super(Item.pocketSundial.getIconIndex((ItemStack)null)); + this.field_4225_g = var1; + this.field_1128_f = 1; + + try { + BufferedImage var2 = ImageIO.read(Minecraft.class.getResource("/gui/items.png")); + int var3 = this.field_1126_b % 16 * 16; + int var4 = this.field_1126_b / 16 * 16; + var2.getRGB(var3, var4, 16, 16, this.field_4224_h, 0, 16); + var2 = ImageIO.read(Minecraft.class.getResource("/misc/dial.png")); + var2.getRGB(0, 0, 16, 16, this.field_4223_i, 0, 16); + } catch (IOException var5) { + var5.printStackTrace(); + } + + } + + public void func_783_a() { + double var1 = 0.0D; + if(this.field_4225_g.theWorld != null && this.field_4225_g.thePlayer != null) { + float var3 = this.field_4225_g.theWorld.getCelestialAngle(1.0F); + var1 = (double)(-var3 * (float)Math.PI * 2.0F); + if(this.field_4225_g.theWorld.worldProvider.field_4220_c) { + var1 = Math.random() * (double)((float)Math.PI) * 2.0D; + } + } + + double var22; + for(var22 = var1 - this.field_4222_j; var22 < -Math.PI; var22 += Math.PI * 2.0D) { + } + + while(var22 >= Math.PI) { + var22 -= Math.PI * 2.0D; + } + + if(var22 < -1.0D) { + var22 = -1.0D; + } + + if(var22 > 1.0D) { + var22 = 1.0D; + } + + this.field_4221_k += var22 * 0.1D; + this.field_4221_k *= 0.8D; + this.field_4222_j += this.field_4221_k; + double var5 = Math.sin(this.field_4222_j); + double var7 = Math.cos(this.field_4222_j); + + for(int var9 = 0; var9 < 256; ++var9) { + int var10 = this.field_4224_h[var9] >> 24 & 255; + int var11 = this.field_4224_h[var9] >> 16 & 255; + int var12 = this.field_4224_h[var9] >> 8 & 255; + int var13 = this.field_4224_h[var9] >> 0 & 255; + if(var11 == var13 && var12 == 0 && var13 > 0) { + double var14 = -((double)(var9 % 16) / 15.0D - 0.5D); + double var16 = (double)(var9 / 16) / 15.0D - 0.5D; + int var18 = var11; + int var19 = (int)((var14 * var7 + var16 * var5 + 0.5D) * 16.0D); + int var20 = (int)((var16 * var7 - var14 * var5 + 0.5D) * 16.0D); + int var21 = (var19 & 15) + (var20 & 15) * 16; + var10 = this.field_4223_i[var21] >> 24 & 255; + var11 = (this.field_4223_i[var21] >> 16 & 255) * var11 / 255; + var12 = (this.field_4223_i[var21] >> 8 & 255) * var18 / 255; + var13 = (this.field_4223_i[var21] >> 0 & 255) * var18 / 255; + } + + if(this.field_1131_c) { + int var23 = (var11 * 30 + var12 * 59 + var13 * 11) / 100; + int var15 = (var11 * 30 + var12 * 70) / 100; + int var24 = (var11 * 30 + var13 * 70) / 100; + var11 = var23; + var12 = var15; + var13 = var24; + } + + this.field_1127_a[var9 * 4 + 0] = (byte)var11; + this.field_1127_a[var9 * 4 + 1] = (byte)var12; + this.field_1127_a[var9 * 4 + 2] = (byte)var13; + this.field_1127_a[var9 * 4 + 3] = (byte)var10; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TextureWaterFX.java b/src/main/java/net/minecraft/src/TextureWaterFX.java new file mode 100644 index 0000000..435a2c0 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureWaterFX.java @@ -0,0 +1,85 @@ +package net.minecraft.src; + +public class TextureWaterFX extends TextureFX { + protected float[] field_1158_g = new float[256]; + protected float[] field_1157_h = new float[256]; + protected float[] field_1156_i = new float[256]; + protected float[] field_1155_j = new float[256]; + private int tickCounter = 0; + + public TextureWaterFX() { + super(Block.waterStill.blockIndexInTexture); + } + + public void func_783_a() { + ++this.tickCounter; + + int var1; + int var2; + float var3; + int var5; + int var6; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + + for(int var4 = var1 - 1; var4 <= var1 + 1; ++var4) { + var5 = var4 & 15; + var6 = var2 & 15; + var3 += this.field_1158_g[var5 + var6 * 16]; + } + + this.field_1157_h[var1 + var2 * 16] = var3 / 3.3F + this.field_1156_i[var1 + var2 * 16] * 0.8F; + } + } + + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + this.field_1156_i[var1 + var2 * 16] += this.field_1155_j[var1 + var2 * 16] * 0.05F; + if(this.field_1156_i[var1 + var2 * 16] < 0.0F) { + this.field_1156_i[var1 + var2 * 16] = 0.0F; + } + + this.field_1155_j[var1 + var2 * 16] -= 0.1F; + if(Math.random() < 0.05D) { + this.field_1155_j[var1 + var2 * 16] = 0.5F; + } + } + } + + float[] var12 = this.field_1157_h; + this.field_1157_h = this.field_1158_g; + this.field_1158_g = var12; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.field_1158_g[var2]; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + float var13 = var3 * var3; + var5 = (int)(32.0F + var13 * 32.0F); + var6 = (int)(50.0F + var13 * 64.0F); + int var7 = 255; + int var8 = (int)(146.0F + var13 * 50.0F); + if(this.field_1131_c) { + int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + int var10 = (var5 * 30 + var6 * 70) / 100; + int var11 = (var5 * 30 + var7 * 70) / 100; + var5 = var9; + var6 = var10; + var7 = var11; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var5; + this.field_1127_a[var2 * 4 + 1] = (byte)var6; + this.field_1127_a[var2 * 4 + 2] = (byte)var7; + this.field_1127_a[var2 * 4 + 3] = (byte)var8; + } + + } +} diff --git a/src/main/java/net/minecraft/src/TexturedQuad.java b/src/main/java/net/minecraft/src/TexturedQuad.java new file mode 100644 index 0000000..ef3d8f7 --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturedQuad.java @@ -0,0 +1,53 @@ +package net.minecraft.src; + +public class TexturedQuad { + public PositionTexureVertex[] field_1195_a; + public int field_1194_b; + private boolean field_1196_c; + + public TexturedQuad(PositionTexureVertex[] var1) { + this.field_1194_b = 0; + this.field_1196_c = false; + this.field_1195_a = var1; + this.field_1194_b = var1.length; + } + + public TexturedQuad(PositionTexureVertex[] var1, int var2, int var3, int var4, int var5) { + this(var1); + float var6 = 0.0015625F; + float var7 = 0.003125F; + var1[0] = var1[0].setTexturePosition((float)var4 / 64.0F - var6, (float)var3 / 32.0F + var7); + var1[1] = var1[1].setTexturePosition((float)var2 / 64.0F + var6, (float)var3 / 32.0F + var7); + var1[2] = var1[2].setTexturePosition((float)var2 / 64.0F + var6, (float)var5 / 32.0F - var7); + var1[3] = var1[3].setTexturePosition((float)var4 / 64.0F - var6, (float)var5 / 32.0F - var7); + } + + public void func_809_a() { + PositionTexureVertex[] var1 = new PositionTexureVertex[this.field_1195_a.length]; + + for(int var2 = 0; var2 < this.field_1195_a.length; ++var2) { + var1[var2] = this.field_1195_a[this.field_1195_a.length - var2 - 1]; + } + + this.field_1195_a = var1; + } + + public void func_808_a(Tessellator var1, float var2) { + Vec3D var3 = this.field_1195_a[1].vector3D.func_1262_a(this.field_1195_a[0].vector3D); + Vec3D var4 = this.field_1195_a[1].vector3D.func_1262_a(this.field_1195_a[2].vector3D); + Vec3D var5 = var4.crossProduct(var3).normalize(); + var1.startDrawingQuads(); + if(this.field_1196_c) { + var1.setNormal(-((float)var5.xCoord), -((float)var5.yCoord), -((float)var5.zCoord)); + } else { + var1.setNormal((float)var5.xCoord, (float)var5.yCoord, (float)var5.zCoord); + } + + for(int var6 = 0; var6 < 4; ++var6) { + PositionTexureVertex var7 = this.field_1195_a[var6]; + var1.addVertexWithUV((double)((float)var7.vector3D.xCoord * var2), (double)((float)var7.vector3D.yCoord * var2), (double)((float)var7.vector3D.zCoord * var2), (double)var7.texturePositionX, (double)var7.texturePositionY); + } + + var1.draw(); + } +} diff --git a/src/main/java/net/minecraft/src/TexureWaterFlowFX.java b/src/main/java/net/minecraft/src/TexureWaterFlowFX.java new file mode 100644 index 0000000..79b5520 --- /dev/null +++ b/src/main/java/net/minecraft/src/TexureWaterFlowFX.java @@ -0,0 +1,86 @@ +package net.minecraft.src; + +public class TexureWaterFlowFX extends TextureFX { + protected float[] field_1138_g = new float[256]; + protected float[] field_1137_h = new float[256]; + protected float[] field_1136_i = new float[256]; + protected float[] field_1135_j = new float[256]; + private int field_1134_k = 0; + + public TexureWaterFlowFX() { + super(Block.waterStill.blockIndexInTexture + 1); + this.field_1129_e = 2; + } + + public void func_783_a() { + ++this.field_1134_k; + + int var1; + int var2; + float var3; + int var5; + int var6; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + + for(int var4 = var2 - 2; var4 <= var2; ++var4) { + var5 = var1 & 15; + var6 = var4 & 15; + var3 += this.field_1138_g[var5 + var6 * 16]; + } + + this.field_1137_h[var1 + var2 * 16] = var3 / 3.2F + this.field_1136_i[var1 + var2 * 16] * 0.8F; + } + } + + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + this.field_1136_i[var1 + var2 * 16] += this.field_1135_j[var1 + var2 * 16] * 0.05F; + if(this.field_1136_i[var1 + var2 * 16] < 0.0F) { + this.field_1136_i[var1 + var2 * 16] = 0.0F; + } + + this.field_1135_j[var1 + var2 * 16] -= 0.3F; + if(Math.random() < 0.2D) { + this.field_1135_j[var1 + var2 * 16] = 0.5F; + } + } + } + + float[] var12 = this.field_1137_h; + this.field_1137_h = this.field_1138_g; + this.field_1138_g = var12; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.field_1138_g[var2 - this.field_1134_k * 16 & 255]; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + float var13 = var3 * var3; + var5 = (int)(32.0F + var13 * 32.0F); + var6 = (int)(50.0F + var13 * 64.0F); + int var7 = 255; + int var8 = (int)(146.0F + var13 * 50.0F); + if(this.field_1131_c) { + int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + int var10 = (var5 * 30 + var6 * 70) / 100; + int var11 = (var5 * 30 + var7 * 70) / 100; + var5 = var9; + var6 = var10; + var7 = var11; + } + + this.field_1127_a[var2 * 4 + 0] = (byte)var5; + this.field_1127_a[var2 * 4 + 1] = (byte)var6; + this.field_1127_a[var2 * 4 + 2] = (byte)var7; + this.field_1127_a[var2 * 4 + 3] = (byte)var8; + } + + } +} diff --git a/src/main/java/net/minecraft/src/ThreadSleepForever.java b/src/main/java/net/minecraft/src/ThreadSleepForever.java new file mode 100644 index 0000000..fa88a2a --- /dev/null +++ b/src/main/java/net/minecraft/src/ThreadSleepForever.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +public class ThreadSleepForever extends Thread { + final Minecraft mc; + + public ThreadSleepForever(Minecraft var1, String var2) { + super(var2); + this.mc = var1; + this.setDaemon(true); + this.start(); + } + + public void run() { + while(this.mc.running) { + try { + Thread.sleep(2147483647L); + } catch (InterruptedException var2) { + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/TileEntity.java b/src/main/java/net/minecraft/src/TileEntity.java new file mode 100644 index 0000000..92ae45e --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntity.java @@ -0,0 +1,90 @@ +package net.minecraft.src; + +import java.util.HashMap; +import java.util.Map; + +public class TileEntity { + private static Map nameToClassMap = new HashMap(); + private static Map classToNameMap = new HashMap(); + public World worldObj; + public int xCoord; + public int yCoord; + public int zCoord; + + private static void addMapping(Class var0, String var1) { + if(classToNameMap.containsKey(var1)) { + throw new IllegalArgumentException("Duplicate id: " + var1); + } else { + nameToClassMap.put(var1, var0); + classToNameMap.put(var0, var1); + } + } + + public void readFromNBT(NBTTagCompound var1) { + this.xCoord = var1.getInteger("x"); + this.yCoord = var1.getInteger("y"); + this.zCoord = var1.getInteger("z"); + } + + public void writeToNBT(NBTTagCompound var1) { + String var2 = (String)classToNameMap.get(this.getClass()); + if(var2 == null) { + throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!"); + } else { + var1.setString("id", var2); + var1.setInteger("x", this.xCoord); + var1.setInteger("y", this.yCoord); + var1.setInteger("z", this.zCoord); + } + } + + public void updateEntity() { + } + + public static TileEntity createAndLoadEntity(NBTTagCompound var0) { + TileEntity var1 = null; + + try { + Class var2 = (Class)nameToClassMap.get(var0.getString("id")); + if(var2 != null) { + var1 = (TileEntity)var2.newInstance(); + } + } catch (Exception var3) { + var3.printStackTrace(); + } + + if(var1 != null) { + var1.readFromNBT(var0); + } else { + System.out.println("Skipping TileEntity with id " + var0.getString("id")); + } + + return var1; + } + + public int getBlockMetadata() { + return this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + } + + public void onInventoryChanged() { + this.worldObj.func_698_b(this.xCoord, this.yCoord, this.zCoord, this); + } + + public double getDistanceFrom(double var1, double var3, double var5) { + double var7 = (double)this.xCoord + 0.5D - var1; + double var9 = (double)this.yCoord + 0.5D - var3; + double var11 = (double)this.zCoord + 0.5D - var5; + return var7 * var7 + var9 * var9 + var11 * var11; + } + + public Block getBlockType() { + return Block.blocksList[this.worldObj.getBlockId(this.xCoord, this.yCoord, this.zCoord)]; + } + + static { + addMapping(TileEntityFurnace.class, "Furnace"); + addMapping(TileEntityChest.class, "Chest"); + addMapping(TileEntitySign.class, "Sign"); + addMapping(TileEntityMobSpawner.class, "MobSpawner"); + } +} diff --git a/src/main/java/net/minecraft/src/TileEntityChest.java b/src/main/java/net/minecraft/src/TileEntityChest.java new file mode 100644 index 0000000..66da840 --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntityChest.java @@ -0,0 +1,83 @@ +package net.minecraft.src; + +public class TileEntityChest extends TileEntity implements IInventory { + private ItemStack[] field_827_a = new ItemStack[36]; + + public int getSizeInventory() { + return 27; + } + + public ItemStack getStackInSlot(int var1) { + return this.field_827_a[var1]; + } + + public ItemStack decrStackSize(int var1, int var2) { + if(this.field_827_a[var1] != null) { + ItemStack var3; + if(this.field_827_a[var1].stackSize <= var2) { + var3 = this.field_827_a[var1]; + this.field_827_a[var1] = null; + this.onInventoryChanged(); + return var3; + } else { + var3 = this.field_827_a[var1].splitStack(var2); + if(this.field_827_a[var1].stackSize == 0) { + this.field_827_a[var1] = null; + } + + this.onInventoryChanged(); + return var3; + } + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + this.field_827_a[var1] = var2; + if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) { + var2.stackSize = this.getInventoryStackLimit(); + } + + this.onInventoryChanged(); + } + + public String getInvName() { + return "Chest"; + } + + public void readFromNBT(NBTTagCompound var1) { + super.readFromNBT(var1); + NBTTagList var2 = var1.getTagList("Items"); + this.field_827_a = new ItemStack[this.getSizeInventory()]; + + for(int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + int var5 = var4.getByte("Slot") & 255; + if(var5 >= 0 && var5 < this.field_827_a.length) { + this.field_827_a[var5] = new ItemStack(var4); + } + } + + } + + public void writeToNBT(NBTTagCompound var1) { + super.writeToNBT(var1); + NBTTagList var2 = new NBTTagList(); + + for(int var3 = 0; var3 < this.field_827_a.length; ++var3) { + if(this.field_827_a[var3] != null) { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.field_827_a[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Items", var2); + } + + public int getInventoryStackLimit() { + return 64; + } +} diff --git a/src/main/java/net/minecraft/src/TileEntityFurnace.java b/src/main/java/net/minecraft/src/TileEntityFurnace.java new file mode 100644 index 0000000..9b94876 --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntityFurnace.java @@ -0,0 +1,187 @@ +package net.minecraft.src; + +public class TileEntityFurnace extends TileEntity implements IInventory { + private ItemStack[] furnaceItemStacks = new ItemStack[3]; + private int furnaceBurnTime = 0; + private int currentItemBurnTime = 0; + private int furnaceCookTime = 0; + + public int getSizeInventory() { + return this.furnaceItemStacks.length; + } + + public ItemStack getStackInSlot(int var1) { + return this.furnaceItemStacks[var1]; + } + + public ItemStack decrStackSize(int var1, int var2) { + if(this.furnaceItemStacks[var1] != null) { + ItemStack var3; + if(this.furnaceItemStacks[var1].stackSize <= var2) { + var3 = this.furnaceItemStacks[var1]; + this.furnaceItemStacks[var1] = null; + return var3; + } else { + var3 = this.furnaceItemStacks[var1].splitStack(var2); + if(this.furnaceItemStacks[var1].stackSize == 0) { + this.furnaceItemStacks[var1] = null; + } + + return var3; + } + } else { + return null; + } + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + this.furnaceItemStacks[var1] = var2; + if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) { + var2.stackSize = this.getInventoryStackLimit(); + } + + } + + public String getInvName() { + return "Chest"; + } + + public void readFromNBT(NBTTagCompound var1) { + super.readFromNBT(var1); + NBTTagList var2 = var1.getTagList("Items"); + this.furnaceItemStacks = new ItemStack[this.getSizeInventory()]; + + for(int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + byte var5 = var4.getByte("Slot"); + if(var5 >= 0 && var5 < this.furnaceItemStacks.length) { + this.furnaceItemStacks[var5] = new ItemStack(var4); + } + } + + this.furnaceBurnTime = var1.getShort("BurnTime"); + this.furnaceCookTime = var1.getShort("CookTime"); + this.currentItemBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]); + } + + public void writeToNBT(NBTTagCompound var1) { + super.writeToNBT(var1); + var1.setShort("BurnTime", (short)this.furnaceBurnTime); + var1.setShort("CookTime", (short)this.furnaceCookTime); + NBTTagList var2 = new NBTTagList(); + + for(int var3 = 0; var3 < this.furnaceItemStacks.length; ++var3) { + if(this.furnaceItemStacks[var3] != null) { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.furnaceItemStacks[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Items", var2); + } + + public int getInventoryStackLimit() { + return 64; + } + + public int getCookProgressScaled(int var1) { + return this.furnaceCookTime * var1 / 200; + } + + public int getBurnTimeRemainingScaled(int var1) { + if(this.currentItemBurnTime == 0) { + this.currentItemBurnTime = 200; + } + + return this.furnaceBurnTime * var1 / this.currentItemBurnTime; + } + + public boolean isBurning() { + return this.furnaceBurnTime > 0; + } + + public void updateEntity() { + boolean var1 = this.furnaceBurnTime > 0; + boolean var2 = false; + if(this.furnaceBurnTime > 0) { + --this.furnaceBurnTime; + } + + //if(!this.worldObj.multiplayerWorld) { + if(this.furnaceBurnTime == 0 && this.canSmelt()) { + this.currentItemBurnTime = this.furnaceBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]); + if(this.furnaceBurnTime > 0) { + var2 = true; + if(this.furnaceItemStacks[1] != null) { + --this.furnaceItemStacks[1].stackSize; + if(this.furnaceItemStacks[1].stackSize == 0) { + this.furnaceItemStacks[1] = null; + } + } + } + } + + if(this.isBurning() && this.canSmelt()) { + ++this.furnaceCookTime; + if(this.furnaceCookTime == 200) { + this.furnaceCookTime = 0; + this.smeltItem(); + var2 = true; + } + } else { + this.furnaceCookTime = 0; + } + + if(var1 != this.furnaceBurnTime > 0) { + var2 = true; + BlockFurnace.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + //} + + if(var2) { + this.onInventoryChanged(); + } + + } + + private boolean canSmelt() { + if(this.furnaceItemStacks[0] == null) { + return false; + } else { + int var1 = this.getSmeltingResultItem(this.furnaceItemStacks[0].getItem().shiftedIndex); + return var1 < 0 ? false : (this.furnaceItemStacks[2] == null ? true : (this.furnaceItemStacks[2].itemID != var1 ? false : (this.furnaceItemStacks[2].stackSize < this.getInventoryStackLimit() && this.furnaceItemStacks[2].stackSize < this.furnaceItemStacks[2].getMaxStackSize() ? true : this.furnaceItemStacks[2].stackSize < Item.itemsList[var1].getItemStackLimit()))); + } + } + + public void smeltItem() { + if(this.canSmelt()) { + int var1 = this.getSmeltingResultItem(this.furnaceItemStacks[0].getItem().shiftedIndex); + if(this.furnaceItemStacks[2] == null) { + this.furnaceItemStacks[2] = new ItemStack(var1, 1); + } else if(this.furnaceItemStacks[2].itemID == var1) { + ++this.furnaceItemStacks[2].stackSize; + } + + --this.furnaceItemStacks[0].stackSize; + if(this.furnaceItemStacks[0].stackSize <= 0) { + this.furnaceItemStacks[0] = null; + } + + } + } + + private int getSmeltingResultItem(int var1) { + return var1 == Block.oreIron.blockID ? Item.ingotIron.shiftedIndex : (var1 == Block.oreGold.blockID ? Item.ingotGold.shiftedIndex : (var1 == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : (var1 == Block.sand.blockID ? Block.glass.blockID : (var1 == Item.porkRaw.shiftedIndex ? Item.porkCooked.shiftedIndex : (var1 == Item.fishRaw.shiftedIndex ? Item.fishCooked.shiftedIndex : (var1 == Block.cobblestone.blockID ? Block.stone.blockID : (var1 == Item.clay.shiftedIndex ? Item.brick.shiftedIndex : -1))))))); + } + + private int getItemBurnTime(ItemStack var1) { + if(var1 == null) { + return 0; + } else { + int var2 = var1.getItem().shiftedIndex; + return var2 < 256 && Block.blocksList[var2].blockMaterial == Material.wood ? 300 : (var2 == Item.stick.shiftedIndex ? 100 : (var2 == Item.coal.shiftedIndex ? 1600 : (var2 == Item.bucketLava.shiftedIndex ? 20000 : 0))); + } + } +} diff --git a/src/main/java/net/minecraft/src/TileEntityMobSpawner.java b/src/main/java/net/minecraft/src/TileEntityMobSpawner.java new file mode 100644 index 0000000..d35ab2f --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntityMobSpawner.java @@ -0,0 +1,93 @@ +package net.minecraft.src; + +public class TileEntityMobSpawner extends TileEntity { + public int delay = -1; + public String entityID = "Pig"; + public double field_831_c; + public double field_830_d = 0.0D; + + public TileEntityMobSpawner() { + this.delay = 20; + } + + public boolean anyPlayerInRange() { + return this.worldObj.getClosestPlayer((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D, 16.0D) != null; + } + + public void updateEntity() { + this.field_830_d = this.field_831_c; + if(this.anyPlayerInRange()) { + double var1 = (double)((float)this.xCoord + this.worldObj.rand.nextFloat()); + double var3 = (double)((float)this.yCoord + this.worldObj.rand.nextFloat()); + double var5 = (double)((float)this.zCoord + this.worldObj.rand.nextFloat()); + this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D); + this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D); + + for(this.field_831_c += (double)(1000.0F / ((float)this.delay + 200.0F)); this.field_831_c > 360.0D; this.field_830_d -= 360.0D) { + this.field_831_c -= 360.0D; + } + + if(this.delay == -1) { + this.updateDelay(); + } + + if(this.delay > 0) { + --this.delay; + } else { + byte var7 = 4; + + for(int var8 = 0; var8 < var7; ++var8) { + EntityLiving var9 = (EntityLiving)((EntityLiving)EntityList.createEntityInWorld(this.entityID, this.worldObj)); + if(var9 == null) { + return; + } + + int var10 = this.worldObj.getEntitiesWithinAABB(var9.getClass(), AxisAlignedBB.getBoundingBoxFromPool((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expands(8.0D, 4.0D, 8.0D)).size(); + if(var10 >= 6) { + this.updateDelay(); + return; + } + + if(var9 != null) { + double var11 = (double)this.xCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D; + double var13 = (double)(this.yCoord + this.worldObj.rand.nextInt(3) - 1); + double var15 = (double)this.zCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D; + var9.setLocationAndAngles(var11, var13, var15, this.worldObj.rand.nextFloat() * 360.0F, 0.0F); + if(var9.getCanSpawnHere()) { + this.worldObj.entityJoinedWorld(var9); + + for(int var17 = 0; var17 < 20; ++var17) { + var1 = (double)this.xCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D; + var3 = (double)this.yCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D; + var5 = (double)this.zCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D; + this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D); + this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D); + } + + var9.spawnExplosionParticle(); + this.updateDelay(); + } + } + } + + super.updateEntity(); + } + } + } + + private void updateDelay() { + this.delay = 200 + this.worldObj.rand.nextInt(600); + } + + public void readFromNBT(NBTTagCompound var1) { + super.readFromNBT(var1); + this.entityID = var1.getString("EntityId"); + this.delay = var1.getShort("Delay"); + } + + public void writeToNBT(NBTTagCompound var1) { + super.writeToNBT(var1); + var1.setString("EntityId", this.entityID); + var1.setShort("Delay", (short)this.delay); + } +} diff --git a/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java b/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java new file mode 100644 index 0000000..66420a8 --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java @@ -0,0 +1,37 @@ +package net.minecraft.src; + +import java.util.HashMap; +import java.util.Map; +import org.lwjgl.opengl.GL11; + +public class TileEntityMobSpawnerRenderer extends TileEntitySpecialRenderer { + private Map field_1412_b = new HashMap(); + + public void a(TileEntityMobSpawner var1, double var2, double var4, double var6, float var8) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2 + 0.5F, (float)var4, (float)var6 + 0.5F); + Entity var9 = (Entity)this.field_1412_b.get(var1.entityID); + if(var9 == null) { + var9 = EntityList.createEntityInWorld(var1.entityID, (World)null); + this.field_1412_b.put(var1.entityID, var9); + } + + if(var9 != null) { + var9.setWorld(var1.worldObj); + float var10 = 7.0F / 16.0F; + GL11.glTranslatef(0.0F, 0.4F, 0.0F); + GL11.glRotatef((float)(var1.field_830_d + (var1.field_831_c - var1.field_830_d) * (double)var8) * 10.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-30.0F, 1.0F, 0.0F, 0.0F); + GL11.glTranslatef(0.0F, -0.4F, 0.0F); + GL11.glScalef(var10, var10, var10); + var9.setLocationAndAngles(var2, var4, var6, 0.0F, 0.0F); + RenderManager.instance.func_853_a(var9, 0.0D, 0.0D, 0.0D, 0.0F, var8); + } + + GL11.glPopMatrix(); + } + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) { + this.a((TileEntityMobSpawner)var1, var2, var4, var6, var8); + } +} diff --git a/src/main/java/net/minecraft/src/TileEntityRenderer.java b/src/main/java/net/minecraft/src/TileEntityRenderer.java new file mode 100644 index 0000000..fa2fdb3 --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntityRenderer.java @@ -0,0 +1,86 @@ +package net.minecraft.src; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.lwjgl.opengl.GL11; + +public class TileEntityRenderer { + private Map specialRendererMap = new HashMap(); + public static TileEntityRenderer instance = new TileEntityRenderer(); + private FontRenderer fontRenderer; + public static double staticPlayerX; + public static double staticPlayerY; + public static double staticPlayerZ; + public RenderEngine renderEngine; + public World worldObj; + public EntityPlayer entityPlayer; + public float playerYaw; + public float playerPitch; + public double playerX; + public double playerY; + public double playerZ; + + private TileEntityRenderer() { + this.specialRendererMap.put(TileEntitySign.class, new TileEntitySignRenderer()); + this.specialRendererMap.put(TileEntityMobSpawner.class, new TileEntityMobSpawnerRenderer()); + Iterator var1 = this.specialRendererMap.values().iterator(); + + while(var1.hasNext()) { + TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)var1.next(); + var2.setTileEntityRenderer(this); + } + + } + + public TileEntitySpecialRenderer getSpecialRendererForClass(Class var1) { + TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)this.specialRendererMap.get(var1); + if(var2 == null && var1 != TileEntity.class) { + var2 = this.getSpecialRendererForClass(var1.getSuperclass()); + this.specialRendererMap.put(var1, var2); + } + + return var2; + } + + public boolean hasSpecialRenderer(TileEntity var1) { + return this.getSpecialRendererForEntity(var1) != null; + } + + public TileEntitySpecialRenderer getSpecialRendererForEntity(TileEntity var1) { + return var1 == null ? null : this.getSpecialRendererForClass(var1.getClass()); + } + + public void setRenderingContext(World var1, RenderEngine var2, FontRenderer var3, EntityPlayer var4, float var5) { + this.worldObj = var1; + this.renderEngine = var2; + this.entityPlayer = var4; + this.fontRenderer = var3; + this.playerYaw = var4.prevRotationYaw + (var4.rotationYaw - var4.prevRotationYaw) * var5; + this.playerPitch = var4.prevRotationPitch + (var4.rotationPitch - var4.prevRotationPitch) * var5; + this.playerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var5; + this.playerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var5; + this.playerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var5; + } + + public void renderTileEntity(TileEntity var1, float var2) { + if(var1.getDistanceFrom(this.playerX, this.playerY, this.playerZ) < 4096.0D) { + float var3 = this.worldObj.getLightBrightness(var1.xCoord, var1.yCoord, var1.zCoord); + GL11.glColor3f(var3, var3, var3); + this.renderTileEntityAt(var1, (double)var1.xCoord - staticPlayerX, (double)var1.yCoord - staticPlayerY, (double)var1.zCoord - staticPlayerZ, var2); + } + + } + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) { + TileEntitySpecialRenderer var9 = this.getSpecialRendererForEntity(var1); + if(var9 != null) { + var9.renderTileEntityAt(var1, var2, var4, var6, var8); + } + + } + + public FontRenderer getFontRenderer() { + return this.fontRenderer; + } +} diff --git a/src/main/java/net/minecraft/src/TileEntitySign.java b/src/main/java/net/minecraft/src/TileEntitySign.java new file mode 100644 index 0000000..69f2787 --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntitySign.java @@ -0,0 +1,26 @@ +package net.minecraft.src; + +public class TileEntitySign extends TileEntity { + public String[] signText = new String[]{"", "", "", ""}; + public int lineBeingEdited = -1; + + public void writeToNBT(NBTTagCompound var1) { + super.writeToNBT(var1); + var1.setString("Text1", this.signText[0]); + var1.setString("Text2", this.signText[1]); + var1.setString("Text3", this.signText[2]); + var1.setString("Text4", this.signText[3]); + } + + public void readFromNBT(NBTTagCompound var1) { + super.readFromNBT(var1); + + for(int var2 = 0; var2 < 4; ++var2) { + this.signText[var2] = var1.getString("Text" + (var2 + 1)); + if(this.signText[var2].length() > 15) { + this.signText[var2] = this.signText[var2].substring(0, 15); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/TileEntitySignRenderer.java b/src/main/java/net/minecraft/src/TileEntitySignRenderer.java new file mode 100644 index 0000000..44e369f --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntitySignRenderer.java @@ -0,0 +1,70 @@ +package net.minecraft.src; + +import org.lwjgl.opengl.GL11; + +public class TileEntitySignRenderer extends TileEntitySpecialRenderer { + private SignModel signModel = new SignModel(); + + public void a(TileEntitySign var1, double var2, double var4, double var6, float var8) { + Block var9 = var1.getBlockType(); + GL11.glPushMatrix(); + float var10 = 2.0F / 3.0F; + float var12; + if(var9 == Block.signPost) { + GL11.glTranslatef((float)var2 + 0.5F, (float)var4 + 12.0F / 16.0F * var10, (float)var6 + 0.5F); + float var11 = (float)(var1.getBlockMetadata() * 360) / 16.0F; + GL11.glRotatef(-var11, 0.0F, 1.0F, 0.0F); + this.signModel.field_1345_b.field_1403_h = true; + } else { + int var16 = var1.getBlockMetadata(); + var12 = 0.0F; + if(var16 == 2) { + var12 = 180.0F; + } + + if(var16 == 4) { + var12 = 90.0F; + } + + if(var16 == 5) { + var12 = -90.0F; + } + + GL11.glTranslatef((float)var2 + 0.5F, (float)var4 + 12.0F / 16.0F * var10, (float)var6 + 0.5F); + GL11.glRotatef(-var12, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, -(5.0F / 16.0F), -(7.0F / 16.0F)); + this.signModel.field_1345_b.field_1403_h = false; + } + + this.bindTextureByName("/item/sign.png"); + GL11.glPushMatrix(); + GL11.glScalef(var10, -var10, -var10); + this.signModel.func_887_a(); + GL11.glPopMatrix(); + FontRenderer var17 = this.getFontRenderer(); + var12 = (float)(1.0D / 60.0D) * var10; + GL11.glTranslatef(0.0F, 0.5F * var10, 0.07F * var10); + GL11.glScalef(var12, -var12, var12); + GL11.glNormal3f(0.0F, 0.0F, -1.0F * var12); + GL11.glDepthMask(false); + byte var13 = 0; + + for(int var14 = 0; var14 < var1.signText.length; ++var14) { + String var15 = var1.signText[var14]; + if(var14 == var1.lineBeingEdited) { + var15 = "> " + var15 + " <"; + var17.drawString(var15, -var17.getStringWidth(var15) / 2, var14 * 10 - var1.signText.length * 5, var13); + } else { + var17.drawString(var15, -var17.getStringWidth(var15) / 2, var14 * 10 - var1.signText.length * 5, var13); + } + } + + GL11.glDepthMask(true); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) { + this.a((TileEntitySign)var1, var2, var4, var6, var8); + } +} diff --git a/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java b/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java new file mode 100644 index 0000000..828b86e --- /dev/null +++ b/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java @@ -0,0 +1,20 @@ +package net.minecraft.src; + +public abstract class TileEntitySpecialRenderer { + protected TileEntityRenderer tileEntityRenderer; + + public abstract void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8); + + protected void bindTextureByName(String var1) { + RenderEngine var2 = this.tileEntityRenderer.renderEngine; + var2.bindTexture(var2.getTexture(var1)); + } + + public void setTileEntityRenderer(TileEntityRenderer var1) { + this.tileEntityRenderer = var1; + } + + public FontRenderer getFontRenderer() { + return this.tileEntityRenderer.getFontRenderer(); + } +} diff --git a/src/main/java/net/minecraft/src/Timer.java b/src/main/java/net/minecraft/src/Timer.java new file mode 100644 index 0000000..4924f75 --- /dev/null +++ b/src/main/java/net/minecraft/src/Timer.java @@ -0,0 +1,58 @@ +package net.minecraft.src; + +public class Timer { + public float ticksPerSecond; + private double lastHRTime; + public int elapsedTicks; + public float renderPartialTicks; + public float timerSpeed = 1.0F; + public float elapsedPartialTicks = 0.0F; + private long lastSyncSysClock; + private long lastSyncHRClock; + private double timeSyncAdjustment = 1.0D; + + public Timer(float var1) { + this.ticksPerSecond = var1; + this.lastSyncSysClock = System.currentTimeMillis(); + this.lastSyncHRClock = System.nanoTime() / 1000000L; + } + + public void updateTimer() { + long var1 = System.currentTimeMillis(); + long var3 = var1 - this.lastSyncSysClock; + long var5 = System.nanoTime() / 1000000L; + double var9; + if(var3 > 1000L) { + long var7 = var5 - this.lastSyncHRClock; + var9 = (double)var3 / (double)var7; + this.timeSyncAdjustment += (var9 - this.timeSyncAdjustment) * (double)0.2F; + this.lastSyncSysClock = var1; + this.lastSyncHRClock = var5; + } + + if(var3 < 0L) { + this.lastSyncSysClock = var1; + this.lastSyncHRClock = var5; + } + + double var11 = (double)var5 / 1000.0D; + var9 = (var11 - this.lastHRTime) * this.timeSyncAdjustment; + this.lastHRTime = var11; + if(var9 < 0.0D) { + var9 = 0.0D; + } + + if(var9 > 1.0D) { + var9 = 1.0D; + } + + this.elapsedPartialTicks = (float)((double)this.elapsedPartialTicks + var9 * (double)this.timerSpeed * (double)this.ticksPerSecond); + this.elapsedTicks = (int)this.elapsedPartialTicks; + this.elapsedPartialTicks -= (float)this.elapsedTicks; + if(this.elapsedTicks > 10) { + this.elapsedTicks = 10; + } + + this.renderPartialTicks = this.elapsedPartialTicks; + } +} diff --git a/src/main/java/net/minecraft/src/UnexpectedThrowable.java b/src/main/java/net/minecraft/src/UnexpectedThrowable.java new file mode 100644 index 0000000..6f42003 --- /dev/null +++ b/src/main/java/net/minecraft/src/UnexpectedThrowable.java @@ -0,0 +1,11 @@ +package net.minecraft.src; + +public class UnexpectedThrowable { + public final String description; + public final Throwable exception; + + public UnexpectedThrowable(String var1, Throwable var2) { + this.description = var1; + this.exception = var2; + } +} diff --git a/src/main/java/net/minecraft/src/Vec3D.java b/src/main/java/net/minecraft/src/Vec3D.java new file mode 100644 index 0000000..eff3a40 --- /dev/null +++ b/src/main/java/net/minecraft/src/Vec3D.java @@ -0,0 +1,157 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +public class Vec3D { + private static List vectorList = new ArrayList(); + private static int nextVector = 0; + public double xCoord; + public double yCoord; + public double zCoord; + + public static Vec3D createVectorHelper(double var0, double var2, double var4) { + return new Vec3D(var0, var2, var4); + } + + public static void initialize() { + nextVector = 0; + } + + public static Vec3D createVector(double var0, double var2, double var4) { + if(nextVector >= vectorList.size()) { + vectorList.add(createVectorHelper(0.0D, 0.0D, 0.0D)); + } + + return ((Vec3D)vectorList.get(nextVector++)).setComponents(var0, var2, var4); + } + + private Vec3D(double var1, double var3, double var5) { + if(var1 == -0.0D) { + var1 = 0.0D; + } + + if(var3 == -0.0D) { + var3 = 0.0D; + } + + if(var5 == -0.0D) { + var5 = 0.0D; + } + + this.xCoord = var1; + this.yCoord = var3; + this.zCoord = var5; + } + + private Vec3D setComponents(double var1, double var3, double var5) { + this.xCoord = var1; + this.yCoord = var3; + this.zCoord = var5; + return this; + } + + public Vec3D func_1262_a(Vec3D var1) { + return createVector(var1.xCoord - this.xCoord, var1.yCoord - this.yCoord, var1.zCoord - this.zCoord); + } + + public Vec3D normalize() { + double var1 = (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord); + return var1 < 1.0E-4D ? createVector(0.0D, 0.0D, 0.0D) : createVector(this.xCoord / var1, this.yCoord / var1, this.zCoord / var1); + } + + public Vec3D crossProduct(Vec3D var1) { + return createVector(this.yCoord * var1.zCoord - this.zCoord * var1.yCoord, this.zCoord * var1.xCoord - this.xCoord * var1.zCoord, this.xCoord * var1.yCoord - this.yCoord * var1.xCoord); + } + + public Vec3D addVector(double var1, double var3, double var5) { + return createVector(this.xCoord + var1, this.yCoord + var3, this.zCoord + var5); + } + + public double distanceTo(Vec3D var1) { + double var2 = var1.xCoord - this.xCoord; + double var4 = var1.yCoord - this.yCoord; + double var6 = var1.zCoord - this.zCoord; + return (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6); + } + + public double squareDistanceTo(Vec3D var1) { + double var2 = var1.xCoord - this.xCoord; + double var4 = var1.yCoord - this.yCoord; + double var6 = var1.zCoord - this.zCoord; + return var2 * var2 + var4 * var4 + var6 * var6; + } + + public double squareDistanceTo(double var1, double var3, double var5) { + double var7 = var1 - this.xCoord; + double var9 = var3 - this.yCoord; + double var11 = var5 - this.zCoord; + return var7 * var7 + var9 * var9 + var11 * var11; + } + + public double lengthVector() { + return (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord); + } + + public Vec3D getIntermediateWithXValue(Vec3D var1, double var2) { + double var4 = var1.xCoord - this.xCoord; + double var6 = var1.yCoord - this.yCoord; + double var8 = var1.zCoord - this.zCoord; + if(var4 * var4 < (double)1.0E-7F) { + return null; + } else { + double var10 = (var2 - this.xCoord) / var4; + return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; + } + } + + public Vec3D getIntermediateWithYValue(Vec3D var1, double var2) { + double var4 = var1.xCoord - this.xCoord; + double var6 = var1.yCoord - this.yCoord; + double var8 = var1.zCoord - this.zCoord; + if(var6 * var6 < (double)1.0E-7F) { + return null; + } else { + double var10 = (var2 - this.yCoord) / var6; + return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; + } + } + + public Vec3D getIntermediateWithZValue(Vec3D var1, double var2) { + double var4 = var1.xCoord - this.xCoord; + double var6 = var1.yCoord - this.yCoord; + double var8 = var1.zCoord - this.zCoord; + if(var8 * var8 < (double)1.0E-7F) { + return null; + } else { + double var10 = (var2 - this.zCoord) / var8; + return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; + } + } + + public String toString() { + return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ")"; + } + + public void rotateAroundX(float var1) { + float var2 = MathHelper.cos(var1); + float var3 = MathHelper.sin(var1); + double var4 = this.xCoord; + double var6 = this.yCoord * (double)var2 + this.zCoord * (double)var3; + double var8 = this.zCoord * (double)var2 - this.yCoord * (double)var3; + this.xCoord = var4; + this.yCoord = var6; + this.zCoord = var8; + } + + public void rotateAroundY(float var1) { + float var2 = MathHelper.cos(var1); + float var3 = MathHelper.sin(var1); + double var4 = this.xCoord * (double)var2 + this.zCoord * (double)var3; + double var6 = this.yCoord; + double var8 = this.zCoord * (double)var2 - this.xCoord * (double)var3; + this.xCoord = var4; + this.yCoord = var6; + this.zCoord = var8; + } +} diff --git a/src/main/java/net/minecraft/src/World.java b/src/main/java/net/minecraft/src/World.java new file mode 100644 index 0000000..bb42061 --- /dev/null +++ b/src/main/java/net/minecraft/src/World.java @@ -0,0 +1,2047 @@ +package net.minecraft.src; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.TreeSet; + +public class World implements IBlockAccess { + public boolean field_4214_a; + private List field_1051_z; + public List loadedEntityList; + private List field_1024_A; + private TreeSet scheduledTickTreeSet; + private Set scheduledTickSet; + public List loadedTileEntityList; + public List playerEntities; + public long worldTime; + private long field_1019_F; + public int skylightSubtracted; + protected int field_9437_g; + protected int field_9436_h; + public boolean field_1043_h; + private long field_1054_E; + protected int autosavePeriod; + public int difficultySetting; + public Random rand; + public int spawnX; + public int spawnY; + public int spawnZ; + public boolean field_1033_r; + public final WorldProvider worldProvider; + protected List worldAccesses; + private IChunkProvider chunkProvider; + public File field_9433_s; + public File field_9432_t; + public long randomSeed; + private NBTTagCompound nbtCompoundPlayer; + public long sizeOnDisk; + public final String field_9431_w; + public boolean field_9430_x; + private ArrayList field_9428_I; + private int field_4204_J; + static int field_9429_y = 0; + private Set field_9427_K; + private int field_9426_L; + private List field_1012_M; + + public static NBTTagCompound func_629_a(File var0, String var1) { + File var2 = new File(var0, "saves"); + File var3 = new File(var2, var1); + if(!var3.exists()) { + return null; + } else { + File var4 = new File(var3, "level.dat"); + if(var4.exists()) { + try { + NBTTagCompound var5 = CompressedStreamTools.func_1138_a(new FileInputStream(var4)); + NBTTagCompound var6 = var5.getCompoundTag("Data"); + return var6; + } catch (Exception var7) { + var7.printStackTrace(); + } + } + + return null; + } + } + + public static void deleteWorld(File var0, String var1) { + File var2 = new File(var0, "saves"); + File var3 = new File(var2, var1); + if(var3.exists()) { + deleteFiles(var3.listFiles()); + var3.delete(); + } + } + + private static void deleteFiles(File[] var0) { + for(int var1 = 0; var1 < var0.length; ++var1) { + if(var0[var1].isDirectory()) { + deleteFiles(var0[var1].listFiles()); + } + + var0[var1].delete(); + } + + } + + public WorldChunkManager func_4075_a() { + return this.worldProvider.worldChunkMgr; + } + + public World(File var1, String var2) { + this(var1, var2, (new Random()).nextLong()); + } + + public World(String var1, WorldProvider var2, long var3) { + this.field_4214_a = false; + this.field_1051_z = new ArrayList(); + this.loadedEntityList = new ArrayList(); + this.field_1024_A = new ArrayList(); + this.scheduledTickTreeSet = new TreeSet(); + this.scheduledTickSet = new HashSet(); + this.loadedTileEntityList = new ArrayList(); + this.playerEntities = new ArrayList(); + this.worldTime = 0L; + this.field_1019_F = 16777215L; + this.skylightSubtracted = 0; + this.field_9437_g = (new Random()).nextInt(); + this.field_9436_h = 1013904223; + this.field_1043_h = false; + this.field_1054_E = System.currentTimeMillis(); + this.autosavePeriod = 40; + this.rand = new Random(); + this.field_1033_r = false; + this.worldAccesses = new ArrayList(); + this.randomSeed = 0L; + this.sizeOnDisk = 0L; + this.field_9428_I = new ArrayList(); + this.field_4204_J = 0; + this.field_9427_K = new HashSet(); + this.field_9426_L = this.rand.nextInt(12000); + this.field_1012_M = new ArrayList(); + this.field_9431_w = var1; + this.randomSeed = var3; + this.worldProvider = var2; + var2.registerWorld(this); + this.chunkProvider = this.func_4081_a(this.field_9432_t); + this.calculateInitialSkylight(); + } + + public World(World var1, WorldProvider var2) { + this.field_4214_a = false; + this.field_1051_z = new ArrayList(); + this.loadedEntityList = new ArrayList(); + this.field_1024_A = new ArrayList(); + this.scheduledTickTreeSet = new TreeSet(); + this.scheduledTickSet = new HashSet(); + this.loadedTileEntityList = new ArrayList(); + this.playerEntities = new ArrayList(); + this.worldTime = 0L; + this.field_1019_F = 16777215L; + this.skylightSubtracted = 0; + this.field_9437_g = (new Random()).nextInt(); + this.field_9436_h = 1013904223; + this.field_1043_h = false; + this.field_1054_E = System.currentTimeMillis(); + this.autosavePeriod = 40; + this.rand = new Random(); + this.field_1033_r = false; + this.worldAccesses = new ArrayList(); + this.randomSeed = 0L; + this.sizeOnDisk = 0L; + this.field_9428_I = new ArrayList(); + this.field_4204_J = 0; + this.field_9427_K = new HashSet(); + this.field_9426_L = this.rand.nextInt(12000); + this.field_1012_M = new ArrayList(); + this.field_1054_E = var1.field_1054_E; + this.field_9433_s = var1.field_9433_s; + this.field_9432_t = var1.field_9432_t; + this.field_9431_w = var1.field_9431_w; + this.randomSeed = var1.randomSeed; + this.worldTime = var1.worldTime; + this.spawnX = var1.spawnX; + this.spawnY = var1.spawnY; + this.spawnZ = var1.spawnZ; + this.sizeOnDisk = var1.sizeOnDisk; + this.worldProvider = var2; + var2.registerWorld(this); + this.chunkProvider = this.func_4081_a(this.field_9432_t); + this.calculateInitialSkylight(); + } + + public World(File var1, String var2, long var3) { + this(var1, var2, var3, (WorldProvider)null); + } + + public World(File var1, String var2, long var3, WorldProvider var5) { + this.field_4214_a = false; + this.field_1051_z = new ArrayList(); + this.loadedEntityList = new ArrayList(); + this.field_1024_A = new ArrayList(); + this.scheduledTickTreeSet = new TreeSet(); + this.scheduledTickSet = new HashSet(); + this.loadedTileEntityList = new ArrayList(); + this.playerEntities = new ArrayList(); + this.worldTime = 0L; + this.field_1019_F = 16777215L; + this.skylightSubtracted = 0; + this.field_9437_g = (new Random()).nextInt(); + this.field_9436_h = 1013904223; + this.field_1043_h = false; + this.field_1054_E = System.currentTimeMillis(); + this.autosavePeriod = 40; + this.rand = new Random(); + this.field_1033_r = false; + this.worldAccesses = new ArrayList(); + this.randomSeed = 0L; + this.sizeOnDisk = 0L; + this.field_9428_I = new ArrayList(); + this.field_4204_J = 0; + this.field_9427_K = new HashSet(); + this.field_9426_L = this.rand.nextInt(12000); + this.field_1012_M = new ArrayList(); + this.field_9433_s = var1; + this.field_9431_w = var2; + var1.mkdirs(); + this.field_9432_t = new File(var1, var2); + this.field_9432_t.mkdirs(); + + try { + File var6 = new File(this.field_9432_t, "session.lock"); + DataOutputStream var7 = new DataOutputStream(new FileOutputStream(var6)); + + try { + var7.writeLong(this.field_1054_E); + } finally { + var7.close(); + } + } catch (IOException var16) { + var16.printStackTrace(); + throw new RuntimeException("Failed to check session lock, aborting"); + } + + Object var17 = new WorldProvider(); + File var18 = new File(this.field_9432_t, "level.dat"); + this.field_1033_r = !var18.exists(); + if(var18.exists()) { + try { + NBTTagCompound var8 = CompressedStreamTools.func_1138_a(new FileInputStream(var18)); + NBTTagCompound var9 = var8.getCompoundTag("Data"); + this.randomSeed = var9.getLong("RandomSeed"); + this.spawnX = var9.getInteger("SpawnX"); + this.spawnY = var9.getInteger("SpawnY"); + this.spawnZ = var9.getInteger("SpawnZ"); + this.worldTime = var9.getLong("Time"); + this.sizeOnDisk = var9.getLong("SizeOnDisk"); + if(var9.hasKey("Player")) { + this.nbtCompoundPlayer = var9.getCompoundTag("Player"); + int var10 = this.nbtCompoundPlayer.getInteger("Dimension"); + if(var10 == -1) { + var17 = new WorldProviderHell(); + } + } + } catch (Exception var14) { + var14.printStackTrace(); + } + } + + if(var5 != null) { + var17 = var5; + } + + boolean var19 = false; + if(this.randomSeed == 0L) { + this.randomSeed = var3; + var19 = true; + } + + this.worldProvider = (WorldProvider)var17; + this.worldProvider.registerWorld(this); + this.chunkProvider = this.func_4081_a(this.field_9432_t); + if(var19) { + this.field_9430_x = true; + this.spawnX = 0; + this.spawnY = 64; + + for(this.spawnZ = 0; !this.worldProvider.canCoordinateBeSpawn(this.spawnX, this.spawnZ); this.spawnZ += this.rand.nextInt(64) - this.rand.nextInt(64)) { + this.spawnX += this.rand.nextInt(64) - this.rand.nextInt(64); + } + + this.field_9430_x = false; + } + + this.calculateInitialSkylight(); + } + + protected IChunkProvider func_4081_a(File var1) { + return new ChunkProviderLoadOrGenerate(this, this.worldProvider.getChunkLoader(var1), this.worldProvider.getChunkProvider()); + } + + public void func_4076_b() { + if(this.spawnY <= 0) { + this.spawnY = 64; + } + + while(this.func_614_g(this.spawnX, this.spawnZ) == 0) { + this.spawnX += this.rand.nextInt(8) - this.rand.nextInt(8); + this.spawnZ += this.rand.nextInt(8) - this.rand.nextInt(8); + } + + } + + public int func_614_g(int var1, int var2) { + int var3; + for(var3 = 63; this.getBlockId(var1, var3 + 1, var2) != 0; ++var3) { + } + + return this.getBlockId(var1, var3, var2); + } + + public void func_6464_c() { + } + + public void func_608_a(EntityPlayer var1) { + try { + if(this.nbtCompoundPlayer != null) { + var1.readFromNBT(this.nbtCompoundPlayer); + this.nbtCompoundPlayer = null; + } + + this.entityJoinedWorld(var1); + } catch (Exception var3) { + var3.printStackTrace(); + } + + } + + public void saveWorld(boolean var1, IProgressUpdate var2) { + if(this.chunkProvider.func_536_b()) { + if(var2 != null) { + var2.func_594_b("Saving level"); + } + + this.saveLevel(); + if(var2 != null) { + var2.displayLoadingString("Saving chunks"); + } + + this.chunkProvider.saveChunks(var1, var2); + } + } + + private void saveLevel() { + this.func_663_l(); + NBTTagCompound var1 = new NBTTagCompound(); + var1.setLong("RandomSeed", this.randomSeed); + var1.setInteger("SpawnX", this.spawnX); + var1.setInteger("SpawnY", this.spawnY); + var1.setInteger("SpawnZ", this.spawnZ); + var1.setLong("Time", this.worldTime); + var1.setLong("SizeOnDisk", this.sizeOnDisk); + var1.setLong("LastPlayed", System.currentTimeMillis()); + EntityPlayer var2 = null; + if(this.playerEntities.size() > 0) { + var2 = (EntityPlayer)this.playerEntities.get(0); + } + + NBTTagCompound var3; + if(var2 != null) { + var3 = new NBTTagCompound(); + var2.writeToNBT(var3); + var1.setCompoundTag("Player", var3); + } + + var3 = new NBTTagCompound(); + var3.setTag("Data", var1); + + try { + File var4 = new File(this.field_9432_t, "level.dat_new"); + File var5 = new File(this.field_9432_t, "level.dat_old"); + File var6 = new File(this.field_9432_t, "level.dat"); + CompressedStreamTools.writeGzippedCompoundToOutputStream(var3, new FileOutputStream(var4)); + if(var5.exists()) { + var5.delete(); + } + + var6.renameTo(var5); + if(var6.exists()) { + var6.delete(); + } + + var4.renameTo(var6); + if(var4.exists()) { + var4.delete(); + } + } catch (Exception var7) { + var7.printStackTrace(); + } + + } + + public boolean func_650_a(int var1) { + if(!this.chunkProvider.func_536_b()) { + return true; + } else { + if(var1 == 0) { + this.saveLevel(); + } + + return this.chunkProvider.saveChunks(false, (IProgressUpdate)null); + } + } + + public int getBlockId(int var1, int var2, int var3) { + return var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000 ? (var2 < 0 ? 0 : (var2 >= 128 ? 0 : this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).getBlockID(var1 & 15, var2, var3 & 15))) : 0; + } + + public boolean blockExists(int var1, int var2, int var3) { + return var2 >= 0 && var2 < 128 ? this.chunkExists(var1 >> 4, var3 >> 4) : false; + } + + public boolean checkChunksExist(int var1, int var2, int var3, int var4, int var5, int var6) { + if(var5 >= 0 && var2 < 128) { + var1 >>= 4; + var2 >>= 4; + var3 >>= 4; + var4 >>= 4; + var5 >>= 4; + var6 >>= 4; + + for(int var7 = var1; var7 <= var4; ++var7) { + for(int var8 = var3; var8 <= var6; ++var8) { + if(!this.chunkExists(var7, var8)) { + return false; + } + } + } + + return true; + } else { + return false; + } + } + + private boolean chunkExists(int var1, int var2) { + return this.chunkProvider.chunkExists(var1, var2); + } + + public Chunk getChunkFromBlockCoords(int var1, int var2) { + return this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4); + } + + public Chunk getChunkFromChunkCoords(int var1, int var2) { + return this.chunkProvider.provideChunk(var1, var2); + } + + public boolean setBlockAndMetadata(int var1, int var2, int var3, int var4, int var5) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + if(var2 < 0) { + return false; + } else if(var2 >= 128) { + return false; + } else { + Chunk var6 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + return var6.setBlockIDWithMetadata(var1 & 15, var2, var3 & 15, var4, var5); + } + } else { + return false; + } + } + + public boolean setBlock(int var1, int var2, int var3, int var4) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + if(var2 < 0) { + return false; + } else if(var2 >= 128) { + return false; + } else { + Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + return var5.setBlockID(var1 & 15, var2, var3 & 15, var4); + } + } else { + return false; + } + } + + public Material getBlockMaterial(int var1, int var2, int var3) { + int var4 = this.getBlockId(var1, var2, var3); + return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial; + } + + public int getBlockMetadata(int var1, int var2, int var3) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + if(var2 < 0) { + return 0; + } else if(var2 >= 128) { + return 0; + } else { + Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + var1 &= 15; + var3 &= 15; + return var4.getBlockMetadata(var1, var2, var3); + } + } else { + return 0; + } + } + + public void setBlockMetadataWithNotify(int var1, int var2, int var3, int var4) { + if(this.setBlockMetadata(var1, var2, var3, var4)) { + this.notifyBlockChange(var1, var2, var3, this.getBlockId(var1, var2, var3)); + } + + } + + public boolean setBlockMetadata(int var1, int var2, int var3, int var4) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + if(var2 < 0) { + return false; + } else if(var2 >= 128) { + return false; + } else { + Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + var1 &= 15; + var3 &= 15; + var5.setBlockMetadata(var1, var2, var3, var4); + return true; + } + } else { + return false; + } + } + + public boolean setBlockWithNotify(int var1, int var2, int var3, int var4) { + if(this.setBlock(var1, var2, var3, var4)) { + this.notifyBlockChange(var1, var2, var3, var4); + return true; + } else { + return false; + } + } + + public boolean setBlockAndMetadataWithNotify(int var1, int var2, int var3, int var4, int var5) { + if(this.setBlockAndMetadata(var1, var2, var3, var4, var5)) { + this.notifyBlockChange(var1, var2, var3, var4); + return true; + } else { + return false; + } + } + + public void func_665_h(int var1, int var2, int var3) { + for(int var4 = 0; var4 < this.worldAccesses.size(); ++var4) { + ((IWorldAccess)this.worldAccesses.get(var4)).func_934_a(var1, var2, var3); + } + + } + + protected void notifyBlockChange(int var1, int var2, int var3, int var4) { + this.func_665_h(var1, var2, var3); + this.notifyBlocksOfNeighborChange(var1, var2, var3, var4); + } + + public void func_680_f(int var1, int var2, int var3, int var4) { + if(var3 > var4) { + int var5 = var4; + var4 = var3; + var3 = var5; + } + + this.func_701_b(var1, var3, var2, var1, var4, var2); + } + + public void func_701_b(int var1, int var2, int var3, int var4, int var5, int var6) { + for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) { + ((IWorldAccess)this.worldAccesses.get(var7)).func_937_b(var1, var2, var3, var4, var5, var6); + } + + } + + public void notifyBlocksOfNeighborChange(int var1, int var2, int var3, int var4) { + this.notifyBlockOfNeighborChange(var1 - 1, var2, var3, var4); + this.notifyBlockOfNeighborChange(var1 + 1, var2, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2 - 1, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2 + 1, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2, var3 - 1, var4); + this.notifyBlockOfNeighborChange(var1, var2, var3 + 1, var4); + } + + private void notifyBlockOfNeighborChange(int var1, int var2, int var3, int var4) { + if(!this.field_1043_h) { + Block var5 = Block.blocksList[this.getBlockId(var1, var2, var3)]; + if(var5 != null) { + var5.onNeighborBlockChange(this, var1, var2, var3, var4); + } + + } + } + + public boolean canBlockSeeTheSky(int var1, int var2, int var3) { + return this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).canBlockSeeTheSky(var1 & 15, var2, var3 & 15); + } + + public int getBlockLightValue(int var1, int var2, int var3) { + return this.getBlockLightValue(var1, var2, var3, true); + } + + public int getBlockLightValue(int var1, int var2, int var3, boolean var4) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + int var5; + if(var4) { + var5 = this.getBlockId(var1, var2, var3); + if(var5 == Block.stairSingle.blockID || var5 == Block.tilledField.blockID) { + int var6 = this.getBlockLightValue(var1, var2 + 1, var3, false); + int var7 = this.getBlockLightValue(var1 + 1, var2, var3, false); + int var8 = this.getBlockLightValue(var1 - 1, var2, var3, false); + int var9 = this.getBlockLightValue(var1, var2, var3 + 1, false); + int var10 = this.getBlockLightValue(var1, var2, var3 - 1, false); + if(var7 > var6) { + var6 = var7; + } + + if(var8 > var6) { + var6 = var8; + } + + if(var9 > var6) { + var6 = var9; + } + + if(var10 > var6) { + var6 = var10; + } + + return var6; + } + } + + if(var2 < 0) { + return 0; + } else if(var2 >= 128) { + var5 = 15 - this.skylightSubtracted; + if(var5 < 0) { + var5 = 0; + } + + return var5; + } else { + Chunk var11 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + var1 &= 15; + var3 &= 15; + return var11.getBlockLightValue(var1, var2, var3, this.skylightSubtracted); + } + } else { + return 15; + } + } + + public boolean canExistingBlockSeeTheSky(int var1, int var2, int var3) { + if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) { + if(var2 < 0) { + return false; + } else if(var2 >= 128) { + return true; + } else if(!this.chunkExists(var1 >> 4, var3 >> 4)) { + return false; + } else { + Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + var1 &= 15; + var3 &= 15; + return var4.canBlockSeeTheSky(var1, var2, var3); + } + } else { + return false; + } + } + + public int getHeightValue(int var1, int var2) { + if(var1 >= -32000000 && var2 >= -32000000 && var1 < 32000000 && var2 <= 32000000) { + if(!this.chunkExists(var1 >> 4, var2 >> 4)) { + return 0; + } else { + Chunk var3 = this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4); + return var3.getHeightValue(var1 & 15, var2 & 15); + } + } else { + return 0; + } + } + + public void neighborLightPropagationChanged(EnumSkyBlock var1, int var2, int var3, int var4, int var5) { + if(!this.worldProvider.field_6478_e || var1 != EnumSkyBlock.Sky) { + if(this.blockExists(var2, var3, var4)) { + if(var1 == EnumSkyBlock.Sky) { + if(this.canExistingBlockSeeTheSky(var2, var3, var4)) { + var5 = 15; + } + } else if(var1 == EnumSkyBlock.Block) { + int var6 = this.getBlockId(var2, var3, var4); + if(Block.lightValue[var6] > var5) { + var5 = Block.lightValue[var6]; + } + } + + if(this.getSavedLightValue(var1, var2, var3, var4) != var5) { + this.func_616_a(var1, var2, var3, var4, var2, var3, var4); + } + + } + } + } + + public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) { + if(var3 >= 0 && var3 < 128 && var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) { + int var5 = var2 >> 4; + int var6 = var4 >> 4; + if(!this.chunkExists(var5, var6)) { + return 0; + } else { + Chunk var7 = this.getChunkFromChunkCoords(var5, var6); + return var7.getSavedLightValue(var1, var2 & 15, var3, var4 & 15); + } + } else { + return var1.field_1722_c; + } + } + + public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) { + if(var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) { + if(var3 >= 0) { + if(var3 < 128) { + if(this.chunkExists(var2 >> 4, var4 >> 4)) { + Chunk var6 = this.getChunkFromChunkCoords(var2 >> 4, var4 >> 4); + var6.setLightValue(var1, var2 & 15, var3, var4 & 15, var5); + + for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) { + ((IWorldAccess)this.worldAccesses.get(var7)).func_934_a(var2, var3, var4); + } + + } + } + } + } + } + + public float getLightBrightness(int var1, int var2, int var3) { + return this.worldProvider.lightBrightnessTable[this.getBlockLightValue(var1, var2, var3)]; + } + + public boolean isDaytime() { + return this.skylightSubtracted < 4; + } + + public MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2) { + return this.rayTraceBlocks(var1, var2, false); + } + + public MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2, boolean var3) { + if(!Double.isNaN(var1.xCoord) && !Double.isNaN(var1.yCoord) && !Double.isNaN(var1.zCoord)) { + if(!Double.isNaN(var2.xCoord) && !Double.isNaN(var2.yCoord) && !Double.isNaN(var2.zCoord)) { + int var4 = MathHelper.floor_double(var2.xCoord); + int var5 = MathHelper.floor_double(var2.yCoord); + int var6 = MathHelper.floor_double(var2.zCoord); + int var7 = MathHelper.floor_double(var1.xCoord); + int var8 = MathHelper.floor_double(var1.yCoord); + int var9 = MathHelper.floor_double(var1.zCoord); + int var10 = 200; + + while(var10-- >= 0) { + if(Double.isNaN(var1.xCoord) || Double.isNaN(var1.yCoord) || Double.isNaN(var1.zCoord)) { + return null; + } + + if(var7 == var4 && var8 == var5 && var9 == var6) { + return null; + } + + double var11 = 999.0D; + double var13 = 999.0D; + double var15 = 999.0D; + if(var4 > var7) { + var11 = (double)var7 + 1.0D; + } + + if(var4 < var7) { + var11 = (double)var7 + 0.0D; + } + + if(var5 > var8) { + var13 = (double)var8 + 1.0D; + } + + if(var5 < var8) { + var13 = (double)var8 + 0.0D; + } + + if(var6 > var9) { + var15 = (double)var9 + 1.0D; + } + + if(var6 < var9) { + var15 = (double)var9 + 0.0D; + } + + double var17 = 999.0D; + double var19 = 999.0D; + double var21 = 999.0D; + double var23 = var2.xCoord - var1.xCoord; + double var25 = var2.yCoord - var1.yCoord; + double var27 = var2.zCoord - var1.zCoord; + if(var11 != 999.0D) { + var17 = (var11 - var1.xCoord) / var23; + } + + if(var13 != 999.0D) { + var19 = (var13 - var1.yCoord) / var25; + } + + if(var15 != 999.0D) { + var21 = (var15 - var1.zCoord) / var27; + } + + boolean var29 = false; + byte var35; + if(var17 < var19 && var17 < var21) { + if(var4 > var7) { + var35 = 4; + } else { + var35 = 5; + } + + var1.xCoord = var11; + var1.yCoord += var25 * var17; + var1.zCoord += var27 * var17; + } else if(var19 < var21) { + if(var5 > var8) { + var35 = 0; + } else { + var35 = 1; + } + + var1.xCoord += var23 * var19; + var1.yCoord = var13; + var1.zCoord += var27 * var19; + } else { + if(var6 > var9) { + var35 = 2; + } else { + var35 = 3; + } + + var1.xCoord += var23 * var21; + var1.yCoord += var25 * var21; + var1.zCoord = var15; + } + + Vec3D var30 = Vec3D.createVector(var1.xCoord, var1.yCoord, var1.zCoord); + var7 = (int)(var30.xCoord = (double)MathHelper.floor_double(var1.xCoord)); + if(var35 == 5) { + --var7; + ++var30.xCoord; + } + + var8 = (int)(var30.yCoord = (double)MathHelper.floor_double(var1.yCoord)); + if(var35 == 1) { + --var8; + ++var30.yCoord; + } + + var9 = (int)(var30.zCoord = (double)MathHelper.floor_double(var1.zCoord)); + if(var35 == 3) { + --var9; + ++var30.zCoord; + } + + int var31 = this.getBlockId(var7, var8, var9); + int var32 = this.getBlockMetadata(var7, var8, var9); + Block var33 = Block.blocksList[var31]; + if(var31 > 0 && var33.canCollideCheck(var32, var3)) { + MovingObjectPosition var34 = var33.collisionRayTrace(this, var7, var8, var9, var1, var2); + if(var34 != null) { + return var34; + } + } + } + + return null; + } else { + return null; + } + } else { + return null; + } + } + + public void playSoundAtEntity(Entity var1, String var2, float var3, float var4) { + for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) { + ((IWorldAccess)this.worldAccesses.get(var5)).playSound(var2, var1.posX, var1.posY - (double)var1.yOffset, var1.posZ, var3, var4); + } + + } + + public void playSoundEffect(double var1, double var3, double var5, String var7, float var8, float var9) { + for(int var10 = 0; var10 < this.worldAccesses.size(); ++var10) { + ((IWorldAccess)this.worldAccesses.get(var10)).playSound(var7, var1, var3, var5, var8, var9); + } + + } + + public void playRecord(String var1, int var2, int var3, int var4) { + for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) { + ((IWorldAccess)this.worldAccesses.get(var5)).playRecord(var1, var2, var3, var4); + } + + } + + public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) { + for(int var14 = 0; var14 < this.worldAccesses.size(); ++var14) { + ((IWorldAccess)this.worldAccesses.get(var14)).spawnParticle(var1, var2, var4, var6, var8, var10, var12); + } + + } + + public boolean entityJoinedWorld(Entity var1) { + int var2 = MathHelper.floor_double(var1.posX / 16.0D); + int var3 = MathHelper.floor_double(var1.posZ / 16.0D); + boolean var4 = false; + if(var1 instanceof EntityPlayer) { + var4 = true; + } + + if(!var4 && !this.chunkExists(var2, var3)) { + return false; + } else { + if(var1 instanceof EntityPlayer) { + this.playerEntities.add((EntityPlayer)var1); + System.out.println("Player count: " + this.playerEntities.size()); + } + + this.getChunkFromChunkCoords(var2, var3).addEntity(var1); + this.loadedEntityList.add(var1); + this.obtainEntitySkin(var1); + return true; + } + } + + protected void obtainEntitySkin(Entity var1) { + for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).obtainEntitySkin(var1); + } + + } + + protected void releaseEntitySkin(Entity var1) { + for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).releaseEntitySkin(var1); + } + + } + + public void setEntityDead(Entity var1) { + var1.setEntityDead(); + if(var1 instanceof EntityPlayer) { + this.playerEntities.remove((EntityPlayer)var1); + } + + } + + public void addWorldAccess(IWorldAccess var1) { + this.worldAccesses.add(var1); + } + + public void removeWorldAccess(IWorldAccess var1) { + this.worldAccesses.remove(var1); + } + + public List getCollidingBoundingBoxes(Entity var1, AxisAlignedBB var2) { + this.field_9428_I.clear(); + int var3 = MathHelper.floor_double(var2.minX); + int var4 = MathHelper.floor_double(var2.maxX + 1.0D); + int var5 = MathHelper.floor_double(var2.minY); + int var6 = MathHelper.floor_double(var2.maxY + 1.0D); + int var7 = MathHelper.floor_double(var2.minZ); + int var8 = MathHelper.floor_double(var2.maxZ + 1.0D); + + for(int var9 = var3; var9 < var4; ++var9) { + for(int var10 = var7; var10 < var8; ++var10) { + if(this.blockExists(var9, 64, var10)) { + for(int var11 = var5 - 1; var11 < var6; ++var11) { + Block var12 = Block.blocksList[this.getBlockId(var9, var11, var10)]; + if(var12 != null) { + var12.getCollidingBoundingBoxes(this, var9, var11, var10, var2, this.field_9428_I); + } + } + } + } + } + + double var14 = 0.25D; + List var15 = this.getEntitiesWithinAABBExcludingEntity(var1, var2.expands(var14, var14, var14)); + + for(int var16 = 0; var16 < var15.size(); ++var16) { + AxisAlignedBB var13 = ((Entity)var15.get(var16)).func_372_f_(); + if(var13 != null && var13.intersectsWith(var2)) { + this.field_9428_I.add(var13); + } + + var13 = var1.func_383_b_((Entity)var15.get(var16)); + if(var13 != null && var13.intersectsWith(var2)) { + this.field_9428_I.add(var13); + } + } + + return this.field_9428_I; + } + + public int calculateSkylightSubtracted(float var1) { + float var2 = this.getCelestialAngle(var1); + float var3 = 1.0F - (MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 0.5F); + if(var3 < 0.0F) { + var3 = 0.0F; + } + + if(var3 > 1.0F) { + var3 = 1.0F; + } + + return (int)(var3 * 11.0F); + } + + public Vec3D func_4079_a(Entity var1, float var2) { + float var3 = this.getCelestialAngle(var2); + float var4 = MathHelper.cos(var3 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var4 < 0.0F) { + var4 = 0.0F; + } + + if(var4 > 1.0F) { + var4 = 1.0F; + } + + int var5 = MathHelper.floor_double(var1.posX); + int var6 = MathHelper.floor_double(var1.posZ); + float var7 = (float)this.func_4075_a().func_4072_b(var5, var6); + int var8 = this.func_4075_a().func_4073_a(var5, var6).getSkyColorByTemp(var7); + float var9 = (float)(var8 >> 16 & 255) / 255.0F; + float var10 = (float)(var8 >> 8 & 255) / 255.0F; + float var11 = (float)(var8 & 255) / 255.0F; + var9 *= var4; + var10 *= var4; + var11 *= var4; + return Vec3D.createVector((double)var9, (double)var10, (double)var11); + } + + public float getCelestialAngle(float var1) { + return this.worldProvider.calculateCelestialAngle(this.worldTime, var1); + } + + public Vec3D func_628_d(float var1) { + float var2 = this.getCelestialAngle(var1); + float var3 = MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var3 < 0.0F) { + var3 = 0.0F; + } + + if(var3 > 1.0F) { + var3 = 1.0F; + } + + float var4 = (float)(this.field_1019_F >> 16 & 255L) / 255.0F; + float var5 = (float)(this.field_1019_F >> 8 & 255L) / 255.0F; + float var6 = (float)(this.field_1019_F & 255L) / 255.0F; + var4 *= var3 * 0.9F + 0.1F; + var5 *= var3 * 0.9F + 0.1F; + var6 *= var3 * 0.85F + 0.15F; + return Vec3D.createVector((double)var4, (double)var5, (double)var6); + } + + public Vec3D func_4082_d(float var1) { + float var2 = this.getCelestialAngle(var1); + return this.worldProvider.func_4096_a(var2, var1); + } + + public int func_4083_e(int var1, int var2) { + Chunk var3 = this.getChunkFromBlockCoords(var1, var2); + + int var4; + for(var4 = 127; this.getBlockMaterial(var1, var4, var2).func_880_c() && var4 > 0; --var4) { + } + + var1 &= 15; + + for(var2 &= 15; var4 > 0; --var4) { + int var5 = var3.getBlockID(var1, var4, var2); + if(var5 != 0 && (Block.blocksList[var5].blockMaterial.func_880_c() || Block.blocksList[var5].blockMaterial.getIsLiquid())) { + return var4 + 1; + } + } + + return -1; + } + + public int func_696_e(int var1, int var2) { + return this.getChunkFromBlockCoords(var1, var2).getHeightValue(var1 & 15, var2 & 15); + } + + public float func_679_f(float var1) { + float var2 = this.getCelestialAngle(var1); + float var3 = 1.0F - (MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 12.0F / 16.0F); + if(var3 < 0.0F) { + var3 = 0.0F; + } + + if(var3 > 1.0F) { + var3 = 1.0F; + } + + return var3 * var3 * 0.5F; + } + + public void scheduleBlockUpdate(int var1, int var2, int var3, int var4) { + NextTickListEntry var5 = new NextTickListEntry(var1, var2, var3, var4); + byte var6 = 8; + if(this.field_4214_a) { + if(this.checkChunksExist(var5.xCoord - var6, var5.yCoord - var6, var5.zCoord - var6, var5.xCoord + var6, var5.yCoord + var6, var5.zCoord + var6)) { + int var7 = this.getBlockId(var5.xCoord, var5.yCoord, var5.zCoord); + if(var7 == var5.blockID && var7 > 0) { + Block.blocksList[var7].updateTick(this, var5.xCoord, var5.yCoord, var5.zCoord, this.rand); + } + } + + } else { + if(this.checkChunksExist(var1 - var6, var2 - var6, var3 - var6, var1 + var6, var2 + var6, var3 + var6)) { + if(var4 > 0) { + var5.setScheduledTime((long)Block.blocksList[var4].tickRate() + this.worldTime); + } + + if(!this.scheduledTickSet.contains(var5)) { + this.scheduledTickSet.add(var5); + this.scheduledTickTreeSet.add(var5); + } + } + + } + } + + public void func_633_c() { + this.loadedEntityList.removeAll(this.field_1024_A); + + int var1; + Entity var2; + int var3; + int var4; + for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) { + var2 = (Entity)this.field_1024_A.get(var1); + var3 = var2.field_657_ba; + var4 = var2.field_654_bc; + if(var2.field_621_aZ && this.chunkExists(var3, var4)) { + this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2); + } + } + + for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) { + this.releaseEntitySkin((Entity)this.field_1024_A.get(var1)); + } + + this.field_1024_A.clear(); + + for(var1 = 0; var1 < this.loadedEntityList.size(); ++var1) { + var2 = (Entity)this.loadedEntityList.get(var1); + if(var2.ridingEntity != null) { + if(!var2.ridingEntity.isDead && var2.ridingEntity.riddenByEntity == var2) { + continue; + } + + var2.ridingEntity.riddenByEntity = null; + var2.ridingEntity = null; + } + + if(!var2.isDead) { + this.func_667_e(var2); + } + + if(var2.isDead) { + var3 = var2.field_657_ba; + var4 = var2.field_654_bc; + if(var2.field_621_aZ && this.chunkExists(var3, var4)) { + this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2); + } + + this.loadedEntityList.remove(var1--); + this.releaseEntitySkin(var2); + } + } + + for(var1 = 0; var1 < this.loadedTileEntityList.size(); ++var1) { + TileEntity var5 = (TileEntity)this.loadedTileEntityList.get(var1); + var5.updateEntity(); + } + + } + + public void func_667_e(Entity var1) { + this.func_4084_a(var1, true); + } + + public void func_4084_a(Entity var1, boolean var2) { + int var3 = MathHelper.floor_double(var1.posX); + int var4 = MathHelper.floor_double(var1.posZ); + byte var5 = 16; + if(var2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 128, var4 + var5)) { + var1.lastTickPosX = var1.posX; + var1.lastTickPosY = var1.posY; + var1.lastTickPosZ = var1.posZ; + var1.prevRotationYaw = var1.rotationYaw; + var1.prevRotationPitch = var1.rotationPitch; + if(var2 && var1.field_621_aZ) { + if(var1.ridingEntity != null) { + var1.func_350_p(); + } else { + var1.onUpdate(); + } + } + + if(Double.isNaN(var1.posX) || Double.isInfinite(var1.posX)) { + var1.posX = var1.lastTickPosX; + } + + if(Double.isNaN(var1.posY) || Double.isInfinite(var1.posY)) { + var1.posY = var1.lastTickPosY; + } + + if(Double.isNaN(var1.posZ) || Double.isInfinite(var1.posZ)) { + var1.posZ = var1.lastTickPosZ; + } + + if(Double.isNaN((double)var1.rotationPitch) || Double.isInfinite((double)var1.rotationPitch)) { + var1.rotationPitch = var1.prevRotationPitch; + } + + if(Double.isNaN((double)var1.rotationYaw) || Double.isInfinite((double)var1.rotationYaw)) { + var1.rotationYaw = var1.prevRotationYaw; + } + + int var6 = MathHelper.floor_double(var1.posX / 16.0D); + int var7 = MathHelper.floor_double(var1.posY / 16.0D); + int var8 = MathHelper.floor_double(var1.posZ / 16.0D); + if(!var1.field_621_aZ || var1.field_657_ba != var6 || var1.field_656_bb != var7 || var1.field_654_bc != var8) { + if(var1.field_621_aZ && this.chunkExists(var1.field_657_ba, var1.field_654_bc)) { + this.getChunkFromChunkCoords(var1.field_657_ba, var1.field_654_bc).func_1016_a(var1, var1.field_656_bb); + } + + if(this.chunkExists(var6, var8)) { + var1.field_621_aZ = true; + this.getChunkFromChunkCoords(var6, var8).addEntity(var1); + } else { + var1.field_621_aZ = false; + } + } + + if(var2 && var1.field_621_aZ && var1.riddenByEntity != null) { + if(!var1.riddenByEntity.isDead && var1.riddenByEntity.ridingEntity == var1) { + this.func_667_e(var1.riddenByEntity); + } else { + var1.riddenByEntity.ridingEntity = null; + var1.riddenByEntity = null; + } + } + + } + } + + public boolean checkIfAABBIsClear(AxisAlignedBB var1) { + List var2 = this.getEntitiesWithinAABBExcludingEntity((Entity)null, var1); + + for(int var3 = 0; var3 < var2.size(); ++var3) { + Entity var4 = (Entity)var2.get(var3); + if(!var4.isDead && var4.field_618_ad) { + return false; + } + } + + return true; + } + + public boolean getIsAnyLiquid(AxisAlignedBB var1) { + int var2 = MathHelper.floor_double(var1.minX); + int var3 = MathHelper.floor_double(var1.maxX + 1.0D); + int var4 = MathHelper.floor_double(var1.minY); + int var5 = MathHelper.floor_double(var1.maxY + 1.0D); + int var6 = MathHelper.floor_double(var1.minZ); + int var7 = MathHelper.floor_double(var1.maxZ + 1.0D); + if(var1.minX < 0.0D) { + --var2; + } + + if(var1.minY < 0.0D) { + --var4; + } + + if(var1.minZ < 0.0D) { + --var6; + } + + for(int var8 = var2; var8 < var3; ++var8) { + for(int var9 = var4; var9 < var5; ++var9) { + for(int var10 = var6; var10 < var7; ++var10) { + Block var11 = Block.blocksList[this.getBlockId(var8, var9, var10)]; + if(var11 != null && var11.blockMaterial.getIsLiquid()) { + return true; + } + } + } + } + + return false; + } + + public boolean isBoundingBoxBurning(AxisAlignedBB var1) { + int var2 = MathHelper.floor_double(var1.minX); + int var3 = MathHelper.floor_double(var1.maxX + 1.0D); + int var4 = MathHelper.floor_double(var1.minY); + int var5 = MathHelper.floor_double(var1.maxY + 1.0D); + int var6 = MathHelper.floor_double(var1.minZ); + int var7 = MathHelper.floor_double(var1.maxZ + 1.0D); + + for(int var8 = var2; var8 < var3; ++var8) { + for(int var9 = var4; var9 < var5; ++var9) { + for(int var10 = var6; var10 < var7; ++var10) { + int var11 = this.getBlockId(var8, var9, var10); + if(var11 == Block.fire.blockID || var11 == Block.lavaStill.blockID || var11 == Block.lavaMoving.blockID) { + return true; + } + } + } + } + + return false; + } + + public boolean func_682_a(AxisAlignedBB var1, Material var2, Entity var3) { + int var4 = MathHelper.floor_double(var1.minX); + int var5 = MathHelper.floor_double(var1.maxX + 1.0D); + int var6 = MathHelper.floor_double(var1.minY); + int var7 = MathHelper.floor_double(var1.maxY + 1.0D); + int var8 = MathHelper.floor_double(var1.minZ); + int var9 = MathHelper.floor_double(var1.maxZ + 1.0D); + boolean var10 = false; + Vec3D var11 = Vec3D.createVector(0.0D, 0.0D, 0.0D); + + for(int var12 = var4; var12 < var5; ++var12) { + for(int var13 = var6; var13 < var7; ++var13) { + for(int var14 = var8; var14 < var9; ++var14) { + Block var15 = Block.blocksList[this.getBlockId(var12, var13, var14)]; + if(var15 != null && var15.blockMaterial == var2) { + double var16 = (double)((float)(var13 + 1) - BlockFluids.func_288_b(this.getBlockMetadata(var12, var13, var14))); + if((double)var7 >= var16) { + var10 = true; + var15.velocityToAddToEntity(this, var12, var13, var14, var3, var11); + } + } + } + } + } + + if(var11.lengthVector() > 0.0D) { + var11 = var11.normalize(); + double var18 = 0.004D; + var3.motionX += var11.xCoord * var18; + var3.motionY += var11.yCoord * var18; + var3.motionZ += var11.zCoord * var18; + } + + return var10; + } + + public boolean func_689_a(AxisAlignedBB var1, Material var2) { + int var3 = MathHelper.floor_double(var1.minX); + int var4 = MathHelper.floor_double(var1.maxX + 1.0D); + int var5 = MathHelper.floor_double(var1.minY); + int var6 = MathHelper.floor_double(var1.maxY + 1.0D); + int var7 = MathHelper.floor_double(var1.minZ); + int var8 = MathHelper.floor_double(var1.maxZ + 1.0D); + + for(int var9 = var3; var9 < var4; ++var9) { + for(int var10 = var5; var10 < var6; ++var10) { + for(int var11 = var7; var11 < var8; ++var11) { + Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)]; + if(var12 != null && var12.blockMaterial == var2) { + return true; + } + } + } + } + + return false; + } + + public boolean func_707_b(AxisAlignedBB var1, Material var2) { + int var3 = MathHelper.floor_double(var1.minX); + int var4 = MathHelper.floor_double(var1.maxX + 1.0D); + int var5 = MathHelper.floor_double(var1.minY); + int var6 = MathHelper.floor_double(var1.maxY + 1.0D); + int var7 = MathHelper.floor_double(var1.minZ); + int var8 = MathHelper.floor_double(var1.maxZ + 1.0D); + + for(int var9 = var3; var9 < var4; ++var9) { + for(int var10 = var5; var10 < var6; ++var10) { + for(int var11 = var7; var11 < var8; ++var11) { + Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)]; + if(var12 != null && var12.blockMaterial == var2) { + int var13 = this.getBlockMetadata(var9, var10, var11); + double var14 = (double)(var10 + 1); + if(var13 < 8) { + var14 = (double)(var10 + 1) - (double)var13 / 8.0D; + } + + if(var14 >= var1.minY) { + return true; + } + } + } + } + } + + return false; + } + + public Explosion func_12243_a(Entity var1, double var2, double var4, double var6, float var8) { + return this.func_12244_a(var1, var2, var4, var6, var8, false); + } + + public Explosion func_12244_a(Entity var1, double var2, double var4, double var6, float var8, boolean var9) { + Explosion var10 = new Explosion(this, var1, var2, var4, var6, var8); + var10.field_12257_a = var9; + var10.func_12248_a(); + var10.func_12247_b(); + return var10; + } + + public float func_675_a(Vec3D var1, AxisAlignedBB var2) { + double var3 = 1.0D / ((var2.maxX - var2.minX) * 2.0D + 1.0D); + double var5 = 1.0D / ((var2.maxY - var2.minY) * 2.0D + 1.0D); + double var7 = 1.0D / ((var2.maxZ - var2.minZ) * 2.0D + 1.0D); + int var9 = 0; + int var10 = 0; + + for(float var11 = 0.0F; var11 <= 1.0F; var11 = (float)((double)var11 + var3)) { + for(float var12 = 0.0F; var12 <= 1.0F; var12 = (float)((double)var12 + var5)) { + for(float var13 = 0.0F; var13 <= 1.0F; var13 = (float)((double)var13 + var7)) { + double var14 = var2.minX + (var2.maxX - var2.minX) * (double)var11; + double var16 = var2.minY + (var2.maxY - var2.minY) * (double)var12; + double var18 = var2.minZ + (var2.maxZ - var2.minZ) * (double)var13; + if(this.rayTraceBlocks(Vec3D.createVector(var14, var16, var18), var1) == null) { + ++var9; + } + + ++var10; + } + } + } + + return (float)var9 / (float)var10; + } + + public void onBlockHit(int var1, int var2, int var3, int var4) { + if(var4 == 0) { + --var2; + } + + if(var4 == 1) { + ++var2; + } + + if(var4 == 2) { + --var3; + } + + if(var4 == 3) { + ++var3; + } + + if(var4 == 4) { + --var1; + } + + if(var4 == 5) { + ++var1; + } + + if(this.getBlockId(var1, var2, var3) == Block.fire.blockID) { + this.playSoundEffect((double)((float)var1 + 0.5F), (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), "random.fizz", 0.5F, 2.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.8F); + this.setBlockWithNotify(var1, var2, var3, 0); + } + + } + + public Entity func_4085_a(Class var1) { + return null; + } + + public String func_687_d() { + return "All: " + this.loadedEntityList.size(); + } + + public TileEntity getBlockTileEntity(int var1, int var2, int var3) { + Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + return var4 != null ? var4.getChunkBlockTileEntity(var1 & 15, var2, var3 & 15) : null; + } + + public void setBlockTileEntity(int var1, int var2, int var3, TileEntity var4) { + Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + if(var5 != null) { + var5.setChunkBlockTileEntity(var1 & 15, var2, var3 & 15, var4); + } + + } + + public void removeBlockTileEntity(int var1, int var2, int var3) { + Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4); + if(var4 != null) { + var4.removeChunkBlockTileEntity(var1 & 15, var2, var3 & 15); + } + + } + + public boolean isBlockOpaqueCube(int var1, int var2, int var3) { + Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)]; + return var4 == null ? false : var4.isOpaqueCube(); + } + + public void func_651_a(IProgressUpdate var1) { + this.saveWorld(true, var1); + } + + public boolean func_6465_g() { + if(this.field_4204_J >= 50) { + return false; + } else { + ++this.field_4204_J; + + boolean var2; + try { + int var1 = 5000; + + while(this.field_1051_z.size() > 0) { + --var1; + if(var1 <= 0) { + var2 = true; + return var2; + } + + ((MetadataChunkBlock)this.field_1051_z.remove(this.field_1051_z.size() - 1)).func_4127_a(this); + } + + var2 = false; + } finally { + --this.field_4204_J; + } + + return var2; + } + } + + public void func_616_a(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) { + this.func_627_a(var1, var2, var3, var4, var5, var6, var7, true); + } + + public void func_627_a(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) { + if(!this.worldProvider.field_6478_e || var1 != EnumSkyBlock.Sky) { + ++field_9429_y; + if(field_9429_y == 50) { + --field_9429_y; + } else { + int var9 = (var5 + var2) / 2; + int var10 = (var7 + var4) / 2; + if(!this.blockExists(var9, 64, var10)) { + --field_9429_y; + } else { + int var11 = this.field_1051_z.size(); + if(var8) { + int var12 = 4; + if(var12 > var11) { + var12 = var11; + } + + for(int var13 = 0; var13 < var12; ++var13) { + MetadataChunkBlock var14 = (MetadataChunkBlock)this.field_1051_z.get(this.field_1051_z.size() - var13 - 1); + if(var14.field_1299_a == var1 && var14.func_866_a(var2, var3, var4, var5, var6, var7)) { + --field_9429_y; + return; + } + } + } + + this.field_1051_z.add(new MetadataChunkBlock(var1, var2, var3, var4, var5, var6, var7)); + if(this.field_1051_z.size() > 100000) { + this.field_1051_z.clear(); + } + + --field_9429_y; + } + } + } + } + + public void calculateInitialSkylight() { + int var1 = this.calculateSkylightSubtracted(1.0F); + if(var1 != this.skylightSubtracted) { + this.skylightSubtracted = var1; + } + + } + + public void tick() { + SpawnerAnimals.performSpawning(this); + this.chunkProvider.func_532_a(); + int var1 = this.calculateSkylightSubtracted(1.0F); + if(var1 != this.skylightSubtracted) { + this.skylightSubtracted = var1; + + for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).func_936_e(); + } + } + + ++this.worldTime; + if(this.worldTime % (long)this.autosavePeriod == 0L) { + this.saveWorld(false, (IProgressUpdate)null); + } + + this.TickUpdates(false); + this.func_4080_j(); + } + + protected void func_4080_j() { + this.field_9427_K.clear(); + + int var3; + int var4; + int var6; + int var7; + for(int var1 = 0; var1 < this.playerEntities.size(); ++var1) { + EntityPlayer var2 = (EntityPlayer)this.playerEntities.get(var1); + var3 = MathHelper.floor_double(var2.posX / 16.0D); + var4 = MathHelper.floor_double(var2.posZ / 16.0D); + byte var5 = 9; + + for(var6 = -var5; var6 <= var5; ++var6) { + for(var7 = -var5; var7 <= var5; ++var7) { + this.field_9427_K.add(new ChunkCoordIntPair(var6 + var3, var7 + var4)); + } + } + } + + if(this.field_9426_L > 0) { + --this.field_9426_L; + } + + Iterator var12 = this.field_9427_K.iterator(); + + while(var12.hasNext()) { + ChunkCoordIntPair var13 = (ChunkCoordIntPair)var12.next(); + var3 = var13.chunkXPos * 16; + var4 = var13.chunkZPos * 16; + Chunk var14 = this.getChunkFromChunkCoords(var13.chunkXPos, var13.chunkZPos); + int var8; + int var9; + int var10; + if(this.field_9426_L == 0) { + this.field_9437_g = this.field_9437_g * 3 + this.field_9436_h; + var6 = this.field_9437_g >> 2; + var7 = var6 & 15; + var8 = var6 >> 8 & 15; + var9 = var6 >> 16 & 127; + var10 = var14.getBlockID(var7, var9, var8); + var7 += var3; + var8 += var4; + if(var10 == 0 && this.getBlockLightValue(var7, var9, var8) <= this.rand.nextInt(8) && this.getSavedLightValue(EnumSkyBlock.Sky, var7, var9, var8) <= 0) { + EntityPlayer var11 = this.getClosestPlayer((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, 8.0D); + if(var11 != null && var11.getDistanceSq((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D) > 4.0D) { + this.playSoundEffect((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.rand.nextFloat() * 0.2F); + this.field_9426_L = this.rand.nextInt(12000) + 6000; + } + } + } + + for(var6 = 0; var6 < 80; ++var6) { + this.field_9437_g = this.field_9437_g * 3 + this.field_9436_h; + var7 = this.field_9437_g >> 2; + var8 = var7 & 15; + var9 = var7 >> 8 & 15; + var10 = var7 >> 16 & 127; + byte var15 = var14.blocks[var8 << 11 | var9 << 7 | var10]; + if(Block.tickOnLoad[var15]) { + Block.blocksList[var15].updateTick(this, var8 + var3, var10, var9 + var4, this.rand); + } + } + } + + } + + public boolean TickUpdates(boolean var1) { + int var2 = this.scheduledTickTreeSet.size(); + if(var2 != this.scheduledTickSet.size()) { + throw new IllegalStateException("TickNextTick list out of synch"); + } else { + if(var2 > 1000) { + var2 = 1000; + } + + for(int var3 = 0; var3 < var2; ++var3) { + NextTickListEntry var4 = (NextTickListEntry)this.scheduledTickTreeSet.first(); + if(!var1 && var4.scheduledTime > this.worldTime) { + break; + } + + this.scheduledTickTreeSet.remove(var4); + this.scheduledTickSet.remove(var4); + byte var5 = 8; + if(this.checkChunksExist(var4.xCoord - var5, var4.yCoord - var5, var4.zCoord - var5, var4.xCoord + var5, var4.yCoord + var5, var4.zCoord + var5)) { + int var6 = this.getBlockId(var4.xCoord, var4.yCoord, var4.zCoord); + if(var6 == var4.blockID && var6 > 0) { + Block.blocksList[var6].updateTick(this, var4.xCoord, var4.yCoord, var4.zCoord, this.rand); + } + } + } + + return this.scheduledTickTreeSet.size() != 0; + } + } + + public void randomDisplayUpdates(int var1, int var2, int var3) { + byte var4 = 16; + Random var5 = new Random(); + + for(int var6 = 0; var6 < 1000; ++var6) { + int var7 = var1 + this.rand.nextInt(var4) - this.rand.nextInt(var4); + int var8 = var2 + this.rand.nextInt(var4) - this.rand.nextInt(var4); + int var9 = var3 + this.rand.nextInt(var4) - this.rand.nextInt(var4); + int var10 = this.getBlockId(var7, var8, var9); + if(var10 > 0) { + Block.blocksList[var10].randomDisplayTick(this, var7, var8, var9, var5); + } + } + + } + + public List getEntitiesWithinAABBExcludingEntity(Entity var1, AxisAlignedBB var2) { + this.field_1012_M.clear(); + int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D); + int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D); + int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D); + int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D); + + for(int var7 = var3; var7 <= var4; ++var7) { + for(int var8 = var5; var8 <= var6; ++var8) { + if(this.chunkExists(var7, var8)) { + this.getChunkFromChunkCoords(var7, var8).getEntitiesWithinAABBForEntity(var1, var2, this.field_1012_M); + } + } + } + + return this.field_1012_M; + } + + public List getEntitiesWithinAABB(Class var1, AxisAlignedBB var2) { + int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D); + int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D); + int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D); + int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D); + ArrayList var7 = new ArrayList(); + + for(int var8 = var3; var8 <= var4; ++var8) { + for(int var9 = var5; var9 <= var6; ++var9) { + if(this.chunkExists(var8, var9)) { + this.getChunkFromChunkCoords(var8, var9).getEntitiesOfTypeWithinAAAB(var1, var2, var7); + } + } + } + + return var7; + } + + public List func_658_i() { + return this.loadedEntityList; + } + + public void func_698_b(int var1, int var2, int var3, TileEntity var4) { + if(this.blockExists(var1, var2, var3)) { + this.getChunkFromBlockCoords(var1, var3).setChunkModified(); + } + + for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) { + ((IWorldAccess)this.worldAccesses.get(var5)).func_935_a(var1, var2, var3, var4); + } + + } + + public int countEntities(Class var1) { + int var2 = 0; + + for(int var3 = 0; var3 < this.loadedEntityList.size(); ++var3) { + Entity var4 = (Entity)this.loadedEntityList.get(var3); + if(var1.isAssignableFrom(var4.getClass())) { + ++var2; + } + } + + return var2; + } + + public void func_636_a(List var1) { + this.loadedEntityList.addAll(var1); + + for(int var2 = 0; var2 < var1.size(); ++var2) { + this.obtainEntitySkin((Entity)var1.get(var2)); + } + + } + + public void func_632_b(List var1) { + this.field_1024_A.addAll(var1); + } + + public void func_656_j() { + while(this.chunkProvider.func_532_a()) { + } + + } + + public boolean canBlockBePlacedAt(int var1, int var2, int var3, int var4, boolean var5) { + int var6 = this.getBlockId(var2, var3, var4); + Block var7 = Block.blocksList[var6]; + Block var8 = Block.blocksList[var1]; + AxisAlignedBB var9 = var8.getCollisionBoundingBoxFromPool(this, var2, var3, var4); + if(var5) { + var9 = null; + } + + return var9 != null && !this.checkIfAABBIsClear(var9) ? false : (var7 != Block.waterStill && var7 != Block.waterMoving && var7 != Block.lavaStill && var7 != Block.lavaMoving && var7 != Block.fire && var7 != Block.snow ? var1 > 0 && var7 == null && var8.canPlaceBlockAt(this, var2, var3, var4) : true); + } + + public PathEntity getPathToEntity(Entity var1, Entity var2, float var3) { + int var4 = MathHelper.floor_double(var1.posX); + int var5 = MathHelper.floor_double(var1.posY); + int var6 = MathHelper.floor_double(var1.posZ); + int var7 = (int)(var3 + 16.0F); + int var8 = var4 - var7; + int var9 = var5 - var7; + int var10 = var6 - var7; + int var11 = var4 + var7; + int var12 = var5 + var7; + int var13 = var6 + var7; + ChunkCache var14 = new ChunkCache(this, var8, var9, var10, var11, var12, var13); + return (new Pathfinder(var14)).createEntityPathTo(var1, var2, var3); + } + + public PathEntity getEntityPathToXYZ(Entity var1, int var2, int var3, int var4, float var5) { + int var6 = MathHelper.floor_double(var1.posX); + int var7 = MathHelper.floor_double(var1.posY); + int var8 = MathHelper.floor_double(var1.posZ); + int var9 = (int)(var5 + 8.0F); + int var10 = var6 - var9; + int var11 = var7 - var9; + int var12 = var8 - var9; + int var13 = var6 + var9; + int var14 = var7 + var9; + int var15 = var8 + var9; + ChunkCache var16 = new ChunkCache(this, var10, var11, var12, var13, var14, var15); + return (new Pathfinder(var16)).createEntityPathTo(var1, var2, var3, var4, var5); + } + + public boolean isBlockProvidingPowerTo(int var1, int var2, int var3, int var4) { + int var5 = this.getBlockId(var1, var2, var3); + return var5 == 0 ? false : Block.blocksList[var5].isIndirectlyPoweringTo(this, var1, var2, var3, var4); + } + + public boolean isBlockGettingPowered(int var1, int var2, int var3) { + return this.isBlockProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockProvidingPowerTo(var1 + 1, var2, var3, 5))))); + } + + public boolean isBlockIndirectlyProvidingPowerTo(int var1, int var2, int var3, int var4) { + if(this.isBlockOpaqueCube(var1, var2, var3)) { + return this.isBlockGettingPowered(var1, var2, var3); + } else { + int var5 = this.getBlockId(var1, var2, var3); + return var5 == 0 ? false : Block.blocksList[var5].isPoweringTo(this, var1, var2, var3, var4); + } + } + + public boolean isBlockIndirectlyGettingPowered(int var1, int var2, int var3) { + return this.isBlockIndirectlyProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockIndirectlyProvidingPowerTo(var1 + 1, var2, var3, 5))))); + } + + public EntityPlayer getClosestPlayerToEntity(Entity var1, double var2) { + return this.getClosestPlayer(var1.posX, var1.posY, var1.posZ, var2); + } + + public EntityPlayer getClosestPlayer(double var1, double var3, double var5, double var7) { + double var9 = -1.0D; + EntityPlayer var11 = null; + + for(int var12 = 0; var12 < this.playerEntities.size(); ++var12) { + EntityPlayer var13 = (EntityPlayer)this.playerEntities.get(var12); + double var14 = var13.getDistanceSq(var1, var3, var5); + if((var7 < 0.0D || var14 < var7 * var7) && (var9 == -1.0D || var14 < var9)) { + var9 = var14; + var11 = var13; + } + } + + return var11; + } + + public void func_693_a(int var1, int var2, int var3, int var4, int var5, int var6, byte[] var7) { + int var8 = var1 >> 4; + int var9 = var3 >> 4; + int var10 = var1 + var4 - 1 >> 4; + int var11 = var3 + var6 - 1 >> 4; + int var12 = 0; + int var13 = var2; + int var14 = var2 + var5; + if(var2 < 0) { + var13 = 0; + } + + if(var14 > 128) { + var14 = 128; + } + + for(int var15 = var8; var15 <= var10; ++var15) { + int var16 = var1 - var15 * 16; + int var17 = var1 + var4 - var15 * 16; + if(var16 < 0) { + var16 = 0; + } + + if(var17 > 16) { + var17 = 16; + } + + for(int var18 = var9; var18 <= var11; ++var18) { + int var19 = var3 - var18 * 16; + int var20 = var3 + var6 - var18 * 16; + if(var19 < 0) { + var19 = 0; + } + + if(var20 > 16) { + var20 = 16; + } + + var12 = this.getChunkFromChunkCoords(var15, var18).func_1004_a(var7, var16, var13, var19, var17, var14, var20, var12); + this.func_701_b(var15 * 16 + var16, var13, var18 * 16 + var19, var15 * 16 + var17, var14, var18 * 16 + var20); + } + } + + } + + public void sendQuittingDisconnectingPacket() { + } + + public void func_663_l() { + try { + File var1 = new File(this.field_9432_t, "session.lock"); + DataInputStream var2 = new DataInputStream(new FileInputStream(var1)); + + try { + if(var2.readLong() != this.field_1054_E) { + throw new MinecraftException("The save is being accessed from another location, aborting"); + } + } finally { + var2.close(); + } + + } catch (IOException var7) { + throw new MinecraftException("Failed to check session lock, aborting"); + } + } + + public void setWorldTime(long var1) { + this.worldTime = var1; + } + + public void func_705_f(Entity var1) { + int var2 = MathHelper.floor_double(var1.posX / 16.0D); + int var3 = MathHelper.floor_double(var1.posZ / 16.0D); + byte var4 = 2; + + for(int var5 = var2 - var4; var5 <= var2 + var4; ++var5) { + for(int var6 = var3 - var4; var6 <= var3 + var4; ++var6) { + this.getChunkFromChunkCoords(var5, var6); + } + } + + if(!this.loadedEntityList.contains(var1)) { + this.loadedEntityList.add(var1); + } + + } + + public boolean func_6466_a(EntityPlayer var1, int var2, int var3, int var4) { + return true; + } + + public void func_9425_a(Entity var1, byte var2) { + } + + public void func_9424_o() { + this.loadedEntityList.removeAll(this.field_1024_A); + + int var1; + Entity var2; + int var3; + int var4; + for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) { + var2 = (Entity)this.field_1024_A.get(var1); + var3 = var2.field_657_ba; + var4 = var2.field_654_bc; + if(var2.field_621_aZ && this.chunkExists(var3, var4)) { + this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2); + } + } + + for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) { + this.releaseEntitySkin((Entity)this.field_1024_A.get(var1)); + } + + this.field_1024_A.clear(); + + for(var1 = 0; var1 < this.loadedEntityList.size(); ++var1) { + var2 = (Entity)this.loadedEntityList.get(var1); + if(var2.ridingEntity != null) { + if(!var2.ridingEntity.isDead && var2.ridingEntity.riddenByEntity == var2) { + continue; + } + + var2.ridingEntity.riddenByEntity = null; + var2.ridingEntity = null; + } + + if(var2.isDead) { + var3 = var2.field_657_ba; + var4 = var2.field_654_bc; + if(var2.field_621_aZ && this.chunkExists(var3, var4)) { + this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2); + } + + this.loadedEntityList.remove(var1--); + this.releaseEntitySkin(var2); + } + } + + } +} diff --git a/src/main/java/net/minecraft/src/WorldChunkManager.java b/src/main/java/net/minecraft/src/WorldChunkManager.java new file mode 100644 index 0000000..4132420 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldChunkManager.java @@ -0,0 +1,117 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldChunkManager { + private NoiseGeneratorOctaves2 field_4194_e; + private NoiseGeneratorOctaves2 field_4193_f; + private NoiseGeneratorOctaves2 field_4192_g; + public double[] temperature; + public double[] humidity; + public double[] field_4196_c; + public MobSpawnerBase[] field_4195_d; + + protected WorldChunkManager() { + } + + public WorldChunkManager(World var1) { + this.field_4194_e = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 9871L), 4); + this.field_4193_f = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 39811L), 4); + this.field_4192_g = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 543321L), 2); + } + + public MobSpawnerBase func_4074_a(ChunkCoordIntPair var1) { + return this.func_4073_a(var1.chunkXPos, var1.chunkZPos); + } + + public MobSpawnerBase func_4073_a(int var1, int var2) { + return this.func_4069_a(var1, var2, 1, 1)[0]; + } + + public double func_4072_b(int var1, int var2) { + this.temperature = this.field_4194_e.func_4112_a(this.temperature, (double)var1, (double)var2, 1, 1, (double)0.025F, (double)0.025F, 0.5D); + return this.temperature[0]; + } + + public MobSpawnerBase[] func_4069_a(int var1, int var2, int var3, int var4) { + this.field_4195_d = this.loadBlockGeneratorData(this.field_4195_d, var1, var2, var3, var4); + return this.field_4195_d; + } + + public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) { + if(var1 == null || var1.length < var4 * var5) { + var1 = new double[var4 * var5]; + } + + var1 = this.field_4194_e.func_4112_a(var1, (double)var2, (double)var3, var4, var4, (double)0.025F, (double)0.025F, 0.25D); + this.field_4196_c = this.field_4192_g.func_4112_a(this.field_4196_c, (double)var2, (double)var3, var4, var4, 0.25D, 0.25D, 0.5882352941176471D); + int var6 = 0; + + for(int var7 = 0; var7 < var4; ++var7) { + for(int var8 = 0; var8 < var5; ++var8) { + double var9 = this.field_4196_c[var6] * 1.1D + 0.5D; + double var11 = 0.01D; + double var13 = 1.0D - var11; + double var15 = (var1[var6] * 0.15D + 0.7D) * var13 + var9 * var11; + var15 = 1.0D - (1.0D - var15) * (1.0D - var15); + if(var15 < 0.0D) { + var15 = 0.0D; + } + + if(var15 > 1.0D) { + var15 = 1.0D; + } + + var1[var6] = var15; + ++var6; + } + } + + return var1; + } + + public MobSpawnerBase[] loadBlockGeneratorData(MobSpawnerBase[] var1, int var2, int var3, int var4, int var5) { + if(var1 == null || var1.length < var4 * var5) { + var1 = new MobSpawnerBase[var4 * var5]; + } + + this.temperature = this.field_4194_e.func_4112_a(this.temperature, (double)var2, (double)var3, var4, var4, (double)0.025F, (double)0.025F, 0.25D); + this.humidity = this.field_4193_f.func_4112_a(this.humidity, (double)var2, (double)var3, var4, var4, (double)0.05F, (double)0.05F, 1.0D / 3.0D); + this.field_4196_c = this.field_4192_g.func_4112_a(this.field_4196_c, (double)var2, (double)var3, var4, var4, 0.25D, 0.25D, 0.5882352941176471D); + int var6 = 0; + + for(int var7 = 0; var7 < var4; ++var7) { + for(int var8 = 0; var8 < var5; ++var8) { + double var9 = this.field_4196_c[var6] * 1.1D + 0.5D; + double var11 = 0.01D; + double var13 = 1.0D - var11; + double var15 = (this.temperature[var6] * 0.15D + 0.7D) * var13 + var9 * var11; + var11 = 0.002D; + var13 = 1.0D - var11; + double var17 = (this.humidity[var6] * 0.15D + 0.5D) * var13 + var9 * var11; + var15 = 1.0D - (1.0D - var15) * (1.0D - var15); + if(var15 < 0.0D) { + var15 = 0.0D; + } + + if(var17 < 0.0D) { + var17 = 0.0D; + } + + if(var15 > 1.0D) { + var15 = 1.0D; + } + + if(var17 > 1.0D) { + var17 = 1.0D; + } + + this.temperature[var6] = var15; + this.humidity[var6] = var17; + var1[var6++] = MobSpawnerBase.getBiomeFromLookup(var15, var17); + } + } + + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/WorldChunkManagerHell.java b/src/main/java/net/minecraft/src/WorldChunkManagerHell.java new file mode 100644 index 0000000..c93f1b4 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldChunkManagerHell.java @@ -0,0 +1,54 @@ +package net.minecraft.src; + +import java.util.Arrays; + +public class WorldChunkManagerHell extends WorldChunkManager { + private MobSpawnerBase field_4201_e; + private double field_4200_f; + private double field_4199_g; + + public WorldChunkManagerHell(MobSpawnerBase var1, double var2, double var4) { + this.field_4201_e = var1; + this.field_4200_f = var2; + this.field_4199_g = var4; + } + + public MobSpawnerBase func_4074_a(ChunkCoordIntPair var1) { + return this.field_4201_e; + } + + public MobSpawnerBase func_4073_a(int var1, int var2) { + return this.field_4201_e; + } + + public double func_4072_b(int var1, int var2) { + return this.field_4200_f; + } + + public MobSpawnerBase[] func_4069_a(int var1, int var2, int var3, int var4) { + this.field_4195_d = this.loadBlockGeneratorData(this.field_4195_d, var1, var2, var3, var4); + return this.field_4195_d; + } + + public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) { + if(var1 == null || var1.length < var4 * var5) { + var1 = new double[var4 * var5]; + } + + Arrays.fill(var1, 0, var4 * var5, this.field_4200_f); + return var1; + } + + public MobSpawnerBase[] loadBlockGeneratorData(MobSpawnerBase[] var1, int var2, int var3, int var4, int var5) { + if(var1 == null || var1.length < var4 * var5) { + var1 = new MobSpawnerBase[var4 * var5]; + this.temperature = new double[var4 * var5]; + this.humidity = new double[var4 * var5]; + } + + Arrays.fill(var1, 0, var4 * var5, this.field_4201_e); + Arrays.fill(this.humidity, 0, var4 * var5, this.field_4199_g); + Arrays.fill(this.temperature, 0, var4 * var5, this.field_4200_f); + return var1; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenBigTree.java b/src/main/java/net/minecraft/src/WorldGenBigTree.java new file mode 100644 index 0000000..84c15be --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenBigTree.java @@ -0,0 +1,348 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenBigTree extends WorldGenerator { + static final byte[] field_882_a = new byte[]{(byte)2, (byte)0, (byte)0, (byte)1, (byte)2, (byte)1}; + Random field_881_b = new Random(); + World worldObj; + int[] field_879_d = new int[]{0, 0, 0}; + int field_878_e = 0; + int field_877_f; + double field_876_g = 0.618D; + double field_875_h = 1.0D; + double field_874_i = 0.381D; + double field_873_j = 1.0D; + double field_872_k = 1.0D; + int field_871_l = 1; + int field_870_m = 12; + int field_869_n = 4; + int[][] field_868_o; + + void func_521_a() { + this.field_877_f = (int)((double)this.field_878_e * this.field_876_g); + if(this.field_877_f >= this.field_878_e) { + this.field_877_f = this.field_878_e - 1; + } + + int var1 = (int)(1.382D + Math.pow(this.field_872_k * (double)this.field_878_e / 13.0D, 2.0D)); + if(var1 < 1) { + var1 = 1; + } + + int[][] var2 = new int[var1 * this.field_878_e][4]; + int var3 = this.field_879_d[1] + this.field_878_e - this.field_869_n; + int var4 = 1; + int var5 = this.field_879_d[1] + this.field_877_f; + int var6 = var3 - this.field_879_d[1]; + var2[0][0] = this.field_879_d[0]; + var2[0][1] = var3; + var2[0][2] = this.field_879_d[2]; + var2[0][3] = var5; + --var3; + + while(true) { + while(var6 >= 0) { + int var7 = 0; + float var8 = this.func_528_a(var6); + if(var8 < 0.0F) { + --var3; + --var6; + } else { + for(double var9 = 0.5D; var7 < var1; ++var7) { + double var11 = this.field_873_j * (double)var8 * ((double)this.field_881_b.nextFloat() + 0.328D); + double var13 = (double)this.field_881_b.nextFloat() * 2.0D * 3.14159D; + int var15 = (int)(var11 * Math.sin(var13) + (double)this.field_879_d[0] + var9); + int var16 = (int)(var11 * Math.cos(var13) + (double)this.field_879_d[2] + var9); + int[] var17 = new int[]{var15, var3, var16}; + int[] var18 = new int[]{var15, var3 + this.field_869_n, var16}; + if(this.func_524_a(var17, var18) == -1) { + int[] var19 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]}; + double var20 = Math.sqrt(Math.pow((double)Math.abs(this.field_879_d[0] - var17[0]), 2.0D) + Math.pow((double)Math.abs(this.field_879_d[2] - var17[2]), 2.0D)); + double var22 = var20 * this.field_874_i; + if((double)var17[1] - var22 > (double)var5) { + var19[1] = var5; + } else { + var19[1] = (int)((double)var17[1] - var22); + } + + if(this.func_524_a(var19, var17) == -1) { + var2[var4][0] = var15; + var2[var4][1] = var3; + var2[var4][2] = var16; + var2[var4][3] = var19[1]; + ++var4; + } + } + } + + --var3; + --var6; + } + } + + this.field_868_o = new int[var4][4]; + System.arraycopy(var2, 0, this.field_868_o, 0, var4); + return; + } + } + + void func_523_a(int var1, int var2, int var3, float var4, byte var5, int var6) { + int var7 = (int)((double)var4 + 0.618D); + byte var8 = field_882_a[var5]; + byte var9 = field_882_a[var5 + 3]; + int[] var10 = new int[]{var1, var2, var3}; + int[] var11 = new int[]{0, 0, 0}; + int var12 = -var7; + int var13 = -var7; + + label32: + for(var11[var5] = var10[var5]; var12 <= var7; ++var12) { + var11[var8] = var10[var8] + var12; + var13 = -var7; + + while(true) { + while(true) { + if(var13 > var7) { + continue label32; + } + + double var15 = Math.sqrt(Math.pow((double)Math.abs(var12) + 0.5D, 2.0D) + Math.pow((double)Math.abs(var13) + 0.5D, 2.0D)); + if(var15 > (double)var4) { + ++var13; + } else { + var11[var9] = var10[var9] + var13; + int var14 = this.worldObj.getBlockId(var11[0], var11[1], var11[2]); + if(var14 != 0 && var14 != 18) { + ++var13; + } else { + this.worldObj.setBlock(var11[0], var11[1], var11[2], var6); + ++var13; + } + } + } + } + } + + } + + float func_528_a(int var1) { + if((double)var1 < (double)((float)this.field_878_e) * 0.3D) { + return -1.618F; + } else { + float var2 = (float)this.field_878_e / 2.0F; + float var3 = (float)this.field_878_e / 2.0F - (float)var1; + float var4; + if(var3 == 0.0F) { + var4 = var2; + } else if(Math.abs(var3) >= var2) { + var4 = 0.0F; + } else { + var4 = (float)Math.sqrt(Math.pow((double)Math.abs(var2), 2.0D) - Math.pow((double)Math.abs(var3), 2.0D)); + } + + var4 *= 0.5F; + return var4; + } + } + + float func_526_b(int var1) { + return var1 >= 0 && var1 < this.field_869_n ? (var1 != 0 && var1 != this.field_869_n - 1 ? 3.0F : 2.0F) : -1.0F; + } + + void func_520_a(int var1, int var2, int var3) { + int var4 = var2; + + for(int var5 = var2 + this.field_869_n; var4 < var5; ++var4) { + float var6 = this.func_526_b(var4 - var2); + this.func_523_a(var1, var4, var3, var6, (byte)1, 18); + } + + } + + void func_522_a(int[] var1, int[] var2, int var3) { + int[] var4 = new int[]{0, 0, 0}; + byte var5 = 0; + + byte var6; + for(var6 = 0; var5 < 3; ++var5) { + var4[var5] = var2[var5] - var1[var5]; + if(Math.abs(var4[var5]) > Math.abs(var4[var6])) { + var6 = var5; + } + } + + if(var4[var6] != 0) { + byte var7 = field_882_a[var6]; + byte var8 = field_882_a[var6 + 3]; + byte var9; + if(var4[var6] > 0) { + var9 = 1; + } else { + var9 = -1; + } + + double var10 = (double)var4[var7] / (double)var4[var6]; + double var12 = (double)var4[var8] / (double)var4[var6]; + int[] var14 = new int[]{0, 0, 0}; + int var15 = 0; + + for(int var16 = var4[var6] + var9; var15 != var16; var15 += var9) { + var14[var6] = MathHelper.floor_double((double)(var1[var6] + var15) + 0.5D); + var14[var7] = MathHelper.floor_double((double)var1[var7] + (double)var15 * var10 + 0.5D); + var14[var8] = MathHelper.floor_double((double)var1[var8] + (double)var15 * var12 + 0.5D); + this.worldObj.setBlock(var14[0], var14[1], var14[2], var3); + } + + } + } + + void func_518_b() { + int var1 = 0; + + for(int var2 = this.field_868_o.length; var1 < var2; ++var1) { + int var3 = this.field_868_o[var1][0]; + int var4 = this.field_868_o[var1][1]; + int var5 = this.field_868_o[var1][2]; + this.func_520_a(var3, var4, var5); + } + + } + + boolean func_527_c(int var1) { + return (double)var1 >= (double)this.field_878_e * 0.2D; + } + + void func_529_c() { + int var1 = this.field_879_d[0]; + int var2 = this.field_879_d[1]; + int var3 = this.field_879_d[1] + this.field_877_f; + int var4 = this.field_879_d[2]; + int[] var5 = new int[]{var1, var2, var4}; + int[] var6 = new int[]{var1, var3, var4}; + this.func_522_a(var5, var6, 17); + if(this.field_871_l == 2) { + ++var5[0]; + ++var6[0]; + this.func_522_a(var5, var6, 17); + ++var5[2]; + ++var6[2]; + this.func_522_a(var5, var6, 17); + var5[0] += -1; + var6[0] += -1; + this.func_522_a(var5, var6, 17); + } + + } + + void func_525_d() { + int var1 = 0; + int var2 = this.field_868_o.length; + + for(int[] var3 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]}; var1 < var2; ++var1) { + int[] var4 = this.field_868_o[var1]; + int[] var5 = new int[]{var4[0], var4[1], var4[2]}; + var3[1] = var4[3]; + int var6 = var3[1] - this.field_879_d[1]; + if(this.func_527_c(var6)) { + this.func_522_a(var3, var5, 17); + } + } + + } + + int func_524_a(int[] var1, int[] var2) { + int[] var3 = new int[]{0, 0, 0}; + byte var4 = 0; + + byte var5; + for(var5 = 0; var4 < 3; ++var4) { + var3[var4] = var2[var4] - var1[var4]; + if(Math.abs(var3[var4]) > Math.abs(var3[var5])) { + var5 = var4; + } + } + + if(var3[var5] == 0) { + return -1; + } else { + byte var6 = field_882_a[var5]; + byte var7 = field_882_a[var5 + 3]; + byte var8; + if(var3[var5] > 0) { + var8 = 1; + } else { + var8 = -1; + } + + double var9 = (double)var3[var6] / (double)var3[var5]; + double var11 = (double)var3[var7] / (double)var3[var5]; + int[] var13 = new int[]{0, 0, 0}; + int var14 = 0; + + int var15; + for(var15 = var3[var5] + var8; var14 != var15; var14 += var8) { + var13[var5] = var1[var5] + var14; + var13[var6] = (int)((double)var1[var6] + (double)var14 * var9); + var13[var7] = (int)((double)var1[var7] + (double)var14 * var11); + int var16 = this.worldObj.getBlockId(var13[0], var13[1], var13[2]); + if(var16 != 0 && var16 != 18) { + break; + } + } + + return var14 == var15 ? -1 : Math.abs(var14); + } + } + + boolean func_519_e() { + int[] var1 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]}; + int[] var2 = new int[]{this.field_879_d[0], this.field_879_d[1] + this.field_878_e - 1, this.field_879_d[2]}; + int var3 = this.worldObj.getBlockId(this.field_879_d[0], this.field_879_d[1] - 1, this.field_879_d[2]); + if(var3 != 2 && var3 != 3) { + return false; + } else { + int var4 = this.func_524_a(var1, var2); + if(var4 == -1) { + return true; + } else if(var4 < 6) { + return false; + } else { + this.field_878_e = var4; + return true; + } + } + } + + public void func_517_a(double var1, double var3, double var5) { + this.field_870_m = (int)(var1 * 12.0D); + if(var1 > 0.5D) { + this.field_869_n = 5; + } + + this.field_873_j = var3; + this.field_872_k = var5; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + this.worldObj = var1; + long var6 = var2.nextLong(); + this.field_881_b.setSeed(var6); + this.field_879_d[0] = var3; + this.field_879_d[1] = var4; + this.field_879_d[2] = var5; + if(this.field_878_e == 0) { + this.field_878_e = 5 + this.field_881_b.nextInt(this.field_870_m); + } + + if(!this.func_519_e()) { + return false; + } else { + this.func_521_a(); + this.func_518_b(); + this.func_529_c(); + this.func_525_d(); + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenCactus.java b/src/main/java/net/minecraft/src/WorldGenCactus.java new file mode 100644 index 0000000..a5eb25d --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenCactus.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenCactus extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + for(int var6 = 0; var6 < 10; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 + var2.nextInt(4) - var2.nextInt(4); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0) { + int var10 = 1 + var2.nextInt(var2.nextInt(3) + 1); + + for(int var11 = 0; var11 < var10; ++var11) { + if(Block.cactus.canBlockStay(var1, var7, var8 + var11, var9)) { + var1.setBlock(var7, var8 + var11, var9, Block.cactus.blockID); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenClay.java b/src/main/java/net/minecraft/src/WorldGenClay.java new file mode 100644 index 0000000..241f0e1 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenClay.java @@ -0,0 +1,53 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenClay extends WorldGenerator { + private int clayBlockId = Block.blockClay.blockID; + private int numberOfBlocks; + + public WorldGenClay(int var1) { + this.numberOfBlocks = var1; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + if(var1.getBlockMaterial(var3, var4, var5) != Material.water) { + return false; + } else { + float var6 = var2.nextFloat() * (float)Math.PI; + double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F); + double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F); + double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F); + double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F); + double var15 = (double)(var4 + var2.nextInt(3) + 2); + double var17 = (double)(var4 + var2.nextInt(3) + 2); + + for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) { + double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks; + double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks; + double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks; + double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D; + double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D; + double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D; + + for(int var32 = (int)(var20 - var28 / 2.0D); var32 <= (int)(var20 + var28 / 2.0D); ++var32) { + for(int var33 = (int)(var22 - var30 / 2.0D); var33 <= (int)(var22 + var30 / 2.0D); ++var33) { + for(int var34 = (int)(var24 - var28 / 2.0D); var34 <= (int)(var24 + var28 / 2.0D); ++var34) { + double var35 = ((double)var32 + 0.5D - var20) / (var28 / 2.0D); + double var37 = ((double)var33 + 0.5D - var22) / (var30 / 2.0D); + double var39 = ((double)var34 + 0.5D - var24) / (var28 / 2.0D); + if(var35 * var35 + var37 * var37 + var39 * var39 < 1.0D) { + int var41 = var1.getBlockId(var32, var33, var34); + if(var41 == Block.sand.blockID) { + var1.setBlock(var32, var33, var34, this.clayBlockId); + } + } + } + } + } + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenDungeons.java b/src/main/java/net/minecraft/src/WorldGenDungeons.java new file mode 100644 index 0000000..f458f50 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenDungeons.java @@ -0,0 +1,116 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenDungeons extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + byte var6 = 3; + int var7 = var2.nextInt(2) + 2; + int var8 = var2.nextInt(2) + 2; + int var9 = 0; + + int var10; + int var11; + int var12; + for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) { + for(var11 = var4 - 1; var11 <= var4 + var6 + 1; ++var11) { + for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) { + Material var13 = var1.getBlockMaterial(var10, var11, var12); + if(var11 == var4 - 1 && !var13.func_878_a()) { + return false; + } + + if(var11 == var4 + var6 + 1 && !var13.func_878_a()) { + return false; + } + + if((var10 == var3 - var7 - 1 || var10 == var3 + var7 + 1 || var12 == var5 - var8 - 1 || var12 == var5 + var8 + 1) && var11 == var4 && var1.getBlockId(var10, var11, var12) == 0 && var1.getBlockId(var10, var11 + 1, var12) == 0) { + ++var9; + } + } + } + } + + if(var9 >= 1 && var9 <= 5) { + for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) { + for(var11 = var4 + var6; var11 >= var4 - 1; --var11) { + for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) { + if(var10 != var3 - var7 - 1 && var11 != var4 - 1 && var12 != var5 - var8 - 1 && var10 != var3 + var7 + 1 && var11 != var4 + var6 + 1 && var12 != var5 + var8 + 1) { + var1.setBlockWithNotify(var10, var11, var12, 0); + } else if(var11 >= 0 && !var1.getBlockMaterial(var10, var11 - 1, var12).func_878_a()) { + var1.setBlockWithNotify(var10, var11, var12, 0); + } else if(var1.getBlockMaterial(var10, var11, var12).func_878_a()) { + if(var11 == var4 - 1 && var2.nextInt(4) != 0) { + var1.setBlockWithNotify(var10, var11, var12, Block.cobblestoneMossy.blockID); + } else { + var1.setBlockWithNotify(var10, var11, var12, Block.cobblestone.blockID); + } + } + } + } + } + + label110: + for(var10 = 0; var10 < 2; ++var10) { + for(var11 = 0; var11 < 3; ++var11) { + var12 = var3 + var2.nextInt(var7 * 2 + 1) - var7; + int var14 = var5 + var2.nextInt(var8 * 2 + 1) - var8; + if(var1.getBlockId(var12, var4, var14) == 0) { + int var15 = 0; + if(var1.getBlockMaterial(var12 - 1, var4, var14).func_878_a()) { + ++var15; + } + + if(var1.getBlockMaterial(var12 + 1, var4, var14).func_878_a()) { + ++var15; + } + + if(var1.getBlockMaterial(var12, var4, var14 - 1).func_878_a()) { + ++var15; + } + + if(var1.getBlockMaterial(var12, var4, var14 + 1).func_878_a()) { + ++var15; + } + + if(var15 == 1) { + var1.setBlockWithNotify(var12, var4, var14, Block.crate.blockID); + TileEntityChest var16 = (TileEntityChest)var1.getBlockTileEntity(var12, var4, var14); + int var17 = 0; + + while(true) { + if(var17 >= 8) { + continue label110; + } + + ItemStack var18 = this.pickCheckLootItem(var2); + if(var18 != null) { + var16.setInventorySlotContents(var2.nextInt(var16.getSizeInventory()), var18); + } + + ++var17; + } + } + } + } + } + + var1.setBlockWithNotify(var3, var4, var5, Block.mobSpawner.blockID); + TileEntityMobSpawner var19 = (TileEntityMobSpawner)var1.getBlockTileEntity(var3, var4, var5); + var19.entityID = this.pickMobSpawner(var2); + return true; + } else { + return false; + } + } + + private ItemStack pickCheckLootItem(Random var1) { + int var2 = var1.nextInt(11); + return var2 == 0 ? new ItemStack(Item.saddle) : (var2 == 1 ? new ItemStack(Item.ingotIron, var1.nextInt(4) + 1) : (var2 == 2 ? new ItemStack(Item.bread) : (var2 == 3 ? new ItemStack(Item.wheat, var1.nextInt(4) + 1) : (var2 == 4 ? new ItemStack(Item.gunpowder, var1.nextInt(4) + 1) : (var2 == 5 ? new ItemStack(Item.silk, var1.nextInt(4) + 1) : (var2 == 6 ? new ItemStack(Item.bucketEmpty) : (var2 == 7 && var1.nextInt(100) == 0 ? new ItemStack(Item.appleGold) : (var2 == 8 && var1.nextInt(2) == 0 ? new ItemStack(Item.redstone, var1.nextInt(4) + 1) : (var2 == 9 && var1.nextInt(10) == 0 ? new ItemStack(Item.itemsList[Item.record13.shiftedIndex + var1.nextInt(2)]) : null))))))))); + } + + private String pickMobSpawner(Random var1) { + int var2 = var1.nextInt(4); + return var2 == 0 ? "Skeleton" : (var2 == 1 ? "Zombie" : (var2 == 2 ? "Zombie" : (var2 == 3 ? "Spider" : ""))); + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenFire.java b/src/main/java/net/minecraft/src/WorldGenFire.java new file mode 100644 index 0000000..be41986 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenFire.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenFire extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + for(int var6 = 0; var6 < 64; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 + var2.nextInt(4) - var2.nextInt(4); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0 && var1.getBlockId(var7, var8 - 1, var9) == Block.bloodStone.blockID) { + var1.setBlockWithNotify(var7, var8, var9, Block.fire.blockID); + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenFlowers.java b/src/main/java/net/minecraft/src/WorldGenFlowers.java new file mode 100644 index 0000000..f01a0f1 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenFlowers.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenFlowers extends WorldGenerator { + private int plantBlockId; + + public WorldGenFlowers(int var1) { + this.plantBlockId = var1; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + for(int var6 = 0; var6 < 64; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 + var2.nextInt(4) - var2.nextInt(4); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0 && ((BlockFlower)Block.blocksList[this.plantBlockId]).canBlockStay(var1, var7, var8, var9)) { + var1.setBlock(var7, var8, var9, this.plantBlockId); + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenHellLava.java b/src/main/java/net/minecraft/src/WorldGenHellLava.java new file mode 100644 index 0000000..4ce5cd1 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenHellLava.java @@ -0,0 +1,70 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenHellLava extends WorldGenerator { + private int field_4158_a; + + public WorldGenHellLava(int var1) { + this.field_4158_a = var1; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) { + return false; + } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.bloodStone.blockID) { + return false; + } else { + int var6 = 0; + if(var1.getBlockId(var3 - 1, var4, var5) == Block.bloodStone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3 + 1, var4, var5) == Block.bloodStone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3, var4, var5 - 1) == Block.bloodStone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3, var4, var5 + 1) == Block.bloodStone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3, var4 - 1, var5) == Block.bloodStone.blockID) { + ++var6; + } + + int var7 = 0; + if(var1.getBlockId(var3 - 1, var4, var5) == 0) { + ++var7; + } + + if(var1.getBlockId(var3 + 1, var4, var5) == 0) { + ++var7; + } + + if(var1.getBlockId(var3, var4, var5 - 1) == 0) { + ++var7; + } + + if(var1.getBlockId(var3, var4, var5 + 1) == 0) { + ++var7; + } + + if(var1.getBlockId(var3, var4 - 1, var5) == 0) { + ++var7; + } + + if(var6 == 4 && var7 == 1) { + var1.setBlockWithNotify(var3, var4, var5, this.field_4158_a); + var1.field_4214_a = true; + Block.blocksList[this.field_4158_a].updateTick(var1, var3, var4, var5, var2); + var1.field_4214_a = false; + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenLakes.java b/src/main/java/net/minecraft/src/WorldGenLakes.java new file mode 100644 index 0000000..2f55561 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenLakes.java @@ -0,0 +1,88 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenLakes extends WorldGenerator { + private int field_15235_a; + + public WorldGenLakes(int var1) { + this.field_15235_a = var1; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + var3 -= 8; + + for(var5 -= 8; var4 > 0 && var1.getBlockId(var3, var4, var5) == 0; --var4) { + } + + var4 -= 4; + boolean[] var6 = new boolean[2048]; + int var7 = var2.nextInt(4) + 4; + + int var8; + for(var8 = 0; var8 < var7; ++var8) { + double var9 = var2.nextDouble() * 6.0D + 3.0D; + double var11 = var2.nextDouble() * 4.0D + 2.0D; + double var13 = var2.nextDouble() * 6.0D + 3.0D; + double var15 = var2.nextDouble() * (16.0D - var9 - 2.0D) + 1.0D + var9 / 2.0D; + double var17 = var2.nextDouble() * (8.0D - var11 - 4.0D) + 2.0D + var11 / 2.0D; + double var19 = var2.nextDouble() * (16.0D - var13 - 2.0D) + 1.0D + var13 / 2.0D; + + for(int var21 = 1; var21 < 15; ++var21) { + for(int var22 = 1; var22 < 15; ++var22) { + for(int var23 = 1; var23 < 7; ++var23) { + double var24 = ((double)var21 - var15) / (var9 / 2.0D); + double var26 = ((double)var23 - var17) / (var11 / 2.0D); + double var28 = ((double)var22 - var19) / (var13 / 2.0D); + double var30 = var24 * var24 + var26 * var26 + var28 * var28; + if(var30 < 1.0D) { + var6[(var21 * 16 + var22) * 8 + var23] = true; + } + } + } + } + } + + int var10; + int var32; + for(var8 = 0; var8 < 16; ++var8) { + for(var32 = 0; var32 < 16; ++var32) { + for(var10 = 0; var10 < 8; ++var10) { + boolean var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]); + if(var33) { + Material var12 = var1.getBlockMaterial(var3 + var8, var4 + var10, var5 + var32); + if(var10 >= 4 && var12.getIsLiquid()) { + return false; + } + + if(var10 < 4 && !var12.func_878_a() && var1.getBlockId(var3 + var8, var4 + var10, var5 + var32) != this.field_15235_a) { + return false; + } + } + } + } + } + + for(var8 = 0; var8 < 16; ++var8) { + for(var32 = 0; var32 < 16; ++var32) { + for(var10 = 0; var10 < 8; ++var10) { + if(var6[(var8 * 16 + var32) * 8 + var10]) { + var1.setBlockWithNotify(var3 + var8, var4 + var10, var5 + var32, var10 >= 4 ? 0 : this.field_15235_a); + } + } + } + } + + for(var8 = 0; var8 < 16; ++var8) { + for(var32 = 0; var32 < 16; ++var32) { + for(var10 = 4; var10 < 8; ++var10) { + if(var6[(var8 * 16 + var32) * 8 + var10] && var1.getBlockId(var3 + var8, var4 + var10 - 1, var5 + var32) == Block.dirt.blockID && var1.getSavedLightValue(EnumSkyBlock.Sky, var3 + var8, var4 + var10, var5 + var32) > 0) { + var1.setBlockWithNotify(var3 + var8, var4 + var10 - 1, var5 + var32, Block.grass.blockID); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenLightStone1.java b/src/main/java/net/minecraft/src/WorldGenLightStone1.java new file mode 100644 index 0000000..e9c940d --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenLightStone1.java @@ -0,0 +1,61 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenLightStone1 extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + if(var1.getBlockId(var3, var4, var5) != 0) { + return false; + } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) { + return false; + } else { + var1.setBlockWithNotify(var3, var4, var5, Block.lightStone.blockID); + + for(int var6 = 0; var6 < 1500; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 - var2.nextInt(12); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0) { + int var10 = 0; + + for(int var11 = 0; var11 < 6; ++var11) { + int var12 = 0; + if(var11 == 0) { + var12 = var1.getBlockId(var7 - 1, var8, var9); + } + + if(var11 == 1) { + var12 = var1.getBlockId(var7 + 1, var8, var9); + } + + if(var11 == 2) { + var12 = var1.getBlockId(var7, var8 - 1, var9); + } + + if(var11 == 3) { + var12 = var1.getBlockId(var7, var8 + 1, var9); + } + + if(var11 == 4) { + var12 = var1.getBlockId(var7, var8, var9 - 1); + } + + if(var11 == 5) { + var12 = var1.getBlockId(var7, var8, var9 + 1); + } + + if(var12 == Block.lightStone.blockID) { + ++var10; + } + } + + if(var10 == 1) { + var1.setBlockWithNotify(var7, var8, var9, Block.lightStone.blockID); + } + } + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenLightStone2.java b/src/main/java/net/minecraft/src/WorldGenLightStone2.java new file mode 100644 index 0000000..14017b4 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenLightStone2.java @@ -0,0 +1,61 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenLightStone2 extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + if(var1.getBlockId(var3, var4, var5) != 0) { + return false; + } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) { + return false; + } else { + var1.setBlockWithNotify(var3, var4, var5, Block.lightStone.blockID); + + for(int var6 = 0; var6 < 1500; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 - var2.nextInt(12); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0) { + int var10 = 0; + + for(int var11 = 0; var11 < 6; ++var11) { + int var12 = 0; + if(var11 == 0) { + var12 = var1.getBlockId(var7 - 1, var8, var9); + } + + if(var11 == 1) { + var12 = var1.getBlockId(var7 + 1, var8, var9); + } + + if(var11 == 2) { + var12 = var1.getBlockId(var7, var8 - 1, var9); + } + + if(var11 == 3) { + var12 = var1.getBlockId(var7, var8 + 1, var9); + } + + if(var11 == 4) { + var12 = var1.getBlockId(var7, var8, var9 - 1); + } + + if(var11 == 5) { + var12 = var1.getBlockId(var7, var8, var9 + 1); + } + + if(var12 == Block.lightStone.blockID) { + ++var10; + } + } + + if(var10 == 1) { + var1.setBlockWithNotify(var7, var8, var9, Block.lightStone.blockID); + } + } + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenLiquids.java b/src/main/java/net/minecraft/src/WorldGenLiquids.java new file mode 100644 index 0000000..a50d90d --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenLiquids.java @@ -0,0 +1,64 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenLiquids extends WorldGenerator { + private int liquidBlockId; + + public WorldGenLiquids(int var1) { + this.liquidBlockId = var1; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + if(var1.getBlockId(var3, var4 + 1, var5) != Block.stone.blockID) { + return false; + } else if(var1.getBlockId(var3, var4 - 1, var5) != Block.stone.blockID) { + return false; + } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.stone.blockID) { + return false; + } else { + int var6 = 0; + if(var1.getBlockId(var3 - 1, var4, var5) == Block.stone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3 + 1, var4, var5) == Block.stone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3, var4, var5 - 1) == Block.stone.blockID) { + ++var6; + } + + if(var1.getBlockId(var3, var4, var5 + 1) == Block.stone.blockID) { + ++var6; + } + + int var7 = 0; + if(var1.getBlockId(var3 - 1, var4, var5) == 0) { + ++var7; + } + + if(var1.getBlockId(var3 + 1, var4, var5) == 0) { + ++var7; + } + + if(var1.getBlockId(var3, var4, var5 - 1) == 0) { + ++var7; + } + + if(var1.getBlockId(var3, var4, var5 + 1) == 0) { + ++var7; + } + + if(var6 == 3 && var7 == 1) { + var1.setBlockWithNotify(var3, var4, var5, this.liquidBlockId); + var1.field_4214_a = true; + Block.blocksList[this.liquidBlockId].updateTick(var1, var3, var4, var5, var2); + var1.field_4214_a = false; + } + + return true; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenMinable.java b/src/main/java/net/minecraft/src/WorldGenMinable.java new file mode 100644 index 0000000..652dd5a --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenMinable.java @@ -0,0 +1,47 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenMinable extends WorldGenerator { + private int minableBlockId; + private int numberOfBlocks; + + public WorldGenMinable(int var1, int var2) { + this.minableBlockId = var1; + this.numberOfBlocks = var2; + } + + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + float var6 = var2.nextFloat() * (float)Math.PI; + double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F); + double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F); + double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F); + double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F); + double var15 = (double)(var4 + var2.nextInt(3) + 2); + double var17 = (double)(var4 + var2.nextInt(3) + 2); + + for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) { + double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks; + double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks; + double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks; + double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D; + double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D; + double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D; + + for(int var32 = (int)(var20 - var28 / 2.0D); var32 <= (int)(var20 + var28 / 2.0D); ++var32) { + for(int var33 = (int)(var22 - var30 / 2.0D); var33 <= (int)(var22 + var30 / 2.0D); ++var33) { + for(int var34 = (int)(var24 - var28 / 2.0D); var34 <= (int)(var24 + var28 / 2.0D); ++var34) { + double var35 = ((double)var32 + 0.5D - var20) / (var28 / 2.0D); + double var37 = ((double)var33 + 0.5D - var22) / (var30 / 2.0D); + double var39 = ((double)var34 + 0.5D - var24) / (var28 / 2.0D); + if(var35 * var35 + var37 * var37 + var39 * var39 < 1.0D && var1.getBlockId(var32, var33, var34) == Block.stone.blockID) { + var1.setBlock(var32, var33, var34, this.minableBlockId); + } + } + } + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenPumpkin.java b/src/main/java/net/minecraft/src/WorldGenPumpkin.java new file mode 100644 index 0000000..63cc80d --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenPumpkin.java @@ -0,0 +1,18 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenPumpkin extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + for(int var6 = 0; var6 < 64; ++var6) { + int var7 = var3 + var2.nextInt(8) - var2.nextInt(8); + int var8 = var4 + var2.nextInt(4) - var2.nextInt(4); + int var9 = var5 + var2.nextInt(8) - var2.nextInt(8); + if(var1.getBlockId(var7, var8, var9) == 0 && var1.getBlockId(var7, var8 - 1, var9) == Block.grass.blockID && Block.pumpkin.canPlaceBlockAt(var1, var7, var8, var9)) { + var1.setBlockAndMetadata(var7, var8, var9, Block.pumpkin.blockID, var2.nextInt(4)); + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenReed.java b/src/main/java/net/minecraft/src/WorldGenReed.java new file mode 100644 index 0000000..c10f34b --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenReed.java @@ -0,0 +1,24 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenReed extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + for(int var6 = 0; var6 < 20; ++var6) { + int var7 = var3 + var2.nextInt(4) - var2.nextInt(4); + int var8 = var4; + int var9 = var5 + var2.nextInt(4) - var2.nextInt(4); + if(var1.getBlockId(var7, var4, var9) == 0 && (var1.getBlockMaterial(var7 - 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7 + 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 - 1) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 + 1) == Material.water)) { + int var10 = 2 + var2.nextInt(var2.nextInt(3) + 1); + + for(int var11 = 0; var11 < var10; ++var11) { + if(Block.reed.canBlockStay(var1, var7, var8 + var11, var9)) { + var1.setBlock(var7, var8 + var11, var9, Block.reed.blockID); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenTrees.java b/src/main/java/net/minecraft/src/WorldGenTrees.java new file mode 100644 index 0000000..631e379 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenTrees.java @@ -0,0 +1,78 @@ +package net.minecraft.src; + +import java.util.Random; + +public class WorldGenTrees extends WorldGenerator { + public boolean generate(World var1, Random var2, int var3, int var4, int var5) { + int var6 = var2.nextInt(3) + 4; + boolean var7 = true; + if(var4 >= 1 && var4 + var6 + 1 <= 128) { + int var8; + int var10; + int var11; + int var12; + for(var8 = var4; var8 <= var4 + 1 + var6; ++var8) { + byte var9 = 1; + if(var8 == var4) { + var9 = 0; + } + + if(var8 >= var4 + 1 + var6 - 2) { + var9 = 2; + } + + for(var10 = var3 - var9; var10 <= var3 + var9 && var7; ++var10) { + for(var11 = var5 - var9; var11 <= var5 + var9 && var7; ++var11) { + if(var8 >= 0 && var8 < 128) { + var12 = var1.getBlockId(var10, var8, var11); + if(var12 != 0 && var12 != Block.leaves.blockID) { + var7 = false; + } + } else { + var7 = false; + } + } + } + } + + if(!var7) { + return false; + } else { + var8 = var1.getBlockId(var3, var4 - 1, var5); + if((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && var4 < 128 - var6 - 1) { + var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID); + + int var16; + for(var16 = var4 - 3 + var6; var16 <= var4 + var6; ++var16) { + var10 = var16 - (var4 + var6); + var11 = 1 - var10 / 2; + + for(var12 = var3 - var11; var12 <= var3 + var11; ++var12) { + int var13 = var12 - var3; + + for(int var14 = var5 - var11; var14 <= var5 + var11; ++var14) { + int var15 = var14 - var5; + if((Math.abs(var13) != var11 || Math.abs(var15) != var11 || var2.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[var1.getBlockId(var12, var16, var14)]) { + var1.setBlock(var12, var16, var14, Block.leaves.blockID); + } + } + } + } + + for(var16 = 0; var16 < var6; ++var16) { + var10 = var1.getBlockId(var3, var4 + var16, var5); + if(var10 == 0 || var10 == Block.leaves.blockID) { + var1.setBlock(var3, var4 + var16, var5, Block.wood.blockID); + } + } + + return true; + } else { + return false; + } + } + } else { + return false; + } + } +} diff --git a/src/main/java/net/minecraft/src/WorldGenerator.java b/src/main/java/net/minecraft/src/WorldGenerator.java new file mode 100644 index 0000000..c4cfb05 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldGenerator.java @@ -0,0 +1,10 @@ +package net.minecraft.src; + +import java.util.Random; + +public abstract class WorldGenerator { + public abstract boolean generate(World var1, Random var2, int var3, int var4, int var5); + + public void func_517_a(double var1, double var3, double var5) { + } +} diff --git a/src/main/java/net/minecraft/src/WorldProvider.java b/src/main/java/net/minecraft/src/WorldProvider.java new file mode 100644 index 0000000..bd168ff --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldProvider.java @@ -0,0 +1,109 @@ +package net.minecraft.src; + +import java.io.File; + +public class WorldProvider { + public World worldObj; + public WorldChunkManager worldChunkMgr; + public boolean field_4220_c = false; + public boolean field_6479_d = false; + public boolean field_6478_e = false; + public float[] lightBrightnessTable = new float[16]; + public int field_4218_e = 0; + private float[] field_4217_f = new float[4]; + + public final void registerWorld(World var1) { + this.worldObj = var1; + this.registerWorldChunkManager(); + this.generateLightBrightnessTable(); + } + + protected void generateLightBrightnessTable() { + float var1 = 0.05F; + + for(int var2 = 0; var2 <= 15; ++var2) { + float var3 = 1.0F - (float)var2 / 15.0F; + this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1; + } + + } + + protected void registerWorldChunkManager() { + this.worldChunkMgr = new WorldChunkManager(this.worldObj); + } + + public IChunkProvider getChunkProvider() { + return new ChunkProviderGenerate(this.worldObj, this.worldObj.randomSeed); + } + + public IChunkLoader getChunkLoader(File var1) { + return new ChunkLoader(var1, true); + } + + public boolean canCoordinateBeSpawn(int var1, int var2) { + int var3 = this.worldObj.func_614_g(var1, var2); + return var3 == Block.sand.blockID; + } + + public float calculateCelestialAngle(long var1, float var3) { + int var4 = (int)(var1 % 24000L); + float var5 = ((float)var4 + var3) / 24000.0F - 0.25F; + if(var5 < 0.0F) { + ++var5; + } + + if(var5 > 1.0F) { + --var5; + } + + float var6 = var5; + var5 = 1.0F - (float)((Math.cos((double)var5 * Math.PI) + 1.0D) / 2.0D); + var5 = var6 + (var5 - var6) / 3.0F; + return var5; + } + + public float[] func_4097_b(float var1, float var2) { + float var3 = 0.4F; + float var4 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) - 0.0F; + float var5 = -0.0F; + if(var4 >= var5 - var3 && var4 <= var5 + var3) { + float var6 = (var4 - var5) / var3 * 0.5F + 0.5F; + float var7 = 1.0F - (1.0F - MathHelper.sin(var6 * (float)Math.PI)) * 0.99F; + var7 *= var7; + this.field_4217_f[0] = var6 * 0.3F + 0.7F; + this.field_4217_f[1] = var6 * var6 * 0.7F + 0.2F; + this.field_4217_f[2] = var6 * var6 * 0.0F + 0.2F; + this.field_4217_f[3] = var7; + return this.field_4217_f; + } else { + return null; + } + } + + public Vec3D func_4096_a(float var1, float var2) { + float var3 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var3 < 0.0F) { + var3 = 0.0F; + } + + if(var3 > 1.0F) { + var3 = 1.0F; + } + + float var4 = 192.0F / 255.0F; + float var5 = 216.0F / 255.0F; + float var6 = 1.0F; + var4 *= var3 * 0.94F + 0.06F; + var5 *= var3 * 0.94F + 0.06F; + var6 *= var3 * 0.91F + 0.09F; + return Vec3D.createVector((double)var4, (double)var5, (double)var6); + } + + public boolean func_6477_d() { + return true; + } + + public static WorldProvider func_4101_a(int var0) { + return (WorldProvider)(var0 == 0 ? new WorldProvider() : (var0 == -1 ? new WorldProviderHell() : null)); + } +} diff --git a/src/main/java/net/minecraft/src/WorldProviderHell.java b/src/main/java/net/minecraft/src/WorldProviderHell.java new file mode 100644 index 0000000..a2fcfa3 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldProviderHell.java @@ -0,0 +1,50 @@ +package net.minecraft.src; + +import java.io.File; + +public class WorldProviderHell extends WorldProvider { + public void registerWorldChunkManager() { + this.worldChunkMgr = new WorldChunkManagerHell(MobSpawnerBase.hell, 1.0D, 0.0D); + this.field_4220_c = true; + this.field_6479_d = true; + this.field_6478_e = true; + this.field_4218_e = -1; + } + + public Vec3D func_4096_a(float var1, float var2) { + return Vec3D.createVector((double)0.2F, (double)0.03F, (double)0.03F); + } + + protected void generateLightBrightnessTable() { + float var1 = 0.1F; + + for(int var2 = 0; var2 <= 15; ++var2) { + float var3 = 1.0F - (float)var2 / 15.0F; + this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1; + } + + } + + public IChunkProvider getChunkProvider() { + return new ChunkProviderHell(this.worldObj, this.worldObj.randomSeed); + } + + public IChunkLoader getChunkLoader(File var1) { + File var2 = new File(var1, "DIM-1"); + var2.mkdirs(); + return new ChunkLoader(var2, true); + } + + public boolean canCoordinateBeSpawn(int var1, int var2) { + int var3 = this.worldObj.func_614_g(var1, var2); + return var3 == Block.bedrock.blockID ? false : (var3 == 0 ? false : Block.opaqueCubeLookup[var3]); + } + + public float calculateCelestialAngle(long var1, float var3) { + return 0.5F; + } + + public boolean func_6477_d() { + return false; + } +} diff --git a/src/main/java/net/minecraft/src/WorldRenderer.java b/src/main/java/net/minecraft/src/WorldRenderer.java new file mode 100644 index 0000000..b3152b6 --- /dev/null +++ b/src/main/java/net/minecraft/src/WorldRenderer.java @@ -0,0 +1,214 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import org.lwjgl.opengl.GL11; + +public class WorldRenderer { + public World worldObj; + private int field_1744_C = -1; + private static Tessellator field_1742_D = Tessellator.instance; + public static int field_1762_b = 0; + public int field_1761_c; + public int field_1760_d; + public int field_1759_e; + public int field_1758_f; + public int field_1757_g; + public int field_1756_h; + public int field_1755_i; + public int field_1754_j; + public int field_1753_k; + public int field_1752_l; + public int field_1751_m; + public int field_1750_n; + public boolean field_1749_o = false; + public boolean[] field_1748_p = new boolean[2]; + public int field_1746_q; + public int field_1743_r; + public int field_1741_s; + public float field_1740_t; + public boolean needsUpdate; + public AxisAlignedBB field_1736_v; + public int field_1735_w; + public boolean field_1734_x = true; + public boolean field_1733_y; + public int field_1732_z; + public boolean field_1747_A; + private boolean field_1739_E = false; + public List field_1745_B = new ArrayList(); + private List field_1737_F; + + public WorldRenderer(World var1, List var2, int var3, int var4, int var5, int var6, int var7) { + this.worldObj = var1; + this.field_1737_F = var2; + this.field_1758_f = this.field_1757_g = this.field_1756_h = var6; + this.field_1740_t = MathHelper.sqrt_float((float)(this.field_1758_f * this.field_1758_f + this.field_1757_g * this.field_1757_g + this.field_1756_h * this.field_1756_h)) / 2.0F; + this.field_1744_C = var7; + this.field_1761_c = -999; + this.func_1197_a(var3, var4, var5); + this.needsUpdate = false; + } + + public void func_1197_a(int var1, int var2, int var3) { + if(var1 != this.field_1761_c || var2 != this.field_1760_d || var3 != this.field_1759_e) { + this.func_1195_b(); + this.field_1761_c = var1; + this.field_1760_d = var2; + this.field_1759_e = var3; + this.field_1746_q = var1 + this.field_1758_f / 2; + this.field_1743_r = var2 + this.field_1757_g / 2; + this.field_1741_s = var3 + this.field_1756_h / 2; + this.field_1752_l = var1 & 1023; + this.field_1751_m = var2; + this.field_1750_n = var3 & 1023; + this.field_1755_i = var1 - this.field_1752_l; + this.field_1754_j = var2 - this.field_1751_m; + this.field_1753_k = var3 - this.field_1750_n; + float var4 = 2.0F; + this.field_1736_v = AxisAlignedBB.getBoundingBox((double)((float)var1 - var4), (double)((float)var2 - var4), (double)((float)var3 - var4), (double)((float)(var1 + this.field_1758_f) + var4), (double)((float)(var2 + this.field_1757_g) + var4), (double)((float)(var3 + this.field_1756_h) + var4)); + GL11.glNewList(this.field_1744_C + 2, GL11.GL_COMPILE); + RenderItem.renderAABB(AxisAlignedBB.getBoundingBoxFromPool((double)((float)this.field_1752_l - var4), (double)((float)this.field_1751_m - var4), (double)((float)this.field_1750_n - var4), (double)((float)(this.field_1752_l + this.field_1758_f) + var4), (double)((float)(this.field_1751_m + this.field_1757_g) + var4), (double)((float)(this.field_1750_n + this.field_1756_h) + var4))); + GL11.glEndList(); + this.MarkDirty(); + } + } + + private void func_1203_g() { + GL11.glTranslatef((float)this.field_1752_l, (float)this.field_1751_m, (float)this.field_1750_n); + } + + public void func_1198_a() { + if(this.needsUpdate) { + ++field_1762_b; + int var1 = this.field_1761_c; + int var2 = this.field_1760_d; + int var3 = this.field_1759_e; + int var4 = this.field_1761_c + this.field_1758_f; + int var5 = this.field_1760_d + this.field_1757_g; + int var6 = this.field_1759_e + this.field_1756_h; + + for(int var7 = 0; var7 < 2; ++var7) { + this.field_1748_p[var7] = true; + } + + Chunk.field_1540_a = false; + HashSet var21 = new HashSet(); + var21.addAll(this.field_1745_B); + this.field_1745_B.clear(); + byte var8 = 1; + ChunkCache var9 = new ChunkCache(this.worldObj, var1 - var8, var2 - var8, var3 - var8, var4 + var8, var5 + var8, var6 + var8); + RenderBlocks var10 = new RenderBlocks(var9); + + for(int var11 = 0; var11 < 2; ++var11) { + boolean var12 = false; + boolean var13 = false; + boolean var14 = false; + + for(int var15 = var2; var15 < var5; ++var15) { + for(int var16 = var3; var16 < var6; ++var16) { + for(int var17 = var1; var17 < var4; ++var17) { + int var18 = var9.getBlockId(var17, var15, var16); + if(var18 > 0) { + if(!var14) { + var14 = true; + GL11.glNewList(this.field_1744_C + var11, GL11.GL_COMPILE); + GL11.glPushMatrix(); + this.func_1203_g(); + float var19 = 1.000001F; + GL11.glTranslatef((float)(-this.field_1756_h) / 2.0F, (float)(-this.field_1757_g) / 2.0F, (float)(-this.field_1756_h) / 2.0F); + GL11.glScalef(var19, var19, var19); + GL11.glTranslatef((float)this.field_1756_h / 2.0F, (float)this.field_1757_g / 2.0F, (float)this.field_1756_h / 2.0F); + field_1742_D.startDrawingQuads(); + field_1742_D.setTranslationD((double)(-this.field_1761_c), (double)(-this.field_1760_d), (double)(-this.field_1759_e)); + } + + if(var11 == 0 && Block.isBlockContainer[var18]) { + TileEntity var23 = var9.getBlockTileEntity(var17, var15, var16); + if(TileEntityRenderer.instance.hasSpecialRenderer(var23)) { + this.field_1745_B.add(var23); + } + } + + Block var24 = Block.blocksList[var18]; + int var20 = var24.func_234_g(); + if(var20 != var11) { + var12 = true; + } else if(var20 == var11) { + var13 |= var10.renderBlockByRenderType(var24, var17, var15, var16); + } + } + } + } + } + + if(var14) { + field_1742_D.draw(); + GL11.glPopMatrix(); + GL11.glEndList(); + field_1742_D.setTranslationD(0.0D, 0.0D, 0.0D); + } else { + var13 = false; + } + + if(var13) { + this.field_1748_p[var11] = false; + } + + if(!var12) { + break; + } + } + + HashSet var22 = new HashSet(); + var22.addAll(this.field_1745_B); + var22.removeAll(var21); + this.field_1737_F.addAll(var22); + var21.removeAll(this.field_1745_B); + this.field_1737_F.removeAll(var21); + this.field_1747_A = Chunk.field_1540_a; + this.field_1739_E = true; + } + } + + public float func_1202_a(Entity var1) { + float var2 = (float)(var1.posX - (double)this.field_1746_q); + float var3 = (float)(var1.posY - (double)this.field_1743_r); + float var4 = (float)(var1.posZ - (double)this.field_1741_s); + return var2 * var2 + var3 * var3 + var4 * var4; + } + + public void func_1195_b() { + for(int var1 = 0; var1 < 2; ++var1) { + this.field_1748_p[var1] = true; + } + + this.field_1749_o = false; + this.field_1739_E = false; + } + + public void func_1204_c() { + this.func_1195_b(); + this.worldObj = null; + } + + public int func_1200_a(int var1) { + return !this.field_1749_o ? -1 : (!this.field_1748_p[var1] ? this.field_1744_C + var1 : -1); + } + + public void func_1199_a(ICamera var1) { + this.field_1749_o = var1.func_342_a(this.field_1736_v); + } + + public void func_1201_d() { + GL11.glCallList(this.field_1744_C + 2); + } + + public boolean func_1196_e() { + return !this.field_1739_E ? false : this.field_1748_p[0] && this.field_1748_p[1]; + } + + public void MarkDirty() { + this.needsUpdate = true; + } +} diff --git a/src/main/java/org/lwjgl/input/Keyboard.java b/src/main/java/org/lwjgl/input/Keyboard.java new file mode 100644 index 0000000..d3bd14c --- /dev/null +++ b/src/main/java/org/lwjgl/input/Keyboard.java @@ -0,0 +1,15 @@ +package org.lwjgl.input; + +import org.lwjgl.opengl.GL11; + +public class Keyboard extends GL11 { + + public static boolean next() { + return keysNext(); + } + + public static char getEventCharacter() { + return getEventChar(); + } + +} diff --git a/src/main/java/org/lwjgl/input/Mouse.java b/src/main/java/org/lwjgl/input/Mouse.java new file mode 100644 index 0000000..543a991 --- /dev/null +++ b/src/main/java/org/lwjgl/input/Mouse.java @@ -0,0 +1,55 @@ +package org.lwjgl.input; + +import org.lwjgl.opengl.GL11; + +public class Mouse extends GL11 { + + public static int getX() { + return mouseGetX(); + } + + public static int getY() { + return mouseGetY(); + } + + public static boolean next() { + return mouseNext(); + } + + public static boolean getEventButtonState() { + return mouseGetEventButtonState(); + } + + public static int getEventX() { + return mouseGetEventX(); + } + + + public static int getEventY() { + return mouseGetEventY(); + } + + public static int getEventButton() { + return mouseGetEventButton(); + } + + public static int getDX() { + return mouseGetDX(); + } + + public static int getDY() { + return mouseGetDY(); + } + + public static void setGrabbed(boolean b) { + mouseSetGrabbed(b); + } + + public static boolean isButtonDown(int i) { + return mouseIsButtonDown(i); + } + + public static int getEventDWheel() { + return mouseGetEventDWheel(); + } +} diff --git a/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java b/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java new file mode 100644 index 0000000..3d11198 --- /dev/null +++ b/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java @@ -0,0 +1,1228 @@ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.HashMap; + +import net.PeytonPlayz585.glemu.FixedFunctionShader; +import net.PeytonPlayz585.glemu.GLObjectMap; + +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2; +import net.PeytonPlayz585.glemu.vector.*; + +public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { + + public static final int GL_ZERO = RealOpenGLEnums.GL_ZERO; + public static final int GL_ONE = RealOpenGLEnums.GL_ONE; + public static final int GL_TEXTURE_2D = RealOpenGLEnums.GL_TEXTURE_2D; + public static final int GL_SMOOTH = RealOpenGLEnums.GL_SMOOTH; + public static final int GL_DEPTH_TEST = RealOpenGLEnums.GL_DEPTH_TEST; + public static final int GL_LEQUAL = RealOpenGLEnums.GL_LEQUAL; + public static final int GL_ALPHA_TEST = RealOpenGLEnums.GL_ALPHA_TEST; + public static final int GL_GREATER = RealOpenGLEnums.GL_GREATER; + public static final int GL_BACK = RealOpenGLEnums.GL_BACK; + public static final int GL_PROJECTION = RealOpenGLEnums.GL_PROJECTION; + public static final int GL_MODELVIEW = RealOpenGLEnums.GL_MODELVIEW; + public static final int GL_COLOR_BUFFER_BIT = RealOpenGLEnums.GL_COLOR_BUFFER_BIT; + public static final int GL_DEPTH_BUFFER_BIT = RealOpenGLEnums.GL_DEPTH_BUFFER_BIT; + public static final int GL_LIGHTING = RealOpenGLEnums.GL_LIGHTING; + public static final int GL_FOG = RealOpenGLEnums.GL_FOG; + public static final int GL_COLOR_MATERIAL = RealOpenGLEnums.GL_COLOR_MATERIAL; + public static final int GL_BLEND = RealOpenGLEnums.GL_BLEND; + public static final int GL_RGBA = RealOpenGLEnums.GL_RGBA; + public static final int GL_UNSIGNED_BYTE = RealOpenGLEnums.GL_UNSIGNED_BYTE; + public static final int GL_TEXTURE_WIDTH = RealOpenGLEnums.GL_TEXTURE_WIDTH; + public static final int GL_LIGHT0 = RealOpenGLEnums.GL_LIGHT0; + public static final int GL_LIGHT1 = RealOpenGLEnums.GL_LIGHT1; + public static final int GL_POSITION = RealOpenGLEnums.GL_POSITION; + public static final int GL_DIFFUSE = RealOpenGLEnums.GL_DIFFUSE; + public static final int GL_SPECULAR = RealOpenGLEnums.GL_SPECULAR; + public static final int GL_AMBIENT = RealOpenGLEnums.GL_AMBIENT; + public static final int GL_FLAT = RealOpenGLEnums.GL_FLAT; + public static final int GL_LIGHT_MODEL_AMBIENT = RealOpenGLEnums.GL_LIGHT_MODEL_AMBIENT; + public static final int GL_FRONT_AND_BACK = RealOpenGLEnums.GL_FRONT_AND_BACK; + public static final int GL_AMBIENT_AND_DIFFUSE = RealOpenGLEnums.GL_AMBIENT_AND_DIFFUSE; + public static final int GL_MODELVIEW_MATRIX = RealOpenGLEnums.GL_MODELVIEW_MATRIX; + public static final int GL_PROJECTION_MATRIX = RealOpenGLEnums.GL_PROJECTION_MATRIX; + public static final int GL_VIEWPORT = RealOpenGLEnums.GL_VIEWPORT; + public static final int GL_RESCALE_NORMAL = RealOpenGLEnums.GL_RESCALE_NORMAL; + public static final int GL_SRC_ALPHA = RealOpenGLEnums.GL_SRC_ALPHA; + public static final int GL_ONE_MINUS_SRC_ALPHA = RealOpenGLEnums.GL_ONE_MINUS_SRC_ALPHA; + public static final int GL_ONE_MINUS_DST_COLOR = RealOpenGLEnums.GL_ONE_MINUS_DST_COLOR; + public static final int GL_ONE_MINUS_SRC_COLOR = RealOpenGLEnums.GL_ONE_MINUS_SRC_COLOR; + public static final int GL_CULL_FACE = RealOpenGLEnums.GL_CULL_FACE; + public static final int GL_TEXTURE_MIN_FILTER = RealOpenGLEnums.GL_TEXTURE_MIN_FILTER; + public static final int GL_TEXTURE_MAG_FILTER = RealOpenGLEnums.GL_TEXTURE_MAG_FILTER; + public static final int GL_LINEAR = RealOpenGLEnums.GL_LINEAR; + public static final int GL_COLOR_LOGIC_OP = RealOpenGLEnums.GL_COLOR_LOGIC_OP; + public static final int GL_OR_REVERSE = RealOpenGLEnums.GL_OR_REVERSE; + public static final int GL_EQUAL = RealOpenGLEnums.GL_EQUAL; + public static final int GL_SRC_COLOR = RealOpenGLEnums.GL_SRC_COLOR; + public static final int GL_TEXTURE = RealOpenGLEnums.GL_TEXTURE; + public static final int GL_FRONT = RealOpenGLEnums.GL_FRONT; + public static final int GL_COMPILE = RealOpenGLEnums.GL_COMPILE; + public static final int GL_NEAREST = RealOpenGLEnums.GL_NEAREST; + public static final int GL_CLAMP = RealOpenGLEnums.GL_CLAMP_TO_EDGE; + public static final int GL_TEXTURE_WRAP_S = RealOpenGLEnums.GL_TEXTURE_WRAP_S; + public static final int GL_TEXTURE_WRAP_T = RealOpenGLEnums.GL_TEXTURE_WRAP_T; + public static final int GL_REPEAT = RealOpenGLEnums.GL_REPEAT; + public static final int GL_BGRA = RealOpenGLEnums.GL_BGRA; + public static final int GL_UNSIGNED_INT_8_8_8_8_REV = RealOpenGLEnums.GL_UNSIGNED_INT_8_8_8_8_REV; + public static final int GL_DST_COLOR = RealOpenGLEnums.GL_DST_COLOR; + public static final int GL_POLYGON_OFFSET_FILL = RealOpenGLEnums.GL_POLYGON_OFFSET_FILL; + public static final int GL_NORMALIZE = RealOpenGLEnums.GL_NORMALIZE; + public static final int GL_DST_ALPHA = RealOpenGLEnums.GL_DST_ALPHA; + public static final int GL_FLOAT = RealOpenGLEnums.GL_FLOAT; + public static final int GL_TEXTURE_COORD_ARRAY = RealOpenGLEnums.GL_TEXTURE_COORD_ARRAY; + public static final int GL_SHORT = RealOpenGLEnums.GL_SHORT; + public static final int GL_COLOR_ARRAY = RealOpenGLEnums.GL_COLOR_ARRAY; + public static final int GL_VERTEX_ARRAY = RealOpenGLEnums.GL_VERTEX_ARRAY; + public static final int GL_TRIANGLES = RealOpenGLEnums.GL_TRIANGLES; + public static final int GL_NORMAL_ARRAY = RealOpenGLEnums.GL_NORMAL_ARRAY; + public static final int GL_TEXTURE_3D = RealOpenGLEnums.GL_TEXTURE_3D; + public static final int GL_FOG_MODE = RealOpenGLEnums.GL_FOG_MODE; + public static final int GL_EXP = RealOpenGLEnums.GL_EXP; + public static final int GL_FOG_DENSITY = RealOpenGLEnums.GL_FOG_DENSITY; + public static final int GL_FOG_START = RealOpenGLEnums.GL_FOG_START; + public static final int GL_FOG_END = RealOpenGLEnums.GL_FOG_END; + public static final int GL_FOG_COLOR = RealOpenGLEnums.GL_FOG_COLOR; + public static final int GL_TRIANGLE_STRIP = RealOpenGLEnums.GL_TRIANGLE_STRIP; + public static final int GL_PACK_ALIGNMENT = RealOpenGLEnums.GL_PACK_ALIGNMENT; + public static final int GL_UNPACK_ALIGNMENT = RealOpenGLEnums.GL_UNPACK_ALIGNMENT; + public static final int GL_QUADS = RealOpenGLEnums.GL_QUADS; + public static final int GL_INVALID_ENUM = RealOpenGLEnums.GL_INVALID_ENUM; + public static final int GL_INVALID_VALUE = RealOpenGLEnums.GL_INVALID_VALUE; + public static final int GL_INVALID_OPERATION = RealOpenGLEnums.GL_INVALID_OPERATION; + public static final int GL_OUT_OF_MEMORY = RealOpenGLEnums.GL_OUT_OF_MEMORY; + public static final int GL_CONTEXT_LOST_WEBGL = -144; + public static final int GL_TRIANGLE_FAN = RealOpenGLEnums.GL_TRIANGLE_FAN; + public static final int GL_LINE_STRIP = RealOpenGLEnums.GL_LINE_STRIP; + public static final int GL_LINES = RealOpenGLEnums.GL_LINES; + public static final int GL_NEAREST_MIPMAP_LINEAR = RealOpenGLEnums.GL_NEAREST_MIPMAP_LINEAR; + public static final int GL_TEXTURE_MAX_ANISOTROPY = -150; + public static final int GL_TEXTURE_MAX_LEVEL = RealOpenGLEnums.GL_TEXTURE_MAX_LEVEL; + public static final int GL_LINEAR_MIPMAP_LINEAR = RealOpenGLEnums.GL_LINEAR_MIPMAP_LINEAR; + public static final int GL_LINEAR_MIPMAP_NEAREST = RealOpenGLEnums.GL_LINEAR_MIPMAP_NEAREST; + public static final int GL_NEAREST_MIPMAP_NEAREST = RealOpenGLEnums.GL_NEAREST_MIPMAP_NEAREST; + + public static final boolean isWebGL = _wisWebGL(); + + private static final GLObjectMap texObjects = new GLObjectMap(256); + + private static boolean enableTexture2D = false; + private static boolean enableLighting = false; + private static boolean enableAlphaTest = false; + private static float alphaThresh = 0.1f; + + private static boolean isCompilingDisplayList = false; + private static DisplayList compilingDisplayList = null; + + private static boolean enableColorArray = false; + private static boolean enableNormalArray = false; + private static boolean enableTex0Array = false; + + private static float colorR = 1.0f; + private static float colorG = 1.0f; + private static float colorB = 1.0f; + private static float colorA = 1.0f; + + private static float normalX = 1.0f; + private static float normalY = 0.0f; + private static float normalZ = 0.0f; + + private static float tex0X = 0; + private static float tex0Y = 0; + + private static boolean enableColorMaterial = false; + + private static float fogColorR = 1.0f; + private static float fogColorG = 1.0f; + private static float fogColorB = 1.0f; + private static float fogColorA = 1.0f; + private static int fogMode = 1; + private static boolean fogEnabled = false; + private static boolean fogPremultiply = false; + private static float fogStart = 1.0f; + private static float fogEnd = 1.0f; + private static float fogDensity = 1.0f; + + private static int bytesUploaded = 0; + private static int vertexDrawn = 0; + private static int triangleDrawn = 0; + + private static int matrixMode = GL_MODELVIEW; + + static Matrix4f[] matModelV = new Matrix4f[32]; + static int matModelPointer = 0; + + static Matrix4f[] matProjV = new Matrix4f[6]; + static int matProjPointer = 0; + + static Matrix4f[] matTexV = new Matrix4f[16]; + static int matTexPointer = 0; + + static { + for (int i = 0; i < matModelV.length; ++i) { + matModelV[i] = new Matrix4f(); + } + for (int i = 0; i < matProjV.length; ++i) { + matProjV[i] = new Matrix4f(); + } + for (int i = 0; i < matTexV.length; ++i) { + matTexV[i] = new Matrix4f(); + } + } + + public static void glClearStack() { + matModelV[0].load(matModelV[matModelPointer]); + matModelPointer = 0; + matProjV[0].load(matProjV[matProjPointer]); + matProjPointer = 0; + matTexV[0].load(matTexV[matTexPointer]); + matTexPointer = 0; + } + + private static BufferGL quadsToTrianglesBuffer = null; + private static BufferArrayGL currentArray = null; + + private static class DisplayList { + private final int id; + private BufferArrayGL glarray; + private BufferGL glbuffer; + private int shaderMode; + private int listLength; + + private DisplayList(int id) { + this.id = id; + this.glarray = null; + this.glbuffer = null; + this.shaderMode = -1; + this.listLength = 0; + } + } + + private static final HashMap displayLists = new HashMap(); + private static final HashMap displayListsInitialized = new HashMap(); + + public static final int getDisplayListCount() { + return displayListsInitialized.size(); + } + + public static final void glEnable(int p1) { + switch (p1) { + case GL_DEPTH_TEST: + _wglEnable(_wGL_DEPTH_TEST); + break; + case GL_CULL_FACE: + _wglEnable(_wGL_CULL_FACE); + break; + case GL_BLEND: + _wglEnable(_wGL_BLEND); + break; + case GL_RESCALE_NORMAL: + break; + case GL_TEXTURE_2D: + enableTexture2D = true; + break; + case GL_LIGHTING: + enableLighting = true; + break; + case GL_ALPHA_TEST: + enableAlphaTest = true; + break; + case GL_FOG: + fogEnabled = true; + break; + case GL_COLOR_MATERIAL: + enableColorMaterial = true; + break; + case GL_POLYGON_OFFSET_FILL: + _wglEnable(_wGL_POLYGON_OFFSET_FILL); + default: + break; + } + } + + public static final void glShadeModel(int p1) { + + } + + public static final void glClearDepth(float p1) { + _wglClearDepth(-p1); + } + + public static final void glDepthFunc(int p1) { + int f = _wGL_GEQUAL; + switch (p1) { + case GL_GREATER: + f = _wGL_LESS; + break; + case GL_LEQUAL: + f = _wGL_GEQUAL; + break; + case GL_EQUAL: + f = _wGL_EQUAL; + default: + break; + } + _wglDepthFunc(f); + } + + public static final void glAlphaFunc(int p1, float p2) { + alphaThresh = p2; + } + + public static final void glCullFace(int p1) { + _wglCullFace(p1); + } + + public static final void glMatrixMode(int p1) { + matrixMode = p1; + } + + private static final Matrix4f getMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + return matModelV[matModelPointer]; + case GL_PROJECTION: + return matProjV[matProjPointer]; + case GL_TEXTURE: + return matTexV[matTexPointer]; + } + } + + public static final void glLoadIdentity() { + getMatrix().setIdentity(); + } + + public static final void glViewport(int p1, int p2, int p3, int p4) { + _wglViewport(p1, p2, p3, p4); + } + + public static final void glClear(int p1) { + _wglClear(p1); + } + + public static final void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) { + Matrix4f res = getMatrix(); + res.m00 = (float) (2.0f / (right - left)); + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = (float) (2.0f / (top - bottom)); + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = (float) (2.0f / (zFar - zNear)); + res.m23 = 0.0f; + res.m30 = (float) (-(right + left) / (right - left)); + res.m31 = (float) (-(top + bottom) / (top - bottom)); + res.m32 = (float) ((zFar + zNear) / (zFar - zNear)); + res.m33 = 1.0f; + } + + public static final void glOrtho(float left, float right, float bottom, float top, float zNear, float zFar) { + Matrix4f res = getMatrix(); + res.m00 = 2.0f / (right - left); + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = 2.0f / (top - bottom); + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = 2.0f / (zFar - zNear); + res.m23 = 0.0f; + res.m30 = -(right + left) / (right - left); + res.m31 = -(top + bottom) / (top - bottom); + res.m32 = (zFar + zNear) / (zFar - zNear); + res.m33 = 1.0f; + } + + private static final Vector3f deevis = new Vector3f(); + + public static final void glTranslatef(float p1, float p2, float p3) { + deevis.set(p1, p2, p3); + getMatrix().translate(deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glClearColor(float p1, float p2, float p3, float p4) { + _wglClearColor(p1, p2, p3, p4); + } + + public static final void glDisable(int p1) { + switch (p1) { + case GL_DEPTH_TEST: + _wglDisable(_wGL_DEPTH_TEST); + break; + case GL_CULL_FACE: + _wglDisable(_wGL_CULL_FACE); + break; + case GL_BLEND: + _wglDisable(_wGL_BLEND); + break; + case GL_RESCALE_NORMAL: + break; + case GL_TEXTURE_2D: + enableTexture2D = false; + break; + case GL_LIGHTING: + enableLighting = false; + break; + case GL_ALPHA_TEST: + enableAlphaTest = false; + break; + case GL_FOG: + fogEnabled = false; + break; + case GL_COLOR_MATERIAL: + enableColorMaterial = false; + break; + case GL_POLYGON_OFFSET_FILL: + _wglDisable(_wGL_POLYGON_OFFSET_FILL); + default: + break; + } + } + + public static final void glColor4f(float p1, float p2, float p3, float p4) { + colorR = p1; + colorG = p2; + colorB = p3; + colorA = p4; + } + + public static final int glGetError() { + int err = _wglGetError(); + if (err == _wGL_CONTEXT_LOST_WEBGL) + return GL_CONTEXT_LOST_WEBGL; + return err; + } + + public static final void glFlush() { + //...??? + } + + public static final void glLineWidth(float p1) { + + } + + public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + ByteBuffer p9) { + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glLight(int p1, int p2, FloatBuffer p3) { + + } + + public static final void glLightModel(int p1, FloatBuffer p2) { + + } + + private static Vector4f lightPos0vec0 = new Vector4f(); + private static Vector4f lightPos1vec0 = new Vector4f(); + private static Vector4f lightPos0vec = new Vector4f(); + private static Vector4f lightPos1vec = new Vector4f(); + + public static final void copyModelToLightMatrix() { + lightPos0vec0.set(lightPos0vec); + lightPos1vec0.set(lightPos1vec); + lightPos0vec.set(0.2f, 1.0f, -0.7f, 0.0f); + lightPos0vec.normalise(); + lightPos1vec.set(-0.2f, 1.0f, 0.7f, 0.0f); + lightPos1vec.normalise(); + Matrix4f.transform(matModelV[matModelPointer], lightPos0vec, lightPos0vec).normalise(); + Matrix4f.transform(matModelV[matModelPointer], lightPos1vec, lightPos1vec).normalise(); + } + + public static final void flipLightMatrix() { + lightPos0vec.x = -lightPos0vec.x; + lightPos1vec.x = -lightPos1vec.x; + lightPos0vec.y = -lightPos0vec.y; + lightPos1vec.y = -lightPos1vec.y; + lightPos0vec.z = -lightPos0vec.z; + lightPos1vec.z = -lightPos1vec.z; + } + + public static final void revertLightMatrix() { + lightPos0vec.set(lightPos0vec0); + lightPos1vec.set(lightPos1vec0); + } + + public static final void glPushMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + if (matModelPointer < matModelV.length - 1) { + ++matModelPointer; + matModelV[matModelPointer].load(matModelV[matModelPointer - 1]); + } else { + System.err.println("modelview matrix stack overflow"); + } + break; + case GL_PROJECTION: + if (matProjPointer < matProjV.length - 1) { + ++matProjPointer; + matProjV[matProjPointer].load(matProjV[matProjPointer - 1]); + } else { + System.err.println("projection matrix stack overflow"); + } + break; + case GL_TEXTURE: + if (matTexPointer < matTexV.length - 1) { + ++matTexPointer; + matTexV[matTexPointer].load(matTexV[matTexPointer - 1]); + } else { + System.err.println("texture matrix stack overflow"); + } + break; + } + } + + private static final float toRad = 0.0174532925f; + + public static final void glRotatef(float p1, float p2, float p3, float p4) { + deevis.set(p2, p3, p4); + getMatrix().rotate(p1 * toRad, deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glPopMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + if (matModelPointer > 0) { + --matModelPointer; + } else { + System.err.println("modelview matrix stack underflow"); + } + break; + case GL_PROJECTION: + if (matProjPointer > 0) { + --matProjPointer; + } else { + System.err.println("projection matrix stack underflow"); + } + break; + case GL_TEXTURE: + if (matTexPointer > 0) { + --matTexPointer; + } else { + System.err.println("texture matrix stack underflow"); + } + break; + } + } + + public static final void glColorMaterial(int p1, int p2) { + + } + + public static final void glGetFloat(int p1, FloatBuffer p2) { + switch (p1) { + case GL_MODELVIEW_MATRIX: + default: + matModelV[matModelPointer].store(p2); + break; + case GL_PROJECTION_MATRIX: + matProjV[matProjPointer].store(p2); + break; + } + } + + public static final void glGetInteger(int p1, int[] p2) { + if (p1 == GL_VIEWPORT) { + _wglGetParameter(_wGL_VIEWPORT, 4, p2); + } + } + + public static final void glScalef(float p1, float p2, float p3) { + deevis.set(p1, p2, p3); + getMatrix().scale(deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glBlendFunc(int p1, int p2) { + fogPremultiply = (p1 == GL_ONE && p2 == GL_ONE_MINUS_SRC_ALPHA); + _wglBlendFunc(p1, p2); + } + + public static final void glBlendFuncSeparate(int p1, int p2, int p3, int p4) { + fogPremultiply = (p3 == GL_ONE && p4 == GL_ONE_MINUS_SRC_ALPHA); + _wglBlendFuncSeparate(p1, p2, p3, p4); + } + + public static final void glDepthMask(boolean p1) { + _wglDepthMask(p1); + } + + public static final void glColorMask(boolean p1, boolean p2, boolean p3, boolean p4) { + _wglColorMask(p1, p2, p3, p4); + } + + public static final void glBindTexture(int p1, int p2) { + TextureGL t = texObjects.get(p2); + _wglBindTexture(_wGL_TEXTURE_2D, t); + } + + public static final void glCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) { + _wglCopyTexSubImage2D(_wGL_TEXTURE_2D, p2, p3, p4, p5, p6, p7, p8); + } + + public static final void glTexParameteri(int p1, int p2, int p3) { + if(p3 == RealOpenGLEnums.GL_CLAMP_TO_EDGE || p3 == 10496) { + p3 = _wGL_CLAMP; + } + _wglTexParameteri(p1, p2, p3); + } + + public static final void glTexParameterf(int p1, int p2, float p3) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + int pp2 = 0; + switch (p2) { + default: + case GL_TEXTURE_MAX_ANISOTROPY: + pp2 = _wGL_TEXTURE_MAX_ANISOTROPY; + break; + } + _wglTexParameterf(pp1, pp2, p3); + } + + public static final void glLogicOp(int p1) { + + } + + public static final void glNormal3f(float p1, float p2, float p3) { + float len = (float) Math.sqrt(p1 * p1 + p2 * p2 + p3 * p3); + normalX = p1 / len; + normalY = p2 / len; + normalZ = p3 / len; + } + + public static final int glGenLists(int p1) { + int base = displayListId + 1; + for (int i = 0; i < p1; i++) { + int id = ++displayListId; + displayLists.put(id, new DisplayList(id)); + } + return base; + } + + public static final void _wglBindVertexArray0(BufferArrayGL p1) { + currentArray = p1; + _wglBindVertexArray(p1); + } + + private static int displayListId = 0; + + public static final void glCallList(int p1) { + if (!isCompilingDisplayList) { + DisplayList d = displayListsInitialized.get(p1); + if (d != null && d.listLength > 0) { + bindTheShader(d.shaderMode | getShaderModeFlag1()); + _wglBindVertexArray0(d.glarray); + _wglDrawQuadArrays(0, d.listLength); + shader.unuseProgram(); + vertexDrawn += d.listLength * 6 / 4; + triangleDrawn += d.listLength / 2; + } + } + } + + public static final void glNewList(int p1, int p2) { + if (!isCompilingDisplayList) { + compilingDisplayList = displayLists.get(p1); + if (compilingDisplayList != null) { + compilingDisplayList.shaderMode = -1; + compilingDisplayList.listLength = 0; + isCompilingDisplayList = true; + } + } + } + + public static final void glEndList() { + if (isCompilingDisplayList) { + isCompilingDisplayList = false; + Object upload = _wGetLowLevelBuffersAppended(); + int l = _wArrayByteLength(upload); + if (l > 0) { + if (compilingDisplayList.glbuffer == null) { + displayListsInitialized.put(compilingDisplayList.id, compilingDisplayList); + compilingDisplayList.glarray = _wglCreateVertexArray(); + compilingDisplayList.glbuffer = _wglCreateBuffer(); + FixedFunctionShader f = FixedFunctionShader.instance(compilingDisplayList.shaderMode); + _wglBindVertexArray0(compilingDisplayList.glarray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer); + f.setupArrayForProgram(); + } + _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer); + _wglBufferData(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + bytesUploaded += l; + } + } + } + + public static final void glColor3f(float p1, float p2, float p3) { + colorR = p1; + colorG = p2; + colorB = p3; + colorA = 1.0f; + } + + public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + /* + * int pp2 = 0; switch(p3) { default: case GL_RGBA: pp2 = _wGL_RGBA; break; case + * GL_BGRA: pp2 = _wGL_BGRA; break; } int pp3 = 0; switch(p7) { default: case + * GL_RGBA: pp3 = _wGL_RGBA; break; case GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining() * 4; + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glTexImage2D_2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + bytesUploaded += p9.remaining() * 4; + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGB8, p4, p5, p6, _wGL_RGB, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + /* + * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case + * GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining() * 4; + _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glDeleteTextures(int p1) { + _wglDeleteTextures(texObjects.free(p1)); + } + + public static final void glPolygonOffset(float p1, float p2) { + _wglPolygonOffset(p1, p2); + } + + public static final void glCallLists(IntBuffer p1) { + while (p1.hasRemaining()) { + glCallList(p1.get()); + } + } + + public static final void glEnableVertexAttrib(int p1) { + switch (p1) { + case GL_COLOR_ARRAY: + enableColorArray = true; + break; + case GL_NORMAL_ARRAY: + enableNormalArray = true; + break; + case GL_TEXTURE_COORD_ARRAY: + enableTex0Array = true; + break; + default: + break; + } + } + + public static final void glDisableVertexAttrib(int p1) { + switch (p1) { + case GL_COLOR_ARRAY: + enableColorArray = false; + break; + case GL_NORMAL_ARRAY: + enableNormalArray = false; + break; + case GL_TEXTURE_COORD_ARRAY: + enableTex0Array = false; + break; + default: + break; + } + } + + private static final int getShaderModeFlag0() { + int mode = 0; + mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0)); + mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0)); + mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0)); + return mode; + } + + private static final int getShaderModeFlag1() { + int mode = 0; + mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0)); + mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0)); + mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0)); + mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0)); + return mode; + } + + private static final int getShaderModeFlag() { + int mode = 0; + mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0)); + mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0)); + mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0)); + mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0)); + mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0)); + mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0)); + mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0)); + return mode; + } + + private static FixedFunctionShader shader = null; + + private static final void bindTheShader() { + bindTheShader(getShaderModeFlag()); + } + + private static final void bindTheShader(int mode) { + FixedFunctionShader s = shader = FixedFunctionShader.instance(mode); + s.useProgram(); + if (enableAlphaTest) { + s.setAlphaTest(alphaThresh); + } + s.setColor(colorR, colorG, colorB, colorA); + if (fogEnabled) { + s.setFogMode((fogPremultiply ? 2 : 0) + fogMode); + s.setFogColor(fogColorR, fogColorG, fogColorB, fogColorA); + s.setFogDensity(fogDensity); + s.setFogStartEnd(fogStart, fogEnd); + } + s.setModelMatrix(matModelV[matModelPointer]); + s.setProjectionMatrix(matProjV[matProjPointer]); + s.setTextureMatrix(matTexV[matTexPointer]); + if (enableColorMaterial && enableLighting) { + s.setNormal(normalX, normalY, normalZ); + s.setLightPositions(lightPos0vec, lightPos1vec); + } + s.setTex0Coords(tex0X, tex0Y); + } + + private static Object blankUploadArray = _wCreateLowLevelIntBuffer(525000); + + public static final void glDrawArrays(int p1, int p2, int p3, Object buffer) { + if (isCompilingDisplayList) { + if (p1 == GL_QUADS) { + if (compilingDisplayList.shaderMode == -1) { + compilingDisplayList.shaderMode = getShaderModeFlag0(); + } else { + if (compilingDisplayList.shaderMode != getShaderModeFlag0()) { + System.err.println("vertex format inconsistent in display list"); + } + } + compilingDisplayList.listLength += p3; + _wAppendLowLevelBuffer(buffer); + } else { + System.err.println("only GL_QUADS supported in a display list"); + } + } else { + bytesUploaded += _wArrayByteLength(buffer); + vertexDrawn += p3; + + bindTheShader(); + + _wglBindVertexArray0(shader.genericArray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, shader.genericBuffer); + if (!shader.bufferIsInitialized) { + shader.bufferIsInitialized = true; + _wglBufferData(_wGL_ARRAY_BUFFER, blankUploadArray, _wGL_DYNAMIC_DRAW); + } + _wglBufferSubData(_wGL_ARRAY_BUFFER, 0, buffer); + + if (p1 == GL_QUADS) { + _wglDrawQuadArrays(p2, p3); + triangleDrawn += p3 / 2; + } else { + int drawMode = 0; + switch (p1) { + default: + case GL_TRIANGLES: + drawMode = _wGL_TRIANGLES; + triangleDrawn += p3 / 3; + break; + case GL_TRIANGLE_STRIP: + drawMode = _wGL_TRIANGLE_STRIP; + triangleDrawn += p3 - 2; + break; + case GL_TRIANGLE_FAN: + drawMode = _wGL_TRIANGLE_FAN; + triangleDrawn += p3 - 2; + break; + case GL_LINE_STRIP: + drawMode = _wGL_LINE_STRIP; + triangleDrawn += p3 - 1; + break; + case GL_LINES: + drawMode = _wGL_LINES; + triangleDrawn += p3 / 2; + break; + } + _wglDrawArrays(drawMode, p2, p3); + } + + shader.unuseProgram(); + + } + } + + private static final void _wglDrawQuadArrays(int p2, int p3) { + if (quadsToTrianglesBuffer == null) { + IntBuffer upload = isWebGL ? IntBuffer.wrap(new int[98400 / 2]) + : ByteBuffer.allocateDirect(98400 * 2).order(ByteOrder.nativeOrder()).asIntBuffer(); + for (int i = 0; i < 16384; ++i) { + int v1 = i * 4; + int v2 = i * 4 + 1; + int v3 = i * 4 + 2; + int v4 = i * 4 + 3; + upload.put(v1 | (v2 << 16)); + upload.put(v4 | (v2 << 16)); + upload.put(v3 | (v4 << 16)); + } + upload.flip(); + quadsToTrianglesBuffer = _wglCreateBuffer(); + _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer); + _wglBufferData0(_wGL_ELEMENT_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + } + if (!currentArray.isQuadBufferBound) { + currentArray.isQuadBufferBound = true; + _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer); + } + _wglDrawElements(_wGL_TRIANGLES, p3 * 6 / 4, _wGL_UNSIGNED_SHORT, p2 * 6 / 4); + } + + private static BufferArrayGL occlusion_vao = null; + private static BufferGL occlusion_vbo = null; + private static ProgramGL occlusion_program = null; + private static UniformGL occlusion_matrix_m = null; + private static UniformGL occlusion_matrix_p = null; + + private static final void initializeOcclusionObjects() { + occlusion_vao = _wglCreateVertexArray(); + occlusion_vbo = _wglCreateBuffer(); + + IntBuffer upload = (isWebGL ? IntBuffer.wrap(new int[108]) + : ByteBuffer.allocateDirect(108 << 2).order(ByteOrder.nativeOrder()).asIntBuffer()); + float[] verts = new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }; + for (int i = 0; i < verts.length; i++) { + upload.put(Float.floatToRawIntBits(verts[i])); + } + upload.flip(); + + _wglBindVertexArray(occlusion_vao); + _wglBindBuffer(_wGL_ARRAY_BUFFER, occlusion_vbo); + _wglBufferData0(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + _wglEnableVertexAttribArray(0); + _wglVertexAttribPointer(0, 3, _wGL_FLOAT, false, 12, 0); + + ShaderGL vert = _wglCreateShader(_wGL_VERTEX_SHADER); + ShaderGL frag = _wglCreateShader(_wGL_FRAGMENT_SHADER); + + String src = fileContents("/glsl/occl.glsl"); + _wglShaderSource(vert, _wgetShaderHeader() + "\n#define CC_VERT\n" + src); + _wglShaderSource(frag, _wgetShaderHeader() + "\n#define CC_FRAG\n" + src); + + _wglCompileShader(vert); + if (!_wglGetShaderCompiled(vert)) + System.err.println(("\n" + _wglGetShaderInfoLog(vert)).replace("\n", "\n[/glsl/occl.glsl][VERT] ") + "\n"); + + _wglCompileShader(frag); + if (!_wglGetShaderCompiled(frag)) + System.err.println(("\n" + _wglGetShaderInfoLog(frag)).replace("\n", "\n[/glsl/occl.glsl][FRAG] ") + "\n"); + + occlusion_program = _wglCreateProgram(); + + _wglAttachShader(occlusion_program, vert); + _wglAttachShader(occlusion_program, frag); + _wglLinkProgram(occlusion_program); + _wglDetachShader(occlusion_program, vert); + _wglDetachShader(occlusion_program, frag); + _wglDeleteShader(vert); + _wglDeleteShader(frag); + + if (!_wglGetProgramLinked(occlusion_program)) + System.err.println( + ("\n\n" + _wglGetProgramInfoLog(occlusion_program)).replace("\n", "\n[/glsl/occl.glsl][LINKER] ")); + + _wglUseProgram(occlusion_program); + occlusion_matrix_m = _wglGetUniformLocation(occlusion_program, "matrix_m"); + occlusion_matrix_p = _wglGetUniformLocation(occlusion_program, "matrix_p"); + + } + + private static final GLObjectMap queryObjs = new GLObjectMap(256); + + public static final int glCreateQuery() { + return queryObjs.register(_wglCreateQuery()); + } + + public static final void glBeginQuery(int obj) { + _wglBeginQuery(_wGL_ANY_SAMPLES_PASSED, queryObjs.get(obj)); + } + + public static final void glDeleteQuery(int obj) { + _wglDeleteQuery(queryObjs.free(obj)); + } + + private static final Matrix4f cachedOcclusionP = (Matrix4f) (new Matrix4f()).setZero(); + private static float[] occlusionModel = new float[16]; + private static float[] occlusionProj = new float[16]; + + public static final void glBindOcclusionBB() { + if (occlusion_vao == null) + initializeOcclusionObjects(); + _wglUseProgram(occlusion_program); + _wglBindVertexArray(occlusion_vao); + if (!cachedOcclusionP.equals(matProjV[matProjPointer])) { + cachedOcclusionP.load(matProjV[matProjPointer]); + cachedOcclusionP.store(occlusionProj); + _wglUniformMat4fv(occlusion_matrix_p, occlusionProj); + } + } + + public static final void glEndOcclusionBB() { + + } + + public static final void glDrawOcclusionBB(float posX, float posY, float posZ, float sizeX, float sizeY, + float sizeZ) { + glPushMatrix(); + glTranslatef(posX - sizeX * 0.01f, posY - sizeY * 0.01f, posZ - sizeZ * 0.01f); + glScalef(sizeX * 1.02f, sizeY * 1.02f, sizeZ * 1.02f); + matModelV[matModelPointer].store(occlusionModel); + _wglUniformMat4fv(occlusion_matrix_m, occlusionModel); + _wglDrawArrays(_wGL_TRIANGLES, 0, 36); + glPopMatrix(); + + } + + public static final void glEndQuery() { + _wglEndQuery(_wGL_ANY_SAMPLES_PASSED); + } + + public static final boolean glGetQueryResult(int obj) { + QueryGL q = queryObjs.get(obj); + return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT) > 0; + } + + public static final boolean glGetQueryResultAvailable(int obj) { + QueryGL q = queryObjs.get(obj); + return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT_AVAILABLE) > 0; + } + + public static final int glGenTextures() { + return texObjects.register(_wglGenTextures()); + } + + public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + ByteBuffer p9) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + /* + * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case + * GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining(); + _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glFogi(int p1, int p2) { + if (p1 == GL_FOG_MODE) { + switch (p2) { + default: + case GL_LINEAR: + fogMode = 1; + break; + case GL_EXP: + fogMode = 2; + break; + } + } + } + + public static final void glFogf(int p1, float p2) { + switch (p1) { + case GL_FOG_START: + fogStart = p2; + break; + case GL_FOG_END: + fogEnd = p2; + break; + case GL_FOG_DENSITY: + fogDensity = p2; + break; + default: + break; + } + } + + public static final void glFog(int p1, FloatBuffer p2) { + if (p1 == GL_FOG_COLOR) { + fogColorR = p2.get(); + fogColorG = p2.get(); + fogColorB = p2.get(); + fogColorA = p2.get(); + } + } + + public static final void glDeleteLists(int p1, int p2) { + for (int i = 0; i < p2; i++) { + DisplayList d = displayListsInitialized.remove(p1 + i); + if (d != null) { + _wglDeleteVertexArray(d.glarray); + _wglDeleteBuffer(d.glbuffer); + } + displayLists.remove(p1 + i); + } + } + + public static final void glMultiTexCoord2f(int p1, float p2, float p3) { + tex0X = p2; + tex0Y = p3; + } + + private static Matrix4f unprojA = new Matrix4f(); + private static Matrix4f unprojB = new Matrix4f(); + private static Vector4f unprojC = new Vector4f(); + + public static final void gluUnProject(float p1, float p2, float p3, FloatBuffer p4, FloatBuffer p5, int[] p6, + FloatBuffer p7) { + unprojA.load(p4); + unprojB.load(p5); + Matrix4f.mul(unprojA, unprojB, unprojB); + unprojB.invert(); + unprojC.set(((p1 - (float) p6[0]) / (float) p6[2]) * 2f - 1f, ((p2 - (float) p6[1]) / (float) p6[3]) * 2f - 1f, + p3, 1.0f); + Matrix4f.transform(unprojB, unprojC, unprojC); + p7.put(unprojC.x / unprojC.w); + p7.put(unprojC.y / unprojC.w); + p7.put(unprojC.z / unprojC.w); + } + + public static final void gluPerspective(float fovy, float aspect, float zNear, float zFar) { + Matrix4f res = getMatrix(); + float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f); + res.m00 = cotangent / aspect; + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = cotangent; + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = (zFar + zNear) / (zFar - zNear); + res.m23 = -1.0f; + res.m30 = 0.0f; + res.m31 = 0.0f; + res.m32 = 2.0f * zFar * zNear / (zFar - zNear); + res.m33 = 0.0f; + } + + public static final void gluPerspectiveFlat(float fovy, float aspect, float zNear, float zFar) { + Matrix4f res = getMatrix(); + float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f); + res.m00 = cotangent / aspect; + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = cotangent; + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = ((zFar + zNear) / (zFar - zNear)) * 0.001f; + res.m23 = -1.0f; + res.m30 = 0.0f; + res.m31 = 0.0f; + res.m32 = 2.0f * zFar * zNear / (zFar - zNear); + res.m33 = 0.0f; + } + + public static final String gluErrorString(int p1) { + switch (p1) { + case GL_INVALID_ENUM: + return "GL_INVALID_ENUM"; + case GL_INVALID_VALUE: + return "GL_INVALID_VALUE"; + case GL_INVALID_OPERATION: + return "GL_INVALID_OPERATION"; + case GL_OUT_OF_MEMORY: + return "GL_OUT_OF_MEMORY"; + case GL_CONTEXT_LOST_WEBGL: + return "CONTEXT_LOST_WEBGL"; + default: + return "Unknown Error"; + } + } + + private static long lastBandwidthReset = 0l; + private static int lastBandwidth = 0; + + public static final int getBitsPerSecond() { + if (System.currentTimeMillis() - lastBandwidthReset > 1000) { + lastBandwidthReset = System.currentTimeMillis(); + lastBandwidth = bytesUploaded * 8; + bytesUploaded = 0; + } + return lastBandwidth; + } + + public static final int getVertexesPerSecond() { + int ret = vertexDrawn; + vertexDrawn = 0; + return ret; + } + + public static final int getTrianglesPerSecond() { + int ret = triangleDrawn; + triangleDrawn = 0; + return ret; + } + +} \ No newline at end of file diff --git a/src/main/java/org/lwjgl/opengl/GL11.java b/src/main/java/org/lwjgl/opengl/GL11.java new file mode 100644 index 0000000..0205118 --- /dev/null +++ b/src/main/java/org/lwjgl/opengl/GL11.java @@ -0,0 +1,9 @@ +package org.lwjgl.opengl; + +public class GL11 extends EaglerAdapterGL30 { + + public static void glPixelStorei(int glUnpackAlignment, int i) { + webgl.pixelStorei(glUnpackAlignment, i); + } + +} diff --git a/src/main/java/org/lwjgl/opengl/GL12.java b/src/main/java/org/lwjgl/opengl/GL12.java new file mode 100644 index 0000000..4b04504 --- /dev/null +++ b/src/main/java/org/lwjgl/opengl/GL12.java @@ -0,0 +1,5 @@ +package org.lwjgl.opengl; + +public class GL12 extends GL11 { + +} diff --git a/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java b/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java new file mode 100644 index 0000000..75a633b --- /dev/null +++ b/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java @@ -0,0 +1,2417 @@ +package org.lwjgl.opengl; + +public class RealOpenGLEnums { + + // Field descriptor #544 I + public static final int GL_ACCUM = 256; + + // Field descriptor #544 I + public static final int GL_LOAD = 257; + + // Field descriptor #544 I + public static final int GL_RETURN = 258; + + // Field descriptor #544 I + public static final int GL_MULT = 259; + + // Field descriptor #544 I + public static final int GL_ADD = 260; + + // Field descriptor #544 I + public static final int GL_NEVER = 512; + + // Field descriptor #544 I + public static final int GL_LESS = 513; + + // Field descriptor #544 I + public static final int GL_EQUAL = 514; + + // Field descriptor #544 I + public static final int GL_LEQUAL = 515; + + // Field descriptor #544 I + public static final int GL_GREATER = 516; + + // Field descriptor #544 I + public static final int GL_NOTEQUAL = 517; + + // Field descriptor #544 I + public static final int GL_GEQUAL = 518; + + // Field descriptor #544 I + public static final int GL_ALWAYS = 519; + + // Field descriptor #544 I + public static final int GL_CURRENT_BIT = 1; + + // Field descriptor #544 I + public static final int GL_POINT_BIT = 2; + + // Field descriptor #544 I + public static final int GL_LINE_BIT = 4; + + // Field descriptor #544 I + public static final int GL_POLYGON_BIT = 8; + + // Field descriptor #544 I + public static final int GL_POLYGON_STIPPLE_BIT = 16; + + // Field descriptor #544 I + public static final int GL_PIXEL_MODE_BIT = 32; + + // Field descriptor #544 I + public static final int GL_LIGHTING_BIT = 64; + + // Field descriptor #544 I + public static final int GL_FOG_BIT = 128; + + // Field descriptor #544 I + public static final int GL_DEPTH_BUFFER_BIT = 256; + + // Field descriptor #544 I + public static final int GL_ACCUM_BUFFER_BIT = 512; + + // Field descriptor #544 I + public static final int GL_STENCIL_BUFFER_BIT = 1024; + + // Field descriptor #544 I + public static final int GL_VIEWPORT_BIT = 2048; + + // Field descriptor #544 I + public static final int GL_TRANSFORM_BIT = 4096; + + // Field descriptor #544 I + public static final int GL_ENABLE_BIT = 8192; + + // Field descriptor #544 I + public static final int GL_COLOR_BUFFER_BIT = 16384; + + // Field descriptor #544 I + public static final int GL_HINT_BIT = 32768; + + // Field descriptor #544 I + public static final int GL_EVAL_BIT = 65536; + + // Field descriptor #544 I + public static final int GL_LIST_BIT = 131072; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BIT = 262144; + + // Field descriptor #544 I + public static final int GL_SCISSOR_BIT = 524288; + + // Field descriptor #544 I + public static final int GL_ALL_ATTRIB_BITS = 1048575; + + // Field descriptor #544 I + public static final int GL_POINTS = 0; + + // Field descriptor #544 I + public static final int GL_LINES = 1; + + // Field descriptor #544 I + public static final int GL_LINE_LOOP = 2; + + // Field descriptor #544 I + public static final int GL_LINE_STRIP = 3; + + // Field descriptor #544 I + public static final int GL_TRIANGLES = 4; + + // Field descriptor #544 I + public static final int GL_TRIANGLE_STRIP = 5; + + // Field descriptor #544 I + public static final int GL_TRIANGLE_FAN = 6; + + // Field descriptor #544 I + public static final int GL_QUADS = 7; + + // Field descriptor #544 I + public static final int GL_QUAD_STRIP = 8; + + // Field descriptor #544 I + public static final int GL_POLYGON = 9; + + // Field descriptor #544 I + public static final int GL_ZERO = 0; + + // Field descriptor #544 I + public static final int GL_ONE = 1; + + // Field descriptor #544 I + public static final int GL_SRC_COLOR = 768; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_SRC_COLOR = 769; + + // Field descriptor #544 I + public static final int GL_SRC_ALPHA = 770; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_SRC_ALPHA = 771; + + // Field descriptor #544 I + public static final int GL_DST_ALPHA = 772; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_DST_ALPHA = 773; + + // Field descriptor #544 I + public static final int GL_DST_COLOR = 774; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_DST_COLOR = 775; + + // Field descriptor #544 I + public static final int GL_SRC_ALPHA_SATURATE = 776; + + // Field descriptor #544 I + public static final int GL_CONSTANT_COLOR = 32769; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_CONSTANT_COLOR = 32770; + + // Field descriptor #544 I + public static final int GL_CONSTANT_ALPHA = 32771; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_CONSTANT_ALPHA = 32772; + + // Field descriptor #544 I + public static final int GL_TRUE = 1; + + // Field descriptor #544 I + public static final int GL_FALSE = 0; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE0 = 12288; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE1 = 12289; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE2 = 12290; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE3 = 12291; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE4 = 12292; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE5 = 12293; + + // Field descriptor #544 I + public static final int GL_BYTE = 5120; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_BYTE = 5121; + + // Field descriptor #544 I + public static final int GL_SHORT = 5122; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_SHORT = 5123; + + // Field descriptor #544 I + public static final int GL_INT = 5124; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_INT = 5125; + + // Field descriptor #544 I + public static final int GL_FLOAT = 5126; + + // Field descriptor #544 I + public static final int GL_2_BYTES = 5127; + + // Field descriptor #544 I + public static final int GL_3_BYTES = 5128; + + // Field descriptor #544 I + public static final int GL_4_BYTES = 5129; + + // Field descriptor #544 I + public static final int GL_DOUBLE = 5130; + + // Field descriptor #544 I + public static final int GL_NONE = 0; + + // Field descriptor #544 I + public static final int GL_FRONT_LEFT = 1024; + + // Field descriptor #544 I + public static final int GL_FRONT_RIGHT = 1025; + + // Field descriptor #544 I + public static final int GL_BACK_LEFT = 1026; + + // Field descriptor #544 I + public static final int GL_BACK_RIGHT = 1027; + + // Field descriptor #544 I + public static final int GL_FRONT = 1028; + + // Field descriptor #544 I + public static final int GL_BACK = 1029; + + // Field descriptor #544 I + public static final int GL_LEFT = 1030; + + // Field descriptor #544 I + public static final int GL_RIGHT = 1031; + + // Field descriptor #544 I + public static final int GL_FRONT_AND_BACK = 1032; + + // Field descriptor #544 I + public static final int GL_AUX0 = 1033; + + // Field descriptor #544 I + public static final int GL_AUX1 = 1034; + + // Field descriptor #544 I + public static final int GL_AUX2 = 1035; + + // Field descriptor #544 I + public static final int GL_AUX3 = 1036; + + // Field descriptor #544 I + public static final int GL_NO_ERROR = 0; + + // Field descriptor #544 I + public static final int GL_INVALID_ENUM = 1280; + + // Field descriptor #544 I + public static final int GL_INVALID_VALUE = 1281; + + // Field descriptor #544 I + public static final int GL_INVALID_OPERATION = 1282; + + // Field descriptor #544 I + public static final int GL_STACK_OVERFLOW = 1283; + + // Field descriptor #544 I + public static final int GL_STACK_UNDERFLOW = 1284; + + // Field descriptor #544 I + public static final int GL_OUT_OF_MEMORY = 1285; + + // Field descriptor #544 I + public static final int GL_2D = 1536; + + // Field descriptor #544 I + public static final int GL_3D = 1537; + + // Field descriptor #544 I + public static final int GL_3D_COLOR = 1538; + + // Field descriptor #544 I + public static final int GL_3D_COLOR_TEXTURE = 1539; + + // Field descriptor #544 I + public static final int GL_4D_COLOR_TEXTURE = 1540; + + // Field descriptor #544 I + public static final int GL_PASS_THROUGH_TOKEN = 1792; + + // Field descriptor #544 I + public static final int GL_POINT_TOKEN = 1793; + + // Field descriptor #544 I + public static final int GL_LINE_TOKEN = 1794; + + // Field descriptor #544 I + public static final int GL_POLYGON_TOKEN = 1795; + + // Field descriptor #544 I + public static final int GL_BITMAP_TOKEN = 1796; + + // Field descriptor #544 I + public static final int GL_DRAW_PIXEL_TOKEN = 1797; + + // Field descriptor #544 I + public static final int GL_COPY_PIXEL_TOKEN = 1798; + + // Field descriptor #544 I + public static final int GL_LINE_RESET_TOKEN = 1799; + + // Field descriptor #544 I + public static final int GL_EXP = 2048; + + // Field descriptor #544 I + public static final int GL_EXP2 = 2049; + + // Field descriptor #544 I + public static final int GL_CW = 2304; + + // Field descriptor #544 I + public static final int GL_CCW = 2305; + + // Field descriptor #544 I + public static final int GL_COEFF = 2560; + + // Field descriptor #544 I + public static final int GL_ORDER = 2561; + + // Field descriptor #544 I + public static final int GL_DOMAIN = 2562; + + // Field descriptor #544 I + public static final int GL_CURRENT_COLOR = 2816; + + // Field descriptor #544 I + public static final int GL_CURRENT_INDEX = 2817; + + // Field descriptor #544 I + public static final int GL_CURRENT_NORMAL = 2818; + + // Field descriptor #544 I + public static final int GL_CURRENT_TEXTURE_COORDS = 2819; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_COLOR = 2820; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_INDEX = 2821; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_TEXTURE_COORDS = 2822; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_POSITION = 2823; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_POSITION_VALID = 2824; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_DISTANCE = 2825; + + // Field descriptor #544 I + public static final int GL_POINT_SMOOTH = 2832; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE = 2833; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE_RANGE = 2834; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE_GRANULARITY = 2835; + + // Field descriptor #544 I + public static final int GL_LINE_SMOOTH = 2848; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH = 2849; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH_RANGE = 2850; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH_GRANULARITY = 2851; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE = 2852; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE_PATTERN = 2853; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE_REPEAT = 2854; + + // Field descriptor #544 I + public static final int GL_LIST_MODE = 2864; + + // Field descriptor #544 I + public static final int GL_MAX_LIST_NESTING = 2865; + + // Field descriptor #544 I + public static final int GL_LIST_BASE = 2866; + + // Field descriptor #544 I + public static final int GL_LIST_INDEX = 2867; + + // Field descriptor #544 I + public static final int GL_POLYGON_MODE = 2880; + + // Field descriptor #544 I + public static final int GL_POLYGON_SMOOTH = 2881; + + // Field descriptor #544 I + public static final int GL_POLYGON_STIPPLE = 2882; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG = 2883; + + // Field descriptor #544 I + public static final int GL_CULL_FACE = 2884; + + // Field descriptor #544 I + public static final int GL_CULL_FACE_MODE = 2885; + + // Field descriptor #544 I + public static final int GL_FRONT_FACE = 2886; + + // Field descriptor #544 I + public static final int GL_LIGHTING = 2896; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_LOCAL_VIEWER = 2897; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_TWO_SIDE = 2898; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_AMBIENT = 2899; + + // Field descriptor #544 I + public static final int GL_SHADE_MODEL = 2900; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL_FACE = 2901; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL_PARAMETER = 2902; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL = 2903; + + // Field descriptor #544 I + public static final int GL_FOG = 2912; + + // Field descriptor #544 I + public static final int GL_FOG_INDEX = 2913; + + // Field descriptor #544 I + public static final int GL_FOG_DENSITY = 2914; + + // Field descriptor #544 I + public static final int GL_FOG_START = 2915; + + // Field descriptor #544 I + public static final int GL_FOG_END = 2916; + + // Field descriptor #544 I + public static final int GL_FOG_MODE = 2917; + + // Field descriptor #544 I + public static final int GL_FOG_COLOR = 2918; + + // Field descriptor #544 I + public static final int GL_DEPTH_RANGE = 2928; + + // Field descriptor #544 I + public static final int GL_DEPTH_TEST = 2929; + + // Field descriptor #544 I + public static final int GL_DEPTH_WRITEMASK = 2930; + + // Field descriptor #544 I + public static final int GL_DEPTH_CLEAR_VALUE = 2931; + + // Field descriptor #544 I + public static final int GL_DEPTH_FUNC = 2932; + + // Field descriptor #544 I + public static final int GL_ACCUM_CLEAR_VALUE = 2944; + + // Field descriptor #544 I + public static final int GL_STENCIL_TEST = 2960; + + // Field descriptor #544 I + public static final int GL_STENCIL_CLEAR_VALUE = 2961; + + // Field descriptor #544 I + public static final int GL_STENCIL_FUNC = 2962; + + // Field descriptor #544 I + public static final int GL_STENCIL_VALUE_MASK = 2963; + + // Field descriptor #544 I + public static final int GL_STENCIL_FAIL = 2964; + + // Field descriptor #544 I + public static final int GL_STENCIL_PASS_DEPTH_FAIL = 2965; + + // Field descriptor #544 I + public static final int GL_STENCIL_PASS_DEPTH_PASS = 2966; + + // Field descriptor #544 I + public static final int GL_STENCIL_REF = 2967; + + // Field descriptor #544 I + public static final int GL_STENCIL_WRITEMASK = 2968; + + // Field descriptor #544 I + public static final int GL_MATRIX_MODE = 2976; + + // Field descriptor #544 I + public static final int GL_NORMALIZE = 2977; + + // Field descriptor #544 I + public static final int GL_VIEWPORT = 2978; + + // Field descriptor #544 I + public static final int GL_MODELVIEW_STACK_DEPTH = 2979; + + // Field descriptor #544 I + public static final int GL_PROJECTION_STACK_DEPTH = 2980; + + // Field descriptor #544 I + public static final int GL_TEXTURE_STACK_DEPTH = 2981; + + // Field descriptor #544 I + public static final int GL_MODELVIEW_MATRIX = 2982; + + // Field descriptor #544 I + public static final int GL_PROJECTION_MATRIX = 2983; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MATRIX = 2984; + + // Field descriptor #544 I + public static final int GL_ATTRIB_STACK_DEPTH = 2992; + + // Field descriptor #544 I + public static final int GL_CLIENT_ATTRIB_STACK_DEPTH = 2993; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST = 3008; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST_FUNC = 3009; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST_REF = 3010; + + // Field descriptor #544 I + public static final int GL_DITHER = 3024; + + // Field descriptor #544 I + public static final int GL_BLEND_DST = 3040; + + // Field descriptor #544 I + public static final int GL_BLEND_SRC = 3041; + + // Field descriptor #544 I + public static final int GL_BLEND = 3042; + + // Field descriptor #544 I + public static final int GL_LOGIC_OP_MODE = 3056; + + // Field descriptor #544 I + public static final int GL_INDEX_LOGIC_OP = 3057; + + // Field descriptor #544 I + public static final int GL_COLOR_LOGIC_OP = 3058; + + // Field descriptor #544 I + public static final int GL_AUX_BUFFERS = 3072; + + // Field descriptor #544 I + public static final int GL_DRAW_BUFFER = 3073; + + // Field descriptor #544 I + public static final int GL_READ_BUFFER = 3074; + + // Field descriptor #544 I + public static final int GL_SCISSOR_BOX = 3088; + + // Field descriptor #544 I + public static final int GL_SCISSOR_TEST = 3089; + + // Field descriptor #544 I + public static final int GL_INDEX_CLEAR_VALUE = 3104; + + // Field descriptor #544 I + public static final int GL_INDEX_WRITEMASK = 3105; + + // Field descriptor #544 I + public static final int GL_COLOR_CLEAR_VALUE = 3106; + + // Field descriptor #544 I + public static final int GL_COLOR_WRITEMASK = 3107; + + // Field descriptor #544 I + public static final int GL_INDEX_MODE = 3120; + + // Field descriptor #544 I + public static final int GL_RGBA_MODE = 3121; + + // Field descriptor #544 I + public static final int GL_DOUBLEBUFFER = 3122; + + // Field descriptor #544 I + public static final int GL_STEREO = 3123; + + // Field descriptor #544 I + public static final int GL_RENDER_MODE = 3136; + + // Field descriptor #544 I + public static final int GL_PERSPECTIVE_CORRECTION_HINT = 3152; + + // Field descriptor #544 I + public static final int GL_POINT_SMOOTH_HINT = 3153; + + // Field descriptor #544 I + public static final int GL_LINE_SMOOTH_HINT = 3154; + + // Field descriptor #544 I + public static final int GL_POLYGON_SMOOTH_HINT = 3155; + + // Field descriptor #544 I + public static final int GL_FOG_HINT = 3156; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_S = 3168; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_T = 3169; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_R = 3170; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_Q = 3171; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_I = 3184; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_S_TO_S = 3185; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_R = 3186; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_G = 3187; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_B = 3188; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_A = 3189; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_R_TO_R = 3190; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_G_TO_G = 3191; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_B_TO_B = 3192; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_A_TO_A = 3193; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_I_SIZE = 3248; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_S_TO_S_SIZE = 3249; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_R_SIZE = 3250; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_G_SIZE = 3251; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_B_SIZE = 3252; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_A_SIZE = 3253; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_R_TO_R_SIZE = 3254; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_G_TO_G_SIZE = 3255; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_B_TO_B_SIZE = 3256; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_A_TO_A_SIZE = 3257; + + // Field descriptor #544 I + public static final int GL_UNPACK_SWAP_BYTES = 3312; + + // Field descriptor #544 I + public static final int GL_UNPACK_LSB_FIRST = 3313; + + // Field descriptor #544 I + public static final int GL_UNPACK_ROW_LENGTH = 3314; + + // Field descriptor #544 I + public static final int GL_UNPACK_SKIP_ROWS = 3315; + + // Field descriptor #544 I + public static final int GL_UNPACK_SKIP_PIXELS = 3316; + + // Field descriptor #544 I + public static final int GL_UNPACK_ALIGNMENT = 3317; + + // Field descriptor #544 I + public static final int GL_PACK_SWAP_BYTES = 3328; + + // Field descriptor #544 I + public static final int GL_PACK_LSB_FIRST = 3329; + + // Field descriptor #544 I + public static final int GL_PACK_ROW_LENGTH = 3330; + + // Field descriptor #544 I + public static final int GL_PACK_SKIP_ROWS = 3331; + + // Field descriptor #544 I + public static final int GL_PACK_SKIP_PIXELS = 3332; + + // Field descriptor #544 I + public static final int GL_PACK_ALIGNMENT = 3333; + + // Field descriptor #544 I + public static final int GL_MAP_COLOR = 3344; + + // Field descriptor #544 I + public static final int GL_MAP_STENCIL = 3345; + + // Field descriptor #544 I + public static final int GL_INDEX_SHIFT = 3346; + + // Field descriptor #544 I + public static final int GL_INDEX_OFFSET = 3347; + + // Field descriptor #544 I + public static final int GL_RED_SCALE = 3348; + + // Field descriptor #544 I + public static final int GL_RED_BIAS = 3349; + + // Field descriptor #544 I + public static final int GL_ZOOM_X = 3350; + + // Field descriptor #544 I + public static final int GL_ZOOM_Y = 3351; + + // Field descriptor #544 I + public static final int GL_GREEN_SCALE = 3352; + + // Field descriptor #544 I + public static final int GL_GREEN_BIAS = 3353; + + // Field descriptor #544 I + public static final int GL_BLUE_SCALE = 3354; + + // Field descriptor #544 I + public static final int GL_BLUE_BIAS = 3355; + + // Field descriptor #544 I + public static final int GL_ALPHA_SCALE = 3356; + + // Field descriptor #544 I + public static final int GL_ALPHA_BIAS = 3357; + + // Field descriptor #544 I + public static final int GL_DEPTH_SCALE = 3358; + + // Field descriptor #544 I + public static final int GL_DEPTH_BIAS = 3359; + + // Field descriptor #544 I + public static final int GL_MAX_EVAL_ORDER = 3376; + + // Field descriptor #544 I + public static final int GL_MAX_LIGHTS = 3377; + + // Field descriptor #544 I + public static final int GL_MAX_CLIP_PLANES = 3378; + + // Field descriptor #544 I + public static final int GL_MAX_TEXTURE_SIZE = 3379; + + // Field descriptor #544 I + public static final int GL_MAX_PIXEL_MAP_TABLE = 3380; + + // Field descriptor #544 I + public static final int GL_MAX_ATTRIB_STACK_DEPTH = 3381; + + // Field descriptor #544 I + public static final int GL_MAX_MODELVIEW_STACK_DEPTH = 3382; + + // Field descriptor #544 I + public static final int GL_MAX_NAME_STACK_DEPTH = 3383; + + // Field descriptor #544 I + public static final int GL_MAX_PROJECTION_STACK_DEPTH = 3384; + + // Field descriptor #544 I + public static final int GL_MAX_TEXTURE_STACK_DEPTH = 3385; + + // Field descriptor #544 I + public static final int GL_MAX_VIEWPORT_DIMS = 3386; + + // Field descriptor #544 I + public static final int GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 3387; + + // Field descriptor #544 I + public static final int GL_SUBPIXEL_BITS = 3408; + + // Field descriptor #544 I + public static final int GL_INDEX_BITS = 3409; + + // Field descriptor #544 I + public static final int GL_RED_BITS = 3410; + + // Field descriptor #544 I + public static final int GL_GREEN_BITS = 3411; + + // Field descriptor #544 I + public static final int GL_BLUE_BITS = 3412; + + // Field descriptor #544 I + public static final int GL_ALPHA_BITS = 3413; + + // Field descriptor #544 I + public static final int GL_DEPTH_BITS = 3414; + + // Field descriptor #544 I + public static final int GL_STENCIL_BITS = 3415; + + // Field descriptor #544 I + public static final int GL_ACCUM_RED_BITS = 3416; + + // Field descriptor #544 I + public static final int GL_ACCUM_GREEN_BITS = 3417; + + // Field descriptor #544 I + public static final int GL_ACCUM_BLUE_BITS = 3418; + + // Field descriptor #544 I + public static final int GL_ACCUM_ALPHA_BITS = 3419; + + // Field descriptor #544 I + public static final int GL_NAME_STACK_DEPTH = 3440; + + // Field descriptor #544 I + public static final int GL_AUTO_NORMAL = 3456; + + // Field descriptor #544 I + public static final int GL_MAP1_COLOR_4 = 3472; + + // Field descriptor #544 I + public static final int GL_MAP1_INDEX = 3473; + + // Field descriptor #544 I + public static final int GL_MAP1_NORMAL = 3474; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_1 = 3475; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_2 = 3476; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_3 = 3477; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_4 = 3478; + + // Field descriptor #544 I + public static final int GL_MAP1_VERTEX_3 = 3479; + + // Field descriptor #544 I + public static final int GL_MAP1_VERTEX_4 = 3480; + + // Field descriptor #544 I + public static final int GL_MAP2_COLOR_4 = 3504; + + // Field descriptor #544 I + public static final int GL_MAP2_INDEX = 3505; + + // Field descriptor #544 I + public static final int GL_MAP2_NORMAL = 3506; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_1 = 3507; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_2 = 3508; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_3 = 3509; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_4 = 3510; + + // Field descriptor #544 I + public static final int GL_MAP2_VERTEX_3 = 3511; + + // Field descriptor #544 I + public static final int GL_MAP2_VERTEX_4 = 3512; + + // Field descriptor #544 I + public static final int GL_MAP1_GRID_DOMAIN = 3536; + + // Field descriptor #544 I + public static final int GL_MAP1_GRID_SEGMENTS = 3537; + + // Field descriptor #544 I + public static final int GL_MAP2_GRID_DOMAIN = 3538; + + // Field descriptor #544 I + public static final int GL_MAP2_GRID_SEGMENTS = 3539; + + // Field descriptor #544 I + public static final int GL_TEXTURE_1D = 3552; + + // Field descriptor #544 I + public static final int GL_TEXTURE_2D = 3553; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_POINTER = 3568; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_SIZE = 3569; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_TYPE = 3570; + + // Field descriptor #544 I + public static final int GL_SELECTION_BUFFER_POINTER = 3571; + + // Field descriptor #544 I + public static final int GL_SELECTION_BUFFER_SIZE = 3572; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WIDTH = 4096; + + // Field descriptor #544 I + public static final int GL_TEXTURE_HEIGHT = 4097; + + // Field descriptor #544 I + public static final int GL_TEXTURE_INTERNAL_FORMAT = 4099; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BORDER_COLOR = 4100; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BORDER = 4101; + + // Field descriptor #544 I + public static final int GL_DONT_CARE = 4352; + + // Field descriptor #544 I + public static final int GL_FASTEST = 4353; + + // Field descriptor #544 I + public static final int GL_NICEST = 4354; + + // Field descriptor #544 I + public static final int GL_LIGHT0 = 16384; + + // Field descriptor #544 I + public static final int GL_LIGHT1 = 16385; + + // Field descriptor #544 I + public static final int GL_LIGHT2 = 16386; + + // Field descriptor #544 I + public static final int GL_LIGHT3 = 16387; + + // Field descriptor #544 I + public static final int GL_LIGHT4 = 16388; + + // Field descriptor #544 I + public static final int GL_LIGHT5 = 16389; + + // Field descriptor #544 I + public static final int GL_LIGHT6 = 16390; + + // Field descriptor #544 I + public static final int GL_LIGHT7 = 16391; + + // Field descriptor #544 I + public static final int GL_AMBIENT = 4608; + + // Field descriptor #544 I + public static final int GL_DIFFUSE = 4609; + + // Field descriptor #544 I + public static final int GL_SPECULAR = 4610; + + // Field descriptor #544 I + public static final int GL_POSITION = 4611; + + // Field descriptor #544 I + public static final int GL_SPOT_DIRECTION = 4612; + + // Field descriptor #544 I + public static final int GL_SPOT_EXPONENT = 4613; + + // Field descriptor #544 I + public static final int GL_SPOT_CUTOFF = 4614; + + // Field descriptor #544 I + public static final int GL_CONSTANT_ATTENUATION = 4615; + + // Field descriptor #544 I + public static final int GL_LINEAR_ATTENUATION = 4616; + + // Field descriptor #544 I + public static final int GL_QUADRATIC_ATTENUATION = 4617; + + // Field descriptor #544 I + public static final int GL_COMPILE = 4864; + + // Field descriptor #544 I + public static final int GL_COMPILE_AND_EXECUTE = 4865; + + // Field descriptor #544 I + public static final int GL_CLEAR = 5376; + + // Field descriptor #544 I + public static final int GL_AND = 5377; + + // Field descriptor #544 I + public static final int GL_AND_REVERSE = 5378; + + // Field descriptor #544 I + public static final int GL_COPY = 5379; + + // Field descriptor #544 I + public static final int GL_AND_INVERTED = 5380; + + // Field descriptor #544 I + public static final int GL_NOOP = 5381; + + // Field descriptor #544 I + public static final int GL_XOR = 5382; + + // Field descriptor #544 I + public static final int GL_OR = 5383; + + // Field descriptor #544 I + public static final int GL_NOR = 5384; + + // Field descriptor #544 I + public static final int GL_EQUIV = 5385; + + // Field descriptor #544 I + public static final int GL_INVERT = 5386; + + // Field descriptor #544 I + public static final int GL_OR_REVERSE = 5387; + + // Field descriptor #544 I + public static final int GL_COPY_INVERTED = 5388; + + // Field descriptor #544 I + public static final int GL_OR_INVERTED = 5389; + + // Field descriptor #544 I + public static final int GL_NAND = 5390; + + // Field descriptor #544 I + public static final int GL_SET = 5391; + + // Field descriptor #544 I + public static final int GL_EMISSION = 5632; + + // Field descriptor #544 I + public static final int GL_SHININESS = 5633; + + // Field descriptor #544 I + public static final int GL_AMBIENT_AND_DIFFUSE = 5634; + + // Field descriptor #544 I + public static final int GL_COLOR_INDEXES = 5635; + + // Field descriptor #544 I + public static final int GL_MODELVIEW = 5888; + + // Field descriptor #544 I + public static final int GL_PROJECTION = 5889; + + // Field descriptor #544 I + public static final int GL_TEXTURE = 5890; + + // Field descriptor #544 I + public static final int GL_COLOR = 6144; + + // Field descriptor #544 I + public static final int GL_DEPTH = 6145; + + // Field descriptor #544 I + public static final int GL_STENCIL = 6146; + + // Field descriptor #544 I + public static final int GL_COLOR_INDEX = 6400; + + // Field descriptor #544 I + public static final int GL_STENCIL_INDEX = 6401; + + // Field descriptor #544 I + public static final int GL_DEPTH_COMPONENT = 6402; + + // Field descriptor #544 I + public static final int GL_RED = 6403; + + // Field descriptor #544 I + public static final int GL_GREEN = 6404; + + // Field descriptor #544 I + public static final int GL_BLUE = 6405; + + // Field descriptor #544 I + public static final int GL_ALPHA = 6406; + + // Field descriptor #544 I + public static final int GL_RGB = 6407; + + // Field descriptor #544 I + public static final int GL_RGBA = 6408; + + // Field descriptor #544 I + public static final int GL_LUMINANCE = 6409; + + // Field descriptor #544 I + public static final int GL_LUMINANCE_ALPHA = 6410; + + // Field descriptor #544 I + public static final int GL_BITMAP = 6656; + + // Field descriptor #544 I + public static final int GL_POINT = 6912; + + // Field descriptor #544 I + public static final int GL_LINE = 6913; + + // Field descriptor #544 I + public static final int GL_FILL = 6914; + + // Field descriptor #544 I + public static final int GL_RENDER = 7168; + + // Field descriptor #544 I + public static final int GL_FEEDBACK = 7169; + + // Field descriptor #544 I + public static final int GL_SELECT = 7170; + + // Field descriptor #544 I + public static final int GL_FLAT = 7424; + + // Field descriptor #544 I + public static final int GL_SMOOTH = 7425; + + // Field descriptor #544 I + public static final int GL_KEEP = 7680; + + // Field descriptor #544 I + public static final int GL_REPLACE = 7681; + + // Field descriptor #544 I + public static final int GL_INCR = 7682; + + // Field descriptor #544 I + public static final int GL_DECR = 7683; + + // Field descriptor #544 I + public static final int GL_VENDOR = 7936; + + // Field descriptor #544 I + public static final int GL_RENDERER = 7937; + + // Field descriptor #544 I + public static final int GL_VERSION = 7938; + + // Field descriptor #544 I + public static final int GL_EXTENSIONS = 7939; + + // Field descriptor #544 I + public static final int GL_S = 8192; + + // Field descriptor #544 I + public static final int GL_T = 8193; + + // Field descriptor #544 I + public static final int GL_R = 8194; + + // Field descriptor #544 I + public static final int GL_Q = 8195; + + // Field descriptor #544 I + public static final int GL_MODULATE = 8448; + + // Field descriptor #544 I + public static final int GL_DECAL = 8449; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV_MODE = 8704; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV_COLOR = 8705; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV = 8960; + + // Field descriptor #544 I + public static final int GL_EYE_LINEAR = 9216; + + // Field descriptor #544 I + public static final int GL_OBJECT_LINEAR = 9217; + + // Field descriptor #544 I + public static final int GL_SPHERE_MAP = 9218; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_MODE = 9472; + + // Field descriptor #544 I + public static final int GL_OBJECT_PLANE = 9473; + + // Field descriptor #544 I + public static final int GL_EYE_PLANE = 9474; + + // Field descriptor #544 I + public static final int GL_NEAREST = 9728; + + // Field descriptor #544 I + public static final int GL_LINEAR = 9729; + + // Field descriptor #544 I + public static final int GL_NEAREST_MIPMAP_NEAREST = 9984; + + // Field descriptor #544 I + public static final int GL_LINEAR_MIPMAP_NEAREST = 9985; + + // Field descriptor #544 I + public static final int GL_NEAREST_MIPMAP_LINEAR = 9986; + + // Field descriptor #544 I + public static final int GL_LINEAR_MIPMAP_LINEAR = 9987; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MAG_FILTER = 10240; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MIN_FILTER = 10241; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WRAP_S = 10242; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WRAP_T = 10243; + + // Field descriptor #544 I + public static final int GL_CLAMP = 10496; + + // Field descriptor #544 I + public static final int GL_REPEAT = 10497; + + // Field descriptor #544 I + public static final int GL_CLIENT_PIXEL_STORE_BIT = 1; + + // Field descriptor #544 I + public static final int GL_CLIENT_VERTEX_ARRAY_BIT = 2; + + // Field descriptor #544 I + public static final int GL_ALL_CLIENT_ATTRIB_BITS = -1; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_FACTOR = 32824; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_UNITS = 10752; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_POINT = 10753; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_LINE = 10754; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_FILL = 32823; + + // Field descriptor #544 I + public static final int GL_ALPHA4 = 32827; + + // Field descriptor #544 I + public static final int GL_ALPHA8 = 32828; + + // Field descriptor #544 I + public static final int GL_ALPHA12 = 32829; + + // Field descriptor #544 I + public static final int GL_ALPHA16 = 32830; + + // Field descriptor #544 I + public static final int GL_LUMINANCE4 = 32831; + + // Field descriptor #544 I + public static final int GL_LUMINANCE8 = 32832; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12 = 32833; + + // Field descriptor #544 I + public static final int GL_LUMINANCE16 = 32834; + + // Field descriptor #544 I + public static final int GL_LUMINANCE4_ALPHA4 = 32835; + + // Field descriptor #544 I + public static final int GL_LUMINANCE6_ALPHA2 = 32836; + + // Field descriptor #544 I + public static final int GL_LUMINANCE8_ALPHA8 = 32837; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12_ALPHA4 = 32838; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12_ALPHA12 = 32839; + + // Field descriptor #544 I + public static final int GL_LUMINANCE16_ALPHA16 = 32840; + + // Field descriptor #544 I + public static final int GL_INTENSITY = 32841; + + // Field descriptor #544 I + public static final int GL_INTENSITY4 = 32842; + + // Field descriptor #544 I + public static final int GL_INTENSITY8 = 32843; + + // Field descriptor #544 I + public static final int GL_INTENSITY12 = 32844; + + // Field descriptor #544 I + public static final int GL_INTENSITY16 = 32845; + + // Field descriptor #544 I + public static final int GL_R3_G3_B2 = 10768; + + // Field descriptor #544 I + public static final int GL_RGB4 = 32847; + + // Field descriptor #544 I + public static final int GL_RGB5 = 32848; + + // Field descriptor #544 I + public static final int GL_RGB8 = 32849; + + // Field descriptor #544 I + public static final int GL_RGB10 = 32850; + + // Field descriptor #544 I + public static final int GL_RGB12 = 32851; + + // Field descriptor #544 I + public static final int GL_RGB16 = 32852; + + // Field descriptor #544 I + public static final int GL_RGBA2 = 32853; + + // Field descriptor #544 I + public static final int GL_RGBA4 = 32854; + + // Field descriptor #544 I + public static final int GL_RGB5_A1 = 32855; + + // Field descriptor #544 I + public static final int GL_RGBA8 = 32856; + + // Field descriptor #544 I + public static final int GL_RGB10_A2 = 32857; + + // Field descriptor #544 I + public static final int GL_RGBA12 = 32858; + + // Field descriptor #544 I + public static final int GL_RGBA16 = 32859; + + // Field descriptor #544 I + public static final int GL_TEXTURE_RED_SIZE = 32860; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GREEN_SIZE = 32861; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BLUE_SIZE = 32862; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ALPHA_SIZE = 32863; + + // Field descriptor #544 I + public static final int GL_TEXTURE_LUMINANCE_SIZE = 32864; + + // Field descriptor #544 I + public static final int GL_TEXTURE_INTENSITY_SIZE = 32865; + + // Field descriptor #544 I + public static final int GL_PROXY_TEXTURE_1D = 32867; + + // Field descriptor #544 I + public static final int GL_PROXY_TEXTURE_2D = 32868; + + // Field descriptor #544 I + public static final int GL_TEXTURE_PRIORITY = 32870; + + // Field descriptor #544 I + public static final int GL_TEXTURE_RESIDENT = 32871; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BINDING_1D = 32872; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BINDING_2D = 32873; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY = 32884; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY = 32885; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY = 32886; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY = 32887; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY = 32888; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY = 32889; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_SIZE = 32890; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_TYPE = 32891; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_STRIDE = 32892; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_TYPE = 32894; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_STRIDE = 32895; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_SIZE = 32897; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_TYPE = 32898; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_STRIDE = 32899; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_TYPE = 32901; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_STRIDE = 32902; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_SIZE = 32904; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_TYPE = 32905; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_STRIDE = 32906; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY_STRIDE = 32908; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_POINTER = 32910; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_POINTER = 32911; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_POINTER = 32912; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_POINTER = 32913; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_POINTER = 32914; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY_POINTER = 32915; + + // Field descriptor #544 I + public static final int GL_V2F = 10784; + + // Field descriptor #544 I + public static final int GL_V3F = 10785; + + // Field descriptor #544 I + public static final int GL_C4UB_V2F = 10786; + + // Field descriptor #544 I + public static final int GL_C4UB_V3F = 10787; + + // Field descriptor #544 I + public static final int GL_C3F_V3F = 10788; + + // Field descriptor #544 I + public static final int GL_N3F_V3F = 10789; + + // Field descriptor #544 I + public static final int GL_C4F_N3F_V3F = 10790; + + // Field descriptor #544 I + public static final int GL_T2F_V3F = 10791; + + // Field descriptor #544 I + public static final int GL_T4F_V4F = 10792; + + // Field descriptor #544 I + public static final int GL_T2F_C4UB_V3F = 10793; + + // Field descriptor #544 I + public static final int GL_T2F_C3F_V3F = 10794; + + // Field descriptor #544 I + public static final int GL_T2F_N3F_V3F = 10795; + + // Field descriptor #544 I + public static final int GL_T2F_C4F_N3F_V3F = 10796; + + // Field descriptor #544 I + public static final int GL_T4F_C4F_N3F_V4F = 10797; + + // Field descriptor #544 I + public static final int GL_LOGIC_OP = 3057; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COMPONENTS = 4099; + + // Field descriptor #45 I + public static final int GL_TEXTURE_BINDING_3D = 32874; + + // Field descriptor #45 I + public static final int GL_PACK_SKIP_IMAGES = 32875; + + // Field descriptor #45 I + public static final int GL_PACK_IMAGE_HEIGHT = 32876; + + // Field descriptor #45 I + public static final int GL_UNPACK_SKIP_IMAGES = 32877; + + // Field descriptor #45 I + public static final int GL_UNPACK_IMAGE_HEIGHT = 32878; + + // Field descriptor #45 I + public static final int GL_TEXTURE_3D = 32879; + + // Field descriptor #45 I + public static final int GL_PROXY_TEXTURE_3D = 32880; + + // Field descriptor #45 I + public static final int GL_TEXTURE_DEPTH = 32881; + + // Field descriptor #45 I + public static final int GL_TEXTURE_WRAP_R = 32882; + + // Field descriptor #45 I + public static final int GL_MAX_3D_TEXTURE_SIZE = 32883; + + // Field descriptor #45 I + public static final int GL_BGR = 32992; + + // Field descriptor #45 I + public static final int GL_BGRA = 32993; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_BYTE_3_3_2 = 32818; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_BYTE_2_3_3_REV = 33634; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_6_5 = 33635; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_6_5_REV = 33636; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_4_4_4_4 = 32819; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_4_4_4_4_REV = 33637; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_5_5_1 = 32820; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_1_5_5_5_REV = 33638; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_8_8_8_8 = 32821; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_8_8_8_8_REV = 33639; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_10_10_10_2 = 32822; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_2_10_10_10_REV = 33640; + + // Field descriptor #45 I + public static final int GL_RESCALE_NORMAL = 32826; + + // Field descriptor #45 I + public static final int GL_LIGHT_MODEL_COLOR_CONTROL = 33272; + + // Field descriptor #45 I + public static final int GL_SINGLE_COLOR = 33273; + + // Field descriptor #45 I + public static final int GL_SEPARATE_SPECULAR_COLOR = 33274; + + // Field descriptor #45 I + public static final int GL_CLAMP_TO_EDGE = 33071; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MIN_LOD = 33082; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MAX_LOD = 33083; + + // Field descriptor #45 I + public static final int GL_TEXTURE_BASE_LEVEL = 33084; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MAX_LEVEL = 33085; + + // Field descriptor #45 I + public static final int GL_MAX_ELEMENTS_VERTICES = 33000; + + // Field descriptor #45 I + public static final int GL_MAX_ELEMENTS_INDICES = 33001; + + // Field descriptor #45 I + public static final int GL_ALIASED_POINT_SIZE_RANGE = 33901; + + // Field descriptor #45 I + public static final int GL_ALIASED_LINE_WIDTH_RANGE = 33902; + + // Field descriptor #45 I + public static final int GL_SMOOTH_POINT_SIZE_RANGE = 2834; + + // Field descriptor #45 I + public static final int GL_SMOOTH_POINT_SIZE_GRANULARITY = 2835; + + // Field descriptor #45 I + public static final int GL_SMOOTH_LINE_WIDTH_RANGE = 2850; + + // Field descriptor #45 I + public static final int GL_SMOOTH_LINE_WIDTH_GRANULARITY = 2851; + + // Field descriptor #76 I + public static final int GL_TEXTURE0 = 33984; + + // Field descriptor #76 I + public static final int GL_TEXTURE1 = 33985; + + // Field descriptor #76 I + public static final int GL_TEXTURE2 = 33986; + + // Field descriptor #76 I + public static final int GL_TEXTURE3 = 33987; + + // Field descriptor #76 I + public static final int GL_TEXTURE4 = 33988; + + // Field descriptor #76 I + public static final int GL_TEXTURE5 = 33989; + + // Field descriptor #76 I + public static final int GL_TEXTURE6 = 33990; + + // Field descriptor #76 I + public static final int GL_TEXTURE7 = 33991; + + // Field descriptor #76 I + public static final int GL_TEXTURE8 = 33992; + + // Field descriptor #76 I + public static final int GL_TEXTURE9 = 33993; + + // Field descriptor #76 I + public static final int GL_TEXTURE10 = 33994; + + // Field descriptor #76 I + public static final int GL_TEXTURE11 = 33995; + + // Field descriptor #76 I + public static final int GL_TEXTURE12 = 33996; + + // Field descriptor #76 I + public static final int GL_TEXTURE13 = 33997; + + // Field descriptor #76 I + public static final int GL_TEXTURE14 = 33998; + + // Field descriptor #76 I + public static final int GL_TEXTURE15 = 33999; + + // Field descriptor #76 I + public static final int GL_TEXTURE16 = 34000; + + // Field descriptor #76 I + public static final int GL_TEXTURE17 = 34001; + + // Field descriptor #76 I + public static final int GL_TEXTURE18 = 34002; + + // Field descriptor #76 I + public static final int GL_TEXTURE19 = 34003; + + // Field descriptor #76 I + public static final int GL_TEXTURE20 = 34004; + + // Field descriptor #76 I + public static final int GL_TEXTURE21 = 34005; + + // Field descriptor #76 I + public static final int GL_TEXTURE22 = 34006; + + // Field descriptor #76 I + public static final int GL_TEXTURE23 = 34007; + + // Field descriptor #76 I + public static final int GL_TEXTURE24 = 34008; + + // Field descriptor #76 I + public static final int GL_TEXTURE25 = 34009; + + // Field descriptor #76 I + public static final int GL_TEXTURE26 = 34010; + + // Field descriptor #76 I + public static final int GL_TEXTURE27 = 34011; + + // Field descriptor #76 I + public static final int GL_TEXTURE28 = 34012; + + // Field descriptor #76 I + public static final int GL_TEXTURE29 = 34013; + + // Field descriptor #76 I + public static final int GL_TEXTURE30 = 34014; + + // Field descriptor #76 I + public static final int GL_TEXTURE31 = 34015; + + // Field descriptor #76 I + public static final int GL_ACTIVE_TEXTURE = 34016; + + // Field descriptor #76 I + public static final int GL_CLIENT_ACTIVE_TEXTURE = 34017; + + // Field descriptor #76 I + public static final int GL_MAX_TEXTURE_UNITS = 34018; + + // Field descriptor #76 I + public static final int GL_NORMAL_MAP = 34065; + + // Field descriptor #76 I + public static final int GL_REFLECTION_MAP = 34066; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP = 34067; + + // Field descriptor #76 I + public static final int GL_TEXTURE_BINDING_CUBE_MAP = 34068; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X = 34069; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 34070; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 34071; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 34073; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074; + + // Field descriptor #76 I + public static final int GL_PROXY_TEXTURE_CUBE_MAP = 34075; + + // Field descriptor #76 I + public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 34076; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_ALPHA = 34025; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_LUMINANCE = 34026; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_LUMINANCE_ALPHA = 34027; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_INTENSITY = 34028; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_RGB = 34029; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_RGBA = 34030; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSION_HINT = 34031; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 34464; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSED = 34465; + + // Field descriptor #76 I + public static final int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 34466; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_TEXTURE_FORMATS = 34467; + + // Field descriptor #76 I + public static final int GL_MULTISAMPLE = 32925; + + // Field descriptor #76 I + public static final int GL_SAMPLE_ALPHA_TO_COVERAGE = 32926; + + // Field descriptor #76 I + public static final int GL_SAMPLE_ALPHA_TO_ONE = 32927; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE = 32928; + + // Field descriptor #76 I + public static final int GL_SAMPLE_BUFFERS = 32936; + + // Field descriptor #76 I + public static final int GL_SAMPLES = 32937; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE_VALUE = 32938; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE_INVERT = 32939; + + // Field descriptor #76 I + public static final int GL_MULTISAMPLE_BIT = 536870912; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_MODELVIEW_MATRIX = 34019; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_PROJECTION_MATRIX = 34020; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_TEXTURE_MATRIX = 34021; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_COLOR_MATRIX = 34022; + + // Field descriptor #76 I + public static final int GL_COMBINE = 34160; + + // Field descriptor #76 I + public static final int GL_COMBINE_RGB = 34161; + + // Field descriptor #76 I + public static final int GL_COMBINE_ALPHA = 34162; + + // Field descriptor #76 I + public static final int GL_SOURCE0_RGB = 34176; + + // Field descriptor #76 I + public static final int GL_SOURCE1_RGB = 34177; + + // Field descriptor #76 I + public static final int GL_SOURCE2_RGB = 34178; + + // Field descriptor #76 I + public static final int GL_SOURCE0_ALPHA = 34184; + + // Field descriptor #76 I + public static final int GL_SOURCE1_ALPHA = 34185; + + // Field descriptor #76 I + public static final int GL_SOURCE2_ALPHA = 34186; + + // Field descriptor #76 I + public static final int GL_OPERAND0_RGB = 34192; + + // Field descriptor #76 I + public static final int GL_OPERAND1_RGB = 34193; + + // Field descriptor #76 I + public static final int GL_OPERAND2_RGB = 34194; + + // Field descriptor #76 I + public static final int GL_OPERAND0_ALPHA = 34200; + + // Field descriptor #76 I + public static final int GL_OPERAND1_ALPHA = 34201; + + // Field descriptor #76 I + public static final int GL_OPERAND2_ALPHA = 34202; + + // Field descriptor #76 I + public static final int GL_RGB_SCALE = 34163; + + // Field descriptor #76 I + public static final int GL_ADD_SIGNED = 34164; + + // Field descriptor #76 I + public static final int GL_INTERPOLATE = 34165; + + // Field descriptor #76 I + public static final int GL_SUBTRACT = 34023; + + // Field descriptor #76 I + public static final int GL_CONSTANT = 34166; + + // Field descriptor #76 I + public static final int GL_PRIMARY_COLOR = 34167; + + // Field descriptor #76 I + public static final int GL_PREVIOUS = 34168; + + // Field descriptor #76 I + public static final int GL_DOT3_RGB = 34478; + + // Field descriptor #76 I + public static final int GL_DOT3_RGBA = 34479; + + // Field descriptor #76 I + public static final int GL_CLAMP_TO_BORDER = 33069; + + // Field descriptor #71 I + public static final int GL_ARRAY_BUFFER = 34962; + + // Field descriptor #71 I + public static final int GL_ELEMENT_ARRAY_BUFFER = 34963; + + // Field descriptor #71 I + public static final int GL_ARRAY_BUFFER_BINDING = 34964; + + // Field descriptor #71 I + public static final int GL_ELEMENT_ARRAY_BUFFER_BINDING = 34965; + + // Field descriptor #71 I + public static final int GL_VERTEX_ARRAY_BUFFER_BINDING = 34966; + + // Field descriptor #71 I + public static final int GL_NORMAL_ARRAY_BUFFER_BINDING = 34967; + + // Field descriptor #71 I + public static final int GL_COLOR_ARRAY_BUFFER_BINDING = 34968; + + // Field descriptor #71 I + public static final int GL_INDEX_ARRAY_BUFFER_BINDING = 34969; + + // Field descriptor #71 I + public static final int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 34970; + + // Field descriptor #71 I + public static final int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 34971; + + // Field descriptor #71 I + public static final int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 34972; + + // Field descriptor #71 I + public static final int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 34973; + + // Field descriptor #71 I + public static final int GL_WEIGHT_ARRAY_BUFFER_BINDING = 34974; + + // Field descriptor #71 I + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975; + + // Field descriptor #71 I + public static final int GL_STREAM_DRAW = 35040; + + // Field descriptor #71 I + public static final int GL_STREAM_READ = 35041; + + // Field descriptor #71 I + public static final int GL_STREAM_COPY = 35042; + + // Field descriptor #71 I + public static final int GL_STATIC_DRAW = 35044; + + // Field descriptor #71 I + public static final int GL_STATIC_READ = 35045; + + // Field descriptor #71 I + public static final int GL_STATIC_COPY = 35046; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_DRAW = 35048; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_READ = 35049; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_COPY = 35050; + + // Field descriptor #71 I + public static final int GL_READ_ONLY = 35000; + + // Field descriptor #71 I + public static final int GL_WRITE_ONLY = 35001; + + // Field descriptor #71 I + public static final int GL_READ_WRITE = 35002; + + // Field descriptor #71 I + public static final int GL_BUFFER_SIZE = 34660; + + // Field descriptor #71 I + public static final int GL_BUFFER_USAGE = 34661; + + // Field descriptor #71 I + public static final int GL_BUFFER_ACCESS = 35003; + + // Field descriptor #71 I + public static final int GL_BUFFER_MAPPED = 35004; + + // Field descriptor #71 I + public static final int GL_BUFFER_MAP_POINTER = 35005; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_SRC = 33872; + + // Field descriptor #71 I + public static final int GL_FOG_COORD = 33873; + + // Field descriptor #71 I + public static final int GL_CURRENT_FOG_COORD = 33875; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_TYPE = 33876; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_STRIDE = 33877; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_POINTER = 33878; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY = 33879; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_BUFFER_BINDING = 34973; + + // Field descriptor #71 I + public static final int GL_SRC0_RGB = 34176; + + // Field descriptor #71 I + public static final int GL_SRC1_RGB = 34177; + + // Field descriptor #71 I + public static final int GL_SRC2_RGB = 34178; + + // Field descriptor #71 I + public static final int GL_SRC0_ALPHA = 34184; + + // Field descriptor #71 I + public static final int GL_SRC1_ALPHA = 34185; + + // Field descriptor #71 I + public static final int GL_SRC2_ALPHA = 34186; + + // Field descriptor #71 I + public static final int GL_SAMPLES_PASSED = 35092; + + // Field descriptor #71 I + public static final int GL_QUERY_COUNTER_BITS = 34916; + + // Field descriptor #71 I + public static final int GL_CURRENT_QUERY = 34917; + + // Field descriptor #71 I + public static final int GL_QUERY_RESULT = 34918; + + // Field descriptor #71 I + public static final int GL_QUERY_RESULT_AVAILABLE = 34919; + + // Field descriptor #194 I + public static final int GL_SHADING_LANGUAGE_VERSION = 35724; + + // Field descriptor #194 I + public static final int GL_CURRENT_PROGRAM = 35725; + + // Field descriptor #194 I + public static final int GL_SHADER_TYPE = 35663; + + // Field descriptor #194 I + public static final int GL_DELETE_STATUS = 35712; + + // Field descriptor #194 I + public static final int GL_COMPILE_STATUS = 35713; + + // Field descriptor #194 I + public static final int GL_LINK_STATUS = 35714; + + // Field descriptor #194 I + public static final int GL_VALIDATE_STATUS = 35715; + + // Field descriptor #194 I + public static final int GL_INFO_LOG_LENGTH = 35716; + + // Field descriptor #194 I + public static final int GL_ATTACHED_SHADERS = 35717; + + // Field descriptor #194 I + public static final int GL_ACTIVE_UNIFORMS = 35718; + + // Field descriptor #194 I + public static final int GL_ACTIVE_UNIFORM_MAX_LENGTH = 35719; + + // Field descriptor #194 I + public static final int GL_ACTIVE_ATTRIBUTES = 35721; + + // Field descriptor #194 I + public static final int GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 35722; + + // Field descriptor #194 I + public static final int GL_SHADER_SOURCE_LENGTH = 35720; + + // Field descriptor #194 I + public static final int GL_SHADER_OBJECT = 35656; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC2 = 35664; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC3 = 35665; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC4 = 35666; + + // Field descriptor #194 I + public static final int GL_INT_VEC2 = 35667; + + // Field descriptor #194 I + public static final int GL_INT_VEC3 = 35668; + + // Field descriptor #194 I + public static final int GL_INT_VEC4 = 35669; + + // Field descriptor #194 I + public static final int GL_BOOL = 35670; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC2 = 35671; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC3 = 35672; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC4 = 35673; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT2 = 35674; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT3 = 35675; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT4 = 35676; + + // Field descriptor #194 I + public static final int GL_SAMPLER_1D = 35677; + + // Field descriptor #194 I + public static final int GL_SAMPLER_2D = 35678; + + // Field descriptor #194 I + public static final int GL_SAMPLER_3D = 35679; + + // Field descriptor #194 I + public static final int GL_SAMPLER_CUBE = 35680; + + // Field descriptor #194 I + public static final int GL_SAMPLER_1D_SHADOW = 35681; + + // Field descriptor #194 I + public static final int GL_SAMPLER_2D_SHADOW = 35682; + + // Field descriptor #194 I + public static final int GL_VERTEX_SHADER = 35633; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 35658; + + // Field descriptor #194 I + public static final int GL_MAX_VARYING_FLOATS = 35659; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_ATTRIBS = 34921; + + // Field descriptor #194 I + public static final int GL_MAX_TEXTURE_IMAGE_UNITS = 34930; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660; + + // Field descriptor #194 I + public static final int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661; + + // Field descriptor #194 I + public static final int GL_MAX_TEXTURE_COORDS = 34929; + + // Field descriptor #194 I + public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 34370; + + // Field descriptor #194 I + public static final int GL_VERTEX_PROGRAM_TWO_SIDE = 34371; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 34338; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_SIZE = 34339; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_STRIDE = 34340; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_TYPE = 34341; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922; + + // Field descriptor #194 I + public static final int GL_CURRENT_VERTEX_ATTRIB = 34342; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 34373; + + // Field descriptor #194 I + public static final int GL_FRAGMENT_SHADER = 35632; + + // Field descriptor #194 I + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 35657; + + // Field descriptor #194 I + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 35723; + + // Field descriptor #194 I + public static final int GL_MAX_DRAW_BUFFERS = 34852; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER0 = 34853; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER1 = 34854; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER2 = 34855; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER3 = 34856; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER4 = 34857; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER5 = 34858; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER6 = 34859; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER7 = 34860; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER8 = 34861; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER9 = 34862; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER10 = 34863; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER11 = 34864; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER12 = 34865; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER13 = 34866; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER14 = 34867; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER15 = 34868; + + // Field descriptor #194 I + public static final int GL_POINT_SPRITE = 34913; + + // Field descriptor #194 I + public static final int GL_COORD_REPLACE = 34914; + + // Field descriptor #194 I + public static final int GL_POINT_SPRITE_COORD_ORIGIN = 36000; + + // Field descriptor #194 I + public static final int GL_LOWER_LEFT = 36001; + + // Field descriptor #194 I + public static final int GL_UPPER_LEFT = 36002; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_FUNC = 34816; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_FAIL = 34817; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_PASS_DEPTH_FAIL = 34818; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_PASS_DEPTH_PASS = 34819; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_REF = 36003; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_VALUE_MASK = 36004; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_WRITEMASK = 36005; + + // Field descriptor #194 I + public static final int GL_BLEND_EQUATION_RGB = 32777; + + // Field descriptor #194 I + public static final int GL_BLEND_EQUATION_ALPHA = 34877; + +} \ No newline at end of file diff --git a/src/main/java/org/lwjgl/util/glu/GLU.java b/src/main/java/org/lwjgl/util/glu/GLU.java new file mode 100644 index 0000000..c4fae41 --- /dev/null +++ b/src/main/java/org/lwjgl/util/glu/GLU.java @@ -0,0 +1,7 @@ +package org.lwjgl.util.glu; + +import org.lwjgl.opengl.GL11; + +public class GLU extends GL11 { + +}

6?nw#8!uy!yd zNW)%sY))zJFPug{;?dNR5KWp-Q>BL(xDQ9Bs7%A;cHpXDT*^lP^@J14`IzE5uH~%M zPZ|PIbp= zOxLgsiwci|nTawMbP(Bf;ix^sWurdl#F%A za(f;#V^DByCX^Mae3|sn zeTlu3rp9?O0UO5}B1VLF`hbQjl&2~dY4Zb_kTmO;gQd@|#W2C=L@2VD0nfCzHgC+p z7jt9JLI_5KFZ~X9c8NX^MdK*2GaiJJtIx1uG5fZxw`c#%k&m&r>j*H3Q{PF*6v~}Y zWL+U-X!YGL3oGC0AitK>A2msaaQS32wCl?lTz>AJ!P%k`dc_^H-RUcG7_&Fn-UxsK z*r@e8_K-2j{1kT7MAx}Mpg1fa=gt%8byCOiraOg-B3<#7Lg5Qyh&>k=sn%D9B!PzS z5S}alalP@?Dp?@kON<+;OnVFOr}QQ^02{cZeai+Mg)!(V??-SK+svNmHQM34=r#BZ zrsy??+&88#3_0yQ7-yqZt~L?98eEuXe4kTnx|V}m{Rhy7Tz2Pw^1AZ-dA)fjQu!%x zRTSpfAn=T?5x;W|t=%l}jN4MUQWoukFL0a~iy#OJ@O7I9u$_d`5_UzG40gdmURPyD z{e)KLB%?g*3IOLqKi4`33_K&PkV#r39b|Ntjzffq8%Kbk&%oEx+(sT=@(Bb5b?9x0sor#t?#P4r$IxQZ+23!jv2V;1bGG%~5u4 z=i#@?_ot70?fo)^`{}QMxl%Il)cnu&$G=a^mr70rpi&FmtY!I+@l;mP-+*0JaDDs@ zWb=vMR*-SEpFJLm9 zpKK>k_+$EoG>#Q<*Y4>={z~2L zt5`8ZS{IUgtVLIC$`GN=`GyWeZR!GWoui9F|m^DmPfqzVm+miHnS% zeS~aI8uok)#ig{-mI9@ft+tjHHUZ-v`bUHt|~PT3t@{$OyCg#5uJJz2wM4(*ixonR2HZsGpd!k=RQHwSbV`ZAysHBbgN`{2UL{zALgb8MxMBI zrSfJQ)r<&0`J(@F!qys2cL>x|3uq}VfQ+C`bE^8F>x@(qfncw{8jwQOF}zf(?PCjm zZlb8$$jzB1H!YP^h^(qPk91^5cO)fVTMP!rXk|Zi5xrJxbqF3rwh*vQ zM@>w{!XW?F$FPstX_bU^Vb>s^^=t~g#d1M46@Fm@}|GhFW%iTBAf=}vI#~wt$iQtD&?@iXGgnx zD)yt;Xc_J+^d6_#`Zkt9bTGgsY%0s_5$D3@wjXQR>G`L0Izwr^Aml13QwUu8ov9H) zzl-jPbVin9z5;cecfWMYSn`Qx>s6?hZKZ86GUl7HKQZXqgWu8chK~8>raA0+uaUcI{s#57&(MGpm|p+XSGGzkx3JOdH>CJ%4%T9$ zEma*E2U#SaucKLl%eR$%0axJ0qhu+O+opoDii?dZqA`~BSOUw~Ol-8(NLEURkHd}E z-y@c(ul*cAca4pvXjQSDrM5j5(9W$n<_jm%t`h|x9i<8y(A|S%Xs+qC5)XI-*S;d6 z{fsWByheWZlFHhE(B$z#Z1Vav91SDyBf=ql5M%M-i{rUocY9+ zRdurE$&-S|>ZtT3kEQ={O?%Lo<>3V7Xir+APL74_P&M8;Tqoj_eb9*CXz@;@EK@;} zT?^*!))(ot;sm-}QOtY_sk-#TwGGM#_2v#8^!FttPp(*&C0qJJrzW(3JqfcQVspOn z@KT*vM7ow>h@q{YWH4Ybb)ha|Yij4mmnegEI(AuF_1kGv?fX?1vuytSehw9SByp}_ z=BMxB3A6UlC%r_-eAQ@8#u#<1b1~m&qXJg-znNfvO|3XA3PMu?b3 zZYGrCv0XjnG|wr3Bv?Lp&Y;zoU4JFgj(15~xPyH<5yrB_r$M@7S;pm)?t4=ca18W; zBcy>Nw1Fd(fujN~>y|WqbO#Sp8}Rz^y|cUJx1b)U7z++jJ}wmkdmliYv);TX?QjQM z(DOySgLM@JYlQ^aTUNLGSb;GF7B2ABEm7-Spjdhc(QMj?#40s$xH{gL>{jiFP4Bz2(p85DGx_EHl ziBjj4&qUnfN(RGR7p4Pl9u0qTRnCt>bDpTR&)6?=)INmouA=Y#l|KD>w!J>}DBm_J zz7*(b|Gg;r!P>wSIE~=7PV&2_6<~r+r9(}by`i!NO@G>(MuEcG6R+!I%TSrv>zw3> z8UH`Sh4cNEB7$VrQ+UpfM^0a^%HL>q2ZDdaNLRC!>99|+20xAws8VkDI@XnwNus$l z4T5ykW?URa-Fcoj-gU=Wz+eHm{d>_7pzVD{O)jPO+=dvS-LRcBN&fe}p^nnoM zeKHx7B6rCRzf7LPOF~Jyq?Uz_ zOrL^nw>=7Z3zefpsBm*ypllnzkZ_`WSYh|O!Cn~+iF9k@=GfHOxz6T{q2f)sZ4dC4 zV1v_eqX{N=SBeR*|1mEb_W!HwOyHsF+5kQYA(CDdq79)UC2Lf&%T8&p!C)*i_N{d! zp?#qgNm|felZsZ9lomuu(xOlag|vUqoiUnoXYPI9?|#4g)BF2<^S{r1&U2pgoadZ- z9xZ!%*bebyjx$#nt=zZ&;3WOpWzP1I!JB2K`3IVo#Ck2&iQl=&Uj9YOkFLtP^f0QO z^{4AQonOa=tgRSY`4P@b`>7O>q?n(VCi=_pn`gzG;s!~?Z}7pC;64&w>1|J_k;se| zIJ@BF?xol{V~LI0yIoR#9ZYE~SR}9c^l?FS?#QT*Mk78N>9%#xnQyD%lj(S{It%;C zb>L6ets1ZHu@AC(CKwkP|Crfqw!eW>Pv*?FUq%O}j87c-LUojl&eki5+A?A?Rx(rc zg90Dvf7CrZxjJ;iFQ-*I?3L@&n#3)}d8Xy(6~#x_e@|D9v?z$I9A5CDrTwaB-EuV# zt+mBN&9*15SfI1Np!YHT$%g#SLMy$zb3q{=5++rT`l^w`xEG=Dd5=V-`a_lMF86AK zrpvNUe3f)w=l5B$M=n|}%-!d>zevTZI2BH$bLmkk z^4)Y)U5ODA&gd?5mD^gf-}2Y0)&9!^oARRuI_V_GC8m8(OuTTq>&mK^P9F~53TEa< zt^RDwXlm&aS6*7v?QpWk@mKJ8*Ho37p&O5Wy?*5M&+2-=EB6$4My~aq@%#3KPN^ch zkJLTpfwD@w{dWZ9oZcrB>yvwW^z4iN>1&qE%6Y9Y?N7n11?gFPqclgUX!tO!qLk(C zXggJy4I3F*o+@Yi(9vOv`|0>)m#Lyr+g~}JG7XqrGw*1_WXJHFlUkK&OXYfpdPnRD z*lVLa*mi}SU15Ot!7oYb71VTVeM?P|VT-lq_inu`ajjA_emL{NpL0%uhG*)TE=dh zR@}7Y>9^fkwztylKD@F0^2V&y@>zO3d#ak*k(N5ODh212md~=%*{wF|oZVdfCW#vB zK=TZZQt$&K!4C*#Pu#YSn@-H)aZ-&zf`{&81)X>N{A zWWeLQi$)%Jy|b?N+b#+FWl}r#I0X%{qn&^GbEob~o4n}jM?SwU8rk?g0pd-c#-VeuFV_sZqCXsUn*0nSLPqOW$#56=ky(ZO`tluS*~!U9y+uobZEgj zGfzj{4sA`NMns13s!?y*{lN+9LzVrhPW$9G7>@rCng6LiEKeeLNlMr}hZ5-H#faEc-^!|B!lRDfXR!U%@0Vli=^!$NYRB{4vyP&Zt{{{rVr#Gbx^O(krZP z28a$g5uwV`AHMC@%Vb^W4GXtD>Pk#;9KLwsxrx3W6?u<54tpH7DlO1`C~xX{retXD zJ4NfT=I=)iOpQFg+c-+4WMW&b^!YoPj)@&r$F6Y~gFF;{!wcN+URrYf%AE|)His8yPv<``&rq6QdCjD$ zaB+A{s=?s&pA|G)x=o&w`p2ZL@16}$JT)n&C9SoT#@Kx~!Bywdyn7#ptUnrA;l8Ba zz-&iA)s`hC1riG*wbn7J9L;Z+-F`d1CfgQ0dwo+CLkz zo1fMU9<%Jj@L3mkco)5s@68@3{tI-QFf)a^Sy%c(Zm|4%g+nKjcl+f$y>&qMhpX~S z-4wCODWB_7CpWy9JK5M?^}PHqkttTw->xa#RX?@#cjoKh-x(uwO{rJiUX7pyyY9PC zt8F~tSx)!4_s_OyB_`A=YsNimns3LJ>h9X{vhBhXWdn()BLu3(Ydew z>`ezRj+ncA{gJg}JANzOWJ;{gzD%($?{O1NlAAN@d(zZ*dbaCBpMQO7XW9{KoHFFm zpN{48uN>dn;jdz^@?O7iR%1xXXz$WDG6vIUI>*?V7@NsD6pXWZwzF*Uc8%4aJw|=b zENDs|(WI4S+K{LmJof2OMFf+FjPF&Tx1!X~z`%xBDDk zXzZ9W_pMgC>4Y7p?cUPUf1a|urjzm#i@cZ|t z?1CR(&bBX0PM&JLDdF;9&8I2i8q(HDCue)!Sn_T2XpvW;W7b$_=q)Wb`S9)Gwlc>_ zXD%Eqo@Sk|Y@h;pLa~C!ySERO_qSnHelTPY4Me< z-VVzZG~&{9b*53@1vh9U8?-8h%`MY;K2cj|;$yYM#a0rAo>?2r8RO^+Ed8!Ar)q0U z!8cN^li%eH%l?=6`-peVQeOm4}_+}X{xv)-}o=5ERzd|SMhTfM6wPBm?Mbwvfo_(^=UH!VheMQmWdLN62KMWg9X(KPKs>-sP zzxBF8Qt->__O6&k9$CqI4v6-SQaTq~9o3sLAfxT^h(rU=oL^VZEeK5O9dWmCb=v9r z=7g3ZpHgql|1wfDT~B73@3Qf=Mp=fh^9++x^NXhEtb09qU-zN2+nD}a4L2^yAJk)9 zUH|9U_?)-OPwuYv7^sqEaZJO?K5&3W$IYbs38x#3cX@WVttq;t;h(JNbEiqRH=((9 z=9)sa6Y)dD#!9Z%%`N_F*E`@;UWl3Gtm5BlO$QGaJKOatuCbdVcP8GzD$|3NS~ISs zH?d5*J=0`;VtY#Ap~O88!>A<}Bh1cwu*3%)Kc@Gn>X&-;=h5}ikDtD7vo{;^J1ehE zcHco`u_1vMHdz!gna$D|ZhSm6QbOz9$bE6Y zMc+pM^k1jnJIY2XWaPxB(t)hzQ$xf$0KG5)k-tN6`&iTxs1X1LnuGs7iL z4=xamSxjBL?xISRXv_@i$hhN@jYY?M;^qXk4SCfj`KnFkRomcKM^>y|7fl%=9<#B7 zxk|tNK)``2sjtP<^2J-aBo4g4_Qfdg<(ihrm$?+>&Elq%vVei3<=1T-Pg!8H`q7lZ zO%%rG=f}-dWDK)A4X<176Z?^u^4Z08&1~fX8#g?@&Tw5j@O|`4Bg3f)dpA;zi%ob^}U6Z5!0m>i&3l7uDRK5T5x;xRZT4m zm1X-)Ld2e&>Iz=;J?-VS2GMSDwukefK-<%vMteFk=dP$sO$e9VyX%4aiqSges@AJ+ zwx3Q&x>T&XTG8;pkop*L!vn)p$5d2?D|eWREK3r(lC*BmA<7ihm#LaJjw|FpdD(r# zBPJ*D(f%bZ+M-uf#A3>_wzn6rjKB7W6LIqofG%?fh{z9=r$|UhP-3=PJKKBbK3fJc zw;$XvKK5USS=c`vtvt-N?VPNqIGQ`zSzEb#=r~$)3GgYq1cgKB{|Wp_N7N|Ac?Q3V7c&l=92G4E~Mn_a*xUJf80tt$n|Upi!fONq;wl_cIFi zBsrL9pgW8CpNXlb|NjpE7~cOM*l)3YQ|NEKIlEes$Kw$S2qHuP@wcEhnIQill%oO^ zY5+BcR175qfYl~O--N&5;(r%J7N#XAhg0;73@{QAWVQeR^g)gEp)*O}231F-03;xs z$v^;j^Mf_Bz6)#EqXGczd`Ggk7{U8F$Ea$B{@y!0{QqD`K|&K%B_=}*oD4)Jhaw`! zOrZ=KxAF-Y1~t-1p&0JLP-GOeX^#t~aMmQrAgE?v3P5TL>CMTGkaE!XX%XN+ zzw;xvHCaAeYcp4ZS_b`|K9~wNM*4VuLv1s+5&SWsXY2%HRdei-j!voZ(c zq5NK)Q!jT;q^~dUJV-qF$&mRDq5$=T_r>x`yo=3>mLUT}@n*egeARgIT;L|Xi1Siz5 zbD#(IZ6v{qD>YiyBougFkX}uhTi4f{-;G~^fGxnq68pT1%}M~LiE?>k2b|+)7aYP}0^|4y;b^niyjxX( zO#yd{>fi=Abrj8Wz-nj3?Ul(Q=K~E^p4^O%X z&|4s-7VquhFPjxM3J>MFXU+~v3nn8X3_Dq`udW)ty+qI5I+p|35dts2PDMBta|9kx zx3n(>jR)q|GJCNe`x{;!``(6ku~`vg@W8)=fSu(WU^2p?94dU=CS0wj%S}%`0Guk& zQD5LZj+AUegZ)$_P9`VdqCR#84R$UhYFkmz$I$jdMjU21o%1aocJRA!nHyLAl)noy z>i~KRPZjW&%^IloU(mKxh7V!e(P=v$t^?Q+xKV{nRL8@)Bb+DA%f`Wt24ioS7m0J6 z{>C;I1LwevcH)6BTA&Ky19KKAh`7(USUcA=ip0{v&@5rzgleN6xVQlo9@94_;s&!2 zX0Q%~hIqp(2uf-=1Oh*T8|@(3@D8ZZePbH;yF8mPst+CN;|Xs;t!tq%w*iUGov(0j zjS$HheS{NJXG(6?=p%xC_FrsPuO6O=xH1yv$U8Ib;z5;`;&>|!*C%B{aU(a_5lS#T znr}{Agt_tI(7RAOaxfyrk~+qp?y>4!KphP2ZqWbwm~~p2kW!t!0>D18L6YVIHLinc zP~@5*Y}7xzLYD&1sDvAJVwtA+XYe~;3nnwnht7a*MgW$U%ANZXpl?AXXvgg_!-M&p z7&c&HN2x+3Qo2_pAzh(iMeQn3$$q#|+n7F^gpLiKutX``-sI|}Eam}kA>63CMa};| z_ZSk!455WZ&}rd#FZt^*qirSd55SEY%2jv<+Di~G=|YWwMkH_$c3A`NNr6?%L)42p z_N{a9RQ{-!FHE0Lr$q}_OUs9oOP@hQegP{)BZ_WIGPrdRlS&?}FCLS8MvrTFR=SJ?osEWw=!i|9GM)R|Z z2~nFW+)x!VHk778lN-oUC}Rfd|qSLFF>4!_eCwe1hU~M44ff132A5NW=#)*UXPVQ7ta0I>aU0$NQAi) zH0V-TLCAHXh0&QlbZ<{coCwFZv>Y0Pg+&=~qh9J0F_tsmagTsAu!DtDWgiylB?7Sk zZgfPrNhK5(3*s2GAoq|UI_3b0Rq?&d=0Z7;$AF5_kmiUNA>D>bXAmRl&G9F(Br#S# z74;)Gy$O-d;okJ1AS#T##NfHBt%qS#DQsGT&UhC25`x{~^=V8OOdTZXl?x@ESHLiE z5IO;B5$pX3(VUYA`$k^jZCAeV%`a@vi*RY(h z@W)(|EzfKRwg)`MkoOGu%Vr&9{FldYq8&?GIOpqeqDf)9twhXvfF6Py%@1@j2_M3- zZqAlP;gXlTmAfZ{)N&B+pk1aSgb>QnJ6W3SX^H&;Y&M?@R)~svJdB*m(S&eOWiS8H zPzNBE&qbX%D}o$KY|-hD;$C3oe!PIIf;8OsC_Iz1Kw|Ii>?B+~nOuFzWq=X^O`^ff zi5NTzo0DNn9Tx8H?h&y;G)tOy5Cpu$Q?pxpN5{XB0zX~l@3N5s0(AXiFbcoTSJCkbiALV$jQ z8#S*;2!l~DZ%XMw52l5YPJd_C?G1_tO>Bl%L#Z3U{i9S~rp(=+8bpL#ya2%$1R?lBkK)Xl>}EjzF%6*k@+VR;JA}E zg4xufDBT&Rpid=W>L9#PoAJE<0D|LQT*8>%P|l3RbrnfUZZZaLFX$I_GUvAtvj1%y zT9~yv70Yb7B%61~n))oNVCiVx6#j z1)6mQG|buiFE&egHzC&9*BA2$ed8yV?EaSlPW;lXXj^!~70@>t19_(sK81T2N?${g z#TDnqwn&1tQqIART8ZQyLV90>+BnAMS+b~5=Db> zzkP&!kUEMP6h)>P`}p3?Z-99S`VT6138W`be~0!>uE*ngKjN{~g0U9U|AM9o@@}%y|{WcR*Lr@N&IB&ayFjI8wrV3 z;Hfa0i4EJ@paM0-G|G<<(;x{;?Oo{$Kve=qtLKR|Aop)$C1h%()8)aYk0y^ zfhWwqjDG@O-WtMU=)o>wG;ex1I34WJa4Nwh_g?M9EaAE91PJj_&G0<|yo4X*@`dZg zXwh94n7~lLcj3YvY)ZZv^nrG3%_{=rzQ7n((aEtN2~0M5JEte~p|P;Tx|_}f#;d*sbv2s;AEu{;+1h3x4~0vyR2QO`Pe)pGdt zSa@SJMq5>ir}dBL+&F|oC67XGtxKPKALtW+j?Rv9ZjsP~sIkPuR&B+*^w)D-&29kmJ9r*+)@2A?TfkDOoV}BLLA*^6(~BD9?hUIU!W+)* zV5GJ@JfInF^Z^U*5jtkcH?TwVbU-=!h|$p>5Tf~%g9+Uq(+gLRlj)S^sy<6ZBR_QrH3+2V zJOXlH5!mV+xFTZZm`3-!$1>8`ObRvh`IUrtbjrh7tP?K$maKrJjUYT&AZ|kCS4~Lg zrrEfAhBziDcYi+00I&*fbYwXF z3J>H>9?ZS4dAfH5*(9Rz$2M(j@op3NRdf`Se}m@=P9lWM+Ij4Li6k)3z>TWY^{sFw zr;m}u`bihI>aGJF9)larhn#qaCn8aE-?j|0xadNuhW`uT&IW1Gp)0AGlszBzVt`xb z?oJ|^mk*mU=qk4Qv|9|H=PGLSP)8X4GgAoj8Zk z7?yKLH>^xMFJ3kW z=MqJ;WB4+KD`MdD+aIxzIUR0wo}}=X&9dnv!EytA;Yb#>w@G>wg|f~KzjPu0nFNW? zQ45D#4l>ZAK*Q1DMwPo7dN|r}poVa!cOWfdibW6;3PBOCxTz-2lf&k$kfXp&9IA)l zsXV91^I@>z(2v+VM(v0e@dsHafBDF^dr(%mhoQ-P)N!Me>a_v}%IUR_oJD4{TPej~- z1t(`g>JH?!+nJw1tLEbPL1MiEDccVFIz@PE-49iXz-9~OU;wC9m4i}Hy$X?6IP{x_ ztdt@^2ZOL^5Ge-f3lz$qtFZa|{flt$uJ2+a5U zXx9B^;r`1LX0C*6vQ@UrUrWr}K?k~n@XA#iCj{B&VmxVH?i^<$TnD#mY^9!nas_vJ z`NMuuR8IcQY4E8B>1M2NA+zstqA##6wBPQ5xiv8t8y<;wyJf^&SW*kpK7=6*9c-3q zkx@ZfBa+=jdpcCguq|nVo9H%8BExbv(HTr9A>Z69+h_`HrVRq49`Ocb%TYD-?MdUN zQmlih1dEr0N*PY2V6o8VxS-J)vfBj6kRYlzjXdk4zIo7417PZaxTtOer{cN1u?E5< zEEc7O5y$oM@yv*=AZ{7lW8vmquupgz5f)2n3pdw4=`QP=0O1URj_0A^FPrsPkBG)y z!WYi7Te>zn5m-gwuuwCV&?n+K!IoVgY-$Q04+*EPNjbU20;uVrN|f3J8b+Ilr%K+i z?Ga0qjtO7J915d8r3~(|$h)sLBBEkDb%o1lQV^tg3P?lX&D9WEov|<)jr*-ANwAXn z!ec15bTJdCs5`BjK|-{phWr0(xV`;L+dgci;X2&t7%&XJy%yAHpR|2TI3z-=A8Bws z22gAl8M>b(9NvQvY|ZqJz_3Z77SgfHAWq_&A}nFiK-8PtM0gIY@xvLh3|Q6tfImD_{l zl^`&-_K0eGxeW={)1O8Q`d4jG>W$=-0bUL_Dzl*-37nG^CXx9^{(xN*0of~n&9^7P z{*_s{hO5pUevYl`ECem1bN@*WB-nq|LcCsuK19Zp61dTx67NXD?fb-zL=W;}VVC>> zx)a(C?cSf9NWczED7A_C4l+ZQ$eBDJ=3ta`;G>3o7Lsp-hRorTC&}$(0=^sr75|XJ zTih?$OF~HgYsh3`YYom%gt(UTZ5-N$17H#_2*(1b@G0=+r3W*R#vqf+i4up_sPWikiDHt1(&0&Wq=_32?DSDSygUI$^ zA!s^($0Aa?9U~+XEhmH*`~a&^xdyPg(2Qu`rY|8y^M+O7o$%uX>Jx}UIQePR?owBf zVjbv=KvG@s*C0p9$I;s^G8xjcWOwHz}Djg(Vf5zqU1sF7+WrbLQNnX#Qf) zs6H%wNzrrgrLyt*;4cV_lDB}n66}QiokgH@G@i^~krySGK$?eyEKpt;Pv$RKiz+$; zmP<&;g7tmzX#P5?sGF{V(~(KgLMq_m+59CsQTF~|Qnrw~tavtmElHG}!6ao1Dfx+K z^A|uw+0LP)Yzx8Klz29O^*_`|dcsKA0tFTEWd8blD0yB4DcKfZOAt@yF9L_^Lpzd` zETozrp3Ps!3}uVJS`?Z62^N*Zv-#_7q1|SG3@KZ%E*c)qUzTYa486RI&2o+-MRUzh zpnMme&tLci6@C3GQof@=sV6*|zYqu-g|JwJXly{o)ltE7`HxyhXR#HqEuEw#Ne2S{ zlfO~>C{8A&3OTeLFERho*C;!A6Dga!ltd~w|4GGY12)0t8&n&-ggL=c+IX?~5BNoG zZ^t$wG}*z&cs~DWsHlNl*iOV3c4#o3%YT&IcwUErzid{^E^;m}8WV%;AcgWC{ { + private Object[] values; + private int size; + private int insertIndex; + public int allocatedObjects; + + public GLObjectMap(int initialSize) { + this.values = new Object[initialSize]; + this.size = initialSize; + this.insertIndex = 0; + this.allocatedObjects = 0; + } + + public int register(T obj) { + int start = insertIndex; + do { + ++insertIndex; + if (insertIndex >= size) { + insertIndex = 0; + } + if (insertIndex == start) { + resize(); + return register(obj); + } + } while (values[insertIndex] != null); + values[insertIndex] = obj; + ++allocatedObjects; + return insertIndex; + } + + public T free(int obj) { + if (obj >= size || obj < 0) + return null; + Object ret = values[obj]; + values[obj] = null; + --allocatedObjects; + return (T) ret; + } + + public T get(int obj) { + if (obj >= size || obj < 0) + return null; + return (T) values[obj]; + } + + private void resize() { + int oldSize = size; + size += size / 2; + Object[] oldValues = values; + values = new Object[size]; + System.arraycopy(oldValues, 0, values, 0, oldSize); + } +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java b/src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java new file mode 100644 index 0000000..f6aaee7 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java @@ -0,0 +1,58 @@ +package net.PeytonPlayz585.glemu; + +import java.nio.FloatBuffer; + +import net.lax1dude.eaglercraft.GLAllocation; + +/** + * Utility class that emulates immediate mode vertex data submission. + * Can be used to create VBO data. + */ +public final class ModeBuffer { + + private FloatBuffer buffer; + + public ModeBuffer(final int startSize) { + this.buffer = GLAllocation.createDirectFloatBuffer(startSize); + } + + private void checkSize(final int count) { + while ( buffer.remaining() < count ) { + final FloatBuffer newBuffer = GLAllocation.createDirectFloatBuffer(buffer.capacity() << 1); + buffer.flip(); + newBuffer.put(buffer); + buffer = newBuffer; + } + } + + public FloatBuffer getBuffer() { + buffer.flip(); + return buffer; + } + + public void glVertex2f(final float x, final float y) { + checkSize(2); + buffer.put(x).put(y); + } + + public void glVertex3f(final float x, final float y, final float z) { + checkSize(3); + buffer.put(x).put(y).put(z); + } + + public void glVertex4f(final float x, final float y, final float z, final float w) { + checkSize(4); + buffer.put(x).put(y).put(z).put(w); + } + + public void glNormal3f(final float x, final float y, final float z) { + checkSize(3); + buffer.put(x).put(y).put(z); + } + + public void glTexCoord2f(final float s, final float t) { + checkSize(2); + buffer.put(s).put(t); + } + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java new file mode 100644 index 0000000..d3e962d --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for matrices. When a matrix is constructed it will be the identity + * matrix unless otherwise stated. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ +public abstract class Matrix implements Serializable { + + /** + * Constructor for Matrix. + */ + protected Matrix() { + super(); + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public abstract Matrix setIdentity(); + + /** + * Invert this matrix + * + * @return this + */ + public abstract Matrix invert(); + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix load(FloatBuffer buf); + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix loadTranspose(FloatBuffer buf); + + /** + * Negate this matrix + * + * @return this + */ + public abstract Matrix negate(); + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix store(FloatBuffer buf); + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix storeTranspose(FloatBuffer buf); + + /** + * Transpose this matrix + * + * @return this + */ + public abstract Matrix transpose(); + + /** + * Set this matrix to 0. + * + * @return this + */ + public abstract Matrix setZero(); + + /** + * @return the determinant of the matrix + */ + public abstract float determinant(); + +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java new file mode 100644 index 0000000..e48997e --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2x2 matrix + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Matrix2f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m10, m11; + + /** + * Constructor for Matrix2f. The matrix is initialised to the identity. + */ + public Matrix2f() { + setIdentity(); + } + + /** + * Constructor + */ + public Matrix2f(Matrix2f src) { + load(src); + } + + /** + * Load from another matrix + * + * @param src The source matrix + * @return this + */ + public Matrix2f load(Matrix2f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new one should be created. + * @return The copied matrix + */ + public static Matrix2f load(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m10 = src.m10; + dest.m11 = src.m11; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m10); + buf.put(m11); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m01); + buf.put(m11); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f add(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f sub(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f mul(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01; + float m01 = left.m01 * right.m00 + left.m11 * right.m01; + float m10 = left.m00 * right.m10 + left.m10 * right.m11; + float m11 = left.m01 * right.m10 + left.m11 * right.m11; + + dest.m00 = m00; + dest.m01 = m01; + dest.m10 = m10; + dest.m11 = m11; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector2f transform(Matrix2f left, Vector2f right, Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + + float x = left.m00 * right.x + left.m10 * right.y; + float y = left.m01 * right.x + left.m11 * right.y; + + dest.x = x; + dest.y = y; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Transpose this matrix and place the result in another matrix. + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix2f transpose(Matrix2f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix. + * + * @param src The source matrix or null if a new matrix is to be created + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix2f transpose(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m01 = src.m10; + float m10 = src.m01; + + dest.m01 = m01; + dest.m10 = m10; + + return dest; + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and place the result in the destination matrix. + * + * @param src The source matrix to be inverted + * @param dest The destination matrix or null if a new matrix is to be created + * @return The inverted matrix, or null if source can't be reverted. + */ + public static Matrix2f invert(Matrix2f src, Matrix2f dest) { + /* + * inv(A) = 1/det(A) * adj(A); + */ + + float determinant = src.determinant(); + if (determinant != 0) { + if (dest == null) + dest = new Matrix2f(); + float determinant_inv = 1f / determinant; + float t00 = src.m11 * determinant_inv; + float t01 = -src.m01 * determinant_inv; + float t11 = src.m00 * determinant_inv; + float t10 = -src.m10 * determinant_inv; + + dest.m00 = t00; + dest.m01 = t01; + dest.m10 = t10; + dest.m11 = t11; + return dest; + } else + return null; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and stash the result in another matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix2f negate(Matrix2f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and stash the result in the destination matrix. + * + * @param src The source matrix to be negated + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix2f negate(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the source matrix to be the identity matrix. + * + * @param src The matrix to set to the identity. + * @return The source matrix + */ + public static Matrix2f setIdentity(Matrix2f src) { + src.m00 = 1.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 1.0f; + return src; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + public static Matrix2f setZero(Matrix2f src) { + src.m00 = 0.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 0.0f; + return src; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Matrix#determinant() + */ + public float determinant() { + return m00 * m11 - m01 * m10; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java new file mode 100644 index 0000000..06ccf59 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3x3 matrix. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Matrix3f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m10, m11, m12, m20, m21, m22; + + /** + * Constructor for Matrix3f. Matrix is initialised to the identity. + */ + public Matrix3f() { + super(); + setIdentity(); + } + + /** + * Load from another matrix + * + * @param src The source matrix + * @return this + */ + public Matrix3f load(Matrix3f src) { + return load(src, this); + } + + /** + * Copy source matrix to destination matrix + * + * @param src The source matrix + * @param dest The destination matrix, or null of a new matrix is to be created + * @return The copied matrix + */ + public static Matrix3f load(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = src.m00; + dest.m10 = src.m10; + dest.m20 = src.m20; + dest.m01 = src.m01; + dest.m11 = src.m11; + dest.m21 = src.m21; + dest.m02 = src.m02; + dest.m12 = src.m12; + dest.m22 = src.m22; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major (maths) + * order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + public Matrix store(float[] buf) { + buf[0] = m00; + buf[1] = m01; + buf[2] = m02; + buf[3] = m10; + buf[4] = m11; + buf[5] = m12; + buf[6] = m20; + buf[7] = m21; + buf[8] = m22; + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m02); + buf.put(m12); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f add(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f sub(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f mul(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector3f transform(Matrix3f left, Vector3f right, Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z; + + dest.x = x; + dest.y = y; + dest.z = z; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this, this); + } + + /** + * Transpose this matrix and place the result in another matrix + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix3f transpose(Matrix3f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result into the destination matrix + * + * @param src The source matrix to be transposed + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix3f transpose(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = m00 * (m11 * m22 - m12 * m21) + m01 * (m12 * m20 - m10 * m22) + m02 * (m10 * m21 - m11 * m20); + return f; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result into the destination matrix + * + * @param src The source matrix to be inverted + * @param dest The destination matrix, or null if a new one is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix3f invert(Matrix3f src, Matrix3f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + if (dest == null) + dest = new Matrix3f(); + /* + * do it the ordinary way + * + * inv(A) = 1/det(A) * adj(T), where adj(T) = transpose(Conjugate Matrix) + * + * m00 m01 m02 m10 m11 m12 m20 m21 m22 + */ + float determinant_inv = 1f / determinant; + + // get the conjugate matrix + float t00 = src.m11 * src.m22 - src.m12 * src.m21; + float t01 = -src.m10 * src.m22 + src.m12 * src.m20; + float t02 = src.m10 * src.m21 - src.m11 * src.m20; + float t10 = -src.m01 * src.m22 + src.m02 * src.m21; + float t11 = src.m00 * src.m22 - src.m02 * src.m20; + float t12 = -src.m00 * src.m21 + src.m01 * src.m20; + float t20 = src.m01 * src.m12 - src.m02 * src.m11; + float t21 = -src.m00 * src.m12 + src.m02 * src.m10; + float t22 = src.m00 * src.m11 - src.m01 * src.m10; + + dest.m00 = t00 * determinant_inv; + dest.m11 = t11 * determinant_inv; + dest.m22 = t22 * determinant_inv; + dest.m01 = t10 * determinant_inv; + dest.m10 = t01 * determinant_inv; + dest.m20 = t02 * determinant_inv; + dest.m02 = t20 * determinant_inv; + dest.m12 = t21 * determinant_inv; + dest.m21 = t12 * determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix3f negate(Matrix3f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and place the result in the destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix3f negate(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m02; + dest.m02 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m12; + dest.m12 = -src.m11; + dest.m20 = -src.m20; + dest.m21 = -src.m22; + dest.m22 = -src.m21; + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the matrix to be the identity matrix. + * + * @param m The matrix to be set to the identity + * @return m + */ + public static Matrix3f setIdentity(Matrix3f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + return m; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the matrix matrix to 0. + * + * @param m The matrix to be set to 0 + * @return m + */ + public static Matrix3f setZero(Matrix3f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + return m; + } + + public boolean equals(Object m) { + return (m instanceof Matrix3f) && equal(this, (Matrix3f) m); + } + + public static boolean equal(Matrix3f a, Matrix3f b) { + return a.m00 == b.m00 && a.m01 == b.m01 && a.m02 == b.m02 && a.m10 == b.m10 && a.m11 == b.m11 && a.m12 == b.m12 + && a.m20 == b.m20 && a.m21 == b.m21 && a.m22 == b.m22; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java new file mode 100644 index 0000000..cdca438 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java @@ -0,0 +1,902 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * Holds a 4x4 float matrix. + * + * @author foo + */ +public class Matrix4f extends Matrix implements Serializable { + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33; + + /** + * Construct a new matrix, initialized to the identity. + */ + public Matrix4f() { + super(); + setIdentity(); + } + + public Matrix4f(final Matrix4f src) { + super(); + load(src); + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append(m30).append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append(m31).append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append(m32).append('\n'); + buf.append(m03).append(' ').append(m13).append(' ').append(m23).append(' ').append(m33).append('\n'); + return buf.toString(); + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the given matrix to be the identity matrix. + * + * @param m The matrix to set to the identity + * @return m + */ + public static Matrix4f setIdentity(Matrix4f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 1.0f; + + return m; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the given matrix to 0. + * + * @param m The matrix to set to 0 + * @return m + */ + public static Matrix4f setZero(Matrix4f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 0.0f; + + return m; + } + + /** + * Load from another matrix4f + * + * @param src The source matrix + * @return this + */ + public Matrix4f load(Matrix4f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix + * + * @param src The source matrix + * @param dest The destination matrix, or null of a new one is to be created + * @return The copied matrix + */ + public static Matrix4f load(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m02 = src.m02; + dest.m03 = src.m03; + dest.m10 = src.m10; + dest.m11 = src.m11; + dest.m12 = src.m12; + dest.m13 = src.m13; + dest.m20 = src.m20; + dest.m21 = src.m21; + dest.m22 = src.m22; + dest.m23 = src.m23; + dest.m30 = src.m30; + dest.m31 = src.m31; + dest.m32 = src.m32; + dest.m33 = src.m33; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m03 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m13 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + m23 = buf.get(); + m30 = buf.get(); + m31 = buf.get(); + m32 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major (maths) + * order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m30 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m31 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + m32 = buf.get(); + m03 = buf.get(); + m13 = buf.get(); + m23 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m03); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m13); + buf.put(m20); + buf.put(m21); + buf.put(m22); + buf.put(m23); + buf.put(m30); + buf.put(m31); + buf.put(m32); + buf.put(m33); + return this; + } + + public Matrix store(float[] buf) { + buf[0] = m00; + buf[1] = m01; + buf[2] = m02; + buf[3] = m03; + buf[4] = m10; + buf[5] = m11; + buf[6] = m12; + buf[7] = m13; + buf[8] = m20; + buf[9] = m21; + buf[10] = m22; + buf[11] = m23; + buf[12] = m30; + buf[13] = m31; + buf[14] = m32; + buf[15] = m33; + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m30); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m31); + buf.put(m02); + buf.put(m12); + buf.put(m22); + buf.put(m32); + buf.put(m03); + buf.put(m13); + buf.put(m23); + buf.put(m33); + return this; + } + + /** + * Store the rotation portion of this matrix in a float buffer. The matrix is + * stored in column major (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store3f(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f add(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m03 = left.m03 + right.m03; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m13 = left.m13 + right.m13; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + dest.m23 = left.m23 + right.m23; + dest.m30 = left.m30 + right.m30; + dest.m31 = left.m31 + right.m31; + dest.m32 = left.m32 + right.m32; + dest.m33 = left.m33 + right.m33; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f sub(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m03 = left.m03 - right.m03; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m13 = left.m13 - right.m13; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + dest.m23 = left.m23 - right.m23; + dest.m30 = left.m30 - right.m30; + dest.m31 = left.m31 - right.m31; + dest.m32 = left.m32 - right.m32; + dest.m33 = left.m33 - right.m33; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f mul(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02 + left.m30 * right.m03; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02 + left.m31 * right.m03; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02 + left.m32 * right.m03; + float m03 = left.m03 * right.m00 + left.m13 * right.m01 + left.m23 * right.m02 + left.m33 * right.m03; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12 + left.m30 * right.m13; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12 + left.m31 * right.m13; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12 + left.m32 * right.m13; + float m13 = left.m03 * right.m10 + left.m13 * right.m11 + left.m23 * right.m12 + left.m33 * right.m13; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22 + left.m30 * right.m23; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22 + left.m31 * right.m23; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22 + left.m32 * right.m23; + float m23 = left.m03 * right.m20 + left.m13 * right.m21 + left.m23 * right.m22 + left.m33 * right.m23; + float m30 = left.m00 * right.m30 + left.m10 * right.m31 + left.m20 * right.m32 + left.m30 * right.m33; + float m31 = left.m01 * right.m30 + left.m11 * right.m31 + left.m21 * right.m32 + left.m31 * right.m33; + float m32 = left.m02 * right.m30 + left.m12 * right.m31 + left.m22 * right.m32 + left.m32 * right.m33; + float m33 = left.m03 * right.m30 + left.m13 * right.m31 + left.m23 * right.m32 + left.m33 * right.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector4f transform(Matrix4f left, Vector4f right, Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z + left.m30 * right.w; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z + left.m31 * right.w; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z + left.m32 * right.w; + float w = left.m03 * right.x + left.m13 * right.y + left.m23 * right.z + left.m33 * right.w; + + dest.x = x; + dest.y = y; + dest.z = z; + dest.w = w; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Translate this matrix + * + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector2f vec) { + return translate(vec, this); + } + + /** + * Translate this matrix + * + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector3f vec) { + return translate(vec, this); + } + + /** + * Scales this matrix + * + * @param vec The vector to scale by + * @return this + */ + public Matrix4f scale(Vector3f vec) { + return scale(vec, this, this); + } + + /** + * Scales the source matrix and put the result in the destination matrix + * + * @param vec The vector to scale by + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The scaled matrix + */ + public static Matrix4f scale(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00 * vec.x; + dest.m01 = src.m01 * vec.x; + dest.m02 = src.m02 * vec.x; + dest.m03 = src.m03 * vec.x; + dest.m10 = src.m10 * vec.y; + dest.m11 = src.m11 * vec.y; + dest.m12 = src.m12 * vec.y; + dest.m13 = src.m13 * vec.y; + dest.m20 = src.m20 * vec.z; + dest.m21 = src.m21 * vec.z; + dest.m22 = src.m22 * vec.z; + dest.m23 = src.m23 * vec.z; + return dest; + } + + /** + * Rotates the matrix around the given axis the specified angle + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @return this + */ + public Matrix4f rotate(float angle, Vector3f axis) { + return rotate(angle, axis, this); + } + + /** + * Rotates the matrix around the given axis the specified angle + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param dest The matrix to put the result, or null if a new matrix is to be + * created + * @return The rotated matrix + */ + public Matrix4f rotate(float angle, Vector3f axis, Matrix4f dest) { + return rotate(angle, axis, this, dest); + } + + /** + * Rotates the source matrix around the given axis the specified angle and put + * the result in the destination matrix. + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param src The matrix to rotate + * @param dest The matrix to put the result, or null if a new matrix is to be + * created + * @return The rotated matrix + */ + public static Matrix4f rotate(float angle, Vector3f axis, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float c = (float) Math.cos(angle); + float s = (float) Math.sin(angle); + float oneminusc = 1.0f - c; + float xy = axis.x * axis.y; + float yz = axis.y * axis.z; + float xz = axis.x * axis.z; + float xs = axis.x * s; + float ys = axis.y * s; + float zs = axis.z * s; + + float f00 = axis.x * axis.x * oneminusc + c; + float f01 = xy * oneminusc + zs; + float f02 = xz * oneminusc - ys; + // n[3] not used + float f10 = xy * oneminusc - zs; + float f11 = axis.y * axis.y * oneminusc + c; + float f12 = yz * oneminusc + xs; + // n[7] not used + float f20 = xz * oneminusc + ys; + float f21 = yz * oneminusc - xs; + float f22 = axis.z * axis.z * oneminusc + c; + + float t00 = src.m00 * f00 + src.m10 * f01 + src.m20 * f02; + float t01 = src.m01 * f00 + src.m11 * f01 + src.m21 * f02; + float t02 = src.m02 * f00 + src.m12 * f01 + src.m22 * f02; + float t03 = src.m03 * f00 + src.m13 * f01 + src.m23 * f02; + float t10 = src.m00 * f10 + src.m10 * f11 + src.m20 * f12; + float t11 = src.m01 * f10 + src.m11 * f11 + src.m21 * f12; + float t12 = src.m02 * f10 + src.m12 * f11 + src.m22 * f12; + float t13 = src.m03 * f10 + src.m13 * f11 + src.m23 * f12; + dest.m20 = src.m00 * f20 + src.m10 * f21 + src.m20 * f22; + dest.m21 = src.m01 * f20 + src.m11 * f21 + src.m21 * f22; + dest.m22 = src.m02 * f20 + src.m12 * f21 + src.m22 * f22; + dest.m23 = src.m03 * f20 + src.m13 * f21 + src.m23 * f22; + dest.m00 = t00; + dest.m01 = t01; + dest.m02 = t02; + dest.m03 = t03; + dest.m10 = t10; + dest.m11 = t11; + dest.m12 = t12; + dest.m13 = t13; + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector3f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z; + + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector2f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector2f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y; + + return dest; + } + + /** + * Transpose this matrix and place the result in another matrix + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix4f transpose(Matrix4f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix + * + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix4f transpose(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m03 = src.m30; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m13 = src.m31; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + float m23 = src.m32; + float m30 = src.m03; + float m31 = src.m13; + float m32 = src.m23; + float m33 = src.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = m00 * ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32) - m13 * m22 * m31 - m11 * m23 * m32 + - m12 * m21 * m33); + f -= m01 * ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32) - m13 * m22 * m30 - m10 * m23 * m32 + - m12 * m20 * m33); + f += m02 * ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31) - m13 * m21 * m30 - m10 * m23 * m31 + - m11 * m20 * m33); + f -= m03 * ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31) - m12 * m21 * m30 - m10 * m22 * m31 + - m11 * m20 * m32); + return f; + } + + /** + * Calculate the determinant of a 3x3 matrix + * + * @return result + */ + + private static float determinant3x3(float t00, float t01, float t02, float t10, float t11, float t12, float t20, + float t21, float t22) { + return t00 * (t11 * t22 - t12 * t21) + t01 * (t12 * t20 - t10 * t22) + t02 * (t10 * t21 - t11 * t20); + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result in the destination + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix4f invert(Matrix4f src, Matrix4f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + /* + * m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33 + */ + if (dest == null) + dest = new Matrix4f(); + float determinant_inv = 1f / determinant; + + // first row + float t00 = determinant3x3(src.m11, src.m12, src.m13, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t01 = -determinant3x3(src.m10, src.m12, src.m13, src.m20, src.m22, src.m23, src.m30, src.m32, + src.m33); + float t02 = determinant3x3(src.m10, src.m11, src.m13, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t03 = -determinant3x3(src.m10, src.m11, src.m12, src.m20, src.m21, src.m22, src.m30, src.m31, + src.m32); + // second row + float t10 = -determinant3x3(src.m01, src.m02, src.m03, src.m21, src.m22, src.m23, src.m31, src.m32, + src.m33); + float t11 = determinant3x3(src.m00, src.m02, src.m03, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t12 = -determinant3x3(src.m00, src.m01, src.m03, src.m20, src.m21, src.m23, src.m30, src.m31, + src.m33); + float t13 = determinant3x3(src.m00, src.m01, src.m02, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // third row + float t20 = determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m31, src.m32, src.m33); + float t21 = -determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m30, src.m32, + src.m33); + float t22 = determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m30, src.m31, src.m33); + float t23 = -determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m30, src.m31, + src.m32); + // fourth row + float t30 = -determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m21, src.m22, + src.m23); + float t31 = determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m20, src.m22, src.m23); + float t32 = -determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m20, src.m21, + src.m23); + float t33 = determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m20, src.m21, src.m22); + + // transpose and divide by the determinant + dest.m00 = t00 * determinant_inv; + dest.m11 = t11 * determinant_inv; + dest.m22 = t22 * determinant_inv; + dest.m33 = t33 * determinant_inv; + dest.m01 = t10 * determinant_inv; + dest.m10 = t01 * determinant_inv; + dest.m20 = t02 * determinant_inv; + dest.m02 = t20 * determinant_inv; + dest.m12 = t21 * determinant_inv; + dest.m21 = t12 * determinant_inv; + dest.m03 = t30 * determinant_inv; + dest.m30 = t03 * determinant_inv; + dest.m13 = t31 * determinant_inv; + dest.m31 = t13 * determinant_inv; + dest.m32 = t23 * determinant_inv; + dest.m23 = t32 * determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix4f negate(Matrix4f dest) { + return negate(this, dest); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The negated matrix + */ + public static Matrix4f negate(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m02 = -src.m02; + dest.m03 = -src.m03; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + dest.m12 = -src.m12; + dest.m13 = -src.m13; + dest.m20 = -src.m20; + dest.m21 = -src.m21; + dest.m22 = -src.m22; + dest.m23 = -src.m23; + dest.m30 = -src.m30; + dest.m31 = -src.m31; + dest.m32 = -src.m32; + dest.m33 = -src.m33; + + return dest; + } + + public boolean equals(Object m) { + return (m instanceof Matrix4f) && equal(this, (Matrix4f) m); + } + + public static boolean equal(Matrix4f a, Matrix4f b) { + return a.m00 == b.m00 && a.m01 == b.m01 && a.m02 == b.m02 && a.m03 == b.m03 && a.m10 == b.m10 && a.m11 == b.m11 + && a.m12 == b.m12 && a.m13 == b.m13 && a.m20 == b.m20 && a.m21 == b.m21 && a.m22 == b.m22 + && a.m23 == b.m23 && a.m30 == b.m30 && a.m31 == b.m31 && a.m32 == b.m32 && a.m33 == b.m33; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java new file mode 100644 index 0000000..663448f --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * + * Quaternions for LWJGL! + * + * @author fbi + * @version $Revision$ + * $Id$ + */ + +import java.nio.FloatBuffer; + +public class Quaternion extends Vector implements ReadableVector4f { + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * C'tor. The quaternion will be initialized to the identity. + */ + public Quaternion() { + super(); + setIdentity(); + } + + /** + * C'tor + * + * @param src + */ + public Quaternion(ReadableVector4f src) { + set(src); + } + + /** + * C'tor + * + */ + public Quaternion(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src The source vector + * @return this + */ + public Quaternion set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * Set this quaternion to the multiplication identity. + * + * @return this + */ + public Quaternion setIdentity() { + return setIdentity(this); + } + + /** + * Set the given quaternion to the multiplication identity. + * + * @param q The quaternion + * @return q + */ + public static Quaternion setIdentity(Quaternion q) { + q.x = 0; + q.y = 0; + q.z = 0; + q.w = 1; + return q; + } + + /** + * @return the length squared of the quaternion + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Normalise the source quaternion and place the result in another quaternion. + * + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return The normalised quaternion + */ + public static Quaternion normalise(Quaternion src, Quaternion dest) { + float inv_l = 1f / src.length(); + + if (dest == null) + dest = new Quaternion(); + + dest.set(src.x * inv_l, src.y * inv_l, src.z * inv_l, src.w * inv_l); + + return dest; + } + + /** + * Normalise this quaternion and place the result in another quaternion. + * + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return the normalised quaternion + */ + public Quaternion normalise(Quaternion dest) { + return normalise(this, dest); + } + + /** + * The dot product of two quaternions + * + * @param left The LHS quat + * @param right The RHS quat + * @return left dot right + */ + public static float dot(Quaternion left, Quaternion right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param dest The quaternion which should be set to the conjugate of this + * quaternion + */ + public Quaternion negate(Quaternion dest) { + return negate(this, dest); + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param src The source quaternion + * @param dest The quaternion which should be set to the conjugate of this + * quaternion + */ + public static Quaternion negate(Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + + dest.x = -src.x; + dest.y = -src.y; + dest.z = -src.z; + dest.w = src.w; + + return dest; + } + + /** + * Calculate the conjugate of this quaternion + */ + public Vector negate() { + return negate(this, this); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.Vector#load(java.nio.FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + return scale(scale, this, this); + } + + /** + * Scale the source quaternion by scale and put the result in the destination + * + * @param scale The amount to scale by + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return The scaled quaternion + */ + public static Quaternion scale(float scale, Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.x = src.x * scale; + dest.y = src.y * scale; + dest.z = src.z * scale; + dest.w = src.w * scale; + return dest; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.ReadableVector#store(java.nio.FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getW() + */ + public float getW() { + return w; + } + + public String toString() { + return "Quaternion: " + x + " " + y + " " + z + " " + w; + } + + /** + * Sets the value of this quaternion to the quaternion product of quaternions + * left and right (this = left * right). Note that this is safe for aliasing + * (e.g. this can be left or right). + * + * @param left the first quaternion + * @param right the second quaternion + */ + public static Quaternion mul(Quaternion left, Quaternion right, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.set(left.x * right.w + left.w * right.x + left.y * right.z - left.z * right.y, + left.y * right.w + left.w * right.y + left.z * right.x - left.x * right.z, + left.z * right.w + left.w * right.z + left.x * right.y - left.y * right.x, + left.w * right.w - left.x * right.x - left.y * right.y - left.z * right.z); + return dest; + } + + /** + * + * Multiplies quaternion left by the inverse of quaternion right and places the + * value into this quaternion. The value of both argument quaternions is + * preservered (this = left * right^-1). + * + * @param left the left quaternion + * @param right the right quaternion + */ + public static Quaternion mulInverse(Quaternion left, Quaternion right, Quaternion dest) { + float n = right.lengthSquared(); + // zero-div may occur. + n = (n == 0.0 ? n : 1 / n); + // store on stack once for aliasing-safty + if (dest == null) + dest = new Quaternion(); + dest.set((left.x * right.w - left.w * right.x - left.y * right.z + left.z * right.y) * n, + (left.y * right.w - left.w * right.y - left.z * right.x + left.x * right.z) * n, + (left.z * right.w - left.w * right.z - left.x * right.y + left.y * right.x) * n, + (left.w * right.w + left.x * right.x + left.y * right.y + left.z * right.z) * n); + + return dest; + } + + /** + * Sets the value of this quaternion to the equivalent rotation of the + * Axis-Angle argument. + * + * @param a1 the axis-angle: (x,y,z) is the axis and w is the angle + */ + public final void setFromAxisAngle(Vector4f a1) { + x = a1.x; + y = a1.y; + z = a1.z; + float n = (float) Math.sqrt(x * x + y * y + z * z); + // zero-div may occur. + float s = (float) (Math.sin(0.5 * a1.w) / n); + x *= s; + y *= s; + z *= s; + w = (float) Math.cos(0.5 * a1.w); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m The matrix + * @return this + */ + public final Quaternion setFromMatrix(Matrix4f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + * @param q The destination quaternion, or null if a new quaternion is to be + * created + * @return q + */ + public static Quaternion setFromMatrix(Matrix4f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, m.m21, m.m22); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + */ + public final Quaternion setFromMatrix(Matrix3f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + * @param q The destination quaternion, or null if a new quaternion is to be + * created + * @return q + */ + public static Quaternion setFromMatrix(Matrix3f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, m.m21, m.m22); + } + + /** + * Private method to perform the matrix-to-quaternion conversion + */ + private Quaternion setFromMat(float m00, float m01, float m02, float m10, float m11, float m12, float m20, + float m21, float m22) { + + float s; + float tr = m00 + m11 + m22; + if (tr >= 0.0) { + s = (float) Math.sqrt(tr + 1.0); + w = s * 0.5f; + s = 0.5f / s; + x = (m21 - m12) * s; + y = (m02 - m20) * s; + z = (m10 - m01) * s; + } else { + float max = Math.max(Math.max(m00, m11), m22); + if (max == m00) { + s = (float) Math.sqrt(m00 - (m11 + m22) + 1.0); + x = s * 0.5f; + s = 0.5f / s; + y = (m01 + m10) * s; + z = (m20 + m02) * s; + w = (m21 - m12) * s; + } else if (max == m11) { + s = (float) Math.sqrt(m11 - (m22 + m00) + 1.0); + y = s * 0.5f; + s = 0.5f / s; + z = (m12 + m21) * s; + x = (m01 + m10) * s; + w = (m02 - m20) * s; + } else { + s = (float) Math.sqrt(m22 - (m00 + m11) + 1.0); + z = s * 0.5f; + s = 0.5f / s; + x = (m20 + m02) * s; + y = (m12 + m21) * s; + w = (m10 - m01) * s; + } + } + return this; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java new file mode 100644 index 0000000..e72d312 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.nio.FloatBuffer; + +/** + * @author foo + */ +public interface ReadableVector { + /** + * @return the length of the vector + */ + float length(); + + /** + * @return the length squared of the vector + */ + float lengthSquared(); + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + Vector store(FloatBuffer buf); +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java new file mode 100644 index 0000000..f857c6f --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector2f extends ReadableVector { + /** + * @return x + */ + float getX(); + + /** + * @return y + */ + float getY(); +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java new file mode 100644 index 0000000..6eae2ec --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector3f extends ReadableVector2f { + /** + * @return z + */ + float getZ(); +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java new file mode 100644 index 0000000..feedc20 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector4f extends ReadableVector3f { + + /** + * @return w + */ + float getW(); + +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java new file mode 100644 index 0000000..61dfb43 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for vectors. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ +public abstract class Vector implements Serializable, ReadableVector { + + /** + * Constructor for Vector. + */ + protected Vector() { + super(); + } + + /** + * @return the length of the vector + */ + public final float length() { + return (float) Math.sqrt(lengthSquared()); + } + + /** + * @return the length squared of the vector + */ + public abstract float lengthSquared(); + + /** + * Load this vector from a FloatBuffer + * + * @param buf The buffer to load it from, at the current position + * @return this + */ + public abstract Vector load(FloatBuffer buf); + + /** + * Negate a vector + * + * @return this + */ + public abstract Vector negate(); + + /** + * Normalise this vector + * + * @return this + */ + public final Vector normalise() { + float len = length(); + if (len != 0.0f) { + float l = 1.0f / len; + return scale(l); + } else + throw new IllegalStateException("Zero length vector"); + } + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + public abstract Vector store(FloatBuffer buf); + + /** + * Scale this vector + * + * @param scale The scale factor + * @return this + */ + public abstract Vector scale(float scale); + +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java new file mode 100644 index 0000000..4201c7a --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector2f extends Vector implements Serializable, ReadableVector2f, WritableVector2f { + + private static final long serialVersionUID = 1L; + + public float x, y; + + /** + * Constructor for Vector2f. + */ + public Vector2f() { + super(); + } + + /** + * Constructor. + */ + public Vector2f(ReadableVector2f src) { + set(src); + } + + /** + * Constructor. + */ + public Vector2f(float x, float y) { + set(x, y); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /** + * Load from another Vector2f + * + * @param src The source vector + * @return this + */ + public Vector2f set(ReadableVector2f src) { + x = src.getX(); + y = src.getY(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector2f translate(float x, float y) { + this.x += x; + this.y += y; + return this; + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector2f negate(Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + dest.x = -x; + dest.y = -y; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector2f normalise(Vector2f dest) { + float l = length(); + + if (dest == null) + dest = new Vector2f(x / l, y / l); + else + dest.set(x / l, y / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector2f left, Vector2f right) { + return left.x * right.x + left.y * right.y; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector2f a, Vector2f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector2f add(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x + right.x, left.y + right.y); + else { + dest.set(left.x + right.x, left.y + right.y); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector2f sub(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x - right.x, left.y - right.y); + else { + dest.set(left.x - right.x, left.y - right.y); + return dest; + } + } + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + return this; + } + + /** + * Load this vector from a FloatBuffer + * + * @param buf The buffer to load it from, at the current position + * @return this + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + + return this; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector2f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector2f other = (Vector2f) obj; + + if (x == other.x && y == other.y) + return true; + + return false; + } + +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java new file mode 100644 index 0000000..282170f --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector3f extends Vector implements Serializable, ReadableVector3f, WritableVector3f { + + private static final long serialVersionUID = 1L; + + public float x, y, z; + + /** + * Constructor for Vector3f. + */ + public Vector3f() { + super(); + } + + /** + * Constructor + */ + public Vector3f(ReadableVector3f src) { + set(src); + } + + /** + * Constructor + */ + public Vector3f(float x, float y, float z) { + set(x, y, z); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Load from another Vector3f + * + * @param src The source vector + * @return this + */ + public Vector3f set(ReadableVector3f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector3f translate(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector3f add(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x + right.x, left.y + right.y, left.z + right.z); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector3f sub(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x - right.x, left.y - right.y, left.z - right.z); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + return dest; + } + } + + /** + * The cross product of two vectors. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination result, or null if a new vector is to be created + * @return left cross right + */ + public static Vector3f cross(Vector3f left, Vector3f right, Vector3f dest) { + + if (dest == null) + dest = new Vector3f(); + + dest.set(left.y * right.z - left.z * right.y, right.x * left.z - right.z * left.x, + left.x * right.y - left.y * right.x); + + return dest; + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector3f negate(Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector3f normalise(Vector3f dest) { + float l = length(); + + if (dest == null) + dest = new Vector3f(x / l, y / l, z / l); + else + dest.set(x / l, y / l, z / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector3f left, Vector3f right) { + return left.x * right.x + left.y * right.y + left.z * right.z; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector3f a, Vector3f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + z *= scale; + + return this; + + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + + return this; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector3f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(", "); + sb.append(z); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector3f other = (Vector3f) obj; + + if (x == other.x && y == other.y && z == other.z) + return true; + + return false; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java new file mode 100644 index 0000000..7582396 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java @@ -0,0 +1,377 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 4-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector4f extends Vector implements Serializable, ReadableVector4f, WritableVector4f { + + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * Constructor for Vector4f. + */ + public Vector4f() { + super(); + } + + /** + * Constructor + */ + public Vector4f(ReadableVector4f src) { + set(src); + } + + /** + * Constructor + */ + public Vector4f(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src The source vector + * @return this + */ + public Vector4f set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector4f translate(float x, float y, float z, float w) { + this.x += x; + this.y += y; + this.z += z; + this.w += w; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector4f add(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector4f sub(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + return dest; + } + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + w = -w; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector4f negate(Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + dest.w = -w; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector4f normalise(Vector4f dest) { + float l = length(); + + if (dest == null) + dest = new Vector4f(x / l, y / l, z / l, w / l); + else + dest.set(x / l, y / l, z / l, w / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + v1.w * v2.w + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector4f left, Vector4f right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector4f a, Vector4f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + x *= scale; + y *= scale; + z *= scale; + w *= scale; + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + public String toString() { + return "Vector4f: " + x + " " + y + " " + z + " " + w; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getW() { + return w; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector4f other = (Vector4f) obj; + + if (x == other.x && y == other.y && z == other.z && w == other.w) + return true; + + return false; + } +} diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java new file mode 100644 index 0000000..faa6c71 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector2fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector2f { + + /** + * Set the X value + * + * @param x + */ + void setX(float x); + + /** + * Set the Y value + * + * @param y + */ + void setY(float y); + + /** + * Set the X,Y values + * + * @param x + * @param y + */ + void set(float x, float y); + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java new file mode 100644 index 0000000..6c6e004 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector3fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector3f extends WritableVector2f { + + /** + * Set the Z value + * + * @param z + */ + void setZ(float z); + + /** + * Set the X,Y,Z values + * + * @param x + * @param y + * @param z + */ + void set(float x, float y, float z); + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java new file mode 100644 index 0000000..9870654 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector4fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector4f extends WritableVector3f { + + /** + * Set the W value + * + * @param w + */ + void setW(float w); + + /** + * Set the X,Y,Z,W values + * + * @param x + * @param y + * @param z + * @param w + */ + void set(float x, float y, float z, float w); + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/math/MathHelper.java b/src/main/java/net/PeytonPlayz585/math/MathHelper.java new file mode 100644 index 0000000..b5954f7 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/math/MathHelper.java @@ -0,0 +1,29 @@ +package net.PeytonPlayz585.math; + +public final class MathHelper { + + private static float[] SIN_TABLE = new float[4096]; + + public static final float sin(float var0) { + return SIN_TABLE[(int)(var0 * 651.8986F) & 4095]; + } + + public static final float cos(float var0) { + return SIN_TABLE[(int)((var0 + ((float)Math.PI / 2F)) * 651.8986F) & 4095]; + } + + public static final float sqrt(float var0) { + return (float)Math.sqrt((double)var0); + } + + static { + + for (int j = 0; j < 4096; ++j) { + SIN_TABLE[j] = (float)Math.sin((double)(((float)j + 0.5F) / 4096.0F * ((float)Math.PI * 2F))); + } + + for (int l = 0; l < 360; l += 90) { + SIN_TABLE[(int)((float)l * 11.377778F) & 4095] = (float)Math.sin((double)((float)l * 0.017453292F)); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/storage/LocalStorageManager.java b/src/main/java/net/PeytonPlayz585/storage/LocalStorageManager.java new file mode 100644 index 0000000..14adb88 --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/storage/LocalStorageManager.java @@ -0,0 +1,81 @@ +package net.PeytonPlayz585.storage; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.lwjgl.opengl.GL11; + +import net.PeytonPlayz595.nbt.NBTBase; +import net.PeytonPlayz595.nbt.NBTTagCompound; +import net.lax1dude.eaglercraft.Base64; + +public class LocalStorageManager { + + public static NBTTagCompound gameSettingsStorage = null; + public static NBTTagCompound levelSettingsStorage = null; + + public static void loadStorage() { + byte[] g = GL11.loadLocalStorage("g"); + byte[] p = GL11.loadLocalStorage("p"); + + if(g != null) { + try { + NBTBase t = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(g))); + if(t != null && t instanceof NBTTagCompound) { + gameSettingsStorage = (NBTTagCompound)t; + } + }catch(IOException e) { + ; + } + } + + if(p != null) { + try { + NBTBase t = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(p))); + if(t != null && t instanceof NBTTagCompound) { + levelSettingsStorage = (NBTTagCompound)t; + } + }catch(IOException e) { + ; + } + } + + if(gameSettingsStorage == null) gameSettingsStorage = new NBTTagCompound(); + if(levelSettingsStorage == null) levelSettingsStorage = new NBTTagCompound(); + + } + + public static void saveStorageG() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(gameSettingsStorage, new DataOutputStream(s)); + GL11.saveLocalStorage("g", s.toByteArray()); + } catch (IOException e) { + ; + } + } + + public static void saveStorageP() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(levelSettingsStorage, new DataOutputStream(s)); + GL11.saveLocalStorage("p", s.toByteArray()); + } catch (IOException e) { + ; + } + } + + public static String dumpConfiguration() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(gameSettingsStorage, new DataOutputStream(s)); + return Base64.encodeBase64String(s.toByteArray()); + } catch(Throwable e) { + return ""; + } + } + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTBase.java b/src/main/java/net/PeytonPlayz595/nbt/NBTBase.java new file mode 100644 index 0000000..a9bb352 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTBase.java @@ -0,0 +1,130 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public abstract class NBTBase { + + public NBTBase() { + key = null; + } + + abstract void writeTagContents(DataOutput dataoutput) throws IOException; + + abstract void readTagContents(DataInput datainput) throws IOException; + + public abstract byte getType(); + + public String getKey() { + if (key == null) { + return ""; + } else { + return key; + } + } + + public NBTBase setKey(String s) { + key = s; + return this; + } + + public static NBTBase readTag(DataInput datainput) throws IOException { + byte byte0 = datainput.readByte(); + if (byte0 == 0) { + return new NBTTagEnd(); + } else { + NBTBase nbtbase = createTagOfType(byte0); + nbtbase.key = datainput.readUTF(); + nbtbase.readTagContents(datainput); + return nbtbase; + } + } + + public static void writeTag(NBTBase nbtbase, DataOutput dataoutput) throws IOException { + dataoutput.writeByte(nbtbase.getType()); + if (nbtbase.getType() == 0) { + return; + } else { + dataoutput.writeUTF(nbtbase.getKey()); + nbtbase.writeTagContents(dataoutput); + return; + } + } + + public static NBTBase createTagOfType(byte byte0) { + switch (byte0) { + case 0: // '\0' + return new NBTTagEnd(); + + case 1: // '\001' + return new NBTTagByte(); + + case 2: // '\002' + return new NBTTagShort(); + + case 3: // '\003' + return new NBTTagInt(); + + case 4: // '\004' + return new NBTTagLong(); + + case 5: // '\005' + return new NBTTagFloat(); + + case 6: // '\006' + return new NBTTagDouble(); + + case 7: // '\007' + return new NBTTagByteArray(); + + case 8: // '\b' + return new NBTTagString(); + + case 9: // '\t' + return new NBTTagList(); + + case 10: // '\n' + return new NBTTagCompound(); + } + return null; + } + + public static String getTagName(byte byte0) { + switch (byte0) { + case 0: // '\0' + return "TAG_End"; + + case 1: // '\001' + return "TAG_Byte"; + + case 2: // '\002' + return "TAG_Short"; + + case 3: // '\003' + return "TAG_Int"; + + case 4: // '\004' + return "TAG_Long"; + + case 5: // '\005' + return "TAG_Float"; + + case 6: // '\006' + return "TAG_Double"; + + case 7: // '\007' + return "TAG_Byte_Array"; + + case 8: // '\b' + return "TAG_String"; + + case 9: // '\t' + return "TAG_List"; + + case 10: // '\n' + return "TAG_Compound"; + } + return "UNKNOWN"; + } + + private String key; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java new file mode 100644 index 0000000..22fcab6 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagByte extends NBTBase { + + public NBTTagByte() { + } + + public NBTTagByte(byte byte0) { + byteValue = byte0; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeByte(byteValue); + } + + void readTagContents(DataInput datainput) throws IOException { + byteValue = datainput.readByte(); + } + + public byte getType() { + return 1; + } + + public String toString() { + return (new StringBuilder()).append("").append(byteValue).toString(); + } + + public byte byteValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java new file mode 100644 index 0000000..0cd9af0 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java @@ -0,0 +1,34 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagByteArray extends NBTBase { + + public NBTTagByteArray() { + } + + public NBTTagByteArray(byte abyte0[]) { + byteArray = abyte0; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeInt(byteArray.length); + dataoutput.write(byteArray); + } + + void readTagContents(DataInput datainput) throws IOException { + int i = datainput.readInt(); + byteArray = new byte[i]; + datainput.readFully(byteArray); + } + + public byte getType() { + return 7; + } + + public String toString() { + return (new StringBuilder()).append("[").append(byteArray.length).append(" bytes]").toString(); + } + + public byte byteArray[]; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java new file mode 100644 index 0000000..8f71b26 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java @@ -0,0 +1,194 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; +import java.util.*; + +public class NBTTagCompound extends NBTBase { + + public NBTTagCompound() { + tagMap = new HashMap(); + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + NBTBase nbtbase; + for (Iterator iterator = tagMap.values().iterator(); iterator.hasNext(); NBTBase.writeTag(nbtbase, + dataoutput)) { + nbtbase = (NBTBase) iterator.next(); + } + + dataoutput.writeByte(0); + } + + void readTagContents(DataInput datainput) throws IOException { + tagMap.clear(); + NBTBase nbtbase; + for (; (nbtbase = NBTBase.readTag(datainput)).getType() != 0; tagMap.put(nbtbase.getKey(), nbtbase)) { + } + } + + public byte getType() { + return 10; + } + + public void setTag(String s, NBTBase nbtbase) { + tagMap.put(s, nbtbase.setKey(s)); + } + + public void setByte(String s, byte byte0) { + tagMap.put(s, (new NBTTagByte(byte0)).setKey(s)); + } + + public void setShort(String s, short word0) { + tagMap.put(s, (new NBTTagShort(word0)).setKey(s)); + } + + public void setInteger(String s, int i) { + tagMap.put(s, (new NBTTagInt(i)).setKey(s)); + } + + public void setLong(String s, long l) { + tagMap.put(s, (new NBTTagLong(l)).setKey(s)); + } + + public void setFloat(String s, float f) { + tagMap.put(s, (new NBTTagFloat(f)).setKey(s)); + } + + public void setDouble(String s, double d) { + tagMap.put(s, (new NBTTagDouble(d)).setKey(s)); + } + + public void setString(String s, String s1) { + tagMap.put(s, (new NBTTagString(s1)).setKey(s)); + } + + public void setByteArray(String s, byte abyte0[]) { + tagMap.put(s, (new NBTTagByteArray(abyte0)).setKey(s)); + } + + public void setObject(String s, Object obj) { + tagMap.put(s, obj); + } + + public void setCompoundTag(String s, NBTTagCompound nbttagcompound) { + tagMap.put(s, nbttagcompound.setKey(s)); + } + + public void setBoolean(String s, boolean flag) { + setByte(s, ((byte) (flag ? 1 : 0))); + } + + public boolean hasKey(String s) { + return tagMap.containsKey(s); + } + + public byte getByte(String s) { + if (!tagMap.containsKey(s)) { + return 0; + } else { + return ((NBTTagByte) tagMap.get(s)).byteValue; + } + } + + public short getShort(String s) { + if (!tagMap.containsKey(s)) { + return 0; + } else { + return ((NBTTagShort) tagMap.get(s)).shortValue; + } + } + + public int getInteger(String s) { + if (!tagMap.containsKey(s)) { + return 0; + } else { + return ((NBTTagInt) tagMap.get(s)).intValue; + } + } + + public long getLong(String s) { + if (!tagMap.containsKey(s)) { + return 0L; + } else { + return ((NBTTagLong) tagMap.get(s)).longValue; + } + } + + public float getFloat(String s) { + if (!tagMap.containsKey(s)) { + return 0.0F; + } else { + return ((NBTTagFloat) tagMap.get(s)).floatValue; + } + } + + public double getDouble(String s) { + if (!tagMap.containsKey(s)) { + return 0.0D; + } else { + return ((NBTTagDouble) tagMap.get(s)).doubleValue; + } + } + + public String getString(String s) { + if (!tagMap.containsKey(s)) { + return ""; + } else { + return ((NBTTagString) tagMap.get(s)).stringValue; + } + } + + public byte[] getByteArray(String s) { + if (!tagMap.containsKey(s)) { + return new byte[0]; + } else { + return ((NBTTagByteArray) tagMap.get(s)).byteArray; + } + } + + public NBTTagCompound getCompoundTag(String s) { + if (!tagMap.containsKey(s)) { + return new NBTTagCompound(); + } else { + return (NBTTagCompound) tagMap.get(s); + } + } + + public NBTTagList getTagList(String s) { + if (!tagMap.containsKey(s)) { + return new NBTTagList(); + } else { + return (NBTTagList) tagMap.get(s); + } + } + + public boolean getBoolean(String s) { + return getByte(s) != 0; + } + + public Object getObject(String s) { + if(!tagMap.containsKey(s)) { + return null; + } else { + return tagMap.get(s); + } + } + + public String toString() { + return (new StringBuilder()).append("").append(tagMap.size()).append(" entries").toString(); + } + + public boolean hasNoTags() { + return tagMap.size() == 0; + } + + public Map tagMap; + + public NBTBase getTag(String s) { + return (NBTBase) tagMap.get(s); + } + + public static Map getTagMap(NBTTagCompound nb) { + return nb.tagMap; + } +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java new file mode 100644 index 0000000..3c07cc9 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagDouble extends NBTBase { + + public NBTTagDouble() { + } + + public NBTTagDouble(double d) { + doubleValue = d; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeDouble(doubleValue); + } + + void readTagContents(DataInput datainput) throws IOException { + doubleValue = datainput.readDouble(); + } + + public byte getType() { + return 6; + } + + public String toString() { + return (new StringBuilder()).append("").append(doubleValue).toString(); + } + + public double doubleValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java new file mode 100644 index 0000000..8310773 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java @@ -0,0 +1,23 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagEnd extends NBTBase { + + public NBTTagEnd() { + } + + void readTagContents(DataInput datainput) throws IOException { + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + } + + public byte getType() { + return 0; + } + + public String toString() { + return "END"; + } +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java new file mode 100644 index 0000000..c547134 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagFloat extends NBTBase { + + public NBTTagFloat() { + } + + public NBTTagFloat(float f) { + floatValue = f; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeFloat(floatValue); + } + + void readTagContents(DataInput datainput) throws IOException { + floatValue = datainput.readFloat(); + } + + public byte getType() { + return 5; + } + + public String toString() { + return (new StringBuilder()).append("").append(floatValue).toString(); + } + + public float floatValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java new file mode 100644 index 0000000..2f5996c --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagInt extends NBTBase { + + public NBTTagInt() { + } + + public NBTTagInt(int i) { + intValue = i; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeInt(intValue); + } + + void readTagContents(DataInput datainput) throws IOException { + intValue = datainput.readInt(); + } + + public byte getType() { + return 3; + } + + public String toString() { + return (new StringBuilder()).append("").append(intValue).toString(); + } + + public int intValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java new file mode 100644 index 0000000..d1fac48 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java @@ -0,0 +1,63 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class NBTTagList extends NBTBase { + + public NBTTagList() { + tagList = new ArrayList(); + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + if (tagList.size() > 0) { + tagType = ((NBTBase) tagList.get(0)).getType(); + } else { + tagType = 1; + } + dataoutput.writeByte(tagType); + dataoutput.writeInt(tagList.size()); + for (int i = 0; i < tagList.size(); i++) { + ((NBTBase) tagList.get(i)).writeTagContents(dataoutput); + } + + } + + void readTagContents(DataInput datainput) throws IOException { + tagType = datainput.readByte(); + int i = datainput.readInt(); + tagList = new ArrayList(); + for (int j = 0; j < i; j++) { + NBTBase nbtbase = NBTBase.createTagOfType(tagType); + nbtbase.readTagContents(datainput); + tagList.add(nbtbase); + } + + } + + public byte getType() { + return 9; + } + + public String toString() { + return (new StringBuilder()).append("").append(tagList.size()).append(" entries of type ") + .append(NBTBase.getTagName(tagType)).toString(); + } + + public void setTag(NBTBase nbtbase) { + tagType = nbtbase.getType(); + tagList.add(nbtbase); + } + + public NBTBase tagAt(int i) { + return (NBTBase) tagList.get(i); + } + + public int tagCount() { + return tagList.size(); + } + + private List tagList; + private byte tagType; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java new file mode 100644 index 0000000..252515a --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagLong extends NBTBase { + + public NBTTagLong() { + } + + public NBTTagLong(long l) { + longValue = l; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeLong(longValue); + } + + void readTagContents(DataInput datainput) throws IOException { + longValue = datainput.readLong(); + } + + public byte getType() { + return 4; + } + + public String toString() { + return (new StringBuilder()).append("").append(longValue).toString(); + } + + public long longValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java new file mode 100644 index 0000000..481557d --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java @@ -0,0 +1,31 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagShort extends NBTBase { + + public NBTTagShort() { + } + + public NBTTagShort(short word0) { + shortValue = word0; + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeShort(shortValue); + } + + void readTagContents(DataInput datainput) throws IOException { + shortValue = datainput.readShort(); + } + + public byte getType() { + return 2; + } + + public String toString() { + return (new StringBuilder()).append("").append(shortValue).toString(); + } + + public short shortValue; +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java b/src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java new file mode 100644 index 0000000..307bf26 --- /dev/null +++ b/src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java @@ -0,0 +1,36 @@ +package net.PeytonPlayz595.nbt; + +import java.io.*; + +public class NBTTagString extends NBTBase { + + public NBTTagString() { + } + + public NBTTagString(String s) { + stringValue = s; + if (s == null) { + throw new IllegalArgumentException("Empty string not allowed"); + } else { + return; + } + } + + void writeTagContents(DataOutput dataoutput) throws IOException { + dataoutput.writeUTF(stringValue); + } + + void readTagContents(DataInput datainput) throws IOException { + stringValue = datainput.readUTF(); + } + + public byte getType() { + return 8; + } + + public String toString() { + return (new StringBuilder()).append("").append(stringValue).toString(); + } + + public String stringValue; +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java b/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java new file mode 100644 index 0000000..f952b08 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/AssetRepository.java @@ -0,0 +1,55 @@ +package net.lax1dude.eaglercraft; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.HashMap; + +import com.jcraft.jzlib.InflaterInputStream; + +public class AssetRepository { + + private static final HashMap filePool = new HashMap(); + + public static final void install(byte[] pkg) throws IOException { + ByteArrayInputStream in2 = new ByteArrayInputStream(pkg); + DataInputStream in = new DataInputStream(in2); + byte[] header = new byte[8]; + in.read(header); + if (!"EAGPKG!!".equals(new String(header, Charset.forName("UTF-8")))) + throw new IOException("invalid epk file"); + in.readUTF(); + in = new DataInputStream(new InflaterInputStream(in2)); + String s = null; + SHA1Digest dg = new SHA1Digest(); + while ("".equals(s = in.readUTF())) { + String path = in.readUTF(); + byte[] digest = new byte[20]; + byte[] digest2 = new byte[20]; + in.read(digest); + int len = in.readInt(); + byte[] file = new byte[len]; + in.read(file); + if (filePool.containsKey(path)) + continue; + dg.update(file, 0, len); + dg.doFinal(digest2, 0); + if (!Arrays.equals(digest, digest2)) + throw new IOException("invalid file hash for " + path); + filePool.put(path, file); + if (!"".equals(in.readUTF())) + throw new IOException("invalid epk file"); + } + if (in.available() > 0 || !" end".equals(s)) + throw new IOException("invalid epk file"); + } + + public static final byte[] getResource(String path) { + if (path.startsWith("/")) + path = path.substring(1); + return filePool.get(path); + } + +} \ No newline at end of file diff --git a/src/main/java/net/lax1dude/eaglercraft/Base64.java b/src/main/java/net/lax1dude/eaglercraft/Base64.java new file mode 100644 index 0000000..c8b3f69 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/Base64.java @@ -0,0 +1,857 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.lax1dude.eaglercraft; + +import java.math.BigInteger; +import java.nio.charset.Charset; + +/** + * Provides Base64 encoding and decoding as defined by + * RFC 2045. + * + *