Upload src

This commit is contained in:
PeytonPlayz595 2024-02-08 20:09:35 -05:00
parent f8aff78cb6
commit 4100b8e110
434 changed files with 52242 additions and 0 deletions

20
.classpath Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="bin/main" path="src/main/java">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="lib" path="jars/teavm-jso-0.6.1.jar"/>
<classpathentry kind="lib" path="jars/teavm-interop-0.6.1.jar"/>
<classpathentry kind="lib" path="jars/teavm-jso-apis-0.6.1.jar"/>
<classpathentry kind="lib" path="jars/jzlib-1.1.3.jar"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

23
.project Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Minecraft Client</name>
<comment>Project Infdev created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

View File

@ -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

BIN
jars/jzlib-1.1.3.jar Normal file

Binary file not shown.

Binary file not shown.

BIN
jars/teavm-jso-0.6.1.jar Normal file

Binary file not shown.

Binary file not shown.

458
md5/original.md5 Normal file
View File

@ -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

View File

@ -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);
}
}
}

View File

@ -0,0 +1,55 @@
package net.PeytonPlayz585.glemu;
public class GLObjectMap<T> {
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);
}
}

View File

@ -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);
}
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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();
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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;
}
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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);
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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;
}
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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;
}
}

View File

@ -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 <cix_foo@users.sourceforge.net>
* @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;
}
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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));
}
}
}

View File

@ -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 "<error>";
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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[];
}

View File

@ -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<String,NBTBase> getTagMap(NBTTagCompound nb) {
return nb.tagMap;
}
}

View File

@ -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;
}

View File

@ -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";
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<String, byte[]> 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 ("<file>".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 (!"</file>".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);
}
}

View File

