Upload src
This commit is contained in:
parent
f8aff78cb6
commit
4100b8e110
20
.classpath
Normal file
20
.classpath
Normal 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
23
.project
Normal 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>
|
14
.settings/org.eclipse.jdt.core.prefs
Normal file
14
.settings/org.eclipse.jdt.core.prefs
Normal 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
BIN
jars/jzlib-1.1.3.jar
Normal file
Binary file not shown.
BIN
jars/teavm-interop-0.6.1.jar
Normal file
BIN
jars/teavm-interop-0.6.1.jar
Normal file
Binary file not shown.
BIN
jars/teavm-jso-0.6.1.jar
Normal file
BIN
jars/teavm-jso-0.6.1.jar
Normal file
Binary file not shown.
BIN
jars/teavm-jso-apis-0.6.1.jar
Normal file
BIN
jars/teavm-jso-apis-0.6.1.jar
Normal file
Binary file not shown.
458
md5/original.md5
Normal file
458
md5/original.md5
Normal 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
|
396
src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java
Normal file
396
src/main/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
55
src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java
Normal file
55
src/main/java/net/PeytonPlayz585/glemu/GLObjectMap.java
Normal 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);
|
||||
}
|
||||
}
|
58
src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java
Normal file
58
src/main/java/net/PeytonPlayz585/glemu/ModeBuffer.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
130
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java
Normal file
130
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix.java
Normal 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();
|
||||
|
||||
}
|
418
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java
Normal file
418
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java
Normal 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;
|
||||
}
|
||||
}
|
529
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java
Normal file
529
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java
Normal 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;
|
||||
}
|
||||
}
|
902
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java
Normal file
902
src/main/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java
Normal 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;
|
||||
}
|
||||
}
|
506
src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java
Normal file
506
src/main/java/net/PeytonPlayz585/glemu/vector/Quaternion.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
110
src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java
Normal file
110
src/main/java/net/PeytonPlayz585/glemu/vector/Vector.java
Normal 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);
|
||||
|
||||
}
|
319
src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java
Normal file
319
src/main/java/net/PeytonPlayz585/glemu/vector/Vector2f.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
376
src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java
Normal file
376
src/main/java/net/PeytonPlayz585/glemu/vector/Vector3f.java
Normal 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;
|
||||
}
|
||||
}
|
377
src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java
Normal file
377
src/main/java/net/PeytonPlayz585/glemu/vector/Vector4f.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
29
src/main/java/net/PeytonPlayz585/math/MathHelper.java
Normal file
29
src/main/java/net/PeytonPlayz585/math/MathHelper.java
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
130
src/main/java/net/PeytonPlayz595/nbt/NBTBase.java
Normal file
130
src/main/java/net/PeytonPlayz595/nbt/NBTBase.java
Normal 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;
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagByte.java
Normal 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;
|
||||
}
|
34
src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java
Normal file
34
src/main/java/net/PeytonPlayz595/nbt/NBTTagByteArray.java
Normal 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[];
|
||||
}
|
194
src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java
Normal file
194
src/main/java/net/PeytonPlayz595/nbt/NBTTagCompound.java
Normal 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;
|
||||
}
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagDouble.java
Normal 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;
|
||||
}
|
23
src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java
Normal file
23
src/main/java/net/PeytonPlayz595/nbt/NBTTagEnd.java
Normal 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";
|
||||
}
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagFloat.java
Normal 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;
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagInt.java
Normal 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;
|
||||
}
|
63
src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java
Normal file
63
src/main/java/net/PeytonPlayz595/nbt/NBTTagList.java
Normal 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;
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagLong.java
Normal 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;
|
||||
}
|
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java
Normal file
31
src/main/java/net/PeytonPlayz595/nbt/NBTTagShort.java
Normal 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;
|
||||
}
|
36
src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java
Normal file
36
src/main/java/net/PeytonPlayz595/nbt/NBTTagString.java
Normal 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;
|
||||
}
|
55
src/main/java/net/lax1dude/eaglercraft/AssetRepository.java
Normal file
55
src/main/java/net/lax1dude/eaglercraft/AssetRepository.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
857
src/main/java/net/lax1dude/eaglercraft/Base64.java
Normal file
857
src/main/java/net/lax1dude/eaglercraft/Base64.java
Normal 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
|
||||
* > 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 <= 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 <= 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 <= 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 <= 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.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
694
src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java
Normal file
694
src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java
Normal 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 > 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} > 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 > 0, use chunking with a length
|
||||
* {@code lineLength}
|
||||
* @param chunkSeparatorLength the chunk separator length, if relevant
|
||||
*/
|
||||
protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
|
||||
final int chunkSeparatorLength) {
|
||||
this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, PAD_DEFAULT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Note {@code lineLength} is rounded down to the nearest multiple of the
|
||||
* encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is
|
||||
* disabled.
|
||||
*
|
||||
* @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
|
||||
* @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
|
||||
* @param lineLength if > 0, use chunking with a length
|
||||
* {@code lineLength}
|
||||
* @param chunkSeparatorLength the chunk separator length, if relevant
|
||||
* @param pad byte used as padding byte.
|
||||
*/
|
||||
protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
|
||||
final int chunkSeparatorLength, final byte pad) {
|
||||
this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, pad, CodecPolicy.LENIANT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Note {@code lineLength} is rounded down to the nearest multiple of the
|
||||
* encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is
|
||||
* disabled.
|
||||
*
|
||||
* @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
|
||||
* @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
|
||||
* @param lineLength if > 0, use chunking with a length
|
||||
* {@code lineLength}
|
||||
* @param chunkSeparatorLength the chunk separator length, if relevant
|
||||
* @param pad byte used as padding byte.
|
||||
* @param decodingPolicy Decoding policy.
|
||||
* @since 1.15
|
||||
*/
|
||||
protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
|
||||
final int chunkSeparatorLength, final byte pad, final CodecPolicy decodingPolicy) {
|
||||
this.unencodedBlockSize = unencodedBlockSize;
|
||||
this.encodedBlockSize = encodedBlockSize;
|
||||
final boolean useChunking = lineLength > 0 && chunkSeparatorLength > 0;
|
||||
this.lineLength = useChunking ? (lineLength / encodedBlockSize) * encodedBlockSize : 0;
|
||||
this.chunkSeparatorLength = chunkSeparatorLength;
|
||||
this.pad = pad;
|
||||
this.decodingPolicy = decodingPolicy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount of buffered data available for reading.
|
||||
*
|
||||
* @param context the context to be used
|
||||
* @return The amount of buffered data available for reading.
|
||||
*/
|
||||
int available(final Context context) { // package protected for access from I/O streams
|
||||
return context.buffer != null ? context.pos - context.readPos : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a given byte array to see if it contains any characters within the
|
||||
* alphabet or PAD.
|
||||
*
|
||||
* Intended for use in checking line-ending arrays
|
||||
*
|
||||
* @param arrayOctet byte array to test
|
||||
* @return {@code true} if any byte is a valid character in the alphabet or PAD;
|
||||
* {@code false} otherwise
|
||||
*/
|
||||
protected boolean containsAlphabetOrPad(final byte[] arrayOctet) {
|
||||
if (arrayOctet == null) {
|
||||
return false;
|
||||
}
|
||||
for (final byte element : arrayOctet) {
|
||||
if (pad == element || isInAlphabet(element)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes a byte[] containing characters in the Base-N alphabet.
|
||||
*
|
||||
* @param pArray A byte array containing Base-N character data
|
||||
* @return a byte array containing binary data
|
||||
*/
|
||||
public byte[] decode(final byte[] pArray) {
|
||||
if (pArray == null || pArray.length == 0) {
|
||||
return pArray;
|
||||
}
|
||||
final Context context = new Context();
|
||||
decode(pArray, 0, pArray.length, context);
|
||||
decode(pArray, 0, EOF, context); // Notify decoder of EOF.
|
||||
final byte[] result = new byte[context.pos];
|
||||
readResults(result, 0, result.length, context);
|
||||
return result;
|
||||
}
|
||||
|
||||
// package protected for access from I/O streams
|
||||
abstract void decode(byte[] pArray, int i, int length, Context context);
|
||||
|
||||
/**
|
||||
* Decodes an Object using the Base-N algorithm. This method is provided in
|
||||
* order to satisfy the requirements of the Decoder interface, and will throw a
|
||||
* DecoderException if the supplied object is not of type byte[] or String.
|
||||
*
|
||||
* @param obj Object to decode
|
||||
* @return An object (of type byte[]) containing the binary data which
|
||||
* corresponds to the byte[] or String supplied.
|
||||
* @throws DecoderException if the parameter supplied is not of type byte[]
|
||||
*/
|
||||
public Object decode(final Object obj) {
|
||||
if (obj instanceof byte[]) {
|
||||
return decode((byte[]) obj);
|
||||
} else if (obj instanceof String) {
|
||||
return decode((String) obj);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes a String containing characters in the Base-N alphabet.
|
||||
*
|
||||
* @param pArray A String containing Base-N character data
|
||||
* @return a byte array containing binary data
|
||||
*/
|
||||
public byte[] decode(final String pArray) {
|
||||
return decode(pArray.getBytes(Charset.forName("UTF-8")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes a byte[] containing binary data, into a byte[] containing characters
|
||||
* in the alphabet.
|
||||
*
|
||||
* @param pArray a byte array containing binary data
|
||||
* @return A byte array containing only the base N alphabetic character data
|
||||
*/
|
||||
public byte[] encode(final byte[] pArray) {
|
||||
if (pArray == null || pArray.length == 0) {
|
||||
return pArray;
|
||||
}
|
||||
return encode(pArray, 0, pArray.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes a byte[] containing binary data, into a byte[] containing characters
|
||||
* in the alphabet.
|
||||
*
|
||||
* @param pArray a byte array containing binary data
|
||||
* @param offset initial offset of the subarray.
|
||||
* @param length length of the subarray.
|
||||
* @return A byte array containing only the base N alphabetic character data
|
||||
* @since 1.11
|
||||
*/
|
||||
public byte[] encode(final byte[] pArray, final int offset, final int length) {
|
||||
if (pArray == null || pArray.length == 0) {
|
||||
return pArray;
|
||||
}
|
||||
final Context context = new Context();
|
||||
encode(pArray, offset, length, context);
|
||||
encode(pArray, offset, EOF, context); // Notify encoder of EOF.
|
||||
final byte[] buf = new byte[context.pos - context.readPos];
|
||||
readResults(buf, 0, buf.length, context);
|
||||
return buf;
|
||||
}
|
||||
|
||||
// package protected for access from I/O streams
|
||||
abstract void encode(byte[] pArray, int i, int length, Context context);
|
||||
|
||||
/**
|
||||
* Encodes an Object using the Base-N algorithm. This method is provided in
|
||||
* order to satisfy the requirements of the Encoder interface, and will throw an
|
||||
* EncoderException if the supplied object is not of type byte[].
|
||||
*
|
||||
* @param obj Object to encode
|
||||
* @return An object (of type byte[]) containing the Base-N encoded data which
|
||||
* corresponds to the byte[] supplied.
|
||||
* @throws EncoderException if the parameter supplied is not of type byte[]
|
||||
*/
|
||||
public Object encode(final Object obj) {
|
||||
return encode((byte[]) obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes a byte[] containing binary data, into a String containing characters
|
||||
* in the appropriate alphabet. Uses UTF8 encoding.
|
||||
*
|
||||
* @param pArray a byte array containing binary data
|
||||
* @return String containing only character data in the appropriate alphabet.
|
||||
* @since 1.5 This is a duplicate of {@link #encodeToString(byte[])}; it was
|
||||
* merged during refactoring.
|
||||
*/
|
||||
public String encodeAsString(final byte[] pArray) {
|
||||
return new String(encode(pArray), Charset.forName("UTF-8"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes a byte[] containing binary data, into a String containing characters
|
||||
* in the Base-N alphabet. Uses UTF8 encoding.
|
||||
*
|
||||
* @param pArray a byte array containing binary data
|
||||
* @return A String containing only Base-N character data
|
||||
*/
|
||||
public String encodeToString(final byte[] pArray) {
|
||||
return new String(encode(pArray), Charset.forName("UTF-8"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the buffer has room for {@code size} bytes
|
||||
*
|
||||
* @param size minimum spare space required
|
||||
* @param context the context to be used
|
||||
* @return the buffer
|
||||
*/
|
||||
protected byte[] ensureBufferSize(final int size, final Context context) {
|
||||
if (context.buffer == null) {
|
||||
context.buffer = new byte[Math.max(size, getDefaultBufferSize())];
|
||||
context.pos = 0;
|
||||
context.readPos = 0;
|
||||
|
||||
// Overflow-conscious:
|
||||
// x + y > z == x + y - z > 0
|
||||
} else if (context.pos + size - context.buffer.length > 0) {
|
||||
return resizeBuffer(context, context.pos + size);
|
||||
}
|
||||
return context.buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the decoding behavior policy.
|
||||
*
|
||||
* <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 > 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;
|
||||
}
|
||||
}
|
137
src/main/java/net/lax1dude/eaglercraft/Client.java
Normal file
137
src/main/java/net/lax1dude/eaglercraft/Client.java
Normal file
File diff suppressed because one or more lines are too long
43
src/main/java/net/lax1dude/eaglercraft/EaglerImage.java
Normal file
43
src/main/java/net/lax1dude/eaglercraft/EaglerImage.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
60
src/main/java/net/lax1dude/eaglercraft/GLAllocation.java
Normal file
60
src/main/java/net/lax1dude/eaglercraft/GLAllocation.java
Normal 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();
|
||||
|
||||
}
|
108
src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java
Normal file
108
src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java
Normal 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();
|
||||
}
|
213
src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java
Normal file
213
src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java
Normal 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
339
src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java
Normal file
339
src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package net.lax1dude.eaglercraft.adapter.teavm;
|
||||
|
||||
import org.teavm.jso.JSObject;
|
||||
|
||||
public interface WebGLQuery extends JSObject {
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package net.lax1dude.eaglercraft.adapter.teavm;
|
||||
|
||||
import org.teavm.jso.JSObject;
|
||||
|
||||
public interface WebGLVertexArray extends JSObject {
|
||||
}
|
952
src/main/java/net/minecraft/client/Minecraft.java
Normal file
952
src/main/java/net/minecraft/client/Minecraft.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
317
src/main/java/net/minecraft/src/AxisAlignedBB.java
Normal file
317
src/main/java/net/minecraft/src/AxisAlignedBB.java
Normal 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;
|
||||
}
|
||||
}
|
493
src/main/java/net/minecraft/src/Block.java
Normal file
493
src/main/java/net/minecraft/src/Block.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
7
src/main/java/net/minecraft/src/BlockBloodStone.java
Normal file
7
src/main/java/net/minecraft/src/BlockBloodStone.java
Normal 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);
|
||||
}
|
||||
}
|
17
src/main/java/net/minecraft/src/BlockBookshelf.java
Normal file
17
src/main/java/net/minecraft/src/BlockBookshelf.java
Normal 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;
|
||||
}
|
||||
}
|
19
src/main/java/net/minecraft/src/BlockBreakable.java
Normal file
19
src/main/java/net/minecraft/src/BlockBreakable.java
Normal 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);
|
||||
}
|
||||
}
|
236
src/main/java/net/minecraft/src/BlockButton.java
Normal file
236
src/main/java/net/minecraft/src/BlockButton.java
Normal 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);
|
||||
}
|
||||
}
|
86
src/main/java/net/minecraft/src/BlockCactus.java
Normal file
86
src/main/java/net/minecraft/src/BlockCactus.java
Normal 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);
|
||||
}
|
||||
}
|
196
src/main/java/net/minecraft/src/BlockChest.java
Normal file
196
src/main/java/net/minecraft/src/BlockChest.java
Normal 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();
|
||||
}
|
||||
}
|
17
src/main/java/net/minecraft/src/BlockClay.java
Normal file
17
src/main/java/net/minecraft/src/BlockClay.java
Normal 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;
|
||||
}
|
||||
}
|
24
src/main/java/net/minecraft/src/BlockContainer.java
Normal file
24
src/main/java/net/minecraft/src/BlockContainer.java
Normal 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();
|
||||
}
|
110
src/main/java/net/minecraft/src/BlockCrops.java
Normal file
110
src/main/java/net/minecraft/src/BlockCrops.java
Normal 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;
|
||||
}
|
||||
}
|
7
src/main/java/net/minecraft/src/BlockDirt.java
Normal file
7
src/main/java/net/minecraft/src/BlockDirt.java
Normal 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);
|
||||
}
|
||||
}
|
195
src/main/java/net/minecraft/src/BlockDoor.java
Normal file
195
src/main/java/net/minecraft/src/BlockDoor.java
Normal 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);
|
||||
}
|
||||
}
|
29
src/main/java/net/minecraft/src/BlockFence.java
Normal file
29
src/main/java/net/minecraft/src/BlockFence.java
Normal 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;
|
||||
}
|
||||
}
|
228
src/main/java/net/minecraft/src/BlockFire.java
Normal file
228
src/main/java/net/minecraft/src/BlockFire.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
58
src/main/java/net/minecraft/src/BlockFlower.java
Normal file
58
src/main/java/net/minecraft/src/BlockFlower.java
Normal 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;
|
||||
}
|
||||
}
|
263
src/main/java/net/minecraft/src/BlockFlowing.java
Normal file
263
src/main/java/net/minecraft/src/BlockFlowing.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
269
src/main/java/net/minecraft/src/BlockFluids.java
Normal file
269
src/main/java/net/minecraft/src/BlockFluids.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
130
src/main/java/net/minecraft/src/BlockFurnace.java
Normal file
130
src/main/java/net/minecraft/src/BlockFurnace.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
13
src/main/java/net/minecraft/src/BlockGlass.java
Normal file
13
src/main/java/net/minecraft/src/BlockGlass.java
Normal 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;
|
||||
}
|
||||
}
|
51
src/main/java/net/minecraft/src/BlockGrass.java
Normal file
51
src/main/java/net/minecraft/src/BlockGrass.java
Normal 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);
|
||||
}
|
||||
}
|
13
src/main/java/net/minecraft/src/BlockGravel.java
Normal file
13
src/main/java/net/minecraft/src/BlockGravel.java
Normal 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;
|
||||
}
|
||||
}
|
39
src/main/java/net/minecraft/src/BlockIce.java
Normal file
39
src/main/java/net/minecraft/src/BlockIce.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
44
src/main/java/net/minecraft/src/BlockJukeBox.java
Normal file
44
src/main/java/net/minecraft/src/BlockJukeBox.java
Normal 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);
|
||||
//}
|
||||
}
|
||||
}
|
121
src/main/java/net/minecraft/src/BlockLadder.java
Normal file
121
src/main/java/net/minecraft/src/BlockLadder.java
Normal 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;
|
||||
}
|
||||
}
|
128
src/main/java/net/minecraft/src/BlockLeaves.java
Normal file
128
src/main/java/net/minecraft/src/BlockLeaves.java
Normal 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);
|
||||
}
|
||||
}
|
19
src/main/java/net/minecraft/src/BlockLeavesBase.java
Normal file
19
src/main/java/net/minecraft/src/BlockLeavesBase.java
Normal 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);
|
||||
}
|
||||
}
|
200
src/main/java/net/minecraft/src/BlockLever.java
Normal file
200
src/main/java/net/minecraft/src/BlockLever.java
Normal 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;
|
||||
}
|
||||
}
|
13
src/main/java/net/minecraft/src/BlockLightStone.java
Normal file
13
src/main/java/net/minecraft/src/BlockLightStone.java
Normal 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;
|
||||
}
|
||||
}
|
22
src/main/java/net/minecraft/src/BlockLog.java
Normal file
22
src/main/java/net/minecraft/src/BlockLog.java
Normal 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);
|
||||
}
|
||||
}
|
101
src/main/java/net/minecraft/src/BlockMinecartTrack.java
Normal file
101
src/main/java/net/minecraft/src/BlockMinecartTrack.java
Normal 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));
|
||||
//}
|
||||
}
|
||||
}
|
25
src/main/java/net/minecraft/src/BlockMobSpawner.java
Normal file
25
src/main/java/net/minecraft/src/BlockMobSpawner.java
Normal 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;
|
||||
}
|
||||
}
|
17
src/main/java/net/minecraft/src/BlockMushroom.java
Normal file
17
src/main/java/net/minecraft/src/BlockMushroom.java
Normal 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));
|
||||
}
|
||||
}
|
17
src/main/java/net/minecraft/src/BlockObsidian.java
Normal file
17
src/main/java/net/minecraft/src/BlockObsidian.java
Normal 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;
|
||||
}
|
||||
}
|
17
src/main/java/net/minecraft/src/BlockOre.java
Normal file
17
src/main/java/net/minecraft/src/BlockOre.java
Normal 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;
|
||||
}
|
||||
}
|
12
src/main/java/net/minecraft/src/BlockOreBlock.java
Normal file
12
src/main/java/net/minecraft/src/BlockOreBlock.java
Normal 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;
|
||||
}
|
||||
}
|
167
src/main/java/net/minecraft/src/BlockPortal.java
Normal file
167
src/main/java/net/minecraft/src/BlockPortal.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
151
src/main/java/net/minecraft/src/BlockPressurePlate.java
Normal file
151
src/main/java/net/minecraft/src/BlockPressurePlate.java
Normal 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);
|
||||
}
|
||||
}
|
45
src/main/java/net/minecraft/src/BlockPumpkin.java
Normal file
45
src/main/java/net/minecraft/src/BlockPumpkin.java
Normal 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);
|
||||
}
|
||||
}
|
104
src/main/java/net/minecraft/src/BlockRedstoneOre.java
Normal file
104
src/main/java/net/minecraft/src/BlockRedstoneOre.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
153
src/main/java/net/minecraft/src/BlockRedstoneTorch.java
Normal file
153
src/main/java/net/minecraft/src/BlockRedstoneTorch.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
308
src/main/java/net/minecraft/src/BlockRedstoneWire.java
Normal file
308
src/main/java/net/minecraft/src/BlockRedstoneWire.java
Normal 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
Loading…
Reference in New Issue
Block a user