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 0000000..2fa60b1 Binary files /dev/null and b/jars/jzlib-1.1.3.jar differ diff --git a/jars/teavm-interop-0.6.1.jar b/jars/teavm-interop-0.6.1.jar new file mode 100644 index 0000000..2264a3f Binary files /dev/null and b/jars/teavm-interop-0.6.1.jar differ diff --git a/jars/teavm-jso-0.6.1.jar b/jars/teavm-jso-0.6.1.jar new file mode 100644 index 0000000..34907c7 Binary files /dev/null and b/jars/teavm-jso-0.6.1.jar differ diff --git a/jars/teavm-jso-apis-0.6.1.jar b/jars/teavm-jso-apis-0.6.1.jar new file mode 100644 index 0000000..f0110a3 Binary files /dev/null and b/jars/teavm-jso-apis-0.6.1.jar differ diff --git a/md5/original.md5 b/md5/original.md5 new file mode 100644 index 0000000..e32646b --- /dev/null +++ b/md5/original.md5 @@ -0,0 +1,458 @@ +net/minecraft/client/Minecraft 89966db2dd48a958373305926582cc17 +net/minecraft/client/MinecraftApplet c457d27b24b1e89c9281fbf0be0af635 +net/minecraft/isom/IsomPreviewApplet 748706f989c417e2534d6dab485e5ef9 +net/minecraft/src/AxisAlignedBB e5e0cdecfc3c5d9c73a3bee86ccd42fe +net/minecraft/src/Block ff995d15badcfdb3d51bbf42e615e805 +net/minecraft/src/BlockBloodStone ea01841874902ea15f7eb309395d09ba +net/minecraft/src/BlockBookshelf b51f595f6269ed6b0364ae67b9483ec4 +net/minecraft/src/BlockBreakable 0878f451f57ba341c1cbe6a838e75b9e +net/minecraft/src/BlockButton 400c1a714a12de5a71303a62c28003b0 +net/minecraft/src/BlockCactus 8db1eb8cfe7e5c4fb7bf755fb82dd6ca +net/minecraft/src/BlockChest 5d8653803ffe95ead0b199abb71a15d3 +net/minecraft/src/BlockClay eed57fa621e9ef9a020a1a4e65494917 +net/minecraft/src/BlockContainer fc4b9897335a475d9ee94c2339cc0047 +net/minecraft/src/BlockCrops 9ddd11e08cc298cb38efebdf2fedc5f9 +net/minecraft/src/BlockDirt 7306c0210187b89ad56e1204e1cf4a20 +net/minecraft/src/BlockDoor f75b470ccb115a1c074f096dc48754e3 +net/minecraft/src/BlockFence 3edb6ca58a53116372029f31654f2ed6 +net/minecraft/src/BlockFire d8bd0fde97167526839fa2d8f8cfc521 +net/minecraft/src/BlockFlower f9ec96524d21db77b442a5ce752abd64 +net/minecraft/src/BlockFlowing 61a1772824a1da5a913eb7415cf23924 +net/minecraft/src/BlockFluids b4d91bf2f85e55736f3eb3762e57979d +net/minecraft/src/BlockFurnace 3491e4618790602f874a90946d4dd8fc +net/minecraft/src/BlockGlass 4843b9ed50cdf01bbe284a7dda30a84f +net/minecraft/src/BlockGrass 3bcaa9fbb205e72dff1d9bc172f785d2 +net/minecraft/src/BlockGravel 0937b3ca08c59bdbd46ae7fd26a393b1 +net/minecraft/src/BlockIce 2b5546e2d19d0b1a6e31e124a4255ac8 +net/minecraft/src/BlockJukeBox fc68d5d0aa72b67044cf9797ec9675b7 +net/minecraft/src/BlockLadder e9499c14a2dbf2c3963412023c26cdf9 +net/minecraft/src/BlockLeaves ed4a3d054234feed66a5c2ba8281bd0f +net/minecraft/src/BlockLeavesBase 7bb37fb7d71c51d5e32844e4265f96e0 +net/minecraft/src/BlockLever d6e700a3b7b189a0599d23a2f5650a0e +net/minecraft/src/BlockLightStone eb3b6d4687b87b9fd26cbfdc994b936e +net/minecraft/src/BlockLog b8cafdf450e10284f0c3d252c51d3512 +net/minecraft/src/BlockMinecartTrack 0f031c9f9fc04fa875dbf5868c91e045 +net/minecraft/src/BlockMobSpawner 844c83fc84365e42233e6cd892cc081a +net/minecraft/src/BlockMushroom 568c7cc22fcb0401e7a8e7a86bed675a +net/minecraft/src/BlockObsidian 944f6cf0005ba3bb6891d038e088527c +net/minecraft/src/BlockOre 1c8a201d113a73c9f74a7d196c25dc65 +net/minecraft/src/BlockOreBlock bba2393771cf81ee0b7773de5f7b4b0a +net/minecraft/src/BlockPortal 56a2110459d0c8be695dc89a0487deb8 +net/minecraft/src/BlockPressurePlate 6e1c6e6c30c8ff6cb725bf7b0da8a948 +net/minecraft/src/BlockPumpkin b31ec9f0fde3c48826515f1f99a34c39 +net/minecraft/src/BlockRedstoneOre db92390879234a3c79e746e5249b3427 +net/minecraft/src/BlockRedstoneTorch d28acc814a7b015ff36e5370d89b9bea +net/minecraft/src/BlockRedstoneWire b5002a4219a62378bbb1e6543f39f555 +net/minecraft/src/BlockReed cd0ae6b003c0c991d6dd09c866ceab72 +net/minecraft/src/BlockSand bbc268fbcf32eb8de042a9816a47e8b4 +net/minecraft/src/BlockSapling bc187aacc06cc92bc0150be20c130172 +net/minecraft/src/BlockSign 6ac1c784c117feb463676f3b465537c9 +net/minecraft/src/BlockSlowSand e7d7a9cea824c53a82cf6267537de6b0 +net/minecraft/src/BlockSnow e907a5aa72368f28b0d220a0ba8e68f9 +net/minecraft/src/BlockSnowBlock 50e28b302f4e338f0fe4bc837360ec87 +net/minecraft/src/BlockSoil 5c7fd49da4b5bda06504f60dc2aea11a +net/minecraft/src/BlockSponge ec94d9a11488651f6068345ffded7bff +net/minecraft/src/BlockStairs 12e53535cb5ff8de0af92209a65d3146 +net/minecraft/src/BlockStationary 5c3bf0b9eb1d82ca030a0cd896f5ef8a +net/minecraft/src/BlockStep 5f6940e49b7db0fb19b39ad027bcbb46 +net/minecraft/src/BlockStone 543d6587b9f5f29087027a2eb98a37a1 +net/minecraft/src/BlockTNT a5e3b52a9f10bf88b7773f113c2c66c0 +net/minecraft/src/BlockTorch b5fc670cef94c1a4c56e36c1f7a2e8a2 +net/minecraft/src/BlockWorkbench 876fe287e784d35fb41aeec1679e0c41 +net/minecraft/src/CanvasCrashReport c398ac38bac235fc40f7e5d61386c298 +net/minecraft/src/CanvasIsomPreview 1f224d4e1fbcfa521d89df8f672143e4 +net/minecraft/src/CanvasMajongLogo 091d1c6633c015d517c11793f7ee73f3 +net/minecraft/src/CanvasMinecraftApplet 11c0ea3008b2eb0bd94eb55ba65674ac +net/minecraft/src/ChatLine ef5b623999f13dc90187a55b32e1fed6 +net/minecraft/src/Chunk 4feb92b3a34c1330e1ed196828a59561 +net/minecraft/src/ChunkCache 3884ca011c197918e098e7481c205cb1 +net/minecraft/src/ChunkCoordinates a556705f28ee9bf398304515ead1b4a2 +net/minecraft/src/ChunkCoordIntPair 175fc500b50527f772ce3f9f4cdbf93a +net/minecraft/src/ChunkLoader c821b068b70d7f7be36fa2968e3f1c19 +net/minecraft/src/ChunkPosition d5a550d6183ffae16008fa8c0d07b1ab +net/minecraft/src/ChunkProviderClient 1f23b310e5cff489c1e32068a7222857 +net/minecraft/src/ChunkProviderGenerate 4137d050f5aeb70f69519291a6f6a1a2 +net/minecraft/src/ChunkProviderHell 800591d915d819c4fcabae8fc7f2c298 +net/minecraft/src/ChunkProviderIso ee2aa96ca6f70d9f86ed65d2b8edf602 +net/minecraft/src/ChunkProviderLoadOrGenerate 7e94bbcefbd78b8f158e77116df94b7f +net/minecraft/src/ClippingHelper 077b0430c8337808ee54e39e11703825 +net/minecraft/src/ClippingHelperImplementation 8252f0e1baa77332d0e464c62f27223c +net/minecraft/src/CodecMus ed4051fe4b69923b7814a2e3895560e2 +net/minecraft/src/ColorizerFoliage 54a93913e26a30abcbca43b9a6b8b55e +net/minecraft/src/ColorizerGrass 496e1d02dd9b53688ccfe96afda6e417 +net/minecraft/src/CompressedStreamTools fe943900ae5e9910eceabe6c36e3de07 +net/minecraft/src/CraftingInventoryCB 1ff81b9776ef914d376a0419ace1db36 +net/minecraft/src/CraftingInventoryPlayerCB 7a3deef92be274b9d04ae166ede472ef +net/minecraft/src/CraftingInventoryWorkbenchCB bc7a7e512d8ffa5e53b181a3647a3d8d +net/minecraft/src/CraftingManager a5036b4cb24876e2c4f9fdeb0583f634 +net/minecraft/src/CraftingRecipe dba3f5f306a82aa9ec4075fd7e1bce89 +net/minecraft/src/EffectRenderer 1e36c82d725656a91aabc9d685286d23 +net/minecraft/src/Entity 7352c9d68872ea0291971ef214eae6f6 +net/minecraft/src/EntityAnimals 6adc25347a76513153fed0536f264dab +net/minecraft/src/EntityArrow c8cf6f8a8a518fb2f719beef9972d8f5 +net/minecraft/src/EntityBoat 864a563af3e0bbea01ab361b8dab676a +net/minecraft/src/EntityBubbleFX a9858453fe0753ae9e978f999104a558 +net/minecraft/src/EntityChicken 4ad0969cbdb87fd8a2d257edf2f362f1 +net/minecraft/src/EntityClientPlayerMP 17b39fdb3a4b006e0cfd81a4c3ce0228 +net/minecraft/src/EntityCow 33a4658b8bd031f994874f77c1ea39f2 +net/minecraft/src/EntityCreature c8a14accc32483feead7c39dc42384c1 +net/minecraft/src/EntityCreeper d3f8f398e70848310d0a2c5106cda0cd +net/minecraft/src/EntityDiggingFX dc0f132649846251f2423fbaeb1f0f1a +net/minecraft/src/EntityExplodeFX e903225cf86531b0feea9d80e5b4f97d +net/minecraft/src/EntityFallingSand 6e666cd3bc2fc4a4feaf630e8eadd586 +net/minecraft/src/EntityFireball 61fa15f282ec0fd7a6110c3462fd7421 +net/minecraft/src/EntityFish 97636a79a813e667389f974da2956ab7 +net/minecraft/src/EntityFlameFX 42542ee08bbda57fb226c1cd758c2614 +net/minecraft/src/EntityFlying 9d9af138368636ded65b9375b77243ee +net/minecraft/src/EntityFX 9e4ca7bd2786728aaf92438e3c1075f2 +net/minecraft/src/EntityGhast fa3650dd659569f5860469633106ac68 +net/minecraft/src/EntityItem 2d5cca68d0c9d9df168ffaa39647e19d +net/minecraft/src/EntityLavaFX 115188d036ff9efe49423291f62bd1c4 +net/minecraft/src/EntityList 465112f8bc193f987056b062bf844281 +net/minecraft/src/EntityLiving 1ebc65c3b2c04dc519fc397ddc1d5026 +net/minecraft/src/EntityMinecart ea6571e883e7c21db11be5a184264884 +net/minecraft/src/EntityMobs 48b26e146ec634213e8a2acde6465dbb +net/minecraft/src/EntityOtherPlayerMP 64c325562f20d46160700ab76760c888 +net/minecraft/src/EntityPainting 276c4d06269f9ef4ef04932c35d0dc87 +net/minecraft/src/EntityPickupFX dfd864af092ca02ea633f2aa48048e23 +net/minecraft/src/EntityPig 61c33750791a626774cfb1c940e7cfa8 +net/minecraft/src/EntityPigZombie fd1e73d1680d863f8673199e1d31b068 +net/minecraft/src/EntityPlayer f032a90d34b7d5d1ea6c21eb9fd76a8b +net/minecraft/src/EntityPlayerSP c3a792ef46459b4c457a90b889634ded +net/minecraft/src/EntityPortalFX 556aafe8f0da1c0a6cd3cbf6c6c835c2 +net/minecraft/src/EntityRainFX 2774ed41145450c1c8bbce518621df46 +net/minecraft/src/EntityReddustFX 5344fecdfb9114bc21c3c15d993115ac +net/minecraft/src/EntityRenderer d63337d5ece5e89746b2877d0bd9ceca +net/minecraft/src/EntitySheep f4c7d892485d1ff3f8e9410043db1699 +net/minecraft/src/EntitySkeleton ef2c82d1d877dfa7e783cb5a871c5bed +net/minecraft/src/EntitySlime 165f9d004f48cf82c8add7374fa4d81c +net/minecraft/src/EntitySlimeFX c30c8dea09e21b0acf5a9039392a4e4d +net/minecraft/src/EntitySmokeFX 872374d9b1a6e79d3ba5c17021accbf6 +net/minecraft/src/EntitySnowball 076768de0aec5c1953ece673ab5f6d75 +net/minecraft/src/EntitySorter b7b7fa4afbc9c74ec5357b8f6cea7c26 +net/minecraft/src/EntitySpider 08f27b9b63a4fcfabbb91c103feb35b0 +net/minecraft/src/EntitySplashFX 1a83c278ed166fc450183871344c71ed +net/minecraft/src/EntityTNTPrimed 024434afd80b3b67e82cf386c20a233e +net/minecraft/src/EntityZombie 5b5aab87ca480509b2aa77e7686fc619 +net/minecraft/src/EntityZombieSimple 365782b2b2ee48ad60be20e07f708c98 +net/minecraft/src/EnumArt 4bec7c9f8112c0c7686d5000c30c8b32 +net/minecraft/src/EnumCreatureType 0ae86753f8175531a00cd43aced92616 +net/minecraft/src/EnumMobType 67f79e9368e7d1c55409aafcc9e53afb +net/minecraft/src/EnumOS1 03f72bfafe3656a640c199674662dd79 +net/minecraft/src/EnumOS2 155dcac2e9377c2d1505d8cd93cfe929 +net/minecraft/src/EnumOSMappingHelper 91e91b3c10a64f724429c8a34ad67d8f +net/minecraft/src/EnumSkyBlock 7d7469015343d74def3af7b3d66a9ebb +net/minecraft/src/Explosion eb295adc6ec44b29a5e4b137b1e50ceb +net/minecraft/src/FontRenderer 67bfe0987dff9c5783c154f8b57e510e +net/minecraft/src/Frustrum d015f3f148a6f0fe245df8859d4a6314 +net/minecraft/src/GameSettings 9fc92558af2f250c0c6dc371b1f9c04f +net/minecraft/src/GameWindowListener 64c948c2f3a37c88883324657b9cd0f0 +net/minecraft/src/GLAllocation 341dcdfc6e4e4890710c5d7f52f8c3b3 +net/minecraft/src/Gui 5cffe342bc5f6a22e42f7a34b3e5dfd8 +net/minecraft/src/GuiButton dc05bcc9c9a304acb593cf403cb7a975 +net/minecraft/src/GuiChat eebe27c489fce254eedafd3ce626765b +net/minecraft/src/GuiChest 09aebabf50dceb10df6ebd271e658268 +net/minecraft/src/GuiConflictWarning 84dfbb08d7997d5dae14edc4ec288359 +net/minecraft/src/GuiConnectFailed 3aae759e0e57bc7d06d089f9cdf9ae25 +net/minecraft/src/GuiConnecting 3a11e0be250bf1bf65005611af21dda9 +net/minecraft/src/GuiContainer 92788f7b62950ec4552378853c27ff5b +net/minecraft/src/GuiControls fd44b71418ed6e28b50814b5e4194fd4 +net/minecraft/src/GuiCrafting eea79c7d89905a783f46dd81c5df4e66 +net/minecraft/src/GuiDeleteWorld d2776817813a697ca8aa40d82ef83c78 +net/minecraft/src/GuiDownloadTerrain 5f1271ccc936711b4ba2854e70df27af +net/minecraft/src/GuiEditSign 685fe2c5b94b8c3f452f0499c0858ad2 +net/minecraft/src/GuiFurnace 306c2085b6b4f4da2d29de8617b819e5 +net/minecraft/src/GuiGameOver 8db08229c4d4824f7a9f433cb5a310ae +net/minecraft/src/GuiIngame e4fd4e184c39b05abb3993134c1158f0 +net/minecraft/src/GuiIngameMenu e66fac46a15197994d32fdaac0f44553 +net/minecraft/src/GuiInventory 7a3fca835c42b2858842469467c59521 +net/minecraft/src/GuiMainMenu bfa18998417f74c05d5852a962609ae2 +net/minecraft/src/GuiMultiplayer 96709648d2b42721fc15369ba53f17c9 +net/minecraft/src/GuiOptions bb9492b1182c56d4f503bd628937ec10 +net/minecraft/src/GuiScreen b1be45d43f7b0d9fa3d0acbe4d4f1edc +net/minecraft/src/GuiSelectWorld 79874e88cb57ce582b1fc38cef75bf38 +net/minecraft/src/GuiSlider 8b8cb015fac3b3cbad81d9f36d610e84 +net/minecraft/src/GuiSmallButton 3706ec7ef89eca8c38123b0f732107c3 +net/minecraft/src/GuiTexturePacks 161793b9f252756e8e6ee8d789ee3d02 +net/minecraft/src/GuiUnused 6a9a0e8eeb7b35652c25b49fb242f358 +net/minecraft/src/GuiYesNo 3319eaabe93905b5a967d9b202e34fea +net/minecraft/src/HashEntry b07980c7ccc2340d226b0d7b2d6f292c +net/minecraft/src/IBlockAccess ad04c4b218111e26d232380a2276cc63 +net/minecraft/src/ICamera 787d43e6b80f3d119444fa401e119453 +net/minecraft/src/IChunkLoader 303ee5d14d93b3a12ebe02d6cca0093f +net/minecraft/src/IChunkProvider d81f8b9ec0d78cd10e850bd32b281fbe +net/minecraft/src/IInventory 5395bdd59e69f4f3dc13be77187a181f +net/minecraft/src/ImageBuffer d6df2630ebaf77429deff496c577e19e +net/minecraft/src/ImageBufferDownload de20c08985afe57bf870ddf61fb0202e +net/minecraft/src/IMobs 181d7751e16e6dda8157c6ec9aab26ae +net/minecraft/src/InventoryCrafting ba583d8bb33f5bcc3cf5f2d80d861430 +net/minecraft/src/InventoryCraftResult c482ad5ec57d4f6bd8ab71c724a403be +net/minecraft/src/InventoryLargeChest bbe20d2a4c082cf7b705f404c3b9534f +net/minecraft/src/InventoryPlayer 706cb98af6ba3f3503911b5d6bbf202c +net/minecraft/src/IProgressUpdate c6e073651ce4b641150c260918753e82 +net/minecraft/src/IsoImageBuffer ee68aa1fea9d21c56b22f344a5872854 +net/minecraft/src/Item 46d81cea23ffe7dbc8eaeacdd710a0a5 +net/minecraft/src/ItemArmor cea3c74d126147b85ca09915923ceb76 +net/minecraft/src/ItemAxe a4a0c1bf7b2cb867e255fbfe6269c51f +net/minecraft/src/ItemBlock 2ddeaa3a512b47b798ba94c91d43e674 +net/minecraft/src/ItemBoat 229a98d981ae7cf3cc4544bd4b8c0a9e +net/minecraft/src/ItemBow fcab21e20e6d99c518d7eede88357b9a +net/minecraft/src/ItemBucket ee2485686116be80033d3f8208baa0d9 +net/minecraft/src/ItemDoor 4bddcb91adc8f772144d8cc552242fed +net/minecraft/src/ItemFishingRod bbdd7dd04d3463eb40f9be43aa47aa05 +net/minecraft/src/ItemFlintAndSteel b8157bc0a4e384cdfef2653681cc7872 +net/minecraft/src/ItemFood a7b598a12bb9617c85b4fa05194bff48 +net/minecraft/src/ItemHoe 1d3c203f3d1cbd5fa17bb9e760c41fc3 +net/minecraft/src/ItemMinecart 1443887b425f06e04221b9aebde382e4 +net/minecraft/src/ItemPainting 8f77541fe95910fb295246f349bc8569 +net/minecraft/src/ItemPickaxe 5351a32f0e7fed7424227813f12a2768 +net/minecraft/src/ItemRecord 8e2ad1c7b3f01351d7c068296ba91127 +net/minecraft/src/ItemRedstone 4bc0e9d1bfc2ec7728b010ed270749fd +net/minecraft/src/ItemReed 4201f0eb0b84445b1d1afd68b22bdac7 +net/minecraft/src/ItemRenderer d6502ec55712c34290de1e9830377d2d +net/minecraft/src/ItemSaddle 02d15d7ca02ab1ecd8cd825d64a652b4 +net/minecraft/src/ItemSeeds 69eb602adc1eae6d05fdc6282c4a2099 +net/minecraft/src/ItemSign 750a36253ded1660c2b6c5a657666568 +net/minecraft/src/ItemSnowball 6dd3bd5977c100cd66207b76a86e162a +net/minecraft/src/ItemSoup d19b00778faf4a3c032fbf766da828e9 +net/minecraft/src/ItemSpade ebba80359671be23ba120908858aed22 +net/minecraft/src/ItemStack 77ea764069e799834e5fb61abfb3ce5b +net/minecraft/src/ItemSword dba5b56f35ff70a927b3f0141497e449 +net/minecraft/src/ItemTool 7e0810e3b402c9b1022942f9c6d90256 +net/minecraft/src/IWorldAccess 5cf883dc25ff62c444fe63e268fb9d4e +net/minecraft/src/KeyBinding 4d8509e13f823df62b66def428f5d80e +net/minecraft/src/LoadingScreenRenderer 4844e636adb953dd3a78f80339dfc698 +net/minecraft/src/LogoEffectRandomizer 04d81389588e1d36c8f605d85f59182d +net/minecraft/src/MapGenBase 8e419d134af0427914113cafa2831a8b +net/minecraft/src/MapGenCaves 53a37152e60892a85a2ca76345dd06e0 +net/minecraft/src/MapGenCavesHell 89037ab40da83cb57d7fd50acb9c56bf +net/minecraft/src/Material 429a66af5d939e9e7b9b457638ebfc48 +net/minecraft/src/MaterialLiquid 035ddc64388632c1c3ce9022a06c511f +net/minecraft/src/MaterialLogic fd54b4ab858b18e47c6d1803966fa1be +net/minecraft/src/MaterialTransparent 64bdf42bcc56854f23a909a8f4054d4b +net/minecraft/src/MathHelper ac2896de3315289a2e7b16342689657f +net/minecraft/src/MCHashTable 86ba5af193a72303fd455a037f5b4846 +net/minecraft/src/MetadataChunkBlock 7b14371ec69a950351b65ce9378747aa +net/minecraft/src/MinecartTrackLogic 0d8b52c3570cb3d03871a39731076dbe +net/minecraft/src/MinecraftAppletImpl 6f8d9893c997f13baf8effd9e93ab2b8 +net/minecraft/src/MinecraftError f9a8a0018501856f621a191504edc041 +net/minecraft/src/MinecraftException c3e6d9e46c9f44513f74c73f08961284 +net/minecraft/src/MinecraftImpl f3d3108153e314e9a4ca4c4a44c24ea3 +net/minecraft/src/MobSpawnerBase 62402be68062bd626d46c01fd6e1fbb3 +net/minecraft/src/MobSpawnerDesert e074ef58d6b5f8bacb3d0481596de865 +net/minecraft/src/MobSpawnerHell 03d0f5a207758672dfc4ac3445771061 +net/minecraft/src/MobSpawnerSwamp d0a5dba6f5f8e1f9903cfa374f97cd1f +net/minecraft/src/ModelBase f3e3a1b539e8dc3ec79d3be558b654b6 +net/minecraft/src/ModelBiped c9118eb2a938062ffaf8ac49d17aeed6 +net/minecraft/src/ModelBoat 6874f03ac44792a459caf70d7bd1ee2d +net/minecraft/src/ModelChicken 2e3753bed0dd5e447c5fffebf6f347fe +net/minecraft/src/ModelCow 9c90bee475c7ab12fa31a4e40ab29983 +net/minecraft/src/ModelCreeper 9f8068c683a73f7003b399baa37989b3 +net/minecraft/src/ModelGhast e25974690953b43cd09ef3eaa4b6b10d +net/minecraft/src/ModelMinecart 1c7a1f1ee0ab9484580828cf144c800e +net/minecraft/src/ModelPig 048d6052860bb970ffd18118b27c3f7f +net/minecraft/src/ModelQuadraped 63eda3c86c419f354985e673904a520c +net/minecraft/src/ModelRenderer ec4d7674e44f39a06ebdf5c9fce581e3 +net/minecraft/src/ModelSheep1 c2655fb852b5e8800c508ce2f0cb36c9 +net/minecraft/src/ModelSheep2 b89fc6bae575f83026c6ebcf318c1a14 +net/minecraft/src/ModelSkeleton ef3539b59c4e4bf9f300fe80c2b3c88b +net/minecraft/src/ModelSlime 46a83d3e5ac514f3a4984d931914fb8a +net/minecraft/src/ModelSpider a1f9527d3b4791e88f640e80b91d17b3 +net/minecraft/src/ModelZombie dd9af848b6977be883efdf19b4204e30 +net/minecraft/src/MouseHelper 52a3e7b3802f0a914a7f76b6f58711f7 +net/minecraft/src/MovementInput 7c505af7f11473cda49320187d2962e5 +net/minecraft/src/MovementInputFromOptions 4313a5cc6d0583990518a40baf05d32c +net/minecraft/src/MovingObjectPosition d224c4862edee121a0197cba50b67a1f +net/minecraft/src/MusInputStream 2ff8c43ba3f3ef5827d2b677d90a47f8 +net/minecraft/src/NBTBase 06858536273e1e8a6fabe856fb0760cb +net/minecraft/src/NBTTagByte 21e1b9ffee3aa3df48250cca489d74e3 +net/minecraft/src/NBTTagByteArray 8004b8fb3badc6979c10bec186f61877 +net/minecraft/src/NBTTagCompound d4c5a08afa07f255f4a8d6a6b7e2e17d +net/minecraft/src/NBTTagDouble bf77bf257cedd9751f16bf57ea503c47 +net/minecraft/src/NBTTagEnd 0a6903b0dc523806101334c8ec3f2e5e +net/minecraft/src/NBTTagFloat 9ea39302525393a03ddb739f8cc9ca17 +net/minecraft/src/NBTTagInt 01704968601ac82acdf618b8a6c6714d +net/minecraft/src/NBTTagList 400f104153da8eef33c3d00c42e99279 +net/minecraft/src/NBTTagLong 8078672f86016518857a83da24aad04b +net/minecraft/src/NBTTagShort dee6dc2f08cc9cd72fc4c929e91dd0af +net/minecraft/src/NBTTagString 9c4f18cf4ab51377ef477412af18692b +net/minecraft/src/NetClientHandler bb7f430c8320ceda3625ccfec72e10f9 +net/minecraft/src/NetHandler 5546aca6195832ee50fb0b6533360f47 +net/minecraft/src/NetworkManager 3bab4edae29a2ae00a0556ce62cfd70e +net/minecraft/src/NetworkMasterThread 4a4c0ff68bc41647effe3a5914f77f39 +net/minecraft/src/NetworkReaderThread c3bd72f73a24ec9cd99b527880dd1645 +net/minecraft/src/NetworkWriterThread 3cf78af8723478685fc2862943963697 +net/minecraft/src/NextTickListEntry ca99662528252a022a4876a54a978fd4 +net/minecraft/src/NibbleArray 6f2dabe0967d3b3c0dd9bceacfdf7612 +net/minecraft/src/NoiseGenerator 6d2bf3399aaf20f9ffa2882f610bc474 +net/minecraft/src/NoiseGenerator2 5c04d0ab93111566b6e5cb91f05fe8e8 +net/minecraft/src/NoiseGeneratorOctaves d70d74d3a84d18a706ba7510fa0106f6 +net/minecraft/src/NoiseGeneratorOctaves2 e206e022b0ee32c2cdb2db87f60cf1d2 +net/minecraft/src/NoiseGeneratorPerlin bf9b46f166437214e41ff8d81dd4b3f4 +net/minecraft/src/OpenGlCapsChecker c7ab6b773baa91e800aea315a18375eb +net/minecraft/src/OsMap fa7204edf50503be5a4ee32732b88474 +net/minecraft/src/Packet 6988011a60b1582c18871fa151cd9432 +net/minecraft/src/Packet0KeepAlive e1b8b926088f54d3ded322be2c13057f +net/minecraft/src/Packet10Flying 4913ed75aa93dc73254faf4b227a91bd +net/minecraft/src/Packet11PlayerPosition c79f8decb3b75734f1180e0cf5a976f2 +net/minecraft/src/Packet12PlayerLook f4f5dd2c36751f0782e5dc4fd89784ab +net/minecraft/src/Packet13PlayerLookMove 300dbca74a54f2e881d67bd844328903 +net/minecraft/src/Packet14BlockDig c087d7f95830fe7fb265d1bb78350fa6 +net/minecraft/src/Packet15Place 9fbbf591b0a93c7a23643de932074623 +net/minecraft/src/Packet16BlockItemSwitch 12be8125480dbc46f1f9b73ced1e9e82 +net/minecraft/src/Packet17AddToInventory daf095c4a8dccfc2e4d818bef8db6cd2 +net/minecraft/src/Packet18ArmAnimation 4af487d8167be2ffc9ec28b372a8a2cc +net/minecraft/src/Packet1Login eb17812829e90357595dd91828d574b3 +net/minecraft/src/Packet20NamedEntitySpawn 1190ba57c6b58aa880bf5e010c5499ae +net/minecraft/src/Packet21PickupSpawn 692667f32ea9a5295516e47b04502549 +net/minecraft/src/Packet22Collect 90b716679dedd403f21e2363a3b51625 +net/minecraft/src/Packet23VehicleSpawn 6e64c13f6c0d23fb49ba7186f40da3a4 +net/minecraft/src/Packet24MobSpawn dec730f5957181b878bb5160d45fbb04 +net/minecraft/src/Packet255KickDisconnect ac21f5466a9023402284b4e49d8076d0 +net/minecraft/src/Packet28 364cc725e6318eda22abdb7d32f20f34 +net/minecraft/src/Packet29DestroyEntity 878f4a041cfa513d6bdfef41b3ac4eaf +net/minecraft/src/Packet2Handshake c77eb5dec0b7892095081e03a546cb1c +net/minecraft/src/Packet30Entity aa28db825ad426a26a8d4b817ada0d2a +net/minecraft/src/Packet31RelEntityMove 932f777048c4f5a0853a0505c584bdec +net/minecraft/src/Packet32EntityLook 3683af3be759ab30ffc6677a662f76f2 +net/minecraft/src/Packet33RelEntityMoveLook a2cd574b9e157ee4712dee8d6c5de1b9 +net/minecraft/src/Packet34EntityTeleport 8a47d39fb1be29e2c4d7222f3176bdef +net/minecraft/src/Packet38 01fba97fb1083abaa1204690d07fdd3f +net/minecraft/src/Packet39 0f985a3e0db72bf864dd1d689d162aca +net/minecraft/src/Packet3Chat a475c32c23dc12e02a40f61831f069c8 +net/minecraft/src/Packet4UpdateTime d26787054d50484f7193a37a579cafd0 +net/minecraft/src/Packet50PreChunk 1ab2cfd84cec3ad290380ba229e791d3 +net/minecraft/src/Packet51MapChunk 59c7b6d3f0bff3546750ea0ce3575afd +net/minecraft/src/Packet52MultiBlockChange 90a91296d35d4d9c783efb987d69ec02 +net/minecraft/src/Packet53BlockChange 59adc4ab7a0b417d81341f168eac30ee +net/minecraft/src/Packet59ComplexEntity b9ab3c1cbdde11af60f0e3613276cf8e +net/minecraft/src/Packet5PlayerInventory f6462dd535e575a332a9554b18514501 +net/minecraft/src/Packet60 9fc10ac500296d3b14a1c5422bcc2e4f +net/minecraft/src/Packet6SpawnPosition 5d99d37a8c77e39302c161764ad9232e +net/minecraft/src/Packet7 c98cd7a17111d494f166db7009bb24ce +net/minecraft/src/Packet8 aa45f62e8c06d061f5bfd0f5f217a85a +net/minecraft/src/Packet9 822aa37f83832adaa936ef2c3d72cbd4 +net/minecraft/src/PanelCrashReport 2b8d5b9c444e8fd1d5d91385426adee6 +net/minecraft/src/Path 09baca2dca3abaa3d1a9342b3c0793c1 +net/minecraft/src/PathEntity d236a2642df4f15e9fc20273b68366e9 +net/minecraft/src/Pathfinder 2926c1c8d1d469fb4ac956b38ce545be +net/minecraft/src/PathPoint 06f3b3d7b5d814bc18777867d3585c2f +net/minecraft/src/PlayerController a98bb07f5cfe0d192b41f649c57a7f17 +net/minecraft/src/PlayerControllerMP 799317bce8acea4c73ae403b5535c0b6 +net/minecraft/src/PlayerControllerSP c560b41edce5101f5cc22c0762e991a1 +net/minecraft/src/PlayerControllerTest 66033f6218f1b35003c106e88ec8fb73 +net/minecraft/src/PositionTexureVertex ffec217575d87d8d2b9489e69f55750a +net/minecraft/src/RecipesArmor 7419ca7145b6104461bd3d91a5aa40cf +net/minecraft/src/RecipesCrafting a6a174dbb4a951ec2f0b564027894d24 +net/minecraft/src/RecipesFood 61f56a177cf41ba9070c56b496e5a3c7 +net/minecraft/src/RecipesIngots 2048ae2b4bb5e2e00f1213eec8da1314 +net/minecraft/src/RecipeSorter 63fa2e06ace59a6bcc8780797cb47737 +net/minecraft/src/RecipesTools d4979c189fc02db61018b98d1c5b5935 +net/minecraft/src/RecipesWeapons 247f6c57a9f894b164631903353f7d30 +net/minecraft/src/RedstoneUpdateInfo 4c19faa3c89e83989071313f60beeace +net/minecraft/src/Render c14dd3a253b04d31a1ceed2e69f7131d +net/minecraft/src/RenderArrow 23fc586fdb83ad724d01c32205aaa756 +net/minecraft/src/RenderBiped f0c749ae83374903ed98e29e136668f9 +net/minecraft/src/RenderBlocks a62a4c2d641062c955ef69675bfb7008 +net/minecraft/src/RenderBoat 99a058900b6b795e88b36a2ba9ff7fce +net/minecraft/src/RenderChicken 18baf46d27722e0714e611220566aea5 +net/minecraft/src/RenderCow 7b30441f01c119ea0141884941b24d32 +net/minecraft/src/RenderCreeper dbb072599dcd38db9eca7e258039c343 +net/minecraft/src/RenderEngine 4eb829a3fb7c2cdc678466abb1b97e48 +net/minecraft/src/RenderEntity 5bb749fe0fdf21f35260a9df7083ef81 +net/minecraft/src/RenderFallingSand 13d151e6bc0e7fc48344430dc5264506 +net/minecraft/src/RenderFireball f9a33613c42adb6b11716645aff14299 +net/minecraft/src/RenderFish 4726679736e8f081d7a054c47469d6af +net/minecraft/src/RenderGhast 7e947a83b11441a43a0fbafe6b7f2c70 +net/minecraft/src/RenderGlobal 73299fafc7291de441834c1672c76e49 +net/minecraft/src/RenderHelper 2a949b1cc031021325edeef949a3293a +net/minecraft/src/RenderItem da5ed4cb59aada6be3aac59be8b18aa8 +net/minecraft/src/RenderList e3eb2eb86058fa2690e383cdc03e8e52 +net/minecraft/src/RenderLiving 91984497db406ede6dc7a63e412ff19e +net/minecraft/src/RenderManager 490e541f896f18033829856debd4d7d4 +net/minecraft/src/RenderMinecart 11e684d5e155d1a495c5eaca9aefe7fb +net/minecraft/src/RenderPainting f955074f3f695cf39e9f3743cf66fd8d +net/minecraft/src/RenderPig 94f956838b407ea60c3d178493ef9bac +net/minecraft/src/RenderPlayer 7ef51985817be75127fb67714f4b514d +net/minecraft/src/RenderSheep 9706bad5d748e175b3f0c0e4785f8b0f +net/minecraft/src/RenderSlime a0b2cf5b25592e7aa94732d22a65cdc7 +net/minecraft/src/RenderSnowball c9d300ee2c669369a7ab2b5eb64803fb +net/minecraft/src/RenderSorter f281c7a055ed42583546b10600249d81 +net/minecraft/src/RenderSpider 82c45eb64dea58dbb2c205518d1b5b06 +net/minecraft/src/RenderTNTPrimed 5ff238b4ce1c2d16fcf106f6f1b65a5d +net/minecraft/src/RenderZombieSimple b169aac4687d9c795ce4e5f2a2b8ebae +net/minecraft/src/ScaledResolution b72fa75be97533649d7c937747cb9cb8 +net/minecraft/src/ScreenShotHelper b6acbab7dae8d08fbd524278a9931039 +net/minecraft/src/Session 3687c40803d6b642bc3d58d9d430e7f5 +net/minecraft/src/SignModel 7fada595dce397319674d6a96263a8f9 +net/minecraft/src/Slot 13a068e48777e7b492b200ab42f9610c +net/minecraft/src/SlotArmor ddd8386e9554038891e9a41618d3d8cc +net/minecraft/src/SlotCrafting ec6510699bb0282492524dd082cb2071 +net/minecraft/src/SlotInventory b930ff31333877a6f6c3e95952334f05 +net/minecraft/src/SoundManager 0b3a810085768153f9745664c6ff7793 +net/minecraft/src/SoundPool 96d3acf59e5fc387525da8f223cf2ecb +net/minecraft/src/SoundPoolEntry 2052f402815fc7daf10992dc6d81d98d +net/minecraft/src/SpawnerAnimals c9ffbfc67bb96b6cb4af36c4fb1536b5 +net/minecraft/src/StepSound 51f6b62425f5a37e9b227e230ac87235 +net/minecraft/src/StepSoundSand d69f498dee47a6a665f6e9aed84ad297 +net/minecraft/src/StepSoundStone 95dfd9e3519aee09d3830df5da145cf4 +net/minecraft/src/Teleporter b861003b04541bb8baa093fd62612bbc +net/minecraft/src/TerrainTextureManager f4d1ca41011cadf32b0f3c569d8af0e6 +net/minecraft/src/Tessellator 775c4eb6d39f6375b05ef8360c026cf3 +net/minecraft/src/TextureCompassFX beda340e2d27ea863ef96b0c4b50af32 +net/minecraft/src/TexturedQuad 51e1a55d067eb3076c558785608b8456 +net/minecraft/src/TextureFlamesFX d53dfe82a017282eae669a416de5ac14 +net/minecraft/src/TextureFX 01a8c0b6d52f13699b96a847ce47761e +net/minecraft/src/TextureLavaFlowFX 0b09edf4b98d2bf007d9a4d23180b3f4 +net/minecraft/src/TextureLavaFX 64814159e5154fb5ab03583e9ff944ea +net/minecraft/src/TexturePackBase 291f9905844704eb600c5d3cdbf53510 +net/minecraft/src/TexturePackCustom a81b67ee01de4f2e2a1e6b5c57bd581d +net/minecraft/src/TexturePackDefault e9fe63fa06e58e007a83d96ddc35bf4a +net/minecraft/src/TexturePackList 9f3ae4fb79accd0527431fc71ddc6aac +net/minecraft/src/TexturePortalFX 667b0f1611f81b4c78006ac20e45f5f5 +net/minecraft/src/TextureWatchFX 2968dc98d76130f580e3d7a2f0bf053f +net/minecraft/src/TextureWaterFX 4c77d936681c5114155c251ad9ad0c7b +net/minecraft/src/TexureWaterFlowFX e50d591d3ae2b00d8df5d04c7166a08d +net/minecraft/src/ThreadConnectToServer af255824aadda2a39b221bf8cd57e73c +net/minecraft/src/ThreadDownloadImage 69b229056eae569f2379f7768fb6b28b +net/minecraft/src/ThreadDownloadImageData 22bee8e15a8fc40602ea47fbf1f0bb68 +net/minecraft/src/ThreadDownloadResources c32b19f49c58bf1ba4cb0da4defe66a8 +net/minecraft/src/ThreadRunIsoClient d40e066030f71c5808c6c93772bf703d +net/minecraft/src/ThreadSleepForever de3ddbe3256023bcf230845e71980be6 +net/minecraft/src/TileEntity 02ec4bdbdcc018637291bfbad3a8c30e +net/minecraft/src/TileEntityChest 2abe6e0a1c3adb3c1722b85e8909d7b3 +net/minecraft/src/TileEntityFurnace d7f1af5a8753af87500e62c46431bc68 +net/minecraft/src/TileEntityMobSpawner 8396d8932fae8cf49fb595d0b5eecf8e +net/minecraft/src/TileEntityMobSpawnerRenderer bf97066b7c2e8c532af3c992d3db6926 +net/minecraft/src/TileEntityRenderer 95a42ce8b22a630626a1ae7dfb28ed60 +net/minecraft/src/TileEntitySign 25d9cb4be4f0c0f4d3883f7a6c9d3bd7 +net/minecraft/src/TileEntitySignRenderer 02f835b2cbf6f2932a6798bfbf8b0509 +net/minecraft/src/TileEntitySpecialRenderer 9ea3944adaf2c1a131bd08b39d75c41d +net/minecraft/src/Timer 41e4c7256e7f67070d96725cbd362fec +net/minecraft/src/UnexpectedThrowable 9dfe6a4956d490f3d3a7ba44a92a8d47 +net/minecraft/src/Vec3D 66deb9202f907f7a881deebe14ef0eb0 +net/minecraft/src/World 8e59b358148450dab823e884caa9dc55 +net/minecraft/src/WorldBlockPositionType 31e0b084c3eecd5a747a951858b3e195 +net/minecraft/src/WorldChunkManager f86d3aabb6c44d5b231d0ddfcf8866f2 +net/minecraft/src/WorldChunkManagerHell 532b8d0d830c89e5af134f7b9da8910a +net/minecraft/src/WorldClient 063609a9b34d9a9da41d485761fc1d18 +net/minecraft/src/WorldGenBigTree 764d9d5747ab2b13c94ad8cd3a17e4e4 +net/minecraft/src/WorldGenCactus b60a4370ad7a7d7b3f121bc4844e4752 +net/minecraft/src/WorldGenClay 382808910d451203f369e0ccb5f9d791 +net/minecraft/src/WorldGenDungeons 0874c27491bb5054f39329bbe5266d70 +net/minecraft/src/WorldGenerator 47785699d76289714e29b4876f1e8b5c +net/minecraft/src/WorldGenFire bf87d3456e3ccc5f1c9278af11c641fe +net/minecraft/src/WorldGenFlowers 7e6f3439538af6f00b3b14d449efedc9 +net/minecraft/src/WorldGenHellLava 6771edbede900a254c82e3138882ff26 +net/minecraft/src/WorldGenLakes 03c48da3a1897bdd793e3111308249ca +net/minecraft/src/WorldGenLightStone1 8744324c36e6da25d261a3117b3659d0 +net/minecraft/src/WorldGenLightStone2 0a4ac249b9c0a35490d28f0cb7ff7d67 +net/minecraft/src/WorldGenLiquids 1d9334f0e30bc9b38ec3fdd693f14294 +net/minecraft/src/WorldGenMinable e57a5f75db3b19c2cee1627ffadf291a +net/minecraft/src/WorldGenPumpkin 68ce2a360005b9939987bebd3bc15219 +net/minecraft/src/WorldGenReed fb9333eac0970f8a940699c86f0bbf68 +net/minecraft/src/WorldGenTrees 8ce58d3f194e3be8a847a8ec55cf84de +net/minecraft/src/WorldIso 997e45967dd525682ed3667089783dee +net/minecraft/src/WorldProvider f0eda41e117f2f6f528abbbdf9592136 +net/minecraft/src/WorldProviderHell 59fc5c6e14985329c7429918abe9f3cc +net/minecraft/src/WorldRenderer 53e0038f66b60aee4dd9ee14c4171c7c diff --git a/src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java b/src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java new file mode 100644 index 0000000..734558b --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java @@ -0,0 +1,396 @@ +package net.PeytonPlayz585.glemu; + +import static org.lwjgl.opengl.GL11.*; + +import net.PeytonPlayz585.glemu.vector.*; + +public class FixedFunctionShader { + + private static final FixedFunctionShader[] instances = new FixedFunctionShader[128]; + + public static void refreshCoreGL() { + for (int i = 0; i < instances.length; ++i) { + if (instances[i] != null) { + _wglDeleteProgram(instances[i].globject); + instances[i] = null; + } + } + shaderSource = null; + } + + public static final int COLOR = 1; + public static final int NORMAL = 2; + public static final int TEXTURE0 = 4; + public static final int LIGHTING = 8; + public static final int FOG = 16; + public static final int ALPHATEST = 32; + public static final int UNIT0 = 64; + + public static FixedFunctionShader instance(int i) { + FixedFunctionShader s = instances[i]; + if (s == null) { + boolean CC_a_color = false; + boolean CC_a_normal = false; + boolean CC_a_texture0 = false; + boolean CC_lighting = false; + boolean CC_fog = false; + boolean CC_alphatest = false; + boolean CC_unit0 = false; + if ((i & COLOR) == COLOR) { + CC_a_color = true; + } + if ((i & NORMAL) == NORMAL) { + CC_a_normal = true; + } + if ((i & TEXTURE0) == TEXTURE0) { + CC_a_texture0 = true; + } + if ((i & LIGHTING) == LIGHTING) { + CC_lighting = true; + } + if ((i & FOG) == FOG) { + CC_fog = true; + } + if ((i & ALPHATEST) == ALPHATEST) { + CC_alphatest = true; + } + if ((i & UNIT0) == UNIT0) { + CC_unit0 = true; + } + s = new FixedFunctionShader(i, CC_a_color, CC_a_normal, CC_a_texture0, CC_lighting, CC_fog, CC_alphatest, CC_unit0); + instances[i] = s; + } + return s; + } + + private static String shaderSource = null; + + private final boolean enable_color; + private final boolean enable_normal; + private final boolean enable_texture0; + private final boolean enable_lighting; + private final boolean enable_fog; + private final boolean enable_alphatest; + private final boolean enable_unit0; + private final ProgramGL globject; + + private UniformGL u_matrix_m = null; + private UniformGL u_matrix_p = null; + private UniformGL u_matrix_t = null; + + private UniformGL u_fogColor = null; + private UniformGL u_fogMode = null; + private UniformGL u_fogStart = null; + private UniformGL u_fogEnd = null; + private UniformGL u_fogDensity = null; + private UniformGL u_fogPremultiply = null; + + private UniformGL u_colorUniform = null; + private UniformGL u_normalUniform = null; + + private UniformGL u_alphaTestF = null; + + private UniformGL u_texCoordV0 = null; + + private UniformGL u_light0Pos = null; + private UniformGL u_light1Pos = null; + + private final int a_position; + private final int a_texture0; + private final int a_color; + private final int a_normal; + + private final int attributeIndexesToEnable; + + public final BufferArrayGL genericArray; + public final BufferGL genericBuffer; + public boolean bufferIsInitialized = false; + + private FixedFunctionShader(int j, boolean CC_a_color, boolean CC_a_normal, boolean CC_a_texture0, + boolean CC_lighting, boolean CC_fog, boolean CC_alphatest, boolean CC_unit0) { + enable_color = CC_a_color; + enable_normal = CC_a_normal; + enable_texture0 = CC_a_texture0; + enable_lighting = CC_lighting; + enable_fog = CC_fog; + enable_alphatest = CC_alphatest; + enable_unit0 = CC_unit0; + + if (shaderSource == null) { + shaderSource = fileContents("/glsl/core.glsl"); + } + + String source = ""; + if (enable_color) + source += "\n#define CC_a_color\n"; + if (enable_normal) + source += "#define CC_a_normal\n"; + if (enable_texture0) + source += "#define CC_a_texture0\n"; + if (enable_lighting) + source += "#define CC_lighting\n"; + if (enable_fog) + source += "#define CC_fog\n"; + if (enable_alphatest) + source += "#define CC_alphatest\n"; + if (enable_unit0) + source += "#define CC_unit0\n"; + source += shaderSource; + + ShaderGL v = _wglCreateShader(_wGL_VERTEX_SHADER); + _wglShaderSource(v, _wgetShaderHeader() + "\n#define CC_VERT\n" + source); + _wglCompileShader(v); + + if (!_wglGetShaderCompiled(v)) { + System.err.println(("\n\n" + _wglGetShaderInfoLog(v)).replace("\n", "\n[/glsl/core.glsl][CC_VERT] ")); + throw new RuntimeException("broken shader file"); + } + + ShaderGL f = _wglCreateShader(_wGL_FRAGMENT_SHADER); + _wglShaderSource(f, _wgetShaderHeader() + "\n#define CC_FRAG\n" + source); + _wglCompileShader(f); + + if (!_wglGetShaderCompiled(f)) { + System.err.println(("\n\n" + _wglGetShaderInfoLog(f)).replace("\n", "\n[/glsl/core.glsl][CC_FRAG] ")); + throw new RuntimeException("broken shader file"); + } + + globject = _wglCreateProgram(); + _wglAttachShader(globject, v); + _wglAttachShader(globject, f); + + int i = 0; + a_position = i++; + _wglBindAttributeLocation(globject, a_position, "a_position"); + + if (enable_texture0) { + a_texture0 = i++; + _wglBindAttributeLocation(globject, a_texture0, "a_texture0"); + } else { + a_texture0 = -1; + } + if (enable_color) { + a_color = i++; + _wglBindAttributeLocation(globject, a_color, "a_color"); + } else { + a_color = -1; + } + if (enable_normal) { + a_normal = i++; + _wglBindAttributeLocation(globject, a_normal, "a_normal"); + } else { + a_normal = -1; + } + + attributeIndexesToEnable = i; + + _wglLinkProgram(globject); + + _wglDetachShader(globject, v); + _wglDetachShader(globject, f); + _wglDeleteShader(v); + _wglDeleteShader(f); + + if (!_wglGetProgramLinked(globject)) { + System.err.println(("\n\n" + _wglGetProgramInfoLog(globject)).replace("\n", "\n[LINKER] ")); + throw new RuntimeException("broken shader file"); + } + + _wglUseProgram(globject); + + u_matrix_m = _wglGetUniformLocation(globject, "matrix_m"); + u_matrix_p = _wglGetUniformLocation(globject, "matrix_p"); + u_matrix_t = _wglGetUniformLocation(globject, "matrix_t"); + + u_colorUniform = _wglGetUniformLocation(globject, "colorUniform"); + + if (enable_lighting) { + u_normalUniform = _wglGetUniformLocation(globject, "normalUniform"); + u_light0Pos = _wglGetUniformLocation(globject, "light0Pos"); + u_light1Pos = _wglGetUniformLocation(globject, "light1Pos"); + } + + if (enable_fog) { + u_fogColor = _wglGetUniformLocation(globject, "fogColor"); + u_fogMode = _wglGetUniformLocation(globject, "fogMode"); + u_fogStart = _wglGetUniformLocation(globject, "fogStart"); + u_fogEnd = _wglGetUniformLocation(globject, "fogEnd"); + u_fogDensity = _wglGetUniformLocation(globject, "fogDensity"); + u_fogPremultiply = _wglGetUniformLocation(globject, "fogPremultiply"); + } + + if (enable_alphatest) { + u_alphaTestF = _wglGetUniformLocation(globject, "alphaTestF"); + } + + _wglUniform1i(_wglGetUniformLocation(globject, "tex0"), 0); + u_texCoordV0 = _wglGetUniformLocation(globject, "texCoordV0"); + + genericArray = _wglCreateVertexArray(); + genericBuffer = _wglCreateBuffer(); + _wglBindVertexArray(genericArray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, genericBuffer); + setupArrayForProgram(); + + } + + public void setupArrayForProgram() { + _wglEnableVertexAttribArray(a_position); + _wglVertexAttribPointer(a_position, 3, _wGL_FLOAT, false, 28, 0); + if (enable_texture0) { + _wglEnableVertexAttribArray(a_texture0); + _wglVertexAttribPointer(a_texture0, 2, _wGL_FLOAT, false, 28, 12); + } + if (enable_color) { + _wglEnableVertexAttribArray(a_color); + _wglVertexAttribPointer(a_color, 4, _wGL_UNSIGNED_BYTE, true, 28, 20); + } + if (enable_normal) { + _wglEnableVertexAttribArray(a_normal); + _wglVertexAttribPointer(a_normal, 4, _wGL_UNSIGNED_BYTE, true, 28, 24); + } + } + + public void useProgram() { + _wglUseProgram(globject); + } + + public void unuseProgram() { + + } + + private float[] modelBuffer = new float[16]; + private float[] projectionBuffer = new float[16]; + private float[] textureBuffer = new float[16]; + + private Matrix4f modelMatrix = (Matrix4f) new Matrix4f().setZero(); + private Matrix4f projectionMatrix = (Matrix4f) new Matrix4f().setZero(); + private Matrix4f textureMatrix = (Matrix4f) new Matrix4f().setZero(); + private Vector4f light0Pos = new Vector4f(); + private Vector4f light1Pos = new Vector4f(); + + public void setModelMatrix(Matrix4f mat) { + if (!mat.equals(modelMatrix)) { + modelMatrix.load(mat).store(modelBuffer); + _wglUniformMat4fv(u_matrix_m, modelBuffer); + } + } + + public void setProjectionMatrix(Matrix4f mat) { + if (!mat.equals(projectionMatrix)) { + projectionMatrix.load(mat).store(projectionBuffer); + _wglUniformMat4fv(u_matrix_p, projectionBuffer); + } + } + + public void setTextureMatrix(Matrix4f mat) { + if (!mat.equals(textureMatrix)) { + textureMatrix.load(mat).store(textureBuffer); + _wglUniformMat4fv(u_matrix_t, textureBuffer); + } + } + + public void setLightPositions(Vector4f pos0, Vector4f pos1) { + if (!pos0.equals(light0Pos) || !pos1.equals(light1Pos)) { + light0Pos.set(pos0); + light1Pos.set(pos1); + _wglUniform3f(u_light0Pos, light0Pos.x, light0Pos.y, light0Pos.z); + _wglUniform3f(u_light1Pos, light1Pos.x, light1Pos.y, light1Pos.z); + } + } + + private int fogMode = 0; + + public void setFogMode(int mode) { + if (fogMode != mode) { + fogMode = mode; + _wglUniform1i(u_fogMode, mode % 2); + _wglUniform1f(u_fogPremultiply, mode / 2); + } + } + + private float fogColorR = 0.0f; + private float fogColorG = 0.0f; + private float fogColorB = 0.0f; + private float fogColorA = 0.0f; + + public void setFogColor(float r, float g, float b, float a) { + if (fogColorR != r || fogColorG != g || fogColorB != b || fogColorA != a) { + fogColorR = r; + fogColorG = g; + fogColorB = b; + fogColorA = a; + _wglUniform4f(u_fogColor, fogColorR, fogColorG, fogColorB, fogColorA); + } + } + + private float fogStart = 0.0f; + private float fogEnd = 0.0f; + + public void setFogStartEnd(float s, float e) { + if (fogStart != s || fogEnd != e) { + fogStart = s; + fogEnd = e; + _wglUniform1f(u_fogStart, fogStart); + _wglUniform1f(u_fogEnd, fogEnd); + } + } + + private float fogDensity = 0.0f; + + public void setFogDensity(float d) { + if (fogDensity != d) { + fogDensity = d; + _wglUniform1f(u_fogDensity, fogDensity); + } + } + + private float alphaTestValue = 0.0f; + + public void setAlphaTest(float limit) { + if (alphaTestValue != limit) { + alphaTestValue = limit; + _wglUniform1f(u_alphaTestF, alphaTestValue); + } + } + + private float tex0x = 0.0f; + private float tex0y = 0.0f; + + public void setTex0Coords(float x, float y) { + if (tex0x != x || tex0y != y) { + tex0x = x; + tex0y = y; + _wglUniform2f(u_texCoordV0, tex0x, tex0y); + } + } + + private float colorUniformR = 0.0f; + private float colorUniformG = 0.0f; + private float colorUniformB = 0.0f; + private float colorUniformA = 0.0f; + + public void setColor(float r, float g, float b, float a) { + if (colorUniformR != r || colorUniformG != g || colorUniformB != b || colorUniformA != a) { + colorUniformR = r; + colorUniformG = g; + colorUniformB = b; + colorUniformA = a; + _wglUniform4f(u_colorUniform, colorUniformR, colorUniformG, colorUniformB, colorUniformA); + } + } + + private float normalUniformX = 0.0f; + private float normalUniformY = 0.0f; + private float normalUniformZ = 0.0f; + + public void setNormal(float x, float y, float z) { + if (normalUniformX != x || normalUniformY != y || normalUniformZ != z) { + normalUniformX = x; + normalUniformY = y; + normalUniformZ = z; + _wglUniform3f(u_normalUniform, normalUniformX, normalUniformY, normalUniformZ); + } + } + +} \ No newline at end of file diff --git a/src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java b/src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java new file mode 100644 index 0000000..409d52a --- /dev/null +++ b/src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java @@ -0,0 +1,55 @@ +package net.PeytonPlayz585.glemu; + +public class GLObjectMap { + 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. + * + *

+ * 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/j2pEIhH8fj8kEkmI1Sa0Gqcy7pzEOH708Hq9GBoagtPphEaj+dF+zrEEJvw/oTtHxCMWi0NcTaG7SeQmvMZYt3Ts/wnJSPh9rLUVjqTGur1TITKeneT40UMsFsNoNGLjxo3IyMiAyWSCSqX6wca5JrLGxhIDEVYwGGRJC7vdDofDAb/fz6wocifJQqPfjf0/YZdYkUjEXHOKMXo8HhZ39Hq9zJqj1wvd1bEu6Fi3M1yMjVtiHBEhjJ0Id9ofOuRyORYsWIDS0lIMDw+js7MTp0+fxs6dO9HZ2fmjs8aE1pbQPZRIJBCLxXC5XLDb7VAoFFAoFAgEArDZbJBKpZBKpZDL5XA4HFCpVAAAp9MJhUIBh8MBpVIJt9sNsVgMmUwGt9vNMroej4f9rFarYbVaEQwG4fF4EB8fz0hOrVZDJBJBIpEwciNSI8KUyWRRkxGcxDjC7uCtra1wOByQy+WQy+VQqVRQKBSQyWSQy+U/WKmBSCRin0mn0yEtLQ2JiYmoq6tDR0fHj4KoiQCECz8QCDCioCwsEQK9zuVyQSwWQ61Ww+PxIBgMwmazQavVMotJqVTC6XSy10gkEuam03vp9Xq4XC4olUq4XC60trbCaDQiEAjAaDTC4XBAo9EwCzgQCITE5AKBAKRSKSMwipmNjedxEuOIGjf69NNP8dVXXyEQCLAFn5SUhOTkZGzYsAGzZ89mE+uHbKmIRCLIZLJpS/HfCRAG2YWkRmRAlo3L5YLNZoPNZoPX62UWkVwuZ1aWVqsNIUWynnw+HxQKBQvc0/WlUincbjdkMhmGhoZw9uxZdHR0YMmSJYiJicHQ0BBMJhMkEgm8Xi/kcjl8Ph/kcjl7HyI2IjBKBIyVfnAS44iIwcFBNDU1obe3NyQGUVdXB6/Xi6qqKvAzZe5sSzpcZpJcSrK+Tp06hT179qCvrw9xcXFITExEQUEBli1bhmAwiJGRESQlJUGpVIaQIhGX8FokrSC5RktLC7Zt24a6ujrIZDLcuHEDOp0OFRUVyM3NRUZGBrO2iGjpGmKxeFycLFoigJMYxzh0dnZiYGAgLFGFy0Bx3FkEJnw+JN4F/ixtcDqdzLru7u7GoUOHUF9fz17/wgsvID4+HkajEXFxcbBarRCLxZDL5ex6ZIUR6dB7+nw+RnLDw8N47bXXYLfb2bWfeeYZmM1maLVaJCcnM6kGWY6kVRNaaGQhC63+aCTGs5McCAaDqK+vR19fHx+MH+jzE36nBU9EQe4aiXiFmi0AuH79OrZv346+vj7o9XrI5XLY7fYQl1Emk41T7stkMhYzHR4eRjAYhFqtDiGejz76CDt27EBHRwcjV6HmjK5D90rvMzZ2F20T5STGAafTiaamJgwNDfHB+AGCLBdhjI8sHKlUCoVCAY1Gg2AwCLvdDrfbHfL3x48fx7vvvgsA0Ov10Gq1UKvVLFutUqmYJRYMBiGVShlRKhQKuFwuZrWNJdf09HRcvHgRVqsVEomEXUutVjO5BxEaxcjofYhEJ7LEuDvJgf7+fpjNZrjd7h+ldurHDmHsi6wbl8vFYkqk16LAvtVqDXsdt9vNpBcej4dlo+12O5RKJex2O1QqFcto0u9IIxYMBjE8PBxyzRUrViA7OxuLFi2CWCyGw+GAQqHA6Ogo9Ho9vF4vI1uPxwOpVAqXy8Vc12AwOGFWnFtiHOjo6EBvby8fiB8ohPWLfr8fLpcLHo+H/dvn8zEiWLx4Mf7t3/4NTz31FHP9qqqq8PrrryMpKQlutxsjIyNQqVRMsCqXy2G1WqFQKOB0OhEMBuH1elmxvMPhgM1mg16vx5tvvomKigoAwEsvvYSqqirce++9MJlMTIM2OjrKZBvkMlJG0uVyQSqVMtd3Mtnw226JCdW+Xq+X7RCUSpXJZCHp7+myDMYqgClYSfqZkEH5/0V/QrP5dlkowvEh8SDttDQJ6MFOxz35/X40NTVNSi8108F9YVaN5gZ9duHnp39zqzHUpaR5LRS2isViRkgqlQoZGRkQi8W4dOkSMjMz4XA4UF5ejtWrV0Or1SIYDEKv18Pj8UClUjHrTavVwuv1QqlUMq2YRCJh1lMgEEBMTAzmzJmDhx56CK2trbhx4waqqqqQn58Po9HI6i71ej3cbjc0Gk1I9pNcSYrZTfYZS2/XwvT5fLBarejs7ERrayva2trQ3d2N0dFRlnKVy+XQ6/VIS0tDRkYGcnNzkZycDK1WC4lEMqVJS+weCATgcDhgtVrR29uL/v5+DAwMoL+/H729vcwcFha1qtVqGI1GpKWlIT09HZmZmYiPj4dWq2Xm+nSPj9/vh81mg9lsRlNTE9rb29HZ2YnR0VF4PB6IxWLodDqkp6cjLy8Ps2bNgk6nm9S9KJVK6PV6iEQiuN3uEJPfZrOhoaEB/f39Ya9FAdaBgQFYLJawpn0wGIRKpYJOp5uy9oo+u9VqhdlsRktLC9ra2tDV1YWRkRF4PB42N7RaLVJTU5GZmYmsrCykpaVBr9dPeW7MVFzRZrOF7RgRzYIyGAxQKBTTcg80DiqVKkS2QBuzSCRCXFwcVCoVXn75ZfzTP/0Ts9JiYmJY0F8mk4Vs3nR/dH2aAySEjY2NZdcvLi5GRkYGHnvsMUgkEuj1eqhUqhBSJbIiMa5YLGbF4uRC3jEF4MFgEG63G11dXaiursaRI0fQ0tLC2p643W6mO6EBk0gkUCqVUKvV0Gg0mDVrFh544AFUVFSwwZoIPp8PnZ2duHz5Murr69HY2Aiz2Qyn0wmPxxPyJawdE04GqVQKpVIJlUoFrVaL/Px8LF++HAsWLEB8fHyIlXYr4+P1emGxWHD27FkcOnQIjY2NsNlscDgccLlcIeNDY6PRaFizvonuQSKRYN26dXjqqacgkUjQ2tqKX//61+z3Xq8XPT09Ua8jl8vx+uuvw2AwhCUpr9eLDRs24LHHHoNOp5vSZ+/u7mafvampidX0UTnL2LmhUCjY3MjOzsaKFSuwZMkSJCYmfq8VBWfPnsWHH34Ii8Uy6XlhMpnw8ssvo6ys7Jbm0tisJFmzwp+pjQ4RhE6ng9FoZNYuWfc0p+RyOUsAiMViuN1uqNVqZnAIu1PQ60ltTxsmCWz9fj+TUIhEIng8HiaspcQDbZZkRd4RJObz+dDb24vDhw9j69ataGpqYo3mxj4A4Q1TDdbo6CgAoLW1FdXV1ViyZAmeeeYZlJWVTbhz2Ww27Nu3D6+99hqkUmlYlzHaJCCT3Ol0soxdU1MTDh8+jAULFuDJJ5/E/PnzJ20JRQrGjoyM4OzZs9iyZQsuXLjASCva33i93oiB2bAPWCrFtWvX2HX7+vpw7tw5aLXaKd1vT08Penp6wv7OarVi+fLlcDgckyIxv9+P/v5+HDt2DDt27EB9fT0rRp7M3KDPT3OjoqICzzzzDObNmxeS4r+dMJvNqK2txeDg4KT/JjU1FT09PSgrK5uWuBiRFMXCKGBOJCSXy5kRoNfrWaAeADweD7Rabch4kzrfarVCrVbD6XRCLpezwL5IJGKB+pGRESiVypCMIs1ZymxSfE4ikaCnpwcqlQoejwcKhYLdR7iNmdZuJCt/RkjM7XajoaEBmzdvxvbt28e5lWRO6nQ6xvjDw8Ms7jF2wo+MjOCrr77CwMAAfv7zn2PRokVhU7pj/25wcBAxMTFhCdbn8zGrhlK65HaSeTv2ena7HYcOHcKVK1fw8ssvo6qqCkajccpEFggEYDabsWfPHrz33nsYHBwc1xDO4/Ew91oqlcJms8Fut7NJGe1zU5yRHnxnZyfbcbu7u9nPt1J2I4zd+f1+9PX1hYgcI8Hj8aCpqQnbt2/Htm3b4HA4QtxKCiTrdDooFAoWaCZCHjuODocD+/btQ0dHB1555RVUVFSwBXG7QELPwcHBkJq/icbPZrOho6Pjlls5U2BfSGD0M4HKeajO0eFwsPIichnJQhq7CWq1WvZ6ioGRYaBSqRhxk1VGsS8iOoqjUf1qY2Mj+vv72fpXq9VQKpVQKBSw2WxQq9WQy+Uhsetohsu0k5jH48GFCxfwhz/8AceOHWMmvt/vh16vx4IFC5CdnY2EhAQWz/B4POjp6cGFCxdQXV0dNmgtEolw7NgxGAwGmEwmzJkz5zs9eLlcjmXLlqGoqAgmkwlqtZotDqfTiZ6eHly+fBnnzp1jpRZj72NgYACvvvoq5HI5Vq9ePaXdPxgMwmKxYOvWrXjjjTfGuaUikQgZGRm47777kJyczMbIbrejra0Np06dQkNDQ1gC8vv9qKioQGFhYUjDOZ1Ox3ZAuVzOAq83b95kE3EiQvN4PHC5XGx3T0lJQXx8PEwmE2JiYpCWljapuVFbW4sPPvgAX375ZciCoU4T+fn5iI+Ph8FggEwmg8fjQV9fH86fP4+zZ8/C4/GMeyYSiQRXr17F//7v/yIuLg5z5syZVNhhOud8TEwMVqxYgYGBARYSiER4LpcLGRkZKCwsDGkcOB3upNPpZIXVtFELyUcikbD6SHL/iPjGEhhtFB6PBxqNBl6vl20sJFAlN9PpdLKYl7BUiLKQSqUSwWAQPT09sNls2LNnD27cuIGnn34aS5cuZfer0+ngcDhYsoAqDW5b7aTf70dtbS3eeOMNnD17lhFYIBBAXl4enn76acybNw9JSUkwGAzMRw4EArBarViyZAnS0tKwa9cu5nsLoVAosHPnTpSVlSE1NRVGo3HK9xgXF4eNGzdi/vz50Gq1ISRCVl9TUxP27t2L7du3M0thLJG5XC689957yMvLQ0lJyaStGrvdjgMHDuDNN98MG8NRqVRYv3491q5di9jYWDZGPp8P/f39KC8vx8cff4xz586FHf/09HSsXr0a6enpIVlMcn0XL16MrKws9PX1wWKxoKmpCUeOHEFra2vESRIIBLBy5UoUFxdDq9VCo9EgJiaGiSI1Gg0MBgNiY2Ojzo3Gxkb86U9/wrZt20LcTqPRiBdffBHl5eVITU1lwW5aDDabDUuWLMHu3buxa9eusO60TCbDiRMnsGfPHqSnp8NkMt02ElMqlVi+fDlKS0vR0dGBd955B7W1teNCGHa7HZWVlbj33nuRnZ2NxMREVoozXa6kRCKB1WrFwMAA7HY71Go1tFotDAYDtFoti3+5XC5mnZEVR9YSuY+0YYjFYthsNvY+9DyFbit5KqOjo1CpVEzN73a7YbPZWNueEydOsHlG4tbOzk5kZ2dDo9GwzCfFy4RdYG+LJdbW1oZNmzbh0qVLIW/qcDiwdOlSrFq1CklJSWHTwwaDAQsWLIBUKkVvby++/fbbsItcJpPh4MGDWLx4MWJiYqZkjYlEIqSkpKCkpCQsAUokEphMJhiNRphMJvT29mL//v1h41QikQhNTU346quvkJeXN6mOoX6/H3V1dfjwww8j3ndMTAzuvfdeJCcnh7xGKpUiKSkJK1asgFQqhdVqDal/o7E5fPgw4uPjsX79emRkZIx7n8TERCQmJgL4cxuW5uZm9Pf3o6mpKaL14vP5sGbNGtxzzz3M1J9K62ayPrdv347t27eHEJhIJMLs2bPxyCOPICEhIew463Q6FoNsaWlBdXV12BinWq3Gl19+iVWrVsFgMNy2jhtisRgJCQlQKBS4efMm3G73OEmP0+nE+vXrsX79ehQXF0957k40vmKxmJGO1WrF5cuXUVNTA5lMhlmzZiEvL4/Fk4WCVgrIk6SChKs2mw0ajQYSiQROp5PNF51Ox1r2kOXX2dkJsVgMhUKBffv2oaSkhM0zkUiEoaEhRq4XLlzAJ598AovFgueee471FqPNklxI8iSEh4zMOImRiXjkyJFxE8xms6GgoGDCYLJYLEZRUREWL16M8+fPh7WCZDIZjh07hps3byI/P39KrpxMJkNZWVnYONnYhZOZmYm1a9fi9OnTEctxAoEAjh49iscffxx5eXkTTkqn04mvv/4abW1tEeUMubm5SElJiXgtpVKJiooKXL58GZ2dnSFui0gkQl9fH9566y1IpVI8/fTTiIuLi2pBxMbGsh060gIRiUSIj4+fdHY43Oc+fPgwtmzZMo7sRSIRSktLodfrJ7xOTk4OVq5ciWvXro1ThhMGBgZw9uxZFBUV3dbYWE9PD7755ht89NFHaG1tDZkjCoUCf/u3f4t169YhLy9vwnjudwUFxWNjY1FQUID29nacPHkS/f39OH/+PG7cuAGFQoGenh4kJSXBbrcjMzMTZrOZlQRZLBYYDAZYLBYkJiYyAjEYDMydbG5uZhsZSZcozLB161ZUVFQgISEBCQkJEIlEIZZYbW0tW082m41ZhGKxmMkthPKQ20pily9fxsGDB8fFAoLBIDObJ6OHUavVyM/PR3Z2Nq5evRpxsdfV1WHp0qVTIjGFQoHy8vJJpeIlEgnKysqQm5uL8+fPR3zd0NAQGhsbkZubG5XEgsEgzGYzTp48GTEGIhKJMGvWrAk/k06nw4IFC/Dtt9+OG2+aBJ988gkKCwtx3333hY11jI2nTDbu8l2ysG1tbdiyZUvYeJZYLGYxvMlkWufOnQuj0RiRxCh2+vjjj7Ns2UyCmknu2rUL27ZtQ3d3d8hRZ2lpaXj22Wfx4IMPIikpaUasw7EF1S6XC7GxsdDpdKitrcX+/fvDzu8lS5agtLQUPp8PhYWF2LRpE44ePRryOoPBgLVr18JoNGLu3Lk4efIk/uu//ivq/dy8eXNS9221WiGVShETE8NE3BSnE3azELYECvv5p2MQR0ZGcPToUTQ1NYWdxDk5OTAajZPW8aSlpSElJSXiwlEqlbhy5cqUpAYUe5mIbISLQavVYt68eVFf73Q60djYGFUaQePQ2NiIgYGBqO85a9asCXceshQjWS9isZi5wpPJGM4k3G43Dh48iIaGhrDjKJPJkJKSMqm4EIUD4uPjoz6T5uZm9PX1zXiFgd/vx7Vr1/D+++/j448/htlsDinGLisrwyuvvIL169cjJSVlxtxbqpkk6UNsbCzcbjeSkpKwcePGca/XaDRYs2YNli1bhr6+PqSkpOD06dOoq6sb91qXy4UzZ87g5MmT2L17N06dOsWe22R0ipGeIwAUFRUhMzOTGTdUckRZeMq0C09YmjFLrKGhAbW1tcx3HhtPyc3NnZIuyWAwQKfTRZyElI0aGRmJKBWgwyFInxIMBpmvPtlAqlQqRU5OTtR+Wh6PB52dnaxdSTQSu3HjBlwuV9SHGxsbO6mJodFoorolMpkMx48fx9DQECv5uN0g6/Obb76JSPJGo3HSn5kSH/QMI13T7XbDYrEgPz9/RjOSNTU1+NOf/oTDhw/D6XSyz6BUKrF48WI8//zzmDdvXlRLeLosMdKBUb1jeno6nE4nrFYrMjIyYLfbYbVaWZaS2udUVlbigw8+QGNjY1jr1ufzYXBwkMWq4uPjsWLFCmRkZMDn8+HcuXNhyQ8A4uPjmdRJiOTkZDz++ONYu3Yt5HI5qwTRarWw2WxQqVSsnz+pF6KNoXS6dqOxQWbhw05PT5+S26dSqaKeRiMSiTA4OAibzcZ2obELuLCwEC+99BKGh4cxOjoKt9uNysrKKZV4kKYm2gILBAKw2+0T7vper5fptSZyeSezoCl+MJGFbLPZvreGhoFAADU1NRFFshRq0Ov1kyZZsVg8IYmRmHamPrfdbseZM2fw7rvv4tKlSyFSnNjYWNx///147rnnkJubO+NSDyIXuVzOOk9IpVIMDw8jNzcXPp8PjzzyCLxeL86fP4/z588jIyMDP/nJT6DX6zEyMoLKykrY7fawJJaZmYmHH34YMTExuP/+++F2uzE4OIji4mKIxWK89dZbaGhoCGspPf7443C5XPjggw9C/j8rKwv33HMP8vLyWMyQEg2kSaNWQH6/H3K5PKqu8ZZHeGBgAG1tbSwDEY7E9Hr9lEpCpFIpS9NGmqik3BZW6AutlHvvvRf33HMPGwiqkp9qUHUiUiGR5kQLxufzYWRkZEK3cybqMr8vkGYwkksbDAaRkpIypYUuEokQExMzoeC3v79/SnWMkx3L0dFRHDt2DK+//jo6OztDmvbl5ORg3bp1eOyxx5CQkHBbrF+huFTYl56ErPHx8cjNzcX169cZ2RYVFTFLTKlUwmAwRDz1aXh4GPX19UhNTUVnZyckEklI4XZycjKKiopQV1c3bm673e5xvcsAsMy2xWIJCe8I+4mRrEJ4DuaMWWIWiyXkYYabyFMtcpXJZNDpdKyHUaQJZbfbI05UYfHrrU6S6dwxp4t0hMfPT7QhfF8YHh5GXV0dK+IO9xmmGisSi8UwmUxRn20gEGCdRqfTquzv78fXX3+N//mf/wlxkQKBAIqLi/HMM89g1apVt1SOdqtxMap6IBJJSkrCgw8+CLlcjtraWqxduxaJiYnYvHkzBgcHsXz5clRXV0OtVrNSPyEGBwdx/PhxFBYWQqFQQK/Xo729HVlZWcjKyoJUKmWHgIwlsUhr0Ol0wu/3Iykpid0r9Q3zer0sHkZdLMJ5W9NOYi0tLREnokajgcPhgMViCTtIkR5IJMWzcHGSOzmTu9x075iTcVUms/ioTU80mEymcfVwtzMe1t3dPWHyheJmkw03UC1ftDGiutTpssT8fj+6urqwY8cOvP/+++OsC4/Hg4ULF+L++++flFRkpghMqMonz4i6n6SmpqK8vByZmZnYtm0bE0srlUqUl5fDbDZHdPtJMaBWq9HS0oL8/Hx4PB44HA50dHSgr68v7Dr8v//7v4gxy/7+fvT39yMmJoa13yGBq9PphF6vZ4F9KiSfEcU+mdfRerNrtVrs2rULNTU1k7YKvF4vrl+/HlYnNlOuElXQU00Y7WjTFVOSyWRsx4q0uCiDWVlZOaH7bbVaw5rqwok9b96879QeZ7rQ398fNZEhlUrx9ddfo729fdJzIxAIoK6uLupnp9dNx5yw2Wy4fv06tm3bhh07doSNacpkMly5cgVms5m1tLmdoK6oSqWSzV+j0cjKjiQSCXQ6HfLz80MIDAAOHDiAAwcOTPgcP/vss7C/e/XVV5GZmYmWlhbEx8ejoKBgnEwjnGGjVqvR29uLlJQUphOjMyspRjr2WLgZscSoOHd0dDTiQhGLxWhoaMDVq1envOhnavEFAgGMjo6yoL/NZmP9oOx2O2vIR6Uy07EgZDIZCgoKoFAoIgb3g8EgTpw4gXXr1iE1NTWqBdXV1RXVWnU4HFiyZMn31tWBVPrhMtZCdHR0oLm5+Y6ZG0LL2e/348CBA2htbcXJkycjWr4SiYSdKJ6cnAyTyXTbrV+hKyaRSFhwnCyZtLQ0WCwWFBQU4ObNmxGtru8SMqAOJElJSSgvL5+QxEZHR9Hc3AyxWMzKr6ioXFjHS7WTwkNKZoTErFYrq3CPFseYrsZvtxrTaG9vR0dHBzo7O9HV1YXOzk40NTVheHgYIyMjzA0hf5yaut0qxGIxysvLERsbG5F8gsEg6urqcPDgQaxfvz4iARG5RqokoELw8vLyGU/vTzTeE1lMd8LciEbEb7/9NjsBPRrkcjm2b9+O0tJSrFq1asZU+dHcbOFp39Q0gIqzVSoViouLUV9fH3G88/PzsXTpUjQ1NSE2NhaXL18Oq/0UgpoUxMTEID09HR6PBw899BD27NkT1Yvw+/0oLCxkB4bQGNIp4sJ4Gp1rOSOWGPmsE1kq4RoP3iomK+KkAtMLFy7g6tWrqKurQ01NDfr7+1nLHcqCKJXKGVv0YrEYubm5ePDBB/Huu+9GHA+73Y4tW7ZAr9dj+fLlYUukLBYLrl+/HjXGuGHDBqSnp39vriRJTyaK283E3LjV1jZjXZ/Jwmq1YuvWrSgoKEB+fv5ttcaEqn06kIMaD9L/0XFskZ7Jxo0bsXr1aly6dIklzp5//nl88MEHmDdvHlJTU/HGG2+E/M25c+fQ1tYGuVyOnJwcLFmyBCUlJSgpKUFvby/ef//9ce8TExODnJwcpKSkMK+HLDFhQwbhwbpR3enpILFoD0skEuHv//7vcffdd09L2xEhkpKSolpJIyMjqK6uxsGDB3HmzBm0t7ezBx5ucgp7t48dyOmAWq3GI488gpqaGpw8eTLiAmxqasI777yDxsZGVFRUIC0tjYn+LBYLTp48iYsXL4aKXQI8AAAa20lEQVS9L5/Ph1/96ldYunTplBbgTIA690azHv7u7/4OCxYsmNaurGRBT6c1JJVKkZaWBrvdHjUGfOnSJezcuRO/+MUvJt3ldjpAGzF5EdQfn8IXMTEx8Pl8KCsrw7p16zAwMACTyQSVSoWenh588sknKCkpQUFBAbq6unD+/HlYLBZcvHgRQ0NDaG5uDqsj27ZtGwAgNzcX2dnZWLJkCbv2119/HfZedTodEhMTWRss6pFHWUmKi1M9JT3TGSGxiYLrtCPm5+dj/vz5005iwg859n17e3uxe/dubN++HS0tLczEHvvgVSoV1Go1a9eblpaGzMxMFhBvaGjAtm3bpuW+KQbw61//GsFgEGfPng27KwYCAdy8eZPVWpLi3ufzYXR0FO3t7eOsMCqT2rBhA9avXz+uC8b34YpNJAPx+/3Izc1lqvbpmhu0CU1XgF2n0+Ghhx7Cxo0bcfXqVbz66qsRY31utxsHDhxAaWkpqqqqbqslLNyAybIRlkHJZDIYjUYkJSXB6/XCYDBArVbD4XCw1ljkOlutVla4L5VK0d7ejosXL0YleWqbPjg4iMHBQXY9av1DaGhowI4dO+D3+7Fo0SIYDIaQeUNERvN3onlxW0REVOZwO7I2dKjF559/jj/+8Y8YGhoad2qKTCZDeno6CgsLUV5ejtmzZyM5OZk9SLpPn8+H6upqNuDTFYAtLi7GP//zP2PLli04dOhQxBS13W6fMCFCu25eXh7Wrl2L1atXs+4Bdzqo/xWpzO9EJCUl4cknn8Sjjz6KuLg4xMXF4cKFC9i+fXvYMQ4Gg2hvb8euXbuQn5+P3Nzc2zaW1KyQOkdoNBrY7XbIZDLWMTU1NRULFy6E3+9nPeHcbjdMJhN8Ph88Hg8yMzPxwAMPsBbWcXFxsNls+N3vfhfVy6D+dzqdDpWVlUhMTIRGo0FNTU1IBpQO66FzKmUyGVQqFSudstlsrOyQRLwzqtifjMs5WWHmdMDhcODIkSN4++232VHsY62vefPm4Ze//CVKSkqYjirc8VBk4k43IchkMhQVFeEf/uEfMHv2bLz33ntoa2tjD2misQoGg1AqlTCZTMjIyEBZWRmqqqpQVFQ06bKl22kdRPvd7Zwb3yVY/vOf/xwPP/wwDAYDRCIRTCYT1q9fj0uXLqGxsTHswqKawr179+KnP/3pbXHricBIGkT1h3q9HqOjo8ytpP+z2+3YvHkzAoEAnE4nurq6WFdY8kyo46rL5cLly5cBABkZGVAqlWhvb2cH9GZnZyM9PR3JyckIBoOIj4/H4OAgSktLAfw5A11UVMRO7woEAtizZw/uuusuLFy4kAll1Wo1bDYbvF4vC/BTsiJauOGWSSyauUwN2sIdEDJTweSuri68//77YQkM+PMBCVVVVVi8ePFt1/OMJSJSKdN9BINBZGdnIysrC06nk53ORONMrYb1ej0rJ7nrrruQlZUVtdb0+yKviU6toflxJ5JYMBiEWq1GaWlpiAKfpDJPPvkkfvvb34ZtLwT8Wel++PBhlJSUYOnSpTM616hUhwLj1BlVp9OxVtSUoTQYDKyffV9fX0iGm7KGVLhN9adUOSMWi7Fq1SqkpaXhyJEjOHToEKRSKe655x6UlpZCq9WyInS9Xg+fz4fKykpIpVLU19djx44dOH36NHs/m80Gi8XCjt6jBph00hg9BwpDzYjYlVrQTrRDDA8PM1NxJuHxeHDq1Clcv3494qTR6/VTaic9U2Tb09OD3bt346233mIq/bKyMjz11FMoKSkJObqM3C6qc4uNjYVer//eNGCTJTFq/x1JZiEWi9Hd3T2jVRe3SmThLHStVovKykpcuXIFW7duDZvRFolEuHjxIvbt24ecnBxkZGTM2H1S7aRwM6QgOWUjqU+9yWRCa2srhoaGxukV6YxX6oOWkZHBsswAsHnzZqSlpaGoqAg9PT04dOgQOzuTevvRe1O1gM/nw3333QeTyYRvv/025P1u3ryJq1evsvbmUqk0pO+/MCY2Y2VHcrkcGo0maoZQLpeju7sbdrt9xrM1drsdR48ejbrraTQa1p75+1oYPT09+Pzzz/Haa6+xNrw5OTl4/vnn8cADD9z203pmAhKJBHFxcawdcqTXXLt2jVkLPxRQX7NHHnmEdXAJF9MTiUQ4ePAgiouLsXbt2hlzK4VF6PSdPB+hy07F1FqtFgkJCeP0ij6fj204QguIDJDOzk52buyRI0eY4ZCbm4v4+HjWA1AYIqCDRgKBAObPn4/6+nq0tLQA+LPUQq1WsxPQ6LRxiuvROp7Iir0lc0SlUiE2NhZGozGiS6BWq3Ht2rWIwszptG6Gh4ejBsJFIhEj3e+rnnB4eBi7d+/Gf/7nf7KHI5fL8Td/8zdYtmzZHUtgUx0vkUiE9PT0qAtXJBKhvr6etTf+IUEul6OkpARr166NGK8RiUQwm83Yu3cvrl+/flvqfMlyJOtF+J2ylmq1GiaTCb/5zW8wb968cZ4VdZOgmDAdqfbiiy8iLi4OZrOZkd1zzz3HTpgXKu3pO1ljfr8fxcXFIWdbkLXmdrsZ0dHf0f1OJk4svtWBS0xMRE5OTsQ3kUqlOH36NBobGycsQZkOgphIIS7MPk73wp0IXq8Xp06dYoWxdBry8uXLsXTp0u+leHgyY0CC5qnErujouYmsj6GhIVRXV0/YZ+1OhMlkwrJly1BVVRWxRlQul+PIkSM4cOAALBbLjLmTwu90IjcRk1gshlwuZ7/XaDSoqqrCo48+iqysrJC1Si296QAPoQi8srISKpUKmzZtQlNTE1avXo17770XarWabb4k5aDvZPmlp6dDoVDgvvvuY6di9fb2MheXOsUS8Qld0onW4i0HhjIyMjBr1qyIOymdiLJ//35YLJYZDeJOpljb7XZPesH4fD60t7dPWzGx2WzG1q1bmeyD3iMxMfF76zZBuqBoMYeRkRE4nc4pj0NKSgpmzZoVVT4RCASwd+9etLe337FZymhEnZeXh6qqKhQUFEQcH5lMhi+++AIXLlyYkY1c6CqO7S9G+kiKmZFoOjs7e9wBMeROKpVKFpui11NHFOE8IT2Y3++Hy+UKEdxSTI6ObVOpVNDpdEhOTkZhYSF+//vf45e//CWKiorYGaOUmKBeYpM97eiWSSwpKQnFxcVR40wKhQIHDx7EwYMH2WnOM2XiT9TA0Gq1YnR0dMIF4/F4cPz4cezatWtaSCwQCODcuXPj3F2lUomzZ89i3759uHLlCpqamtDS0hL1q62tDd3d3RgcHBx3PNhUoVAoJnWgxuDgYMS+YJGgVqtx//33R42FBoNBXL9+HV988cW4NsY/BCgUCixevBgPPPBARLdSLBbDbDZjx44daG1tnXbXWajUp5gUWdB0+AZZ/R6PBwqFAhaLBWq1OsT6l0ql7BRumUwGp9PJ4mHDw8MsAE84c+YME5zTKd/UeJHOj3Q6nawmUiaTMX1YbGwsiouLkZCQwN6L3G3KtAqPcIuGW5ZYyGQyLFy4ECdPnsTBgwfDLiiRSAS3242PPvoIcrkcf/VXfzWllsQ02SnIaLfbodVqQ7JCpOGZSDQ5NDSEq1evIjs7O6JY0Wq14uDBg/j000+ZPmYy9zaRBXj+/PlxQW6JRIKGhgb88Y9/RHJy8qTidTRxaHeLiYlBVlYWcnJykJ6eztrBTMayk8lk0Gg0bPcNB6PRiPPnz6OysjIiIYVLgUskEixcuBDz5s3D4cOHI05Gl8uFnTt3Qq1W44knnkBcXNyUrFIaf6/Xi8HBQSa6jBYEp0Uymc1H2BAgHOLj47Fy5UrU1dVFLCdTKBQ4duwYysrKkJCQAKPRGPWaU7XEhEedAWDta8iqoV5jIpEIIyMjiImJQWtrK1QqFf71X/8VmzdvZjoylUrFBKfAn7tOkOBVuOao+zL19ouNjUUgEGDWHx3xNjIywjRlCxYsgF6vR05ODtOVCYP31KaaVA+T2aAlv/nNb35zq4NIRcpNTU0RA/gikQijo6O4ceMG+vv7Q8xTYVaFvmjyeL1e2Gw2NDc34+TJk/jss8/Q3NyMnJyccQvK7/fj9OnTMJvNUcnE5/Nhzpw5bBei9/N6vWhubsZHH32ELVu24MaNG+wE5WhugF6vR2lpaQgBjZ2gTqcTu3fvRnNzc9gHMzo6iq6uLrS1taG1tTXqV0tLC5qbm9HY2Ii6ujrU1tbi8uXLqK6uRnV1NQYGBmAwGNjhp9EWikQiQXd3N65duxaxoFwikaCjowMlJSWsnbTwOXk8HvT19cHj8YTIPiieEh8fjwsXLkS1wh0OB27evIne3l7o9fpxm9zYuSHs99bW1obTp09j27ZtOHr0KMrLy0MOZaVSFqvVis7OTly+fBn79u3DqVOnInYUoVY8wsNiqcaPel0JXxsbGwu73Y6GhoaoLZJaW1vhdrvhdDpZtcJkzkuYbFB/rHVGandhyZ9SqYTT6YROp0NnZycOHTqErKwsVFZWIicnh/UhE76exmJ0dBRbtmwB8Oce+gsXLkRpaSmSk5PZ+5IrSC4iWX50Xujdd9+N7Oxs6PV6Nj8phiZssy3sZDGjtZNkhi5fvhxmsxmbN29Gd3d3RAbt7u7G1q1bceLECZSUlGDBggXIzMwMaSbn8XgwMDCA7u5utLS0oLa2Fr29vRgdHUVvby+efvrpcbsoFf2uXLkSly9fjpgJ8vl8OHHiBABg7dq1yM7OBgD09fXhwoULOH78OBoaGuByuZCRkYHVq1dDq9Xit7/9bVgrLxgM4tq1a3j55ZeRlpaG0tJSFBYWYu7cuezBksUTFxcXto3vrbioRL52ux1dXV2oq6vDxYsXsXv3bqxfvx4rVqxAfHx8xGQG1bZmZ2ejo6Mj4mvsdjt+//vfo6OjA/Pnz2diRrPZjIsXL+LatWv4xS9+wYK2wrlx11134YUXXsDbb7+Njo6OiBZwX18fvvzyS1RXV6OsrAzz589HdnY2jEYjG3uPx4ORkRF0dHSgvb0dtbW1MJvNsFqtGB4eRmlp6bi54Xa7UV1djU2bNsFsNsNms2F0dHTCppsikQifffYZvvrqK1a0vHLlSjz22GPjtGEKhQIrV67ElStX8PXXX4d1velw448//hhffvklYmJiUFJSgmeffRZFRUXT4laOXXdj5RfCnylbT38XyYsS1qLSPFq2bBkyMjJQWlrKqhmEmdGx7ynUylHGU/j7sXNiKhbqtJUd6XQ6PPHEExCLxdi1axeuX78e8WacTidu3ryJlpYW7Nu3D3K5fFwLDuqySt9pB3Y4HBGb4lH24+jRozh+/HjEhet0OnHo0CFUV1ezyUilDm63GyKRCCUlJXj00Ufx8MMPo6enB1u2bEF7e3vY9yULrrW1FdXV1dDpdHjttdeQlJQUcgjCkiVLcOTIEXR3d89YEJ9aM4+OjuJ3v/sdamtr8cILLyArKyvibp+bm4u7774bNTU1UQ+lbW1txZtvvgmVSsV2W4/HA6fTieTk5IjkrNFosHr1aohEInz66aeora2NqMB2uVxobW1FR0cH9u/fz+aGMH0vnBderzfEchc21RMuWpvNhp07d8JkMk1pPO12O+x2O3p6etDV1YWCgoKIzy4pKQnr1q3DjRs3UF9fH3Ejt9lssNls6OnpYY0LpyuwL5wH5NKR4JhixnRASG9vLxITEzF//nxs2bKFNTiUy+UsZENWslwux+joKPx+PxYuXIif/vSnjMD0ej1cLhcjJgrQe71eVgsplG5QDFZ4yA49Q7FYzP6O/l+YtJhREiO38sknn0R6ejoz1zs7OxnpjL0Jv98Ph8MRcUekD+nz+WAwGJCfn4/Zs2dj0aJFYWMzYrEY6enp+NnPfsa6pAr97bHvTZNJSJxpaWksbV5RUQGVSgW/349Vq1bhv//7v6NKBugamZmZISfC0L0tWrQIP/nJT/D555+zHkwzRWbBYBAOhwM7d+6ERCLBSy+9FDH5olKpsHr1anR1deGLL75grk6k+BXJCYTuZGFhYdT6NoPBgIceegiJiYnYu3cvqqur2dkMkeYGlV5NNDc0Gg3mzJmDwsJCLFq0KMSVpJ3fYDBEbQ0+GahUKqSkpESMt4nFYtx9991Ys2YN2traJjwngor3w/WM+y4WmPA7PQuKLQndfJPJhJ6eHhiNRoyMjGD//v1sPqrValitVtaskO7RarUyly8jIwPp6elIS0uDwWCAw+GARqNhr6dsN1nPRHLkPpOrTqRFMUciMGEs77acdhRu1125ciXy8/NRUVGBK1euoKamBteuXcPAwADkcjn7kMKJRjupx+OB2+2GXq9Heno6Zs2ahZycHGRnZyMnJwd5eXlITEyMuMgUCgUWLlwIpVKJgoICnDhxAjU1Ncw3F/4dpYZlMhnmzJmDefPmYf78+Vi0aFFIQ0GtVov58+ezBAUtILIG6IGQWLCgoGDcxBSJRDAajXj66aeRkZGB6upqnD17Fl1dXSHjMJnj3+h64RZ/OCtx//79KC4uxuOPPx6RaLKzs/Hss88iPj4e3377Lc6fP88Cs8K4GhE1dT4oLS3FvHnzMHfuXKSnp084N5YuXYrs7GwsXrwYV65cwaVLl1BfX4+enh4m9xgbxxO6zW63G2q1GhkZGcjJycGsWbOQmZmJ3NxczJo1C0lJSePcfqlUCqPRiIULF2J0dPQ7bxwmkykkRBAOSqUSa9aswfXr13HlypUJn2FiYmKIAHQ642LRXpuQkIDu7m4AwD/+4z/i+vXr0Gq18Hg8rOaSepK53W4YDAbY7XZoNBrk5uYiLS0NRqMRXq+XxQ0VCgWzlMcSvVKpZLFM6psv1IURWVFgn/5+MhILUXAGxTlerxc9PT3o7OxEd3c3LBYL+vr60NPTw4SpVBeoVqthNBpZ5sZkMrHWJwkJCYiNjZ1SG2OqT2xsbERLSwtrRd3f38+yJwkJCUhPT0dqairS09ORlZWF1NTUcQ8gGAyiubkZb7/9Ngua63Q66PV6KJVKRswkFkxJSUFJSUlIOnrsuNTX1+Ozzz7DRx99xIjF4/GgqKhoQoGo3+9np1zX19dDIpHAaDRGtRCWLl2Kf//3f0dKSkrUa/f397PSEBozCtpTd9DU1FQkJSUhKSkJqampyMjIYH3SJwufz4fe3l50dHSwk3b6+/thNpuZW0P3Tqn9sXMjNjYWSUlJrLnfRFlpOnvxu0IikbCOpBN9tvr6egwMDEx4Ta1Wi7vuuuu2NyMgGQXV5w4NDSE2NhaxsbHs1CEhKZJO8OzZs/jwww/xyiuvoLi4OMRlFc63scQj7G1GRDbWDSZyGyvenYicZ5TExi5cii84HA54PJ6Q5mcSiQQKhYKpf1Uq1bT0Xqc2u1arlXXUoMFTKpWMjCaSNjidTnR3d7NdQi6Xs6OmKOBJX8IYTjhYrVacOXMGX3zxBfbs2cNOq/nZz36GqqqqCQu7yRK02WwYGRlBV1cXzpw5g8OHD497+IT8/Hz8y7/8C5YuXTqpcXM4HGzMXC4XM/lJkqHVaqHRaKalqN/n87G5Ybfbw84NcnWEc+OH0DPt+4BwSRMpENFQmQ+51XSoCB1yTfOTxpsSI7QG2tvbcenSJSxbtgy5ublMviEs2g43/8jVJIuaYqrCLP7Y7OodR2Ic/69h4969e7F161ZcvHiRNYP767/+a7z44ovIy8ubdLqdTHdqmVxdXY133nkHZrN53DUSExPxq1/9Chs3buSL/0c6t4TPVZhtHKt1E/6brB/aNAKBANvoqbsxhUwoQUAaMq1WO2kLkkiMAv/kgQl1YtG6Vsy4xIJjcpNscHAQn332GZOhUNKgvLwcGzZsQE5OzpT0QlQTJ5fLERMTA6PRCI/Hg1dffXXcdUjIyPHjRDSJArl3RBjCwDllMYWlSkJyoUA9NSaUyWQsuzjZzVBocQm7U9A9CX8vJLDJXl/MH//tgd1ux44dO/DJJ5/AYrGwB+n3+/HEE0+gsLDwllo0i0QixMfHo6ysDLNnzx4nd5gudTjHD88yo+9EZmRVkUsplDdQkJ2sNLKcqGssvWYqAl3hXAynVxMmqKZKYJzEbhMCgQBOnjyJL7/8MuSkHK/Xi6VLl6KsrGzaeq3pdDqkpaWNIzGlUomYmBhOZH9BltlYIiOrhzRcwsaDwt+PJRXhwbzkFk7GjSQCFFqBdF3hKUZj7yGcaDcauDt5G9DX14e9e/eOKzlyOp2YO3cu4uLippUwSbArRExMDKtO4PjLcjHHumnkQgoJayzJjH09ySfIgpvobE+y7sIduUbXFXaiDXfPnMTuINTX1+PmzZvj0vukXp7Ok37sdvu4wL5EIkF6evqMtkjm+GEQmpBEwv0uHMZ2WJ2MFRbNWruVEiPuTn5P6OjoCNtmRqVS4caNG+jr65uWXlpOpxOdnZ24ceNGyAQymUyszzkHx48N3BK7DYh05qZCocA333yD2bNnQywWIzExESqVakKdmdCS83g8cLlcsNvtaG1txbFjx0LiYSKRCA8++CAqKyu/19OdODg4if2AQQcpUJmHkGD8fj/+4z/+AzU1NVi0aBGSkpKg0+mYkFTYOYDiB1SsTp0bzGYz6urqcPr0aSbdoKDqk08+iQ0bNkxr3I2D445ylbnYdeZhtVqxadMmvPPOO7DZbGGtLLfbjdHRUbhcLqSlpSE3NxdGo3Fc5UIgEIDVakV3dzfq6upYsa5arWYF5S6XC4mJiXj22WexZs2aKQloOTg4iXGERVdXF/bs2YNNmzahpaUFCoUiIrEIW8uE6/MUTqdDWUmVSoU1a9ZgzZo1mDt3LhISErisgoOTGMf0YHBwEE1NTTh+/Di+/fZb1NTUAAgtuZgM4QibzpHyurCwEPfccw8qKiqQl5eHhISEsIe6cnBwEuO4JVCt48jICLq7u9HW1oabN29iYGAAFosFPT09zK0cK8mQyWRQqVSse0RcXBzrypqamsoOI53pk9Y5ODiJcYQ09aN+ZG63m50BQL2XhK+nDhl0QpGwa4awMy4HBycxju+N2ML9HPLAvoOimYODkxgHBwfHHQqed+fg4OAkxsHBwcFJjIODg4OTGAcHBycxDg4ODk5iHBwcHJzEODg4ODiJcXBwcBLj4ODg4CTGwcHBwUmMg4ODg5MYBwcHJzEODg4OTmIcHBwcnMQ4ODg4iXFwcHBwEuPg4ODgJMbBwcHBSYyDg+MvCv8foPuErXNuO3cAAAAASUVORK5CYII="; + + 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 { + +}