@ -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
* <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>.
*
* <p>
* This class implements section <cite>6.8. Base64
* Content-Transfer-Encoding</cite> from RFC 2045 <cite>Multipurpose Internet
* Mail Extensions (MIME) Part One: Format of Internet Message Bodies</cite> by
* Freed and Borenstein.
* </p>
* <p>
* The class can be parameterized in the following manner with various
* constructors:
* </p>
* <ul>
* <li>URL-safe mode: Default off.</li>
* <li>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.
* <li>Line separator: Default is CRLF ("\r\n")</li>
* </ul>
* <p>
* The URL-safe parameter is only applied to encode operations. Decoding
* seamlessly handles both modes.
* </p>
* <p>
* 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).
* </p>
* <p>
* This class is thread-safe.
* </p>
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
* @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.
* <p>
* <b>Note:</b> this method seamlessly handles data encoded in URL-safe or
* normal mode.
* </p>
*
* @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.
* <p>
* <b>Note:</b> this method seamlessly handles data encoded in URL-safe or
* normal mode.
* </p>
*
* @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. <b>Note: no padding is added
* when encoding using the URL-safe alphabet.</b>
* @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. <b>Note: no padding is
* added when encoding using the URL-safe alphabet.</b>
* @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. <b>Note: no padding is added.</b>
*
* @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. <b>Note: no padding is added.</b>
*
* @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
* &gt; 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.
* <p>
* When encoding the line length is 0 (no chunking), and the encoding table is
* STANDARD_ENCODE_TABLE.
* </p>
*
* <p>
* When decoding all variants are supported.
* </p>
*/
public Base64() {
this(0);
}
/**
* Creates a Base64 codec used for decoding (all modes) and encoding in the
* given URL-safe mode.
* <p>
* When encoding the line length is 76, the line separator is CRLF, and the
* encoding table is STANDARD_ENCODE_TABLE.
* </p>
*
* <p>
* When decoding all variants are supported.
* </p>
*
* @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.
* <p>
* When encoding the line length is given in the constructor, the line separator
* is CRLF, and the encoding table is STANDARD_ENCODE_TABLE.
* </p>
* <p>
* Line lengths that aren't multiples of 4 will still essentially end up being
* multiples of 4 in the encoded data.
* </p>
* <p>
* When decoding all variants are supported.
* </p>
*
* @param lineLength Each line of encoded data will be at most of the given
* length (rounded down to nearest multiple of 4). If
* lineLength &lt;= 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.
* <p>
* When encoding the line length and line separator are given in the
* constructor, and the encoding table is STANDARD_ENCODE_TABLE.
* </p>
* <p>
* Line lengths that aren't multiples of 4 will still essentially end up being
* multiples of 4 in the encoded data.
* </p>
* <p>
* When decoding all variants are supported.
* </p>
*
* @param lineLength Each line of encoded data will be at most of the given
* length (rounded down to nearest multiple of 4). If
* lineLength &lt;= 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.
* <p>
* When encoding the line length and line separator are given in the
* constructor, and the encoding table is STANDARD_ENCODE_TABLE.
* </p>
* <p>
* Line lengths that aren't multiples of 4 will still essentially end up being
* multiples of 4 in the encoded data.
* </p>
* <p>
* When decoding all variants are supported.
* </p>
*
* @param lineLength Each line of encoded data will be at most of the given
* length (rounded down to nearest multiple of 4). If
* lineLength &lt;= 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.
* <b>Note: no padding is added when using the URL-safe
* alphabet.</b>
* @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.
* <p>
* When encoding the line length and line separator are given in the
* constructor, and the encoding table is STANDARD_ENCODE_TABLE.
* </p>
* <p>
* Line lengths that aren't multiples of 4 will still essentially end up being
* multiples of 4 in the encoded data.
* </p>
* <p>
* When decoding all variants are supported.
* </p>
*
* @param lineLength Each line of encoded data will be at most of the given
* length (rounded down to nearest multiple of 4). If
* lineLength &lt;= 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.
* <b>Note: no padding is added when using the URL-safe
* alphabet.</b>
* @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
/**
* <p>
* 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.
* </p>
* <p>
* 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.
* </p>
* <p>
* 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/
* </p>
*
* @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);
}
}
}
/**
* <p>
* 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).
* </p>
* <p>
* <b>Note: no padding is added when encoding using the URL-safe alphabet.</b>
* </p>
* <p>
* 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/
* </p>
*
* @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.
*
* <p>
* 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.");
}
}
}

View File

@ -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 &gt; 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.
*
* <p>
* The {@value} character limit does not count the trailing CRLF, but counts all
* other characters, including any equal signs.
* </p>
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
*/
public static final int MIME_CHUNK_SIZE = 76;
/**
* PEM chunk size per RFC 1421 section 4.3.2.4.
*
* <p>
* The {@value} character limit does not count the trailing CRLF, but counts all
* other characters, including any equal signs.
* </p>
*
* @see <a href="http://tools.ietf.org/html/rfc1421">RFC 1421 section
* 4.3.2.4</a>
*/
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.
*
* <p>
* This is set to the same size used in the JDK {@code java.util.ArrayList}:
* </p>
* <blockquote> Some VMs reserve some header words in an array. Attempts to
* allocate larger arrays may result in OutOfMemoryError: Requested array size
* exceeds VM limit. </blockquote>
*/
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 <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
*/
static final byte[] CHUNK_SEPARATOR = { '\r', '\n' };
/**
* Compares two {@code int} values numerically treating the values as unsigned.
* Taken from JDK 1.8.
*
* <p>
* TODO: Replace with JDK 1.8 Integer::compareUnsigned(int, int).
* </p>
*
* @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 <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
* @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} &gt; 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.
* <ul>
* <li>Lenient: Any trailing bits are composed into 8-bit bytes where possible.
* The remainder are discarded.
* <li>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.
* </ul>
*
* <p>
* 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 &gt; 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 &gt; 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 &gt; 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.
*
* <p>
* 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.
* </p>
*
* @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 &gt; 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.
*
* <p>
* The default is false for lenient decoding. Decoding will compose trailing
* bits into 8-bit bytes and discard the remainder.
* </p>
*
* @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.
* <p>
* 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;
}
}

File diff suppressed because one or more lines are too long

View File

@ -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);
}
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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.<JSString>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);
}

View File

@ -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<FileEntry> listFiles(String path, boolean listDirs, boolean recursiveDirs) {
LinkedList<FileEntry> lst = new LinkedList<FileEntry>();
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<DatabaseOpen> 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<IDBVersionChangeEvent>() {
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<BooleanResult> 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<ArrayBuffer> 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<Integer> 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<EaglerAdapterImpl2.FileEntry> lst);
private static void iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection<EaglerAdapterImpl2.FileEntry> lst, final AsyncCallback<Integer> 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<BooleanResult> 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<Integer> 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<FileExists> 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<BooleanResult> 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));
}
});
}
}
}

View File

@ -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);
}

View File

@ -0,0 +1,6 @@
package net.lax1dude.eaglercraft.adapter.teavm;
import org.teavm.jso.JSObject;
public interface WebGLQuery extends JSObject {
}

View File

@ -0,0 +1,6 @@
package net.lax1dude.eaglercraft.adapter.teavm;
import org.teavm.jso.JSObject;
public interface WebGLVertexArray extends JSObject {
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}
}

View File

@ -0,0 +1,7 @@
package net.minecraft.src;
public class BlockBloodStone extends Block {
public BlockBloodStone(int var1, int var2) {
super(var1, var2, Material.rock);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -0,0 +1,7 @@
package net.minecraft.src;
public class BlockDirt extends Block {
protected BlockDirt(int var1, int var2) {
super(var1, var2, Material.ground);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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);
//}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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));
//}
}
}

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}
}
}

View File

@ -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);
}
}
}
}

View File

@ -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());
}
}

Some files were not shown because too many files have changed in this diff Show More