From 5a4eff2040f3cecc8cf538662e74065da88779a4 Mon Sep 17 00:00:00 2001 From: PeytonPlayz595 <106421860+PeytonPlayz595@users.noreply.github.com> Date: Wed, 19 Jul 2023 12:55:48 -0400 Subject: [PATCH] Upload Source Code --- .classpath | 17 + .gitattributes | 6 + .gitignore | 5 + .project | 23 + .settings/org.eclipse.buildship.core.prefs | 13 + ...MinecraftMain$AbortedLaunchException.class | Bin 0 -> 471 bytes .../net/PeytonPlayz585/MinecraftMain.class | Bin 0 -> 6471 bytes .../glemu/FixedFunctionShader.class | Bin 0 -> 12389 bytes .../PeytonPlayz585/glemu/vector/Matrix.class | Bin 0 -> 653 bytes .../glemu/vector/Matrix2f.class | Bin 0 -> 5116 bytes .../glemu/vector/Matrix3f.class | Bin 0 -> 7497 bytes .../glemu/vector/Matrix4f.class | Bin 0 -> 15479 bytes .../glemu/vector/Quaternion.class | Bin 0 -> 8234 bytes .../glemu/vector/ReadableVector.class | Bin 0 -> 271 bytes .../glemu/vector/ReadableVector2f.class | Bin 0 -> 235 bytes .../glemu/vector/ReadableVector3f.class | Bin 0 -> 222 bytes .../glemu/vector/ReadableVector4f.class | Bin 0 -> 222 bytes .../PeytonPlayz585/glemu/vector/Vector.class | Bin 0 -> 1066 bytes .../glemu/vector/Vector2f.class | Bin 0 -> 4593 bytes .../glemu/vector/Vector3f.class | Bin 0 -> 5306 bytes .../glemu/vector/Vector4f.class | Bin 0 -> 5529 bytes .../glemu/vector/WritableVector2f.class | Bin 0 -> 204 bytes .../glemu/vector/WritableVector3f.class | Bin 0 -> 246 bytes .../glemu/vector/WritableVector4f.class | Bin 0 -> 247 bytes .../net/PeytonPlayz585/math/MathHelper.class | Bin 0 -> 1602 bytes .../PeytonPlayz585/minecraft/AWTColor.class | Bin 0 -> 1166 bytes .../minecraft/AssetRepository.class | Bin 0 -> 2779 bytes .../net/PeytonPlayz585/minecraft/Base64.class | Bin 0 -> 10616 bytes .../minecraft/BaseNCodec$CodecPolicy.class | Bin 0 -> 1260 bytes .../minecraft/BaseNCodec$Context.class | Bin 0 -> 1431 bytes .../PeytonPlayz585/minecraft/BaseNCodec.class | Bin 0 -> 7219 bytes .../minecraft/GeneralDigest.class | Bin 0 -> 1633 bytes .../minecraft/MinecraftImage.class | Bin 0 -> 1351 bytes .../PeytonPlayz585/minecraft/SHA1Digest.class | Bin 0 -> 3739 bytes bin/main/net/PeytonPlayz585/nbt/NBTBase.class | Bin 0 -> 2620 bytes .../net/PeytonPlayz585/nbt/NBTTagByte.class | Bin 0 -> 1177 bytes .../PeytonPlayz585/nbt/NBTTagByteArray.class | Bin 0 -> 1412 bytes .../PeytonPlayz585/nbt/NBTTagCompound.class | Bin 0 -> 6176 bytes .../net/PeytonPlayz585/nbt/NBTTagDouble.class | Bin 0 -> 1101 bytes .../net/PeytonPlayz585/nbt/NBTTagEnd.class | Bin 0 -> 820 bytes .../net/PeytonPlayz585/nbt/NBTTagFloat.class | Bin 0 -> 1182 bytes .../net/PeytonPlayz585/nbt/NBTTagInt.class | Bin 0 -> 1170 bytes .../net/PeytonPlayz585/nbt/NBTTagList.class | Bin 0 -> 2930 bytes .../net/PeytonPlayz585/nbt/NBTTagLong.class | Bin 0 -> 1176 bytes .../net/PeytonPlayz585/nbt/NBTTagShort.class | Bin 0 -> 1189 bytes .../net/PeytonPlayz585/nbt/NBTTagString.class | Bin 0 -> 1518 bytes .../storage/LocalStorageManager.class | Bin 0 -> 2273 bytes .../teavm/WebGL2RenderingContext.class | Bin 0 -> 1289 bytes .../net/PeytonPlayz585/teavm/WebGLQuery.class | Bin 0 -> 156 bytes .../teavm/WebGLVertexArray.class | Bin 0 -> 168 bytes .../client/CanvasMinecraftApplet.class | Bin 0 -> 763 bytes bin/main/net/minecraft/client/ChatLine.class | Bin 0 -> 319 bytes bin/main/net/minecraft/client/EnumOS.class | Bin 0 -> 1166 bytes .../client/EnumOSMappingHelper.class | Bin 0 -> 850 bytes .../net/minecraft/client/GameSettings.class | Bin 0 -> 4499 bytes .../net/minecraft/client/GuiMainMenu.class | Bin 0 -> 7413 bytes .../net/minecraft/client/KeyBinding.class | Bin 0 -> 466 bytes .../client/LoadingScreenRenderer.class | Bin 0 -> 4451 bytes bin/main/net/minecraft/client/Minecraft.class | Bin 0 -> 10912 bytes .../minecraft/client/MinecraftApplet.class | Bin 0 -> 3528 bytes .../net/minecraft/client/MinecraftError.class | Bin 0 -> 308 bytes .../net/minecraft/client/MouseHelper.class | Bin 0 -> 952 bytes .../minecraft/client/OpenGlCapsChecker.class | Bin 0 -> 318 bytes .../net/minecraft/client/PlayerLoader.class | Bin 0 -> 1214 bytes .../net/minecraft/client/RenderHelper.class | Bin 0 -> 1786 bytes bin/main/net/minecraft/client/Session.class | Bin 0 -> 2599 bytes .../minecraft/client/ThreadSleepForever.class | Bin 0 -> 750 bytes bin/main/net/minecraft/client/Timer.class | Bin 0 -> 1358 bytes .../client/controller/PlayerController.class | Bin 0 -> 2467 bytes .../controller/PlayerControllerCreative.class | Bin 0 -> 2110 bytes .../controller/PlayerControllerSP.class | Bin 0 -> 3993 bytes .../client/effect/EffectRenderer.class | Bin 0 -> 5250 bytes .../client/effect/EntityBubbleFX.class | Bin 0 -> 1904 bytes .../client/effect/EntityDiggingFX.class | Bin 0 -> 2228 bytes .../client/effect/EntityExplodeFX.class | Bin 0 -> 1961 bytes .../minecraft/client/effect/EntityFX.class | Bin 0 -> 3931 bytes .../client/effect/EntityFlameFX.class | Bin 0 -> 2236 bytes .../client/effect/EntityLavaFX.class | Bin 0 -> 2354 bytes .../client/effect/EntityPickupFX.class | Bin 0 -> 2410 bytes .../client/effect/EntityRainFX.class | Bin 0 -> 2197 bytes .../client/effect/EntitySmokeFX.class | Bin 0 -> 2272 bytes .../client/effect/EntitySplashFX.class | Bin 0 -> 592 bytes .../client/gui/FilenameFilterLevel.class | Bin 0 -> 780 bytes .../minecraft/client/gui/FontRenderer.class | Bin 0 -> 5195 bytes bin/main/net/minecraft/client/gui/Gui.class | Bin 0 -> 2651 bytes .../net/minecraft/client/gui/GuiButton.class | Bin 0 -> 2329 bytes .../minecraft/client/gui/GuiControls.class | Bin 0 -> 2773 bytes .../minecraft/client/gui/GuiErrorScreen.class | Bin 0 -> 1145 bytes .../minecraft/client/gui/GuiGameOver.class | Bin 0 -> 2946 bytes .../net/minecraft/client/gui/GuiIngame.class | Bin 0 -> 7662 bytes .../minecraft/client/gui/GuiIngameMenu.class | Bin 0 -> 2450 bytes .../minecraft/client/gui/GuiLevelDialog.class | Bin 0 -> 2263 bytes .../minecraft/client/gui/GuiLoadLevel.class | Bin 0 -> 5972 bytes .../minecraft/client/gui/GuiNameLevel.class | Bin 0 -> 3558 bytes .../minecraft/client/gui/GuiNewLevel.class | Bin 0 -> 3270 bytes .../net/minecraft/client/gui/GuiOptions.class | Bin 0 -> 2362 bytes .../minecraft/client/gui/GuiSaveLevel.class | Bin 0 -> 2320 bytes .../net/minecraft/client/gui/GuiScreen.class | Bin 0 -> 3857 bytes .../minecraft/client/gui/GuiSmallButton.class | Bin 0 -> 492 bytes .../client/gui/ScaledResolution.class | Bin 0 -> 725 bytes .../client/gui/container/GuiChest.class | Bin 0 -> 2501 bytes .../client/gui/container/GuiContainer.class | Bin 0 -> 6672 bytes .../client/gui/container/GuiCrafting.class | Bin 0 -> 3909 bytes .../client/gui/container/GuiFurnace.class | Bin 0 -> 2690 bytes .../client/gui/container/GuiInventory.class | Bin 0 -> 5457 bytes .../gui/container/InventoryCraftResult.class | Bin 0 -> 1355 bytes .../gui/container/InventoryCrafting.class | Bin 0 -> 1828 bytes .../minecraft/client/gui/container/Slot.class | Bin 0 -> 1727 bytes .../client/gui/container/SlotArmor.class | Bin 0 -> 1339 bytes .../client/gui/container/SlotCrafting.class | Bin 0 -> 1352 bytes .../minecraft/client/model/ModelBase.class | Bin 0 -> 627 bytes .../minecraft/client/model/ModelBiped.class | Bin 0 -> 2378 bytes .../minecraft/client/model/ModelCreeper.class | Bin 0 -> 1818 bytes .../net/minecraft/client/model/ModelPig.class | Bin 0 -> 343 bytes .../client/model/ModelQuadruped.class | Bin 0 -> 1826 bytes .../client/model/ModelRenderer.class | Bin 0 -> 4864 bytes .../minecraft/client/model/ModelSheep.class | Bin 0 -> 717 bytes .../client/model/ModelSheepFur.class | Bin 0 -> 1059 bytes .../client/model/ModelSkeleton.class | Bin 0 -> 918 bytes .../minecraft/client/model/ModelSpider.class | Bin 0 -> 3033 bytes .../minecraft/client/model/ModelZombie.class | Bin 0 -> 1156 bytes .../client/model/PositionTextureVertex.class | Bin 0 -> 1189 bytes .../minecraft/client/model/TexturedQuad.class | Bin 0 -> 993 bytes .../client/player/EntityPlayerSP.class | Bin 0 -> 5607 bytes .../client/player/MovementInput.class | Bin 0 -> 731 bytes .../player/MovementInputFromOptions.class | Bin 0 -> 1587 bytes .../client/render/EntityRenderer.class | Bin 0 -> 16944 bytes .../client/render/EntitySorter.class | Bin 0 -> 983 bytes .../client/render/ImageBufferDownload.class | Bin 0 -> 2129 bytes .../client/render/ItemRenderer.class | Bin 0 -> 7974 bytes .../client/render/RenderBlocks.class | Bin 0 -> 17630 bytes .../client/render/RenderEngine.class | Bin 0 -> 7021 bytes .../client/render/RenderGlobal.class | Bin 0 -> 21531 bytes .../client/render/RenderSorter.class | Bin 0 -> 1113 bytes .../minecraft/client/render/Tessellator.class | Bin 0 -> 6044 bytes .../client/render/ThreadDownloadImage.class | Bin 0 -> 1987 bytes .../render/ThreadDownloadImageData.class | Bin 0 -> 950 bytes .../client/render/WorldRenderer.class | Bin 0 -> 4762 bytes .../client/render/camera/ClippingHelper.class | Bin 0 -> 544 bytes .../camera/ClippingHelperImplementation.class | Bin 0 -> 3524 bytes .../client/render/camera/Frustrum.class | Bin 0 -> 1763 bytes .../client/render/camera/ICamera.class | Bin 0 -> 212 bytes .../client/render/camera/IsomCamera.class | Bin 0 -> 569 bytes .../client/render/entity/Render.class | Bin 0 -> 5755 bytes .../client/render/entity/RenderArrow.class | Bin 0 -> 2123 bytes .../client/render/entity/RenderCreeper.class | Bin 0 -> 1524 bytes .../client/render/entity/RenderEntity.class | Bin 0 -> 1032 bytes .../render/entity/RenderGiantZombie.class | Bin 0 -> 874 bytes .../client/render/entity/RenderItem.class | Bin 0 -> 6152 bytes .../client/render/entity/RenderLiving.class | Bin 0 -> 4178 bytes .../client/render/entity/RenderManager.class | Bin 0 -> 5982 bytes .../client/render/entity/RenderPainting.class | Bin 0 -> 3705 bytes .../client/render/entity/RenderPlayer.class | Bin 0 -> 4239 bytes .../client/render/entity/RenderSheep.class | Bin 0 -> 1189 bytes .../client/render/entity/RenderSpider.class | Bin 0 -> 1508 bytes .../render/entity/RenderTNTPrimed.class | Bin 0 -> 1866 bytes .../client/render/texture/TextureFX.class | Bin 0 -> 597 bytes .../render/texture/TextureFlamesFX.class | Bin 0 -> 1952 bytes .../render/texture/TextureGearsFX.class | Bin 0 -> 2197 bytes .../client/render/texture/TextureLavaFX.class | Bin 0 -> 2153 bytes .../render/texture/TextureWaterFX.class | Bin 0 -> 1962 bytes .../render/texture/TextureWaterFlowFX.class | Bin 0 -> 1975 bytes bin/main/net/minecraft/game/IInventory.class | Bin 0 -> 439 bytes .../minecraft/game/InventoryLargeChest.class | Bin 0 -> 1703 bytes .../net/minecraft/game/entity/Entity.class | Bin 0 -> 13981 bytes .../game/entity/EntityCreature.class | Bin 0 -> 4452 bytes .../minecraft/game/entity/EntityLiving.class | Bin 0 -> 10248 bytes .../game/entity/EntityPainting.class | Bin 0 -> 6458 bytes .../net/minecraft/game/entity/EnumArt.class | Bin 0 -> 2503 bytes .../game/entity/animal/EntityAnimal.class | Bin 0 -> 1450 bytes .../game/entity/animal/EntityPig.class | Bin 0 -> 1411 bytes .../game/entity/animal/EntitySheep.class | Bin 0 -> 2419 bytes .../game/entity/misc/EntityItem.class | Bin 0 -> 5363 bytes .../game/entity/misc/EntityTNTPrimed.class | Bin 0 -> 2678 bytes .../game/entity/monster/EntityCreeper.class | Bin 0 -> 2158 bytes .../entity/monster/EntityGiantZombie.class | Bin 0 -> 1118 bytes .../game/entity/monster/EntityMob.class | Bin 0 -> 2974 bytes .../game/entity/monster/EntitySkeleton.class | Bin 0 -> 2752 bytes .../game/entity/monster/EntitySpider.class | Bin 0 -> 2528 bytes .../game/entity/monster/EntityZombie.class | Bin 0 -> 1464 bytes .../game/entity/player/EntityPlayer.class | Bin 0 -> 7527 bytes .../game/entity/player/InventoryPlayer.class | Bin 0 -> 4312 bytes .../game/entity/projectile/EntityArrow.class | Bin 0 -> 7717 bytes bin/main/net/minecraft/game/item/Item.class | Bin 0 -> 9520 bytes .../net/minecraft/game/item/ItemArmor.class | Bin 0 -> 810 bytes .../net/minecraft/game/item/ItemAxe.class | Bin 0 -> 747 bytes .../net/minecraft/game/item/ItemBlock.class | Bin 0 -> 2168 bytes .../net/minecraft/game/item/ItemBow.class | Bin 0 -> 1372 bytes .../game/item/ItemFlintAndSteel.class | Bin 0 -> 1385 bytes .../net/minecraft/game/item/ItemFood.class | Bin 0 -> 981 bytes .../net/minecraft/game/item/ItemHoe.class | Bin 0 -> 2406 bytes .../minecraft/game/item/ItemPainting.class | Bin 0 -> 1377 bytes .../net/minecraft/game/item/ItemPickaxe.class | Bin 0 -> 1529 bytes .../net/minecraft/game/item/ItemSeeds.class | Bin 0 -> 1236 bytes .../net/minecraft/game/item/ItemSoup.class | Bin 0 -> 957 bytes .../net/minecraft/game/item/ItemSpade.class | Bin 0 -> 794 bytes .../net/minecraft/game/item/ItemStack.class | Bin 0 -> 2756 bytes .../net/minecraft/game/item/ItemSword.class | Bin 0 -> 1064 bytes .../net/minecraft/game/item/ItemTool.class | Bin 0 -> 1392 bytes .../game/item/recipe/CraftingManager.class | Bin 0 -> 5831 bytes .../game/item/recipe/CraftingRecipe.class | Bin 0 -> 1641 bytes .../game/item/recipe/RecipeSorter.class | Bin 0 -> 910 bytes .../game/item/recipe/RecipesArmor.class | Bin 0 -> 2334 bytes .../game/item/recipe/RecipesCrafting.class | Bin 0 -> 332 bytes .../game/item/recipe/RecipesFood.class | Bin 0 -> 320 bytes .../game/item/recipe/RecipesIngots.class | Bin 0 -> 1549 bytes .../game/item/recipe/RecipesTools.class | Bin 0 -> 2353 bytes .../game/item/recipe/RecipesWeapons.class | Bin 0 -> 2100 bytes .../net/minecraft/game/level/EntityMap.class | Bin 0 -> 4218 bytes .../minecraft/game/level/EntityMapSlot.class | Bin 0 -> 1927 bytes .../minecraft/game/level/IWorldAccess.class | Bin 0 -> 438 bytes .../minecraft/game/level/LevelLoader.class | Bin 0 -> 9847 bytes bin/main/net/minecraft/game/level/Light.class | Bin 0 -> 8664 bytes .../game/level/MetadataChunkBlock.class | Bin 0 -> 734 bytes .../net/minecraft/game/level/MobSpawner.class | Bin 0 -> 4864 bytes .../game/level/NextTickListEntry.class | Bin 0 -> 582 bytes bin/main/net/minecraft/game/level/World.class | Bin 0 -> 33419 bytes .../minecraft/game/level/block/Block.class | Bin 0 -> 19414 bytes .../game/level/block/BlockBookshelf.class | Bin 0 -> 867 bytes .../game/level/block/BlockBreakable.class | Bin 0 -> 1101 bytes .../game/level/block/BlockChest.class | Bin 0 -> 6078 bytes .../game/level/block/BlockContainer.class | Bin 0 -> 1142 bytes .../game/level/block/BlockCrops.class | Bin 0 -> 4112 bytes .../game/level/block/BlockDirt.class | Bin 0 -> 549 bytes .../game/level/block/BlockFarmland.class | Bin 0 -> 3519 bytes .../game/level/block/BlockFire.class | Bin 0 -> 6885 bytes .../game/level/block/BlockFlower.class | Bin 0 -> 2823 bytes .../game/level/block/BlockFlowing.class | Bin 0 -> 6011 bytes .../game/level/block/BlockFluid.class | Bin 0 -> 6329 bytes .../game/level/block/BlockFurnace.class | Bin 0 -> 3770 bytes .../game/level/block/BlockGears.class | Bin 0 -> 1178 bytes .../game/level/block/BlockGlass.class | Bin 0 -> 657 bytes .../game/level/block/BlockGrass.class | Bin 0 -> 1785 bytes .../game/level/block/BlockGravel.class | Bin 0 -> 755 bytes .../game/level/block/BlockLeaves.class | Bin 0 -> 1896 bytes .../game/level/block/BlockLeavesBase.class | Bin 0 -> 1107 bytes .../minecraft/game/level/block/BlockLog.class | Bin 0 -> 1045 bytes .../game/level/block/BlockMushroom.class | Bin 0 -> 1044 bytes .../minecraft/game/level/block/BlockOre.class | Bin 0 -> 1103 bytes .../game/level/block/BlockOreBlock.class | Bin 0 -> 759 bytes .../game/level/block/BlockSand.class | Bin 0 -> 2030 bytes .../game/level/block/BlockSapling.class | Bin 0 -> 1205 bytes .../game/level/block/BlockSource.class | Bin 0 -> 1629 bytes .../game/level/block/BlockSponge.class | Bin 0 -> 1455 bytes .../game/level/block/BlockStationary.class | Bin 0 -> 2077 bytes .../game/level/block/BlockStep.class | Bin 0 -> 2200 bytes .../game/level/block/BlockStone.class | Bin 0 -> 776 bytes .../minecraft/game/level/block/BlockTNT.class | Bin 0 -> 1750 bytes .../game/level/block/BlockTorch.class | Bin 0 -> 4464 bytes .../game/level/block/BlockWorkbench.class | Bin 0 -> 1260 bytes .../game/level/block/StepSound.class | Bin 0 -> 904 bytes .../game/level/block/StepSoundGlass.class | Bin 0 -> 571 bytes .../game/level/block/StepSoundSand.class | Bin 0 -> 567 bytes .../level/block/tileentity/TileEntity.class | Bin 0 -> 775 bytes .../block/tileentity/TileEntityChest.class | Bin 0 -> 2863 bytes .../block/tileentity/TileEntityFurnace.class | Bin 0 -> 6908 bytes .../game/level/generator/LevelGenerator.class | Bin 0 -> 19392 bytes .../generator/noise/NoiseGenerator.class | Bin 0 -> 381 bytes .../noise/NoiseGeneratorDistort.class | Bin 0 -> 841 bytes .../noise/NoiseGeneratorOctaves.class | Bin 0 -> 1146 bytes .../noise/NoiseGeneratorPerlin.class | Bin 0 -> 2166 bytes .../game/level/material/Material.class | Bin 0 -> 1626 bytes .../game/level/material/MaterialLiquid.class | Bin 0 -> 507 bytes .../game/level/material/MaterialLogic.class | Bin 0 -> 580 bytes .../level/material/MaterialTransparent.class | Bin 0 -> 598 bytes .../net/minecraft/game/level/path/Path.class | Bin 0 -> 2613 bytes .../game/level/path/PathEntity.class | Bin 0 -> 1263 bytes .../minecraft/game/level/path/PathPoint.class | Bin 0 -> 1730 bytes .../game/level/path/Pathfinder.class | Bin 0 -> 6526 bytes .../game/physics/AxisAlignedBB.class | Bin 0 -> 4970 bytes .../game/physics/MovingObjectPosition.class | Bin 0 -> 1189 bytes .../net/minecraft/game/physics/Vec3D.class | Bin 0 -> 2754 bytes bin/main/org/lwjgl/BufferUtils.class | Bin 0 -> 719 bytes bin/main/org/lwjgl/GLAllocation.class | Bin 0 -> 2305 bytes bin/main/org/lwjgl/opengl/GL11.class | Bin 0 -> 284 bytes bin/main/org/lwjgl/opengl/GLObjectMap.class | Bin 0 -> 1667 bytes .../org/lwjgl/opengl/RealOpenGLEnums.class | Bin 0 -> 32848 bytes bin/main/org/lwjgl/opengl/WebGL$1.class | Bin 0 -> 1495 bytes bin/main/org/lwjgl/opengl/WebGL$10.class | Bin 0 -> 991 bytes bin/main/org/lwjgl/opengl/WebGL$11.class | Bin 0 -> 1028 bytes bin/main/org/lwjgl/opengl/WebGL$12.class | Bin 0 -> 3032 bytes bin/main/org/lwjgl/opengl/WebGL$13.class | Bin 0 -> 1277 bytes bin/main/org/lwjgl/opengl/WebGL$14$1.class | Bin 0 -> 834 bytes bin/main/org/lwjgl/opengl/WebGL$14.class | Bin 0 -> 1156 bytes bin/main/org/lwjgl/opengl/WebGL$15.class | Bin 0 -> 1381 bytes bin/main/org/lwjgl/opengl/WebGL$16.class | Bin 0 -> 1974 bytes bin/main/org/lwjgl/opengl/WebGL$17.class | Bin 0 -> 2517 bytes bin/main/org/lwjgl/opengl/WebGL$18.class | Bin 0 -> 917 bytes bin/main/org/lwjgl/opengl/WebGL$19.class | Bin 0 -> 883 bytes bin/main/org/lwjgl/opengl/WebGL$2.class | Bin 0 -> 1024 bytes bin/main/org/lwjgl/opengl/WebGL$20.class | Bin 0 -> 1176 bytes bin/main/org/lwjgl/opengl/WebGL$21.class | Bin 0 -> 1179 bytes bin/main/org/lwjgl/opengl/WebGL$22.class | Bin 0 -> 1060 bytes bin/main/org/lwjgl/opengl/WebGL$3.class | Bin 0 -> 1369 bytes bin/main/org/lwjgl/opengl/WebGL$4.class | Bin 0 -> 1332 bytes bin/main/org/lwjgl/opengl/WebGL$5.class | Bin 0 -> 1465 bytes bin/main/org/lwjgl/opengl/WebGL$6.class | Bin 0 -> 1336 bytes bin/main/org/lwjgl/opengl/WebGL$7.class | Bin 0 -> 1299 bytes bin/main/org/lwjgl/opengl/WebGL$8.class | Bin 0 -> 1263 bytes bin/main/org/lwjgl/opengl/WebGL$9.class | Bin 0 -> 1151 bytes .../opengl/WebGL$AudioBufferSourceNodeX.class | Bin 0 -> 806 bytes .../org/lwjgl/opengl/WebGL$AudioBufferX.class | Bin 0 -> 524 bytes .../lwjgl/opengl/WebGL$BufferArrayGL.class | Bin 0 -> 589 bytes .../org/lwjgl/opengl/WebGL$BufferGL.class | Bin 0 -> 503 bytes .../org/lwjgl/opengl/WebGL$FileEntry.class | Bin 0 -> 862 bytes .../lwjgl/opengl/WebGL$FramebufferGL.class | Bin 0 -> 528 bytes .../org/lwjgl/opengl/WebGL$ProgramGL.class | Bin 0 -> 577 bytes bin/main/org/lwjgl/opengl/WebGL$QueryGL.class | Bin 0 -> 508 bytes .../org/lwjgl/opengl/WebGL$RateLimit.class | Bin 0 -> 1337 bytes .../lwjgl/opengl/WebGL$RenderbufferGL.class | Bin 0 -> 533 bytes .../org/lwjgl/opengl/WebGL$ShaderGL.class | Bin 0 -> 503 bytes .../WebGL$StupidFunctionResolveString.class | Bin 0 -> 387 bytes .../org/lwjgl/opengl/WebGL$TextureGL.class | Bin 0 -> 656 bytes .../org/lwjgl/opengl/WebGL$UniformGL.class | Bin 0 -> 524 bytes bin/main/org/lwjgl/opengl/WebGL.class | Bin 0 -> 64153 bytes .../opengl/WebGLManager$DisplayList.class | Bin 0 -> 857 bytes bin/main/org/lwjgl/opengl/WebGLManager.class | Bin 0 -> 33841 bytes bin/main/util/IProgressUpdate.class | Bin 0 -> 240 bytes build.gradle | 83 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 ++ gradlew.bat | 89 + settings.gradle | 10 + .../net/PeytonPlayz585/MinecraftMain.java | 124 + .../glemu/FixedFunctionShader.java | 397 +++ .../PeytonPlayz585/glemu/vector/Matrix.java | 130 + .../PeytonPlayz585/glemu/vector/Matrix2f.java | 418 +++ .../PeytonPlayz585/glemu/vector/Matrix3f.java | 529 ++++ .../PeytonPlayz585/glemu/vector/Matrix4f.java | 902 ++++++ .../glemu/vector/Quaternion.java | 506 ++++ .../glemu/vector/ReadableVector.java | 57 + .../glemu/vector/ReadableVector2f.java | 47 + .../glemu/vector/ReadableVector3f.java | 42 + .../glemu/vector/ReadableVector4f.java | 44 + .../PeytonPlayz585/glemu/vector/Vector.java | 110 + .../PeytonPlayz585/glemu/vector/Vector2f.java | 319 +++ .../PeytonPlayz585/glemu/vector/Vector3f.java | 376 +++ .../PeytonPlayz585/glemu/vector/Vector4f.java | 377 +++ .../glemu/vector/WritableVector2f.java | 64 + .../glemu/vector/WritableVector3f.java | 58 + .../glemu/vector/WritableVector4f.java | 59 + .../net/PeytonPlayz585/math/MathHelper.java | 61 + .../PeytonPlayz585/minecraft/AWTColor.java | 51 + .../minecraft/AssetRepository.java | 55 + .../net/PeytonPlayz585/minecraft/Base64.java | 857 ++++++ .../PeytonPlayz585/minecraft/BaseNCodec.java | 692 +++++ .../minecraft/GeneralDigest.java | 108 + .../minecraft/MinecraftImage.java | 40 + .../PeytonPlayz585/minecraft/SHA1Digest.java | 213 ++ .../java/net/PeytonPlayz585/nbt/NBTBase.java | 78 + .../net/PeytonPlayz585/nbt/NBTTagByte.java | 32 + .../PeytonPlayz585/nbt/NBTTagByteArray.java | 35 + .../PeytonPlayz585/nbt/NBTTagCompound.java | 132 + .../net/PeytonPlayz585/nbt/NBTTagDouble.java | 25 + .../net/PeytonPlayz585/nbt/NBTTagEnd.java | 21 + .../net/PeytonPlayz585/nbt/NBTTagFloat.java | 32 + .../net/PeytonPlayz585/nbt/NBTTagInt.java | 32 + .../net/PeytonPlayz585/nbt/NBTTagList.java | 103 + .../net/PeytonPlayz585/nbt/NBTTagLong.java | 32 + .../net/PeytonPlayz585/nbt/NBTTagShort.java | 32 + .../net/PeytonPlayz585/nbt/NBTTagString.java | 37 + .../storage/LocalStorageManager.java | 81 + .../teavm/IDBObjectStorePatched.java | 79 + .../teavm/IndexedDBFilesystem.java | 427 +++ .../teavm/WebGL2RenderingContext.java | 42 + .../net/PeytonPlayz585/teavm/WebGLQuery.java | 6 + .../teavm/WebGLVertexArray.java | 6 + .../client/CanvasMinecraftApplet.java | 21 + .../java/net/minecraft/client/ChatLine.java | 5 + .../java/net/minecraft/client/EnumOS.java | 9 + .../minecraft/client/EnumOSMappingHelper.java | 27 + .../net/minecraft/client/GameSettings.java | 179 ++ .../net/minecraft/client/GuiMainMenu.java | 79 + .../java/net/minecraft/client/KeyBinding.java | 11 + .../client/LoadingScreenRenderer.java | 136 + .../java/net/minecraft/client/Minecraft.java | 879 ++++++ .../net/minecraft/client/MinecraftApplet.java | 83 + .../net/minecraft/client/MinecraftError.java | 4 + .../net/minecraft/client/MouseHelper.java | 30 + .../minecraft/client/OpenGlCapsChecker.java | 4 + .../net/minecraft/client/PlayerLoader.java | 20 + .../net/minecraft/client/RenderHelper.java | 44 + .../java/net/minecraft/client/Session.java | 63 + .../minecraft/client/ThreadSleepForever.java | 18 + .../java/net/minecraft/client/Timer.java | 55 + .../client/controller/PlayerController.java | 58 + .../controller/PlayerControllerCreative.java | 42 + .../client/controller/PlayerControllerSP.java | 113 + .../client/effect/EffectRenderer.java | 163 ++ .../client/effect/EntityBubbleFX.java | 39 + .../client/effect/EntityDiggingFX.java | 36 + .../client/effect/EntityExplodeFX.java | 41 + .../net/minecraft/client/effect/EntityFX.java | 109 + .../client/effect/EntityFlameFX.java | 65 + .../minecraft/client/effect/EntityLavaFX.java | 57 + .../client/effect/EntityPickupFX.java | 53 + .../minecraft/client/effect/EntityRainFX.java | 54 + .../client/effect/EntitySmokeFX.java | 66 + .../client/effect/EntitySplashFX.java | 11 + .../client/gui/FilenameFilterLevel.java | 13 + .../minecraft/client/gui/FontRenderer.java | 179 ++ .../java/net/minecraft/client/gui/Gui.java | 73 + .../net/minecraft/client/gui/GuiButton.java | 61 + .../net/minecraft/client/gui/GuiControls.java | 52 + .../minecraft/client/gui/GuiErrorScreen.java | 24 + .../net/minecraft/client/gui/GuiGameOver.java | 51 + .../net/minecraft/client/gui/GuiIngame.java | 190 ++ .../minecraft/client/gui/GuiIngameMenu.java | 49 + .../minecraft/client/gui/GuiLevelDialog.java | 41 + .../minecraft/client/gui/GuiLoadLevel.java | 145 + .../minecraft/client/gui/GuiNameLevel.java | 75 + .../net/minecraft/client/gui/GuiNewLevel.java | 60 + .../net/minecraft/client/gui/GuiOptions.java | 47 + .../minecraft/client/gui/GuiSaveLevel.java | 47 + .../net/minecraft/client/gui/GuiScreen.java | 107 + .../minecraft/client/gui/GuiSmallButton.java | 7 + .../client/gui/ScaledResolution.java | 25 + .../client/gui/container/GuiChest.java | 54 + .../client/gui/container/GuiContainer.java | 269 ++ .../client/gui/container/GuiCrafting.java | 80 + .../client/gui/container/GuiFurnace.java | 52 + .../client/gui/container/GuiInventory.java | 121 + .../gui/container/InventoryCraftResult.java | 38 + .../gui/container/InventoryCrafting.java | 59 + .../minecraft/client/gui/container/Slot.java | 43 + .../client/gui/container/SlotArmor.java | 22 + .../client/gui/container/SlotCrafting.java | 26 + .../net/minecraft/client/model/ModelBase.java | 9 + .../minecraft/client/model/ModelBiped.java | 75 + .../minecraft/client/model/ModelCreeper.java | 55 + .../net/minecraft/client/model/ModelPig.java | 7 + .../client/model/ModelQuadruped.java | 52 + .../minecraft/client/model/ModelRenderer.java | 150 + .../minecraft/client/model/ModelSheep.java | 13 + .../minecraft/client/model/ModelSheepFur.java | 25 + .../minecraft/client/model/ModelSkeleton.java | 20 + .../minecraft/client/model/ModelSpider.java | 112 + .../minecraft/client/model/ModelZombie.java | 23 + .../client/model/PositionTextureVertex.java | 29 + .../minecraft/client/model/TexturedQuad.java | 17 + .../client/player/EntityPlayerSP.java | 118 + .../client/player/MovementInput.java | 16 + .../player/MovementInputFromOptions.java | 69 + .../client/render/EntityRenderer.java | 542 ++++ .../minecraft/client/render/EntitySorter.java | 19 + .../client/render/ImageBufferDownload.java | 72 + .../minecraft/client/render/ItemRenderer.java | 304 +++ .../minecraft/client/render/RenderBlocks.java | 808 ++++++ .../minecraft/client/render/RenderEngine.java | 247 ++ .../minecraft/client/render/RenderGlobal.java | 762 ++++++ .../minecraft/client/render/RenderSorter.java | 21 + .../minecraft/client/render/Tessellator.java | 223 ++ .../client/render/ThreadDownloadImage.java | 45 + .../render/ThreadDownloadImageData.java | 14 + .../client/render/WorldRenderer.java | 147 + .../client/render/camera/ClippingHelper.java | 8 + .../camera/ClippingHelperImplementation.java | 82 + .../client/render/camera/Frustrum.java | 26 + .../client/render/camera/ICamera.java | 7 + .../client/render/camera/IsomCamera.java | 9 + .../client/render/entity/Render.java | 180 ++ .../client/render/entity/RenderArrow.java | 57 + .../client/render/entity/RenderCreeper.java | 51 + .../client/render/entity/RenderEntity.java | 13 + .../render/entity/RenderGiantZombie.java | 17 + .../client/render/entity/RenderItem.java | 200 ++ .../client/render/entity/RenderLiving.java | 134 + .../client/render/entity/RenderManager.java | 113 + .../client/render/entity/RenderPainting.java | 105 + .../client/render/entity/RenderPlayer.java | 65 + .../client/render/entity/RenderSheep.java | 20 + .../client/render/entity/RenderSpider.java | 36 + .../client/render/entity/RenderTNTPrimed.java | 58 + .../client/render/texture/TextureFX.java | 15 + .../render/texture/TextureFlamesFX.java | 79 + .../client/render/texture/TextureGearsFX.java | 66 + .../client/render/texture/TextureLavaFX.java | 85 + .../client/render/texture/TextureWaterFX.java | 88 + .../render/texture/TextureWaterFlowFX.java | 88 + .../java/net/minecraft/game/IInventory.java | 17 + .../minecraft/game/InventoryLargeChest.java | 43 + .../net/minecraft/game/entity/Entity.java | 545 ++++ .../minecraft/game/entity/EntityCreature.java | 138 + .../minecraft/game/entity/EntityLiving.java | 457 ++++ .../minecraft/game/entity/EntityPainting.java | 233 ++ .../net/minecraft/game/entity/EnumArt.java | 37 + .../game/entity/animal/EntityAnimal.java | 28 + .../game/entity/animal/EntityPig.java | 41 + .../game/entity/animal/EntitySheep.java | 60 + .../game/entity/misc/EntityItem.java | 181 ++ .../game/entity/misc/EntityTNTPrimed.java | 70 + .../game/entity/monster/EntityCreeper.java | 69 + .../entity/monster/EntityGiantZombie.java | 23 + .../game/entity/monster/EntityMob.java | 78 + .../game/entity/monster/EntitySkeleton.java | 62 + .../game/entity/monster/EntitySpider.java | 66 + .../game/entity/monster/EntityZombie.java | 32 + .../game/entity/player/EntityPlayer.java | 222 ++ .../game/entity/player/InventoryPlayer.java | 218 ++ .../game/entity/projectile/EntityArrow.java | 225 ++ .../java/net/minecraft/game/item/Item.java | 464 ++++ .../net/minecraft/game/item/ItemArmor.java | 18 + .../java/net/minecraft/game/item/ItemAxe.java | 11 + .../net/minecraft/game/item/ItemBlock.java | 61 + .../java/net/minecraft/game/item/ItemBow.java | 20 + .../game/item/ItemFlintAndSteel.java | 50 + .../net/minecraft/game/item/ItemFood.java | 20 + .../java/net/minecraft/game/item/ItemHoe.java | 42 + .../net/minecraft/game/item/ItemPainting.java | 42 + .../net/minecraft/game/item/ItemPickaxe.java | 18 + .../net/minecraft/game/item/ItemSeeds.java | 30 + .../net/minecraft/game/item/ItemSoup.java | 15 + .../net/minecraft/game/item/ItemSpade.java | 11 + .../net/minecraft/game/item/ItemStack.java | 84 + .../net/minecraft/game/item/ItemSword.java | 30 + .../net/minecraft/game/item/ItemTool.java | 40 + .../game/item/recipe/CraftingManager.java | 107 + .../game/item/recipe/CraftingRecipe.java | 64 + .../game/item/recipe/RecipeSorter.java | 15 + .../game/item/recipe/RecipesArmor.java | 22 + .../game/item/recipe/RecipesCrafting.java | 4 + .../game/item/recipe/RecipesFood.java | 4 + .../game/item/recipe/RecipesIngots.java | 19 + .../game/item/recipe/RecipesTools.java | 22 + .../game/item/recipe/RecipesWeapons.java | 24 + .../net/minecraft/game/level/EntityMap.java | 126 + .../minecraft/game/level/EntityMapSlot.java | 75 + .../minecraft/game/level/IWorldAccess.java | 19 + .../net/minecraft/game/level/LevelLoader.java | 221 ++ .../java/net/minecraft/game/level/Light.java | 406 +++ .../game/level/MetadataChunkBlock.java | 19 + .../net/minecraft/game/level/MobSpawner.java | 206 ++ .../game/level/NextTickListEntry.java | 16 + .../java/net/minecraft/game/level/World.java | 1585 +++++++++++ .../net/minecraft/game/level/block/Block.java | 721 +++++ .../game/level/block/BlockBookshelf.java | 18 + .../game/level/block/BlockBreakable.java | 22 + .../game/level/block/BlockChest.java | 204 ++ .../game/level/block/BlockContainer.java | 23 + .../game/level/block/BlockCrops.java | 111 + .../minecraft/game/level/block/BlockDirt.java | 9 + .../game/level/block/BlockFarmland.java | 123 + .../minecraft/game/level/block/BlockFire.java | 272 ++ .../game/level/block/BlockFlower.java | 60 + .../game/level/block/BlockFlowing.java | 241 ++ .../game/level/block/BlockFluid.java | 215 ++ .../game/level/block/BlockFurnace.java | 104 + .../game/level/block/BlockGears.java | 35 + .../game/level/block/BlockGlass.java | 14 + .../game/level/block/BlockGrass.java | 39 + .../game/level/block/BlockGravel.java | 14 + .../game/level/block/BlockLeaves.java | 37 + .../game/level/block/BlockLeavesBase.java | 21 + .../minecraft/game/level/block/BlockLog.java | 23 + .../game/level/block/BlockMushroom.java | 25 + .../minecraft/game/level/block/BlockOre.java | 19 + .../game/level/block/BlockOreBlock.java | 14 + .../minecraft/game/level/block/BlockSand.java | 60 + .../game/level/block/BlockSapling.java | 28 + .../game/level/block/BlockSource.java | 55 + .../game/level/block/BlockSponge.java | 35 + .../game/level/block/BlockStationary.java | 58 + .../minecraft/game/level/block/BlockStep.java | 57 + .../game/level/block/BlockStone.java | 14 + .../minecraft/game/level/block/BlockTNT.java | 31 + .../game/level/block/BlockTorch.java | 166 ++ .../game/level/block/BlockWorkbench.java | 21 + .../minecraft/game/level/block/StepSound.java | 21 + .../game/level/block/StepSoundGlass.java | 11 + .../game/level/block/StepSoundSand.java | 11 + .../level/block/tileentity/TileEntity.java | 20 + .../block/tileentity/TileEntityChest.java | 84 + .../block/tileentity/TileEntityFurnace.java | 192 ++ .../game/level/generator/LevelGenerator.java | 825 ++++++ .../level/generator/noise/NoiseGenerator.java | 5 + .../noise/NoiseGeneratorDistort.java | 15 + .../noise/NoiseGeneratorOctaves.java | 30 + .../generator/noise/NoiseGeneratorPerlin.java | 66 + .../game/level/material/Material.java | 40 + .../game/level/material/MaterialLiquid.java | 11 + .../game/level/material/MaterialLogic.java | 15 + .../level/material/MaterialTransparent.java | 15 + .../net/minecraft/game/level/path/Path.java | 118 + .../minecraft/game/level/path/PathEntity.java | 28 + .../minecraft/game/level/path/PathPoint.java | 46 + .../minecraft/game/level/path/Pathfinder.java | 222 ++ .../minecraft/game/physics/AxisAlignedBB.java | 266 ++ .../game/physics/MovingObjectPosition.java | 28 + .../net/minecraft/game/physics/Vec3D.java | 82 + src/teavm/java/org/lwjgl/BufferUtils.java | 19 + src/teavm/java/org/lwjgl/GLAllocation.java | 60 + src/teavm/java/org/lwjgl/opengl/GL11.java | 5 + .../java/org/lwjgl/opengl/GLObjectMap.java | 55 + .../org/lwjgl/opengl/RealOpenGLEnums.java | 2417 +++++++++++++++++ src/teavm/java/org/lwjgl/opengl/WebGL.java | 1984 ++++++++++++++ .../java/org/lwjgl/opengl/WebGLManager.java | 1226 +++++++++ src/teavm/java/util/IProgressUpdate.java | 9 + 598 files changed, 36103 insertions(+) create mode 100644 .classpath create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.buildship.core.prefs create mode 100644 bin/main/net/PeytonPlayz585/MinecraftMain$AbortedLaunchException.class create mode 100644 bin/main/net/PeytonPlayz585/MinecraftMain.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/FixedFunctionShader.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Matrix.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Matrix2f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Matrix3f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Matrix4f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Quaternion.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector2f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector3f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector4f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Vector.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Vector2f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Vector3f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/Vector4f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/WritableVector2f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/WritableVector3f.class create mode 100644 bin/main/net/PeytonPlayz585/glemu/vector/WritableVector4f.class create mode 100644 bin/main/net/PeytonPlayz585/math/MathHelper.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/AWTColor.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/AssetRepository.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/Base64.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/BaseNCodec$CodecPolicy.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/BaseNCodec$Context.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/BaseNCodec.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/GeneralDigest.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/MinecraftImage.class create mode 100644 bin/main/net/PeytonPlayz585/minecraft/SHA1Digest.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTBase.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagByte.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagByteArray.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagCompound.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagDouble.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagEnd.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagFloat.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagInt.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagList.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagLong.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagShort.class create mode 100644 bin/main/net/PeytonPlayz585/nbt/NBTTagString.class create mode 100644 bin/main/net/PeytonPlayz585/storage/LocalStorageManager.class create mode 100644 bin/main/net/PeytonPlayz585/teavm/WebGL2RenderingContext.class create mode 100644 bin/main/net/PeytonPlayz585/teavm/WebGLQuery.class create mode 100644 bin/main/net/PeytonPlayz585/teavm/WebGLVertexArray.class create mode 100644 bin/main/net/minecraft/client/CanvasMinecraftApplet.class create mode 100644 bin/main/net/minecraft/client/ChatLine.class create mode 100644 bin/main/net/minecraft/client/EnumOS.class create mode 100644 bin/main/net/minecraft/client/EnumOSMappingHelper.class create mode 100644 bin/main/net/minecraft/client/GameSettings.class create mode 100644 bin/main/net/minecraft/client/GuiMainMenu.class create mode 100644 bin/main/net/minecraft/client/KeyBinding.class create mode 100644 bin/main/net/minecraft/client/LoadingScreenRenderer.class create mode 100644 bin/main/net/minecraft/client/Minecraft.class create mode 100644 bin/main/net/minecraft/client/MinecraftApplet.class create mode 100644 bin/main/net/minecraft/client/MinecraftError.class create mode 100644 bin/main/net/minecraft/client/MouseHelper.class create mode 100644 bin/main/net/minecraft/client/OpenGlCapsChecker.class create mode 100644 bin/main/net/minecraft/client/PlayerLoader.class create mode 100644 bin/main/net/minecraft/client/RenderHelper.class create mode 100644 bin/main/net/minecraft/client/Session.class create mode 100644 bin/main/net/minecraft/client/ThreadSleepForever.class create mode 100644 bin/main/net/minecraft/client/Timer.class create mode 100644 bin/main/net/minecraft/client/controller/PlayerController.class create mode 100644 bin/main/net/minecraft/client/controller/PlayerControllerCreative.class create mode 100644 bin/main/net/minecraft/client/controller/PlayerControllerSP.class create mode 100644 bin/main/net/minecraft/client/effect/EffectRenderer.class create mode 100644 bin/main/net/minecraft/client/effect/EntityBubbleFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityDiggingFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityExplodeFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityFlameFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityLavaFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityPickupFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntityRainFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntitySmokeFX.class create mode 100644 bin/main/net/minecraft/client/effect/EntitySplashFX.class create mode 100644 bin/main/net/minecraft/client/gui/FilenameFilterLevel.class create mode 100644 bin/main/net/minecraft/client/gui/FontRenderer.class create mode 100644 bin/main/net/minecraft/client/gui/Gui.class create mode 100644 bin/main/net/minecraft/client/gui/GuiButton.class create mode 100644 bin/main/net/minecraft/client/gui/GuiControls.class create mode 100644 bin/main/net/minecraft/client/gui/GuiErrorScreen.class create mode 100644 bin/main/net/minecraft/client/gui/GuiGameOver.class create mode 100644 bin/main/net/minecraft/client/gui/GuiIngame.class create mode 100644 bin/main/net/minecraft/client/gui/GuiIngameMenu.class create mode 100644 bin/main/net/minecraft/client/gui/GuiLevelDialog.class create mode 100644 bin/main/net/minecraft/client/gui/GuiLoadLevel.class create mode 100644 bin/main/net/minecraft/client/gui/GuiNameLevel.class create mode 100644 bin/main/net/minecraft/client/gui/GuiNewLevel.class create mode 100644 bin/main/net/minecraft/client/gui/GuiOptions.class create mode 100644 bin/main/net/minecraft/client/gui/GuiSaveLevel.class create mode 100644 bin/main/net/minecraft/client/gui/GuiScreen.class create mode 100644 bin/main/net/minecraft/client/gui/GuiSmallButton.class create mode 100644 bin/main/net/minecraft/client/gui/ScaledResolution.class create mode 100644 bin/main/net/minecraft/client/gui/container/GuiChest.class create mode 100644 bin/main/net/minecraft/client/gui/container/GuiContainer.class create mode 100644 bin/main/net/minecraft/client/gui/container/GuiCrafting.class create mode 100644 bin/main/net/minecraft/client/gui/container/GuiFurnace.class create mode 100644 bin/main/net/minecraft/client/gui/container/GuiInventory.class create mode 100644 bin/main/net/minecraft/client/gui/container/InventoryCraftResult.class create mode 100644 bin/main/net/minecraft/client/gui/container/InventoryCrafting.class create mode 100644 bin/main/net/minecraft/client/gui/container/Slot.class create mode 100644 bin/main/net/minecraft/client/gui/container/SlotArmor.class create mode 100644 bin/main/net/minecraft/client/gui/container/SlotCrafting.class create mode 100644 bin/main/net/minecraft/client/model/ModelBase.class create mode 100644 bin/main/net/minecraft/client/model/ModelBiped.class create mode 100644 bin/main/net/minecraft/client/model/ModelCreeper.class create mode 100644 bin/main/net/minecraft/client/model/ModelPig.class create mode 100644 bin/main/net/minecraft/client/model/ModelQuadruped.class create mode 100644 bin/main/net/minecraft/client/model/ModelRenderer.class create mode 100644 bin/main/net/minecraft/client/model/ModelSheep.class create mode 100644 bin/main/net/minecraft/client/model/ModelSheepFur.class create mode 100644 bin/main/net/minecraft/client/model/ModelSkeleton.class create mode 100644 bin/main/net/minecraft/client/model/ModelSpider.class create mode 100644 bin/main/net/minecraft/client/model/ModelZombie.class create mode 100644 bin/main/net/minecraft/client/model/PositionTextureVertex.class create mode 100644 bin/main/net/minecraft/client/model/TexturedQuad.class create mode 100644 bin/main/net/minecraft/client/player/EntityPlayerSP.class create mode 100644 bin/main/net/minecraft/client/player/MovementInput.class create mode 100644 bin/main/net/minecraft/client/player/MovementInputFromOptions.class create mode 100644 bin/main/net/minecraft/client/render/EntityRenderer.class create mode 100644 bin/main/net/minecraft/client/render/EntitySorter.class create mode 100644 bin/main/net/minecraft/client/render/ImageBufferDownload.class create mode 100644 bin/main/net/minecraft/client/render/ItemRenderer.class create mode 100644 bin/main/net/minecraft/client/render/RenderBlocks.class create mode 100644 bin/main/net/minecraft/client/render/RenderEngine.class create mode 100644 bin/main/net/minecraft/client/render/RenderGlobal.class create mode 100644 bin/main/net/minecraft/client/render/RenderSorter.class create mode 100644 bin/main/net/minecraft/client/render/Tessellator.class create mode 100644 bin/main/net/minecraft/client/render/ThreadDownloadImage.class create mode 100644 bin/main/net/minecraft/client/render/ThreadDownloadImageData.class create mode 100644 bin/main/net/minecraft/client/render/WorldRenderer.class create mode 100644 bin/main/net/minecraft/client/render/camera/ClippingHelper.class create mode 100644 bin/main/net/minecraft/client/render/camera/ClippingHelperImplementation.class create mode 100644 bin/main/net/minecraft/client/render/camera/Frustrum.class create mode 100644 bin/main/net/minecraft/client/render/camera/ICamera.class create mode 100644 bin/main/net/minecraft/client/render/camera/IsomCamera.class create mode 100644 bin/main/net/minecraft/client/render/entity/Render.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderArrow.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderCreeper.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderEntity.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderGiantZombie.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderItem.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderLiving.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderManager.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderPainting.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderPlayer.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderSheep.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderSpider.class create mode 100644 bin/main/net/minecraft/client/render/entity/RenderTNTPrimed.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureFX.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureFlamesFX.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureGearsFX.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureLavaFX.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureWaterFX.class create mode 100644 bin/main/net/minecraft/client/render/texture/TextureWaterFlowFX.class create mode 100644 bin/main/net/minecraft/game/IInventory.class create mode 100644 bin/main/net/minecraft/game/InventoryLargeChest.class create mode 100644 bin/main/net/minecraft/game/entity/Entity.class create mode 100644 bin/main/net/minecraft/game/entity/EntityCreature.class create mode 100644 bin/main/net/minecraft/game/entity/EntityLiving.class create mode 100644 bin/main/net/minecraft/game/entity/EntityPainting.class create mode 100644 bin/main/net/minecraft/game/entity/EnumArt.class create mode 100644 bin/main/net/minecraft/game/entity/animal/EntityAnimal.class create mode 100644 bin/main/net/minecraft/game/entity/animal/EntityPig.class create mode 100644 bin/main/net/minecraft/game/entity/animal/EntitySheep.class create mode 100644 bin/main/net/minecraft/game/entity/misc/EntityItem.class create mode 100644 bin/main/net/minecraft/game/entity/misc/EntityTNTPrimed.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntityCreeper.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntityGiantZombie.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntityMob.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntitySkeleton.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntitySpider.class create mode 100644 bin/main/net/minecraft/game/entity/monster/EntityZombie.class create mode 100644 bin/main/net/minecraft/game/entity/player/EntityPlayer.class create mode 100644 bin/main/net/minecraft/game/entity/player/InventoryPlayer.class create mode 100644 bin/main/net/minecraft/game/entity/projectile/EntityArrow.class create mode 100644 bin/main/net/minecraft/game/item/Item.class create mode 100644 bin/main/net/minecraft/game/item/ItemArmor.class create mode 100644 bin/main/net/minecraft/game/item/ItemAxe.class create mode 100644 bin/main/net/minecraft/game/item/ItemBlock.class create mode 100644 bin/main/net/minecraft/game/item/ItemBow.class create mode 100644 bin/main/net/minecraft/game/item/ItemFlintAndSteel.class create mode 100644 bin/main/net/minecraft/game/item/ItemFood.class create mode 100644 bin/main/net/minecraft/game/item/ItemHoe.class create mode 100644 bin/main/net/minecraft/game/item/ItemPainting.class create mode 100644 bin/main/net/minecraft/game/item/ItemPickaxe.class create mode 100644 bin/main/net/minecraft/game/item/ItemSeeds.class create mode 100644 bin/main/net/minecraft/game/item/ItemSoup.class create mode 100644 bin/main/net/minecraft/game/item/ItemSpade.class create mode 100644 bin/main/net/minecraft/game/item/ItemStack.class create mode 100644 bin/main/net/minecraft/game/item/ItemSword.class create mode 100644 bin/main/net/minecraft/game/item/ItemTool.class create mode 100644 bin/main/net/minecraft/game/item/recipe/CraftingManager.class create mode 100644 bin/main/net/minecraft/game/item/recipe/CraftingRecipe.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipeSorter.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesArmor.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesCrafting.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesFood.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesIngots.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesTools.class create mode 100644 bin/main/net/minecraft/game/item/recipe/RecipesWeapons.class create mode 100644 bin/main/net/minecraft/game/level/EntityMap.class create mode 100644 bin/main/net/minecraft/game/level/EntityMapSlot.class create mode 100644 bin/main/net/minecraft/game/level/IWorldAccess.class create mode 100644 bin/main/net/minecraft/game/level/LevelLoader.class create mode 100644 bin/main/net/minecraft/game/level/Light.class create mode 100644 bin/main/net/minecraft/game/level/MetadataChunkBlock.class create mode 100644 bin/main/net/minecraft/game/level/MobSpawner.class create mode 100644 bin/main/net/minecraft/game/level/NextTickListEntry.class create mode 100644 bin/main/net/minecraft/game/level/World.class create mode 100644 bin/main/net/minecraft/game/level/block/Block.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockBookshelf.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockBreakable.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockChest.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockContainer.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockCrops.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockDirt.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFarmland.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFire.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFlower.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFlowing.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFluid.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockFurnace.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockGears.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockGlass.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockGrass.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockGravel.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockLeaves.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockLeavesBase.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockLog.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockMushroom.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockOre.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockOreBlock.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockSand.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockSapling.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockSource.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockSponge.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockStationary.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockStep.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockStone.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockTNT.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockTorch.class create mode 100644 bin/main/net/minecraft/game/level/block/BlockWorkbench.class create mode 100644 bin/main/net/minecraft/game/level/block/StepSound.class create mode 100644 bin/main/net/minecraft/game/level/block/StepSoundGlass.class create mode 100644 bin/main/net/minecraft/game/level/block/StepSoundSand.class create mode 100644 bin/main/net/minecraft/game/level/block/tileentity/TileEntity.class create mode 100644 bin/main/net/minecraft/game/level/block/tileentity/TileEntityChest.class create mode 100644 bin/main/net/minecraft/game/level/block/tileentity/TileEntityFurnace.class create mode 100644 bin/main/net/minecraft/game/level/generator/LevelGenerator.class create mode 100644 bin/main/net/minecraft/game/level/generator/noise/NoiseGenerator.class create mode 100644 bin/main/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.class create mode 100644 bin/main/net/minecraft/game/level/generator/noise/NoiseGeneratorOctaves.class create mode 100644 bin/main/net/minecraft/game/level/generator/noise/NoiseGeneratorPerlin.class create mode 100644 bin/main/net/minecraft/game/level/material/Material.class create mode 100644 bin/main/net/minecraft/game/level/material/MaterialLiquid.class create mode 100644 bin/main/net/minecraft/game/level/material/MaterialLogic.class create mode 100644 bin/main/net/minecraft/game/level/material/MaterialTransparent.class create mode 100644 bin/main/net/minecraft/game/level/path/Path.class create mode 100644 bin/main/net/minecraft/game/level/path/PathEntity.class create mode 100644 bin/main/net/minecraft/game/level/path/PathPoint.class create mode 100644 bin/main/net/minecraft/game/level/path/Pathfinder.class create mode 100644 bin/main/net/minecraft/game/physics/AxisAlignedBB.class create mode 100644 bin/main/net/minecraft/game/physics/MovingObjectPosition.class create mode 100644 bin/main/net/minecraft/game/physics/Vec3D.class create mode 100644 bin/main/org/lwjgl/BufferUtils.class create mode 100644 bin/main/org/lwjgl/GLAllocation.class create mode 100644 bin/main/org/lwjgl/opengl/GL11.class create mode 100644 bin/main/org/lwjgl/opengl/GLObjectMap.class create mode 100644 bin/main/org/lwjgl/opengl/RealOpenGLEnums.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$1.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$10.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$11.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$12.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$13.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$14$1.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$14.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$15.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$16.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$17.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$18.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$19.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$2.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$20.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$21.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$22.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$3.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$4.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$5.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$6.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$7.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$8.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$9.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$AudioBufferSourceNodeX.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$AudioBufferX.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$BufferArrayGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$BufferGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$FileEntry.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$FramebufferGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$ProgramGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$QueryGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$RateLimit.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$RenderbufferGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$ShaderGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$StupidFunctionResolveString.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$TextureGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL$UniformGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGL.class create mode 100644 bin/main/org/lwjgl/opengl/WebGLManager$DisplayList.class create mode 100644 bin/main/org/lwjgl/opengl/WebGLManager.class create mode 100644 bin/main/util/IProgressUpdate.class create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/teavm/java/net/PeytonPlayz585/MinecraftMain.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Quaternion.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector2f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector3f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector4f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java create mode 100644 src/teavm/java/net/PeytonPlayz585/math/MathHelper.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/AWTColor.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/AssetRepository.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/Base64.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/BaseNCodec.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/GeneralDigest.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/MinecraftImage.java create mode 100644 src/teavm/java/net/PeytonPlayz585/minecraft/SHA1Digest.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTBase.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByte.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByteArray.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagCompound.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagDouble.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagEnd.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagFloat.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagInt.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagList.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagLong.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagShort.java create mode 100644 src/teavm/java/net/PeytonPlayz585/nbt/NBTTagString.java create mode 100644 src/teavm/java/net/PeytonPlayz585/storage/LocalStorageManager.java create mode 100644 src/teavm/java/net/PeytonPlayz585/teavm/IDBObjectStorePatched.java create mode 100644 src/teavm/java/net/PeytonPlayz585/teavm/IndexedDBFilesystem.java create mode 100644 src/teavm/java/net/PeytonPlayz585/teavm/WebGL2RenderingContext.java create mode 100644 src/teavm/java/net/PeytonPlayz585/teavm/WebGLQuery.java create mode 100644 src/teavm/java/net/PeytonPlayz585/teavm/WebGLVertexArray.java create mode 100644 src/teavm/java/net/minecraft/client/CanvasMinecraftApplet.java create mode 100644 src/teavm/java/net/minecraft/client/ChatLine.java create mode 100644 src/teavm/java/net/minecraft/client/EnumOS.java create mode 100644 src/teavm/java/net/minecraft/client/EnumOSMappingHelper.java create mode 100644 src/teavm/java/net/minecraft/client/GameSettings.java create mode 100644 src/teavm/java/net/minecraft/client/GuiMainMenu.java create mode 100644 src/teavm/java/net/minecraft/client/KeyBinding.java create mode 100644 src/teavm/java/net/minecraft/client/LoadingScreenRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/Minecraft.java create mode 100644 src/teavm/java/net/minecraft/client/MinecraftApplet.java create mode 100644 src/teavm/java/net/minecraft/client/MinecraftError.java create mode 100644 src/teavm/java/net/minecraft/client/MouseHelper.java create mode 100644 src/teavm/java/net/minecraft/client/OpenGlCapsChecker.java create mode 100644 src/teavm/java/net/minecraft/client/PlayerLoader.java create mode 100644 src/teavm/java/net/minecraft/client/RenderHelper.java create mode 100644 src/teavm/java/net/minecraft/client/Session.java create mode 100644 src/teavm/java/net/minecraft/client/ThreadSleepForever.java create mode 100644 src/teavm/java/net/minecraft/client/Timer.java create mode 100644 src/teavm/java/net/minecraft/client/controller/PlayerController.java create mode 100644 src/teavm/java/net/minecraft/client/controller/PlayerControllerCreative.java create mode 100644 src/teavm/java/net/minecraft/client/controller/PlayerControllerSP.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EffectRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityBubbleFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityDiggingFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityExplodeFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityFlameFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityLavaFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityPickupFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntityRainFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntitySmokeFX.java create mode 100644 src/teavm/java/net/minecraft/client/effect/EntitySplashFX.java create mode 100644 src/teavm/java/net/minecraft/client/gui/FilenameFilterLevel.java create mode 100644 src/teavm/java/net/minecraft/client/gui/FontRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/gui/Gui.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiButton.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiControls.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiErrorScreen.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiGameOver.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiIngame.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiIngameMenu.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiLevelDialog.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiLoadLevel.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiNameLevel.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiNewLevel.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiOptions.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiSaveLevel.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiScreen.java create mode 100644 src/teavm/java/net/minecraft/client/gui/GuiSmallButton.java create mode 100644 src/teavm/java/net/minecraft/client/gui/ScaledResolution.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/GuiChest.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/GuiContainer.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/GuiCrafting.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/GuiFurnace.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/GuiInventory.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/InventoryCraftResult.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/InventoryCrafting.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/Slot.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/SlotArmor.java create mode 100644 src/teavm/java/net/minecraft/client/gui/container/SlotCrafting.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelBase.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelBiped.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelCreeper.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelPig.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelQuadruped.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelSheep.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelSheepFur.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelSkeleton.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelSpider.java create mode 100644 src/teavm/java/net/minecraft/client/model/ModelZombie.java create mode 100644 src/teavm/java/net/minecraft/client/model/PositionTextureVertex.java create mode 100644 src/teavm/java/net/minecraft/client/model/TexturedQuad.java create mode 100644 src/teavm/java/net/minecraft/client/player/EntityPlayerSP.java create mode 100644 src/teavm/java/net/minecraft/client/player/MovementInput.java create mode 100644 src/teavm/java/net/minecraft/client/player/MovementInputFromOptions.java create mode 100644 src/teavm/java/net/minecraft/client/render/EntityRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/render/EntitySorter.java create mode 100644 src/teavm/java/net/minecraft/client/render/ImageBufferDownload.java create mode 100644 src/teavm/java/net/minecraft/client/render/ItemRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/render/RenderBlocks.java create mode 100644 src/teavm/java/net/minecraft/client/render/RenderEngine.java create mode 100644 src/teavm/java/net/minecraft/client/render/RenderGlobal.java create mode 100644 src/teavm/java/net/minecraft/client/render/RenderSorter.java create mode 100644 src/teavm/java/net/minecraft/client/render/Tessellator.java create mode 100644 src/teavm/java/net/minecraft/client/render/ThreadDownloadImage.java create mode 100644 src/teavm/java/net/minecraft/client/render/ThreadDownloadImageData.java create mode 100644 src/teavm/java/net/minecraft/client/render/WorldRenderer.java create mode 100644 src/teavm/java/net/minecraft/client/render/camera/ClippingHelper.java create mode 100644 src/teavm/java/net/minecraft/client/render/camera/ClippingHelperImplementation.java create mode 100644 src/teavm/java/net/minecraft/client/render/camera/Frustrum.java create mode 100644 src/teavm/java/net/minecraft/client/render/camera/ICamera.java create mode 100644 src/teavm/java/net/minecraft/client/render/camera/IsomCamera.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/Render.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderArrow.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderCreeper.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderEntity.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderGiantZombie.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderItem.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderLiving.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderManager.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderPainting.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderPlayer.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderSheep.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderSpider.java create mode 100644 src/teavm/java/net/minecraft/client/render/entity/RenderTNTPrimed.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureFX.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureFlamesFX.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureGearsFX.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureLavaFX.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureWaterFX.java create mode 100644 src/teavm/java/net/minecraft/client/render/texture/TextureWaterFlowFX.java create mode 100644 src/teavm/java/net/minecraft/game/IInventory.java create mode 100644 src/teavm/java/net/minecraft/game/InventoryLargeChest.java create mode 100644 src/teavm/java/net/minecraft/game/entity/Entity.java create mode 100644 src/teavm/java/net/minecraft/game/entity/EntityCreature.java create mode 100644 src/teavm/java/net/minecraft/game/entity/EntityLiving.java create mode 100644 src/teavm/java/net/minecraft/game/entity/EntityPainting.java create mode 100644 src/teavm/java/net/minecraft/game/entity/EnumArt.java create mode 100644 src/teavm/java/net/minecraft/game/entity/animal/EntityAnimal.java create mode 100644 src/teavm/java/net/minecraft/game/entity/animal/EntityPig.java create mode 100644 src/teavm/java/net/minecraft/game/entity/animal/EntitySheep.java create mode 100644 src/teavm/java/net/minecraft/game/entity/misc/EntityItem.java create mode 100644 src/teavm/java/net/minecraft/game/entity/misc/EntityTNTPrimed.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntityCreeper.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntityGiantZombie.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntityMob.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntitySkeleton.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntitySpider.java create mode 100644 src/teavm/java/net/minecraft/game/entity/monster/EntityZombie.java create mode 100644 src/teavm/java/net/minecraft/game/entity/player/EntityPlayer.java create mode 100644 src/teavm/java/net/minecraft/game/entity/player/InventoryPlayer.java create mode 100644 src/teavm/java/net/minecraft/game/entity/projectile/EntityArrow.java create mode 100644 src/teavm/java/net/minecraft/game/item/Item.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemArmor.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemAxe.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemBlock.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemBow.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemFlintAndSteel.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemFood.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemHoe.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemPainting.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemPickaxe.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemSeeds.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemSoup.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemSpade.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemStack.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemSword.java create mode 100644 src/teavm/java/net/minecraft/game/item/ItemTool.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/CraftingManager.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/CraftingRecipe.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipeSorter.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesArmor.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesCrafting.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesFood.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesIngots.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesTools.java create mode 100644 src/teavm/java/net/minecraft/game/item/recipe/RecipesWeapons.java create mode 100644 src/teavm/java/net/minecraft/game/level/EntityMap.java create mode 100644 src/teavm/java/net/minecraft/game/level/EntityMapSlot.java create mode 100644 src/teavm/java/net/minecraft/game/level/IWorldAccess.java create mode 100644 src/teavm/java/net/minecraft/game/level/LevelLoader.java create mode 100644 src/teavm/java/net/minecraft/game/level/Light.java create mode 100644 src/teavm/java/net/minecraft/game/level/MetadataChunkBlock.java create mode 100644 src/teavm/java/net/minecraft/game/level/MobSpawner.java create mode 100644 src/teavm/java/net/minecraft/game/level/NextTickListEntry.java create mode 100644 src/teavm/java/net/minecraft/game/level/World.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/Block.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockBookshelf.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockBreakable.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockChest.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockContainer.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockCrops.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockDirt.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFarmland.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFire.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFlower.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFlowing.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFluid.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockFurnace.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockGears.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockGlass.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockGrass.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockGravel.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockLeaves.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockLeavesBase.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockLog.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockMushroom.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockOre.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockOreBlock.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockSand.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockSapling.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockSource.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockSponge.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockStationary.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockStep.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockStone.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockTNT.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockTorch.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/BlockWorkbench.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/StepSound.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/StepSoundGlass.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/StepSoundSand.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntity.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityChest.java create mode 100644 src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityFurnace.java create mode 100644 src/teavm/java/net/minecraft/game/level/generator/LevelGenerator.java create mode 100644 src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGenerator.java create mode 100644 src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.java create mode 100644 src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorOctaves.java create mode 100644 src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorPerlin.java create mode 100644 src/teavm/java/net/minecraft/game/level/material/Material.java create mode 100644 src/teavm/java/net/minecraft/game/level/material/MaterialLiquid.java create mode 100644 src/teavm/java/net/minecraft/game/level/material/MaterialLogic.java create mode 100644 src/teavm/java/net/minecraft/game/level/material/MaterialTransparent.java create mode 100644 src/teavm/java/net/minecraft/game/level/path/Path.java create mode 100644 src/teavm/java/net/minecraft/game/level/path/PathEntity.java create mode 100644 src/teavm/java/net/minecraft/game/level/path/PathPoint.java create mode 100644 src/teavm/java/net/minecraft/game/level/path/Pathfinder.java create mode 100644 src/teavm/java/net/minecraft/game/physics/AxisAlignedBB.java create mode 100644 src/teavm/java/net/minecraft/game/physics/MovingObjectPosition.java create mode 100644 src/teavm/java/net/minecraft/game/physics/Vec3D.java create mode 100644 src/teavm/java/org/lwjgl/BufferUtils.java create mode 100644 src/teavm/java/org/lwjgl/GLAllocation.java create mode 100644 src/teavm/java/org/lwjgl/opengl/GL11.java create mode 100644 src/teavm/java/org/lwjgl/opengl/GLObjectMap.java create mode 100644 src/teavm/java/org/lwjgl/opengl/RealOpenGLEnums.java create mode 100644 src/teavm/java/org/lwjgl/opengl/WebGL.java create mode 100644 src/teavm/java/org/lwjgl/opengl/WebGLManager.java create mode 100644 src/teavm/java/util/IProgressUpdate.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..696cc96 --- /dev/null +++ b/.classpath @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..00a51af --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b6985c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/.project b/.project new file mode 100644 index 0000000..44b7cf0 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + Alpha v1.2.6 + Project Alpha v1.2.6 created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..e479558 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=false +show.console.view=false +show.executions.view=false diff --git a/bin/main/net/PeytonPlayz585/MinecraftMain$AbortedLaunchException.class b/bin/main/net/PeytonPlayz585/MinecraftMain$AbortedLaunchException.class new file mode 100644 index 0000000000000000000000000000000000000000..32484a1526163cb498929b5607a61326c45aca5e GIT binary patch literal 471 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Matrix.class b/bin/main/net/PeytonPlayz585/glemu/vector/Matrix.class new file mode 100644 index 0000000000000000000000000000000000000000..154c13f84e587643d5edac8faf6dc9ccf758911b GIT binary patch literal 653 zcmb7B%Sr=55Uh!ttS0dl-*3D~%)vdVAVftJ0z!O%;=$V_Y2(OdMrJ3$o&bZIfy$_Pa1#)K1*6w+XJ{ljThp;Khz} zHpba5qhQQd-jILgAcG>`dB*tB!yd*tDh`V_F6lXA-iFQ&MZ R^2;f%V3pMc*7(j~{TmHno1Fjv literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Matrix2f.class b/bin/main/net/PeytonPlayz585/glemu/vector/Matrix2f.class new file mode 100644 index 0000000000000000000000000000000000000000..573d7c50210bf23682fbd5b62453d390bb1299df GIT binary patch literal 5116 zcmcIoTXS1i75=tuNs)aVC&3q-mf$*$D<7Roj$@}zd`XBKCr<3f#ED(Er9rljY&o)I zq$6Xe+=c=L`oKe*Uf$pV2Fk#c8SG}7p)kBK!vhSL;WGRH7#J8{nPC{dwa<}sunbma zXfiry@2$Pp`qsB@TmI?4-gy_m2tFM`jY1@2JMn3I%gJV@(}}G+1A_zc<+Qz4h;P`7 zPBs^xN;tXHW?wRdI)(1)c83sDXkJZhB;u)Te8$eD66w^P#6sFuIF#4ZSv!|cWivM? zo={L%6dK2}nY@$8IJ1d#!443i{8I|GYrVbPGOkA_<$02GJ~<8!r!pyLl+#GhtU}#b zcFC?sEm{m5#*um`v>A9m+7%k|wllG0XPlI?rC>&SCabe#NTF#mm9d{JtS#8N8?FgQ zCbNr)^lXA=(IjuN&RI$2DY{C*eMyRbEK>dMo>{S{!@wixq^ap_Vo724K?GEU0RxRPiW)fRjvh16}_);%Ykk4);Q%rGp+NuhJ0kWAXSp=yB;Mn6u6Fi;HdU4jfejzO}wY*RUdQlfUD zkW^^hTQ3ocBX8sqnf!V-&-4i7nRE=|evBG8hw~J$UZAk{$av3xlW|a=@d>F-EHOCV zd{2D#o_JRR+D_8UKrXesBHZN*3w*8>(h6Zm=t*XCYyW4PW_5*QaP4bTY3KfdQra5A z)hfzsaeFt{nvj%RUQ$|n8hzT7`Wj5@b zBTLU1m`AsaK4RcGiQk4L+p%+NsSN8e3!rayi^u2}M`|*kQjZ;}#C&q)fRmkJx5z9r zJy>FOs-+W|<+!^#6av3#+r50DkV-Gvxq2kgB9B!Aw?V%L6YJ}ChJpNWDfWHByi?4` zBr%Qo`yOXC+y$PmV~+ZsLKmam!ZSV`F|D1O5ks%G=cJaRgt}Sp5?9eVJsxxcHyTT;hJcaiL^_b&CmO1-a9-|N)-#{bkC#s!Rde*GE)MzZFDRSvW%O9Cy* z&jKAS6O$8@6H_J@Cl)7`Ok$kGIEh)igYWAMzHc!2zKM2xi-G+nPT|`)kMC$~9j;b9 zq4SdZaZv}Kj3f+ePzu8^#;b&z^uy((440EKTuv(CzC*b83HJwt`!3=BkZ^xQxIcby zxR;7>RTHh0MBMbVTO@bYwu&%C*5dZ=+S*7~^8V+o=~d`CJTIC&co$ zIx)E|Ahxyz|I^4A%N6i58u@b?`3vU6FEM~$vCIA%x9}TwhTk$fe}{Ga9vk?BHu|!Q zz2u|Kl8-h$A9b*#NcFCztTA1`>nJfM7gFZ_EmA2pJm~l3WlVUXx6NZxAiU7K!WuU@ z<=H${w0XKrj$RX!xi(lQCQoUTrz=A5k2Ld71omf|`4>X_D@)7Y=*z!rv-(}FC9@>- zW{AlRy%~mH2kSZSA=<1)xr0z%DI66`YP)AbFE`7zaxhg1tXRGZdqx>8FGqSMpO-P+eRXeG(w>smiO^Lx>A4^QtluwxH; z!g3pP%_6uOmT_R7+&+7;tKse&xaPOe=*mdm#7?a0R53R=ko1V~9Tf9rArzIYh(skT z%xGIkSkSonK~oX^*vlJ zr}xZ=joqi8^`Y1+BX~*m=y{QB3q5`Qc+nkwLxO?)m>jqlC=T2k6bBVoD7DNCSz(5( zqD9@tF_k7GYv@&3AC|t7&-*-|`-%ns0^@;-YpQ?%uZEkuZQJxQ6Yv-g%Vpa;JWYF~ z(zKceEifC1ULKZAEABt)vy9{yP_I76Nd7#U)faryTRpUjx1+tFJ--{;SA2)d(0J#s zfJQ)mXq;9;dzsK)A+)=M_9~&tm8E!1FGJ%mF;Ds^(?tw#mdxfSCY{0L$68H(m+QX! Swfd@0ReQB75*_I>AMwVR? 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Matrix4f.class b/bin/main/net/PeytonPlayz585/glemu/vector/Matrix4f.class new file mode 100644 index 0000000000000000000000000000000000000000..74724f7b204eb085868acd006bd0c28bcf0630b0 GIT binary patch literal 15479 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Quaternion.class b/bin/main/net/PeytonPlayz585/glemu/vector/Quaternion.class new file mode 100644 index 0000000000000000000000000000000000000000..a3cfe6e3be389263017e498ce48edcb97f59c465 GIT binary patch literal 8234 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector.class b/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector.class new file mode 100644 index 0000000000000000000000000000000000000000..c364911e5861c5df6d1e38fb19b9b1da2dee6c70 GIT binary patch literal 271 zcmaivI|>3p42J*s*!2m5m(a$k1VIF`*h)}bupc$9$~c4Tte{7;@Bki4jE~03CLsy= z^5y=x-T(|x3y~vqEPFNOvv+oC^!d{5byZ?`pQ#fsy-U@M^-3=c&);Q;0->?fC#{UO ziJB~S(kBFlZQ?hCe5)N1>Yp+`WIE*)p?DM&6Natvd)IEAij32Kl&#mC_S@rs8lUrh qLM3)ty5wkUgxCDF>%8CrK{Vt=ATP2-1b9h@-&{gjCc=@JL-h%XgsK_Dx!EKxrvF)v-;KPd|+!_L6Q$e>4>S&R%U>8T|Vj10^g znr;wIBqIY?aDHh~a;jTqPAVgVD7x)>Ad7)k0W|?JE6^iMK+J#R;N;;#?qc G25tZ{y*-@( literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector3f.class b/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector3f.class new file mode 100644 index 0000000000000000000000000000000000000000..aba01b9fb00bbaab85aaf41c0997eb991cc2a833 GIT binary patch literal 222 zcmX^0Z`VEs1_oOOZgvJHMh1ht)Dr!G)XI|lynvj<$|_R}Q~mUu)Z9}2vee{~{389J z)Wnp;q@2_+FxNPZoq>gsK_Dx!EKxrvF)v-;KPd|+!_L4)vROuHj0`O4sU=a249psu yZj20E!TF^{$*FFcIjM{cqUaXuf$Rj@0#psetUy070$sw+zyV@0Z~{pt1}*>+F+76+ literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector4f.class b/bin/main/net/PeytonPlayz585/glemu/vector/ReadableVector4f.class new file mode 100644 index 0000000000000000000000000000000000000000..148b03555f56c83ac0a63db4df1da5677a3fc886 GIT binary patch literal 222 zcmX^0Z`VEs1_oOOZgvJHMh1ht)Dr!G)XI|lynvj<$|_R}Q~mUu)Z9}2vee{~{389J z)Wnp;q@2_+FxMoFoq>gsK_Dx!EKxrvF)v-;KPd|+!_L4)vRTGyj0`O4sU_iz49psu yZj20E!TF^{$*FFcIjM{cqUaXuf$Rj@0#psetUy070$sw+zyV@0Z~{pt1}*>+Xgq@e literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Vector.class b/bin/main/net/PeytonPlayz585/glemu/vector/Vector.class new file mode 100644 index 0000000000000000000000000000000000000000..e2129c7a702843bb12cc8c576146c21da4f3ea20 GIT binary patch literal 1066 zcmb7D+fEZv6kVscfnm5`RJ^nZ;{ey*D z3r^Eh+iho0)pZa$wOAO)2n=k=J?VJTZ#qxbx9B&J6BvoTZs1f^=t|E$kn5f@&?PW? z9QIQs8&PzULm+p@^<8~WAZ-_G0-1+FLzzgU*FrZ;f&Pl?tH!c6K>n!sN1jJ&UR9Ic@|(Ka(Qe>( zVTO}=sluR;w6Botk_j7EqfySX!JV$e+f>z|>o*spnWuR}K$Q7;Y(IhPuUF(wXR_HA zSCW*?YS0ers_aJmdy+BEMyxUuEHI4}vM{*iUC2b6LthWAIZ8p9Eq#IYnMw+MJWWdA z21Do2Pt8h#Fn~c?gHhW$0P~ED0L;=MM&5qKsdpb~B`CT0&+UH@%mjfChpU9>0iDN% zSmsfPktZk}(qC;jEp)FGxmeTTg^MABD&G9(?79%F?-jpuXL y_JV2GFp5`k`a%NLDIkk+IJm|{{m9`uwG@j5b@3acDbkwj(Bf9mFEGzDg@wP@dF!wM literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/Vector2f.class b/bin/main/net/PeytonPlayz585/glemu/vector/Vector2f.class new file mode 100644 index 0000000000000000000000000000000000000000..2389b9d61bc8a7a2a65ec6b62c65b8d7a280b4ee GIT binary patch literal 4593 zcmcInYit}>75?r%?cH%|Z(OH&IWFFW^{x{)ZtOJO;D$KfCdEnJxV7t~EzEky>vh+& z?(S?z!lR|7FWOWH5fBLRuT(-&l|t(jD)ADi5`RJPANURYhJyIco!RyHQS2a*Xm;-0 zx%WHYIp;g)j(_{_pZ*NMr|?D;0fm%pIRg{c6{liPl+7zwhwd91D3-0o`oJY?)~Qqn zru1!aE{c%Cfvv5MBBIc_U|uo@N|k|0t6DP4rK@JXY(>$caL;Ba=Pk1!t5ZD-0X*R3$4A^#L#UgnkKbwwd^ykwW0 z5rtr?Z%QFFS}9mD1hK=wc62J-FR#+~f z)TurxR+Cp=n3p*jGz(1a5C1RxZ^P5AFD2z#o%F*sHc~3_L~2|+ZL=xn$`#W&S)ZG; zs@bi|fnsKXjc#NFd28*Abu^j~0tnNl3U6l6~150>@syCOGESm~B=!IEp%d@iHuxEiWEutn6^l(ozX1=|Rg)O+G z5a{ob4VPsD4~adg(f^M81p^is>p+b<*tyR81~$E8$7X*Ek%62xd}5X(78{yK|4zS4 z59b$nCTIID#PC(T6vc}?=vLzAzBTYNUSaT=xY4p%BgFPq!Pk?_POy?+kdtfee!dD< zoO!FN5Sy&jtFu9wApeKil3RJ-g*Xh(wedU+U>iql=yJA7JLi1| zM?5|GdncdnSkC42$)|q~n$h;Q#lagy8|8^5S zqSxd#s++#fX8Hzo-X(occ#-Z(&k(3LFI+iFB{^Epb&*_ca;^BH;^*23dRH^(M=<2E z&e3a^wNSn!hJ-Q)>+M{olCKcs>W1u(VA#W4^djAp`4I6Bpk{92=y;}qF9VIAk(dXy zu)CO7ux3Mek)nQy5`G!oc*Pg{o@VTODE{5FbWHD762$wPrmqo5#66f^Ms|$$cZq#5 zowUVn(!Pa}@wc#D(`n36$m_^_gGk?`!`IP+Z}XGtJHFr!HpvWnWWtoe32Hl_Y4Pue zkI)migWGw$dr>(}Vp5V?ADMT()edNSz z7JGKV9!n-pf9rc_O`INk3-P3J{rdH~NP}?;xSusA4F>$+oX`x~*=QbF?e5-yG`jPc^xS>b%fxX1huGUlg1DWRJc!$Q zrs8J5weOt2)oN$b(gY0Wig z&8?!fGQAP4-;vhuN$U@!^~c+#rSKT0yl72$CDW;Oxs2&)T_!SE*P8xBhyKhm{L3nl zxMzTf$0Pt(_{D{Z}-2QgFxG1Y<&)rwszhPzdqCxL;(s?En|*z-3=xqlH~ zB99J^8f|`n&(bi%BHT57U3F@h)yHy&{5|G5macXeGHa-u1EyFg6BP6ZtLVu&3VFC>daY_S)-+%%?GcXK)0KfB`4#RiuuGZ^EutPGtd-m=< z=X~d!@1A?*5B~Gs`v4xpx58*rh?neI>bQNmRxTYcT9;>b?cSA|EZP_9sY~`mtz1cs z>c`Gp7(s>JmCX*LSz%4Vx@4vD<$y>$zjFlE}c zYkn<-SXH|owJX(pxpeZ-eg$<{Vf8?{RIOR1+Nf2m+aYE{{waQZmRFkBWnME1&3p2t ze63$05KoLM1P97lJAwf2k75nhD%?AiFWE=y7czF`N%5@EK2)BtilY`I=DRx>tWD*s z3dYcKaW~@aQ`i+>cJ{(7^(96lP}mej7d8`f)vhU={eSE%>)Ho2P_0ZT>{wQ15n84< zo=&G7(7gh>MISOy3@1%g%GIi9 z-_NR*>`9$4Bfe7ClcjjogrBtq5V0)=@WhxwrVo2)U>=c^IxJY(n%M5Mo zE)c9dr3to+kX2&K6!#~hIErJzU%UuJa1vu-ux;F<8)1=?Qo~klDvDDWXTq(CGMhp$ zzCW>_FfCrpbRb)l!D87Wv-ZY^v}%b>G|i#fzIrZaSNc|(pS}prArl5|JI#23p(rLK zR{^de-ZS-_!n&nBGR7+V8dpg&o?fwg(c%`u%$!3Zit~_KOxNjbgIHNIHicES@<^?c zFHI6P88(+ZXS6SjX@&I*hxgU<#jIV4pp1$zT&MO>VssVi_;nNCDW|t_uC<>nug@ONV`EyZR zK#6))vSGub=o_}l5w>@Bz913E*2Fg<6(4MK%{CjH5NWMHvSXP7_wv5P=?GrMSHt)U zH^{j(I$xuB4PRpoNQr@>Ri%mh=G8zCa@7UOnS$(g3-$RaRIW|g6@|!1xn7yD(|MuI z>P7{&iUu}wtpxZ##1`FxAUe>BD92WFA8x`ul-T=aPnOQFpX~d5KEM&~yu7dD+fF_e zpCRKG*8hk?6E^T3;S+58LF}esXv3UDWo2kn8CQei4kVM)ys`jh>q@7CJi0xQ`M3aqXzfneI7i)oB(-t*#?6 z-v}g2^AbpG&b+bZCd@e>?fUyE`WUB=)3_H;`2vc0eqx@Vm={n?wsJQhp@S6k96d^~ zT}JY!*s35=QQ9GrA<{09OydUUIJI^VWa-^zU32Kfq_0q29)d2fP`k0+^>$Eu2Re

3eema*xbUu5dDq11<|jn02YZMqzaPlF*QXLBSBgq_CKTw^^T`kz79~ zvESF;9ingah@NIioy9ss2eMcb$+@HqB^%B}(9T5A&XRLHazg$!L;ejz{(uerw`BeA zSgPM^r%szqc&j&|162(c38q6Hj&Hlg={II^c#vSa8l3Mb2?%{RdrD-`(A(Ic5zha@ zdicPtV><)>!22JWjX$9mej{==81zOnG8}?tJeOdLUk$e|VNG`aa9WImxd)h}{ z{|;K(M+Vr&{Cl=5M??-FOwI zyr|B&QEk+Gnniw0Grl31A}rje)F!kj_HMNq52$XRtH$!;YV`u+DbNk<8fzrXN#90! zJht~1E)FHzYqPkdUB+iIGnQ=sRO6kMpZ88Ae2<-(#S3Fh_-E(#&R+5p%4GOk(WX-9 zP}}%-gY7WX4*o3IiAU8VcwFuB;Y_;)h;TuC9$z57Hu)Lu;!N==9VbL$#}{myYL7PK zbd$zWtWAEbFQIHKR32DT`HT3HtK9DvqgkI+=FTVjB&dcEQp3I|nmrmdyXTTNytK3} z-+9Whb&|G5?_f)gYLbDMm$v0QH#xS>($+I~uq9_BvBf`L@GfT~e|F7<333iS^Ruh) zWp2@q@_S5>G=~F5@-2jd*V!dQf$OBo6;k5L_v9t{OQ>O~oXP9zHSQa1Pm~SHZIn&Q zCS_^|uG5s$Hw>Oypw2UrBEsqdT2%?FRhbKSntZy5O{$6kRl}gVq$71s3J1Ij9KhG{ g4T9W+IKIhV;+zy(5e$c-AHtAMqHvY&n(+F60exBXmXuhI-@;xgyEDpaQS8J-jsvzOh$Gvwl}MHdiD#u*X_fV? zybn8e0tv4e5*)(AhNLLIh43&`sKT<7Q~@6#hJ2==D1HFnd45SzoZB-yTCdh?bJ+`aI_E^OP9e3HmlKXXC!<%eTN{`) zRmhgAXDM_RHT0xYC}#8S6OSHJP=^)T59Zxs$#zSVcCPG1$cFq={P--NQ9kGST;Ov~ zp?P1{&6f5ngyM-wh48`roYRUBHW}D}9)MHAmMnHJq4ig+i}^k6`P3xFb~r}C%VKMFwl)IE{BZwJ`NhV%lr6I19zjV4N=^0 zU^n(~ndY6+Nxf#H(*2-;y_N21>3GP%aHV5LIvzH#ztSc!b54d;6e(oq7ubg9 zoFbd{iIP40%n^IZFYr*YoaXYl&b%hcj5mtLLZ7??Vj6Y3J2NavY~tFv`NC-mP?7sq z;kbblve3=m3Uia^SSNFNrZja2VKh!;5^c}sDH-ATp@ayR&4&z!=5o@R%iFA|kH^RKRF^V4%C6FZawg*x zh8rb`6lJgw#e7AsYaAKK3RfZSCce|T!Em@zI9iWfl(^GLylQfiox& zW~ofDP2#0)ZVKy4`H4~?>q^utvla5Z-r*?DDr~InK2Xl)=A6PhP~=-H`|P3KR+Mo; zD*ZWy4L+TEC46ThO=W!6z~}G+tHxeha$GXMHHfcjun#f34xi^@Y1dzriCH<5VN`c=hlcX$MLF4O=krq}Us`auZmkpfa$(jP%}Nop zR|rnZ49YrP@PC9#+rsx|w83CsJI~!FbkL&A%NZ;puUjg+ZmH{RxA6;4TfR5)r~BC| zwh{9>?)f>5COVY;)Wr9L2vh5~&=LR+!d6Zf*Bh{%Z*lNRj+C)&;=r_)v14k*O$XzY z`%#z&LMtB8u6n%TzAH||F2v|eoc8%n7YHSHi4N^_SFCSicp3e*eh<;_2=gA*es_B_ z0>2%a2MN1FGa*5C$SJ2|>X1{8^A-7w`>4kmnZ(;>?z)DA8M_9n7V;=Tjxm*S4cY4r z4(=G%;qdo~kD7o8G(tr!&Cm3{va# zQxn7rjn5KMXzZy$G&hE?A+>_rqesp1Jx5%JxEU_Sd=;%d0d`M--4kH<1hn>4(Yn*m z+hr6&zG+(TU`Ro@rS*VVmRKJXD=F4Ku~O#S9PQPi7ugb{Iz!I|R$YPgVc0UK>3mmOa-(I%Xz9LWAFZVHr8b6Xu1@YHCU=p^eTB(=6$!jtMY|OwX9cud z0qs^myXDi~f&)0{hxSwIgH-d(z)cLk2Q|$M6BZvy+@fJ=252P3NYO~8ujA0$1C0#i zb{vpp3Te6U3ik@j^gBr5b)3W-Ity=u%y5T_Y%mteh3Jo1pQ6=-M`?43Qk1g8Ylohx zgf2!>LKj1ap1CFT|242)=s#rWKVs-VVdz)yG<1c>Fy^y&UOMPqd>ER%-oT;CfE;T@{tyE+uF{Q86PdkjZ>w2MTOtu#tN_%q701-%0&W#au4i*jw14gRb|Tt5p@Orw4!Fp8F%I`V$85 zXNK~ZsuepN1bNsGGQvY*f@1F#8-G*(5CctHIGvYApT{RzgTkYh36_;76Eu98kV^Ap zf>s@w_-hqQ@u1q{ezmt?GC+ETNU|#jOzQ@wgdrZ8;2YAQqs3l zu&pV|jykNUQ zzKedo{krm&k)INSIeJF2Vx+{VJ&_d4M{Py7+J-G^J7TK03b(RRDFQ*xynXsPrBBC<2>-Jim-Dubhqggi`BC4pY1OB#ofmn zWGi?PfvGv(lvOpka=Gi0U+?QowrVF2)t!8i2bot<`+bI+_3dNjwxREqY8Vl6MsDLvF2TaU%k_O#-M&0uN9gP5ZG6e)QGD^w9em5} zx0>B#EkTpojkh!vb`@T!A4t`8%nRgc26E~)fymue0^y%o>I9Oi4P>EiAYa2JfAafW zDG{X!)A|7-;j7f_Na!lX=~eEBSKpK$tY1SNkrEoa^kz{WPM0U>I+3D1zQCJ@(v9?il7cqs81t!&;fGrXC3 zzU~hIYm9wZ0*jiAOz3KwI??KSi&l{=G@UN8queyD+_j}qnWnU-%cBoRU{a}0Nv-Na zZnBCU0q0C+&k)A5^vezcHj4so824hZZ7yw2aj8jQ`X4<1WO@Sp#rpu8dt7+<^!Yy= MV91U@z}Ld)4O5XXQUCw| literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/glemu/vector/WritableVector3f.class b/bin/main/net/PeytonPlayz585/glemu/vector/WritableVector3f.class new file mode 100644 index 0000000000000000000000000000000000000000..100ce2797ae5c570649615e1d9b2a56b9f33a5e0 GIT binary patch literal 246 zcmX^0Z`VEs1_oOOUUmj1Mh1ht)Dr!G)XI|lynvj<$|_R}Q~mUu)Z9}2vee{~{38AE zqRf)Sq@2_+FxNPZoq>gsK_Dx!EKxrvF)v-;KPd|+!_L4)vROuHj0`NrsU=ZBO2bVv zjFEvE$YW$+({OVGbGd@^ON)|I-7<4h85u;;9ij(v1JG8WHXvpN`iTkXGIjgsK_Dx!EKxrvF)v-;KPd|+!_L4)vRTGyj0`NrsU_h+O2bVv zjFEvE$YW$+*Kh*@5T7eJzqBYh)h#n8m61Ud-6eV;M*yt_>H}g{pr@FCPGe`_U;sIh QlYt8;!pOi45@+B60F~cBng9R* literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/math/MathHelper.class b/bin/main/net/PeytonPlayz585/math/MathHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..fc74d0a31b59523efd984e500c6e96097afbb606 GIT binary patch literal 1602 zcmah}O>Y}j6g_Wd?D6+kLQ-ruv_mm=Xyc^d5E_>z!3|hSOOc}r!6F(v1F<`?i!(_n z3xos;i;AinKBQJiU1fu)pbM%Bv4_9F3W-0_sv?{>Gjgl|VlmI}&AsQGd+vSX-~M{| z3xKnz>QDrXuH}?3S=XIj_mXX1|EMxoDQ}w2M)?AlH!SpY`{g&A z9joOCgd6pXYpaV(E9V82cb5f1)t24vww+f6)MDwffc9E%-3mh>8bbg6qy-WO!tKB6>u~w>Si?dNvtKNKE5lF7IyVk|+&8F2~HJi32 zkXh-qO#8CgZ_Bg)Qgj4FosTULZ#ZV_$_4YP9}8C9G9ys&Obka6qKvcA-V!*m^8fvq zmqjg?mbIGk=u_@@%>FcW*Z{TF+tSX_nm}ahgTAx&p4~GY>2orM7o;amzGgq%=z4G4 ztzTLsTGSXIqSyCuo(wHWg&BdE7aKj+x#ZBQF0q zPe)ufIWHjN*PHZpERzr4+M?jd08$aZ=*yvuQXs3CFRf-F1$C9RG(( zSKZ^?)fk#6Bv^5vi zfShzQ<-6gZb2t=UPzjpjXW?Da27|KAquD!1W*u!kXLH#@Fq^Xvn&x?$8Il;Kg#3(% S92yJVrIzF;bA|y0^M3<7=;+Y^ literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/minecraft/AWTColor.class b/bin/main/net/PeytonPlayz585/minecraft/AWTColor.class new file mode 100644 index 0000000000000000000000000000000000000000..3048b1d9592efe1779945f463d1a45831ce76ae0 GIT binary patch literal 1166 zcma)5O-vI}5dLPn+ufD|rGhIWq6MTNS`%Y~Q7ZzeVnB%y2!_OL>z20GE|$fh7dfhg z#DiYEXuOyh6XQjV2cwB64<_Ecn|LPiXd-?Kw5TVy`R0A|-n{vFGyU}I?K=P`(4#{U zbe3#4K4#x=ozhs*x^eSJ-;wy$e96v~t*jeAH8nBl6rHjTRS+&%*R6QbD$T~vrwew* z75IoKnNQAg8C7skbkP<>Mx2aQoV3b$Pv6{B z-CTZN&^7X3$s7|HXT}Fy=fdd$rVvY|Qr*Mq;4MHs$;yJ*h9(`2g1W7QM=duO!giPf zEn9S)GLwxBbq}fi?*ZQ$ud#;Q0uz*!AUJQi3uVjAJ0&XVa(*`Fmh5?^D7+}c#4M2} zazvJxBd!sAl-hCE%3K+><~FMfjyntGjGfAR_19LO^q`j<_Ihy{9Z<;lW|TU$I9K7S z^}L4ha{V|+=^Zm))KG>t47k=(3!o15+~H;AF&)uDW_(FsLiHuI_L>I|(bN$M7a|Sm z<>`broluicr8gQ~d4tHkY-C5F&u{X#q4wz=q4sQ{&){O}1+oBH$kekQ51RhvXN(A} zu1hA#wTl=gt`IB43*t*9V$uw5#!jfFQK8yXJTn8ETC!sMkHzh({ht<9cl43nvZ#7X zs8x5g7^;R(R&D>bh*r%1G}!W{MVec~;l-sUHEd97zQv{Itk1_;1MVV9>4yQGJuuM9 zUhLt?0ruc1yVKA9oaMaKJMaO`_=pyK#x8uNmv7jO z@AS0FA^C}@XlNG$of5%5X+@WGAtpWOk;B+8N%YDv4z16{+(z%QlfL-L4E?ouvqIKN zrtoink-poQza~?R&;}KTOfXIxdwD>1v7#1MbX3A%H%V@e6xIWDS>4qbLd~rJ?|Py>E>X{Ttg}QixG1=>82PrOdkk literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/minecraft/AssetRepository.class b/bin/main/net/PeytonPlayz585/minecraft/AssetRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..52bebc21ab3814d566fab225834075d002cffed6 GIT binary patch literal 2779 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/minecraft/BaseNCodec.class b/bin/main/net/PeytonPlayz585/minecraft/BaseNCodec.class new file mode 100644 index 0000000000000000000000000000000000000000..73b1f73a724fbaeaa35344ec71f89f3f8e371ca6 GIT binary patch literal 7219 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/minecraft/GeneralDigest.class b/bin/main/net/PeytonPlayz585/minecraft/GeneralDigest.class new file mode 100644 index 0000000000000000000000000000000000000000..0917c11a6c814c44c090dda310dd3cdf5898e63e GIT binary patch literal 1633 zcmb7EO-~zF6g|%~*w_rkIBn8kh{H#y8E6b4&@_CsGA#+I8zMnmr9>)Y^MFar7>&nO zoK>Y#^*6LqrB+?Au2g7MRs4YL`zyMsy2&PrbKdh5NYq8Unfucjn3S-;Myx zVJ?PCN5Mr zWC8}dEOfw%L!jG28=~rT#zGA30$l~7xn18WNq^NTRir?wP%S%^qT{>j9y-ln+pP(V z75+P)8G&5(|HO|J6X-#24C$A2SZUM(xnrRZ7f9LheWy{b?l!1xw(zQ2GfV&CS{f-T z#uqKbk)TpkD_Y;(Z~~Gwvw784;F5)5yd}`F>sQONR{NytZ!j*qmS;NEcRglu0-Y;? zQ-1idvl|K%QxObNHQu%`fI)#a*V8jHDw0{zO-`k@tpcuCn8Z~U37Zt8w-szF6t`Lx zrY*b!OTY>P@|9}&p&GOs{1e;e%bHXJcLfqF)w*Ani>{vAOWSl=Nn`f2sljzL5K)8Y zDWb-%EybXX!&J+`xK7?~@V%hzwtvBEcI@}|10-$Z0I8pJ%Ikclm;faC>}Fz$r!#ni z9#w*gIE!<%s_2_x(Z_5Zq3?<=I{Gt`N4l^&8Mb<8->*1t^N?aUWitoJoOJEc;Lo#e z54w;>Ki6Rd7cha0?tZq_A?(gxj5x>sLQN#Z@pXt}TJ^N=vDK&MI=iJ;=}0N((f4Go z5glSk^HyP*gcD*hpcH6f86ejoqPWDp8OA8lOu;^dW%?M)G_rilePylzF{(kSr&9bW zK`B9jAwA%(PovCk|PwmVhChS8@oiG{Dt9+X)y+Rgu$)ZS9chO6n{aE8{?w^{-aELO- zow-Klt%>kA{R~Odveo|f6M#0`|EPz;7BEZXbDe+osHh!Y2YL;QYB^{3F5KLjEX9E|#UXI}uTiy~|Q literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/minecraft/MinecraftImage.class b/bin/main/net/PeytonPlayz585/minecraft/MinecraftImage.class new file mode 100644 index 0000000000000000000000000000000000000000..2f8da736ade08fe799c0d4d99f9c81a456e16b61 GIT binary patch literal 1351 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTBase.class b/bin/main/net/PeytonPlayz585/nbt/NBTBase.class new file mode 100644 index 0000000000000000000000000000000000000000..4e62848ce13c3384c609f47b5dbab817f3222712 GIT binary patch literal 2620 zcmai0ZBGE*4NLh`Jz^0%E&JYq2lGGUC8GLzh_uvG&D& zYm4=X6`xnoaa2}+F84U%Y&+EEEN^mkk!djV z42j_PsL-@87Jreb2-*~cjI3wo7RJp*KU)nQWqb#$($`YSS5GOrUyTyy@#@Tkm(9Xy z1+A2gLhnnnsOBh&7!n%d3XR)r39CK_29jt|h)9Ucs>jwj$)f##%}DAMXI4iFQJp+= z890sCNO+D8{31@=4%qCBWvXTCEai_pJ!QW zW7C=VR0REey)ij_@|=!#3`mz=l)jnHyjZmOlt8^~-~bM?wMl9h8>g(pf__j?>;N(7 z4g@n(+2FNDAv8^GWV>4x&c>=SUl!w87Ymwk1BcKO#RT5caGiVT`N{;A2HpmP*ZTpb zHUttI36i;CpcSu3>hBnM7dMHEeJe)XJ=?ur)@{=n2{vuumN?aYr#{^>{egiGh3Hy; zTJV_$ny{C<;AJUjm{sVg*dzi)M-EX9a|%Z*+WIhb+!o{cYTY;Dcsgt`y;}{#nCr~x z$cyb_H4MXf*Q8@tj7ecW)>^?XkbgYQ= zgQ{8DO9Z|qwx22-uLxz(y}RfZW&b`zlwFW@i-nvuY|ANblrE1`(uv^?_CO799Cp1N z`+So-fL8&Z_5AARJWoRCi46|*D~zA{6~b;lcl#@O3DLTqYxZ!?2&~b7Mo=Nm#hHE7 zgemuPhMTi&M#%=DzEL`z8i{(9Qld5{eu429B29;XgeLFnoUHMK*98X81#Jw1;s|Yc zdm4ipw@o9CqO;`nB5{XAnMg8^g!l>)(f#TDB%s;%*BqFY{E4??q(-0}#|i45rQ?JB zlj~~fE0fs7s|x+CKOnk=)Xfc?T5tUg>2c0?D-0a|BXT~RI27K**$`4&Xuo+V+|;*$ z3j~u&Ji(>ZPId|C^w`44t%#DAy=WtCNBGxHEFCUE-I}-V-1|27~<4s5^!s zB0h)&u8@QfS9W3;Z;-uX^mP>@EQm10y#A2`pdN2x^o88M;f%CLSCRn7HgPQkdHEh4 z6q8MTPcSu}Og-Jidm$uKn|Po4^e7VrDCW)?$Y$98P_l3}V?YB9uXZdar*1>Jy# zBtyDkJ7V8|*A`xrxBGM}*Kj+$-{PLFzN5{!d}ALotTwLJk8D;+q-d2|Ga!_KX(VXl zgnL^InfIP8iP)>Tjueh0;6kzSmY;CbcFkQb`GGG7zN{*zsaGF5VjykTIo5EUA%9U< zKe#;6aT7}#7D?&ibVM<53(FKpAgTgX#_9?^|36KN!V|nZ;jS?0uI_~9bgbgOhI_S1f>R|Zl#`5FG{Nft*C)$oT0Dn-~^a1pCR>yHexVnOwp{yICRX?%AhhT!W_~x zD?la!>``S!S=~k-e;Xz3Ao+Rjaz(4{W?X!>0PzQ<$gN{`?ndd5o01 Ke2q#__4E(MEY*qt literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagByteArray.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagByteArray.class new file mode 100644 index 0000000000000000000000000000000000000000..72a27dd0ef2324a0c7294d482ea0753fc89fc569 GIT binary patch literal 1412 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 bPw+HjzRs9_<=NLe)anA&(G6V%H;++C8T literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagFloat.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagFloat.class new file mode 100644 index 0000000000000000000000000000000000000000..510f321fb2deb75dfc1feeee90b369e47d69518f GIT binary patch literal 1182 zcmZ{iT~8B16o%g^g@x_{{lL}_L%j2rNCm0g1Rcw>HeLAoj!_=1JIr0U=M842uh;RFCk-!8@ z3kIec=If3p_WJLRM9|6sEo%JiddsM9s2#CC2Ecu zg5=2Ltt(BUl2IC28Y|UP`kJCInju?OR4rnnOhXC;?h4*dUb|%^{=O}PqF#=FVfNo MDSgq6vW|N42fSg|d;kCd literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagInt.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagInt.class new file mode 100644 index 0000000000000000000000000000000000000000..ebd6919aca34ee808d7eb743a43b90adfb92274c GIT binary patch literal 1170 zcmZ{iT~8B17=_Q2(uMBQPi$2X5x?4ktca*d(Tk!aO&TDfY2xM3PU@OE+bmNQf0GxQ zCZxXWn_v+4Ih?-`{@%c#fwQVhoE?D0fdBD_`#Q`0>Y$XB)0O zQ0`8x+2q~2R2Je43zt{b_@Q8!@}z3<-hh^@&XCyjq^DjmOq9wkhWM7>5lKwIc3@$O zA>Ht#*crS#5J8h4^ypTu;kS9O#RE@&N1Ji=#yezKYFsWKnyivWsa|ePgGdf0k)Vwu z9;`8B-Upr{V0X)xN=QY#VyW?#A92_7-IrYP-GS;4R8<>IzWUG>edYP`(85)Q{CQn{ z_u|CHb{%njV0W%aGN1JDrb%z z+{HZxOS6m^#ZBqw$0S1#Rdt1G9``A0s;ZGksf+iv zsuhVzHtCttbJE?URf1OZc4(ZYuXS?*Ojb^j{6ZTsI5Z|{)?*wtW@zP585JRgG|d{2 zi2&PFX=*i~GWQMHAthy`XNZy_v9uu-B63L58hK+WgIQdmvjXws#4Z|pTM^w}u6#xI z4A){9;zN@;gU}{Jv>llQSS1j5!a{1wt1`T#uvg6FQ3$%25(4 zH0zXNiBEboIqI-M?|hhHEV7r?&5LesQnjwj{lLoWQ>^NLJ%M|I_0NBi7Dh<9i*9U~ HswaN{fhW?i literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagList.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagList.class new file mode 100644 index 0000000000000000000000000000000000000000..c60dc143d617c20f6a9a6830364995a6bc6e888f GIT binary patch literal 2930 zcmah~ZBG6d=#Kj^onpZgQE_PI05vPi8<=FXja&pG!z&w1|Q z_kVu=1wa>W`r(mKZ|ZjRm_BP;=CPDEd!>DEd(<4Wqlwt?u$GJ))3zTz33bmmi)quk z1i$TCOQ?un&@OAytZk&C!oS1a9G*?nOo~Y;?lerp-Y>!1&^RK&*JDlS0eDfSpacOw z$|bB>4$+;-XtN?t06~^Aj69GYPL3*wbNOp0GRp`t!A_F`Kjcz0BkIQva^f7jB6$TZ*eRjJ!5W*j zdA^S)jR>b*3fjb`>}(F0q}_|%3f5x-tuAXB?p6I4A?|J~OFSTxf+yb zbZueI$*k_mf}@(`*A=*WntdVwt|>|EQ?qoYhl}~pij`~7mK-U4=OkWCQ&}l zMW>j9lP*W$hFIhO$UrFBVfToFPIQTS9959OAnTz`Oo)1{u14c27JdaGE*6)MUGA$* zLg+;Y6Paxd*%`x3lH!KK!n>;-evDF%4lj-#+~ru-NKNRO07g(IgV{h#Pb)Zsv%G9t zI<1?`y}2;=T)@?5qK9NqRQ}=a zgXj9p2^mBriw{vY83wf{zJ{i(j4k70&XVPmaVcjRx6GsrD`(lCvNUeK$vY<;d#x<* zw+!CS;8NIgPNR^K&DpqV%6MxjAn%-vSqX~p=&>%Pt*l7xDo;P2IFc9~O$gBMC>X|Z z`Ut7F@F$_Vpy(^XFPrgJsH@Caun*Z%o-G)QGR<47k(6-5i&P={Op&c6yV(xHq7cvT zVvc;760LiPjShh!E1MbD`wh_?%a>dF4v`XevRiohufW4UHdJTE*1@;T9kybQrTmJ~ zimF0Iup&7VCtsXdpbNnsXm_Hae02 zpr6QKD)J*L7f~bOD{PF25APzjc$(nlo6h@_G`E|NNI$7{sorN4^TF~o`qbTT|o*lVR)hpR^V z2z4~`E!5$yDEXEzk3(;(mU#4XVviRWEZ?)ESP&>Xk%OGm}}s+ut*yDo?KBedS3W;n)*%O@iV?-)i{ym1rj}IuCIeg?+p4ddw z0jeStx47V<>bwa;-p{s`(?oTKsygf7U+4Pejg>=iU0rr literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagLong.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagLong.class new file mode 100644 index 0000000000000000000000000000000000000000..eca66ea7839c225d259469b16d951e136af0dad4 GIT binary patch literal 1176 zcmZ{iT~8B16o%g^g@x`yKfvM#f`}h&K`J6@QuLxI38VoMnkHTjbW_)?yUj91>u>Tx z6NR9OKfoVld}nu|t;)^J?94gO`|dgC*YEE?0X)Z30||k7&sOCzFZcgG%SGJ&J{!$gm)xs4k$u)c?d-gTR)}0bBV&TU%b_%EWElF|Z(z z?bi#RE!@RDflfPs>9xwyZNlx`?bBRp|_xQ_8_HGBbvOQ%SE;Y9)#*A#cXCShWnCyQYW!UWRX zH6RlMHi_2)DGeyieM7cKnFwFTNtvKnIwa*|azxS^lcA*yrf`LCd9spZPlxt4NYGBq z#nM+~&v0!BJ$z&`7b3LD2yMnDnMCv~Q5nqP*5&BZ;u+=z2AoIeJkisAt_RWgiO!;c zVqA$O?z&0|PqD23^#tV;tbYEBG}}kY LU36nDjC%41w0PAc literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/nbt/NBTTagShort.class b/bin/main/net/PeytonPlayz585/nbt/NBTTagShort.class new file mode 100644 index 0000000000000000000000000000000000000000..281416fcbd8d24676f0564a587518c73e77bdc4e GIT binary patch literal 1189 zcmZ{iT~8B16o%hv3ro8T^aEQJL`Bqo0Bc2*r07LK5|Rc;+BETUN+)Ga-EFp06n~Q! znkWQK`~m(b`@}nsE@z!UQJi z;Dq~ShU9zSk%a7Qd#)6&Bw{XKd&^I_?RfSMm;7KLdjnZfRuiv39EqNEJhyM)CPU^j zZtvjg#>8zb7?>xe%iAHv!W}FUM~mtlDrb9&J@-FRN`^0Zd(2*T+}@rWxHItp4-G6c zq(*i1wS`A`%n(e6@I4!O)1f+t<>cI@D^ zVqlH3rd3Cds{^Oo7JdS&Fx61D@D%G*e%|W|x6QCXAO8myzN)Af8x~4fp>)-~fqx`+ z9n}lTkp^5-nkZ9Mqtv<7U8=OSnxqxA5{+@%t?L_LqIizP7dnW*qA@|U8e=dqO)HDS zChSP)Xdw{p-=i(gl_n#+(P}ETMBFuE)`N zLZ?tbG0emY%_>WgiBD?Oc~r>;HT^J$k%WsYMMzLwwjiRqIBhWo-*_NCa z2xqc2fyjbWH)9ARu0umqpl{i-&DHk14b!a}8%IbSX%<)%l}8( zXQ%7=%t@APtp|kE(S>e;yf@ri0*Mc(Eyv!{a6#a#S1;q1*7kRz7!>GwRV^2$V;I7)hD&rg-WVO1F(MFcn6lK7CSB8~ z5wDlxxPq%1#t8n;>;Ou~IIa=PtD*A7aV6`@EM;pdE2ATe99g_wu9@|cD&m~qnWNSD z{kSa@I)^P_@0zFDAVB-;}sFZs;rWKmE zS8g|(9o4D_>O^pM{RBO2dhGWRbRR-MRDAkL0ge5vc3M0{v|=Gq>G%hcWoNP{MKwI3 z-|^v;+E%k}x-l#ut}ah?Ji`)?ve9apc3q%w+N@5f2Qo8C;)RaKAW*F0wB1d!Y^j5u zJp94kP!#M9(fO&eDs@bG*UdYAD7^OYY0}#Px^g>+edUV~bY5dz)ir`R&hSoW7=zG@ zKCVh25eSqS>BTC6T>d+f2P(au^%<)4(yY%@N(aimlJYp~Ati7Q=ed`reuUcn9$uYq z6#iiD8&j1@YNSKSX zAM!AAzSus-C^2SSZ{A%dU$!EC~T qa8jL%Aa$0}DlYXC3$J&usG7Kq@;07-Ii@srNGTO42`qb2D}MpNS|zIh literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/storage/LocalStorageManager.class b/bin/main/net/PeytonPlayz585/storage/LocalStorageManager.class new file mode 100644 index 0000000000000000000000000000000000000000..991b62b8c6db4a38f9a3a9258328a9ddf53ea49d GIT binary patch literal 2273 zcma)7ZBrXn7(F*YHVI2C9fU48htPt-L*|i%j(gDnbGp8(juuD+_DtZ3tZmT_OxhTGqTa;^tPU{1zNJ& zj-JwOJ7;8fT^E7=M2+Z1+Kw*8S68*{thrM#i^gV5AXKo-tz7v>(;84&g%j}r-U`l%E`66>78%_22h6< z6<6SAQ2Rx0SKwYPyyvh%;Ej1x+jI-|pm9lx>mCSY#va!%YS*DCiMra}083^s#1Z3r3-6(@xiR6xaZf-YnoV|BVDuzp1#B!*i(^+4GD=Lr2LgTXPgNzH07lTFV3hhR7rwAO_iaWm z*g4Y>@NC4%8|8WPqND;%DO=0DOlk#3B?`u!mH z&Lfgpwv% zJjEjQYMT}8)P0!hl6p<5Si&+jDN8=B$+jArl;RuXKRq zsUqI934HjHYMsz6%e1BxJTI%r8EmUBEOWm!L<9#(Yn6ND6_0-)WfrZB{)D58U9Tq2 z9hk#X2|Q*TU!1xg_~p>zlV6T3-o5bgS5C12S9f`rKYsBG8u{P!h6@jxc@6Lm3a1`H zTy}OrV@@yEHOjkmZWuU3@WjpQY&JVCYRLds(Mm%~ z9c-YVz7cHk?H*^-51bZ~xdC$M#rO0c<4VPMxXCBVjLeQRr-$C7d6 zK`2D?QeK*yNnor@B6b;9cHs6gCRo_iBFj9+wB&B)2#-^y^Jmq%f|W8MqHn8B{A{aot6-o{L}LQkmM5p-Two?G!s1{fEfaa z6TsZX08&^bJ}KW^ox9xAcUloKE$5* axLc~fn;u`|8@ literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/teavm/WebGL2RenderingContext.class b/bin/main/net/PeytonPlayz585/teavm/WebGL2RenderingContext.class new file mode 100644 index 0000000000000000000000000000000000000000..b59c8de65ccd5ce1529c36d80c4d4806d8c53d1b GIT binary patch literal 1289 zcma)+-%ry}6vxlyhadxCs3@TLTRIi01C)gD(6PJOr0YuC4Tuj-$1cs5(wVLU@ktXO zc+met6aNAq`~&=JeD;BO?%hIeh!K`7r=RoVdvDLZr@u~q`~-k?SRH~s0&2t()nZ3U zE3!iW=>5v-ikdM0U|-#0wW5)=SyX3nBMLTJQNrFOLoh&KqUj&_YUoFSTCO$OE_yE! z$h6|1SKDm2)I(Ma!mi3$5dvwKZo3tmdL?b!Gia3>1c**x43}vqew0-Gu*3QRKCTm( zk&`u3cgn6^wst&}z>H5PC|5BZy=cq6;rBMm zC97;w(_P9IF!K33R@hX_dj(r7(Ojiapf>k^WGRFUpO(d=n7^$(K5%tP4ihiN8OqIYe9(%8BK+(A;Rc9eP-GZWA zSSlT`L`YeF?C+yQj92Ai<$4CMM7sO#RTks@)8g324lJD80Vy5(knV0?auQfPZx2%T z8t=e(tr68FCxN+GOh>J=x5r{9X~llPN}VuiwEg|JA;UH*I{$U6!$wlz9q6XxUGD}@ zGg9@~KgKc*4@Qtv z67%?5VC7wV|OFW5uRpM*N*Cn1pz9I2VGmK literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/teavm/WebGLQuery.class b/bin/main/net/PeytonPlayz585/teavm/WebGLQuery.class new file mode 100644 index 0000000000000000000000000000000000000000..d4da3ca49d88047a1c3230ce24a34ee38dcbc6fd GIT binary patch literal 156 zcmX^0Z`VEs1_oOOPId++Mh4}))Dr!G)XI|lynvj<$|_R}Q~i?E#Ijud@YE!CpTN@8 zqDpoK7Dfhvti-ZJ{hY+SbbbG%tkmQZb_O;^2C@92bg25Q;(UFtV2B(e16Oc*MFE-20b literal 0 HcmV?d00001 diff --git a/bin/main/net/PeytonPlayz585/teavm/WebGLVertexArray.class b/bin/main/net/PeytonPlayz585/teavm/WebGLVertexArray.class new file mode 100644 index 0000000000000000000000000000000000000000..76337765e4800551c74086ae4d9443c14b939417 GIT binary patch literal 168 zcmX^0Z`VEs1_oOOPId++Mh4Bi)Dr!G)XI|lynvj<$|_R}Q~i?E#Ijud@YE!CpRm-T zlGF;vqN2n~b_Nzk27#=^vPAuy#JqHU|D>$cFChjE`mFl6dd|d?;hJ z$OY%%p_i(z`s%Oh&#(6n0LR$!;1DX2GS#+@RFKG9Qw>^LMW%Wtqn_+s4BV&p_bp{S zxP;=J?8&Np7{m~=?V$fo*siD2hB$|W(IXvcb3!QZ{4b^4Ah>67sC;BFCg4F3GCSo) z4upch2u4|3odsWZ+czq?mNzX$DAnUYwi+_g*8X+6rl~uGz4Xedt+QmeCzBc>C&TbE zHv0C_Dwz?Og77hi1rPItt^f2duxQm6J4PnvLh9(cnJ5_&M55YpPYv*MSP@vYq1jHe zYr^;;vNhKQmaNmiin~dm&b4iHAyxLi{VW{th%)@;1jo*aZ`SgVWlxT8=j?a*^ebm>s6( pnOeXY*RfQaY4<+0W_$d@`r#}ya&4GZ;(jKXHI>35Y%tlu<~PE!pX&es literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/ChatLine.class b/bin/main/net/minecraft/client/ChatLine.class new file mode 100644 index 0000000000000000000000000000000000000000..5e6e00d08c3f675b555954b15ad826aa6eddda3d GIT binary patch literal 319 zcmaKoy-veG5QJwP|A4Uxq(`(s!HJrm#u5^el@y@#=gUGaa?a>D^IlX)6g)s43bBqt zOEcP;)vmtX&Cl02fLly5M1&K^L9MN0VRUvrC&X2^;2a|y6v(hg7!M1l{kmcQq??urle#my zoojCgzYF8Av~Psd`d_eXLjKtG-tfI0R+WFmmjf)WAQ*C`kRd_3s{}**zBsk*0LjHC c@(&3j6r!obkik;4*wzUSF%~CZ5RGvB3oV32B>(^b literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/EnumOS.class b/bin/main/net/minecraft/client/EnumOS.class new file mode 100644 index 0000000000000000000000000000000000000000..893082aa3a66e8da38cc80a97f3504e94dd25dd3 GIT binary patch literal 1166 zcmah{T~pIg5IvW)NgKk4RS+m32ufR!QU&~IWndVbVJz?v=}g9_5JC;6iIXN&ev5xX z%L9y#jL-fk$Gw*dd7<_pch7b|&hFXYf4*M=c#T&IdKj{v9TppoXIp`J6c#PlvAwXk zT|t7O|JXb+i>~R_g_j}eI$rddVWQe4walP2eb)?}CRr`VJM>#*B^##Yb5G=b z^!%2`(7Uy}zcX9gsP1p+43qEwQ#4f}hMp6yF-W<5jUln=AKED-RWM{U+{HZxxzY(4 z&Q)*N>tWz{_40PUmZsQY4N1r;C>)GxP&i0&Fs>oRL7IaH8qyr796Z#ZLgv=2hF)k4 z16A7GZqzuigLmeEYZHg6Z<%h52Ip8fRY=GX)9?ddhJ0eWkxj-_F5i7x6$@BY@PuJ7 zHpOW(v>O_VSYk+|G8*>+P@&Ncf?SNr*&48?`m8fHp{V=*X3^L^TVRsP<1~FEc=baSJr!VZHqjLX40LyXNFNg{}f}z zcu=J)v9z=SNoqySTj0Mn_TR6%NENH-E~jOa$PjjV3SZA|Kh z(#EuYhM8~Fst1qgJH|;-^FE@_?Kz^qOw=}Ltj8jXN79vdh?dCD2UZI6 zI!T(a734(mH1a5P(pRYsPake$#&|0gE{zK3yCY>UFu(9sG~~3ds literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/EnumOSMappingHelper.class b/bin/main/net/minecraft/client/EnumOSMappingHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..764c3ce27adb2636db356f6631ae3b7afdd88d8c GIT binary patch literal 850 zcmaJfgc6r7EdI5AFJ($a*KLZN&l0cwN5Ld=>-Q6&_~>$mgX_|4l{|Nisi9KbU;CNcu`K*i3;3zQql_p#&po(f{8 z6(pl>Z%>ZLUU2wY`C}EC$O$= zqrm#yZ}mtO8&zBtFvDo*1=3Gv-qpRd8yrpNyBid^4Cm~0B z%UuQqm|OxyqF<~E#`bqu=Rd74So*A=@>i^8yPuGKlfoKdZU)y0^E0?XXr}NCS$17P z1)J2{#9gj?c#J2EPw@h;7!BN^UK1AInq45jNOp;}1+vTJFOyv%zls)W?4qXzYrrZB t?@TiHF1}cylhZRfjQUKu<~KCXxXGlF`7~*y?d*R9+{Xjf1s5vgiN+ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/GameSettings.class b/bin/main/net/minecraft/client/GameSettings.class new file mode 100644 index 0000000000000000000000000000000000000000..f7819043927eecd09998bbf835d2337e0a128b5b GIT binary patch literal 4499 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 F{{fxL##8_R literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/KeyBinding.class b/bin/main/net/minecraft/client/KeyBinding.class new file mode 100644 index 0000000000000000000000000000000000000000..bec07fac692455a124b109f2e0d7c1100c3a8fcb GIT binary patch literal 466 zcmah_%T5A85Uhrk1zbT_#b=`4024QO^>I*RLfq&9L*j8*MjTvb%`%YiSssXq2S31% zGWLLp2M=DlyE@g~RsH$({sG_&J1#PWJuOWzP+CT*cr-y2E2&LzBPSP1ca`qBa0ttN zF&05AbT7E;^krlSrDr+0lEWxfFGeMr;D^7YmPvW^gy1skGU-YJH3_*>rIk4+RH}c; z&03q_SaK0rEO{uPM95Za?E+YVhXv$p<$G|ECzL}LeLEU-WO^?;F`w|mBoc93q{`x- zremJekZ=(G6lP#C8IQw*UGLg|32i%+C+nuWciI5&Mb^8HjDf$6H6~L zUS#yZ49hFm-{92`r(En#vGU5T3|2Y%a5(apdAMLb^XM9P_UB_*M}-kDzy_b8S+&Vr Kdw7dc2HW2{YG5<~ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/LoadingScreenRenderer.class b/bin/main/net/minecraft/client/LoadingScreenRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..b309ec63977b6ccb380a407f12503b359025ab95 GIT binary patch literal 4451 zcmai1YjhOl8GgQGH?zB$K(b~75us7ExdF>1iI@n4+(>8wNJ21*n#sjd(vs{2ET2_OuCMJg18xXjt!Ln+S~QLzl~5hzKdU6*m{ zGe?Xb)3VHzFLSGuaia1Jxw(hkjJpodw|l2jF|dUx=v`@>j)RSH%LEW3IFRK&4b zKylNy&Ac)EcPUs)->!bF-E|!|f;EULs28Zt$(>A_@m|Kk(03Xs$0CFrTN-w&iuJfn zK+XEJ+tj^bYVMN6CKb0!Vo{dZX_(1jFM>L3l*!#hpj35rRrkxC%_>^ZDzG4Fco{`m zQOtjrWN25>AsH6VGR%nU#8w4e44>mBkT^s;i@+Ouev{Qp%aiy_o%oR_xY;&T+L2dEV;d`jjE204j=VI#yWx8 z+<3|r{4AW9UWuwY2D#VM68HCLqgjZSW`jNhM!%LLgnClNuyi|`GQ2Et28lu6E1)zC z3$}t0fy$h4U_r6X#QTU`!=f{etHQykK*+RN`*wn8uFmbuyN@Re;ReV6=r^IiAZLW5J<#%}mLjm5*b`j!E8ADn27o7@ieL(lkk(_?(Kz&t5PWC#smkE@?0;$1zEZ`d_7UB!1KfAElLSh|821g@LA7uydej8WMEGsU+)v#`<0Qe+F2O9LG_;F_M% zZR|I!J}sFN*qAlZbmCq1XxgI_hBnfaDU=+9q8kQd+9(#M0X&d8{f zwslr~WL9%Z!OJr?Npag}DGFZUHR&5mLYwAk^K>bAO<<`{^rwKs=4gD&U0plou|)7H z&dc`v`dmz}G?>Vn!ubfkk2e(jAbT<8cA!N|87h8=AIXb}fu%zN^>cxkHSnrokW!iy zyqSekZdLPQ6~d3ny3=vI3QtQ`jHFXu#gI{~IB*D=-JkU%o79;yxu&U1Yi6>_&6)N5_w$oIhaClfoFVvQ z9>MDzkmXCP^g3xbVRV@C`EAm6tfM$y;i;<_vB+gWAVYIE6I>6Igdn zYFj*ox`7O-A+t12U_;M}aWrq_qpcxOA~1<9C5yx)dM2@B!O|14z=;K==q<&rN$f6J zM6x6l7Dn%$#2#sVKBV=HbX?jL;aC|(1uef3D{&LnVmU{ko3W8Tw9)o0w0<`&zlT;2 z((WW1sr0TcWB06g!{iCktCf^I2#vn4MLmXa8}+T{B$wb@0J^VVL>UBQHV8+uaj(n~ zgm5ot0TT=UKw>A(M`L zkLe&z^77wp2_dk#g4-2FDa=z(h`-fT(3YI}X$+JHn4yNCT-q86uFO#^cp_GCl_ZsH zmN|V9_ctmTJ06Ip$8n$`R8sWUSZESQ%aw5)D_5e&$MHzHQWz^3E0mAu340tT%avGg zOm1=E&gJ{$^LGn<#zOh$zm4P3B~ReFSTJZ6uhknuu>!sn4>p9UauOe(QTQoeVJtKj z3y<;Or>RT62M1@riuJ)<8(Dhv^fd)6x#GP4ojpz~eS1Ee3CrVL7RQ3~KF0B+9<-$K zie6l-N1qo|^gG%yGU2J!nNQ>t+D$*u$L>)=!G_$bNL;D7NA_r}vYD+i7w>iEVhA zBm1-1!A^Y#e#I&M?>zl4^x@ywg-hUYgxw;HJHr7NQ@yNPC*xs!4OYjSiA*OT*5x_HfP^=VCUt*^{ZkJ8zNyoQx$xxVtw+r zocJeewusfcNnF5-tm6PW#4D`m+gR^C;w-+)w*s6Lhgs31tiRL3!Wr&`Xy<91~L={|9LsNUHz< literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/Minecraft.class b/bin/main/net/minecraft/client/Minecraft.class new file mode 100644 index 0000000000000000000000000000000000000000..a2d8ec51af4b034bdb59f89107c5895e1b2d7733 GIT binary patch literal 10912 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/MinecraftApplet.class b/bin/main/net/minecraft/client/MinecraftApplet.class new file mode 100644 index 0000000000000000000000000000000000000000..0b219a0e323ba80e7d54fcf0b55fd06451883467 GIT binary patch literal 3528 zcma)8`+FQ!8Ga|bVK&R5Nw_w}8dBxLkm<~tzJ`?}k;2&^8;NonTFM0tJtJ@IgL*VGG2>Zgk!~V0CDWPCMl!Bn zHDEh-uunsxw{KEIa>y-OX(Z6Da5YpL=v|==X$|co4E;#8e9H1B%u^*x47vrgG--Oa z%wu6Pn6Vl2#{UyqlqLg6ihmu~YcQH76J@*vwlr4b28pmsLtpQkbJaH~*}O%e6<4LO zPDA>1wN&y8o@F^{uH2|_6V_``(^fEMdS=-QERTuwHo!I>c(ya0>su~L;jPRi@Tx>_ z6Z&-YYUl{d7UCUkR4}laa_iozS@QGKj_X-NrcWrZZRX{qjx8G2HicyY5D7i2unpT; zY=(ZqE(SAUIrFl#L*W)#YU9#D%buPI(&)!d!ETp^y|G(!ky>vK%zXZ2gy*daI#S{( zr!auM*$RElT3~u8_A_{8*bO}c7h#36w4I`F{DA4P+dRJ&^f=c z0mEDyRyRxd5iVAU=aEl zWmJpfB#4LcE-~?L4c)!@<(zC(yi?&W!8R4R5ilv3oK=0xbI9}*c$&2NmhaoHV;6Oh zlHE;tHy-JvQN*+)N~&#Y685sFb3&JXoKd(3B_bR9BE6dvF7}g4!68EBO2zd36e=uv z$u)~*vvQZjo&q~GJuk6~;v!I}3OBA6@u*ojPQ5hF;+&5Ac$zJiJ?{k8wB;$h7w;n$ z71Q%A%3h~(d9nQgh5PYALKWN253`v06h6!t>1I|U`Y6wV3Rxz7_MpPY@bM7ZU_4yc za9tC)@)0_pRQMDgVn)$jFv_!-_IV6^nn8tuOQR0D9(g)qo^z{o@-W(^`yNqv6puxo zq9qMo4c#5dMoq_L$}C0-pJ&WN>`_5S!xt64gfH{lFpFd&&(sBXLvFd^I#kRx6m`A@ zCe!#TzOLhI?EA$X;k~8s4Lr_z`Bt!>$AKT+8OdHA9OCd>3g3nz?(8wUXa>wQIcs`s z(`&{9vv3b97vCuDeqegRsA)UVt)=68uQ^*IX$s#bNDIeePnr5XL3s70aUM?!S%0{g zS$Luxt2&N^)tK4*5zipcc5QG6gQ+P^Bq-_5H8)wWU4GCD%4_uN{FIs-! zx#uLonnFEH(4VOWMfa>D+b=2nLbmH3UGpkw<%5C$68{u$zfyP>zoxM>u1(e_dk+az z{rIiIb7E=ryrqRKqgynM=W#{H?=`GiWcMBS6|73Yc2;;nHn&%Jbp;``6P{VHbo_zM zx2P}O;CaB)^Q_2 zO9&Wfkvp2B7P(u(U%o*2t5buo5`M4YY=G+;f78YsRv20h9Z!Y28GcuUmiW5jzBcY# zMVaiQHac-Ff7yuhmbAaqOAAH&jAyWVisshT(481CGHdJTxq|j+kl9ej#sRAIPZ<}{ zZ5VZI<^P+z=J2)}c2l;S(>-G6o={qYA5CQC z5@u_7{{?I|G9L;RZ!$6;2?uK;C6PuVs@Cyn*6HHXDE2YK+ZqhC#!;-4^D9o}AIwg0xJB@}f~;gTvY9!} ziJ%jg>-gmbtQr-09lyDN)R8T9{4Vaw7S^B(Yw;q{+lW3MR}oK)u&W1&?GQZ;Q|kcr z4pQq7^$zp3Jc6wlBjU%x_>3rqI6lRf+7nD(qkcPH!XJsLXuOO+(Y{nb;@5JmqO8-qgt!4aZJBt=%KAv6doLz9SpF-x+@tfgh)Ua2BcZ~zV!F>66V zNAqX?AI<2^>Hly9@PT%Wfbe9L6B}(*X64F>EZ537F}((3YYQ7AB(&CYFGViRwmO>r90W*M{TRIPz}hJLi0dOe JLX$N>>kOXcM%4fS literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/MouseHelper.class b/bin/main/net/minecraft/client/MouseHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..f213d13bf4423cba077b0e7bd468093b0db0afd7 GIT binary patch literal 952 zcmah{*>Vy=6g>?C2n>q^k{Dwa+yFIW;_~A1LX=PinkpO*3nH95ri4y z6Xy#4j)`6DF(i9JmAP}t#~)=^_5FdXnn2#fZC#LB6r2dz>nr{5u8DiN&#*pcP@Z^W z*E@B`Qc2fg2oLLImCF^zq6^_cdQXei#fsPoZG@L0p0cpdRp>XoGH%k>}V&10Vw3DT5{J3+!-v=90G|B?KjNy| literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/OpenGlCapsChecker.class b/bin/main/net/minecraft/client/OpenGlCapsChecker.class new file mode 100644 index 0000000000000000000000000000000000000000..e57c593bca2e84e4945e18edfa57f262c3eabb3b GIT binary patch literal 318 zcma)%Jx&8b427RJyIEKQiBfO`6et)`^V6&Z&59I3>1PK+CQN3d$%K1RAyIGu4u$YU zbTl;2ezyGd`Rn`R6Tme_B{IT^=crcJvkCesD&s8ssHSW7cdpj!O}$|A!l6V?7%lay zR!;k8HEow{BB6g}y^S}7-sE&n$m{NrEA+5GK!HAC*huvKcGYrt(5+*_xao{`a~*8* zzr#E(?1nID{zr33sAkYBz#=rmk_yyoG9!N+qY}&$8`=%`nm%sN^!!m{K zsZEQY2v>J_SGW>V4BOLgJ>D0pCC0*1b$<;#84`Vip{!3kN0QCrB$3HNLYARa{g-nZ4EZcBVS%BbQzD0> zen+^kc*hb9McpyD)#k40+tFdl`(O?kw&v$I*&wPXHRkSa_}ODvo1X@QY*9z|ZO`;h z7~1jDCz|@kajmYVAMr6)EpGSJmgkywPpieU2|{RK1gM6%+9FB}nV_ODNg3C1Q^E~~ zr8r&|>)4=ah~p8rsMyu&1m%m)kuW^1_D;ekgEDufgFq({bx7B0rm=sc=u*h7Q>qD?%d?gxoT}+S&b~#aAj7~ zGhn`m;@u@(;y?BEobB!;+g4-b9qu~J3a??NzF-m!}Q*K zNz*PtdkKrQrpbCqwtt^d8fTD|`Zwgh22KT9^TAb)0`rhjz!II6Lw78rNEQX+GQqN7 zw}MrITk-o4!5>qs4_|2%uYSk1PbmFF`K@w_T-{$zaqA4#&qynEqOX4;&m{36LM%=& hRxTJT#CSJgtPs}@F{%_nf2fUp3HRt?kIV$_{{`BsLX-di literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/RenderHelper.class b/bin/main/net/minecraft/client/RenderHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..b4445d7ae817c81f2bc9fb039464622c8e2faa20 GIT binary patch literal 1786 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 Wr+E;2fo_yA=pvy6;Y&11;PSthSy{*c literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/ThreadSleepForever.class b/bin/main/net/minecraft/client/ThreadSleepForever.class new file mode 100644 index 0000000000000000000000000000000000000000..4d2f70aa3d4ba0e4e4e4e88e98ad57c400974448 GIT binary patch literal 750 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 N%5pIa{N9p!`@ev%(^UWf literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityBubbleFX.class b/bin/main/net/minecraft/client/effect/EntityBubbleFX.class new file mode 100644 index 0000000000000000000000000000000000000000..8a3d0ffc8616451b35a912c986e701ba85d31c0f GIT binary patch literal 1904 zcmah}-BTM?6#s2lb|JldrLlp2iI!HfU?WJI3bZMdrp7{B2?Y|r*d!O&u-T2vCeZrr zjN@oWr>|gra(wVnr$NUD-*xoG7yky|^jXL8++8xmN5$RQd(J&yd(ZElbAI~g`yT*Y z#QQ1&5;Tjuv65l&yrVC=vAk(;%Z>5HMV@zKS1s3Y?~GS+Ig=;nRmc*0{@*@1FF_eK zEW^DdA=*2++ha*D@tDc0+>FiHj#(H84?aLFtiXY>yB&W zO+L*F5~QTiwK22{T}xee&Eeb*98Ji}FT^b4EG@ep%Mnd~u9YZgo5}GYKQ_{3`S3*N?G$|*#Ha6u;lRy6w z#M6kWI4hym^EGvADK@3M%M8z8fIt_2wM(AcgmRf~Sv=yz=NQh56E~G?*RZYm0U^A= z@Z1hz#uJV(jP4L-2b9a*UKl8e-#5gwsU&{%84+ZH;i^EiwT|eNzCN}@aJ5ZRQQfGN za@?8GseS|+HsLg@JBHYA3uSlNSe4Mfr%Dd0!x6%_symc$_a3i(wdGq5`s7)k4Ef}o zPtN-!P8ryiU+=fe1>L3d68PSA-)5K8UKfn50RH4C8#EOJq$*yw$bac&Bh*XJkBD1k6 zLRbtouG8hNiGI47D+cj8R#iAusR#ESgNq7P;u3eqO*_9rwZ!RmObG+MsZ=WZ-|&{U zEk*fxE+frY!yOgWMSDidj!W6+#c&sIP;0G;DEq76AXn-n32!mHjWmq_>QWz`39eJ) zwWM8Lq*LCmvS8Y-IC-8lL>(U9J=V^OUcvxHYw!v^KpagUT2(;0fF^o@2U=gx>4+R@ zj3^QHTQq5`hM-tl#nPd*ch?ZsLY<+`Ep%y_hd7}!9KuPG^`Hg)XvH{bGBh>I=)i{v;WL_(*T`eq&k@ffMLWtCFW@>MAh=2L4S3uX zaRQ?UxIvukaW{!;^tfBZDIWJCaVq^`8fhOz{6RJ%+Q%B9GE>8xpxGK;5pTL8t)(A e6h0ygfgAI)+Q#i2k|+rLg|!Znze~FS-uoB7OT)AP literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityDiggingFX.class b/bin/main/net/minecraft/client/effect/EntityDiggingFX.class new file mode 100644 index 0000000000000000000000000000000000000000..38e5e451308330e50822e3039dd157e2135a97f9 GIT binary patch literal 2228 zcma)7T~`xV6x|nt3E_r7L`M|sSEwYY5kF&zf~c`rs#Fkx+S-}qCQKYAbQn+{y4t7y zfj-&CKKG?-iCwD?zSm`cL4QFX`WM>nJ2P2AT(pHX_v|@m-*eBsXWz-|zkYcI;0oM0 zIs`^svh|$mlxuQ31t6!LU}=8cgc2b z|Ej><;py!&>gI|nIBG*Vg$GT~sg9L{znxi@)2uu$OzLqgH!l#o-mI!5cA-n66G?&G z|6C$B-vx=DI8yIyV@pw6mXk=MS71-znsTe^>6AOCp8D&a5)e~e5XeaE(VYHO)AQ|$ zqoR1g*30dc*aw4zAjwR`y5*T0JX&Tc>nsBj2Q(?&$`Zw6;{(sX*Mvh7?`eW;5hk5= zr2|JKj_N?F6}aUo5a17wrN|=JrqO8JR6#Gp*bI#3!%9fnoFT6 zazi`k+|o!MH>rwg*mmhrX0ugn_i?_ zEh>RAiIP6leXYZeWN_Q|edR60CcXh;*Yr^O`qdLXZy&H=GuaGekd`eow3!(@sY&zR@S0s-I2K4Vg-&*B<^ixEos)A#Qhd)DM`lzi3KcD z_B^ie3oz-~^=04X-nry(Iaf~NQ+yW3LxB_9FZYh8CGj~P3G}Wh|9aDDdUsdNFW1$h zGQSkVy#Kj*ozj%BP@xpfYIR>5&s#9{6OLbx;N1mfc{PF&*$@*gG-wjbxDXAN3eir}qr9bR{y3MwRrTh|BaaTSt-E zdjT<#e}TT<-qmkuKge8ht;|)om@pEVajV!B#vC1+XvLC7QpdV8*XbQ<6eZ0KKDV^3 zWgAv8MRc3b$Jz#-9-HeOc8M6e))&QVvn19HK}$M3HicLgnlgBUFw- literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityExplodeFX.class b/bin/main/net/minecraft/client/effect/EntityExplodeFX.class new file mode 100644 index 0000000000000000000000000000000000000000..9571cdc25b400a6083a00d611c51544a009f2060 GIT binary patch literal 1961 zcmah~-%}e^6#f>LO$e8=hS)99R@%}Uf|3IL;mD8B7J}G-2sDMLwVUJyHf(m|vWclW z`r`PeQy*dU!ABpRY0&Y(@l{7({4ad;S;z6*-6TRBb$2%R+;h%7_dDM?_vXhxzx@ut zEZz&COTw7N-9*{2c;3;AZX$0Q+;S7VSmb#(v1qx5`*5*dG3^3RZ3Q4p82SGNsVxc0 zjA0q>oP^O>`s9ioz04CPuW>VR&vwkhbjo{1GZN(6v`+}#=w;}E5<(yP17H$PmGqjP zFm-Duv7)=X45u(adpNpPu*(vSGZ-ddVkZgVw1=bW8fIeM+j}~M3m6IDq6D?m#&8Lj zCG=Xn?xsvzcRipfdG6rgP)<%wO^I#e3}a$jR?!{T$ea9@S>?j;Jj1v!^tTL44(FDz zTw$0HmcEu{ofqW!?*U=F%5d$(vW>iMa%KLC#|@O^uLt5eRFXgVf><=mFoz`3+={rO z*Kh7{;%iyLK$^N^wOY<`XH(Caqz$KS3YyU!L(H2>+1)kv33f-d|FfZ{iP@U&P+^8U zmi?nie9uXLnDU3K{&3A7uKU9cO2gq+fjetWMkP#k_Fxm0@0Zx*`}^E9b=P*<%_zF? z6^1lcsD(Sg{rhU#+qV2ubGK5^T_THmGb1?OWVkB|BUkMGEupx_uq711io2!a8-hNWvv#um7xs_jj`|=MF<1GdURPIpOu5mvIoyQoR&4co-#ylMLO=BadE1s--$@CgS$zh ztATz4fOHu_dV$0E*vKVK)_OEW3w(`WT%u(!Uht3xF+k_^B0{)9x7!^s6w#0O=|Vdo%T4lI_cOvR+@=}jh6OBAzCudjG({8A z5=nxQL%c+i>`BWc^?1_DBq^SBhok_W5RL3}h7X&ZsV6yG{Tpe>+apYP29F_9+lW*` zwB{jF+lbUQBDIZ3MGKLN79y2$_7S~Gnfg`iBh(_l&jr654P?Z)-N5T&e6xXEeETtY zRwh0x13YxzaPLW~M}y1hcq5iy`7g3zGi4822$BTCoxS+bwQD*b2N$1n_> rhf8JufXe+5M(`>9AAE+GM=A3YZc_S?;wk7F|DBGXgm-Axg?Ik~y5q0V literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityFX.class b/bin/main/net/minecraft/client/effect/EntityFX.class new file mode 100644 index 0000000000000000000000000000000000000000..7beb1bb901493728e185a8822e63bba14089b007 GIT binary patch literal 3931 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 Z#zeSDHo9eZ{fR!`A8vPUk;aEF{|3Ux6Wag) literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityPickupFX.class b/bin/main/net/minecraft/client/effect/EntityPickupFX.class new file mode 100644 index 0000000000000000000000000000000000000000..b9b80258abc4638a8f9ba84b133f086ce71bda8d GIT binary patch literal 2410 zcmah~OHO$}5=f0PaY#twgb9&i`blrB-PN1E3rd@T@MSns4S33Q!uF?<>6WgPE9y;fqbH8)W)nEVq`a6J0JddMA zL)x{1?7Hn*CEqLu*^*;hZjiOgWvdiq@4A5Q=BfX-nr;vtnt`rZu#!o6m1bA-4Uf zT&_`>r}Db(+QAJC?tyzc)~4lT=RMz9o@g4gxkZ#!et1rUe%o8N66nU!IF4vI-3$nU z9(2&H>eUvcn<4P-E5)Kz^a~t&rC5@R69OltBEIegw&#Xkrv={Irwbj=2n_DiEhW*4 zvjUxXU&C-ySn}a-crF223nY+~+=##-#f=KY&?a?RfjHXrKiFqdydWTC*scQm?BT|G z(eh`_qQe4p7rc_`%$dF|jRkX(+?nT9f71H%)(x=r(wTeYU^2%JPCD7Zn+2 z!}^xHZ22>$AJ`?C+J#0uqWH=#J8RWymgAU#=TE!_W(qgs_&~$iW;Is*A#h9LA{?_8 z%(Cfc!irDfXaZBXE0Aw|%PLO6kju2dM~!dU3sdNqh(8c`h@6J@E!ohIimOS?;Bg!u zYdCp8YWwgJc!F6LreXyJyRs78^5yFCv>c(-^z`&_K8ZQ-GMLxU74 zN$wTK#sn6zq#;ppZhMaBkC)k)DT$G6olo(39G_`8|7IF*f*ainkHeBYFkMczFYpDP z@kF*;3rx2pE7VZx=6g)YVJQlfByxv*FEHh}ESg(M=4A<#QPI$=DttG*z~=2>g;k*m zugb=bIN%P8MuY?M*5vkgk7~h7id2q4Yg%W2BSmk<3dR=F`ikkI!*F zr}zx~jG=VvE>dzyr!%|Aq(^sgF5M=@?(@4C`!U@9BG-X1G_N~`8j!aZjv#}hOtS}< z(TnRaFiyL16%?1KmA^?`L5?X&?kbPb5^~qLn>^ekCb*xD!}On2iECf;nDSWl^h>06 z28$%=9XHo*@V}aCr^wt7=N0YE>5A#g#mJm{i5rUCj->M7YBATQggc7dizNAq>{u}u zSDFtMxgSZPYhuV~8!9t$F>mNb+|WZlryDUNVZ@Xmb1DqIF!UEj`-?q1%EkDWfAI^R z{)A8XHZw%$D0Opi56iECy}^nB{alX`#^d~$oFKR-aUQ2|AE&X#Pst7;{|aaD4L>2@ zVF_O&tsijf@N~yMg6tNy<}PY(~GQ={!I1}89wQ65l`=-D$m#o**x7WF)+d` zGi;Yp^zn4ES%lgl%DWcYYkdq8U?U2XA(dfTVn4_=+^#LuT->)sOSFZC&CqJ=Ka{&U AmH+?% literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntityRainFX.class b/bin/main/net/minecraft/client/effect/EntityRainFX.class new file mode 100644 index 0000000000000000000000000000000000000000..704720a25de204691ce6830d5effed6e766268b9 GIT binary patch literal 2197 zcma)7-BS}+6#p$O2_{#F5shv907VH48WFV}P*Buh+8`7Vf!dEHxxnIP7dM*-T3g%N zj~Qp$&h(`??LXjKXAC->whw)42cP@ezI3L4LpzG|VH=g|=vL0o zE2vGhpH=%ZYmd~EYio~q(dPu7U$^K~7b|xP>{_Rs_LO@BnpqiM)E(EznsQX;*mIWSuEw=0zIKUQBwG5a=$%ceLJ2VANRl~Ska*K{kTRFKzyGpAk_Wc|Rk>^2y zLr5wJ7Nk37T$c*!65LGnWbubjd8s1;-JGMby40Yfmk7_msb(SoJ%Rq;SNORb=>O3d zIILIT1Xs{d4I9#zPS4TujTxfJg<^h2I^+6`Nt$TJ&g$lb?il=CQL65|QBa_5K>q2> z>LvI~xrFi7OvP{-4w{SuD(({X=#feNxM|Lj~`%;_$5ir6*5&3#2+lrd2k?ZPB0#sx02 zqJGhlrICvAlE7ruYl^+51zuh66*9H@d&-Y!YMC}KS^ zg{jhi{nzvCM5n>PFcFow>T?h-*QV6zqQX4Ir?DWd)Hr=?<87_6nU%NqjODbS2X1^hPMwQ6gXQ zQ}XL>(P-b>7rs<#dF`?4pyEDTB|?mh~6xA-H9a-(-$zW zb+qn}so`+=0qV7>`v^xH7s?204-xq+x_u!Un<--l8{(cJu8A^s^U%UWs}_lr(WXT^ zq8+Q~)S`#W=+c^Sl){^E{7MsE%-Wxn(epLss-eFGa0G(JO*DoOLm2x>I!xE?F*KkD zjp#=N=jfIlLKI`ziaEMi`zYe5UoY8D(HB*Y(-@%LuylrEYdq;JNxa{ATB89ftwSfU zvgg~h=X$b5{5{9&Vu4uj0nYzZTgY1_Mpf+aa*q1`k8?&S=SyDB$m5(5RC99OoRc!( zWsWP9;u!j|Nb&oxM)RI<|Fr z#%$bk^8Wo_*s@Dt_Xf*coRxb7_HIyS<9>9a%ZvRA+LpCdEv9S6QfyqauL>MMH}PX> zM&2wcXzuPgttNjsq6wNhbvgGPSP5G+8mAcm)do2j$HhMWqDX>`g%CZ;D zM`5E^mT%;WfQ}g|u`F%3rqfb$7&ZhmG3{~GF}sSooV%%##zg(7a#aSCoGY7{i_aFOI8*$W@NTWP0}u7%b>w6}AA$RqB-|0Qjku!Y`!TKVlq z0Bs}8jXI9eeLL3xsk1+m!7^V;_NUGJVIduju>ij#3*U27>c&z zm=knjr5(dL^Mfie8T_8+zghs=5 zRLJ@ccHmuvot_N4cp5!fZ}eon(UbK?Pu6Qap$^~$ifkcox-K;`ey8p*DQT*6^m^xl zQ?3!busq}o`2ru`ff`^*-24Qp81gZkp^(o(?XVYW38^9PJ-o=UnjH%F(viSU0@6VR z?;>dr_7S))?5El2LW;irnA*#3;s%T~750)tZMp#?-GGs9z)06%P|>(ZfSBAgCTaCj z&KRah^5GI`=~wq5b~d%r!PA(j%|nVh!1MDXW0|euWnSm2(0I*PvBb=dW<6J`7$r^W zQ+T6yu^ipzrQN8y#yXw+itOLCaV95M2!>*onO5GCZjG)f0)Tn^E$kN)D+ z@qQYp1m@{FEn^UC^qX)UNAVGk;SP@DGn~K|^l!>H7{(9OOJ;|!4>hUAj@!-VzCST@ Mk_>N>sR?iW4IBOEB>(^b literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/effect/EntitySplashFX.class b/bin/main/net/minecraft/client/effect/EntitySplashFX.class new file mode 100644 index 0000000000000000000000000000000000000000..6e3ef08b929c1a07a760c19bbf2842ea98ed7b36 GIT binary patch literal 592 zcmah`%Sr=55Uh!7Hd)uK#%JOK!3Qyli;tVei?|{L4@NZJ95)jknQUa7g!oy4B6#ov z`~m+)>?L}Lf?m3+r@EW!p0|&eR{$l<+DI@IBVqi8j6|q;-T0xBA~L?H*F|Xj{m4jj zU%6HM?mDR2uow#e*B^5k1yzRRj*O()Wmqbdd%Lc9L-e(NWqV_I4qMm5o) zqC;ve(~d{2#--3F{89;qY`Gb7b;`Aj^RGwCT+2I#)gOlcI?FcsZgaiPF!!VD*P7kR zjV^3h@4^Tm~g#R=;fsbbc7 z!a(u-5uSDN1n+^=1V$)kVNtY^MhYIq92|_&%T{*+#xPD9&B6pGX@1Od$WV98^2A~X Oc}x+rNS~%GftgR_S&RAr literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/FilenameFilterLevel.class b/bin/main/net/minecraft/client/gui/FilenameFilterLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..8858d00fc446e007cc97234736f4ecdc8d7e3ba6 GIT binary patch literal 780 zcmZ`%%Wl&^6g@XD2PaLMGzsYo3I&v)Dh9RzHmTY!tacI9O6(@?kWS^;l`{!H#fD9h zSnvUSRMqRTMVrzr#@2nEbME8s&F?<|KH-gp3}G*j+L@?8dXf019nV)X(9U?KoCD>{ zKuje6wTxUjm%fD@Vf9kXh2x80?3|1)rKc?v2rc7P;e#?l;iC$a{>)4rcPZE5Oc{cG zCH!#Q@17EJgYaD1$f8t+g)$-AiQQF~wI0tVBN=@WBVQ8gZs-aBR75JaQ)fpJeuu}%-(=(+n2+dT@B0r(BC^BjJ zLp;X2y{2*r_As19UVH+qrTxgrdT|lnf!D(?&xe)aXQ9Z}6LV%{Jo&f3VE;7X75>_3 zT8@iO)4C0`sy~p{_TbwYu|WPob_mleV&jy5vB*t~r-2Y_+lp zD{tjBr~;8a=03A7V`h_eZC!h;?t*~7J7wlO(uqP!K-t|QP};*=+pVF(K;GJH_F4jh z*oefgOZWF>%>AwD{zAWiw`-uM$I1)LY_-{D)495qY+1?{NN}#K%by^iS zkoz{PP)KK!{Y?%JTeWS4JW);4U&`C|)H!CY&n9ViQ+2z58qX!H06d83&`~Dfsj6=G zLtuuE5_lzK=+NK`paM}1v$)UYlXaQFJ;_X+qx6nKI@7P?N?b)ZbmuLzU`-k%P*K%V zJ)NbJ^=ush1T|bOP&KWs)2JQ5HMma0wUl)}Eb)xlPZh4mJZhe_7{318K)%~r(@(Eh zX0JeX)z@9+>SYI@Z=m3iHU%&r)f%d3sT43&m+m!_mL!sEOPh`w)Y5b0n-Ey)^1Xp-@U?zPqrbz6OfbS@jf0@TTfEEbqGRrBqsd~VR} z%E;ï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 m$YG%!5B?X7j{q4D)%IT)CEl;3`JV_84l1$@KS zoWz13Z4#0t&B|QYOIqGk7p+X*(6y44DOUB&L{<00BcXFyT~RZJS}JBPFDz?$OM>rq zPFv9o2~w7m6M9LvPDyA_rDr90#>xdvMms_Z{0Iagp+kWeJ_%cL%yX%FeL*v4)CEJ6 z5Y3hIsxhmYx|lZ>J=T(5k+3cIU!{#o2oy~9=9FDfAT=pI=~>U%T_A|9==LKnVeh6P zOs!PV%*>2dsc43wT4hr~4-$;1mnxQ8%CoZc=GmWi9hH&9Hb43##L8wdW87RW8kzD9 zt;As>H#DSRJ9aR3(Kugny7r`4sc_q=V3*hn7L9SeA~wb99tF>0uY^$1IA^fbY_*h^ z;AM-BS6aaU25qmgvQaii7A5#oS$@R+R_s%-9{~vw_F`J&1W7LyuT<4SMeH6>Foc8j zRttq$&9t;zq)>P}&LavA31^Q0m&1x`9w5(?jydEEbQc@L&M@K(hn(TCGaPY-W6p4t zG7y!gq$fr683k9ti_;~_-|(@PrkB)0nGAGq;%HY!b^p)S#65ee zI|*_#A?p*98SR!;C3qLh1=SE7c}Cv`glb+_@CN31g2lS~ zYgt`f?Ev48{UR&+`2@7{$)Oa)J3z}vn{NYugPff}8!hG;_?Ca6Z=ig|SsTLq4cneR zdir_Rhb>%FoYUw;#GXa*j1x&xc~0iqgP5nY`%W#|RXXaW*?BvHCvVwPAE$xl)F1P> zTY;|;J06UL9if-R-d!HXBhakhAdt!3HVWuAG3&CQ_;I%24h zh&K_(J#^zkzF42o^FDfQP!^rWaTrG!mk{76EdlET9HZ4{TgPb$Djr~zmWR1NBK$tm zlE7X5Pw?@Z#tod}=x03zoTe3ERdcK=K?)R{#kmIDPv|EIS#QEE@NI#c__o3wXn{Kz z^KNh?(`<1HaoWO>67#wobu@@^ND4h_B}vd1?gccO0=S*9>>z0Ugli{3+C|!S^Rn#0GN17q z*ozgUaEB+}&tpBvPs@rbnwY7gNd#pWZmXYhqhx6BSc z#RS(v?BfGGPfKApcQHw;gFVdQ0=o{==LO^(F<^>sgY_gk8 zcC*QDHrdT4H?l=|1vdoWWxra$s?eIh$1k+z@2w?czWLg~LnwW<=&Q>ykC@V^<2CNa zyz?yw#Oz;@Hk0Ti6`S-;+h~L66P7X4eH<8lnTHA literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiButton.class b/bin/main/net/minecraft/client/gui/GuiButton.class new file mode 100644 index 0000000000000000000000000000000000000000..5dc0998d26fe5fa73eb75ede1e88c6c8fb857806 GIT binary patch literal 2329 zcmah~-%}G;6#j0qNgyr|Fi{au5RtGctO%qkQY}<4Em$iQTiaUK>>AdtyUb?ek7@sd z{ss04`{Ii)oiXb8(3!q<`qFU+5jCUEOqy+pB?ZyA^?+PGt3#eB;H#l#(rsZ3{z-a3jva=Td zV>m0roKV@1WK;FSY7U-xr z^R{a?oh8_TW9#zpSrs4R9LJ*KEO?IRPhVww=NI{r?*-1QSj8IMOWwB6n=77aIOnah z9IdFA=`H?zYimm$xuD_`e9FF+M;186v701)3PXz{B z)6(n*Holl=@~eSS{%Xb83`Zx0%WS-sO#B}MiM;OBs@6H*s#fLfhh^jZr&qn2U$z!) zIi8(Mjr(ar-X0iY3F5ri+7OdtL@g$VD3lzMP;x{l=?FVQ$uSBgM=X>aFiM3M8Fcg6 z!<9uZ3Cb?5uYaH$KWDPN$|LOjfm<=`;xkPNns?HCH?`@=9DC5q6%S%B!-!Dpqb9Ap z&`(Xm?ZN=TDE#t{+79_^2%UGd_6Ykl#;jvV%Vg^q)|5I%6&MR!o=<@f-hMQarbCFW+L5UZWT#kH) z_INRI4?A+nJ4hyq35~l2{>I~(iCiL+-MGxfP{QGJ_#r-OyylL4G0u`l@6FccVF;~P zp^?s?^xQZ~bvV;z(oxUHkFkCas}jQ-Z7+tlqi=Hg8O|Scyq*IH!w?h<2`f-weNc7O>7bN`xp3!qBNxwvFyOH`EYbkswPKm$JDN=vp>%t!d z*-cC?+G`#kd!Bs`|^cAd literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiControls.class b/bin/main/net/minecraft/client/gui/GuiControls.class new file mode 100644 index 0000000000000000000000000000000000000000..07b3227e840335570bcd99b5e1b9671a96d653e3 GIT binary patch literal 2773 zcmai0Yf}?f7=BJd2!vHb1TO?BAW9O{h*qr)DiVr~;-x~dXj@&9C9E!+bhA;h7kjby z%OCKI{Y1ZZMxg49(~lj0LudLwI-Szz>~0`vip*s9?AiCc=efM+U7r2>_$h#6_$dgV zK#!@}$ywdhvX(k+C$omGnRYT?)|02odb(iRR>3F*Q76#7UgTKT(lk>*DXJC|R33Xq zU%n_M&{T4kkL$Lf2}DM(t2fo8p_=*Rm~H81o*}_P(bfxQNnmH~oTt=TZA`OmhL;%M zFjcngf|Sq}fNtvcae>pZ+RHu0F7Q4H9}yEf*=~?Xq$p2D00-MAb@%~YFE&Rkie!Xa))A*&h_s-??k zZ?evw(W%1j+7O>JjzZMkRIPsZc7QTU8R)Fsc$b3R=%xBu*XB{ZWDA5{^~<(yB;`yh zh`2!Sx<1aThB4&mE%Wv%*aJl%a7)kGGje91f~1_OpV9REj2%Kh4hBIuT{Y8I>#X2a z91_@E((E(Z+>mbOXs}xq0sT!oHIs_(t*(zsXjRF$Q{G;w2HfCgodYt}tO64SHVV7o z1_`vpY7{d&bZsrYlkSoBo#ltRd5F% zy6x~FS@VpA#tLOCtBvTg<%U^cmDasa)(l1DA>jwJ4nEnjIr7PF?%dh8ojZFv?*T?` zz(!s-@yTGET-TOZLO2oGynxn(Zvk5qeGAy0*t3A>ug=;XGRDc<#65z{*vRz?T9|7) zvvu%&r<)0{a3ufQ(8U$P8Fh1o56#$#h_~}IX7KUdoPS^*gNcXed4kwvl!HXTXvY0q zG*E2DgPCib*&D7m!rP*CcbunabP@ZPaQG39`f%x<5OPuUAx=E~dHJ!MC_UMXKipK| zT+YkTj9;!r-dMsZccCQaha|RzqJZE61b2e>b7;kF&Pq~ST#z0qA4W+^A%!>jj{lnc zgMb*I3K^XCc>P6vq@qRtv3YbzIPH&c#)sdL=0mid*cWjAo=>#PM;G;)jO3x+Hw!g76L9#rG9@z(^D#=R!w%*4f ziB1m5vc!9j99OfK&#nMYmCd6u5p7?>tyS z1@s_6&k+%ERDtGEI2xdvJV_qfG9{^FR99jV9}&u3{#yBC!G&8QU;Ku9M6+uN->lYr q#96SP*M2H_fa)D|ASB#GD-gQ8vS4x#f*gH^?$hvZOLc8AbWf0np zj&HAa{Fh3#)ka-O8RU=_m^v>wjuXg)e%O)%#r5~@o@=+$`2aL0_jkG4h6DL z{J;;Nv3$8Vsu!tjG1F;#G7kf$i9QSn80E@VKLmzMWRTUXf{7fmMAq5QtIqDWRGaR0 ztfgIdTU)O3^*#a9VblL4P+32(t1}j8`FpNfh(C)0Io$+p63BbX-Tz}iw!F4hi?vOd zxQa=7vhRCgQ$Va~oh1|3HJWWoztIeh?(*;~Kk#)M( zPh$Oxxhp2Bm=!R0+BzWcq>_q`{=1#pnZRWO-ELPGoHt?P4(Fu{IxI#WFCLh{O8GzO zdWRMX)dO2JaT!-)*Our(O`z|CJlH(=C_P$JcGwVMhc<4sJE|^gzMk3e-xqLR-zF?j zu)*t_;-6EGR-8G%X`b{!+neX^Ezfn_Q1u8GsrpIq!-a@jH?t1xP*bE%q($zCQgat;DLzDj1LpCg0>+^{6Z=%z%h*K zH;nVSR-7u{IL1vb%X|hkoM~C_igU-foq$#X1~E83F@1!E)6%1~1hA;Ez&ljLGDW;# zaotxnE_c$G!@edXc@D<7N@+1z!d>=1f_u212wfqrjqK@g?2KLFgjSIDLDF?hEAWu% HDLncO>L1t}z(n(}ZLl&GwzHB6h%EpjBEk|ag9YR3hj@2yFSzF42K;3?$U^w>)_+#;m zKw!Yi$q4+Y*APUVz`7KVI$EASCGF$-DN_nWQ&v_tGrDc4`^sj(nKDWO+f%EZSw)u= z2&q#ExE=zH8rCB!uqJC29NRKeM#a;$iC(4dtCe%)H4Vthagl2)Y*FVv)Q6UXx zO{tT4%Pp86Dm#u=e*amY%D|S73H&=s`ljH=PyesIBgiYB411(T6=D>=tORnTKUd4SR7H zvrv+yl3}q7+G~eSd(U0%@6oUi_mV_jGCj?);rNX->ZwRl!+soKa9L0VLc(HPpdsz( z*)vDNeY7568FEP$>-4Ncc%#yuwCrhRyCYT`Xr=zW z+){M~WJtqdl}MkF3*ljbJ8NoE@f<0tlS)d#l!hZXN&=R*N6*@as(MaK$6=yN$q0rq zs*2%JfrnQ|>GfXne*}$ZA_SDya2zMt5;>z(H1#?5O|^Y*p-1JUcqW9Cw-_BqaR%cV|HLTZzj&dyH^Q>d zYRG}JrcqfA*?LY5xnpb;fqKc~1G58m7UT59iG^Cz+gNug3-l2|{&TQNvl-berTfIwlJ_X-nSjxH+}K z6^6+$h%urnqr>7L-s;EIt5+4JSqmA$1va|la>Z0SR5nb~ir_rz!+4RJrn8nU`#ZLC^q@6f*ls{liRuoa*EPI>HyPNOlB29xrC@h$1yw;yJMmD#F`PNiHa*H9Z{yt% z-Vx}kS%5XYG`y$!JjM7P-H$7*mC{6@>o$6AYlVgE~{9ORlam9BvzeBuB@G5u>b}b_O3l}~_Dn`n54cD4yz-t5V z)?@9m^JRum&S$&kvF;LXqx@W4!KSeQ7p+0FF_+__J!Cc>o``N;#GRM0-G`G^tKfgF zCMKf9am}iG9=(5}N!bT3;cg#($0q-;=vP4fF3?tj0m7)~UxGU)2>EG3En?jY@MkOF z@1t!H;%`1~!a>|m^h$(-Za6^vSAeJ+qr+8>J?;uXGdzGpE^&bYv{AAqJcx%X!G7im zJ_gL}oX6l-Xd(FSD;OT@Qj2*!vWSrd98(Vi7ZLTIX2wYSF>ZS{y?>xp83dON#+AVn zG`PmR-G$!F?+wJzf=;yZHQk0mv{QwxF7gc?l4ax>B7c%NJstdQ8#s;3LnwG3WYrZQjzkh|jJm-{T_RMqr)Pbvs$@U}j_3 zjW~Z%bdldqjG!B5unRVS?x+$y?7?2E3Dntwd>Zc9khG28*R6CW$P%z`=5KSWXD#3 z$v^9!d%o{{-*>+EIeO#$7hVEznH=)NBbc4Evdx3>q}7{_^<|rT6LBk`#J2Yama=2%a{(pyRO#uC@Y(sBLnPR?ogux&J68-Rg`ALj_F$JMkvosR9( zx(Z+>BAWBL3VxLOF^Bpb$8(exz-$NUe1$RuG5BxFj-l7mc{c2}(uvqUf*RH|Uh4;;jYUdmbuBwq!KiHDp`h$afu&` z1m_f8Q?RQ-6y@|nGoBeDw=HoqJD?XYQMgnCLM~vP74ILQb{3*dTWP7l*U;XswYdj+|#v0b8FBdkzZsSzp)2o5>TXtlx`tfd5fsbqFM4(6R%ZEGeVwrLXW z3hQwt`8(k;PUOPkL>wJAueO6JkKGnPCpP$T6)jj)WkpvhY}6hb$ynLpA=hFK#dxw` z%eG0O3!Aw;XZh-6KOLDYK2S1;f`i*u3Wk-k6ALZ9U?|xiz;(FZkFE5&50Z2u6@_iM zK@gw;Hd}kM!)eM8X>hVZB9`oL?#iYqaa$wpwH@7l>>xaq?r%=)+1a0HP7PT}KGt?z zbdf?#TR+sFSP@T}E-}5RSHT3ymh~rArV^?2qCSDYVGTdpOSYq5VE}QajQ+&xq!Yv5 z26~Xz(k_Jr2DvsnU~Qxu>hy93<7qFo(ys9w+^&sugA{J^W9UrAE4oS{4Mu2LJh_{m zlS(tzS|-^=XYqX2b!oKcu^r}Z-d9J!EFjpeum^jYzHaWYc3TN1$Ta~@->k47w@{sC zI=08vm)V&zV~I^xFSB(S<4AwBCT_zWe%vltc)DFbTndFdb+iV1htqVltS$|uxSJti z`%SzzmCQJvvmFN&4rvPpX~6``%9`P1ueQ&}6h5x)L;J0YXS9K|Qtwsxq^2Aguwv4eT0Dg3^|AJ~{fX>0d7d)k2awRt*O9#;4q?x#O6PP#0MmB`z$ z-ZA|Vh0o(bCRsUV zX9iNk33C;VweFf#b`HBfK*Kz$@R-hF)eIqr?eg?sDt&D%F>L8AKA~^|PjZV%##eii zhSlE9a7y7Rg+J7!E8>~G)pn%0+;N zzNGMVH$pe1vXr1NfLHLxe!R+Zce=;9>T*)ZIx8_`r4_!RNl&-z;O)w?eTbz^?P(pl zG%$N;9q#PYbUSj6d`s9BRHo8DcF?r-BS z{P^=JV%mXmIa)r z9~9oiTWowxi-}o)N8q?|-?k{x8 z6KkU;^sd71@E-joHpG(1JT|{r5uH+3T?tvs-{&?ONr@gPB0NTvW>d~C1T_tfQ&zSa z7#kZ4h)?`}VIw@ZXq-+qxRO#SBSBqq9O_%**@3Qsn3>u`k18UwTYxT>pb{k^is!i9 z+C-`+#uW2W8Wsn)Eg%(A=@`OVhC!?v=D2Zrz%|y7} zzQwIfsZ3+~+}K)Auar6^(`5$3-|FjQb#-WbKsVu_HLpGmn>&~(v;4v%Lh)9x=qe@k zTE-A%WXxoFmWcOKxY_in1@)U9@y=5+SI*Z)AF#Hh(g`}yHIu*FK2Xjm}I@{(|%dcIXjo1PE!r7g>u zE|trut2KPDAGE2o*8A*|2belMmNU>~1y9fH6Q%@3A)JH-+Bdg8)t6uFMX9Xgk+yS% z4w>~zuGDR>eK4^bT>D^R;H|gbVrwQ>DcK+!Dc5+M2(I|ZNp)P4Zue{lQK@WV`dFSw z@O+xJ%)<6cg~tG6Zhb?ku%S0PS2UK&b!-YIC9I%aFE{vQTfXEMPVq`^lo}KjeHotTWW){s5D|tzv&(LME0}Yx-uM$)DGu}-6W_IoR{MjP7pm+{1cEofK ztryb*`s{kCLt~Nipt1FA%R=Wh>O2;^xSX}ukfG+g#C@d`+S4w{7Ov7RV9$}RO)yW` z#cd&p$#thlQ{c)<8EqnY1|%x$-8ombmb@@zZZqb4$nHWqV?*vOLwU?JwLaZT7y3_E zYB=3%t%>W4iSo7i>z@VML2wahG`hBrJs9sYIP&P51^da%1N+Gf1N+G<1U~7+s6d$O zD*1K+@%1P8BC58YLd|oS_AFmLsN;7DkwDbx_6+z|iy7|1L9*3L=Qf?f*-bBECRfio ziFyuab9mlKLX4A`*L1;2G>(&;Zp&CpDJm&N6-n1%7N+4moMp4Ab%;`~3rU>hF`v?F zSr?$$VI7#m9oBNoxfii;YtslCN6_Lt7N0_E=Y=_3b~(S6N4?JMs#c#fSeHXbW$4Gw z%hgra zCrT2&A@5Q6y(i!`qW*C}IB*;#6K8%eT3Ud9I$Fl@T>j6i`pm$=96sxS9?0RLBl4z; z*Q)9i_nO1;XuybuPDnksQEx_rk-#G`?VWc=LM406aG4n`kA%E?z1(wYL;k+=SGV$>Bd4wQ=~6$y498++PupvvGe`tvBBullMA21oI=QM^2gKQW?# z6L?PZyWWfhwB!1^ql!$!W{EjL&#(8U2--7EVqJtDaDjarJ#0nsvZg8~#U_=4j^Xy7GvM zgmU$PX)7 zC+6g2p35p+@2nh^3v<%4IAlMgi!1EsrHd{4Jm`JHhQ{v17N=$ZI9aAW2 zHE2>N5UwNDEqQ$z(clRzr#|Z=!RKYG2QSNx5s6jeo5z{d$EUZ{`NT)}DK#0MWdmlo z#&nc$ASiYK*FP^kg5wAf9ym7kjIITSE-&&DZz#ZmQj4?sJrn2R95k^SEJ8hRZO`S6 z>1*?Ip1?YJ7VYv1I^`R@rhOe7p_J(alLQ;!=x7ht=m6+NES==E$ypJxa9JxMI}?8Pq6K_om! zG3fa!Ql3{aPJteXQm)d=E-LI}Zcr`VPwgM_x4fJ}GgmWyi9^w?%d$!>-^R?<=wkzkpw= zy^l(Qc%?GSd%p~FR3@~DBsmHgi#@kHBX+U1lHy#DTHfZ2d^@nk8L@f)F0DMslknB@ zn%qRZ5Z|wsG)Lv0uj4vrL~B1K8Ofr8wmvMwgodg8hh;ZMiZ=MH?9pp!iMwR4>_a(i zk&&CZ%L-azp=3A;ds}!i+|N!$QKMgyTjW-RsMp8jHjXN&-G}6Mjw-3+!*T~l)zoxM z?!<2qk-MnJ4LD~EzlPrr@%Twq{NnTTW{Yn69)Ir|LkG$y!Fa;w{RL72jPZAtiXvc! zLyAb4{w}7Eu^SAZ35OQLdzd8`*VTX>3M5xou^3BS>NgL}qA+owtsS{iu+zn5gtA@)Q;MJe$`Sn3A5yCHUHe#x?2& bf?|4_Pqz_mT&l+N9{uYqz8>JKM-KiUpB|XC literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiIngameMenu.class b/bin/main/net/minecraft/client/gui/GuiIngameMenu.class new file mode 100644 index 0000000000000000000000000000000000000000..1cec5ecef0af20ceef81ad3ed91eee3768644de6 GIT binary patch literal 2450 zcma)7+g2M@82)xnlY}YI6p+d(Z8;=qOMq59qz8ox4F;&Bf>2u-W;S8yWCkY_XtiGH zQ+VO>6{>1_T)LJQzJjk{FT8Rs@!y#Vq=3Pjz4!e4+yCMF5A)kUKl}*bCO((o zW9T=zlP>BeS8Zk0Nvnp=O($I_>*>j|o;3?fkxz58EFr*fu^u+B+MJsVp&PoXJGU78 ziR3&(VBFGp6n;cx1QB9r%8{{|a&d**_mvfcGsJS1su=T%t&49@7;x6~5MKFRMKTfH_}3qX+R6wB(yR#zI-F&72#`8 zHMn9+IDbm)V`ay&Okub~Mkl)H<(95FYYZ$aq&+g?LK<4*dST58<03-uRZW+9z-Y~3tmlJmmX0T~G-iCRU|7+MoGxY?C;t~#0IQW%%% zYLc7WRvaET`BvQEo7^BfVO(X9^U5Z#io!^fBxfnwp=6jOV~YAX?pSe=ei6Vm8Q1X| zgRiJE#81x2bhU^w5xkB!CA`7VePZ?wkTTwa$Xtn+O2h@>Pgb3G?<@JbDdQGy69)xO zDQ!(;lgC+z5TWnL7{fRz=cXtt;)^XYoXI;B+O)Fam06RbiY(mY_NrwU1!|yv$+@Yf zdCiC`}q_;JWI)W2_G`_)+1nsZ{78k%Z(-OxbtGdQp+@20-K6W zwcdL&NnX;tbW^)(wz5^_Bt%U*A(&&(WvmPJt>XR;UscM6Bf6(xTV+!dy<^BIf@)h{ zrCBt`O^w^!raJp?yAw6QOc)ys5m5;7A`N0c_V@RN;gSpoWtyJC@Hh=^QmeVsg5h?Z z@_0#mP49SPi_|un_Hd3t z9G;_n(NBk0gGRHa(V<&1Vi$ICX%GEAEL0(ZBar6yDM^R6fV?(v5k!_6riavrh1@~~nho8{y{|;{pL8w+Bi1Js6N>$b%B1Fm+qGJwW zJfW|zN&Yj@_dC({2NCxtnrp~>;gNZV^aR2Frt22GiwR;=B;_v>`e^_1@-`;F!g;bk z@*Go(DRJ0FZWs4&K$ktK9jsAEk7E|CqNEbBPriqp>gep-#pYqf v#wzfuv<{MQX>?<#VmaliIk4PAmb)rd+e3-!s`%A|r}&f-%J3PP^x@gRWsqLk literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiLevelDialog.class b/bin/main/net/minecraft/client/gui/GuiLevelDialog.class new file mode 100644 index 0000000000000000000000000000000000000000..792e3a5c4b87141a958c7e8b3837c1b4ac430266 GIT binary patch literal 2263 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 vSlUKH;Ni literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiNameLevel.class b/bin/main/net/minecraft/client/gui/GuiNameLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..60e99d4e00e6fc66a0b5544e38ef0236dd783338 GIT binary patch literal 3558 zcmb7GX;&NP6@Eq2oYT{fJ^cm!=x_ZA{Z{(ikpLO{;P&W9@B7}lbC>5n_rCha zfBy1U07voA508SDjOoP3t&Ew<>myD)Wm{&(iKh!z{8Yg@r;nSx=A>!+p(6sX)yz5(WNL zwvchmJl!0zGL~~p!QsgN;^#@@$!I^#CbEVZgco%h)*+<88;SM@P_Lk_Tl_THl6;dm zKU@t3&uj1_AiIqkGz4Y0S%VK%vTM{(U6O6nP=i1KO^m)Rh-U2YW4nUd)hTLd!A>S) z-YDqygo1FSBGB{0V`j?fj9v{OqJZ`{^s-Fn3gg3O{<1z?0xg@;?S4IP$+;|4ol%Rn zTGzy7xw1rAoz(N~rDbnv=}@q)&(TxY&+56dRlnd(N=Tv|8unqof|^t|0IF=n3NoNfX;*cLND_HL)zWhYPVFBBhvQ0f7#1S0x<0!Mw=F@R|YAkKXvpF-v zO_`w4eo67Xh6_?fuWlFtT%xIj zo=KUuJiDynHIQiDv`K`*kz};OO1Z$okJmK};3_?n`Qr-eBb9n(Z=&}Z4R7F0y0D3l zGwKpHSHFwxPM2Y=$LE*x3n_60MLkbjMuk)D3#dv9g&9W_~1_9~Xtz zwR@=qV`sEq95xDgmWDB0XP=Iz6f`}ZaA%ihOJ@+{$ojz{vF)j&VOdi{4mU_B!k)Lo1lT$aR-#XEi zIN9BE>eb}wGreceoxgDLQs3p*`mek`aP_73y&e1ZA2|5(p{Ct?4z~@q#$IgR-V%>Q zkM25t?Txo@9XTeUysP1}_#8`aWeoG?`4MS{WHjl==M^-po-|zr%Qj3lTQk0>;Y;{3 z-<#C!f+_FqeA?KlAnGy!XYf_&h_9`hRLkuU#0_6~2lX_ecp8{7}P>q^@Cke$pJ#3%1k6S(VQ7axjFJ zcQxF@`y~7b=hGzyVdmw|SYsmgR48_OvADP>o<7j zErIOCqeqX#)$cX@K@uuK>(WewT{Z6a{T{v^8s!%!o3f1fEX{JQx2cv#DJHZgwL)u3~qY-cJ0lfP;wq; z9^#w_SC+KYRa$j;Zzy!}F*WZ)^m*_%oS^E~BCZs1P5l^t^*&UhHMj!CX14|ngk&RO z*n|#j##L;=Ei}3SXl}B%%K%7<&%^U?O#5+Skq2hUxz7WOjns0M9h6GuJ};9KXC4>% zpo`ZF#I&ixxUX!y4#u*9L&Q@I)WilJpg|pCg;$%|PSAH$n5ik7sfURXzAS9{kPf9p zr*=KS;9YcaN#8@{F;F&_PXh0#QiLsQ5qZ&7XR%(6{BGit71)|xing+t5dsx;1KG_0 zI>?Gn#L>f@@P}ZD`*LWqYeRv-36Ls09U<~;5>w@H|HYP&=9p@%T|bLvdS&gdeSnQI z*$O%2tQtk!B%?#`Y$@XQ`%CFut9|7oG{!!~%z!8^;0yEk3N^l7#J5WwvG@OE#Q`?M zLH;*A%ugr!aEzfIchhPrg}I#86w~^yTd*ktAZ3;WH$rV`d$Y_GHiM$9aD|hml(cfO zJO^fDMf`w~-{CjRuk=AA^y3Bmq{#W4=gBBy?pi=d|j;+!8di?p*MB)}r%%%OOm4m?=+FBe}e AX8-^I literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiNewLevel.class b/bin/main/net/minecraft/client/gui/GuiNewLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..f8d8bc747d0ffda32d4e374af14c93b80120d554 GIT binary patch literal 3270 zcma)8TX!2*75+xou`_9%N$lK8tdu5^lqQPPrfsY`#&K|B>Nsg+Y}|73SUQ#`8Ee$h z$W97vffics*Fq^!9BwYq0EO5gbkW5dYw;I&;V19_uY_;UNU>#SB|K=(p1r@>=j^?| zy^sF>-#@<(pbyuRh-i4IqWs*PT~S5Pn(=c*$5s_TSFYQ+({+1PEsUsnLf7#S(S_&gmZx;=r+vf~WSY_`rK*C=8fX*b!y4j+Im>Z$9Og%(uE!T0 zM+iMrFDro_HP9~5M@6Ru`4|sy-tw%HUE>B%(8Yx7mTCg-HLwY~NKYCtuvw%N2JQ=` z4;i>WlujDx2&Gd7;z($?e}p_6tZ_Ju@ST%FREn3dF<=OJyP{#aOyQX3PT{GUK zCJ7Rox4a%wPfA7V$$3T$oW-byO+~ljd#*EL*L)Trq*vXyot$X$n{XZ%l6YFfeL-z* zTMQJWbn&92EH8%Q++Wa9|~AH!yTxnP(4SuuLvhck( z)s8WIN?0j1?%ec6(mtPgM#qd$LfWKP$E?Wg zlHQb#i_A^HXL)gG81$6ov#jjb#Gq9vDyN+Xtr~bvf;NJFJ6H8>w^EbcYX*GOxqDeL ziJj@;%*OqbSkSP2J;6`bZKtHXcFg07#QFTX!#8?7GcJhF7*-sw#~0(Aqeg z&^23!s>U99aq(FLpTp-#UEd9j8n&g^p0?qojfsE7z!&gE4Vy{vs$*Sgeqe6cA+O^# zrZ7xxiZr&0lAH6&n_(|0p7b8mA*4q>GcNmn)xg(;4-va0^!SE>Z{k~gohxcc-I?-d zo8y^5eh057@m&pj?l@gRd@W8{Icx1^-7S1 zpBeZ$enIZduwO5*`pQ!t^LpoelzBT1tpTz?OPnRA8{woXY9Zywy%oi+Tesu{zc%n2 zyhDtfV30Q){g;{*@4w4zZ`o!eGlG1{u>Y-rALFfX799J?dyrl|m-7BggTjpH{ z3(=fhhoxK4!_!51AGaYQLy}TN27It`d0hxw9}CGj|sze<*!GF-0M(hM z`k<%}i8@DhPty}MG4l~o9}`cH({?-?TSh(`T}Gcs{UQxy4=!Wy-QbiT=JPPG5b(-~ z@pLIh{WxPDWpo#r2bXt|Px}>KE-&&jd70P95Yb&>95{_Ld}Bly=9d!dM`#P8)%xj2 zqwPQ0>v-xW&hZwc@E*n{qZG#DPDiOkVKV8MAHRW5-h>swL=zHQ2kF=`WvUIR_D|vXg5__+Hav_@TwsDO zV>{l$4*U%}@h|Mczp*<=s}Uxwk=BUZ0bw%n50*!gd6k<#6}<^Bg1=(yJI`!Npo|uZFk`Eq$%HcngjR6n{PZ^|#^@EjXr7aL4%@SjDXd-bFqE zdyqyqFRm1W-it*%xF*o6jX<~IOZajasCJ;yBi9aI$5-@4Y@z$F^EbGHZ!h6>(IywM zuc7Vd+Q(m>zkwBeU({NFyd=ms(UlczY>Lml?^oFiOL$r=vBl8T7nm|)>RZBNVv09R z{eh`RO#MsPEvCdGwu-}nz;s+p1KCEkqmX7g!6pIrv3>Tl<_CiCk0Haq_*n*f5EJCU zG!DUI+r5Asub(4$gM;U7Jc@U4Y)x}ryWL#Z*jztkdVWODIuc!(ox65zXRC3@HP}&O z(qgoB^DsZ*`F?8tl22)|wE6a*@T=_Z2lm~-wbj~~0sIL*kCTeMJZ3)FIvcvVy>&OY b-W(9G8^5C@)2kc5$Ge=98veky2>$p#Cej-C literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiOptions.class b/bin/main/net/minecraft/client/gui/GuiOptions.class new file mode 100644 index 0000000000000000000000000000000000000000..0d680f7306a16d082d77bdae9971e9ee9285d0c0 GIT binary patch literal 2362 zcmah~TUQfT6#h;w1j1-0k&87*K~PD8q*i(b#R7%Kf~e3aDlJ21fWgUxP9~r}_fK^7 z#oCAVwQF%{OIM$}`iuI|Rr;OGBtp%?hnYE-y}z@+Z|}3`uYZ601Hg4Wk02n>XB%#| zXxc`>(N^7T!7>fo&8}6<>~zJP+jPy6U5+3maN#7w`GR8@wt%v!IrOhh`)A(lG$PPi zuDUOnu4M=$W;V1fEo*7^T6W%bOnZ$ck&+h*18$5ttrd-V!*yw1rhU_>X`Aj1fm;KO z?R|z`q$7=Oj$x+q0-=eLZbT78OhGGDf#5(Y-;4y~^QCHmK%0UHn&qfNK^RSPbXGwN zq5`oQN`1RhTrr#lZN;NoDri<-b4)q+7ens4Sr)k1IIiQ_A=}WF=3MnY?=luio!OJ; z_A0o5K1y6D*{)NvX3VlHpn4KlT+_n5puD?Y$S5qv0cx>{0oz6w4DWeaM$E)O{3JGZi76x@;2!xqMVUBL}W zCuUa@Hn&>84>#X%A3UL&F;3+tJmt$nLqk!FVYnHeGF6i$o3(yw-qi|EX0=T}?=h_) zZ`>WjSuHt5gV9|+xqiKaMpF3}Lf=yGIc8V@hAnG}-hw>Fa9hEgIy`4N87HU zH&LdkR6a^IOa&XV546kuNn=&3SnfD8y5^KBwl4Lu6ciyl<0{MGo?+{TV>nD}W96hM zQ%4L(f;c=plqY?yzyVuALY_3i9!ng(c1OleD3W7vM=ITKt-LytN)QzVt61}z$Te2Z z6j{%gDo(+eGG(8NQD49QhvaSIedP_}pCpKY>~b6hWZ$cP+3WZX(Six(`xIvd?o0dj z^gd3f6Y*V~NoRIB9o$9d&sDd#`0gMW=pG_ilUoDi|VMG z)&a!vHdOz>zu9sF-1{Lo`Xg?pchGZy{>3B*m%>&Y-|5NlW*jfpm${Nwn=JKgGW5JU z>rC$9%090BiuVJ!|BVpRsdERT-ya@$IAe>d?g6Q~98~?EF00CN;*)($c#bvGIR5;< zZ5%%>CnoEbl70}9{<*4>Dn*F%=Bk(_`KKiMlEO#{Iy_3g1OZ<7^GK2K6!-W;{|8|) zN|$MT=Bw~Kp`;2+nH}W5#RGn3RsAKp8B(X5g!XVJQ=5?YE*3nS7wF*f{R2E&Ow0X! zEbZYdxko}Tm_u&zY3Jgr_%Bg(kV%Bms?{jFkYQ4WnY?NA;Vv8ZWBxl{aapRTbBSCG zpGz3QOtOt4uqb^d6*37Cyf?jvbsqeL&lx_Kd2o>H)0Y+;*O5!7GS_Ot&03rj!5 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiSaveLevel.class b/bin/main/net/minecraft/client/gui/GuiSaveLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..478963fae961ea0f4b84a203ef0a6c1f36bac94c GIT binary patch literal 2320 zcmah~ZBrXn6n<_<$qQRrXekItL3s%QvKF-3rc^C`i-v-wrP5k;SuSDQ&2DD1LH+I@ z(Q&3&Rv>;>P6k5}06UeIQgRTmnfxu}4?KmTFDs)0u3UrpAS(}#WT3*Fm3IoTh z6a~(dnaRCIbyWrrtkuZOw=H+s3LLeLH1kI-7*gy#N1F@-k-&gnc3pJdU4K1D^pX0d4zIV>Jcy`)%7Dc&iY zKud0XSp!gdwR{O z*IetnNK=7KU52`_DA6y^kmj%8wz zsmVZfiwu-5w+!6I9f3sE78pFfzUKGZvzS2%pQiAMz`(KIo0bO3m}hz}1FOv4on#Ts7V1NU}cKtes z%~O1p!k2sfM?Fgmx4yMyEp&X(z}L$3OpSAe>as*01eQ$*?ac_PjpNBMBhY(j|4?+c zOY`tR2z8fj#G2xOIB^Q!BQ?4tvsj0t1bHTK^)-U*P3~wGMS%~_NJh+35!XN!tsDSx zx2a(t*GP8BZv?iUUjiKmUx9+Ee0C|v0ACQGmA^Qx`9H+O;7yBsDTG@5ycW^Pkg`xB>7)juFOmt3d!~8GEE+h#+LD+ZO9lJe` zY0SiKe`HFEh`E;87sxBW{d;~V`lspm&{lFA?|z>U{plb6`STD4b)X=$Xr6k>C(z5R z`}hX*bL#ez@r!K5K@Ddx3fbgrj%*7^6(m;`beOkn3uvk zvy1C1)aax6UEEk9mYeFcg}Xbr7ybHd@)aKPv+@Gzd47NKQuCL`6uagi&S7LQ!Y5-C zd5oce9O=nxoOuRgs3y)CLb2#2gCVTKCe8vau3&8+aW#dfNsU;>h*wC4Dybm_YZvP) sn&rMdmbYN`?O@{-p6^ST)fcA7Rzc&4YHX;9V~7E+(!GF3#|ilV0wqZ#4*&oF literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiScreen.class b/bin/main/net/minecraft/client/gui/GuiScreen.class new file mode 100644 index 0000000000000000000000000000000000000000..08040515f4d53b2ad46f6fff34513792d498bcd7 GIT binary patch literal 3857 zcmai0X?qjb6@JGWTedX@%SNm=VUH|aWY)x(#n@n@Vh4ha4WtbWnz1x6o^eJajMKfP zv`zOmZ3Ep%mq1(EEX6`3ZQ4)$(9eCIe(vvRpSJIrktOHBfWUL_+1oR`vz|WXr?a+YI(|A=w9>;xYb@)TrW1v#pyNsB6x2;;6>Jz; z^3dpl_C5vmvzFoK6(|`64SCbb<$VRQtn2umYmZn3zO{~A*01X6qHo!0S)tT2-L~D? zGX>MjI5S0_QO+ySrYLpVbPUroJq6D$ZCoN5T6B=w8V*>FMi ztJ@R0XUThIQT6jyLBW>Cds@YuZZ;d9J{x9$J|{Dop{|J-He+iPTL?+bLvc>SHayFS zawgG9Br{zhh_>$J(kCxnHnVao7i z)G-Z1h%-Y4)6Y0LecBvyvqk1zq3(E)RNLjwRTi4-&4sxQ+)Uzxh7pXC+tY5bV4m{K zLLrQUc%E-&Voqu}g%`; zSZE|tm1IpyUlExr8tg}9&WVhp!4;X7ip=q#|A^2l8axqd|A?W`CyAQ%bsS`Fdl>5p zbMBI>dqy?fSq;}DrdHNp5DrfSv54|lHGB%6rmG8^gL$0|i?uK)+n?3&Ik6pE*ru%5 z{DOu9I7qSLj6qZuIzh~J2>YPz2FyqZpN^VSdeQa=SOz)IEjoq-dqcxl@Kptke%=hS z{b+v{Zl-PXs%fW#6Md13_4SC{?&-NG4tztyH}Ng02ih3+bVII&(`+RQn%IuyCyc*< z?`ZfgzQ@&^ebg$14NzqdnrOo7_+b=3AUl_=JTK_p>2aaCZR;!t4L`ygblP$XzV2kn zg|4Mr&7-1y67?+&KgLf8TDX7A$+0slNIg+Wc!`8(`x@~xMv^ux&)+fQZ z1<5CcuvmqLU*cEnn9S$6dCf0+bRdyj)R4z~&vJ5oT^RxIEe&^Ym!!sgz5R_wMom*pJBUb3`|vQy|3W|v84(p zgc`0{ARSNXEdF8AiD8eqMK5a(S#k|7t2W0Sa$jL1X%(Tx2B>nuaK=#37>sN%996kn zgLmGn!8+3ER&d_Q6)hCTdOX877DnKhD89$D;@0lSKJ^YZrtV{PLVbu$b@(fi`|H=#b0xK| zqlE73s*+G;{~>x5y!pR>irGkDb|qsI;|*xXN*dkB`7W#qOdkr>S4`6o_AqXVWjFS6 zRu|0n;W_GxAdTm_rcz4`z1UB^ecb1V+keoYbaI0og2Li?o}vP6qC>rnHgQua;gF0a z9Ig2lLb8^c))ABrdiPA=*M?BI>Q{n(4Od_a{SwPWeFd$u7gnsk%_Rx8xAPXBiyXRx ztpZ7B6)|;j6VI1nFgFu;rtBE#tBbmBne>P>q8ufih-FDBQtv3Qh71|7Ip@ z+1$n)g7j=4L091r0Xxhr_A?hpIOBH~{|)0<;9tnS;}!o_v0lQONK;3Rdn)SsV)VRN z^?pS7NGtI&uHHmTs*JfZK2yTyYi=wH!=oD+(qUu~9Px^|3awkI>5Em(j|KGPA`J_G zD)`dV1y3&_7{~PmL1i!5FPXR-5zzVn%YVbFNQ9FKLBH*5ZLgK_^*eYi9y?XWx8t#k ze7=Y8kH%a66$;#J`)LV3FXPu5e`WlpyM*6&x4l!syWKHSaU&KEZTFoL=DS7njc`4f zayfWgyd6kP+~877L}K!jNeK^Y5c6Y~exG3>Ot7&|GS0KufOD+e^XSG)=pj)D$hiz& z#wahmFiN=as_`5PJQ@)v4<|F literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/GuiSmallButton.class b/bin/main/net/minecraft/client/gui/GuiSmallButton.class new file mode 100644 index 0000000000000000000000000000000000000000..0752724f8671d7a5222f3d140e090bfa003cc564 GIT binary patch literal 492 zcmaJ-%TB{E5FD4Zflx?ayy3zH$^om;TY&>ephyvypx)hJf~&-lg40joKR6+A-~;$5 z#9HA1LUb+d&aTJ1v;O#edk1ii4Hq?r11$~Dl$LQJ9t@9DCAHy6srXH)qD-XeWob;V zT{sN;^T-vCp>d|PG8YV+hd~g8Q!x`f6*}RODU?n|{V{`cmETJb3s`ER4v%5ma{pud zA?dp zd r6hV|#deS5`tms&wiZ!23i<()~CS=(@I)v;vA6@j|(ES=^HLQOD7?yEV literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/ScaledResolution.class b/bin/main/net/minecraft/client/gui/ScaledResolution.class new file mode 100644 index 0000000000000000000000000000000000000000..63cb86b0c21b616bc680bac770e94d1944ac74ff GIT binary patch literal 725 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/container/GuiCrafting.class b/bin/main/net/minecraft/client/gui/container/GuiCrafting.class new file mode 100644 index 0000000000000000000000000000000000000000..54aeff2e4cc09d8bd4f063cc72ccf2f4ed44b40f GIT binary patch literal 3909 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/container/InventoryCraftResult.class b/bin/main/net/minecraft/client/gui/container/InventoryCraftResult.class new file mode 100644 index 0000000000000000000000000000000000000000..21a533f89092c5d6c02e1d66740ecb0303d22bce GIT binary patch literal 1355 zcmb7DU279T6g{(9^VK9x(i$6MwY9NLV(ZfSAX2}eAgsg+uJpyH?RJe@lZ|XP1;wA_ zLj^?;^w9@@lz3)#-Nsn35@u#+=ALuUJ$Lfs=a+8)?&5j|n!qjJ4UK{4yG~%g2o0z2 zxqfK$#-8B}{m|w`V3__94~M~<9U1e~9gX{82D(7`&_1$_zU}vnC;Nx4!_&0D;-8c~ zd*B*o!XYp-3T@|AL?h6A-aRGW3*CWXaEjfmEx#C!p^P58OObC>D@I zK7(0-<$v=;K_Y_sE04Tk-+UKk!SXa z(#t(Jw7j?Ogas_Z6e!6HS)b`!{b4Au+A`ZyiIjVPxuGA~!KQ#9NuDHR-lfX|^R0IG zq$gGwcz$m?i!1c+x8KDBwpwMCngrHb=6@vJqV>#uQ()yxLW?TXWBYY%=fX&-jh>S% zdWWx!J6cR3XP}hLuSF%tB+|gHH}L3R-WrYr$9?F@cGeTWC!XyM=?*se4pJQFI5hbj z_=m{wn=gs;40rc=F1QvupHb-OUs3vm@&_JhsB$h54y2(IR^U3vT_FNs9_P8MpoR-E z**aHArs?nHtQgYjBtL=F666BvF>;&H8Znv9N0b{|$5ZfMRW?bLWvV8lD`+MCNz5rfm~K$>6mtaH6rrK>3y;VW@c;k- literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/container/InventoryCrafting.class b/bin/main/net/minecraft/client/gui/container/InventoryCrafting.class new file mode 100644 index 0000000000000000000000000000000000000000..b7ca1f272b15c7bc79ff469b212ee0f169a057f9 GIT binary patch literal 1828 zcmb7E-%k@+7(KTw42%P%xKxE!K~URDodpqfQDeepwXtGiwfnG7LzyjC+o_ojB>pu_@!UH<&@PGi(EDq?@7(i!=iGk$^6p;%*Kxx@N?^rv1G_6d zx8*y32X?C?T`#cPJJN3TyujfH->!MPJnZ@Ztg9I5wGCthCLTGvj@@y*wta8&k=qIk z3=0&$$7?%X*RCZ10;B!FX+5sXeju>$SN(u!8Ms}$#-X7i*9698eE*+vE7%qgH37?2 zoNhbbR>$=PmIjaxtmD>>T#t()?(j9~$>4^-YU!u5YqfGyAhX`va!sU>voMB9fpn?d z9EHFy7Dizj$P3K*MN!lBMP~Iz38wwp1$* zT&*SlpNJ+i3AaH%usx-6ecwHez^A9yMo<GXiG+Nk@k55tu&& zQ`V^KyX!oO)I8qTT?${D>ag-FcT||=9|BUjG9R`&0tug6S5hpq(cAG`?jKUQDW8ZN zS9L*2f+cz|&EF8mlrkm%EKh{M8qjZ3B8&ngOpy)am6Qx z)0mGK*ql|=kh=8+7b!vl!}@SiLx(U!5p)gzG3(qkfZo)Is;O@j5 z*wvTeap4VC_QRjS)W_e13B@L@JF=|hJ4rcb+4wm!In7SYlg9$8EaeJ|`5h(P;mLh0 z;sI>Ud_{}aOv-OY$e_o;6F3}^an#gRJk`T!zM6x7unM86}OMHPXL?P&BG8_2>jSS zmVw`l-0x$%*_M6~+pVs&n_&>Uyol`mb{OYj3Y1>Dr>@<0gO>fx;Y+_63luuMbOO&m z6A+GodGKtDRiacT|n+73N`02vHh7{Z7^rdn$hAn<{OL0C$wSSVmX zX}2t7kyF}j3;9Hwv~UACf#M!p`>cC>=ttkWhizYAWG`&G?S>mkbxw_Dd?eYyWDyU zONvwW2kFH}D$TM5TU*Zd<&VCytXR0OEV(0JwvJ+DTD9;{JDn>hqS}w$=BuyWlazZY z44%v8tM1886do&b0)w*S#Qt%^ZA(vJzJJPkXp#=L^3v(nYcB-u^|kLhKY<%3-B`!G zZ|24zw(w;hUkFTH?O5OTSa^iT+=q_Or;w98rr* znPbEdZt`2?=_eT4Yo`7iO7+DaM(ayGl1$w$-)ZItGnmX# zV2+z8VU$(JS>X<~Y2I!nIeDJp3H;8ow$R#LqA|2~k6sG<3_hf0YHg01;xdng6ye|W z$@1=?{syCOP))=~UbelJs2?Zd0WE9h#FV!&SvI}R30lWZ?`PDsRw^Bs2ftu)lI96z z9?@EA&YG_?uUR9b8CG49?%v48-4|k~fgc5PciFaXy?6nx=de(o)>UX&X~0a0nov639~EK&l)#v2{!^BzEOGQTq>& z_yyd!^}+?IfW!g8l^=zewL_{#RWV-4GoGFI=I!jRfBpXU9l%}G6(kr|T{|%Pj%!;! ze;F87&#~RW=nfpi^4x&agm1KZUhu&0d%gmhVL2v(A3uD1UvrMJ^y z$g7w_lA+L~wmu#7w{3rmZ}+G>(@oFfy*Bq9@jVL4!7FE%p&n=H<1K2?l7`%0XIPJe zJJ#a}dObe$s09)9218|{>SW)e#Er<@jLfab+-Ar+yJleb+q~y=7?vitA|!Jt!4O%k zfLm`G`tuCtaYexb!@}`Xbwav|MOzJxGv%HNSI9w zf5?=dI5AJ7i5TsuVW0~GlHDd_;R^pO&!P--%iPz)tTBDAqYjS5w1UZ?CN sq>6N((OeBHqmmoMAr_D+7DNGM?}gxvS`hKhguH5$HR7e8WSF(~2ZY^Jo&W#< literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/gui/container/SlotCrafting.class b/bin/main/net/minecraft/client/gui/container/SlotCrafting.class new file mode 100644 index 0000000000000000000000000000000000000000..188fc382332bb21a218b64bb9117bc7754482579 GIT binary patch literal 1352 zcmb_bOK;Oa5dOx_gCBB9LURtvdF z{1HxExFCU0IB?{^PvEy8V0Il)8%2-o@Uo_ne$ro&Os}>1&f1~n{ zFxQvNpnHU|z`rNm{m#L57_?Pt1hZVJXK@j8Xt_c|M{Xifv~ii2LmGqs=- zy56=_BT+cs(v>ITNMMy`$mD;S=S2+?YbNVyoZ@wacQ5!X&9YEkTsBL|QtBfz)uj)} zz2idzd0s~~Kn7WU$6)aX+=-n~U|97OP{cSxDy_tjhSnxnQ{)Al!6Xt|n_?}gwX>|H z*fx!Gy3*7ybxJycblU%NCAjbd{3!9v zq_}XS3j;al%;Vg9?tFZ{y%W(Ht%u|>ZE9(vq0%zW#FL5QL`jW}v?r73#^R+I$&h@e z`an!XlnC9A?z#gR8>Zr^(#o7O6`I=}CjSbC3KgharGSb|wKfXhj)z^DJ&JB3ndaMR zERv4MlwD6ZeeSr(7Es7ckSH%24PCP8v)r)2Mn=_zzhy{Ua9l~;ZX%> zkL}eNU^Tx0p2Z5KsRp#>K7Pym(-=78b$&QCT5Fvet{5H?%5&uwplmXxMJV5?C8)ru UWhfhF<@ctge{Z^q2p+9{0kBA4-T(jq literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelBiped.class b/bin/main/net/minecraft/client/model/ModelBiped.class new file mode 100644 index 0000000000000000000000000000000000000000..b39e83e7069be8efc30049d571ffa0ff33767e34 GIT binary patch literal 2378 zcma)6OK%%h6#i~9w)2<}clt<6Uuhh-j+@3bvD=zFojOij+|s7SG$|Cu@gy1JM>TN^ zWka`>kdV4!$p#6rt7zH^B-%=>p!@-l5E~XqEZ8A7i0|GR$4OWeMe;fK-0ytnoco>3 z_y2tTEr4;<0%#EkSFL)iVppvt$6T(*mddtOWuR8H%CYnEciO&T6$8)&`dyxC}>_EPqW%_ma;Mbns0kmfnS)w931`rkSo5kXE?E`@h_K?YDvus4(59&C9 zA%WnURiCfb&AMHyUaZ;GI#VRlWqw6RfXtI5m4!xhw8=u=@s!Rek5jDs^fMRos?PHM zc2*eExov!Wf5mp38if^$+LJqkPI=I29i2>1FK)OTCn( z7|K!wS|2mGpZx9SDUKF;fIr*LaGTCkJ99kd|Ahah&*(_IvHV-HV~!SEO+*^k5q zq9IcBY^T`CqPrBu9v9|O$Pr$~ev-71Y@bUee&fb)JTV)6gagrUaA={m^$~j45sE%Q z$Os!pjc~9{{)Hamn2dFHc0R;$1r7GP*cjunEm-4Z!G*^*!-K(~;vOb`*a&wTaT4nR zk9l}AG~z)MgeHvBM%;)8n$U!CrmNXS1Dhl^sjXvFT4QosPSTia=CpeBDMC|5oSkf9 zXTUhSLEnI;2~B(K>Fp`$E;pko#xkE6)J{VWc3>~UJjW=&I3>7(1GtWZsBn8f!eQJ+ zFFxg_eThEs+$Iik>zk9+8ph$XA_=HdN$?Rv}a?|HU~b+ zO#)7GafjK|2uF-_j06U8ir#6A;SAD9s)py>1{w`xrqM7xw_&!23v6Bf>&@VGdYbYs z((@_r5Cue&>N+kf->3XMeYvWk2e|Csc&Ge2AJ z!eddP}mX~wyU6WppvN-~8kQn-d`?%`SP zVH)@N)L&45XWW*b_^f{-EBrXuluQH~lF@TNCVcLOWb{1A=y{US^CY9!kgP%hTTuNM DC?(Am literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelCreeper.class b/bin/main/net/minecraft/client/model/ModelCreeper.class new file mode 100644 index 0000000000000000000000000000000000000000..2a1f509d85d9661a13438977a6ea7b47cd5349fe GIT binary patch literal 1818 zcma)6T~ixX7=8}fBoLO8Y)jLWS}24j*%CqsRBEAoX(S32p{DJPGfQ$T`5ZO3wI?bcSi)^hlsqI=~hbc9)ciIvr9X&t@l zH2?92&TL3qVM(<+rL%HKMbkR^y=X>B(-PlqIuf#7cLe%W+ivF(w(y3I+n5)Kozl0`deoE$O8uga*Fj&jG=&nL zST;QrMK4r7GNXJX&_@Mx9^BMc<TT^$?U8xOQ4^Q)l< z-oyK0Yzd4h+qdMQ!>Ko|!_VgC=W_d&vzOcCvM!sv$~v~O!>dzib0VtIqPFy1p`b07 z2LGU^JMG7IMHXvnma)^Hz*OCOVj<5N1n3jL9(6+)^(ZS{q=zojJQwMji}cJzIz|kz z0&gkTK|nmG^MZKGe2S>~9LB>y;3+N~A#Q$;xREd}8;NMI`t=`USmpYS5r(5KH#+K( zliWz2CL7m1cJd{5G#Yhlr$|p3iGCx)!g|=RoI1@7_*9cr)5wq-j)po+CX7jAq|-%* zn>U3jX3J{*U^|F(L*qDu!`QOkzyTV;r-r zu6t%-4mbG}<87b!jKoj824UtF&GFem*Xu8&Uv-b3rt~}=nxWtVrOe_!MbpNk0zNg)~u_oZERO=->A`d*w!Jn#TM6k!_l z%w^{LW+&gy{O*5t0PZpH;RuGgE~B-{bz;?P86}y~IfWwCSv0Hh$-Mb+1>;l3=Srov z`qZhwyEC~d9|Vojcqwonc_=^w?GQ}_g63#CsULbVKb}|Xm9`7D%Cz7-E)tb3l{NML zC%Wak`4U{jry?-xtsrxZ8J z%;SR~x&)GS>11}Qby>EpkDN@oR+V)o8WmZ~tg7|)o>j5;9?D7(nn3(G`l7Wf1+*<` zRRmHi$I;hiy&`RCU*(z2MrEH+lMk{UOnZ>?U`8M?SFKl_YXbg6v5+h=zr+?p@WIfb zBP!raBuhc`2_*jSn?o?suTGzI%NCQR9taHR@FSodeF|t#DVJgm=@`Ztc41X2i;a&3 zLWx45P%Nrew4)=BbWX=8#srLA>8v*#%c(Z%YmI8%;WsY~@fNm=}rCVx4ZQRoFPUpsb zZQ)tuxweq{qCbQ?csGc<0;B3KtjT?cR@AKhPi8OAW_B!RE3?XFS=Js(TSp1^czwzZ zilcffXba!wa$3F^c}}D6H1_PWEL4@OeXo8N>22$gg>xL-N7DjCUK~b3IqV`0b&>wL zNaI|jZA2fLI(oUj#zWuGe%29ZQcn;`{Rnfz=X-(^2Z*Jv6U>&UFG)IM3k{e0|bwa@l)nt4TI=g?nt0k=LY( z-egW)&3P0UX>RluBflFhGg8v=lWh+32ia;EM-33u%wqijH{ICp#;a-|bL{{sNRFAe zx4*}_d4D^;?WNKxWo~S~n$7-eHrH{yQ-djLaDjHE`GI9P`$gPD79V1orsiJKz-epX dv^8+r8aQnYoVErIS{gX;G!S@?Q+MJ0zX9^xVT%9& literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelRenderer.class b/bin/main/net/minecraft/client/model/ModelRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..aa0aeba98b72f2e9a9f1e9c5d983815ac79211fe GIT binary patch literal 4864 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelSkeleton.class b/bin/main/net/minecraft/client/model/ModelSkeleton.class new file mode 100644 index 0000000000000000000000000000000000000000..36f8bcac7e6cec62108d3f49f6bfa80337af3e6a GIT binary patch literal 918 zcma)4*>2N76g`vJNt28lNxv%vL++l8rGCJWb?Y4l;}J;}kwt;SL@tlg z5i++$910~=5k*)jZ<@h$eZSr*fWhWC28Y4w%2y(6%k>StsQL_E>#!Qfy7R`5w}7!n z-AGfMx*r`HdP8m=r8(nq&y)YeU5 z;B|mGsya*E1N~_<$WhGG#>Et^fM4D&ro3+`uGp?^?}Bfm?0rGmsW``-ifMDRw1X3a zlQR}A&rV{ibW=69aXI}T;8dNN|D5bdzDCfRQz=cT*C<>4pZpl=5!4&0d;2M#HDr7y z7a825xCEP`L7#~VIh`S=x5?*2n%!fX> Pok4@xY2W53W^m^(!7j_o literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelSpider.class b/bin/main/net/minecraft/client/model/ModelSpider.class new file mode 100644 index 0000000000000000000000000000000000000000..e619ac4adf4f478590b0ff5d4bcfa6cefad1bf86 GIT binary patch literal 3033 zcma)8OKcle6g|%w+etd5?$F|vekdd@iPJW2lg2Tw<2XXtXLocHmc6N}J6-FZDiysl6P1Ej>K>KnvGc`(R}I5bXulnH z$X)OhS{L*y!=77Eh>hItrK4V%3wYJk@|#DzsdLN0P^EBjIT-O~_B96k8-t$4ptmtN z&=~YJ28qU?Umcl`LC z`MCo&cN4M(P1tW^jnDFc4cqq)+F0v*12*pPy+Ir6d~e7`1R;fWBNWt;3-gm+^|(7( zq9&Y?%9L9gcdJE-P135(78lsi+e*aOAO#YtYOyG^$YJ$)TX~qnHXgyS!up1;WXm%p zZ$Y{{YU5!X;m7P?duSHjDn+DnzDo&7hT;)J*@&TF#PnH1-rgTu$Z^ufDU2!DRcX4X z$xlh)2^(it7EW5%^6P$(>Qgq(uB@K6GOSwHHhi_)%E)8jD~4alBNKadV=HDc7e-Ox zJ`viOcd^D#TyifyccA}3_q%nD z;9KAPER=*UXy`(*+=>f$CX7XeJLcR)x4Yz)XEdpeXEny16goD5;~|EFAtp&-9;;la zPISC&}NXx)q>)i+zF(vCnYVsmPA-C)jiqTVhwR#o5N+_DHk*)_jb6B)7(C zbJ{<~PK|DA(%?=OI-Pd;MMCm3;7)?+8f?VY;4Xr@oIPaT8)+r8ZNOc^++9aU9G^N) zbllnR^f*0{NHA!yalYNQb|to#*j_>Y3)}1T{RcKdY+@B}LU`?!yh&n{t9X;by9%2k zHnoa3CA`a>sGluOYP*v zQxUYQ?bxZ}*rg8Qes!3a?HP2cS;W*Ly3{M!t=_~Q^&a-BE9h1?5Le$}pZW>=)vxHm zL)?w+OA?2WW3--^&#*67{Ka7iGv~$H+IL2+XprsC^Q>EFM`$~Z?J_oQY_G8iW0S_F zj7=MxF*YmqR+IX8X9IoQSc2{8XA6>O#{<}n6nb%xzce>KfDyLsI0kv4Wl_M8KFqMc zVRIO69gkv64oL4YdI9Ynr6+UmvFT&{7~&nL7u4S4^g?U|?`XdfO?jeQIltTF@KMVd zFJHw8?FY4gntt4Q@+v0i^g6EZB%Dd#Njg)$ld5OZ^-QMzR<{0DTpS_qm6A9Kr{FtD z$Mc<3-AUI=nn%Ez=R}(`J-2pl2{X?8++zD&&X1k)KF zvfMo8)-bKVY9ypOOlf+HBk2|mwKphXIHSYt4_n^)K7Bir_{?R zs5juL%a~RlVn%(AS@kvlM1PMt^$X6aKT!$I9KB}l^mm?aO#dtQ0(%p{i~j)CjEXh@ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/model/ModelZombie.class b/bin/main/net/minecraft/client/model/ModelZombie.class new file mode 100644 index 0000000000000000000000000000000000000000..6ecfc02e524f72066c88d980e9f7f29f91e6673a GIT binary patch literal 1156 zcmah{-A)rx5dKctQd$;)6>L!yp%mJpRDKF56ar$yMKOq`5$?9-6t=dzWV?{ym0tP? zwbwmkI<>&3fe=sitYfq1O~YFnmlkUbFHEuyiCueQ&rvBNv)Dtk(FI(tGI?R z?NT#L+9jS%WP=dsQE?qN1lkI`^SZIU<1E@$f#jvru1j-E+R~m4;wJh6xJ4^ow&9-~ z6}QnZpxV5obXVLI5bi`#6@xsH>Q0oCB_2r0eEs@OS?H-Ba<{mO#Krs#<>Tk}?;O3O z;_k)hb7i4kKUC(qO6K&*PiAgh#e~a9(W)t#97oD6aoY_zQJ>*yzbo9G_}e1zziAsHYmMOu*dCr{Aw)(wY9a+sWGC8;*B ziZ-%3`Pk&4Wbv9L7dcBt2V-F+><>4epriE^+A@nr$s+w2qKIS`iP`qB58`e%S6s9(UYflFNmsF z^r}wheTOc5LN|WUf6tVzc(hR#Q%VFwg+f~>(1jL!tF%D7C@bL02bC|9CL}~nBpds2yNn zX(EX~z#nBiv$HJ$6RT~q_s-3o^V~TzKYxAy0pKMz(-;$Y)RB>W>UX3Ux*sFkYx}ap zLhwPh?YBYKkNlu>D9@u_C>CweXnaf(%ad4P6=u$)dA$afN1<#ZVF7i@H>9AOGK@qesxE{c*P0Rm=P$C zVr4Lm*&H&Mqm)vpI~fQRRLK-ruZ^BoGxG2>e4CBs9v)s_PD2Z86d9XIsVIw=~_ zvELQgz9Bo>S(;*;x#5-$+dAy%@K}c@WOikgT*$yWfu}rI{r`c=hx^Kh6@h0refWog zwU;SWmBy+-s#bTVsJWiQI3`q9&moOTm2KoOg-LT>%tZ{ zrT9`)j8tPLlvW(6#AvXRL6+YfS6%j~u7Y)m>1L(6+DE=<6vz9R|H|?h7WmCDf?MXf zWs%vg-hv`ZTyZm&C@tb_nVIS?;1)AAN&&Z-8F6-p**NBK7x$6@_PJJF*-MC~RjKw- z{=%gOPsF167+ThCLuhsg%|b)R)SV=<0TmRoX!TLCHojr)0&70Pj(((;WYKhPk5Ne@^B1Nhcm5)}waI&2ZxN_E#<3v4j z>ickjN*s6ql)eIwQgzmL`oSR*wPo+j?#%fAoAIBMU%vsoMa@8gVOff#(F>&TW4D_$ z{4fxbHlmIQ8++m)8N{OVao~0gaE94^cjz`kSAJ={_x6RKFjR&jPQ<~7s2?OjB>N0& zpW72^jsx@BPMW>JP<#`}AlYPiRl7od-C^MGNVEwJQ)L(^GibHCQv$So@ce&UTgE-yC(^!1a?#@ns8+XH6EVl3{|-y>HW}D< zhQ5|9FS6w&gSi_GVqdfZ)#SO0&3dN(AgmItMsQR@jfSiO-2_j5iM&?o1Ln#RJ@yYw ze@|m7^qxsGi{KPrqKsMEo2Ph+#vCkKm35t}s_F)AO7Z!TsB-lYTG*3S;AdX~~nQ;K%+yx66qbKMK+*QbbAjbs|H viR2S1=n;Wp*v!O6ypINri2oY$Won?cuW>gttVvZMER7w0+vq!O!4h* literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/player/EntityPlayerSP.class b/bin/main/net/minecraft/client/player/EntityPlayerSP.class new file mode 100644 index 0000000000000000000000000000000000000000..c4ea422bf7c3f70586e51089edec5a69a30ec44b GIT binary patch literal 5607 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 T_UkJ8_3sp|;2#v4gMa=H%og94 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/player/MovementInput.class b/bin/main/net/minecraft/client/player/MovementInput.class new file mode 100644 index 0000000000000000000000000000000000000000..5c8a5eb220ccd96ce9e899cfd99b6b80bd645ff8 GIT binary patch literal 731 zcma)(OK;Oa6ot=?-Gn4=L*J#)7ppdvuwct;ffOksv`9f+bT@GZ>eP>DIu7d3Vo@Qn z;0N%d5NDjIv;wJ><(Yf#_}sbQ^{?MQegb%nr!`ar2bs2E8fQ8(>az`_B-WV?$BDYs zCj5|3bV}XL#)YlH7d#xPi3$^yeF={TBOO^mBjs0pOS=|GN6>VMPHw&`GZgrvA|3PK zR8V~tXR&=F@b(W*c=9eE>IOV41ZbdH2g?VTL)Aq~0cz7|CBOsJ1+5;tJSx(GHlNfW z;blv`JW|PtGO^RMq;JpS3&COU-e4~UtHpSzto~SHJL ziFa!_g1Pb_?5OM}i%K Lxl!!WUcufUC{=w~ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/player/MovementInputFromOptions.class b/bin/main/net/minecraft/client/player/MovementInputFromOptions.class new file mode 100644 index 0000000000000000000000000000000000000000..2fc9ac16b19b86333146c760f56b276241535d58 GIT binary patch literal 1587 zcma)6O>Y}j6g|%#+t_}IlPL{_#H4L#noJ;0lTvW=K}kwbz=bM_EK#6hGI>d+i9a+M z2W8KnKx|;e8YvMHLTuRaS6H&GfOBWYwJSwxXQc7F=iU3xxo7V9uYZ601Hdvq$|0q2 zyJ^Bo!*3cdaQDKBcjTL9SZN=*rzWU8Xq}h_$OZ#9o|uoR|Wx>8}d zk(~6YIo%4~&>SnIzI>#h_uYosGGXX9_lZr^E2>tP?l5rEtYNFy0|uS#Jf;xvh|y+IS=)M^VmUOySxKt?()cQ-C&oM7mFmTq|y1sJg#9PhwBRC7qawHHQvGvg&aA=Qw6ml5^riu33oB! zUUj`g!5xj6e!OP(Lc!nBm=#*Y)XJ!HhT${3afYiuB9rdMlW}ZymeT|z@Pfo1% zSx=8ycZ0pK1J*7?ZheK@c$a*4h!&B33R{(Ui81eyIyTm0g4i>XUiujWqH{F8{hd;y zLxrFI`==*3HrL@xnxVN4iD&!F9Z7_w*hVZwNck`N6d9E#;rq`B|0JR4be-Zks`6MC z*7U;nr2pa!%X%k)tRA$NK$$L7m8_~1W_u8`s*Yf}g>&5NX`iQJaMUuira*Hp(U>wl qn53*ZPJ0zgSmS8dXnCEhZ*V{AO~*o$-lU@}tg>y}#Mc<5aQ}Z;*-yp* literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/EntityRenderer.class b/bin/main/net/minecraft/client/render/EntityRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..6c0bc4b981aabe23631642a0f328a8f913789f41 GIT binary patch literal 16944 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/EntitySorter.class b/bin/main/net/minecraft/client/render/EntitySorter.class new file mode 100644 index 0000000000000000000000000000000000000000..c26e92a6afae6c5d57f55f55bda05294c2ff4874 GIT binary patch literal 983 zcmb7CO-~b16g_V`WoRk1MHEo{7U_pNfUc+#6C#O8MPmuBAJbV77O3pW1L+1b?72^O_mpQGj0wyn)uHhNcO&W#q?RVq0%LAl4?jK=d@Tb152UFvE;IoMl&v^UZA5^8 zI6rS^!P|FmtoN|(k3{F#1Jtm2PI2Ng6)TLYiSByZ@sDnUx|gU&6?;5O literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/ImageBufferDownload.class b/bin/main/net/minecraft/client/render/ImageBufferDownload.class new file mode 100644 index 0000000000000000000000000000000000000000..c86051aedc149e09bfa399c2036c80fdbf20270d GIT binary patch literal 2129 zcmb7EO>Yxd6g|&ld&c%aCV_#3IN;C%wi99u#eA5gPWT9J18E5)K)PUJPm+P)q~i%} zT12I^>Y@@^R^6qWY}*Qq)T&k2U3O7b{Q*^fKvz{&_q>_J;iE#TCBJvyefQmW&bjx^ zPyc-T1Asx?P!STy)od?!*QwbR*P8Wml?BJHc{$gvRc$v{zH80dBg?b1wtH^zer;jV zs;USJ7`Lr^R&K$n&E>{tZrc@4Am+%}bCzcbgr>^^ao;iJRK0ltK}W)OT(q6JdB#W2 zI5o!`5>V2aNrCX$#i|{Lg6%ruNC>oz5!2=6yEC?X)tXtb1vvNY4rVAymQ<9H1R zRJ<C+paO@eH0kLxVMP|N#e1_88v)y9mro1AfBP$D|R-O9N zVx7h6Lcfl~7+`+FykgZo+ZE`27NjGU%T2kCCu{Qt|$X`a+HUE<`rSiGg+hb1ZLJqJ;Cnp z&~+pGn5)Ow9eIlGOZ^S(y?nS&QA7j#rw%ue&eGM_K<-BzZ{Wle6tjwAqzt2hLFQ15 zl96g)II9>&U=H?w#alv<$OZ@<*iM9P#9*L@xb_oSA93Y~tOOHpVHd7pH*TTRXOIn0 zZZIHToWpr?=;3&Q{}3~jFp7)5Y;2o=pZJsKw(+)ABUOkPr9xCGs5G_g>6obvCe7#? zVoD*tjzLo`B-WAXiaka#X(r@s&fgj+=%#LTe$bAGUm_Nkkvmor!c3TvwdOA?A+g^4 z-i&{Nqekk?Iu0s>>*%Cx#qOjOaQ@bN10CfDXYDyUH z(kjv9!||1fFe7Got@*pGQO{cQ*R2xm@e>SFgb@NiONt{b#W1Oi`qB;s7qq0!x1`Ot jq|LXa&2LDnAw_95W|aaY5RUu}g7}LX3QW-z!u5XvjM%9> literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/ItemRenderer.class b/bin/main/net/minecraft/client/render/ItemRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..2de8916dfbaf78449794a918b001a9fb85d773b4 GIT binary patch literal 7974 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 yks?*B^1j?lW-x660AS954MMc0-a6x^H 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/RenderEngine.class b/bin/main/net/minecraft/client/render/RenderEngine.class new file mode 100644 index 0000000000000000000000000000000000000000..e2e5ffecc7bf6505e9283f6335afb0b365089d59 GIT binary patch literal 7021 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 E3uWL3Pyhe` literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/RenderGlobal.class b/bin/main/net/minecraft/client/render/RenderGlobal.class new file mode 100644 index 0000000000000000000000000000000000000000..2101a93da1f984b288f340395be4ce3fb6563fb8 GIT binary patch literal 21531 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 H%H{umNdU~$ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/RenderSorter.class b/bin/main/net/minecraft/client/render/RenderSorter.class new file mode 100644 index 0000000000000000000000000000000000000000..53c903a2865b75372d48a3f102e581d15f9955e9 GIT binary patch literal 1113 zcmb7CTTc@~6#izr?X+c~+$t17#T&hV3y3^WHAX@cV#S6MOnjSeM_g=oaXKa8kC~+6=Ae7L)Vn{bc zM{ao9)kh3=wLj6GXiJ+?(W8CP5=WFRg4RN#%#gV2dal0Du$=!--@-0~x$ZY*8Ziu7 zNMVQ}mM`q4KrL9{NHS!q)bv)j-H>WWG+L5jwCX#ewJVex*u6_rzi>MY#Zx8xn`h^lBgataC#pZwQ(v{3(O9HPVG_LSFeLyT#>rF#axjiq VxF$J*#VB|x_keyHN(3}8{~K}z07n1- literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/Tessellator.class b/bin/main/net/minecraft/client/render/Tessellator.class new file mode 100644 index 0000000000000000000000000000000000000000..871f6ace5d5938bf629fa7c3e9e5018e0baae25f GIT binary patch literal 6044 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 Wg)|7>)n{Wx!{=Sp{*sa*eDx2{k@Wol literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/ThreadDownloadImageData.class b/bin/main/net/minecraft/client/render/ThreadDownloadImageData.class new file mode 100644 index 0000000000000000000000000000000000000000..4c4d65d8d6df9a39c9079686db20d19e99983af3 GIT binary patch literal 950 zcmb_b%Wl&^6g@YOnk1$zZGlosNoj$^Agq8`1z3=(Ql+RYQbmH@#F?b7>~S?2w@7>y zi%CN6{@2{rcL4bEg>2<6beAnbIrn7A~4=JDUA zqmk4yM`#n4wY0VhWG6`#XVMX&X5>ecYI!VT#@LuyJ!#VOP7tK&Me}46(wo*1E-f|V{G!EqW7 zq&^XYhXl{N2jnYh22)$HOoctTSYtL3cS`&jIlOdu%Z@ T_VJL*S?v)XGYX->RsqdlJ-PgT literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/WorldRenderer.class b/bin/main/net/minecraft/client/render/WorldRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..c174adc8c3296a3aab7b1c85b5a099c96fd23f62 GIT binary patch literal 4762 zcmb7IdvH|M8UNkQCi}Wc2;qX11XJXZY|sTlRx|-5gpgn$JVFq#Wp8$Gc5iaCyX*r9 zD)kXlYt>f!6zc=~NFQn|vJjP8?ZdXTw)XW;|8u4@ohdW@qtnjRPL=-7IZH^=NbL^y ze&0FwJLh{p!iD!=c@4mN{J{g4hK8h-3k};zE1EF}a-pbWTghA~VmgAVYRE7f0xMR9Ry;n$iS$Q;(PYz}GrekK#ifM4CQ`y@T*ss6=4Zf^> z+}dZyatRH7fp=PVJVD;_L%Wq0A9Oq0mF&pmv$;%um}2oX?S$3>~GN(ut9*9nFR|9ka8W z96O%0Vr^~0V(N-EClwtc*O_Oh+egW(XnEFWXZ!4|-S1c$7TVc;rk$eKpoK&dsTq<-;MIy~?SEUaTLss*-A$2=GUyIIF#RC~~>q5f*xO*OI~E!ZIL z->Bib|0z^MpWw4eM-6HPwpm9h$^^DWhpr^ss-s+CT{Ba{M`1lWDiyX% z$9#qD(Xl{bdv#m`uOIuc-vj2v5~0veYb2LS?sUwNAM0p(b;E0CnuND`q zoOW&`q{5>sXASE(29aGVgL?)BDCwq6ZEd_~)=-(f1PJ2|;SL>l3T-LfmSjvwCw5Qh z_=Hf%D|UE)Vy=8O169u8nq0e#&aqROt zz96yShO+d&R*S zHk%^bl%p+vvO1;XS$tK)+_;sSQV&$8V8QGXh2iTuzJYNK3se9|#%&{tymutcqP%j} zI8b$LDoatz4hRc>OUJi`h21emyK>5n3anG$CK^gOb5#-2t8z`ZN=Uy-NXJS@&o2LP zYO~+&$(hli?Pj`Iju*rjhN7tVrnbn~-*Y%`W<)1$oK>%4f+*T<`v`-hrJ=)zm+`6x zuTYR#JU7c3Q7X@~Nz0S3iE?>f-0`|7m)!r*tf^2omn!yn%A#Q&y}7k}v*|b@B05qT z3MenHwO8-DflW{_BWox`T}kVHWttptSO*9SX)3x&>%r)Fc_RO=Rg75_;eSrBUlqW zgB_(#q=22lTH@Uj-%V;Rw#h}WAQ4YOd>2n5!uK}uBqC!I=-WrWx9_hRs~t1kWAetx zn7k~)4M7$eJBN>#mzSS~S%4KZ%7pM|5w9wLX99ypS!txI8WTv9)|x|Z-yRI0g zpVJ9wLpM{_$C;&qYXjG^wJ*hTmbpg0S78O3IX$+Z0kSc^aL)L#&mM(@*tP5jvmC_Ex?+*7Mc5K`i;~h=hgJ zI{0))!leYAe6~fxWhG(HI4Zcf(eSu?M?IS1DLr-RZ*u!WN!VKw_MJw9QW0R1LMdVetv2@gGUlZKzNbp=Msw|VSQ1!d|djJJ6|;PQC(}Q!le`83ZvpF zgihn6QL*Oc%7v9@@r>bl8a{W}JB|g0k9XX%u+k_u{6^p`zIJ!mH(IW7={|L-FdEQ| zfKhhp(nF(ujRchSPAT6v>0!h7I08IPRZ4md?@5%6L%*z2Sa`lfro~Bm7PyIixtYn) z!r8l(Ik=va_XhfTBmH*^-Qla%^JV&&9pHBJ+&pk_^+1u51x1z)vkBp`XPE$Bxz>MVQJO1>fXsbTt%zCL9PMj`h7Uh)AO18qr^&hrh-;I&zoFg zz%R`{RY6(6aoml&=*bh3fv%{F465)W{J1Fjy`*!K zzK%jSpG0ZRb3*#srjw{_tQmD_Ts753dTO2{jmnYv(pvXWuzPv`D22VB`SF0{6I6Fi zTC$EbKasraCM#N9F+PQIw4!ewHG303Ey}aCXvxZ;C|K6Z_?e3l)qF)g)wv#~8y=Zr xyUIzHm1OxVURH%)Pnv7pq`9a~X=DO#&%EzZsv^oZ=oe|&;(Z!^$2}K*{~zsbUs3=7 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/camera/ClippingHelper.class b/bin/main/net/minecraft/client/render/camera/ClippingHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..90b93d3e6cec6cd43b39d6f84cd5f5c4eba07a64 GIT binary patch literal 544 zcmb7AyG{Z@6g{)7yj)=wABgV`DBKuJ9}NkyKrJ*hRKqghkbPy?MSshJm>6Sc<3}0q zEKpcF#hiQ3oqNxj`~CC&3E&DxIT#FQfruSn2EtW*7(1>fMG!km1OuTQm-|9-r{&2g zlELUkc#%*!m<;xqPr2jqVC3BQ$HI*n@}e9xM66U}(PV zhXdhFrFdS_C6Y}QmPGba1~R^;N%cmT!E8}S5gC*%tisA6TL8m`g_U`}|L3(}0Ah8^Y49JFccrcM7g3Z_4vx) zb)D)>;e@Mb%Xmsohm-|3KAqXYL()Mzm6pn0xOz_k7MeM9K?pe-#+j)y61pm`WqMXi@)CAsOCwv?#ZuX=Lqm$q_UK3l zv%NYpNKpyis=ZDF%Ui-kcI3^qpUmJOvKodZ?AS_M9U~Z(pi~^oq#vM%IJVkGFo$te z!;wh+jWw%IGR&06#&qP6mylU;W-QMyUqWxTv^ChsBFk!A$1%n&FH_4h!-S3#Ohm=8 zYqrNEIi=$?&PXug4I?3Ox5#3qbUGdEH(#+xqTcM?;(rvt;4bL6$ly9--Nby;IxaC^ z2epxZfPzM2uA+_^%uMn`~V3D$r9NZsd; z)O-Gp6xyKE{&rd&qJ8YI?K?=fU!vn{bbU$71h&&trA;8f9liy$q65bR@6aCR9UOg$ zouh`aiSFm<7n1=o8Em3;Q(~Z_AQOE%;dIk;53LzGLnSQi^HWb_KMs(E64YJ?S*X8! zg{~{3-=O~mhHlX~z{f#0cC|fau1y^3YWs{iX%_4qGmIBF&I0=B|Ktly^5CXpfE?$! zqmX2aWS;F!=BsQW`wJ~!U1BT6Ul}RBRD-2X%LQ^5WVR;=ms`Wdejc8VhPR7wr5UcY zh8rpm;PIJge20ivoADIE7D4t#Ed91mk_{m2?B&r0s$d35D=jVMoSf31r8xp5D-EJ0TJq8_;pa3tUBHY zMmj1*CMHE&ObR2-wBQ(A42}`1!7)NLI7U;AObZ5=gJU%H;2@zM9Hgm7TMGymM1X{f zaF9?D4$@Ra_d)cCBJEK{I%0}+#uaIA!4QfB7@;B@BUFTAG!^M+!4QfB7)?buNT>)0 zX)4m$0wNUQAfX~0Bvgch2t_U@$Jx80;Gc*>GQZ5uKN;B@pb#`vK?|+yU>6Ku)B?4H z*vy)}VED)dLl@>vlo*yACGcM`WQ-CBYm7jcV+7pH36xd>IUhKc2tg{eMhMcOIYQ7b z%$z`t5(HJNF#=(Y5eRdPfSWmi)=Hpo{j>-Hbwv=PjYk+Vp*h0PA2E_$iL&L{3mis0(qqeV@eL=N)gADIUH9im{1<#gz_m)Do=4r`5dQ} z?{P-?6_d)}m{LZ*U=XV}M9aNpxG)z3a;%AQ9>AAiX|c8N_V8Bh@S;~R3zzy7_%!V;Uy5I7@dEO;^ H0=NGKc@GmE literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/camera/Frustrum.class b/bin/main/net/minecraft/client/render/camera/Frustrum.class new file mode 100644 index 0000000000000000000000000000000000000000..dca14a5823a1bf0c7b57599b4be366e272a47257 GIT binary patch literal 1763 zcmbVNO-~zF6g}6T@z}#a916G}&=%S>#z4l9KukzOF{xD~XctsbnykiVAVcl3H6BNF zpWl#O7g7gr0OP8)V~oa$r+E0O`9Sow&uQfuiv@n&VA=S|MC36 zuK+&9=Nck{DcAPRisRZP&)W9QQrWRx-}G#E%l6EYRk1zGEO?E&?=>nK6hU&=x@nnZ z%iS@*D(>1PUqeig=^@S9YBQZ+fGo9|5G5KT{B z5h$zGEn7zv{RR@yb)3LS4N1ZBYbRf;)XH{+jj(*D>KYitTg)G@3Fgz2Z%}Olf?)$1 z;(`-F1=LCK$sQ5RWx?rXkw)PIOD=DX*uQuE*wl`nh zTXWk#F;n_qsdl&@X6?pzb*EG}SN5FxO4-?Q?X7%%Y4TbEWB5SB`-1e*{{277z=s%T zqbkO-)+s6Y)acLwj4E^ ziXA$!Y_ae5_u_XzYR{nM4yc<+IZXa4CcOjdW;zyx#~n~NQ};WaI%ExB33ob}ZlYr` zl@6wxr@OfS@GN#P-8{!))ad@LgbXK=u{+Nw1gdzD0gYuNx36!)Qs->kQ>IUbLqn1>8f<aQP)iQb;@6h!9}zzIr0#}xt+`~yT37zqg}5(QnlW&JUW>~FNYM&xP~9DqZi7(_!e zGu3-@y`3)rruazEB8*fbmrlicvyE&ECmPv{X5!hJQoP~i{Lu;8g#O+f4HrgpUTyYb zBVph|TGg64&C}|%)P=7@^mR!XfBn4T^9IC+-CuAv@a*KmtZ=zXmZsmsUqWwP)!xd& d6+-xYYA1JNmq2)Hego9J=%9OFNSbWn{U2PKJVpQj literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/camera/IsomCamera.class b/bin/main/net/minecraft/client/render/camera/IsomCamera.class new file mode 100644 index 0000000000000000000000000000000000000000..20c9e665be9940dd47b01c785cac715035d35705 GIT binary patch literal 569 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/entity/RenderCreeper.class b/bin/main/net/minecraft/client/render/entity/RenderCreeper.class new file mode 100644 index 0000000000000000000000000000000000000000..fde1997d5e503a01c47bcd6b128f6825e56e30cb GIT binary patch literal 1524 zcma)5O>Y}j6g|&=W2esKYanscG_>RcJ86=s)5e%4aYUn-mN->Kpb{*o#_p>-!+2~> zCV{Xa`>tVu5G$75u%Q)5h$TYpy1#+n0HvHab}c9sjV;}G?|bjwch0$Ye*5dkp8>36 zBaMW>`9MW>(+yNTbZ$p>-FHLaZz^bBJse5JHvH=XE?y+dBkva ze)#Z_T&Kz44dm0v35>SFhV6gqHGI3(RsolHs)d4yIm`?6HT+%bscy6B`AQ`gT^=}L zLEzXL5Ir-NNu<(oFA5Z%YsE_iVJCEzmCkZOU|=_5FLs>vv&J`6wAu1o;m*DvxowVq zD6n{Jkfe51zI_&uw~Pmv)zFeLv?4(PLnJdCgPSC%8N$k83`@w8@+p)sfeoC-yO_iW z9MX?*CZ}BOzkEXnVn$Ok6`0G-!iewT1$|uGKyt-1}^YrO7jG{G{zDq zD8ogpbcOhx*;?9dEyN``E@!nAM%J*3-d&^pHH_pv25)*+$-7%jji#taQm-R;`W^ac zbufJLGwZD*>(UY9qkBEl^L!SVBK&D~VFu%vCB>Zna7bZ};1*CMg;he={kqbD(j&Uv vBf8xsN}w?*-My`tvSj7;n6kmTv#hnoGfjCA$tRf5l>dY!^en7%H-YlsdE zKtdwofe+xL5VLl;g*?;`b7nj{GiPRJzyJ994ZuU(&mhHMdLlBr(i5$~vLmzQO5sIj zAiTB+Oj2cZV!n#4C$W)%#!x(U5X1BX>B;C3L%L9GFldkcw$PEr4966v8D?u#{6)Xp z6hYl;x`JW8=C>@jVFgmzqn}#Tks(8=cIwgz-vfqh+fO=RSTBslJ62cxYI77&RbR28 zBad?#%rh+bfn&NKjvUwYd%`1lS}T<}&MW%daS!`p=eZRHaxjBMT*zRFVdY<%|Ciyo zh-C_QtuU&~*84+0e8a%1D#c}vE91_$%5jZjW!&*j5nbiD0V8Hp4=gWqtw`83`$F7` z3cbm33k8N;)9-t2={XgDK=YV1j$Y>^l&#P#4`f(&rQ?ZqrE;Kyj&p3_Hp5)9A1`e? z6j8ZcsW5C#ob2RO$#AzgOf|tAP0;Tp1El>pwt^DF>Lg;Lb^Lv?>g;wBvXj7W0(%MU zGw84Ve$WzCsTM2$_abi{S;rPi)K!|E1CSz(7LsI!ER&ECPOX1I_EYTENh-IJIg&g% zKzN3%JkDa4{;1%O&|)-(m@_s$W5He{dC6YV2(H>gTqj%`qBz9npWKU79>}VvLA#;T zP3P!Rd0gvRl5bQCFmNZPuC#3|6M3cWkfxe3uuGa2YkQ=ryax73Q~d9emBPKBt8MeI literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/entity/RenderGiantZombie.class b/bin/main/net/minecraft/client/render/entity/RenderGiantZombie.class new file mode 100644 index 0000000000000000000000000000000000000000..236870c1f7321b9fd818b2cc994bab481f596799 GIT binary patch literal 874 zcma)4T~E|d5Ixf^6iT6G75o-ZW1twDRpZO5*+?ue)dw*9-~-9sa;X>lLAqs)Kg&d; z@xl1)k220}7fo;z_o4UBOy|s*nR9>s`t}{bQ{1s&5FX{S3Nn?;xD-cK5T{D!RZzGfMS?$Vjjg`f`vJ^@;5nGVEWwR<_*bXdK$fq? zK)2V93huKnN~QgA(5&97A>r}lX8*IVE;l|BWruKgGXDIqP5y)CdPrD4DP^O=j!4si zh~E+JogX?8nLLy1MXg-3_%3hG#&z7ZaD%W?lu3}jKTgu1IFUJDyHTg(U=8bpxg_1! z8Xd7fn_;u^sc8uIesNmHGE{nvtN%Qk`^RD=(Bb8`_yrOStpHmF+ZN{doM-QV|C)R+ z`P*l{wL(r36I>%3(huh9!NVi6A79P=9lF5n`2I%fr|Tu)n8%WSnc;|i{h ux%SxCy?Fj7xM$y2T>Hyr*H{-Wyqamf$^XOTG1ErP zKBn7zZ2}V&o%lcp2(g0i4RucEo^Cpyb1$cxQ}=LI$NuNuw3N2;b4h=>-+6uKJKy*J z{@=NM;lKNy05DUG&|woeIc}r_?a{c=lngbe15L505l;t_Mm%gJ0~Dj_wSgsOt2%A8 z>(B(szVZ?QX=$1pOEk5m1j=iUwAR|knp+{@NQUC!M7w~mrZu!W6zEJxV}T`RpBg33MIE74ot%+hL#Ln9 z+1_X*>qCt(_V{WNO`+J*P%^68*-kCp5~bq;M|9kfIMF`^mgiN}s^jUzndepuEGa#r z8q5Fl;}Kd`F=%Ea)NTZ#R2EPg>(Zg7wu5NezZ6uSSXnbNvJmSI(oUVhu{0cy_ye2Udgrtl5>y55- zXOhbOr51c+p?D-vmrh3Gk&3cvrTh$uIhZTpZj8pm{qwa_y48hwsM0Z?%M-~+AhxD8 z5(^|cj5r@>)=ZitaVA`}HxjGuOtmZwQEiu6Q!Q~8&Nc_?nLeplC~Y*;<)u|sRb@-H zImZEN+Bp)7)U@14td5v7nzh;F1Z|G`sa#^ssh2nx%q(Xlwj`0Z^yo^DQZ#p}HEFrT zitMDyL@be<+N^Tv0*MQ8k-#VmgJ$d&#jE413DiV#Eh%I$5KXiU4VvYM28ob5t(&J! zbo3pz6ipIg(8D_2txzd&Txr>GXz0f+Q4m2?M~lFiVF1@ZPoh=fL@LEi30fXDO!vkl z+Ev8plX=mUO4D2<1o8rr&ZwCkDFqxSRw1P$NpK#%$>Ho;Z=_O2j1fvCCDQ0*IHK`X zIuvi>nFgQZOPBIUtFT6*OL?e(%aiGO$S2Kq2#2mM&?;Ep+2r* z>YjMS@L05BO`c*srdp5FtOrx{q~SCSMGg&CR-VGoA(2M+_0pC;F}oAvEmm0DoN7I$ zkts}*7KS>qbbQnyR$a8(NX9~I`^k0DU`%I2rl3)kh-V4MNd7;}x=CWQqD&{_+SH~> zi;nLK6q>bZ0HMt7jK)~7UDyJT`ng@=4&2GS4|R|;!bCesWe5#rR}n#5aF@j0_#T~- zPFNfzFp|kMcq7i;j{9`nD=>CgY!5!I#Qlm9^O#AN-eu8nx+Mn(4<1yi9+Y?p-{)Qm zZhaHdEp=uo6*y`b?yT-BJG&%yE9baW+Rh8Lha$WHlwyy>UX{H5XiAZS89-}Pq1VNV z{D?#k9_2zSm?}>MCVffxtT}-J$;!HC+Q9T4gvBq5c>fhmlD4+Z%8c(<_rUpOuO)FysG0j0w*XK)f#KliFhs3Y2CEx(*o_GbW4Cd-?G4n zbr@vF*YI1aOGV>q+p4lEZRU$FzNF2$gXLDm zuSjts{vh#3{7GPh73Ddpa}vq+P|Pe?=Cxpjx}m%$@fTc2)y%?ZvX0amqV6|tA-X=a$jxMrcIl*N)}LcJN&oAr}z(v z#lRZ(^G&bJ(?KtEA297II49*gKjw^ozvV1@CmOldTUKCIqLD9b#qso0p?L|?!uXrzx z*<~s^p1-3_r6ZxC0QvB-?dMyUdxR2M(9H{dxb4&G<{Pf_w@;xXha%6CR4_0o+ClfMg%%FJ--Yam|_Molb ziv0c^w?mHi#jV|ogATtI)U&I+-VVJhnA_iqvE|f)F8=wQLCv2#%dZFRen-%~8yz!b zk<4Iqk@UN}{dTXHW*2w+*0%aJB~!>?of=fFzVYnH@Kdx0W@@?S_RFL6LCt=OR z`>d(Cm@UTR46y)n#7Y*CFe*hW7MSq4m7pR-vhY#TMqH^NMX4KC5!Fh%npP0yl&+zq zapifYWp?g$eO8*nE8y309pSozmR-+z4qCYn-=L(kX9vDXDVG*+#kVLqY4;Y~fE$@3 z?@;ee>~quRjXZBBVSNkz=YrOYbz^gT@f4x`ZG6Xqw)m8~owUb6Xln%3t=io^VKi4Cs)WpXoQC$8RUr*<S%Nygtnp2ZXj_KM7{`rR&IqnxOwOmzFTg!~BYOlF;d!iNHEqBL ze5LvrjVwM*X*qs2r{Go!-@^drYXP5VsbIQo&}=tqtti=1PL+nceU?AXQ&t3tP( zR$OI9-@*Mmh@np6;kF3kAHqX(l<&ENAAI`x({8%8%|I z)9udSNhSC-vVbWUHwq{HRFZgO_GFNySR~X?LNc(N_~!@-G^D@QUyCR^RK5(_M!K-^dR7-fW%j(1LDL zft4H%`=Ms;-EfdJ`$oMZ+17*ZlCg!Z#zKwUUf{m72OElUQ_wM`w=dp`12mTe>)t$+W93VB`h5|LAf1a9>*`YVt!FB51PT>Jgu_X z_i<}Ue7ZKY%RaQrQK%K#3z;Dc)L6lQtyRt0D21Oaf9Jt1+r@D#Rs3@2BBxb{g7VOz zq-FhfILlS}c}r!k$1lyI)9w3&=42aY6=2)0+N?q5pd;JJ4$jXB=55El>TG#iG5av9 z|Ix}A4LmG6@&|W#3tffzgY2w^ zYqsotEnl%)ImaC1RMph7O+sDyCr|kElz*0)L2hGLKYK8j=McJ`gyd?n>l!9N7c1CW zRxGxnKiR;|iw4mAIU+zk)Eoj`@5e^LGcOJ*)tV`yVIkzea9( zgBkuV^ZPxr_y^?ik8rEdut^kRvnaBwshX zaF4hc+r=XyEOFWO=;w3yR-ozg9A@(v4Gd3q4wT;F; z+p*Yh8;i$mQ}MWME}pQ};z`>|JY@^xXvmH}a|24e`m2<+J4VB-W50&96Ct&t@ot+6p7 zA(YTdNNJi&lNJc{61OQyOAAI#+YEi}q@8J-=}Y_4OdtB*mrj#Hzq2b}F*B|;yZ?VK z|9Ae|`TzCr?tJtyfO`De15F^3Hmpd$nKoisJ#Ix}Dbq+>k*tyKHL?-1rgb8+&mOgz z$IW!Y1D8P6oP`9u{koZM&-5B8fydfr73^255qnRAo-^tM<~s^>=($`$)VME^%BpTJcz{GP+=>fG1hG)SmrLrsnW0W|#1IfsZfT=e z_6+v-7}+kpC&k%dTPCKby7jE7#)V0jl{9k#HM47Ve@D_v*Ks{t+LmLHe>0QnMreplG`Y;Nv-*_ z)8}g?wy62QRGALbiY1j)oy0b^S~@OeuPB4JOYFeowkNu>dODZVEh8@AuC(2#WE&(J z(Zn5=89SP59yW89(aW&3xEePA3S*bVZnW4=+o!Zr03HRvKq!PKB-#{$x7X0EWS7}* zxOQFvTsuDbeR>(QVXIsUAIcRAAMdkD`BEzrF1o(<@=9%;Pc5X_a`& za|wy09c>lWHnYE{kOh4bN7cM1H96NWkydkFHP<=B@}>|5B#t4=ow=iCdViL6E7;bj zAJ-!(J)MYjGVjxgIv+P$5`#ES=hA&$#;`S*Wsz7^SvA{kfnkXg7!g>;AoMn6hSG{E zty}u_gfSt%vhrT>duP;jeI74(a7v(j`t2%|@EJu_;zgWhk~#&6Cfmv8+K=LZ@=QF_X$< z+XqvYIl#t4pRb;KB1EfNRJ2}|_=dVECCS08r7ns}z;8;thHvr8CsGY5cCYAQIwnwD z*}}4<*58nLQ)LdGXdaGH zp4UawQkPQym=#Whg+3b*7 zhisvtsX1_qN|9e@UxYUwt| zCP-SMl!WT>K8_A>huSwkd<*_?^-atRm*2#K>$bomzJmk+O8K5gq4|6-KpAHqam26~ zA&v-uC4?6?w-gHr8^D+FK;f9}9BW*2t0R_8qWkRGg;a5ojk?&`HG%3bpbF(02g~(W zcJq0(>`ESw1pG~TR8-$U6`wVV#zXGDp4wuvHGDQG>P&gaZsxO9QD>^8ydvbvqnl()lb23BN+!%%e z{@aud-@v?(tD-#Qp?0AXIfj!(o4lilgsaQEV|eKutl*YqGqwc$pV2iA!db5<^Lnn{ z{iChf%e7vr=v7L7b(62mw_wThmk{8w=P$uW(t25}4wU|VT$&g}iUo?aKv7X17Xq4= z$LmwKqbua~`-5-g@$Ff4^^al|b@ki2K0I~rOr_8IMVX(9erjuV8LyHq7zyC+3+IC0 zN!R*0ESVg7%X||{(w4AyxkG+hN59@rpVCpRp+2RyKFg=?zDJ`{QC3Qg{uIz?{OeP_ zYWpZ=$G2h>zOA06o-usaPRUpvSFST(z1n&00xM(@^BZC@nt2C894+BpdH~D#i{L>t zFuPlr-}`v04)N;tVg+01qZr}0esN`A~QzdxV`pJE;U zf{pl$Uv&S(W_*q01eL)a}& zvA(~8R`CX&5Tj@pA7GETg}vf7I>etj{u}m-f1q3Z3r}epp4R5!fVLC|wQ@Y8ZN?$3 z9?xmJa9G=iBbvc+8ir;eu8km}okmhShojngq_o%2uf2rm8{A;Wiywl@1 zpWG6BU)2+GPCZfF4_H}PuE_n694iyK_sA97+$cFWBHAJRh@1xvS}T4`t^{}Jo%hiM zuc#AG;wPN*@}HR~z1Rewc%T0JfSjL}oy3P+_0zT^_$fK5ZN&!sjH{*8yBOE;b0YtO zaqPsx|Kg0M$^liD@B=o*jHR0S&pldZvNCNE8~R7}8%2}?yGIRtKEtN?bB0rC(m5U#$Bu&VK)VpZ&JO@cdp=PY~K q%k}}g9f64h0zBZCgd@m!_K_=OAGt#Ikt<{$IVbxBKBAO{U;PgxuB%7@ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/entity/RenderManager.class b/bin/main/net/minecraft/client/render/entity/RenderManager.class new file mode 100644 index 0000000000000000000000000000000000000000..4732596a5556f1af2b152f426550bbf6d112c8b5 GIT binary patch literal 5982 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 K^R!B52KGB=17qg^ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/entity/RenderTNTPrimed.class b/bin/main/net/minecraft/client/render/entity/RenderTNTPrimed.class new file mode 100644 index 0000000000000000000000000000000000000000..4810973246f8b140fd4c283a0a876417d6a547c5 GIT binary patch literal 1866 zcma)6TW=dh6#m9uXB~Ue)NULT2&I>}*iM^u(xjwGo3u%@O~6S_Z4BjBHul=tbh8_+ z*J;BGZ6SjY>JbDH<&Y7U(Z!H{ zT(}50qMcya&k;h0G)+W^;Q@{wBp4!%6|HJtFB)&_3`}L{&J#0B&9!CSDQU|ldEfd$lK%ZWylG{+)@L^#360+M52440E0uldAY+$}*m27}|aF z|E^v$8WqJ4d8k|j&)~3(LktPqsVnC7)w-$J>$*kV#r*Iv#}R}Xc-<^C8!L;N>limg z%m7CU$GnM>qgf48bM+cYllD&1iGHLxGRTrVwPr(bw;-KA1V~f2Z{HCBLmY|#2-nRb z(Wlp>nFlmIo&WCpFisM%;_8m08P?FcRgaJ&V;raO97EK!wQ5Pf;WizDO{DXy+J>f> znpIbdbULd(nJIVTG$v(CFbuSz!_+r)Q}HrT@sf(;49-$Ixt7attR3HvgiMOWndUf$ z^9;R?R}LQ5C2PUjAYpB1lS-nkc#nc*%7T(vjtiJ$=&YL;jE0|FQhLFkyvQ*xCW)^( zOU#Lg=Q&=q)~FTk&CVc$J;XXCMZh=1y>@1-^liCRu=1l{OD0{f8kJYF=OKp%}_coI+f$n1Ao zD|Xl({0jXOa#9)(rN*TJwNIW1w{S3(l#-zqj`oG`;@O+Yjv8N%55D&SPV-$JtEQ%+ zA25m^F@~Qpj$f$cg(|Q6%+roS71Drq zc*)aw8)Z6E!1KLKmdK55+B@OtyNxSkg*@M@WOdN@C%i^@GTq}_yg^nNZ_@mJNPl8p SM!)#=`~jEHuaZB2xBdoU%fU$i literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/texture/TextureFX.class b/bin/main/net/minecraft/client/render/texture/TextureFX.class new file mode 100644 index 0000000000000000000000000000000000000000..d9400db7df31b8753b4185befef855d4327087be GIT binary patch literal 597 zcmb7B%Wl&^6g^{`ylRprr4N#pHmurI)MCwJ(U)W?f<>bU!D`}6(<#olGLx!&7K^A- zh4_Ge6yl5%!J38dxsRE1&RjqKe)t989bT5<3A{4OMpJE6lFLgQC8<`%M!7O$l}A?H z*;%fl!2-`el@SQ6Udvk+>K z`_0vvk)u?N+5OB@OM#em>8&=}z847g9a4~A6;tc7@jlFQaZ zR8e!;W{4G3T=qOf85Iil`KAxE=}6@Rrzp_sXNgRQGS{wNHUoR5zX?SB|60Qv+Pjtc zYr4+NKqp@XY8TloPt>_~QuV(JJ94{1m&SZ9Js{FMGvQno$QKky|3r_I5KkHFtQ2dH zxYN5wqt^`Zvoc4k=g;xXg^gZkj;$ZXwKikBpsrFTAVmo+ifod8o6G5NzOf)TM;su^_dfuP&KJWXz z&-Z@)^3M-G2CxSY>F^1(7o1XJCR=baMSG%@$mFw5p_C{(g>k2tC^_?`xuTO8@nkA* z&p4-2$8{(ITmKL6xPXzFD>7{AzRujpfsmjj!_KE zjypkwu}Vj^z=nU9on)d!-Z|~$6Jz<=%ygn(zQb4zgU|`q5{M7q3r4Q1D~Jf9I%)-) z?-dhoqt&ytJO{7cai%Dqnbt z((}W_gfd_;ZU5(d4Lm6eFhVxm8OAQ`X2W*Dp3Fafa%!j``x_@okI3)cVa_DCJ(!)b zC!ImNWXl2R_txI#iFQxy^hDAVJD7oUBwO4ipvq2LJ+s3ToeVfy`9cz^kCyDr^dbAC zORc*Jp`){N#f+26O8%pFP5U;<3AS^IezxM{%`J2_VqGcZ_VRm(mJNjwKvVoOs;;2M z(&tCtM}53T^nRpWMZ=0>z2`#L@*N=r1g~PcdQQdtsKPpW>byj_j~;n7@vdW;8mz|y zUOE3wmaYQC4S)ACuKV{a<4q&7H+}^TR!kW+q9<9tHL@YssaeW+Qd!18EU7M|%~UR7 zlc`?9dQ&lsC0M3vM3)e)*Cf_dOjQEMI<*DASWtzjGTZCruND+xDwb3~WSnKi7*(&W zeJ1i?u5ct~)Gngsj{h1q@|l*uD7Hu$#kT286s?)_M;3e{W<(du4=)H|8OCCHpTzCf z;Z~YqsDl?d&QY@&Apx(Fg!CE zvXaW$q-ute0Ve5+sq?0CVWgreqo#VtP?__Np^cis3nP+=8iB=fqnrpoU@e~Hd z84QWD*e_l{TD*z_;w>B$*RfT6hQsc}E`k3I;zng+ed5!~#Ok<$9(SI+=}EAkWK9{DC1#jlF$?6n#27IZKA> z5MVz~V?WXevV#x~&=_ULS-&o*CFI3&s&+Kuh@civsxx-#p6W`L0v(R uLf>x){GEl_bqoWy5%mSjtR8YhS%7XIYv6YbmdU-BawVL{`4Dv<4*vx^=#kL? literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/texture/TextureGearsFX.class b/bin/main/net/minecraft/client/render/texture/TextureGearsFX.class new file mode 100644 index 0000000000000000000000000000000000000000..b5a5caee33382be2ac2920971db8ce365d6a240c GIT binary patch literal 2197 zcmb7FT}%{L6#nk+?9T2o%CI=1QYr{iSdmfWXBB@CaB(fD1yox4!>~K71IsMg9VnW{ z*u?tMCtsR0KDBAWvqr3G`t#7YJ~Vx8eClK0+oWk!`rX+jsELW)WagZEe(s#}edpf& z<=J;X0yu%3ihw|uYkTIR&XXL(M+6%c8Gs5A`~@`a*6V48+%X&7^|*}Ppb`X=FFkIRVrzC3vB{bIolhzONHfP#unJuHo6ry z;T0V>*WX??$)+xikM_rqK!=J00)`A-HJwE(XFCNmEoJ(GhJ)xNj78hZ3UpRB+{~_Q zW_|3H^UT5JxjDONXZ>t$eh6JE4zo?aj#tEKID&3cCu<)WhVF-jnPx z7cK9qImXvnJHKQXHJrxxppWc)s zNvVDDYUz|jqlrZXWmyQwV?-?=50NiZ)4wJ(H|G_riW;Lg!ZwHU{G(=8xs#uPvs%ZD|Gfe z=hStb&W50_OXnIQV;v9CcaJq3#sXXnIEt8hzQXui2FJU^FITPT{joK1%6)cEDu&wC?vAzwy=y)h$l z7XwE0F8Ym#-uN}Tji?j{`Q3UWVnidWGo8ILt{NH)MU{&vBX)gKgPY$#HKN=hrt8;h zuyKQ)m>wys5hLcCs%WYNM`>7t!f%#$>eaaG6+;WH8qqtGo4PV%M7CC;8KY`z6`nC- zcP4Ks!ccVmtBv5TplG1-?5}%7yv*?m`2rfDb7q^c4_&;!`>>z?yP%gLYDr zzzPoF2HF3VH}03{#2UGLzzg&zPQ%aW!LOW{- z3ABh5XF<-$tum#R8EF!&v`>@pE@5yora2kiBFM h8LBvkT=L;d08jWAGeFNELKP42uYcFrY$SlW{{XIM;jaJy literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/texture/TextureLavaFX.class b/bin/main/net/minecraft/client/render/texture/TextureLavaFX.class new file mode 100644 index 0000000000000000000000000000000000000000..2042c94daca6f7297c124b3ec69b9299d3e809c7 GIT binary patch literal 2153 zcmb7EU2GIp6#mY1e!A_HT?Pi}?o!InLc0jNE$!OUKWNKBp@mjz`H2Tm7^+5wlG$bZXd@#WP5@LuUF)>Ds4;oD{F~0h4G)h>{ooN@47u=tFzH{z5 z-#z!-bMMy=Zr=gWg%cViLX%?`W78SOo+wynim{1Y#&(Lag6&M&g;>#^FU}V1*r+E5 ztvM@sT!T#5`9H#v#|ae$dy*iXN)nW*f^9nlIhC8WS+#OAX^WtCW}Hm1n_U|k$9T3c zKWY203IPp%!q&&vo3f_uSk9iabFow|KXEqJD@GlwVGycvoaaz}F5^rQwhcZ_WQSO3 ztqv3G2y0x*0j|LOfU~@H0u5B50_$~Dp_bEY7-$^xfe_N6Kow|%4$VUwbyRw2lMWwL zf`5=Jd}MYyWfw-RRF1c84CW`S+?Z9!2z}Wo7t@(@gx&wi`6&*igA15Q8NOnSc~ zYQud)C&l~$9S1Q$@MWg0DZAe)a@R4(q7;ZH&(dvnWCpceWZ1Y6B zCtA1*1x1`tbF64hoE@@e+!NvRxS6-`yzbFsD_g;LW82Eo@(K2?;yi;DolDeR(X~YJ>SXwJV|%tH zYcx2w&}hW6iwR%o36mU>ClksNI>Rj0B{Z6f=^GFDUruPIYRWFEj6|;^XliDqHa{Lu zB^OjO)v!GNQR&A8g-j(R;9d3!hr;X;G2#v@bs=U6^IrtHy34j=Nj+k6CtU7w+(VPm zEn+;!({ZEa%*ZXYu0_YCEAW>mjINOd ziNb-v)d$}%5QPMAx3b31x2! zJ54Pio0SPAs9I?m<0zu?d6hImSI_vp&Q2i`b5PXuuz6BpFfiV<*+|`_h0IwIE1c z{DvmcLW5|fQ6%Uj+UO;;Q<|R+2OTtnZkj_6&7+rILmw@opDyv+@F9|P0|)3!9Hbxk zE%+IS=ocKOUvY$f$5Hwd!;*{<$&WUv7NhPhxCuja`tmK1r1dz2b$l~4YR6$l5}n2! z4?(9Lyq6(Va3&vn2+gG62>Z#L$y**0&mNAlP2tSm@DO^?f?>9)oaqG*F+&(5Y|}XF zsE4>t2A*eICGR5WA#5ZQ$JplMihRd;t9+AR;HqDP|2{8rpBFD7hAIt2B$0SE_+R3C zUpBGMzetJCsBH7x{=xet-o5%T_%BF*qq2m$Wmop&kH)DnXJ94%p;0U0%!-v0D7!X4 N8P7?)$bk}${|jW5s%-!O literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/client/render/texture/TextureWaterFX.class b/bin/main/net/minecraft/client/render/texture/TextureWaterFX.class new file mode 100644 index 0000000000000000000000000000000000000000..575888fced21de033fc7b9e1434e500e55c29466 GIT binary patch literal 1962 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 UZv0P7$Gy+SavHBN$cBl302@e@Pyhe` literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/IInventory.class b/bin/main/net/minecraft/game/IInventory.class new file mode 100644 index 0000000000000000000000000000000000000000..fc833f2ef08d92754eecacccf9cb2072564b85ce GIT binary patch literal 439 zcma)2%SyyR5Ug1>(da%D5iedfxi}vno&;ea=po>JjBS`TnLxH(&`8Y-+uAkqpZveMANikBm@Wi@vp6bEAvTkfg+8Dni&;9U`Vpm}{w@a&A>l^*} zJg1ta)eu+ilh#CqoxCs#lkmZ|elxymdtqMYrYQf};g~vYq(t_O!uUlj#77WTxXR6z zljjTKwUMy(uJpYwf+xn*RRt^A~`p*p5OISaK}SsM(HHcFi}QQ88*h+4lxCW3hnHo z=h{wXTOfAQXjrad5ST7pizLIV^>?lCo+q|rdpiQf^kwK9pl-O%lvws|{lJPLgh3rT z5(1%grqm08VI5K2lB-c2y@<)xZ5@4x2@Djd`&HF;y=+!XrfbW6a2WOu z?PG!Tm1SHOpPh$KO*iLHcl~LT?@_V5qW!_@5SvBj`w+pLj%mzLF^2GZPd&j%I&)bm zfw+Y6%<|j3Q>@lKdLo_ATveLwSv4ciK}By%p0tidED4CbK)*VEVK!8kQLGBgUh$&; zqcH7&-czZv7lGw;zH9mo9cx$@7&}&N`mU8t?A9HRJBm!WE_%t7WH(zna-hERU1SI( zeQg6$DPX~_*`5S?sN=qpzgRzU%hoenT4Aj9PVMh%U49fKrM>tc;iyS>@dMSQx718$ zagOp{M?c3ncU9hpIgez2U?974j-l-8Id^O4NPbgUV;qx21hd0*XD_qk%pc}B&eN=) zj|oh2MSOs%+Vm3dsIw9G3f!S z&y>JC76L4Tv&4!JV(9CI)h0IEmH0d96JH76C$n_N9RKDi z@&Yy}wDigKmE8*}3qxCsQ6RcLC~J$eeA}4py@>|`7u}KRc;HyjxxgdlXn6b=Fr8AZ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/Entity.class b/bin/main/net/minecraft/game/entity/Entity.class new file mode 100644 index 0000000000000000000000000000000000000000..ed972a37b95c51fa641f2b4866a645b0e84207c2 GIT binary patch literal 13981 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 A>Hq)$ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/EntityCreature.class b/bin/main/net/minecraft/game/entity/EntityCreature.class new file mode 100644 index 0000000000000000000000000000000000000000..2c9f8b10243e58de94e1da4af0fab196a74638b3 GIT binary patch literal 4452 zcmb7HdvIK375{yA@4jze+ia7z6aq1C7%Xbl}JN@>^M;Nb6B1Hi^7z4P1wEh0wS-X>ZR!7}Z!GM2*7L9~n>Ap$0yMT7`%NH$@e! z!biB}iX0GitwNLDd>n}2dVD&F8%pPB$%6)NL_MueOU_zeLP=`v&np}$nFNcC{&=^f zO1ka}WxR`B7v5yRk3a+)u_=hpFwQ0Xwnzs9Nqkmei9O;;Y0lbXUWgBcDP^;PEs(Ss z&X3&5G*5+@u$zUl&A=`5l!JoZCfFSYcFtodz=s_Xq_8W9TUl13OQ$vA!&2n+wZ~!%)TUCYx^8h?XM|aI(7+*l zj=iB^PV6t3X=_I|pB`kfjh77TA}yLqg>^AU$*9h=bmXO{G5xKy)0rQ!rSh7@pt}v+ zgL`R^={71aU~G~lRaz9~CfX)8n+AF$JjPId%<6L3f_ak=dJR}YhzcQ*Q= zGnliEI&C>Oz-@JH`o*{Q9@m>I0e!n$jC8euqnMz0#?N)Xl-7Y_6a%$wZEbZaDca9V z8Q!O`?-TfehyI_E60bjC;6W*omHjj=YaL*v7Z@UIh#nUDLk7Me^q5C)rz<`rpTHwQ zJp74TiWg1;U&5n|18tsE!L7X&jN&@X4w|kxbFiYSu178(P;ONeL zUZTDmj~n>9i<($KJz?ORF6x+zir@sEH1I8~rr~yu4N%-60cvAMJu2kW2F{3IBK8Pd zvOUso^+s?O&jj&p)|HzTSu@w?R=yP#Md(0-JMSo?g4V}nZk7mziuU; z#yy(2{ydf@eCM$IWqxXiab4<)T1r7t9$ki&#I5q!QHD6bc#xQK3e&~^o>2cKUPT{E1xsiaE2Nwa!=u;V7BP1 z^=UK`ygAb<;8ud$GbsU^3ASWfs;dWTY6g0$ss?&4ptaFYY~^d%eUN(x|Mu|uy*&iF z&SQTOzs3{EO~moq1H!=1X7bG7&Wl*$s#orx!Cj;*KaF@IdJczWNsDorDQ$%unZ+t@ z4YPQYo4vej21BPYPOG4x zNc`d!fxf(Cpi!T~IKi$Imp!dqI$Ek$2dD8BMoIRsWm;=w|3;=U#CS1sJ>{YD5Ldli zADBFgZ7!FbrZs^n+(@ut29w_Q)M+eLyo~w5j9DT`@A}oji*qO4u&fTwqSL*S)DB+b zUPrhq)3P8t)0(JytUUDC1w37b=LXC0-TdRR?`6*6`{IQkGQ`zU-XBWn3^XzJ44#j@ z_~cn!9rvF>C>}VCGM6?5BXJ%txe7`3_@sJN5*>tNte#aYw{liY1=g}g8n|x7RoH=b zXytQzH?Bc9Dj~(2<-_?tRN+lNUEV`2E};&;Lju3&c>Dl2;18UTb9}1C(4gYDNmXEj zT8oY98f;QENUAMt)O*pWda+pzV~aY!eboxnErDEXei4)qjvsuz(`ukby0 zkuSCPv0Gi@)9jDvP=Cc9^)KA6E@K}%Lzm{qel3DKv>3XzH8`ME;Z7}ugIXKz(mHXs zb_n-qcjI2I2ZuEark2O;ngdIlKt_82ecDO%Ym>0GXEC5%z@YX9vf3<$w0Cht`v3*) zPZ-tyj4|ym7}x%eW71_*0BfXw6uV3ohw%!Ups0scgeLjkb#e6F7=B8sMokBb(6jWH zi=$TuF-@wEw&XpC9)Aeu*c5g8x|7jqf}b9I95aM;+Wxm96zAYOj|-$$a6k){ zaSIiYDWg7|6*5+U``sB)=@A!ZgrbirM-I@7j1-0OMOYMe8+V;FE&772?&R^L9e1TA zJnDipjnXc-(lj?FGQKo7CO&fV-`Aqt8@S7zntJI9xhGt?G6LnKH_4Pt*y70?<%mY> z5>?eT=kd1GdDW@vQ#Gg9Wuuc%!>>Q@d!7t#p}P|mc=W%NUALg@Iyb%KqIE^n1$vcE R@VUYDL9OMj@3@-0`yZ^~Dy9Gc literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/EntityLiving.class b/bin/main/net/minecraft/game/entity/EntityLiving.class new file mode 100644 index 0000000000000000000000000000000000000000..1a65a7d4c17948db2e49003856e9ac0087d6fc00 GIT binary patch literal 10248 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/EnumArt.class b/bin/main/net/minecraft/game/entity/EnumArt.class new file mode 100644 index 0000000000000000000000000000000000000000..1b1ccccbb97f6f26e209000f9f9311d5b133b011 GIT binary patch literal 2503 zcma)7X;Tze6ur&t!vo$l4(UBKn;j9A}X?owu0jl=@}XvoyE-bkYE-~%wCo6 zseH~4(6%V8ES6uBf03V&FR7e+dnl=BDo{0?d(Q25`@ZgTU;pv<&o7AR1br8wCWCgC z9k;JkC_DM8z2NpO+9jvYDZ2%Cxo@;wFJ-E3gn|aO-m#bLzM@@T6xpEAxRbMU2JM>o z-vWcUI&Qu3O(suK=xmvx3OvrNWMF(`IQb3^=>u$YR%#`OZRccNR3(pi5 zZ@W$vVPv{eC?mugY`KUv=ESR=T5h#aUgY*`h5OD`gN(68oW;`0!UFn$+K8Yvk4{~g z?3&3;Tp6_t>bkzJXA>RD7YpTrJB%H6_spQ}k;=RirBIvCT&d4C~9M(nT#pYOcG2c6eXCLOfD!gnY1&xq^OufH$7edIo?sUnYM8CqN1&|jia)n?S6Dm(GEYVDte2y;Vrti3vgI) z$*vyu;fN3YJ`DJ96z_J)F4ozYd%AnpW0^R8OrJ*R6NB^`uP$S7N{SxPLyVDKt=h}^ z%DrWSQfs$#A$P~gyMt>Dvns(Zu(GsrVF4CcyR0z?J?ro@Kg}-`eMVmz)W5dINYSp< z248n-&l-tO9E@As!pP^HGX;KQs&NeM=e=TUR$;MhyY(tk{r_4zw2uCU2h#`f<^nhZ zH>WrAXb=H06@nNDLCk_6#y}7gAPDmd!uNu(ydc~z2%`(a(b5P_tUmg;9SVzoZ-H9G_r*v^ri&0uC` z;ky#t_6VPgAMurVf{(-R_$K^`Pr+Z*W@yqzHzkY=nZ`A0H)^!O_@0u+Pt;-jiWzjI zI^O{wIp4kX1N12LuGHRb&uAgFZ-ok}WN?M-{^7x*YL^?k8;`ZK~avasF7WeY)n0>8jF zA5459CK>{X5B>mul=04PA(c=xlkCo&x%b?A&b{;N_m7_d=8z5{z%XhFS1%iuC^&r6 z)l0lAbYZ!Md#H2ED05SP;aQ8G5rV>?)erG~mmI;}iX#{rXAR46=NaN!?usZ=>dRjJ{O=gvRd zy9J%N9YPmF|MkpO+(9=(%Xxxq@f0W6n?jpv}P;&Sl$uUx& zRZY-K={(bndq{*3XGs1}CND_EAch!19$5A{1IsFlF+eg;sz@Q?%a)U3r5*XT#NM8= zK;!32KjHr-8Cq9eUf6lfcdH$3J8%qF_~W!@FQ?ZSQvL|7h(p)5R!n~QerkG3xALw| z*K54AWS4jCiX|sWj?jb(9S<0WJr({P#So#fE&3@lj$I~HiStOsLx~fn{w#58b(bGl zuY@<;S|*c8zLj*Js+hrS&6IeY*ST4dkHDLfv;>=1@fg#jRE8S9YFC_s$QW|0BYs~0 zm5puleXb0UNI{Yc^c1M6Xryn5ta$`z0gb7VGcA+c3N1iOogmuNs}%cAaqByJPB8EZP0`^mX!CFAT#JruekI?amrYg! zLX??OKE_2Rjn0R>dkyz#C+pBKO1mJ&Xy1T9cP>Cd)Szl1e~}u$Oe#tt?R7~_5{4q1 zbQRXrWvouZ>be#yB70QDdPm4opqP{)ev~*GJUYdbwx-Vrr{amhGt7NNgK``^CZAei lx@&}qT?i8+VHOCP@JN^iPnZ}9vrrW#2-Z*6&&VNw#XtBpG9Lf{ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/animal/EntityPig.class b/bin/main/net/minecraft/game/entity/animal/EntityPig.class new file mode 100644 index 0000000000000000000000000000000000000000..9a2237d933dbc64a2026dd7dd0801ba5d10d9bf1 GIT binary patch literal 1411 zcma)5YflqV5IvWczF27~6(1lEQE3ZwMMcpfM$yJ54I$Ft=iBynS=~poy)BR5OWokM(1jyS zd8~8Cw7I3f@~vIdh$G6ddcpYTKA0i4X*#CdVpz=ALZFuD3rm0NdRD7k*k_1tyDgDI z1W65}h$S$_py{^T&^xA4>NrLc43{*FBh3((;z;&9!H})J<9)7M+%fb$>6wmEjy`L* z+bN39YM4ZhqPs%wnI{xIny*w;vUH95-s#y5;njJ=@_F1QxAwVbDtq9J$^)~@uo71P zf21l?Cw=a%G0cadhP!6S9D1e{fy{Mx=S7{S5{R`cj-~7DTKxEAePdmB8d9g{Iybgm zyW{p8rI`|IR>L%A7?%8G=c5=VJi%K*%8KXO#Hx61YM56%X+y~1F%Xj>moNM)aRPT3 zBD5I{#%Af+hrl^=|H^u`+sNIrUHZ0I?Md+UdBb@GnTohvSX zN1~WbeT7!cX0n-YnD|8g5nQG-izuB*!lf`qze#AABF|KS#T8s7i&$_C*NHi&COpWn zMKLNvOl7$7mow#i)5Mt>;)1dk8;Wq9I8mHz;(gAp45 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/animal/EntitySheep.class b/bin/main/net/minecraft/game/entity/animal/EntitySheep.class new file mode 100644 index 0000000000000000000000000000000000000000..afa24e3347c624ba16340b5356abc76373d31a2b GIT binary patch literal 2419 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/monster/EntitySkeleton.class b/bin/main/net/minecraft/game/entity/monster/EntitySkeleton.class new file mode 100644 index 0000000000000000000000000000000000000000..16e8b6f430992c90d05721cc6b4cdaa1150bb70e GIT binary patch literal 2752 zcma)7Yf}?f7=9L(gv6slj2F}*3TP6P1uII8MLr^Xu;bUc?@UZ0)sWB;@|0?|OK2!(yV5@i>r7)nn<8Ro^W&;bTq;B1QQ=G-!&YpRP(3Xo zaXOjxVLR%*cuqq7>QQ6Zfd=xuFgdGhnF%{lOxl*3viZ0KDefoiT?~zAlCUAeZ8x30 zme4eKfjpK&v2aX2N>w3v>|qEYOwznrI8OjEA#7pTyCfVFf>s7)NpQhWOxqdu<9W(d zN;P_QGc}pud}M+rCTFPtLh*P!d_mZCFdW1oLbp_d=#}zSv^8BBCW)Dg`tbsyUL2NC zSB5-DQijlz3Mu8VirgJq;pGC$Pthla%o?sd>UisJ04Trx;EPUViu3 z5iQ5PIJ0U8<}EYJQxqFsYQi4NGN=6*LPE60h=h}6Nw2K9auxXmLAM&I^L&KcBIvfr zT>}pu`Z0!=y|_TtBYYg3zX-6La`nIlwz^AW=b0%!g5uyH4`gkUKA-}zjPYm~mF>qXR1%Cz{Xsu$hi z828}@zVPCvgzaUTjhxOYaatI@#8)D}qDN?EmP^L6a#VoMG29j%$qEx%nxgvlV}e_y z!)+`106LWs6Tu}$JO;4^XHd6-=WvN<08#oLCVt1sstVF0QVx>QOD<)pi{L~+=9&Wi zbmq;LdBg?5^l{n^2!iPtt%G+l_8W%AXuE~@3?G*3L5D*djL%h{WwAk0z-$Z=dD-3mgS#p|@IB+P!ifj23abRXa?l2sA*4!lh}j}u29 zD*nby#b0C;6rET~e;2`sqVkBMdiQZT`5kE+!L+YPk!P8Vhfv-pjG*Yoa#$Zejdg&q zI-Y^`F+M3_?W3n~wKDMOPxNqWTyz4^>3}fzbBRz8pW!-5L|L@cQ|Nhr!RPb1_2X0K QM^>17OXd>3cC^0v7eNbysQ>@~ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/monster/EntitySpider.class b/bin/main/net/minecraft/game/entity/monster/EntitySpider.class new file mode 100644 index 0000000000000000000000000000000000000000..4f22e283572136c37f79096e6c4124aae828b4ba GIT binary patch literal 2528 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 F{{m34M6>_^ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/entity/player/EntityPlayer.class b/bin/main/net/minecraft/game/entity/player/EntityPlayer.class new file mode 100644 index 0000000000000000000000000000000000000000..9d686ea3de08f8dcc459193d409fb4798f0da3e2 GIT binary patch literal 7527 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 W%0g#c^!Z4VF|V1R&W$ejR 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/Item.class b/bin/main/net/minecraft/game/item/Item.class new file mode 100644 index 0000000000000000000000000000000000000000..c7cb32aa381d66307e01056485b67979af7abaf7 GIT binary patch literal 9520 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 AwEzGB literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemAxe.class b/bin/main/net/minecraft/game/item/ItemAxe.class new file mode 100644 index 0000000000000000000000000000000000000000..aa6b48b97ba8b8b17b0d6eec2f343eafa376d736 GIT binary patch literal 747 zcma)4T~8B16g_vl-O}wU%9kP_Mfqq+WP`7Q5sfCBR9}`fX?U70Qy4nkA={<;w_F}b zO!No%qYQUS6MZ12+04zoC-M%bK2q6!}m0zAYl!MoHV?GFjt(@nSB#{uRnx7szPAD>Iz zv*<#AMT@#$jXAZzlK@XGP-e$+Sq0%)fHFM7Y>R#Tay976>{xWQB+Ru;B6M41%GMLm zJD6-)ZbVVD?W2TxfHiCoUNI6)Y1r7I{9N&p8}}{w?<=yq?nq?&1d8s`*91Q{S6L!I zDSOjk^4@zFVkEH7Tb1}P;U>EpXAWji;luWD^$spapkDb2zf&p@#2vT5qqtKpFduik z0!#5VmcMh4gB6Y*Gi_WQBUX70&nIf1d4`=<+gXQUVrwj3!!~CQ=R1r$XxswvG^vdM literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemBlock.class b/bin/main/net/minecraft/game/item/ItemBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..691622097e5f73feb5537eb2be9eab581d9d8eea GIT binary patch literal 2168 zcma)6TT>fl7=Au-4hskvFr^$S6-YRQQ(GiRO+Yj?AQ}ont#(N^$+k5 z1bXkJFQOU`(o{%63t9zQ3z}sUE@?Z~W?7pnn;RKDr#TL%g7hz};1b#dl!|7hvSuk& z%4s{y76Yng?=)j^frd1*xv;shu9cV6b%U%;X)~)D%W7Gd-^W6?Rn#j2-RIKTUXs(j zrItqo0(69Bxm_XYt-fXj!A*qZPn7s^X8UbDhTwP9l6~-PD8~d!IZ*bAVJV3 z$XL2zNbyYtZ`xu*-BKM|DNZVwk>Y?9pFVy|!5rRZo$`8_wTWKH`W)ZdeVI~l3-1ba zGQ=6vF!YLUmXhXXDaTln=8o*oMbk6{Vs_ls*dG=jRrG8nme|oN2}3WGv|KVt_6X(` zEZ{wMVYaAoM)Qe8GMTE(7@ArZ7_8bw)yX1ja){nn@BuPx^Q>B0G}NqS_h^En*i)73 zKkX(-BDk$!87uUO<7Mlw=vHyTwDkNVE)y9f+frIvRj`IT+!suUTrsvqHbC!1Y}w1_ z`~h>u#2K(rfv#$){dWY;%Q5E~cdl#B#U7PodV?)4r*+u*oH(N!s;8KN+8)iT50BSG zFk^0(v)Y_47fJo;QXaa`_QMD_m5a+SdlyQ~~66u0uWlyI6#FN?IHubfA-8q~tGNnrS3@)iGDo zL`jg|G={v7;r-nGcgXAhN&*q`dL-~r;>VJ^t@<`L%E#Pl|^N-a!qD^qxhXB*EBCbbjY zOlXAX0D8C$d%6Cim_k3MDKRjJZ4BWvuFh{Tj33woKk?OX7!xjxi#kk*229!|%R9w5 zDVb;_`$sGl3xvD)SQeD%6Bdmss_;}0$CGJ)Q#A+^)pogX!e!QP3U8j!?>a#d zFV)7TzicaOoA5s0c6*pvISFFRrnJr1u4mU0*QMht|G?a_#eww9M`83L49bNhzSa>( zk{Jx+yoPgxQbKuuCpT~b7YP~VG#TW22ZV(rx!)NoC+IlC47X~;z$nHDox=0nJ;GQL zO)Kkiuw~r9MA*~Drds!9t>V<=zK%&uX}Cg|`)4J8E7Y z=CQ!OZtRFXCnBjhp_vF%i3!CGi?A$3m~7jS$VQR%S!p~8d@7;%k}ML;BxJ0fUl#Wq6LTUOVLpoUGM5vERv+VuBP^cJDw1jdzzsLeii|e=%rjf%<++vQ~ OArp=A@*RFn;qEWBlX@Ni literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemFlintAndSteel.class b/bin/main/net/minecraft/game/item/ItemFlintAndSteel.class new file mode 100644 index 0000000000000000000000000000000000000000..89946ed9ce6ea6772d9bee515ef4f5e8f7a85054 GIT binary patch literal 1385 zcma)6TTc@~6#k}cciXba%?0Hq2tr#fm8+K`a+6pB7*mAAx20X$m2GRvf|pl)Fs8r2 z2V#8YMFW`l;1BRGnW*1v8v;oo&L%V8oXebZzB#kM{`~j}-~k?K@CiinmK)32c`H>k zx7}FA%vmwpwQ{iprzOYEyL0(;(zPr{gCfvznYn;EZRc%wMnDNCA{$&53TZ2Z8U%It zp#~vPt3yYffSxm7CtWkOleFJj0wN)m^*S1)GDzj3nKLug)UPnRwY}VyRa`f>97>v2 z3MtdsFpIX_SA>e2wRZ&uS1!x&TtRW>w{I3l8Lp6*~5u!P20_`6Qq%(v& zxToQ+Ku?uWr%mhKkdFIM$xPa7B6+z2z16BZ?^bDvF@f%C#%HdqVmV&!p^5Us3S>u3 z3DkL6teP(?-5E+2_KGQM$(H@wBJ(-diX$(~eUr2ZJ{389M0_utHSV5r@8jASRlg$; zRgMvgHq0L5%2&^{k#iFi&H*|F5#rZ?TFQWyvLl*tl{+2*19d#Mk($=>@nVHuGEB)( zKS6!3{54eNvjoCW{Sx>oQ9VG3CP57)0S}1I1FRd$0iGEC11xtA9pRdi{(@OUA?%cJ z((n^@OBfyMG!(;sg5D`rMr$tbzhU4A!zUQq98^v)r5x5AGM^e|39K=9;0klBXMIgX z&6Vt1(Z;VE?dU}pB78AJd?I7qO`;zu3?R=(uuIK5YCd2X9})9dd0ejdl$8=$iIWX- tfNB03CD|p+kSTc`B|IdO{FX3F#%ygg~JUkhEM9SH%Jz14yW%QltnWQWe45)?S*Wz983$C_ln) zfYgA*10TRgA!hBg;=zrOrSZ({%sF%W{paT|08inVC=ptbOx;jL(o4kq)IAiTbX6)t zx6fiXj(rmbp*b&#V2z{*o`>-`N(s~_l%J?brOyb9oqoT&PcU|3Us_nek_{6!J38#I zfUs<15oN8d*tm=`!4AczVJf_%q53QdwEtNdH%&AN?Rjlx!8UH`X;zNUMromi4HIp`c0uyR zmD$+LHl~+M*!+(&`K*ef{vA#}{l^5iDDvWBczf0`9w(mMRr(gHXLtJGgO~`k`HmL& zya^?JR;-m+H*tw&g{^mN>-QCB{Rb?kIYremrl@_(BI_*cFj!igy~NT+4OLuWPb<$u z16SE%1YBc$%CuG1G|zS1nDO`=t#KM#Z%?si_*1NHJEy3A$L+1J>@P77usp-G`0(re gX&xufJLhRI&z+2?fmPh)Oh&~$+~-_EC&TLg1te(kssI20 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemHoe.class b/bin/main/net/minecraft/game/item/ItemHoe.class new file mode 100644 index 0000000000000000000000000000000000000000..1c31400b8ec5cb5498b7f3489486a0ad23b278ae GIT binary patch literal 2406 zcma)7+jA3D82@d%$u{W$N+8xi3q>xrr4pc}K!YGq0)c`^p|vQ&Cc90RZgy+3EiEc| zL0)`!rX8m^zW6{Nlz}hBaMwV`d8auoutjc{6T#WO+?s0x}EQ&JGzV>y<$S3#gP zm1-MMpdNG$GmKh<1Of^vzKrXIZROu~-sL(n z(lbS#e6)2@bKl=YH5J<&H|_YKTd<8pieKB=5LTmELz99vRXm!fFR(_29Jpi|UQSxI z2&|KwV9vC%IZv|I3vBRNw&`TOT$rp)0xzOfK{#uA2W&Spk}_yQ_)~2uDQ_3pj1EHj zNPb-ROd@70*yd|397evP8GmGw2xAMjYKSXnUoe=btOT}!_-a*oj>PCtJ{q%5pShcqxbB%Qj|toyJ*#H}EFAM~afRt5eAQ zCe?kNot^65*wnO!3)P`F9nbP6IdY1b_#vN`-m3eirlv!j7#RTr?8QLQG!5o_O*O8$AuESWjwmhOzKOPhFwWzm)E-fgs;WJ&GZV>Va?#7n^FYqE^T-Q0vUXM)rmasN zFo)fOc~EywTA7itQJL{kfwxhR86VXzIhDX2e`F}wSk;#bQe|CwuVDQ%_@khun%4Zl z%EPa-{OcR)TaOmgN_c4+OQXSC=)8^HH_#x-y|;1T1_HISw{Wnhu528uBeR6$;AXXi zqdfW5hPo2^r(r)b{v3L3cj!wDNMQ*>k#iR#Z>4vI|G%xjkMlzv&DR^l>8N@=qNk&Q z>y7p4`#3gq3+cNUz6+~I#6&~*4(yJYD8aoJQlg=me{ZU@wX=-9me>JD{dGB?jtF)W zwImTVh~Y3AF+#*H6SJ#Wg-_WWpP>mi(Tsb13?E=EekAHYlm9EtjxlCLrg{$Jq+~|taEVmFrzS`R>B(1^ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemPainting.class b/bin/main/net/minecraft/game/item/ItemPainting.class new file mode 100644 index 0000000000000000000000000000000000000000..78ce8347658f6a9508344f8f182f1af6570d2936 GIT binary patch literal 1377 zcmaJ=YflqF6g@+?yKP+_K2{Myd5E@%Rvsc+ANV3E!AC@ksEHZcwO!qAu`Hl`Hio~T z9|-X?Ura<3P5c4=BNJmhvkL^04NW@t%-y;7o^$8U?|(mj0l11W0}TQvJ=@P#9nUV- z0p6_^N1DZhlUMB_gD~{***95e5K2xB%RV&#k#E>)*hn|GM zJ`*My1(H?y_O`6bvMnI;0?m`Ge{Z2WYu6viS(n}eleMCB3$pI0{iaj%E6%*YsmZ;F zY*EgU!J@1Wuv*PiS{~0c??igf;3;1gU+1EZxb~v$W~Xa)x0K8CmwB4RVYC`JB5*u{ z&yMpZjw;ddC8y+9RMasO?aHH9Y^PlDmFu{P6M@UMy|Q01&?S(LNNe*t{CC+qf!UIp zLMM7ulTQkqjug0qO~}5WVosSjjkG{h%_~UPDNQZZU&Gy$Hjw%f9Bbm*6a*!BJjutD zLNk4b!vM5kKX(kp0sdJP2XQD&D_$^plHXP={S)G`bxYUQlqNT0kjTK*o+tL3O zmR9Y!&A?cLwz|Qb#knU!{MH3dX4+k0ZE`Ry@Qp zJmKqk#^>U4gne{j8Qpk~UVPv*t8P3Gb#8ZKg?R?q1!~6-hJ#+M-~#KY_OD=sNDI)# wfQ9mn66vfyj!U>qRxa9*!xbdR3gl!M#$Q|#iNs%|4RrotdVy>F)PU>%0UUrlL;wH) literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemPickaxe.class b/bin/main/net/minecraft/game/item/ItemPickaxe.class new file mode 100644 index 0000000000000000000000000000000000000000..c02ed0af78a3fc98b4e3845d3c6d51c0f8090ee2 GIT binary patch literal 1529 zcma)6-BJ@-5dKakKO{NeAj;~BiVF$};)uA5Kd2xmMuR^)Y^-S2R-Ft79GT2)O@^o! zzJiZn=|%L$8%HgxtkMVY0rqjWw$DjWO3~ux^z_%=U-#+mGoSza@Cm>aH)HP^?7Os;EoLjbz;_(Q(st*2F`ZL6TwcXO2rj;4$>qyuev&Tv}O?PUJS_?5c46 zM#M03x4cEPC!5l%^k)evV(h;bGG>BMmcqbS*l!#|3d`vZ*^!iIf; zgvLfW3JS|=*M-1aR-R)VM>jk-uwxvSCZ$C4uBZpTcAeljp5Oa~lkYx0=?st4fKIO%YDC#R)3h5&o6-PU#(ED2#4J^!+jx?x-eS;<&6j(-qVj z?y@WNXs&RSaFxKih$Jo4jyNrTQT zq4Zivdw?XJz-^O%1g{z~dhBX4#!kDMim}_Sreo}}tC<-4>}pqx19sIU=nx6QhDi`O zLLwWZNFoUlVl#ztfqfgrI@{p%IWag;Sj(DpaB>)-3Kz4aAsykJH70 zcbNVf-J|V!Dw`fVx;4vSI|k=*fnq5dGjuhT#l$RqCD4nDnCs;Dm-GbLo{Ytqe}TT@ zTTG{)A(MQG$Hq%MBKUXs;XA5-6~zg_8CiG~dv;#v++5v+fgT`lG zGzAkM`~ZK+#JJ9s5FWU6k~3@H*WPDO|NQ&)8^APX4TJ=GOVUqoyCs>cI2(St;B3pZ z>&xx5&0|T*eAR#^(0Q4gKy=+J=eCyjccg%@1tL>!$@OOh^n`6ER|K>d<-Cj`j7Ad% zOezx8MEyW8usvh1vTOw^t&=Nxavskll$QEGnCtqSyIFC!H2&alXy zQyHzl9+G6aq?&qLW$xFB%M6osG{N~x|AkTly0HuD^-t)-azHaQo%3AsOmG(k9z{Kg7oLqnC(16I9EGq zM=^+`frLQ+g|&mLNe7W8QWz3w^j*)B`FU4*Of_(En`c5Zs?>cGBZ{3780?pd-UAb( z;B?!oC-hcbzqnZT-Hm-ZDw@HJ#xY^w(N+7V#%^L#)reM=u;hN`ZC!EO!DR{bT--?g zzUrGWR)3AxU!Na~Rol_8hh>xXj=gQtL|; zA~w*#GfL?VWo0*0t%E-iOLZQh>3iVS!m~NB#TeJf$3!c2J#~Myp`8*VagBBnpbnxC zEf%iV^NTR68nk&B7~V`&Fiv-AV3#)oUTq2<3}!O{pj6`Zql!fpj8hvSxJ z>BqP`5wRjaFi^wrS9B|__R-Q)H8dR~y*l)+hA}OF#N#l`hxNix{8NbWY$2;wcHD*u za-JpMEIP18mK)?*ReBI^XU6H=*?rq6ZXbV@Ra$~%sga>v;a*J=>eK1 VieQG=K)B&AKJcFg&nSlQ{6ED&68``I literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemSoup.class b/bin/main/net/minecraft/game/item/ItemSoup.class new file mode 100644 index 0000000000000000000000000000000000000000..60092f35627eb4c1b731052c34370deab6449713 GIT binary patch literal 957 zcmah{+fEcg5Iwan3^UHk%77O{TtE#h>I8ip^@TvPabt`a2v4MUwuP3tY{q8Ieu=-K zzHFk2AK*tBt9wCxm<-cNr>f@EIn`D5>-YDc0AApsgBqcgNgbvtlW`&5>+o2lGE`co zVTZ51{A}Q$ehF$f&-;Yw=PFbBC1Gm4)7jW3)VK4#^l$~Pk10$OX1gr&`Yi3q;+^Ov zk}%iJW0CBOLK*)&Sl1`&BVo0BS!EGx3`Ma;pw7g6N@(Vpsr;=vKGEBWicblj*Q=?t zh)<(3NFs+a2@moj>6iYOnO1rf4iYhvMYvP)%=@^GIR`fgE0ymx z87^*N(ZOxPQWe(69V`*tUj8ZBNe6mFSgtH5^00tqGo^c6Ms>F$GupLEx;^_kUYau0 z|2>@y?HM5~LsoQ`;PGk}vD{T=jT#rb`s9Nc3T%P6v*xR@#jD4+!`>^7nz-9;E;hX} zX1-d8$G68&V1|#2t8BFc{UJop2Gp7iYi literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemSpade.class b/bin/main/net/minecraft/game/item/ItemSpade.class new file mode 100644 index 0000000000000000000000000000000000000000..f5e9abd5fdfe757635da3879b4879d6f90a82d4f GIT binary patch literal 794 zcma))ZBNrs6vzLk>pIp|o)lCbhahYiY49yb1fr(N;7!Sr#aDOT-MrehrY-wkmKP)> z_yPP-#&gR8F(GDYdUEc``Tftsy}$q5`~vVEyA>FOjYwwhP(?CGL_c!}Vklje$)W49 z@qdV(tiUAH|Ce?V$01>{8^*!+^kcs-gG`O&@j$33%?LYRT94479Ldlv823bz2ZX7^ zAXJgcjtHejvrRBhW8FZFur-N96*itYn8pmDJV->E65dQy{IgCz(EOZ(c|7IPJ(Y0t z+Y{jhx!_>2AX5?bwA2d+FLl7;R(RMd2+I!2un03PUitauuq%@b(G4YGz7+=|Y>Pzc z^EhZ7j@MCccwVz@ql66yYj{O?%MowF%@(W7zA9eF=412xd*OT$=13&_1oH0OcLdvy zFOxuiQo7ga`^T~OO^gKgd9o5eDo)emv1eck75)iTK7D}67N}QlVRuS79KU1cnDsm5 z9MAlYmE*a8g{7aIV_=1?#iX{YMMNvFVSTK2#x-=c+U~Nsl4I!_^#{;q0dP^9KMmLK ZQn86GJ~4#X*e=9t*kR9Lzrk?>&A(tmx^n;k literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemStack.class b/bin/main/net/minecraft/game/item/ItemStack.class new file mode 100644 index 0000000000000000000000000000000000000000..4a369c6a7c59af89537de095553e300147b53522 GIT binary patch literal 2756 zcma)7TUQfj6x{=nB+~&U1u91F2+5>40>!E*D4;ePkT#T-+KZE9gwb4B$zat#(C4nc z_OXvXv|R#gwQKbU^hb4dpP6A2B!Dk-%Q<`Rv(GtS{{8Q-e*oOV(=b{T43#a%DA{Ez zUp1dP#->@a4BN3vMw*wbW9FZS5mIpOnfbyrie`D!c$9l)4w1N(^ zY?n;Ou9RzQmHQP1ZGw|tQlQGil36l08QON!F5AwWf@C7ogu7_Hu!=^mSjj&(7UVjc zTvrfUtQ0I2B+;PatOET#lhcxYHpBW>c1k&`x@P8z6cNi*@@8?}tlIMKe+)TWc1^)Z zGg*f%nWdr^W_41*ShL`xHAL|ddc!!cVDx=z)^GuB3c{`p=_M)rq7>ez;7lUz)+GE> zY+q9!0<|YFqYG$10@D1?weU zOOQfED^jB9V+E~=6K1t2fLGM?sS5Bq8S~Oq1 zp1C$-lyi=;vaq&hZZ1|z+m)SifyGDgse%@}pyE1a!?>Z~l88PvRl`l(QV`j+oa|Pm z%4zRTWa=xBb*grGb2gccV4f{mB%31?cQhC!YhY^)--J)g1ap6U?av|!%x-3 zp;K$yMcZ+=lA}j2Pi&PNH!J;rAZ~M7MOT`;s9-R0a_+3Oc}2q`ta8((tF??>qYnd* zPvjJlKUNvPR$(&~ta=l7dU2kd)8oYEH4R^admX6-?dfUKo~(@8b$qR11K+TCMte2fS*0n`c%F z?_oU^+DH2zd~CrvURC#VJ5xH)$@d;F3^9DjHzuG9-2@S^vp!gcU?M`*Q*Y68aUbz_ z@jAJQF&A&piwy8oA5WP3$=c!~5BSK3We&az+s%ZYV`YvIL}U*8V25OmHj~*)nHP?g zDR_rvCVk|(%sAaVQhgs~_8%*=jUXbk&j-uV197uU--oWZ?qWiZ@50b8@~Lh>58Dk4 zvhhO{JG(q0WRAf-i6&g87eNzpFCjvzYD!ND3PTa?5K6{o{3VU4Nc#Da6fmDA(+0fs@ zi1RYFkM!^Sxp6;cDE?{#K|COc`z3ecAu>L}G;_uM=$}{?)Tuh0*OnVDl;#EbP@VW3 zU-$rd-=7h>A^^YaAxm5MIPvoyzM?Op)BRe9j=9a4MfhYQIgJ>-f{e&ao&DBr7=t;44D*l9%Br5ein7^Ul^*SV8OBKH& z;!Qfo-R*9xdl>cexB=2M`vDJ~hZvxxV_4?2t+LPAhH@r@awh!-lOG-}0f-Bwn EANZmFq5uE@ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/ItemSword.class b/bin/main/net/minecraft/game/item/ItemSword.class new file mode 100644 index 0000000000000000000000000000000000000000..7c9e44c5ed037de6956ce0ff888f1c650248c0fb GIT binary patch literal 1064 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 E3oyzh(f|Me literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/recipe/RecipeSorter.class b/bin/main/net/minecraft/game/item/recipe/RecipeSorter.class new file mode 100644 index 0000000000000000000000000000000000000000..a4b1672a351ff384b4fcaecd69297dad437e55a0 GIT binary patch literal 910 zcma))-%k@k5XZlJKe}+V(pHMrU-*NBBG#+LC#uAxi3v%8#2VhW=UNtecg?!x48?WnyAFKs?(ffA(Q(~WazaLkc3pWQ!}Y5eCu5S(Y*C7OdwS%62Tw@6;j zjj)I^NuWR#R4GISx3M%0bxt+~+G}t8Ms4o}OpzR;E`KArnM?$GossWwy=13|Gh6gx8s5fx%E~#=2VI0Ck2D%u!cWI6- zHiR9^*iLpOc2TYzhw(5&IBPpzVbV3PGn`1=Phwme9pyNNN9Z}1ELSi@?<;eHxRiYy zCk>on=-S0i?V;>6M-O_bJlX=sn{u5J!{Oabf&?Yp$ML94Gjf($bV@mCHoy_9N=-Vp zLI*j9B-&IEc2Rfsaunah<&48w5Ge`Sx$Aw?&7+ANuQ;l_LC4XiU9z1Itn z^vvu^1Rh?M6XZ2w?`+xFHX=!9-OY*#OP-##@^-5)%7E0u zAkAcrzDafTqrt51=;arL$uIZM$0rpCAYquthfYxkNwexZ5&8zv}$Q>3lEaY7LJg>7P={63(;iS*h0T_ zs*p}8(y$_(RiqI`IxmeYq$d>Vq9Q$|NKY%$Wm!jsG^0q*D$-R&dR~zhh-6eqFDlYC zManADk|J610qk#8*GjauL#LI#+0?ZKgxMjwcL?Er53!0@=wBOLtoi-LZ^V$@x3tk) zSd4xLTN~;cn$gbcw=gRIcIx^yLVm&VbD_SU;iV6TZexRbOU}ifc{%i0f2d zfAR<1*wk64E^~ME+|4`Nn{~8%N_gkyoo{5Z8f3A@)OO47aub@-f)2Ezn~J+k_X|{V z0iCM&F~7ia@l+~4z=u?R9hUGBKBj9k68Hq4l5QKO@EKt`DV@aU=q2?p)FbPEAjJMe SvjL5b{7xwhUs9kBU;PcH`%5PP literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/recipe/RecipesCrafting.class b/bin/main/net/minecraft/game/item/recipe/RecipesCrafting.class new file mode 100644 index 0000000000000000000000000000000000000000..581eddba9bc53b7dce850eb9263ab92f5e0e3287 GIT binary patch literal 332 zcmb7Nqyty@+$aH~8U`^xIRx9u`ct*djSgxN;F zY1L>~tGjB$CJ=^K*4c1F7|c)Cgml?Gae)C2#>g-vOiOvaeriRO}2pMmV`1EY6oBq&7V U7_x9EI_~RC{74dEBAQ_O3(FrxkN|Z*nVK?Hl0nlc_hN;_f&*|UR8Pc$ zC7bvBY}xw!{qy++;2LF)gs|v1sMdCDynYU9qgz%saH~8U`^xH}x82gYb&ix!ZuOg1 zjqWz;zTUD4gyEI#Y`7r|X7d#xy>)9YFu-_%3`4@SlJj@_wr2mN>xK!Zl{30oX>Vix zZKmPH?g(eq|A{UM#iQGM!%G|QmVao^BPcE)Sn@8!DdLFcl2o68Z1I87yEGCMqHzpa SI1-)obtZl+iEtvCV0r*bDN23- literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/recipe/RecipesIngots.class b/bin/main/net/minecraft/game/item/recipe/RecipesIngots.class new file mode 100644 index 0000000000000000000000000000000000000000..8af30922563962cbd627a233d50f7f10369a08e3 GIT binary patch literal 1549 zcmb7ETTc@~6#k|cmX?KbRZv8sh_qamn-?gcQZ7~t7}qpuhz~a+jB zC!ZxMMg#HL-{YG`J+m!fu%N!o%$|JbobP<|?R@$1@c_UC78UpydM)8<1;Y|Khp)KW zDlZ7la796LM9$b0+9Pk8sfWf%fUJ1@fUqe_K>N(I#n4P_ETh@ehEEkkD+s;1ZxrnYR_xeaYf zt}5!$z!366bGDgh=t}=fVj_eloL6v;p|uR&(?kxaq8TmJz>ta*8?=>caFjrWBeW#K&L%cfwcPun?eX1HU>?@}<}t{HSk{ijkcckgt2VV=*IyudKr{kQa_bQ4K5 z&n>OIh9Jxs5RTF(@4|#1Jdn=8r3<;*}U7Uqz$QFmB+Mf}7-}V+$tN zxWjXGC6SUU%rLMh{aZWS8Dtpv-&-nXlJYE7JPsE(61Uo; zInOssJ__shwv!XHhUc`BGm5W7zf>NBpc|owhQTKdN+%zk=})IML|;$66EGX!LpWZs z4>ju#?!%w;@1jP}26oY?({>oT;Ds(xD0mpU;)SBR{tjJly!zd=)_7g%rK0*X)GtOc zm3mSq#L+{09eUAMV)2!j1u6F2Kk*uN{4Kg#hx|jI5m_jn19Wa03-o+Kf3|NA1C<`b z`eAAp3%D|M;R&7Esa9NX{`zPjJNw{PA4^{=0{01V?B4FQH8 z%Wz{Wre&lYeZh?_>MKUfbd8mmW2DSgBX&v-xoO+Z<}|1bHA{M4k7adhF*cQ4GEy!> z)Z?DiUDt4|97DtW{CJ5LcOBDO9Ac>Scw=P#A0*Efktzt6G=zFGG&eUFLL*ID+gd}ooq^GM7Y%J8+{q9S+johP)_2p` z+7<@GJsd$)XlT1h(DyWqJ-Amx2SfWdDa;yqBO6O*?bLGYsCaX9qKl$irOYi;^c~~> z<EXCfoUKgR$z;~Zxwd75(TBYnVhqjO*pVMlq?uzM`WeEMf7=~%Y>S~~JK^F1 z670i%jzMuuOPl(NZKVZvKgRvj&ji`U(SV{Ug$7s1oL41tkF@Z;N8Jn_Q&>rWQkaQ0&N>6c|6nKS) z3(->?aRF6%P?_cv95ZFM3zBmj2?1+mvCeax5m<<@qS#X$PnSSHMx7%mjS{m=E6rgP zj246zIWiK<*u|tSaV$%lgcXJ86I&(F7h2_bMt~7wmI>uJ+=5Y0h#}9RA;eHUPCa09 zZ6#?q(>hfdL*2NY(z7$VV~Vv8s&2-l>h0aJh_-1Pbg3hHI_-B7hJnt1J3S(L5!LL3 zZt07LGt@Ps;YGTUw<`6xtEZMDxPX^Lqj;IvJIjcxK}I8Z6|ZSnrwd-{RwEhR(NomO zI9|sa^r`cDcFmYtU})+b=_+e$MWVbjZ*jaWavRLKbQL0a7w>C$kD+fTpZ!GL6e`CD z_>eAaF<%S^Zykq>d#Jo4`VC5U&%EyJW7zwD6Ha}XPEt5*%$p8~dMG8S*sTR^zegFQ zdnBEi&{zFxiNx(SCuJNrMLpH}1t5PVeZm$sCu+*{GYZf{y;jbs8s$hyK!o-y0d|Hk zMq@|!HSlh26VZfHv5A_5QdbvGsC5nTM37!I_0ih|+9c2>LW4efhd`SJ+CpeWIojf* zSJB!X+QjaJLT@FZY@nSEZJ?X>H_%I`HZTxRXd5^ny7__ch*(bs0vG4 zYWni^Z`T8?*^}A2eEpJeU4d|Yw=4tk3$8*G)o4Hs+R4=f%`+509*r`TBc8i{DC9Uk z!X*kOK&|d$d_rRsr|~I1BfGVj#pi^nWN8pzpr5RNNm}(#|3HxaiKqsJ{f^P!=n%tK Jv=zYDe*^t=NH_oh literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/item/recipe/RecipesWeapons.class b/bin/main/net/minecraft/game/item/recipe/RecipesWeapons.class new file mode 100644 index 0000000000000000000000000000000000000000..711b5962edf219b8a5fbf27e5026453c9a4ab1ab GIT binary patch literal 2100 zcmb7FTUQ%Z6#fn~VUjRF2$!~sl>%0h3TdHK+q76q1+iS(P6eiT=}B^cfnf$G1E|ma z1^xp2)CV72W@&Nhg5|US$mON(b7r_$0d-}qbJ>?~@AK`wC%^pp<1T<3_`*OPL%%1& z!kXiWa=;hE!V+H-1t%11g+P>@by2vlw(6YV>%LbtpfhAv_$Dv7+*>NllvYGJWN3=4 z@A5DdfmdZ{TUeMpFtftI@s^4V4Uydh1^9Q_V>8X8Tc zkT%fF(0T;AftJ7J76nbBm4VGC(N0@W3Jj-ABv5bQ%nLAa{1jfsD+W3ldXJ#S6`R5> zlw7~OTDT=w6KC-%<-AUOtkRp#PyQFLqKtCRM7Q*9DEp<7E2^RIi4=Nq-oR@Nok!rP z!btK=ypBGG6tU`u6M^qBoINV=z5@m9Mc%{(>1I?MzUF%sDeE^eZ~!&#yGnY|#3d!I zZuvoF&i9pc$i!tSO)IIjm+uu5Zypv4;Y#GICay`bsjP1wguHH2_sQ&)A_~dywh04C zhUQ6X#_5f6f`X%L7N=W1$`{J4AQk*jFFfztml6Ua7=Q%`nvWZ~mil zEQsbQ?(roN6mzo%#u?6?R2?hi<<&ICFd;kkeX>42jI1VsrZI_W15?zK2V*n3%mZGg zi83*RyHvML?rw;gMTXOTqq#%#wQs1(eBXp6`At+qN9OSX<_ypv4IGzqOw|idH8BsH zsQulATW&x=%(ePUL2j;N;iULvviF zLr>Sd1QaF~C7@n)+*K)9HsPq3^C0lIl31mgx21vx#*+$TQSfkC1mv^HgG&q-|8M;x z&p`s7h>k*iaYY! zuIrCT@-up`B`*AgG5btn8}CJlk-no{r?m7;&kwkx(z{3LW#-k*=(nEX!DF4Z>k?^K zuRMAF&Eq=O8HL$>^88DMSi?ho8y{s1MM?G%;blvbFgopH)ljkQWE>|$G~JWnvHy}G z{Zo;@BD_uduSkD8%B2QZ`bU{be`(++ya}< z%Ou}KJD#C~)#H?+cqF1RrkDtYk98usj*9Rp0@|DK5LLQqgffQ>lIesvOh|ncWs9P< aLjN5J_6M2_XzVwP|4L2_pOLB#pZ^6}B?nvp literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/EntityMap.class b/bin/main/net/minecraft/game/level/EntityMap.class new file mode 100644 index 0000000000000000000000000000000000000000..3b85bdccb70854267105a0242254acee886a0240 GIT binary patch literal 4218 zcma)8YfzNu6@I>D*@fMYo4T$mkPrc3cR{?OF5W;vF?fpvl|;+3`w5>e3+^r`rq;Hi zt&ORTZA{fPUTR8uv8^2;v6*x_$&b!-rp?dHbf%r@OlLaNndX0*D1FZReXD4hDZs~h z-t*qhd!BR7`~LCaZ+{11J$~bcL&Kt^k!ct(lSV8RJ)CLiiw+nK31h@aG_)o&W@dCp zbjS^-hTNm{3es((3i9w3mj{m>@ zUXEQCt``=xS8y; z4no`3nMpIVfuOd%y*=1PBR3Dm4G(hQ(@}!?8ggobU2ZJUuy}T6d*H`HnOmx%W;SPS z3U=i~L%EK8cmzGG!wZia&uN(Z_@vFLRCH91>p=y4GOkKTA&LYo)=_MsS{=D?i7uqW zZJ|0Hc@|otLq~yzq7JgVb9kWFNOeYg6NZL49fPrGqAQv*rEM#nnSPTVt(pa44GOs0(#qo8_5*H}E;aYn~@5y3h)xO(AZPlywAMk{H{ ziN+ZbzFLd(X`$E@?9Rs~w7Ai%p<)K+p4dspW^AF&Lxbu44Bj@G+NNV`R(U`a?K-w+ z72U#ehmIZC$!QWp8tQA?+S-D%@RbT~Szx!EVvVf*f{wkiww{QlGo5Da=x$mf9WUzW zdb&edvtP%7r#rftyEEll7juRMV5Yl53gzdIv)5B0Wd_~7s zaf+Vp9UM+d^=TPA!Tg+wsiFSSv>8h`G@mfj%?YzFX~bJvn(}cP-*DsWterDN@{DtI zd{f0L%Q)lcG{$tCwG`14O7Sfn-_DL;K%K^SbiA4!p%ky__-=Ltlj$_Rr{nePh;DJf z_jUXLZ_v|e^CW8sD<#XmB>oyptR?YM6qeeO)j_pc9+YH#P?FRsN$!*+c}lLPSEohe zK9lt*+1%XHqT$etJU$udvv=?eAyqg$6pv<%Y$kZf<82-9NH7-;CY5^hMKwey9@p_M ze#*=;(_4%vOOmD>^mECnQD-wRSGiJtspD6YVlLy@a5TZn>e)LuoQfH3rj+19Yf;w9 zC6Y;4#%#&q%sfigbRtbEx{|Etln%Kul;nM(^sMem@?KDS-U^g%&Md(k{-4W5F2KoO z;FHjMm>2p0{sRPo36xF4&k$D}cn^yvQ27{Ehf0g{5)-Hil_?nvl`9zz-9yb)*QruOox=w2{lB^dHe|G zp#?rx^7+`qaa~x5gD6EWo`H#HStu6a462wL)p!kyafvhUP`=Oh$JGBBby&*PLzW9k z(sH)wOspU!nnEjy915)>%0VNsANf<<%t%jy}fs`fkmxqg@5Ey_t4zkYOd zk2>0VPTHWhc)^VheLm&=DfZxpEvO;yYQc zG0QwhhNI^&v+BhkVi(;L$!Fsk%Rp&*0{QPF;fyzW$MLz~A!2R(pPW|cYR*2QF9CL`gDTeEnN2%5QJ~xGDW>=1p9rul`B4P&+#GHwr?S%T z7I=Zm1%9W%i_{hb@&d(HXpR+WzM??keO%ITbL!$)f#xd+c;qxax2IN*>6%ZM=8!bY z#=M%(E6s#7wLqTGW##L3aUQd>fUmGJw4xSmq-871>NdK)ooVqr&Z7fw^11aR?8I&C z!auMZpHcq+TQwbRS}9t!5MM-+o0Aq9S-Q3QEZsyl-9$FsL^j<-Hr+%v-9#4MBo~)i zNAmc5uAn6z23MI@f*%rjP_5>2^K`Jd?O{6-9x3 zu_fT)|6TTlRB0!L_wlXNiv{#XFUv`c_fVX7j)6)XMwn%!fic*qqVEVF3`gnw1hoS= z#{1|M4D#tVgo|ul;bZg;()b7&e9EWj-!X!JGN%5`bsvxpiT)wW>o#Q$d_l_OW}1t? zkg{%4*2g%sZl+^=nD(>R$z4+1-$m=rQgejJ#T^gP78mKgf=))ii_!lP?Y*L+|5Gw8 rdEikYP>0+vk;`b^@5ZJnCTYIhbi{Jq$%QwCjc|xg?k5davA+9Xj{lv` literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/EntityMapSlot.class b/bin/main/net/minecraft/game/level/EntityMapSlot.class new file mode 100644 index 0000000000000000000000000000000000000000..632c7ee2f23af12af32916209904416a06297c6b GIT binary patch literal 1927 zcmb_bO>Y}j6g|)1u_vh=Xenuf>%?isW17haG?26jNg9_R7m$L2R5qR1Lp;T?D|Zqo zTXwKP*@g{!79gdnV8IXIFCn3x``$EZBTMxHS>t=}yC3h~bI<$dzrX$la2ubb5mUI{ z@k4h%==hDE_jTy*dHcTG_7DBGyV(hY@X0;z(RRBVrjby{KlBbgx9xTI+|PC&`i)Q_ z`JH$b)E4z8Mo)fk3ZoW=kX5))=XjqU?C<)$FTCBhPfxwu@Y*|GFAzIAOoXlAF>fB=VwsQKCJw#c zoDuVcV4bS8uW-Yz)oPVN3nkXL4{7)v3rVCzyJjJ6vv6O&jTG1M zZO{x`l3B6f=#!@Z$eg@u;f9=~T7IzClKs`p919A=+o9L^hI@~2iF?ha!c<>e%!VVX zEDP*qyl3Hk+*HUK=iOew^ukwlO`d}=XuI{`ak!kr2UtquLxqu7Jr?Fba4*^><0ZN+ zSMC#lez3mU2j}Yf``trd?pU?Rb=I5iJHR=rbA&A6Ul%4>M8#964w9z{QQ;d9O3X5G zmtTVzY)@{Cc4-!5jQ)8C5#ku|jVzPT`G1H~2rIJvr8t2QZ8`d3Mc2<03B6VjkY&r?hq%Z?jqfW4L0ft1_b# z^c^{qqgOjWJ;k_FHcHW%GD^ug!T2x8IC1fwpcv^z>ZM56F|-ROnEVxaCsGs5D8<P3LlBV`IE`4)f7Iexz3- zH`w_2F;*yw$5^B&9b?u^vmlmH?G|P6fiWh<7=JKd{S%8Zd?|}GBbr6JY;Bg~F6eeI znQKnl-C(=7*o3r}g!-3(1rq*$?rWt_UpLvqBClH-v@ejqA4PbrMtG&2YWx}2&d8h9 z^W7%(S6-@{KAkrm5jTSk+=+_0l(Mj-;P@Mrm}W>yAFk;#@@@p6P0jxdYJHQ7=aV=4 UCg1IwTsoh;)hAiuW8L4@a~PLvNB{r; literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/IWorldAccess.class b/bin/main/net/minecraft/game/level/IWorldAccess.class new file mode 100644 index 0000000000000000000000000000000000000000..8a3ecaee8de1924d07bbf6064a0a37cbab16c004 GIT binary patch literal 438 zcmZvYK~BRk5JkrY5?TnPWrf(VK?)mufQm&cQ7KYYP%B{VIzw>dIF;=daWxhkfI}f{ zQ$dmN!hbPuM*shh&$o8~xQ3G$S_Cc>T3QQ*T(c)jOI9P5xJF6y$41Lyz&RQd!!Chz z!PbmQrb>D{Um&*x&TFQtp=@|HP{jmA`8;p5nIIPCepxV!1fnd@^UDVUr$6k}oxnd( z+d~^Jkqs-Rs0!4m4S}7^ZzpESUeq1aR&eRgo@L`-J2R_=D*L1GJe@Xk%Y?d7R@m2B zC6o)AjsJ;?fuP@D->-HxN@NDNcYCW4W+3I3ugy7JB<0?xZ@8X$J% i?Lh>-#2EI2wxJXB01ksDa1``-qp6>}3tjiOp!WqUVs$G3 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/LevelLoader.class b/bin/main/net/minecraft/game/level/LevelLoader.class new file mode 100644 index 0000000000000000000000000000000000000000..8c9f1e6dd87911fca1279125e2b74b34df57838f GIT binary patch literal 9847 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 XO#SLgCtq;@qk#W@%TVSsjH3SnSfGyr literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/Light.class b/bin/main/net/minecraft/game/level/Light.class new file mode 100644 index 0000000000000000000000000000000000000000..c6681e0ba812e22196fa061bb5843d1fa0f8e18e GIT binary patch literal 8664 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 Px%*_|QQ<8;>W}{fvol;G literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/MetadataChunkBlock.class b/bin/main/net/minecraft/game/level/MetadataChunkBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..375593fd61d3d468f4df344ea0ebea8d73f996d3 GIT binary patch literal 734 zcmZ{h-EPxB5QWb=j!jb2q@kuzTG~QO5*IM#_oBcBm5?e0kSL0PyN$afZXHK5PE>d+ zgse(j@Blm%;;fguDz?_&nbpkf?D3z!zkUOFfx9j&f!$Q);W$oJl*uo7IFw@*CTgaV z@QuplvCQScXqukBN+!{%3tOOhB4;v8WI7Dr4Ng>)3y3qWL#}UJ-v#WkJo{+y$>6hq z^E^)D{G~v*)0=x{FCLEa{loI<_E~!{IaYO4(DdM8Nubi{_G=Kh;-LyhE8l}_)QX2o zMqT$%GwOzix>4&M7T^dpdc5r0>3E>B4|0$wfmUx4$)qo{SjYc2?R*q}6}UHl){Fk^ zbKsfG_5?QPmzgV?%!dY#3?3UiF?ee5OrU-=nP!oC9qVCNE*^Vd{}DW(7Zv_khom)B zLK{<(wv?nPC22`X8d6fw+{?^gWb_jjZ3NoEIU2!QfmX0yU^(#Z0#^gSTHspXI|Wt) z-z~8AgQ*s7@_VZ+TY$}GHMU#iyNm`_(ZnW}a0e}HFz>x-&%G^1JcyOIdAL^F9LOrw f4wb%6n{^I*YSpHyma0RgM{lD`x~vWuS=jvtls$)` literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/MobSpawner.class b/bin/main/net/minecraft/game/level/MobSpawner.class new file mode 100644 index 0000000000000000000000000000000000000000..de0717791897446af811f219a329d6715be6412a GIT binary patch literal 4864 zcmc&&dr(x@8ULMg@7;yv0=vLvMU-fL1TcajW{Zz#6eVne_&`BW6EEzAy}0a>WdSv6 zj3F9pjE}@9s0m^cq7&NMB0AM+wViRM?R477H2o(tZKs)O{^={3X*$XH=y&d29;Tvp zCTVwIzwi9c_c-T#zw>}!-2Bmx0X&A|PH=`PVIx-9Y=({csNN7OY}A{L!jRE!gbJ5M z>MC3Gj<6ARLS}F`>Fs)9NDns_F0X4c>SGKE9g%1#KrMzzPopwI!r)F`{-zhC9|Qp5C@8H`{5b^TbRFRm=jdq9dw@1CeG? z87o;^%nTK-vaoqBJc37^m_5X-QGF_W_%?$xY;2DC!!%eq*PrJX4s%q@1yw0gbd`o8 zI&~5+N?pX~g-#H;QbuOAOpgUsJdQ)5HCQk9OM(+mGZfyhe@WCZi199Lz zbsmhF~WmHPlt(8j#0Abmp;#ou)GFy$&QE@6hY73t& zXnzW@*cNkWbBTj`%NIqxTq|$ea<>`TpG_p;Ho3KpV8Xm&L$3?hwt|TD#PLw}a$)B4k`5bn$AYl+iK4-jP z3r#=?acB_5Bicp8hnTawX`e6gHm_{q<&u0!eSC(N;8V3kU$W-%rAWTiKJM1ktW0Y` z3fvAdysZ(~NY=?ikUXke=+v96r404n(K|&`kF&E{%A4#RE%`X>84i}C1bW$_;oMp; z>l_Z1-OD;Ob$8n0x?;DMY)OxnV#%~D2N*apOy&j?Y8;Uc$)HQ(ehGNZ| z?oDsb#m)YpNr&^t9z~oIph%%OPKTx+`|u{&uU9S|Wzss-o6i;yC*7J2uy= zIlJMxgqj-5>jKsZh!{fHh9T@3fe}dv+c<>P35<9`Sp5)Y%=Kn@uVQK!Jn=CQ?;MmQ z%X#e$N>xL!qP176)f?(y&iAcAey=`J07Qic#;-wD%M6Bc(tTK zL^>VJvJoAvgJ|naWm>A^)Qx|1CNV8ZId$X1iJD{Mf=-!fvh&o9YC)>BEyP`)EY0uZ zPiyjoUcSbr+E>Y|2+rMwytY@4uo{c3?5|%XEBj!WFy9ziLxQZ0f~2@<+lZkIWxs$PM;@fF)6w@cFTJeCp@^RPvoQe+>2bf5Uh^yHLaCx&9nR!LFdx&i@^koc9ZxdgDJG+wC7^<(U^y$m3RaGlEQD3;ZB(-Nv6>BF z4ZDmgb`{m^msra_L=F1`JrzI0I`$=9-#73KPr^o?1)V>LIzAWmd@%xiDT2HVCSQgo zz7EY?N0>+OEN?@Uzlb)z7w!Bgw(zsq%KNdMe}WzSUwB?hz)mR%FG%B1Ax(x~%Eun5 z5DTSZ?2}5cUn;|^QUwl3)i@~C;*hifhovUGCT+*-(m@=NPUEO_2FIj+bV=vXEuF^+ z=@L##AK^{u3%n&~p+{bcQ*sS@WgVww6K~65yd!VMyYepd$*9^C;uHkkUztq{7+nvzr;l)0hg2%TvjIFCrTBrC=Ix(bl|7TR{Tua zgA>X@996pTb2ruI7GQLk~ZIm#EhvZQv!ghJL<_STG(=sfqh+4OeLG_YjsKZRb;L z4IlGzyi8c4bdbAk4WIKl*h`p8I!%?eG<-o(zC&1&^e$E0(&+s%75fNNrGEBjTVpbx zM9dqHWa%9HldZ7?J^}j)OOejA-`g5XBCfnjSgLf9ePnCwed62!l))|65DP7h4X^+X z66TS0Hr>|PWwxG}U4}H-WI47*tSrJ|!qRyXOSUztW*npX{o2Nexw&|a>@q0-EnB0C z$1$q$RU0FA=iqg+(}>TX+8VJUju8)jXk$3Z590_uyfUR)UTSN^_}}0S9EF$oaoE;y zj4J*q9=J|_dAi-6o0!5FyM+k6PLRf!6H6>f+i~baJ)kjq{?kTS+E#I!zunn}bMcOh z+dMI*4VhUs*P%HfrKhKBx6pKF>rq+xEqbxud-yIW6x<#$r@$NU!{>iK<*#wR^lze( N`BDYDXvsLb{|x|LEMx!x literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/NextTickListEntry.class b/bin/main/net/minecraft/game/level/NextTickListEntry.class new file mode 100644 index 0000000000000000000000000000000000000000..e441107597dc85160226f7b9e0875482a2fccad7 GIT binary patch literal 582 zcma)2%TB^T6g^XFD_8|lQNXtwX^f4^&d0__LPBsMVLvUS4wg1415sE0k_%$u!VmDH zjJJ=S8)q@+oVky==YIcuegQbgo(YY?4uo=sG7w(G@0Ihwhr;p2MEFieJgctsp4xJx zt^*aln9vzY13ux7&w~f&)*T2>F&NL6VHoupSc}9Lh*(N+XO5r$#lN6c^g}ZPZ zdE!RKe^&mi?l9gOj%fNE?S6)k%n&2%8IqAilZ^xm88TXfMS1h|`UZ{afSUb*1-m}Q zqP;%FlD#p-ioK#wvHDI?4b?a&sV_jM`aE@5pbkrPS5c%G&`dj_j&)LT{svXBgl!Vj U61GJwp16i>VmiflNNL#p1w1lsZU6uP literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/World.class b/bin/main/net/minecraft/game/level/World.class new file mode 100644 index 0000000000000000000000000000000000000000..0dc9a676a76a40ccb82ac9813a03a0f380cb6bb8 GIT binary patch literal 33419 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 OgG*Afe5f=ffBb(*_Izmo literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockBookshelf.class b/bin/main/net/minecraft/game/level/block/BlockBookshelf.class new file mode 100644 index 0000000000000000000000000000000000000000..92da9eececb38d6050a056166ae2606b8bd4d0a9 GIT binary patch literal 867 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockContainer.class b/bin/main/net/minecraft/game/level/block/BlockContainer.class new file mode 100644 index 0000000000000000000000000000000000000000..f5a3667e829829fd583a5194f670e2f039573844 GIT binary patch literal 1142 zcmbW0+iuf95QhIr-Gmx9DNbV!=^-tpBx%4LdV!RJ1Qke@0vAw)>rJv0gJUDtjl^Sd zlS*9h06Y|8c5U1Wu!K;g-Pzrl`TqUA`TpbUHvo^(tDr=<6UxM$`k@@h;$7k%i>Y)2 zIg^1q3Zn5x_n8_Gqc9Pi6IWmmcK)S=P(JWOKY2p9*Y*a5B~y{e*cXBOG7I{hA;CC| zCep+LmMkoyOsEYQ|LSx)lJSuk1(IM7qOk~uf{S^bZ5qjY|AgQc^Zs_LJ_BbWzE2=8 z4IdDC#XbJiOt7L*TlI7@krTphySV&q6bF;O=Xsr>x?;nEjk*cKRSVZ}olrfNiEj2h zO#I|C;ZeI&+%COQ;s;XdboYqEw6braiS-KB2pff8K+CbPflW5`BqN{qARM$=>;Li9 zw`>)crcR`mKTM~6zJ6xqYdMW(B2XUPvT##*)WmHIZFC5YSe;63(?zjmC01e0H_>T4 zmM_>0LS5(O&-m^KF%!lXTfV@51;F4RKQmrec;)e~+OKq*y)#_;!eI#}k0#H+5+|Ct z%uy>%gN0>YaRI8RaT67-;0kB6qo`+XKQUsF&z$bw+Iqt{!>XRUb2xL{IHy!~*Jb8Z z(cpfHw4YYyB!|yhn&dF4rgb^k;z$X1u+5Rd=WJR=4>G#_i@u}jbL{?3wwYXK^{W@i bc22f)vYnIdoNT9L!%z>Il@Pi-maz8|j79<3 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockCrops.class b/bin/main/net/minecraft/game/level/block/BlockCrops.class new file mode 100644 index 0000000000000000000000000000000000000000..44f05c8255332d7c1dd8217584a9776df4f1eb85 GIT binary patch literal 4112 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 I%TxIHe=^>1#sB~S literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockDirt.class b/bin/main/net/minecraft/game/level/block/BlockDirt.class new file mode 100644 index 0000000000000000000000000000000000000000..9664c21181d548b4257bdead3325924b445a8fa5 GIT binary patch literal 549 zcmb7AyH3ME5S%r39Gj3pcvDeOga~1oHb4Og$&#S~rN1~wIPgO{Z2uQDNECbkABEUc zA_}BP;fmXtz1g|l{rdj+1aO8u7Z#zH%QDDRE)y*t%3vZg8Kkn7X)sEQwiRk^RXym5&KW z@#3`uA4}-8;9!*yax4F-HEnldUd(NkjikO8qf`>Qagm60D7Z)Fv!q=?}MDLf(gcSWTWd9BPp?ccp0KZ#l(1o159u$~8MaCDi)%uL?zH=H*#-_d?$ lW?{|bID%Ckn&>jxpDMAA4QA$j6I<+K&^9BB@eVT!yFXL>i)#P? literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockFarmland.class b/bin/main/net/minecraft/game/level/block/BlockFarmland.class new file mode 100644 index 0000000000000000000000000000000000000000..3975239cb84e97bbe44b246930439658deda7858 GIT binary patch literal 3519 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 BN}~V( literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockFlower.class b/bin/main/net/minecraft/game/level/block/BlockFlower.class new file mode 100644 index 0000000000000000000000000000000000000000..aa0d86f7f73e3b298c3987a26bcec60d772db0fa GIT binary patch literal 2823 zcmb7F-&Yey6#gbzh%5_%XlOyfAGNYXYpkd>VzC5^t_@%%h1UMCLoy~So87qCDEt+D z>I1&?w9h`YJvN@xhyDTmqk4L0cC+RvSV|7FGdpwd_uYHHJNx%PfBpsFV?0hF!H{!B zkZ;(osQCP0kgxHE$UEYRaPpguSJ}!J<+$W{Plca?#&G%|=NbC1+pZnVGxV93HM7p3 zEqYZkfB_7qpuY{a!2{vj+{rIT69Wc@$YaytZqQ;lSK61t8@6*gl1Llq!wAC#)A~QA zGwTCj$QU?`BMgUCIxM#;wk@|Twu81W7?`EgnK1+J;9Z8HmI%srWoy+fdAv$7oA+nd zwfWuMXWEU~*;(zz`0g`#e$v1cjx!9?d6nOy*LJHE+JL#F{$#?^B`V5FyRj+!GT(Fv zEK~9-+*#+89a={(wV-alJt=S0agLZh;r@r=<03&-xO>;(6`{y11Po`){WG=U`A&7t zqO#uCF@v)y8y=#(DuCp_P#c=PwTTlE@qvM(}kzLr$W2EM>FgFzBf zkyB!Jq&_zce2K3ZM!MQt76B(FysN;XH2>PbH@Ho$Q1!j0vR`OffoMn%-x+v-?+Llv zt{ZkxU-1I_;SN<;syJ$eO#>APmFYs2s1m_CciKYw5e6QjCbQY4C`7p~*0#t^*bJoY z<7B(&IgZ`3Jy+cewp%ND+e^OJxa)ZiLtgdGUg~MqcUpF(m0#GlTMLd|b49gSB-t8v zYqiNAx5Z+6leCaDWfL9t1zl$TLTknI8{APblb#6vp4uqyG{dtN)o#se`xUWd%WG&v z9SuJT=Vgg-k`kDtZwfF7jqcihTBm5$q*1;HHB2 zRg>3N1owcvCTQ;z#d`S#3O`|-X7evl{0V8AEvi{x^0_7%BqUkbLT}BZ_zEDf5tEzsj*ki{}+qF5Hc=5`+~tS|Y|u zL|CJEgssT$IeIebQN_^f_oDJ^gu9X7Q8)*%yt0QSLj&&Xn5wUOF|X}u>8XgD{{s0v BFYo{W literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockFlowing.class b/bin/main/net/minecraft/game/level/block/BlockFlowing.class new file mode 100644 index 0000000000000000000000000000000000000000..6e62aa87835f89bd7bc13ddf8c280eaed465f0c0 GIT binary patch literal 6011 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 B!_5Ey literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockFluid.class b/bin/main/net/minecraft/game/level/block/BlockFluid.class new file mode 100644 index 0000000000000000000000000000000000000000..c0be7e44af019a48edcfd8ecc0cd5425681a2fad GIT binary patch literal 6329 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockFurnace.class b/bin/main/net/minecraft/game/level/block/BlockFurnace.class new file mode 100644 index 0000000000000000000000000000000000000000..053435079ee1a36e96a15ffe2d5340bb8df98604 GIT binary patch literal 3770 zcmbVPOK%(375=U~oFS>vi`Gz9B)N{AI3#78ie$^O8NVc%HdD!QELn*i*X58LDYVF; zLJeiRPxpar68`{cQ}2WVS+qtX2Q3g}+inYVRrDtm=%PRtL6YyzgJK;iQ9A-SXU^Pv z&iTIcxTC**^{3AOoWrj)vp3zb@NIXx+VvyHlK z7A*~m!129on5x;1NuzavaC!Ao(J8N40^+uS`dZm8JLd&LiQMhvf`BqrD_Ie=qeFu( zklNLJ)pV?S*{q~zeL+Vjx@e%z2nCMK?0sh@ihbzOp&=$PlF0opTaybB2=wX*L6uTm zM;{Id?05Of*(K{i&Yrg(IE}i5oD=ApArsdc)q+)@HwzVNV>7j)Sy?a%htIxJao#Pj zlHc8f`F2J!guiCiU-fRI0(#AMGj^#|vPuF+6T4e`t5&a+GPztXxghB{tm6kb6eXgU zbi9m1M6_x-)7GNds5sN*y2T{cY=J}HXVHsg%)6b8B86ibh6N7pnjbe39mjD(Ai88Z zE`l7xR}(V4Tm&N+)j*Ul?P{Zi8y#afDbQV8G2d%gQ;mW(Q>!gERs`DKxh>-v*KryX zTtR@YuUX46OQvHAXwoAY@uDB`Zl}E4xOY44-MC*&3UtglW^sAeT=BEm6~x~xfmimD z10Us-j%i$GbF4Zwn}u?8cd}amXCy&!iR`M599}1~Ac}2d9+!-`r*7J%T6Ma-x>7M8 z&X;BLOzb7bnS17%nQl1cO8SOtB9mNDE^wAa@dn=1aGidiU!vm%<^&=(8zNh&nU27| zL^7*f{2Wj&J>t)W{`C#z{QCMv7`G(wYHit4E`$z#D)HRW@gv+N%d0EqefzpucgjWC zKm!Rcn2KpHrRSV_*>j4MFCffMTee=S z&Xr5Fpd|dC5iZb@w5Y zbW66X!$ysGnsJsZmbXqIaDbMjbdcWKxQ<7M@2kQHLVOoX4G#_($}_y^-ao~WZBL!P#Rv@Ujk{h>db^rl zV)Sy<^%A3(1N0&ze1(!k5<`NL!qM|`;915y;c`MaGsYzwnQ)+=yl}c?qEd3hcEu4~| z_qp_*C#|5=PPlQxe35h>Bgi!2T_S&XTSWeO8d6q|&pA*C=VUe3xH?=b3gn%ln{w%}^p5 zQo_HO=iXlC=_14Q>gfx&x`4b9Ql23C6q6q#`;igaXv%KRw{T@#HPj6lK?$^|Lx%c0 zL{lHb*u)FG?O#WSeCqDbZz3WkrSuU4^2j^t0v~1IW30`S%>OA;d75-h5ab!2e`oo3 z&L!z8K{2*wCFPryly8!hZ&p&?CrR$`NIF7084{wpgy>K^+P~!YP)GM=HXnY78IOgw zI4Nsq(`jz>qHP=8;QO)J!h|;Tet&2S*JAVcVmIx=MA%SVeZ5=nI1x2e?FmMP zV{i9qvD=G%;l4;;w9ww(zJ+&&V?X}3aue%@8s6Sg*lEjuD>t!dsG(pB&C4xx*5c)P z>sR{1HLP9}$$i5y1p8 zu_mj(2mkRCdjS7p^%odn0{>)81*UR@K8utheEthcl%j3{q-96YwI&V8rqJ+)XyXNp zj(*MdQCr_I%pO=+^gE@-xg{spi2*i>?l#KOCJqm5Y(E$SK#+EK<{yScy0PyzfI$QWmZ1N%2~BP)UR%#u1F`|;P=LH zo{eQPbA^^Bl5@%%`tg8k&aPk_#}SOZHNJ0wU%IOveFOOMFqQxS literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockGears.class b/bin/main/net/minecraft/game/level/block/BlockGears.class new file mode 100644 index 0000000000000000000000000000000000000000..1feefa27ca3ec06f7895c4de7939ab536e909541 GIT binary patch literal 1178 zcmb7^U2hUW6o%hfXrT!5QBkYbwtfY$af2p$fi?k54F=KFrWf7~yCWUl-J$zI%75}g zy)p5^AK;HNo>|tKAWiUQ=A4;%pL6Ej$^QKH{Re<&xR-&!Q1?V=y3!Mt&)jz4{SDx~pulhBaKsAji-+7vu6! z_>w#3t0c%Hj{-y1lD-wmFksm2FRyOpkU}w!6_gm7)Xe{Ab>qc8c{7OIq3{p+&=Cxk zzOuM;#HmZllf`s+EUC5o=i}$?Y>_Dw?l&1&Zx%je*cyqjs~krLQh6N}dA9UM9d)|z zEBB334ueT|=+zgM86QsrX$5BcR0eHFjyz#^I!TpB40##69`ln(bfY2NB2}xuV_5fv zXA8d_43zJ3C;r$B1?u7;-Z-3&XJ@I!;z`84P=?dzz8a5(%}}lNKkx}Rqfk2L0rza> zw(4}U^6zq7Kfakgb20Z;MZP8WrM9&A_mw@+L^MGi(klh%)zQaWr94B~fHJ+FZL?b%tZ;}T`0LKT;Zq@yboY1LJ1BE8A x%+A-`Sg72_PNIBFvv$!)&nq`$rFKo<^N*+6gH>|1q`FYUg53b4R{FrwlK4+o;!2yIk&f;U+*6Pjdq-^K<-(;ITT$ElkP=a*{mU`-izmmB{5xHg&1xZhx4-556GbilB; zTxN0ZxT{4veH!;E?tN;K2 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockGrass.class b/bin/main/net/minecraft/game/level/block/BlockGrass.class new file mode 100644 index 0000000000000000000000000000000000000000..92bb11bef666ea20a9392d61e996ff78200c58e3 GIT binary patch literal 1785 zcmb7ET~FI)7(H*|#5gsBLPN{=C~Ik(1V*51S!oLEfYG`ObZc0UdNI|+ZtzHKvq0o@7uNfcFn8o=9lIF1K(^kR44+I9}+H*yyv)1uq2>ljBJ_9 zif7pxG@MhB63BH$shffAJ7z7ve!S74qnChH-)p*-z;yA$a|SYqGw=L9ZR?I4`fF|#$_ ztCt*$rKJ1@sg(k=vb%2X9T!VA_blow*$Ujrbg#MP`8BIx7)J32bKlH21E-dMV!D=B zFJ#LpOyatVYXak4XA%PFxPc7&KA~B3syjj1tTo9nnIU?1Sz_gMOkrA}|0M3j0|Ikl zRCk{5*@mOnFry=n*$8mObWg1;5YJ?vrf?ItRD8yOv)$>qjmrY6%TXI{pwUO4>$rmj zN@_WNAaK1qnSTwcATtX(?nx7=;R9n;_PV6w3*4tBG)>5B%L#Tiyuf+>BLii(h9o$N zWgRP66-b?kV$fQVXodt|)A0bK0*R`8N2O=!i;3>!qKQV*wA_{kJ*x*X zHOE@@y}dn~^@sQ_y%&<@+YrYS9gp!1`IfwG-}=>1Sjf=EyV7uMnW{mq3zd zm8TMKV_XMwi6ivllXlKfn}lygf*v7w34^@iA|PqEw7vlqZ5< z3>OG|9^<&&DG-aIMwFLO#gS2vl`PaDH#^Tl?8lBLq{n{&7 zqr-_LL!T+u;@EJaM{bkWQd;R;&nqED8(&5+FEM)xp}xYE&Pmojz(5#&gs)!Xp)4td zjryLUm{PWJ%60>3%=5#xfJ=BtRZ3LjdrG@YaStf$uk2WgzC;z+ZAbJLpBbTkEj%KQ zoMsDOb0_EBLXkT;z82Q8L9HgZPa?MP79Mq^bs`;U>Ufx;v8niU8{f+DMDvfvb1f`C X5e0S1YsWK}{&>U!F~XI?%*}rQDZ7s= literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockGravel.class b/bin/main/net/minecraft/game/level/block/BlockGravel.class new file mode 100644 index 0000000000000000000000000000000000000000..d910adedfdb656f07457d86873a6a64692b122bc GIT binary patch literal 755 zcma)4O>fgc5Pj<;b!{ACQmCPnQofz2!YbDk4zwy-5jYUkGaGwDm--`eH&K5}|3EKX zKov+m^at>xP-l}UpsI&zrP0jn%zJNV_Rrt5a{#Z=vSBf_bE%_DRFv8#p|V1ORs%>WR96F4K&Xt)xFlP;vdP9|gUvg? zqE9|_h8JJTbmEK;{QSVHe_MCgq`M&R*d;k3BkLLj9@STc? zK)!1GM#ZVxrMmUNH+HRxZMgQn?HW6-SK2cc<+Es8`*uTxA~62u>ldwtEfAk|s*XP| z5X+ioZc{+H>+hfd?Q;Lj;vV2ypNJ|Q5?(3})VHEU%GBY_Cq%68|o<<;GC!6fCMtbNO9 z`i^U?S=F*vDM()L;e8b&0++jr86?o~0Y(KfyS5+9#7R>GCa9*F>t6p=y-4Ci4OekZ zKy@1Hp6gJ?Xg0Sk;p8;rF-C$XrA!9nK@l^Fk6@@67r4?D?iu+sd#Q`-(m}_6LgDmNIun2z$~YsT=!~$QnwqXZ&w7a zy-AOFL}aab4WD6w6U0#ql59Et!&T3B9<&HbYGLNK1xC6v3cDUo%Z>0g6~3nBV4fR= zFh+WE(q_WfP0sqdZjHxll`+qlFp?#DYAWKLaLl_RLh6lp*%fE2tC0SKR$W+_kk*Ob@<84zYgL; zj}J-T^E|WbO7Li7x{Xf)Gup=7mLwAm$V`%kq?AFL&@&{`ha5rA@>-jtZPK^K*bgLB zC6Py@AqjsU5;!H?V*GYMxYZ#{dRXKRDQ63JXeoiUgk_4X;|tuSFHTXW@i{G(XMdF5 zK_ple%$In9OX3Ao{uAP2BE=!D%29I)HcH9>9I_zjpAdd$|02KZ*+wW zWoyCXBT)~8OHWa!S!J1VSuci2?}A|NHLQ1X%aDYx9$|x`%bei|ggHmgv|c^UsWNBS PdX-8nbBDlIu=D=E=moI< literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockLeavesBase.class b/bin/main/net/minecraft/game/level/block/BlockLeavesBase.class new file mode 100644 index 0000000000000000000000000000000000000000..74da4234647f4bc4a6b2ca17190e5b428b24755e GIT binary patch literal 1107 zcmb7CO>fgc5PfSqaqBv18-80f+z}cHfM5=FOX#Z$G|#1#lN-9STEvAi_%D8;DN8Uxbw| z?~95rroykZ{bA>%Qj=$0@TnNr_*m%B7`FZ;h9T7r_^9V~#&wyGfwdTtcf5fY-ecG= zI!=9Vo<0vn;BmilJOkC1)nw3)hORK6V#$OKlVR^avsleVFr-Z+kYre{lkUfpep>|3 zc-t2YnfkE9{U#@FvS&^$?0I8`oAb;4W2>rE@0167B;1MNetg|xD9z9HyYx8ffWh>} zPe%OJL>x`pRIFOGsH53&Z#ePYhUbc!cq#_22!zY9U7Szxd>Hs{)uGR78Q4TY$7P1i zxzmW=o4A6j3`SRk(M~u-lBD)KmLq$*W#T%r40_ZH=f0fMwuyD*847Fi literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockLog.class b/bin/main/net/minecraft/game/level/block/BlockLog.class new file mode 100644 index 0000000000000000000000000000000000000000..c3e1c02955d116c604d6340762f4eb54065f2b24 GIT binary patch literal 1045 zcmb7C%Wl&^6g}fOaUAk+(!>SAqd;ksfG}mzO#lffl_I$;NR|C09)hVK!8oD(3M+PO z*ieBgvET#vD8wDdio&B(kfnR)Ud=i8%<=v4^V@d-4{%F^!mu5P*z(;#j3WLbw#M8S zmM3PyvxZ(cIGN`RydqC+)=m;G;&S@wxbk1b)c`PEA zd)7gED58iG5xfmUhvBxpI!`)monTivAx&v>*$171&g z5WDfay(pYa1X<8%*{}GFThrL}tmiy%LciN4DYd`b47%$qfF@b+52Q{mZAh1|F>I|Q zuqz=qirAFiXmfA&=8EqztdB*UtW0XueiZtB*CA`G!px+ zw6ByvY1{5dso0^vkfB`#RQj^WQLRyBQ&*vEbd2f=@~0?wjQUqpKT}UZgJLIdYF#z&N!@8^fCQI``k dOHvz4Qq9E#Go8?)+c{(k`A4+GXj7%2^9x*o-x2@- literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockMushroom.class b/bin/main/net/minecraft/game/level/block/BlockMushroom.class new file mode 100644 index 0000000000000000000000000000000000000000..3d5433cb04bce6d4bfef3a345fd74e05591539f6 GIT binary patch literal 1044 zcma)4&rcIU6#izrv~<}*Sp`vAthi!ZkP77_f(e+KP3n&Xf(d$=wj-=;JGksZ{3|@; z)hic0VB*0)z~H}Rd^250JP>Kp+4ttX_kG`c^M3vL@e{xb7Besy=6WKkb^V@bhx}bs z+u>bN3&f!aYOO%F_iAhEd>$X{hEjGjFd3>>sb~c9NQ4aO$9~U`Rv8A$o>$poFxO>A zSV$pjV*qJ$_4xR+`J`U2o2zGMzb!Bf+ZaKfz6T=G>}xXabq*M^<%a$#n2{z)ei3(D zBHZMyKrlE>+2+9(4}Ik)mu9rfgc5Ph4ZF%Ax)g@li!rO?tQq13oQIRrS+sFI}=B#L_9*ju{PAHj7Z5Pyan z7cNARkT~!I_)&;iJBdJTrEnR~KF_@OX1xCO`^QfJ&+tS;hG9JrvFXb|I1xXL&9~ea zrY8o%GrL~s9Gfpxd=&`|Ifm6)iW%}xWgz3{40CncZX7V=c0yO^&~Z^ifuVUWjn88d zN$#0@j{R1PUvv& zfRjTykHK7gBu^L`=hOeY$QDgA;E~0^>@?kC(52gs!d_3f43)awdB+Fb?8nkGU-Q5X z{Z_-)!B90&Lxn+0DDAdRBQ6=Zg=NCRNbH2%V_2KXN=r3Yb*$j7hE;~z8LO4C@J*Y7 zfitU9jD>3luK1u7Hw@fYb_-;;Ex8{CuBtZ;JWvXn zn__C&rg0)yvKXv<(J;~c@WF^<8*uF`suy~ExNED_9I8^O7$U&lUu#1G+@zc zv-D4ZB3)YKDQa};AeZ2UX0h&v>{v~cr z#jUBhMdB8TZBcC=*-CkbQTIbU8XMWBry3-aQ_SgTDf4{7tc)vsGFFC|)w&oSC;0Xs D0x0|9 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockOreBlock.class b/bin/main/net/minecraft/game/level/block/BlockOreBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..8edc20727824c297f748e415c1e5904bd11c7d1a GIT binary patch literal 759 zcmb7CxlY4C5Pj=7I0-R1xCxgKMG_$lv>XLUNR|Q=iBhw17BKigixcrJRCF{nAP^D- zAHYW;W*tKX5@@BJnYT0Z=Gga-*Eay$STvw9tOO#md^Zq| zNeNsT22^q5?~$81q)^BsjUvNZ)&5Utt(^r!Ige3{F^tCJu!F9+wu6?qj(SosFq@&! zpy?g<{Em<<-th=6H$sPdZB9*)oq&3D=3X(Z{$9cl1K*^s`&_OM#0JCUsfglLBqi+2 z&~Lh3BGs#QjjA!55qB;Q_+>(yYlc1Pht#ezJsCgd-6&_v8w7o-$AiW45Gi;mJ+tP*e_Ku_h>6#gzdv$Hb{KT11Q3QMcjmW8%UX}d+X(jOqY3RnwW6cf{dox-%k4%r(?^Y`YG=YFzasQ)qFR|&n62SHaZAUX9)slW?GLdT1cVGhK_E5 z^DN~5#OBHddIY-fxm#|2GxCG{Efx^2TR4Ox64Mb#4a(NKW=P)L=K8W%TX2^HPoQTe zTycZ4%RabIj9Rqj*V%dVBL2a5kxg&8wetd^6fZ{w?69f?xn8Mwq~p|JbGXH@7F3EQ z$-f1G6EN9>lA{XyBXI1&dSBfR1aK+|5_yK;Zl-ALx#nh!T?E8aA#66jP&^7S|;FA^t^)$s8FG_G`{`8BvJb1&`PLw)_b z$UH^o4>gTGBcQuQFB*z`* z(|KkM4fkgq?Fo+mg>KPT<}isZkuS!c4P=YRFDhg!K_(7fVh&lgg_B%q%=R))CE4z& z?*1)X53?Os*(S(?L^j|A_x|$YDc~y@vjK4gL2T`tK$Brx+hAV&Z4qqBdz( z_YCt~8H`I|0k@H1?t@hs+lj46pE5ew(IPWnh5Z{+;&(ncqI;ihTLy%IoKQc4nLztB Xu}{&>zn^gS%}&0Gw7*N3HoW&I>u#IQ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockSapling.class b/bin/main/net/minecraft/game/level/block/BlockSapling.class new file mode 100644 index 0000000000000000000000000000000000000000..612c7bd7e7792a910b31d1b1b843a6f8268842c7 GIT binary patch literal 1205 zcma)5+fEZv6kVrGZ_|O6YPrZo5HD@9jL1c_T%-`<#KMErlJH;{I;Ul1+9AUf{1)Ey z4@gW&eDDKI{UM{qeWrskBt+)noPEyOd+oLM-t+DEm#+YpupUN$VY0zpwQe?e#nG#- zTGQ)XwfG6Q)P2jY9I6GeZtF*u*{FpfF=THNuwmJ!++heUnhn!kW(cM=EmLNY)@*~z z=t5LM5Fu%)-EK=O)oN8*DYn1MVCYd0M}qca?s~}!cC%p|GepxH-X~zeR4Q=I)v$vrSBGFQ9_XJ2HVNS^47~}T&>}foV1qFMDmP+tN>120&j9x zCyBave5@dcDSEtY!Q~@CiJa6);r2wqG^jXnax0k@-?HC&Rr>3-E4*eE%we9|S99#s zlEXPQq{DnSO6^`y@Em;<;*FcO&M@}B>UO#^)7fS_+nktytMdI;QgT*c=-zhq%HgJd z7X?wa4>|Ac83RAtOn5W1U#s!fiSc3R37JWMTD_6+o{T5I@&1$|`ai*~#IN zlr$K;z#X!ry_D3#a3cB<#lc{tg?ndM^E_He&xcaP>k|^*MJgoiwJ>?^9lBajcYME@ zGv6co8PCMM;N3;pL6afV+Km_~n4rHghXiKnopcg;%po} z$1zq+->x~Pt3PcTDtd8_oxYX6z{t_996DM|u%SK`aa<4>BkI4L&Chp0Af+OTSc29? z6_+p|(79>*b542vS+(Su)KkeVN(H-0oY+jgvTWDp%w^XWNS3^^>CT&^q2F9o{5Q_# zu@r}fTx5+cvo;p~j0>nPAqp4YBWHLf;0jkpP1!^G1H)|?2=Y%}C|#YeP;0ql@Xl1_x3w@7zMIuVfW@~k8! z7ba;*QFn2ZmV#Tf`I||lQmn<1hDwNbuF8=#LM1Ll_i^`sYmwo6htbDrWucL+fN4If z=g{$*%DA|JcchY9JP3PlY0+qD(P(MWXlc=CYC&4uemP=2 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockSponge.class b/bin/main/net/minecraft/game/level/block/BlockSponge.class new file mode 100644 index 0000000000000000000000000000000000000000..d2814d945892ab9efb12464e22f87c44843dc818 GIT binary patch literal 1455 zcmb7?+fEZv6o&s@+D@qhEr&tHau5&;s6|E5fFy#^jN#C5OuTYvH!#|EOgj+0=Ow&1 z;aU?hF~$e*#y9ZBhcF>T{rAi`G$Eii>8!Q(UVH6-eS3ZR`SCM=d$_A1A~0N$Zmw)s zWT9$pxVcTMEORBfBTKpUl2dq|n^xbY7fxkUYKRI9{7b$-eA2Gi?vy|@YYwf_%s55a zh(?^zkUZ_yvgOLEZIyC!fulo56ARWn4FXqYPgHR1>_id`Na=_nEijrj|L5q?Y9j<% zb+n;fpv|LUR*LeaSy`4Z-R-Ir5T-zCmhk4c%j>ebY^|5L+B)kLtkSB*HW&wsQFqI( zovQvA?+Ietv8vYvbf@CI!~J4W76k^gCpWU@R7=GP(G(jx#gSNz8M#2T5_$z z^EvB9K&&}vdQq009jm0ojOw@!R!eRMVocKT#hPk=Ovf#-Vy5D__QoquZ*5^?UfP>m z>rQoM%i4Of}j0qqb8aR`n7gg6&Dz?lQ0YQeQX zIPimaD;)U%$8>-r_XkI3Kp>=&+sDm165o$Vd_5xZ>4-$1SHF|r3uKUCZ(UTE!Cl4= v_%I9TtD}$)Dda;6`H(_Bq>v9OJPs+0hZOqjC>V&>Q|JgF2#mAs2=4p_In6Z9 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockStationary.class b/bin/main/net/minecraft/game/level/block/BlockStationary.class new file mode 100644 index 0000000000000000000000000000000000000000..6ac5ae4440f312e3c35ebe81fad821107ae2c039 GIT binary patch literal 2077 zcma)7T~ixn6no86jh=yaxk z1h2fYx3vt#86A7$omXBv=8rfX$LHOJzzk$0Gwif=*D6+wH9uQ2%2w8~HZ3Q+>UhPC?38>i`i5_Nu2FfSLJ>%x#An8-*``43mhIa9 zZGq90o^R?`HhimM8%}n1?~qF`3n-leuO(R=l{MiM=HNA3>#IyhB84|o2zQ)7XHJOVeZ~{rsowMxH`l?q68e@9ha7#?w z<&*H!)623dmo!{Pij^uF?u_F-rsgEx>6JEQFsx!o;6l?zI#db`?_z{`3{=&;UG>TH zLGx@Ja?Q!BMm1bPzihR=o|J7i+JG;nG;c);kUUsW-+f~P9W8k%AvGN9}S=4GlBCZ z%a_enwC30LJFa@qEqb+zQR3jsPsu1niZb3s4NEeXj$qOqYtFkLOpmlJYbfAzfv#$C z-7;&A6$BgF8-dDg!)cx1I#~&i*SR;i_lg^{#-qJW5MSi=MQg^EyP`XQIoOONa$MLk zg8NGTB2eVgqO4L{qb&8knf~FQ(VFR3%$JB~`d{LWOk@|GFKBB)lFuG`0d4e*BY}3D z;=+52rygq0h8UE4DG?2Qw20tz8vR7*!~h2O?)-}S82`ipxTFIvN(pv5G&aBl!OjGB zfzyO-k*;`~CrMoJ@&rSYr*n9RBs*~)7br12@f)#PX{$#jVws_VLB&ieySTW8m@*Md z#=b{4wTd}-oc7^yTIv+@2!hl;JkUnBFtv?zGCH<{>`gVZgRyN~eTMcvbsLjEA}QaL z2Sdx`Gjx$#QrSjs2k-At7qC>#>*%QQxU8m$Bg?4s1o zG$i@#bx_-(nRnVzQ78L@|5Tg*cmFmB>Nu3U-KVg XlE2qDr((SGA9N&SzsO!`!Pox*ugd7v literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockStep.class b/bin/main/net/minecraft/game/level/block/BlockStep.class new file mode 100644 index 0000000000000000000000000000000000000000..69ddd33694bc065b3e3c2d95c63bb5882c9bf774 GIT binary patch literal 2200 zcmb7F-%}e^6#j0qn}uZgkzl}Hq1_EP>f__mPWnM3FRM zASE!DDV6?DY<8y?0`Hj65z`(~zc^n~+trSDY$~&`5!C zrqd*=Z(4S-wa?vXCd;;`-NvR(!uzhLw2~7Vu?Q~c@(!y+(up? z(ey3Ht2m8AN&QA=fPbqt+1WA36i{9WmOH_6mweoYDtV<^wX4k6O~ta?QQS9i2Y2K6 z1d9d=0uvo4R25+20Uip(-w0e{wit(#s>+GGB{f(!v4SZ9LvbsuN${eHH9Y1JyqUdS z$3NP1edj6X%8&r1?4At%)Wm0R1zdAmYIb^^>YC>sA4_t>nNs;{>%_{pe5aP*vKm#l zz9^fT`tP>DkY_ilwztyUbiKM&Q!4RhG>_a?ttw|?)!tGb61vMy?@8glG_iqANqU)j zRNR(#V6Qu}+x;qu9M;>iPR!9K$~!0!k@t~S4{bv|d-?VqZFxSE8y$?DA%20u+}N)e z8he5MTq2P$Q)%-Y!?`40pX2)OFLaG!g3s#;EWyidVgP*@;>TtJN!&mR@9}&xfaUr= z-#1476%89zfWS=tx$iEuSXwI9$k7(0d5^E2Or{4s@< zR=I`)zjiJ&%q27Eh{Tr#fiuX4z##Wsmzn?#X43`i8)B#I#ki4>5K`tzT2@GtO_nM4Vnhm0O` zl~ZSs5G%XdgS^TfOpwveZiHQxnA2)Hk|=lA)CC22wW+*9VLd;xTe7Kzw648`p`Btr z5IL=1;K>UZ(Nj#Obs9VxQTkGJj?Y)$t1T^hbujN=60p#wP-qKSXbV_q3s`7RLE(~s SJ<#LHp476O*)7%>LFFILa;>8P literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockStone.class b/bin/main/net/minecraft/game/level/block/BlockStone.class new file mode 100644 index 0000000000000000000000000000000000000000..4fd3b367caf0c95ecd672da6d3941cdc4f5ffee8 GIT binary patch literal 776 zcmb7C%Syvg5Is{{uZhw6tnasoRWa0U)rBtzL>DUE-=fdSGiFH!G#~-M~QP| zQBZ`M#pKM*nKNf@=I#CE6~GRb1#*OPq*6QdBjqLXBDF7NsO&(sRAASG*t@a!bUaJr zND1T#%bm~(-P?ZTr@Ms0s^gSvg#3QoPzDV23YdhoKV?Fhs>GLpecT2XEcCHJ!afKa zZs(O%6J01;C}4n4VI%*k)uxLs-^)oetgGZ))&oTta$`>hHOUS+Zy)B2PELs;pkc~uL{S(rzOATn3Zfu8DDFM@d%Hxo}C`Fif+_ZnrL5?PKfgWB014E4FKbaWD2xt2HC`zoO(HNr~1~HC_w(=pr kbw}}t$tTR-Gt>lRt-(w3Eh)Yv#h0XD$%V}9Vph5I0j6uXZ2$lO literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockTNT.class b/bin/main/net/minecraft/game/level/block/BlockTNT.class new file mode 100644 index 0000000000000000000000000000000000000000..641040694eeb34fe6f87cf29203ae9e178b83c08 GIT binary patch literal 1750 zcmb7_UvJw~7{;HIIB}CXZI;n)=|7VFO_~v}V=J(%8?;@7rLLN2RK#7~I@8ACfu#PPqDS;cF z49&jd$!=gj4b5kEUz)Bwl&*Q;`rYT|h8jCN9UYp$)w3KH$liB6Cww4~saaNiPe9xB zdoqU{&gsYtteh&-w?i2?wrf64CI$=?1k#}w3f$a2dtfV%G-eEBP!w1t$Nz~{%ro0G zWoOhskU_^jaHT+L+wa=$o=rfmlT9uB(isZWPnUn)#}?fK1fdvDLm=m}V$yr`c9$8)|J}yw$4ejpp$Mzthn)!NUd!Z8^ zZw3BfAbSF{we7F$L)#pMj%$8qdp*D3s*|Af<~Ec0UWBtHhhg9!%ihNEqoaZA4;|kV zxL!N`vY-2b+iO{>>^iOrG$&L{Mr3TdVb^>V&Dmd10;ex~+C#Qx9#?QfRjziHTp+V$8j+smYx0JEk)6r1oaT|AZyf0AvuUiK0qAZ|$ z^xX2oJTrb^;6r>w4~GN$8!x_!Z=^BnVhs_`6uCC)1GSzN$7T!9~gSy=*7OO5qX)T=P&JgT^yX#7Y|vW#B;16RIi zEPh+McCe&|Sxt>Eas6JVoN1h(Ue27Lsk<+*8qJDR?*4CRHp-b7So_z$63qo|nWs5x zH0D07Q8qq^lZ;W;iE@t!>MtO+QO#P6R3%$y+#HqW`DUy$Hbdlx_&7oSj>xKz)l-qP zjdJ!itm#O0k%CKfU^zniG!_{nRmVuxF;aDmR85eWmPm6%nrHkc(ZvKdh?BzRKgCgr Ab^rhX literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockTorch.class b/bin/main/net/minecraft/game/level/block/BlockTorch.class new file mode 100644 index 0000000000000000000000000000000000000000..5b1efa59c1553b33a6ef6c78c40fc7bd37f4cc3d GIT binary patch literal 4464 zcmb7GTT>jz89lu_dtn(#u<{BK>w*+V0@m?LU?VwLAV5Y!0zrU)jAKi)y9120?4aEN ziKJ4M7^6*GNvf2K6G-AXNu}Vym1`BM@Z~^yY2nn-JcmI(o)&&}I4s6lNE34zuprkS%myX07f%#ivIbQr|h`JUU#9GcZxH;?*0CfJ2&FG1%V8U9BA2XoB7$LvXd)kdhR>ro`N$| zwDY~a{x0nTrc)lCx9%?3eG6Gu5pHgo5;$10i+Q`$Q@-w&=B$Ep1F0a2Q8h5WG_U6p z;(?r194S~iTg~e61Wq;YhC|zH(k&J8of7L*0;kauL$koKCn~F^n`lK^px!B~Ei@(# zH>%1e;--(=Qgit{s~GdF+?^q7-j`?}8I^8VHBjKwdqGckOZaUj+QFQ4WJVn0MzoCCo6oO}vB)($zgCdeKMK{i1vFd7CxwO)=U&`Oz(8+I|z4@hSQyUvlTw zu`w{+XB9nCy(Exwi`Q*uW;W}VRQY|gR&mCb>#mx(hBNe#T&Ko*$^)J~Cs`XZaUH|l zvdY?|5gA(1e|9 zztp*#&mN!gKf7?qU1aMHXK&j%Z^SJ-9viyT=od zH#6pySZQY!V;u8LHeKLNqeXj>qV?;?^D!*2J$Aa6EimRTlyY{zBeNe+22t*MPEN&H zvJ)mwU>^*g^-;dZ_%_Km8Lw}xYpWai4dRcmztz}8{jV7eA;sVQYJ!PcF0JF+A;y~Y zA~fJI-?$u&_ykkRr>FT8;@=}U>ThzDe+`a>#INM9$|?cK*)m(J9u2aEf@~o_n_P8_ zdBa?BoV#oA&+@O#5(>Y!BX3IOHT9^Uw;m_}DR@YTo%Gmh!Ntst{1Gm9bBgTm#Q>JdQ|xU0oe-t9oQ`MuQhE%qRV_tdMNtY)3Q|G2X?& zEg-9i#$`03qbxwg?6nx z{GPFO3?5QT7g_v0o(lJQE-ax1U)<)9bWlt>C?*{glMaeWZ*vHHr-iKYL&5KzcGe-? zQK=%50?`4f*4pGmax!@%`ATwX6R)mgDiw>!c=DzkFoSq+Dn=JDKAD`TO-?a>L(OkZ z#pnYa=Nb-}DxPdj-l|RBN?P(iBbuDXNMrO7vhrrtr=sqjFY`?L3h(PTNbNG3DepO~ z@H~0Io~cm$uVMyYqvUUqoo{Rtx)N|x3Am{Q+*AT?DuK`y3Y}M+S150u=Trh;Qj%+- z)!BGbG&D5qCxLeLY!n}oz62m@0|KK*9weu;=VM17ByVQV$5V!Stx=72CY_vVh$Wrr zhIsOJwxOoBwssSD(nKf(!0lW5x_zC-V6Yt>n_%Z&3ckyRN{)(UCpZJ+b;O9!@X-#=mWKmlcnNRw|je=A~ z=9B&|kTHFYB!u8;A+No9{DX3r*ae62H{vN#&L;eYr$&k0D?9usBLCsZoQOfha9Rld UdLk4G0c~w<^4oBclR~)nUst(PMgRZ+ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/BlockWorkbench.class b/bin/main/net/minecraft/game/level/block/BlockWorkbench.class new file mode 100644 index 0000000000000000000000000000000000000000..516035e794ad53fbe7320f3a1ed47d225294587e GIT binary patch literal 1260 zcmb7EO>fgc5PjRYF>#&7NlHr_J_?kQgtqPnxe%xXs701igwzitPHgO@HF509bwm4C zxRhHjT&SQ(9QXnJD8#I7g-avKWoKu-^XAQ)S^xU|<0pV8SWz*=Fz<`V?7F_NL;fx@ zcX?Nsp6ChBYHzQ5H9tPb_*P(P$Un@t2-q3Lqw@CSYkNX`;HhZaLu}HUdOrgS%-;B83 z+2H#r?a`RkQ#*2d)D4nWVD~WlSn8tvH4JJel(>8;{&=%{i zoP~1Svp%nd_q@lkM1z%~M+jOK8qO^FDtRsPhsYXroO(BgCTYXo}pUI}*83Q9dDG|B9kvIH#yqJ|cgH>zQ** zpJJ*qe1bwnJ%J`~oFXTU^7bZKI#Ik*2*vH|Rf6$Qx^t!(Ggz9CpcO z<;Th4bKFxTYEqOIQ!9}WsS;ZWcCJRw9Pdh21iUry!@y^5|p)e9y HVlV#zv0O2^ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/StepSound.class b/bin/main/net/minecraft/game/level/block/StepSound.class new file mode 100644 index 0000000000000000000000000000000000000000..097a7f6909a6e4c9e2e60f2f55225ae9d5b68cfb GIT binary patch literal 904 zcmbVK$!^n76g@X~o5Xc9(=xUcTCiOjGb{^T0Lm(YNJ|`2%S(n_h-Hv`q9vR-9HyWN?4nyDxuN+UF)TZjE2XAjjZU!;dCSj)FBvI z=2WJ^8DagYjAVL3*tV9ZJ0062=r7`dFrcAg!a$XvS+-XOp>ARg>&k1ID59jiD<;Y) z5vpA#^lCcli{y>p4|#Q?8wY;q`H58VBB`fmazb#r|Ed8q(r141C^wID^Mqhdeya3R zCWMw{FViXFHuL;jqvul@4n$JI9i=3rv<>WHUvWKPJ}YFgJ=JmFgaw-w^v7eN*Awy}4KyUr)nE^zMx&Ig{! bH|I#zY?HY_%{SF?^j}!b6sZ$Sc%A;M``flPIB=&Ntemu zKH^zs!eHoa8p6=Hl8MZ37>;`WGhcBx;z>xHN+#jh^ZGLe<2GFg8+9}tY@xx>@~N7K zWjq&Z%IA?_X!~ivqZwCH+ts6yKgo>2^*61iXkbhUS6rQI(zSw0-vtBnO7)V#$^Hg# zCly1t*I$pba7aMKlSLYjLOmx2n}((W;Yr;<=l>K(Iy26|sB67ybf|T*P12??Xam;Z z)Nwvwy%z|ZZo5L7gxw~4P~zZVhb)S~E?UH*wLRU28jRvCsQHLBh|cq36G UVif6tWp}BIBbW{Vk!JsBvYo;Dw+0!pfe&^cj-jBsG{a!1Dk|K$YLHA zv$51eF^(mn8K#klM?x#(mzP%dq~?TPxUL$bzt8!WLSGop6+Okzw+;u zCbZg})i?(Sgt`Itrdn|42rhR_M>0^k{C_R%nY=g$ami*>cyZnA+iVSC@dTXiiRXR5 zdCw6p?{0~-8Cz$+Tj1bfi#?9OHX6)gtR3v;Xa`NUs=W5lDl?q%X;9VX{u>_^CPtnf QsO7|7@mvz~*X5|AUktE(k^lez literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/tileentity/TileEntity.class b/bin/main/net/minecraft/game/level/block/tileentity/TileEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..4bab9e5818838d5ce5c0d3014532a8b43827cbab GIT binary patch literal 775 zcma)4OHbQC5dJ0v2SR|9SDyzs@u<`l5Fs!|3y9tDU)l(%7 z`~ZFwV!U-*grM}``R46!X7={(`Ub!@KGaYltmVpyEX`GH<*^f8nJJ-FUuh9(6Q2o} zYNc|Qx`7B;-Suh>RYLPr_NCA=?~1R{sfrz8mu+KgLZB~f z3`!%o`mJoGdFpluLrcqtglgL)s*WK{HZX<;VY0)l_j_5SY$zkG2vZ#sOMNJ9TG*wt z>Q2({g!Sk7{9{mNIcAki_N>YFKZk^sCEw>j4V=jjv>aTuHd-Q&oZxUMyKR%5n_ix5 zddhuiR|$*%Swg5^*wm@e_+K@8=ZSRX#yR%Q^lYs5_y|1v-&=et&VU8*p7^X)#$g1k z5o#FmI9g)eW0Ar8V>!-I!AOk5D?c&ugOv)JECcTh@QU>!l@l<9X-2{fW?2@+E&eKn w?{VR{FP!@oEDMX$IlN{`c=K|L<_j&}{u$w;XY~Y&=?C=rag_AmdD8Fi0q6UhAOHXW literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/block/tileentity/TileEntityChest.class b/bin/main/net/minecraft/game/level/block/tileentity/TileEntityChest.class new file mode 100644 index 0000000000000000000000000000000000000000..44b1730f64c9277e50d060d6d171f22633febdd6 GIT binary patch literal 2863 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.class b/bin/main/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.class new file mode 100644 index 0000000000000000000000000000000000000000..d53eb3e346a14612f4dc560e7f1734806fbee4a4 GIT binary patch literal 841 zcmbVKOHaZ;5dH=VC>B(#?-w_q8XNRrjE|Vu=!JMtL*j9T6>FePO5txA6Vb$jKfoVl zoL#E%;HlYUc4l_IZ|C*-_5K0i808#NgcDyzPS5jYD-`#U(-A%CbmdTXosRTnD54;A z{J`r==TgawAE)c}`6y|%bo@|{c_N|li`iH>v9iDji4pEO%Zy^ zj-5vI;PnZoNz;nw#BDN$BCLFAa@+RN6266F`auV z&6R%_Vdqf{1?pU2nzt*(hwIfESF3O0j;IFY*}CO-6*q0aVanbbp=fW9F!QVfODsz; zSn_sh&?Jfsn`2LT41C**nm+|u?-20hNPkqLt=bdmJwIByJlJX3-}{E z7#@v@NTSjB?7Kh1zW|2FwZnJyu+_`h^x#v#5AAkA^pa$DOLZBYV*lu}&bR*|w zY;QR&Y5TG*eS1p=GIHWDvV+juk@l+kKKvbg?8Z)8?ikPo7S4$wkUcH39QwX=V=oK@ zmR>Z^iTFfDz85SC7-5&6fLIaeyYB^FTo)KAHD5bz$KH)S-+t-@n_+8lrMxbnFNd2l z1q}lhObiNWrSiH7fguY9`V9;V)c%W<0?S!QqA!IEMpT(mf&3YS6rXgHBU#;TZOG`E zv*AmD;b!PM{<;%+YTXO!@hfkKf}K~d-V`aA-gcrnRplRjx_k3ob6a3wEq2`PN6woL z2LsnB(%*-e)tjvBTpNL8snIAmRO^!#ZeXHsiI-44oKT~SeWz;{x~3|SS_^k0S3dAm z|6^y~zgblob41aImEey8cRWt5V+DmyasL8WZ@H_}&Qy+IRf>m5SBhVdIYd^gA0Sux zfb95ZWS&nSA-}e#iSgq8$+6341i+eB?usn`Ay{Uds;s?cv{*HEQB#g=E@d-LX-@BNtZ?=OD( z6~G*p4a5ZId@m^O)qHQe>D~>BRd>%T*1bnwy;${pujvMjX3=ld9(u)Fa=g(pu6xaT z%{QP6TzN$Z0sDd1+}jV_pw{po3dG)97HFHT`L$qPK+EMf1oUf-9nV0!K;f+PHv-+%AWf34xB=fxErC>OP2gcSPm#RGB1pC0}VbiogY#vvu!D(D2vm z?vsxurzeYhZg8)-%3;Z?v)VRFm|@}X)*FrH2Rn^@RS8LUSr&2DMn49mG;gDbQ7J9j zxP(G@>NxWx(=`>5ASXqJhpV|1%}kkfyRqNg_O91tseAsfc?&Y%7~>HdbHetMm6FM# z%%S)99imaZ(Y^3+TiLc88xK zGu#=&FV+v}*5(e;G5kHcdwV~LiM8HNfv=AKl-Bu+lzVr6gwwk@uRIDtA zjIL(6Z!>gSBTfkOo202JngtRB5~Pqs2Z{D0gB-dsfiswegC+D}o$a|v`+b~Mp-hBy zqfkg3ywgFbGDjIB@fEk)Tysw3>`wxmyE1IIe&;u zHf29WBAZG)#VIGw#i5d!)epX;W*nl;F&<~*N;9QqK32rSf}{x#mLQHi$qn=1i;CpD zie!~qAJ=(2lRl!du*y7)s1R1!vm@M@Mj7Lj4DLRM%alx&{(hLrMeT1`T1rl~c2&En z9Wl~2p~(+o{B^P%6Je~eJFI#)yY*h86lZ)x&oSAFqk}0k-;%6EOKKmI%b!+DwqrO( zC>ja5Ok3QspQBt#$c1t#<;3NbmVKEq3mI#3s!PdTg-rYAR3?=5O{Ik^rqt+Xw)W7^ z3gyVpbka`BNhn*U;7ArcWlrf9^<*`&JjX)h)}`FIaO`MCj**S7()$>eM}@%2>M^vk zh2YBiFZjq^f}L!Tk%VlH?cp&TPx|wwDteJ+9cAIi_*jhd7GCB>nP7uYVw!L3o4CUJ zIgK?wof~|PwpezbH|}Hphku57e1QdggGGh(Iqx{@*t)ZnqV}N_wvQ$})hc}I#8%Wk zDRD>LXcJj+i|6(6CJcy*y3y^pB+9tT=CZLQ&f^-T1lB|kDwI;#5NW(cDUB^5Bk1G9 S=i@J2r<7rT-Cz^Pu=Ed7A$4j1 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/material/Material.class b/bin/main/net/minecraft/game/level/material/Material.class new file mode 100644 index 0000000000000000000000000000000000000000..1ddc26d8fc71dd79969c0fd1e6894f00a4817b10 GIT binary patch literal 1626 zcmb7DNmJB77=1k}jE#(_D2livAR5J8aRbF|SQMm6ZcQc(k&s{}gPuKm_TbIC7mF&b zk}7|I|4GZ&-D5<{!+6Pi{pH*G`(A(h@#QOk>zFShBQO+tiL>g5o*S#B#Hp!O&k4MB zFK|{>;>ErSoXI9BA}3IOuGW-WfW7;G0AG-}- zd**9_suQzG$X?q<-M|n1 zb0nl?XC*px;&TGdeY^9Vsl|XB>#9Vq3g#81#5YtDF3`x3i^1Z0bXi^Ph*tU32J(VYF?m@tJGmg1-@d;YpU)I_4bxZn=skH zA@C74N8u0!?fIe4xc9qU!5Fh9L|O;jHYp!fF?c0*6tC{IB>trFyOhWbY`$sdmznkgXlHyl0 X0#90qJo3-T*%l)E{~0-F#`N?jt^gdL literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/material/MaterialLiquid.class b/bin/main/net/minecraft/game/level/material/MaterialLiquid.class new file mode 100644 index 0000000000000000000000000000000000000000..334fa3dab429f93b30625712d1b4552ac381fe2c GIT binary patch literal 507 zcma)&yH3L}6o&tkOGDE_p?wLc5C&E*3lb7iU@7Xr<|d{XIf+QzK2;YcBnBRUhe8~a z3YE*ynEGQ<*Da)La>nORFj^jksPWiGG^t zEJ8pSu1^tKr@GMgoZ#>7jS0a;nW-2)+FgWb5qb&R-^}ufs&3`PC_+CeQ)$MM?YUky z1N)$B!f~>`ceC*cp)*zXs&2}!J?;pRu1BTO86h5(vno}W+IbItKKI~J&Lxh(6#p7n z$!*OVaV0ns$8h+9jb~0g#H{YvjdobO%>c(uu6D469(NqP&(Y0!!NTbZ8Lp7tH@W?n P^na7>e@J3icYpsAulZ%= literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/material/MaterialLogic.class b/bin/main/net/minecraft/game/level/material/MaterialLogic.class new file mode 100644 index 0000000000000000000000000000000000000000..7a24f3036dc4eca60ee45f5c81a54a40174154e5 GIT binary patch literal 580 zcma)(y-ve05Xb+{M?*tPTi_v}LRg*o7^nn73M@q(*j(2HgA+@M+oxh-LSoAtqZLgMe+aou2~IE=2?EphuYsJ|eB^ fJpZM#Yh<`adVgfU0omS24jPc%4J7?cz1iM3_9$z@ literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/material/MaterialTransparent.class b/bin/main/net/minecraft/game/level/material/MaterialTransparent.class new file mode 100644 index 0000000000000000000000000000000000000000..2d1cc6ad709b6b65cd02fca838fba5cd16b38dc6 GIT binary patch literal 598 zcma)(y-ve05Xb+{M?*tPTVUW3ph83ph@rqhB@j|zY1M)4nwny866CmjDi$Ur1|EQi zLR?Bg9Xe#WFW>L{_xbDl;}gI+b^|y9Cz-TSsxp}vda%)yQWu7Dh9b$lZB9bf%a6|K4q6WPoA$06+ArT(#>C2ILK!v zkyomew6|szM^7{-9D@h)S^rvlkrL-H>zl7=AYAoSX#0R}e8q6c7axG&Klf5L#4HQBXUfShekNNRAi{35H;i&a~dN z)5|*3I@7A1eq2yzyl7`cJMGk7x3~Qj{SR9DyyqN|+KVy_yL;Z$;UFSjE}InVBng zwxUoaE6$ek#ma(0?Be+UXL1$~Dj3<)Vv!ltn1cUEzL>8JD`;KaQwsXAQqHb|hMEw9 zs4`Kf(7DOXK`1nYV8Ab<#t=*d6zayw?)2i^j9s3zW(u}Kc)XOg3R6}&FW+8JuUyWP zN5>{;kU_x8#*}9P}&EKHO8*{j2FgUg$?eox>Bvy!r(1U#xYoS!G9JR7nX>S+j z*j=~E2NX81hr1=IP(#Ams}t6|XIn5^u&uI`se+lauPxe(bU5C%`P726KZHYqv|5m+ zOXc^ha!#Q(dztlaAI~pTtYVgF_if(lboZ2aI2gha3{l;jmt?XuX_aSfDgLxes@Lrf zx?P|C;Y|>cDAezEhum(!?G6)VenAM2&dpb73h&JYUdBvmv7EKjc`5LqOz#)Fae%or z-gh5=crlz2uLb)6XL!TdR`cs5=N0=cvBwC-8g%@M+EvuYv{i(EbariF8-~tSW2=*# zfkuv-7zw$1u@%kyYQQ!`yu812m7M=h{2{jALCr5{IUnBj7;V4B9wN-&`X^tbRmS=f zkDQQ*)}u+_Cv?Pm1Or3z9nZw2TgCQR>^uh-^l5^7gjoCs2b2Jek&sX`Nv(mzS_rKZ zHRvPU6eGt;VVtlpVv7U3)dlAPCrs=|g3vp;<`v52qkte;UqcsnC)edV=*i`ONuVmm zLGlK+ZxF`6E=(^Ddcu6>WCv10PfLzFoiq+NJ$HfJk{KsJu1ZGXuMmi7kI)zQQG^Yw zcaks2m2U*wT}0nX9&PAF2L^b<#iFeavXqC!dbpjo2Ph>?jHQA*fyBzkY{Pbb!s>5<3_9!XXXsFI0(ayUe+1LSs? z%u)m~L?4Ga>c?vs!Rt86sygOy8+JjhbDJPHxoRfTxRk}}BL?ix8#4oxw=|@)9ZZ!wJS3ejNvXy_zv^<9@iW{mz_GezwYP#bw9uL{0!lqSh{Y06gvqNMu!r$YJ1&H#5HyWiyqnr&A^@ul;T441&Lx_g^o?)9( z&(Q9U>!fRF46gB1-E*CF!W*2XQtqQZ%w8V#YVq$&82SV40YBY~>UX9p4oUa@uJ%aE Pu^N>86Lo?^AIAOxm89X` literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/level/path/PathEntity.class b/bin/main/net/minecraft/game/level/path/PathEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..bf2c19533049fc199bbde25758b7fb45c9f9ba41 GIT binary patch literal 1263 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/physics/AxisAlignedBB.class b/bin/main/net/minecraft/game/physics/AxisAlignedBB.class new file mode 100644 index 0000000000000000000000000000000000000000..e64360724620b5c1fc705f46e2c886438f9b9496 GIT binary patch literal 4970 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 literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/physics/MovingObjectPosition.class b/bin/main/net/minecraft/game/physics/MovingObjectPosition.class new file mode 100644 index 0000000000000000000000000000000000000000..06c6bac5bdd8e74a716e68f14581467fff86129a GIT binary patch literal 1189 zcmah|e^1j;6g_V%tD8?iV8Hk-%G`=l`K2HTDlj2IG0`mGe_bh194*-jaegZj77|VT z0DdUr>FZ{KS)fVZJ@541ch9@`_V=G3zW}_#mX4T!={bRU;(CrfL66z>C8lt^zzu3DvSmQ@-P}-a3`i`yo*S$P z6-4Y$>5s2sV#UuoJCEAb(QNM&9p#h0I5gL+6MrcGLg@leV zfw9|emBc8#A8L*6dh7|2}4oe6_q0OBoz6S!MQ@A5a~1} z?m`N5Y_qE$&Q3~B<+D{PI|5zXzHOC@R>ckX4N?n^+^WFzP1R{N2&}JmZdIluGZUHF z$jn7%USJ~E>fGy%iexWI+(UbkgSo1MJ!@6FYjF~WlB=$mLL!!_m zICiN|{#nI#3T{}6OsgwRg=39rb~w&IM5krLi8!(i%Vw)RTdgb`tt<TBVI?^7_6hu7^)*<4A(Jeq_sMRjh`6Z%d}nMLAXqWOYRDjbxd8T zBcE{{=d^(-G#;O1f_5h8Mi=_Ij-Uq%NK-zr5+%e8X1QZ(%#jfa%@f5GdQKExbP+Fz zG=&y;kv1iNu_6Ds;h$CVsWfd+)Jr9I@)FB@-|$`kUu!SV0s44uKecA4bpR6>RQh_A Tg6uziS?X(NK7n_PiDC0EXl(Ox literal 0 HcmV?d00001 diff --git a/bin/main/net/minecraft/game/physics/Vec3D.class b/bin/main/net/minecraft/game/physics/Vec3D.class new file mode 100644 index 0000000000000000000000000000000000000000..cd612a01e511cd508fa06f36ba1529a7bcdb66c0 GIT binary patch literal 2754 zcmcIl-A)@v7(HXJ`Eg9BG2lQ`Ah8{66UT&~1_GgJ0uH3mrUH@DR*Kg48rC&yvR6EUM1c=G>Y-`(Aec5S)0yF`bfHkltO{ti>t!R1Alf2m#aV%1I!snvCg(9(qr>(Z*1%dDbP zw*>~>LYz#TW|Yl_qgy4iO`XOJCX%L(v6PL6+q!Mcs`V>%fu424S+E?#-ZaXl?ilw? zXXBGqy|zvCJEuS|oWd?`^pD>jdnCpM+Lj%?^u?0CrJCb725XAJaqm7=?^>MtvSXXp zx)aaYFs@-*cEJsSuJr2|nN|74dlB5k``jz~ z)|O#$Pn~D^Ui(-fPqpB-K;ZI#TsbFK(*N9X*#CeqPjVRva5sW+yvy!cu5a5VqhQKC z7It_36)6o@*~dX17(w2-O&JNfN!>fQDDSe<+2$P2@TrCXG~PS2&k)Hb_RyY9?jf2@ z?IHFf=L6{C*i9_CQsbIdL~s^uh;i)ZY}Q+kIL`5jNa$f6;YPiT0&es+qadO%fNsunrMyEL6^-A)vo3M-E-G>NFDFPSJtCUBPMn(}R zl7RHL*Ti@yFxWnb!$7=VpmIEB6USQ0_^%)H-yTd%sJVu?Y zuE(gKMY!xLk0R%D`$}=k{TpsaiKR&F5{V6xSo#pLoKGz06HEBSdVFGMePUOTSEl`` zwn)V%Cav;Jo6ugm7NTVx!%x0NNIXrt=BBK<%`S&clIp}VyKIR4aglSS2uF&i}8)uk?jnM8=Ad6IOuQx1!dR^r+lP(MNSlT?45 z>ZhoDnqJJvL-vq*(^qf$>P=t$17H1$uYTdE`W)3yD)nRkL47D5dZqNSN<8!i)X!4= z9Mu=7{tng8Q~h14|KR^q&;JkA_Mfp01>585b6i{Nn0yBJl-$Qm$E|(L$|K`Y9Fy@K Y&hKO4=y`n4WgGFpRILOx$WwdqZ|Xe#%>V!Z literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/BufferUtils.class b/bin/main/org/lwjgl/BufferUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..e2d4967bcb1a93716712e17e25541a57a85619e1 GIT binary patch literal 719 zcmZvZ%TB^j5QhJOB2tT7l)E=};KIf=Y9bm8N#jOkU+Mu5sclk<#<$Xy#)S{yLm3CE zP)Ijt&dfjG-#OFopU*DG|pBNSY3sN2t@p{=(kgMskwd})u9Pzc3^bY+~|wriQb zbRELliFBlYMu<0>J%V!K-U}6Rq%!=3?oDLrBNp(a91 z9uug`Lk2BfXKr0uvYrbwSN#h z6@BW94}PpgQ|)s3?3<6ix%?en)_re=Fu@87?$_DpoW0MvcYgop=U)L_!8ZmX0=-4A zkaq5G6`b@!cE)jvIm@?;u7RjP$CkBYr5(#Hq?b3gWX=~b^LDx9SbJH!?3Zbg)g~3+ zcG7AqLknN-`V~(uS=*8pEz>#2c5VNvKvOccCJ?<=%u55NK-VF5#`9`E<7mS%6UWgi z&^)bytq?e2B8Fx)>oQ@WS>SlqcI8rKdqaAw)`lYmI0RtaL2%x z2Y0LS*o1`*#=GxXC4rO4_1XXPlEX3YqF=%;ZCCy@voSPY;t8A??FEK z;|xiS;grtcOwBiDFsm~d(Yf%mM)Wo262Tnz`RRO)7Lj0L@70C;lcbc8Zd2wlQi}Rh z%t!DWhW7D+T1M}LHmbP(5RnA;pWU+)2tljP!0K-e_)I`=aXh3p z&Tl73CdLlx##sz=OmaQR*)&G5#PK#Wmi&Tjldx(AC3u97dQI>tew>ux&?H+CeU6wI z?&v1Pb$lM^KS_Y1*`9dTQpN2ma{I8q=SHpFn)Ts$sAt+4P5Eqvi(=qpf}?U`B%Z~q fC>@1g2*HgyybS-p@a8HiN8y)V0vC9obNu>W_l4|v literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/GL11.class b/bin/main/org/lwjgl/opengl/GL11.class new file mode 100644 index 0000000000000000000000000000000000000000..feab496850bc522686179d174fae023346ae294a GIT binary patch literal 284 zcmZWkyKcfj5S%qOjtvA9DN02_2NYP;5SmEP9BC3c^_iT^A>%{GBj1%O5(OW?N1^N? zI+~fCS?$j5`Eon~cttCOM|d_iPl}&aULS)m9|!YpKwN~@i|nf`96w}cmQ7w0Y+ z5#kTCw+l7ZZbjtG!Ac$^I^bx21U2hvj6g}hhcQzlcyGers{Ycx`>oiW%FKC>+AW>OzijX5qh?j2csk`aMj@Fw% z_#KER9%!HYP^7k?O63&^{s+GT0q5>Iu2V;q<(WG(cg~!1@6rDG@0;HNY+@^gn8HHO z?^L{R_c~sscc8nR?$^KE-P5gL+c`)ft}wIb961%w>2@m7fkN`g@eXxgA^%PN{nHJF zc;EeAE2x^ngxl?FKd5!v`a427p4V$Rfo?}gL`YWMt{ZIeQn6NQa{9d2)>#;sHZg%2 z1*2GMW}tA+L;^{P&YMUfEzzurOcY%(kwsczy6$%MgTwt@?e93d9$B2L^F^=e_^zx6 zoAKbW%f~;de@H!*kiHwZj@JkU&7OujJ~)9}{2)$sXJ=!JU};}>+h zX}F!P6CC;^o-FcSsg|YAYbLHsEt0;L(#lrR#3fv2d3w8hBJzwjB>I8l2TUQ3!ek?G zT2I*2lM+1gHD9q<_OmW0xgXv$d@UFq9b|C}cT%{0$`XxZD%v-37oU>8Y~?@hx0t#SFSW zj+nTJQA|7(&U6rGCH~=@U^D@f<0Mx{%!_eeuz$srU3d%Q6>@gr74kMCONO~$cy3^x z<3}NKhOcCaFo7J$S>hBh#WOGtvAAB~im3RQZ_j=O zqM>QOgtcjZ%`yH^NHE|({}kzn6xRzsW72+&t9JP{mY(x8Ct2%%{P)*MTy6-$oFL4} z*>fVtLlrAz4suT*k7=AIbBmnju!IXJGh>Y$H_7xq*?&duqU=({Y^bb>5^SnSFr!S3 zu~1{Azd6uICCpl8)(s-0Vf=%Hn$K~)g33_)YN-9kf%am7T=UP6D*VLc7b2#xz8y|# zAgE12%P)p%qMlq~eHYn4`=4Yt#@ikGdmS(jDPTCz<@j zVSSA2KJQ4Mt+TkkBQ_P5tW09dBz9xOAl8tKH6ZiOAaZt^LQFmlBqDbGfdvKc&YS-O%=jU> literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/RealOpenGLEnums.class b/bin/main/org/lwjgl/opengl/RealOpenGLEnums.class new file mode 100644 index 0000000000000000000000000000000000000000..3267d6eb82a34f6c42e64f703d4934aa2bac7698 GIT binary patch literal 32848 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 aZi4r)#h78oZsR^j)&llQ_NnklVeKdNIPYBm literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$11.class b/bin/main/org/lwjgl/opengl/WebGL$11.class new file mode 100644 index 0000000000000000000000000000000000000000..f796bf2fc6c860583e457d6fe232726e495effc8 GIT binary patch literal 1028 zcma)5+invv5IvKm-6ma{ULa5kw9pGli&*syl(rHoy&!GML#kHd%}Gq+Xk(*YCq?`f zLIT7C;+c;^jJHJrlpt2J&)7aQdptA#{^QG60K0hPAwyU+aXW}Ey6q@1Z=_~8myM%v zZF}28jxgI50}(_*w}Y3Bu54NllY|ZDWThDNf^K4hmgxm@Ahk_`0|%i>tkg0lOztSH z>>eRouAC8a`=%ue$YR=uhbclaR9c?&dkq<%ibf;}^Py>q=uE`Qt*UiOQ)Olw-Zz!m`$2BS*=w@URrQ0=W zJErBMj0)$@b%_#@dMEddw(>1!?dhm&bZjpQj!$dhK_q+JY1Q8}*KN#kxuOLBh359# zk3^D4?whF-nb>2KSgdeXvOFgE1!Q?}6Y?t0R=`M%6Puq0dtnK8K(o&{;@zu= z73R2z`OU3wxc3n&!;q;Yra4KDGJyxFwTiVA*RjEvM;7r8Nc(5f4~p$ljwOjy`*Uzib_8A?aBaZS}VBdYcckMgiB!^5yzFxgxi zPpG3QQ;nDjm5+17PO0r;3B^-3H@L;%9oO_4+YFgngrPPxpDku5bhTqoS16d!qP$(_ z3E~eh$b!-0Hp7Z6uDD@y%S@^*sYxT;s_FW$7CubWo~>~sZf|Gk@@G*`o0eZk7GZv| zwF3<9Rx`qjz)+$&J@L@577g2}KlpHtcK4%7}5VJV)F@i;?e{)8%6hUH{s zT*O)Aqg6A;HL|2GD-iP{mLZx>i%{~Uf|aNtrz2*VVbwy+ZDx4PNoOHeQ;x!pLLdC7 zlTk}HmHTLrxi3~GYL!02y^>`wFBZUpkS*|R78q8 zcsv@jg^qxDdPc#sf~|3Woas5%AspnGO+<5n^bV8yDly1j1n0qsYo;E-WeD3#_LS( zbpjMrCH?WJq1j^=Jsija%2af7%**w9dV+6#2wh-1*ojG0yLUA*bmo?6b~qfg?-&~y;Z`6^U0&$Wq@%(O8uW2NwUSD4funAovOCO_jpa0+ zCHfV>Raz$IH9#v(Yx>@C(a#5kUW;kBna&ceC3S0WU{PKD4V2d1LfI9Eu!8=3h!E0g zRMK8B5h)(U5?bk#36EvOxCTkIOjpOQqWVviU&V^DRcWko;deA#Lp9x|q0)%Gjzwua z#c&ae>2Btj#wHgWqAk-z+vXC{F^%nlsKt?AUDlq)E+N138d~Uf(V`h?r!qTYIh96N zk>C+G52AR^D<~fHy0-{j^=a&5=%(dGngD4WVu)>WXS5K)eg<#2iFk!uj$Nb}UPmcQ z!*JnBh5I+}mI7&$=Q6fc6;yZ{Dm-%RChXGE31{m*Bo2iW$DLDwIAyjT=V8gj@tzYN zR^h2CxP9T@KZM|4F|n_zAlnf4Ega2gqm)PxDLY6Bf^-HR=`1RxbEuO(ML_xtJ<{hm zBz=Jq=}U}D=W$m03OA(-xFcP}UFmDwlfJ><(znbdU1ExKnH5Xlv2y8qRwezwdTAY! zeq=|bpByN3WYRqa1xh?#!K(y@JGg|`aGX$e7w7Rh-XNRqQ5n366Z92bju_s;NffY3 zwBr=rdGIz_yaaM(O-;ppoRhI%#why-J{j+@&4l20>D`6*@V>KtfDdVPQ+NLepU}=r OIt3`j-x>P3u=GFAm^k(T literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$13.class b/bin/main/org/lwjgl/opengl/WebGL$13.class new file mode 100644 index 0000000000000000000000000000000000000000..e530b3fba20af7ba4cc2689dccf22ef779ad217d GIT binary patch literal 1277 zcma)6T~pIg5Iwgk1lmX|LQzpEA3|G@fcV7}nL$Kg4Cq+I7hi7EOPiV|o#eI-|4K&~ z#Rq?YKgw}$DMOLYU}tW3lkA?|J$sVhe}4V~@EprJA`G|uplrIIt7X^p>%t@RK@>Nw zsl_E7QHErdH@WF@uWY_4R)sBf^fFAVBq?~aW>!PrEcrE4G=(Qab3+-+38nBvzz}P4 zcS`z}&r1wh>vCE})?9OIZ^zoM@v_)(MUC?F47y4Tgk%`+$Z|X>0>5sqg@>NK&Rw_2 z?N1clyW)6`TxHnFbVQ%E*1bkYV0YN;K0|cfFNuCIBn;^2Q{Ht0{fNb&;f8@Yh8VPr z3Qbs!Cw3dPq6qeQ(G?7XmTz-+p9hY*Zr_Z`iW4%7w#s+qo#u&GxL0yTi%f>eZbNnQ zozL#aaR>Kw++~>gPm&FcAx+ekg)9U%!%!w`oiDo}1IH`pW0=5{j!A}8cbyoxk7;W7 zAQ0jum;C)Zi(xo(8A-L6K~6`OVeGucuGAZt#T-MQ?bqtAkVNGL#8V;C&_umxl0?!S zyF6R^1%60~1-}v4;+3No6KhF)UQNr;UvSDEmyLiPeC+7EUF8bsGpVm!5tm=3wI((^ z+x0^tc1OsHUo!9*PiRh;UXQoCn+puD|6R2_tcwy40)7~pYs$Q692|%s-%+kBg)MfB zZI9lsAkFpdicoI(p+uT=tkLN~Bsr*r4Ui>S(}y8KCk}(2UL$Xrt~IiW-0U$1 za&yN>=DuU_Yb$V={(C79+83nAS4k9#5!@t8-xl0%!xRWc0gvR4FmQrVh94LwKgmuo z6Tvy$fU2f_gP|QEr5(3mQ>UqISOUQV%oA`AOoEJH0gEmB5KCmEB-uxJN?wd&R72|b Jj7|g-e*tYzP7nY9 literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$14$1.class b/bin/main/org/lwjgl/opengl/WebGL$14$1.class new file mode 100644 index 0000000000000000000000000000000000000000..93fd06b18909c0a7203995eaa9237967a83ece3c GIT binary patch literal 834 zcmaJ<+invv5IxR@Y?5x;5TK=$7AOJI6j(*-Te&<$g;q)n5}`bMlTor^*9NbXeitBw z;DHa|OOSwHK#ZeE1*yT3J>&6Q&YAJI-(S80c!+yGasq4G48r7OG)O}Ih7^le6g}bS#u|U49`&5EJC4i4&86K7blu#A$8qQ&<6Dv9zrxBU1 zj1m&4b#zZA$I`^^J~QSWFoE^?-i|4=&vmRU8Rq%g z0o@F66Lo%0^*E!KYG7pKSm?185C;O~7kX@Z^dxreDNm<;-_4l2x2JlE&SEtCbJPV~WGP(TS%$|f-CN~7mOtYv7yN)5r%4tW v0K6Y4dOs0(zy3;AnI+5P7Ki6>8+Tad(LfX1tku}oVCj}C;MQH-A>d{5dIEbD0GX+iU@+Bh|oo)fZz`xf-Az3T{Kx-qIccy$4nKSdv_vL*2^X>zHo0ykT$I$8dCEeaC zmu%hJ;4Ya}URcQVkB-ZTF&r-&n}%*1Zb`paD04HE(ZJ9rl0t55I(j+q^n&kg1>DzH zEQkAxhFi3`&(JV!xmGyCAZf`wLoDSLxdI7s6*3wbS~8Z)mn%+z`zuDl<_w99XBu|i z@GY^gIb-3P6)<#Vj%;*_LH69JcoPz6lW~Hf{qS%VC(%y5nTES*(6K|&vHMVpo};gY zj;$}QWHYHKXx`=ycf+YTI&fM>Cxdnn{?R!qx&+dM&mUKK5Z?DJH{?E{Tvu=gy)t?Z zOgQ%>2)U!;EY2~snib!tx&l|$vTZR0n&gszcwR+6F3`b_R|)t7x8xfI5$9Dx29{PZ zh@=dSq5EK`yF{&8ZqeIPF@%c@s%dk>-%F2a>119MxvXLsIyLxD5u%nY)suwiiC1M@ zA#x5MHi@WzRKXY~1m#y5dbIzrn9Pg5udBF$Nd_h05%dU>wv)F{(=L#R^qS(P(#bTn zMiXexg@(DFH8yGzQgU9!H~C#lh)jv}JuGxh8k~1c+Y2nWl;z=?S5z^F+vJWQ=Xkh4 zgDvnPsaJa>M69M=m-{K(2m(%gG%gdXi(U{CWyB7>VlH*`lEP`%L@S*vBU?Z82Fk1G zw@Tjz;gmk1nbzt~0FI%Bb~N$5>@ z8%CbJK-YVWJ)}b8t?_E)ep;;J8pVjh5)}dlL|4*hG)iBfN?*|-eM7hO9h&q5BhpVy zlAV=)MUAybSmtVtshGf2glC%0q1)p(I%0!}(On`y&)^o>7%68KDOx4SCxDA*Y{%dZ I**YZt0?IKF=Kufz literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$15.class b/bin/main/org/lwjgl/opengl/WebGL$15.class new file mode 100644 index 0000000000000000000000000000000000000000..239e862822cf2f20a8815be1dd50080321defd51 GIT binary patch literal 1381 zcmah}YflqF6g|@}^ucPeLgk?aq(CXkiV8l8XsxIu1x;!&@!NDemTi|^vOCo9vlPYX z2jge|iHXlYV7#+!LQx)VW@mQhKF&S&%zpXv@e_bMSdJjXFz9+U!+uq-*@n9%9Gaes z%A-abJQ*)qjwP2EGT9TYr`H*@qFWU)Fr3m6 zK{Spq5;|h&We8`LL84?iVr_e~BD`n3Vhe_3$u+sX&OJ-Lw>LGpVfhThLDEC1AaFe! z+^O0ksE;AniSQo^R)z2LTFWv&y&l5=h9VebNF7eKj$xc9rhV6JtoTLOafoKisWGq@ z$~moLL>ct73<|c@q^bunrsJa8PaJR*RdtrpF@Z_)@dU3vC3=OV3R9(^o7>W|4WgzY zs;X1@II_q^FwM|+*tw1wMQN953+_d6nTU5Ae5VHn<|4SlFmgg`bzH?YhN$UoZrMUo z8~U>?BptdUrl@VADH*0Zx_=zE4CBYNA?OrEjo>E3#6HAhBF0Hew{`R*#SkyM+ny;N zT1qzY;7-gcb{Jx1tLAXI?a_hxe;r4IKX5k|kG4A?pe52?V%afm*C$P^3c2A{brf)) z6l1ouLg31z9YNGBbP`*Z9=YT@5*>c?6!ZED$<8a<-1h}3CAubj`PlU(Mv0R!jV`d> zq`GGG?FiF|L9x|CtLq5SABg8>-a*g3$LZJf7Qz{Nc9RXXuSn8bS8MV*i$0o31W2_b zylh8Ehj(#~#szH`qi-<2hpF6K=*deTFdM>t)FFxs?He@hJEGbT=-N*twO{1-JIIs@ z@TA+BfHYy8C;SD1$4AAlw^1zHu>g?zADq>rZBS;AeKHM(Z^ RP^6V2LY1a|4`_ri@E1*oTbKX< literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$16.class b/bin/main/org/lwjgl/opengl/WebGL$16.class new file mode 100644 index 0000000000000000000000000000000000000000..996fc3044e2d5ad76afc1b5ea3cefcca6c1093b2 GIT binary patch literal 1974 zcmah}+fy4=9R5zSn~>x{B5e^YrCegUDQh*Y+5i#)w6OsyX{p5v-6W@BVcEsqCDj)n z`rv~PzS9|f_1WNM>VxB(GyXfyc�OXTv4LbehcOoIUw|x9|7;&aY2?{0YDm?u8Lx z=&_xOX5Qbdn3}yKELv`h;?;ce;^iSnT3WEjXFn;4cS9D7I0xSv?1tZte`y|k4k@T6fG z-ZVpU$Xsu&`h+ko=AQh1_iZ&ibK`6yD;P@!i%T((NoqRyHJ7Z%D>8s-(;m<~bH5G(3A~-i>P< zIf;#*Xr3sy;W`Q7o^F^iEMhr~C5H3Qm>P~7c*o~#d&d+WDZC|TGz&pd^=Pu5DzFCG zl89(x+etB{twnw3U`mFXCEq;tB=<1hC50X5d{V>5A)++2YaD0L#SksnyG}_g7;-+N z{^c_vb-@rR7!`|D>(C!}|F49mQkv5_yo4s3a4jcwnkGCxZzzWoUK0Ay7`zp7Qr9m?-els^zv z{zO9g3w_GpNGku}lJXd7r`Tt0J0g8 zvGJdA`+MAJ>IK1MFC;|8d;acyeBiGiVx3ln?vJ}D(XNwFvSad-qSNwB4+QN4=>88M CEbrX_ literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$17.class b/bin/main/org/lwjgl/opengl/WebGL$17.class new file mode 100644 index 0000000000000000000000000000000000000000..6edc992758c1ae8df8bec491d70571f672d1ad19 GIT binary patch literal 2517 zcmZ`*-BS}+6#w0jWl6a59T2~YijY7cT3fY6sSr@30jyDI(W;x|8Wxvb+}(s?KdrX4 zwe3tFedt46tnG|Y(f>16kzqbmFiP4ikoiy4}ki%q5HMaET8%g`eixk4)} z#O56KGc6x+x~} z3u$3r)Y67vXh~Wb&6w6~UB0hQ`rSF*Vc416GT0%8`Z>+a8p4Z!p)c$iZyMx;a2zdH zvK)#`2hfU;iZ+J!&G+YMM+Z4@tjx`XGh*lk3Y5*(qZ2z->|i*sB_5ToICfz-gPIfW znC5B>JHnBwAkU^sC=UfGrq?*Su$Q4ucT%pcn>j+D`c&lw5igwm9NjoTxUTvbDX(lJ zU+cLn?Kf11UW#WlITb%QJ{Cj-{VMu4B)w$F5yb$_i(7fka1uGwvPE2T2!&Ai)m&q+ zErzzTLy;ZHW^GEgAg_(3K=ZC{#8Sc~7p)lLIF1tx4Vk=c6LC|N;7b=0l7+8eRgZTt zqT(dOHcz*<5yvRvL~t#et%74Um66#xj8iF;P?je<&2dIT6P%oyxwbalinAQ&duy-S|H!tt~S|USYetyeP7o z)H*TGXf%K0hOo*1b);2Lg>-N9U%B9tZo0?3RU8=*_O%&X5P=w`s*9v@S*4%q>Z`O{ z-`)%721gEalzTeW=rR$STBS?x)YlR++ zRBW%HA~irtwd|PW$CeBugSK^st?OxXQJ~Fxt1?*8eJi^Sbws~I6-S+lfb6MSw8c@$ zIL+X@JW7I250%0;D%;G>32o8q#VT$ShpGXt2*GQ=)Kr6DxWmzeX5x9u%G()nN|y~j z=-n@a@`Mb5l%6xGE7+vSRMgyR=~M+>?Pl$sIli^s21JGllg4pVQk4p4Lb!8Qmg7FY zp|Z-93aVTL3`aI;Z557)e!{jEV z8Ow30vr|6lQRptNp@*(RdJB*gqmj|5^!LzQB_#YuO5b{Su z{uSuWc=_p%7w`F5$UpG>=a>H!u`sZLTQl;UHQqU|qJz%a2EP(QlR_7-(t$2zJ9?B( zM3tR5rtHF)vKwcWJvgs);fk^sbIN`gN;ejj11KmxSW?2cqeO6D>BA37KYpU|kurc^ zltB-_VL}slyo#TcT;vJC4yxn={WbF84y9oUAChz*VJzb|MfZU2?~m{?A^Zug?u7au zqADT{Z5{uj;RV`NTvzcaYi=5$gnU*?2;HeZ`T~Kz{y)*Vg3qfmN@g;n(nP@*o^%)Y jyzxtXMWdhE$k+Imq!zN0#E_rEH2dIWC%z-uht~fA(G7~< literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$18.class b/bin/main/org/lwjgl/opengl/WebGL$18.class new file mode 100644 index 0000000000000000000000000000000000000000..f5063acfda4954c9030fc5a2605ef157adddd526 GIT binary patch literal 917 zcmah{+iuf95Ivhqoj8Vu0D)4Vv;>-@2n&e^qykb%xv8N%6ou!ty-gjQ-N@dg%2y!4 zmmq-=;*qzzc%$YN1=I5{PKL9*J%R-J}Ma2U*IvNflSB-@v^HzAz zdyRV!EEE{3Lq6qh#O1(!?G1&mEi5tIF-cnR>Bt=>$~_Vup9Gy*zF`U>Hm%0rr?L64E1A%M)TC@R-d8JrIKYZoN-{G zWFwDd2W3P!3)ReW(HpHyP@SH^ad#+@{6& z!ys)n9U;T+NkQ~%ECL?Ke3rN!V=_(V=q}y@)1vcIN)dM>o+N_iQrZ)VexVYL8#L=Y zog!GZW=2lioTF2QO}`cL?$g`+*zK(^aN1vS_EQ>jj_xIjLGe9mS?h`1_PpS4c7^%fHi{65#e>R1#F;!&9op( M3zLf`og6lP1Je!USpWb4 literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$19.class b/bin/main/org/lwjgl/opengl/WebGL$19.class new file mode 100644 index 0000000000000000000000000000000000000000..62eef976bad532c23fbda2101a9cad9b97d03ee4 GIT binary patch literal 883 zcmah{U2hUW6g|U77nao`Dz;Xwt*C&B8xvm)YJyn5iuIuepJ$gTT^we}>_Wr;FwwtZ zqA~j55Aa7B@2r?&L(+%YduMX)x%Zy4zkdJt3E&YL4l)eu+6;VoG#p4@kAsVI5OP^+JcZuA&(9cowv!x;|_3NEr( z^-x5aAzQbA)o!H3-eeRA^OgrvFjTra#_FrE<`4j#lYzgj<}> zO7Lp`uRN_ruY@&RcCgN{dCI;XHgJWZ5bDubiiBpnSnr+`oERDM!fMK}wjj!XZ5iBs zJu#tp7TF!$)Wo}%izL`lq117t2CqeOsQV6XFjSZO?%^hGk?sA|$+mShwTNN&lrSC1<5-aHg*_1`FLa#XI(eC;lLsqTtflm? zX6O{*(rbyb`*gQ2Zu8Dpc+GD(`#Hs&qwfk~kpF-R<(|!{>O3w`ByCZhGj!$*rREoS z>^m-Ha7^J^^881*`A;cLHEmX!(||^}ifcra!zR&YXy7f1Ic%eb+i63VHl`GHIvH&L E0d~{Yx&QzG literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$2.class b/bin/main/org/lwjgl/opengl/WebGL$2.class new file mode 100644 index 0000000000000000000000000000000000000000..67f6baf10a0ba6535ad74fd6fa14d2308142da4f GIT binary patch literal 1024 zcma)5U2hUW6g>l!EwJUIRjl>f(#l8TCcYVJ6N6}*EUgI*J`XU$l4XYM4ru&WzG(Ep z`0NicQU8PS&O(A3Fm5t)@9f@t=A3))e);+F6M#pkS%@+0s$k&wuSNskQ4=A_yb#@I zZs~!A1VetrXWa3*960CQk?3g)Nrpp{qXnOhol&Tqz8X7XCZrCXrZKJ;Y9U3ykUa9F zr;i!pTY8SLP)g-Z?DZvJ`peZ)Yk@M z*T&UIQK;4Ad7vhIz_q6&Nf$HCaPVJzh{ZpMN7{&U8VomWY zP-ZBY>F~Jky%7y1wRla1dbp|pLp}DLlZ%$y^u?Gatp1yxwhrh{Dhq>sDrxK*J`Y1d z^Rjs+LVcn_joVbQIIRsD{5UNdK02kybI3BX8`bwnza=LIoAzY%@+-E;x90)KB1b3s zCs3f>B%hLvk=?3&z%~QzR~VKc+32os1ooXkeneo!dBOsWQn80?VEM-cdwl_0p%??3 vs@6VZ=N)b=A?LhU1Z6@taEtaB3A_{8yVxh2KnaJakY`54$TLrsRt%+I%cuG0 literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$20.class b/bin/main/org/lwjgl/opengl/WebGL$20.class new file mode 100644 index 0000000000000000000000000000000000000000..9dad30ba5991c2cad4d4edfdc4562dc5d9f46b90 GIT binary patch literal 1176 zcma)5YfsZq7=F$!l$FZ3D01-vg18N(hHMCTmX2#~@vyPYkIFi( zVOqm=hT)F36;BFV1O{esgFz$J+G6*RdXh}181WV)WrQ(@c?~zuFuEHUxP<~K9f+16 zkzO=sr_bpgmb)>NMILtqI%lUby^Cjn`i@Om<7VCj+W4Z>XzCRyQgh9f38MhoK-V^zVpJZuz0aG!2}l zl?59bQLd-cn5LD3l45|e`$*9b&`VPvV3a;$@Gae?Fiih_RD_H>2>ExoTzU`V6Rw_M_Mii!s|ML07|i~Rp~m8d`2-5cqlgj_d`_SX31~3^&6O6u t;`Rv^J8&^8DpRZ!^DLI)>@Jq$c#mcRGIW+6;4x)tQpH_ePiUnu{u^W{976yA literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$21.class b/bin/main/org/lwjgl/opengl/WebGL$21.class new file mode 100644 index 0000000000000000000000000000000000000000..051dde49f6e9e0f4f4b3c1b427a65fabfd3399d2 GIT binary patch literal 1179 zcma)5YflqF6g|@iOUp`mC=c-gg4h;i1>Y7)4B^qFfJqH}G_&2Iox0s6yVDYXmPXO| z!T8zVVxqsmcxPEsteCi)*?V{Q&bjBFd*|D)&tCvM!&3tZhDkrDTkcV_?ppq#@W|{7 zd$TgPyksE7Fx2E7Zn@m6Tf25s)RcifhIze73EpX0&Cs_Tzh#Mz@Kk86Yg3V-5}pVc zG9B*DsfH*!46Mx1w<0~MRvA+Ha$%3mn(v4V7%rGF(4R#TITINSF(mUkAXkx|*lD+H z5xnHKD;P#9evP|(JdpZ5{+Ln?88S>&{#i|lVW7c1#}yGpsv#c*cdIxOHg7x9x3+~N zc@$MD>}4>4%LXPH#?Hq!F@-Bci`SIwh^pWAob`hPQi}MDRwDV@O1jn-4;$P3u$09$ zOdGh)Fx=I)>?u(ffr%O1U@%Cvw%9$OoFvl;M%02hj4b_;-62=&^BwtVy z8&Wqq8x7*3CQpM@m35D+c0fN~{asKG>0UOc1G&-@cMhG>Dosjm-K)8ND82f&Pz~QP z@eq%wowle;?}f|X*u3_-s<@IhhViokS5-i}N*fymns&47(J5GSc^C?shW;H9sx3cM zn5LSOw9;ThBYN=ZKqhHrpw$>4?>-WA1KHx#2bjf=7<@}_2@KP-k7AJijuG-r?bEJN zTqMi1j4{GyjF5YW@#1@!pK$dUv-@3`tWJ>rfx-082x=@!n2Vu+9118B!RG|J5Q7$C y&`fdRD{dcSu?rWmqA<-$Gf(4g|jI literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$22.class b/bin/main/org/lwjgl/opengl/WebGL$22.class new file mode 100644 index 0000000000000000000000000000000000000000..acf5d99256daa29a9a198fde89cac12a3590e5b3 GIT binary patch literal 1060 zcma)5+iuf95IyUpapSm6NH1JUZz6>>r8R_WDIlSU0##Z>6Nf}2g$zlYpxKU>%Ur~;Jbkg)P079^2Ukb zi#rVITG--QFyw8R7}nk?8(CNuQW&$5!#G2#tV8qlK=Q3_$K!F+^#o@q)7fNYl)eZPQpqM)yJ5@5P26Iz+g#N|5P6{+w-`$0|608LL`ojlgqtK>uj`+h9NyxI zdK@MSb0m-y-9s=6MXeZsEa`;^H|Wm6rmrL9tx{Z?Y`!vkfYHkG0Sc9mD8B0lPS7($ zfiSl)Nxn{^P@KjYvh=&*+yJIcAR2h)6Q(L3Fv`a<|K=^s^m|;Ob7AQ-77b|B6f|m4 z7d4+DZ*F7EY+~Ac-mfruh%%@^cyMrqYFzDSvN1}ll55}^u9HoZbZ+2wAJFJGM=niW N!fM9C9r6v7egf{c_WS?< literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$3.class b/bin/main/org/lwjgl/opengl/WebGL$3.class new file mode 100644 index 0000000000000000000000000000000000000000..b2426d8aeac1439b7b4892b1fb13475bc0d9e999 GIT binary patch literal 1369 zcma)5Sx*!}5dL}(2A1JI1Vli&c0m~x1#to85=a&_Spo?@_3k#y!0hy9rWcLB#y6hj z0go8tv;W1!`%$bOP*A}*Nq5(DS9O2&)mQJnzj^~;0<#7}3@y^jTh61cykp6taA{c+ znfX-Duz?6e?H1qRmc!k=bw9HuvdTaiL!XXOg6|ZpEniwWS+K;8aFuV(=_O_RO1Q#f zC>yt3TTL>AGO=2T1~eIHWavIKsp9|>%{a$Ukr!&Z zq?B}n%+eKT#d!m549%w_G|`R=3}z+>N-M4eDVL8T2%QujYf7gU$376ZeWiCWY##L}`vXztlsKCwW&Lz)^YQ`*kET$MaJ z;D1wbHq_r#Jbt#{u`rU8B*B_FH|t2>cJoU@ZOWX9yO<)jbPw3vv7d+;=_>JSgMgA6Y)q@N21&vg(Y-~-Jc(TPv!$7j;o z7YySoM({0w(RKLL5e#}1*KnPH7^J*m+#ujL>5c@#2c*@o0cN0qax*ZpK;uBa^>Z^s z8?1JUG8sL}BthXJa;X>?e2a#C-1?IW5+ogKmnd!rRubdEI)O=ABh&36v@PY*t5rw2hlM+bqY1)qMmhEn{JFUiF;~USC zh|ve*v%knh1!Vlm&gVUB61>ecO%@$EMBqF+NF!+29rrw%#>aE>8T5b{A) zO2_t*Wg-~Dc@4u11C2A(F@g&Wde(Q!NG=882|U|Xo})U(aETC_U>fcdu{l+~M&w167 z>gtM)tA1-d=~SM&PK6h^G<~F^CK)FGtFR0#OKXFnozUj?(!ApLQd4CZ|3`ED{!w3| zV7R5D3*8LSj8k=U;*qHc67}ghtH4tuGG@W%vg*4{E~JGlI(ePOh}hk&SZ;F5d?i*LTZ)%dr-eo!i?VDP>s#s6nkC9KDakWAXQWH- z5_ICphE3zMYH`m~JZaq&o?Lf4Nj#z6(hAc62Wim|(Jn%oL6VUS&%8tQ4JiTW^l$MG zzo4CTy>5UGbkdGy8{PC*&Tr{4_1t{oJ$e|H4lpW6V)rD*jkK#z}mNhFL#tjjXQWI%Rx= ztl|hB6AgnJn1)^grD1NJ*0GB7^DsaMtZRiJ%%4DrlY4+nA~T6k=sm>EKWjitq-$jo g#%*7_g9TsSMUrHQCUFt>NK@2PrBvU2S^*6G0Ndz08~^|S literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$5.class b/bin/main/org/lwjgl/opengl/WebGL$5.class new file mode 100644 index 0000000000000000000000000000000000000000..a4ce6b9bc87b794e38069a97fb4ff019c9badde8 GIT binary patch literal 1465 zcma)6+foxj5IqBdCCSKD5m6E4A~#u4Q7~M@gqtRS1%>iBBtx>)W|!KX1j}FWYlJEl zA1t5!D9fG!3_`Hns@d+D?aS$&)BE$+x9Qk0AKZs^-Nzi7*{^i*iiYms(BB|RB1)K58{ zqh=Ut2L?A8B1u0dW2i-(!$Jc?Q`+(5N~yRlgAK9mN`}_7pB3(=2pqjXIgF@+6EbwB zFTnpzotM0sIlj%&g*$Yd6<%3TbwgDU7gW);mo_r#q%oRzWs&-uh~qAL zEZid`7jL4v4@WQhsNqyb(sd}vl63L~Wo~9!H{m|Vz~6;#Y4k%J!xi-A=mEzlYzE5| zl+qQY;uynY3y&CjE+RVNMy2l@PcY8F2~5T>o0=#JaU`WvKI51;6Msv`e$J6N?_xeo zbIfQaHSPr_O-k;FlB=}O3ywKMvQYVZYk|Kf@wYQ7$^}RBIcBD5RF4rublu5&LX`sgAkybYD{(m%}ne2_`sQ}R7EW3pP2f2edyyfc{BRX}m6bh^i7 zkET88iZGN!E=mzzgRvrCsYH88T(=JMyO_GtU8~TFSCsJy_>0Pf6Sq-j` z&W{byh$h<6uLv#l*3KUhA$wqU_$yiu(Q$xVN9bmtZGY|%g9jKHKEgwW>>)-D@RT-_ z4Ewax>J%9sVV0qiwu_K~)xl!*Gy)cSSp!iyiU}6O42v5$?Z+uk;81eBL=vodj)0|3 zfDMw31{NI}{(-U2n6IQTm64gQOq^`dOn@gSOwe C@MF#Z literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$6.class b/bin/main/org/lwjgl/opengl/WebGL$6.class new file mode 100644 index 0000000000000000000000000000000000000000..3e7c38d6f8b1e886031bea92e9012b548356b0c5 GIT binary patch literal 1336 zcmb7ET~pIQ6g}G(N=uOMiuDTxv877KcQ(0a>*u4F5mm8$hGhOc ztyzZd3U@6>1OgZ`sUWwl#fm(WkUsWO2bRyIeIqTCo1M z=lpI8XpTF6_WZmv)@A3ZV|$m}k|TZFEw2exk(Pm1SRiBck+HdBe-=6ED)EUdnQ8Z( z6;*T0m5sIhk|SzVfb1#R1?3SgH8+E?>e5-vIo$Vk=XR|NU#&=AVU&ys)99eTL6`=e zNP3FV%%sRDc1(Ul{0mJ&FzDW?U$P$b(A;Px;1YW2iGCF5r@P+l5Lk%f_&x?Q2N*fP zwaCUkMl)YAzLhz|B%P5%m<$Jabb_5Ebg+IHY=BPUAd+kdqimSEKN0XHT9`+CgpQ|} z2J2fO=4VIDY0A;evB}I&5Z&_=_&_?PY3Vwp122ME7PCQ|!#u?Z_2)~xrkQRU?SQ^= IG(s5s1GrvCH~;_u literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$7.class b/bin/main/org/lwjgl/opengl/WebGL$7.class new file mode 100644 index 0000000000000000000000000000000000000000..40c416182baf8e33233666d7b7063b4544056d2c GIT binary patch literal 1299 zcmb7ET~pIQ6g}G(N=xLMipWP1#Fi@Y8?lHoh|;m3Gi6`~pSI1~rli?UvaRC3k_QDJ z9H0GBj(1ZSU@VMgW^?Z*ch5aJ_ul;a{rv}kXIP0M#4sYgvgv%RmK{^pg-d2f6kq3O z7NUqS^i_G2n+|u&=G$UblvEU*472)-61-V6tG+ZXSu;gbxXL%zw8`7P60YzVI+twM zR?7_GRC=2svMMbRM;P4(qUd7i&D*ZnY}AUv+u}t>Fbw2ni96fev-SS?VMJAIpJ6nA z5!Wn3cZIu_BLV^pnN$$lmg5_-UzFUlg3xSwJBC3FM=`{ZXpe6ofvXI$J+WUg@?j%bktmCT>MB%P`dLy@3?cR0eKY48y4w#+kBa)4Scs;7$~`FDvgk z=?u*48urvZp{xEWSy6}vZYG|L{l;Rb8#4^FNr-VU>ppO z4fLU(AzqLTuOwdCx|!lZE6-~|NW_9&cDZVJ^uqdEfQ$PjNORKDOBctT6DPY&J=weF zmK^EZZh1qfinI)xIvR$4Jrp)~?9XCVx=MT^Nfz6EXGPT6L>_h#3o@YTBX6_O-Om{tePdzco@9PMJ{nPeH+j=67$e<3FXgYKRB zAsfLJ@{LvideBQd`W2v`?)tDGun^g)0}NyiF>;8p@YVs6nXj1H$sA#hrr-!B!zpk= zb6{gI*fX^6A>)#;{jOT3Z;B_oH9)@I%RAw^AnWk(J6GmnZh(@ i9nyh?z{Q_ln~= za*ZLH&g?S8)_q$f5Jl32fgXnbyyJ=OMy)7<9bR+=!%*HYad(#oj#{@jW3u9e43qiG zxaJs=74F%t&;%H=Y3AhTekYrGqVAZ;@@9+!=P4(xv)dASC3m@}QOT<&+FaJeCWK-y+x!H0+ANpxU z?TtbDtIIX=j*y)>#?TQ)vZoklI70FmH?t?0+M|s$wbd!I3<^7{v4;>Nm|5zMIg<1| zrde9YNwu)raR?QQn%;eVlZ_3$pwJK6p)>8!@rCS9Oq}51U);$}aaZiR@L12D;HkFH YutYXSt+R|3nkm(&6sT{NMg+ru0GPQl>Hq)$ literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$9.class b/bin/main/org/lwjgl/opengl/WebGL$9.class new file mode 100644 index 0000000000000000000000000000000000000000..cedd8c509a8e5ed6ccd5a03f2e596aca8b720d17 GIT binary patch literal 1151 zcma)5TTc@~6#k|yEG;WgE*0?t%EexU#oGfZk{CoWSH*lwNfG`rJk{8##b z(FfzRKgxJ!TT&8RW0RS4X7|i@zVr3lU%$Wq0PqBlEhHEgRakfAhh|+msx1NvXQKMT zUE8scVwh?2E_Wmk>dvcbQ`EGDafS_ZM+@F+Do;WUjoELfOl$PEX#k;7GjZ>dhyLnkIVH`b-2 zed*8$?}cY(E@yBJ*DWkD%ny5S;|6Y$7Tog~7VZvR{?bwUCprmU-A%(f9QB2VFnCE8#Bl< zWGbo?*2Ht){Fj;7Nn1t=hIGZR2V8eTdcpr5eKeoA&4s0QN7oHxDesXVrVoOeRFNOl zkA!Y0&&GW`V8|Ln`ds>-#J&o&_()>x3>&hcThci^IdTuAXpyPQmpE5+NVw!42K!|| zPT!Y2iUb*B;#frbP(>Omq)L+37=3F=TI6>+r73eLGKyoxugH9+BmtZDar2NBafNcb zSAZ!@(}_MqWN9~--%xde;=&iqmd>$wR{Dlp479H@48UfQqI;WUfh|lihy1-A1Lt~| z`@jT)4crBrc}gwv{T79Oi*&K{6U*l)3}9o9RAx9D7Go&I**$E=af^lnwVuN^9#Uqk NVMaB-N3;@{`va+77=r)+ literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$AudioBufferSourceNodeX.class b/bin/main/org/lwjgl/opengl/WebGL$AudioBufferSourceNodeX.class new file mode 100644 index 0000000000000000000000000000000000000000..734af18a758f54c1bb657302a4577b0778aa9fb5 GIT binary patch literal 806 zcma)4$4C5Mx^Cy&k|6e*i@SB#IOTBv9bG4oh%kY~%vpL_2VZkT~!Gd=z4K zL5M>vAxob2X6DVzetf>Y1K7k|5gNm46gS-9uGt9O=thJj&V;vLS=i1l{Aee;ycF?C zl*M&XjV{D_5e7qVlizYT;9S9VLmVOSOH{vf*TF)hYYiM;C%}JKnojw=%-r@*-}Xy2;<`(m zE$Ha6(TQFLeQ~K)0z=t`iGtJyY!uNUwILfNSPVTCKNQvM+7t09_X0uaN>t}TjmN&U zf1E~o3>{UG zqz6%wVuohY>7D5)%V9|?%Tbl2K}j-bv=*CW7g+&W2FU^E72VEq3w_Q?3;oV&3xhA@ z*Dy@~A*u!Q9)|gVlKF^k^9lXtGe#)peCJ~nV`Nb!)t4zvcGi?8d+YR#lciw-lO!$T Nz%WIeEzBza)EDbf%X9z$ literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$AudioBufferX.class b/bin/main/org/lwjgl/opengl/WebGL$AudioBufferX.class new file mode 100644 index 0000000000000000000000000000000000000000..671c8e49525d37782487112b880131604639aaca GIT binary patch literal 524 zcma)3%TB^T6g^Xlg<1h$^|3M$BWPkjz(=Aas7Zqh4YHlWfNe_0^Z~!4{(%c);=&K` zql|Z|3l=6ilX={8?>%$RosZAAcL2xOG@vnT%Xs93(_j=j@?J!A+zRj9t)FHCU!G;d zp@@41bcR~MC)^2nG;*%IK=f0FIWPA!)Lq4r3O*S-K_Z>0@VLr%W>^j>{>YE~^n_uz z@t=fdmqBmIfiO|PyafXmL!r^^mcdZ5P{bTV)%7FM$;O_DZ@3onwy6FB{Q=dgMC3P(D0q3& literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$BufferArrayGL.class b/bin/main/org/lwjgl/opengl/WebGL$BufferArrayGL.class new file mode 100644 index 0000000000000000000000000000000000000000..8891ae7f949b5f55f04a937132457a4d69964422 GIT binary patch literal 589 zcmb7BO-md>5PdZ}y6$Flay7i!+TMyCtLv+g zR)?+QpOw@OVLB^LOVu0c@0(Kh2y{Uh-_3O9_6VD+|Dm_mA%q8}$4%5Q8KHqGX=`<@ z(|~jwVGQFQ%|xhUg3wAb%}3=`%J!>DbC#3DbXDF_HuL;XGIZavg0PbO%W%X~^URdC z%bzl@*sKP)>8C}AzG%(%AXi1fMIDQT_Vb#A$-hQUm^k9XeKv)|dvQ>cKMOGD4GAJ| zr;4FiZVG=P>{xCD5?kx{h}Jjm1k~;@eJiN|v$D@16gZ18m_s9&$5hZ3NuWJ?hIv7L awW>0{=qq6XUgM2KUxu)Nx5AdH{K9WZlZ9pg literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$BufferGL.class b/bin/main/org/lwjgl/opengl/WebGL$BufferGL.class new file mode 100644 index 0000000000000000000000000000000000000000..57900f70453fb633cdd851ab9dbbdc5d7e134c12 GIT binary patch literal 503 zcmah`O;5r=5PefBg<1ho>&L~IZ~#qgJo|Bw1T<;zpuzJN7i?3yrY-QhJQx!X{s8}w zdNEFm+>B$;8e$#5v+u4_Oi z)B-UTPAH<0bL9nckP-^Y3kZ8|mYzy69XmmyoSF0%3Uh&DLh;0p{Pc{_X#N}B>J#*~ zx|1dfShirm;!@34zYIdf!V-#vs_RFxHyL{}z7bw133XQuMA#RxpWz=;Pw)L?(c&Ky za*O7*n#2Ry@iQ?qU%+8DGQqlxA{nWnxqSIugy TG19ooM$QuJ+t|W3TgKbpm-}&c literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$FileEntry.class b/bin/main/org/lwjgl/opengl/WebGL$FileEntry.class new file mode 100644 index 0000000000000000000000000000000000000000..7748397a12911cb547f96636e74e13709d4a5e10 GIT binary patch literal 862 zcmah{TTc@~6#k}N7`k1cg;K0VYWV-HC*YRAx-fT zU+T_}07~ht@RJR%COQSUocFPUI*a_OgL=w{$(#S9*OXWriglb_7 z<66sE;F!=_-a-l{!*o^pqSilditwS^^n~s)Xt`d)4W+h+PD35Zh+(DrKLThT-Vv(i z9#g4YsXW@OiA5}NT>guvb22O}V}%Mxzb&5cAJRyrO1YvRtXWvc6^2yQZ$>e3409A5 zEl+ewIu(Y=x^i1j_T1iZ2D2XY!tzhKJV7$9pe3@~di z4>0#B&Yq_`uXFfI82lAd{57Wd8_e>zxIi%*hJKF%E|S!m#$~alkrT0|v6JL2Vqu8f zC0oZ9?a#<&oHJb7F20~1$SN9-&#-!`)lQj}p64t>1qv48UySNp7A literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$FramebufferGL.class b/bin/main/org/lwjgl/opengl/WebGL$FramebufferGL.class new file mode 100644 index 0000000000000000000000000000000000000000..33a056b7cb7442fca85d2f15e35c5d1053c62362 GIT binary patch literal 528 zcma)3%TB^j5Is{Wg<2k>Rz;V@fF?GseQZcTlLi+WT;Jja+mzO{1-{FLF>&Ds_)*5W zRT35^n#p~flRIbT%>DR$dk1iVrU8x6ij#>GE`mwu#7{Ef<6e4wx7AC;RC=@VSSEef zfKI3fVlJFeL=)%63*;yx6k;zR9J)#)lVUz~f;4s((p$=`sGJds=YHg8mxNCHe<__I zLGQ*7(nJC477SQiwA~q&L8w|-Ly=H({YVaGQ%@#$!V4v#;l?8o4n^WC{6p&5qn|FD z{mU>nYu?7QWF&jOQZ)0SoTv#9tm`O}NjDT}DpLbH1pD_P5-KYL=(~i{K&IJMoMt#> z2L=8I!j`g;-*h%uVy4Wf2aN+Tk6w8lzo7EWNJEYHs>;-w(6xP(wFA_dv%gl-4mGqqGF6>2)x|T7Oj`SMt`dOlSi5N6o69&V0 zC~k!liMZ#SdZF|)hMe+3hBa5?GbwHdPM9j^PI})IUkrN;#lA@UzUoQ_)?_H`2XT-c zGHh)AkKSrC7)OLHA%{^L7RE?>bE|EE*0PaD!9oR96O#|n#FS7=rrC)~GwjlKIeH(Cs`f@-RlO=z%7NUMsE$zAp}#oQ>H0J5 z`t}pb^#@ECSC@~NctY)-t~h4stPl)54}%wAaT7IO#4OEgpK#1!o;o5L%4zWh>Npm$ QL{-aCC|D-U%5Yx!07!0o#sB~S literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$QueryGL.class b/bin/main/org/lwjgl/opengl/WebGL$QueryGL.class new file mode 100644 index 0000000000000000000000000000000000000000..d3a548d3da34157d9ee37d3b296f788c99acaecf GIT binary patch literal 508 zcma)2$x6de6g@YMO&g=FRpYP_7Y?a{!9_uE*c4iYP%BDZztl%fNE1oYO8qMrBDnAa z{3!7z?NUT8Z#aj0&Kc0|$j`lW+s@9-NXC=4qd_H9 zeK8hxAi{xt?fSBx5(<&)6Ly_Yrgm3O(kSc(V)D{BY1pY0a05xGIZv<)KQI3svUKX*QNn bW5l}LHLJ1ANZ~50IZNzsVjUYC8E^goq}Xu( literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$RateLimit.class b/bin/main/org/lwjgl/opengl/WebGL$RateLimit.class new file mode 100644 index 0000000000000000000000000000000000000000..8c67a5eaf6a7ca01166fe0b816de36cbb0dad881 GIT binary patch literal 1337 zcma)5YflqF6g@*9yIoeOMXNj%sptzTe96^h(E@^ zpv45Dk@(pkWxO*M=m!n-L+_lsbMBmb=ghC)-%bE5A|s)TVWjR>lGP8pm1?rSXE_wM ztyR-SN&GF)@ww2Wx#@<}!R5@L)+K%llG5BKf zB1z8F-&!&P3K;rST*GyemTqr}#w(d zzEIk=%3dnhF_6;~O@wYyC@H*SSm>m+hZev1Zg^vlRm|fF!+d9nOx0{OQXS`>)jaQk z+mAe@==G*sw$^PvJVjV`hHs+2bi3l1Uel!ya~-ufF@3SPB`U7w9LI8n8ml2;h5Y(& zo6~7$?}S0lTMh3;z2U9Q(p~%Lkx484+&ch8vW6 z=%qSgLZ1lp-^cG@M&zpR2$4fX1-R)KpkIK&fB-`R+ztvbEWjN}fKdU)WdSC_!5>u5 z*Fsb`{4MnBMxccu-3YcYtQ%4bqq-rtFrgn}@(Uf`g*g2y6yg7hy#Ejhk>y|LIkm;k zQtP7m#MICcrp}2$+JH7m9lsCq|m9-1H3|BRTz9 z9LQyeYQ#B}5F$e@v}+_t5U;O9SmGFueuDj<=f_h~GljH>i&)}J;xjB`m2PfLd DFD@N{ literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$RenderbufferGL.class b/bin/main/org/lwjgl/opengl/WebGL$RenderbufferGL.class new file mode 100644 index 0000000000000000000000000000000000000000..bdb0df9cfc5a3f7ce995844d9dbfab3340d40e43 GIT binary patch literal 533 zcma)3%TB^j5Iwh43bg{F;$x*oBVc0V+Q)_jG-)tVgX>!uuuW-ATj0A~7!wzMfFEU? zTP0y(qM6*sIk|IY&fJgBw|4*+*fF3997gfT4rcx+u%jmm`FJ3=;~d;lIH1^_42KkV z90R&Q#g|iQ2QnPlH?B|pR3I0*zQB>AL{gH|vF#_3JtKFnvnX>WkU#fAFTE6K*8iE) z=n3epXh0@%Shirm;-YsL&x|ybc`vChoZKR3UjsZ*H}fB a5$9#9s>T{4jjL>AtYG~bwy@2i_}UlFvwM;N literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$ShaderGL.class b/bin/main/org/lwjgl/opengl/WebGL$ShaderGL.class new file mode 100644 index 0000000000000000000000000000000000000000..47c5cd383fc3567dd8f0c071ca652570218ccd9e GIT binary patch literal 503 zcmah`O;5r=5PefBg<1ho>&L~IZ~#qgJo|AW0Zke_VDP+!4YVm;(-!z$9*l_xe}Ml< zbXw$QG?U$(_cHV5V?UN}?*OiGWI!Vvt9a~$i(ni&>PbfYJW8+YHu@7Wl5y8Hpc86= zmmul=yZl z3JM-x=7pI|=Dqii*Eax{*pJZ@xNvnT%}Z4p>6T;}o+!UbPqNS~_4Bl`MbOU9$UC#5 zEY#YTG5P}IO0ASM%9ipmuc!zyB7wu!Es$C*WaXW_&(@qkQhz%L9Gs> literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$TextureGL.class b/bin/main/org/lwjgl/opengl/WebGL$TextureGL.class new file mode 100644 index 0000000000000000000000000000000000000000..14edfacba8e7633f18aeb9bda5ec3f5175a7611e GIT binary patch literal 656 zcmah{%Wl(95Iy6#apIcvNok>>uM`qj!s?pGCK92N6&6H6>h3zdN^QBmmF*<_7K^A- z7ySVK1t_pb%yk-8709|iGvm2ObI$n7@9P@?uhFz%5O!5M^x{c0j6HQJ6NZm6==hDE z{FIMU+3_uygyl$#g%^ut=)DgjImihm6-0!6U*FHA7+-i%ro4#^<`j1fF9|f^bHeAG zU?ozdGGhWdB`k_0%v7GL%Wyy_zY3Eue?vHI{-3thCzx$@CT*0k;@|;Rd8lTqUj<>^ zfrW~WHXKxE(WV0%i@NsMfisJ?9W0d*uyD;^Ic9GzmB#BJhvB)x+Svce&?_UC;`gaY4N|$YWr?MQ! ztf9m^T)?^>pCk4al>%98fh@H^7FwXm2GzK4iL(d>KfqJ>3d^oB#hQLSbj>Lqxuq$# z+@mR;eC7@Vb=}A8pdb7rd_|SMp+?`aMz`3cpQzI>{tj%+7_oz0&h#BUnVxfxGXwiL RV6?eHXy6&P@Vuxu{s8TZh)w_i literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL$UniformGL.class b/bin/main/org/lwjgl/opengl/WebGL$UniformGL.class new file mode 100644 index 0000000000000000000000000000000000000000..50c6692b4073f4f30f9ab4480e8e27f88e98ba62 GIT binary patch literal 524 zcma)3yH3ME5S(>P92@6B0Q0C2qDX?kqUO;=NBh#@P&!chd%14p#aVvtpw|A3-_cERIJp($S z5&1LUjs0ZoUIvjE<%E(9B0|Sg`ML0C6F17FI~T#X#6rQ7BR>yia!e?ngh`m65e{1a zPiqeedRN{F3neVuFkrKJt35P9sM%OTnNat_L=2{rK&01x5DP+6`Nl&(4HaIHdj1e* zgx$jZucoq<`3k?4g=%_@d+sHQ-$FOo#0-Pq4Ekr~(^IKK~(VE&AeP#K6UKbKjK zBd)x}e?VAM=v5GU`F&0Ibdnul;9KpBQPV^IlV#nhjm6!qjSLFz0-|#tNE@ ZIImDu9;=Krc3Cf2Vtogj*y2#U^9iBRcijL0 literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGL.class b/bin/main/org/lwjgl/opengl/WebGL.class new file mode 100644 index 0000000000000000000000000000000000000000..34f45e19be8300472030d650b361df851a1bf882 GIT binary patch literal 64153 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 literal 0 HcmV?d00001 diff --git a/bin/main/org/lwjgl/opengl/WebGLManager.class b/bin/main/org/lwjgl/opengl/WebGLManager.class new file mode 100644 index 0000000000000000000000000000000000000000..321fda42dde0ce000099ad8d91b0d9bc8386f44b GIT binary patch literal 33841 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 DETYxU literal 0 HcmV?d00001 diff --git a/bin/main/util/IProgressUpdate.class b/bin/main/util/IProgressUpdate.class new file mode 100644 index 0000000000000000000000000000000000000000..af1c28708da648555ce4cf508c00aa3e428d5871 GIT binary patch literal 240 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..aa991fc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed 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 +# +# https://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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..1a257bd --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.4.2/userguide/multi_project_builds.html + */ + +rootProject.name = 'Indev' diff --git a/src/teavm/java/net/PeytonPlayz585/MinecraftMain.java b/src/teavm/java/net/PeytonPlayz585/MinecraftMain.java new file mode 100644 index 0000000..d4f3f2f --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/MinecraftMain.java @@ -0,0 +1,124 @@ +package net.PeytonPlayz585; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.WebGL; +import org.teavm.jso.JSBody; +import org.teavm.jso.browser.Window; +import org.teavm.jso.core.JSError; +import org.teavm.jso.dom.html.HTMLDocument; +import org.teavm.jso.dom.html.HTMLElement; + +import net.PeytonPlayz585.storage.LocalStorageManager; + +public class MinecraftMain { + public static Thread thread = null; + + public static class AbortedLaunchException extends RuntimeException { + // yee + } + + public static HTMLElement rootElement = null; + public static void main(String[] args) { + registerErrorHandler(); + String[] e = getOpts(); + try { + try { + WebGL.initializeContext(rootElement = Window.current().getDocument().getElementById(e[0]), e[1]); + }catch(AbortedLaunchException ex) { + return; + } + }catch(Throwable ex2) { + StringWriter s = new StringWriter(); + ex2.printStackTrace(new PrintWriter(s)); + return; + } + run0(); + } + + private static void run0() { + System.out.println(" -------- starting minecraft -------- "); + LocalStorageManager.loadStorage(); + run1(); + } + + private static void run1() { + } + + @JSBody(params = { }, script = "return window.classicConfig;") + public static native String[] getOpts(); + + @JSBody(params = { }, script = "window.minecraftError = null; window.onerror = function(message, file, line, column, errorObj) { if(errorObj) { window.minecraftError = errorObj; window.minecraftErrorL = \"\"+line+\":\"+column; javaMethods.get(\"net.PeytonPlayz585.MinecraftMain.handleNativeError()V\").invoke(); } else { alert(\"a native browser exception was thrown but your browser does not support fith argument in onerror\"); } };") + public static native void registerErrorHandler(); + + @JSBody(params = { }, script = "return window.minecraftError;") + public static native JSError getWindowError(); + + @JSBody(params = { }, script = "return window.minecraftErrorL;") + public static native String getWindowErrorL(); + + public static void handleNativeError() { + JSError e = getWindowError(); + StringBuilder str = new StringBuilder(); + str.append("Native Browser Exception\n"); + str.append("----------------------------------\n"); + str.append(" Line: ").append(getWindowErrorL()).append('\n'); + str.append(" Type: ").append(e.getName()).append('\n'); + str.append(" Message: ").append(e.getMessage()).append('\n'); + str.append("----------------------------------\n\n"); + str.append(e.getStack()).append('\n'); + } + + private static boolean isCrashed = false; + + public static void showDatabaseLockedScreen(String msg) { + String s = rootElement.getAttribute("style"); + rootElement.setAttribute("style", (s == null ? "" : s) + "position:relative;"); + HTMLDocument doc = Window.current().getDocument(); + HTMLElement div = doc.createElement("div"); + div.setAttribute("style", "z-index:100;position:absolute;top:135px;left:10%;right:10%;bottom:30px;background-color:white;border:1px solid #cccccc;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font: 24px sans-serif;padding:10px;"); + rootElement.appendChild(div); + div.appendChild(doc.createTextNode(msg)); + } + + @JSBody(params = { "v" }, script = "try { return \"\"+window[v]; } catch(e) { return \"\"; }") + private static native String getString(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.navigator[v]; } catch(e) { return \"\"; }") + private static native String getStringNav(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.screen[v]; } catch(e) { return \"\"; }") + private static native String getStringScreen(String var); + + @JSBody(params = { "v" }, script = "try { return \"\"+window.location[v]; } catch(e) { return \"\"; }") + private static native String getStringLocation(String var); + + @JSBody(params = { }, script = "for(var i = 0; i < window.minecraftOpts.length; ++i) { if(window.minecraftOpts[i].length > 2048) window.minecraftOpts[i] = \"[\" + Math.floor(window.minecraftOpts[i].length * 0.001) + \"k characters]\"; }") + private static native void shortenMinecraftOpts(); + + private static void addDebug(StringBuilder str, String var) { + str.append("window.").append(var).append(" = ").append(getString(var)).append('\n'); + } + + private static void addDebugNav(StringBuilder str, String var) { + str.append("window.navigator.").append(var).append(" = ").append(getStringNav(var)).append('\n'); + } + + private static void addDebugScreen(StringBuilder str, String var) { + str.append("window.screen.").append(var).append(" = ").append(getStringScreen(var)).append('\n'); + } + + private static void addDebugLocation(StringBuilder str, String var) { + str.append("window.location.").append(var).append(" = ").append(getStringLocation(var)).append('\n'); + } + + private static void addArray(StringBuilder str, String var) { + str.append("window.").append(var).append(" = ").append(getArray(var)).append('\n'); + } + + @JSBody(params = { "v" }, script = "try { return (typeof window[v] !== \"undefined\") ? JSON.stringify(window[v]) : \"[\\\"\\\"]\"; } catch(e) { return \"[\\\"\\\"]\"; }") + private static native String getArray(String var); + +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java b/src/teavm/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java new file mode 100644 index 0000000..5056a5e --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/FixedFunctionShader.java @@ -0,0 +1,397 @@ +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_invertNormals = _wglGetUniformLocation(globject, "invertNormals"); + u_light0Pos = _wglGetUniformLocation(globject, "light0Pos"); + u_light1Pos = _wglGetUniformLocation(globject, "light1Pos"); + } + + if (enable_fog) { + u_fogColor = _wglGetUniformLocation(globject, "fogColor"); + u_fogMode = _wglGetUniformLocation(globject, "fogMode"); + u_fogStart = _wglGetUniformLocation(globject, "fogStart"); + u_fogEnd = _wglGetUniformLocation(globject, "fogEnd"); + u_fogDensity = _wglGetUniformLocation(globject, "fogDensity"); + u_fogPremultiply = _wglGetUniformLocation(globject, "fogPremultiply"); + } + + if (enable_alphatest) { + u_alphaTestF = _wglGetUniformLocation(globject, "alphaTestF"); + } + + _wglUniform1i(_wglGetUniformLocation(globject, "tex0"), 0); + u_texCoordV0 = _wglGetUniformLocation(globject, "texCoordV0"); + + genericArray = _wglCreateVertexArray(); + genericBuffer = _wglCreateBuffer(); + _wglBindVertexArray(genericArray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, genericBuffer); + setupArrayForProgram(); + + } + + public void setupArrayForProgram() { + _wglEnableVertexAttribArray(a_position); + _wglVertexAttribPointer(a_position, 3, _wGL_FLOAT, false, 28, 0); + if (enable_texture0) { + _wglEnableVertexAttribArray(a_texture0); + _wglVertexAttribPointer(a_texture0, 2, _wGL_FLOAT, false, 28, 12); + } + if (enable_color) { + _wglEnableVertexAttribArray(a_color); + _wglVertexAttribPointer(a_color, 4, _wGL_UNSIGNED_BYTE, true, 28, 20); + } + if (enable_normal) { + _wglEnableVertexAttribArray(a_normal); + _wglVertexAttribPointer(a_normal, 4, _wGL_UNSIGNED_BYTE, true, 28, 24); + } + } + + public void useProgram() { + _wglUseProgram(globject); + } + + public void unuseProgram() { + + } + + private float[] modelBuffer = new float[16]; + private float[] projectionBuffer = new float[16]; + private float[] textureBuffer = new float[16]; + + private Matrix4f modelMatrix = (Matrix4f) new Matrix4f().setZero(); + private Matrix4f projectionMatrix = (Matrix4f) new Matrix4f().setZero(); + private Matrix4f textureMatrix = (Matrix4f) new Matrix4f().setZero(); + private Vector4f light0Pos = new Vector4f(); + private Vector4f light1Pos = new Vector4f(); + + public void setModelMatrix(Matrix4f mat) { + if (!mat.equals(modelMatrix)) { + modelMatrix.load(mat).store(modelBuffer); + _wglUniformMat4fv(u_matrix_m, modelBuffer); + } + } + + public void setProjectionMatrix(Matrix4f mat) { + if (!mat.equals(projectionMatrix)) { + projectionMatrix.load(mat).store(projectionBuffer); + _wglUniformMat4fv(u_matrix_p, projectionBuffer); + } + } + + public void setTextureMatrix(Matrix4f mat) { + if (!mat.equals(textureMatrix)) { + textureMatrix.load(mat).store(textureBuffer); + _wglUniformMat4fv(u_matrix_t, textureBuffer); + } + } + + public void setLightPositions(Vector4f pos0, Vector4f pos1) { + if (!pos0.equals(light0Pos) || !pos1.equals(light1Pos)) { + light0Pos.set(pos0); + light1Pos.set(pos1); + _wglUniform3f(u_light0Pos, light0Pos.x, light0Pos.y, light0Pos.z); + _wglUniform3f(u_light1Pos, light1Pos.x, light1Pos.y, light1Pos.z); + } + } + + private int fogMode = 0; + + public void setFogMode(int mode) { + if (fogMode != mode) { + fogMode = mode; + _wglUniform1i(u_fogMode, mode % 2); + _wglUniform1f(u_fogPremultiply, mode / 2); + } + } + + private float fogColorR = 0.0f; + private float fogColorG = 0.0f; + private float fogColorB = 0.0f; + private float fogColorA = 0.0f; + + public void setFogColor(float r, float g, float b, float a) { + if (fogColorR != r || fogColorG != g || fogColorB != b || fogColorA != a) { + fogColorR = r; + fogColorG = g; + fogColorB = b; + fogColorA = a; + _wglUniform4f(u_fogColor, fogColorR, fogColorG, fogColorB, fogColorA); + } + } + + private float fogStart = 0.0f; + private float fogEnd = 0.0f; + + public void setFogStartEnd(float s, float e) { + if (fogStart != s || fogEnd != e) { + fogStart = s; + fogEnd = e; + _wglUniform1f(u_fogStart, fogStart); + _wglUniform1f(u_fogEnd, fogEnd); + } + } + + private float fogDensity = 0.0f; + + public void setFogDensity(float d) { + if (fogDensity != d) { + fogDensity = d; + _wglUniform1f(u_fogDensity, fogDensity); + } + } + + private float alphaTestValue = 0.0f; + + public void setAlphaTest(float limit) { + if (alphaTestValue != limit) { + alphaTestValue = limit; + _wglUniform1f(u_alphaTestF, alphaTestValue); + } + } + + private float tex0x = 0.0f; + private float tex0y = 0.0f; + + public void setTex0Coords(float x, float y) { + if (tex0x != x || tex0y != y) { + tex0x = x; + tex0y = y; + _wglUniform2f(u_texCoordV0, tex0x, tex0y); + } + } + + private float colorUniformR = 0.0f; + private float colorUniformG = 0.0f; + private float colorUniformB = 0.0f; + private float colorUniformA = 0.0f; + + public void setColor(float r, float g, float b, float a) { + if (colorUniformR != r || colorUniformG != g || colorUniformB != b || colorUniformA != a) { + colorUniformR = r; + colorUniformG = g; + colorUniformB = b; + colorUniformA = a; + _wglUniform4f(u_colorUniform, colorUniformR, colorUniformG, colorUniformB, colorUniformA); + } + } + + private float normalUniformX = 0.0f; + private float normalUniformY = 0.0f; + private float normalUniformZ = 0.0f; + + public void setNormal(float x, float y, float z) { + if (normalUniformX != x || normalUniformY != y || normalUniformZ != z) { + normalUniformX = x; + normalUniformY = y; + normalUniformZ = z; + _wglUniform3f(u_normalUniform, normalUniformX, normalUniformY, normalUniformZ); + } + } + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix.java new file mode 100644 index 0000000..d3e962d --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for matrices. When a matrix is constructed it will be the identity + * matrix unless otherwise stated. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ +public abstract class Matrix implements Serializable { + + /** + * Constructor for Matrix. + */ + protected Matrix() { + super(); + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public abstract Matrix setIdentity(); + + /** + * Invert this matrix + * + * @return this + */ + public abstract Matrix invert(); + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix load(FloatBuffer buf); + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix loadTranspose(FloatBuffer buf); + + /** + * Negate this matrix + * + * @return this + */ + public abstract Matrix negate(); + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix store(FloatBuffer buf); + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix storeTranspose(FloatBuffer buf); + + /** + * Transpose this matrix + * + * @return this + */ + public abstract Matrix transpose(); + + /** + * Set this matrix to 0. + * + * @return this + */ + public abstract Matrix setZero(); + + /** + * @return the determinant of the matrix + */ + public abstract float determinant(); + +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java new file mode 100644 index 0000000..e48997e --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix2f.java @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2x2 matrix + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Matrix2f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m10, m11; + + /** + * Constructor for Matrix2f. The matrix is initialised to the identity. + */ + public Matrix2f() { + setIdentity(); + } + + /** + * Constructor + */ + public Matrix2f(Matrix2f src) { + load(src); + } + + /** + * Load from another matrix + * + * @param src The source matrix + * @return this + */ + public Matrix2f load(Matrix2f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new one should be created. + * @return The copied matrix + */ + public static Matrix2f load(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m10 = src.m10; + dest.m11 = src.m11; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m10); + buf.put(m11); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m01); + buf.put(m11); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f add(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f sub(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f mul(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01; + float m01 = left.m01 * right.m00 + left.m11 * right.m01; + float m10 = left.m00 * right.m10 + left.m10 * right.m11; + float m11 = left.m01 * right.m10 + left.m11 * right.m11; + + dest.m00 = m00; + dest.m01 = m01; + dest.m10 = m10; + dest.m11 = m11; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector2f transform(Matrix2f left, Vector2f right, Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + + float x = left.m00 * right.x + left.m10 * right.y; + float y = left.m01 * right.x + left.m11 * right.y; + + dest.x = x; + dest.y = y; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Transpose this matrix and place the result in another matrix. + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix2f transpose(Matrix2f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix. + * + * @param src The source matrix or null if a new matrix is to be created + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix2f transpose(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m01 = src.m10; + float m10 = src.m01; + + dest.m01 = m01; + dest.m10 = m10; + + return dest; + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and place the result in the destination matrix. + * + * @param src The source matrix to be inverted + * @param dest The destination matrix or null if a new matrix is to be created + * @return The inverted matrix, or null if source can't be reverted. + */ + public static Matrix2f invert(Matrix2f src, Matrix2f dest) { + /* + * inv(A) = 1/det(A) * adj(A); + */ + + float determinant = src.determinant(); + if (determinant != 0) { + if (dest == null) + dest = new Matrix2f(); + float determinant_inv = 1f / determinant; + float t00 = src.m11 * determinant_inv; + float t01 = -src.m01 * determinant_inv; + float t11 = src.m00 * determinant_inv; + float t10 = -src.m10 * determinant_inv; + + dest.m00 = t00; + dest.m01 = t01; + dest.m10 = t10; + dest.m11 = t11; + return dest; + } else + return null; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and stash the result in another matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix2f negate(Matrix2f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and stash the result in the destination matrix. + * + * @param src The source matrix to be negated + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix2f negate(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the source matrix to be the identity matrix. + * + * @param src The matrix to set to the identity. + * @return The source matrix + */ + public static Matrix2f setIdentity(Matrix2f src) { + src.m00 = 1.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 1.0f; + return src; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + public static Matrix2f setZero(Matrix2f src) { + src.m00 = 0.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 0.0f; + return src; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Matrix#determinant() + */ + public float determinant() { + return m00 * m11 - m01 * m10; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java new file mode 100644 index 0000000..06ccf59 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix3f.java @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3x3 matrix. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Matrix3f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m10, m11, m12, m20, m21, m22; + + /** + * Constructor for Matrix3f. Matrix is initialised to the identity. + */ + public Matrix3f() { + super(); + setIdentity(); + } + + /** + * Load from another matrix + * + * @param src The source matrix + * @return this + */ + public Matrix3f load(Matrix3f src) { + return load(src, this); + } + + /** + * Copy source matrix to destination matrix + * + * @param src The source matrix + * @param dest The destination matrix, or null of a new matrix is to be created + * @return The copied matrix + */ + public static Matrix3f load(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = src.m00; + dest.m10 = src.m10; + dest.m20 = src.m20; + dest.m01 = src.m01; + dest.m11 = src.m11; + dest.m21 = src.m21; + dest.m02 = src.m02; + dest.m12 = src.m12; + dest.m22 = src.m22; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major (maths) + * order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + public Matrix store(float[] buf) { + buf[0] = m00; + buf[1] = m01; + buf[2] = m02; + buf[3] = m10; + buf[4] = m11; + buf[5] = m12; + buf[6] = m20; + buf[7] = m21; + buf[8] = m22; + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m02); + buf.put(m12); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f add(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f sub(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f mul(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector3f transform(Matrix3f left, Vector3f right, Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z; + + dest.x = x; + dest.y = y; + dest.z = z; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this, this); + } + + /** + * Transpose this matrix and place the result in another matrix + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix3f transpose(Matrix3f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result into the destination matrix + * + * @param src The source matrix to be transposed + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix3f transpose(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = m00 * (m11 * m22 - m12 * m21) + m01 * (m12 * m20 - m10 * m22) + m02 * (m10 * m21 - m11 * m20); + return f; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result into the destination matrix + * + * @param src The source matrix to be inverted + * @param dest The destination matrix, or null if a new one is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix3f invert(Matrix3f src, Matrix3f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + if (dest == null) + dest = new Matrix3f(); + /* + * do it the ordinary way + * + * inv(A) = 1/det(A) * adj(T), where adj(T) = transpose(Conjugate Matrix) + * + * m00 m01 m02 m10 m11 m12 m20 m21 m22 + */ + float determinant_inv = 1f / determinant; + + // get the conjugate matrix + float t00 = src.m11 * src.m22 - src.m12 * src.m21; + float t01 = -src.m10 * src.m22 + src.m12 * src.m20; + float t02 = src.m10 * src.m21 - src.m11 * src.m20; + float t10 = -src.m01 * src.m22 + src.m02 * src.m21; + float t11 = src.m00 * src.m22 - src.m02 * src.m20; + float t12 = -src.m00 * src.m21 + src.m01 * src.m20; + float t20 = src.m01 * src.m12 - src.m02 * src.m11; + float t21 = -src.m00 * src.m12 + src.m02 * src.m10; + float t22 = src.m00 * src.m11 - src.m01 * src.m10; + + dest.m00 = t00 * determinant_inv; + dest.m11 = t11 * determinant_inv; + dest.m22 = t22 * determinant_inv; + dest.m01 = t10 * determinant_inv; + dest.m10 = t01 * determinant_inv; + dest.m20 = t02 * determinant_inv; + dest.m02 = t20 * determinant_inv; + dest.m12 = t21 * determinant_inv; + dest.m21 = t12 * determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix3f negate(Matrix3f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and place the result in the destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix3f negate(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m02; + dest.m02 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m12; + dest.m12 = -src.m11; + dest.m20 = -src.m20; + dest.m21 = -src.m22; + dest.m22 = -src.m21; + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the matrix to be the identity matrix. + * + * @param m The matrix to be set to the identity + * @return m + */ + public static Matrix3f setIdentity(Matrix3f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + return m; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the matrix matrix to 0. + * + * @param m The matrix to be set to 0 + * @return m + */ + public static Matrix3f setZero(Matrix3f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + return m; + } + + public boolean equals(Object m) { + return (m instanceof Matrix3f) && equal(this, (Matrix3f) m); + } + + public static boolean equal(Matrix3f a, Matrix3f b) { + return a.m00 == b.m00 && a.m01 == b.m01 && a.m02 == b.m02 && a.m10 == b.m10 && a.m11 == b.m11 && a.m12 == b.m12 + && a.m20 == b.m20 && a.m21 == b.m21 && a.m22 == b.m22; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java new file mode 100644 index 0000000..cdca438 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Matrix4f.java @@ -0,0 +1,902 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * Holds a 4x4 float matrix. + * + * @author foo + */ +public class Matrix4f extends Matrix implements Serializable { + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33; + + /** + * Construct a new matrix, initialized to the identity. + */ + public Matrix4f() { + super(); + setIdentity(); + } + + public Matrix4f(final Matrix4f src) { + super(); + load(src); + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append(m30).append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append(m31).append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append(m32).append('\n'); + buf.append(m03).append(' ').append(m13).append(' ').append(m23).append(' ').append(m33).append('\n'); + return buf.toString(); + } + + /** + * Set this matrix to be the identity matrix. + * + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the given matrix to be the identity matrix. + * + * @param m The matrix to set to the identity + * @return m + */ + public static Matrix4f setIdentity(Matrix4f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 1.0f; + + return m; + } + + /** + * Set this matrix to 0. + * + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the given matrix to 0. + * + * @param m The matrix to set to 0 + * @return m + */ + public static Matrix4f setZero(Matrix4f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 0.0f; + + return m; + } + + /** + * Load from another matrix4f + * + * @param src The source matrix + * @return this + */ + public Matrix4f load(Matrix4f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix + * + * @param src The source matrix + * @param dest The destination matrix, or null of a new one is to be created + * @return The copied matrix + */ + public static Matrix4f load(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m02 = src.m02; + dest.m03 = src.m03; + dest.m10 = src.m10; + dest.m11 = src.m11; + dest.m12 = src.m12; + dest.m13 = src.m13; + dest.m20 = src.m20; + dest.m21 = src.m21; + dest.m22 = src.m22; + dest.m23 = src.m23; + dest.m30 = src.m30; + dest.m31 = src.m31; + dest.m32 = src.m32; + dest.m33 = src.m33; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m03 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m13 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + m23 = buf.get(); + m30 = buf.get(); + m31 = buf.get(); + m32 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major (maths) + * order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m30 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m31 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + m32 = buf.get(); + m03 = buf.get(); + m13 = buf.get(); + m23 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column major + * (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m03); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m13); + buf.put(m20); + buf.put(m21); + buf.put(m22); + buf.put(m23); + buf.put(m30); + buf.put(m31); + buf.put(m32); + buf.put(m33); + return this; + } + + public Matrix store(float[] buf) { + buf[0] = m00; + buf[1] = m01; + buf[2] = m02; + buf[3] = m03; + buf[4] = m10; + buf[5] = m11; + buf[6] = m12; + buf[7] = m13; + buf[8] = m20; + buf[9] = m21; + buf[10] = m22; + buf[11] = m23; + buf[12] = m30; + buf[13] = m31; + buf[14] = m32; + buf[15] = m33; + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row major + * (maths) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m30); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m31); + buf.put(m02); + buf.put(m12); + buf.put(m22); + buf.put(m32); + buf.put(m03); + buf.put(m13); + buf.put(m23); + buf.put(m33); + return this; + } + + /** + * Store the rotation portion of this matrix in a float buffer. The matrix is + * stored in column major (openGL) order. + * + * @param buf The buffer to store this matrix in + */ + public Matrix store3f(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f add(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m03 = left.m03 + right.m03; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m13 = left.m13 + right.m13; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + dest.m23 = left.m23 + right.m23; + dest.m30 = left.m30 + right.m30; + dest.m31 = left.m31 + right.m31; + dest.m32 = left.m32 + right.m32; + dest.m33 = left.m33 + right.m33; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third + * matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f sub(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m03 = left.m03 - right.m03; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m13 = left.m13 - right.m13; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + dest.m23 = left.m23 - right.m23; + dest.m30 = left.m30 - right.m30; + dest.m31 = left.m31 - right.m31; + dest.m32 = left.m32 - right.m32; + dest.m33 = left.m33 - right.m33; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f mul(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02 + left.m30 * right.m03; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02 + left.m31 * right.m03; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02 + left.m32 * right.m03; + float m03 = left.m03 * right.m00 + left.m13 * right.m01 + left.m23 * right.m02 + left.m33 * right.m03; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12 + left.m30 * right.m13; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12 + left.m31 * right.m13; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12 + left.m32 * right.m13; + float m13 = left.m03 * right.m10 + left.m13 * right.m11 + left.m23 * right.m12 + left.m33 * right.m13; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22 + left.m30 * right.m23; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22 + left.m31 * right.m23; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22 + left.m32 * right.m23; + float m23 = left.m03 * right.m20 + left.m13 * right.m21 + left.m23 * right.m22 + left.m33 * right.m23; + float m30 = left.m00 * right.m30 + left.m10 * right.m31 + left.m20 * right.m32 + left.m30 * right.m33; + float m31 = left.m01 * right.m30 + left.m11 * right.m31 + left.m21 * right.m32 + left.m31 * right.m33; + float m32 = left.m02 * right.m30 + left.m12 * right.m31 + left.m22 * right.m32 + left.m32 * right.m33; + float m33 = left.m03 * right.m30 + left.m13 * right.m31 + left.m23 * right.m32 + left.m33 * right.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination vector. + * + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector4f transform(Matrix4f left, Vector4f right, Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z + left.m30 * right.w; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z + left.m31 * right.w; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z + left.m32 * right.w; + float w = left.m03 * right.x + left.m13 * right.y + left.m23 * right.z + left.m33 * right.w; + + dest.x = x; + dest.y = y; + dest.z = z; + dest.w = w; + + return dest; + } + + /** + * Transpose this matrix + * + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Translate this matrix + * + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector2f vec) { + return translate(vec, this); + } + + /** + * Translate this matrix + * + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector3f vec) { + return translate(vec, this); + } + + /** + * Scales this matrix + * + * @param vec The vector to scale by + * @return this + */ + public Matrix4f scale(Vector3f vec) { + return scale(vec, this, this); + } + + /** + * Scales the source matrix and put the result in the destination matrix + * + * @param vec The vector to scale by + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The scaled matrix + */ + public static Matrix4f scale(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00 * vec.x; + dest.m01 = src.m01 * vec.x; + dest.m02 = src.m02 * vec.x; + dest.m03 = src.m03 * vec.x; + dest.m10 = src.m10 * vec.y; + dest.m11 = src.m11 * vec.y; + dest.m12 = src.m12 * vec.y; + dest.m13 = src.m13 * vec.y; + dest.m20 = src.m20 * vec.z; + dest.m21 = src.m21 * vec.z; + dest.m22 = src.m22 * vec.z; + dest.m23 = src.m23 * vec.z; + return dest; + } + + /** + * Rotates the matrix around the given axis the specified angle + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @return this + */ + public Matrix4f rotate(float angle, Vector3f axis) { + return rotate(angle, axis, this); + } + + /** + * Rotates the matrix around the given axis the specified angle + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param dest The matrix to put the result, or null if a new matrix is to be + * created + * @return The rotated matrix + */ + public Matrix4f rotate(float angle, Vector3f axis, Matrix4f dest) { + return rotate(angle, axis, this, dest); + } + + /** + * Rotates the source matrix around the given axis the specified angle and put + * the result in the destination matrix. + * + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param src The matrix to rotate + * @param dest The matrix to put the result, or null if a new matrix is to be + * created + * @return The rotated matrix + */ + public static Matrix4f rotate(float angle, Vector3f axis, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float c = (float) Math.cos(angle); + float s = (float) Math.sin(angle); + float oneminusc = 1.0f - c; + float xy = axis.x * axis.y; + float yz = axis.y * axis.z; + float xz = axis.x * axis.z; + float xs = axis.x * s; + float ys = axis.y * s; + float zs = axis.z * s; + + float f00 = axis.x * axis.x * oneminusc + c; + float f01 = xy * oneminusc + zs; + float f02 = xz * oneminusc - ys; + // n[3] not used + float f10 = xy * oneminusc - zs; + float f11 = axis.y * axis.y * oneminusc + c; + float f12 = yz * oneminusc + xs; + // n[7] not used + float f20 = xz * oneminusc + ys; + float f21 = yz * oneminusc - xs; + float f22 = axis.z * axis.z * oneminusc + c; + + float t00 = src.m00 * f00 + src.m10 * f01 + src.m20 * f02; + float t01 = src.m01 * f00 + src.m11 * f01 + src.m21 * f02; + float t02 = src.m02 * f00 + src.m12 * f01 + src.m22 * f02; + float t03 = src.m03 * f00 + src.m13 * f01 + src.m23 * f02; + float t10 = src.m00 * f10 + src.m10 * f11 + src.m20 * f12; + float t11 = src.m01 * f10 + src.m11 * f11 + src.m21 * f12; + float t12 = src.m02 * f10 + src.m12 * f11 + src.m22 * f12; + float t13 = src.m03 * f10 + src.m13 * f11 + src.m23 * f12; + dest.m20 = src.m00 * f20 + src.m10 * f21 + src.m20 * f22; + dest.m21 = src.m01 * f20 + src.m11 * f21 + src.m21 * f22; + dest.m22 = src.m02 * f20 + src.m12 * f21 + src.m22 * f22; + dest.m23 = src.m03 * f20 + src.m13 * f21 + src.m23 * f22; + dest.m00 = t00; + dest.m01 = t01; + dest.m02 = t02; + dest.m03 = t03; + dest.m10 = t10; + dest.m11 = t11; + dest.m12 = t12; + dest.m13 = t13; + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector3f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z; + + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector2f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector2f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y; + + return dest; + } + + /** + * Transpose this matrix and place the result in another matrix + * + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix4f transpose(Matrix4f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix + * + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix4f transpose(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m03 = src.m30; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m13 = src.m31; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + float m23 = src.m32; + float m30 = src.m03; + float m31 = src.m13; + float m32 = src.m23; + float m33 = src.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = m00 * ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32) - m13 * m22 * m31 - m11 * m23 * m32 + - m12 * m21 * m33); + f -= m01 * ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32) - m13 * m22 * m30 - m10 * m23 * m32 + - m12 * m20 * m33); + f += m02 * ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31) - m13 * m21 * m30 - m10 * m23 * m31 + - m11 * m20 * m33); + f -= m03 * ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31) - m12 * m21 * m30 - m10 * m22 * m31 + - m11 * m20 * m32); + return f; + } + + /** + * Calculate the determinant of a 3x3 matrix + * + * @return result + */ + + private static float determinant3x3(float t00, float t01, float t02, float t10, float t11, float t12, float t20, + float t21, float t22) { + return t00 * (t11 * t22 - t12 * t21) + t01 * (t12 * t20 - t10 * t22) + t02 * (t10 * t21 - t11 * t20); + } + + /** + * Invert this matrix + * + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result in the destination + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix4f invert(Matrix4f src, Matrix4f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + /* + * m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33 + */ + if (dest == null) + dest = new Matrix4f(); + float determinant_inv = 1f / determinant; + + // first row + float t00 = determinant3x3(src.m11, src.m12, src.m13, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t01 = -determinant3x3(src.m10, src.m12, src.m13, src.m20, src.m22, src.m23, src.m30, src.m32, + src.m33); + float t02 = determinant3x3(src.m10, src.m11, src.m13, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t03 = -determinant3x3(src.m10, src.m11, src.m12, src.m20, src.m21, src.m22, src.m30, src.m31, + src.m32); + // second row + float t10 = -determinant3x3(src.m01, src.m02, src.m03, src.m21, src.m22, src.m23, src.m31, src.m32, + src.m33); + float t11 = determinant3x3(src.m00, src.m02, src.m03, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t12 = -determinant3x3(src.m00, src.m01, src.m03, src.m20, src.m21, src.m23, src.m30, src.m31, + src.m33); + float t13 = determinant3x3(src.m00, src.m01, src.m02, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // third row + float t20 = determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m31, src.m32, src.m33); + float t21 = -determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m30, src.m32, + src.m33); + float t22 = determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m30, src.m31, src.m33); + float t23 = -determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m30, src.m31, + src.m32); + // fourth row + float t30 = -determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m21, src.m22, + src.m23); + float t31 = determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m20, src.m22, src.m23); + float t32 = -determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m20, src.m21, + src.m23); + float t33 = determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m20, src.m21, src.m22); + + // transpose and divide by the determinant + dest.m00 = t00 * determinant_inv; + dest.m11 = t11 * determinant_inv; + dest.m22 = t22 * determinant_inv; + dest.m33 = t33 * determinant_inv; + dest.m01 = t10 * determinant_inv; + dest.m10 = t01 * determinant_inv; + dest.m20 = t02 * determinant_inv; + dest.m02 = t20 * determinant_inv; + dest.m12 = t21 * determinant_inv; + dest.m21 = t12 * determinant_inv; + dest.m03 = t30 * determinant_inv; + dest.m30 = t03 * determinant_inv; + dest.m13 = t31 * determinant_inv; + dest.m31 = t13 * determinant_inv; + dest.m32 = t23 * determinant_inv; + dest.m23 = t32 * determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix4f negate(Matrix4f dest) { + return negate(this, dest); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The negated matrix + */ + public static Matrix4f negate(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m02 = -src.m02; + dest.m03 = -src.m03; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + dest.m12 = -src.m12; + dest.m13 = -src.m13; + dest.m20 = -src.m20; + dest.m21 = -src.m21; + dest.m22 = -src.m22; + dest.m23 = -src.m23; + dest.m30 = -src.m30; + dest.m31 = -src.m31; + dest.m32 = -src.m32; + dest.m33 = -src.m33; + + return dest; + } + + public boolean equals(Object m) { + return (m instanceof Matrix4f) && equal(this, (Matrix4f) m); + } + + public static boolean equal(Matrix4f a, Matrix4f b) { + return a.m00 == b.m00 && a.m01 == b.m01 && a.m02 == b.m02 && a.m03 == b.m03 && a.m10 == b.m10 && a.m11 == b.m11 + && a.m12 == b.m12 && a.m13 == b.m13 && a.m20 == b.m20 && a.m21 == b.m21 && a.m22 == b.m22 + && a.m23 == b.m23 && a.m30 == b.m30 && a.m31 == b.m31 && a.m32 == b.m32 && a.m33 == b.m33; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Quaternion.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Quaternion.java new file mode 100644 index 0000000..663448f --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Quaternion.java @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * + * Quaternions for LWJGL! + * + * @author fbi + * @version $Revision$ + * $Id$ + */ + +import java.nio.FloatBuffer; + +public class Quaternion extends Vector implements ReadableVector4f { + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * C'tor. The quaternion will be initialized to the identity. + */ + public Quaternion() { + super(); + setIdentity(); + } + + /** + * C'tor + * + * @param src + */ + public Quaternion(ReadableVector4f src) { + set(src); + } + + /** + * C'tor + * + */ + public Quaternion(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src The source vector + * @return this + */ + public Quaternion set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * Set this quaternion to the multiplication identity. + * + * @return this + */ + public Quaternion setIdentity() { + return setIdentity(this); + } + + /** + * Set the given quaternion to the multiplication identity. + * + * @param q The quaternion + * @return q + */ + public static Quaternion setIdentity(Quaternion q) { + q.x = 0; + q.y = 0; + q.z = 0; + q.w = 1; + return q; + } + + /** + * @return the length squared of the quaternion + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Normalise the source quaternion and place the result in another quaternion. + * + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return The normalised quaternion + */ + public static Quaternion normalise(Quaternion src, Quaternion dest) { + float inv_l = 1f / src.length(); + + if (dest == null) + dest = new Quaternion(); + + dest.set(src.x * inv_l, src.y * inv_l, src.z * inv_l, src.w * inv_l); + + return dest; + } + + /** + * Normalise this quaternion and place the result in another quaternion. + * + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return the normalised quaternion + */ + public Quaternion normalise(Quaternion dest) { + return normalise(this, dest); + } + + /** + * The dot product of two quaternions + * + * @param left The LHS quat + * @param right The RHS quat + * @return left dot right + */ + public static float dot(Quaternion left, Quaternion right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param dest The quaternion which should be set to the conjugate of this + * quaternion + */ + public Quaternion negate(Quaternion dest) { + return negate(this, dest); + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param src The source quaternion + * @param dest The quaternion which should be set to the conjugate of this + * quaternion + */ + public static Quaternion negate(Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + + dest.x = -src.x; + dest.y = -src.y; + dest.z = -src.z; + dest.w = src.w; + + return dest; + } + + /** + * Calculate the conjugate of this quaternion + */ + public Vector negate() { + return negate(this, this); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.Vector#load(java.nio.FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + return scale(scale, this, this); + } + + /** + * Scale the source quaternion by scale and put the result in the destination + * + * @param scale The amount to scale by + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be + * created + * @return The scaled quaternion + */ + public static Quaternion scale(float scale, Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.x = src.x * scale; + dest.y = src.y * scale; + dest.z = src.z * scale; + dest.w = src.w * scale; + return dest; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.ReadableVector#store(java.nio.FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getW() + */ + public float getW() { + return w; + } + + public String toString() { + return "Quaternion: " + x + " " + y + " " + z + " " + w; + } + + /** + * Sets the value of this quaternion to the quaternion product of quaternions + * left and right (this = left * right). Note that this is safe for aliasing + * (e.g. this can be left or right). + * + * @param left the first quaternion + * @param right the second quaternion + */ + public static Quaternion mul(Quaternion left, Quaternion right, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.set(left.x * right.w + left.w * right.x + left.y * right.z - left.z * right.y, + left.y * right.w + left.w * right.y + left.z * right.x - left.x * right.z, + left.z * right.w + left.w * right.z + left.x * right.y - left.y * right.x, + left.w * right.w - left.x * right.x - left.y * right.y - left.z * right.z); + return dest; + } + + /** + * + * Multiplies quaternion left by the inverse of quaternion right and places the + * value into this quaternion. The value of both argument quaternions is + * preservered (this = left * right^-1). + * + * @param left the left quaternion + * @param right the right quaternion + */ + public static Quaternion mulInverse(Quaternion left, Quaternion right, Quaternion dest) { + float n = right.lengthSquared(); + // zero-div may occur. + n = (n == 0.0 ? n : 1 / n); + // store on stack once for aliasing-safty + if (dest == null) + dest = new Quaternion(); + dest.set((left.x * right.w - left.w * right.x - left.y * right.z + left.z * right.y) * n, + (left.y * right.w - left.w * right.y - left.z * right.x + left.x * right.z) * n, + (left.z * right.w - left.w * right.z - left.x * right.y + left.y * right.x) * n, + (left.w * right.w + left.x * right.x + left.y * right.y + left.z * right.z) * n); + + return dest; + } + + /** + * Sets the value of this quaternion to the equivalent rotation of the + * Axis-Angle argument. + * + * @param a1 the axis-angle: (x,y,z) is the axis and w is the angle + */ + public final void setFromAxisAngle(Vector4f a1) { + x = a1.x; + y = a1.y; + z = a1.z; + float n = (float) Math.sqrt(x * x + y * y + z * z); + // zero-div may occur. + float s = (float) (Math.sin(0.5 * a1.w) / n); + x *= s; + y *= s; + z *= s; + w = (float) Math.cos(0.5 * a1.w); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m The matrix + * @return this + */ + public final Quaternion setFromMatrix(Matrix4f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + * @param q The destination quaternion, or null if a new quaternion is to be + * created + * @return q + */ + public static Quaternion setFromMatrix(Matrix4f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, m.m21, m.m22); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + */ + public final Quaternion setFromMatrix(Matrix3f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m The source matrix + * @param q The destination quaternion, or null if a new quaternion is to be + * created + * @return q + */ + public static Quaternion setFromMatrix(Matrix3f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, m.m21, m.m22); + } + + /** + * Private method to perform the matrix-to-quaternion conversion + */ + private Quaternion setFromMat(float m00, float m01, float m02, float m10, float m11, float m12, float m20, + float m21, float m22) { + + float s; + float tr = m00 + m11 + m22; + if (tr >= 0.0) { + s = (float) Math.sqrt(tr + 1.0); + w = s * 0.5f; + s = 0.5f / s; + x = (m21 - m12) * s; + y = (m02 - m20) * s; + z = (m10 - m01) * s; + } else { + float max = Math.max(Math.max(m00, m11), m22); + if (max == m00) { + s = (float) Math.sqrt(m00 - (m11 + m22) + 1.0); + x = s * 0.5f; + s = 0.5f / s; + y = (m01 + m10) * s; + z = (m20 + m02) * s; + w = (m21 - m12) * s; + } else if (max == m11) { + s = (float) Math.sqrt(m11 - (m22 + m00) + 1.0); + y = s * 0.5f; + s = 0.5f / s; + z = (m12 + m21) * s; + x = (m01 + m10) * s; + w = (m02 - m20) * s; + } else { + s = (float) Math.sqrt(m22 - (m00 + m11) + 1.0); + z = s * 0.5f; + s = 0.5f / s; + x = (m20 + m02) * s; + y = (m12 + m21) * s; + w = (m10 - m01) * s; + } + } + return this; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java new file mode 100644 index 0000000..e72d312 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.nio.FloatBuffer; + +/** + * @author foo + */ +public interface ReadableVector { + /** + * @return the length of the vector + */ + float length(); + + /** + * @return the length squared of the vector + */ + float lengthSquared(); + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + Vector store(FloatBuffer buf); +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java new file mode 100644 index 0000000..f857c6f --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector2f.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector2f extends ReadableVector { + /** + * @return x + */ + float getX(); + + /** + * @return y + */ + float getY(); +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java new file mode 100644 index 0000000..6eae2ec --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector3f.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector3f extends ReadableVector2f { + /** + * @return z + */ + float getZ(); +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java new file mode 100644 index 0000000..feedc20 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/ReadableVector4f.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * @author foo + */ +public interface ReadableVector4f extends ReadableVector3f { + + /** + * @return w + */ + float getW(); + +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector.java new file mode 100644 index 0000000..61dfb43 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for vectors. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ +public abstract class Vector implements Serializable, ReadableVector { + + /** + * Constructor for Vector. + */ + protected Vector() { + super(); + } + + /** + * @return the length of the vector + */ + public final float length() { + return (float) Math.sqrt(lengthSquared()); + } + + /** + * @return the length squared of the vector + */ + public abstract float lengthSquared(); + + /** + * Load this vector from a FloatBuffer + * + * @param buf The buffer to load it from, at the current position + * @return this + */ + public abstract Vector load(FloatBuffer buf); + + /** + * Negate a vector + * + * @return this + */ + public abstract Vector negate(); + + /** + * Normalise this vector + * + * @return this + */ + public final Vector normalise() { + float len = length(); + if (len != 0.0f) { + float l = 1.0f / len; + return scale(l); + } else + throw new IllegalStateException("Zero length vector"); + } + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + public abstract Vector store(FloatBuffer buf); + + /** + * Scale this vector + * + * @param scale The scale factor + * @return this + */ + public abstract Vector scale(float scale); + +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector2f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector2f.java new file mode 100644 index 0000000..4201c7a --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector2f.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector2f extends Vector implements Serializable, ReadableVector2f, WritableVector2f { + + private static final long serialVersionUID = 1L; + + public float x, y; + + /** + * Constructor for Vector2f. + */ + public Vector2f() { + super(); + } + + /** + * Constructor. + */ + public Vector2f(ReadableVector2f src) { + set(src); + } + + /** + * Constructor. + */ + public Vector2f(float x, float y) { + set(x, y); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /** + * Load from another Vector2f + * + * @param src The source vector + * @return this + */ + public Vector2f set(ReadableVector2f src) { + x = src.getX(); + y = src.getY(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector2f translate(float x, float y) { + this.x += x; + this.y += y; + return this; + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector2f negate(Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + dest.x = -x; + dest.y = -y; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector2f normalise(Vector2f dest) { + float l = length(); + + if (dest == null) + dest = new Vector2f(x / l, y / l); + else + dest.set(x / l, y / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector2f left, Vector2f right) { + return left.x * right.x + left.y * right.y; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector2f a, Vector2f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector2f add(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x + right.x, left.y + right.y); + else { + dest.set(left.x + right.x, left.y + right.y); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector2f sub(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x - right.x, left.y - right.y); + else { + dest.set(left.x - right.x, left.y - right.y); + return dest; + } + } + + /** + * Store this vector in a FloatBuffer + * + * @param buf The buffer to store it in, at the current position + * @return this + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + return this; + } + + /** + * Load this vector from a FloatBuffer + * + * @param buf The buffer to load it from, at the current position + * @return this + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + + return this; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector2f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector2f other = (Vector2f) obj; + + if (x == other.x && y == other.y) + return true; + + return false; + } + +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector3f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector3f.java new file mode 100644 index 0000000..282170f --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector3f.java @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector3f extends Vector implements Serializable, ReadableVector3f, WritableVector3f { + + private static final long serialVersionUID = 1L; + + public float x, y, z; + + /** + * Constructor for Vector3f. + */ + public Vector3f() { + super(); + } + + /** + * Constructor + */ + public Vector3f(ReadableVector3f src) { + set(src); + } + + /** + * Constructor + */ + public Vector3f(float x, float y, float z) { + set(x, y, z); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Load from another Vector3f + * + * @param src The source vector + * @return this + */ + public Vector3f set(ReadableVector3f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector3f translate(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector3f add(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x + right.x, left.y + right.y, left.z + right.z); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector3f sub(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x - right.x, left.y - right.y, left.z - right.z); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + return dest; + } + } + + /** + * The cross product of two vectors. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination result, or null if a new vector is to be created + * @return left cross right + */ + public static Vector3f cross(Vector3f left, Vector3f right, Vector3f dest) { + + if (dest == null) + dest = new Vector3f(); + + dest.set(left.y * right.z - left.z * right.y, right.x * left.z - right.z * left.x, + left.x * right.y - left.y * right.x); + + return dest; + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector3f negate(Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector3f normalise(Vector3f dest) { + float l = length(); + + if (dest == null) + dest = new Vector3f(x / l, y / l, z / l); + else + dest.set(x / l, y / l, z / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector3f left, Vector3f right) { + return left.x * right.x + left.y * right.y + left.z * right.z; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector3f a, Vector3f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + z *= scale; + + return this; + + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + + return this; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector3f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(", "); + sb.append(z); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector3f other = (Vector3f) obj; + + if (x == other.x && y == other.y && z == other.z) + return true; + + return false; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector4f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector4f.java new file mode 100644 index 0000000..7582396 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/Vector4f.java @@ -0,0 +1,377 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 4-tuple vector. + * + * @author cix_foo + * @version $Revision$ $Id$ + */ + +public class Vector4f extends Vector implements Serializable, ReadableVector4f, WritableVector4f { + + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * Constructor for Vector4f. + */ + public Vector4f() { + super(); + } + + /** + * Constructor + */ + public Vector4f(ReadableVector4f src) { + set(src); + } + + /** + * Constructor + */ + public Vector4f(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src The source vector + * @return this + */ + public Vector4f set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Translate a vector + * + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector4f translate(float x, float y, float z, float w) { + this.x += x; + this.y += y; + this.z += z; + this.w += w; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector4f add(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector4f sub(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + return dest; + } + } + + /** + * Negate a vector + * + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + w = -w; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector4f negate(Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + dest.w = -w; + return dest; + } + + /** + * Normalise this vector and place the result in another vector. + * + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector4f normalise(Vector4f dest) { + float l = length(); + + if (dest == null) + dest = new Vector4f(x / l, y / l, z / l, w / l); + else + dest.set(x / l, y / l, z / l, w / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as v1.x * v2.x + v1.y * v2.y + + * v1.z * v2.z + v1.w * v2.w + * + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector4f left, Vector4f right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the angle between two vectors, in radians + * + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector4f a, Vector4f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float) Math.acos(dls); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + x *= scale; + y *= scale; + z *= scale; + w *= scale; + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + public String toString() { + return "Vector4f: " + x + " " + y + " " + z + " " + w; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getW() { + return w; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vector4f other = (Vector4f) obj; + + if (x == other.x && y == other.y && z == other.z && w == other.w) + return true; + + return false; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java new file mode 100644 index 0000000..faa6c71 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector2f.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector2fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector2f { + + /** + * Set the X value + * + * @param x + */ + void setX(float x); + + /** + * Set the Y value + * + * @param y + */ + void setY(float y); + + /** + * Set the X,Y values + * + * @param x + * @param y + */ + void set(float x, float y); + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java new file mode 100644 index 0000000..6c6e004 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector3f.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector3fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector3f extends WritableVector2f { + + /** + * Set the Z value + * + * @param z + */ + void setZ(float z); + + /** + * Set the X,Y,Z values + * + * @param x + * @param y + * @param z + */ + void set(float x, float y, float z); + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java new file mode 100644 index 0000000..9870654 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/glemu/vector/WritableVector4f.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.PeytonPlayz585.glemu.vector; + +/** + * Writable interface to Vector4fs + * + * @author $author$ + * @version $revision$ $Id$ + */ +public interface WritableVector4f extends WritableVector3f { + + /** + * Set the W value + * + * @param w + */ + void setW(float w); + + /** + * Set the X,Y,Z,W values + * + * @param x + * @param y + * @param z + * @param w + */ + void set(float x, float y, float z, float w); + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/math/MathHelper.java b/src/teavm/java/net/PeytonPlayz585/math/MathHelper.java new file mode 100644 index 0000000..681ac6e --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/math/MathHelper.java @@ -0,0 +1,61 @@ +package net.PeytonPlayz585.math; + +public 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(float var0) { + return (float)Math.sqrt((double)var0); + } + + public static final float sqrt_double(double var0) { + return (float)Math.sqrt(var0); + } + + public static int floor_float(float var0) { + int var1 = (int)var0; + return var0 < (float)var1 ? var1 - 1 : var1; + } + + public static int floor_double(double var0) { + int var2 = (int)var0; + return var0 < (double)var2 ? var2 - 1 : var2; + } + + public static float abs(float var0) { + return var0 >= 0.0F ? var0 : -var0; + } + + public static double abs_max(double var0, double var2) { + if(var0 < 0.0D) { + var0 = -var0; + } + + if(var2 < 0.0D) { + var2 = -var2; + } + + return var0 > var2 ? var0 : var2; + } + + public static int bucketInt(int var0, int var1) { + return var0 < 0 ? -((-var0 - 1) / var1) - 1 : var0 / var1; + } + + static { + for (int 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)); + } + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/AWTColor.java b/src/teavm/java/net/PeytonPlayz585/minecraft/AWTColor.java new file mode 100644 index 0000000..ca06a3e --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/AWTColor.java @@ -0,0 +1,51 @@ +package net.PeytonPlayz585.minecraft; + +public class AWTColor { + + public static int HSBtoRGB(float hue, float saturation, float brightness) { + int r = 0, g = 0, b = 0; + if (saturation == 0) { + r = g = b = (int) (brightness * 255.0f + 0.5f); + } else { + float h = (hue - (float) Math.floor(hue)) * 6.0f; + float f = h - (float) java.lang.Math.floor(h); + float p = brightness * (1.0f - saturation); + float q = brightness * (1.0f - saturation * f); + float t = brightness * (1.0f - (saturation * (1.0f - f))); + switch ((int) h) { + case 0: + r = (int) (brightness * 255.0f + 0.5f); + g = (int) (t * 255.0f + 0.5f); + b = (int) (p * 255.0f + 0.5f); + break; + case 1: + r = (int) (q * 255.0f + 0.5f); + g = (int) (brightness * 255.0f + 0.5f); + b = (int) (p * 255.0f + 0.5f); + break; + case 2: + r = (int) (p * 255.0f + 0.5f); + g = (int) (brightness * 255.0f + 0.5f); + b = (int) (t * 255.0f + 0.5f); + break; + case 3: + r = (int) (p * 255.0f + 0.5f); + g = (int) (q * 255.0f + 0.5f); + b = (int) (brightness * 255.0f + 0.5f); + break; + case 4: + r = (int) (t * 255.0f + 0.5f); + g = (int) (p * 255.0f + 0.5f); + b = (int) (brightness * 255.0f + 0.5f); + break; + case 5: + r = (int) (brightness * 255.0f + 0.5f); + g = (int) (p * 255.0f + 0.5f); + b = (int) (q * 255.0f + 0.5f); + break; + } + } + return 0xff000000 | (r << 16) | (g << 8) | (b << 0); + } + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/AssetRepository.java b/src/teavm/java/net/PeytonPlayz585/minecraft/AssetRepository.java new file mode 100644 index 0000000..753c9fe --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/AssetRepository.java @@ -0,0 +1,55 @@ +package net.PeytonPlayz585.minecraft; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.HashMap; + +import com.jcraft.jzlib.InflaterInputStream; + +public class AssetRepository { + + private static final HashMap filePool = new HashMap(); + + public static final void install(byte[] pkg) throws IOException { + ByteArrayInputStream in2 = new ByteArrayInputStream(pkg); + DataInputStream in = new DataInputStream(in2); + byte[] header = new byte[8]; + in.read(header); + if (!"EAGPKG!!".equals(new String(header, Charset.forName("UTF-8")))) + throw new IOException("invalid epk file"); + in.readUTF(); + in = new DataInputStream(new InflaterInputStream(in2)); + String s = null; + SHA1Digest dg = new SHA1Digest(); + while ("".equals(s = in.readUTF())) { + String path = in.readUTF(); + byte[] digest = new byte[20]; + byte[] digest2 = new byte[20]; + in.read(digest); + int len = in.readInt(); + byte[] file = new byte[len]; + in.read(file); + if (filePool.containsKey(path)) + continue; + dg.update(file, 0, len); + dg.doFinal(digest2, 0); + if (!Arrays.equals(digest, digest2)) + throw new IOException("invalid file hash for " + path); + filePool.put(path, file); + if (!"".equals(in.readUTF())) + throw new IOException("invalid epk file"); + } + if (in.available() > 0 || !" end".equals(s)) + throw new IOException("invalid epk file"); + } + + public static final byte[] getResource(String path) { + if (path.startsWith("/")) + path = path.substring(1); + return filePool.get(path); + } + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/Base64.java b/src/teavm/java/net/PeytonPlayz585/minecraft/Base64.java new file mode 100644 index 0000000..ab0b0ec --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/Base64.java @@ -0,0 +1,857 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.PeytonPlayz585.minecraft; + +import java.math.BigInteger; +import java.nio.charset.Charset; + +/** + * Provides Base64 encoding and decoding as defined by + * RFC 2045. + * + *

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

+ *

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

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

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

+ *

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

+ *

+ * This class is thread-safe. + *

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

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

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

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

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

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

+ * + *

+ * When decoding all variants are supported. + *

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

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

+ * + *

+ * When decoding all variants are supported. + *

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

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

+ *

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

+ *

+ * When decoding all variants are supported. + *

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

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

+ *

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

+ *

+ * When decoding all variants are supported. + *

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

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

+ *

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

+ *

+ * When decoding all variants are supported. + *

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

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

+ *

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

+ *

+ * When decoding all variants are supported. + *

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

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

+ *

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

+ *

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

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

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

+ *

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

+ *

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ * Package protected for access from I/O streams. + * + * @param b byte[] array to extract the buffered data into. + * @param bPos position in byte[] array to start extraction at. + * @param bAvail amount of bytes we're allowed to extract. We may extract fewer + * (if fewer are available). + * @param context the context to be used + * @return The number of bytes successfully extracted into the provided byte[] + * array. + */ + int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) { + if (context.buffer != null) { + final int len = Math.min(available(context), bAvail); + System.arraycopy(context.buffer, context.readPos, b, bPos, len); + context.readPos += len; + if (context.readPos >= context.pos) { + context.buffer = null; // so hasData() will return false, and this method can return -1 + } + return len; + } + return context.eof ? EOF : 0; + } +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/GeneralDigest.java b/src/teavm/java/net/PeytonPlayz585/minecraft/GeneralDigest.java new file mode 100644 index 0000000..c7054e1 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/GeneralDigest.java @@ -0,0 +1,108 @@ +package net.PeytonPlayz585.minecraft; + +/** + * base implementation of MD4 family style digest as outlined in "Handbook of + * Applied Cryptography", pages 344 - 347. + */ +public abstract class GeneralDigest { + private byte[] xBuf; + private int xBufOff; + + private long byteCount; + + /** + * Standard constructor + */ + protected GeneralDigest() { + xBuf = new byte[4]; + xBufOff = 0; + } + + /** + * Copy constructor. We are using copy constructors in place of the + * Object.clone() interface as this interface is not supported by J2ME. + */ + protected GeneralDigest(GeneralDigest t) { + xBuf = new byte[t.xBuf.length]; + System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length); + + xBufOff = t.xBufOff; + byteCount = t.byteCount; + } + + public void update(byte in) { + xBuf[xBufOff++] = in; + + if (xBufOff == xBuf.length) { + processWord(xBuf, 0); + xBufOff = 0; + } + + byteCount++; + } + + public void update(byte[] in, int inOff, int len) { + // + // fill the current word + // + while ((xBufOff != 0) && (len > 0)) { + update(in[inOff]); + + inOff++; + len--; + } + + // + // process whole words. + // + while (len > xBuf.length) { + processWord(in, inOff); + + inOff += xBuf.length; + len -= xBuf.length; + byteCount += xBuf.length; + } + + // + // load in the remainder. + // + while (len > 0) { + update(in[inOff]); + + inOff++; + len--; + } + } + + public void finish() { + long bitLength = (byteCount << 3); + + // + // add the pad bytes. + // + update((byte) 128); + + while (xBufOff != 0) { + update((byte) 0); + } + + processLength(bitLength); + + processBlock(); + } + + public void reset() { + byteCount = 0; + + xBufOff = 0; + for (int i = 0; i < xBuf.length; i++) { + xBuf[i] = 0; + } + } + + protected abstract void processWord(byte[] in, int inOff); + + protected abstract void processLength(long bitLength); + + protected abstract void processBlock(); +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/MinecraftImage.java b/src/teavm/java/net/PeytonPlayz585/minecraft/MinecraftImage.java new file mode 100644 index 0000000..88532c1 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/MinecraftImage.java @@ -0,0 +1,40 @@ +package net.PeytonPlayz585.minecraft; + +public class MinecraftImage { + + public final int[] data; + public final int w; + public final int h; + public final boolean alpha; + + public MinecraftImage(int pw, int ph, boolean palpha) { + this.w = pw; + this.h = ph; + this.alpha = palpha; + this.data = new int[pw * ph]; + } + + public MinecraftImage(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 MinecraftImage 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 MinecraftImage(img, pw, ph, alpha); + } + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/minecraft/SHA1Digest.java b/src/teavm/java/net/PeytonPlayz585/minecraft/SHA1Digest.java new file mode 100644 index 0000000..c93990a --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/minecraft/SHA1Digest.java @@ -0,0 +1,213 @@ +package net.PeytonPlayz585.minecraft; + +/** + * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", + * pages 346 - 349. + * + * It is interesting to ponder why the, apart from the extra IV, the other + * difference here from MD5 is the "endienness" of the word processing! + */ +public class SHA1Digest extends GeneralDigest { + private static final int DIGEST_LENGTH = 20; + + private int H1, H2, H3, H4, H5; + + private int[] X = new int[80]; + private int xOff; + + /** + * Standard constructor + */ + public SHA1Digest() { + reset(); + } + + /** + * Copy constructor. This will copy the state of the provided message digest. + */ + public SHA1Digest(SHA1Digest t) { + super(t); + + H1 = t.H1; + H2 = t.H2; + H3 = t.H3; + H4 = t.H4; + H5 = t.H5; + + System.arraycopy(t.X, 0, X, 0, t.X.length); + xOff = t.xOff; + } + + public String getAlgorithmName() { + return "SHA-1"; + } + + public int getDigestSize() { + return DIGEST_LENGTH; + } + + protected void processWord(byte[] in, int inOff) { + X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16) | ((in[inOff + 2] & 0xff) << 8) + | ((in[inOff + 3] & 0xff)); + + if (xOff == 16) { + processBlock(); + } + } + + private void unpackWord(int word, byte[] out, int outOff) { + out[outOff] = (byte) (word >>> 24); + out[outOff + 1] = (byte) (word >>> 16); + out[outOff + 2] = (byte) (word >>> 8); + out[outOff + 3] = (byte) word; + } + + protected void processLength(long bitLength) { + if (xOff > 14) { + processBlock(); + } + + X[14] = (int) (bitLength >>> 32); + X[15] = (int) (bitLength & 0xffffffff); + } + + public int doFinal(byte[] out, int outOff) { + finish(); + + unpackWord(H1, out, outOff); + unpackWord(H2, out, outOff + 4); + unpackWord(H3, out, outOff + 8); + unpackWord(H4, out, outOff + 12); + unpackWord(H5, out, outOff + 16); + + reset(); + + return DIGEST_LENGTH; + } + + /** + * reset the chaining variables + */ + public void reset() { + super.reset(); + + H1 = 0x67452301; + H2 = 0xefcdab89; + H3 = 0x98badcfe; + H4 = 0x10325476; + H5 = 0xc3d2e1f0; + + xOff = 0; + for (int i = 0; i != X.length; i++) { + X[i] = 0; + } + } + + // + // Additive constants + // + private static final int Y1 = 0x5a827999; + private static final int Y2 = 0x6ed9eba1; + private static final int Y3 = 0x8f1bbcdc; + private static final int Y4 = 0xca62c1d6; + + private int f(int u, int v, int w) { + return ((u & v) | ((~u) & w)); + } + + private int h(int u, int v, int w) { + return (u ^ v ^ w); + } + + private int g(int u, int v, int w) { + return ((u & v) | (u & w) | (v & w)); + } + + private int rotateLeft(int x, int n) { + return (x << n) | (x >>> (32 - n)); + } + + protected void processBlock() { + // + // expand 16 word block into 80 word block. + // + for (int i = 16; i <= 79; i++) { + X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1); + } + + // + // set up working variables. + // + int A = H1; + int B = H2; + int C = H3; + int D = H4; + int E = H5; + + // + // round 1 + // + for (int j = 0; j <= 19; j++) { + int t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 2 + // + for (int j = 20; j <= 39; j++) { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 3 + // + for (int j = 40; j <= 59; j++) { + int t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 4 + // + for (int j = 60; j <= 79; j++) { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + H1 += A; + H2 += B; + H3 += C; + H4 += D; + H5 += E; + + // + // reset the offset and clean out the word buffer. + // + xOff = 0; + for (int i = 0; i != X.length; i++) { + X[i] = 0; + } + } +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTBase.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTBase.java new file mode 100644 index 0000000..f40e439 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTBase.java @@ -0,0 +1,78 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public abstract class NBTBase { + private String key = null; + + abstract void writeTagContents(DataOutput var1) throws IOException; + + abstract void readTagContents(DataInput var1) throws IOException; + + public abstract byte getType(); + + public final String getKey() { + return this.key == null ? "" : this.key; + } + + public final NBTBase setKey(String var1) { + this.key = var1; + return this; + } + + public static NBTBase readTag(DataInput var0) throws IOException { + byte var1 = var0.readByte(); + if(var1 == 0) { + return new NBTTagEnd(); + } else { + NBTBase var3 = createTagOfType(var1); + short var2 = var0.readShort(); + byte[] var4 = new byte[var2]; + var0.readFully(var4); + var3.key = new String(var4, "UTF-8"); + var3.readTagContents(var0); + return var3; + } + } + + public static void writeTag(NBTBase var0, DataOutput var1) throws IOException { + var1.writeByte(var0.getType()); + if(var0.getType() != 0) { + byte[] var2 = var0.getKey().getBytes("UTF-8"); + var1.writeShort(var2.length); + var1.write(var2); + var0.writeTagContents(var1); + } + } + + public static NBTBase createTagOfType(byte var0) { + switch(var0) { + case 0: + return new NBTTagEnd(); + case 1: + return new NBTTagByte(); + case 2: + return new NBTTagShort(); + case 3: + return new NBTTagInt(); + case 4: + return new NBTTagLong(); + case 5: + return new NBTTagFloat(); + case 6: + return new NBTTagDouble(); + case 7: + return new NBTTagByteArray(); + case 8: + return new NBTTagString(); + case 9: + return new NBTTagList(); + case 10: + return new NBTTagCompound(); + default: + return null; + } + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByte.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByte.java new file mode 100644 index 0000000..0505550 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByte.java @@ -0,0 +1,32 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagByte extends NBTBase { + public byte byteValue; + + public NBTTagByte() { + } + + public NBTTagByte(byte var1) { + this.byteValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeByte(this.byteValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.byteValue = var1.readByte(); + } + + public final byte getType() { + return (byte)1; + } + + public final String toString() { + return "" + this.byteValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByteArray.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByteArray.java new file mode 100644 index 0000000..a805db9 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagByteArray.java @@ -0,0 +1,35 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagByteArray extends NBTBase { + public byte[] byteArray; + + public NBTTagByteArray() { + } + + public NBTTagByteArray(byte[] var1) { + this.byteArray = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeInt(this.byteArray.length); + var1.write(this.byteArray); + } + + final void readTagContents(DataInput var1) throws IOException { + int var2 = var1.readInt(); + this.byteArray = new byte[var2]; + var1.readFully(this.byteArray); + } + + public final byte getType() { + return (byte)7; + } + + public final String toString() { + return "[" + this.byteArray.length + " bytes]"; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagCompound.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagCompound.java new file mode 100644 index 0000000..65024ea --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagCompound.java @@ -0,0 +1,132 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public final class NBTTagCompound extends NBTBase { + private Map tagMap = new HashMap(); + + final void writeTagContents(DataOutput var1) throws IOException { + Iterator var2 = this.tagMap.values().iterator(); + + while(var2.hasNext()) { + NBTBase var3 = (NBTBase)var2.next(); + NBTBase.writeTag(var3, var1); + } + + var1.writeByte(0); + } + + final void readTagContents(DataInput var1) throws IOException { + this.tagMap.clear(); + + while(true) { + NBTBase var2 = NBTBase.readTag(var1); + if(var2.getType() == 0) { + return; + } + + this.tagMap.put(var2.getKey(), var2); + } + } + + public final byte getType() { + return (byte)10; + } + + public final void setTag(String var1, NBTBase var2) { + this.tagMap.put(var1, var2.setKey(var1)); + } + + public final void setByte(String var1, byte var2) { + this.tagMap.put(var1, (new NBTTagByte(var2)).setKey(var1)); + } + + public final void setShort(String var1, short var2) { + this.tagMap.put(var1, (new NBTTagShort(var2)).setKey(var1)); + } + + public final void setInteger(String var1, int var2) { + this.tagMap.put(var1, (new NBTTagInt(var2)).setKey(var1)); + } + + public final void setLong(String var1, long var2) { + this.tagMap.put(var1, (new NBTTagLong(var2)).setKey(var1)); + } + + public final void setFloat(String var1, float var2) { + this.tagMap.put(var1, (new NBTTagFloat(var2)).setKey(var1)); + } + + public final void setString(String var1, String var2) { + this.tagMap.put(var1, (new NBTTagString(var2)).setKey(var1)); + } + + public final void setByteArray(String var1, byte[] var2) { + this.tagMap.put(var1, (new NBTTagByteArray(var2)).setKey(var1)); + } + + public final void setCompoundTag(String var1, NBTTagCompound var2) { + this.tagMap.put(var1, var2.setKey(var1)); + } + + public final void setBoolean(String var1, boolean var2) { + this.setByte(var1, (byte)(var2 ? 1 : 0)); + } + + public final boolean hasKey(String var1) { + return this.tagMap.containsKey(var1); + } + + public final byte getByte(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagByte)this.tagMap.get(var1)).byteValue; + } + + public final short getShort(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagShort)this.tagMap.get(var1)).shortValue; + } + + public final int getInteger(String var1) { + return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagInt)this.tagMap.get(var1)).intValue; + } + + public final long getLong(String var1) { + return !this.tagMap.containsKey(var1) ? 0L : ((NBTTagLong)this.tagMap.get(var1)).longValue; + } + + public final float getFloat(String var1) { + return !this.tagMap.containsKey(var1) ? 0.0F : ((NBTTagFloat)this.tagMap.get(var1)).floatValue; + } + + public final String getString(String var1) { + return !this.tagMap.containsKey(var1) ? "" : ((NBTTagString)this.tagMap.get(var1)).stringValue; + } + + public final byte[] getByteArray(String var1) { + return !this.tagMap.containsKey(var1) ? new byte[0] : ((NBTTagByteArray)this.tagMap.get(var1)).byteArray; + } + + public final NBTTagCompound getCompoundTag(String var1) { + return !this.tagMap.containsKey(var1) ? new NBTTagCompound() : (NBTTagCompound)this.tagMap.get(var1); + } + + public final NBTTagList getTagList(String var1) { + return !this.tagMap.containsKey(var1) ? new NBTTagList() : (NBTTagList)this.tagMap.get(var1); + } + + public final boolean getBoolean(String var1) { + return this.getByte(var1) != 0; + } + + public final String toString() { + return "" + this.tagMap.size() + " entries"; + } + + public final boolean emptyNBTMap() { + return this.tagMap.isEmpty(); + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagDouble.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagDouble.java new file mode 100644 index 0000000..6045f85 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagDouble.java @@ -0,0 +1,25 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagDouble extends NBTBase { + private double doubleValue; + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeDouble(this.doubleValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.doubleValue = var1.readDouble(); + } + + public final byte getType() { + return (byte)6; + } + + public final String toString() { + return "" + this.doubleValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagEnd.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagEnd.java new file mode 100644 index 0000000..1f67fdd --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagEnd.java @@ -0,0 +1,21 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagEnd extends NBTBase { + final void readTagContents(DataInput var1) throws IOException { + } + + final void writeTagContents(DataOutput var1) throws IOException { + } + + public final byte getType() { + return (byte)0; + } + + public final String toString() { + return "END"; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagFloat.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagFloat.java new file mode 100644 index 0000000..afeef31 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagFloat.java @@ -0,0 +1,32 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagFloat extends NBTBase { + public float floatValue; + + public NBTTagFloat() { + } + + public NBTTagFloat(float var1) { + this.floatValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeFloat(this.floatValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.floatValue = var1.readFloat(); + } + + public final byte getType() { + return (byte)5; + } + + public final String toString() { + return "" + this.floatValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagInt.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagInt.java new file mode 100644 index 0000000..6d94e00 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagInt.java @@ -0,0 +1,32 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagInt extends NBTBase { + public int intValue; + + public NBTTagInt() { + } + + public NBTTagInt(int var1) { + this.intValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeInt(this.intValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.intValue = var1.readInt(); + } + + public final byte getType() { + return (byte)3; + } + + public final String toString() { + return "" + this.intValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagList.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagList.java new file mode 100644 index 0000000..cada9f2 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagList.java @@ -0,0 +1,103 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public final class NBTTagList extends NBTBase { + private List tagList = new ArrayList(); + private byte tagType; + + final void writeTagContents(DataOutput var1) throws IOException { + if(this.tagList.size() > 0) { + this.tagType = ((NBTBase)this.tagList.get(0)).getType(); + } else { + this.tagType = 1; + } + + var1.writeByte(this.tagType); + var1.writeInt(this.tagList.size()); + + for(int var2 = 0; var2 < this.tagList.size(); ++var2) { + ((NBTBase)this.tagList.get(var2)).writeTagContents(var1); + } + + } + + final void readTagContents(DataInput var1) throws IOException { + this.tagType = var1.readByte(); + int var2 = var1.readInt(); + this.tagList = new ArrayList(); + + for(int var3 = 0; var3 < var2; ++var3) { + NBTBase var4 = NBTBase.createTagOfType(this.tagType); + var4.readTagContents(var1); + this.tagList.add(var4); + } + + } + + public final byte getType() { + return (byte)9; + } + + public final String toString() { + StringBuilder var10000 = (new StringBuilder()).append("").append(this.tagList.size()).append(" entries of type "); + byte var1 = this.tagType; + String var10001; + switch(var1) { + case 0: + var10001 = "TAG_End"; + break; + case 1: + var10001 = "TAG_Byte"; + break; + case 2: + var10001 = "TAG_Short"; + break; + case 3: + var10001 = "TAG_Int"; + break; + case 4: + var10001 = "TAG_Long"; + break; + case 5: + var10001 = "TAG_Float"; + break; + case 6: + var10001 = "TAG_Double"; + break; + case 7: + var10001 = "TAG_Byte_Array"; + break; + case 8: + var10001 = "TAG_String"; + break; + case 9: + var10001 = "TAG_List"; + break; + case 10: + var10001 = "TAG_Compound"; + break; + default: + var10001 = "UNKNOWN"; + } + + return var10000.append(var10001).toString(); + } + + public final void setTag(NBTBase var1) { + this.tagType = var1.getType(); + this.tagList.add(var1); + } + + public final NBTBase tagAt(int var1) { + return (NBTBase)this.tagList.get(var1); + } + + public final int tagCount() { + return this.tagList.size(); + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagLong.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagLong.java new file mode 100644 index 0000000..4a46db9 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagLong.java @@ -0,0 +1,32 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagLong extends NBTBase { + public long longValue; + + public NBTTagLong() { + } + + public NBTTagLong(long var1) { + this.longValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeLong(this.longValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.longValue = var1.readLong(); + } + + public final byte getType() { + return (byte)4; + } + + public final String toString() { + return "" + this.longValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagShort.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagShort.java new file mode 100644 index 0000000..240334a --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagShort.java @@ -0,0 +1,32 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagShort extends NBTBase { + public short shortValue; + + public NBTTagShort() { + } + + public NBTTagShort(short var1) { + this.shortValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + var1.writeShort(this.shortValue); + } + + final void readTagContents(DataInput var1) throws IOException { + this.shortValue = var1.readShort(); + } + + public final byte getType() { + return (byte)2; + } + + public final String toString() { + return "" + this.shortValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagString.java b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagString.java new file mode 100644 index 0000000..c5fffcd --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/nbt/NBTTagString.java @@ -0,0 +1,37 @@ +package net.PeytonPlayz585.nbt; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public final class NBTTagString extends NBTBase { + public String stringValue; + + public NBTTagString() { + } + + public NBTTagString(String var1) { + this.stringValue = var1; + } + + final void writeTagContents(DataOutput var1) throws IOException { + byte[] var2 = this.stringValue.getBytes("UTF-8"); + var1.writeShort(var2.length); + var1.write(var2); + } + + final void readTagContents(DataInput var1) throws IOException { + short var2 = var1.readShort(); + byte[] var3 = new byte[var2]; + var1.readFully(var3); + this.stringValue = new String(var3, "UTF-8"); + } + + public final byte getType() { + return (byte)8; + } + + public final String toString() { + return "" + this.stringValue; + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/storage/LocalStorageManager.java b/src/teavm/java/net/PeytonPlayz585/storage/LocalStorageManager.java new file mode 100644 index 0000000..f6d45cf --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/storage/LocalStorageManager.java @@ -0,0 +1,81 @@ +package net.PeytonPlayz585.storage; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.lwjgl.opengl.WebGL; + +import net.PeytonPlayz585.minecraft.Base64; +import net.PeytonPlayz585.nbt.NBTBase; +import net.PeytonPlayz585.nbt.NBTTagCompound; + +public class LocalStorageManager { + + public static NBTTagCompound gameSettingsStorage = null; + public static NBTTagCompound profileSettingsStorage = null; + + public static void loadStorage() { + byte[] g = WebGL.loadLocalStorage("g"); + byte[] p = WebGL.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) { + profileSettingsStorage = (NBTTagCompound)t; + } + }catch(IOException e) { + ; + } + } + + if(gameSettingsStorage == null) gameSettingsStorage = new NBTTagCompound(); + if(profileSettingsStorage == null) profileSettingsStorage = new NBTTagCompound(); + + } + + public static void saveStorageG() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(gameSettingsStorage, new DataOutputStream(s)); + WebGL.saveLocalStorage("g", s.toByteArray()); + } catch (IOException e) { + ; + } + } + + public static void saveStorageP() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(profileSettingsStorage, new DataOutputStream(s)); + WebGL.saveLocalStorage("p", s.toByteArray()); + } catch (IOException e) { + ; + } + } + + public static String dumpConfiguration() { + try { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + NBTBase.writeTag(gameSettingsStorage, new DataOutputStream(s)); + return Base64.encodeBase64String(s.toByteArray()); + } catch(Throwable e) { + return ""; + } + } + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/teavm/IDBObjectStorePatched.java b/src/teavm/java/net/PeytonPlayz585/teavm/IDBObjectStorePatched.java new file mode 100644 index 0000000..fbac818 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/teavm/IDBObjectStorePatched.java @@ -0,0 +1,79 @@ +//package net.PeytonPlayz585.teavm; +// +//import org.teavm.jso.JSBody; +//import org.teavm.jso.JSObject; +//import org.teavm.jso.JSProperty; +//import org.teavm.jso.core.JSString; +//import org.teavm.jso.indexeddb.IDBCountRequest; +//import org.teavm.jso.indexeddb.IDBCursorRequest; +//import org.teavm.jso.indexeddb.IDBCursorSource; +//import org.teavm.jso.indexeddb.IDBDatabase; +//import org.teavm.jso.indexeddb.IDBGetRequest; +//import org.teavm.jso.indexeddb.IDBIndex; +//import org.teavm.jso.indexeddb.IDBKeyRange; +//import org.teavm.jso.indexeddb.IDBObjectStoreParameters; +//import org.teavm.jso.indexeddb.IDBRequest; +//import org.teavm.jso.indexeddb.IDBTransaction; +// +//public abstract class IDBObjectStorePatched implements JSObject, IDBCursorSource { +// +// @JSBody(params = { "db", "name", "optionalParameters" }, script = "return db.createObjectStore(name, optionalParameters);") +// public static native IDBObjectStorePatched createObjectStorePatch(IDBDatabase db, String name, IDBObjectStoreParameters optionalParameters); +// +// @JSBody(params = { "tx", "name" }, script = "return tx.objectStore(name);") +// public static native IDBObjectStorePatched objectStorePatch(IDBTransaction tx, String name); +// +// @JSProperty +// public abstract String getName(); +// +// @JSProperty("keyPath") +// abstract JSObject getKeyPathImpl(); +// +// public final String[] getKeyPath() { +// JSObject result = getKeyPathImpl(); +// if (JSString.isInstance(result)) { +// return new String[] { result.cast().stringValue() }; +// } else { +// return unwrapStringArray(result); +// } +// } +// +// @JSBody(params = { "obj" }, script = "return this;") +// private static native String[] unwrapStringArray(JSObject obj); +// +// @JSProperty +// public abstract String[] getIndexNames(); +// +// @JSProperty +// public abstract boolean isAutoIncrement(); +// +// public abstract IDBRequest put(JSObject value, JSObject key); +// +// public abstract IDBRequest put(JSObject value); +// +// public abstract IDBRequest add(JSObject value, JSObject key); +// +// public abstract IDBRequest add(JSObject value); +// +// public abstract IDBRequest delete(JSObject key); +// +// public abstract IDBGetRequest get(JSObject key); +// +// public abstract IDBRequest clear(); +// +// public abstract IDBCursorRequest openCursor(); +// +// public abstract IDBCursorRequest openCursor(IDBKeyRange range); +// +// public abstract IDBIndex createIndex(String name, String key); +// +// public abstract IDBIndex createIndex(String name, String[] keys); +// +// public abstract IDBIndex index(String name); +// +// public abstract void deleteIndex(String name); +// +// public abstract IDBCountRequest count(); +// +// public abstract IDBCountRequest count(JSObject key); +//} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/teavm/IndexedDBFilesystem.java b/src/teavm/java/net/PeytonPlayz585/teavm/IndexedDBFilesystem.java new file mode 100644 index 0000000..d173a27 --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/teavm/IndexedDBFilesystem.java @@ -0,0 +1,427 @@ +//package net.PeytonPlayz585.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 org.lwjgl.opengl.WebGL; +//import org.lwjgl.opengl.WebGL.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_minecraft_alpha_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.epoch + lm; +// } +// +// public static final int getFileSize(String path) { +// ArrayBuffer arr = AsyncHandlers.readWholeFile(db, path); +// if(arr == null) { +// return -1; +// }else { +// return arr.getByteLength(); +// } +// } +// +// public static final void renameFile(String oldPath, String newPath) { +// copyFile(oldPath, newPath); +// AsyncHandlers.deleteFile(db, oldPath); +// } +// +// public static final void copyFile(String oldPath, String newPath) { +// ArrayBuffer arr = AsyncHandlers.readWholeFile(db, oldPath); +// int i = newPath.lastIndexOf('/'); +// if(i > 0) { +// mkdir(newPath.substring(0, i)); +// } +// AsyncHandlers.writeWholeFile(db, newPath, false, arr); +// } +// +// public static final void deleteFile(String path) { +// AsyncHandlers.deleteFile(db, path); +// } +// +// public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) { +// LinkedList lst = new LinkedList<>(); +// AsyncHandlers.iterateFiles(db, path, listDirs, recursiveDirs, lst); +// return lst; +// } +// +// protected static class BooleanResult { +// +// protected static final BooleanResult TRUE = new BooleanResult(true); +// protected static final BooleanResult FALSE = new BooleanResult(false); +// +// protected final boolean bool; +// +// private BooleanResult(boolean b) { +// bool = b; +// } +// +// protected static BooleanResult _new(boolean b) { +// return b ? TRUE : FALSE; +// } +// +// } +// +// protected static class DatabaseOpen { +// +// protected final boolean failedInit; +// protected final boolean failedLocked; +// protected final String failedError; +// +// protected final IDBDatabase database; +// +// protected DatabaseOpen(boolean init, boolean locked, String error, IDBDatabase db) { +// failedInit = init; +// failedLocked = locked; +// failedError = error; +// database = db; +// } +// +// } +// +// protected static enum FileExists { +// FILE, DIRECTORY, FALSE +// } +// +// @JSBody(script = "return ((typeof indexedDB) !== 'undefined') ? indexedDB : null;") +// protected static native IDBFactory createIDBFactory(); +// +// protected static class AsyncHandlers { +// +// protected static final long epoch = 1645568542000l; +// +// @Async +// protected static native DatabaseOpen openDB(String name); +// +// private static void openDB(String name, final AsyncCallback cb) { +// IDBFactory i = createIDBFactory(); +// if(i == null) { +// cb.complete(new DatabaseOpen(false, false, "window.indexedDB was null or undefined", null)); +// return; +// } +// final IDBOpenDBRequest f = i.open(name, 1); +// f.setOnBlocked(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(new DatabaseOpen(false, true, null, null)); +// } +// }); +// f.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(new DatabaseOpen(false, false, null, f.getResult())); +// } +// }); +// f.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(new DatabaseOpen(true, false, "open error", null)); +// } +// }); +// f.setOnUpgradeNeeded(new EventListener() { +// @Override +// public void handleEvent(IDBVersionChangeEvent evt) { +// IDBObjectStorePatched.createObjectStorePatch(f.getResult(), "filesystem", IDBObjectStoreParameters.create().keyPath("path")); +// } +// }); +// } +// +// @Async +// protected static native BooleanResult deleteFile(IDBDatabase db, String name); +// +// private static void deleteFile(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readwrite"); +// final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").delete(makeTheFuckingKeyWork(name)); +// +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(true)); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(false)); +// } +// }); +// } +// +// @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? null : ((typeof obj.data === 'undefined') ? null : obj.data);") +// protected static native ArrayBuffer readRow(JSObject obj); +// +// @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? false : ((typeof obj.directory === 'undefined') ? false : obj.directory);") +// protected static native boolean isRowDirectory(JSObject obj); +// +// @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? -1 : ((typeof obj.lastModified === 'undefined') ? -1 : obj.lastModified);") +// protected static native int readLastModified(JSObject obj); +// +// @JSBody(params = { "obj" }, script = "return [obj];") +// private static native JSObject makeTheFuckingKeyWork(String k); +// +// @Async +// protected static native ArrayBuffer readWholeFile(IDBDatabase db, String name); +// +// private static void readWholeFile(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(isRowDirectory(r.getResult()) ? null : readRow(r.getResult())); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(null); +// } +// }); +// +// } +// +// @Async +// protected static native Integer readLastModified(IDBDatabase db, String name); +// +// private static void readLastModified(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(readLastModified(r.getResult())); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(-1); +// } +// }); +// +// } +// +// @JSBody(params = { "k" }, script = "return ((typeof k) === \"string\") ? k : (((typeof k) === \"undefined\") ? null : (((typeof k[0]) === \"string\") ? k[0] : null));") +// private static native String readKey(JSObject k); +// +// @Async +// protected static native Integer iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst); +// +// private static void iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBCursorRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").openCursor(); +// final int[] res = new int[1]; +// r.setOnSuccess(new EventHandler() { +// @Override +// 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 WebGL.FileEntry(k, true, -1)); +// } +// }else { +// lst.add(new WebGL.FileEntry(k, false, epoch + readLastModified(c.getValue()))); +// } +// } +// } +// } +// c.doContinue(); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(res[0] > 0 ? res[0] : -1); +// } +// }); +// } +// +// @Async +// protected static native BooleanResult fileExists(IDBDatabase db, String name); +// +// private static void fileExists(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBCountRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").count(makeTheFuckingKeyWork(name)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(r.getResult() > 0)); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(false)); +// } +// }); +// } +// +// @Async +// protected static native Integer fileGetLastModified(IDBDatabase db, String name); +// +// private static void fileGetLastModified(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(readLastModified(r.getResult())); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(-1); +// } +// }); +// } +// +// @Async +// protected static native FileExists fileGetType(IDBDatabase db, String name); +// +// private static void fileGetType(IDBDatabase db, String name, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readonly"); +// final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(r.getResult() == null ? FileExists.FALSE : (isRowDirectory(r.getResult()) ? FileExists.DIRECTORY : FileExists.FILE)); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(FileExists.FALSE); +// } +// }); +// } +// +// @JSBody(params = { "pat", "dir", "lm", "dat" }, script = "return { path: pat, directory: dir, lastModified: lm, data: dat };") +// protected static native JSObject writeRow(String name, boolean directory, int lm, ArrayBuffer data); +// +// @Async +// protected static native BooleanResult writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data); +// +// private static void writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data, final AsyncCallback cb) { +// IDBTransaction tx = db.transaction("filesystem", "readwrite"); +// final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").put(writeRow(name, directory, (int)(System.currentTimeMillis() - epoch), data)); +// r.setOnSuccess(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(true)); +// } +// }); +// r.setOnError(new EventHandler() { +// @Override +// public void handleEvent() { +// cb.complete(BooleanResult._new(false)); +// } +// }); +// } +// } +// +//} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/teavm/WebGL2RenderingContext.java b/src/teavm/java/net/PeytonPlayz585/teavm/WebGL2RenderingContext.java new file mode 100644 index 0000000..26c0ace --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/teavm/WebGL2RenderingContext.java @@ -0,0 +1,42 @@ +package net.PeytonPlayz585.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); + +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/teavm/WebGLQuery.java b/src/teavm/java/net/PeytonPlayz585/teavm/WebGLQuery.java new file mode 100644 index 0000000..035b43c --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/teavm/WebGLQuery.java @@ -0,0 +1,6 @@ +package net.PeytonPlayz585.teavm; + +import org.teavm.jso.JSObject; + +public interface WebGLQuery extends JSObject { +} \ No newline at end of file diff --git a/src/teavm/java/net/PeytonPlayz585/teavm/WebGLVertexArray.java b/src/teavm/java/net/PeytonPlayz585/teavm/WebGLVertexArray.java new file mode 100644 index 0000000..6ddffda --- /dev/null +++ b/src/teavm/java/net/PeytonPlayz585/teavm/WebGLVertexArray.java @@ -0,0 +1,6 @@ +package net.PeytonPlayz585.teavm; + +import org.teavm.jso.JSObject; + +public interface WebGLVertexArray extends JSObject { +} \ No newline at end of file diff --git a/src/teavm/java/net/minecraft/client/CanvasMinecraftApplet.java b/src/teavm/java/net/minecraft/client/CanvasMinecraftApplet.java new file mode 100644 index 0000000..e37cd52 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/CanvasMinecraftApplet.java @@ -0,0 +1,21 @@ +package net.minecraft.client; + +import java.awt.Canvas; + +final class CanvasMinecraftApplet extends Canvas { + private MinecraftApplet mcApplet; + + CanvasMinecraftApplet(MinecraftApplet var1) { + this.mcApplet = var1; + } + + public final synchronized void addNotify() { + super.addNotify(); + this.mcApplet.startMainThread(); + } + + public final synchronized void removeNotify() { + this.mcApplet.shutdown(); + super.removeNotify(); + } +} diff --git a/src/teavm/java/net/minecraft/client/ChatLine.java b/src/teavm/java/net/minecraft/client/ChatLine.java new file mode 100644 index 0000000..a6931ff --- /dev/null +++ b/src/teavm/java/net/minecraft/client/ChatLine.java @@ -0,0 +1,5 @@ +package net.minecraft.client; + +public final class ChatLine { + public int updateCounter; +} diff --git a/src/teavm/java/net/minecraft/client/EnumOS.java b/src/teavm/java/net/minecraft/client/EnumOS.java new file mode 100644 index 0000000..fdb8f65 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/EnumOS.java @@ -0,0 +1,9 @@ +package net.minecraft.client; + +enum EnumOS { + linux, + solaris, + windows, + macos, + unknown; +} diff --git a/src/teavm/java/net/minecraft/client/EnumOSMappingHelper.java b/src/teavm/java/net/minecraft/client/EnumOSMappingHelper.java new file mode 100644 index 0000000..255f4e9 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/EnumOSMappingHelper.java @@ -0,0 +1,27 @@ +package net.minecraft.client; + +final class EnumOSMappingHelper { + static final int[] osValues = new int[EnumOS.values().length]; + + static { + try { + osValues[EnumOS.linux.ordinal()] = 1; + } catch (NoSuchFieldError var3) { + } + + try { + osValues[EnumOS.solaris.ordinal()] = 2; + } catch (NoSuchFieldError var2) { + } + + try { + osValues[EnumOS.windows.ordinal()] = 3; + } catch (NoSuchFieldError var1) { + } + + try { + osValues[EnumOS.macos.ordinal()] = 4; + } catch (NoSuchFieldError var0) { + } + } +} diff --git a/src/teavm/java/net/minecraft/client/GameSettings.java b/src/teavm/java/net/minecraft/client/GameSettings.java new file mode 100644 index 0000000..479ad8a --- /dev/null +++ b/src/teavm/java/net/minecraft/client/GameSettings.java @@ -0,0 +1,179 @@ +package net.minecraft.client; + +import org.lwjgl.opengl.GL11; + +public final class GameSettings { + private static final String[] RENDER_DISTANCES = new String[]{"FAR", "NORMAL", "SHORT", "TINY"}; + private static final String[] DIFFICULTIES = new String[]{"Peaceful", "Easy", "Normal", "Hard"}; + public boolean music = true; + public boolean sound = true; + public boolean invertMouse = false; + public boolean showFPS = false; + public int renderDistance = 0; + public boolean fancyGraphics = true; + public boolean anaglyph = false; + public boolean limitFramerate = false; + public KeyBinding keyBindForward = new KeyBinding("Forward", 17); + public KeyBinding keyBindLeft = new KeyBinding("Left", 30); + public KeyBinding keyBindBack = new KeyBinding("Back", 31); + public KeyBinding keyBindRight = new KeyBinding("Right", 32); + public KeyBinding keyBindJump = new KeyBinding("Jump", 57); + public KeyBinding keyBindInventory = new KeyBinding("Inventory", 23); + public KeyBinding keyBindDrop = new KeyBinding("Drop", 16); + private KeyBinding keyBindChat = new KeyBinding("Chat", 20); + public KeyBinding keyBindToggleFog = new KeyBinding("Toggle fog", 33); + public KeyBinding keyBindSave = new KeyBinding("Save location", 28); + public KeyBinding keyBindLoad = new KeyBinding("Load location", 19); + public KeyBinding[] keyBindings = new KeyBinding[]{this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindDrop, this.keyBindInventory, this.keyBindChat, this.keyBindToggleFog, this.keyBindSave, this.keyBindLoad}; + private Minecraft mc; +// private File optionsFile; + public int numberOfOptions = 9; + public int difficulty = 2; + public boolean thirdPersonView = false; + + public GameSettings(Minecraft var1) { + this.mc = var1; +// this.optionsFile = new File(var2, "options.txt"); + this.loadOptions(); + } + + public final String setKeyBindingString(int var1) { + return this.keyBindings[var1].keyDescription + ": " + GL11.getKeyName(this.keyBindings[var1].keyCode); + } + + public final void setKeyBinding(int var1, int var2) { + this.keyBindings[var1].keyCode = var2; + this.saveOptions(); + } + + public final void setOptionValue(int var1, int var2) { + if(var1 == 0) { + this.music = !this.music; + } + + if(var1 == 1) { + this.sound = !this.sound; + } + + if(var1 == 2) { + this.invertMouse = !this.invertMouse; + } + + if(var1 == 3) { + this.showFPS = !this.showFPS; + } + + if(var1 == 4) { + this.renderDistance = this.renderDistance + var2 & 3; + } + + if(var1 == 5) { + this.fancyGraphics = !this.fancyGraphics; + } + + if(var1 == 6) { + this.anaglyph = !this.anaglyph; + this.mc.renderEngine.refreshTextures(); + } + + if(var1 == 7) { + this.limitFramerate = !this.limitFramerate; + } + + if(var1 == 8) { + this.difficulty = this.difficulty + var2 & 3; + } + + this.saveOptions(); + } + + public final String setOptionString(int var1) { + return var1 == 0 ? "Music: " + (this.music ? "ON" : "OFF") : (var1 == 1 ? "Sound: " + (this.sound ? "ON" : "OFF") : (var1 == 2 ? "Invert mouse: " + (this.invertMouse ? "ON" : "OFF") : (var1 == 3 ? "Show FPS: " + (this.showFPS ? "ON" : "OFF") : (var1 == 4 ? "Render distance: " + RENDER_DISTANCES[this.renderDistance] : (var1 == 5 ? "View bobbing: " + (this.fancyGraphics ? "ON" : "OFF") : (var1 == 6 ? "3d anaglyph: " + (this.anaglyph ? "ON" : "OFF") : (var1 == 7 ? "Limit framerate: " + (this.limitFramerate ? "ON" : "OFF") : (var1 == 8 ? "Difficulty: " + DIFFICULTIES[this.difficulty] : "")))))))); + } + + private void loadOptions() { +// try { +// if(this.optionsFile.exists()) { +// BufferedReader var1 = new BufferedReader(new FileReader(this.optionsFile)); +// +// while(true) { +// String var2 = var1.readLine(); +// if(var2 == null) { +// var1.close(); +// return; +// } +// +// String[] var5 = var2.split(":"); +// if(var5[0].equals("music")) { +// this.music = var5[1].equals("true"); +// } +// +// if(var5[0].equals("sound")) { +// this.sound = var5[1].equals("true"); +// } +// +// if(var5[0].equals("invertYMouse")) { +// this.invertMouse = var5[1].equals("true"); +// } +// +// if(var5[0].equals("showFrameRate")) { +// this.showFPS = var5[1].equals("true"); +// } +// +// if(var5[0].equals("viewDistance")) { +// this.renderDistance = Integer.parseInt(var5[1]); +// } +// +// if(var5[0].equals("bobView")) { +// this.fancyGraphics = var5[1].equals("true"); +// } +// +// if(var5[0].equals("anaglyph3d")) { +// this.anaglyph = var5[1].equals("true"); +// } +// +// if(var5[0].equals("limitFramerate")) { +// this.limitFramerate = var5[1].equals("true"); +// } +// +// if(var5[0].equals("difficulty")) { +// this.difficulty = Integer.parseInt(var5[1]); +// } +// +// for(int var3 = 0; var3 < this.keyBindings.length; ++var3) { +// if(var5[0].equals("key_" + this.keyBindings[var3].keyDescription)) { +// this.keyBindings[var3].keyCode = Integer.parseInt(var5[1]); +// } +// } +// } +// } +// } catch (Exception var4) { +// System.out.println("Failed to load options"); +// var4.printStackTrace(); +// } + } + + public final void saveOptions() { +// try { +// PrintWriter var1 = new PrintWriter(new FileWriter(this.optionsFile)); +// var1.println("music:" + this.music); +// var1.println("sound:" + this.sound); +// var1.println("invertYMouse:" + this.invertMouse); +// var1.println("showFrameRate:" + this.showFPS); +// var1.println("viewDistance:" + this.renderDistance); +// var1.println("bobView:" + this.fancyGraphics); +// var1.println("anaglyph3d:" + this.anaglyph); +// var1.println("limitFramerate:" + this.limitFramerate); +// var1.println("difficulty:" + this.difficulty); +// +// for(int var2 = 0; var2 < this.keyBindings.length; ++var2) { +// var1.println("key_" + this.keyBindings[var2].keyDescription + ":" + this.keyBindings[var2].keyCode); +// } +// +// var1.close(); +// } catch (Exception var3) { +// System.out.println("Failed to save options"); +// var3.printStackTrace(); +// } + } +} diff --git a/src/teavm/java/net/minecraft/client/GuiMainMenu.java b/src/teavm/java/net/minecraft/client/GuiMainMenu.java new file mode 100644 index 0000000..8d21e40 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/GuiMainMenu.java @@ -0,0 +1,79 @@ +package net.minecraft.client; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiLoadLevel; +import net.minecraft.client.gui.GuiNewLevel; +import net.minecraft.client.gui.GuiOptions; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.render.Tessellator; +import org.lwjgl.opengl.GL11; + +public final class GuiMainMenu extends GuiScreen { + private float updateCounter = 0.0F; + private String[] splashes = new String[]{"Pre-beta!", "As seen on TV!", "Awesome!", "100% pure!", "May contain nuts!", "Better than Prey!", "More polygons!", "Sexy!", "Limited edition!", "Flashing letters!", "Made by Notch!", "Coming soon!", "Best in class!", "When it\'s finished!", "Absolutely dragon free!", "Excitement!", "More than 5000 sold!", "One of a kind!", "700+ hits on YouTube!", "Indev!", "Spiders everywhere!", "Check it out!", "Holy cow, man!", "It\'s a game!", "Made in Sweden!", "Uses LWJGL!", "Reticulating splines!", "Minecraft!", "Yaaay!", "Alpha version!", "Singleplayer!", "Keyboard compatible!", "Undocumented!", "Ingots!", "Exploding creepers!", "That\'s not a moon!", "l33t!", "Create!", "Survive!", "Dungeon!", "Exclusive!", "The bee\'s knees!", "Down with O.P.P.!", "Closed source!", "Classy!", "Wow!", "Not on steam!", "9.95 euro!", "Half price!", "Oh man!", "Check it out!", "Awesome community!", "Pixels!", "Teetsuuuuoooo!", "Kaaneeeedaaaa!", "Now with difficulty!", "Enhanced!", "90% bug free!", "Pretty!", "12 herbs and spices!", "Fat free!", "Absolutely no memes!", "Free dental!", "Ask your doctor!", "Minors welcome!", "Cloud computing!", "Legal in Finland!", "Hard to label!", "Technically good!", "Bringing home the bacon!", "Indie!", "GOTY!", "Ceci n\'est pas une title screen!", "Euclidian!", "Now in 3D!", "Inspirational!", "Herregud!", "Complex cellular automata!", "Yes, sir!", "Played by cowboys!", "OpenGL 1.1!", "Thousands of colors!", "Try it!", "Age of Wonders is better!", "Try the mushroom stew!", "Sensational!", "Hot tamale, hot hot tamale!", "Play him off, keyboard cat!", "Guaranteed!", "Macroscopic!", "Bring it on!", "Random splash!", "Call your mother!", "Monster infighting!", "Loved by millions!", "Ultimate edition!", "Freaky!", "You\'ve got a brand new key!", "Water proof!", "Uninflammable!", "Whoa, dude!", "All inclusive!", "Tell your friends!", "NP is not in P!", "Notch <3 Ez!", "Music by C418!"}; + private String currentSplash = this.splashes[(int)(Math.random() * (double)this.splashes.length)]; + + public final void updateScreen() { + this.updateCounter += 0.01F; + } + + protected final void keyTyped(char var1, int var2) { + } + + public final void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 48, "Generate new level...")); + this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 72, "Load level..")); + this.controlList.add(new GuiButton(3, this.width / 2 - 100, this.height / 4 + 96, "Play tutorial level")); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Options...")); + ((GuiButton)this.controlList.get(2)).enabled = false; + if(this.mc.session == null) { + ((GuiButton)this.controlList.get(1)).enabled = false; + } + + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiOptions(this, this.mc.options)); + } + + if(var1.id == 1) { + this.mc.displayGuiScreen(new GuiNewLevel(this)); + } + + if(this.mc.session != null && var1.id == 2) { + this.mc.displayGuiScreen(new GuiLoadLevel(this)); + } + + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + Tessellator var4 = Tessellator.instance; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/logo.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var4.setColorOpaque_I(16777215); + this.drawTexturedModalRect((this.width - 256) / 2, 30, 0, 0, 256, 49); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(this.width / 2 + 90), 70.0F, 0.0F); + GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F); + float var15 = 1.8F - MathHelper.abs(MathHelper.sin((float)(System.currentTimeMillis() % 1000L) / 1000.0F * (float)Math.PI * 2.0F) * 0.1F); + var15 = var15 * 100.0F / (float)(this.fontRenderer.getStringWidth(this.currentSplash) + 32); + GL11.glScalef(var15, var15, var15); + drawCenteredString(this.fontRenderer, this.currentSplash, 0, -8, 16776960); + GL11.glPopMatrix(); + String var16 = "Copyright Mojang Specifications. Do not distribute."; + drawString(this.fontRenderer, var16, this.width - this.fontRenderer.getStringWidth(var16) - 2, this.height - 10, 16777215); + long var7 = Runtime.getRuntime().maxMemory(); + long var9 = Runtime.getRuntime().totalMemory(); + long var11 = Runtime.getRuntime().freeMemory(); + long var13 = var7 - var11; + var16 = "Free memory: " + var13 * 100L / var7 + "% of " + var7 / 1024L / 1024L + "MB"; + drawString(this.fontRenderer, var16, this.width - this.fontRenderer.getStringWidth(var16) - 2, 2, 8421504); + var16 = "Allocated memory: " + var9 * 100L / var7 + "% (" + var9 / 1024L / 1024L + "MB)"; + drawString(this.fontRenderer, var16, this.width - this.fontRenderer.getStringWidth(var16) - 2, 12, 8421504); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/KeyBinding.java b/src/teavm/java/net/minecraft/client/KeyBinding.java new file mode 100644 index 0000000..ffffe9d --- /dev/null +++ b/src/teavm/java/net/minecraft/client/KeyBinding.java @@ -0,0 +1,11 @@ +package net.minecraft.client; + +public final class KeyBinding { + public String keyDescription; + public int keyCode; + + public KeyBinding(String var1, int var2) { + this.keyDescription = var1; + this.keyCode = var2; + } +} diff --git a/src/teavm/java/net/minecraft/client/LoadingScreenRenderer.java b/src/teavm/java/net/minecraft/client/LoadingScreenRenderer.java new file mode 100644 index 0000000..6a2222f --- /dev/null +++ b/src/teavm/java/net/minecraft/client/LoadingScreenRenderer.java @@ -0,0 +1,136 @@ +package net.minecraft.client; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.GZIPInputStream; + +import net.PeytonPlayz585.nbt.NBTBase; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.render.Tessellator; +import org.lwjgl.opengl.GL11; +import util.IProgressUpdate; + +public class LoadingScreenRenderer implements IProgressUpdate { + private String text; + private Minecraft mc; + private String title; + private long start; + + public LoadingScreenRenderer(Minecraft var1) { + this.text = ""; + this.title = ""; + this.start = System.currentTimeMillis(); + this.mc = var1; + } + + public final void displayProgressMessage(String var1) { + if(!this.mc.running) { + throw new MinecraftError(); + } else { + this.title = var1; + ScaledResolution var3 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var2 = var3.getScaledWidth(); + int var4 = var3.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var2, (double)var4, 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + } + } + + public final void displayLoadingString(String var1) { + if(!this.mc.running) { + throw new MinecraftError(); + } else { + this.start = 0L; + this.text = var1; + this.setLoadingProgress(-1); + this.start = 0L; + } + } + + public final void setLoadingProgress(int var1) { + if(!this.mc.running) { + throw new MinecraftError(); + } else { + long var2 = System.currentTimeMillis(); + if(var2 - this.start >= 20L) { + this.start = var2; + ScaledResolution var8 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var3 = var8.getScaledWidth(); + int var9 = var8.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var3, (double)var9, 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + Tessellator var4 = Tessellator.instance; + int var5 = this.mc.renderEngine.getTexture("/dirt.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5); + var4.startDrawingQuads(); + var4.setColorOpaque_I(4210752); + var4.addVertexWithUV(0.0F, (float)var9, 0.0F, 0.0F, (float)var9 / 32.0F); + var4.addVertexWithUV((float)var3, (float)var9, 0.0F, (float)var3 / 32.0F, (float)var9 / 32.0F); + var4.addVertexWithUV((float)var3, 0.0F, 0.0F, (float)var3 / 32.0F, 0.0F); + var4.addVertexWithUV(0.0F, 0.0F, 0.0F, 0.0F, 0.0F); + var4.draw(); + if(var1 >= 0) { + var5 = var3 / 2 - 50; + int var6 = var9 / 2 + 16; + GL11.glDisable(GL11.GL_TEXTURE_2D); + var4.startDrawingQuads(); + var4.setColorOpaque_I(8421504); + var4.addVertex((float)var5, (float)var6, 0.0F); + var4.addVertex((float)var5, (float)(var6 + 2), 0.0F); + var4.addVertex((float)(var5 + 100), (float)(var6 + 2), 0.0F); + var4.addVertex((float)(var5 + 100), (float)var6, 0.0F); + var4.setColorOpaque_I(8454016); + var4.addVertex((float)var5, (float)var6, 0.0F); + var4.addVertex((float)var5, (float)(var6 + 2), 0.0F); + var4.addVertex((float)(var5 + var1), (float)(var6 + 2), 0.0F); + var4.addVertex((float)(var5 + var1), (float)var6, 0.0F); + var4.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + this.mc.fontRenderer.drawStringWithShadow(this.title, (var3 - this.mc.fontRenderer.getStringWidth(this.title)) / 2, var9 / 2 - 4 - 16, 16777215); + this.mc.fontRenderer.drawStringWithShadow(this.text, (var3 - this.mc.fontRenderer.getStringWidth(this.text)) / 2, var9 / 2 - 4 + 8, 16777215); + GL11.updateDisplay(); + + try { + Thread.yield(); + } catch (Exception var7) { + } + } + } + } + + public LoadingScreenRenderer() { + } + + public static NBTTagCompound writeLevelTags(InputStream var0) throws IOException { + DataInputStream var4 = new DataInputStream(new GZIPInputStream(var0)); + + NBTTagCompound var5; + try { + NBTBase var1 = NBTBase.readTag(var4); + if(!(var1 instanceof NBTTagCompound)) { + throw new IOException("Root tag must be a named compound tag"); + } + + var5 = (NBTTagCompound)var1; + } finally { + var4.close(); + } + + return var5; + } +} diff --git a/src/teavm/java/net/minecraft/client/Minecraft.java b/src/teavm/java/net/minecraft/client/Minecraft.java new file mode 100644 index 0000000..0cacb79 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/Minecraft.java @@ -0,0 +1,879 @@ +package net.minecraft.client; + +import java.awt.Canvas; +import java.awt.Component; +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import javax.swing.JOptionPane; +import net.minecraft.client.controller.PlayerController; +import net.minecraft.client.controller.PlayerControllerCreative; +import net.minecraft.client.controller.PlayerControllerSP; +import net.minecraft.client.effect.EffectRenderer; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiErrorScreen; +import net.minecraft.client.gui.GuiGameOver; +import net.minecraft.client.gui.GuiIngame; +import net.minecraft.client.gui.GuiIngameMenu; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.container.GuiInventory; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.client.player.MovementInputFromOptions; +import net.minecraft.client.render.EntityRenderer; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.RenderGlobal; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.texture.TextureFlamesFX; +import net.minecraft.client.render.texture.TextureGearsFX; +import net.minecraft.client.render.texture.TextureLavaFX; +import net.minecraft.client.render.texture.TextureWaterFX; +import net.minecraft.client.render.texture.TextureWaterFlowFX; +import net.minecraft.client.sound.SoundManager; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.generator.LevelGenerator; +import net.minecraft.game.physics.MovingObjectPosition; +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Controllers; +import org.lwjgl.input.Cursor; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GLContext; + +public final class Minecraft implements Runnable { + public PlayerController playerController = new PlayerControllerSP(this); + private boolean fullscreen = false; + public int displayWidth; + public int displayHeight; + private OpenGlCapsChecker glCapabilities; + private Timer timer = new Timer(20.0F); + public World theWorld; + public RenderGlobal renderGlobal; + public EntityPlayerSP thePlayer; + public EffectRenderer effectRenderer; + public Session session = null; + public String minecraftUri; + public Canvas mcCanvas; + public boolean appletMode = true; + public volatile boolean isGamePaused = false; + public RenderEngine renderEngine; + public FontRenderer fontRenderer; + public GuiScreen currentScreen = null; + public LoadingScreenRenderer loadingScreen = new LoadingScreenRenderer(this); + public EntityRenderer entityRenderer = new EntityRenderer(this); + private ThreadDownloadResources downloadResourcesThread; + private int ticksRan = 0; + private int leftClickCounter = 0; + private int tempDisplayWidth; + private int tempDisplayHeight; + public String loadMapUser = null; + public int loadMapID = 0; + public GuiIngame ingameGUI; + public boolean skipRenderWorld = false; + public MovingObjectPosition objectMouseOver; + public GameSettings options; + private MinecraftApplet mcApplet; + public SoundManager sndManager; + public MouseHelper mouseHelper; + public File mcDataDir; + private String server; + private TextureWaterFX textureWaterFX; + private TextureLavaFX textureLavaFX; + volatile boolean running; + public String debug; + public boolean inventoryScreen; + private int prevFrameTime; + public boolean inGameHasFocus; + + public Minecraft(Canvas var1, MinecraftApplet var2, int var3, int var4, boolean var5) { + new ModelBiped(0.0F); + this.objectMouseOver = null; + this.sndManager = new SoundManager(); + this.server = null; + this.textureWaterFX = new TextureWaterFX(); + this.textureLavaFX = new TextureLavaFX(); + this.running = false; + this.debug = ""; + this.inventoryScreen = false; + this.prevFrameTime = 0; + this.inGameHasFocus = false; + this.tempDisplayWidth = var3; + this.tempDisplayHeight = var4; + this.fullscreen = var5; + this.mcApplet = var2; + new ThreadSleepForever(this, "Timer hack thread"); + this.mcCanvas = var1; + this.displayWidth = var3; + this.displayHeight = var4; + this.fullscreen = var5; + } + + public final void setServer(String var1, int var2) { + this.server = var1; + } + + public final void displayGuiScreen(GuiScreen var1) { + if(!(this.currentScreen instanceof GuiErrorScreen)) { + 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.inputLock(); + ScaledResolution var2 = new ScaledResolution(this.displayWidth, this.displayHeight); + int var3 = var2.getScaledWidth(); + int var4 = var2.getScaledHeight(); + ((GuiScreen)var1).setWorldAndResolution(this, var3, var4); + this.skipRenderWorld = false; + } else { + this.setIngameFocus(); + } + } + } + + public final void shutdownMinecraftApplet() { + try { + if(this.downloadResourcesThread != null) { + this.downloadResourcesThread.closeMinecraft(); + } + } catch (Exception var5) { + } + + try { + this.sndManager.closeMinecraft(); + Mouse.destroy(); + Keyboard.destroy(); + } finally { + Display.destroy(); + } + + } + + public final void run() { + this.running = true; + + try { + Minecraft var1 = this; + if(this.mcCanvas != null) { + Display.setParent(this.mcCanvas); + } else if(this.fullscreen) { + Display.setFullscreen(true); + this.displayWidth = Display.getDisplayMode().getWidth(); + this.displayHeight = Display.getDisplayMode().getHeight(); + } else { + Display.setDisplayMode(new DisplayMode(this.displayWidth, this.displayHeight)); + } + + Display.setTitle("Minecraft Minecraft Indev"); + + IntBuffer var24; + try { + Display.create(); + System.out.println("LWJGL version: " + Sys.getVersion()); + System.out.println("GL RENDERER: " + GL11.glGetString(GL11.GL_RENDERER)); + System.out.println("GL VENDOR: " + GL11.glGetString(GL11.GL_VENDOR)); + System.out.println("GL VERSION: " + GL11.glGetString(GL11.GL_VERSION)); + ContextCapabilities var2 = GLContext.getCapabilities(); + System.out.println("OpenGL 3.0: " + var2.OpenGL30); + System.out.println("OpenGL 3.1: " + var2.OpenGL31); + System.out.println("OpenGL 3.2: " + var2.OpenGL32); + System.out.println("ARB_compatibility: " + var2.GL_ARB_compatibility); + if(var2.OpenGL32) { + var24 = ByteBuffer.allocateDirect(64).order(ByteOrder.nativeOrder()).asIntBuffer(); + GL11.glGetInteger('\u9126', var24); + int var25 = var24.get(0); + System.out.println("PROFILE MASK: " + Integer.toBinaryString(var25)); + System.out.println("CORE PROFILE: " + ((var25 & 1) != 0)); + System.out.println("COMPATIBILITY PROFILE: " + ((var25 & 2) != 0)); + } + } catch (LWJGLException var17) { + var17.printStackTrace(); + + try { + Thread.sleep(1000L); + } catch (InterruptedException var16) { + } + + Display.create(); + } + + Keyboard.create(); + Mouse.create(); + this.mouseHelper = new MouseHelper(this.mcCanvas); + + try { + Controllers.create(); + } catch (Exception var15) { + var15.printStackTrace(); + } + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glClearDepth(1.0D); + 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.glCapabilities = new OpenGlCapsChecker(); + String var3 = "minecraft"; + String var26 = System.getProperty("user.home", "."); + int[] var10001 = EnumOSMappingHelper.osValues; + String var4 = System.getProperty("os.name").toLowerCase(); + File var27; + switch(var10001[(var4.contains("win") ? EnumOS.windows : (var4.contains("mac") ? EnumOS.macos : (var4.contains("solaris") ? EnumOS.solaris : (var4.contains("sunos") ? EnumOS.solaris : (var4.contains("linux") ? EnumOS.linux : (var4.contains("unix") ? EnumOS.linux : EnumOS.unknown)))))).ordinal()]) { + case 1: + case 2: + var27 = new File(var26, '.' + var3 + '/'); + break; + case 3: + var4 = System.getenv("APPDATA"); + if(var4 != null) { + var27 = new File(var4, "." + var3 + '/'); + } else { + var27 = new File(var26, '.' + var3 + '/'); + } + break; + case 4: + var27 = new File(var26, "Library/Application Support/" + var3); + break; + default: + var27 = new File(var26, var3 + '/'); + } + + if(!var27.exists() && !var27.mkdirs()) { + throw new RuntimeException("The working directory could not be created: " + var27); + } + + this.mcDataDir = var27; + this.options = new GameSettings(this, this.mcDataDir); + this.sndManager.loadSoundSettings(this.options); + this.renderEngine = new RenderEngine(this.options); + this.renderEngine.registerTextureFX(this.textureLavaFX); + this.renderEngine.registerTextureFX(this.textureWaterFX); + this.renderEngine.registerTextureFX(new TextureWaterFlowFX()); + this.renderEngine.registerTextureFX(new TextureFlamesFX(0)); + this.renderEngine.registerTextureFX(new TextureFlamesFX(1)); + this.renderEngine.registerTextureFX(new TextureGearsFX(0)); + this.renderEngine.registerTextureFX(new TextureGearsFX(1)); + this.fontRenderer = new FontRenderer(this.options, "/default.png", this.renderEngine); + var24 = BufferUtils.createIntBuffer(256); + var24.clear().limit(256); + this.renderGlobal = new RenderGlobal(this, this.renderEngine); + GL11.glViewport(0, 0, this.displayWidth, this.displayHeight); + if(this.server != null && this.session != null) { + World var31 = new World(); + var31.generate(8, 8, 8, new byte[512], new byte[512]); + this.setLevel(var31); + } else if(this.theWorld == null) { + this.displayGuiScreen(new GuiMainMenu()); + } + + this.effectRenderer = new EffectRenderer(this.theWorld, this.renderEngine); + + try { + var1.downloadResourcesThread = new ThreadDownloadResources(var1.mcDataDir, var1); + var1.downloadResourcesThread.start(); + } catch (Exception var14) { + } + + this.ingameGUI = new GuiIngame(this); + } catch (Exception var22) { + var22.printStackTrace(); + JOptionPane.showMessageDialog((Component)null, var22.toString(), "Failed to start Minecraft", 0); + return; + } + + long var23 = System.currentTimeMillis(); + int var28 = 0; + + try { + while(this.running) { + if(this.theWorld != null) { + this.theWorld.updateLighting(); + } + + if(this.mcCanvas == null && Display.isCloseRequested()) { + this.running = false; + } + + try { + if(this.isGamePaused) { + float var29 = this.timer.renderPartialTicks; + this.timer.updateTimer(); + this.timer.renderPartialTicks = var29; + } else { + this.timer.updateTimer(); + } + + for(int var30 = 0; var30 < this.timer.elapsedTicks; ++var30) { + ++this.ticksRan; + this.runTick(); + } + + this.sndManager.setListener(this.thePlayer, this.timer.renderPartialTicks); + GL11.glEnable(GL11.GL_TEXTURE_2D); + this.playerController.setPartialTime(this.timer.renderPartialTicks); + this.entityRenderer.updateCameraAndRender(this.timer.renderPartialTicks); + if(!Display.isActive()) { + if(this.fullscreen) { + this.toggleFullscreen(); + } + + Thread.sleep(10L); + } + + if(this.mcCanvas != null && !this.fullscreen && (this.mcCanvas.getWidth() != this.displayWidth || this.mcCanvas.getHeight() != this.displayHeight)) { + this.displayWidth = this.mcCanvas.getWidth(); + this.displayHeight = this.mcCanvas.getHeight(); + this.resize(this.displayWidth, this.displayHeight); + } + + if(this.options.limitFramerate) { + Thread.sleep(5L); + } + + ++var28; + this.isGamePaused = this.currentScreen != null && this.currentScreen.doesGuiPauseGame(); + } catch (Exception var18) { + this.displayGuiScreen(new GuiErrorScreen("Client error", "The game broke! [" + var18 + "]")); + var18.printStackTrace(); + return; + } + + while(System.currentTimeMillis() >= var23 + 1000L) { + this.debug = var28 + " fps, " + WorldRenderer.chunksUpdated + " chunk updates"; + WorldRenderer.chunksUpdated = 0; + var23 += 1000L; + var28 = 0; + } + } + + return; + } catch (MinecraftError var19) { + return; + } catch (Exception var20) { + var20.printStackTrace(); + } finally { + this.shutdownMinecraftApplet(); + } + + } + + public final void setIngameFocus() { + if(Display.isActive()) { + if(!this.inventoryScreen) { + this.inventoryScreen = true; + this.mouseHelper.grabMouseCursor(); + this.displayGuiScreen((GuiScreen)null); + this.prevFrameTime = this.ticksRan + 10000; + } + } + } + + private void inputLock() { + if(this.inventoryScreen) { + if(this.thePlayer != null) { + EntityPlayerSP var1 = this.thePlayer; + var1.movementInput.resetKeyState(); + } + + this.inventoryScreen = false; + + try { + Mouse.setNativeCursor((Cursor)null); + } catch (LWJGLException var2) { + var2.printStackTrace(); + } + } + } + + public final void displayInGameMenu() { + if(this.currentScreen == null) { + this.displayGuiScreen(new GuiIngameMenu()); + } + } + + private void clickMouse(int var1) { + if(var1 != 0 || this.leftClickCounter <= 0) { + if(var1 == 0) { + this.entityRenderer.itemRenderer.equippedItemRender(); + } + + ItemStack var2; + int var3; + World var5; + if(var1 == 1) { + var2 = this.thePlayer.inventory.getCurrentItem(); + if(var2 != null) { + var3 = var2.stackSize; + EntityPlayerSP var7 = this.thePlayer; + var5 = this.theWorld; + ItemStack var4 = var2.getItem().onItemRightClick(var2, var5, var7); + if(var4 != var2 || var4 != null && var4.stackSize != var3) { + this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = var4; + this.entityRenderer.itemRenderer.resetEquippedProgress(); + if(var4.stackSize == 0) { + this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null; + } + } + } + } + + if(this.objectMouseOver == null) { + if(var1 == 0 && !(this.playerController instanceof PlayerControllerCreative)) { + this.leftClickCounter = 10; + } + + } else { + ItemStack var9; + if(this.objectMouseOver.typeOfHit == 1) { + if(var1 == 0) { + Entity var14 = this.objectMouseOver.entityHit; + EntityPlayerSP var12 = this.thePlayer; + InventoryPlayer var11 = var12.inventory; + var9 = var11.getStackInSlot(var11.currentItem); + int var17 = var9 != null ? Item.itemsList[var9.itemID].getDamageVsEntity() : 1; + if(var17 > 0) { + var14.attackEntityFrom(var12, var17); + var2 = var12.inventory.getCurrentItem(); + if(var2 != null && var14 instanceof EntityLiving) { + EntityLiving var8 = (EntityLiving)var14; + Item.itemsList[var2.itemID].hitEntity(var2); + if(var2.stackSize <= 0) { + var12.destroyCurrentEquippedItem(); + } + } + } + + return; + } + } else if(this.objectMouseOver.typeOfHit == 0) { + int var10 = this.objectMouseOver.blockX; + var3 = this.objectMouseOver.blockY; + int var13 = this.objectMouseOver.blockZ; + int var15 = this.objectMouseOver.sideHit; + Block var6 = Block.blocksList[this.theWorld.getBlockId(var10, var3, var13)]; + if(var1 == 0) { + this.theWorld.extinguishFire(var10, var3, var13, this.objectMouseOver.sideHit); + if(var6 != Block.bedrock) { + this.playerController.clickBlock(var10, var3, var13); + return; + } + } else { + var9 = this.thePlayer.inventory.getCurrentItem(); + int var16 = this.theWorld.getBlockId(var10, var3, var13); + if(var16 > 0 && Block.blocksList[var16].blockActivated(this.theWorld, var10, var3, var13, this.thePlayer)) { + return; + } + + if(var9 == null) { + return; + } + + var16 = var9.stackSize; + int var18 = var15; + var5 = this.theWorld; + if(var9.getItem().onItemUse(var9, var5, var10, var3, var13, var18)) { + this.entityRenderer.itemRenderer.equippedItemRender(); + } + + if(var9.stackSize == 0) { + this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null; + return; + } + + if(var9.stackSize != var16) { + this.entityRenderer.itemRenderer.equipAnimationSpeed(); + } + } + } + + } + } + } + + public final void toggleFullscreen() { + try { + this.fullscreen = !this.fullscreen; + System.out.println("Toggle fullscreen!"); + if(this.fullscreen) { + Display.setDisplayMode(Display.getDesktopDisplayMode()); + this.displayWidth = Display.getDisplayMode().getWidth(); + this.displayHeight = Display.getDisplayMode().getHeight(); + } else { + if(this.mcCanvas != null) { + this.displayWidth = this.mcCanvas.getWidth(); + this.displayHeight = this.mcCanvas.getHeight(); + } else { + this.displayWidth = this.tempDisplayWidth; + this.displayHeight = this.tempDisplayHeight; + } + + Display.setDisplayMode(new DisplayMode(this.tempDisplayWidth, this.tempDisplayHeight)); + } + + this.inputLock(); + Display.setFullscreen(this.fullscreen); + Display.update(); + Thread.sleep(1000L); + if(this.fullscreen) { + this.setIngameFocus(); + } + + if(this.currentScreen != null) { + this.inputLock(); + this.resize(this.displayWidth, this.displayHeight); + } + + System.out.println("Size: " + this.displayWidth + ", " + this.displayHeight); + } catch (Exception var2) { + var2.printStackTrace(); + } + } + + private void resize(int var1, int var2) { + this.displayWidth = var1; + this.displayHeight = var2; + if(this.currentScreen != null) { + ScaledResolution var3 = new ScaledResolution(var1, var2); + var2 = var3.getScaledWidth(); + var1 = var3.getScaledHeight(); + this.currentScreen.setWorldAndResolution(this, var2, var1); + } + + } + + private void runTick() { + this.ingameGUI.addChatMessage(); + if(!this.isGamePaused && this.theWorld != null) { + this.playerController.onUpdate(); + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain.png")); + if(!this.isGamePaused) { + this.renderEngine.updateDynamicTextures(); + } + + if(this.currentScreen == null && this.thePlayer != null && this.thePlayer.health <= 0) { + this.displayGuiScreen((GuiScreen)null); + } + + if(this.currentScreen == null || this.currentScreen.allowUserInput) { + label286: + while(true) { + while(true) { + int var1; + int var2; + while(Mouse.next()) { + var1 = Mouse.getEventDWheel(); + if(var1 != 0) { + var2 = var1; + InventoryPlayer var5 = this.thePlayer.inventory; + if(var1 > 0) { + var2 = 1; + } + + if(var2 < 0) { + var2 = -1; + } + + for(var5.currentItem -= var2; var5.currentItem < 0; var5.currentItem += 9) { + } + + while(var5.currentItem >= 9) { + var5.currentItem -= 9; + } + } + + if(this.currentScreen == null) { + if(!this.inventoryScreen && Mouse.getEventButtonState()) { + this.setIngameFocus(); + } else { + if(Mouse.getEventButton() == 0 && Mouse.getEventButtonState()) { + this.clickMouse(0); + this.prevFrameTime = this.ticksRan; + } + + if(Mouse.getEventButton() == 1 && Mouse.getEventButtonState()) { + this.clickMouse(1); + this.prevFrameTime = this.ticksRan; + } + + if(Mouse.getEventButton() == 2 && Mouse.getEventButtonState() && this.objectMouseOver != null) { + var2 = this.theWorld.getBlockId(this.objectMouseOver.blockX, this.objectMouseOver.blockY, this.objectMouseOver.blockZ); + if(var2 == Block.grass.blockID) { + var2 = Block.dirt.blockID; + } + + if(var2 == Block.stairDouble.blockID) { + var2 = Block.stairSingle.blockID; + } + + if(var2 == Block.bedrock.blockID) { + var2 = Block.stone.blockID; + } + + this.thePlayer.inventory.getFirstEmptyStack(var2); + } + } + } else if(this.currentScreen != null) { + this.currentScreen.handleMouseInput(); + } + } + + if(this.leftClickCounter > 0) { + --this.leftClickCounter; + } + + while(true) { + while(true) { + do { + boolean var3; + if(!Keyboard.next()) { + if(this.currentScreen == null) { + if(Mouse.isButtonDown(0) && (float)(this.ticksRan - this.prevFrameTime) >= this.timer.ticksPerSecond / 4.0F && this.inventoryScreen) { + this.clickMouse(0); + this.prevFrameTime = this.ticksRan; + } + + if(Mouse.isButtonDown(1) && (float)(this.ticksRan - this.prevFrameTime) >= this.timer.ticksPerSecond / 4.0F && this.inventoryScreen) { + this.clickMouse(1); + this.prevFrameTime = this.ticksRan; + } + } + + var3 = this.currentScreen == null && Mouse.isButtonDown(0) && this.inventoryScreen; + boolean var9 = false; + if(!this.playerController.isInTestMode && this.leftClickCounter <= 0) { + if(var3 && this.objectMouseOver != null && this.objectMouseOver.typeOfHit == 0) { + var2 = this.objectMouseOver.blockX; + int var8 = this.objectMouseOver.blockY; + int var4 = this.objectMouseOver.blockZ; + this.playerController.sendBlockRemoving(var2, var8, var4, this.objectMouseOver.sideHit); + this.effectRenderer.addBlockHitEffects(var2, var8, var4, this.objectMouseOver.sideHit); + } else { + this.playerController.resetBlockRemoving(); + } + } + break label286; + } + + EntityPlayerSP var10000 = this.thePlayer; + int var10001 = Keyboard.getEventKey(); + var3 = Keyboard.getEventKeyState(); + var2 = var10001; + EntityPlayerSP var6 = var10000; + var6.movementInput.checkKeyForMovementInput(var2, var3); + } while(!Keyboard.getEventKeyState()); + + if(Keyboard.getEventKey() == Keyboard.KEY_F11) { + this.toggleFullscreen(); + } else { + if(this.currentScreen != null) { + this.currentScreen.handleKeyboardInput(); + } else { + if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + this.displayInGameMenu(); + } + + if(Keyboard.getEventKey() == Keyboard.KEY_F7) { + this.entityRenderer.grabLargeScreenshot(); + } + + if(this.playerController instanceof PlayerControllerCreative) { + if(Keyboard.getEventKey() == this.options.keyBindLoad.keyCode) { + this.thePlayer.preparePlayerToSpawn(); + } + + if(Keyboard.getEventKey() == this.options.keyBindSave.keyCode) { + this.theWorld.setSpawnLocation((int)this.thePlayer.posX, (int)this.thePlayer.posY, (int)this.thePlayer.posZ, this.thePlayer.rotationYaw); + this.thePlayer.preparePlayerToSpawn(); + } + } + + if(Keyboard.getEventKey() == Keyboard.KEY_F5) { + this.options.thirdPersonView = !this.options.thirdPersonView; + } + + if(Keyboard.getEventKey() == this.options.keyBindInventory.keyCode) { + this.displayGuiScreen(new GuiInventory(this.thePlayer.inventory)); + } + + if(Keyboard.getEventKey() == this.options.keyBindDrop.keyCode) { + this.thePlayer.dropPlayerItemWithRandomChoice(this.thePlayer.inventory.decrStackSize(this.thePlayer.inventory.currentItem, 1), false); + } + } + + for(var1 = 0; var1 < 9; ++var1) { + if(Keyboard.getEventKey() == var1 + 2) { + this.thePlayer.inventory.currentItem = var1; + } + } + + if(Keyboard.getEventKey() == this.options.keyBindToggleFog.keyCode) { + this.options.setOptionValue(4, !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && !Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ? 1 : -1); + } + } + } + } + } + } + } + + if(this.currentScreen != null) { + this.prevFrameTime = this.ticksRan + 10000; + } + + if(this.currentScreen != null) { + GuiScreen var7 = this.currentScreen; + + while(Mouse.next()) { + var7.handleMouseInput(); + } + + while(Keyboard.next()) { + var7.handleKeyboardInput(); + } + + if(this.currentScreen != null) { + this.currentScreen.updateScreen(); + } + } + + if(this.theWorld != null) { + this.theWorld.difficultySetting = this.options.difficulty; + if(!this.isGamePaused) { + this.entityRenderer.updateRenderer(); + } + + if(!this.isGamePaused) { + this.renderGlobal.updateClouds(); + } + + if(!this.isGamePaused) { + this.theWorld.updateEntities(); + } + + if(!this.isGamePaused) { + this.theWorld.tick(); + } + + if(!this.isGamePaused) { + this.theWorld.randomDisplayUpdates((int)this.thePlayer.posX, (int)this.thePlayer.posY, (int)this.thePlayer.posZ); + } + + if(!this.isGamePaused) { + this.effectRenderer.updateEffects(); + } + } + + } + + public final void generateLevel(int var1, int var2, int var3, int var4) { + this.setLevel((World)null); + System.gc(); + String var5 = this.session != null ? this.session.username : "anonymous"; + LevelGenerator var6 = new LevelGenerator(this.loadingScreen); + var6.islandGen = var3 == 1; + var6.floatingGen = var3 == 2; + var6.flatGen = var3 == 3; + var6.levelType = var4; + var1 = 128 << var1; + var3 = var1; + short var8 = 64; + if(var2 == 1) { + var1 /= 2; + var3 <<= 1; + } else if(var2 == 2) { + var1 /= 2; + var3 = var1; + var8 = 256; + } + + World var7 = var6.generate(var5, var1, var3, var8); + this.setLevel(var7); + } + + public final void setLevel(World var1) { + if(this.theWorld != null) { + this.theWorld.setLevel(); + } + + try { + BufferedReader var2 = new BufferedReader(new InputStreamReader((new URL(this.mcApplet.getDocumentBase() + "?n=" + this.session.username + "&i=" + this.session.sessionId)).openStream())); + Integer.parseInt(var2.readLine()); + var2.close(); + if(this.mcApplet.getDocumentBase().toString().startsWith("http://www.minecraft.net/") || this.mcApplet.getDocumentBase().toString().startsWith("http://minecraft.net/")) { + this.theWorld = var1; + } + } catch (Throwable var3) { + } + + if(var1 != null) { + var1.load(); + this.playerController.onWorldChange(var1); + this.thePlayer = (EntityPlayerSP)var1.findSubclassOf(EntityPlayerSP.class); + var1.playerEntity = this.thePlayer; + if(this.thePlayer == null) { + this.thePlayer = new EntityPlayerSP(this, var1, this.session); + this.thePlayer.preparePlayerToSpawn(); + if(var1 != null) { + var1.spawnEntityInWorld(this.thePlayer); + var1.playerEntity = this.thePlayer; + } + } + + if(this.thePlayer != null) { + this.thePlayer.movementInput = new MovementInputFromOptions(this.options); + this.playerController.onRespawn(this.thePlayer); + } + + if(this.renderGlobal != null) { + this.renderGlobal.changeWorld(var1); + } + + if(this.effectRenderer != null) { + this.effectRenderer.clearEffects(var1); + } + + this.textureWaterFX.textureId = 0; + this.textureLavaFX.textureId = 0; + int var4 = this.renderEngine.getTexture("/water.png"); + if(var1.defaultFluid == Block.waterMoving.blockID) { + this.textureWaterFX.textureId = var4; + } else { + this.textureLavaFX.textureId = var4; + } + } + + System.gc(); + } +} diff --git a/src/teavm/java/net/minecraft/client/MinecraftApplet.java b/src/teavm/java/net/minecraft/client/MinecraftApplet.java new file mode 100644 index 0000000..5f496c0 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/MinecraftApplet.java @@ -0,0 +1,83 @@ +package net.minecraft.client; + +import java.applet.Applet; +import java.awt.BorderLayout; +import java.awt.Canvas; + +public class MinecraftApplet extends Applet { + private Canvas mcCanvas; + private Minecraft mc; + private Thread mcThread = null; + + public void init() { + this.mcCanvas = new CanvasMinecraftApplet(this); + boolean var1 = false; + if(this.getParameter("fullscreen") != null) { + var1 = this.getParameter("fullscreen").equalsIgnoreCase("true"); + } + + this.mc = new Minecraft(this.mcCanvas, this, this.getWidth(), this.getHeight(), var1); + this.mc.minecraftUri = this.getDocumentBase().getHost(); + if(this.getDocumentBase().getPort() > 0) { + this.mc.minecraftUri = this.mc.minecraftUri + ":" + this.getDocumentBase().getPort(); + } + + if(this.getParameter("username") != null && this.getParameter("sessionid") != null) { + this.mc.session = new Session(this.getParameter("username"), this.getParameter("sessionid")); + if(this.getParameter("mppass") != null) { + this.getParameter("mppass"); + } + } + + if(this.getParameter("loadmap_user") != null && this.getParameter("loadmap_id") != null) { + this.mc.loadMapUser = this.getParameter("loadmap_user"); + this.mc.loadMapID = Integer.parseInt(this.getParameter("loadmap_id")); + } else if(this.getParameter("server") != null && this.getParameter("port") != null) { + this.mc.setServer(this.getParameter("server"), Integer.parseInt(this.getParameter("port"))); + } + + this.mc.appletMode = true; + this.setLayout(new BorderLayout()); + this.add(this.mcCanvas, "Center"); + this.mcCanvas.setFocusable(true); + this.validate(); + } + + public final void startMainThread() { + if(this.mcThread == null) { + this.mcThread = new Thread(this.mc, "Minecraft main thread"); + this.mcThread.start(); + } + } + + public void start() { + this.mc.isGamePaused = false; + } + + public void stop() { + this.mc.isGamePaused = true; + } + + public void destroy() { + this.shutdown(); + } + + public final void shutdown() { + if(this.mcThread != null) { + Minecraft var1 = this.mc; + var1.running = false; + + try { + this.mcThread.join(1000L); + } catch (InterruptedException var3) { + try { + this.mc.shutdownMinecraftApplet(); + } catch (Exception var2) { + var2.printStackTrace(); + } + } + + this.mcThread = null; + } + } +} diff --git a/src/teavm/java/net/minecraft/client/MinecraftError.java b/src/teavm/java/net/minecraft/client/MinecraftError.java new file mode 100644 index 0000000..da64a51 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/MinecraftError.java @@ -0,0 +1,4 @@ +package net.minecraft.client; + +public final class MinecraftError extends Error { +} diff --git a/src/teavm/java/net/minecraft/client/MouseHelper.java b/src/teavm/java/net/minecraft/client/MouseHelper.java new file mode 100644 index 0000000..e03aad4 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/MouseHelper.java @@ -0,0 +1,30 @@ +package net.minecraft.client; + +import org.lwjgl.opengl.GL11; + +public class MouseHelper { + + public void grabMouse() { + GL11.mouseSetGrabbed(true); + deltaX = 0; + deltaY = 0; + } + + public void ungrabMouse() { + GL11.mouseSetCursorPosition(GL11.getCanvasWidth() / 2, GL11.getCanvasHeight() / 2); + GL11.mouseSetGrabbed(false); + } + + public void mouseXYChange() { + if(GL11.isPointerLocked2()) { + deltaX = GL11.mouseGetDX(); + deltaY = GL11.mouseGetDY(); + }else { + deltaX = 0; + deltaY = 0; + } + } + + public int deltaX; + public int deltaY; +} \ No newline at end of file diff --git a/src/teavm/java/net/minecraft/client/OpenGlCapsChecker.java b/src/teavm/java/net/minecraft/client/OpenGlCapsChecker.java new file mode 100644 index 0000000..f7afce9 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/OpenGlCapsChecker.java @@ -0,0 +1,4 @@ +package net.minecraft.client; + +public final class OpenGlCapsChecker { +} diff --git a/src/teavm/java/net/minecraft/client/PlayerLoader.java b/src/teavm/java/net/minecraft/client/PlayerLoader.java new file mode 100644 index 0000000..ddf623a --- /dev/null +++ b/src/teavm/java/net/minecraft/client/PlayerLoader.java @@ -0,0 +1,20 @@ +package net.minecraft.client; + +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.LevelLoader; +import net.minecraft.game.level.World; +import util.IProgressUpdate; + +public final class PlayerLoader extends LevelLoader { + private Minecraft mc; + + public PlayerLoader(Minecraft var1, IProgressUpdate var2) { + super(var2); + this.mc = var1; + } + + protected final Entity loadEntity(World var1, String var2) { + return (Entity)(var2.equals("LocalPlayer") ? new EntityPlayerSP(this.mc, var1, this.mc.session) : super.loadEntity(var1, var2)); + } +} diff --git a/src/teavm/java/net/minecraft/client/RenderHelper.java b/src/teavm/java/net/minecraft/client/RenderHelper.java new file mode 100644 index 0000000..d785015 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/RenderHelper.java @@ -0,0 +1,44 @@ +package net.minecraft.client; + +import java.nio.FloatBuffer; +import net.minecraft.game.physics.Vec3D; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +public final class RenderHelper { + private static FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(16); + + public static void disableStandardItemLighting() { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_LIGHT0); + GL11.glDisable(GL11.GL_LIGHT1); + GL11.glDisable(GL11.GL_COLOR_MATERIAL); + } + + public static void enableStandardItemLighting() { + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHT0); + GL11.glEnable(GL11.GL_LIGHT1); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + Vec3D var0 = new Vec3D(0.3F, 1.0F, -0.7F); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, setColorBuffer(var0.xCoord, var0.yCoord, var0.zCoord, 0.0F)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, setColorBuffer(0.5F, 0.5F, 0.5F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, setColorBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, setColorBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + var0 = new Vec3D(-0.7F, 1.0F, 0.2F); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, setColorBuffer(var0.xCoord, var0.yCoord, var0.zCoord, 0.0F)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, setColorBuffer(0.5F, 0.5F, 0.5F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, setColorBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, setColorBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, setColorBuffer(0.5F, 0.5F, 0.5F, 1.0F)); + } + + private static FloatBuffer setColorBuffer(float var0, float var1, float var2, float var3) { + colorBuffer.clear(); + colorBuffer.put(var0).put(var1).put(var2).put(var3); + colorBuffer.flip(); + return colorBuffer; + } +} diff --git a/src/teavm/java/net/minecraft/client/Session.java b/src/teavm/java/net/minecraft/client/Session.java new file mode 100644 index 0000000..1d29ca9 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/Session.java @@ -0,0 +1,63 @@ +package net.minecraft.client; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.game.level.block.Block; + +public final class Session { + public static List registeredBlocksList; + public String username; + public String sessionId; + + public Session(String var1, String var2) { + this.username = var1; + this.sessionId = var2; + } + + static { + (registeredBlocksList = new ArrayList()).add(Block.stone); + registeredBlocksList.add(Block.cobblestone); + registeredBlocksList.add(Block.brick); + registeredBlocksList.add(Block.dirt); + registeredBlocksList.add(Block.planks); + registeredBlocksList.add(Block.wood); + registeredBlocksList.add(Block.leaves); + registeredBlocksList.add(Block.torch); + registeredBlocksList.add(Block.stairSingle); + registeredBlocksList.add(Block.glass); + registeredBlocksList.add(Block.cobblestoneMossy); + registeredBlocksList.add(Block.sapling); + registeredBlocksList.add(Block.plantYellow); + registeredBlocksList.add(Block.plantRed); + registeredBlocksList.add(Block.mushroomBrown); + registeredBlocksList.add(Block.mushroomRed); + registeredBlocksList.add(Block.sand); + registeredBlocksList.add(Block.gravel); + registeredBlocksList.add(Block.sponge); + registeredBlocksList.add(Block.clothRed); + registeredBlocksList.add(Block.clothOrange); + registeredBlocksList.add(Block.clothYellow); + registeredBlocksList.add(Block.clothChartreuse); + registeredBlocksList.add(Block.clothGreen); + registeredBlocksList.add(Block.clothSpringGreen); + registeredBlocksList.add(Block.clothCyan); + registeredBlocksList.add(Block.clothCapri); + registeredBlocksList.add(Block.clothUltramarine); + registeredBlocksList.add(Block.clothViolet); + registeredBlocksList.add(Block.clothPurple); + registeredBlocksList.add(Block.clothMagenta); + registeredBlocksList.add(Block.clothRose); + registeredBlocksList.add(Block.clothDarkGray); + registeredBlocksList.add(Block.clothGray); + registeredBlocksList.add(Block.clothWhite); + registeredBlocksList.add(Block.oreCoal); + registeredBlocksList.add(Block.oreIron); + registeredBlocksList.add(Block.oreGold); + registeredBlocksList.add(Block.blockSteel); + registeredBlocksList.add(Block.blockGold); + registeredBlocksList.add(Block.bookShelf); + registeredBlocksList.add(Block.tnt); + registeredBlocksList.add(Block.obsidian); + System.out.println(registeredBlocksList.size()); + } +} diff --git a/src/teavm/java/net/minecraft/client/ThreadSleepForever.java b/src/teavm/java/net/minecraft/client/ThreadSleepForever.java new file mode 100644 index 0000000..e2e9fae --- /dev/null +++ b/src/teavm/java/net/minecraft/client/ThreadSleepForever.java @@ -0,0 +1,18 @@ +package net.minecraft.client; + +final class ThreadSleepForever extends Thread { + ThreadSleepForever(Minecraft var1, String var2) { + super(var2); + this.setDaemon(true); + this.start(); + } + + public final void run() { + while(true) { + try { + Thread.sleep(2147483647L); + } catch (InterruptedException var1) { + } + } + } +} diff --git a/src/teavm/java/net/minecraft/client/Timer.java b/src/teavm/java/net/minecraft/client/Timer.java new file mode 100644 index 0000000..53a7ec1 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/Timer.java @@ -0,0 +1,55 @@ +package net.minecraft.client; + +public final class Timer { + float ticksPerSecond = 20.0F; + private double lastHRTime; + public int elapsedTicks; + public float renderPartialTicks; + private float timerSpeed = 1.0F; + private float elapsedPartialTicks = 0.0F; + private long lastSyncSysClock = System.currentTimeMillis(); + private long lastSyncHRClock = System.nanoTime() / 1000000L; + private double timeSyncAdjustment = 1.0D; + + public Timer(float var1) { + } + + public final void updateTimer() { + long var1 = System.currentTimeMillis(); + long var3 = var1 - this.lastSyncSysClock; + long var5 = System.nanoTime() / 1000000L; + double var9; + if(var3 > 1000L) { + long var7 = var5 - this.lastSyncHRClock; + var9 = (double)var3 / (double)var7; + this.timeSyncAdjustment += (var9 - this.timeSyncAdjustment) * (double)0.2F; + this.lastSyncSysClock = var1; + this.lastSyncHRClock = var5; + } + + if(var3 < 0L) { + this.lastSyncSysClock = var1; + this.lastSyncHRClock = var5; + } + + double var11 = (double)var5 / 1000.0D; + var9 = (var11 - this.lastHRTime) * this.timeSyncAdjustment; + this.lastHRTime = var11; + if(var9 < 0.0D) { + var9 = 0.0D; + } + + if(var9 > 1.0D) { + var9 = 1.0D; + } + + this.elapsedPartialTicks = (float)((double)this.elapsedPartialTicks + var9 * (double)this.timerSpeed * (double)this.ticksPerSecond); + this.elapsedTicks = (int)this.elapsedPartialTicks; + this.elapsedPartialTicks -= (float)this.elapsedTicks; + if(this.elapsedTicks > 10) { + this.elapsedTicks = 10; + } + + this.renderPartialTicks = this.elapsedPartialTicks; + } +} diff --git a/src/teavm/java/net/minecraft/client/controller/PlayerController.java b/src/teavm/java/net/minecraft/client/controller/PlayerController.java new file mode 100644 index 0000000..7d07c3e --- /dev/null +++ b/src/teavm/java/net/minecraft/client/controller/PlayerController.java @@ -0,0 +1,58 @@ +package net.minecraft.client.controller; + +import net.minecraft.client.Minecraft; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public class PlayerController { + protected final Minecraft mc; + public boolean isInTestMode = false; + + public PlayerController(Minecraft var1) { + this.mc = var1; + } + + public void onWorldChange(World var1) { + } + + public void clickBlock(int var1, int var2, int var3) { + this.sendBlockRemoved(var1, var2, var3); + } + + public boolean sendBlockRemoved(int var1, int var2, int var3) { + this.mc.effectRenderer.addBlockDestroyEffects(var1, var2, var3); + World var4 = this.mc.theWorld; + Block var5 = Block.blocksList[var4.getBlockId(var1, var2, var3)]; + byte var6 = var4.getBlockMetadata(var1, var2, var3); + boolean var7 = var4.setBlockWithNotify(var1, var2, var3, 0); + if(var5 != null && var7) { + var5.onBlockDestroyedByPlayer(var4, var1, var2, var3, var6); + } + + return var7; + } + + public void sendBlockRemoving(int var1, int var2, int var3, int var4) { + } + + public void resetBlockRemoving() { + } + + public void setPartialTime(float var1) { + } + + public float getBlockReachDistance() { + return 5.0F; + } + + public void onUpdate() { + } + + public boolean shouldDrawHUD() { + return true; + } + + public void onRespawn(EntityPlayer var1) { + } +} diff --git a/src/teavm/java/net/minecraft/client/controller/PlayerControllerCreative.java b/src/teavm/java/net/minecraft/client/controller/PlayerControllerCreative.java new file mode 100644 index 0000000..7116dfa --- /dev/null +++ b/src/teavm/java/net/minecraft/client/controller/PlayerControllerCreative.java @@ -0,0 +1,42 @@ +package net.minecraft.client.controller; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.Session; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.MobSpawner; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public final class PlayerControllerCreative extends PlayerController { + private MobSpawner mobSpawner; + + private PlayerControllerCreative(Minecraft var1) { + super(var1); + } + + public final void onRespawn(EntityPlayer var1) { + for(int var2 = 0; var2 < 9; ++var2) { + if(var1.inventory.mainInventory[var2] == null) { + this.mc.thePlayer.inventory.mainInventory[var2] = new ItemStack(((Block)Session.registeredBlocksList.get(var2)).blockID); + } else { + this.mc.thePlayer.inventory.mainInventory[var2].stackSize = 1; + } + } + + } + + public final boolean shouldDrawHUD() { + return false; + } + + public final void onWorldChange(World var1) { + super.onWorldChange(var1); + var1.survivalWorld = false; + this.mobSpawner = new MobSpawner(var1); + } + + public final void onUpdate() { + this.mobSpawner.performSpawning(); + } +} diff --git a/src/teavm/java/net/minecraft/client/controller/PlayerControllerSP.java b/src/teavm/java/net/minecraft/client/controller/PlayerControllerSP.java new file mode 100644 index 0000000..ad20adf --- /dev/null +++ b/src/teavm/java/net/minecraft/client/controller/PlayerControllerSP.java @@ -0,0 +1,113 @@ +package net.minecraft.client.controller; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.MobSpawner; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.StepSound; + +public final class PlayerControllerSP extends PlayerController { + private int curBlockX = -1; + private int curBlockY = -1; + private int curBlockZ = -1; + private float curBlockDamage = 0.0F; + private float prevBlockDamage = 0.0F; + private float blockDestroySoundCounter = 0.0F; + private int blockHitWait = 0; + private MobSpawner mobSpawner; + + public PlayerControllerSP(Minecraft var1) { + super(var1); + } + + public final boolean sendBlockRemoved(int var1, int var2, int var3) { + int var4 = this.mc.theWorld.getBlockId(var1, var2, var3); + byte var5 = this.mc.theWorld.getBlockMetadata(var1, var2, var3); + boolean var6 = super.sendBlockRemoved(var1, var2, var3); + EntityPlayerSP var7 = this.mc.thePlayer; + ItemStack var9 = var7.inventory.getCurrentItem(); + if(var9 != null) { + Item.itemsList[var9.itemID].onBlockDestroyed(var9); + if(var9.stackSize == 0) { + this.mc.thePlayer.destroyCurrentEquippedItem(); + } + } + + if(var6 && this.mc.thePlayer.canHarvestBlock(Block.blocksList[var4])) { + Block.blocksList[var4].dropBlockAsItem(this.mc.theWorld, var1, var2, var3, var5); + } + + return var6; + } + + public final void clickBlock(int var1, int var2, int var3) { + int var4 = this.mc.theWorld.getBlockId(var1, var2, var3); + if(var4 > 0 && Block.blocksList[var4].blockStrength(this.mc.thePlayer) >= 1.0F) { + this.sendBlockRemoved(var1, var2, var3); + } + + } + + public final void resetBlockRemoving() { + this.curBlockDamage = 0.0F; + this.blockHitWait = 0; + } + + public final void sendBlockRemoving(int var1, int var2, int var3, int var4) { + if(this.blockHitWait > 0) { + --this.blockHitWait; + } else { + super.sendBlockRemoving(var1, var2, var3, var4); + if(var1 == this.curBlockX && var2 == this.curBlockY && var3 == this.curBlockZ) { + var4 = this.mc.theWorld.getBlockId(var1, var2, var3); + if(var4 != 0) { + Block var6 = Block.blocksList[var4]; + this.curBlockDamage += var6.blockStrength(this.mc.thePlayer); + + ++this.blockDestroySoundCounter; + if(this.curBlockDamage >= 1.0F) { + this.sendBlockRemoved(var1, var2, var3); + this.curBlockDamage = 0.0F; + this.prevBlockDamage = 0.0F; + this.blockDestroySoundCounter = 0.0F; + this.blockHitWait = 5; + } + + } + } else { + this.curBlockDamage = 0.0F; + this.prevBlockDamage = 0.0F; + this.blockDestroySoundCounter = 0.0F; + this.curBlockX = var1; + this.curBlockY = var2; + this.curBlockZ = var3; + } + } + } + + public final void setPartialTime(float var1) { + if(this.curBlockDamage <= 0.0F) { + this.mc.renderGlobal.damagePartialTime = 0.0F; + } else { + var1 = this.prevBlockDamage + (this.curBlockDamage - this.prevBlockDamage) * var1; + this.mc.renderGlobal.damagePartialTime = var1; + } + } + + public final float getBlockReachDistance() { + return 4.0F; + } + + public final void onWorldChange(World var1) { + super.onWorldChange(var1); + this.mobSpawner = new MobSpawner(var1); + } + + public final void onUpdate() { + this.prevBlockDamage = this.curBlockDamage; + this.mobSpawner.performSpawning(); + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EffectRenderer.java b/src/teavm/java/net/minecraft/client/effect/EffectRenderer.java new file mode 100644 index 0000000..6901e55 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EffectRenderer.java @@ -0,0 +1,163 @@ +package net.minecraft.client.effect; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import org.lwjgl.opengl.GL11; + +public final class EffectRenderer { + private World worldObj; + private List[] fxLayers = new List[3]; + private RenderEngine renderEngine; + private Random rand = new Random(); + + public EffectRenderer(World var1, RenderEngine var2) { + if(var1 != null) { + this.worldObj = var1; + } + + this.renderEngine = var2; + + for(int var3 = 0; var3 < 3; ++var3) { + this.fxLayers[var3] = new ArrayList(); + } + + } + + public final void addEffect(EntityFX var1) { + int var2 = var1.getFXLayer(); + this.fxLayers[var2].add(var1); + } + + public final void updateEffects() { + for(int var1 = 0; var1 < 3; ++var1) { + for(int var2 = 0; var2 < this.fxLayers[var1].size(); ++var2) { + EntityFX var3 = (EntityFX)this.fxLayers[var1].get(var2); + var3.onEntityUpdate(); + if(var3.isDead) { + this.fxLayers[var1].remove(var2--); + } + } + } + + } + + public final void renderParticles(Entity var1, float var2) { + float var3 = MathHelper.cos(var1.rotationYaw * (float)Math.PI / 180.0F); + float var4 = MathHelper.sin(var1.rotationYaw * (float)Math.PI / 180.0F); + float var5 = -var4 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F); + float var6 = var3 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F); + float var11 = MathHelper.cos(var1.rotationPitch * (float)Math.PI / 180.0F); + + for(int var7 = 0; var7 < 2; ++var7) { + if(this.fxLayers[var7].size() != 0) { + int var8 = 0; + if(var7 == 0) { + var8 = this.renderEngine.getTexture("/particles.png"); + } + + if(var7 == 1) { + var8 = this.renderEngine.getTexture("/terrain.png"); + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8); + Tessellator var12 = Tessellator.instance; + var12.startDrawingQuads(); + + for(int var9 = 0; var9 < this.fxLayers[var7].size(); ++var9) { + EntityFX var10 = (EntityFX)this.fxLayers[var7].get(var9); + var10.renderParticle(var12, var2, var3, var11, var4, var5, var6); + } + + var12.draw(); + } + } + + } + + public final void renderLitParticles(float var1) { + if(this.fxLayers[2].size() != 0) { + Tessellator var2 = Tessellator.instance; + + for(int var3 = 0; var3 < this.fxLayers[2].size(); ++var3) { + EntityFX var4 = (EntityFX)this.fxLayers[2].get(var3); + var4.renderParticle(var2, var1, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F); + } + + } + } + + public final void clearEffects(World var1) { + this.worldObj = var1; + + for(int var2 = 0; var2 < 3; ++var2) { + this.fxLayers[var2].clear(); + } + + } + + public final void addBlockDestroyEffects(int var1, int var2, int var3) { + int var4 = this.worldObj.getBlockId(var1, var2, var3); + if(var4 != 0) { + Block var11 = Block.blocksList[var4]; + + for(int var5 = 0; var5 < 4; ++var5) { + for(int var6 = 0; var6 < 4; ++var6) { + for(int var7 = 0; var7 < 4; ++var7) { + float var8 = (float)var1 + ((float)var5 + 0.5F) / 4.0F; + float var9 = (float)var2 + ((float)var6 + 0.5F) / 4.0F; + float var10 = (float)var3 + ((float)var7 + 0.5F) / 4.0F; + this.addEffect(new EntityDiggingFX(this.worldObj, var8, var9, var10, var8 - (float)var1 - 0.5F, var9 - (float)var2 - 0.5F, var10 - (float)var3 - 0.5F, var11)); + } + } + } + + } + } + + public final void addBlockHitEffects(int var1, int var2, int var3, int var4) { + int var5 = this.worldObj.getBlockId(var1, var2, var3); + if(var5 != 0) { + Block var9 = Block.blocksList[var5]; + float var6 = (float)var1 + this.rand.nextFloat() * (var9.maxX - var9.minX - 0.2F) + 0.1F + var9.minX; + float var7 = (float)var2 + this.rand.nextFloat() * (var9.maxY - var9.minY - 0.2F) + 0.1F + var9.minY; + float var8 = (float)var3 + this.rand.nextFloat() * (var9.maxZ - var9.minZ - 0.2F) + 0.1F + var9.minZ; + if(var4 == 0) { + var7 = (float)var2 + var9.minY - 0.1F; + } + + if(var4 == 1) { + var7 = (float)var2 + var9.maxY + 0.1F; + } + + if(var4 == 2) { + var8 = (float)var3 + var9.minZ - 0.1F; + } + + if(var4 == 3) { + var8 = (float)var3 + var9.maxZ + 0.1F; + } + + if(var4 == 4) { + var6 = (float)var1 + var9.minX - 0.1F; + } + + if(var4 == 5) { + var6 = (float)var1 + var9.maxX + 0.1F; + } + + this.addEffect((new EntityDiggingFX(this.worldObj, var6, var7, var8, 0.0F, 0.0F, 0.0F, var9)).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F)); + } + } + + public final String getStatistics() { + return "" + (this.fxLayers[0].size() + this.fxLayers[1].size() + this.fxLayers[2].size()); + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityBubbleFX.java b/src/teavm/java/net/minecraft/client/effect/EntityBubbleFX.java new file mode 100644 index 0000000..e1e6e76 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityBubbleFX.java @@ -0,0 +1,39 @@ +package net.minecraft.client.effect; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class EntityBubbleFX extends EntityFX { + public EntityBubbleFX(World var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super(var1, var2, var3, var4, var5, var6, var7); + this.particleRed = 1.0F; + this.particleGreen = 1.0F; + this.particleBlue = 1.0F; + this.particleTextureIndex = 32; + this.setSize(0.02F, 0.02F); + this.particleScale *= this.rand.nextFloat() * 0.6F + 0.2F; + this.motionX1 = var5 * 0.2F + (float)(Math.random() * 2.0D - 1.0D) * 0.02F; + this.motionY1 = var6 * 0.2F + (float)(Math.random() * 2.0D - 1.0D) * 0.02F; + this.motionZ1 = var7 * 0.2F + (float)(Math.random() * 2.0D - 1.0D) * 0.02F; + this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY1 = (float)((double)this.motionY1 + 0.002D); + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.85F; + this.motionY1 *= 0.85F; + this.motionZ1 *= 0.85F; + if(this.worldObj.getBlockMaterial((int)this.posX, (int)this.posY, (int)this.posZ) != Material.water) { + this.setEntityDead(); + } + + if(this.particleMaxAge-- <= 0) { + this.setEntityDead(); + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityDiggingFX.java b/src/teavm/java/net/minecraft/client/effect/EntityDiggingFX.java new file mode 100644 index 0000000..9f0fb23 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityDiggingFX.java @@ -0,0 +1,36 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public final class EntityDiggingFX extends EntityFX { + public EntityDiggingFX(World var1, float var2, float var3, float var4, float var5, float var6, float var7, Block var8) { + super(var1, var2, var3, var4, var5, var6, var7); + this.particleTextureIndex = var8.blockIndexInTexture; + this.particleGravity = var8.blockParticleGravity; + this.particleRed = this.particleGreen = this.particleBlue = 0.6F; + this.particleScale /= 2.0F; + } + + public final int getFXLayer() { + return 1; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)(this.particleTextureIndex % 16) + this.particleTextureJitterX / 4.0F) / 16.0F; + float var9 = var8 + 0.999F / 64.0F; + float var10 = ((float)(this.particleTextureIndex / 16) + this.particleTextureJitterY / 4.0F) / 16.0F; + float var11 = var10 + 0.999F / 64.0F; + float var12 = 0.1F * this.particleScale; + float var13 = this.prevPosX + (this.posX - this.prevPosX) * var2; + float var14 = this.prevPosY + (this.posY - this.prevPosY) * var2; + float var15 = this.prevPosZ + (this.posZ - this.prevPosZ) * var2; + var2 = this.getEntityBrightness(var2); + var1.setColorOpaque_F(var2 * this.particleRed, var2 * this.particleGreen, var2 * this.particleBlue); + var1.addVertexWithUV(var13 - var3 * var12 - var6 * var12, var14 - var4 * var12, var15 - var5 * var12 - var7 * var12, var8, var11); + var1.addVertexWithUV(var13 - var3 * var12 + var6 * var12, var14 + var4 * var12, var15 - var5 * var12 + var7 * var12, var8, var10); + var1.addVertexWithUV(var13 + var3 * var12 + var6 * var12, var14 + var4 * var12, var15 + var5 * var12 + var7 * var12, var9, var10); + var1.addVertexWithUV(var13 + var3 * var12 - var6 * var12, var14 - var4 * var12, var15 + var5 * var12 - var7 * var12, var9, var11); + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityExplodeFX.java b/src/teavm/java/net/minecraft/client/effect/EntityExplodeFX.java new file mode 100644 index 0000000..3305643 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityExplodeFX.java @@ -0,0 +1,41 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; + +public final class EntityExplodeFX extends EntityFX { + public EntityExplodeFX(World var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super(var1, var2, var3, var4, var5, var6, var7); + this.motionX1 = var5 + (float)(Math.random() * 2.0D - 1.0D) * 0.05F; + this.motionY1 = var6 + (float)(Math.random() * 2.0D - 1.0D) * 0.05F; + this.motionZ1 = var7 + (float)(Math.random() * 2.0D - 1.0D) * 0.05F; + this.particleRed = this.particleGreen = this.particleBlue = this.rand.nextFloat() * 0.3F + 0.7F; + this.particleScale = this.rand.nextFloat() * this.rand.nextFloat() * 6.0F + 1.0F; + this.particleMaxAge = (int)(16.0D / ((double)this.rand.nextFloat() * 0.8D + 0.2D)) + 2; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super.renderParticle(var1, var2, var3, var4, var5, var6, var7); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.particleAge++ >= this.particleMaxAge) { + this.setEntityDead(); + } + + this.particleTextureIndex = 7 - (this.particleAge << 3) / this.particleMaxAge; + this.motionY1 = (float)((double)this.motionY1 + 0.004D); + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.9F; + this.motionY1 *= 0.9F; + this.motionZ1 *= 0.9F; + if(this.onGround) { + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityFX.java b/src/teavm/java/net/minecraft/client/effect/EntityFX.java new file mode 100644 index 0000000..a567483 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityFX.java @@ -0,0 +1,109 @@ +package net.minecraft.client.effect; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; + +public class EntityFX extends Entity { + protected float motionX1; + protected float motionY1; + protected float motionZ1; + protected int particleTextureIndex; + protected float particleTextureJitterX; + protected float particleTextureJitterY; + protected int particleAge = 0; + protected int particleMaxAge = 0; + protected float particleScale; + protected float particleGravity; + protected float particleRed; + protected float particleGreen; + protected float particleBlue; + + public EntityFX(World var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super(var1); + this.setSize(0.2F, 0.2F); + this.yOffset = this.height / 2.0F; + this.setPosition(var2, var3, var4); + this.particleRed = this.particleGreen = this.particleBlue = 1.0F; + this.motionX1 = var5 + (float)(Math.random() * 2.0D - 1.0D) * 0.4F; + this.motionY1 = var6 + (float)(Math.random() * 2.0D - 1.0D) * 0.4F; + this.motionZ1 = var7 + (float)(Math.random() * 2.0D - 1.0D) * 0.4F; + float var8 = (float)(Math.random() + Math.random() + 1.0D) * 0.15F; + var2 = MathHelper.sqrt_float(this.motionX1 * this.motionX1 + this.motionY1 * this.motionY1 + this.motionZ1 * this.motionZ1); + this.motionX1 = this.motionX1 / var2 * var8 * 0.4F; + this.motionY1 = this.motionY1 / var2 * var8 * 0.4F + 0.1F; + this.motionZ1 = this.motionZ1 / var2 * var8 * 0.4F; + this.particleTextureJitterX = this.rand.nextFloat() * 3.0F; + this.particleTextureJitterY = this.rand.nextFloat() * 3.0F; + this.particleScale = (this.rand.nextFloat() * 0.5F + 0.5F) * 2.0F; + this.particleMaxAge = (int)(4.0F / (this.rand.nextFloat() * 0.9F + 0.1F)); + this.particleAge = 0; + this.canTriggerWalking = false; + } + + public final EntityFX multiplyVelocity(float var1) { + this.motionX1 *= 0.2F; + this.motionY1 = (this.motionY1 - 0.1F) * 0.2F + 0.1F; + this.motionZ1 *= 0.2F; + return this; + } + + public final EntityFX multipleParticleScaleBy(float var1) { + this.setSize(0.120000005F, 0.120000005F); + this.particleScale *= 0.6F; + return this; + } + + public void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.particleAge++ >= this.particleMaxAge) { + this.setEntityDead(); + } + + this.motionY1 = (float)((double)this.motionY1 - 0.04D * (double)this.particleGravity); + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.98F; + this.motionY1 *= 0.98F; + this.motionZ1 *= 0.98F; + if(this.onGround) { + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + } + + public void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = (float)(this.particleTextureIndex % 16) / 16.0F; + float var9 = var8 + 0.999F / 16.0F; + float var10 = (float)(this.particleTextureIndex / 16) / 16.0F; + float var11 = var10 + 0.999F / 16.0F; + float var12 = 0.1F * this.particleScale; + float var13 = this.prevPosX + (this.posX - this.prevPosX) * var2; + float var14 = this.prevPosY + (this.posY - this.prevPosY) * var2; + float var15 = this.prevPosZ + (this.posZ - this.prevPosZ) * var2; + var2 = this.getEntityBrightness(var2); + var1.setColorOpaque_F(this.particleRed * var2, this.particleGreen * var2, this.particleBlue * var2); + var1.addVertexWithUV(var13 - var3 * var12 - var6 * var12, var14 - var4 * var12, var15 - var5 * var12 - var7 * var12, var8, var11); + var1.addVertexWithUV(var13 - var3 * var12 + var6 * var12, var14 + var4 * var12, var15 - var5 * var12 + var7 * var12, var8, var10); + var1.addVertexWithUV(var13 + var3 * var12 + var6 * var12, var14 + var4 * var12, var15 + var5 * var12 + var7 * var12, var9, var10); + var1.addVertexWithUV(var13 + var3 * var12 - var6 * var12, var14 - var4 * var12, var15 + var5 * var12 - var7 * var12, var9, var11); + } + + public int getFXLayer() { + return 0; + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + } + + protected final String getEntityString() { + return null; + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityFlameFX.java b/src/teavm/java/net/minecraft/client/effect/EntityFlameFX.java new file mode 100644 index 0000000..bfe55f2 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityFlameFX.java @@ -0,0 +1,65 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; + +public final class EntityFlameFX extends EntityFX { + private float flameScale; + + public EntityFlameFX(World var1, float var2, float var3, float var4) { + super(var1, var2, var3, var4, 0.0F, 0.0F, 0.0F); + this.motionX1 *= 0.01F; + this.motionY1 *= 0.01F; + this.motionZ1 *= 0.01F; + this.rand.nextFloat(); + this.rand.nextFloat(); + this.rand.nextFloat(); + this.rand.nextFloat(); + this.rand.nextFloat(); + this.rand.nextFloat(); + this.flameScale = this.particleScale; + this.particleRed = this.particleGreen = this.particleBlue = 1.0F; + this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)) + 4; + this.noClip = true; + this.particleTextureIndex = 48; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.particleAge + var2) / (float)this.particleMaxAge; + this.particleScale = this.flameScale * (1.0F - var8 * var8 * 0.5F); + super.renderParticle(var1, var2, var3, var4, var5, var6, var7); + } + + public final float getEntityBrightness(float var1) { + float var2 = ((float)this.particleAge + var1) / (float)this.particleMaxAge; + if(var2 < 0.0F) { + var2 = 0.0F; + } + + if(var2 > 1.0F) { + var2 = 1.0F; + } + + var1 = super.getEntityBrightness(var1); + return var1 * var2 + (1.0F - var2); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.particleAge++ >= this.particleMaxAge) { + this.setEntityDead(); + } + + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.96F; + this.motionY1 *= 0.96F; + this.motionZ1 *= 0.96F; + if(this.onGround) { + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityLavaFX.java b/src/teavm/java/net/minecraft/client/effect/EntityLavaFX.java new file mode 100644 index 0000000..06aed98 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityLavaFX.java @@ -0,0 +1,57 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; + +public final class EntityLavaFX extends EntityFX { + private float lavaParticleScale; + + public EntityLavaFX(World var1, float var2, float var3, float var4) { + super(var1, var2, var3, var4, 0.0F, 0.0F, 0.0F); + this.motionX1 *= 0.8F; + this.motionY1 *= 0.8F; + this.motionZ1 *= 0.8F; + this.motionY1 = this.rand.nextFloat() * 0.4F + 0.05F; + this.particleRed = this.particleGreen = this.particleBlue = 1.0F; + this.particleScale *= this.rand.nextFloat() * 2.0F + 0.2F; + this.lavaParticleScale = this.particleScale; + this.particleMaxAge = (int)(16.0D / (Math.random() * 0.8D + 0.2D)); + this.noClip = false; + this.particleTextureIndex = 49; + } + + public final float getEntityBrightness(float var1) { + return 1.0F; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.particleAge + var2) / (float)this.particleMaxAge; + this.particleScale = this.lavaParticleScale * (1.0F - var8 * var8); + super.renderParticle(var1, var2, var3, var4, var5, var6, var7); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.particleAge++ >= this.particleMaxAge) { + this.setEntityDead(); + } + + float var1 = (float)this.particleAge / (float)this.particleMaxAge; + if(this.rand.nextFloat() > var1) { + this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, this.motionX1, this.motionY1, this.motionZ1); + } + + this.motionY1 = (float)((double)this.motionY1 - 0.03D); + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.999F; + this.motionY1 *= 0.999F; + this.motionZ1 *= 0.999F; + if(this.onGround) { + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityPickupFX.java b/src/teavm/java/net/minecraft/client/effect/EntityPickupFX.java new file mode 100644 index 0000000..69baa88 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityPickupFX.java @@ -0,0 +1,53 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.entity.RenderManager; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.level.World; +import org.lwjgl.opengl.GL11; + +public final class EntityPickupFX extends EntityFX { + private Entity entityToPickUp; + private EntityLiving entityPickingUp; + private int age = 0; + private int maxAge = 0; + private float yOffs; + + public EntityPickupFX(World var1, Entity var2, EntityLiving var3, float var4) { + super(var1, var2.posX, var2.posY, var2.posZ, var2.motionX, var2.motionY, var2.motionZ); + this.entityToPickUp = var2; + this.entityPickingUp = var3; + this.maxAge = 3; + this.yOffs = -0.5F; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var9 = ((float)this.age + var2) / (float)this.maxAge; + var9 *= var9; + var3 = this.entityToPickUp.posX; + var4 = this.entityToPickUp.posY; + var5 = this.entityToPickUp.posZ; + var6 = this.entityPickingUp.lastTickPosX + (this.entityPickingUp.posX - this.entityPickingUp.lastTickPosX) * var2; + var7 = this.entityPickingUp.lastTickPosY + (this.entityPickingUp.posY - this.entityPickingUp.lastTickPosY) * var2 + this.yOffs; + float var8 = this.entityPickingUp.lastTickPosZ + (this.entityPickingUp.posZ - this.entityPickingUp.lastTickPosZ) * var2; + var3 += (var6 - var3) * var9; + var4 += (var7 - var4) * var9; + var9 = var5 + (var8 - var5) * var9; + var5 = this.worldObj.getLightBrightness((int)var3, (int)var4, (int)var9); + GL11.glColor4f(var5, var5, var5, 1.0F); + RenderManager.instance.renderEntityWithPosYaw(this.entityToPickUp, var3, var4, var9, this.entityToPickUp.rotationYaw, var2); + } + + public final void onEntityUpdate() { + ++this.age; + if(this.age == this.maxAge) { + this.setEntityDead(); + } + + } + + public final int getFXLayer() { + return 2; + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntityRainFX.java b/src/teavm/java/net/minecraft/client/effect/EntityRainFX.java new file mode 100644 index 0000000..dcb392d --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntityRainFX.java @@ -0,0 +1,54 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public class EntityRainFX extends EntityFX { + public EntityRainFX(World var1, float var2, float var3, float var4) { + super(var1, var2, var3, var4, 0.0F, 0.0F, 0.0F); + this.motionX1 *= 0.3F; + this.motionY1 = (float)Math.random() * 0.2F + 0.1F; + this.motionZ1 *= 0.3F; + this.particleRed = 1.0F; + this.particleGreen = 1.0F; + this.particleBlue = 1.0F; + this.particleTextureIndex = 16; + this.setSize(0.01F, 0.01F); + this.particleGravity = 0.06F; + this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + super.renderParticle(var1, var2, var3, var4, var5, var6, var7); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY1 -= this.particleGravity; + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + this.motionX1 *= 0.98F; + this.motionY1 *= 0.98F; + this.motionZ1 *= 0.98F; + if(this.particleMaxAge-- <= 0) { + this.setEntityDead(); + } + + if(this.onGround) { + if(Math.random() < 0.5D) { + this.setEntityDead(); + } + + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + Material var1 = this.worldObj.getBlockMaterial((int)this.posX, (int)this.posY, (int)this.posZ); + if(var1.getIsLiquid() || var1.isSolid()) { + this.setEntityDead(); + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntitySmokeFX.java b/src/teavm/java/net/minecraft/client/effect/EntitySmokeFX.java new file mode 100644 index 0000000..3555004 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntitySmokeFX.java @@ -0,0 +1,66 @@ +package net.minecraft.client.effect; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.level.World; + +public final class EntitySmokeFX extends EntityFX { + private float smokeParticleScale; + + public EntitySmokeFX(World var1, float var2, float var3, float var4) { + this(var1, var2, var3, var4, 1.0F); + } + + public EntitySmokeFX(World var1, float var2, float var3, float var4, float var5) { + super(var1, var2, var3, var4, 0.0F, 0.0F, 0.0F); + this.motionX1 *= 0.1F; + this.motionY1 *= 0.1F; + this.motionZ1 *= 0.1F; + this.particleRed = this.particleGreen = this.particleBlue = (float)(Math.random() * (double)0.3F); + this.particleScale *= 12.0F / 16.0F; + this.particleScale *= var5; + this.smokeParticleScale = this.particleScale; + this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); + this.particleMaxAge = (int)((float)this.particleMaxAge * var5); + this.noClip = false; + } + + public final void renderParticle(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = ((float)this.particleAge + var2) / (float)this.particleMaxAge * 32.0F; + if(var8 < 0.0F) { + var8 = 0.0F; + } + + if(var8 > 1.0F) { + var8 = 1.0F; + } + + this.particleScale = this.smokeParticleScale * var8; + super.renderParticle(var1, var2, var3, var4, var5, var6, var7); + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if(this.particleAge++ >= this.particleMaxAge) { + this.setEntityDead(); + } + + this.particleTextureIndex = 7 - (this.particleAge << 3) / this.particleMaxAge; + this.motionY1 = (float)((double)this.motionY1 + 0.004D); + this.moveEntity(this.motionX1, this.motionY1, this.motionZ1); + if(this.posY == this.prevPosY) { + this.motionX1 = (float)((double)this.motionX1 * 1.1D); + this.motionZ1 = (float)((double)this.motionZ1 * 1.1D); + } + + this.motionX1 *= 0.96F; + this.motionY1 *= 0.96F; + this.motionZ1 *= 0.96F; + if(this.onGround) { + this.motionX1 *= 0.7F; + this.motionZ1 *= 0.7F; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/effect/EntitySplashFX.java b/src/teavm/java/net/minecraft/client/effect/EntitySplashFX.java new file mode 100644 index 0000000..dd4bbf1 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/effect/EntitySplashFX.java @@ -0,0 +1,11 @@ +package net.minecraft.client.effect; + +import net.minecraft.game.level.World; + +public final class EntitySplashFX extends EntityRainFX { + public EntitySplashFX(World var1, float var2, float var3, float var4) { + super(var1, var2, var3, var4); + this.particleGravity = 0.04F; + ++this.particleTextureIndex; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/FilenameFilterLevel.java b/src/teavm/java/net/minecraft/client/gui/FilenameFilterLevel.java new file mode 100644 index 0000000..f4b2822 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/FilenameFilterLevel.java @@ -0,0 +1,13 @@ +package net.minecraft.client.gui; + +import java.io.File; +import java.io.FilenameFilter; + +final class FilenameFilterLevel implements FilenameFilter { + FilenameFilterLevel(GuiLevelDialog var1) { + } + + public final boolean accept(File var1, String var2) { + return var2.toLowerCase().endsWith(".mclevel"); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/FontRenderer.java b/src/teavm/java/net/minecraft/client/gui/FontRenderer.java new file mode 100644 index 0000000..cde674c --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/FontRenderer.java @@ -0,0 +1,179 @@ +package net.minecraft.client.gui; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.IntBuffer; +import javax.imageio.ImageIO; +import net.minecraft.client.GameSettings; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.Tessellator; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +public final class FontRenderer { + private int[] charWidth = new int[256]; + private int fontTextureName = 0; + private int fontDisplayLists; + private IntBuffer buffer = BufferUtils.createIntBuffer(1024); + + public FontRenderer(GameSettings var1, String var2, RenderEngine var3) { + BufferedImage var4; + try { + var4 = ImageIO.read(RenderEngine.class.getResourceAsStream(var2)); + } catch (IOException var15) { + throw new RuntimeException(var15); + } + + int var5 = var4.getWidth(); + int var6 = var4.getHeight(); + int[] var7 = new int[var5 * var6]; + var4.getRGB(0, 0, var5, var6, var7, 0, var5); + + int var8; + int var9; + int var11; + int var13; + int var14; + for(int var17 = 0; var17 < 128; ++var17) { + var6 = var17 % 16; + var8 = var17 / 16; + var9 = 0; + + for(boolean var10 = false; var9 < 8 && !var10; ++var9) { + var11 = (var6 << 3) + var9; + var10 = true; + + for(int var12 = 0; var12 < 8 && var10; ++var12) { + var13 = ((var8 << 3) + var12) * var5; + var14 = var7[var11 + var13] & 255; + if(var14 > 128) { + var10 = false; + } + } + } + + if(var17 == 32) { + var9 = 4; + } + + this.charWidth[var17] = var9; + } + + this.fontTextureName = var3.getTexture(var2); + this.fontDisplayLists = GL11.glGenLists(288); + Tessellator var18 = Tessellator.instance; + + for(var6 = 0; var6 < 256; ++var6) { + GL11.glNewList(this.fontDisplayLists + var6, GL11.GL_COMPILE); + var18.startDrawingQuads(); + var8 = var6 % 16 << 3; + var9 = var6 / 16 << 3; + var18.addVertexWithUV(0.0F, 7.99F, 0.0F, (float)var8 / 128.0F, ((float)var9 + 7.99F) / 128.0F); + var18.addVertexWithUV(7.99F, 7.99F, 0.0F, ((float)var8 + 7.99F) / 128.0F, ((float)var9 + 7.99F) / 128.0F); + var18.addVertexWithUV(7.99F, 0.0F, 0.0F, ((float)var8 + 7.99F) / 128.0F, (float)var9 / 128.0F); + var18.addVertexWithUV(0.0F, 0.0F, 0.0F, (float)var8 / 128.0F, (float)var9 / 128.0F); + var18.draw(); + GL11.glTranslatef((float)this.charWidth[var6], 0.0F, 0.0F); + GL11.glEndList(); + } + + for(var6 = 0; var6 < 32; ++var6) { + var8 = (var6 & 8) << 3; + var9 = (var6 & 1) * 191 + var8; + int var19 = ((var6 & 2) >> 1) * 191 + var8; + var11 = ((var6 & 4) >> 2) * 191 + var8; + boolean var20 = var6 >= 16; + if(var1.anaglyph) { + var13 = (var11 * 30 + var19 * 59 + var9 * 11) / 100; + var14 = (var11 * 30 + var19 * 70) / 100; + int var16 = (var11 * 30 + var9 * 70) / 100; + var11 = var13; + var19 = var14; + var9 = var16; + } + + var6 += 2; + if(var20) { + var11 /= 4; + var19 /= 4; + var9 /= 4; + } + + GL11.glColor4f((float)var11 / 255.0F, (float)var19 / 255.0F, (float)var9 / 255.0F, 1.0F); + } + + } + + public final void drawStringWithShadow(String var1, int var2, int var3, int var4) { + this.renderString(var1, var2 + 1, var3 + 1, var4, true); + this.drawString(var1, var2, var3, var4); + } + + public final void drawString(String var1, int var2, int var3, int var4) { + this.renderString(var1, var2, var3, var4, false); + } + + private void renderString(String var1, int var2, int var3, int var4, boolean var5) { + if(var1 != null) { + char[] var8 = var1.toCharArray(); + if(var5) { + var4 = (var4 & 16579836) >> 2; + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.fontTextureName); + float var6 = (float)(var4 >> 16 & 255) / 255.0F; + float var7 = (float)(var4 >> 8 & 255) / 255.0F; + float var9 = (float)(var4 & 255) / 255.0F; + GL11.glColor4f(var6, var7, var9, 1.0F); + this.buffer.clear(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var2, (float)var3, 0.0F); + + for(int var10 = 0; var10 < var8.length; ++var10) { + for(; var8[var10] == 38 && var8.length > var10 + 1; var10 += 2) { + int var11 = "0123456789abcdef".indexOf(var8[var10 + 1]); + if(var11 < 0 || var11 > 15) { + var11 = 15; + } + + this.buffer.put(this.fontDisplayLists + 256 + var11 + (var5 ? 16 : 0)); + if(this.buffer.remaining() == 0) { + this.buffer.flip(); + GL11.glCallLists(this.buffer); + this.buffer.clear(); + } + } + + this.buffer.put(this.fontDisplayLists + var8[var10]); + if(this.buffer.remaining() == 0) { + this.buffer.flip(); + GL11.glCallLists(this.buffer); + this.buffer.clear(); + } + } + + this.buffer.flip(); + GL11.glCallLists(this.buffer); + GL11.glPopMatrix(); + } + } + + public final int getStringWidth(String var1) { + if(var1 == null) { + return 0; + } else { + char[] var4 = var1.toCharArray(); + int var2 = 0; + + for(int var3 = 0; var3 < var4.length; ++var3) { + if(var4[var3] == 38) { + ++var3; + } else { + var2 += this.charWidth[var4[var3]]; + } + } + + return var2; + } + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/Gui.java b/src/teavm/java/net/minecraft/client/gui/Gui.java new file mode 100644 index 0000000..90ec7ed --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/Gui.java @@ -0,0 +1,73 @@ +package net.minecraft.client.gui; + +import net.minecraft.client.render.Tessellator; +import org.lwjgl.opengl.GL11; + +public class Gui { + protected float zLevel = 0.0F; + + protected static void drawRect(int var0, int var1, int var2, int var3, int var4) { + float var5 = (float)(var4 >>> 24) / 255.0F; + float var6 = (float)(var4 >> 16 & 255) / 255.0F; + float var7 = (float)(var4 >> 8 & 255) / 255.0F; + float var9 = (float)(var4 & 255) / 255.0F; + Tessellator var8 = Tessellator.instance; + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(var6, var7, var9, var5); + var8.startDrawingQuads(); + var8.addVertex((float)var0, (float)var3, 0.0F); + var8.addVertex((float)var2, (float)var3, 0.0F); + var8.addVertex((float)var2, (float)var1, 0.0F); + var8.addVertex((float)var0, (float)var1, 0.0F); + var8.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + } + + protected static void drawGradientRect(int var0, int var1, int var2, int var3, int var4, int var5) { + float var6 = (float)(var4 >>> 24) / 255.0F; + float var7 = (float)(var4 >> 16 & 255) / 255.0F; + float var8 = (float)(var4 >> 8 & 255) / 255.0F; + float var13 = (float)(var4 & 255) / 255.0F; + float var9 = (float)(var5 >>> 24) / 255.0F; + float var10 = (float)(var5 >> 16 & 255) / 255.0F; + float var11 = (float)(var5 >> 8 & 255) / 255.0F; + float var14 = (float)(var5 & 255) / 255.0F; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + Tessellator var12 = Tessellator.instance; + var12.startDrawingQuads(); + var12.setColorRGBA_F(var7, var8, var13, var6); + var12.addVertex((float)var2, (float)var1, 0.0F); + var12.addVertex((float)var0, (float)var1, 0.0F); + var12.setColorRGBA_F(var10, var11, var14, var9); + var12.addVertex((float)var0, (float)var3, 0.0F); + var12.addVertex((float)var2, (float)var3, 0.0F); + var12.draw(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public static void drawCenteredString(FontRenderer var0, String var1, int var2, int var3, int var4) { + var0.drawStringWithShadow(var1, var2 - var0.getStringWidth(var1) / 2, var3, var4); + } + + public static void drawString(FontRenderer var0, String var1, int var2, int var3, int var4) { + var0.drawStringWithShadow(var1, var2, var3, var4); + } + + public final void drawTexturedModalRect(int var1, int var2, int var3, int var4, int var5, int var6) { + Tessellator var7 = Tessellator.instance; + var7.startDrawingQuads(); + var7.addVertexWithUV((float)var1, (float)(var2 + var6), this.zLevel, (float)var3 * 0.00390625F, (float)(var4 + var6) * 0.00390625F); + var7.addVertexWithUV((float)(var1 + var5), (float)(var2 + var6), this.zLevel, (float)(var3 + var5) * 0.00390625F, (float)(var4 + var6) * 0.00390625F); + var7.addVertexWithUV((float)(var1 + var5), (float)var2, this.zLevel, (float)(var3 + var5) * 0.00390625F, (float)var4 * 0.00390625F); + var7.addVertexWithUV((float)var1, (float)var2, this.zLevel, (float)var3 * 0.00390625F, (float)var4 * 0.00390625F); + var7.draw(); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiButton.java b/src/teavm/java/net/minecraft/client/gui/GuiButton.java new file mode 100644 index 0000000..1a85271 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiButton.java @@ -0,0 +1,61 @@ +package net.minecraft.client.gui; + +import net.minecraft.client.Minecraft; +import org.lwjgl.opengl.GL11; + +public class GuiButton extends Gui { + private int width; + private int height; + private int xPosition; + private int yPosition; + public String displayString; + public int id; + public boolean enabled; + public boolean visible; + + public GuiButton(int var1, int var2, int var3, String var4) { + this(var1, var2, var3, 200, 20, var4); + } + + protected GuiButton(int var1, int var2, int var3, int var4, int var5, String var6) { + this.width = 200; + this.height = 20; + this.enabled = true; + this.visible = true; + this.id = var1; + this.xPosition = var2; + this.yPosition = var3; + this.width = var4; + this.height = 20; + this.displayString = var6; + } + + public final void drawButton(Minecraft var1, int var2, int var3) { + if(this.visible) { + FontRenderer var4 = var1.fontRenderer; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.renderEngine.getTexture("/gui/gui.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + byte var5 = 1; + boolean var6 = var2 >= this.xPosition && var3 >= this.yPosition && var2 < this.xPosition + this.width && var3 < this.yPosition + this.height; + if(!this.enabled) { + var5 = 0; + } else if(var6) { + var5 = 2; + } + + this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 46 + var5 * 20, this.width / 2, this.height); + this.drawTexturedModalRect(this.xPosition + this.width / 2, this.yPosition, 200 - this.width / 2, 46 + var5 * 20, this.width / 2, this.height); + if(!this.enabled) { + drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, -6250336); + } else if(var6) { + drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 16777120); + } else { + drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 14737632); + } + } + } + + public final boolean mousePressed(int var1, int var2) { + return this.enabled && var1 >= this.xPosition && var2 >= this.yPosition && var1 < this.xPosition + this.width && var2 < this.yPosition + this.height; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiControls.java b/src/teavm/java/net/minecraft/client/gui/GuiControls.java new file mode 100644 index 0000000..afeb250 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiControls.java @@ -0,0 +1,52 @@ +package net.minecraft.client.gui; + +import net.minecraft.client.GameSettings; + +public final class GuiControls extends GuiScreen { + private GuiScreen parentScreen; + private String screenTitle = "Controls"; + private GameSettings options; + private int buttonId = -1; + + public GuiControls(GuiScreen var1, GameSettings var2) { + this.parentScreen = var1; + this.options = var2; + } + + public final void initGui() { + for(int var1 = 0; var1 < this.options.keyBindings.length; ++var1) { + this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.setKeyBindingString(var1))); + } + + this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done")); + } + + protected final void actionPerformed(GuiButton var1) { + for(int var2 = 0; var2 < this.options.keyBindings.length; ++var2) { + ((GuiButton)this.controlList.get(var2)).displayString = this.options.setKeyBindingString(var2); + } + + if(var1.id == 200) { + this.mc.displayGuiScreen(this.parentScreen); + } else { + this.buttonId = var1.id; + var1.displayString = "> " + this.options.setKeyBindingString(var1.id) + " <"; + } + } + + protected final void keyTyped(char var1, int var2) { + if(this.buttonId >= 0) { + this.options.setKeyBinding(this.buttonId, var2); + ((GuiButton)this.controlList.get(this.buttonId)).displayString = this.options.setKeyBindingString(this.buttonId); + this.buttonId = -1; + } else { + super.keyTyped(var1, var2); + } + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiErrorScreen.java b/src/teavm/java/net/minecraft/client/gui/GuiErrorScreen.java new file mode 100644 index 0000000..7ee9c96 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiErrorScreen.java @@ -0,0 +1,24 @@ +package net.minecraft.client.gui; + +public final class GuiErrorScreen extends GuiScreen { + private String title; + private String text; + + public GuiErrorScreen(String var1, String var2) { + this.title = var1; + this.text = var2; + } + + public final void initGui() { + } + + public final void drawScreen(int var1, int var2, float var3) { + drawGradientRect(0, 0, this.width, this.height, -12574688, -11530224); + drawCenteredString(this.fontRenderer, this.title, this.width / 2, 90, 16777215); + drawCenteredString(this.fontRenderer, this.text, this.width / 2, 110, 16777215); + super.drawScreen(var1, var2, var3); + } + + protected final void keyTyped(char var1, int var2) { + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiGameOver.java b/src/teavm/java/net/minecraft/client/gui/GuiGameOver.java new file mode 100644 index 0000000..76e4428 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiGameOver.java @@ -0,0 +1,51 @@ +package net.minecraft.client.gui; + +import net.minecraft.client.player.EntityPlayerSP; +import org.lwjgl.opengl.GL11; + +public final class GuiGameOver extends GuiScreen { + public final void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 72, "Generate new level...")); + this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 96, "Load level..")); + if(this.mc.session == null) { + ((GuiButton)this.controlList.get(1)).enabled = false; + } + + } + + protected final void keyTyped(char var1, int var2) { + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiOptions(this, this.mc.options)); + } + + if(var1.id == 1) { + this.mc.displayGuiScreen(new GuiNewLevel(this)); + } + + if(this.mc.session != null && var1.id == 2) { + this.mc.displayGuiScreen(new GuiLoadLevel(this)); + } + + } + + public final void drawScreen(int var1, int var2, float var3) { + drawGradientRect(0, 0, this.width, this.height, 1615855616, -1602211792); + GL11.glPushMatrix(); + GL11.glScalef(2.0F, 2.0F, 2.0F); + drawCenteredString(this.fontRenderer, "Game over!", this.width / 2 / 2, 30, 16777215); + GL11.glPopMatrix(); + FontRenderer var10000 = this.fontRenderer; + StringBuilder var10001 = (new StringBuilder()).append("Score: &e"); + EntityPlayerSP var4 = this.mc.thePlayer; + drawCenteredString(var10000, var10001.append(var4.getScore).toString(), this.width / 2, 100, 16777215); + super.drawScreen(var1, var2, var3); + } + + public final boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiIngame.java b/src/teavm/java/net/minecraft/client/gui/GuiIngame.java new file mode 100644 index 0000000..3ec60ea --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiIngame.java @@ -0,0 +1,190 @@ +package net.minecraft.client.gui; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import net.minecraft.client.ChatLine; +import net.minecraft.client.Minecraft; +import net.minecraft.client.RenderHelper; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.client.render.entity.RenderItem; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public final class GuiIngame extends Gui { + private static RenderItem itemRenderer = new RenderItem(); + private List chatMessageList = new ArrayList(); + private Random rand = new Random(); + private Minecraft mc; + private int updateCounter = 0; + + public GuiIngame(Minecraft var1) { + this.mc = var1; + } + + public final void renderGameOverlay(float var1) { + ScaledResolution var2 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var3 = var2.getScaledWidth(); + int var19 = var2.getScaledHeight(); + FontRenderer var4 = this.mc.fontRenderer; + this.mc.entityRenderer.setupOverlayRendering(); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/gui.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_BLEND); + InventoryPlayer var5 = this.mc.thePlayer.inventory; + this.zLevel = -90.0F; + this.drawTexturedModalRect(var3 / 2 - 91, var19 - 22, 0, 0, 182, 22); + this.drawTexturedModalRect(var3 / 2 - 91 - 1 + var5.currentItem * 20, var19 - 22 - 1, 0, 22, 24, 22); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/icons.png")); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR); + this.drawTexturedModalRect(var3 / 2 - 7, var19 / 2 - 7, 0, 0, 16, 16); + GL11.glDisable(GL11.GL_BLEND); + boolean var20 = this.mc.thePlayer.heartsLife / 3 % 2 == 1; + if(this.mc.thePlayer.heartsLife < 10) { + var20 = false; + } + + int var6 = this.mc.thePlayer.health; + int var7 = this.mc.thePlayer.prevHealth; + this.rand.setSeed((long)(this.updateCounter * 312871)); + int var10; + int var12; + if(this.mc.playerController.shouldDrawHUD()) { + EntityPlayerSP var8 = this.mc.thePlayer; + var10 = var8.inventory.getPlayerArmorValue(); + + int var11; + int var13; + for(var11 = 0; var11 < 10; ++var11) { + var12 = var19 - 32; + if(var10 > 0) { + var13 = var3 / 2 + 91 - (var11 << 3) - 9; + if((var11 << 1) + 1 < var10) { + this.drawTexturedModalRect(var13, var12, 34, 9, 9, 9); + } + + if((var11 << 1) + 1 == var10) { + this.drawTexturedModalRect(var13, var12, 25, 9, 9, 9); + } + + if((var11 << 1) + 1 > var10) { + this.drawTexturedModalRect(var13, var12, 16, 9, 9, 9); + } + } + + byte var26 = 0; + if(var20) { + var26 = 1; + } + + int var14 = var3 / 2 - 91 + (var11 << 3); + if(var6 <= 4) { + var12 += this.rand.nextInt(2); + } + + this.drawTexturedModalRect(var14, var12, 16 + var26 * 9, 0, 9, 9); + if(var20) { + if((var11 << 1) + 1 < var7) { + this.drawTexturedModalRect(var14, var12, 70, 0, 9, 9); + } + + if((var11 << 1) + 1 == var7) { + this.drawTexturedModalRect(var14, var12, 79, 0, 9, 9); + } + } + + if((var11 << 1) + 1 < var6) { + this.drawTexturedModalRect(var14, var12, 52, 0, 9, 9); + } + + if((var11 << 1) + 1 == var6) { + this.drawTexturedModalRect(var14, var12, 61, 0, 9, 9); + } + } + + if(this.mc.thePlayer.isInsideOfWater()) { + var11 = (int)Math.ceil((double)(this.mc.thePlayer.air - 2) * 10.0D / 300.0D); + var12 = (int)Math.ceil((double)this.mc.thePlayer.air * 10.0D / 300.0D) - var11; + + for(var13 = 0; var13 < var11 + var12; ++var13) { + if(var13 < var11) { + this.drawTexturedModalRect(var3 / 2 - 91 + (var13 << 3), var19 - 32 - 9, 16, 18, 9, 9); + } else { + this.drawTexturedModalRect(var3 / 2 - 91 + (var13 << 3), var19 - 32 - 9, 25, 18, 9, 9); + } + } + } + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_NORMALIZE); + GL11.glPushMatrix(); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + + for(var10 = 0; var10 < 9; ++var10) { + int var25 = var3 / 2 - 90 + var10 * 20 + 2; + int var21 = var19 - 16 - 3; + ItemStack var22 = this.mc.thePlayer.inventory.mainInventory[var10]; + if(var22 != null) { + float var9 = (float)var22.animationsToGo - var1; + if(var9 > 0.0F) { + GL11.glPushMatrix(); + float var26 = 1.0F + var9 / 5.0F; + GL11.glTranslatef((float)(var25 + 8), (float)(var21 + 12), 0.0F); + GL11.glScalef(1.0F / var26, (var26 + 1.0F) / 2.0F, 1.0F); + GL11.glTranslatef((float)(-(var25 + 8)), (float)(-(var21 + 12)), 0.0F); + } + + itemRenderer.renderItemIntoGUI(this.mc.renderEngine, var22, var25, var21); + if(var9 > 0.0F) { + GL11.glPopMatrix(); + } + + itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, var22, var25, var21); + } + } + + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_NORMALIZE); + if(this.mc.options.showFPS) { + var4.drawStringWithShadow("Minecraft Indev (" + this.mc.debug + ")", 2, 2, 16777215); + Minecraft var23 = this.mc; + var4.drawStringWithShadow(var23.renderGlobal.getDebugInfoRenders(), 2, 12, 16777215); + var23 = this.mc; + var4.drawStringWithShadow(var23.renderGlobal.getDebugInfoEntities(), 2, 22, 16777215); + var23 = this.mc; + var4.drawStringWithShadow("P: " + var23.effectRenderer.getStatistics() + ". T: " + var23.theWorld.debugSkylightUpdates(), 2, 32, 16777215); + long var24 = Runtime.getRuntime().maxMemory(); + long var27 = Runtime.getRuntime().totalMemory(); + long var28 = Runtime.getRuntime().freeMemory(); + long var16 = var24 - var28; + String var18 = "Free memory: " + var16 * 100L / var24 + "% of " + var24 / 1024L / 1024L + "MB"; + drawString(var4, var18, var3 - var4.getStringWidth(var18) - 2, 2, 14737632); + var18 = "Allocated memory: " + var27 * 100L / var24 + "% (" + var27 / 1024L / 1024L + "MB)"; + drawString(var4, var18, var3 - var4.getStringWidth(var18) - 2, 12, 14737632); + } else { + var4.drawStringWithShadow("Minecraft Indev", 2, 2, 16777215); + } + + for(var12 = 0; var12 < this.chatMessageList.size() && var12 < 10; ++var12) { + if(((ChatLine)this.chatMessageList.get(var12)).updateCounter < 200) { + this.chatMessageList.get(var12); + var4.drawStringWithShadow((String)null, 2, var19 - 8 - var12 * 9 - 20, 16777215); + } + } + + } + + public final void addChatMessage() { + ++this.updateCounter; + + for(int var1 = 0; var1 < this.chatMessageList.size(); ++var1) { + ++((ChatLine)this.chatMessageList.get(var1)).updateCounter; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiIngameMenu.java b/src/teavm/java/net/minecraft/client/gui/GuiIngameMenu.java new file mode 100644 index 0000000..561ed33 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiIngameMenu.java @@ -0,0 +1,49 @@ +package net.minecraft.client.gui; + +public final class GuiIngameMenu extends GuiScreen { + public final void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4, "Options...")); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 24, "Generate new level...")); + this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 48, "Save level..")); + this.controlList.add(new GuiButton(3, this.width / 2 - 100, this.height / 4 + 72, "Load level..")); + this.controlList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 120, "Back to game")); + if(this.mc.session == null) { + ((GuiButton)this.controlList.get(2)).enabled = false; + ((GuiButton)this.controlList.get(3)).enabled = false; + } + + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.id == 0) { + this.mc.displayGuiScreen(new GuiOptions(this, this.mc.options)); + } + + if(var1.id == 1) { + this.mc.displayGuiScreen(new GuiNewLevel(this)); + } + + if(this.mc.session != null) { + if(var1.id == 2) { + this.mc.displayGuiScreen(new GuiSaveLevel(this)); + } + + if(var1.id == 3) { + this.mc.displayGuiScreen(new GuiLoadLevel(this)); + } + } + + if(var1.id == 4) { + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.setIngameFocus(); + } + + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, "Game menu", this.width / 2, 40, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiLevelDialog.java b/src/teavm/java/net/minecraft/client/gui/GuiLevelDialog.java new file mode 100644 index 0000000..b413678 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiLevelDialog.java @@ -0,0 +1,41 @@ +package net.minecraft.client.gui; + +import java.awt.FileDialog; +import java.io.File; + +final class GuiLevelDialog extends Thread { + private GuiLoadLevel screen; + + GuiLevelDialog(GuiLoadLevel var1) { + this.screen = var1; + } + + public final void run() { + try { + FileDialog var1 = this.screen.saveFileDialog(); + File var2 = new File(this.screen.mc.mcDataDir, "saves"); + var2.mkdir(); + String var5 = var2.toString(); + if(!var5.endsWith(File.separator)) { + var5 = var5 + File.separator; + } + + var1.setDirectory(var5); + FilenameFilterLevel var6 = new FilenameFilterLevel(this); + var1.setFilenameFilter(var6); + var1.setLocationRelativeTo(this.screen.mc.mcCanvas); + var1.setVisible(true); + if(var1.getFile() != null) { + var5 = var1.getDirectory(); + if(!var5.endsWith(File.separator)) { + var5 = var5 + File.separator; + } + + GuiLoadLevel.a(this.screen, new File(var5 + var1.getFile())); + } + } finally { + GuiLoadLevel.unknown(this.screen, false); + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiLoadLevel.java b/src/teavm/java/net/minecraft/client/gui/GuiLoadLevel.java new file mode 100644 index 0000000..9cae6dc --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiLoadLevel.java @@ -0,0 +1,145 @@ +package net.minecraft.client.gui; + +import java.awt.Dialog; +import java.awt.FileDialog; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import net.minecraft.client.PlayerLoader; +import net.minecraft.game.level.World; + +public class GuiLoadLevel extends GuiScreen implements Runnable { + private GuiScreen parent; + private boolean finished = false; + private boolean loaded = false; + private String[] levels = null; + private String status = ""; + protected String title = "Load level"; + private boolean frozen = false; + private File selectedFile; + + public GuiLoadLevel(GuiScreen var1) { + this.parent = var1; + } + + public final void updateScreen() { + if(this.selectedFile != null) { + if(!this.selectedFile.getName().endsWith(".mclevel")) { + this.selectedFile = new File(this.selectedFile.getAbsolutePath() + ".mclevel"); + } + + this.openLevel(this.selectedFile); + this.selectedFile = null; + this.mc.displayGuiScreen((GuiScreen)null); + } + + } + + public void run() { + try { + this.status = "Getting level list.."; + URL var1 = new URL("http://" + this.mc.minecraftUri + "/listmaps.jsp?user=" + this.mc.session.username); + BufferedReader var3 = new BufferedReader(new InputStreamReader(var1.openConnection().getInputStream())); + this.levels = var3.readLine().split(";"); + if(this.levels.length >= 5) { + this.setLevels(this.levels); + this.loaded = true; + return; + } + + this.status = this.levels[0]; + this.finished = true; + } catch (Exception var2) { + var2.printStackTrace(); + this.status = "Failed to load levels"; + this.finished = true; + } + + } + + protected void setLevels(String[] var1) { + for(int var2 = 0; var2 < 5; ++var2) { + ((GuiButton)this.controlList.get(var2)).enabled = !var1[var2].equals("-"); + ((GuiButton)this.controlList.get(var2)).displayString = var1[var2]; + ((GuiButton)this.controlList.get(var2)).visible = true; + } + + ((GuiButton)this.controlList.get(5)).visible = true; + } + + public void initGui() { + (new Thread(this)).start(); + + for(int var1 = 0; var1 < 5; ++var1) { + this.controlList.add(new GuiButton(var1, this.width / 2 - 100, this.height / 6 + var1 * 24, "---")); + ((GuiButton)this.controlList.get(var1)).visible = false; + } + + this.controlList.add(new GuiButton(5, this.width / 2 - 100, this.height / 6 + 120 + 12, "Load file...")); + this.controlList.add(new GuiButton(6, this.width / 2 - 100, this.height / 6 + 168, "Cancel")); + ((GuiButton)this.controlList.get(5)).visible = false; + } + + protected final void actionPerformed(GuiButton var1) { + if(!this.frozen) { + if(var1.enabled) { + if(this.loaded && var1.id < 5) { + this.openLevel(var1.id); + } + + if(this.finished || this.loaded && var1.id == 5) { + this.frozen = true; + GuiLevelDialog var2 = new GuiLevelDialog(this); + var2.setDaemon(true); + var2.start(); + } + + if(this.finished || this.loaded && var1.id == 6) { + this.mc.displayGuiScreen(this.parent); + } + + } + } + } + + protected FileDialog saveFileDialog() { + return new FileDialog((Dialog)null, "Load level", 0); + } + + protected void openLevel(int var1) { + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.setIngameFocus(); + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, this.title, this.width / 2, 20, 16777215); + if(!this.loaded) { + drawCenteredString(this.fontRenderer, this.status, this.width / 2, this.height / 2 - 4, 16777215); + } + + super.drawScreen(var1, var2, var3); + } + + protected void openLevel(File var1) { + try { + FileInputStream var4 = new FileInputStream(var1); + World var2 = (new PlayerLoader(this.mc, this.mc.loadingScreen)).load(var4); + var4.close(); + this.mc.setLevel(var2); + } catch (IOException var3) { + var3.printStackTrace(); + } + } + + static File a(GuiLoadLevel var0, File var1) { + return var0.selectedFile = var1; + } + + static boolean unknown(GuiLoadLevel var0, boolean var1) { + return var0.frozen = false; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiNameLevel.java b/src/teavm/java/net/minecraft/client/gui/GuiNameLevel.java new file mode 100644 index 0000000..8c48927 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiNameLevel.java @@ -0,0 +1,75 @@ +package net.minecraft.client.gui; + +import org.lwjgl.opengl.GL11; + +public final class GuiNameLevel extends GuiScreen { + private GuiScreen parent; + private String title = "Enter level name:"; + private int id; + private String name; + private int counter = 0; + + public GuiNameLevel(GuiScreen var1, String var2, int var3) { + this.parent = var1; + this.id = var3; + this.name = var2; + if(this.name.equals("-")) { + this.name = ""; + } + + } + + public final void initGui() { + this.controlList.clear(); + GL11.enableRepeatEvents(true); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Save")); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 144, "Cancel")); + ((GuiButton)this.controlList.get(0)).enabled = this.name.trim().length() > 1; + } + + public final void onGuiClosed() { + GL11.enableRepeatEvents(false); + } + + public final void updateScreen() { + ++this.counter; + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id == 0 && this.name.trim().length() > 1) { + this.name.trim(); + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.setIngameFocus(); + } + + if(var1.id == 1) { + this.mc.displayGuiScreen(this.parent); + } + + } + } + + protected final void keyTyped(char var1, int var2) { + if(var2 == 14 && this.name.length() > 0) { + this.name = this.name.substring(0, this.name.length() - 1); + } + + if("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.:-_\'*!\"#%/()=+?[]{}<>".indexOf(var1) >= 0 && this.name.length() < 64) { + this.name = this.name + var1; + } + + ((GuiButton)this.controlList.get(0)).enabled = this.name.trim().length() > 1; + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, this.title, this.width / 2, 40, 16777215); + int var4 = this.width / 2 - 100; + int var5 = this.height / 2 - 10; + drawRect(var4 - 1, var5 - 1, var4 + 200 + 1, var5 + 20 + 1, -6250336); + drawRect(var4, var5, var4 + 200, var5 + 20, -16777216); + drawString(this.fontRenderer, this.name + (this.counter / 6 % 2 == 0 ? "_" : ""), var4 + 4, var5 + 6, 14737632); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiNewLevel.java b/src/teavm/java/net/minecraft/client/gui/GuiNewLevel.java new file mode 100644 index 0000000..1dc2a11 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiNewLevel.java @@ -0,0 +1,60 @@ +package net.minecraft.client.gui; + +public final class GuiNewLevel extends GuiScreen { + private GuiScreen prevGui; + private String[] worldType = new String[]{"Inland", "Island", "Floating", "Flat"}; + private String[] worldShape = new String[]{"Square", "Long", "Deep"}; + private String[] worldSize = new String[]{"Small", "Normal", "Huge"}; + private String[] worldTheme = new String[]{"Normal", "Hell", "Paradise", "Woods"}; + private int selectedWorldType = 1; + private int selectedWorldShape = 0; + private int selectedWorldSize = 1; + private int selectedWorldTheme = 0; + + public GuiNewLevel(GuiScreen var1) { + this.prevGui = var1; + } + + public final void initGui() { + this.controlList.clear(); + this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4, "Type: ")); + this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 24, "Shape:")); + this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 48, "Size: ")); + this.controlList.add(new GuiButton(3, this.width / 2 - 100, this.height / 4 + 72, "Theme: ")); + this.controlList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 96 + 12, "Create")); + this.controlList.add(new GuiButton(5, this.width / 2 - 100, this.height / 4 + 120 + 12, "Cancel")); + this.worldOptions(); + } + + private void worldOptions() { + ((GuiButton)this.controlList.get(0)).displayString = "Type: " + this.worldType[this.selectedWorldType]; + ((GuiButton)this.controlList.get(1)).displayString = "Shape: " + this.worldShape[this.selectedWorldShape]; + ((GuiButton)this.controlList.get(2)).displayString = "Size: " + this.worldSize[this.selectedWorldSize]; + ((GuiButton)this.controlList.get(3)).displayString = "Theme: " + this.worldTheme[this.selectedWorldTheme]; + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.id == 5) { + this.mc.displayGuiScreen(this.prevGui); + } else if(var1.id == 4) { + this.mc.generateLevel(this.selectedWorldSize, this.selectedWorldShape, this.selectedWorldType, this.selectedWorldTheme); + this.mc.displayGuiScreen((GuiScreen)null); + } else if(var1.id == 0) { + this.selectedWorldType = (this.selectedWorldType + 1) % this.worldType.length; + } else if(var1.id == 1) { + this.selectedWorldShape = (this.selectedWorldShape + 1) % this.worldShape.length; + } else if(var1.id == 2) { + this.selectedWorldSize = (this.selectedWorldSize + 1) % this.worldSize.length; + } else if(var1.id == 3) { + this.selectedWorldTheme = (this.selectedWorldTheme + 1) % this.worldTheme.length; + } + + this.worldOptions(); + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, "Generate new level", this.width / 2, 40, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiOptions.java b/src/teavm/java/net/minecraft/client/gui/GuiOptions.java new file mode 100644 index 0000000..7e44888 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiOptions.java @@ -0,0 +1,47 @@ +package net.minecraft.client.gui; + +import net.minecraft.client.GameSettings; + +public final class GuiOptions extends GuiScreen { + private GuiScreen parentScreen; + private String screenTitle = "Options"; + private GameSettings options; + + public GuiOptions(GuiScreen var1, GameSettings var2) { + this.parentScreen = var1; + this.options = var2; + } + + public final void initGui() { + for(int var1 = 0; var1 < this.options.numberOfOptions; ++var1) { + this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.setOptionString(var1))); + } + + this.controlList.add(new GuiButton(100, this.width / 2 - 100, this.height / 6 + 120 + 12, "Controls...")); + this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done")); + } + + protected final void actionPerformed(GuiButton var1) { + if(var1.enabled) { + if(var1.id < 100) { + this.options.setOptionValue(var1.id, 1); + var1.displayString = this.options.setOptionString(var1.id); + } + + if(var1.id == 100) { + this.mc.displayGuiScreen(new GuiControls(this, this.options)); + } + + if(var1.id == 200) { + this.mc.displayGuiScreen(this.parentScreen); + } + + } + } + + public final void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); + super.drawScreen(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiSaveLevel.java b/src/teavm/java/net/minecraft/client/gui/GuiSaveLevel.java new file mode 100644 index 0000000..5e2419a --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiSaveLevel.java @@ -0,0 +1,47 @@ +package net.minecraft.client.gui; + +import java.awt.Dialog; +import java.awt.FileDialog; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import net.minecraft.client.PlayerLoader; + +public final class GuiSaveLevel extends GuiLoadLevel { + public GuiSaveLevel(GuiScreen var1) { + super(var1); + this.title = "Save level"; + } + + protected final FileDialog saveFileDialog() { + return new FileDialog((Dialog)null, "Save level", 1); + } + + public final void initGui() { + super.initGui(); + ((GuiButton)this.controlList.get(5)).displayString = "Save file..."; + } + + protected final void setLevels(String[] var1) { + for(int var2 = 0; var2 < 5; ++var2) { + ((GuiButton)this.controlList.get(var2)).displayString = var1[var2]; + ((GuiButton)this.controlList.get(var2)).visible = true; + } + + ((GuiButton)this.controlList.get(5)).visible = true; + } + + protected final void openLevel(File var1) { + try { + FileOutputStream var3 = new FileOutputStream(var1); + (new PlayerLoader(this.mc, this.mc.loadingScreen)).save(this.mc.theWorld, var3); + var3.close(); + } catch (IOException var2) { + var2.printStackTrace(); + } + } + + protected final void openLevel(int var1) { + this.mc.displayGuiScreen(new GuiNameLevel(this, ((GuiButton)this.controlList.get(var1)).displayString, var1)); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiScreen.java b/src/teavm/java/net/minecraft/client/gui/GuiScreen.java new file mode 100644 index 0000000..ba1ecf5 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiScreen.java @@ -0,0 +1,107 @@ +package net.minecraft.client.gui; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.Minecraft; +import net.minecraft.client.render.Tessellator; +import org.lwjgl.opengl.GL11; + +public class GuiScreen extends Gui { + protected Minecraft mc; + public int width; + public int height; + protected List controlList = new ArrayList(); + public boolean allowUserInput = false; + protected FontRenderer fontRenderer; + + public void drawScreen(int var1, int var2, float var3) { + for(int var5 = 0; var5 < this.controlList.size(); ++var5) { + GuiButton var4 = (GuiButton)this.controlList.get(var5); + var4.drawButton(this.mc, var1, var2); + } + + } + + protected void keyTyped(char var1, int var2) { + if(var2 == 1) { + this.mc.displayGuiScreen((GuiScreen)null); + this.mc.setIngameFocus(); + } + + } + + protected void drawSlotInventory(int var1, int var2, int var3) { + if(var3 == 0) { + for(var3 = 0; var3 < this.controlList.size(); ++var3) { + GuiButton var4 = (GuiButton)this.controlList.get(var3); + if(var4.mousePressed(var1, var2)) { + this.actionPerformed(var4); + } + } + } + + } + + protected void actionPerformed(GuiButton var1) { + } + + public final void setWorldAndResolution(Minecraft var1, int var2, int var3) { + this.mc = var1; + this.fontRenderer = var1.fontRenderer; + this.width = var2; + this.height = var3; + this.initGui(); + } + + public void initGui() { + } + + public final void handleMouseInput() { + if(GL11.mouseGetEventButtonState()) { + int var1 = GL11.mouseGetEventX() * this.width / this.mc.displayWidth; + int var2 = this.height - GL11.mouseGetEventY() * this.height / this.mc.displayHeight - 1; + this.drawSlotInventory(var1, var2, GL11.mouseGetEventButton()); + } else { + GL11.mouseGetEventX(); + GL11.mouseGetEventY(); + GL11.mouseGetEventButton(); + } + } + + public final void handleKeyboardInput() { + if(GL11.getEventKeyState()) { + this.keyTyped(GL11.getEventChar(), GL11.getEventKey()); + } + + } + + public void updateScreen() { + } + + public void onGuiClosed() { + } + + public final void drawDefaultBackground() { + boolean var1 = false; + if(this.mc.theWorld != null) { + drawGradientRect(0, 0, this.width, this.height, 1610941696, -1607454624); + } else { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_FOG); + Tessellator var2 = Tessellator.instance; + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/dirt.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var2.startDrawingQuads(); + var2.setColorOpaque_I(4210752); + var2.addVertexWithUV(0.0F, (float)this.height, 0.0F, 0.0F, (float)this.height / 32.0F); + var2.addVertexWithUV((float)this.width, (float)this.height, 0.0F, (float)this.width / 32.0F, (float)this.height / 32.0F); + var2.addVertexWithUV((float)this.width, 0.0F, 0.0F, (float)this.width / 32.0F, 0.0F); + var2.addVertexWithUV(0.0F, 0.0F, 0.0F, 0.0F, 0.0F); + var2.draw(); + } + } + + public boolean doesGuiPauseGame() { + return true; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/GuiSmallButton.java b/src/teavm/java/net/minecraft/client/gui/GuiSmallButton.java new file mode 100644 index 0000000..0363644 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/GuiSmallButton.java @@ -0,0 +1,7 @@ +package net.minecraft.client.gui; + +public final class GuiSmallButton extends GuiButton { + public GuiSmallButton(int var1, int var2, int var3, String var4) { + super(var1, var2, var3, 150, 20, var4); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/ScaledResolution.java b/src/teavm/java/net/minecraft/client/gui/ScaledResolution.java new file mode 100644 index 0000000..e8d40a2 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/ScaledResolution.java @@ -0,0 +1,25 @@ +package net.minecraft.client.gui; + +public final class ScaledResolution { + private int scaledWidth; + private int scaledHeight; + + public ScaledResolution(int var1, int var2) { + this.scaledWidth = var1; + this.scaledHeight = var2; + + for(var1 = 1; this.scaledWidth / (var1 + 1) >= 320 && this.scaledHeight / (var1 + 1) >= 240; ++var1) { + } + + this.scaledWidth /= var1; + this.scaledHeight /= var1; + } + + public final int getScaledWidth() { + return this.scaledWidth; + } + + public final int getScaledHeight() { + return this.scaledHeight; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/GuiChest.java b/src/teavm/java/net/minecraft/client/gui/container/GuiChest.java new file mode 100644 index 0000000..b094160 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/GuiChest.java @@ -0,0 +1,54 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.client.render.RenderEngine; +import net.minecraft.game.IInventory; +import org.lwjgl.opengl.GL11; + +public final class GuiChest extends GuiContainer { + private IInventory upperChestInventory; + private IInventory lowerChestInventory; + private int inventoryRows = 0; + + public GuiChest(IInventory var1, IInventory var2) { + this.upperChestInventory = var1; + this.lowerChestInventory = var2; + this.allowUserInput = false; + this.inventoryRows = var2.getSizeInventory() / 9; + this.ySize = 114 + this.inventoryRows * 18; + int var3 = (this.inventoryRows - 4) * 18; + + int var4; + int var5; + for(var4 = 0; var4 < this.inventoryRows; ++var4) { + for(var5 = 0; var5 < 9; ++var5) { + this.inventorySlots.add(new Slot(this, var2, var5 + var4 * 9, 8 + var5 * 18, 18 + var4 * 18)); + } + } + + for(var4 = 0; var4 < 3; ++var4) { + for(var5 = 0; var5 < 9; ++var5) { + this.inventorySlots.add(new Slot(this, var1, var5 + (var4 + 1) * 9, 8 + var5 * 18, 103 + var4 * 18 + var3)); + } + } + + for(var4 = 0; var4 < 9; ++var4) { + this.inventorySlots.add(new Slot(this, var1, var4, 8 + var4 * 18, var3 + 161)); + } + + } + + protected final void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString(this.lowerChestInventory.getInvName(), 8, 6, 4210752); + this.fontRenderer.drawString(this.upperChestInventory.getInvName(), 8, this.ySize - 96 + 2, 4210752); + } + + protected final void drawGuiContainerBackgroundLayer() { + int var1 = this.mc.renderEngine.getTexture("/gui/container.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderEngine.bindTexture(var1); + var1 = (this.width - this.xSize) / 2; + int var2 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var1, var2, 0, 0, this.xSize, this.inventoryRows * 18 + 17); + this.drawTexturedModalRect(var1, var2 + this.inventoryRows * 18 + 17, 0, 126, this.xSize, 96); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/GuiContainer.java b/src/teavm/java/net/minecraft/client/gui/container/GuiContainer.java new file mode 100644 index 0000000..5c8b127 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/GuiContainer.java @@ -0,0 +1,269 @@ +package net.minecraft.client.gui.container; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.RenderHelper; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.entity.RenderItem; +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public abstract class GuiContainer extends GuiScreen { + private static RenderItem itemRenderer = new RenderItem(); + private ItemStack itemStack = null; + protected int xSize = 176; + protected int ySize = 166; + protected List inventorySlots = new ArrayList(); + + public void drawScreen(int var1, int var2, float var3) { + this.drawDefaultBackground(); + int var13 = (this.width - this.xSize) / 2; + int var4 = (this.height - this.ySize) / 2; + this.drawGuiContainerBackgroundLayer(); + GL11.glPushMatrix(); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)var13, (float)var4, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_NORMALIZE); + + for(int var5 = 0; var5 < this.inventorySlots.size(); ++var5) { + Slot var6; + label24: { + var6 = (Slot)this.inventorySlots.get(var5); + IInventory var9 = var6.inventory; + int var10 = var6.slotIndex; + int var11 = var6.xPos; + int var12 = var6.yPos; + ItemStack var15 = var9.getStackInSlot(var10); + if(var15 == null) { + int var8 = var6.getBackgroundIconIndex(); + if(var8 >= 0) { + GL11.glDisable(GL11.GL_LIGHTING); + RenderEngine.bindTexture(this.mc.renderEngine.getTexture("/gui/items.png")); + this.drawTexturedModalRect(var11, var12, var8 % 16 << 4, var8 / 16 << 4, 16, 16); + GL11.glEnable(GL11.GL_LIGHTING); + break label24; + } + } + + itemRenderer.renderItemIntoGUI(this.mc.renderEngine, var15, var11, var12); + itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, var15, var11, var12); + } + + if(var6.isAtCursorPos(var1, var2)) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + int var7 = var6.xPos; + int var14 = var6.yPos; + drawGradientRect(var7, var14, var7 + 16, var14 + 16, -2130706433, -2130706433); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + + if(this.itemStack != null) { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + itemRenderer.renderItemIntoGUI(this.mc.renderEngine, this.itemStack, var1 - var13 - 8, var2 - var4 - 8); + itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.itemStack, var1 - var13 - 8, var2 - var4 - 8); + } + + GL11.glDisable(GL11.GL_NORMALIZE); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + this.drawGuiContainerForegroundLayer(); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + } + + protected void drawGuiContainerForegroundLayer() { + } + + protected abstract void drawGuiContainerBackgroundLayer(); + + protected final void drawSlotInventory(int var1, int var2, int var3) { + if(var3 == 0 || var3 == 1) { + int var6 = var2; + int var4 = var1; + GuiContainer var5 = this; + int var7 = 0; + + Slot var10000; + while(true) { + if(var7 >= var5.inventorySlots.size()) { + var10000 = null; + break; + } + + Slot var8 = (Slot)var5.inventorySlots.get(var7); + if(var8.isAtCursorPos(var4, var6)) { + var10000 = var8; + break; + } + + ++var7; + } + + Slot var11 = var10000; + if(var11 != null) { + ItemStack var12 = var11.inventory.getStackInSlot(var11.slotIndex); + if(var12 == null && this.itemStack == null) { + return; + } + + if(var12 != null && this.itemStack == null) { + var6 = var3 == 0 ? var12.stackSize : (var12.stackSize + 1) / 2; + this.itemStack = var11.inventory.decrStackSize(var11.slotIndex, var6); + if(var12.stackSize == 0) { + var11.putStack((ItemStack)null); + } + + var11.onPickupFromSlot(); + } else if(var12 == null && this.itemStack != null && var11.isItemValid(this.itemStack)) { + var6 = var3 == 0 ? this.itemStack.stackSize : 1; + if(var6 > var11.inventory.getInventoryStackLimit()) { + var6 = var11.inventory.getInventoryStackLimit(); + } + + var11.putStack(this.itemStack.splitStack(var6)); + if(this.itemStack.stackSize == 0) { + this.itemStack = null; + } + } else { + if(var12 == null || this.itemStack == null) { + return; + } + + ItemStack var9; + if(!var11.isItemValid(this.itemStack)) { + if(var12.itemID == this.itemStack.itemID) { + var9 = this.itemStack; + if(var9.getItem().getItemStackLimit() > 1) { + var6 = var12.stackSize; + if(var6 > 0) { + int var14 = var6 + this.itemStack.stackSize; + var9 = this.itemStack; + if(var14 <= var9.getItem().getItemStackLimit()) { + this.itemStack.stackSize += var6; + var12.splitStack(var6); + if(var12.stackSize == 0) { + var11.putStack((ItemStack)null); + } + + var11.onPickupFromSlot(); + return; + } + } + + return; + } + } + + return; + } + + if(var12.itemID != this.itemStack.itemID) { + if(this.itemStack.stackSize > var11.inventory.getInventoryStackLimit()) { + return; + } + + var11.putStack(this.itemStack); + this.itemStack = var12; + } else { + if(var12.itemID != this.itemStack.itemID) { + return; + } + + if(var3 == 0) { + var6 = this.itemStack.stackSize; + if(var6 > var11.inventory.getInventoryStackLimit() - var12.stackSize) { + var6 = var11.inventory.getInventoryStackLimit() - var12.stackSize; + } + + var9 = this.itemStack; + if(var6 > var9.getItem().getItemStackLimit() - var12.stackSize) { + var9 = this.itemStack; + var6 = var9.getItem().getItemStackLimit() - var12.stackSize; + } + + this.itemStack.splitStack(var6); + if(this.itemStack.stackSize == 0) { + this.itemStack = null; + } + + var12.stackSize += var6; + } else { + if(var3 != 1) { + return; + } + + var6 = 1; + if(1 > var11.inventory.getInventoryStackLimit() - var12.stackSize) { + var6 = var11.inventory.getInventoryStackLimit() - var12.stackSize; + } + + var9 = this.itemStack; + if(var6 > var9.getItem().getItemStackLimit() - var12.stackSize) { + var9 = this.itemStack; + var6 = var9.getItem().getItemStackLimit() - var12.stackSize; + } + + this.itemStack.splitStack(var6); + if(this.itemStack.stackSize == 0) { + this.itemStack = null; + } + + var12.stackSize += var6; + } + } + } + } else if(this.itemStack != null) { + int var13 = (this.width - this.xSize) / 2; + var6 = (this.height - this.ySize) / 2; + if(var1 < var13 || var2 < var6 || var1 >= var13 + this.xSize || var2 >= var6 + this.xSize) { + EntityPlayerSP var10 = this.mc.thePlayer; + if(var3 == 0) { + var10.dropPlayerItem(this.itemStack); + this.itemStack = null; + } + + if(var3 == 1) { + var10.dropPlayerItem(this.itemStack.splitStack(1)); + if(this.itemStack.stackSize == 0) { + this.itemStack = null; + } + } + } + } + } + + } + + protected final void keyTyped(char var1, int var2) { + if(var2 == 1 || var2 == this.mc.options.keyBindInventory.keyCode) { + this.mc.displayGuiScreen((GuiScreen)null); + } + + } + + public void onGuiClosed() { + if(this.itemStack != null) { + this.mc.thePlayer.dropPlayerItem(this.itemStack); + } + + } + + public void guiCraftingItemsCheck() { + } + + public final boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/GuiCrafting.java b/src/teavm/java/net/minecraft/client/gui/container/GuiCrafting.java new file mode 100644 index 0000000..3a55282 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/GuiCrafting.java @@ -0,0 +1,80 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.client.render.RenderEngine; +import net.minecraft.game.IInventory; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.item.recipe.CraftingManager; +import org.lwjgl.opengl.GL11; + +public final class GuiCrafting extends GuiContainer { + private InventoryCrafting inventoryCrafting = new InventoryCrafting(this, 3, 3); + private IInventory iInventory = new InventoryCraftResult(); + + public GuiCrafting(InventoryPlayer var1) { + this.inventorySlots.add(new SlotCrafting(this, this.inventoryCrafting, this.iInventory, 0, 124, 35)); + + int var2; + int var3; + for(var2 = 0; var2 < 3; ++var2) { + for(var3 = 0; var3 < 3; ++var3) { + this.inventorySlots.add(new Slot(this, this.inventoryCrafting, var3 + var2 * 3, 30 + var3 * 18, 17 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 3; ++var2) { + for(var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new Slot(this, var1, var3 + (var2 + 1) * 9, 8 + var3 * 18, 84 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 9; ++var2) { + this.inventorySlots.add(new Slot(this, var1, var2, 8 + var2 * 18, 142)); + } + + } + + public final void onGuiClosed() { + super.onGuiClosed(); + + for(int var1 = 0; var1 < 9; ++var1) { + ItemStack var2 = this.inventoryCrafting.getStackInSlot(var1); + if(var2 != null) { + this.mc.thePlayer.dropPlayerItem(var2); + } + } + + } + + public final void guiCraftingItemsCheck() { + int[] var1 = new int[9]; + + for(int var2 = 0; var2 < 3; ++var2) { + for(int var3 = 0; var3 < 3; ++var3) { + int var4 = var2 + var3 * 3; + ItemStack var5 = this.inventoryCrafting.getStackInSlot(var4); + if(var5 == null) { + var1[var4] = -1; + } else { + var1[var4] = var5.itemID; + } + } + } + + this.iInventory.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(var1)); + } + + protected final void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Crafting", 28, 6, 4210752); + this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752); + } + + protected final void drawGuiContainerBackgroundLayer() { + int var1 = this.mc.renderEngine.getTexture("/gui/crafting.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderEngine.bindTexture(var1); + var1 = (this.width - this.xSize) / 2; + int var2 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var1, var2, 0, 0, this.xSize, this.ySize); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/GuiFurnace.java b/src/teavm/java/net/minecraft/client/gui/container/GuiFurnace.java new file mode 100644 index 0000000..3b28e85 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/GuiFurnace.java @@ -0,0 +1,52 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.client.render.RenderEngine; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.level.block.tileentity.TileEntityFurnace; +import org.lwjgl.opengl.GL11; + +public final class GuiFurnace extends GuiContainer { + private TileEntityFurnace furnaceInventory; + + public GuiFurnace(InventoryPlayer var1, TileEntityFurnace var2) { + new InventoryCraftResult(); + this.furnaceInventory = var2; + this.inventorySlots.add(new Slot(this, var2, 0, 56, 17)); + this.inventorySlots.add(new Slot(this, var2, 1, 56, 53)); + this.inventorySlots.add(new Slot(this, var2, 2, 116, 35)); + + int var4; + for(var4 = 0; var4 < 3; ++var4) { + for(int var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new Slot(this, var1, var3 + (var4 + 1) * 9, 8 + var3 * 18, 84 + var4 * 18)); + } + } + + for(var4 = 0; var4 < 9; ++var4) { + this.inventorySlots.add(new Slot(this, var1, var4, 8 + var4 * 18, 142)); + } + + } + + protected final void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Furnace", 60, 6, 4210752); + this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752); + } + + protected final void drawGuiContainerBackgroundLayer() { + int var1 = this.mc.renderEngine.getTexture("/gui/furnace.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderEngine.bindTexture(var1); + var1 = (this.width - this.xSize) / 2; + int var2 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var1, var2, 0, 0, this.xSize, this.ySize); + int var3; + if(this.furnaceInventory.isBurning()) { + var3 = this.furnaceInventory.getBurnTimeRemainingScaled(12); + this.drawTexturedModalRect(var1 + 56, var2 + 36 + 12 - var3, 176, 12 - var3, 14, var3 + 2); + } + + var3 = this.furnaceInventory.getCookProgressScaled(24); + this.drawTexturedModalRect(var1 + 79, var2 + 34, 176, 14, var3 + 1, 16); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/GuiInventory.java b/src/teavm/java/net/minecraft/client/gui/container/GuiInventory.java new file mode 100644 index 0000000..6489c75 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/GuiInventory.java @@ -0,0 +1,121 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.client.RenderHelper; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.entity.RenderManager; +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.item.recipe.CraftingManager; +import org.lwjgl.opengl.GL11; + +public final class GuiInventory extends GuiContainer { + private InventoryCrafting inventoryCrafting = new InventoryCrafting(this, 2, 2); + private IInventory iInventory = new InventoryCraftResult(); + private float xSize_lo; + private float ySize_lo; + + public GuiInventory(IInventory var1) { + this.allowUserInput = true; + this.inventorySlots.add(new SlotCrafting(this, this.inventoryCrafting, this.iInventory, 0, 144, 36)); + + int var2; + int var3; + for(var2 = 0; var2 < 2; ++var2) { + for(var3 = 0; var3 < 2; ++var3) { + this.inventorySlots.add(new Slot(this, this.inventoryCrafting, var3 + (var2 << 1), 88 + var3 * 18, 26 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 4; ++var2) { + this.inventorySlots.add(new SlotArmor(this, this, var1, var1.getSizeInventory() - 1 - var2, 8, 8 + var2 * 18, var2)); + } + + for(var2 = 0; var2 < 3; ++var2) { + for(var3 = 0; var3 < 9; ++var3) { + this.inventorySlots.add(new Slot(this, var1, var3 + (var2 + 1) * 9, 8 + var3 * 18, 84 + var2 * 18)); + } + } + + for(var2 = 0; var2 < 9; ++var2) { + this.inventorySlots.add(new Slot(this, var1, var2, 8 + var2 * 18, 142)); + } + + } + + public final void onGuiClosed() { + super.onGuiClosed(); + + for(int var1 = 0; var1 < this.inventoryCrafting.getSizeInventory(); ++var1) { + ItemStack var2 = this.inventoryCrafting.getStackInSlot(var1); + if(var2 != null) { + this.mc.thePlayer.dropPlayerItem(var2); + } + } + + } + + public final void guiCraftingItemsCheck() { + int[] var1 = new int[9]; + + for(int var2 = 0; var2 < 3; ++var2) { + for(int var3 = 0; var3 < 3; ++var3) { + int var4 = -1; + if(var2 < 2 && var3 < 2) { + ItemStack var5 = this.inventoryCrafting.getStackInSlot(var2 + (var3 << 1)); + if(var5 != null) { + var4 = var5.itemID; + } + } + + var1[var2 + var3 * 3] = var4; + } + } + + this.iInventory.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(var1)); + } + + protected final void drawGuiContainerForegroundLayer() { + this.fontRenderer.drawString("Crafting", 86, 16, 4210752); + } + + public final void drawScreen(int var1, int var2, float var3) { + super.drawScreen(var1, var2, var3); + this.xSize_lo = (float)var1; + this.ySize_lo = (float)var2; + } + + protected final void drawGuiContainerBackgroundLayer() { + int var1 = this.mc.renderEngine.getTexture("/gui/inventory.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderEngine.bindTexture(var1); + var1 = (this.width - this.xSize) / 2; + int var2 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var1, var2, 0, 0, this.xSize, this.ySize); + GL11.glEnable(GL11.GL_NORMALIZE); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(var1 + 51), (float)(var2 + 75), 50.0F); + GL11.glScalef(-30.0F, 30.0F, 30.0F); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + float var3 = this.mc.thePlayer.renderYawOffset; + float var4 = this.mc.thePlayer.rotationYaw; + float var5 = this.mc.thePlayer.rotationPitch; + float var6 = (float)(var1 + 51) - this.xSize_lo; + float var7 = (float)(var2 + 75 - 50) - this.ySize_lo; + GL11.glRotatef(135.0F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-((float)Math.atan((double)(var7 / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F); + this.mc.thePlayer.renderYawOffset = (float)Math.atan((double)(var6 / 40.0F)) * 20.0F; + this.mc.thePlayer.rotationYaw = (float)Math.atan((double)(var6 / 40.0F)) * 40.0F; + this.mc.thePlayer.rotationPitch = -((float)Math.atan((double)(var7 / 40.0F))) * 20.0F; + GL11.glTranslatef(0.0F, this.mc.thePlayer.yOffset, 0.0F); + RenderManager.instance.renderEntityWithPosYaw(this.mc.thePlayer, 0.0F, 0.0F, 0.0F, 0.0F, 1.0F); + this.mc.thePlayer.renderYawOffset = var3; + this.mc.thePlayer.rotationYaw = var4; + this.mc.thePlayer.rotationPitch = var5; + GL11.glPopMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_NORMALIZE); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/InventoryCraftResult.java b/src/teavm/java/net/minecraft/client/gui/container/InventoryCraftResult.java new file mode 100644 index 0000000..14928ae --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/InventoryCraftResult.java @@ -0,0 +1,38 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; + +public final class InventoryCraftResult implements IInventory { + private ItemStack[] stackResult = new ItemStack[1]; + + public final int getSizeInventory() { + return 1; + } + + public final ItemStack getStackInSlot(int var1) { + return this.stackResult[var1]; + } + + public final String getInvName() { + return "Result"; + } + + public final ItemStack decrStackSize(int var1, int var2) { + if(this.stackResult[var1] != null) { + ItemStack var3 = this.stackResult[var1]; + this.stackResult[var1] = null; + return var3; + } else { + return null; + } + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + this.stackResult[var1] = var2; + } + + public final int getInventoryStackLimit() { + return 64; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/InventoryCrafting.java b/src/teavm/java/net/minecraft/client/gui/container/InventoryCrafting.java new file mode 100644 index 0000000..a978545 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/InventoryCrafting.java @@ -0,0 +1,59 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; + +public final class InventoryCrafting implements IInventory { + private ItemStack[] stackList; + private int inventoryWidth; + private GuiContainer eventHandler; + + public InventoryCrafting(GuiContainer var1, int var2, int var3) { + this.inventoryWidth = var2 * var3; + this.stackList = new ItemStack[this.inventoryWidth]; + this.eventHandler = var1; + } + + public final int getSizeInventory() { + return this.inventoryWidth; + } + + public final ItemStack getStackInSlot(int var1) { + return this.stackList[var1]; + } + + public final String getInvName() { + return "Crafting"; + } + + public final ItemStack decrStackSize(int var1, int var2) { + if(this.stackList[var1] != null) { + ItemStack var3; + if(this.stackList[var1].stackSize <= var2) { + var3 = this.stackList[var1]; + this.stackList[var1] = null; + this.eventHandler.guiCraftingItemsCheck(); + return var3; + } else { + var3 = this.stackList[var1].splitStack(var2); + if(this.stackList[var1].stackSize == 0) { + this.stackList[var1] = null; + } + + this.eventHandler.guiCraftingItemsCheck(); + return var3; + } + } else { + return null; + } + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + this.stackList[var1] = var2; + this.eventHandler.guiCraftingItemsCheck(); + } + + public final int getInventoryStackLimit() { + return 64; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/Slot.java b/src/teavm/java/net/minecraft/client/gui/container/Slot.java new file mode 100644 index 0000000..b9eae83 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/Slot.java @@ -0,0 +1,43 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; + +public class Slot { + public final int slotIndex; + public final int xPos; + public final int yPos; + public final IInventory inventory; + private final GuiContainer guiHandler; + + public Slot(GuiContainer var1, IInventory var2, int var3, int var4, int var5) { + this.guiHandler = var1; + this.inventory = var2; + this.slotIndex = var3; + this.xPos = var4; + this.yPos = var5; + } + + public final boolean isAtCursorPos(int var1, int var2) { + int var3 = (this.guiHandler.width - this.guiHandler.xSize) / 2; + int var4 = (this.guiHandler.height - this.guiHandler.ySize) / 2; + var1 -= var3; + var2 -= var4; + return var1 >= this.xPos - 1 && var1 < this.xPos + 16 + 1 && var2 >= this.yPos - 1 && var2 < this.yPos + 16 + 1; + } + + public void onPickupFromSlot() { + } + + public boolean isItemValid(ItemStack var1) { + return true; + } + + public final void putStack(ItemStack var1) { + this.inventory.setInventorySlotContents(this.slotIndex, var1); + } + + public int getBackgroundIconIndex() { + return -1; + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/SlotArmor.java b/src/teavm/java/net/minecraft/client/gui/container/SlotArmor.java new file mode 100644 index 0000000..c3d6347 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/SlotArmor.java @@ -0,0 +1,22 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemArmor; +import net.minecraft.game.item.ItemStack; + +final class SlotArmor extends Slot { + private int armorType; + + SlotArmor(GuiInventory var1, GuiContainer var2, IInventory var3, int var4, int var5, int var6, int var7) { + super(var2, var3, var4, 8, var6); + this.armorType = var7; + } + + public final boolean isItemValid(ItemStack var1) { + return var1.getItem() instanceof ItemArmor ? ((ItemArmor)var1.getItem()).armorType == this.armorType : false; + } + + public final int getBackgroundIconIndex() { + return 15 + (this.armorType << 4); + } +} diff --git a/src/teavm/java/net/minecraft/client/gui/container/SlotCrafting.java b/src/teavm/java/net/minecraft/client/gui/container/SlotCrafting.java new file mode 100644 index 0000000..893aa1b --- /dev/null +++ b/src/teavm/java/net/minecraft/client/gui/container/SlotCrafting.java @@ -0,0 +1,26 @@ +package net.minecraft.client.gui.container; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; + +final class SlotCrafting extends Slot { + private final IInventory craftMatrix; + + public SlotCrafting(GuiContainer var1, IInventory var2, IInventory var3, int var4, int var5, int var6) { + super(var1, var3, 0, var5, var6); + this.craftMatrix = var2; + } + + public final boolean isItemValid(ItemStack var1) { + return false; + } + + public final void onPickupFromSlot() { + for(int var1 = 0; var1 < this.craftMatrix.getSizeInventory(); ++var1) { + if(this.craftMatrix.getStackInSlot(var1) != null) { + this.craftMatrix.decrStackSize(var1, 1); + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelBase.java b/src/teavm/java/net/minecraft/client/model/ModelBase.java new file mode 100644 index 0000000..1c76592 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelBase.java @@ -0,0 +1,9 @@ +package net.minecraft.client.model; + +public abstract class ModelBase { + public void render(float var1, float var2, float var3, float var4, float var5, float var6) { + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelBiped.java b/src/teavm/java/net/minecraft/client/model/ModelBiped.java new file mode 100644 index 0000000..5d79b12 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelBiped.java @@ -0,0 +1,75 @@ +package net.minecraft.client.model; + +import net.PeytonPlayz585.math.MathHelper; + +public class ModelBiped extends ModelBase { + public ModelRenderer bipedHead; + public ModelRenderer bipedHeadwear; + public ModelRenderer bipedBody; + public ModelRenderer bipedRightArm; + public ModelRenderer bipedLeftArm; + public ModelRenderer bipedRightLeg; + public ModelRenderer bipedLeftLeg; + + public ModelBiped() { + this(0.0F); + } + + public ModelBiped(float var1) { + this(var1, 0.0F); + } + + private ModelBiped(float var1, float var2) { + this.bipedHead = new ModelRenderer(0, 0); + this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1); + this.bipedHead.setRotationPoint(0.0F, 0.0F, 0.0F); + this.bipedHeadwear = new ModelRenderer(32, 0); + this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F); + this.bipedHeadwear.setRotationPoint(0.0F, 0.0F, 0.0F); + this.bipedBody = new ModelRenderer(16, 16); + this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1); + this.bipedBody.setRotationPoint(0.0F, 0.0F, 0.0F); + this.bipedRightArm = new ModelRenderer(40, 16); + this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, var1); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); + this.bipedLeftArm = new ModelRenderer(40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, var1); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); + this.bipedRightLeg = new ModelRenderer(0, 16); + this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1); + this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.bipedLeftLeg = new ModelRenderer(0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1); + this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); + } + + public final void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, 1.0F); + this.bipedHead.render(1.0F); + this.bipedBody.render(1.0F); + this.bipedRightArm.render(1.0F); + this.bipedLeftArm.render(1.0F); + this.bipedRightLeg.render(1.0F); + this.bipedLeftLeg.render(1.0F); + this.bipedHeadwear.render(1.0F); + } + + public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.bipedHead.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.bipedHead.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; + this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; + this.bipedRightArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 2.0F * var2; + this.bipedRightArm.rotateAngleZ = (MathHelper.cos(var1 * 0.2312F) + 1.0F) * var2; + this.bipedLeftArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 2.0F * var2; + this.bipedLeftArm.rotateAngleZ = (MathHelper.cos(var1 * 0.2812F) - 1.0F) * var2; + this.bipedRightLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.bipedLeftLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F; + this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelCreeper.java b/src/teavm/java/net/minecraft/client/model/ModelCreeper.java new file mode 100644 index 0000000..8829f6a --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelCreeper.java @@ -0,0 +1,55 @@ +package net.minecraft.client.model; + +import net.PeytonPlayz585.math.MathHelper; + +public final class ModelCreeper extends ModelBase { + private ModelRenderer head = new ModelRenderer(0, 0); + private ModelRenderer headwear; + private ModelRenderer body; + private ModelRenderer leg1; + private ModelRenderer leg2; + private ModelRenderer leg3; + private ModelRenderer leg4; + + public ModelCreeper() { + this.head.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, 0.0F); + this.head.setRotationPoint(0.0F, 4.0F, 0.0F); + this.headwear = new ModelRenderer(32, 0); + this.headwear.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, 0.5F); + this.headwear.setRotationPoint(0.0F, 4.0F, 0.0F); + this.body = new ModelRenderer(16, 16); + this.body.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, 0.0F); + this.body.setRotationPoint(0.0F, 4.0F, 0.0F); + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.0F); + this.leg1.setRotationPoint(-2.0F, 16.0F, 4.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.0F); + this.leg2.setRotationPoint(2.0F, 16.0F, 4.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.0F); + this.leg3.setRotationPoint(-2.0F, 16.0F, -4.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.0F); + this.leg4.setRotationPoint(2.0F, 16.0F, -4.0F); + } + + public final void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, 1.0F); + this.head.render(1.0F); + this.body.render(1.0F); + this.leg1.render(1.0F); + this.leg2.render(1.0F); + this.leg3.render(1.0F); + this.leg4.render(1.0F); + } + + public final void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.head.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelPig.java b/src/teavm/java/net/minecraft/client/model/ModelPig.java new file mode 100644 index 0000000..35e9dc3 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelPig.java @@ -0,0 +1,7 @@ +package net.minecraft.client.model; + +public final class ModelPig extends ModelQuadruped { + public ModelPig() { + super(6, 0.0F); + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelQuadruped.java b/src/teavm/java/net/minecraft/client/model/ModelQuadruped.java new file mode 100644 index 0000000..31e3b36 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelQuadruped.java @@ -0,0 +1,52 @@ +package net.minecraft.client.model; + +import net.PeytonPlayz585.math.MathHelper; + +public class ModelQuadruped extends ModelBase { + public ModelRenderer head = new ModelRenderer(0, 0); + public ModelRenderer body; + public ModelRenderer leg1; + public ModelRenderer leg2; + public ModelRenderer leg3; + public ModelRenderer leg4; + + public ModelQuadruped(int var1, float var2) { + this.head.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, 0.0F); + this.head.setRotationPoint(0.0F, (float)(18 - var1), -6.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-5.0F, -10.0F, -7.0F, 10, 16, 8, 0.0F); + this.body.setRotationPoint(0.0F, (float)(17 - var1), 2.0F); + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, 0.0F); + this.leg1.setRotationPoint(-3.0F, (float)(24 - var1), 7.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, 0.0F); + this.leg2.setRotationPoint(3.0F, (float)(24 - var1), 7.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, 0.0F); + this.leg3.setRotationPoint(-3.0F, (float)(24 - var1), -5.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, 0.0F); + this.leg4.setRotationPoint(3.0F, (float)(24 - var1), -5.0F); + } + + public final void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, 1.0F); + this.head.render(1.0F); + this.body.render(1.0F); + this.leg1.render(1.0F); + this.leg2.render(1.0F); + this.leg3.render(1.0F); + this.leg4.render(1.0F); + } + + public final void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.head.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.body.rotateAngleX = (float)Math.PI * 0.5F; + this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2; + this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelRenderer.java b/src/teavm/java/net/minecraft/client/model/ModelRenderer.java new file mode 100644 index 0000000..3320ae9 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelRenderer.java @@ -0,0 +1,150 @@ +package net.minecraft.client.model; + +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.physics.Vec3D; +import org.lwjgl.opengl.GL11; + +public final class ModelRenderer { + private PositionTextureVertex[] corners; + private TexturedQuad[] faces; + private int textureOffsetX; + private int textureOffsetY; + private float rotationPointX; + private float rotationPointY; + private float rotationPointZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + private boolean compiled = false; + private int displayList = 0; + public boolean mirror = false; + public boolean showModel = true; + private boolean isHidden = false; + + public ModelRenderer(int var1, int var2) { + this.textureOffsetX = var1; + this.textureOffsetY = var2; + } + + public final void addBox(float var1, float var2, float var3, int var4, int var5, int var6, float var7) { + this.corners = new PositionTextureVertex[8]; + this.faces = new TexturedQuad[6]; + float var8 = var1 + (float)var4; + float var9 = var2 + (float)var5; + float var10 = var3 + (float)var6; + var1 -= var7; + var2 -= var7; + var3 -= var7; + var8 += var7; + var9 += var7; + var10 += var7; + if(this.mirror) { + var7 = var8; + var8 = var1; + var1 = var7; + } + + PositionTextureVertex var20 = new PositionTextureVertex(var1, var2, var3, 0.0F, 0.0F); + PositionTextureVertex var11 = new PositionTextureVertex(var8, var2, var3, 0.0F, 8.0F); + PositionTextureVertex var12 = new PositionTextureVertex(var8, var9, var3, 8.0F, 8.0F); + PositionTextureVertex var18 = new PositionTextureVertex(var1, var9, var3, 8.0F, 0.0F); + PositionTextureVertex var13 = new PositionTextureVertex(var1, var2, var10, 0.0F, 0.0F); + PositionTextureVertex var15 = new PositionTextureVertex(var8, var2, var10, 0.0F, 8.0F); + PositionTextureVertex var21 = new PositionTextureVertex(var8, var9, var10, 8.0F, 8.0F); + PositionTextureVertex var14 = new PositionTextureVertex(var1, var9, var10, 8.0F, 0.0F); + this.corners[0] = var20; + this.corners[1] = var11; + this.corners[2] = var12; + this.corners[3] = var18; + this.corners[4] = var13; + this.corners[5] = var15; + this.corners[6] = var21; + this.corners[7] = var14; + this.faces[0] = new TexturedQuad(new PositionTextureVertex[]{var15, var11, var12, var21}, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6 + var5); + this.faces[1] = new TexturedQuad(new PositionTextureVertex[]{var20, var13, var14, var18}, this.textureOffsetX, this.textureOffsetY + var6, this.textureOffsetX + var6, this.textureOffsetY + var6 + var5); + this.faces[2] = new TexturedQuad(new PositionTextureVertex[]{var15, var13, var20, var11}, this.textureOffsetX + var6, this.textureOffsetY, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6); + this.faces[3] = new TexturedQuad(new PositionTextureVertex[]{var12, var18, var14, var21}, this.textureOffsetX + var6 + var4, this.textureOffsetY, this.textureOffsetX + var6 + var4 + var4, this.textureOffsetY + var6); + this.faces[4] = new TexturedQuad(new PositionTextureVertex[]{var11, var20, var18, var12}, this.textureOffsetX + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6 + var5); + this.faces[5] = new TexturedQuad(new PositionTextureVertex[]{var13, var15, var21, var14}, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6 + var4, this.textureOffsetY + var6 + var5); + if(this.mirror) { + for(int var16 = 0; var16 < this.faces.length; ++var16) { + TexturedQuad var17 = this.faces[var16]; + PositionTextureVertex[] var19 = new PositionTextureVertex[var17.vertexPositions.length]; + + for(var4 = 0; var4 < var17.vertexPositions.length; ++var4) { + var19[var4] = var17.vertexPositions[var17.vertexPositions.length - var4 - 1]; + } + + var17.vertexPositions = var19; + } + } + + } + + public final void setRotationPoint(float var1, float var2, float var3) { + this.rotationPointX = var1; + this.rotationPointY = var2; + this.rotationPointZ = var3; + } + + public final void render(float var1) { + if(this.showModel) { + if(!this.compiled) { + float var3 = var1; + ModelRenderer var2 = this; + this.displayList = GL11.glGenLists(1); + GL11.glNewList(this.displayList, GL11.GL_COMPILE); + Tessellator var4 = Tessellator.instance; + + for(int var5 = 0; var5 < var2.faces.length; ++var5) { + var4.startDrawingQuads(); + TexturedQuad var10000 = var2.faces[var5]; + float var8 = var3; + Tessellator var7 = var4; + TexturedQuad var6 = var10000; + Vec3D var9 = var6.vertexPositions[1].vector3D.subtract(var6.vertexPositions[0].vector3D).normalize(); + Vec3D var10 = var6.vertexPositions[1].vector3D.subtract(var6.vertexPositions[2].vector3D).normalize(); + var9 = (new Vec3D(var9.yCoord * var10.zCoord - var9.zCoord * var10.yCoord, var9.zCoord * var10.xCoord - var9.xCoord * var10.zCoord, var9.xCoord * var10.yCoord - var9.yCoord * var10.xCoord)).normalize(); + Tessellator.setNormal(-var9.xCoord, -var9.yCoord, -var9.zCoord); + + for(int var11 = 0; var11 < 4; ++var11) { + PositionTextureVertex var12 = var6.vertexPositions[var11]; + var7.addVertexWithUV(var12.vector3D.xCoord * var8, var12.vector3D.yCoord * var8, var12.vector3D.zCoord * var8, var12.texturePositionX, var12.texturePositionY); + } + + var4.draw(); + } + + GL11.glEndList(); + var2.compiled = true; + } + + if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if(this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GL11.glCallList(this.displayList); + } else { + GL11.glTranslatef(this.rotationPointX * var1, this.rotationPointY * var1, this.rotationPointZ * var1); + GL11.glCallList(this.displayList); + GL11.glTranslatef(-this.rotationPointX * var1, -this.rotationPointY * var1, -this.rotationPointZ * var1); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * var1, this.rotationPointY * var1, this.rotationPointZ * var1); + if(this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * (180.0F / (float)Math.PI), 0.0F, 0.0F, 1.0F); + } + + if(this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * (180.0F / (float)Math.PI), 0.0F, 1.0F, 0.0F); + } + + if(this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * (180.0F / (float)Math.PI), 1.0F, 0.0F, 0.0F); + } + + GL11.glCallList(this.displayList); + GL11.glPopMatrix(); + } + } + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelSheep.java b/src/teavm/java/net/minecraft/client/model/ModelSheep.java new file mode 100644 index 0000000..94aa937 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelSheep.java @@ -0,0 +1,13 @@ +package net.minecraft.client.model; + +public final class ModelSheep extends ModelQuadruped { + public ModelSheep() { + super(12, 0.0F); + this.head = new ModelRenderer(0, 0); + this.head.addBox(-3.0F, -4.0F, -6.0F, 6, 6, 8, 0.0F); + this.head.setRotationPoint(0.0F, 6.0F, -8.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 0.0F); + this.body.setRotationPoint(0.0F, 5.0F, 2.0F); + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelSheepFur.java b/src/teavm/java/net/minecraft/client/model/ModelSheepFur.java new file mode 100644 index 0000000..5a3dc6f --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelSheepFur.java @@ -0,0 +1,25 @@ +package net.minecraft.client.model; + +public final class ModelSheepFur extends ModelQuadruped { + public ModelSheepFur() { + super(12, 0.0F); + this.head = new ModelRenderer(0, 0); + this.head.addBox(-3.0F, -4.0F, -4.0F, 6, 6, 6, 0.6F); + this.head.setRotationPoint(0.0F, 6.0F, -8.0F); + this.body = new ModelRenderer(28, 8); + this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 1.75F); + this.body.setRotationPoint(0.0F, 5.0F, 2.0F); + this.leg1 = new ModelRenderer(0, 16); + this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F); + this.leg1.setRotationPoint(-3.0F, 12.0F, 7.0F); + this.leg2 = new ModelRenderer(0, 16); + this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F); + this.leg2.setRotationPoint(3.0F, 12.0F, 7.0F); + this.leg3 = new ModelRenderer(0, 16); + this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F); + this.leg3.setRotationPoint(-3.0F, 12.0F, -5.0F); + this.leg4 = new ModelRenderer(0, 16); + this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F); + this.leg4.setRotationPoint(3.0F, 12.0F, -5.0F); + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelSkeleton.java b/src/teavm/java/net/minecraft/client/model/ModelSkeleton.java new file mode 100644 index 0000000..1ac5028 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelSkeleton.java @@ -0,0 +1,20 @@ +package net.minecraft.client.model; + +public final class ModelSkeleton extends ModelZombie { + public ModelSkeleton() { + this.bipedRightArm = new ModelRenderer(40, 16); + this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, 0.0F); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); + this.bipedLeftArm = new ModelRenderer(40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, 0.0F); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); + this.bipedRightLeg = new ModelRenderer(0, 16); + this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, 0.0F); + this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.bipedLeftLeg = new ModelRenderer(0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, 0.0F); + this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelSpider.java b/src/teavm/java/net/minecraft/client/model/ModelSpider.java new file mode 100644 index 0000000..2207c53 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelSpider.java @@ -0,0 +1,112 @@ +package net.minecraft.client.model; + +import net.PeytonPlayz585.math.MathHelper; + +public final class ModelSpider extends ModelBase { + private ModelRenderer spiderHead = new ModelRenderer(32, 4); + private ModelRenderer spiderNeck; + private ModelRenderer spiderBody; + private ModelRenderer spiderLeg1; + private ModelRenderer spiderLeg2; + private ModelRenderer spiderLeg3; + private ModelRenderer spiderLeg4; + private ModelRenderer spiderLeg5; + private ModelRenderer spiderLeg6; + private ModelRenderer spiderLeg7; + private ModelRenderer spiderLeg8; + + public ModelSpider() { + this.spiderHead.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, 0.0F); + this.spiderHead.setRotationPoint(0.0F, 15.0F, -3.0F); + this.spiderNeck = new ModelRenderer(0, 0); + this.spiderNeck.addBox(-3.0F, -3.0F, -3.0F, 6, 6, 6, 0.0F); + this.spiderNeck.setRotationPoint(0.0F, 15.0F, 0.0F); + this.spiderBody = new ModelRenderer(0, 12); + this.spiderBody.addBox(-5.0F, -4.0F, -6.0F, 10, 8, 12, 0.0F); + this.spiderBody.setRotationPoint(0.0F, 15.0F, 9.0F); + this.spiderLeg1 = new ModelRenderer(18, 0); + this.spiderLeg1.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg1.setRotationPoint(-4.0F, 15.0F, 2.0F); + this.spiderLeg2 = new ModelRenderer(18, 0); + this.spiderLeg2.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg2.setRotationPoint(4.0F, 15.0F, 2.0F); + this.spiderLeg3 = new ModelRenderer(18, 0); + this.spiderLeg3.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg3.setRotationPoint(-4.0F, 15.0F, 1.0F); + this.spiderLeg4 = new ModelRenderer(18, 0); + this.spiderLeg4.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg4.setRotationPoint(4.0F, 15.0F, 1.0F); + this.spiderLeg5 = new ModelRenderer(18, 0); + this.spiderLeg5.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg5.setRotationPoint(-4.0F, 15.0F, 0.0F); + this.spiderLeg6 = new ModelRenderer(18, 0); + this.spiderLeg6.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg6.setRotationPoint(4.0F, 15.0F, 0.0F); + this.spiderLeg7 = new ModelRenderer(18, 0); + this.spiderLeg7.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg7.setRotationPoint(-4.0F, 15.0F, -1.0F); + this.spiderLeg8 = new ModelRenderer(18, 0); + this.spiderLeg8.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); + this.spiderLeg8.setRotationPoint(4.0F, 15.0F, -1.0F); + } + + public final void render(float var1, float var2, float var3, float var4, float var5, float var6) { + this.setRotationAngles(var1, var2, var3, var4, var5, 1.0F); + this.spiderHead.render(1.0F); + this.spiderNeck.render(1.0F); + this.spiderBody.render(1.0F); + this.spiderLeg1.render(1.0F); + this.spiderLeg2.render(1.0F); + this.spiderLeg3.render(1.0F); + this.spiderLeg4.render(1.0F); + this.spiderLeg5.render(1.0F); + this.spiderLeg6.render(1.0F); + this.spiderLeg7.render(1.0F); + this.spiderLeg8.render(1.0F); + } + + public final void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + this.spiderHead.rotateAngleY = var4 / (180.0F / (float)Math.PI); + this.spiderHead.rotateAngleX = var5 / (180.0F / (float)Math.PI); + this.spiderLeg1.rotateAngleZ = (float)Math.PI * -0.25F; + this.spiderLeg2.rotateAngleZ = (float)Math.PI * 0.25F; + this.spiderLeg3.rotateAngleZ = -((float)Math.PI * 0.185F); + this.spiderLeg4.rotateAngleZ = (float)Math.PI * 0.185F; + this.spiderLeg5.rotateAngleZ = -((float)Math.PI * 0.185F); + this.spiderLeg6.rotateAngleZ = (float)Math.PI * 0.185F; + this.spiderLeg7.rotateAngleZ = (float)Math.PI * -0.25F; + this.spiderLeg8.rotateAngleZ = (float)Math.PI * 0.25F; + this.spiderLeg1.rotateAngleY = (float)Math.PI * 0.25F; + this.spiderLeg2.rotateAngleY = (float)Math.PI * -0.25F; + this.spiderLeg3.rotateAngleY = (float)Math.PI * 0.125F; + this.spiderLeg4.rotateAngleY = (float)Math.PI * -0.125F; + this.spiderLeg5.rotateAngleY = (float)Math.PI * -0.125F; + this.spiderLeg6.rotateAngleY = (float)Math.PI * 0.125F; + this.spiderLeg7.rotateAngleY = (float)Math.PI * -0.25F; + this.spiderLeg8.rotateAngleY = (float)Math.PI * 0.25F; + var3 = -(MathHelper.cos(var1 * 0.6662F * 2.0F) * 0.4F) * var2; + var4 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * var2; + var5 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 0.5F) * 0.4F) * var2; + var6 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2; + float var7 = Math.abs(MathHelper.sin(var1 * 0.6662F) * 0.4F) * var2; + float var8 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI) * 0.4F) * var2; + float var9 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 0.5F) * 0.4F) * var2; + var1 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2; + this.spiderLeg1.rotateAngleY += var3; + this.spiderLeg2.rotateAngleY -= var3; + this.spiderLeg3.rotateAngleY += var4; + this.spiderLeg4.rotateAngleY -= var4; + this.spiderLeg5.rotateAngleY += var5; + this.spiderLeg6.rotateAngleY -= var5; + this.spiderLeg7.rotateAngleY += var6; + this.spiderLeg8.rotateAngleY -= var6; + this.spiderLeg1.rotateAngleZ += var7; + this.spiderLeg2.rotateAngleZ -= var7; + this.spiderLeg3.rotateAngleZ += var8; + this.spiderLeg4.rotateAngleZ -= var8; + this.spiderLeg5.rotateAngleZ += var9; + this.spiderLeg6.rotateAngleZ -= var9; + this.spiderLeg7.rotateAngleZ += var1; + this.spiderLeg8.rotateAngleZ -= var1; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/ModelZombie.java b/src/teavm/java/net/minecraft/client/model/ModelZombie.java new file mode 100644 index 0000000..60251a3 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/ModelZombie.java @@ -0,0 +1,23 @@ +package net.minecraft.client.model; + +import net.PeytonPlayz585.math.MathHelper; + +public class ModelZombie extends ModelBiped { + public final void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) { + super.setRotationAngles(var1, var2, var3, var4, var5, var6); + var1 = MathHelper.sin(0.0F); + var2 = MathHelper.sin(0.0F); + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = -(0.1F - var1 * 0.6F); + this.bipedLeftArm.rotateAngleY = 0.1F - var1 * 0.6F; + this.bipedRightArm.rotateAngleX = (float)Math.PI * -0.5F; + this.bipedLeftArm.rotateAngleX = (float)Math.PI * -0.5F; + this.bipedRightArm.rotateAngleX -= var1 * 1.2F - var2 * 0.4F; + this.bipedLeftArm.rotateAngleX -= var1 * 1.2F - var2 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F; + this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/PositionTextureVertex.java b/src/teavm/java/net/minecraft/client/model/PositionTextureVertex.java new file mode 100644 index 0000000..5da95e8 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/PositionTextureVertex.java @@ -0,0 +1,29 @@ +package net.minecraft.client.model; + +import net.minecraft.game.physics.Vec3D; + +public final class PositionTextureVertex { + public Vec3D vector3D; + public float texturePositionX; + public float texturePositionY; + + public PositionTextureVertex(float var1, float var2, float var3, float var4, float var5) { + this(new Vec3D(var1, var2, var3), var4, var5); + } + + public final PositionTextureVertex setTexturePosition(float var1, float var2) { + return new PositionTextureVertex(this, var1, var2); + } + + private PositionTextureVertex(PositionTextureVertex var1, float var2, float var3) { + this.vector3D = var1.vector3D; + this.texturePositionX = var2; + this.texturePositionY = var3; + } + + private PositionTextureVertex(Vec3D var1, float var2, float var3) { + this.vector3D = var1; + this.texturePositionX = var2; + this.texturePositionY = var3; + } +} diff --git a/src/teavm/java/net/minecraft/client/model/TexturedQuad.java b/src/teavm/java/net/minecraft/client/model/TexturedQuad.java new file mode 100644 index 0000000..8ecf6e4 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/model/TexturedQuad.java @@ -0,0 +1,17 @@ +package net.minecraft.client.model; + +public final class TexturedQuad { + public PositionTextureVertex[] vertexPositions; + + private TexturedQuad(PositionTextureVertex[] var1) { + this.vertexPositions = var1; + } + + public TexturedQuad(PositionTextureVertex[] var1, int var2, int var3, int var4, int var5) { + this(var1); + var1[0] = var1[0].setTexturePosition((float)var4 / 64.0F - 0.0015625F, (float)var3 / 32.0F + 0.003125F); + var1[1] = var1[1].setTexturePosition((float)var2 / 64.0F + 0.0015625F, (float)var3 / 32.0F + 0.003125F); + var1[2] = var1[2].setTexturePosition((float)var2 / 64.0F + 0.0015625F, (float)var5 / 32.0F - 0.003125F); + var1[3] = var1[3].setTexturePosition((float)var4 / 64.0F - 0.0015625F, (float)var5 / 32.0F - 0.003125F); + } +} diff --git a/src/teavm/java/net/minecraft/client/player/EntityPlayerSP.java b/src/teavm/java/net/minecraft/client/player/EntityPlayerSP.java new file mode 100644 index 0000000..996a799 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/player/EntityPlayerSP.java @@ -0,0 +1,118 @@ +package net.minecraft.client.player; + +import net.PeytonPlayz585.nbt.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Session; +import net.minecraft.client.effect.EntityPickupFX; +import net.minecraft.client.gui.container.GuiChest; +import net.minecraft.client.gui.container.GuiCrafting; +import net.minecraft.client.gui.container.GuiFurnace; +import net.minecraft.game.IInventory; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.tileentity.TileEntityFurnace; + +public class EntityPlayerSP extends EntityPlayer { + public MovementInput movementInput; + private Minecraft mc; + + public EntityPlayerSP(Minecraft var1, World var2, Session var3) { + super(var2); + this.mc = var1; + if(var3 != null) { + this.skinUrl = "http://www.minecraft.net/skin/" + var3.username + ".png"; + } + + } + + public final void updatePlayerActionState() { + this.moveStrafing = this.movementInput.moveStrafe; + this.moveForward = this.movementInput.moveForward; + this.isJumping = this.movementInput.jump; + } + + public final void onLivingUpdate() { + this.movementInput.updatePlayerMoveState(); + super.onLivingUpdate(); + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setInteger("Score", this.getScore); + InventoryPlayer var10002 = this.inventory; + NBTTagList var2 = new NBTTagList(); + InventoryPlayer var5 = var10002; + + int var3; + NBTTagCompound var4; + for(var3 = 0; var3 < var5.mainInventory.length; ++var3) { + if(var5.mainInventory[var3] != null) { + var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + var5.mainInventory[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + for(var3 = 0; var3 < var5.armorInventory.length; ++var3) { + if(var5.armorInventory[var3] != null) { + var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)(var3 + 100)); + var5.armorInventory[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Inventory", var2); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.getScore = var1.getInteger("Score"); + NBTTagList var6 = var1.getTagList("Inventory"); + NBTTagList var2 = var6; + InventoryPlayer var7 = this.inventory; + var7.mainInventory = new ItemStack[36]; + var7.armorInventory = new ItemStack[4]; + + for(int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + int var5 = var4.getByte("Slot") & 255; + if(var5 >= 0 && var5 < var7.mainInventory.length) { + var7.mainInventory[var5] = new ItemStack(var4); + } + + if(var5 >= 100 && var5 < var7.armorInventory.length + 100) { + var7.armorInventory[var5 - 100] = new ItemStack(var4); + } + } + + } + + protected final String getEntityString() { + return "LocalPlayer"; + } + + public final void displayGUIChest(IInventory var1) { + this.mc.displayGuiScreen(new GuiChest(this.inventory, var1)); + } + + public final void displayWorkbenchGUI() { + this.mc.displayGuiScreen(new GuiCrafting(this.inventory)); + } + + public final void displayGUIFurnace(TileEntityFurnace var1) { + this.mc.displayGuiScreen(new GuiFurnace(this.inventory, var1)); + } + + public final void destroyCurrentEquippedItem() { + this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null); + } + + public final void onItemPickup(Entity var1) { + this.mc.effectRenderer.addEffect(new EntityPickupFX(this.mc.theWorld, var1, this, -0.5F)); + } +} diff --git a/src/teavm/java/net/minecraft/client/player/MovementInput.java b/src/teavm/java/net/minecraft/client/player/MovementInput.java new file mode 100644 index 0000000..c39e792 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/player/MovementInput.java @@ -0,0 +1,16 @@ +package net.minecraft.client.player; + +public class MovementInput { + public float moveStrafe = 0.0F; + public float moveForward = 0.0F; + public boolean jump = false; + + public void updatePlayerMoveState() { + } + + public void resetKeyState() { + } + + public void checkKeyForMovementInput(int var1, boolean var2) { + } +} diff --git a/src/teavm/java/net/minecraft/client/player/MovementInputFromOptions.java b/src/teavm/java/net/minecraft/client/player/MovementInputFromOptions.java new file mode 100644 index 0000000..e271221 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/player/MovementInputFromOptions.java @@ -0,0 +1,69 @@ +package net.minecraft.client.player; + +import net.minecraft.client.GameSettings; + +public final class MovementInputFromOptions extends MovementInput { + private boolean[] movementKeyStates = new boolean[10]; + private GameSettings gameSettings; + + public MovementInputFromOptions(GameSettings var1) { + this.gameSettings = var1; + } + + public final void checkKeyForMovementInput(int var1, boolean var2) { + byte var3 = -1; + if(var1 == this.gameSettings.keyBindForward.keyCode) { + var3 = 0; + } + + if(var1 == this.gameSettings.keyBindBack.keyCode) { + var3 = 1; + } + + if(var1 == this.gameSettings.keyBindLeft.keyCode) { + var3 = 2; + } + + if(var1 == this.gameSettings.keyBindRight.keyCode) { + var3 = 3; + } + + if(var1 == this.gameSettings.keyBindJump.keyCode) { + var3 = 4; + } + + if(var3 >= 0) { + this.movementKeyStates[var3] = var2; + } + + } + + public final void resetKeyState() { + for(int var1 = 0; var1 < 10; ++var1) { + this.movementKeyStates[var1] = false; + } + + } + + public final void updatePlayerMoveState() { + this.moveStrafe = 0.0F; + this.moveForward = 0.0F; + if(this.movementKeyStates[0]) { + ++this.moveForward; + } + + if(this.movementKeyStates[1]) { + --this.moveForward; + } + + if(this.movementKeyStates[2]) { + ++this.moveStrafe; + } + + if(this.movementKeyStates[3]) { + --this.moveStrafe; + } + + this.jump = this.movementKeyStates[4]; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/EntityRenderer.java b/src/teavm/java/net/minecraft/client/render/EntityRenderer.java new file mode 100644 index 0000000..0196a74 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/EntityRenderer.java @@ -0,0 +1,542 @@ +package net.minecraft.client.render; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferInt; +import java.awt.image.ImageObserver; +import java.io.File; +import java.io.FileOutputStream; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.text.DecimalFormat; +import java.util.List; +import java.util.Random; +import javax.imageio.ImageIO; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.RenderHelper; +import net.minecraft.client.controller.PlayerControllerCreative; +import net.minecraft.client.effect.EffectRenderer; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.client.render.camera.ClippingHelperImplementation; +import net.minecraft.client.render.camera.Frustrum; +import net.minecraft.client.render.camera.IsomCamera; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +public final class EntityRenderer { + private Minecraft mc; + private boolean anaglyphEnable = false; + private float farPlaneDistance = 0.0F; + public ItemRenderer itemRenderer; + private int rendererUpdateCount; + private Entity pointedEntity = null; + private int entityRendererInt1; + private int entityRendererInt2; + private DecimalFormat entityDecimalFormat = new DecimalFormat("0000"); + private ByteBuffer entityByteBuffer; + private FloatBuffer entityFloatBuffer = BufferUtils.createFloatBuffer(16); + private Random random = new Random(); + private volatile int unusedInt0 = 0; + private volatile int unusedInt1 = 0; + private FloatBuffer fogColorBuffer = BufferUtils.createFloatBuffer(16); + private float fogColorRed; + private float fogColorGreen; + private float fogColorBlue; + private float prevFogColor; + private float fogColor; + + public EntityRenderer(Minecraft var1) { + this.mc = var1; + this.itemRenderer = new ItemRenderer(var1); + } + + public final void updateRenderer() { + this.prevFogColor = this.fogColor; + float var1 = this.mc.theWorld.getLightBrightness((int)this.mc.thePlayer.posX, (int)this.mc.thePlayer.posY, (int)this.mc.thePlayer.posZ); + float var2 = (float)(3 - this.mc.options.renderDistance) / 3.0F; + var1 = var1 * (1.0F - var2) + var2; + this.fogColor += (var1 - this.fogColor) * 0.1F; + ++this.rendererUpdateCount; + this.itemRenderer.updateEquippedItem(); + } + + private Vec3D orientCamera(float var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = var2.prevPosX + (var2.posX - var2.prevPosX) * var1; + float var4 = var2.prevPosY + (var2.posY - var2.prevPosY) * var1; + var1 = var2.prevPosZ + (var2.posZ - var2.prevPosZ) * var1; + return new Vec3D(var3, var4, var1); + } + + private void hurtCameraEffect(float var1) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = (float)var2.hurtTime - var1; + if(var2.health <= 0) { + var1 += (float)var2.deathTime; + GL11.glRotatef(40.0F - 8000.0F / (var1 + 200.0F), 0.0F, 0.0F, 1.0F); + } + + if(var3 >= 0.0F) { + var3 /= (float)var2.maxHurtTime; + var3 = MathHelper.sin(var3 * var3 * var3 * var3 * (float)Math.PI); + var1 = var2.attackedAtYaw; + GL11.glRotatef(-var1, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var3 * 14.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(var1, 0.0F, 1.0F, 0.0F); + } + } + + private void setupViewBobbing(float var1) { + if(!this.mc.options.thirdPersonView) { + EntityPlayerSP var2 = this.mc.thePlayer; + float var3 = var2.distanceWalkedModified - var2.prevDistanceWalkedModified; + var3 = var2.distanceWalkedModified + var3 * var1; + float var4 = var2.prevCameraYaw + (var2.cameraYaw - var2.prevCameraYaw) * var1; + var1 = var2.prevCameraPitch + (var2.cameraPitch - var2.prevCameraPitch) * var1; + GL11.glTranslatef(MathHelper.sin(var3 * (float)Math.PI) * var4 * 0.5F, -Math.abs(MathHelper.cos(var3 * (float)Math.PI) * var4), 0.0F); + GL11.glRotatef(MathHelper.sin(var3 * (float)Math.PI) * var4 * 3.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(Math.abs(MathHelper.cos(var3 * (float)Math.PI + 0.2F) * var4) * 5.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var1, 1.0F, 0.0F, 0.0F); + } + } + + public final void updateCameraAndRender(float var1) { + if(this.anaglyphEnable && !GL11.isFocused()) { + this.mc.displayInGameMenu(); + } + + this.anaglyphEnable = GL11.isFocused(); + int var5; + int var6; + if(this.mc.inventoryScreen) { + GL11.mouseGetDX(); + byte var2 = 0; + GL11.mouseGetDY(); + byte var3 = 0; + this.mc.mouseHelper.ungrabMouse(); + byte var4 = 1; + if(this.mc.options.invertMouse) { + var4 = -1; + } + + var5 = var2 + this.mc.mouseHelper.deltaX; + var6 = var3 - this.mc.mouseHelper.deltaY; + if(var2 != 0 || this.entityRendererInt1 != 0) { + System.out.println("xxo: " + var2 + ", " + this.entityRendererInt1 + ": " + this.entityRendererInt1 + ", xo: " + var5); + } + + if(this.entityRendererInt1 != 0) { + this.entityRendererInt1 = 0; + } + + if(this.entityRendererInt2 != 0) { + this.entityRendererInt2 = 0; + } + + if(var2 != 0) { + this.entityRendererInt1 = var2; + } + + if(var3 != 0) { + this.entityRendererInt2 = var3; + } + + float var10001 = (float)var5; + float var11 = (float)(var6 * var4); + float var9 = var10001; + EntityPlayerSP var7 = this.mc.thePlayer; + float var13 = var7.rotationPitch; + float var14 = var7.rotationYaw; + var7.rotationYaw = (float)((double)var7.rotationYaw + (double)var9 * 0.15D); + var7.rotationPitch = (float)((double)var7.rotationPitch - (double)var11 * 0.15D); + if(var7.rotationPitch < -90.0F) { + var7.rotationPitch = -90.0F; + } + + if(var7.rotationPitch > 90.0F) { + var7.rotationPitch = 90.0F; + } + + var7.prevRotationPitch += var7.rotationPitch - var13; + var7.prevRotationYaw += var7.rotationYaw - var14; + } + + ScaledResolution var8 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var10 = var8.getScaledWidth(); + int var12 = var8.getScaledHeight(); + var5 = GL11.mouseGetX() * var10 / this.mc.displayWidth; + var6 = var12 - GL11.mouseGetY() * var12 / this.mc.displayHeight - 1; + if(this.mc.theWorld != null) { + this.getMouseOver(var1); + this.mc.ingameGUI.renderGameOverlay(var1); + } else { + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + this.setupOverlayRendering(); + } + + if(this.mc.currentScreen != null) { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + this.mc.currentScreen.drawScreen(var5, var6, var1); + } + + Thread.yield(); + GL11.updateDisplay(); + } + + private void getMouseOver(float var1) { + EntityRenderer var7 = this; + EntityPlayerSP var9 = this.mc.thePlayer; + float var2 = var9.prevRotationPitch + (var9.rotationPitch - var9.prevRotationPitch) * var1; + float var10 = var9.prevRotationYaw + (var9.rotationYaw - var9.prevRotationYaw) * var1; + Vec3D var11 = this.orientCamera(var1); + float var12 = MathHelper.cos(-var10 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var13 = MathHelper.sin(-var10 * ((float)Math.PI / 180.0F) - (float)Math.PI); + float var14 = -MathHelper.cos(-var2 * ((float)Math.PI / 180.0F)); + float var15 = MathHelper.sin(-var2 * ((float)Math.PI / 180.0F)); + float var16 = var13 * var14; + float var17 = var12 * var14; + float var18 = this.mc.playerController.getBlockReachDistance(); + Vec3D var19 = var11.addVector(var16 * var18, var15 * var18, var17 * var18); + this.mc.objectMouseOver = this.mc.theWorld.rayTraceBlocks(var11, var19); + float var20 = var18; + var11 = this.orientCamera(var1); + if(this.mc.objectMouseOver != null) { + var20 = this.mc.objectMouseOver.hitVec.distance(var11); + } + + if(this.mc.playerController instanceof PlayerControllerCreative) { + var18 = 32.0F; + } else { + if(var20 > 3.0F) { + var20 = 3.0F; + } + + var18 = var20; + } + + var19 = var11.addVector(var16 * var18, var15 * var18, var17 * var18); + this.pointedEntity = null; + List var8 = this.mc.theWorld.entityMap.getEntitiesWithinAABB(var9, var9.boundingBox.addCoord(var16 * var18, var15 * var18, var17 * var18)); + float var28 = 0.0F; + + for(int var41 = 0; var41 < var8.size(); ++var41) { + Entity var21 = (Entity)var8.get(var41); + if(var21.canBeCollidedWith()) { + AxisAlignedBB var22 = var21.boundingBox.expand(0.1F, 0.1F, 0.1F); + MovingObjectPosition var23 = var22.calculateIntercept(var11, var19); + if(var23 != null) { + var2 = var11.distance(var23.hitVec); + if(var2 < var28 || var28 == 0.0F) { + var7.pointedEntity = var21; + var28 = var2; + } + } + } + } + + if(var7.pointedEntity != null && !(var7.mc.playerController instanceof PlayerControllerCreative)) { + var7.mc.objectMouseOver = new MovingObjectPosition(var7.pointedEntity); + } + + for(int var24 = 0; var24 < 2; ++var24) { + if(this.mc.options.anaglyph) { + if(var24 == 0) { + GL11.glColorMask(false, true, true, false); + } else { + GL11.glColorMask(true, false, false, false); + } + } + + EntityPlayerSP var3 = this.mc.thePlayer; + World var4 = this.mc.theWorld; + RenderGlobal var5 = this.mc.renderGlobal; + EffectRenderer var6 = this.mc.effectRenderer; + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + this.updateFogColor(var1); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + float var27 = var1; + this.farPlaneDistance = (float)(512 >> (this.mc.options.renderDistance << 1)); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + if(this.mc.options.anaglyph) { + GL11.glTranslatef((float)(-((var24 << 1) - 1)) * 0.07F, 0.0F, 0.0F); + } + + EntityPlayerSP var34 = this.mc.thePlayer; + var13 = 70.0F; + if(var34.isInsideOfWater()) { + var13 = 60.0F; + } + + if(var34.health <= 0) { + var14 = (float)var34.deathTime + var1; + var13 /= (1.0F - 500.0F / (var14 + 500.0F)) * 2.0F + 1.0F; + } + + GL11.gluPerspective(var13, (float)this.mc.displayWidth / (float)this.mc.displayHeight, 0.05F, this.farPlaneDistance); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + if(this.mc.options.anaglyph) { + GL11.glTranslatef((float)((var24 << 1) - 1) * 0.1F, 0.0F, 0.0F); + } + + this.hurtCameraEffect(var1); + if(this.mc.options.fancyGraphics) { + this.setupViewBobbing(var1); + } + + EntityRenderer var30 = this; + var34 = this.mc.thePlayer; + var13 = var34.prevPosX + (var34.posX - var34.prevPosX) * var1; + var14 = var34.prevPosY + (var34.posY - var34.prevPosY) * var1; + var15 = var34.prevPosZ + (var34.posZ - var34.prevPosZ) * var1; + if(!this.mc.options.thirdPersonView) { + GL11.glTranslatef(0.0F, 0.0F, -0.1F); + } else { + var16 = 4.0F; + float var25 = -MathHelper.sin(var34.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(var34.rotationPitch / 180.0F * (float)Math.PI) * 4.0F; + var17 = MathHelper.cos(var34.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(var34.rotationPitch / 180.0F * (float)Math.PI) * 4.0F; + var18 = -MathHelper.sin(var34.rotationPitch / 180.0F * (float)Math.PI) * 4.0F; + + for(int var39 = 0; var39 < 8; ++var39) { + var20 = (float)(((var39 & 1) << 1) - 1); + var27 = (float)(((var39 >> 1 & 1) << 1) - 1); + var28 = (float)(((var39 >> 2 & 1) << 1) - 1); + var20 *= 0.1F; + var27 *= 0.1F; + var28 *= 0.1F; + MovingObjectPosition var42 = var30.mc.theWorld.rayTraceBlocks(new Vec3D(var13 + var20, var14 + var27, var15 + var28), new Vec3D(var13 - var25 + var20 + var28, var14 - var18 + var27, var15 - var17 + var28)); + if(var42 != null) { + float var40 = var42.hitVec.distance(new Vec3D(var13, var14, var15)); + if(var40 < var16) { + var16 = var40; + } + } + } + + GL11.glTranslatef(0.0F, 0.0F, -var16); + } + + GL11.glRotatef(var34.prevRotationPitch + (var34.rotationPitch - var34.prevRotationPitch) * var27, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var34.prevRotationYaw + (var34.rotationYaw - var34.prevRotationYaw) * var27 + 180.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-var13, -var14, -var15); + ClippingHelperImplementation.init(); + this.setupFog(); + GL11.glEnable(GL11.GL_FOG); + var5.renderSky(var1); + this.setupFog(); + Frustrum var26 = new Frustrum(); + this.mc.renderGlobal.clipRenderersByFrustrum(var26); + this.mc.renderGlobal.updateRenderers(var3); + this.setupFog(); + GL11.glEnable(GL11.GL_FOG); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + RenderHelper.disableStandardItemLighting(); + var5.sortAndRender(var3, 0); + int var29; + if(var4.isSolid(var3.posX, var3.posY, var3.posZ, 0.1F)) { + var29 = (int)var3.posX; + int var31 = (int)var3.posY; + int var32 = (int)var3.posZ; + RenderBlocks var33 = new RenderBlocks(var4); + + for(int var35 = var29 - 1; var35 <= var29 + 1; ++var35) { + for(int var37 = var31 - 1; var37 <= var31 + 1; ++var37) { + for(int var36 = var32 - 1; var36 <= var32 + 1; ++var36) { + int var38 = var4.getBlockId(var35, var37, var36); + if(var38 > 0) { + var33.renderBlockAllFaces(Block.blocksList[var38], var35, var37, var36); + } + } + } + } + } + + RenderHelper.enableStandardItemLighting(); + var5.renderEntities(this.orientCamera(var1), var26, var1); + var6.renderLitParticles(var1); + RenderHelper.disableStandardItemLighting(); + this.setupFog(); + var6.renderParticles(var3, var1); + var5.oobGroundRenderer(); + if(this.mc.objectMouseOver != null && var3.isInsideOfWater()) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + var5.drawBlockBreaking(this.mc.objectMouseOver, 0, var3.inventory.getCurrentItem()); + var5.drawSelectionBox(this.mc.objectMouseOver, 0); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + this.setupFog(); + var5.oobWaterRenderer(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glColorMask(false, false, false, false); + var29 = var5.sortAndRender(var3, 1); + GL11.glColorMask(true, true, true, true); + if(this.mc.options.anaglyph) { + if(var24 == 0) { + GL11.glColorMask(false, true, true, false); + } else { + GL11.glColorMask(true, false, false, false); + } + } + + if(var29 > 0) { + var5.renderAllRenderLists(); + } + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_BLEND); + if(this.mc.objectMouseOver != null && !var3.isInsideOfWater()) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + var5.drawBlockBreaking(this.mc.objectMouseOver, 0, var3.inventory.getCurrentItem()); + var5.drawSelectionBox(this.mc.objectMouseOver, 0); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + GL11.glDisable(GL11.GL_FOG); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glLoadIdentity(); + if(this.mc.options.anaglyph) { + GL11.glTranslatef((float)((var24 << 1) - 1) * 0.1F, 0.0F, 0.0F); + } + + GL11.glPushMatrix(); + this.hurtCameraEffect(var1); + if(this.mc.options.fancyGraphics) { + this.setupViewBobbing(var1); + } + + if(!this.mc.options.thirdPersonView) { + this.itemRenderer.renderItemInFirstPerson(var1); + } + + GL11.glPopMatrix(); + if(!this.mc.options.thirdPersonView) { + this.itemRenderer.renderOverlays(var1); + this.hurtCameraEffect(var1); + } + + if(this.mc.options.fancyGraphics) { + this.setupViewBobbing(var1); + } + + if(!this.mc.options.anaglyph) { + return; + } + } + + GL11.glColorMask(true, true, true, false); + } + + public final void setupOverlayRendering() { + ScaledResolution var1 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight); + int var2 = var1.getScaledWidth(); + int var3 = var1.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, (double)var2, (double)var3, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + } + + private void updateFogColor(float var1) { + World var2 = this.mc.theWorld; + EntityPlayerSP var3 = this.mc.thePlayer; + float var4 = 1.0F / (float)(4 - this.mc.options.renderDistance); + var4 = 1.0F - (float)Math.pow((double)var4, 0.25D); + Vec3D var5 = var2.getSkyColor(var1); + float var6 = var5.xCoord; + float var7 = var5.yCoord; + float var13 = var5.zCoord; + Vec3D var8 = var2.getFogColor(var1); + this.fogColorRed = var8.xCoord; + this.fogColorGreen = var8.yCoord; + this.fogColorBlue = var8.zCoord; + this.fogColorRed += (var6 - this.fogColorRed) * var4; + this.fogColorGreen += (var7 - this.fogColorGreen) * var4; + this.fogColorBlue += (var13 - this.fogColorBlue) * var4; + Block var9 = Block.blocksList[var2.getBlockId((int)var3.posX, (int)(var3.posY + 0.12F), (int)var3.posZ)]; + if(var9 != null && var9.material != Material.air) { + Material var10 = var9.material; + if(var10 == Material.water) { + this.fogColorRed = 0.02F; + this.fogColorGreen = 0.02F; + this.fogColorBlue = 0.2F; + } else if(var10 == Material.lava) { + this.fogColorRed = 0.6F; + this.fogColorGreen = 0.1F; + this.fogColorBlue = 0.0F; + } + } + + float var11 = this.prevFogColor + (this.fogColor - this.prevFogColor) * var1; + this.fogColorRed *= var11; + this.fogColorGreen *= var11; + this.fogColorBlue *= var11; + if(this.mc.options.anaglyph) { + var1 = (this.fogColorRed * 30.0F + this.fogColorGreen * 59.0F + this.fogColorBlue * 11.0F) / 100.0F; + var11 = (this.fogColorRed * 30.0F + this.fogColorGreen * 70.0F) / 100.0F; + float var12 = (this.fogColorRed * 30.0F + this.fogColorBlue * 70.0F) / 100.0F; + this.fogColorRed = var1; + this.fogColorGreen = var11; + this.fogColorBlue = var12; + } + + GL11.glClearColor(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 0.0F); + } + + private void setupFog() { + World var1 = this.mc.theWorld; + EntityPlayerSP var2 = this.mc.thePlayer; + int var10000 = GL11.GL_FOG_COLOR; + float var3 = 1.0F; + float var6 = this.fogColorBlue; + float var5 = this.fogColorGreen; + float var4 = this.fogColorRed; + this.fogColorBuffer.clear(); + this.fogColorBuffer.put(var4).put(var5).put(var6).put(1.0F); + this.fogColorBuffer.flip(); + GL11.glFog(var10000, this.fogColorBuffer); + GL11.glNormal3f(0.0F, -1.0F, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Block var7 = Block.blocksList[var1.getBlockId((int)var2.posX, (int)(var2.posY + 0.12F), (int)var2.posZ)]; + if(var7 != null && var7.material.getIsLiquid()) { + Material var8 = var7.material; + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); + if(var8 == Material.water) { + GL11.glFogf(GL11.GL_FOG_DENSITY, 0.1F); + } else if(var8 == Material.lava) { + GL11.glFogf(GL11.GL_FOG_DENSITY, 2.0F); + } + } else { + GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GL11.glFogf(GL11.GL_FOG_START, this.farPlaneDistance / 4.0F); + GL11.glFogf(GL11.GL_FOG_END, this.farPlaneDistance); + } + + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/EntitySorter.java b/src/teavm/java/net/minecraft/client/render/EntitySorter.java new file mode 100644 index 0000000..ff36c3d --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/EntitySorter.java @@ -0,0 +1,19 @@ +package net.minecraft.client.render; + +import java.util.Comparator; +import net.minecraft.game.entity.player.EntityPlayer; + +public final class EntitySorter implements Comparator { + private EntityPlayer player; + + public EntitySorter(EntityPlayer var1) { + this.player = var1; + } + + public final int compare(Object var1, Object var2) { + WorldRenderer var10001 = (WorldRenderer)var1; + WorldRenderer var3 = (WorldRenderer)var2; + WorldRenderer var4 = var10001; + return var4.distanceToEntitySquared(this.player) < var3.distanceToEntitySquared(this.player) ? -1 : 1; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/ImageBufferDownload.java b/src/teavm/java/net/minecraft/client/render/ImageBufferDownload.java new file mode 100644 index 0000000..50edcca --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/ImageBufferDownload.java @@ -0,0 +1,72 @@ +package net.minecraft.client.render; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferInt; +import java.awt.image.ImageObserver; + +public class ImageBufferDownload { + private int[] imageData; + private int imageWidth; + private int imageHeight; + + public BufferedImage parseUserSkin(BufferedImage var1) { + this.imageWidth = 64; + this.imageHeight = 32; + BufferedImage var2 = new BufferedImage(this.imageWidth, this.imageHeight, 2); + Graphics var3 = var2.getGraphics(); + var3.drawImage(var1, 0, 0, (ImageObserver)null); + var3.dispose(); + this.imageData = ((DataBufferInt)var2.getRaster().getDataBuffer()).getData(); + this.setAreaOpaque(0, 0, 32, 16); + this.setAreaTransparent(32, 0, 64, 32); + this.setAreaOpaque(0, 16, 64, 32); + return var2; + } + + private void setAreaTransparent(int var1, int var2, int var3, int var4) { + byte var5 = 32; + byte var11 = 64; + byte var10 = 0; + byte var9 = 32; + ImageBufferDownload var8 = this; + var2 = var9; + + boolean var10000; + label43: + while(true) { + if(var2 >= var11) { + var10000 = false; + break; + } + + for(int var6 = var10; var6 < var5; ++var6) { + int var7 = var8.imageData[var2 + var6 * var8.imageWidth]; + if(var7 >>> 24 < 128) { + var10000 = true; + break label43; + } + } + + ++var2; + } + + if(!var10000) { + for(var1 = 32; var1 < 64; ++var1) { + for(var2 = 0; var2 < 32; ++var2) { + this.imageData[var1 + var2 * this.imageWidth] &= 16777215; + } + } + + } + } + + private void setAreaOpaque(int var1, int var2, int var3, int var4) { + for(var1 = 0; var1 < var3; ++var1) { + for(int var5 = var2; var5 < var4; ++var5) { + this.imageData[var1 + var5 * this.imageWidth] |= -16777216; + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/ItemRenderer.java b/src/teavm/java/net/minecraft/client/render/ItemRenderer.java new file mode 100644 index 0000000..497d7b1 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/ItemRenderer.java @@ -0,0 +1,304 @@ +package net.minecraft.client.render; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.RenderHelper; +import net.minecraft.client.player.EntityPlayerSP; +import net.minecraft.client.render.entity.Render; +import net.minecraft.client.render.entity.RenderManager; +import net.minecraft.client.render.entity.RenderPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; +import org.lwjgl.opengl.GL11; + +public final class ItemRenderer { + private Minecraft mc; + private ItemStack itemToRender = null; + private float equippedProgress = 0.0F; + private float prevEquippedProgress = 0.0F; + private int swingProgress = 0; + private boolean itemSwingState = false; + private RenderBlocks renderBlocksInstance = new RenderBlocks(); + + public ItemRenderer(Minecraft var1) { + this.mc = var1; + } + + public final void renderItemInFirstPerson(float var1) { + float var2 = this.prevEquippedProgress + (this.equippedProgress - this.prevEquippedProgress) * var1; + EntityPlayerSP var3 = this.mc.thePlayer; + GL11.glPushMatrix(); + GL11.glRotatef(var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var1, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var1, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + float var9 = this.mc.theWorld.getLightBrightness((int)var3.posX, (int)var3.posY, (int)var3.posZ); + GL11.glColor4f(var9, var9, var9, 1.0F); + float var4; + float var5; + if(this.itemToRender != null) { + GL11.glPushMatrix(); + if(this.itemSwingState) { + var9 = ((float)this.swingProgress + var1) / 8.0F; + var4 = MathHelper.sin(var9 * (float)Math.PI); + var5 = MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI); + GL11.glTranslatef(-var5 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI * 2.0F) * 0.2F, -var4 * 0.2F); + } + + GL11.glTranslatef(0.56F, -0.52F - (1.0F - var2) * 0.6F, -0.71999997F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL11.GL_NORMALIZE); + if(this.itemSwingState) { + var9 = ((float)this.swingProgress + var1) / 8.0F; + var4 = MathHelper.sin(var9 * var9 * (float)Math.PI); + var5 = MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI); + GL11.glRotatef(-var4 * 20.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var5 * 20.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-var5 * 80.0F, 1.0F, 0.0F, 0.0F); + } + + GL11.glScalef(0.4F, 0.4F, 0.4F); + if(this.itemToRender.itemID < 256 && Block.blocksList[this.itemToRender.itemID].getRenderType() == 0) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + this.renderBlocksInstance.renderBlockOnInventory(Block.blocksList[this.itemToRender.itemID]); + } else { + if(this.itemToRender.itemID < 256) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); + } else { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/items.png")); + } + + Tessellator var11 = Tessellator.instance; + ItemStack var10 = this.itemToRender; + var5 = (float)(var10.getItem().getIconIndex() % 16 << 4) / 256.0F; + var10 = this.itemToRender; + var1 = (float)((var10.getItem().getIconIndex() % 16 << 4) + 16) / 256.0F; + var10 = this.itemToRender; + var2 = (float)(var10.getItem().getIconIndex() / 16 << 4) / 256.0F; + var10 = this.itemToRender; + var9 = (float)((var10.getItem().getIconIndex() / 16 << 4) + 16) / 256.0F; + GL11.glEnable(GL11.GL_NORMALIZE); + GL11.glTranslatef(0.0F, -0.3F, 0.0F); + GL11.glScalef(1.5F, 1.5F, 1.5F); + GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-(15.0F / 16.0F), -(1.0F / 16.0F), 0.0F); + Tessellator.setNormal(0.0F, 0.0F, 1.0F); + var11.startDrawingQuads(); + var11.addVertexWithUV(0.0F, 0.0F, 0.0F, var1, var9); + var11.addVertexWithUV(1.0F, 0.0F, 0.0F, var5, var9); + var11.addVertexWithUV(1.0F, 1.0F, 0.0F, var5, var2); + var11.addVertexWithUV(0.0F, 1.0F, 0.0F, var1, var2); + var11.draw(); + Tessellator.setNormal(0.0F, 0.0F, -1.0F); + var11.startDrawingQuads(); + var11.addVertexWithUV(0.0F, 1.0F, -(1.0F / 16.0F), var1, var2); + var11.addVertexWithUV(1.0F, 1.0F, -(1.0F / 16.0F), var5, var2); + var11.addVertexWithUV(1.0F, 0.0F, -(1.0F / 16.0F), var5, var9); + var11.addVertexWithUV(0.0F, 0.0F, -(1.0F / 16.0F), var1, var9); + var11.draw(); + Tessellator.setNormal(-1.0F, 0.0F, 0.0F); + var11.startDrawingQuads(); + + int var6; + float var7; + float var8; + for(var6 = 0; var6 < 16; ++var6) { + var7 = (float)var6 / 16.0F; + var8 = var1 + (var5 - var1) * var7 - 0.001953125F; + var7 *= 1.0F; + var11.addVertexWithUV(var7, 0.0F, -(1.0F / 16.0F), var8, var9); + var11.addVertexWithUV(var7, 0.0F, 0.0F, var8, var9); + var11.addVertexWithUV(var7, 1.0F, 0.0F, var8, var2); + var11.addVertexWithUV(var7, 1.0F, -(1.0F / 16.0F), var8, var2); + } + + var11.draw(); + Tessellator.setNormal(1.0F, 0.0F, 0.0F); + var11.startDrawingQuads(); + + for(var6 = 0; var6 < 16; ++var6) { + var7 = (float)var6 / 16.0F; + var8 = var1 + (var5 - var1) * var7 - 0.001953125F; + var7 = var7 * 1.0F + 1.0F / 16.0F; + var11.addVertexWithUV(var7, 1.0F, -(1.0F / 16.0F), var8, var2); + var11.addVertexWithUV(var7, 1.0F, 0.0F, var8, var2); + var11.addVertexWithUV(var7, 0.0F, 0.0F, var8, var9); + var11.addVertexWithUV(var7, 0.0F, -(1.0F / 16.0F), var8, var9); + } + + var11.draw(); + Tessellator.setNormal(0.0F, 1.0F, 0.0F); + var11.startDrawingQuads(); + + for(var6 = 0; var6 < 16; ++var6) { + var7 = (float)var6 / 16.0F; + var8 = var9 + (var2 - var9) * var7 - 0.001953125F; + var7 = var7 * 1.0F + 1.0F / 16.0F; + var11.addVertexWithUV(0.0F, var7, 0.0F, var1, var8); + var11.addVertexWithUV(1.0F, var7, 0.0F, var5, var8); + var11.addVertexWithUV(1.0F, var7, -(1.0F / 16.0F), var5, var8); + var11.addVertexWithUV(0.0F, var7, -(1.0F / 16.0F), var1, var8); + } + + var11.draw(); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + var11.startDrawingQuads(); + + for(var6 = 0; var6 < 16; ++var6) { + var7 = (float)var6 / 16.0F; + var8 = var9 + (var2 - var9) * var7 - 0.001953125F; + var7 *= 1.0F; + var11.addVertexWithUV(1.0F, var7, 0.0F, var5, var8); + var11.addVertexWithUV(0.0F, var7, 0.0F, var1, var8); + var11.addVertexWithUV(0.0F, var7, -(1.0F / 16.0F), var1, var8); + var11.addVertexWithUV(1.0F, var7, -(1.0F / 16.0F), var5, var8); + } + + var11.draw(); + GL11.glDisable(GL11.GL_NORMALIZE); + } + + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + if(this.itemSwingState) { + var9 = ((float)this.swingProgress + var1) / 8.0F; + var4 = MathHelper.sin(var9 * (float)Math.PI); + var5 = MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI); + GL11.glTranslatef(-var5 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI * 2.0F) * 0.4F, -var4 * 0.4F); + } + + GL11.glTranslatef(0.64000005F, -0.6F - (1.0F - var2) * 0.6F, -0.71999997F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL11.GL_NORMALIZE); + if(this.itemSwingState) { + var9 = ((float)this.swingProgress + var1) / 8.0F; + var4 = MathHelper.sin(var9 * var9 * (float)Math.PI); + var5 = MathHelper.sin(MathHelper.sqrt_float(var9) * (float)Math.PI); + GL11.glRotatef(var5 * 70.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-var4 * 20.0F, 0.0F, 0.0F, 1.0F); + } + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getTexture())); + GL11.glTranslatef(-0.2F, -0.3F, 0.1F); + GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F / 16.0F, 1.0F / 16.0F, 1.0F / 16.0F); + GL11.glTranslatef(6.0F, 0.0F, 0.0F); + Render var13 = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer); + RenderPlayer var12 = (RenderPlayer)var13; + var12.drawFirstPersonHand(); + GL11.glPopMatrix(); + } + + GL11.glDisable(GL11.GL_NORMALIZE); + RenderHelper.disableStandardItemLighting(); + } + + public final void renderOverlays(float var1) { + GL11.glDisable(GL11.GL_ALPHA_TEST); + int var2; + Tessellator var3; + float var7; + float var9; + if(this.mc.thePlayer.fire > 0) { + var2 = this.mc.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2); + var3 = Tessellator.instance; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.9F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + for(var2 = 0; var2 < 2; ++var2) { + GL11.glPushMatrix(); + int var4 = Block.fire.blockIndexInTexture + (var2 << 4); + int var5 = (var4 & 15) << 4; + var4 &= 240; + float var6 = (float)var5 / 256.0F; + float var10 = ((float)var5 + 15.99F) / 256.0F; + var7 = (float)var4 / 256.0F; + var9 = ((float)var4 + 15.99F) / 256.0F; + GL11.glTranslatef((float)(-((var2 << 1) - 1)) * 0.24F, -0.3F, 0.0F); + GL11.glRotatef((float)((var2 << 1) - 1) * 10.0F, 0.0F, 1.0F, 0.0F); + var3.startDrawingQuads(); + var3.addVertexWithUV(-0.5F, -0.5F, -0.5F, var10, var9); + var3.addVertexWithUV(0.5F, -0.5F, -0.5F, var6, var9); + var3.addVertexWithUV(0.5F, 0.5F, -0.5F, var6, var7); + var3.addVertexWithUV(-0.5F, 0.5F, -0.5F, var10, var7); + var3.draw(); + GL11.glPopMatrix(); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + } + + if(this.mc.thePlayer.isInsideOfWater()) { + var2 = this.mc.renderEngine.getTexture("/water.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2); + var3 = Tessellator.instance; + float var8 = this.mc.thePlayer.getEntityBrightness(var1); + GL11.glColor4f(var8, var8, var8, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glPushMatrix(); + var7 = -this.mc.thePlayer.rotationYaw / 64.0F; + var9 = this.mc.thePlayer.rotationPitch / 64.0F; + var3.startDrawingQuads(); + var3.addVertexWithUV(-1.0F, -1.0F, -0.5F, var7 + 4.0F, var9 + 4.0F); + var3.addVertexWithUV(1.0F, -1.0F, -0.5F, var7 + 0.0F, var9 + 4.0F); + var3.addVertexWithUV(1.0F, 1.0F, -0.5F, var7 + 0.0F, var9 + 0.0F); + var3.addVertexWithUV(-1.0F, 1.0F, -0.5F, var7 + 4.0F, var9 + 0.0F); + var3.draw(); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + } + + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + public final void updateEquippedItem() { + this.prevEquippedProgress = this.equippedProgress; + if(this.itemSwingState) { + ++this.swingProgress; + if(this.swingProgress == 8) { + this.swingProgress = 0; + this.itemSwingState = false; + } + } + + EntityPlayerSP var1 = this.mc.thePlayer; + ItemStack var3 = var1.inventory.getCurrentItem(); + float var2 = var3 == this.itemToRender ? 1.0F : 0.0F; + var2 -= this.equippedProgress; + if(var2 < -0.4F) { + var2 = -0.4F; + } + + if(var2 > 0.4F) { + var2 = 0.4F; + } + + this.equippedProgress += var2; + if(this.equippedProgress < 0.1F) { + this.itemToRender = var3; + } + + } + + public final void equipAnimationSpeed() { + this.equippedProgress = 0.0F; + } + + public final void equippedItemRender() { + this.swingProgress = -1; + this.itemSwingState = true; + } + + public final void resetEquippedProgress() { + this.equippedProgress = 0.0F; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/RenderBlocks.java b/src/teavm/java/net/minecraft/client/render/RenderBlocks.java new file mode 100644 index 0000000..4471547 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/RenderBlocks.java @@ -0,0 +1,808 @@ +package net.minecraft.client.render; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.material.Material; +import org.lwjgl.opengl.GL11; + +public final class RenderBlocks { + private World blockAccess; + private int overrideBlockTexture = -1; + private boolean renderAllFaces = false; + + public RenderBlocks(World var1) { + this.blockAccess = var1; + } + + public RenderBlocks() { + } + + public final void renderBlockUsingTexture(Block var1, int var2, int var3, int var4, int var5) { + this.overrideBlockTexture = var5; + this.renderBlockByRenderType(var1, var2, var3, var4); + this.overrideBlockTexture = -1; + } + + public final void renderBlockAllFaces(Block var1, int var2, int var3, int var4) { + this.renderAllFaces = true; + this.renderBlockByRenderType(var1, var2, var3, var4); + this.renderAllFaces = false; + } + + public final boolean renderBlockByRenderType(Block var1, int var2, int var3, int var4) { + int var5 = var1.getRenderType(); + Tessellator var6; + float var10; + boolean var26; + if(var5 == 0) { + var6 = Tessellator.instance; + var26 = false; + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(0.5F * var10, 0.5F * var10, 0.5F * var10); + this.renderBlockBottom(var1, (float)var2, (float)var3, (float)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(var10 * 1.0F, var10 * 1.0F, var10 * 1.0F); + this.renderBlockTop(var1, (float)var2, (float)var3, (float)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(0.8F * var10, 0.8F * var10, 0.8F * var10); + this.renderBlockNorth(var1, var2, var3, var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(0.8F * var10, 0.8F * var10, 0.8F * var10); + this.renderBlockSouth(var1, var2, var3, var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(0.6F * var10, 0.6F * var10, 0.6F * var10); + this.renderBlockWest(var1, var2, var3, var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) { + var10 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4); + if(Block.lightValue[var1.blockID] > 0) { + var10 = 1.0F; + } + + var6.setColorOpaque_F(0.6F * var10, 0.6F * var10, 0.6F * var10); + this.renderBlockEast(var1, var2, var3, var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5)); + var26 = true; + } + + return var26; + } else { + float var11; + float var22; + if(var5 == 4) { + var6 = Tessellator.instance; + var26 = false; + var10 = var1.minY; + var11 = var1.maxY; + var1.maxY = var11 - this.materialNotWater(var2, var3, var4); + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4); + var6.setColorOpaque_F(0.5F * var22, 0.5F * var22, 0.5F * var22); + this.renderBlockBottom(var1, (float)var2, (float)var3, (float)var4, var1.getBlockTextureFromSide(0)); + var26 = true; + } + + if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4); + var6.setColorOpaque_F(var22 * 1.0F, var22 * 1.0F, var22 * 1.0F); + this.renderBlockTop(var1, (float)var2, (float)var3, (float)var4, var1.getBlockTextureFromSide(1)); + var26 = true; + } + + var1.minY = var11 - this.materialNotWater(var2, var3, var4 - 1); + if(this.renderAllFaces || var1.maxY > var1.minY || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1); + var6.setColorOpaque_F(0.8F * var22, 0.8F * var22, 0.8F * var22); + this.renderBlockNorth(var1, var2, var3, var4, var1.getBlockTextureFromSide(2)); + var26 = true; + } + + var1.minY = var11 - this.materialNotWater(var2, var3, var4 + 1); + if(this.renderAllFaces || var1.maxY > var1.minY || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1); + var6.setColorOpaque_F(0.8F * var22, 0.8F * var22, 0.8F * var22); + this.renderBlockSouth(var1, var2, var3, var4, var1.getBlockTextureFromSide(3)); + var26 = true; + } + + var1.minY = var11 - this.materialNotWater(var2 - 1, var3, var4); + if(this.renderAllFaces || var1.maxY > var1.minY || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4); + var6.setColorOpaque_F(0.6F * var22, 0.6F * var22, 0.6F * var22); + this.renderBlockWest(var1, var2, var3, var4, var1.getBlockTextureFromSide(4)); + var26 = true; + } + + var1.minY = var11 - this.materialNotWater(var2 + 1, var3, var4); + if(this.renderAllFaces || var1.maxY > var1.minY || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) { + var22 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4); + var6.setColorOpaque_F(0.6F * var22, 0.6F * var22, 0.6F * var22); + this.renderBlockEast(var1, var2, var3, var4, var1.getBlockTextureFromSide(5)); + var26 = true; + } + + var1.minY = var10; + var1.maxY = var11; + return var26; + } else if(var5 == 1) { + var6 = Tessellator.instance; + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var6.setColorOpaque_F(var22, var22, var22); + this.renderBlockPlant(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (float)var2, (float)var3, (float)var4); + return true; + } else if(var5 == 6) { + var6 = Tessellator.instance; + var22 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + var6.setColorOpaque_F(var22, var22, var22); + this.renderBlockCrops(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (float)var2, (float)var3 - 1.0F / 16.0F, (float)var4); + return true; + } else { + float var8; + if(var5 == 2) { + byte var21 = this.blockAccess.getBlockMetadata(var2, var3, var4); + Tessellator var25 = Tessellator.instance; + var8 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4); + if(Block.lightValue[var1.blockID] > 0) { + var8 = 1.0F; + } + + var25.setColorOpaque_F(var8, var8, var8); + if(var21 == 1) { + this.renderBlockTorch(var1, (float)var2 - 10.0F * 0.01F, (float)var3 + 0.2F, (float)var4, -0.4F, 0.0F); + } else if(var21 == 2) { + this.renderBlockTorch(var1, (float)var2 + 10.0F * 0.01F, (float)var3 + 0.2F, (float)var4, 0.4F, 0.0F); + } else if(var21 == 3) { + this.renderBlockTorch(var1, (float)var2, (float)var3 + 0.2F, (float)var4 - 10.0F * 0.01F, 0.0F, -0.4F); + } else if(var21 == 4) { + this.renderBlockTorch(var1, (float)var2, (float)var3 + 0.2F, (float)var4 + 10.0F * 0.01F, 0.0F, 0.4F); + } else { + this.renderBlockTorch(var1, (float)var2, (float)var3, (float)var4, 0.0F, 0.0F); + } + + return true; + } else { + int var7; + float var12; + float var13; + float var14; + float var15; + int var23; + if(var5 == 3) { + var5 = var4; + var4 = var3; + var3 = var2; + var6 = Tessellator.instance; + var7 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var7 = this.overrideBlockTexture; + } + + var8 = var1.getBlockBrightness(this.blockAccess, var2, var4, var5); + var6.setColorOpaque_F(var8, var8, var8); + var2 = (var7 & 15) << 4; + var23 = var7 & 240; + float var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)var23 / 256.0F; + var22 = ((float)var23 + 15.99F) / 256.0F; + float var16; + float var19; + if(!this.blockAccess.isBlockNormalCube(var3, var4 - 1, var5) && !Block.fire.canBlockCatchFire(this.blockAccess, var3, var4 - 1, var5)) { + if((var3 + var4 + var5 & 1) == 1) { + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)(var23 + 16) / 256.0F; + var22 = ((float)var23 + 15.99F + 16.0F) / 256.0F; + } + + if((var3 / 2 + var4 / 2 + var5 / 2 & 1) == 1) { + var14 = var10; + var10 = var24; + var24 = var14; + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var3 - 1, var4, var5)) { + var6.addVertexWithUV((float)var3 + 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)var3 + 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5, var24, var11); + var6.addVertexWithUV((float)var3 + 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5, var24, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)var3 + 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1), var10, var11); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var3 + 1, var4, var5)) { + var6.addVertexWithUV((float)(var3 + 1) - 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5, var24, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)(var3 + 1) - 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV((float)(var3 + 1) - 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)(var3 + 1) - 0.2F, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5, var24, var11); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var3, var4, var5 - 1)) { + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5 + 0.2F, var10, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)var5, var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5 + 0.2F, var24, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5 + 0.2F, var24, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)var5, var24, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)var5, var10, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F + 1.0F / 16.0F, (float)var5 + 0.2F, var10, var11); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var3, var4, var5 + 1)) { + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1) - 0.2F, var24, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var24, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1) - 0.2F, var10, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1) - 0.2F, var10, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.0F / 16.0F, (float)(var5 + 1), var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F + 1.0F / 16.0F, (float)(var5 + 1) - 0.2F, var24, var11); + } + + if(Block.fire.canBlockCatchFire(this.blockAccess, var3, var4 + 1, var5)) { + var14 = (float)var3 + 0.5F + 0.5F; + var15 = (float)var3 + 0.5F - 0.5F; + var19 = (float)var5 + 0.5F + 0.5F; + var16 = (float)var5 + 0.5F - 0.5F; + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)var23 / 256.0F; + var22 = ((float)var23 + 15.99F) / 256.0F; + ++var4; + if((var3 + var4 + var5 & 1) == 0) { + var6.addVertexWithUV(var15, (float)var4 + -0.2F, (float)var5, var10, var11); + var6.addVertexWithUV(var14, (float)var4, (float)var5, var10, var22); + var6.addVertexWithUV(var14, (float)var4, (float)(var5 + 1), var24, var22); + var6.addVertexWithUV(var15, (float)var4 + -0.2F, (float)(var5 + 1), var24, var11); + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)(var23 + 16) / 256.0F; + var22 = ((float)var23 + 15.99F + 16.0F) / 256.0F; + var6.addVertexWithUV(var14, (float)var4 + -0.2F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV(var15, (float)var4, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV(var15, (float)var4, (float)var5, var24, var22); + var6.addVertexWithUV(var14, (float)var4 + -0.2F, (float)var5, var24, var11); + } else { + var6.addVertexWithUV((float)var3, (float)var4 + -0.2F, var19, var10, var11); + var6.addVertexWithUV((float)var3, (float)var4, var16, var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var16, var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + -0.2F, var19, var24, var11); + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)(var23 + 16) / 256.0F; + var22 = ((float)var23 + 15.99F + 16.0F) / 256.0F; + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + -0.2F, var16, var10, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var19, var10, var22); + var6.addVertexWithUV((float)var3, (float)var4, var19, var24, var22); + var6.addVertexWithUV((float)var3, (float)var4 + -0.2F, var16, var24, var11); + } + } + } else { + var12 = (float)var3 + 0.5F + 0.2F; + var13 = (float)var3 + 0.5F - 0.2F; + var14 = (float)var5 + 0.5F + 0.2F; + var15 = (float)var5 + 0.5F - 0.2F; + var19 = (float)var3 + 0.5F - 0.3F; + var16 = (float)var3 + 0.5F + 0.3F; + float var17 = (float)var5 + 0.5F - 0.3F; + float var18 = (float)var5 + 0.5F + 0.3F; + var6.addVertexWithUV(var19, (float)var4 + 1.4F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV(var12, (float)var4, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV(var12, (float)var4, (float)var5, var24, var22); + var6.addVertexWithUV(var19, (float)var4 + 1.4F, (float)var5, var24, var11); + var6.addVertexWithUV(var16, (float)var4 + 1.4F, (float)var5, var10, var11); + var6.addVertexWithUV(var13, (float)var4, (float)var5, var10, var22); + var6.addVertexWithUV(var13, (float)var4, (float)(var5 + 1), var24, var22); + var6.addVertexWithUV(var16, (float)var4 + 1.4F, (float)(var5 + 1), var24, var11); + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)(var23 + 16) / 256.0F; + var22 = ((float)var23 + 15.99F + 16.0F) / 256.0F; + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F, var18, var10, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var15, var10, var22); + var6.addVertexWithUV((float)var3, (float)var4, var15, var24, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F, var18, var24, var11); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F, var17, var10, var11); + var6.addVertexWithUV((float)var3, (float)var4, var14, var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var14, var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F, var17, var24, var11); + var12 = (float)var3 + 0.5F - 0.5F; + var13 = (float)var3 + 0.5F + 0.5F; + var14 = (float)var5 + 0.5F - 0.5F; + var15 = (float)var5 + 0.5F + 0.5F; + var19 = (float)var3 + 0.5F - 0.4F; + var16 = (float)var3 + 0.5F + 0.4F; + var17 = (float)var5 + 0.5F - 0.4F; + var18 = (float)var5 + 0.5F + 0.4F; + var6.addVertexWithUV(var19, (float)var4 + 1.4F, (float)var5, var24, var11); + var6.addVertexWithUV(var12, (float)var4, (float)var5, var24, var22); + var6.addVertexWithUV(var12, (float)var4, (float)(var5 + 1), var10, var22); + var6.addVertexWithUV(var19, (float)var4 + 1.4F, (float)(var5 + 1), var10, var11); + var6.addVertexWithUV(var16, (float)var4 + 1.4F, (float)(var5 + 1), var24, var11); + var6.addVertexWithUV(var13, (float)var4, (float)(var5 + 1), var24, var22); + var6.addVertexWithUV(var13, (float)var4, (float)var5, var10, var22); + var6.addVertexWithUV(var16, (float)var4 + 1.4F, (float)var5, var10, var11); + var24 = (float)var2 / 256.0F; + var10 = ((float)var2 + 15.99F) / 256.0F; + var11 = (float)var23 / 256.0F; + var22 = ((float)var23 + 15.99F) / 256.0F; + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F, var18, var24, var11); + var6.addVertexWithUV((float)var3, (float)var4, var15, var24, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var15, var10, var22); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F, var18, var10, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4 + 1.4F, var17, var24, var11); + var6.addVertexWithUV((float)(var3 + 1), (float)var4, var14, var24, var22); + var6.addVertexWithUV((float)var3, (float)var4, var14, var10, var22); + var6.addVertexWithUV((float)var3, (float)var4 + 1.4F, var17, var10, var11); + } + + return true; + } else if(var5 == 5) { + var5 = var4; + var4 = var3; + var3 = var2; + var6 = Tessellator.instance; + var7 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var7 = this.overrideBlockTexture; + } + + var8 = var1.getBlockBrightness(this.blockAccess, var2, var4, var5); + var6.setColorOpaque_F(var8, var8, var8); + var2 = ((var7 & 15) << 4) + 16; + var23 = (var7 & 15) << 4; + int var9 = var7 & 240; + if((var3 + var4 + var5 & 1) == 1) { + var2 = (var7 & 15) << 4; + var23 = ((var7 & 15) << 4) + 16; + } + + var10 = (float)var2 / 256.0F; + var11 = ((float)var2 + 15.99F) / 256.0F; + var22 = (float)var9 / 256.0F; + float var20 = ((float)var9 + 15.99F) / 256.0F; + var12 = (float)var23 / 256.0F; + var13 = ((float)var23 + 15.99F) / 256.0F; + var14 = (float)var9 / 256.0F; + var15 = ((float)var9 + 15.99F) / 256.0F; + if(this.blockAccess.isBlockNormalCube(var3 - 1, var4, var5)) { + var6.addVertexWithUV((float)var3 + 0.05F, (float)(var4 + 1) + 2.0F / 16.0F, (float)(var5 + 1) + 2.0F / 16.0F, var10, var22); + var6.addVertexWithUV((float)var3 + 0.05F, (float)var4 - 2.0F / 16.0F, (float)(var5 + 1) + 2.0F / 16.0F, var10, var20); + var6.addVertexWithUV((float)var3 + 0.05F, (float)var4 - 2.0F / 16.0F, (float)var5 - 2.0F / 16.0F, var11, var20); + var6.addVertexWithUV((float)var3 + 0.05F, (float)(var4 + 1) + 2.0F / 16.0F, (float)var5 - 2.0F / 16.0F, var11, var22); + } + + if(this.blockAccess.isBlockNormalCube(var3 + 1, var4, var5)) { + var6.addVertexWithUV((float)(var3 + 1) - 0.05F, (float)var4 - 2.0F / 16.0F, (float)(var5 + 1) + 2.0F / 16.0F, var11, var20); + var6.addVertexWithUV((float)(var3 + 1) - 0.05F, (float)(var4 + 1) + 2.0F / 16.0F, (float)(var5 + 1) + 2.0F / 16.0F, var11, var22); + var6.addVertexWithUV((float)(var3 + 1) - 0.05F, (float)(var4 + 1) + 2.0F / 16.0F, (float)var5 - 2.0F / 16.0F, var10, var22); + var6.addVertexWithUV((float)(var3 + 1) - 0.05F, (float)var4 - 2.0F / 16.0F, (float)var5 - 2.0F / 16.0F, var10, var20); + } + + if(this.blockAccess.isBlockNormalCube(var3, var4, var5 - 1)) { + var6.addVertexWithUV((float)(var3 + 1) + 2.0F / 16.0F, (float)var4 - 2.0F / 16.0F, (float)var5 + 0.05F, var13, var15); + var6.addVertexWithUV((float)(var3 + 1) + 2.0F / 16.0F, (float)(var4 + 1) + 2.0F / 16.0F, (float)var5 + 0.05F, var13, var14); + var6.addVertexWithUV((float)var3 - 2.0F / 16.0F, (float)(var4 + 1) + 2.0F / 16.0F, (float)var5 + 0.05F, var12, var14); + var6.addVertexWithUV((float)var3 - 2.0F / 16.0F, (float)var4 - 2.0F / 16.0F, (float)var5 + 0.05F, var12, var15); + } + + if(this.blockAccess.isBlockNormalCube(var3, var4, var5 + 1)) { + var6.addVertexWithUV((float)(var3 + 1) + 2.0F / 16.0F, (float)(var4 + 1) + 2.0F / 16.0F, (float)(var5 + 1) - 0.05F, var12, var14); + var6.addVertexWithUV((float)(var3 + 1) + 2.0F / 16.0F, (float)var4 - 2.0F / 16.0F, (float)(var5 + 1) - 0.05F, var12, var15); + var6.addVertexWithUV((float)var3 - 2.0F / 16.0F, (float)var4 - 2.0F / 16.0F, (float)(var5 + 1) - 0.05F, var13, var15); + var6.addVertexWithUV((float)var3 - 2.0F / 16.0F, (float)(var4 + 1) + 2.0F / 16.0F, (float)(var5 + 1) - 0.05F, var13, var14); + } + + return true; + } else { + return false; + } + } + } + } + } + + private void renderBlockTorch(Block var1, float var2, float var3, float var4, float var5, float var6) { + Tessellator var7 = Tessellator.instance; + int var19 = var1.getBlockTextureFromSide(0); + if(this.overrideBlockTexture >= 0) { + var19 = this.overrideBlockTexture; + } + + int var8 = (var19 & 15) << 4; + var19 &= 240; + float var9 = (float)var8 / 256.0F; + float var21 = ((float)var8 + 15.99F) / 256.0F; + float var10 = (float)var19 / 256.0F; + float var20 = ((float)var19 + 15.99F) / 256.0F; + float var11 = var9 + 0.02734375F; + float var12 = var10 + 0.0234375F; + float var13 = var9 + 0.03515625F; + float var14 = var10 + 0.03125F; + var2 += 0.5F; + var4 += 0.5F; + float var15 = var2 - 0.5F; + float var16 = var2 + 0.5F; + float var17 = var4 - 0.5F; + float var18 = var4 + 0.5F; + var7.addVertexWithUV(var2 + var5 * (6.0F / 16.0F) - 1.0F / 16.0F, var3 + 10.0F / 16.0F, var4 + var6 * (6.0F / 16.0F) - 1.0F / 16.0F, var11, var12); + var7.addVertexWithUV(var2 + var5 * (6.0F / 16.0F) - 1.0F / 16.0F, var3 + 10.0F / 16.0F, var4 + var6 * (6.0F / 16.0F) + 1.0F / 16.0F, var11, var14); + var7.addVertexWithUV(var2 + var5 * (6.0F / 16.0F) + 1.0F / 16.0F, var3 + 10.0F / 16.0F, var4 + var6 * (6.0F / 16.0F) + 1.0F / 16.0F, var13, var14); + var7.addVertexWithUV(var2 + var5 * (6.0F / 16.0F) + 1.0F / 16.0F, var3 + 10.0F / 16.0F, var4 + var6 * (6.0F / 16.0F) - 1.0F / 16.0F, var13, var12); + var7.addVertexWithUV(var2 - 1.0F / 16.0F, var3 + 1.0F, var17, var9, var10); + var7.addVertexWithUV(var2 - 1.0F / 16.0F + var5, var3, var17 + var6, var9, var20); + var7.addVertexWithUV(var2 - 1.0F / 16.0F + var5, var3, var18 + var6, var21, var20); + var7.addVertexWithUV(var2 - 1.0F / 16.0F, var3 + 1.0F, var18, var21, var10); + var7.addVertexWithUV(var2 + 1.0F / 16.0F, var3 + 1.0F, var18, var9, var10); + var7.addVertexWithUV(var2 + var5 + 1.0F / 16.0F, var3, var18 + var6, var9, var20); + var7.addVertexWithUV(var2 + var5 + 1.0F / 16.0F, var3, var17 + var6, var21, var20); + var7.addVertexWithUV(var2 + 1.0F / 16.0F, var3 + 1.0F, var17, var21, var10); + var7.addVertexWithUV(var15, var3 + 1.0F, var4 + 1.0F / 16.0F, var9, var10); + var7.addVertexWithUV(var15 + var5, var3, var4 + 1.0F / 16.0F + var6, var9, var20); + var7.addVertexWithUV(var16 + var5, var3, var4 + 1.0F / 16.0F + var6, var21, var20); + var7.addVertexWithUV(var16, var3 + 1.0F, var4 + 1.0F / 16.0F, var21, var10); + var7.addVertexWithUV(var16, var3 + 1.0F, var4 - 1.0F / 16.0F, var9, var10); + var7.addVertexWithUV(var16 + var5, var3, var4 - 1.0F / 16.0F + var6, var9, var20); + var7.addVertexWithUV(var15 + var5, var3, var4 - 1.0F / 16.0F + var6, var21, var20); + var7.addVertexWithUV(var15, var3 + 1.0F, var4 - 1.0F / 16.0F, var21, var10); + } + + private void renderBlockPlant(Block var1, int var2, float var3, float var4, float var5) { + Tessellator var6 = Tessellator.instance; + int var11 = var1.getBlockTextureFromSideAndMetadata(0, var2); + if(this.overrideBlockTexture >= 0) { + var11 = this.overrideBlockTexture; + } + + var2 = (var11 & 15) << 4; + var11 &= 240; + float var7 = (float)var2 / 256.0F; + float var12 = ((float)var2 + 15.99F) / 256.0F; + float var8 = (float)var11 / 256.0F; + float var13 = ((float)var11 + 15.99F) / 256.0F; + float var9 = var3 + 0.5F - 0.45F; + var3 = var3 + 0.5F + 0.45F; + float var10 = var5 + 0.5F - 0.45F; + var5 = var5 + 0.5F + 0.45F; + var6.addVertexWithUV(var9, var4 + 1.0F, var10, var7, var8); + var6.addVertexWithUV(var9, var4, var10, var7, var13); + var6.addVertexWithUV(var3, var4, var5, var12, var13); + var6.addVertexWithUV(var3, var4 + 1.0F, var5, var12, var8); + var6.addVertexWithUV(var3, var4 + 1.0F, var5, var7, var8); + var6.addVertexWithUV(var3, var4, var5, var7, var13); + var6.addVertexWithUV(var9, var4, var10, var12, var13); + var6.addVertexWithUV(var9, var4 + 1.0F, var10, var12, var8); + var6.addVertexWithUV(var9, var4 + 1.0F, var5, var7, var8); + var6.addVertexWithUV(var9, var4, var5, var7, var13); + var6.addVertexWithUV(var3, var4, var10, var12, var13); + var6.addVertexWithUV(var3, var4 + 1.0F, var10, var12, var8); + var6.addVertexWithUV(var3, var4 + 1.0F, var10, var7, var8); + var6.addVertexWithUV(var3, var4, var10, var7, var13); + var6.addVertexWithUV(var9, var4, var5, var12, var13); + var6.addVertexWithUV(var9, var4 + 1.0F, var5, var12, var8); + } + + private void renderBlockCrops(Block var1, int var2, float var3, float var4, float var5) { + Tessellator var6 = Tessellator.instance; + int var13 = var1.getBlockTextureFromSideAndMetadata(0, var2); + if(this.overrideBlockTexture >= 0) { + var13 = this.overrideBlockTexture; + } + + var2 = (var13 & 15) << 4; + var13 &= 240; + float var7 = (float)var2 / 256.0F; + float var14 = ((float)var2 + 15.99F) / 256.0F; + float var8 = (float)var13 / 256.0F; + float var15 = ((float)var13 + 15.99F) / 256.0F; + float var9 = var3 + 0.5F - 0.25F; + float var10 = var3 + 0.5F + 0.25F; + float var11 = var5 + 0.5F - 0.5F; + float var12 = var5 + 0.5F + 0.5F; + var6.addVertexWithUV(var9, var4 + 1.0F, var11, var7, var8); + var6.addVertexWithUV(var9, var4, var11, var7, var15); + var6.addVertexWithUV(var9, var4, var12, var14, var15); + var6.addVertexWithUV(var9, var4 + 1.0F, var12, var14, var8); + var6.addVertexWithUV(var9, var4 + 1.0F, var12, var7, var8); + var6.addVertexWithUV(var9, var4, var12, var7, var15); + var6.addVertexWithUV(var9, var4, var11, var14, var15); + var6.addVertexWithUV(var9, var4 + 1.0F, var11, var14, var8); + var6.addVertexWithUV(var10, var4 + 1.0F, var12, var7, var8); + var6.addVertexWithUV(var10, var4, var12, var7, var15); + var6.addVertexWithUV(var10, var4, var11, var14, var15); + var6.addVertexWithUV(var10, var4 + 1.0F, var11, var14, var8); + var6.addVertexWithUV(var10, var4 + 1.0F, var11, var7, var8); + var6.addVertexWithUV(var10, var4, var11, var7, var15); + var6.addVertexWithUV(var10, var4, var12, var14, var15); + var6.addVertexWithUV(var10, var4 + 1.0F, var12, var14, var8); + var9 = var3 + 0.5F - 0.5F; + var10 = var3 + 0.5F + 0.5F; + var11 = var5 + 0.5F - 0.25F; + var12 = var5 + 0.5F + 0.25F; + var6.addVertexWithUV(var9, var4 + 1.0F, var11, var7, var8); + var6.addVertexWithUV(var9, var4, var11, var7, var15); + var6.addVertexWithUV(var10, var4, var11, var14, var15); + var6.addVertexWithUV(var10, var4 + 1.0F, var11, var14, var8); + var6.addVertexWithUV(var10, var4 + 1.0F, var11, var7, var8); + var6.addVertexWithUV(var10, var4, var11, var7, var15); + var6.addVertexWithUV(var9, var4, var11, var14, var15); + var6.addVertexWithUV(var9, var4 + 1.0F, var11, var14, var8); + var6.addVertexWithUV(var10, var4 + 1.0F, var12, var7, var8); + var6.addVertexWithUV(var10, var4, var12, var7, var15); + var6.addVertexWithUV(var9, var4, var12, var14, var15); + var6.addVertexWithUV(var9, var4 + 1.0F, var12, var14, var8); + var6.addVertexWithUV(var9, var4 + 1.0F, var12, var7, var8); + var6.addVertexWithUV(var9, var4, var12, var7, var15); + var6.addVertexWithUV(var10, var4, var12, var14, var15); + var6.addVertexWithUV(var10, var4 + 1.0F, var12, var14, var8); + } + + private float materialNotWater(int var1, int var2, int var3) { + return this.blockAccess.getBlockMaterial(var1, var2, var3) != Material.water ? 1.0F : (float)this.blockAccess.getBlockMetadata(var1, var2, var3) / 9.0F; + } + + private void renderBlockBottom(Block var1, float var2, float var3, float var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var14 = ((float)var7 + 15.99F) / 256.0F; + float var9 = (float)var5 / 256.0F; + float var13 = ((float)var5 + 15.99F) / 256.0F; + float var10 = var2 + var1.minX; + var2 += var1.maxX; + var3 += var1.minY; + float var11 = var4 + var1.minZ; + float var12 = var4 + var1.maxZ; + var6.addVertexWithUV(var10, var3, var12, var8, var13); + var6.addVertexWithUV(var10, var3, var11, var8, var9); + var6.addVertexWithUV(var2, var3, var11, var14, var9); + var6.addVertexWithUV(var2, var3, var12, var14, var13); + } + + private void renderBlockTop(Block var1, float var2, float var3, float var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var14 = ((float)var7 + 15.99F) / 256.0F; + float var9 = (float)var5 / 256.0F; + float var13 = ((float)var5 + 15.99F) / 256.0F; + float var10 = var2 + var1.minX; + var2 += var1.maxX; + var3 += var1.maxY; + float var11 = var4 + var1.minZ; + float var12 = var4 + var1.maxZ; + var6.addVertexWithUV(var2, var3, var12, var14, var13); + var6.addVertexWithUV(var2, var3, var11, var14, var9); + var6.addVertexWithUV(var10, var3, var11, var8, var9); + var6.addVertexWithUV(var10, var3, var12, var8, var13); + } + + private void renderBlockNorth(Block var1, int var2, int var3, int var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var16 = ((float)var7 + 15.99F) / 256.0F; + float var9; + float var15; + if(var1.minY >= 0.0F && var1.maxY <= 1.0F) { + var9 = ((float)var5 + var1.minY * 15.99F) / 256.0F; + var15 = ((float)var5 + var1.maxY * 15.99F) / 256.0F; + } else { + var9 = (float)var5 / 256.0F; + var15 = ((float)var5 + 15.99F) / 256.0F; + } + + float var10 = (float)var2 + var1.minX; + float var13 = (float)var2 + var1.maxX; + float var11 = (float)var3 + var1.minY; + float var14 = (float)var3 + var1.maxY; + float var12 = (float)var4 + var1.minZ; + var6.addVertexWithUV(var10, var14, var12, var16, var9); + var6.addVertexWithUV(var13, var14, var12, var8, var9); + var6.addVertexWithUV(var13, var11, var12, var8, var15); + var6.addVertexWithUV(var10, var11, var12, var16, var15); + } + + private void renderBlockSouth(Block var1, int var2, int var3, int var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var16 = ((float)var7 + 15.99F) / 256.0F; + float var9; + float var15; + if(var1.minY >= 0.0F && var1.maxY <= 1.0F) { + var9 = ((float)var5 + var1.minY * 15.99F) / 256.0F; + var15 = ((float)var5 + var1.maxY * 15.99F) / 256.0F; + } else { + var9 = (float)var5 / 256.0F; + var15 = ((float)var5 + 15.99F) / 256.0F; + } + + float var10 = (float)var2 + var1.minX; + float var13 = (float)var2 + var1.maxX; + float var11 = (float)var3 + var1.minY; + float var14 = (float)var3 + var1.maxY; + float var12 = (float)var4 + var1.maxZ; + var6.addVertexWithUV(var10, var14, var12, var8, var9); + var6.addVertexWithUV(var10, var11, var12, var8, var15); + var6.addVertexWithUV(var13, var11, var12, var16, var15); + var6.addVertexWithUV(var13, var14, var12, var16, var9); + } + + private void renderBlockWest(Block var1, int var2, int var3, int var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var16 = ((float)var7 + 15.99F) / 256.0F; + float var9; + float var15; + if(var1.minY >= 0.0F && var1.maxY <= 1.0F) { + var9 = ((float)var5 + var1.minY * 15.99F) / 256.0F; + var15 = ((float)var5 + var1.maxY * 15.99F) / 256.0F; + } else { + var9 = (float)var5 / 256.0F; + var15 = ((float)var5 + 15.99F) / 256.0F; + } + + float var13 = (float)var2 + var1.minX; + float var10 = (float)var3 + var1.minY; + float var14 = (float)var3 + var1.maxY; + float var11 = (float)var4 + var1.minZ; + float var12 = (float)var4 + var1.maxZ; + var6.addVertexWithUV(var13, var14, var12, var16, var9); + var6.addVertexWithUV(var13, var14, var11, var8, var9); + var6.addVertexWithUV(var13, var10, var11, var8, var15); + var6.addVertexWithUV(var13, var10, var12, var16, var15); + } + + private void renderBlockEast(Block var1, int var2, int var3, int var4, int var5) { + Tessellator var6 = Tessellator.instance; + if(this.overrideBlockTexture >= 0) { + var5 = this.overrideBlockTexture; + } + + int var7 = (var5 & 15) << 4; + var5 &= 240; + float var8 = (float)var7 / 256.0F; + float var16 = ((float)var7 + 15.99F) / 256.0F; + float var9; + float var15; + if(var1.minY >= 0.0F && var1.maxY <= 1.0F) { + var9 = ((float)var5 + var1.minY * 15.99F) / 256.0F; + var15 = ((float)var5 + var1.maxY * 15.99F) / 256.0F; + } else { + var9 = (float)var5 / 256.0F; + var15 = ((float)var5 + 15.99F) / 256.0F; + } + + float var13 = (float)var2 + var1.maxX; + float var10 = (float)var3 + var1.minY; + float var14 = (float)var3 + var1.maxY; + float var11 = (float)var4 + var1.minZ; + float var12 = (float)var4 + var1.maxZ; + var6.addVertexWithUV(var13, var10, var12, var8, var15); + var6.addVertexWithUV(var13, var10, var11, var16, var15); + var6.addVertexWithUV(var13, var14, var11, var16, var9); + var6.addVertexWithUV(var13, var14, var12, var8, var9); + } + + public final void renderBlockOnInventory(Block var1) { + Tessellator var2 = Tessellator.instance; + int var3 = var1.getRenderType(); + if(var3 == 0) { + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + this.renderBlockBottom(var1, 0.0F, 0.0F, 0.0F, var1.getBlockTextureFromSide(0)); + var2.draw(); + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, 1.0F, 0.0F); + this.renderBlockTop(var1, 0.0F, 0.0F, 0.0F, var1.getBlockTextureFromSide(1)); + var2.draw(); + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, 0.0F, -1.0F); + this.renderBlockNorth(var1, 0, 0, 0, var1.getBlockTextureFromSide(2)); + var2.draw(); + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, 0.0F, 1.0F); + this.renderBlockSouth(var1, 0, 0, 0, var1.getBlockTextureFromSide(3)); + var2.draw(); + var2.startDrawingQuads(); + Tessellator.setNormal(-1.0F, 0.0F, 0.0F); + this.renderBlockWest(var1, 0, 0, 0, var1.getBlockTextureFromSide(4)); + var2.draw(); + var2.startDrawingQuads(); + Tessellator.setNormal(1.0F, 0.0F, 0.0F); + this.renderBlockEast(var1, 0, 0, 0, var1.getBlockTextureFromSide(5)); + var2.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + } else if(var3 == 1) { + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + this.renderBlockPlant(var1, -1, -0.5F, -0.5F, -0.5F); + var2.draw(); + } else if(var3 == 6) { + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + this.renderBlockCrops(var1, -1, -0.5F, -0.5F, -0.5F); + var2.draw(); + } else { + if(var3 == 2) { + var2.startDrawingQuads(); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + this.renderBlockTorch(var1, -0.5F, -0.5F, -0.5F, 0.0F, 0.0F); + var2.draw(); + } + + } + } +} diff --git a/src/teavm/java/net/minecraft/client/render/RenderEngine.java b/src/teavm/java/net/minecraft/client/render/RenderEngine.java new file mode 100644 index 0000000..4d8ae39 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/RenderEngine.java @@ -0,0 +1,247 @@ +package net.minecraft.client.render; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.ImageObserver; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import javax.imageio.ImageIO; +import net.minecraft.client.GameSettings; +import net.minecraft.client.render.texture.TextureFX; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +public class RenderEngine { + private HashMap textureMap = new HashMap(); + private HashMap textureContentsMap = new HashMap(); + private IntBuffer singleIntBuffer = BufferUtils.createIntBuffer(1); + private ByteBuffer imageData = BufferUtils.createByteBuffer(262144); + private List textureList = new ArrayList(); + private Map urlToImageDataMap = new HashMap(); + private GameSettings options; + private boolean clampTexture = false; + + public RenderEngine(GameSettings var1) { + this.options = var1; + } + + public final int getTexture(String var1) { + Integer var2 = (Integer)this.textureMap.get(var1); + if(var2 != null) { + return var2.intValue(); + } else { + try { + this.singleIntBuffer.clear(); + GL11.glGenTextures(this.singleIntBuffer); + int var4 = this.singleIntBuffer.get(0); + if(var1.startsWith("##")) { + this.setupTexture(unwrapImageByColumns(ImageIO.read(RenderEngine.class.getResourceAsStream(var1.substring(2)))), var4); + } else if(var1.startsWith("%%")) { + this.clampTexture = true; + this.setupTexture(ImageIO.read(RenderEngine.class.getResourceAsStream(var1.substring(2))), var4); + this.clampTexture = false; + } else { + this.setupTexture(ImageIO.read(RenderEngine.class.getResourceAsStream(var1)), var4); + } + + this.textureMap.put(var1, Integer.valueOf(var4)); + return var4; + } catch (IOException var3) { + throw new RuntimeException("!!"); + } + } + } + + private static BufferedImage unwrapImageByColumns(BufferedImage var0) { + int var1 = var0.getWidth() / 16; + BufferedImage var2 = new BufferedImage(16, var0.getHeight() * var1, 2); + Graphics var3 = var2.getGraphics(); + + for(int var4 = 0; var4 < var1; ++var4) { + var3.drawImage(var0, -var4 << 4, var4 * var0.getHeight(), (ImageObserver)null); + } + + var3.dispose(); + return var2; + } + + private void setupTexture(BufferedImage var1, int var2) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + if(this.clampTexture) { + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); + } else { + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + } + + var2 = var1.getWidth(); + int var3 = var1.getHeight(); + int[] var4 = new int[var2 * var3]; + byte[] var5 = new byte[var2 * var3 << 2]; + var1.getRGB(0, 0, var2, var3, var4, 0, var2); + + for(int var11 = 0; var11 < var4.length; ++var11) { + int var6 = var4[var11] >>> 24; + int var7 = var4[var11] >> 16 & 255; + int var8 = var4[var11] >> 8 & 255; + int var9 = var4[var11] & 255; + if(this.options != null && this.options.anaglyph) { + int var10 = (var7 * 30 + var8 * 59 + var9 * 11) / 100; + var8 = (var7 * 30 + var8 * 70) / 100; + var9 = (var7 * 30 + var9 * 70) / 100; + var7 = var10; + var8 = var8; + var9 = var9; + } + + var5[var11 << 2] = (byte)var7; + var5[(var11 << 2) + 1] = (byte)var8; + var5[(var11 << 2) + 2] = (byte)var9; + var5[(var11 << 2) + 3] = (byte)var6; + } + + this.imageData.clear(); + this.imageData.put(var5); + this.imageData.position(0).limit(var5.length); + GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, var2, var3, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)this.imageData); + } + + public final int getTextureForDownloadableImage(String var1, String var2) { + ThreadDownloadImageData var6 = (ThreadDownloadImageData)this.urlToImageDataMap.get(var1); + if(var6 != null && var6.image != null && !var6.textureSetupComplete) { + if(var6.textureName < 0) { + BufferedImage var4 = var6.image; + this.singleIntBuffer.clear(); + GL11.glGenTextures(this.singleIntBuffer); + int var5 = this.singleIntBuffer.get(0); + this.setupTexture(var4, var5); + this.textureContentsMap.put(Integer.valueOf(var5), var4); + var6.textureName = var5; + } else { + this.setupTexture(var6.image, var6.textureName); + } + + var6.textureSetupComplete = true; + } + + return var6 != null && var6.textureName >= 0 ? var6.textureName : this.getTexture(var2); + } + + public final ThreadDownloadImageData obtainImageData(String var1, ImageBufferDownload var2) { + ThreadDownloadImageData var3 = (ThreadDownloadImageData)this.urlToImageDataMap.get(var1); + if(var3 == null) { + this.urlToImageDataMap.put(var1, new ThreadDownloadImageData(var1, var2)); + } else { + ++var3.referenceCount; + } + + return var3; + } + + public final void releaseImageData(String var1) { + ThreadDownloadImageData var2 = (ThreadDownloadImageData)this.urlToImageDataMap.get(var1); + if(var2 != null) { + --var2.referenceCount; + if(var2.referenceCount == 0) { + if(var2.textureName >= 0) { + int var3 = var2.textureName; + this.textureContentsMap.remove(Integer.valueOf(var3)); + this.singleIntBuffer.clear(); + this.singleIntBuffer.put(var3); + this.singleIntBuffer.flip(); + GL11.glDeleteTextures(this.singleIntBuffer); + } + + this.urlToImageDataMap.remove(var1); + } + } + + } + + public final void registerTextureFX(TextureFX var1) { + this.textureList.add(var1); + var1.onTick(); + } + + public final void updateDynamicTextures() { + int var1; + TextureFX var2; + for(var1 = 0; var1 < this.textureList.size(); ++var1) { + var2 = (TextureFX)this.textureList.get(var1); + var2.anaglyphEnabled = this.options.anaglyph; + var2.onTick(); + this.imageData.clear(); + this.imageData.put(var2.imageData); + this.imageData.position(0).limit(var2.imageData.length); + GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, var2.iconIndex % 16 << 4, var2.iconIndex / 16 << 4, 16, 16, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)this.imageData); + } + + for(var1 = 0; var1 < this.textureList.size(); ++var1) { + var2 = (TextureFX)this.textureList.get(var1); + if(var2.textureId > 0) { + this.imageData.clear(); + this.imageData.put(var2.imageData); + this.imageData.position(0).limit(var2.imageData.length); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2.textureId); + GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)this.imageData); + } + } + + } + + public final void refreshTextures() { + Iterator var1 = this.textureContentsMap.keySet().iterator(); + + int var2; + BufferedImage var3; + while(var1.hasNext()) { + var2 = ((Integer)var1.next()).intValue(); + var3 = (BufferedImage)this.textureContentsMap.get(Integer.valueOf(var2)); + this.setupTexture(var3, var2); + } + + ThreadDownloadImageData var5; + for(var1 = this.urlToImageDataMap.values().iterator(); var1.hasNext(); var5.textureSetupComplete = false) { + var5 = (ThreadDownloadImageData)var1.next(); + } + + var1 = this.textureMap.keySet().iterator(); + + while(var1.hasNext()) { + String var6 = (String)var1.next(); + + try { + if(var6.startsWith("##")) { + var3 = unwrapImageByColumns(ImageIO.read(RenderEngine.class.getResourceAsStream(var6.substring(2)))); + } else if(var6.startsWith("%%")) { + this.clampTexture = true; + var3 = ImageIO.read(RenderEngine.class.getResourceAsStream(var6.substring(2))); + this.clampTexture = false; + } else { + var3 = ImageIO.read(RenderEngine.class.getResourceAsStream(var6)); + } + + var2 = ((Integer)this.textureMap.get(var6)).intValue(); + this.setupTexture(var3, var2); + } catch (IOException var4) { + var4.printStackTrace(); + } + } + + } + + public static void bindTexture(int var0) { + if(var0 >= 0) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var0); + } + } +} diff --git a/src/teavm/java/net/minecraft/client/render/RenderGlobal.java b/src/teavm/java/net/minecraft/client/render/RenderGlobal.java new file mode 100644 index 0000000..31c7bfa --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/RenderGlobal.java @@ -0,0 +1,762 @@ +package net.minecraft.client.render; + +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.effect.EntityBubbleFX; +import net.minecraft.client.effect.EntityExplodeFX; +import net.minecraft.client.effect.EntityFlameFX; +import net.minecraft.client.effect.EntityLavaFX; +import net.minecraft.client.effect.EntitySmokeFX; +import net.minecraft.client.effect.EntitySplashFX; +import net.minecraft.client.render.camera.ICamera; +import net.minecraft.client.render.entity.RenderManager; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.EntityMap; +import net.minecraft.game.level.IWorldAccess; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +public final class RenderGlobal implements IWorldAccess { + private World worldObj; + private RenderEngine renderEngine; + private int glGenList; + private IntBuffer renderIntBuffer = BufferUtils.createIntBuffer(65536); + private List worldRenderersToUpdate = new ArrayList(); + private WorldRenderer[] sortedWorldRenderers; + private WorldRenderer[] worldRenderers; + private int renderChunksWide; + private int renderChunksTall; + private int renderChunksDeep; + private int glRenderListBase; + private Minecraft mc; + private RenderBlocks globalRenderBlocks; + private IntBuffer glOcclusionQueryBase; + private boolean occlusionEnabled = false; + private int cloudOffsetX = 0; + private int glSkyList; + private int countEntitiesTotal; + private int countEntitiesRendered; + private int countEntitiesHidden; + private int[] dummyBuf50k = new int['\uc350']; + private IntBuffer occlusionResult = BufferUtils.createIntBuffer(64); + private int renderersLoaded; + private int renderersBeingClipped; + private int renderersBeingOccluded; + private int renderersBeingRendered; + private float prevSortX = -9999.0F; + private float prevSortY = -9999.0F; + private float prevSortZ = -9999.0F; + public float damagePartialTime; + + public RenderGlobal(Minecraft var1, RenderEngine var2) { + this.mc = var1; + this.renderEngine = var2; + this.glGenList = GL11.glGenLists(2); + this.glRenderListBase = GL11.glGenLists(786432); + this.occlusionEnabled = true; + if(this.occlusionEnabled) { + this.occlusionResult.clear(); + if(this.occlusionResult.get(0) == 0) { + this.occlusionEnabled = false; + } else { + this.glOcclusionQueryBase = BufferUtils.createIntBuffer(262144); + this.glOcclusionQueryBase.clear(); + this.glOcclusionQueryBase.position(0); + this.glOcclusionQueryBase.limit(262144); + } + } + + this.glSkyList = GL11.glGenLists(1); + GL11.glNewList(this.glSkyList, GL11.GL_COMPILE); + Random var5 = new Random(10842L); + + for(int var6 = 0; var6 < 500; ++var6) { + GL11.glRotatef(var5.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(var5.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(var5.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F); + Tessellator var3 = Tessellator.instance; + float var4 = 0.25F + var5.nextFloat() * 0.25F; + var3.startDrawingQuads(); + var3.addVertexWithUV(-var4, -100.0F, var4, 1.0F, 1.0F); + var3.addVertexWithUV(var4, -100.0F, var4, 0.0F, 1.0F); + var3.addVertexWithUV(var4, -100.0F, -var4, 0.0F, 0.0F); + var3.addVertexWithUV(-var4, -100.0F, -var4, 1.0F, 0.0F); + var3.draw(); + } + + GL11.glEndList(); + } + + public final void changeWorld(World var1) { + if(this.worldObj != null) { + this.worldObj.removeWorldAccess(this); + } + + this.prevSortX = -9999.0F; + this.prevSortY = -9999.0F; + this.prevSortZ = -9999.0F; + RenderManager.instance.set(var1); + this.worldObj = var1; + this.globalRenderBlocks = new RenderBlocks(var1); + if(var1 != null) { + var1.addWorldAccess(this); + this.loadRenderers(); + } + + } + + public final void loadRenderers() { + int var1; + if(this.worldRenderers != null) { + for(var1 = 0; var1 < this.worldRenderers.length; ++var1) { + this.worldRenderers[var1].stopRendering(); + } + } + + this.renderChunksWide = this.worldObj.width / 16; + this.renderChunksTall = this.worldObj.height / 16; + this.renderChunksDeep = this.worldObj.length / 16; + this.worldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep]; + this.sortedWorldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep]; + var1 = 0; + int var2 = 0; + + int var3; + for(var3 = 0; var3 < this.renderChunksWide; ++var3) { + for(int var4 = 0; var4 < this.renderChunksTall; ++var4) { + for(int var5 = 0; var5 < this.renderChunksDeep; ++var5) { + this.worldRenderers[(var5 * this.renderChunksTall + var4) * this.renderChunksWide + var3] = new WorldRenderer(this.worldObj, var3 << 4, var4 << 4, var5 << 4, 16, this.glRenderListBase + var1); + if(this.occlusionEnabled) { + this.worldRenderers[(var5 * this.renderChunksTall + var4) * this.renderChunksWide + var3].glOcclusionQuery = this.glOcclusionQueryBase.get(var2); + } + + ++var2; + this.sortedWorldRenderers[(var5 * this.renderChunksTall + var4) * this.renderChunksWide + var3] = this.worldRenderers[(var5 * this.renderChunksTall + var4) * this.renderChunksWide + var3]; + var1 += 3; + } + } + } + + for(var3 = 0; var3 < this.worldRenderersToUpdate.size(); ++var3) { + ((WorldRenderer)this.worldRenderersToUpdate.get(var3)).needsUpdate = false; + } + + this.worldRenderersToUpdate.clear(); + GL11.glNewList(this.glGenList, GL11.GL_COMPILE); + this.oobGroundRenderHeight(); + GL11.glEndList(); + GL11.glNewList(this.glGenList + 1, GL11.GL_COMPILE); + this.oobWaterRenderHeight(); + GL11.glEndList(); + this.markBlocksForUpdate(0, 0, 0, this.worldObj.width, this.worldObj.height, this.worldObj.length); + } + + public final void renderEntities(Vec3D var1, ICamera var2, float var3) { + EntityMap var4 = this.worldObj.entityMap; + RenderManager.instance.cacheActiveRenderInfo(this.worldObj, this.renderEngine, this.mc.thePlayer, var3); + this.countEntitiesTotal = 0; + this.countEntitiesRendered = 0; + this.countEntitiesHidden = 0; + + for(int var5 = 0; var5 < var4.width; ++var5) { + for(int var6 = 0; var6 < var4.depth; ++var6) { + for(int var7 = 0; var7 < var4.height; ++var7) { + List var8 = var4.entityGrid[(var7 * var4.depth + var6) * var4.width + var5]; + if(var8.size() != 0) { + int var9 = (var5 << 3) + 4; + int var10 = (var6 << 3) + 4; + int var11 = (var7 << 3) + 4; + this.countEntitiesTotal += var8.size(); + float var10001 = (float)var9; + float var10002 = (float)var10; + float var14 = (float)var11; + float var13 = var10002; + float var12 = var10001; + boolean var10000; + if(var12 >= 0.0F && var13 >= 0.0F && var14 >= 0.0F && var12 < (float)this.worldObj.width && var13 < (float)this.worldObj.height && var14 < (float)this.worldObj.length) { + int var17 = (int)(var12 / 16.0F); + int var19 = (int)(var13 / 16.0F); + int var20 = (int)(var14 / 16.0F); + var10000 = this.worldRenderers[(var20 * this.renderChunksTall + var19) * this.renderChunksWide + var17].isInFrustrum && this.worldRenderers[(var20 * this.renderChunksTall + var19) * this.renderChunksWide + var17].isVisible; + } else { + var10000 = true; + } + + if(!var10000) { + this.countEntitiesHidden += var8.size(); + } else { + for(var9 = 0; var9 < var8.size(); ++var9) { + Entity var15 = (Entity)var8.get(var9); + var13 = var15.posX - var1.xCoord; + var14 = var15.posY - var1.yCoord; + var12 = var15.posZ - var1.zCoord; + var13 = var13 * var13 + var14 * var14 + var12 * var12; + float var16 = var13; + AxisAlignedBB var18 = var15.boundingBox; + var13 = var18.maxX - var18.minX; + var14 = var18.maxY - var18.minY; + var12 = var18.maxZ - var18.minZ; + var12 = (var13 + var14 + var12) / 3.0F; + var12 *= 64.0F; + if(var16 < var12 * var12 && var2.isBoundingBoxInFrustrum(var15.boundingBox) && (var15 != this.worldObj.playerEntity || this.mc.options.thirdPersonView)) { + ++this.countEntitiesRendered; + RenderManager.instance.renderEntity(var15, var3); + } + } + } + } + } + } + } + + } + + public final String getDebugInfoRenders() { + return "C: " + this.renderersBeingRendered + "/" + this.renderersLoaded + ". F: " + this.renderersBeingClipped + ", O: " + this.renderersBeingOccluded; + } + + public final String getDebugInfoEntities() { + return "E: " + this.countEntitiesRendered + "/" + this.countEntitiesTotal + ". B: " + this.countEntitiesHidden + ", I: " + (this.countEntitiesTotal - this.countEntitiesHidden - this.countEntitiesRendered); + } + + public final int sortAndRender(EntityPlayer var1, int var2) { + if(var2 == 0) { + this.renderersLoaded = 0; + this.renderersBeingClipped = 0; + this.renderersBeingOccluded = 0; + this.renderersBeingRendered = 0; + } + + float var3 = var1.posX - this.prevSortX; + float var4 = var1.posY - this.prevSortY; + float var5 = var1.posZ - this.prevSortZ; + if(var3 * var3 + var4 * var4 + var5 * var5 > 16.0F) { + this.prevSortX = var1.posX; + this.prevSortY = var1.posY; + this.prevSortZ = var1.posZ; + Arrays.sort(this.sortedWorldRenderers, new EntitySorter(var1)); + } + + int var8; + if(this.occlusionEnabled && var2 == 0) { + int var10 = 8; + this.checkOcclusionQueryResult(0, 8); + + int var6; + for(var6 = 0; var6 < 8; ++var6) { + this.sortedWorldRenderers[var6].isVisible = true; + } + + var8 = 0 + this.renderSortedRenderers(0, 8, var2); + + do { + int var9 = var10; + var10 <<= 1; + if(var10 > this.sortedWorldRenderers.length) { + var10 = this.sortedWorldRenderers.length; + } + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glColorMask(false, false, false, false); + GL11.glDepthMask(false); + this.checkOcclusionQueryResult(var9, var10); + + for(var6 = var9; var6 < var10; ++var6) { + if(!this.sortedWorldRenderers[var6].isInFrustrum) { + this.sortedWorldRenderers[var6].isVisible = true; + } + + if(this.sortedWorldRenderers[var6].isInFrustrum && !this.sortedWorldRenderers[var6].isWaitingOnOcclusionQuery) { + float var7 = MathHelper.sqrt_float(this.sortedWorldRenderers[var6].distanceToEntitySquared(var1)); + int var11 = (int)(1.0F + var7 / 64.0F); + if(this.cloudOffsetX % var11 == var6 % var11) { + this.sortedWorldRenderers[var6].callOcclusionQueryList(); + this.sortedWorldRenderers[var6].isWaitingOnOcclusionQuery = true; + } + } + } + + GL11.glColorMask(true, true, true, true); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_ALPHA_TEST); + var8 += this.renderSortedRenderers(var9, var10, var2); + } while(var10 < this.sortedWorldRenderers.length); + } else { + var8 = 0 + this.renderSortedRenderers(0, this.sortedWorldRenderers.length, var2); + } + + return var8; + } + + private void checkOcclusionQueryResult(int var1, int var2) { + for(var1 = var1; var1 < var2; ++var1) { + if(this.sortedWorldRenderers[var1].isWaitingOnOcclusionQuery) { + this.occlusionResult.clear(); + if(this.occlusionResult.get(0) != 0) { + this.sortedWorldRenderers[var1].isWaitingOnOcclusionQuery = false; + this.occlusionResult.clear(); + this.sortedWorldRenderers[var1].isVisible = this.occlusionResult.get(0) != 0; + } + } + } + + } + + private int renderSortedRenderers(int var1, int var2, int var3) { + int var4 = 0; + + for(var1 = var1; var1 < var2; ++var1) { + if(var3 == 0) { + ++this.renderersLoaded; + if(!this.sortedWorldRenderers[var1].isInFrustrum) { + ++this.renderersBeingClipped; + } + + if(this.sortedWorldRenderers[var1].isInFrustrum && !this.sortedWorldRenderers[var1].isVisible) { + ++this.renderersBeingOccluded; + } + + if(this.sortedWorldRenderers[var1].isInFrustrum && this.sortedWorldRenderers[var1].isVisible) { + ++this.renderersBeingRendered; + } + } + + if(this.sortedWorldRenderers[var1].isInFrustrum && this.sortedWorldRenderers[var1].isVisible) { + var4 = this.sortedWorldRenderers[var1].getGLCallListForPass(this.dummyBuf50k, var4, var3); + } + } + + this.renderIntBuffer.clear(); + this.renderIntBuffer.put(this.dummyBuf50k, 0, var4); + this.renderIntBuffer.flip(); + if(this.renderIntBuffer.remaining() > 0) { + GL11.glCallLists(this.renderIntBuffer); + } + + return this.renderIntBuffer.remaining(); + } + + public final void renderAllRenderLists() { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain.png")); + GL11.glCallLists(this.renderIntBuffer); + } + + public final void updateClouds() { + ++this.cloudOffsetX; + } + + public final void renderSky(float var1) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + Vec3D var2 = this.worldObj.getSkyColor(var1); + float var3 = var2.xCoord; + float var4 = var2.yCoord; + float var9 = var2.zCoord; + if(this.mc.options.anaglyph) { + float var5 = (var3 * 30.0F + var4 * 59.0F + var9 * 11.0F) / 100.0F; + var4 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; + var9 = (var3 * 30.0F + var9 * 70.0F) / 100.0F; + var3 = var5; + var4 = var4; + var9 = var9; + } + + GL11.glDepthMask(false); + Tessellator var12 = Tessellator.instance; + var12.startDrawingQuads(); + var12.setColorOpaque_F(var3, var4, var9); + var9 = (float)(this.worldObj.height + 10); + + int var10; + for(var10 = -2048; var10 < this.worldObj.width + 2048; var10 += 512) { + for(int var13 = -2048; var13 < this.worldObj.length + 2048; var13 += 512) { + var12.addVertex((float)var10, var9, (float)var13); + var12.addVertex((float)(var10 + 512), var9, (float)var13); + var12.addVertex((float)(var10 + 512), var9, (float)(var13 + 512)); + var12.addVertex((float)var10, var9, (float)(var13 + 512)); + } + } + + var12.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_FOG); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GL11.glPushMatrix(); + var3 = this.worldObj.playerEntity.lastTickPosX + (this.worldObj.playerEntity.posX - this.worldObj.playerEntity.lastTickPosX) * var1; + var4 = this.worldObj.playerEntity.lastTickPosY + (this.worldObj.playerEntity.posY - this.worldObj.playerEntity.lastTickPosY) * var1; + float var6 = this.worldObj.playerEntity.lastTickPosZ + (this.worldObj.playerEntity.posZ - this.worldObj.playerEntity.lastTickPosZ) * var1; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glTranslatef(var3, var4, var6); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(this.worldObj.getCelestialAngle(var1) * 360.0F, 1.0F, 0.0F, 0.0F); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png")); + var12.startDrawingQuads(); + var12.addVertexWithUV(-30.0F, 100.0F, -30.0F, 0.0F, 0.0F); + var12.addVertexWithUV(30.0F, 100.0F, -30.0F, 1.0F, 0.0F); + var12.addVertexWithUV(30.0F, 100.0F, 30.0F, 1.0F, 1.0F); + var12.addVertexWithUV(-30.0F, 100.0F, 30.0F, 0.0F, 1.0F); + var12.draw(); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon.png")); + var12.startDrawingQuads(); + var12.addVertexWithUV(-20.0F, -100.0F, 20.0F, 1.0F, 1.0F); + var12.addVertexWithUV(20.0F, -100.0F, 20.0F, 0.0F, 1.0F); + var12.addVertexWithUV(20.0F, -100.0F, -20.0F, 0.0F, 0.0F); + var12.addVertexWithUV(-20.0F, -100.0F, -20.0F, 1.0F, 0.0F); + var12.draw(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + var9 = this.worldObj.getStarBrightness(var1); + GL11.glColor4f(var9, var9, var9, var9); + GL11.glCallList(this.glSkyList); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_FOG); + GL11.glPopMatrix(); + GL11.glDepthMask(true); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/clouds.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Vec3D var11 = this.worldObj.getCloudColor(var1); + var4 = var11.xCoord; + var6 = var11.yCoord; + var3 = var11.zCoord; + float var7; + if(this.mc.options.anaglyph) { + var9 = (var4 * 30.0F + var6 * 59.0F + var3 * 11.0F) / 100.0F; + var7 = (var4 * 30.0F + var6 * 70.0F) / 100.0F; + var3 = (var4 * 30.0F + var3 * 70.0F) / 100.0F; + var4 = var9; + var6 = var7; + var3 = var3; + } + + var9 = (float)this.worldObj.cloudHeight; + var7 = ((float)this.cloudOffsetX + var1) * (0.5F / 1024.0F) * 0.03F; + var12.startDrawingQuads(); + var12.setColorOpaque_F(var4, var6, var3); + + for(int var8 = -2048; var8 < this.worldObj.width + 2048; var8 += 512) { + for(var10 = -2048; var10 < this.worldObj.length + 2048; var10 += 512) { + var12.addVertexWithUV((float)var8, var9, (float)(var10 + 512), (float)var8 * (0.5F / 1024.0F) + var7, (float)(var10 + 512) * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)(var8 + 512), var9, (float)(var10 + 512), (float)(var8 + 512) * (0.5F / 1024.0F) + var7, (float)(var10 + 512) * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)(var8 + 512), var9, (float)var10, (float)(var8 + 512) * (0.5F / 1024.0F) + var7, (float)var10 * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)var8, var9, (float)var10, (float)var8 * (0.5F / 1024.0F) + var7, (float)var10 * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)var8, var9, (float)var10, (float)var8 * (0.5F / 1024.0F) + var7, (float)var10 * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)(var8 + 512), var9, (float)var10, (float)(var8 + 512) * (0.5F / 1024.0F) + var7, (float)var10 * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)(var8 + 512), var9, (float)(var10 + 512), (float)(var8 + 512) * (0.5F / 1024.0F) + var7, (float)(var10 + 512) * (0.5F / 1024.0F)); + var12.addVertexWithUV((float)var8, var9, (float)(var10 + 512), (float)var8 * (0.5F / 1024.0F) + var7, (float)(var10 + 512) * (0.5F / 1024.0F)); + } + } + + var12.draw(); + } + + public final void oobGroundRenderer() { + float var1 = this.worldObj.getLightBrightness(0, this.worldObj.getGroundLevel(), 0); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/dirt.png")); + if(this.worldObj.getGroundLevel() > this.worldObj.getWaterLevel() && this.worldObj.defaultFluid == Block.waterMoving.blockID) { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/grass.png")); + } + + GL11.glColor4f(var1, var1, var1, 1.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glCallList(this.glGenList); + } + + private void oobGroundRenderHeight() { + Tessellator var1 = Tessellator.instance; + float var2 = (float)this.worldObj.getGroundLevel(); + int var3 = 128; + if(128 > this.worldObj.width) { + var3 = this.worldObj.width; + } + + if(var3 > this.worldObj.length) { + var3 = this.worldObj.length; + } + + int var4 = 2048 / var3; + var1.startDrawingQuads(); + + for(int var5 = -var3 * var4; var5 < this.worldObj.width + var3 * var4; var5 += var3) { + for(int var6 = -var3 * var4; var6 < this.worldObj.length + var3 * var4; var6 += var3) { + if(var2 < 0.0F || var5 < 0 || var6 < 0 || var5 >= this.worldObj.width || var6 >= this.worldObj.length) { + var1.addVertexWithUV((float)var5, var2, (float)(var6 + var3), 0.0F, (float)var3); + var1.addVertexWithUV((float)(var5 + var3), var2, (float)(var6 + var3), (float)var3, (float)var3); + var1.addVertexWithUV((float)(var5 + var3), var2, (float)var6, (float)var3, 0.0F); + var1.addVertexWithUV((float)var5, var2, (float)var6, 0.0F, 0.0F); + } + } + } + + var1.draw(); + } + + public final void oobWaterRenderer() { + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/water.png")); + float var1 = this.worldObj.getLightBrightness(0, this.worldObj.getWaterLevel(), 0); + GL11.glColor4f(var1, var1, var1, 1.0F); + GL11.glCallList(this.glGenList + 1); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + } + + private void oobWaterRenderHeight() { + float var1 = (float)this.worldObj.getWaterLevel(); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + Tessellator var2 = Tessellator.instance; + int var3 = 128; + if(128 > this.worldObj.width) { + var3 = this.worldObj.width; + } + + if(var3 > this.worldObj.length) { + var3 = this.worldObj.length; + } + + int var4 = 2048 / var3; + var2.startDrawingQuads(); + float var5 = Block.waterMoving.minX; + float var6 = Block.waterMoving.minZ; + + for(int var7 = -var3 * var4; var7 < this.worldObj.width + var3 * var4; var7 += var3) { + for(int var8 = -var3 * var4; var8 < this.worldObj.length + var3 * var4; var8 += var3) { + float var9 = var1 + Block.waterMoving.minY; + if(var1 < 0.0F || var7 < 0 || var8 < 0 || var7 >= this.worldObj.width || var8 >= this.worldObj.length) { + var2.addVertexWithUV((float)var7 + var5, var9, (float)(var8 + var3) + var6, 0.0F, (float)var3); + var2.addVertexWithUV((float)(var7 + var3) + var5, var9, (float)(var8 + var3) + var6, (float)var3, (float)var3); + var2.addVertexWithUV((float)(var7 + var3) + var5, var9, (float)var8 + var6, (float)var3, 0.0F); + var2.addVertexWithUV((float)var7 + var5, var9, (float)var8 + var6, 0.0F, 0.0F); + var2.addVertexWithUV((float)var7 + var5, var9, (float)var8 + var6, 0.0F, 0.0F); + var2.addVertexWithUV((float)(var7 + var3) + var5, var9, (float)var8 + var6, (float)var3, 0.0F); + var2.addVertexWithUV((float)(var7 + var3) + var5, var9, (float)(var8 + var3) + var6, (float)var3, (float)var3); + var2.addVertexWithUV((float)var7 + var5, var9, (float)(var8 + var3) + var6, 0.0F, (float)var3); + } + } + } + + var2.draw(); + GL11.glDisable(GL11.GL_BLEND); + } + + public final void updateRenderers(EntityPlayer var1) { + Collections.sort(this.worldRenderersToUpdate, new RenderSorter(var1)); + int var2 = this.worldRenderersToUpdate.size() - 1; + int var3 = this.worldRenderersToUpdate.size(); + + for(int var4 = 0; var4 < var3; ++var4) { + WorldRenderer var5 = (WorldRenderer)this.worldRenderersToUpdate.get(var2 - var4); + if(var5.distanceToEntitySquared(var1) > 2500.0F && var4 > 4) { + return; + } + + this.worldRenderersToUpdate.remove(var5); + var5.updateRenderer(); + var5.needsUpdate = false; + } + + } + + public final void drawBlockBreaking(MovingObjectPosition var1, int var2, ItemStack var3) { + Tessellator var4 = Tessellator.instance; + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)System.currentTimeMillis() / 100.0F) * 0.2F + 0.4F) * 0.5F); + if(this.damagePartialTime > 0.0F) { + GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR); + int var5 = this.renderEngine.getTexture("/terrain.png"); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GL11.glPushMatrix(); + var5 = this.worldObj.getBlockId(var1.blockX, var1.blockY, var1.blockZ); + Block var6 = var5 > 0 ? Block.blocksList[var5] : null; + GL11.glDisable(GL11.GL_ALPHA_TEST); + var4.startDrawingQuads(); + var4.disableColor(); + if(var6 == null) { + var6 = Block.stone; + } + + this.globalRenderBlocks.renderBlockUsingTexture(var6, var1.blockX, var1.blockY, var1.blockZ, 240 + (int)(this.damagePartialTime * 10.0F)); + var4.draw(); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + } + + public final void drawSelectionBox(MovingObjectPosition var1, int var2) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + var2 = this.worldObj.getBlockId(var1.blockX, var1.blockY, var1.blockZ); + if(var2 > 0) { + AxisAlignedBB var3 = Block.blocksList[var2].getSelectedBoundingBoxFromPool(var1.blockX, var1.blockY, var1.blockZ).expand(0.002F, 0.002F, 0.002F); + Tessellator var4 = Tessellator.instance; + var4.startDrawing(3); + var4.addVertex(var3.minX, var3.minY, var3.minZ); + var4.addVertex(var3.maxX, var3.minY, var3.minZ); + var4.addVertex(var3.maxX, var3.minY, var3.maxZ); + var4.addVertex(var3.minX, var3.minY, var3.maxZ); + var4.addVertex(var3.minX, var3.minY, var3.minZ); + var4.draw(); + var4.startDrawing(3); + var4.addVertex(var3.minX, var3.maxY, var3.minZ); + var4.addVertex(var3.maxX, var3.maxY, var3.minZ); + var4.addVertex(var3.maxX, var3.maxY, var3.maxZ); + var4.addVertex(var3.minX, var3.maxY, var3.maxZ); + var4.addVertex(var3.minX, var3.maxY, var3.minZ); + var4.draw(); + var4.startDrawing(1); + var4.addVertex(var3.minX, var3.minY, var3.minZ); + var4.addVertex(var3.minX, var3.maxY, var3.minZ); + var4.addVertex(var3.maxX, var3.minY, var3.minZ); + var4.addVertex(var3.maxX, var3.maxY, var3.minZ); + var4.addVertex(var3.maxX, var3.minY, var3.maxZ); + var4.addVertex(var3.maxX, var3.maxY, var3.maxZ); + var4.addVertex(var3.minX, var3.minY, var3.maxZ); + var4.addVertex(var3.minX, var3.maxY, var3.maxZ); + var4.draw(); + } + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + } + + private void markBlocksForUpdate(int var1, int var2, int var3, int var4, int var5, int var6) { + var1 /= 16; + var2 /= 16; + var3 /= 16; + var4 /= 16; + var5 /= 16; + var6 /= 16; + if(var1 < 0) { + var1 = 0; + } + + if(var2 < 0) { + var2 = 0; + } + + if(var3 < 0) { + var3 = 0; + } + + if(var4 > this.renderChunksWide - 1) { + var4 = this.renderChunksWide - 1; + } + + if(var5 > this.renderChunksTall - 1) { + var5 = this.renderChunksTall - 1; + } + + if(var6 > this.renderChunksDeep - 1) { + var6 = this.renderChunksDeep - 1; + } + + for(var1 = var1; var1 <= var4; ++var1) { + for(int var7 = var2; var7 <= var5; ++var7) { + for(int var8 = var3; var8 <= var6; ++var8) { + WorldRenderer var9 = this.worldRenderers[(var8 * this.renderChunksTall + var7) * this.renderChunksWide + var1]; + if(!var9.needsUpdate) { + var9.needsUpdate = true; + this.worldRenderersToUpdate.add(this.worldRenderers[(var8 * this.renderChunksTall + var7) * this.renderChunksWide + var1]); + } + } + } + } + + } + + public final void markBlockAndNeighborsNeedsUpdate(int var1, int var2, int var3) { + this.markBlocksForUpdate(var1 - 1, var2 - 1, var3 - 1, var1 + 1, var2 + 1, var3 + 1); + } + + public final void markBlockRangeNeedsUpdate(int var1, int var2, int var3, int var4, int var5, int var6) { + this.markBlocksForUpdate(var1 - 1, var2 - 1, var3 - 1, var4 + 1, var5 + 1, var6 + 1); + } + + public final void clipRenderersByFrustrum(ICamera var1) { + for(int var2 = 0; var2 < this.worldRenderers.length; ++var2) { + this.worldRenderers[var2].updateInFrustrum(var1); + } + + } + + public final void spawnParticle(String var1, float var2, float var3, float var4, float var5, float var6, float var7) { + float var8 = this.worldObj.playerEntity.posX - var2; + float var9 = this.worldObj.playerEntity.posY - var3; + float var10 = this.worldObj.playerEntity.posZ - var4; + if(var8 * var8 + var9 * var9 + var10 * var10 <= 256.0F) { + if(var1 == "bubble") { + this.mc.effectRenderer.addEffect(new EntityBubbleFX(this.worldObj, var2, var3, var4, var5, var6, var7)); + } else if(var1 == "smoke") { + this.mc.effectRenderer.addEffect(new EntitySmokeFX(this.worldObj, var2, var3, var4)); + } else if(var1 == "explode") { + this.mc.effectRenderer.addEffect(new EntityExplodeFX(this.worldObj, var2, var3, var4, var5, var6, var7)); + } else if(var1 == "flame") { + this.mc.effectRenderer.addEffect(new EntityFlameFX(this.worldObj, var2, var3, var4)); + } else if(var1 == "lava") { + this.mc.effectRenderer.addEffect(new EntityLavaFX(this.worldObj, var2, var3, var4)); + } else if(var1 == "splash") { + this.mc.effectRenderer.addEffect(new EntitySplashFX(this.worldObj, var2, var3, var4)); + } else { + if(var1 == "largesmoke") { + this.mc.effectRenderer.addEffect(new EntitySmokeFX(this.worldObj, var2, var3, var4, 2.5F)); + } + + } + } + } + + public final void obtainEntitySkin(Entity var1) { + if(var1.skinUrl != null) { + this.renderEngine.obtainImageData(var1.skinUrl, new ImageBufferDownload()); + } + + } + + public final void releaseEntitySkin(Entity var1) { + if(var1.skinUrl != null) { + this.renderEngine.releaseImageData(var1.skinUrl); + } + + } + + public final void updateAllRenderers() { + GL11.glNewList(this.glGenList, GL11.GL_COMPILE); + this.oobGroundRenderHeight(); + GL11.glEndList(); + GL11.glNewList(this.glGenList + 1, GL11.GL_COMPILE); + this.oobWaterRenderHeight(); + GL11.glEndList(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/RenderSorter.java b/src/teavm/java/net/minecraft/client/render/RenderSorter.java new file mode 100644 index 0000000..0b89bb8 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/RenderSorter.java @@ -0,0 +1,21 @@ +package net.minecraft.client.render; + +import java.util.Comparator; +import net.minecraft.game.entity.player.EntityPlayer; + +public final class RenderSorter implements Comparator { + private EntityPlayer baseEntity; + + public RenderSorter(EntityPlayer var1) { + this.baseEntity = var1; + } + + public final int compare(Object var1, Object var2) { + WorldRenderer var10001 = (WorldRenderer)var1; + WorldRenderer var3 = (WorldRenderer)var2; + WorldRenderer var6 = var10001; + boolean var4 = var6.isInFrustrum; + boolean var5 = var3.isInFrustrum; + return var4 && !var5 ? 1 : ((!var5 || var4) && var6.distanceToEntitySquared(this.baseEntity) < var3.distanceToEntitySquared(this.baseEntity) ? 1 : -1); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/Tessellator.java b/src/teavm/java/net/minecraft/client/render/Tessellator.java new file mode 100644 index 0000000..8428905 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/Tessellator.java @@ -0,0 +1,223 @@ +package net.minecraft.client.render; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.ARBVertexBufferObject; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; + +public final class Tessellator { + private static boolean convertQuadsToTriangles = false; + private static boolean tryVBO = false; + private ByteBuffer byteBuffer = BufferUtils.createByteBuffer(8388608); + private int[] rawBuffer = new int[2097152]; + private int vertexCount = 0; + private float textureU; + private float textureV; + private int color; + private boolean hasColor = false; + private boolean hasTexture = false; + private int rawBufferIndex = 0; + private int addedVertices = 0; + private boolean isColorDisabled = false; + private int drawMode; + public static Tessellator instance = new Tessellator(); + private boolean isDrawing = false; + private boolean useVBO = false; + private IntBuffer vertexBuffers; + private int vboIndex = 0; + private int vboCount = 10; + + private Tessellator() { + this.useVBO = false; + if(this.useVBO) { + this.vertexBuffers = BufferUtils.createIntBuffer(this.vboCount); + ARBVertexBufferObject.glGenBuffersARB(this.vertexBuffers); + } + + } + + public final void draw() { + if(!this.isDrawing) { + throw new IllegalStateException("Not tesselating!"); + } else { + this.isDrawing = false; + if(this.vertexCount > 0) { + IntBuffer var1 = this.byteBuffer.asIntBuffer(); + FloatBuffer var2 = this.byteBuffer.asFloatBuffer(); + var1.clear(); + var1.put(this.rawBuffer, 0, this.rawBufferIndex); + this.byteBuffer.position(0); + this.byteBuffer.limit(this.rawBufferIndex << 2); + if(this.useVBO) { + this.vboIndex = (this.vboIndex + 1) % this.vboCount; + ARBVertexBufferObject.glBindBufferARB(GL15.GL_ARRAY_BUFFER, this.vertexBuffers.get(this.vboIndex)); + ARBVertexBufferObject.glBufferDataARB(GL15.GL_ARRAY_BUFFER, this.byteBuffer, GL15.GL_STREAM_DRAW); + } + + if(this.hasTexture) { + if(this.useVBO) { + GL11.glTexCoordPointer(2, GL11.GL_FLOAT, 32, 12L); + } else { + var2.position(3); + GL11.glTexCoordPointer(2, 32, (FloatBuffer)var2); + } + + GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if(this.hasColor) { + if(this.useVBO) { + GL11.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 32, 20L); + } else { + this.byteBuffer.position(20); + GL11.glColorPointer(4, true, 32, this.byteBuffer); + } + + GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); + } + + if(this.useVBO) { + GL11.glVertexPointer(3, GL11.GL_FLOAT, 32, 0L); + } else { + var2.position(0); + GL11.glVertexPointer(3, 32, (FloatBuffer)var2); + } + + GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GL11.glDrawArrays(this.drawMode, GL11.GL_POINTS, this.vertexCount); + GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); + if(this.hasTexture) { + GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if(this.hasColor) { + GL11.glDisableClientState(GL11.GL_COLOR_ARRAY); + } + } + + this.reset(); + } + } + + private void reset() { + this.vertexCount = 0; + this.byteBuffer.clear(); + this.rawBufferIndex = 0; + this.addedVertices = 0; + } + + public final void startDrawingQuads() { + this.startDrawing(7); + } + + public final void startDrawing(int var1) { + if(this.isDrawing) { + throw new IllegalStateException("Already tesselating!"); + } else { + this.isDrawing = true; + this.reset(); + this.drawMode = var1; + this.hasColor = false; + this.hasTexture = false; + this.isColorDisabled = false; + } + } + + public final void setColorOpaque_F(float var1, float var2, float var3) { + this.setColorOpaque((int)(var1 * 255.0F), (int)(var2 * 255.0F), (int)(var3 * 255.0F)); + } + + public final void setColorRGBA_F(float var1, float var2, float var3, float var4) { + this.setColorRGBA((int)(var1 * 255.0F), (int)(var2 * 255.0F), (int)(var3 * 255.0F), (int)(var4 * 255.0F)); + } + + private void setColorOpaque(int var1, int var2, int var3) { + this.setColorRGBA(var1, var2, var3, 255); + } + + private void setColorRGBA(int var1, int var2, int var3, int var4) { + if(!this.isColorDisabled) { + if(var1 > 255) { + var1 = 255; + } + + if(var2 > 255) { + var2 = 255; + } + + if(var3 > 255) { + var3 = 255; + } + + if(var4 > 255) { + var4 = 255; + } + + if(var1 < 0) { + var1 = 0; + } + + if(var2 < 0) { + var2 = 0; + } + + if(var3 < 0) { + var3 = 0; + } + + if(var4 < 0) { + var4 = 0; + } + + this.hasColor = true; + this.color = var4 << 24 | var3 << 16 | var2 << 8 | var1; + } + } + + public final void addVertexWithUV(float var1, float var2, float var3, float var4, float var5) { + this.hasTexture = true; + this.textureU = var4; + this.textureV = var5; + this.addVertex(var1, var2, var3); + } + + public final void addVertex(float var1, float var2, float var3) { + ++this.addedVertices; + if(this.hasTexture) { + this.rawBuffer[this.rawBufferIndex + 3] = Float.floatToRawIntBits(this.textureU); + this.rawBuffer[this.rawBufferIndex + 4] = Float.floatToRawIntBits(this.textureV); + } + + if(this.hasColor) { + this.rawBuffer[this.rawBufferIndex + 5] = this.color; + } + + this.rawBuffer[this.rawBufferIndex] = Float.floatToRawIntBits(var1); + this.rawBuffer[this.rawBufferIndex + 1] = Float.floatToRawIntBits(var2); + this.rawBuffer[this.rawBufferIndex + 2] = Float.floatToRawIntBits(var3); + this.rawBufferIndex += 8; + ++this.vertexCount; + if(this.vertexCount % 4 == 0 && this.rawBufferIndex >= 2097120) { + this.draw(); + } + + } + + public final void setColorOpaque_I(int var1) { + int var2 = var1 >> 16 & 255; + int var3 = var1 >> 8 & 255; + var1 &= 255; + this.setColorOpaque(var2, var3, var1); + } + + public final void disableColor() { + this.isColorDisabled = true; + } + + public static void setNormal(float var0, float var1, float var2) { + GL11.glNormal3f(var0, var1, var2); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/ThreadDownloadImage.java b/src/teavm/java/net/minecraft/client/render/ThreadDownloadImage.java new file mode 100644 index 0000000..be11868 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/ThreadDownloadImage.java @@ -0,0 +1,45 @@ +package net.minecraft.client.render; + +import java.net.HttpURLConnection; +import java.net.URL; +import javax.imageio.ImageIO; + +final class ThreadDownloadImage extends Thread { + private String location; + private ImageBufferDownload buffer; + private ThreadDownloadImageData imageData; + + ThreadDownloadImage(ThreadDownloadImageData var1, String var2, ImageBufferDownload var3) { + this.imageData = var1; + this.location = var2; + this.buffer = var3; + } + + public final void run() { + HttpURLConnection var1 = null; + + try { + URL var2 = new URL(this.location); + var1 = (HttpURLConnection)var2.openConnection(); + var1.setDoInput(true); + var1.setDoOutput(false); + var1.connect(); + if(var1.getResponseCode() == 404) { + return; + } + + if(this.buffer == null) { + this.imageData.image = ImageIO.read(var1.getInputStream()); + } else { + this.imageData.image = this.buffer.parseUserSkin(ImageIO.read(var1.getInputStream())); + } + + return; + } catch (Exception var5) { + var5.printStackTrace(); + } finally { + var1.disconnect(); + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/ThreadDownloadImageData.java b/src/teavm/java/net/minecraft/client/render/ThreadDownloadImageData.java new file mode 100644 index 0000000..0607dcd --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/ThreadDownloadImageData.java @@ -0,0 +1,14 @@ +package net.minecraft.client.render; + +import java.awt.image.BufferedImage; + +public final class ThreadDownloadImageData { + public BufferedImage image; + public int referenceCount = 1; + public int textureName = -1; + public boolean textureSetupComplete = false; + + public ThreadDownloadImageData(String var1, ImageBufferDownload var2) { + (new ThreadDownloadImage(this, var1, var2)).start(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/WorldRenderer.java b/src/teavm/java/net/minecraft/client/render/WorldRenderer.java new file mode 100644 index 0000000..4cc9510 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/WorldRenderer.java @@ -0,0 +1,147 @@ +package net.minecraft.client.render; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.render.camera.ICamera; +import net.minecraft.client.render.entity.RenderItem; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.physics.AxisAlignedBB; +import org.lwjgl.opengl.GL11; + +public final class WorldRenderer { + private World worldObj; + private int glRenderList = -1; + private static Tessellator tessellator = Tessellator.instance; + public static int chunksUpdated = 0; + private int posX; + private int posY; + private int posZ; + private int sizeWidth; + private int sizeHeight; + private int sizeDepth; + public boolean isInFrustrum = false; + private boolean[] skipRenderPass = new boolean[2]; + private int posXPlus; + private int posYPlus; + private int posZPlus; + public boolean needsUpdate; + private AxisAlignedBB rendererBoundingBox; + private RenderBlocks renderBlocks; + public boolean isVisible = true; + public boolean isWaitingOnOcclusionQuery; + public int glOcclusionQuery; + + public WorldRenderer(World var1, int var2, int var3, int var4, int var5, int var6) { + this.renderBlocks = new RenderBlocks(var1); + this.worldObj = var1; + this.posX = var2; + this.posY = var3; + this.posZ = var4; + this.sizeWidth = this.sizeHeight = this.sizeDepth = 16; + this.posXPlus = var2 + this.sizeWidth / 2; + this.posYPlus = var3 + this.sizeHeight / 2; + this.posZPlus = var4 + this.sizeDepth / 2; + MathHelper.sqrt_float((float)(this.sizeWidth * this.sizeWidth + this.sizeHeight * this.sizeHeight + this.sizeDepth * this.sizeDepth)); + this.rendererBoundingBox = (new AxisAlignedBB((float)var2, (float)var3, (float)var4, (float)(var2 + this.sizeWidth), (float)(var3 + this.sizeHeight), (float)(var4 + this.sizeDepth))).expand(2.0F, 2.0F, 2.0F); + this.glRenderList = var6; + this.setDontDraw(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glNewList(var6 + 2, GL11.GL_COMPILE); + RenderItem.renderOffsetAABB(this.rendererBoundingBox); + GL11.glEndList(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public final void updateRenderer() { + if(this.needsUpdate) { + ++chunksUpdated; + int var1 = this.posX; + int var2 = this.posY; + int var3 = this.posZ; + int var4 = this.posX + this.sizeWidth; + int var5 = this.posY + this.sizeHeight; + int var6 = this.posZ + this.sizeDepth; + + int var7; + for(var7 = 0; var7 < 2; ++var7) { + this.skipRenderPass[var7] = true; + } + + for(var7 = 0; var7 < 2; ++var7) { + boolean var8 = false; + boolean var9 = false; + tessellator.startDrawingQuads(); + GL11.glNewList(this.glRenderList + var7, GL11.GL_COMPILE); + + for(int var10 = var2; var10 < var5; ++var10) { + for(int var11 = var3; var11 < var6; ++var11) { + int var12 = (var10 * this.worldObj.length + var11) * this.worldObj.width + var1; + + for(int var13 = var1; var13 < var4; ++var13) { + int var14 = this.worldObj.blocks[var12++] & 255; + if(var14 > 0) { + Block var15 = Block.blocksList[var14]; + if(var15.getRenderBlockPass() != var7) { + var8 = true; + } else { + var9 |= this.renderBlocks.renderBlockByRenderType(var15, var13, var10, var11); + } + } + } + } + } + + tessellator.draw(); + GL11.glEndList(); + if(var9) { + this.skipRenderPass[var7] = false; + } + + if(!var8) { + break; + } + } + + } + } + + public final float distanceToEntitySquared(EntityLiving var1) { + float var2 = var1.posX - (float)this.posXPlus; + float var3 = var1.posY - (float)this.posYPlus; + float var4 = var1.posZ - (float)this.posZPlus; + return var2 * var2 + var3 * var3 + var4 * var4; + } + + private void setDontDraw() { + for(int var1 = 0; var1 < 2; ++var1) { + this.skipRenderPass[var1] = true; + } + + } + + public final void stopRendering() { + this.setDontDraw(); + this.worldObj = null; + } + + public final int getGLCallListForPass(int[] var1, int var2, int var3) { + if(!this.isInFrustrum) { + return var2; + } else { + if(!this.skipRenderPass[var3]) { + var1[var2++] = this.glRenderList + var3; + } + + return var2; + } + } + + public final void updateInFrustrum(ICamera var1) { + this.isInFrustrum = var1.isBoundingBoxInFrustrum(this.rendererBoundingBox); + } + + public final void callOcclusionQueryList() { + GL11.glCallList(this.glRenderList + 2); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/camera/ClippingHelper.java b/src/teavm/java/net/minecraft/client/render/camera/ClippingHelper.java new file mode 100644 index 0000000..ed7b530 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/camera/ClippingHelper.java @@ -0,0 +1,8 @@ +package net.minecraft.client.render.camera; + +public class ClippingHelper { + public float[][] frustrum = new float[16][16]; + public float[] projectionMatrix = new float[16]; + public float[] modelviewMatrix = new float[16]; + public float[] clippingMatrix = new float[16]; +} diff --git a/src/teavm/java/net/minecraft/client/render/camera/ClippingHelperImplementation.java b/src/teavm/java/net/minecraft/client/render/camera/ClippingHelperImplementation.java new file mode 100644 index 0000000..613f125 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/camera/ClippingHelperImplementation.java @@ -0,0 +1,82 @@ +package net.minecraft.client.render.camera; + +import java.nio.FloatBuffer; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +import net.PeytonPlayz585.math.MathHelper; + +public final class ClippingHelperImplementation extends ClippingHelper { + private static ClippingHelperImplementation instance = new ClippingHelperImplementation(); + private FloatBuffer projectionMatrixBuffer = BufferUtils.createFloatBuffer(16); + private FloatBuffer modelviewMatrixBuffer = BufferUtils.createFloatBuffer(16); + private FloatBuffer ICamera = BufferUtils.createFloatBuffer(16); + + public static ClippingHelper init() { + ClippingHelperImplementation var0 = instance; + var0.projectionMatrixBuffer.clear(); + var0.modelviewMatrixBuffer.clear(); + var0.ICamera.clear(); + GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, var0.projectionMatrixBuffer); + GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, var0.modelviewMatrixBuffer); + var0.projectionMatrixBuffer.flip().limit(16); + var0.projectionMatrixBuffer.get(var0.projectionMatrix); + var0.modelviewMatrixBuffer.flip().limit(16); + var0.modelviewMatrixBuffer.get(var0.modelviewMatrix); + var0.clippingMatrix[0] = var0.modelviewMatrix[0] * var0.projectionMatrix[0] + var0.modelviewMatrix[1] * var0.projectionMatrix[4] + var0.modelviewMatrix[2] * var0.projectionMatrix[8] + var0.modelviewMatrix[3] * var0.projectionMatrix[12]; + var0.clippingMatrix[1] = var0.modelviewMatrix[0] * var0.projectionMatrix[1] + var0.modelviewMatrix[1] * var0.projectionMatrix[5] + var0.modelviewMatrix[2] * var0.projectionMatrix[9] + var0.modelviewMatrix[3] * var0.projectionMatrix[13]; + var0.clippingMatrix[2] = var0.modelviewMatrix[0] * var0.projectionMatrix[2] + var0.modelviewMatrix[1] * var0.projectionMatrix[6] + var0.modelviewMatrix[2] * var0.projectionMatrix[10] + var0.modelviewMatrix[3] * var0.projectionMatrix[14]; + var0.clippingMatrix[3] = var0.modelviewMatrix[0] * var0.projectionMatrix[3] + var0.modelviewMatrix[1] * var0.projectionMatrix[7] + var0.modelviewMatrix[2] * var0.projectionMatrix[11] + var0.modelviewMatrix[3] * var0.projectionMatrix[15]; + var0.clippingMatrix[4] = var0.modelviewMatrix[4] * var0.projectionMatrix[0] + var0.modelviewMatrix[5] * var0.projectionMatrix[4] + var0.modelviewMatrix[6] * var0.projectionMatrix[8] + var0.modelviewMatrix[7] * var0.projectionMatrix[12]; + var0.clippingMatrix[5] = var0.modelviewMatrix[4] * var0.projectionMatrix[1] + var0.modelviewMatrix[5] * var0.projectionMatrix[5] + var0.modelviewMatrix[6] * var0.projectionMatrix[9] + var0.modelviewMatrix[7] * var0.projectionMatrix[13]; + var0.clippingMatrix[6] = var0.modelviewMatrix[4] * var0.projectionMatrix[2] + var0.modelviewMatrix[5] * var0.projectionMatrix[6] + var0.modelviewMatrix[6] * var0.projectionMatrix[10] + var0.modelviewMatrix[7] * var0.projectionMatrix[14]; + var0.clippingMatrix[7] = var0.modelviewMatrix[4] * var0.projectionMatrix[3] + var0.modelviewMatrix[5] * var0.projectionMatrix[7] + var0.modelviewMatrix[6] * var0.projectionMatrix[11] + var0.modelviewMatrix[7] * var0.projectionMatrix[15]; + var0.clippingMatrix[8] = var0.modelviewMatrix[8] * var0.projectionMatrix[0] + var0.modelviewMatrix[9] * var0.projectionMatrix[4] + var0.modelviewMatrix[10] * var0.projectionMatrix[8] + var0.modelviewMatrix[11] * var0.projectionMatrix[12]; + var0.clippingMatrix[9] = var0.modelviewMatrix[8] * var0.projectionMatrix[1] + var0.modelviewMatrix[9] * var0.projectionMatrix[5] + var0.modelviewMatrix[10] * var0.projectionMatrix[9] + var0.modelviewMatrix[11] * var0.projectionMatrix[13]; + var0.clippingMatrix[10] = var0.modelviewMatrix[8] * var0.projectionMatrix[2] + var0.modelviewMatrix[9] * var0.projectionMatrix[6] + var0.modelviewMatrix[10] * var0.projectionMatrix[10] + var0.modelviewMatrix[11] * var0.projectionMatrix[14]; + var0.clippingMatrix[11] = var0.modelviewMatrix[8] * var0.projectionMatrix[3] + var0.modelviewMatrix[9] * var0.projectionMatrix[7] + var0.modelviewMatrix[10] * var0.projectionMatrix[11] + var0.modelviewMatrix[11] * var0.projectionMatrix[15]; + var0.clippingMatrix[12] = var0.modelviewMatrix[12] * var0.projectionMatrix[0] + var0.modelviewMatrix[13] * var0.projectionMatrix[4] + var0.modelviewMatrix[14] * var0.projectionMatrix[8] + var0.modelviewMatrix[15] * var0.projectionMatrix[12]; + var0.clippingMatrix[13] = var0.modelviewMatrix[12] * var0.projectionMatrix[1] + var0.modelviewMatrix[13] * var0.projectionMatrix[5] + var0.modelviewMatrix[14] * var0.projectionMatrix[9] + var0.modelviewMatrix[15] * var0.projectionMatrix[13]; + var0.clippingMatrix[14] = var0.modelviewMatrix[12] * var0.projectionMatrix[2] + var0.modelviewMatrix[13] * var0.projectionMatrix[6] + var0.modelviewMatrix[14] * var0.projectionMatrix[10] + var0.modelviewMatrix[15] * var0.projectionMatrix[14]; + var0.clippingMatrix[15] = var0.modelviewMatrix[12] * var0.projectionMatrix[3] + var0.modelviewMatrix[13] * var0.projectionMatrix[7] + var0.modelviewMatrix[14] * var0.projectionMatrix[11] + var0.modelviewMatrix[15] * var0.projectionMatrix[15]; + var0.frustrum[0][0] = var0.clippingMatrix[3] - var0.clippingMatrix[0]; + var0.frustrum[0][1] = var0.clippingMatrix[7] - var0.clippingMatrix[4]; + var0.frustrum[0][2] = var0.clippingMatrix[11] - var0.clippingMatrix[8]; + var0.frustrum[0][3] = var0.clippingMatrix[15] - var0.clippingMatrix[12]; + normalize(var0.frustrum, 0); + var0.frustrum[1][0] = var0.clippingMatrix[3] + var0.clippingMatrix[0]; + var0.frustrum[1][1] = var0.clippingMatrix[7] + var0.clippingMatrix[4]; + var0.frustrum[1][2] = var0.clippingMatrix[11] + var0.clippingMatrix[8]; + var0.frustrum[1][3] = var0.clippingMatrix[15] + var0.clippingMatrix[12]; + normalize(var0.frustrum, 1); + var0.frustrum[2][0] = var0.clippingMatrix[3] + var0.clippingMatrix[1]; + var0.frustrum[2][1] = var0.clippingMatrix[7] + var0.clippingMatrix[5]; + var0.frustrum[2][2] = var0.clippingMatrix[11] + var0.clippingMatrix[9]; + var0.frustrum[2][3] = var0.clippingMatrix[15] + var0.clippingMatrix[13]; + normalize(var0.frustrum, 2); + var0.frustrum[3][0] = var0.clippingMatrix[3] - var0.clippingMatrix[1]; + var0.frustrum[3][1] = var0.clippingMatrix[7] - var0.clippingMatrix[5]; + var0.frustrum[3][2] = var0.clippingMatrix[11] - var0.clippingMatrix[9]; + var0.frustrum[3][3] = var0.clippingMatrix[15] - var0.clippingMatrix[13]; + normalize(var0.frustrum, 3); + var0.frustrum[4][0] = var0.clippingMatrix[3] - var0.clippingMatrix[2]; + var0.frustrum[4][1] = var0.clippingMatrix[7] - var0.clippingMatrix[6]; + var0.frustrum[4][2] = var0.clippingMatrix[11] - var0.clippingMatrix[10]; + var0.frustrum[4][3] = var0.clippingMatrix[15] - var0.clippingMatrix[14]; + normalize(var0.frustrum, 4); + var0.frustrum[5][0] = var0.clippingMatrix[3] + var0.clippingMatrix[2]; + var0.frustrum[5][1] = var0.clippingMatrix[7] + var0.clippingMatrix[6]; + var0.frustrum[5][2] = var0.clippingMatrix[11] + var0.clippingMatrix[10]; + var0.frustrum[5][3] = var0.clippingMatrix[15] + var0.clippingMatrix[14]; + normalize(var0.frustrum, 5); + return instance; + } + + private static void normalize(float[][] var0, int var1) { + float var2 = MathHelper.sqrt_float(var0[var1][0] * var0[var1][0] + var0[var1][1] * var0[var1][1] + var0[var1][2] * var0[var1][2]); + var0[var1][0] /= var2; + var0[var1][1] /= var2; + var0[var1][2] /= var2; + var0[var1][3] /= var2; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/camera/Frustrum.java b/src/teavm/java/net/minecraft/client/render/camera/Frustrum.java new file mode 100644 index 0000000..e02ff32 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/camera/Frustrum.java @@ -0,0 +1,26 @@ +package net.minecraft.client.render.camera; + +import net.minecraft.game.physics.AxisAlignedBB; + +public final class Frustrum implements ICamera { + private ClippingHelper clippingHelper = ClippingHelperImplementation.init(); + + public final boolean isBoundingBoxInFrustrum(AxisAlignedBB var1) { + ClippingHelper var9 = this.clippingHelper; + float var7 = var1.maxZ; + float var6 = var1.maxY; + float var5 = var1.maxX; + float var4 = var1.minZ; + float var3 = var1.minY; + float var10 = var1.minX; + var9 = var9; + + for(int var8 = 0; var8 < 6; ++var8) { + if(var9.frustrum[var8][0] * var10 + var9.frustrum[var8][1] * var3 + var9.frustrum[var8][2] * var4 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var5 + var9.frustrum[var8][1] * var3 + var9.frustrum[var8][2] * var4 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var10 + var9.frustrum[var8][1] * var6 + var9.frustrum[var8][2] * var4 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var5 + var9.frustrum[var8][1] * var6 + var9.frustrum[var8][2] * var4 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var10 + var9.frustrum[var8][1] * var3 + var9.frustrum[var8][2] * var7 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var5 + var9.frustrum[var8][1] * var3 + var9.frustrum[var8][2] * var7 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var10 + var9.frustrum[var8][1] * var6 + var9.frustrum[var8][2] * var7 + var9.frustrum[var8][3] <= 0.0F && var9.frustrum[var8][0] * var5 + var9.frustrum[var8][1] * var6 + var9.frustrum[var8][2] * var7 + var9.frustrum[var8][3] <= 0.0F) { + return false; + } + } + + return true; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/camera/ICamera.java b/src/teavm/java/net/minecraft/client/render/camera/ICamera.java new file mode 100644 index 0000000..bf9d2bf --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/camera/ICamera.java @@ -0,0 +1,7 @@ +package net.minecraft.client.render.camera; + +import net.minecraft.game.physics.AxisAlignedBB; + +public interface ICamera { + boolean isBoundingBoxInFrustrum(AxisAlignedBB var1); +} diff --git a/src/teavm/java/net/minecraft/client/render/camera/IsomCamera.java b/src/teavm/java/net/minecraft/client/render/camera/IsomCamera.java new file mode 100644 index 0000000..8c228c0 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/camera/IsomCamera.java @@ -0,0 +1,9 @@ +package net.minecraft.client.render.camera; + +import net.minecraft.game.physics.AxisAlignedBB; + +public final class IsomCamera implements ICamera { + public final boolean isBoundingBoxInFrustrum(AxisAlignedBB var1) { + return true; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/Render.java b/src/teavm/java/net/minecraft/client/render/entity/Render.java new file mode 100644 index 0000000..12856c4 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/Render.java @@ -0,0 +1,180 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.render.RenderBlocks; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.physics.AxisAlignedBB; +import org.lwjgl.opengl.GL11; + +public abstract class Render { + protected RenderManager renderManager; + protected float shadowSize; + protected float shadowOpaque; + + public Render() { + new ModelBiped(); + new RenderBlocks(); + this.shadowSize = 0.0F; + this.shadowOpaque = 1.0F; + } + + public abstract void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6); + + protected final void loadTexture(String var1) { + RenderEngine var2 = this.renderManager.renderEngine; + RenderEngine.bindTexture(var2.getTexture(var1)); + } + + protected final void loadDownloadableImageTexture(String var1, String var2) { + RenderEngine var3 = this.renderManager.renderEngine; + RenderEngine.bindTexture(var3.getTextureForDownloadableImage(var1, var2)); + } + + public static void renderOffsetAABB(AxisAlignedBB var0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + Tessellator var1 = Tessellator.instance; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var1.startDrawingQuads(); + Tessellator.setNormal(0.0F, 0.0F, -1.0F); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + Tessellator.setNormal(0.0F, 0.0F, 1.0F); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + Tessellator.setNormal(0.0F, 1.0F, 0.0F); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + Tessellator.setNormal(-1.0F, 0.0F, 0.0F); + var1.addVertex(var0.minX, var0.minY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.maxZ); + var1.addVertex(var0.minX, var0.maxY, var0.minZ); + var1.addVertex(var0.minX, var0.minY, var0.minZ); + Tessellator.setNormal(1.0F, 0.0F, 0.0F); + var1.addVertex(var0.maxX, var0.minY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.minZ); + var1.addVertex(var0.maxX, var0.maxY, var0.maxZ); + var1.addVertex(var0.maxX, var0.minY, var0.maxZ); + var1.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public final void setRenderManager(RenderManager var1) { + this.renderManager = var1; + } + + public final void renderShadow(Entity var1, float var2, float var3, float var4, float var5) { + float var12; + float var18; + float var19; + int var29; + float var34; + float var36; + if(this.shadowSize > 0.0F) { + var5 = this.renderManager.getDistanceToCamera(var2, var3, var4); + var5 = (1.0F - var5 / 256.0F) * this.shadowOpaque; + if(var5 > 0.0F) { + float var9 = var5; + float var8 = var4; + float var7 = var3; + float var6 = var2; + Render var27 = this; + GL11.glEnable(GL11.GL_BLEND); + RenderEngine var10 = this.renderManager.renderEngine; + RenderEngine.bindTexture(var10.getTexture("%%/shadow.png")); + World var11 = this.renderManager.worldObj; + GL11.glDepthMask(false); + var12 = this.shadowSize; + + for(var29 = (int)(var2 - var12); var29 <= (int)(var6 + var12); ++var29) { + for(int var13 = (int)(var7 - 2.0F); var13 <= (int)var7; ++var13) { + for(int var14 = (int)(var8 - var12); var14 <= (int)(var8 + var12); ++var14) { + int var15 = var11.getBlockId(var29, var13 - 1, var14); + if(var15 > 0 && var11.getBlockLightValue(var29, var13, var14) > 3) { + Block var16 = Block.blocksList[var15]; + Tessellator var25 = Tessellator.instance; + var34 = (var9 - (var7 - (float)var13) / 2.0F) * 0.5F * var27.renderManager.worldObj.getLightBrightness(var29, var13, var14); + if(var34 >= 0.0F) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, var34); + var25.startDrawingQuads(); + var34 = (float)var29 + var16.minX; + var18 = (float)var29 + var16.maxX; + float var20 = (float)var13 + var16.minY; + float var21 = (float)var14 + var16.minZ; + var36 = (float)var14 + var16.maxZ; + float var22 = (var6 - var34) / 2.0F / var12 + 0.5F; + float var17 = (var6 - var18) / 2.0F / var12 + 0.5F; + float var23 = (var8 - var21) / 2.0F / var12 + 0.5F; + var19 = (var8 - var36) / 2.0F / var12 + 0.5F; + var25.addVertexWithUV(var34, var20, var21, var22, var23); + var25.addVertexWithUV(var34, var20, var36, var22, var19); + var25.addVertexWithUV(var18, var20, var36, var17, var19); + var25.addVertexWithUV(var18, var20, var21, var17, var23); + var25.draw(); + } + } + } + } + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + } + } + + if(var1.fire > 0) { + GL11.glDisable(GL11.GL_LIGHTING); + int var26 = Block.fire.blockIndexInTexture; + var29 = (var26 & 15) << 4; + int var30 = var26 & 240; + var12 = (float)var29 / 256.0F; + float var31 = ((float)var29 + 15.99F) / 256.0F; + float var32 = (float)var30 / 256.0F; + float var33 = ((float)var30 + 15.99F) / 256.0F; + GL11.glPushMatrix(); + GL11.glTranslatef(var2, var3, var4); + var34 = var1.width * 1.4F; + GL11.glScalef(var34, var34, var34); + this.loadTexture("/terrain.png"); + Tessellator var35 = Tessellator.instance; + var36 = 1.0F; + var18 = 0.0F; + var19 = var1.height / var1.width; + GL11.glRotatef(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0.0F, 0.0F, 0.4F + (float)((int)var19) * 0.02F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + var35.startDrawingQuads(); + + while(var19 > 0.0F) { + var35.addVertexWithUV(var36 - 0.5F, 0.0F - var18, 0.0F, var31, var33); + var35.addVertexWithUV(-0.5F, 0.0F - var18, 0.0F, var12, var33); + var35.addVertexWithUV(-0.5F, 1.4F - var18, 0.0F, var12, var32); + var35.addVertexWithUV(var36 - 0.5F, 1.4F - var18, 0.0F, var31, var32); + --var19; + --var18; + var36 *= 0.9F; + GL11.glTranslatef(0.0F, 0.0F, -0.04F); + } + + var35.draw(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_LIGHTING); + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderArrow.java b/src/teavm/java/net/minecraft/client/render/entity/RenderArrow.java new file mode 100644 index 0000000..64b5617 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderArrow.java @@ -0,0 +1,57 @@ +package net.minecraft.client.render.entity; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.projectile.EntityArrow; +import org.lwjgl.opengl.GL11; + +public final class RenderArrow extends Render { + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + EntityArrow var8 = (EntityArrow)var1; + this.loadTexture("/item/arrows.png"); + GL11.glPushMatrix(); + GL11.glTranslatef(var2, var3, var4); + GL11.glRotatef(var8.prevRotationYaw + (var8.rotationYaw - var8.prevRotationYaw) * var6 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(var8.prevRotationPitch + (var8.rotationPitch - var8.prevRotationPitch) * var6, 0.0F, 0.0F, 1.0F); + Tessellator var7 = Tessellator.instance; + GL11.glEnable(GL11.GL_NORMALIZE); + var2 = (float)var8.arrowShake - var6; + if(var2 > 0.0F) { + var2 = -MathHelper.sin(var2 * 3.0F) * var2; + GL11.glRotatef(var2, 0.0F, 0.0F, 1.0F); + } + + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(0.05625F, 0.05625F, 0.05625F); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.05625F, 0.0F, 0.0F); + var7.startDrawingQuads(); + var7.addVertexWithUV(-7.0F, -2.0F, -2.0F, 0.0F, 0.15625F); + var7.addVertexWithUV(-7.0F, -2.0F, 2.0F, 0.15625F, 0.15625F); + var7.addVertexWithUV(-7.0F, 2.0F, 2.0F, 0.15625F, 5.0F / 16.0F); + var7.addVertexWithUV(-7.0F, 2.0F, -2.0F, 0.0F, 5.0F / 16.0F); + var7.draw(); + GL11.glNormal3f(-0.05625F, 0.0F, 0.0F); + var7.startDrawingQuads(); + var7.addVertexWithUV(-7.0F, 2.0F, -2.0F, 0.0F, 0.15625F); + var7.addVertexWithUV(-7.0F, 2.0F, 2.0F, 0.15625F, 0.15625F); + var7.addVertexWithUV(-7.0F, -2.0F, 2.0F, 0.15625F, 5.0F / 16.0F); + var7.addVertexWithUV(-7.0F, -2.0F, -2.0F, 0.0F, 5.0F / 16.0F); + var7.draw(); + + for(int var9 = 0; var9 < 4; ++var9) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, 0.05625F); + var7.startDrawingQuads(); + var7.addVertexWithUV(-8.0F, -2.0F, 0.0F, 0.0F, 0.0F); + var7.addVertexWithUV(8.0F, -2.0F, 0.0F, 0.5F, 0.0F); + var7.addVertexWithUV(8.0F, 2.0F, 0.0F, 0.5F, 0.15625F); + var7.addVertexWithUV(-8.0F, 2.0F, 0.0F, 0.0F, 0.15625F); + var7.draw(); + } + + GL11.glDisable(GL11.GL_NORMALIZE); + GL11.glPopMatrix(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderCreeper.java b/src/teavm/java/net/minecraft/client/render/entity/RenderCreeper.java new file mode 100644 index 0000000..7f0b284 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderCreeper.java @@ -0,0 +1,51 @@ +package net.minecraft.client.render.entity; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.model.ModelCreeper; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.monster.EntityCreeper; +import org.lwjgl.opengl.GL11; + +public final class RenderCreeper extends RenderLiving { + public RenderCreeper() { + super(new ModelCreeper(), 0.5F); + } + + protected final void preRenderCallback(EntityLiving var1, float var2) { + EntityCreeper var4 = (EntityCreeper)var1; + float var5 = var4.c(var2); + var2 = 1.0F + MathHelper.sin(var5 * 100.0F) * var5 * 0.01F; + if(var5 < 0.0F) { + var5 = 0.0F; + } + + if(var5 > 1.0F) { + var5 = 1.0F; + } + + var5 *= var5; + var5 *= var5; + float var3 = (1.0F + var5 * 0.4F) * var2; + var5 = (1.0F + var5 * 0.1F) / var2; + GL11.glScalef(var3, var5, var3); + } + + protected final int getColorMultiplier(EntityLiving var1, float var2, float var3) { + EntityCreeper var4 = (EntityCreeper)var1; + float var5 = var4.c(var3); + if((int)(var5 * 10.0F) % 2 == 0) { + return 0; + } else { + int var6 = (int)(var5 * 0.2F * 255.0F); + if(var6 < 0) { + var6 = 0; + } + + if(var6 > 255) { + var6 = 255; + } + + return var6 << 24 | 16711680 | '\uff00' | 255; + } + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderEntity.java b/src/teavm/java/net/minecraft/client/render/entity/RenderEntity.java new file mode 100644 index 0000000..3382a39 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderEntity.java @@ -0,0 +1,13 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.game.entity.Entity; +import org.lwjgl.opengl.GL11; + +public final class RenderEntity extends Render { + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + GL11.glPushMatrix(); + GL11.glTranslatef(var2 - var1.lastTickPosX, var3 - var1.lastTickPosY, var4 - var1.lastTickPosZ); + renderOffsetAABB(var1.boundingBox); + GL11.glPopMatrix(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderGiantZombie.java b/src/teavm/java/net/minecraft/client/render/entity/RenderGiantZombie.java new file mode 100644 index 0000000..5ffc3a7 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderGiantZombie.java @@ -0,0 +1,17 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.game.entity.EntityLiving; +import org.lwjgl.opengl.GL11; + +public final class RenderGiantZombie extends RenderLiving { + private float scale = 6.0F; + + public RenderGiantZombie(ModelBase var1, float var2, float var3) { + super(var1, 3.0F); + } + + protected final void preRenderCallback(EntityLiving var1, float var2) { + GL11.glScalef(this.scale, this.scale, this.scale); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderItem.java b/src/teavm/java/net/minecraft/client/render/entity/RenderItem.java new file mode 100644 index 0000000..3266676 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderItem.java @@ -0,0 +1,200 @@ +package net.minecraft.client.render.entity; + +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.render.RenderBlocks; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; +import org.lwjgl.opengl.GL11; + +public final class RenderItem extends Render { + private RenderBlocks renderBlocks = new RenderBlocks(); + private Random random = new Random(); + + public RenderItem() { + this.shadowSize = 0.15F; + this.shadowOpaque = 12.0F / 16.0F; + } + + public final void renderItemIntoGUI(RenderEngine var1, ItemStack var2, int var3, int var4) { + if(var2 != null) { + int var9; + if(var2.itemID < 256 && Block.blocksList[var2.itemID].getRenderType() == 0) { + var9 = var2.itemID; + RenderEngine.bindTexture(var1.getTexture("/terrain.png")); + Block var8 = Block.blocksList[var9]; + GL11.glPushMatrix(); + GL11.glTranslatef((float)(var3 - 2), (float)(var4 + 3), 0.0F); + GL11.glScalef(10.0F, 10.0F, 10.0F); + GL11.glTranslatef(1.0F, 0.5F, 8.0F); + GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.renderBlocks.renderBlockOnInventory(var8); + GL11.glPopMatrix(); + } else { + if(var2.getItem().getIconIndex() >= 0) { + GL11.glDisable(GL11.GL_LIGHTING); + if(var2.itemID < 256) { + RenderEngine.bindTexture(var1.getTexture("/terrain.png")); + } else { + RenderEngine.bindTexture(var1.getTexture("/gui/items.png")); + } + + int var10000 = var3; + int var10001 = var4; + int var10002 = var2.getItem().getIconIndex() % 16 << 4; + int var10003 = var2.getItem().getIconIndex() / 16 << 4; + boolean var6 = true; + var6 = true; + var4 = var10003; + var3 = var10002; + var9 = var10001; + int var7 = var10000; + Tessellator var5 = Tessellator.instance; + var5.startDrawingQuads(); + var5.addVertexWithUV((float)var7, (float)(var9 + 16), 0.0F, (float)var3 * 0.00390625F, (float)(var4 + 16) * 0.00390625F); + var5.addVertexWithUV((float)(var7 + 16), (float)(var9 + 16), 0.0F, (float)(var3 + 16) * 0.00390625F, (float)(var4 + 16) * 0.00390625F); + var5.addVertexWithUV((float)(var7 + 16), (float)var9, 0.0F, (float)(var3 + 16) * 0.00390625F, (float)var4 * 0.00390625F); + var5.addVertexWithUV((float)var7, (float)var9, 0.0F, (float)var3 * 0.00390625F, (float)var4 * 0.00390625F); + var5.draw(); + GL11.glEnable(GL11.GL_LIGHTING); + } + + } + } + } + + public final void renderItemOverlayIntoGUI(FontRenderer var1, ItemStack var2, int var3, int var4) { + if(var2 != null) { + if(var2.stackSize > 1) { + String var5 = "" + var2.stackSize; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + var1.drawStringWithShadow(var5, var3 + 19 - 2 - var1.getStringWidth(var5), var4 + 6 + 3, 16777215); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + + if(var2.itemDamage > 0) { + int var9 = 13 - var2.itemDamage * 13 / var2.isItemStackDamageable(); + int var7 = 255 - var2.itemDamage * 255 / var2.isItemStackDamageable(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_TEXTURE_2D); + Tessellator var8 = Tessellator.instance; + int var6 = 255 - var7 << 16 | var7 << 8; + var7 = (255 - var7) / 4 << 16 | 16128; + renderQuad(var8, var3 + 2, var4 + 13, 13, 2, 0); + renderQuad(var8, var3 + 2, var4 + 13, 12, 1, var7); + renderQuad(var8, var3 + 2, var4 + 13, var9, 1, var6); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + } + } + + private static void renderQuad(Tessellator var0, int var1, int var2, int var3, int var4, int var5) { + var0.startDrawingQuads(); + var0.setColorOpaque_I(var5); + var0.addVertex((float)var1, (float)var2, 0.0F); + var0.addVertex((float)var1, (float)(var2 + var4), 0.0F); + var0.addVertex((float)(var1 + var3), (float)(var2 + var4), 0.0F); + var0.addVertex((float)(var1 + var3), (float)var2, 0.0F); + var0.draw(); + } + + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + EntityItem var13 = (EntityItem)var1; + RenderItem var12 = this; + this.random.setSeed(187L); + ItemStack var7 = var13.item; + GL11.glPushMatrix(); + float var8 = MathHelper.sin(((float)var13.age + var6) / 10.0F + var13.hoverStart) * 0.1F + 0.1F; + var6 = (((float)var13.age + var6) / 20.0F + var13.hoverStart) * (180.0F / (float)Math.PI); + byte var9 = 1; + if(var13.item.stackSize > 1) { + var9 = 2; + } + + if(var13.item.stackSize > 5) { + var9 = 3; + } + + if(var13.item.stackSize > 20) { + var9 = 4; + } + + GL11.glTranslatef(var2, var3 + var8, var4); + GL11.glEnable(GL11.GL_NORMALIZE); + if(var7.itemID < 256 && Block.blocksList[var7.itemID].getRenderType() == 0) { + GL11.glRotatef(var6, 0.0F, 1.0F, 0.0F); + this.loadTexture("/terrain.png"); + var2 = 0.25F; + if(!Block.blocksList[var7.itemID].renderAsNormalBlock() && var7.itemID != Block.stairSingle.blockID) { + var2 = 0.5F; + } + + GL11.glScalef(var2, var2, var2); + + for(int var16 = 0; var16 < var9; ++var16) { + GL11.glPushMatrix(); + if(var16 > 0) { + var4 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var2; + var5 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var2; + var6 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var2; + GL11.glTranslatef(var4, var5, var6); + } + + var12.renderBlocks.renderBlockOnInventory(Block.blocksList[var7.itemID]); + GL11.glPopMatrix(); + } + } else { + GL11.glScalef(0.5F, 0.5F, 0.5F); + int var14 = var7.getItem().getIconIndex(); + if(var7.itemID < 256) { + this.loadTexture("/terrain.png"); + } else { + this.loadTexture("/gui/items.png"); + } + + Tessellator var15 = Tessellator.instance; + var4 = (float)(var14 % 16 << 4) / 256.0F; + var5 = (float)((var14 % 16 << 4) + 16) / 256.0F; + var6 = (float)(var14 / 16 << 4) / 256.0F; + var2 = (float)((var14 / 16 << 4) + 16) / 256.0F; + + for(int var17 = 0; var17 < var9; ++var17) { + GL11.glPushMatrix(); + if(var17 > 0) { + var8 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + float var10 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + float var11 = (var12.random.nextFloat() * 2.0F - 1.0F) * 0.3F; + GL11.glTranslatef(var8, var10, var11); + } + + GL11.glRotatef(180.0F - var12.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + var15.startDrawingQuads(); + Tessellator.setNormal(0.0F, 1.0F, 0.0F); + var15.addVertexWithUV(-0.5F, -0.25F, 0.0F, var4, var2); + var15.addVertexWithUV(0.5F, -0.25F, 0.0F, var5, var2); + var15.addVertexWithUV(0.5F, 12.0F / 16.0F, 0.0F, var5, var6); + var15.addVertexWithUV(-0.5F, 12.0F / 16.0F, 0.0F, var4, var6); + var15.draw(); + GL11.glPopMatrix(); + } + } + + GL11.glDisable(GL11.GL_NORMALIZE); + GL11.glPopMatrix(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderLiving.java b/src/teavm/java/net/minecraft/client/render/entity/RenderLiving.java new file mode 100644 index 0000000..5d2168d --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderLiving.java @@ -0,0 +1,134 @@ +package net.minecraft.client.render.entity; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.client.model.ModelBase; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import org.lwjgl.opengl.GL11; + +public class RenderLiving extends Render { + protected ModelBase mainModel; + private ModelBase renderPassModel; + + public RenderLiving(ModelBase var1, float var2) { + this.mainModel = var1; + this.shadowSize = var2; + } + + public final void setRenderPassModel(ModelBase var1) { + this.renderPassModel = var1; + } + + public void a(EntityLiving var1, float var2, float var3, float var4, float var5, float var6) { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + + try { + var5 = var1.prevRenderYawOffset + (var1.renderYawOffset - var1.prevRenderYawOffset) * var6; + float var7 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var6; + float var8 = var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var6; + GL11.glTranslatef(var2, var3, var4); + var2 = (float)var1.ticksExisted + var6; + GL11.glRotatef(180.0F - var5, 0.0F, 1.0F, 0.0F); + if(var1.deathTime > 0) { + var3 = ((float)var1.deathTime + var6 - 1.0F) / 20.0F * 1.6F; + var3 = MathHelper.sqrt_float(var3); + if(var3 > 1.0F) { + var3 = 1.0F; + } + + GL11.glRotatef(var3 * this.getDeathMaxRotation(var1), 0.0F, 0.0F, 1.0F); + } + + GL11.glScalef(-(1.0F / 16.0F), -(1.0F / 16.0F), 1.0F / 16.0F); + this.preRenderCallback(var1, var6); + GL11.glTranslatef(0.0F, -24.0F, 0.0F); + GL11.glEnable(GL11.GL_NORMALIZE); + var3 = var1.prevLimbYaw + (var1.limbYaw - var1.prevLimbYaw) * var6; + var4 = var1.limbSwing - var1.limbYaw * (1.0F - var6); + if(var3 > 1.0F) { + var3 = 1.0F; + } + + this.loadDownloadableImageTexture(var1.skinUrl, var1.getTexture()); + GL11.glEnable(GL11.GL_ALPHA_TEST); + this.mainModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + + for(int var9 = 0; var9 < 4; ++var9) { + if(this.shouldRenderPass(var1, var9)) { + this.renderPassModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + } + + float var15 = var1.getEntityBrightness(var6); + int var14 = this.getColorMultiplier(var1, var15, var6); + if(var14 >>> 24 > 0 || var1.hurtTime > 0 || var1.deathTime > 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + if(var1.hurtTime > 0 || var1.deathTime > 0) { + GL11.glColor4f(var15, 0.0F, 0.0F, 0.4F); + this.mainModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + + for(int var10 = 0; var10 < 4; ++var10) { + if(this.shouldRenderPass(var1, var10)) { + GL11.glColor4f(var15, 0.0F, 0.0F, 0.4F); + this.renderPassModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + } + } + } + + if(var14 >>> 24 > 0) { + float var16 = (float)(var14 >> 16 & 255) / 255.0F; + var15 = (float)(var14 >> 8 & 255) / 255.0F; + float var11 = (float)(var14 & 255) / 255.0F; + var6 = (float)(var14 >>> 24) / 255.0F; + GL11.glColor4f(var16, var15, var11, var6); + this.mainModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + + for(int var12 = 0; var12 < 4; ++var12) { + if(this.shouldRenderPass(var1, var12)) { + GL11.glColor4f(var16, var15, var11, var6); + this.renderPassModel.render(var4, var3, var2, var7 - var5, var8, 1.0F); + } + } + } + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glDisable(GL11.GL_NORMALIZE); + } catch (Exception var13) { + var13.printStackTrace(); + } + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + } + + protected boolean shouldRenderPass(EntityLiving var1, int var2) { + return false; + } + + protected float getDeathMaxRotation(EntityLiving var1) { + return 90.0F; + } + + protected int getColorMultiplier(EntityLiving var1, float var2, float var3) { + return 0; + } + + protected void preRenderCallback(EntityLiving var1, float var2) { + } + + public void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + this.a((EntityLiving)var1, var2, var3, var4, var5, var6); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderManager.java b/src/teavm/java/net/minecraft/client/render/entity/RenderManager.java new file mode 100644 index 0000000..903cc7e --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderManager.java @@ -0,0 +1,113 @@ +package net.minecraft.client.render.entity; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelPig; +import net.minecraft.client.model.ModelSheep; +import net.minecraft.client.model.ModelSheepFur; +import net.minecraft.client.model.ModelSkeleton; +import net.minecraft.client.model.ModelZombie; +import net.minecraft.client.render.RenderEngine; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.EntityPainting; +import net.minecraft.game.entity.animal.EntityPig; +import net.minecraft.game.entity.animal.EntitySheep; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.misc.EntityTNTPrimed; +import net.minecraft.game.entity.monster.EntityCreeper; +import net.minecraft.game.entity.monster.EntityGiantZombie; +import net.minecraft.game.entity.monster.EntitySkeleton; +import net.minecraft.game.entity.monster.EntitySpider; +import net.minecraft.game.entity.monster.EntityZombie; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.entity.projectile.EntityArrow; +import net.minecraft.game.level.World; +import org.lwjgl.opengl.GL11; + +public final class RenderManager { + private Map entityRenderMap = new HashMap(); + public static RenderManager instance = new RenderManager(); + public RenderEngine renderEngine; + public World worldObj; + public float playerViewY; + private float viewerPosX; + private float viewerPosY; + private float viewerPosZ; + + private RenderManager() { + this.entityRenderMap.put(EntitySpider.class, new RenderSpider()); + this.entityRenderMap.put(EntityPig.class, new RenderLiving(new ModelPig(), 0.7F)); + this.entityRenderMap.put(EntitySheep.class, new RenderSheep(new ModelSheep(), new ModelSheepFur(), 0.7F)); + this.entityRenderMap.put(EntityCreeper.class, new RenderCreeper()); + this.entityRenderMap.put(EntitySkeleton.class, new RenderLiving(new ModelSkeleton(), 0.5F)); + this.entityRenderMap.put(EntityZombie.class, new RenderLiving(new ModelZombie(), 0.5F)); + this.entityRenderMap.put(EntityPlayer.class, new RenderPlayer()); + this.entityRenderMap.put(EntityGiantZombie.class, new RenderGiantZombie(new ModelZombie(), 0.5F, 6.0F)); + this.entityRenderMap.put(EntityLiving.class, new RenderLiving(new ModelBiped(), 0.5F)); + this.entityRenderMap.put(Entity.class, new RenderEntity()); + this.entityRenderMap.put(EntityPainting.class, new RenderPainting()); + this.entityRenderMap.put(EntityArrow.class, new RenderArrow()); + this.entityRenderMap.put(EntityItem.class, new RenderItem()); + this.entityRenderMap.put(EntityTNTPrimed.class, new RenderTNTPrimed()); + Iterator var1 = this.entityRenderMap.values().iterator(); + + while(var1.hasNext()) { + Render var2 = (Render)var1.next(); + var2.setRenderManager(this); + } + + } + + public final Render getEntityRenderObject(Entity var1) { + Class var2 = var1.getClass(); + Render var3 = (Render)this.entityRenderMap.get(var2); + if(var3 == null && var2 != Entity.class) { + var3 = (Render)this.entityRenderMap.get(var2.getSuperclass()); + this.entityRenderMap.put(var2, var3); + } + + return var3; + } + + public final void cacheActiveRenderInfo(World var1, RenderEngine var2, EntityPlayer var3, float var4) { + this.worldObj = var1; + this.renderEngine = var2; + this.playerViewY = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4; + this.viewerPosX = var3.lastTickPosX + (var3.posX - var3.lastTickPosX) * var4; + this.viewerPosY = var3.lastTickPosY + (var3.posY - var3.lastTickPosY) * var4; + this.viewerPosZ = var3.lastTickPosZ + (var3.posZ - var3.lastTickPosZ) * var4; + } + + public final void renderEntity(Entity var1, float var2) { + float var3 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * var2; + float var4 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * var2; + float var5 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * var2; + float var6 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var2; + float var7 = this.worldObj.getLightBrightness((int)var3, (int)(var4 + var1.getShadowSize()), (int)var5); + GL11.glColor3f(var7, var7, var7); + this.renderEntityWithPosYaw(var1, var3, var4, var5, var6, var2); + } + + public final void renderEntityWithPosYaw(Entity var1, float var2, float var3, float var4, float var5, float var6) { + Render var7 = this.getEntityRenderObject(var1); + if(var7 != null) { + var7.doRender(var1, var2, var3, var4, var5, var6); + var7.renderShadow(var1, var2, var3, var4, var6); + } + + } + + public final void set(World var1) { + this.worldObj = var1; + } + + public final float getDistanceToCamera(float var1, float var2, float var3) { + var1 -= this.viewerPosX; + var2 -= this.viewerPosY; + var3 -= this.viewerPosZ; + return var1 * var1 + var2 * var2 + var3 * var3; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderPainting.java b/src/teavm/java/net/minecraft/client/render/entity/RenderPainting.java new file mode 100644 index 0000000..729f9a6 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderPainting.java @@ -0,0 +1,105 @@ +package net.minecraft.client.render.entity; + +import java.util.Random; +import net.minecraft.client.render.Tessellator; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityPainting; +import net.minecraft.game.entity.EnumArt; +import org.lwjgl.opengl.GL11; + +public final class RenderPainting extends Render { + private Random rand = new Random(); + + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + EntityPainting var22 = (EntityPainting)var1; + this.rand.setSeed(187L); + GL11.glPushMatrix(); + GL11.glTranslatef(var2, var3, var4); + GL11.glRotatef(var5, 0.0F, 1.0F, 0.0F); + GL11.glEnable(GL11.GL_NORMALIZE); + this.loadTexture("/art/kz.png"); + EnumArt var23 = var22.art; + GL11.glScalef(1.0F / 16.0F, 1.0F / 16.0F, 1.0F / 16.0F); + int var27 = var23.offsetY; + int var26 = var23.offsetX; + int var25 = var23.sizeY; + int var24 = var23.sizeX; + var22 = var22; + RenderPainting var21 = this; + float var7 = (float)(-var24) / 2.0F; + float var8 = (float)(-var25) / 2.0F; + + for(int var9 = 0; var9 < var24 / 16; ++var9) { + for(int var10 = 0; var10 < var25 / 16; ++var10) { + float var11 = var7 + (float)(var9 + 1 << 4); + float var12 = var7 + (float)(var9 << 4); + float var13 = var8 + (float)(var10 + 1 << 4); + float var14 = var8 + (float)(var10 << 4); + float var10002 = (var11 + var12) / 2.0F; + float var18 = (var13 + var14) / 2.0F; + float var17 = var10002; + int var19 = (int)var22.posX; + int var28 = (int)(var22.posY + var18 / 16.0F); + int var20 = (int)var22.posZ; + if(var22.direction == 0) { + var19 = (int)(var22.posX + var17 / 16.0F); + } + + if(var22.direction == 1) { + var20 = (int)(var22.posZ - var17 / 16.0F); + } + + if(var22.direction == 2) { + var19 = (int)(var22.posX - var17 / 16.0F); + } + + if(var22.direction == 3) { + var20 = (int)(var22.posZ + var17 / 16.0F); + } + + float var15 = var21.renderManager.worldObj.getLightBrightness(var19, var28, var20); + GL11.glColor3f(var15, var15, var15); + var15 = (float)(var26 + var24 - (var9 << 4)) / 256.0F; + float var16 = (float)(var26 + var24 - (var9 + 1 << 4)) / 256.0F; + var17 = (float)(var27 + var25 - (var10 << 4)) / 256.0F; + var18 = (float)(var27 + var25 - (var10 + 1 << 4)) / 256.0F; + Tessellator var29 = Tessellator.instance; + var29.startDrawingQuads(); + Tessellator.setNormal(0.0F, 0.0F, -1.0F); + var29.addVertexWithUV(var11, var14, -0.5F, var16, var17); + var29.addVertexWithUV(var12, var14, -0.5F, var15, var17); + var29.addVertexWithUV(var12, var13, -0.5F, var15, var18); + var29.addVertexWithUV(var11, var13, -0.5F, var16, var18); + Tessellator.setNormal(0.0F, 0.0F, 1.0F); + var29.addVertexWithUV(var11, var13, 0.5F, 12.0F / 16.0F, 0.0F); + var29.addVertexWithUV(var12, var13, 0.5F, 13.0F / 16.0F, 0.0F); + var29.addVertexWithUV(var12, var14, 0.5F, 13.0F / 16.0F, 1.0F / 16.0F); + var29.addVertexWithUV(var11, var14, 0.5F, 12.0F / 16.0F, 1.0F / 16.0F); + Tessellator.setNormal(0.0F, -1.0F, 0.0F); + var29.addVertexWithUV(var11, var13, -0.5F, 12.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var12, var13, -0.5F, 13.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var12, var13, 0.5F, 13.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var11, var13, 0.5F, 12.0F / 16.0F, 0.001953125F); + Tessellator.setNormal(0.0F, 1.0F, 0.0F); + var29.addVertexWithUV(var11, var14, 0.5F, 12.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var12, var14, 0.5F, 13.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var12, var14, -0.5F, 13.0F / 16.0F, 0.001953125F); + var29.addVertexWithUV(var11, var14, -0.5F, 12.0F / 16.0F, 0.001953125F); + Tessellator.setNormal(-1.0F, 0.0F, 0.0F); + var29.addVertexWithUV(var11, var13, 0.5F, 385.0F / 512.0F, 0.0F); + var29.addVertexWithUV(var11, var14, 0.5F, 385.0F / 512.0F, 1.0F / 16.0F); + var29.addVertexWithUV(var11, var14, -0.5F, 385.0F / 512.0F, 1.0F / 16.0F); + var29.addVertexWithUV(var11, var13, -0.5F, 385.0F / 512.0F, 0.0F); + Tessellator.setNormal(1.0F, 0.0F, 0.0F); + var29.addVertexWithUV(var12, var13, -0.5F, 385.0F / 512.0F, 0.0F); + var29.addVertexWithUV(var12, var14, -0.5F, 385.0F / 512.0F, 1.0F / 16.0F); + var29.addVertexWithUV(var12, var14, 0.5F, 385.0F / 512.0F, 1.0F / 16.0F); + var29.addVertexWithUV(var12, var13, 0.5F, 385.0F / 512.0F, 0.0F); + var29.draw(); + } + } + + GL11.glDisable(GL11.GL_NORMALIZE); + GL11.glPopMatrix(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderPlayer.java b/src/teavm/java/net/minecraft/client/render/entity/RenderPlayer.java new file mode 100644 index 0000000..c9aa417 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderPlayer.java @@ -0,0 +1,65 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemArmor; +import net.minecraft.game.item.ItemStack; + +public final class RenderPlayer extends RenderLiving { + private ModelBiped modelBipedMain = (ModelBiped)this.mainModel; + private ModelBiped modelArmorChestplate = new ModelBiped(1.0F); + private ModelBiped modelArmor = new ModelBiped(0.5F); + private static final String[] armorFilenamePrefix = new String[]{"cloth", "chain", "iron", "diamond", "gold"}; + + public RenderPlayer() { + super(new ModelBiped(0.0F), 0.5F); + } + + private void renderPlayer(EntityPlayer var1, float var2, float var3, float var4, float var5, float var6) { + super.a(var1, var2, var3 - var1.yOffset, var4, var5, var6); + } + + public final void drawFirstPersonHand() { + this.modelBipedMain.bipedRightArm.render(1.0F); + } + + protected final boolean shouldRenderPass(EntityLiving var1, int var2) { + EntityPlayer var10001 = (EntityPlayer)var1; + int var3 = var2; + EntityPlayer var5 = var10001; + int var4 = 3 - var3; + InventoryPlayer var6 = var5.inventory; + ItemStack var7 = var6.armorInventory[var4]; + if(var7 != null) { + Item var8 = var7.getItem(); + if(var8 instanceof ItemArmor) { + ItemArmor var9 = (ItemArmor)var8; + this.loadTexture("/armor/" + armorFilenamePrefix[var9.renderIndex] + "_" + (var3 == 2 ? 2 : 1) + ".png"); + ModelBiped var10 = var3 == 2 ? this.modelArmor : this.modelArmorChestplate; + var10.bipedHead.showModel = var3 == 0; + var10.bipedHeadwear.showModel = var3 == 0; + var10.bipedBody.showModel = var3 == 1 || var3 == 2; + var10.bipedRightArm.showModel = var3 == 1; + var10.bipedLeftArm.showModel = var3 == 1; + var10.bipedRightLeg.showModel = var3 == 2 || var3 == 3; + var10.bipedLeftLeg.showModel = var3 == 2 || var3 == 3; + this.setRenderPassModel(var10); + return true; + } + } + + return false; + } + + public final void a(EntityLiving var1, float var2, float var3, float var4, float var5, float var6) { + this.renderPlayer((EntityPlayer)var1, var2, var3, var4, var5, var6); + } + + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + this.renderPlayer((EntityPlayer)var1, var2, var3, var4, var5, var6); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderSheep.java b/src/teavm/java/net/minecraft/client/render/entity/RenderSheep.java new file mode 100644 index 0000000..83d28ec --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderSheep.java @@ -0,0 +1,20 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.animal.EntitySheep; + +public final class RenderSheep extends RenderLiving { + public RenderSheep(ModelBase var1, ModelBase var2, float var3) { + super(var1, 0.7F); + this.setRenderPassModel(var2); + } + + protected final boolean shouldRenderPass(EntityLiving var1, int var2) { + EntitySheep var10001 = (EntitySheep)var1; + int var3 = var2; + EntitySheep var4 = var10001; + this.loadTexture("/mob/sheep_fur.png"); + return var3 == 0 && !var4.sheared; + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderSpider.java b/src/teavm/java/net/minecraft/client/render/entity/RenderSpider.java new file mode 100644 index 0000000..8d56504 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderSpider.java @@ -0,0 +1,36 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.model.ModelSpider; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.monster.EntitySpider; +import org.lwjgl.opengl.GL11; + +public final class RenderSpider extends RenderLiving { + public RenderSpider() { + super(new ModelSpider(), 1.0F); + this.setRenderPassModel(new ModelSpider()); + } + + protected final float getDeathMaxRotation(EntityLiving var1) { + return 180.0F; + } + + protected final boolean shouldRenderPass(EntityLiving var1, int var2) { + EntitySpider var10001 = (EntitySpider)var1; + int var3 = var2; + EntitySpider var5 = var10001; + if(var3 != 0) { + return false; + } else if(var3 != 0) { + return false; + } else { + this.loadTexture("/mob/spider_eyes.png"); + float var4 = (1.0F - var5.getEntityBrightness(1.0F)) * 0.5F; + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, var4); + return true; + } + } +} diff --git a/src/teavm/java/net/minecraft/client/render/entity/RenderTNTPrimed.java b/src/teavm/java/net/minecraft/client/render/entity/RenderTNTPrimed.java new file mode 100644 index 0000000..568bb40 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/entity/RenderTNTPrimed.java @@ -0,0 +1,58 @@ +package net.minecraft.client.render.entity; + +import net.minecraft.client.render.RenderBlocks; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.misc.EntityTNTPrimed; +import net.minecraft.game.level.block.Block; +import org.lwjgl.opengl.GL11; + +public final class RenderTNTPrimed extends Render { + private RenderBlocks blockRenderer = new RenderBlocks(); + + public RenderTNTPrimed() { + this.shadowSize = 0.5F; + } + + public final void doRender(Entity var1, float var2, float var3, float var4, float var5, float var6) { + EntityTNTPrimed var10001 = (EntityTNTPrimed)var1; + var5 = var4; + var4 = var3; + var3 = var2; + EntityTNTPrimed var7 = var10001; + GL11.glPushMatrix(); + GL11.glTranslatef(var3, var4, var5); + if((float)var7.fuse - var6 + 1.0F < 10.0F) { + var3 = 1.0F - ((float)var7.fuse - var6 + 1.0F) / 10.0F; + if(var3 < 0.0F) { + var3 = 0.0F; + } + + if(var3 > 1.0F) { + var3 = 1.0F; + } + + var3 *= var3; + var3 *= var3; + var3 = 1.0F + var3 * 0.3F; + GL11.glScalef(var3, var3, var3); + } + + var3 = (1.0F - ((float)var7.fuse - var6 + 1.0F) / 100.0F) * 0.8F; + this.loadTexture("/terrain.png"); + this.blockRenderer.renderBlockOnInventory(Block.tnt); + if(var7.fuse / 5 % 2 == 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, var3); + this.blockRenderer.renderBlockOnInventory(Block.tnt); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureFX.java new file mode 100644 index 0000000..2ef62a8 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureFX.java @@ -0,0 +1,15 @@ +package net.minecraft.client.render.texture; + +public class TextureFX { + public byte[] imageData = new byte[1024]; + public int iconIndex; + public boolean anaglyphEnabled = false; + public int textureId = 0; + + public TextureFX(int var1) { + this.iconIndex = var1; + } + + public void onTick() { + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureFlamesFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureFlamesFX.java new file mode 100644 index 0000000..6e9f072 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureFlamesFX.java @@ -0,0 +1,79 @@ +package net.minecraft.client.render.texture; + +import net.minecraft.game.level.block.Block; + +public final class TextureFlamesFX extends TextureFX { + private float[] currentFireFrame = new float[320]; + private float[] lastFireFrame = new float[320]; + + public TextureFlamesFX(int var1) { + super(Block.fire.blockIndexInTexture + (var1 << 4)); + } + + public final void onTick() { + int var1; + int var2; + int var3; + int var5; + int var6; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 20; ++var2) { + var3 = 18; + float var4 = this.currentFireFrame[var1 + ((var2 + 1) % 20 << 4)] * 18.0F; + + for(var5 = var1 - 1; var5 <= var1 + 1; ++var5) { + for(var6 = var2; var6 <= var2 + 1; ++var6) { + if(var5 >= 0 && var6 >= 0 && var5 < 16 && var6 < 20) { + var4 += this.currentFireFrame[var5 + (var6 << 4)]; + } + + ++var3; + } + } + + this.lastFireFrame[var1 + (var2 << 4)] = var4 / ((float)var3 * 1.06F); + if(var2 >= 19) { + this.lastFireFrame[var1 + (var2 << 4)] = (float)(Math.random() * Math.random() * Math.random() * 4.0D + Math.random() * (double)0.1F + (double)0.2F); + } + } + } + + float[] var9 = this.lastFireFrame; + this.lastFireFrame = this.currentFireFrame; + this.currentFireFrame = var9; + + for(var2 = 0; var2 < 256; ++var2) { + float var10 = this.currentFireFrame[var2] * 1.8F; + if(var10 > 1.0F) { + var10 = 1.0F; + } + + if(var10 < 0.0F) { + var10 = 0.0F; + } + + var5 = (int)(var10 * 155.0F + 100.0F); + var6 = (int)(var10 * var10 * 255.0F); + int var7 = (int)(var10 * var10 * var10 * var10 * var10 * var10 * var10 * var10 * var10 * var10 * 255.0F); + short var8 = 255; + if(var10 < 0.5F) { + var8 = 0; + } + + if(this.anaglyphEnabled) { + var1 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + var3 = (var5 * 30 + var6 * 70) / 100; + int var11 = (var5 * 30 + var7 * 70) / 100; + var5 = var1; + var6 = var3; + var7 = var11; + } + + this.imageData[var2 << 2] = (byte)var5; + this.imageData[(var2 << 2) + 1] = (byte)var6; + this.imageData[(var2 << 2) + 2] = (byte)var7; + this.imageData[(var2 << 2) + 3] = (byte)var8; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureGearsFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureGearsFX.java new file mode 100644 index 0000000..5e61d21 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureGearsFX.java @@ -0,0 +1,66 @@ +package net.minecraft.client.render.texture; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import javax.imageio.ImageIO; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.game.level.block.Block; + +public class TextureGearsFX extends TextureFX { + private int gearRotation = 0; + private int[] gearColor = new int[1024]; + private int[] gearMiddleColor = new int[1024]; + private int gearRotationDir; + + public TextureGearsFX(int var1) { + super(Block.cog.blockIndexInTexture + var1); + this.gearRotationDir = (var1 << 1) - 1; + this.gearRotation = 2; + + try { + BufferedImage var3 = ImageIO.read(TextureGearsFX.class.getResource("/misc/gear.png")); + var3.getRGB(0, 0, 32, 32, this.gearColor, 0, 32); + var3 = ImageIO.read(TextureGearsFX.class.getResource("/misc/gearmiddle.png")); + var3.getRGB(0, 0, 16, 16, this.gearMiddleColor, 0, 16); + } catch (IOException var2) { + var2.printStackTrace(); + } + } + + public final void onTick() { + this.gearRotation = this.gearRotation + this.gearRotationDir & 63; + float var1 = MathHelper.sin((float)this.gearRotation / 64.0F * (float)Math.PI * 2.0F); + float var2 = MathHelper.cos((float)this.gearRotation / 64.0F * (float)Math.PI * 2.0F); + + for(int var3 = 0; var3 < 16; ++var3) { + for(int var4 = 0; var4 < 16; ++var4) { + float var5 = ((float)var3 / 15.0F - 0.5F) * 31.0F; + float var6 = ((float)var4 / 15.0F - 0.5F) * 31.0F; + float var7 = var2 * var5 - var1 * var6; + var5 = var2 * var6 + var1 * var5; + int var11 = (int)(var7 + 16.0F); + int var10 = (int)(var5 + 16.0F); + int var12 = 0; + if(var11 >= 0 && var10 >= 0 && var11 < 32 && var10 < 32) { + var12 = this.gearColor[var11 + (var10 << 5)]; + var10 = this.gearMiddleColor[var3 + (var4 << 4)]; + if(var10 >>> 24 > 128) { + var12 = var10; + } + } + + var10 = var12 >> 16 & 255; + var11 = var12 >> 8 & 255; + int var8 = var12 & 255; + var12 = var12 >>> 24 > 128 ? 255 : 0; + int var9 = var3 + (var4 << 4); + this.imageData[var9 << 2] = (byte)var10; + this.imageData[(var9 << 2) + 1] = (byte)var11; + this.imageData[(var9 << 2) + 2] = (byte)var8; + this.imageData[(var9 << 2) + 3] = (byte)var12; + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureLavaFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureLavaFX.java new file mode 100644 index 0000000..614a841 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureLavaFX.java @@ -0,0 +1,85 @@ +package net.minecraft.client.render.texture; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.game.level.block.Block; + +public final class TextureLavaFX extends TextureFX { + private float[] red = new float[256]; + private float[] green = new float[256]; + private float[] blue = new float[256]; + private float[] alpha = new float[256]; + + public TextureLavaFX() { + super(Block.lavaMoving.blockIndexInTexture); + } + + public final void onTick() { + int var1; + int var2; + float var3; + int var5; + int var6; + int var7; + int var8; + int var9; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + int var4 = (int)(MathHelper.sin((float)var2 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + var5 = (int)(MathHelper.sin((float)var1 * (float)Math.PI * 2.0F / 16.0F) * 1.2F); + + for(var6 = var1 - 1; var6 <= var1 + 1; ++var6) { + for(var7 = var2 - 1; var7 <= var2 + 1; ++var7) { + var8 = var6 + var4 & 15; + var9 = var7 + var5 & 15; + var3 += this.red[var8 + (var9 << 4)]; + } + } + + this.green[var1 + (var2 << 4)] = var3 / 10.0F + (this.blue[(var1 & 15) + ((var2 & 15) << 4)] + this.blue[(var1 + 1 & 15) + ((var2 & 15) << 4)] + this.blue[(var1 + 1 & 15) + ((var2 + 1 & 15) << 4)] + this.blue[(var1 & 15) + ((var2 + 1 & 15) << 4)]) / 4.0F * 0.8F; + this.blue[var1 + (var2 << 4)] += this.alpha[var1 + (var2 << 4)] * 0.01F; + if(this.blue[var1 + (var2 << 4)] < 0.0F) { + this.blue[var1 + (var2 << 4)] = 0.0F; + } + + this.alpha[var1 + (var2 << 4)] -= 0.06F; + if(Math.random() < 0.005D) { + this.alpha[var1 + (var2 << 4)] = 1.5F; + } + } + } + + float[] var10 = this.green; + this.green = this.red; + this.red = var10; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.red[var2] * 2.0F; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + var5 = (int)(var3 * 100.0F + 155.0F); + var6 = (int)(var3 * var3 * 255.0F); + var7 = (int)(var3 * var3 * var3 * var3 * 128.0F); + if(this.anaglyphEnabled) { + var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + var9 = (var5 * 30 + var6 * 70) / 100; + var1 = (var5 * 30 + var7 * 70) / 100; + var5 = var8; + var6 = var9; + var7 = var1; + } + + this.imageData[var2 << 2] = (byte)var5; + this.imageData[(var2 << 2) + 1] = (byte)var6; + this.imageData[(var2 << 2) + 2] = (byte)var7; + this.imageData[(var2 << 2) + 3] = -1; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFX.java new file mode 100644 index 0000000..52658b8 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFX.java @@ -0,0 +1,88 @@ +package net.minecraft.client.render.texture; + +import net.minecraft.game.level.block.Block; + +public final class TextureWaterFX extends TextureFX { + private float[] red = new float[256]; + private float[] green = new float[256]; + private float[] blue = new float[256]; + private float[] alpha = new float[256]; + private int tickCounter = 0; + + public TextureWaterFX() { + super(Block.waterMoving.blockIndexInTexture); + } + + public final void onTick() { + ++this.tickCounter; + + int var1; + int var2; + float var3; + int var4; + int var5; + int var6; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + + for(var4 = var1 - 1; var4 <= var1 + 1; ++var4) { + var5 = var4 & 15; + var6 = var2 & 15; + var3 += this.red[var5 + (var6 << 4)]; + } + + this.green[var1 + (var2 << 4)] = var3 / 3.3F + this.blue[var1 + (var2 << 4)] * 0.8F; + } + } + + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + this.blue[var1 + (var2 << 4)] += this.alpha[var1 + (var2 << 4)] * 0.05F; + if(this.blue[var1 + (var2 << 4)] < 0.0F) { + this.blue[var1 + (var2 << 4)] = 0.0F; + } + + this.alpha[var1 + (var2 << 4)] -= 0.1F; + if(Math.random() < 0.05D) { + this.alpha[var1 + (var2 << 4)] = 0.5F; + } + } + } + + float[] var8 = this.green; + this.green = this.red; + this.red = var8; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.red[var2]; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + float var9 = var3 * var3; + var5 = (int)(32.0F + var9 * 32.0F); + var6 = (int)(50.0F + var9 * 64.0F); + var1 = 255; + int var10 = (int)(146.0F + var9 * 50.0F); + if(this.anaglyphEnabled) { + var1 = (var5 * 30 + var6 * 59 + 2805) / 100; + var4 = (var5 * 30 + var6 * 70) / 100; + int var7 = (var5 * 30 + 17850) / 100; + var5 = var1; + var6 = var4; + var1 = var7; + } + + this.imageData[var2 << 2] = (byte)var5; + this.imageData[(var2 << 2) + 1] = (byte)var6; + this.imageData[(var2 << 2) + 2] = (byte)var1; + this.imageData[(var2 << 2) + 3] = (byte)var10; + } + + } +} diff --git a/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFlowFX.java b/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFlowFX.java new file mode 100644 index 0000000..4214b43 --- /dev/null +++ b/src/teavm/java/net/minecraft/client/render/texture/TextureWaterFlowFX.java @@ -0,0 +1,88 @@ +package net.minecraft.client.render.texture; + +import net.minecraft.game.level.block.Block; + +public final class TextureWaterFlowFX extends TextureFX { + private float[] red = new float[256]; + private float[] green = new float[256]; + private float[] blue = new float[256]; + private float[] alpha = new float[256]; + private int tickCounter = 0; + + public TextureWaterFlowFX() { + super(Block.waterMoving.blockIndexInTexture + 32); + } + + public final void onTick() { + ++this.tickCounter; + + int var1; + int var2; + float var3; + int var4; + int var5; + int var6; + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + var3 = 0.0F; + + for(var4 = var2 - 2; var4 <= var2; ++var4) { + var5 = var1 & 15; + var6 = var4 & 15; + var3 += this.red[var5 + (var6 << 4)]; + } + + this.green[var1 + (var2 << 4)] = var3 / 3.2F + this.blue[var1 + (var2 << 4)] * 0.8F; + } + } + + for(var1 = 0; var1 < 16; ++var1) { + for(var2 = 0; var2 < 16; ++var2) { + this.blue[var1 + (var2 << 4)] += this.alpha[var1 + (var2 << 4)] * 0.05F; + if(this.blue[var1 + (var2 << 4)] < 0.0F) { + this.blue[var1 + (var2 << 4)] = 0.0F; + } + + this.alpha[var1 + (var2 << 4)] -= 0.3F; + if(Math.random() < 0.2D) { + this.alpha[var1 + (var2 << 4)] = 0.5F; + } + } + } + + float[] var8 = this.green; + this.green = this.red; + this.red = var8; + + for(var2 = 0; var2 < 256; ++var2) { + var3 = this.red[var2]; + if(var3 > 1.0F) { + var3 = 1.0F; + } + + if(var3 < 0.0F) { + var3 = 0.0F; + } + + float var9 = var3 * var3; + var5 = (int)(32.0F + var9 * 32.0F); + var6 = (int)(50.0F + var9 * 64.0F); + var1 = 255; + int var10 = (int)(146.0F + var9 * 50.0F); + if(this.anaglyphEnabled) { + var1 = (var5 * 30 + var6 * 59 + 2805) / 100; + var4 = (var5 * 30 + var6 * 70) / 100; + int var7 = (var5 * 30 + 17850) / 100; + var5 = var1; + var6 = var4; + var1 = var7; + } + + this.imageData[var2 << 2] = (byte)var5; + this.imageData[(var2 << 2) + 1] = (byte)var6; + this.imageData[(var2 << 2) + 2] = (byte)var1; + this.imageData[(var2 << 2) + 3] = (byte)var10; + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/IInventory.java b/src/teavm/java/net/minecraft/game/IInventory.java new file mode 100644 index 0000000..cc61424 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/IInventory.java @@ -0,0 +1,17 @@ +package net.minecraft.game; + +import net.minecraft.game.item.ItemStack; + +public interface IInventory { + int getSizeInventory(); + + ItemStack getStackInSlot(int var1); + + ItemStack decrStackSize(int var1, int var2); + + void setInventorySlotContents(int var1, ItemStack var2); + + String getInvName(); + + int getInventoryStackLimit(); +} diff --git a/src/teavm/java/net/minecraft/game/InventoryLargeChest.java b/src/teavm/java/net/minecraft/game/InventoryLargeChest.java new file mode 100644 index 0000000..07eaaa2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/InventoryLargeChest.java @@ -0,0 +1,43 @@ +package net.minecraft.game; + +import net.minecraft.game.item.ItemStack; + +public final class InventoryLargeChest implements IInventory { + private String name; + private IInventory upperChest; + private IInventory lowerChest; + + public InventoryLargeChest(String var1, IInventory var2, IInventory var3) { + this.name = var1; + this.upperChest = var2; + this.lowerChest = var3; + } + + public final int getSizeInventory() { + return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory(); + } + + public final String getInvName() { + return this.name; + } + + public final ItemStack getStackInSlot(int var1) { + return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(var1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(var1); + } + + public final ItemStack decrStackSize(int var1, int var2) { + return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(var1 - this.upperChest.getSizeInventory(), var2) : this.upperChest.decrStackSize(var1, var2); + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + if(var1 >= this.upperChest.getSizeInventory()) { + this.lowerChest.setInventorySlotContents(var1 - this.upperChest.getSizeInventory(), var2); + } else { + this.upperChest.setInventorySlotContents(var1, var2); + } + } + + public final int getInventoryStackLimit() { + return this.upperChest.getInventoryStackLimit(); + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/Entity.java b/src/teavm/java/net/minecraft/game/entity/Entity.java new file mode 100644 index 0000000..d036898 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/Entity.java @@ -0,0 +1,545 @@ +package net.minecraft.game.entity; + +import java.util.ArrayList; +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.PeytonPlayz585.nbt.NBTTagFloat; +import net.PeytonPlayz585.nbt.NBTTagList; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.StepSound; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public abstract class Entity { + public boolean preventEntitySpawning = false; + protected World worldObj; + public float prevPosX; + public float prevPosY; + public float prevPosZ; + public float posX; + public float posY; + public float posZ; + public float motionX; + public float motionY; + public float motionZ; + public float rotationYaw; + public float rotationPitch; + public float prevRotationYaw; + public float prevRotationPitch; + public AxisAlignedBB boundingBox; + public boolean onGround = false; + public boolean isCollidedHorizontally = false; + private boolean surfaceCollision = true; + public boolean isDead = false; + public float yOffset = 0.0F; + public float width = 0.6F; + public float height = 1.8F; + public float prevDistanceWalkedModified = 0.0F; + public float distanceWalkedModified = 0.0F; + protected boolean canTriggerWalking = true; + private float fallDistance = 0.0F; + private int nextStepDistance = 1; + public float lastTickPosX; + public float lastTickPosY; + public float lastTickPosZ; + private float ySize = 0.0F; + public float stepHeight = 0.0F; + public boolean noClip = false; + private float entityCollisionReduction = 0.0F; + protected Random rand = new Random(); + public int ticksExisted = 0; + public int fireResistance = 1; + public int fire = 0; + protected int maxAir = 300; + private boolean inWater = false; + public int heartsLife = 0; + public int air = 300; + private boolean isFirstUpdate = true; + public String skinUrl; + + public Entity(World var1) { + this.worldObj = var1; + this.setPosition(0.0F, 0.0F, 0.0F); + } + + protected void preparePlayerToSpawn() { + if(this.worldObj != null) { + float var1 = (float)this.worldObj.xSpawn + 0.5F; + float var2 = (float)this.worldObj.ySpawn; + + for(float var3 = (float)this.worldObj.zSpawn + 0.5F; var2 > 0.0F; ++var2) { + this.setPosition(var1, var2, var3); + if(this.worldObj.getCollidingBoundingBoxes(this.boundingBox).size() == 0) { + break; + } + } + + this.motionX = this.motionY = this.motionZ = 0.0F; + this.rotationYaw = this.worldObj.rotSpawn; + this.rotationPitch = 0.0F; + } + } + + public void setEntityDead() { + this.isDead = true; + } + + protected void setSize(float var1, float var2) { + this.width = var1; + this.height = var2; + } + + protected final void setPosition(float var1, float var2, float var3) { + this.posX = var1; + this.posY = var2; + this.posZ = var3; + float var4 = this.width / 2.0F; + float var5 = this.height / 2.0F; + this.boundingBox = new AxisAlignedBB(var1 - var4, var2 - var5, var3 - var4, var1 + var4, var2 + var5, var3 + var4); + } + + public void onEntityUpdate() { + ++this.ticksExisted; + this.prevDistanceWalkedModified = this.distanceWalkedModified; + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + if(this.handleWaterMovement()) { + if(!this.inWater && !this.isFirstUpdate) { + float var1 = MathHelper.sqrt_float(this.motionX * this.motionX * 0.2F + this.motionY * this.motionY + this.motionZ * this.motionZ * 0.2F) * 0.2F; + if(var1 > 1.0F) { + var1 = 1.0F; + } + + var1 = (float)((int)this.boundingBox.minY); + + int var2; + float var3; + float var4; + for(var2 = 0; (float)var2 < 1.0F + this.width * 20.0F; ++var2) { + var3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("bubble", this.posX + var3, var1 + 1.0F, this.posZ + var4, this.motionX, this.motionY - this.rand.nextFloat() * 0.2F, this.motionZ); + } + + for(var2 = 0; (float)var2 < 1.0F + this.width * 20.0F; ++var2) { + var3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width; + this.worldObj.spawnParticle("splash", this.posX + var3, var1 + 1.0F, this.posZ + var4, this.motionX, this.motionY, this.motionZ); + } + } + + this.fallDistance = 0.0F; + this.inWater = true; + this.fire = 0; + } else { + this.inWater = false; + } + + if(this.fire > 0) { + if(this.fire % 20 == 0) { + this.attackEntityFrom((Entity)null, 1); + } + + --this.fire; + } + + if(this.handleLavaMovement()) { + this.attackEntityFrom((Entity)null, 10); + this.fire = 600; + } + + float var5; + if(this.posX < -8.0F) { + var5 = -(this.posX + 8.0F); + this.motionX += var5 * 0.001F; + } + + if(this.posZ < -8.0F) { + var5 = -(this.posZ + 8.0F); + this.motionZ += var5 * 0.001F; + } + + if(this.posX > (float)this.worldObj.width + 8.0F) { + var5 = this.posX - (float)this.worldObj.width + 8.0F; + this.motionX -= var5 * 0.001F; + } + + if(this.posZ > (float)this.worldObj.length + 8.0F) { + var5 = this.posZ - (float)this.worldObj.length + 8.0F; + this.motionZ -= var5 * 0.001F; + } + + this.isFirstUpdate = false; + } + + public final boolean isOffsetPositionInLiquid(float var1, float var2, float var3) { + float var4 = var3; + var3 = var2; + var2 = var1; + AxisAlignedBB var5 = this.boundingBox; + var5 = new AxisAlignedBB(var5.minX + var4, var5.minY + var3, var5.minZ + var4, var5.maxX + var2, var5.maxY + var3, var5.maxZ + var4); + ArrayList var6 = this.worldObj.getCollidingBoundingBoxes(var5); + return var6.size() > 0 ? false : !this.worldObj.getIsAnyLiquid(var5); + } + + public final void moveEntity(float var1, float var2, float var3) { + if(this.noClip) { + this.boundingBox.offset(var1, var2, var3); + this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0F; + this.posY = this.boundingBox.minY + this.yOffset - this.ySize; + this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0F; + } else { + float var4 = this.posX; + float var5 = this.posZ; + float var6 = var1; + float var7 = var2; + float var8 = var3; + AxisAlignedBB var9 = this.boundingBox.copy(); + ArrayList var10 = this.worldObj.getCollidingBoundingBoxes(this.boundingBox.addCoord(var1, var2, var3)); + + for(int var11 = 0; var11 < var10.size(); ++var11) { + var2 = ((AxisAlignedBB)var10.get(var11)).calculateYOffset(this.boundingBox, var2); + } + + this.boundingBox.offset(0.0F, var2, 0.0F); + if(!this.surfaceCollision && var7 != var2) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + boolean var18 = this.onGround || var7 != var2 && var7 < 0.0F; + + int var12; + for(var12 = 0; var12 < var10.size(); ++var12) { + var1 = ((AxisAlignedBB)var10.get(var12)).calculateXOffset(this.boundingBox, var1); + } + + this.boundingBox.offset(var1, 0.0F, 0.0F); + if(!this.surfaceCollision && var6 != var1) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + for(var12 = 0; var12 < var10.size(); ++var12) { + var3 = ((AxisAlignedBB)var10.get(var12)).calculateZOffset(this.boundingBox, var3); + } + + this.boundingBox.offset(0.0F, 0.0F, var3); + if(!this.surfaceCollision && var8 != var3) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + int var17; + float var19; + float var20; + if(this.stepHeight > 0.0F && var18 && this.ySize < 0.05F && (var6 != var1 || var8 != var3)) { + var20 = var1; + var19 = var2; + float var13 = var3; + var1 = var6; + var2 = this.stepHeight; + var3 = var8; + AxisAlignedBB var14 = this.boundingBox.copy(); + this.boundingBox = var9.copy(); + var10 = this.worldObj.getCollidingBoundingBoxes(this.boundingBox.addCoord(var6, var2, var8)); + + for(var17 = 0; var17 < var10.size(); ++var17) { + var2 = ((AxisAlignedBB)var10.get(var17)).calculateYOffset(this.boundingBox, var2); + } + + this.boundingBox.offset(0.0F, var2, 0.0F); + if(!this.surfaceCollision && var7 != var2) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + for(var17 = 0; var17 < var10.size(); ++var17) { + var1 = ((AxisAlignedBB)var10.get(var17)).calculateXOffset(this.boundingBox, var1); + } + + this.boundingBox.offset(var1, 0.0F, 0.0F); + if(!this.surfaceCollision && var6 != var1) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + for(var17 = 0; var17 < var10.size(); ++var17) { + var3 = ((AxisAlignedBB)var10.get(var17)).calculateZOffset(this.boundingBox, var3); + } + + this.boundingBox.offset(0.0F, 0.0F, var3); + if(!this.surfaceCollision && var8 != var3) { + var3 = 0.0F; + var2 = var3; + var1 = var3; + } + + if(var20 * var20 + var13 * var13 >= var1 * var1 + var3 * var3) { + var1 = var20; + var2 = var19; + var3 = var13; + this.boundingBox = var14.copy(); + } else { + this.ySize = (float)((double)this.ySize + 0.5D); + } + } + + this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0F; + this.posY = this.boundingBox.minY + this.yOffset - this.ySize; + this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0F; + this.isCollidedHorizontally = var6 != var1 || var8 != var3; + this.onGround = var7 != var2 && var7 < 0.0F; + if(this.onGround) { + if(this.fallDistance > 0.0F) { + this.fall(this.fallDistance); + this.fallDistance = 0.0F; + } + } else if(var2 < 0.0F) { + this.fallDistance -= var2; + } + + if(var6 != var1) { + this.motionX = 0.0F; + } + + if(var7 != var2) { + this.motionY = 0.0F; + } + + if(var8 != var3) { + this.motionZ = 0.0F; + } + + var20 = this.posX - var4; + var19 = this.posZ - var5; + this.distanceWalkedModified = (float)((double)this.distanceWalkedModified + (double)MathHelper.sqrt_float(var20 * var20 + var19 * var19) * 0.6D); + if(this.canTriggerWalking) { + int var21 = (int)this.posX; + int var23 = (int)(this.posY - 0.2F - this.yOffset); + var17 = (int)this.posZ; + int var16 = this.worldObj.getBlockId(var21, var23, var17); + if(this.distanceWalkedModified > (float)this.nextStepDistance && var16 > 0) { + ++this.nextStepDistance; + StepSound var15 = Block.blocksList[var16].stepSound; + Block.blocksList[var16].onEntityWalking(this.worldObj, var21, var23, var17); + } + } + + this.ySize *= 0.4F; + boolean var22 = this.handleWaterMovement(); + if(this.worldObj.isBoundingBoxBurning(this.boundingBox)) { + this.dealFireDamage(1); + if(!var22) { + ++this.fire; + if(this.fire == 0) { + this.fire = 300; + } + } + } else if(this.fire <= 0) { + this.fire = -this.fireResistance; + } + + if(var22 && this.fire > 0) { + this.fire = -this.fireResistance; + } + + } + } + + protected void dealFireDamage(int var1) { + this.attackEntityFrom((Entity)null, 1); + } + + protected void fall(float var1) { + } + + public final boolean handleWaterMovement() { + return this.worldObj.handleMaterialAcceleration(this.boundingBox.expand(0.0F, -0.4F, 0.0F), Material.water); + } + + public final boolean isInsideOfWater() { + int var1 = this.worldObj.getBlockId((int)this.posX, (int)(this.posY + this.getEyeHeight()), (int)this.posZ); + return var1 != 0 ? Block.blocksList[var1].material == Material.water : false; + } + + protected float getEyeHeight() { + return 0.0F; + } + + public final boolean handleLavaMovement() { + return this.worldObj.handleMaterialAcceleration(this.boundingBox.expand(0.0F, -0.4F, 0.0F), Material.lava); + } + + public final void moveFlying(float var1, float var2, float var3) { + float var4 = MathHelper.sqrt_float(var1 * var1 + var2 * var2); + if(var4 >= 0.01F) { + if(var4 < 1.0F) { + var4 = 1.0F; + } + + var4 = var3 / var4; + var1 *= var4; + var2 *= var4; + var3 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F); + var4 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F); + this.motionX += var1 * var4 - var2 * var3; + this.motionZ += var2 * var4 + var1 * var3; + } + } + + public float getEntityBrightness(float var1) { + int var4 = (int)this.posX; + int var2 = (int)(this.posY + this.yOffset / 2.0F); + int var3 = (int)this.posZ; + return this.worldObj.getLightBrightness(var4, var2, var3); + } + + public final void setWorld(World var1) { + this.worldObj = var1; + } + + public final void setPositionAndRotation(float var1, float var2, float var3, float var4, float var5) { + this.prevPosX = this.posX = var1; + this.prevPosY = this.posY = var2 + this.yOffset; + this.prevPosZ = this.posZ = var3; + this.rotationYaw = var4; + this.rotationPitch = var5; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public final float getDistanceSqToEntity(Entity var1) { + float var2 = this.posX - var1.posX; + float var3 = this.posY - var1.posY; + float var4 = this.posZ - var1.posZ; + return var2 * var2 + var3 * var3 + var4 * var4; + } + + public void onCollideWithPlayer(EntityPlayer var1) { + } + + public final void applyEntityCollision(Entity var1) { + float var2 = var1.posX - this.posX; + float var3 = var1.posZ - this.posZ; + float var4 = var2 * var2 + var3 * var3; + if(var4 >= 0.01F) { + var4 = MathHelper.sqrt_float(var4); + var2 /= var4; + var3 /= var4; + var2 /= var4; + var3 /= var4; + var2 *= 0.05F; + var3 *= 0.05F; + this.addVelocity(-var2, 0.0F, -var3); + var1.addVelocity(var2, 0.0F, var3); + } + + } + + private void addVelocity(float var1, float var2, float var3) { + this.motionX += var1; + this.motionY = this.motionY; + this.motionZ += var3; + } + + public boolean attackEntityFrom(Entity var1, int var2) { + return false; + } + + public boolean canBeCollidedWith() { + return false; + } + + public boolean canBePushed() { + return false; + } + + public String getTexture() { + return null; + } + + public final void writeToNBT(NBTTagCompound var1) { + String var2 = this.getEntityString(); + if(!this.isDead && var2 != null) { + var1.setString("id", var2); + var1.setTag("Pos", newDoubleNBTList(new float[]{this.posX, this.posY, this.posZ})); + var1.setTag("Motion", newDoubleNBTList(new float[]{this.motionX, this.motionY, this.motionZ})); + var1.setTag("Rotation", newDoubleNBTList(new float[]{this.rotationYaw, this.rotationPitch})); + var1.setFloat("FallDistance", this.fallDistance); + var1.setShort("Fire", (short)this.fire); + var1.setShort("Air", (short)this.air); + this.writeEntityToNBT(var1); + } + } + + public final void readFromNBT(NBTTagCompound var1) { + NBTTagList var2 = var1.getTagList("Pos"); + NBTTagList var3 = var1.getTagList("Motion"); + NBTTagList var4 = var1.getTagList("Rotation"); + this.posX = ((NBTTagFloat)var2.tagAt(0)).floatValue; + this.posY = ((NBTTagFloat)var2.tagAt(1)).floatValue; + this.posZ = ((NBTTagFloat)var2.tagAt(2)).floatValue; + this.motionX = ((NBTTagFloat)var3.tagAt(0)).floatValue; + this.motionY = ((NBTTagFloat)var3.tagAt(1)).floatValue; + this.motionZ = ((NBTTagFloat)var3.tagAt(2)).floatValue; + this.rotationYaw = ((NBTTagFloat)var4.tagAt(0)).floatValue; + this.rotationPitch = ((NBTTagFloat)var4.tagAt(1)).floatValue; + this.fallDistance = var1.getFloat("FallDistance"); + this.fire = var1.getShort("Fire"); + this.air = var1.getShort("Air"); + this.setPositionAndRotation(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); + this.readEntityFromNBT(var1); + } + + protected abstract String getEntityString(); + + protected abstract void readEntityFromNBT(NBTTagCompound var1); + + protected abstract void writeEntityToNBT(NBTTagCompound var1); + + private static NBTTagList newDoubleNBTList(float... var0) { + NBTTagList var1 = new NBTTagList(); + var0 = var0; + int var2 = var0.length; + + for(int var3 = 0; var3 < var2; ++var3) { + float var4 = var0[var3]; + var1.setTag(new NBTTagFloat(var4)); + } + + return var1; + } + + public float getShadowSize() { + return this.height / 2.0F; + } + + public final EntityItem dropItemWithOffset(int var1, int var2) { + return this.entityDropItem(var1, 1, 0.0F); + } + + public final EntityItem entityDropItem(int var1, int var2, float var3) { + EntityItem var4 = new EntityItem(this.worldObj, this.posX, this.posY + var3, this.posZ, new ItemStack(var1, var2)); + var4.delayBeforeCanPickup = 10; + this.worldObj.spawnEntityInWorld(var4); + return var4; + } + + public boolean isEntityAlive() { + return !this.isDead; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/EntityCreature.java b/src/teavm/java/net/minecraft/game/entity/EntityCreature.java new file mode 100644 index 0000000..7df8f58 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/EntityCreature.java @@ -0,0 +1,138 @@ +package net.minecraft.game.entity; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.game.level.World; +import net.minecraft.game.level.path.PathEntity; +import net.minecraft.game.physics.Vec3D; + +public class EntityCreature extends EntityLiving { + private PathEntity pathToEntity; + protected Entity playerToAttack; + protected boolean hasAttacked = false; + + public EntityCreature(World var1) { + super(var1); + } + + protected void updatePlayerActionState() { + this.hasAttacked = false; + float var6; + float var7; + float var8; + if(this.playerToAttack == null) { + this.playerToAttack = this.findPlayerToAttack(); + if(this.playerToAttack != null) { + this.pathToEntity = this.worldObj.pathFinder.createEntityPathTo(this, this.playerToAttack, 16.0F); + } + } else if(!this.playerToAttack.isEntityAlive()) { + this.playerToAttack = null; + } else { + Entity var5 = this.playerToAttack; + var7 = var5.posX - super.posX; + var8 = var5.posY - super.posY; + var6 = var5.posZ - super.posZ; + float var1 = MathHelper.sqrt_float(var7 * var7 + var8 * var8 + var6 * var6); + if(this.worldObj.rayTraceBlocks(new Vec3D(this.posX, this.posY + this.getEyeHeight(), this.posZ), new Vec3D(this.playerToAttack.posX, this.playerToAttack.posY + this.playerToAttack.getEyeHeight(), this.playerToAttack.posZ)) == null) { + this.attackEntity(this.playerToAttack, var1); + } + } + + if(this.hasAttacked) { + this.moveStrafing = 0.0F; + this.moveForward = 0.0F; + this.isJumping = false; + } else { + float var4; + if(this.playerToAttack == null || this.pathToEntity != null && this.rand.nextInt(20) != 0) { + if(this.pathToEntity == null || this.rand.nextInt(100) == 0) { + int var10 = -1; + int var2 = -1; + int var3 = -1; + var4 = -99999.0F; + + for(int var14 = 0; var14 < 200; ++var14) { + int var16 = (int)(this.posX + (float)this.rand.nextInt(21) - 10.0F); + int var17 = (int)(this.posY + (float)this.rand.nextInt(9) - 4.0F); + int var18 = (int)(this.posZ + (float)this.rand.nextInt(21) - 10.0F); + float var9 = this.getBlockPathWeight(var16, var17, var18); + if(var9 > var4) { + var4 = var9; + var10 = var16; + var2 = var17; + var3 = var18; + } + } + + if(var10 > 0) { + this.pathToEntity = this.worldObj.pathFinder.createEntityPathTo(this, var10, var2, var3, 16.0F); + } + } + } else { + this.pathToEntity = this.worldObj.pathFinder.createEntityPathTo(this, this.playerToAttack, 16.0F); + } + + boolean var11 = this.handleWaterMovement(); + boolean var12 = this.handleLavaMovement(); + if(this.pathToEntity != null && this.rand.nextInt(100) != 0) { + Vec3D var13 = this.pathToEntity.getPosition(this); + var4 = this.width * 2.0F; + + float var15; + while(var13 != null) { + var8 = this.posZ; + var7 = this.posY; + var6 = this.posX; + var6 -= var13.xCoord; + var7 -= var13.yCoord; + var15 = var8 - var13.zCoord; + if(var6 * var6 + var7 * var7 + var15 * var15 >= var4 * var4 || var13.yCoord > this.posY) { + break; + } + + this.pathToEntity.incrementPathIndex(); + if(this.pathToEntity.isFinished()) { + var13 = null; + this.pathToEntity = null; + } else { + var13 = this.pathToEntity.getPosition(this); + } + } + + this.isJumping = false; + if(var13 != null) { + var15 = var13.xCoord - this.posX; + var6 = var13.zCoord - this.posZ; + var7 = var13.yCoord - this.posY; + this.rotationYaw = (float)(Math.atan2((double)var6, (double)var15) * 180.0D / (double)((float)Math.PI)) - 90.0F; + this.moveForward = this.moveSpeed; + if(var7 > 0.0F) { + this.isJumping = true; + } + } + + if(this.rand.nextFloat() < 0.8F && (var11 || var12)) { + this.isJumping = true; + } + + } else { + super.updatePlayerActionState(); + this.pathToEntity = null; + } + } + } + + protected void attackEntity(Entity var1, float var2) { + } + + protected float getBlockPathWeight(int var1, int var2, int var3) { + return 0.0F; + } + + protected Entity findPlayerToAttack() { + return null; + } + + public boolean getCanSpawnHere(float var1, float var2, float var3) { + return super.getCanSpawnHere(var1, var2, var3) && this.getBlockPathWeight((int)var1, (int)var2, (int)var3) >= 0.0F; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/EntityLiving.java b/src/teavm/java/net/minecraft/game/entity/EntityLiving.java new file mode 100644 index 0000000..de2c417 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/EntityLiving.java @@ -0,0 +1,457 @@ +package net.minecraft.game.entity; + +import java.util.List; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.StepSound; + +public class EntityLiving extends Entity { + public int heartsHalvesLife = 20; + public float renderYawOffset = 0.0F; + public float prevRenderYawOffset = 0.0F; + private float rotationYawHead; + private float prevRotationYawHead; + protected String texture = "/char.png"; + private int scoreValue = 0; + public int health; + public int prevHealth; + private int livingSoundTime; + public int hurtTime; + public int maxHurtTime; + public float attackedAtYaw = 0.0F; + public int deathTime = 0; + public int attackTime = 0; + public float prevCameraPitch; + public float cameraPitch; + public float prevLimbYaw; + public float limbYaw; + public float limbSwing; + protected int entityAge; + protected float moveStrafing; + protected float moveForward; + private float randomYawVelocity; + protected boolean isJumping; + private float defaultPitch; + protected float moveSpeed; + + public EntityLiving(World var1) { + super(var1); + Math.random(); + this.entityAge = 0; + this.isJumping = false; + this.defaultPitch = 0.0F; + this.moveSpeed = 0.7F; + this.health = 10; + this.preventEntitySpawning = true; + Math.random(); + this.setPosition(this.posX, this.posY, this.posZ); + Math.random(); + this.rotationYaw = (float)(Math.random() * (double)((float)Math.PI) * 2.0D); + this.stepHeight = 0.5F; + } + + public final String getTexture() { + return this.texture; + } + + public final boolean canBeCollidedWith() { + return !this.isDead; + } + + public final boolean canBePushed() { + return !this.isDead; + } + + protected float getEyeHeight() { + return this.height * 0.85F; + } + + public void onEntityUpdate() { + super.onEntityUpdate(); + if(this.rand.nextInt(1000) < this.livingSoundTime++) { + this.livingSoundTime = -80; + } + + float var2; + float var3; + float var4; + if(this.isInsideOfWater()) { + --this.air; + if(this.air == -20) { + this.air = 0; + + for(int var7 = 0; var7 < 8; ++var7) { + var2 = this.rand.nextFloat() - this.rand.nextFloat(); + var3 = this.rand.nextFloat() - this.rand.nextFloat(); + var4 = this.rand.nextFloat() - this.rand.nextFloat(); + this.worldObj.spawnParticle("bubble", this.posX + var2, this.posY + var3, this.posZ + var4, this.motionX, this.motionY, this.motionZ); + } + + this.attackEntityFrom((Entity)null, 2); + } + + this.fire = 0; + } else { + this.air = this.maxAir; + } + + this.prevCameraPitch = this.cameraPitch; + if(this.attackTime > 0) { + --this.attackTime; + } + + if(this.hurtTime > 0) { + --this.hurtTime; + } + + if(this.heartsLife > 0) { + --this.heartsLife; + } + + if(this.health <= 0) { + ++this.deathTime; + if(this.deathTime > 20) { + this.setEntityDead(); + } + } + + this.prevRenderYawOffset = this.renderYawOffset; + this.prevRotationYaw = this.rotationYaw; + this.prevRotationPitch = this.rotationPitch; + this.onLivingUpdate(); + float var8 = this.posX - this.prevPosX; + var2 = this.posZ - this.prevPosZ; + var3 = MathHelper.sqrt_float(var8 * var8 + var2 * var2); + var4 = this.renderYawOffset; + float var5 = 0.0F; + float var6 = 0.0F; + if(var3 > 0.05F) { + var6 = 1.0F; + var5 = var3 * 3.0F; + var4 = (float)Math.atan2((double)var2, (double)var8) * 180.0F / (float)Math.PI - 90.0F; + } + + if(!this.onGround) { + var6 = 0.0F; + } + + this.rotationYawHead += (var6 - this.rotationYawHead) * 0.3F; + + for(var8 = var4 - this.renderYawOffset; var8 < -180.0F; var8 += 360.0F) { + } + + while(var8 >= 180.0F) { + var8 -= 360.0F; + } + + this.renderYawOffset += var8 * 0.1F; + + for(var8 = this.rotationYaw - this.renderYawOffset; var8 < -180.0F; var8 += 360.0F) { + } + + while(var8 >= 180.0F) { + var8 -= 360.0F; + } + + boolean var9 = var8 < -90.0F || var8 >= 90.0F; + if(var8 < -75.0F) { + var8 = -75.0F; + } + + if(var8 >= 75.0F) { + var8 = 75.0F; + } + + this.renderYawOffset = this.rotationYaw - var8; + this.renderYawOffset += var8 * 0.1F; + if(var9) { + var5 = -var5; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + while(this.renderYawOffset - this.prevRenderYawOffset < -180.0F) { + this.prevRenderYawOffset -= 360.0F; + } + + while(this.renderYawOffset - this.prevRenderYawOffset >= 180.0F) { + this.prevRenderYawOffset += 360.0F; + } + + while(this.rotationPitch - this.prevRotationPitch < -180.0F) { + this.prevRotationPitch -= 360.0F; + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + this.prevRotationYawHead += var5; + } + + protected final void setSize(float var1, float var2) { + super.setSize(var1, var2); + } + + public final void heal(int var1) { + if(this.health > 0) { + this.health += var1; + if(this.health > 20) { + this.health = 20; + } + + this.heartsLife = this.heartsHalvesLife / 2; + } + } + + public boolean attackEntityFrom(Entity var1, int var2) { + if(!this.worldObj.survivalWorld) { + return false; + } else { + this.entityAge = 0; + if(this.health <= 0) { + return false; + } else { + this.limbYaw = 1.5F; + if((float)this.heartsLife > (float)this.heartsHalvesLife / 2.0F) { + if(this.prevHealth - var2 >= this.health) { + return false; + } + + this.health = this.prevHealth - var2; + } else { + this.prevHealth = this.health; + this.heartsLife = this.heartsHalvesLife; + this.health -= var2; + this.hurtTime = this.maxHurtTime = 10; + } + + this.attackedAtYaw = 0.0F; + if(var1 != null) { + float var6 = var1.posX - this.posX; + float var3 = var1.posZ - this.posZ; + this.attackedAtYaw = (float)(Math.atan2((double)var3, (double)var6) * 180.0D / (double)((float)Math.PI)) - this.rotationYaw; + float var5 = MathHelper.sqrt_float(var6 * var6 + var3 * var3); + this.motionX /= 2.0F; + this.motionY /= 2.0F; + this.motionZ /= 2.0F; + this.motionX -= var6 / var5 * 0.4F; + this.motionY += 0.4F; + this.motionZ -= var3 / var5 * 0.4F; + if(this.motionY > 0.4F) { + this.motionY = 0.4F; + } + } else { + this.attackedAtYaw = (float)((int)(Math.random() * 2.0D) * 180); + } + + if(this.health <= 0) { + this.onDeath(var1); + } + + return true; + } + } + } + + protected String getLivingSound() { + return null; + } + + protected String getHurtSound() { + return "random.hurt"; + } + + protected String getDeathSound() { + return "random.hurt"; + } + + public void onDeath(Entity var1) { + int var4 = this.scoreValue(); + if(var4 > 0) { + int var2 = this.rand.nextInt(3); + + for(int var3 = 0; var3 < var2; ++var3) { + this.dropItemWithOffset(var4, 1); + } + } + + } + + protected int scoreValue() { + return 0; + } + + protected final void fall(float var1) { + int var3 = (int)Math.ceil((double)(var1 - 3.0F)); + if(var3 > 0) { + this.attackEntityFrom((Entity)null, var3); + var3 = this.worldObj.getBlockId((int)this.posX, (int)(this.posY - 0.2F - this.yOffset), (int)this.posZ); + } + + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("Health", (short)this.health); + var1.setShort("HurtTime", (short)this.hurtTime); + var1.setShort("DeathTime", (short)this.deathTime); + var1.setShort("AttackTime", (short)this.attackTime); + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + this.health = var1.getShort("Health"); + if(!var1.hasKey("Health")) { + this.health = 10; + } + + this.hurtTime = var1.getShort("HurtTime"); + this.deathTime = var1.getShort("DeathTime"); + this.attackTime = var1.getShort("AttackTime"); + } + + protected String getEntityString() { + return "Mob"; + } + + public final boolean isEntityAlive() { + return !this.isDead && this.health > 0; + } + + public void onLivingUpdate() { + ++this.entityAge; + float var2; + float var3; + if(this.entityAge > 600 && this.rand.nextInt(800) == 0) { + Entity var1 = this.worldObj.getPlayerEntity(); + if(var1 != null) { + var2 = var1.posX - this.posX; + var3 = var1.posY - this.posY; + float var5 = var1.posZ - this.posZ; + var2 = var2 * var2 + var3 * var3 + var5 * var5; + if(var2 < 1024.0F) { + this.entityAge = 0; + } else { + this.setEntityDead(); + } + } + } + + if(this.health <= 0) { + this.isJumping = false; + this.moveStrafing = 0.0F; + this.moveForward = 0.0F; + this.randomYawVelocity = 0.0F; + } else { + this.updatePlayerActionState(); + } + + boolean var6 = this.handleWaterMovement(); + boolean var8 = this.handleLavaMovement(); + if(this.isJumping) { + if(var6) { + this.motionY += 0.04F; + } else if(var8) { + this.motionY += 0.04F; + } else if(this.onGround) { + this.motionY = 0.42F; + } + } + + this.moveStrafing *= 0.98F; + this.moveForward *= 0.98F; + this.randomYawVelocity *= 0.9F; + var3 = this.moveForward; + var2 = this.moveStrafing; + float var4; + if(this.handleWaterMovement()) { + var4 = this.posY; + this.moveFlying(var2, var3, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.8F; + this.motionY *= 0.8F; + this.motionZ *= 0.8F; + this.motionY = (float)((double)this.motionY - 0.02D); + if(this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + 0.6F - this.posY + var4, this.motionZ)) { + this.motionY = 0.3F; + } + } else if(this.handleLavaMovement()) { + var4 = this.posY; + this.moveFlying(var2, var3, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5F; + this.motionY *= 0.5F; + this.motionZ *= 0.5F; + this.motionY = (float)((double)this.motionY - 0.02D); + if(this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + 0.6F - this.posY + var4, this.motionZ)) { + this.motionY = 0.3F; + } + } else { + this.moveFlying(var2, var3, this.onGround ? 0.1F : 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.91F; + this.motionY *= 0.98F; + this.motionZ *= 0.91F; + this.motionY = (float)((double)this.motionY - 0.08D); + if(this.onGround) { + this.motionX *= 0.6F; + this.motionZ *= 0.6F; + } + } + + this.prevLimbYaw = this.limbYaw; + var4 = this.posX - this.prevPosX; + var2 = this.posZ - this.prevPosZ; + var2 = MathHelper.sqrt_float(var4 * var4 + var2 * var2) * 4.0F; + if(var2 > 1.0F) { + var2 = 1.0F; + } + + this.limbYaw += (var2 - this.limbYaw) * 0.4F; + this.limbSwing += this.limbYaw; + List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.2F, 0.0F, 0.2F)); + if(var9 != null && var9.size() > 0) { + for(int var7 = 0; var7 < var9.size(); ++var7) { + Entity var10 = (Entity)var9.get(var7); + if(var10.canBePushed()) { + var10.applyEntityCollision(this); + } + } + } + + } + + protected void updatePlayerActionState() { + if(this.rand.nextFloat() < 0.07F) { + this.moveStrafing = (this.rand.nextFloat() - 0.5F) * this.moveSpeed; + this.moveForward = this.rand.nextFloat() * this.moveSpeed; + } + + this.isJumping = this.rand.nextFloat() < 0.01F; + if(this.rand.nextFloat() < 0.04F) { + this.randomYawVelocity = (this.rand.nextFloat() - 0.5F) * 60.0F; + } + + this.rotationYaw += this.randomYawVelocity; + this.rotationPitch = 0.0F; + boolean var1 = this.handleWaterMovement(); + boolean var2 = this.handleLavaMovement(); + if(var1 || var2) { + this.isJumping = this.rand.nextFloat() < 0.8F; + } + + } + + public boolean getCanSpawnHere(float var1, float var2, float var3) { + this.setPosition(var1, var2 + this.height / 2.0F, var3); + return this.worldObj.checkIfAABBIsClear1(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox); + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/EntityPainting.java b/src/teavm/java/net/minecraft/game/entity/EntityPainting.java new file mode 100644 index 0000000..16e937d --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/EntityPainting.java @@ -0,0 +1,233 @@ +package net.minecraft.game.entity; + +import java.util.ArrayList; +import java.util.List; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public class EntityPainting extends Entity { + private int tickCounter1; + public int direction; + private int xPosition; + private int yPosition; + private int zPosition; + public EnumArt art; + + public EntityPainting(World var1) { + super(var1); + this.tickCounter1 = 0; + this.direction = 0; + this.yOffset = 0.0F; + this.setSize(0.5F, 0.5F); + } + + public EntityPainting(World var1, int var2, int var3, int var4, int var5) { + this(var1); + this.xPosition = var2; + this.yPosition = var3; + this.zPosition = var4; + ArrayList var7 = new ArrayList(); + EnumArt[] var8 = EnumArt.values(); + var3 = var8.length; + + for(var4 = 0; var4 < var3; ++var4) { + EnumArt var6 = var8[var4]; + this.art = var6; + this.setDirection(var5); + if(this.onValidSurface()) { + var7.add(var6); + } + } + + if(var7.size() > 0) { + this.art = (EnumArt)var7.get(this.rand.nextInt(var7.size())); + } + + this.setDirection(var5); + } + + private void setDirection(int var1) { + this.direction = var1; + this.prevRotationYaw = this.rotationYaw = (float)(var1 * 90); + float var2 = (float)this.art.sizeX; + float var3 = (float)this.art.sizeY; + float var4 = (float)this.art.sizeX; + if(var1 != 0 && var1 != 2) { + var2 = 0.5F; + } else { + var4 = 0.5F; + } + + var2 /= 32.0F; + var3 /= 32.0F; + var4 /= 32.0F; + float var5 = (float)this.xPosition + 0.5F; + float var6 = (float)this.yPosition + 0.5F; + float var7 = (float)this.zPosition + 0.5F; + if(var1 == 0) { + var7 -= 9.0F / 16.0F; + } + + if(var1 == 1) { + var5 -= 9.0F / 16.0F; + } + + if(var1 == 2) { + var7 += 9.0F / 16.0F; + } + + if(var1 == 3) { + var5 += 9.0F / 16.0F; + } + + if(var1 == 0) { + var5 -= getArtSize(this.art.sizeX); + } + + if(var1 == 1) { + var7 += getArtSize(this.art.sizeX); + } + + if(var1 == 2) { + var5 += getArtSize(this.art.sizeX); + } + + if(var1 == 3) { + var7 -= getArtSize(this.art.sizeX); + } + + var6 += getArtSize(this.art.sizeY); + this.setPosition(var5, var6, var7); + this.boundingBox = new AxisAlignedBB(var5 - var2, var6 - var3, var7 - var4, var5 + var2, var6 + var3, var7 + var4); + float var8 = 0.1F / 16.0F; + AxisAlignedBB var9 = this.boundingBox; + var2 = var9.minX; + var3 = var9.minY; + var4 = var9.minZ; + var5 = var9.maxX; + var6 = var9.maxY; + var8 = var9.maxZ; + var5 -= 0.1F / 16.0F; + var6 -= 0.1F / 16.0F; + var8 -= 0.1F / 16.0F; + this.boundingBox = new AxisAlignedBB(var2, var3, var4, var5, var6, var8); + } + + private static float getArtSize(int var0) { + return var0 == 32 ? 0.5F : (var0 == 64 ? 0.5F : 0.0F); + } + + public final void onEntityUpdate() { + if(this.tickCounter1++ == 100 && !this.onValidSurface()) { + this.tickCounter1 = 0; + this.setEntityDead(); + this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting))); + } + + } + + public final boolean onValidSurface() { + if(this.worldObj.getCollidingBoundingBoxes(this.boundingBox).size() > 0) { + return false; + } else { + int var1 = this.art.sizeX / 16; + int var2 = this.art.sizeY / 16; + int var3 = this.xPosition; + int var5 = this.zPosition; + if(this.direction == 0) { + var3 = (int)(this.posX - (float)this.art.sizeX / 32.0F); + } + + if(this.direction == 1) { + var5 = (int)(this.posZ - (float)this.art.sizeX / 32.0F); + } + + if(this.direction == 2) { + var3 = (int)(this.posX - (float)this.art.sizeX / 32.0F); + } + + if(this.direction == 3) { + var5 = (int)(this.posZ - (float)this.art.sizeX / 32.0F); + } + + int var4 = (int)(this.posY - (float)this.art.sizeY / 32.0F); + + int var7; + for(int var6 = 0; var6 < var1; ++var6) { + for(var7 = 0; var7 < var2; ++var7) { + Material var8; + if(this.direction != 0 && this.direction != 2) { + var8 = this.worldObj.getBlockMaterial(this.xPosition, var4 + var7, var5 + var6); + } else { + var8 = this.worldObj.getBlockMaterial(var3 + var6, var4 + var7, this.zPosition); + } + + if(!var8.isSolid()) { + return false; + } + } + } + + List var9 = this.worldObj.entityMap.getEntitiesWithinAABB(this, this.boundingBox); + + for(var7 = 0; var7 < var9.size(); ++var7) { + if(var9.get(var7) instanceof EntityPainting) { + return false; + } + } + + return true; + } + } + + public final boolean canBeCollidedWith() { + return true; + } + + public final boolean attackEntityFrom(Entity var1, int var2) { + this.setEntityDead(); + this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting))); + return true; + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + var1.setByte("Dir", (byte)this.direction); + var1.setString("Motive", this.art.title); + var1.setInteger("TileX", this.xPosition); + var1.setInteger("TileY", this.yPosition); + var1.setInteger("TileZ", this.zPosition); + } + + protected final String getEntityString() { + return "Painting"; + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + this.direction = var1.getByte("Dir"); + this.xPosition = var1.getInteger("TileX"); + this.yPosition = var1.getInteger("TileY"); + this.zPosition = var1.getInteger("TileZ"); + String var6 = var1.getString("Motive"); + EnumArt[] var2 = EnumArt.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + EnumArt var5 = var2[var4]; + if(var5.title.equals(var6)) { + this.art = var5; + } + } + + if(this.art == null) { + this.art = EnumArt.Kebab; + } + + this.setDirection(this.direction); + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/EnumArt.java b/src/teavm/java/net/minecraft/game/entity/EnumArt.java new file mode 100644 index 0000000..b4aec62 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/EnumArt.java @@ -0,0 +1,37 @@ +package net.minecraft.game.entity; + +public enum EnumArt { + Kebab("Kebab", 16, 16, 0, 0), + Aztec("Aztec", 16, 16, 16, 0), + Alban("Alban", 16, 16, 32, 0), + Aztec2("Aztec2", 16, 16, 48, 0), + Bomb("Bomb", 16, 16, 64, 0), + Plant("Plant", 16, 16, 80, 0), + Wasteland("Wasteland", 16, 16, 96, 0), + Pool("Pool", 32, 16, 0, 32), + Courbet("Courbet", 32, 16, 32, 32), + Sea("Sea", 32, 16, 64, 32), + Sunset("Sunset", 32, 16, 96, 32), + Wanderer("Wanderer", 16, 32, 0, 64), + Match("Match", 32, 32, 0, 128), + Bust("Bust", 32, 32, 32, 128), + Stage("Stage", 32, 32, 64, 128), + Void("Void", 32, 32, 96, 128), + SkullAndRoses("SkullAndRoses", 32, 32, 128, 128), + Fighters("Fighters", 64, 32, 0, 96), + Pointer("Pointer", 64, 64, 0, 192); + + public final String title; + public final int sizeX; + public final int sizeY; + public final int offsetX; + public final int offsetY; + + private EnumArt(String var3, int var4, int var5, int var6, int var7) { + this.title = var3; + this.sizeX = var4; + this.sizeY = var5; + this.offsetX = var6; + this.offsetY = var7; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/animal/EntityAnimal.java b/src/teavm/java/net/minecraft/game/entity/animal/EntityAnimal.java new file mode 100644 index 0000000..fd1ec88 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/animal/EntityAnimal.java @@ -0,0 +1,28 @@ +package net.minecraft.game.entity.animal; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.EntityCreature; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public abstract class EntityAnimal extends EntityCreature { + public EntityAnimal(World var1) { + super(var1); + } + + protected final float getBlockPathWeight(int var1, int var2, int var3) { + return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID ? 10.0F : this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F; + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + public final boolean getCanSpawnHere(float var1, float var2, float var3) { + return this.worldObj.getBlockLightValue((int)var1, (int)var2, (int)var3) > 8 && super.getCanSpawnHere(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/animal/EntityPig.java b/src/teavm/java/net/minecraft/game/entity/animal/EntityPig.java new file mode 100644 index 0000000..970ba7f --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/animal/EntityPig.java @@ -0,0 +1,41 @@ +package net.minecraft.game.entity.animal; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.item.Item; +import net.minecraft.game.level.World; + +public class EntityPig extends EntityAnimal { + public EntityPig(World var1) { + super(var1); + this.texture = "/mob/pig.png"; + this.setSize(0.9F, 0.9F); + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected final String getEntityString() { + return "Pig"; + } + + protected final String getLivingSound() { + return "mob.pig"; + } + + protected final String getHurtSound() { + return "mob.pig"; + } + + protected final String getDeathSound() { + return "mob.pigdeath"; + } + + protected final int scoreValue() { + return Item.porkRaw.shiftedIndex; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/animal/EntitySheep.java b/src/teavm/java/net/minecraft/game/entity/animal/EntitySheep.java new file mode 100644 index 0000000..6de1319 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/animal/EntitySheep.java @@ -0,0 +1,60 @@ +package net.minecraft.game.entity.animal; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public class EntitySheep extends EntityAnimal { + public boolean sheared = false; + + public EntitySheep(World var1) { + super(var1); + this.texture = "/mob/sheep.png"; + this.setSize(0.9F, 1.3F); + } + + public final boolean attackEntityFrom(Entity var1, int var2) { + if(!this.sheared && var1 instanceof EntityLiving) { + this.sheared = true; + int var3 = 1 + this.rand.nextInt(3); + + for(int var4 = 0; var4 < var3; ++var4) { + EntityItem var5 = this.entityDropItem(Block.clothGray.blockID, 1, 1.0F); + var5.motionY += this.rand.nextFloat() * 0.05F; + var5.motionX += (this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F; + var5.motionZ += (this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F; + } + } + + return super.attackEntityFrom(var1, var2); + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + var1.setBoolean("Sheared", this.sheared); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + this.sheared = var1.getBoolean("Sheared"); + } + + protected final String getEntityString() { + return "Sheep"; + } + + protected final String getLivingSound() { + return "mob.sheep"; + } + + protected final String getHurtSound() { + return "mob.sheep"; + } + + protected final String getDeathSound() { + return "mob.sheep"; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/misc/EntityItem.java b/src/teavm/java/net/minecraft/game/entity/misc/EntityItem.java new file mode 100644 index 0000000..d323b44 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/misc/EntityItem.java @@ -0,0 +1,181 @@ +package net.minecraft.game.entity.misc; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.material.Material; + +public class EntityItem extends Entity { + public ItemStack item; + private int unknownEntityItemInt; + public int age = 0; + public int delayBeforeCanPickup; + private int health = 5; + public float hoverStart = (float)(Math.random() * Math.PI * 2.0D); + + public EntityItem(World var1, float var2, float var3, float var4, ItemStack var5) { + super(var1); + this.setSize(0.25F, 0.25F); + this.yOffset = this.height / 2.0F; + this.setPosition(var2, var3, var4); + this.item = var5; + this.rotationYaw = (float)(Math.random() * 360.0D); + this.motionX = (float)(Math.random() * (double)0.2F - (double)0.1F); + this.motionY = 0.2F; + this.motionZ = (float)(Math.random() * (double)0.2F - (double)0.1F); + this.canTriggerWalking = false; + } + + public EntityItem(World var1) { + super(var1); + } + + public final void onEntityUpdate() { + super.onEntityUpdate(); + if(this.delayBeforeCanPickup > 0) { + --this.delayBeforeCanPickup; + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= 0.04F; + if(this.worldObj.getBlockMaterial((int)this.posX, (int)this.posY, (int)this.posZ) == Material.lava) { + this.motionY = 0.2F; + this.motionX = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + this.motionZ = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + } + + float var4 = this.posZ; + float var3 = this.posY; + float var2 = this.posX; + int var5 = (int)var2; + int var6 = (int)var3; + int var7 = (int)var4; + var2 -= (float)var5; + var3 -= (float)var6; + var4 -= (float)var7; + if(Block.opaqueCubeLookup[this.worldObj.getBlockId(var5, var6, var7)]) { + boolean var8 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5 - 1, var6, var7)]; + boolean var9 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5 + 1, var6, var7)]; + boolean var10 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5, var6 - 1, var7)]; + boolean var11 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5, var6 + 1, var7)]; + boolean var12 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5, var6, var7 - 1)]; + boolean var13 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var5, var6, var7 + 1)]; + byte var14 = -1; + float var15 = 9999.0F; + if(var8 && var2 < 9999.0F) { + var15 = var2; + var14 = 0; + } + + if(var9 && 1.0F - var2 < var15) { + var15 = 1.0F - var2; + var14 = 1; + } + + if(var10 && var3 < var15) { + var15 = var3; + var14 = 2; + } + + if(var11 && 1.0F - var3 < var15) { + var15 = 1.0F - var3; + var14 = 3; + } + + if(var12 && var4 < var15) { + var15 = var4; + var14 = 4; + } + + if(var13 && 1.0F - var4 < var15) { + var14 = 5; + } + + var2 = this.rand.nextFloat() * 0.2F + 0.1F; + if(var14 == 0) { + this.motionX = -var2; + } + + if(var14 == 1) { + this.motionX = var2; + } + + if(var14 == 2) { + this.motionY = -var2; + } + + if(var14 == 3) { + this.motionY = var2; + } + + if(var14 == 4) { + this.motionZ = -var2; + } + + if(var14 == 5) { + this.motionZ = var2; + } + } + + boolean var10000 = false; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.98F; + this.motionY *= 0.98F; + this.motionZ *= 0.98F; + if(this.onGround) { + this.motionX *= 0.7F; + this.motionZ *= 0.7F; + this.motionY *= -0.5F; + } + + ++this.unknownEntityItemInt; + ++this.age; + if(this.age >= 6000) { + this.setEntityDead(); + } + + } + + protected final void dealFireDamage(int var1) { + this.attackEntityFrom((Entity)null, 1); + } + + public final boolean attackEntityFrom(Entity var1, int var2) { + this.health -= var2; + if(this.health <= 0) { + this.setEntityDead(); + } + + return false; + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("Health", (byte)this.health); + var1.setShort("Age", (short)this.age); + var1.setCompoundTag("Item", this.item.writeToNBT(new NBTTagCompound())); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + this.health = var1.getShort("Health") & 255; + this.age = var1.getShort("Age"); + var1 = var1.getCompoundTag("Item"); + this.item = new ItemStack(var1); + } + + protected final String getEntityString() { + return "Item"; + } + + public final void onCollideWithPlayer(EntityPlayer var1) { + if(this.delayBeforeCanPickup == 0 && var1.inventory.storePartialItemStack(this.item)) { + var1.onItemPickup(this); + this.setEntityDead(); + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/misc/EntityTNTPrimed.java b/src/teavm/java/net/minecraft/game/entity/misc/EntityTNTPrimed.java new file mode 100644 index 0000000..e7d9860 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/misc/EntityTNTPrimed.java @@ -0,0 +1,70 @@ +package net.minecraft.game.entity.misc; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; + +public class EntityTNTPrimed extends Entity { + public int fuse = 0; + + public EntityTNTPrimed(World var1, float var2, float var3, float var4) { + super(var1); + this.preventEntitySpawning = true; + this.setSize(0.98F, 0.98F); + this.yOffset = this.height / 2.0F; + this.setPosition(var2, var3, var4); + float var5 = (float)(Math.random() * (double)((float)Math.PI) * 2.0D); + this.motionX = -MathHelper.sin(var5 * (float)Math.PI / 180.0F) * 0.02F; + this.motionY = 0.2F; + this.motionZ = -MathHelper.cos(var5 * (float)Math.PI / 180.0F) * 0.02F; + this.canTriggerWalking = false; + this.fuse = 80; + this.prevPosX = var2; + this.prevPosY = var3; + this.prevPosZ = var4; + } + + public final boolean canBeCollidedWith() { + return !this.isDead; + } + + public final void onEntityUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= 0.04F; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.98F; + this.motionY *= 0.98F; + this.motionZ *= 0.98F; + if(this.onGround) { + this.motionX *= 0.7F; + this.motionZ *= 0.7F; + this.motionY *= -0.5F; + } + + if(this.fuse-- <= 0) { + this.setEntityDead(); + this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, 4.0F); + } else { + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5F, this.posZ, 0.0F, 0.0F, 0.0F); + } + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + var1.setByte("Fuse", (byte)this.fuse); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + this.fuse = var1.getByte("Fuse"); + } + + protected final String getEntityString() { + return "PrimedTnt"; + } + + public final float getShadowSize() { + return 0.0F; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntityCreeper.java b/src/teavm/java/net/minecraft/game/entity/monster/EntityCreeper.java new file mode 100644 index 0000000..b166770 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntityCreeper.java @@ -0,0 +1,69 @@ +package net.minecraft.game.entity.monster; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.item.Item; +import net.minecraft.game.level.World; + +public class EntityCreeper extends EntityMob { + private int timeSinceIgnited; + private int lastActiveTime; + private int fuseTime = 30; + private int creeperState = -1; + + public EntityCreeper(World var1) { + super(var1); + this.texture = "/mob/creeper.png"; + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected final String getEntityString() { + return "Creeper"; + } + + protected final void updatePlayerActionState() { + this.lastActiveTime = this.timeSinceIgnited; + if(this.timeSinceIgnited > 0 && this.creeperState < 0) { + --this.timeSinceIgnited; + } + + if(this.creeperState >= 0) { + this.creeperState = 2; + } + + super.updatePlayerActionState(); + if(this.creeperState != 1) { + this.creeperState = -1; + } + + } + + protected final void attackEntity(Entity var1, float var2) { + if(this.creeperState <= 0 && var2 < 3.0F || this.creeperState > 0 && var2 < 7.0F) { + this.creeperState = 1; + ++this.timeSinceIgnited; + if(this.timeSinceIgnited == this.fuseTime) { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 3.0F); + this.setEntityDead(); + } + + this.hasAttacked = true; + } + + } + + public final float c(float var1) { + return ((float)this.lastActiveTime + (float)(this.timeSinceIgnited - this.lastActiveTime) * var1) / (float)(this.fuseTime - 2); + } + + protected final int scoreValue() { + return Item.gunpowder.shiftedIndex; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntityGiantZombie.java b/src/teavm/java/net/minecraft/game/entity/monster/EntityGiantZombie.java new file mode 100644 index 0000000..da8b06e --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntityGiantZombie.java @@ -0,0 +1,23 @@ +package net.minecraft.game.entity.monster; + +import net.minecraft.game.level.World; + +public class EntityGiantZombie extends EntityMob { + public EntityGiantZombie(World var1) { + super(var1); + this.texture = "/mob/zombie.png"; + this.moveSpeed = 0.5F; + this.attackStrength = 50; + this.health *= 10; + this.yOffset *= 6.0F; + this.setSize(this.width * 6.0F, this.height * 6.0F); + } + + protected final float getBlockPathWeight(int var1, int var2, int var3) { + return this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F; + } + + protected final String getEntityString() { + return "Giant"; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntityMob.java b/src/teavm/java/net/minecraft/game/entity/monster/EntityMob.java new file mode 100644 index 0000000..ac7c534 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntityMob.java @@ -0,0 +1,78 @@ +package net.minecraft.game.entity.monster; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityCreature; +import net.minecraft.game.level.World; + +public class EntityMob extends EntityCreature { + protected int attackStrength = 2; + + public EntityMob(World var1) { + super(var1); + this.health = 20; + } + + public void onLivingUpdate() { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F) { + this.entityAge += 2; + } + + super.onLivingUpdate(); + } + + public final void onEntityUpdate() { + super.onEntityUpdate(); + if(this.worldObj.difficultySetting == 0) { + this.setEntityDead(); + } + + } + + protected Entity findPlayerToAttack() { + float var1 = this.worldObj.playerEntity.getDistanceSqToEntity(this); + return var1 < 256.0F ? this.worldObj.playerEntity : null; + } + + public final boolean attackEntityFrom(Entity var1, int var2) { + if(super.attackEntityFrom(var1, var2)) { + if(var1 != this) { + this.playerToAttack = var1; + } + + return true; + } else { + return false; + } + } + + protected void attackEntity(Entity var1, float var2) { + if((double)var2 < 2.5D && var1.boundingBox.maxY > this.boundingBox.minY && var1.boundingBox.minY < this.boundingBox.maxY) { + this.attackTime = 20; + var1.attackEntityFrom(this, this.attackStrength); + } + + } + + protected float getBlockPathWeight(int var1, int var2, int var3) { + return 0.5F - this.worldObj.getLightBrightness(var1, var2, var3); + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected String getEntityString() { + return "Monster"; + } + + public final boolean getCanSpawnHere(float var1, float var2, float var3) { + byte var4 = this.worldObj.getBlockLightValue((int)var1, (int)var2, (int)var3); + return var4 <= this.rand.nextInt(8) && super.getCanSpawnHere(var1, var2, var3); + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntitySkeleton.java b/src/teavm/java/net/minecraft/game/entity/monster/EntitySkeleton.java new file mode 100644 index 0000000..48479a6 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntitySkeleton.java @@ -0,0 +1,62 @@ +package net.minecraft.game.entity.monster; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.projectile.EntityArrow; +import net.minecraft.game.item.Item; +import net.minecraft.game.level.World; + +public class EntitySkeleton extends EntityMob { + public EntitySkeleton(World var1) { + super(var1); + this.texture = "/mob/skeleton.png"; + } + + public final void onLivingUpdate() { + if(this.worldObj.skylightSubtracted > 7) { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky((int)this.posX, (int)this.posY, (int)this.posZ) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) { + this.fire = 300; + } + } + + super.onLivingUpdate(); + } + + protected final void attackEntity(Entity var1, float var2) { + if(var2 < 10.0F) { + var2 = var1.posX - this.posX; + float var3 = var1.posZ - this.posZ; + if(this.attackTime == 0) { + EntityArrow var4 = new EntityArrow(this.worldObj, this); + ++var4.posY; + float var6 = var1.posY - 0.2F - var4.posY; + float var5 = MathHelper.sqrt_float(var2 * var2 + var3 * var3) * 0.2F; + this.worldObj.spawnEntityInWorld(var4); + var4.setArrowHeading(var2, var6 + var5, var3, 0.6F, 12.0F); + this.attackTime = 30; + } + + this.rotationYaw = (float)(Math.atan2((double)var3, (double)var2) * 180.0D / (double)((float)Math.PI)) - 90.0F; + this.hasAttacked = true; + } + + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected final String getEntityString() { + return "Skeleton"; + } + + protected final int scoreValue() { + return Item.arrow.shiftedIndex; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntitySpider.java b/src/teavm/java/net/minecraft/game/entity/monster/EntitySpider.java new file mode 100644 index 0000000..d256240 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntitySpider.java @@ -0,0 +1,66 @@ +package net.minecraft.game.entity.monster; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.item.Item; +import net.minecraft.game.level.World; + +public class EntitySpider extends EntityMob { + public EntitySpider(World var1) { + super(var1); + this.texture = "/mob/spider.png"; + this.setSize(1.4F, 0.9F); + this.moveSpeed = 0.8F; + } + + protected final Entity findPlayerToAttack() { + float var1 = this.getEntityBrightness(1.0F); + if(var1 < 0.5F) { + var1 = this.worldObj.playerEntity.getDistanceSqToEntity(this); + if(var1 < 256.0F) { + return this.worldObj.playerEntity; + } + } + + return null; + } + + protected final void attackEntity(Entity var1, float var2) { + float var3 = this.getEntityBrightness(1.0F); + if(var3 > 0.5F && this.rand.nextInt(100) == 0) { + this.playerToAttack = null; + } else { + if(var2 > 2.0F && var2 < 6.0F && this.rand.nextInt(10) == 0) { + if(this.onGround) { + var2 = var1.posX - this.posX; + float var4 = var1.posZ - this.posZ; + var3 = MathHelper.sqrt_float(var2 * var2 + var4 * var4); + this.motionX = var2 / var3 * 0.5F * 0.8F + this.motionX * 0.2F; + this.motionZ = var4 / var3 * 0.5F * 0.8F + this.motionZ * 0.2F; + this.motionY = 0.4F; + return; + } + } else { + super.attackEntity(var1, var2); + } + + } + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected final String getEntityString() { + return "Spider"; + } + + protected final int scoreValue() { + return Item.silk.shiftedIndex; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/monster/EntityZombie.java b/src/teavm/java/net/minecraft/game/entity/monster/EntityZombie.java new file mode 100644 index 0000000..c6e5f15 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/monster/EntityZombie.java @@ -0,0 +1,32 @@ +package net.minecraft.game.entity.monster; + +import net.minecraft.game.item.Item; +import net.minecraft.game.level.World; + +public class EntityZombie extends EntityMob { + public EntityZombie(World var1) { + super(var1); + this.texture = "/mob/zombie.png"; + this.moveSpeed = 0.5F; + this.attackStrength = 5; + } + + public final void onLivingUpdate() { + if(this.worldObj.skylightSubtracted > 7) { + float var1 = this.getEntityBrightness(1.0F); + if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky((int)this.posX, (int)this.posY, (int)this.posZ) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) { + this.fire = 300; + } + } + + super.onLivingUpdate(); + } + + protected final String getEntityString() { + return "Zombie"; + } + + protected final int scoreValue() { + return Item.feather.shiftedIndex; + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/player/EntityPlayer.java b/src/teavm/java/net/minecraft/game/entity/player/EntityPlayer.java new file mode 100644 index 0000000..aa4f0f7 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/player/EntityPlayer.java @@ -0,0 +1,222 @@ +package net.minecraft.game.entity.player; + +import java.util.List; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.IInventory; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.monster.EntityMob; +import net.minecraft.game.entity.projectile.EntityArrow; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemArmor; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.tileentity.TileEntityFurnace; +import net.minecraft.game.level.material.Material; + +public class EntityPlayer extends EntityLiving { + public InventoryPlayer inventory = new InventoryPlayer(this); + public byte unusedByte = 0; + public int getScore = 0; + public float prevCameraYaw; + public float cameraYaw; + private int damageRemainder = 0; + + public EntityPlayer(World var1) { + super(var1); + if(var1 != null) { + var1.playerEntity = this; + var1.releaseEntitySkin(this); + } + + this.setPositionAndRotation((float)var1.xSpawn, (float)var1.ySpawn, (float)var1.zSpawn, 0.0F, 0.0F); + this.yOffset = 1.62F; + this.health = 20; + this.fireResistance = 20; + this.texture = "/char.png"; + } + + public final void preparePlayerToSpawn() { + this.yOffset = 1.62F; + this.setSize(0.6F, 1.8F); + super.preparePlayerToSpawn(); + if(this.worldObj != null) { + this.worldObj.playerEntity = this; + } + + this.health = 20; + this.deathTime = 0; + } + + public void onLivingUpdate() { + if(this.worldObj.difficultySetting == 0 && this.health < 20 && this.ticksExisted % 20 << 2 == 0) { + this.heal(1); + } + + InventoryPlayer var3 = this.inventory; + + for(int var4 = 0; var4 < var3.mainInventory.length; ++var4) { + if(var3.mainInventory[var4] != null && var3.mainInventory[var4].animationsToGo > 0) { + --var3.mainInventory[var4].animationsToGo; + } + } + + this.prevCameraYaw = this.cameraYaw; + super.onLivingUpdate(); + float var1 = MathHelper.sqrt_float(this.motionX * this.motionX + this.motionZ * this.motionZ); + float var2 = (float)Math.atan((double)(-this.motionY * 0.2F)) * 15.0F; + if(var1 > 0.1F) { + var1 = 0.1F; + } + + if(!this.onGround || this.health <= 0) { + var1 = 0.0F; + } + + if(this.onGround || this.health <= 0) { + var2 = 0.0F; + } + + this.cameraYaw += (var1 - this.cameraYaw) * 0.4F; + this.cameraPitch += (var2 - this.cameraPitch) * 0.8F; + if(this.health > 0) { + List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(1.0F, 0.0F, 1.0F)); + if(var5 != null) { + for(int var6 = 0; var6 < var5.size(); ++var6) { + Entity var7 = (Entity)var5.get(var6); + var7.onCollideWithPlayer(this); + } + } + } + + } + + public final void onDeath(Entity var1) { + this.setSize(0.2F, 0.2F); + this.setPosition(this.posX, this.posY, this.posZ); + this.motionY = 0.1F; + if(var1 != null) { + this.motionX = -MathHelper.cos((this.attackedAtYaw + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F; + this.motionZ = -MathHelper.sin((this.attackedAtYaw + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F; + } else { + this.motionX = this.motionZ = 0.0F; + } + + this.yOffset = 0.1F; + } + + public final void setEntityDead() { + } + + public final void dropPlayerItem(ItemStack var1) { + this.dropPlayerItemWithRandomChoice(var1, false); + } + + public final void dropPlayerItemWithRandomChoice(ItemStack var1, boolean var2) { + if(var1 != null) { + EntityItem var4 = new EntityItem(this.worldObj, this.posX, this.posY - 0.3F, this.posZ, var1); + var4.delayBeforeCanPickup = 40; + var4.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * 0.3F; + var4.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * 0.3F; + var4.motionY = -MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * 0.3F + 0.1F; + float var3 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + float var5 = 0.02F * this.rand.nextFloat(); + var4.motionX = (float)((double)var4.motionX + Math.cos((double)var3) * (double)var5); + var4.motionY += (this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F; + var4.motionZ = (float)((double)var4.motionZ + Math.sin((double)var3) * (double)var5); + this.worldObj.spawnEntityInWorld(var4); + } + } + + public final boolean canHarvestBlock(Block var1) { + Block var2 = var1; + InventoryPlayer var3 = this.inventory; + if(var2.material != Material.rock && var2.material != Material.iron) { + return true; + } else { + ItemStack var4 = var3.getStackInSlot(var3.currentItem); + return var4 != null ? Item.itemsList[var4.itemID].canHarvestBlock(var2) : false; + } + } + + protected void readEntityFromNBT(NBTTagCompound var1) { + super.readEntityFromNBT(var1); + } + + protected void writeEntityToNBT(NBTTagCompound var1) { + super.writeEntityToNBT(var1); + } + + protected String getEntityString() { + return null; + } + + public void displayGUIChest(IInventory var1) { + } + + public void displayWorkbenchGUI() { + } + + public void onItemPickup(Entity var1) { + } + + protected final float getEyeHeight() { + return 0.12F; + } + + public final boolean attackEntityFrom(Entity var1, int var2) { + if(!this.worldObj.survivalWorld) { + return false; + } else { + this.entityAge = 0; + if(this.health <= 0) { + return false; + } else if((float)this.heartsLife > (float)this.heartsHalvesLife / 2.0F) { + return false; + } else { + if(var1 instanceof EntityMob || var1 instanceof EntityArrow) { + if(this.worldObj.difficultySetting == 0) { + var2 = 0; + } + + if(this.worldObj.difficultySetting == 1) { + var2 = var2 / 3 + 1; + } + + if(this.worldObj.difficultySetting == 3) { + var2 = var2 * 3 / 2; + } + } + + int var3 = 25 - this.inventory.getPlayerArmorValue(); + var3 = var2 * var3 + this.damageRemainder; + int var4 = var2; + InventoryPlayer var6 = this.inventory; + + for(int var5 = 0; var5 < var6.armorInventory.length; ++var5) { + if(var6.armorInventory[var5] != null && var6.armorInventory[var5].getItem() instanceof ItemArmor) { + var6.armorInventory[var5].damageItem(var4); + if(var6.armorInventory[var5].stackSize == 0) { + var6.armorInventory[var5] = null; + } + } + } + + var2 = var3 / 25; + this.damageRemainder = var3 % 25; + if(var2 == 0) { + return false; + } else { + return super.attackEntityFrom(var1, var2); + } + } + } + } + + public void displayGUIFurnace(TileEntityFurnace var1) { + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/player/InventoryPlayer.java b/src/teavm/java/net/minecraft/game/entity/player/InventoryPlayer.java new file mode 100644 index 0000000..77cf712 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/player/InventoryPlayer.java @@ -0,0 +1,218 @@ +package net.minecraft.game.entity.player; + +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemArmor; +import net.minecraft.game.item.ItemStack; + +public final class InventoryPlayer implements IInventory { + public ItemStack[] mainInventory = new ItemStack[36]; + public ItemStack[] armorInventory = new ItemStack[4]; + public int currentItem = 0; + private EntityPlayer player; + + public InventoryPlayer(EntityPlayer var1) { + this.player = var1; + } + + public final ItemStack getCurrentItem() { + return this.mainInventory[this.currentItem]; + } + + private int getInventorySlotContainItem(int var1) { + for(int var2 = 0; var2 < this.mainInventory.length; ++var2) { + if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1) { + return var2; + } + } + + return -1; + } + + private int storeItemStack() { + for(int var1 = 0; var1 < this.mainInventory.length; ++var1) { + if(this.mainInventory[var1] == null) { + return var1; + } + } + + return -1; + } + + public final void getFirstEmptyStack(int var1) { + var1 = this.getInventorySlotContainItem(var1); + if(var1 >= 0 && var1 < 9) { + this.currentItem = var1; + } + } + + public final boolean consumeInventoryItem(int var1) { + var1 = this.getInventorySlotContainItem(var1); + if(var1 < 0) { + return false; + } else { + if(--this.mainInventory[var1].stackSize <= 0) { + this.mainInventory[var1] = null; + } + + return true; + } + } + + public final boolean storePartialItemStack(ItemStack var1) { + if(var1.itemDamage == 0) { + int var4 = var1.stackSize; + int var3 = var1.itemID; + int var6 = var3; + InventoryPlayer var5 = this; + int var7 = 0; + + int var10001; + ItemStack var8; + while(true) { + if(var7 >= var5.mainInventory.length) { + var10001 = -1; + break; + } + + if(var5.mainInventory[var7] != null && var5.mainInventory[var7].itemID == var6) { + var8 = var5.mainInventory[var7]; + if(var5.mainInventory[var7].stackSize < var8.getItem().getItemStackLimit() && var5.mainInventory[var7].stackSize < 64) { + var10001 = var7; + break; + } + } + + ++var7; + } + + int var9 = var10001; + if(var9 < 0) { + var9 = this.storeItemStack(); + } + + if(var9 < 0) { + var10001 = var4; + } else { + if(this.mainInventory[var9] == null) { + this.mainInventory[var9] = new ItemStack(var3, 0); + } + + var3 = var4; + var8 = this.mainInventory[var9]; + if(var4 > var8.getItem().getItemStackLimit() - this.mainInventory[var9].stackSize) { + var8 = this.mainInventory[var9]; + var3 = var8.getItem().getItemStackLimit() - this.mainInventory[var9].stackSize; + } + + if(var3 > 64 - this.mainInventory[var9].stackSize) { + var3 = 64 - this.mainInventory[var9].stackSize; + } + + if(var3 == 0) { + var10001 = var4; + } else { + var4 -= var3; + this.mainInventory[var9].stackSize += var3; + this.mainInventory[var9].animationsToGo = 5; + var10001 = var4; + } + } + + var1.stackSize = var10001; + if(var1.stackSize == 0) { + return true; + } + } + + int var2 = this.storeItemStack(); + if(var2 >= 0) { + this.mainInventory[var2] = var1; + this.mainInventory[var2].animationsToGo = 5; + return true; + } else { + return false; + } + } + + public final ItemStack decrStackSize(int var1, int var2) { + ItemStack[] var3 = this.mainInventory; + if(var1 >= this.mainInventory.length) { + var3 = this.armorInventory; + var1 -= this.mainInventory.length; + } + + if(var3[var1] != null) { + ItemStack var4; + if(var3[var1].stackSize <= var2) { + var4 = var3[var1]; + var3[var1] = null; + return var4; + } else { + var4 = var3[var1].splitStack(var2); + if(var3[var1].stackSize == 0) { + var3[var1] = null; + } + + return var4; + } + } else { + return null; + } + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + ItemStack[] var3 = this.mainInventory; + if(var1 >= this.mainInventory.length) { + var3 = this.armorInventory; + var1 -= this.mainInventory.length; + } + + var3[var1] = var2; + } + + public final int getSizeInventory() { + return this.mainInventory.length + 4; + } + + public final ItemStack getStackInSlot(int var1) { + ItemStack[] var2 = this.mainInventory; + if(var1 >= this.mainInventory.length) { + var2 = this.armorInventory; + var1 -= this.mainInventory.length; + } + + return var2[var1]; + } + + public final String getInvName() { + return "Inventory"; + } + + public final int getInventoryStackLimit() { + return 64; + } + + public final int getPlayerArmorValue() { + int var1 = 0; + int var2 = 0; + int var3 = 0; + + for(int var4 = 0; var4 < this.armorInventory.length; ++var4) { + if(this.armorInventory[var4] != null && this.armorInventory[var4].getItem() instanceof ItemArmor) { + int var5 = this.armorInventory[var4].isItemStackDamageable(); + int var6 = this.armorInventory[var4].itemDamage; + var6 = var5 - var6; + var2 += var6; + var3 += var5; + var5 = ((ItemArmor)this.armorInventory[var4].getItem()).damageReduceAmount; + var1 += var5; + } + } + + if(var3 == 0) { + return 0; + } else { + return (var1 - 1) * var2 / var3 + 1; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/entity/projectile/EntityArrow.java b/src/teavm/java/net/minecraft/game/entity/projectile/EntityArrow.java new file mode 100644 index 0000000..bbe20a9 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/entity/projectile/EntityArrow.java @@ -0,0 +1,225 @@ +package net.minecraft.game.entity.projectile; + +import java.util.List; + +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; + +public class EntityArrow extends Entity { + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private int inTile = 0; + private boolean inGround = false; + public int arrowShake = 0; + private EntityLiving owner; + private int ticksInGround; + private int ticksInAir = 0; + + public EntityArrow(World var1, EntityLiving var2) { + super(var1); + this.owner = var2; + this.setSize(0.5F, 0.5F); + this.setPositionAndRotation(var2.posX, var2.posY, var2.posZ, var2.rotationYaw, var2.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.posY -= 0.1F; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionY = -MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI); + this.setArrowHeading(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F); + } + + public final void setArrowHeading(float var1, float var2, float var3, float var4, float var5) { + float var6 = MathHelper.sqrt_float(var1 * var1 + var2 * var2 + var3 * var3); + var1 /= var6; + var2 /= var6; + var3 /= var6; + var1 = (float)((double)var1 + this.rand.nextGaussian() * (double)0.0075F * (double)var5); + var2 = (float)((double)var2 + this.rand.nextGaussian() * (double)0.0075F * (double)var5); + var3 = (float)((double)var3 + this.rand.nextGaussian() * (double)0.0075F * (double)var5); + var1 *= var4; + var2 *= var4; + var3 *= var4; + this.motionX = var1; + this.motionY = var2; + this.motionZ = var3; + var4 = MathHelper.sqrt_float(var1 * var1 + var3 * var3); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2((double)var1, (double)var3) * 180.0D / (double)((float)Math.PI)); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2((double)var2, (double)var4) * 180.0D / (double)((float)Math.PI)); + this.ticksInGround = 0; + } + + public final void onEntityUpdate() { + super.onEntityUpdate(); + if(this.arrowShake > 0) { + --this.arrowShake; + } + + if(this.inGround) { + int var1 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile); + if(var1 == this.inTile) { + ++this.ticksInGround; + if(this.ticksInGround == 1200) { + this.setEntityDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksInGround = 0; + this.ticksInAir = 0; + } else { + ++this.ticksInAir; + } + + Vec3D var10 = new Vec3D(this.posX, this.posY, this.posZ); + Vec3D var2 = new Vec3D(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var10, var2); + var10 = new Vec3D(this.posX, this.posY, this.posZ); + var2 = new Vec3D(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + if(var3 != null) { + var2 = new Vec3D(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord); + } + + Entity var4 = null; + List var5 = this.worldObj.entityMap.getEntitiesWithinAABB(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0F, 1.0F, 1.0F)); + float var6 = 0.0F; + + for(int var7 = 0; var7 < var5.size(); ++var7) { + Entity var8 = (Entity)var5.get(var7); + if(var8.canBeCollidedWith() && (var8 != this.owner || this.ticksInAir >= 5)) { + AxisAlignedBB var9 = var8.boundingBox.expand(0.3F, 0.3F, 0.3F); + MovingObjectPosition var13 = var9.calculateIntercept(var10, var2); + if(var13 != null) { + float var14 = var10.distance(var13.hitVec); + if(var14 < var6 || var6 == 0.0F) { + var4 = var8; + var6 = var14; + } + } + } + } + + if(var4 != null) { + var3 = new MovingObjectPosition(var4); + } + + float var11; + if(var3 != null) { + if(var3.entityHit != null) { + if(var3.entityHit.attackEntityFrom(this, 4)) { + this.setEntityDead(); + } else { + this.motionX *= -0.1F; + this.motionY *= -0.1F; + this.motionZ *= -0.1F; + this.rotationYaw += 180.0F; + this.prevRotationYaw += 180.0F; + this.ticksInAir = 0; + } + } else { + this.xTile = var3.blockX; + this.yTile = var3.blockY; + this.zTile = var3.blockZ; + this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile); + this.motionX = var3.hitVec.xCoord - this.posX; + this.motionY = var3.hitVec.yCoord - this.posY; + this.motionZ = var3.hitVec.zCoord - this.posZ; + var11 = MathHelper.sqrt_float(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / var11 * 0.05F; + this.posY -= this.motionY / var11 * 0.05F; + this.posZ -= this.motionZ / var11 * 0.05F; + this.inGround = true; + this.arrowShake = 7; + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + var11 = MathHelper.sqrt_float(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2((double)this.motionX, (double)this.motionZ) * 180.0D / (double)((float)Math.PI)); + + for(this.rotationPitch = (float)(Math.atan2((double)this.motionY, (double)var11) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float var12 = 0.99F; + if(this.handleWaterMovement()) { + for(int var15 = 0; var15 < 4; ++var15) { + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * 0.25F, this.posY - this.motionY * 0.25F, this.posZ - this.motionZ * 0.25F, this.motionX, this.motionY, this.motionZ); + } + + var12 = 0.8F; + } + + this.motionX *= var12; + this.motionY *= var12; + this.motionZ *= var12; + this.motionY -= 0.03F; + this.setPosition(this.posX, this.posY, this.posZ); + } + + protected final void writeEntityToNBT(NBTTagCompound var1) { + var1.setShort("xTile", (short)this.xTile); + var1.setShort("yTile", (short)this.yTile); + var1.setShort("zTile", (short)this.zTile); + var1.setByte("inTile", (byte)this.inTile); + var1.setByte("shake", (byte)this.arrowShake); + var1.setByte("inGround", (byte)(this.inGround ? 1 : 0)); + } + + protected final void readEntityFromNBT(NBTTagCompound var1) { + this.xTile = var1.getShort("xTile"); + this.yTile = var1.getShort("yTile"); + this.zTile = var1.getShort("zTile"); + this.inTile = var1.getByte("inTile") & 255; + this.arrowShake = var1.getByte("shake") & 255; + this.inGround = var1.getByte("inGround") == 1; + } + + protected final String getEntityString() { + return "Arrow"; + } + + public final void onCollideWithPlayer(EntityPlayer var1) { + if(this.inGround && this.owner == var1 && this.arrowShake <= 0 && var1.inventory.storePartialItemStack(new ItemStack(Item.arrow.shiftedIndex, 1))) { + var1.onItemPickup(this); + this.setEntityDead(); + } + + } + + public final float getShadowSize() { + return 0.0F; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/Item.java b/src/teavm/java/net/minecraft/game/item/Item.java new file mode 100644 index 0000000..c22b3e1 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/Item.java @@ -0,0 +1,464 @@ +package net.minecraft.game.item; + +import java.util.Random; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public class Item { + protected static Random rand = new Random(); + public static Item[] itemsList = new Item[1024]; + public static Item shovel; + public static Item pickaxeSteel; + public static Item axeSteel; + public static Item striker; + public static Item bow; + public static Item arrow; + public static Item coal; + public static Item diamond; + public static Item ingotIron; + public static Item ingotGold; + public static Item swordSteel; + public static Item swordWood; + public static Item shovelWood; + public static Item pickaxeWood; + public static Item axeWood; + public static Item swordStone; + public static Item shovelStone; + public static Item pickaxeStone; + public static Item axeStone; + public static Item swordDiamond; + public static Item shovelDiamond; + public static Item pickaxeDiamond; + public static Item axeDiamond; + public static Item stick; + public static Item bowlEmpty; + public static Item bowlSoup; + public static Item swordGold; + public static Item shovelGold; + public static Item pickaxeGold; + public static Item axeGold; + public static Item silk; + public static Item feather; + public static Item gunpowder; + public static Item hoeWood; + public static Item hoeStone; + public static Item hoeSteel; + public static Item hoeDiamond; + public static Item hoeGold; + public static Item seeds; + public static Item wheat; + public static Item bread; + public static Item helmetLeather; + public static Item plateLeather; + public static Item legsLeather; + public static Item bootsLeather; + public static Item helmetChain; + public static Item plateChain; + public static Item legsChain; + public static Item bootsChain; + public static Item helmetSteel; + public static Item plateSteel; + public static Item legsSteel; + public static Item bootsSteel; + public static Item helmetDiamond; + public static Item plateDiamond; + public static Item legsDiamond; + public static Item bootsDiamond; + public static Item helmetGold; + public static Item plateGold; + public static Item legsGold; + public static Item bootsGold; + public static Item flint; + public static Item porkRaw; + public static Item porkCooked; + public static Item painting; + public final int shiftedIndex; + protected int maxStackSize = 64; + protected int maxDamage = 32; + protected int iconIndex; + + protected Item(int var1) { + this.shiftedIndex = var1 + 256; + if(itemsList[var1 + 256] != null) { + System.out.println("CONFLICT @ " + var1); + } + + itemsList[var1 + 256] = this; + } + + public final Item setIconIndex(int var1) { + this.iconIndex = var1; + return this; + } + + public final int getIconIndex() { + return this.iconIndex; + } + + public boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + return false; + } + + public float getStrVsBlock(Block var1) { + return 1.0F; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + return var1; + } + + public final int getItemStackLimit() { + return this.maxStackSize; + } + + public final int getMaxDamage() { + return this.maxDamage; + } + + public void hitEntity(ItemStack var1) { + } + + public void onBlockDestroyed(ItemStack var1) { + } + + public int getDamageVsEntity() { + return 1; + } + + public boolean canHarvestBlock(Block var1) { + return false; + } + + static { + ItemSpade var10000 = new ItemSpade(0, 2); + byte var1 = 82; + ItemSpade var0 = var10000; + var0.iconIndex = var1; + shovel = var0; + ItemPickaxe var15 = new ItemPickaxe(1, 2); + var1 = 98; + ItemPickaxe var2 = var15; + var2.iconIndex = var1; + pickaxeSteel = var2; + ItemAxe var16 = new ItemAxe(2, 2); + var1 = 114; + ItemAxe var3 = var16; + var3.iconIndex = var1; + axeSteel = var3; + ItemFlintAndSteel var17 = new ItemFlintAndSteel(3); + var1 = 5; + ItemFlintAndSteel var4 = var17; + var4.iconIndex = var1; + striker = var4; + ItemFood var18 = new ItemFood(4, 4); + var1 = 4; + ItemFood var5 = var18; + var5.iconIndex = var1; + ItemBow var19 = new ItemBow(5); + var1 = 21; + ItemBow var6 = var19; + var6.iconIndex = var1; + bow = var6; + Item var20 = new Item(6); + var1 = 37; + Item var7 = var20; + var7.iconIndex = var1; + arrow = var7; + var20 = new Item(7); + var1 = 7; + var7 = var20; + var7.iconIndex = var1; + coal = var7; + var20 = new Item(8); + var1 = 55; + var7 = var20; + var7.iconIndex = var1; + diamond = var7; + var20 = new Item(9); + var1 = 23; + var7 = var20; + var7.iconIndex = var1; + ingotIron = var7; + var20 = new Item(10); + var1 = 39; + var7 = var20; + var7.iconIndex = var1; + ingotGold = var7; + ItemSword var21 = new ItemSword(11, 2); + var1 = 66; + ItemSword var8 = var21; + var8.iconIndex = var1; + swordSteel = var8; + var21 = new ItemSword(12, 0); + var1 = 64; + var8 = var21; + var8.iconIndex = var1; + swordWood = var8; + var10000 = new ItemSpade(13, 0); + var1 = 80; + var0 = var10000; + var0.iconIndex = var1; + shovelWood = var0; + var15 = new ItemPickaxe(14, 0); + var1 = 96; + var2 = var15; + var2.iconIndex = var1; + pickaxeWood = var2; + var16 = new ItemAxe(15, 0); + var1 = 112; + var3 = var16; + var3.iconIndex = var1; + axeWood = var3; + var21 = new ItemSword(16, 1); + var1 = 65; + var8 = var21; + var8.iconIndex = var1; + swordStone = var8; + var10000 = new ItemSpade(17, 1); + var1 = 81; + var0 = var10000; + var0.iconIndex = var1; + shovelStone = var0; + var15 = new ItemPickaxe(18, 1); + var1 = 97; + var2 = var15; + var2.iconIndex = var1; + pickaxeStone = var2; + var16 = new ItemAxe(19, 1); + var1 = 113; + var3 = var16; + var3.iconIndex = var1; + axeStone = var3; + var21 = new ItemSword(20, 3); + var1 = 67; + var8 = var21; + var8.iconIndex = var1; + swordDiamond = var8; + var10000 = new ItemSpade(21, 3); + var1 = 83; + var0 = var10000; + var0.iconIndex = var1; + shovelDiamond = var0; + var15 = new ItemPickaxe(22, 3); + var1 = 99; + var2 = var15; + var2.iconIndex = var1; + pickaxeDiamond = var2; + var16 = new ItemAxe(23, 3); + var1 = 115; + var3 = var16; + var3.iconIndex = var1; + axeDiamond = var3; + var20 = new Item(24); + var1 = 53; + var7 = var20; + var7.iconIndex = var1; + stick = var7; + var20 = new Item(25); + var1 = 71; + var7 = var20; + var7.iconIndex = var1; + bowlEmpty = var7; + ItemSoup var22 = new ItemSoup(26, 10); + var1 = 72; + ItemSoup var9 = var22; + var9.iconIndex = var1; + bowlSoup = var9; + var21 = new ItemSword(27, 0); + var1 = 68; + var8 = var21; + var8.iconIndex = var1; + swordGold = var8; + var10000 = new ItemSpade(28, 0); + var1 = 84; + var0 = var10000; + var0.iconIndex = var1; + shovelGold = var0; + var15 = new ItemPickaxe(29, 0); + var1 = 100; + var2 = var15; + var2.iconIndex = var1; + pickaxeGold = var2; + var16 = new ItemAxe(30, 0); + var1 = 116; + var3 = var16; + var3.iconIndex = var1; + axeGold = var3; + var20 = new Item(31); + var1 = 8; + var7 = var20; + var7.iconIndex = var1; + silk = var7; + var20 = new Item(32); + var1 = 24; + var7 = var20; + var7.iconIndex = var1; + feather = var7; + var20 = new Item(33); + var1 = 40; + var7 = var20; + var7.iconIndex = var1; + gunpowder = var7; + ItemHoe var23 = new ItemHoe(34, 0); + short var11 = 128; + ItemHoe var10 = var23; + var10.iconIndex = var11; + hoeWood = var10; + var23 = new ItemHoe(35, 1); + var11 = 129; + var10 = var23; + var10.iconIndex = var11; + hoeStone = var10; + var23 = new ItemHoe(36, 2); + var11 = 130; + var10 = var23; + var10.iconIndex = var11; + hoeSteel = var10; + var23 = new ItemHoe(37, 3); + var11 = 131; + var10 = var23; + var10.iconIndex = var11; + hoeDiamond = var10; + var23 = new ItemHoe(38, 4); + var11 = 132; + var10 = var23; + var10.iconIndex = var11; + hoeGold = var10; + ItemSeeds var24 = new ItemSeeds(39, Block.crops.blockID); + var1 = 9; + ItemSeeds var12 = var24; + var12.iconIndex = var1; + seeds = var12; + var20 = new Item(40); + var1 = 25; + var7 = var20; + var7.iconIndex = var1; + wheat = var7; + var18 = new ItemFood(41, 5); + var1 = 41; + var5 = var18; + var5.iconIndex = var1; + bread = var5; + ItemArmor var25 = new ItemArmor(42, 0, 0, 0); + var1 = 0; + ItemArmor var13 = var25; + var13.iconIndex = var1; + helmetLeather = var13; + var25 = new ItemArmor(43, 0, 0, 1); + var1 = 16; + var13 = var25; + var13.iconIndex = var1; + plateLeather = var13; + var25 = new ItemArmor(44, 0, 0, 2); + var1 = 32; + var13 = var25; + var13.iconIndex = var1; + legsLeather = var13; + var25 = new ItemArmor(45, 0, 0, 3); + var1 = 48; + var13 = var25; + var13.iconIndex = var1; + bootsLeather = var13; + var25 = new ItemArmor(46, 1, 1, 0); + var1 = 1; + var13 = var25; + var13.iconIndex = var1; + helmetChain = var13; + var25 = new ItemArmor(47, 1, 1, 1); + var1 = 17; + var13 = var25; + var13.iconIndex = var1; + plateChain = var13; + var25 = new ItemArmor(48, 1, 1, 2); + var1 = 33; + var13 = var25; + var13.iconIndex = var1; + legsChain = var13; + var25 = new ItemArmor(49, 1, 1, 3); + var1 = 49; + var13 = var25; + var13.iconIndex = var1; + bootsChain = var13; + var25 = new ItemArmor(50, 2, 2, 0); + var1 = 2; + var13 = var25; + var13.iconIndex = var1; + helmetSteel = var13; + var25 = new ItemArmor(51, 2, 2, 1); + var1 = 18; + var13 = var25; + var13.iconIndex = var1; + plateSteel = var13; + var25 = new ItemArmor(52, 2, 2, 2); + var1 = 34; + var13 = var25; + var13.iconIndex = var1; + legsSteel = var13; + var25 = new ItemArmor(53, 2, 2, 3); + var1 = 50; + var13 = var25; + var13.iconIndex = var1; + bootsSteel = var13; + var25 = new ItemArmor(54, 3, 3, 0); + var1 = 3; + var13 = var25; + var13.iconIndex = var1; + helmetDiamond = var13; + var25 = new ItemArmor(55, 3, 3, 1); + var1 = 19; + var13 = var25; + var13.iconIndex = var1; + plateDiamond = var13; + var25 = new ItemArmor(56, 3, 3, 2); + var1 = 35; + var13 = var25; + var13.iconIndex = var1; + legsDiamond = var13; + var25 = new ItemArmor(57, 3, 3, 3); + var1 = 51; + var13 = var25; + var13.iconIndex = var1; + bootsDiamond = var13; + var25 = new ItemArmor(58, 1, 4, 0); + var1 = 4; + var13 = var25; + var13.iconIndex = var1; + helmetGold = var13; + var25 = new ItemArmor(59, 1, 4, 1); + var1 = 20; + var13 = var25; + var13.iconIndex = var1; + plateGold = var13; + var25 = new ItemArmor(60, 1, 4, 2); + var1 = 36; + var13 = var25; + var13.iconIndex = var1; + legsGold = var13; + var25 = new ItemArmor(61, 1, 4, 3); + var1 = 52; + var13 = var25; + var13.iconIndex = var1; + bootsGold = var13; + var20 = new Item(62); + var1 = 6; + var7 = var20; + var7.iconIndex = var1; + flint = var7; + var18 = new ItemFood(63, 3); + var1 = 87; + var5 = var18; + var5.iconIndex = var1; + porkRaw = var5; + var18 = new ItemFood(64, 8); + var1 = 88; + var5 = var18; + var5.iconIndex = var1; + porkCooked = var5; + ItemPainting var26 = new ItemPainting(65); + var1 = 26; + ItemPainting var14 = var26; + var14.iconIndex = var1; + painting = var14; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemArmor.java b/src/teavm/java/net/minecraft/game/item/ItemArmor.java new file mode 100644 index 0000000..0ef51b3 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemArmor.java @@ -0,0 +1,18 @@ +package net.minecraft.game.item; + +public final class ItemArmor extends Item { + private static final int[] damageReduceAmountArray = new int[]{3, 8, 6, 3}; + private static final int[] maxDamageArray = new int[]{11, 16, 15, 13}; + public final int armorType; + public final int damageReduceAmount; + public final int renderIndex; + + public ItemArmor(int var1, int var2, int var3, int var4) { + super(var1); + this.armorType = var4; + this.renderIndex = var3; + this.damageReduceAmount = damageReduceAmountArray[var4]; + this.maxDamage = maxDamageArray[var4] * 3 << var2; + this.maxStackSize = 1; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemAxe.java b/src/teavm/java/net/minecraft/game/item/ItemAxe.java new file mode 100644 index 0000000..4f15fad --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemAxe.java @@ -0,0 +1,11 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.block.Block; + +public final class ItemAxe extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.planks, Block.bookShelf, Block.wood, Block.crate}; + + public ItemAxe(int var1, int var2) { + super(var1, 3, var2, blocksEffectiveAgainst); + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemBlock.java b/src/teavm/java/net/minecraft/game/item/ItemBlock.java new file mode 100644 index 0000000..8faf164 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemBlock.java @@ -0,0 +1,61 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.StepSound; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class ItemBlock extends Item { + private int blockID; + + public ItemBlock(int var1) { + super(var1); + this.blockID = var1 + 256; + this.setIconIndex(Block.blocksList[var1 + 256].getBlockTextureFromSide(2)); + } + + public final boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + if(var6 == 0) { + --var4; + } + + if(var6 == 1) { + ++var4; + } + + if(var6 == 2) { + --var5; + } + + if(var6 == 3) { + ++var5; + } + + if(var6 == 4) { + --var3; + } + + if(var6 == 5) { + ++var3; + } + + if(var1.stackSize == 0) { + return false; + } else if(var3 > 0 && var4 > 0 && var5 > 0 && var3 < var2.width - 1 && var4 < var2.height - 1 && var5 < var2.length - 1) { + int var7 = var2.getBlockId(var3, var4, var5); + Block var10 = Block.blocksList[var7]; + if(this.blockID > 0 && var10 == null || var10 == Block.waterMoving || var10 == Block.waterStill || var10 == Block.lavaMoving || var10 == Block.lavaStill || var10 == Block.fire) { + var10 = Block.blocksList[this.blockID]; + AxisAlignedBB var8 = var10.getCollisionBoundingBoxFromPool(var3, var4, var5); + if(var2.checkIfAABBIsClear(var8) && var10.canPlaceBlockAt(var2, var3, var4, var5) && var2.setBlockWithNotify(var3, var4, var5, this.blockID)) { + Block.blocksList[this.blockID].onBlockPlaced(var2, var3, var4, var5, var6); + --var1.stackSize; + } + } + + return true; + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemBow.java b/src/teavm/java/net/minecraft/game/item/ItemBow.java new file mode 100644 index 0000000..6023720 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemBow.java @@ -0,0 +1,20 @@ +package net.minecraft.game.item; + +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.entity.projectile.EntityArrow; +import net.minecraft.game.level.World; + +public final class ItemBow extends Item { + public ItemBow(int var1) { + super(5); + this.maxStackSize = 1; + } + + public final ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + if(var3.inventory.consumeInventoryItem(Item.arrow.shiftedIndex)) { + var2.spawnEntityInWorld(new EntityArrow(var2, var3)); + } + + return var1; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemFlintAndSteel.java b/src/teavm/java/net/minecraft/game/item/ItemFlintAndSteel.java new file mode 100644 index 0000000..98c852e --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemFlintAndSteel.java @@ -0,0 +1,50 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public final class ItemFlintAndSteel extends Item { + public ItemFlintAndSteel(int var1) { + super(3); + this.maxStackSize = 1; + this.maxDamage = 64; + } + + public final boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + if(var6 == 0) { + --var4; + } + + if(var6 == 1) { + ++var4; + } + + if(var6 == 2) { + --var5; + } + + if(var6 == 3) { + ++var5; + } + + if(var6 == 4) { + --var3; + } + + if(var6 == 5) { + ++var3; + } + + if(var3 > 0 && var4 > 0 && var5 > 0 && var3 < var2.width - 1 && var4 < var2.height - 1 && var5 < var2.length - 1) { + var6 = var2.getBlockId(var3, var4, var5); + if(var6 == 0) { + var2.setBlockWithNotify(var3, var4, var5, Block.fire.blockID); + } + + var1.damageItem(1); + return true; + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemFood.java b/src/teavm/java/net/minecraft/game/item/ItemFood.java new file mode 100644 index 0000000..aa295f1 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemFood.java @@ -0,0 +1,20 @@ +package net.minecraft.game.item; + +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; + +public class ItemFood extends Item { + private int healAmount; + + public ItemFood(int var1, int var2) { + super(var1); + this.healAmount = var2; + this.maxStackSize = 1; + } + + public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + --var1.stackSize; + var3.heal(this.healAmount); + return var1; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemHoe.java b/src/teavm/java/net/minecraft/game/item/ItemHoe.java new file mode 100644 index 0000000..1915613 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemHoe.java @@ -0,0 +1,42 @@ +package net.minecraft.game.item; + +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.StepSound; +import net.minecraft.game.level.material.Material; + +public final class ItemHoe extends Item { + public ItemHoe(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 32 << var2; + } + + public final boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + if(var3 > 0 && var4 > 0 && var5 > 0 && var3 < var2.width - 1 && var4 < var2.height - 1 && var5 < var2.length - 1) { + var6 = var2.getBlockId(var3, var4, var5); + Material var7 = var2.getBlockMaterial(var3, var4 + 1, var5); + if((var7.isSolid() || var6 != Block.grass.blockID) && var6 != Block.dirt.blockID) { + return false; + } else { + Block var12 = Block.tilledField; + var2.setBlockWithNotify(var3, var4, var5, var12.blockID); + var1.damageItem(1); + if(var2.random.nextInt(8) == 0 && var6 == Block.grass.blockID) { + for(int var9 = 0; var9 <= 0; ++var9) { + float var10 = var2.random.nextFloat() * 0.7F + 0.15F; + float var13 = var2.random.nextFloat() * 0.7F + 0.15F; + EntityItem var11 = new EntityItem(var2, (float)var3 + var10, (float)var4 + 1.2F, (float)var5 + var13, new ItemStack(Item.seeds)); + var11.delayBeforeCanPickup = 10; + var2.spawnEntityInWorld(var11); + } + } + + return true; + } + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemPainting.java b/src/teavm/java/net/minecraft/game/item/ItemPainting.java new file mode 100644 index 0000000..bb2ad72 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemPainting.java @@ -0,0 +1,42 @@ +package net.minecraft.game.item; + +import net.minecraft.game.entity.EntityPainting; +import net.minecraft.game.level.World; + +public final class ItemPainting extends Item { + public ItemPainting(int var1) { + super(65); + this.maxDamage = 64; + } + + public final boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + if(var6 == 0) { + return false; + } else if(var6 == 1) { + return false; + } else if(var3 > 0 && var4 > 0 && var5 > 0 && var3 < var2.width - 1 && var4 < var2.height - 1 && var5 < var2.length - 1) { + byte var7 = 0; + if(var6 == 4) { + var7 = 1; + } + + if(var6 == 3) { + var7 = 2; + } + + if(var6 == 5) { + var7 = 3; + } + + EntityPainting var8 = new EntityPainting(var2, var3, var4, var5, var7); + if(var8.onValidSurface()) { + var2.spawnEntityInWorld(var8); + --var1.stackSize; + } + + return true; + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemPickaxe.java b/src/teavm/java/net/minecraft/game/item/ItemPickaxe.java new file mode 100644 index 0000000..d2d8ee8 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemPickaxe.java @@ -0,0 +1,18 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.material.Material; + +public final class ItemPickaxe extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond}; + private int harvestLevel; + + public ItemPickaxe(int var1, int var2) { + super(var1, 2, var2, blocksEffectiveAgainst); + this.harvestLevel = var2; + } + + public final boolean canHarvestBlock(Block var1) { + return var1 == Block.obsidian ? this.harvestLevel == 3 : (var1 != Block.blockDiamond && var1 != Block.oreDiamond ? (var1 != Block.blockGold && var1 != Block.oreGold ? (var1 != Block.blockSteel && var1 != Block.oreIron ? (var1.material == Material.rock ? true : var1.material == Material.iron) : this.harvestLevel > 0) : this.harvestLevel >= 2) : this.harvestLevel >= 2); + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemSeeds.java b/src/teavm/java/net/minecraft/game/item/ItemSeeds.java new file mode 100644 index 0000000..f4462a2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemSeeds.java @@ -0,0 +1,30 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; + +public final class ItemSeeds extends Item { + private int blockType; + + public ItemSeeds(int var1, int var2) { + super(39); + this.blockType = var2; + } + + public final boolean onItemUse(ItemStack var1, World var2, int var3, int var4, int var5, int var6) { + if(var6 != 1) { + return false; + } else if(var3 > 0 && var4 > 0 && var5 > 0 && var3 < var2.width - 1 && var4 < var2.height - 1 && var5 < var2.length - 1) { + var6 = var2.getBlockId(var3, var4, var5); + if(var6 == Block.tilledField.blockID) { + var2.setBlockWithNotify(var3, var4 + 1, var5, this.blockType); + --var1.stackSize; + return true; + } else { + return false; + } + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemSoup.java b/src/teavm/java/net/minecraft/game/item/ItemSoup.java new file mode 100644 index 0000000..63eb6d3 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemSoup.java @@ -0,0 +1,15 @@ +package net.minecraft.game.item; + +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; + +public final class ItemSoup extends ItemFood { + public ItemSoup(int var1, int var2) { + super(26, 10); + } + + public final ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) { + super.onItemRightClick(var1, var2, var3); + return new ItemStack(Item.bowlEmpty); + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemSpade.java b/src/teavm/java/net/minecraft/game/item/ItemSpade.java new file mode 100644 index 0000000..a6aa423 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemSpade.java @@ -0,0 +1,11 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.block.Block; + +public final class ItemSpade extends ItemTool { + private static Block[] blocksEffectiveAgainst = new Block[]{Block.grass, Block.dirt, Block.sand, Block.gravel}; + + public ItemSpade(int var1, int var2) { + super(var1, 1, var2, blocksEffectiveAgainst); + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemStack.java b/src/teavm/java/net/minecraft/game/item/ItemStack.java new file mode 100644 index 0000000..44a10b1 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemStack.java @@ -0,0 +1,84 @@ +package net.minecraft.game.item; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.level.block.Block; + +public final class ItemStack { + public int stackSize; + public int animationsToGo; + public int itemID; + public int itemDamage; + + public ItemStack(Block var1) { + this((Block)var1, 1); + } + + public ItemStack(Block var1, int var2) { + this(var1.blockID, var2); + } + + public ItemStack(Item var1) { + this((Item)var1, 1); + } + + public ItemStack(Item var1, int var2) { + this(var1.shiftedIndex, var2); + } + + public ItemStack(int var1) { + this(var1, 1); + } + + public ItemStack(int var1, int var2) { + this.stackSize = 0; + this.itemID = var1; + this.stackSize = var2; + } + + public ItemStack(int var1, int var2, int var3) { + this.stackSize = 0; + this.itemID = var1; + this.stackSize = var2; + this.itemDamage = var3; + } + + public ItemStack(NBTTagCompound var1) { + this.stackSize = 0; + this.itemID = var1.getShort("id"); + this.stackSize = var1.getByte("Count"); + this.itemDamage = var1.getShort("Damage"); + } + + public final ItemStack splitStack(int var1) { + this.stackSize -= var1; + return new ItemStack(this.itemID, var1, this.itemDamage); + } + + public final Item getItem() { + return Item.itemsList[this.itemID]; + } + + public final NBTTagCompound writeToNBT(NBTTagCompound var1) { + var1.setShort("id", (short)this.itemID); + var1.setByte("Count", (byte)this.stackSize); + var1.setShort("Damage", (short)this.itemDamage); + return var1; + } + + public final int isItemStackDamageable() { + return Item.itemsList[this.itemID].getMaxDamage(); + } + + public final void damageItem(int var1) { + this.itemDamage += var1; + if(this.itemDamage > this.isItemStackDamageable()) { + --this.stackSize; + if(this.stackSize < 0) { + this.stackSize = 0; + } + + this.itemDamage = 0; + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemSword.java b/src/teavm/java/net/minecraft/game/item/ItemSword.java new file mode 100644 index 0000000..e27c4df --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemSword.java @@ -0,0 +1,30 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.block.Block; + +public final class ItemSword extends Item { + private int weaponDamage; + + public ItemSword(int var1, int var2) { + super(var1); + this.maxStackSize = 1; + this.maxDamage = 32 << var2; + this.weaponDamage = 4 + (var2 << 1); + } + + public final float getStrVsBlock(Block var1) { + return 1.5F; + } + + public final void hitEntity(ItemStack var1) { + var1.damageItem(1); + } + + public final void onBlockDestroyed(ItemStack var1) { + var1.damageItem(2); + } + + public final int getDamageVsEntity() { + return this.weaponDamage; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/ItemTool.java b/src/teavm/java/net/minecraft/game/item/ItemTool.java new file mode 100644 index 0000000..bff2064 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/ItemTool.java @@ -0,0 +1,40 @@ +package net.minecraft.game.item; + +import net.minecraft.game.level.block.Block; + +public class ItemTool extends Item { + private Block[] blocksEffectiveAgainst; + private float efficiencyOnProperMaterial = 4.0F; + private int damageVsEntity; + + public ItemTool(int var1, int var2, int var3, Block[] var4) { + super(var1); + this.blocksEffectiveAgainst = var4; + this.maxStackSize = 1; + this.maxDamage = 32 << var3; + this.efficiencyOnProperMaterial = (float)(var3 + 1 << 1); + this.damageVsEntity = var2 + var3; + } + + public final float getStrVsBlock(Block var1) { + for(int var2 = 0; var2 < this.blocksEffectiveAgainst.length; ++var2) { + if(this.blocksEffectiveAgainst[var2] == var1) { + return this.efficiencyOnProperMaterial; + } + } + + return 1.0F; + } + + public final void hitEntity(ItemStack var1) { + var1.damageItem(2); + } + + public final void onBlockDestroyed(ItemStack var1) { + var1.damageItem(1); + } + + public final int getDamageVsEntity() { + return this.damageVsEntity; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/CraftingManager.java b/src/teavm/java/net/minecraft/game/item/recipe/CraftingManager.java new file mode 100644 index 0000000..fd04432 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/CraftingManager.java @@ -0,0 +1,107 @@ +package net.minecraft.game.item.recipe; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; + +public final class CraftingManager { + private static final CraftingManager instance = new CraftingManager(); + private List recipes = new ArrayList(); + + public static final CraftingManager getInstance() { + return instance; + } + + private CraftingManager() { + (new RecipesTools()).addRecipes(this); + (new RecipesWeapons()).addRecipes(this); + (new RecipesIngots()).addRecipes(this); + new RecipesFood(); + this.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomBrown, Character.valueOf('Y'), Block.mushroomRed, Character.valueOf('#'), Item.bowlEmpty}); + this.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomRed, Character.valueOf('Y'), Block.mushroomBrown, Character.valueOf('#'), Item.bowlEmpty}); + new RecipesCrafting(); + this.addRecipe(new ItemStack(Block.crate), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Block.stoneOvenIdle), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.cobblestone}); + this.addRecipe(new ItemStack(Block.workbench), new Object[]{"##", "##", Character.valueOf('#'), Block.planks}); + (new RecipesArmor()).addRecipes(this); + this.addRecipe(new ItemStack(Block.clothGray, 1), new Object[]{"###", "###", "###", Character.valueOf('#'), Item.silk}); + this.addRecipe(new ItemStack(Block.tnt, 1), new Object[]{"X#X", "#X#", "X#X", Character.valueOf('X'), Item.gunpowder, Character.valueOf('#'), Block.sand}); + this.addRecipe(new ItemStack(Block.stairSingle, 3), new Object[]{"###", Character.valueOf('#'), Block.cobblestone}); + this.addRecipe(new ItemStack(Block.planks, 4), new Object[]{"#", Character.valueOf('#'), Block.wood}); + this.addRecipe(new ItemStack(Item.stick, 4), new Object[]{"#", "#", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Block.torch, 4), new Object[]{"X", "#", Character.valueOf('X'), Item.coal, Character.valueOf('#'), Item.stick}); + this.addRecipe(new ItemStack(Item.bowlEmpty, 4), new Object[]{"# #", " # ", Character.valueOf('#'), Block.planks}); + this.addRecipe(new ItemStack(Item.striker, 1), new Object[]{"A ", " B", Character.valueOf('A'), Item.ingotIron, Character.valueOf('B'), Item.flint}); + this.addRecipe(new ItemStack(Item.bread, 1), new Object[]{"###", Character.valueOf('#'), Item.wheat}); + this.addRecipe(new ItemStack(Item.painting, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Block.clothGray}); + Collections.sort(this.recipes, new RecipeSorter(this)); + System.out.println(this.recipes.size() + " recipes"); + } + + final void addRecipe(ItemStack var1, Object... var2) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + if(var2[0] instanceof String[]) { + ++var4; + String[] var11 = (String[])var2[0]; + + for(int var8 = 0; var8 < var11.length; ++var8) { + String var9 = var11[var8]; + ++var6; + var5 = var9.length(); + var3 = var3 + var9; + } + } else { + while(var2[var4] instanceof String) { + String var7 = (String)var2[var4++]; + ++var6; + var5 = var7.length(); + var3 = var3 + var7; + } + } + + HashMap var12; + int var15; + for(var12 = new HashMap(); var4 < var2.length; var4 += 2) { + Character var13 = (Character)var2[var4]; + var15 = 0; + if(var2[var4 + 1] instanceof Item) { + var15 = ((Item)var2[var4 + 1]).shiftedIndex; + } else if(var2[var4 + 1] instanceof Block) { + var15 = ((Block)var2[var4 + 1]).blockID; + } + + var12.put(var13, Integer.valueOf(var15)); + } + + int[] var14 = new int[var5 * var6]; + + for(var15 = 0; var15 < var5 * var6; ++var15) { + char var10 = var3.charAt(var15); + if(var12.containsKey(Character.valueOf(var10))) { + var14[var15] = ((Integer)var12.get(Character.valueOf(var10))).intValue(); + } else { + var14[var15] = -1; + } + } + + this.recipes.add(new CraftingRecipe(var5, var6, var14, var1)); + } + + public final ItemStack findMatchingRecipe(int[] var1) { + for(int var2 = 0; var2 < this.recipes.size(); ++var2) { + CraftingRecipe var3 = (CraftingRecipe)this.recipes.get(var2); + if(var3.matchRecipe(var1)) { + return var3.createResult(); + } + } + + return null; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/CraftingRecipe.java b/src/teavm/java/net/minecraft/game/item/recipe/CraftingRecipe.java new file mode 100644 index 0000000..1d4c58b --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/CraftingRecipe.java @@ -0,0 +1,64 @@ +package net.minecraft.game.item.recipe; + +import net.minecraft.game.item.ItemStack; + +public final class CraftingRecipe { + private int width; + private int height; + private int[] ingredientMap; + private ItemStack recipeOutput; + + public CraftingRecipe(int var1, int var2, int[] var3, ItemStack var4) { + this.width = var1; + this.height = var2; + this.ingredientMap = var3; + this.recipeOutput = var4; + } + + public final boolean matchRecipe(int[] var1) { + for(int var2 = 0; var2 <= 3 - this.width; ++var2) { + for(int var3 = 0; var3 <= 3 - this.height; ++var3) { + if(this.matches(var1, var2, var3, true)) { + return true; + } + + if(this.matches(var1, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + private boolean matches(int[] var1, int var2, int var3, boolean var4) { + for(int var5 = 0; var5 < 3; ++var5) { + for(int var6 = 0; var6 < 3; ++var6) { + int var7 = var5 - var2; + int var8 = var6 - var3; + int var9 = -1; + if(var7 >= 0 && var8 >= 0 && var7 < this.width && var8 < this.height) { + if(var4) { + var9 = this.ingredientMap[this.width - var7 - 1 + var8 * this.width]; + } else { + var9 = this.ingredientMap[var7 + var8 * this.width]; + } + } + + if(var1[var5 + var6 * 3] != var9) { + return false; + } + } + } + + return true; + } + + public final ItemStack createResult() { + return new ItemStack(this.recipeOutput.itemID, this.recipeOutput.stackSize); + } + + public final int b() { + return this.width * this.height; + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipeSorter.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipeSorter.java new file mode 100644 index 0000000..97fa3a0 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipeSorter.java @@ -0,0 +1,15 @@ +package net.minecraft.game.item.recipe; + +import java.util.Comparator; + +final class RecipeSorter implements Comparator { + RecipeSorter(CraftingManager var1) { + } + + public final int compare(Object var1, Object var2) { + CraftingRecipe var10000 = (CraftingRecipe)var1; + CraftingRecipe var4 = (CraftingRecipe)var2; + CraftingRecipe var3 = var10000; + return var4.b() < var3.b() ? -1 : (var4.b() > var3.b() ? 1 : 0); + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesArmor.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesArmor.java new file mode 100644 index 0000000..d5c8bb5 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesArmor.java @@ -0,0 +1,22 @@ +package net.minecraft.game.item.recipe; + +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; + +public final class RecipesArmor { + private String[][] recipePatterns = new String[][]{{"XXX", "X X"}, {"X X", "XXX", "XXX"}, {"XXX", "X X", "X X"}, {"X X", "X X"}}; + private Object[][] recipeItems = new Object[][]{{Block.clothGray, Block.fire, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.helmetLeather, Item.helmetChain, Item.helmetSteel, Item.helmetDiamond, Item.helmetGold}, {Item.plateLeather, Item.plateChain, Item.plateSteel, Item.plateDiamond, Item.plateGold}, {Item.legsLeather, Item.legsChain, Item.legsSteel, Item.legsDiamond, Item.legsGold}, {Item.bootsLeather, Item.bootsChain, Item.bootsSteel, Item.bootsDiamond, Item.bootsGold}}; + + public final void addRecipes(CraftingManager var1) { + for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) { + Object var3 = this.recipeItems[0][var2]; + + for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) { + Item var5 = (Item)this.recipeItems[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('X'), var3}); + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesCrafting.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesCrafting.java new file mode 100644 index 0000000..bb069b3 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesCrafting.java @@ -0,0 +1,4 @@ +package net.minecraft.game.item.recipe; + +public final class RecipesCrafting { +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesFood.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesFood.java new file mode 100644 index 0000000..16f2e61 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesFood.java @@ -0,0 +1,4 @@ +package net.minecraft.game.item.recipe; + +public final class RecipesFood { +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesIngots.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesIngots.java new file mode 100644 index 0000000..6e728a6 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesIngots.java @@ -0,0 +1,19 @@ +package net.minecraft.game.item.recipe; + +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; + +public final class RecipesIngots { + private Object[][] recipeItems = new Object[][]{{Block.blockGold, Item.ingotGold}, {Block.blockSteel, Item.ingotIron}, {Block.blockDiamond, Item.diamond}}; + + public final void addRecipes(CraftingManager var1) { + for(int var2 = 0; var2 < this.recipeItems.length; ++var2) { + Block var3 = (Block)this.recipeItems[var2][0]; + Item var4 = (Item)this.recipeItems[var2][1]; + var1.addRecipe(new ItemStack(var3), new Object[]{"###", "###", "###", Character.valueOf('#'), var4}); + var1.addRecipe(new ItemStack(var4, 9), new Object[]{"#", Character.valueOf('#'), var3}); + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesTools.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesTools.java new file mode 100644 index 0000000..6e4ccf2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesTools.java @@ -0,0 +1,22 @@ +package net.minecraft.game.item.recipe; + +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; + +public final class RecipesTools { + private String[][] recipePatterns = new String[][]{{"XXX", " # ", " # "}, {"X", "#", "#"}, {"XX", "X#", " #"}, {"XX", " #", " #"}}; + private Object[][] recipeItems = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold}, {Item.shovelWood, Item.shovelStone, Item.shovel, Item.shovelDiamond, Item.shovelGold}, {Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold}, {Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold}}; + + public final void addRecipes(CraftingManager var1) { + for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) { + Object var3 = this.recipeItems[0][var2]; + + for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) { + Item var5 = (Item)this.recipeItems[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3}); + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/item/recipe/RecipesWeapons.java b/src/teavm/java/net/minecraft/game/item/recipe/RecipesWeapons.java new file mode 100644 index 0000000..088ee17 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/item/recipe/RecipesWeapons.java @@ -0,0 +1,24 @@ +package net.minecraft.game.item.recipe; + +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.block.Block; + +public final class RecipesWeapons { + private String[][] recipePatterns = new String[][]{{"X", "X", "#"}}; + private Object[][] recipeItems = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.swordWood, Item.swordStone, Item.swordSteel, Item.swordDiamond, Item.swordGold}}; + + public final void addRecipes(CraftingManager var1) { + for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) { + Object var3 = this.recipeItems[0][var2]; + + for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) { + Item var5 = (Item)this.recipeItems[var4 + 1][var2]; + var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3}); + } + } + + var1.addRecipe(new ItemStack(Item.bow, 1), new Object[]{" #X", "# X", " #X", Character.valueOf('X'), Item.silk, Character.valueOf('#'), Item.stick}); + var1.addRecipe(new ItemStack(Item.arrow, 4), new Object[]{"X", "#", "Y", Character.valueOf('Y'), Item.feather, Character.valueOf('X'), Item.ingotIron, Character.valueOf('#'), Item.stick}); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/EntityMap.java b/src/teavm/java/net/minecraft/game/level/EntityMap.java new file mode 100644 index 0000000..502d0d6 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/EntityMap.java @@ -0,0 +1,126 @@ +package net.minecraft.game.level; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class EntityMap { + public int width; + public int depth; + public int height; + private EntityMapSlot slot = new EntityMapSlot(this); + private EntityMapSlot slot2 = new EntityMapSlot(this); + public List[] entityGrid; + public List entities = new ArrayList(); + private List entitiesExcludingEntity = new ArrayList(); + + public EntityMap(int var1, int var2, int var3) { + this.width = var1 / 8; + this.depth = var2 / 8; + this.height = var3 / 8; + if(this.width == 0) { + this.width = 1; + } + + if(this.depth == 0) { + this.depth = 1; + } + + if(this.height == 0) { + this.height = 1; + } + + this.entityGrid = new ArrayList[this.width * this.depth * this.height]; + + for(var1 = 0; var1 < this.width; ++var1) { + for(var2 = 0; var2 < this.depth; ++var2) { + for(var3 = 0; var3 < this.height; ++var3) { + this.entityGrid[(var3 * this.depth + var2) * this.width + var1] = new ArrayList(); + } + } + } + + } + + public final void insert(Entity var1) { + this.entities.add(var1); + this.slot.init(var1.posX, var1.posY, var1.posZ).add(var1); + var1.lastTickPosX = var1.posX; + var1.lastTickPosY = var1.posY; + var1.lastTickPosZ = var1.posZ; + } + + public final void remove(Entity var1) { + this.slot.init(var1.lastTickPosX, var1.lastTickPosY, var1.lastTickPosZ).remove(var1); + this.slot.init(var1.posX, var1.posY, var1.posZ).remove(var1); + this.entities.remove(var1); + } + + public final List getEntities(Entity var1, float var2, float var3, float var4, float var5, float var6, float var7) { + this.entitiesExcludingEntity.clear(); + return this.getEntities(var1, var2, var3, var4, var5, var6, var7, this.entitiesExcludingEntity); + } + + private List getEntities(Entity var1, float var2, float var3, float var4, float var5, float var6, float var7, List var8) { + EntityMapSlot var9 = this.slot.init(var2, var3, var4); + EntityMapSlot var10 = this.slot2.init(var5, var6, var7); + + for(int var11 = EntityMapSlot.a(var9) - 1; var11 <= EntityMapSlot.a(var10) + 1; ++var11) { + for(int var12 = EntityMapSlot.b(var9) - 1; var12 <= EntityMapSlot.b(var10) + 1; ++var12) { + for(int var13 = EntityMapSlot.c(var9) - 1; var13 <= EntityMapSlot.c(var10) + 1; ++var13) { + if(var11 >= 0 && var12 >= 0 && var13 >= 0 && var11 < this.width && var12 < this.depth && var13 < this.height) { + List var14 = this.entityGrid[(var13 * this.depth + var12) * this.width + var11]; + + for(int var15 = 0; var15 < var14.size(); ++var15) { + Entity var16 = (Entity)var14.get(var15); + if(var16 != var1) { + AxisAlignedBB var17 = var16.boundingBox; + if(var5 > var17.minX && var2 < var17.maxX ? (var6 > var17.minY && var3 < var17.maxY ? var7 > var17.minZ && var4 < var17.maxZ : false) : false) { + var8.add(var16); + } + } + } + } + } + } + } + + return var8; + } + + public final List getEntitiesWithinAABB(Entity var1, AxisAlignedBB var2) { + this.entitiesExcludingEntity.clear(); + return var2 == null ? this.entitiesExcludingEntity : this.getEntities(var1, var2.minX, var2.minY, var2.minZ, var2.maxX, var2.maxY, var2.maxZ, this.entitiesExcludingEntity); + } + + public final void updateEntities() { + for(int var1 = 0; var1 < this.entities.size(); ++var1) { + Entity var2 = (Entity)this.entities.get(var1); + var2.lastTickPosX = var2.posX; + var2.lastTickPosY = var2.posY; + var2.lastTickPosZ = var2.posZ; + var2.onEntityUpdate(); + if(var2.isDead) { + this.entities.remove(var1--); + this.slot.init(var2.lastTickPosX, var2.lastTickPosY, var2.lastTickPosZ).remove(var2); + } else { + int var3 = (int)(var2.lastTickPosX / 8.0F); + int var4 = (int)(var2.lastTickPosY / 8.0F); + int var5 = (int)(var2.lastTickPosZ / 8.0F); + int var6 = (int)(var2.posX / 8.0F); + int var7 = (int)(var2.posY / 8.0F); + int var8 = (int)(var2.posZ / 8.0F); + if(var3 != var6 || var4 != var7 || var5 != var8) { + EntityMapSlot var11 = this.slot.init(var2.lastTickPosX, var2.lastTickPosY, var2.lastTickPosZ); + EntityMapSlot var9 = this.slot2.init(var2.posX, var2.posY, var2.posZ); + if(!var11.equals(var9)) { + var11.remove(var2); + var9.add(var2); + } + } + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/EntityMapSlot.java b/src/teavm/java/net/minecraft/game/level/EntityMapSlot.java new file mode 100644 index 0000000..3ef7cdb --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/EntityMapSlot.java @@ -0,0 +1,75 @@ +package net.minecraft.game.level; + +import net.minecraft.game.entity.Entity; + +final class EntityMapSlot { + private int xSlot; + private int ySlot; + private int zSlot; + private EntityMap entityMap; + + private EntityMapSlot(EntityMap var1, byte var2) { + this.entityMap = var1; + } + + public final EntityMapSlot init(float var1, float var2, float var3) { + this.xSlot = (int)(var1 / 8.0F); + this.ySlot = (int)(var2 / 8.0F); + this.zSlot = (int)(var3 / 8.0F); + if(this.xSlot < 0) { + this.xSlot = 0; + } + + if(this.ySlot < 0) { + this.ySlot = 0; + } + + if(this.zSlot < 0) { + this.zSlot = 0; + } + + if(this.xSlot >= this.entityMap.width) { + this.xSlot = this.entityMap.width - 1; + } + + if(this.ySlot >= this.entityMap.depth) { + this.ySlot = this.entityMap.depth - 1; + } + + if(this.zSlot >= this.entityMap.height) { + this.zSlot = this.entityMap.height - 1; + } + + return this; + } + + public final void add(Entity var1) { + if(this.xSlot >= 0 && this.ySlot >= 0 && this.zSlot >= 0) { + this.entityMap.entityGrid[(this.zSlot * this.entityMap.depth + this.ySlot) * this.entityMap.width + this.xSlot].add(var1); + } + + } + + public final void remove(Entity var1) { + if(this.xSlot >= 0 && this.ySlot >= 0 && this.zSlot >= 0) { + this.entityMap.entityGrid[(this.zSlot * this.entityMap.depth + this.ySlot) * this.entityMap.width + this.xSlot].remove(var1); + } + + } + + EntityMapSlot(EntityMap var1) { + this(var1, (byte)0); + } + + static int a(EntityMapSlot var0) { + return var0.xSlot; + } + + static int b(EntityMapSlot var0) { + return var0.ySlot; + } + + static int c(EntityMapSlot var0) { + return var0.zSlot; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/IWorldAccess.java b/src/teavm/java/net/minecraft/game/level/IWorldAccess.java new file mode 100644 index 0000000..445d5c3 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/IWorldAccess.java @@ -0,0 +1,19 @@ +package net.minecraft.game.level; + +import net.minecraft.game.entity.Entity; + +public interface IWorldAccess { + void markBlockAndNeighborsNeedsUpdate(int var1, int var2, int var3); + + void markBlockRangeNeedsUpdate(int var1, int var2, int var3, int var4, int var5, int var6); + + void loadRenderers(); + + void spawnParticle(String var1, float var2, float var3, float var4, float var5, float var6, float var7); + + void obtainEntitySkin(Entity var1); + + void releaseEntitySkin(Entity var1); + + void updateAllRenderers(); +} diff --git a/src/teavm/java/net/minecraft/game/level/LevelLoader.java b/src/teavm/java/net/minecraft/game/level/LevelLoader.java new file mode 100644 index 0000000..9774d96 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/LevelLoader.java @@ -0,0 +1,221 @@ +package net.minecraft.game.level; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.zip.GZIPOutputStream; + +import net.PeytonPlayz585.nbt.NBTBase; +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.PeytonPlayz585.nbt.NBTTagList; +import net.PeytonPlayz585.nbt.NBTTagShort; +import net.minecraft.client.LoadingScreenRenderer; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityPainting; +import net.minecraft.game.entity.animal.EntityPig; +import net.minecraft.game.entity.animal.EntitySheep; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.monster.EntityCreeper; +import net.minecraft.game.entity.monster.EntityGiantZombie; +import net.minecraft.game.entity.monster.EntitySkeleton; +import net.minecraft.game.entity.monster.EntitySpider; +import net.minecraft.game.entity.monster.EntityZombie; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.tileentity.TileEntity; +import net.minecraft.game.level.block.tileentity.TileEntityChest; +import net.minecraft.game.level.block.tileentity.TileEntityFurnace; +import util.IProgressUpdate; + +public abstract class LevelLoader { + private IProgressUpdate guiLoading; + + public LevelLoader(IProgressUpdate var1) { + this.guiLoading = var1; + } + + public final World load(InputStream var1) throws IOException { + if(this.guiLoading != null) { + this.guiLoading.displayProgressMessage("Loading level"); + } + + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Reading.."); + } + + NBTTagCompound var13 = LoadingScreenRenderer.writeLevelTags(var1); + NBTTagCompound var2 = var13.getCompoundTag("About"); + NBTTagCompound var3 = var13.getCompoundTag("Map"); + NBTTagCompound var4 = var13.getCompoundTag("Environment"); + NBTTagList var5 = var13.getTagList("Entities"); + short var6 = var3.getShort("Width"); + short var7 = var3.getShort("Length"); + short var8 = var3.getShort("Height"); + World var9 = new World(); + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Preparing level.."); + } + + NBTTagList var10 = var3.getTagList("Spawn"); + var9.xSpawn = ((NBTTagShort)var10.tagAt(0)).shortValue; + var9.ySpawn = ((NBTTagShort)var10.tagAt(1)).shortValue; + var9.zSpawn = ((NBTTagShort)var10.tagAt(2)).shortValue; + var9.authorName = var2.getString("Author"); + var9.name = var2.getString("Name"); + var9.createTime = var2.getLong("CreatedOn"); + var9.cloudColor = var4.getInteger("CloudColor"); + var9.skyColor = var4.getInteger("SkyColor"); + var9.fogColor = var4.getInteger("FogColor"); + var9.skyBrightness = var4.getByte("SkyBrightness"); + if(var9.skyBrightness < 0) { + var9.skyBrightness = 0; + } + + if(var9.skyBrightness > 16) { + var9.skyBrightness = var9.skyBrightness * 15 / 100; + } + + var9.cloudHeight = var4.getShort("CloudHeight"); + var9.groundLevel = var4.getShort("SurroundingGroundHeight"); + var9.waterLevel = var4.getShort("SurroundingWaterHeight"); + var9.defaultFluid = var4.getByte("SurroundingWaterType"); + var9.worldTime = var4.getShort("TimeOfDay"); + var9.skylightSubtracted = var9.getSkyBrightness(); + var9.generate(var6, var8, var7, var3.getByteArray("Blocks"), var3.getByteArray("Data")); + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Preparing entities.."); + } + + for(int var16 = 0; var16 < var5.tagCount(); ++var16) { + try { + var3 = (NBTTagCompound)var5.tagAt(var16); + String var19 = var3.getString("id"); + Entity var21 = this.loadEntity(var9, var19); + if(var21 != null) { + var21.readFromNBT(var3); + var9.spawnEntityInWorld(var21); + } else { + System.out.println("Skipping unknown entity id \"" + var19 + "\""); + } + } catch (Exception var12) { + System.out.println("Error reading entity"); + var12.printStackTrace(); + } + } + + NBTTagList var17 = var13.getTagList("TileEntities"); + + for(int var18 = 0; var18 < var17.tagCount(); ++var18) { + try { + var4 = (NBTTagCompound)var17.tagAt(var18); + int var22 = var4.getInteger("Pos"); + String var14 = var4.getString("id"); + Object var20 = var14.equals("Chest") ? new TileEntityChest() : (var14.equals("Furnace") ? new TileEntityFurnace() : null); + if(var20 != null) { + int var15 = var22 % 1024; + int var23 = (var22 >> 10) % 1024; + var22 = (var22 >> 20) % 1024; + ((TileEntity)var20).readFromNBT(var4); + var9.setBlockTileEntity(var15, var23, var22, (TileEntity)var20); + } else { + System.out.println("Skipping unknown tile entity id \"" + var14 + "\""); + } + } catch (Exception var11) { + System.out.println("Error reading tileentity"); + var11.printStackTrace(); + } + } + + return var9; + } + + protected Entity loadEntity(World var1, String var2) { + return (Entity)(var2.equals("Pig") ? new EntityPig(var1) : (var2.equals("Sheep") ? new EntitySheep(var1) : (var2.equals("Creeper") ? new EntityCreeper(var1) : (var2.equals("Skeleton") ? new EntitySkeleton(var1) : (var2.equals("Spider") ? new EntitySpider(var1) : (var2.equals("Zombie") ? new EntityZombie(var1) : (var2.equals("Giant") ? new EntityGiantZombie(var1) : (var2.equals("Item") ? new EntityItem(var1) : (var2.equals("Painting") ? new EntityPainting(var1) : null))))))))); + } + + public final void save(World var1, OutputStream var2) throws IOException { + if(this.guiLoading != null) { + this.guiLoading.displayProgressMessage("Saving level"); + } + + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Preparing level.."); + } + + NBTTagCompound var3 = new NBTTagCompound(); + var3.setInteger("CloudColor", var1.cloudColor); + var3.setInteger("SkyColor", var1.skyColor); + var3.setInteger("FogColor", var1.fogColor); + var3.setByte("SkyBrightness", (byte)var1.skyBrightness); + var3.setShort("CloudHeight", (short)var1.cloudHeight); + var3.setShort("SurroundingGroundHeight", (short)var1.groundLevel); + var3.setShort("SurroundingWaterHeight", (short)var1.waterLevel); + var3.setByte("SurroundingGroundType", (byte)Block.grass.blockID); + var3.setByte("SurroundingWaterType", (byte)var1.defaultFluid); + var3.setShort("TimeOfDay", (short)var1.worldTime); + NBTTagCompound var4 = new NBTTagCompound(); + var4.setShort("Width", (short)var1.width); + var4.setShort("Length", (short)var1.length); + var4.setShort("Height", (short)var1.height); + var4.setByteArray("Blocks", var1.blocks); + var4.setByteArray("Data", var1.data); + NBTTagList var5 = new NBTTagList(); + var5.setTag(new NBTTagShort((short)var1.xSpawn)); + var5.setTag(new NBTTagShort((short)var1.ySpawn)); + var5.setTag(new NBTTagShort((short)var1.zSpawn)); + var4.setTag("Spawn", var5); + NBTTagCompound var15 = new NBTTagCompound(); + var15.setString("Author", var1.authorName); + var15.setString("Name", var1.name); + var15.setLong("CreatedOn", var1.createTime); + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Preparing entities.."); + } + + NBTTagList var6 = new NBTTagList(); + Iterator var7 = var1.entityMap.entities.iterator(); + + while(var7.hasNext()) { + Entity var8 = (Entity)var7.next(); + NBTTagCompound var9 = new NBTTagCompound(); + var8.writeToNBT(var9); + if(!var9.emptyNBTMap()) { + var6.setTag(var9); + } + } + + NBTTagList var16 = new NBTTagList(); + Iterator var17 = var1.map.keySet().iterator(); + + while(var17.hasNext()) { + int var19 = ((Integer)var17.next()).intValue(); + NBTTagCompound var10 = new NBTTagCompound(); + var10.setInteger("Pos", var19); + TileEntity var20 = (TileEntity)var1.map.get(Integer.valueOf(var19)); + var20.writeToNBT(var10); + var16.setTag(var10); + } + + NBTTagCompound var18 = new NBTTagCompound(); + var18.setKey("MinecraftLevel"); + var18.setCompoundTag("About", var15); + var18.setCompoundTag("Map", var4); + var18.setCompoundTag("Environment", var3); + var18.setTag("Entities", var6); + var18.setTag("TileEntities", var16); + if(this.guiLoading != null) { + this.guiLoading.displayLoadingString("Writing.."); + } + + NBTTagCompound var13 = var18; + DataOutputStream var14 = new DataOutputStream(new GZIPOutputStream(var2)); + + try { + NBTBase.writeTag(var13, var14); + } finally { + var14.close(); + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/Light.java b/src/teavm/java/net/minecraft/game/level/Light.java new file mode 100644 index 0000000..7e554c0 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/Light.java @@ -0,0 +1,406 @@ +package net.minecraft.game.level; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.game.level.block.Block; + +public final class Light { + private int lightingUpdateCounter = 0; + private List lightingUpdateList = new ArrayList(); + private World worldObj; + private int worldWidth; + private int worldLength; + private int worldHeight; + private byte[] blocks; + private byte[] data; + private int[] heightMap; + private List skyLightList = new ArrayList(); + private List blockLightList = new ArrayList(); + private List lightingUpdateList1 = new ArrayList(); + private List lightingUpdateList2 = new ArrayList(); + private int[] lightingUpdateList3 = this.getLightingUpdates(); + private byte[] chunks; + private MetadataChunkBlock metadataChunkBlock = null; + private int lightValue = 0; + private int skylightSubtracted; + + public Light(World var1) { + this.worldObj = var1; + this.worldWidth = var1.width; + this.worldLength = var1.length; + this.worldHeight = var1.height; + this.chunks = new byte[var1.blocks.length / 8]; + this.blocks = var1.blocks; + this.data = var1.data; + this.heightMap = var1.heightMap; + } + + private int[] getLightingUpdates() { + return this.lightingUpdateList2.size() > 0 ? (int[])this.lightingUpdateList2.remove(this.lightingUpdateList2.size() - 1) : new int[-Short.MIN_VALUE]; + } + + public final void updateSkylight(int var1, int var2, int var3, int var4) { + this.lightingUpdateList1.add(new MetadataChunkBlock(this, var1, var2, 0, var3, var4, 1)); + } + + public final void updateDaylightCycle(int var1) { + if(var1 > 15) { + var1 = 15; + } + + if(var1 < 0) { + var1 = 0; + } + + this.skylightSubtracted = var1 - this.worldObj.skylightSubtracted; + if(this.skylightSubtracted != 0) { + this.lightValue = this.worldObj.skylightSubtracted; + this.worldObj.skylightSubtracted = var1; + + while(this.metadataChunkBlock != null) { + this.updateLight(64); + } + + this.metadataChunkBlock = new MetadataChunkBlock(this, 0, 0, 0, this.worldObj.width, this.worldObj.height, this.worldObj.length); + } + } + + private void updateLight(int var1) { + int var2 = this.metadataChunkBlock.x; + int var3 = this.metadataChunkBlock.maxX; + int var4 = this.metadataChunkBlock.z; + int var5 = this.metadataChunkBlock.maxZ; + + int var6; + int var7; + for(var2 = var2; var2 < var3; ++var2) { + if(var1-- <= 0 && var2 != var3 - 1) { + this.metadataChunkBlock.x = var2; + return; + } + + for(var6 = var4; var6 < var5; ++var6) { + for(var7 = this.heightMap[var2 + var6 * this.worldWidth] - 1; var7 > 0 && Block.lightOpacity[this.blocks[(var7 * this.worldLength + var6) * this.worldWidth + var2]] < 100; --var7) { + } + + ++var7; + + for(; var7 < this.worldHeight; ++var7) { + int var8 = (var7 * this.worldLength + var6) * this.worldWidth + var2; + if(Block.lightValue[this.blocks[var8]] == 0) { + int var9 = this.data[var8] & 15; + if(var9 <= this.lightValue) { + if(this.skylightSubtracted < 0 && var9 > 0) { + --this.data[var8]; + } else if(this.skylightSubtracted > 0 && var9 < 15) { + ++this.data[var8]; + } + } + } + } + } + } + + for(var6 = 0; var6 < this.worldWidth; var6 += 32) { + for(var7 = 0; var7 < this.worldLength; var7 += 32) { + this.blockLightList.add(new MetadataChunkBlock(this, var6, 0, var7, var6 + 32, this.worldHeight, var7 + 32)); + this.skyLightList.add(new MetadataChunkBlock(this, var6, 0, var7, var6 + 32, this.worldHeight, var7 + 32)); + } + } + + for(var6 = 0; var6 < this.worldObj.worldAccesses.size(); ++var6) { + IWorldAccess var10 = (IWorldAccess)this.worldObj.worldAccesses.get(var6); + var10.updateAllRenderers(); + } + + this.metadataChunkBlock = null; + } + + public final void updateBlockLight(int var1, int var2, int var3, int var4, int var5, int var6) { + this.blockLightList.add(new MetadataChunkBlock(this, var1, var2, var3, var4, var5, var6)); + } + + private void updateLists(int var1, int var2, int var3, int var4, int var5, int var6) { + for(var2 = var2; var2 < var5; ++var2) { + for(int var7 = var3; var7 < var6; ++var7) { + for(int var8 = var1; var8 < var4; ++var8) { + int var9 = var8 + var2 * this.worldWidth + var7 * this.worldWidth * this.worldHeight; + if((this.chunks[var9 >> 3] & 1 << (var9 & 7)) == 0) { + this.chunks[var9 >> 3] = (byte)(this.chunks[var9 >> 3] | 1 << (var9 & 7)); + this.lightingUpdateList3[this.lightingUpdateCounter++] = var9; + if((this.chunks[var9 >> 3] & 1 << (var9 & 7)) == 0) { + System.out.println("OMG ERROR!"); + } + + if(this.lightingUpdateCounter > this.lightingUpdateList3.length - 32) { + var9 = this.lightingUpdateList3[--this.lightingUpdateCounter]; + this.lightingUpdateList3[this.lightingUpdateList3.length - 1] = this.lightingUpdateCounter; + this.lightingUpdateList.add(this.lightingUpdateList3); + this.lightingUpdateList3 = this.getLightingUpdates(); + this.lightingUpdateCounter = 1; + this.lightingUpdateList3[0] = var9; + } + } + } + } + } + + } + + public final void updateLight() { + if(this.lightingUpdateList2.size() > 0) { + this.lightingUpdateList2.remove(this.lightingUpdateList2.size() - 1); + } + + int var1 = 5; + + while(this.skyLightList.size() > 0 && var1-- > 0) { + MetadataChunkBlock var2 = (MetadataChunkBlock)this.skyLightList.remove(0); + + for(int var3 = 0; var3 < this.worldObj.worldAccesses.size(); ++var3) { + ((IWorldAccess)this.worldObj.worldAccesses.get(var3)).markBlockRangeNeedsUpdate(var2.x, var2.y, var2.z, var2.maxX, var2.maxY, var2.maxZ); + } + } + + if(this.metadataChunkBlock != null) { + this.updateLight(8); + } else { + for(int var19 = 0; var19 < 16; ++var19) { + boolean var20 = false; + MetadataChunkBlock var21; + if(this.blockLightList.size() > 0) { + var20 = true; + var21 = (MetadataChunkBlock)this.blockLightList.remove(0); + this.updateLists(var21.x, var21.y, var21.z, var21.maxX, var21.maxY, var21.maxZ); + } + + int var4; + int var5; + int var6; + int var7; + int var8; + int var9; + int var10; + int var11; + int var12; + int var13; + Light var22; + if(this.lightingUpdateList1.size() > 0) { + var20 = true; + var21 = (MetadataChunkBlock)this.lightingUpdateList1.remove(0); + var7 = var21.maxY; + var6 = var21.maxX; + var5 = var21.y; + var4 = var21.x; + var22 = this; + + for(var8 = var4; var8 < var4 + var6; ++var8) { + for(var9 = var5; var9 < var5 + var7; ++var9) { + var10 = var22.heightMap[var8 + var9 * var22.worldWidth]; + + for(var11 = var22.worldHeight - 1; var11 > 0 && Block.lightOpacity[var22.blocks[(var11 * var22.worldLength + var9) * var22.worldWidth + var8]] == 0; --var11) { + } + + var22.heightMap[var8 + var9 * var22.worldWidth] = var11 + 1; + if(var10 != var11) { + var12 = var10 < var11 ? var10 : var11; + var13 = var10 > var11 ? var10 : var11; + var22.updateLists(var8, var12, var9, var8 + 1, var13, var9 + 1); + } + } + } + } + + var22 = this; + var4 = this.worldObj.skylightSubtracted; + var5 = -999; + var6 = -999; + var7 = -999; + var8 = -999; + var9 = -999; + var10 = -999; + var11 = 1024; + var12 = 0; + + while(var11-- > 0 && (var22.lightingUpdateCounter > 0 || var22.lightingUpdateList.size() > 0)) { + ++var12; + if(var22.lightingUpdateCounter == 0) { + if(var22.lightingUpdateList3 != null) { + int[] var23 = var22.lightingUpdateList3; + var22.lightingUpdateList2.add(var23); + } + + var22.lightingUpdateList3 = (int[])var22.lightingUpdateList.remove(var22.lightingUpdateList.size() - 1); + var22.lightingUpdateCounter = var22.lightingUpdateList3[var22.lightingUpdateList3.length - 1]; + } + + if(var22.lightingUpdateCounter > var22.lightingUpdateList3.length - 32) { + var13 = var22.lightingUpdateList3[--var22.lightingUpdateCounter]; + var22.lightingUpdateList3[var22.lightingUpdateList3.length - 1] = var22.lightingUpdateCounter; + var22.lightingUpdateList.add(var22.lightingUpdateList3); + var22.lightingUpdateList3 = var22.getLightingUpdates(); + var22.lightingUpdateCounter = 1; + var22.lightingUpdateList3[0] = var13; + } else { + var13 = var22.lightingUpdateList3[--var22.lightingUpdateCounter]; + var1 = var13 % var22.worldWidth; + int var14 = var13 / var22.worldWidth % var22.worldHeight; + int var15 = var13 / var22.worldWidth / var22.worldHeight % var22.worldLength; + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] ^ 1 << (var13 & 7)); + var13 = var22.heightMap[var1 + var15 * var22.worldWidth]; + int var16 = var14 >= var13 ? var4 : 0; + byte var24 = var22.blocks[(var14 * var22.worldLength + var15) * var22.worldWidth + var1]; + int var17 = Block.lightOpacity[var24]; + if(var17 > 100) { + var16 = 0; + } else if(var16 < 15) { + var17 = var17; + if(var17 == 0) { + var17 = 1; + } + + int var18; + if(var1 > 0) { + var18 = (var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + (var1 - 1)] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + + if(var1 < var22.worldWidth - 1) { + var18 = (var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + var1 + 1] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + + if(var14 > 0) { + var18 = (var22.data[((var14 - 1) * var22.worldLength + var15) * var22.worldWidth + var1] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + + if(var14 < var22.worldHeight - 1) { + var18 = (var22.data[((var14 + 1) * var22.worldLength + var15) * var22.worldWidth + var1] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + + if(var15 > 0) { + var18 = (var22.data[(var14 * var22.worldLength + (var15 - 1)) * var22.worldWidth + var1] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + + if(var15 < var22.worldLength - 1) { + var18 = (var22.data[(var14 * var22.worldLength + var15 + 1) * var22.worldWidth + var1] & 15) - var17; + if(var18 > var16) { + var16 = var18; + } + } + } + + if(var16 < Block.lightValue[var24]) { + var16 = Block.lightValue[var24]; + } + + var17 = var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + var1] & 15; + if(var17 != var16) { + var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + var1] = (byte)((var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + var1] & 240) + var16); + if(var1 > 0 && (var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + (var1 - 1)] & 15) != var16 - 1) { + var13 = var1 - 1 + var14 * var22.worldWidth + var15 * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var1 < var22.worldWidth - 1 && (var22.data[(var14 * var22.worldLength + var15) * var22.worldWidth + var1 + 1] & 15) != var16 - 1) { + var13 = var1 + 1 + var14 * var22.worldWidth + var15 * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var14 > 0 && (var22.data[((var14 - 1) * var22.worldLength + var15) * var22.worldWidth + var1] & 15) != var16 - 1) { + var13 = var1 + (var14 - 1) * var22.worldWidth + var15 * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var14 < var22.worldHeight - 1 && (var22.data[((var14 + 1) * var22.worldLength + var15) * var22.worldWidth + var1] & 15) != var16 - 1) { + var13 = var1 + (var14 + 1) * var22.worldWidth + var15 * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var15 > 0 && (var22.data[(var14 * var22.worldLength + (var15 - 1)) * var22.worldWidth + var1] & 15) != var16 - 1) { + var13 = var1 + var14 * var22.worldWidth + (var15 - 1) * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var15 < var22.worldLength - 1 && (var22.data[(var14 * var22.worldLength + var15 + 1) * var22.worldWidth + var1] & 15) != var16 - 1) { + var13 = var1 + var14 * var22.worldWidth + (var15 + 1) * var22.worldWidth * var22.worldHeight; + if((var22.chunks[var13 >> 3] & 1 << (var13 & 7)) == 0) { + var22.chunks[var13 >> 3] = (byte)(var22.chunks[var13 >> 3] | 1 << (var13 & 7)); + var22.lightingUpdateList3[var22.lightingUpdateCounter++] = var13; + } + } + + if(var5 == -999) { + var5 = var1; + var6 = var1; + var7 = var14; + var8 = var14; + var9 = var15; + var10 = var15; + } + + if(var1 < var5) { + var5 = var1; + } else if(var1 > var6) { + var6 = var1; + } + + if(var14 > var8) { + var8 = var14; + } else if(var14 < var7) { + var7 = var14; + } + + if(var15 < var9) { + var9 = var15; + } else if(var15 > var10) { + var10 = var15; + } + } + } + } + + if(var5 > -999) { + var22.skyLightList.add(new MetadataChunkBlock(var22, var5, var7, var9, var6, var8, var10)); + } + + if(var12 > 0) { + var20 = true; + } + } + + } + } + + public final String debugLightUpdates() { + return "" + (this.blockLightList.size() + this.skyLightList.size()); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/MetadataChunkBlock.java b/src/teavm/java/net/minecraft/game/level/MetadataChunkBlock.java new file mode 100644 index 0000000..deb0463 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/MetadataChunkBlock.java @@ -0,0 +1,19 @@ +package net.minecraft.game.level; + +final class MetadataChunkBlock { + public int x; + public int y; + public int z; + public int maxX; + public int maxY; + public int maxZ; + + public MetadataChunkBlock(Light var1, int var2, int var3, int var4, int var5, int var6, int var7) { + this.x = var2; + this.y = var3; + this.z = var4; + this.maxX = var5; + this.maxY = var6; + this.maxZ = var7; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/MobSpawner.java b/src/teavm/java/net/minecraft/game/level/MobSpawner.java new file mode 100644 index 0000000..7e969d5 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/MobSpawner.java @@ -0,0 +1,206 @@ +package net.minecraft.game.level; + +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.entity.animal.EntityAnimal; +import net.minecraft.game.entity.animal.EntityPig; +import net.minecraft.game.entity.animal.EntitySheep; +import net.minecraft.game.entity.monster.EntityCreeper; +import net.minecraft.game.entity.monster.EntityMob; +import net.minecraft.game.entity.monster.EntitySkeleton; +import net.minecraft.game.entity.monster.EntitySpider; +import net.minecraft.game.entity.monster.EntityZombie; + +public class MobSpawner { + private World worldObj; + + public MobSpawner(World var1) { + this.worldObj = var1; + } + + public final void performSpawning() { + int var1 = this.worldObj.width * this.worldObj.length * this.worldObj.height * 20 / 64 / 64 / 64; + var1 /= 2; + if(this.worldObj.difficultySetting == 0) { + var1 = 0 / 4; + } + + if(this.worldObj.difficultySetting == 1) { + var1 = var1 * 3 / 4; + } + + if(this.worldObj.difficultySetting == 2) { + var1 = (var1 << 2) / 4; + } + + if(this.worldObj.difficultySetting == 3) { + var1 = var1 * 6 / 4; + } + + int var2 = this.worldObj.width * this.worldObj.length / 4000; + int var3 = this.worldObj.entitiesInLevelList(EntityMob.class); + + int var4; + EntityLiving var5; + int var6; + int var7; + int var8; + int var9; + int var10; + int var11; + int var12; + int var13; + int var14; + int var15; + float var16; + float var17; + float var18; + float var19; + float var20; + float var21; + MobSpawner var22; + Object var23; + for(var4 = 0; var4 < 4; ++var4) { + if(var3 < var1) { + var5 = this.worldObj.playerEntity; + var22 = this; + var6 = 0; + var7 = this.worldObj.random.nextInt(5); + var8 = this.worldObj.random.nextInt(this.worldObj.width); + var9 = (int)(Math.min(this.worldObj.random.nextFloat(), this.worldObj.random.nextFloat()) * (float)this.worldObj.height); + var10 = this.worldObj.random.nextInt(this.worldObj.length); + + for(var11 = 0; var11 < 2; ++var11) { + var12 = var8; + var13 = var9; + var14 = var10; + + for(var15 = 0; var15 < 3; ++var15) { + var12 += var22.worldObj.random.nextInt(6) - var22.worldObj.random.nextInt(6); + var13 += var22.worldObj.random.nextInt(1) - var22.worldObj.random.nextInt(1); + var14 += var22.worldObj.random.nextInt(6) - var22.worldObj.random.nextInt(6); + if(var12 >= 0 && var14 > 0 && var13 >= 0 && var13 < var22.worldObj.height - 2 && var12 < var22.worldObj.width && var14 < var22.worldObj.length) { + var16 = (float)var12 + 0.5F; + var17 = (float)var13 + 0.5F; + var18 = (float)var14 + 0.5F; + if(var5 != null) { + var19 = var16 - var5.posX; + var20 = var17 - var5.posY; + var21 = var18 - var5.posZ; + var19 = var19 * var19 + var20 * var20 + var21 * var21; + if(var19 < 1024.0F) { + continue; + } + } else { + var19 = var16 - (float)var22.worldObj.xSpawn; + var20 = var17 - (float)var22.worldObj.ySpawn; + var21 = var18 - (float)var22.worldObj.zSpawn; + var19 = var19 * var19 + var20 * var20 + var21 * var21; + if(var19 < 1024.0F) { + continue; + } + } + + var23 = null; + if(var7 == 0) { + var23 = new EntitySkeleton(var22.worldObj); + } + + if(var7 == 1) { + var23 = new EntityCreeper(var22.worldObj); + } + + if(var7 == 2) { + var23 = new EntitySpider(var22.worldObj); + } + + if(var7 == 3) { + var23 = new EntityZombie(var22.worldObj); + } + + if(var23 instanceof EntityMob && var22.worldObj.difficultySetting == 0) { + var23 = null; + } + + if(var23 != null && !var22.worldObj.isBlockNormalCube(var12, var13, var14) && var22.worldObj.isBlockNormalCube(var12, var13 - 1, var14) && ((EntityLiving)var23).getCanSpawnHere(var16, var17, var18)) { + var21 = var22.worldObj.random.nextFloat() * 360.0F; + ((EntityLiving)var23).setPositionAndRotation(var16, var17, var18, var21, 0.0F); + ++var6; + var22.worldObj.spawnEntityInWorld((Entity)var23); + } + } + } + } + + var3 += var6; + } + } + + var4 = this.worldObj.entitiesInLevelList(EntityAnimal.class); + + for(var1 = 0; var1 < 4; ++var1) { + if(var4 < var2) { + var5 = this.worldObj.playerEntity; + var22 = this; + var6 = 0; + var7 = this.worldObj.random.nextInt(2); + var8 = this.worldObj.random.nextInt(this.worldObj.width); + var9 = this.worldObj.random.nextInt(this.worldObj.height); + var10 = this.worldObj.random.nextInt(this.worldObj.length); + + for(var11 = 0; var11 < 2; ++var11) { + var12 = var8; + var13 = var9; + var14 = var10; + + for(var15 = 0; var15 < 3; ++var15) { + var12 += var22.worldObj.random.nextInt(6) - var22.worldObj.random.nextInt(6); + var13 += var22.worldObj.random.nextInt(1) - var22.worldObj.random.nextInt(1); + var14 += var22.worldObj.random.nextInt(6) - var22.worldObj.random.nextInt(6); + if(var12 >= 0 && var14 > 0 && var13 >= 0 && var13 < var22.worldObj.height - 2 && var12 < var22.worldObj.width && var14 < var22.worldObj.length) { + var16 = (float)var12 + 0.5F; + var17 = (float)var13 + 0.5F; + var18 = (float)var14 + 0.5F; + if(var5 != null) { + var19 = var16 - var5.posX; + var20 = var17 - var5.posY; + var21 = var18 - var5.posZ; + var19 = var19 * var19 + var20 * var20 + var21 * var21; + if(var19 < 1024.0F) { + continue; + } + } else { + var19 = var16 - (float)var22.worldObj.xSpawn; + var20 = var17 - (float)var22.worldObj.ySpawn; + var21 = var18 - (float)var22.worldObj.zSpawn; + var19 = var19 * var19 + var20 * var20 + var21 * var21; + if(var19 < 1024.0F) { + continue; + } + } + + var23 = null; + if(var7 == 0) { + var23 = new EntityPig(var22.worldObj); + } + + if(var7 == 1) { + var23 = new EntitySheep(var22.worldObj); + } + + if(var23 != null && !var22.worldObj.isBlockNormalCube(var12, var13, var14) && var22.worldObj.isBlockNormalCube(var12, var13 - 1, var14) && ((EntityLiving)var23).getCanSpawnHere(var16, var17, var18)) { + var21 = var22.worldObj.random.nextFloat() * 360.0F; + ((EntityLiving)var23).setPositionAndRotation(var16, var17, var18, var21, 0.0F); + ++var6; + var22.worldObj.spawnEntityInWorld((Entity)var23); + } + } + } + } + + var4 += var6; + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/NextTickListEntry.java b/src/teavm/java/net/minecraft/game/level/NextTickListEntry.java new file mode 100644 index 0000000..3d25a1f --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/NextTickListEntry.java @@ -0,0 +1,16 @@ +package net.minecraft.game.level; + +public final class NextTickListEntry { + public int xCoord; + public int yCoord; + public int zCoord; + public int blockID; + public int scheduledTime; + + public NextTickListEntry(int var1, int var2, int var3, int var4) { + this.xCoord = var1; + this.yCoord = var2; + this.zCoord = var3; + this.blockID = var4; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/World.java b/src/teavm/java/net/minecraft/game/level/World.java new file mode 100644 index 0000000..877c365 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/World.java @@ -0,0 +1,1585 @@ +package net.minecraft.game.level; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.TreeSet; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.entity.EntityLiving; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.BlockContainer; +import net.minecraft.game.level.block.tileentity.TileEntity; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.level.path.Pathfinder; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; + +public final class World { + private static float[] lightBrightnessTable = new float[16]; + public int width; + public int length; + public int height; + public byte[] blocks; + public byte[] data; + public String name; + public String authorName; + public long createTime; + public int xSpawn; + public int ySpawn; + public int zSpawn; + public float rotSpawn; + public int defaultFluid = Block.waterMoving.blockID; + List worldAccesses = new ArrayList(); + private List tickList = new LinkedList(); + public Map map = new HashMap(); + private List list = new ArrayList(); + int[] heightMap; + public Random random = new Random(); + private Random rand = new Random(); + private int randId = this.random.nextInt(); + public EntityMap entityMap; + public int waterLevel; + public int groundLevel; + public int cloudHeight; + public int skyColor = 10079487; + public int fogColor = 16777215; + public int cloudColor = 16777215; + private int updateLCG = 0; + private int playTime = 0; + public EntityLiving playerEntity; + public boolean survivalWorld = true; + public int skyBrightness = 15; + public int skylightSubtracted = 15; + public Pathfinder pathFinder = new Pathfinder(this); + private Light lightUpdates; + public int worldTime = 0; + private static short floodFillCounter; + private short[] floodFillCounters = new short[1048576]; + private int[] coords = new int[1048576]; + private int[] floodedBlocks = new int[1048576]; + public int difficultySetting = 2; + + public final void load() { + if(this.blocks == null) { + throw new RuntimeException("The level is corrupt!"); + } else { + this.worldAccesses = new ArrayList(); + this.heightMap = new int[this.width * this.length]; + Arrays.fill(this.heightMap, this.height); + this.lightUpdates.updateSkylight(0, 0, this.width, this.length); + this.random = new Random(); + this.randId = this.random.nextInt(); + this.tickList = new ArrayList(); + if(this.entityMap == null) { + this.entityMap = new EntityMap(this.width, this.height, this.length); + } + + } + } + + public final void generate(int var1, int var2, int var3, byte[] var4, byte[] var5) { + if(var5 != null && var5.length == 0) { + var5 = null; + } + + this.width = var1; + this.length = var3; + this.height = var2; + this.blocks = var4; + + int var6; + int var7; + for(var2 = 0; var2 < this.width; ++var2) { + for(var6 = 0; var6 < this.length; ++var6) { + for(var7 = 0; var7 < this.height; ++var7) { + int var8 = 0; + if(var7 <= 1 && var7 < this.groundLevel - 1 && var4[((var7 + 1) * this.length + var6) * this.width + var2] == 0) { + var8 = Block.lavaStill.blockID; + } else if(var7 < this.groundLevel - 1) { + var8 = Block.bedrock.blockID; + } else if(var7 < this.groundLevel) { + if(this.groundLevel > this.waterLevel && this.defaultFluid == Block.waterMoving.blockID) { + var8 = Block.grass.blockID; + } else { + var8 = Block.dirt.blockID; + } + } else if(var7 < this.waterLevel) { + var8 = this.defaultFluid; + } + + var4[(var7 * this.length + var6) * this.width + var2] = (byte)var8; + if(var7 == 1 && var2 != 0 && var6 != 0 && var2 != this.width - 1 && var6 != this.length - 1) { + var7 = this.height - 2; + } + } + } + } + + this.heightMap = new int[var1 * var3]; + Arrays.fill(this.heightMap, this.height); + if(var5 == null) { + this.data = new byte[var4.length]; + this.lightUpdates = new Light(this); + boolean var10 = true; + World var11 = this; + var2 = this.skylightSubtracted; + + for(var3 = 0; var3 < var11.width; ++var3) { + for(int var12 = 0; var12 < var11.length; ++var12) { + int var13; + for(var13 = var11.height - 1; var13 > 0 && Block.lightOpacity[var11.getBlockId(var3, var13, var12)] == 0; --var13) { + } + + var11.heightMap[var3 + var12 * var11.width] = var13 + 1; + + for(var13 = 0; var13 < var11.height; ++var13) { + var6 = (var13 * var11.length + var12) * var11.width + var3; + var7 = var11.heightMap[var3 + var12 * var11.width]; + var7 = var13 >= var7 ? var2 : 0; + byte var14 = var11.blocks[var6]; + if(var7 < Block.lightValue[var14]) { + var7 = Block.lightValue[var14]; + } + + var11.data[var6] = (byte)((var11.data[var6] & 240) + var7); + } + } + } + + var11.lightUpdates.updateBlockLight(0, 0, 0, var11.width, var11.height, var11.length); + } else { + this.data = var5; + this.lightUpdates = new Light(this); + } + + for(var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).loadRenderers(); + } + + this.tickList.clear(); + this.findSpawn(); + this.load(); + System.gc(); + } + + public final void findSpawn() { + Random var1 = new Random(); + int var2 = 0; + + while(true) { + label58: + while(true) { + int var3; + int var4; + int var5; + do { + do { + ++var2; + var3 = var1.nextInt(this.width / 2) + this.width / 4; + var4 = var1.nextInt(this.length / 2) + this.length / 4; + var5 = this.getFirstUncoveredBlock(var3, var4) + 1; + if(var2 == 1000000) { + this.xSpawn = var3; + this.ySpawn = this.height + 100; + this.zSpawn = var4; + this.rotSpawn = 180.0F; + return; + } + } while(var5 < 4); + } while(var5 <= this.waterLevel); + + int var6; + int var7; + int var8; + for(var6 = var3 - 3; var6 <= var3 + 3; ++var6) { + for(var7 = var5 - 1; var7 <= var5 + 2; ++var7) { + for(var8 = var4 - 3 - 2; var8 <= var4 + 3; ++var8) { + if(this.getBlockMaterial(var6, var7, var8).isSolid()) { + continue label58; + } + } + } + } + + var6 = var5 - 2; + + for(var7 = var3 - 3; var7 <= var3 + 3; ++var7) { + for(var8 = var4 - 3 - 2; var8 <= var4 + 3; ++var8) { + if(!Block.opaqueCubeLookup[this.getBlockId(var7, var6, var8)]) { + continue label58; + } + } + } + + this.xSpawn = var3; + this.ySpawn = var5; + this.zSpawn = var4; + this.rotSpawn = 180.0F; + return; + } + } + } + + public final void addWorldAccess(IWorldAccess var1) { + for(int var2 = 0; var2 < this.entityMap.entities.size(); ++var2) { + var1.obtainEntitySkin((Entity)this.entityMap.entities.get(var2)); + } + + this.worldAccesses.add(var1); + } + + public final void finalize() { + } + + public final void removeWorldAccess(IWorldAccess var1) { + this.worldAccesses.remove(var1); + } + + public final ArrayList getCollidingBoundingBoxes(AxisAlignedBB var1) { + ArrayList var2 = new ArrayList(); + int var3 = (int)var1.minX; + int var4 = (int)var1.maxX + 1; + int var5 = (int)var1.minY; + int var6 = (int)var1.maxY + 1; + int var7 = (int)var1.minZ; + int var8 = (int)var1.maxZ + 1; + if(var1.minX < 0.0F) { + --var3; + } + + if(var1.minY < 0.0F) { + --var5; + } + + if(var1.minZ < 0.0F) { + --var7; + } + + for(var3 = var3; var3 < var4; ++var3) { + for(int var9 = var5; var9 < var6; ++var9) { + for(int var10 = var7; var10 < var8; ++var10) { + Block var11 = Block.blocksList[this.getBlockId(var3, var9, var10)]; + AxisAlignedBB var12; + if(var11 != null) { + var12 = var11.getCollisionBoundingBoxFromPool(var3, var9, var10); + if(var12 != null && var1.intersectsWith(var12)) { + var2.add(var12); + } + } else if(this.groundLevel < 0 && (var9 < this.groundLevel || var9 < this.waterLevel)) { + var12 = Block.bedrock.getCollisionBoundingBoxFromPool(var3, var9, var10); + if(var12 != null && var1.intersectsWith(var12)) { + var2.add(var12); + } + } + } + } + } + + return var2; + } + + public final void swap(int var1, int var2, int var3, int var4, int var5, int var6) { + int var7 = this.getBlockId(var1, var2, var3); + int var8 = this.getBlockId(var4, var5, var6); + this.setBlock(var1, var2, var3, var8); + this.setBlock(var4, var5, var6, var7); + this.notifyBlocksOfNeighborChange(var1, var2, var3, var8); + this.notifyBlocksOfNeighborChange(var4, var5, var6, var7); + } + + public final boolean setBlock(int var1, int var2, int var3, int var4) { + if(var1 > 0 && var2 > 0 && var3 > 0 && var1 < this.width - 1 && var2 < this.height - 1 && var3 < this.length - 1) { + if(var4 == this.blocks[(var2 * this.length + var3) * this.width + var1]) { + return false; + } else { + if(var4 == 0 && (var1 == 0 || var3 == 0 || var1 == this.width - 1 || var3 == this.length - 1) && var2 >= this.groundLevel && var2 < this.waterLevel) { + var4 = Block.waterMoving.blockID; + } + + byte var5 = this.blocks[(var2 * this.length + var3) * this.width + var1]; + this.blocks[(var2 * this.length + var3) * this.width + var1] = (byte)var4; + this.setBlockMetadata(var1, var2, var3, 0); + if(var5 != 0) { + Block.blocksList[var5].onBlockRemoval(this, var1, var2, var3); + } + + if(var4 != 0) { + Block.blocksList[var4].onBlockAdded(this, var1, var2, var3); + } + + if(Block.lightOpacity[var5] != Block.lightOpacity[var4] || Block.lightValue[var5] != 0 || Block.lightValue[var4] != 0) { + this.lightUpdates.updateSkylight(var1, var3, 1, 1); + this.lightUpdates.updateBlockLight(var1, var2, var3, var1 + 1, var2 + 1, var3 + 1); + } + + for(var4 = 0; var4 < this.worldAccesses.size(); ++var4) { + ((IWorldAccess)this.worldAccesses.get(var4)).markBlockAndNeighborsNeedsUpdate(var1, var2, var3); + } + + return true; + } + } else { + return false; + } + } + + public final boolean setBlockWithNotify(int var1, int var2, int var3, int var4) { + if(this.setBlock(var1, var2, var3, var4)) { + this.notifyBlocksOfNeighborChange(var1, var2, var3, var4); + return true; + } else { + return false; + } + } + + public final void notifyBlocksOfNeighborChange(int var1, int var2, int var3, int var4) { + this.notifyBlockOfNeighborChange(var1 - 1, var2, var3, var4); + this.notifyBlockOfNeighborChange(var1 + 1, var2, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2 - 1, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2 + 1, var3, var4); + this.notifyBlockOfNeighborChange(var1, var2, var3 - 1, var4); + this.notifyBlockOfNeighborChange(var1, var2, var3 + 1, var4); + } + + public final boolean setTileNoUpdate(int var1, int var2, int var3, int var4) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.height && var3 < this.length) { + if(var4 == this.blocks[(var2 * this.length + var3) * this.width + var1]) { + return false; + } else { + this.blocks[(var2 * this.length + var3) * this.width + var1] = (byte)var4; + this.lightUpdates.updateBlockLight(var1, var2, var3, var1 + 1, var2 + 1, var3 + 1); + return true; + } + } else { + return false; + } + } + + private void notifyBlockOfNeighborChange(int var1, int var2, int var3, int var4) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.height && var3 < this.length) { + Block var5 = Block.blocksList[this.blocks[(var2 * this.length + var3) * this.width + var1]]; + if(var5 != null) { + var5.onNeighborBlockChange(this, var1, var2, var3, var4); + } + + } + } + + public final int getBlockId(int var1, int var2, int var3) { + if(var1 < 0) { + var1 = 0; + } else if(var1 >= this.width) { + var1 = this.width - 1; + } + + if(var2 < 0) { + var2 = 0; + } else if(var2 >= this.height) { + var2 = this.height - 1; + } + + if(var3 < 0) { + var3 = 0; + } else if(var3 >= this.length) { + var3 = this.length - 1; + } + + return this.blocks[(var2 * this.length + var3) * this.width + var1] & 255; + } + + public final boolean isBlockNormalCube(int var1, int var2, int var3) { + Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)]; + return var4 == null ? false : var4.isOpaqueCube(); + } + + public final void updateEntities() { + this.entityMap.updateEntities(); + + for(int var1 = 0; var1 < this.list.size(); ++var1) { + TileEntity var2 = (TileEntity)this.list.get(var1); + var2.updateEntity(); + } + + } + + public final void updateLighting() { + this.lightUpdates.updateLight(); + } + + public final float getStarBrightness(float var1) { + var1 = this.getCelestialAngle(var1); + var1 = 1.0F - (MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 12.0F / 16.0F); + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + return var1 * var1 * 0.5F; + } + + public final Vec3D getSkyColor(float var1) { + var1 = this.getCelestialAngle(var1); + var1 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + float var2 = (float)(this.skyColor >> 16 & 255) / 255.0F; + float var3 = (float)(this.skyColor >> 8 & 255) / 255.0F; + float var4 = (float)(this.skyColor & 255) / 255.0F; + var2 *= var1; + var3 *= var1; + var4 *= var1; + return new Vec3D(var2, var3, var4); + } + + public final float getCelestialAngle(float var1) { + if(this.skyBrightness > 15) { + return 0.0F; + } else { + var1 = ((float)this.worldTime + var1) / 24000.0F - 0.15F; + return var1; + } + } + + public final Vec3D getFogColor(float var1) { + var1 = this.getCelestialAngle(var1); + var1 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + float var2 = (float)(this.fogColor >> 16 & 255) / 255.0F; + float var3 = (float)(this.fogColor >> 8 & 255) / 255.0F; + float var4 = (float)(this.fogColor & 255) / 255.0F; + var2 *= var1 * 0.94F + 0.06F; + var3 *= var1 * 0.94F + 0.06F; + var4 *= var1 * 0.91F + 0.09F; + return new Vec3D(var2, var3, var4); + } + + public final Vec3D getCloudColor(float var1) { + var1 = this.getCelestialAngle(var1); + var1 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 0.5F; + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + float var2 = (float)(this.cloudColor >> 16 & 255) / 255.0F; + float var3 = (float)(this.cloudColor >> 8 & 255) / 255.0F; + float var4 = (float)(this.cloudColor & 255) / 255.0F; + var2 *= var1 * 0.9F + 0.1F; + var3 *= var1 * 0.9F + 0.1F; + var4 *= var1 * 0.85F + 0.15F; + return new Vec3D(var2, var3, var4); + } + + public final int getSkyBrightness() { + float var1 = this.getCelestialAngle(1.0F); + var1 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 1.5F + 0.5F; + if(var1 < 0.0F) { + var1 = 0.0F; + } + + if(var1 > 1.0F) { + var1 = 1.0F; + } + + int var2 = (int)(var1 * ((float)(15 * this.skyBrightness) / 15.0F - 4.0F) + 4.0F); + if(var2 > 15) { + var2 = 15; + } + + if(var2 < 4) { + var2 = 4; + } + + return var2; + } + + public final void tick() { + ++this.worldTime; + if(this.worldTime == 24000) { + this.worldTime = 0; + } + + int var1 = this.getSkyBrightness(); + if(this.skylightSubtracted > var1) { + this.updateChunkLight(this.skylightSubtracted - 1); + } + + if(this.skylightSubtracted < var1) { + this.updateChunkLight(this.skylightSubtracted + 1); + } + + ++this.playTime; + var1 = 1; + + int var2; + for(var2 = 1; 1 << var1 < this.width; ++var1) { + } + + while(1 << var2 < this.length) { + ++var2; + } + + int var3 = this.length - 1; + int var4 = this.width - 1; + int var5 = this.height - 1; + int var6 = this.tickList.size(); + if(var6 > 200) { + var6 = 200; + } + + int var7; + int var10; + for(var7 = 0; var7 < var6; ++var7) { + NextTickListEntry var8 = (NextTickListEntry)this.tickList.remove(0); + if(var8.scheduledTime > 0) { + --var8.scheduledTime; + this.tickList.add(var8); + } else { + int var12 = var8.zCoord; + int var11 = var8.yCoord; + var10 = var8.xCoord; + if(var10 >= 0 && var11 >= 0 && var12 >= 0 && var10 < this.width && var11 < this.height && var12 < this.length) { + byte var9 = this.blocks[(var8.yCoord * this.length + var8.zCoord) * this.width + var8.xCoord]; + if(var9 == var8.blockID && var9 > 0) { + Block.blocksList[var9].updateTick(this, var8.xCoord, var8.yCoord, var8.zCoord, this.random); + } + } + } + } + + this.updateLCG += this.width * this.length * this.height; + var6 = this.updateLCG / 200; + this.updateLCG -= var6 * 200; + + for(var7 = 0; var7 < var6; ++var7) { + this.randId = this.randId * 3 + 1013904223; + int var13 = this.randId >> 2; + int var14 = var13 & var4; + var10 = var13 >> var1 & var3; + var13 = var13 >> var1 + var2 & var5; + byte var15 = this.blocks[(var13 * this.length + var10) * this.width + var14]; + if(Block.tickOnLoad[var15]) { + Block.blocksList[var15].updateTick(this, var14, var13, var10, this.random); + } + } + + } + + public final int entitiesInLevelList(Class var1) { + int var2 = 0; + + for(int var3 = 0; var3 < this.entityMap.entities.size(); ++var3) { + Entity var4 = (Entity)this.entityMap.entities.get(var3); + if(var1.isAssignableFrom(var4.getClass())) { + ++var2; + } + } + + return var2; + } + + public final int getGroundLevel() { + return this.groundLevel; + } + + public final int getWaterLevel() { + return this.waterLevel; + } + + public final boolean getIsAnyLiquid(AxisAlignedBB var1) { + int var2 = (int)var1.minX; + int var3 = (int)var1.maxX + 1; + int var4 = (int)var1.minY; + int var5 = (int)var1.maxY + 1; + int var6 = (int)var1.minZ; + int var7 = (int)var1.maxZ + 1; + if(var1.minX < 0.0F) { + --var2; + } + + if(var1.minY < 0.0F) { + --var4; + } + + if(var1.minZ < 0.0F) { + --var6; + } + + if(var2 < 0) { + var2 = 0; + } + + if(var4 < 0) { + var4 = 0; + } + + if(var6 < 0) { + var6 = 0; + } + + if(var3 > this.width) { + var3 = this.width; + } + + if(var5 > this.height) { + var5 = this.height; + } + + if(var7 > this.length) { + var7 = this.length; + } + + for(int var10 = var2; var10 < var3; ++var10) { + for(var2 = var4; var2 < var5; ++var2) { + for(int var8 = var6; var8 < var7; ++var8) { + Block var9 = Block.blocksList[this.getBlockId(var10, var2, var8)]; + if(var9 != null && var9.material.getIsLiquid()) { + return true; + } + } + } + } + + return false; + } + + public final boolean isBoundingBoxBurning(AxisAlignedBB var1) { + int var2 = (int)var1.minX; + int var3 = (int)var1.maxX + 1; + int var4 = (int)var1.minY; + int var5 = (int)var1.maxY + 1; + int var6 = (int)var1.minZ; + int var10 = (int)var1.maxZ + 1; + + for(var2 = var2; var2 < var3; ++var2) { + for(int var7 = var4; var7 < var5; ++var7) { + for(int var8 = var6; var8 < var10; ++var8) { + int var9 = this.getBlockId(var2, var7, var8); + if(var9 == Block.fire.blockID || var9 == Block.lavaMoving.blockID || var9 == Block.lavaStill.blockID) { + return true; + } + } + } + } + + return false; + } + + public final boolean handleMaterialAcceleration(AxisAlignedBB var1, Material var2) { + int var3 = (int)var1.minX; + int var4 = (int)var1.maxX + 1; + int var5 = (int)var1.minY; + int var6 = (int)var1.maxY + 1; + int var7 = (int)var1.minZ; + int var11 = (int)var1.maxZ + 1; + + for(var3 = var3; var3 < var4; ++var3) { + for(int var8 = var5; var8 < var6; ++var8) { + for(int var9 = var7; var9 < var11; ++var9) { + Block var10 = Block.blocksList[this.getBlockId(var3, var8, var9)]; + if(var10 != null && var10.material == var2) { + return true; + } + } + } + } + + return false; + } + + public final void scheduleBlockUpdate(int var1, int var2, int var3, int var4) { + NextTickListEntry var5 = new NextTickListEntry(var1, var2, var3, var4); + if(var4 > 0) { + var3 = Block.blocksList[var4].tickRate(); + var5.scheduledTime = var3; + } + + this.tickList.add(var5); + } + + public final boolean checkIfAABBIsClear1(AxisAlignedBB var1) { + return this.entityMap.getEntitiesWithinAABB((Entity)null, var1).size() == 0; + } + + public final boolean checkIfAABBIsClear(AxisAlignedBB var1) { + List var4 = this.entityMap.getEntitiesWithinAABB((Entity)null, var1); + + for(int var2 = 0; var2 < var4.size(); ++var2) { + Entity var3 = (Entity)var4.get(var2); + if(var3.preventEntitySpawning) { + return false; + } + } + + return true; + } + + public final List getEntitiesWithinAABBExcludingEntity(Entity var1, AxisAlignedBB var2) { + return this.entityMap.getEntitiesWithinAABB(var1, var2); + } + + public final boolean isSolid(float var1, float var2, float var3, float var4) { + return this.isSolid(var1 - 0.1F, var2 - 0.1F, var3 - 0.1F) ? true : (this.isSolid(var1 - 0.1F, var2 - 0.1F, var3 + 0.1F) ? true : (this.isSolid(var1 - 0.1F, var2 + 0.1F, var3 - 0.1F) ? true : (this.isSolid(var1 - 0.1F, var2 + 0.1F, var3 + 0.1F) ? true : (this.isSolid(var1 + 0.1F, var2 - 0.1F, var3 - 0.1F) ? true : (this.isSolid(var1 + 0.1F, var2 - 0.1F, var3 + 0.1F) ? true : (this.isSolid(var1 + 0.1F, var2 + 0.1F, var3 - 0.1F) ? true : this.isSolid(var1 + 0.1F, var2 + 0.1F, var3 + 0.1F))))))); + } + + private boolean isSolid(float var1, float var2, float var3) { + int var4 = this.getBlockId((int)var1, (int)var2, (int)var3); + return var4 > 0 && Block.blocksList[var4].isOpaqueCube(); + } + + private int getFirstUncoveredBlock(int var1, int var2) { + int var3; + for(var3 = this.height; (this.getBlockId(var1, var3 - 1, var2) == 0 || Block.blocksList[this.getBlockId(var1, var3 - 1, var2)].material == Material.air) && var3 > 0; --var3) { + } + + return var3; + } + + public final void setSpawnLocation(int var1, int var2, int var3, float var4) { + this.xSpawn = var1; + this.ySpawn = var2; + this.zSpawn = var3; + this.rotSpawn = var4; + } + + public final float getLightBrightness(int var1, int var2, int var3) { + return lightBrightnessTable[this.getBlockLightValue(var1, var2, var3)]; + } + + public final byte getBlockLightValue(int var1, int var2, int var3) { + if(var1 < 0) { + var1 = 0; + } else if(var1 >= this.width) { + var1 = this.width - 1; + } + + if(var2 < 0) { + var2 = 0; + } else if(var2 >= this.height) { + var2 = this.height - 1; + } + + if(var3 < 0) { + var3 = 0; + } else if(var3 >= this.length) { + var3 = this.length - 1; + } + + return this.blocks[(var2 * this.length + var3) * this.width + var1] == Block.stairSingle.blockID ? (var2 < this.height - 1 ? (byte)(this.data[((var2 + 1) * this.length + var3) * this.width + var1] & 15) : 15) : (byte)(this.data[(var2 * this.length + var3) * this.width + var1] & 15); + } + + public final byte getBlockMetadata(int var1, int var2, int var3) { + if(var1 < 0) { + var1 = 0; + } else if(var1 >= this.width) { + var1 = this.width - 1; + } + + if(var2 < 0) { + var2 = 0; + } else if(var2 >= this.height) { + var2 = this.height - 1; + } + + if(var3 < 0) { + var3 = 0; + } else if(var3 >= this.length) { + var3 = this.length - 1; + } + + return (byte)(this.data[(var2 * this.length + var3) * this.width + var1] >>> 4 & 15); + } + + public final void setBlockMetadata(int var1, int var2, int var3, int var4) { + if(var1 < 0) { + var1 = 0; + } else if(var1 >= this.width) { + var1 = this.width - 1; + } + + if(var2 < 0) { + var2 = 0; + } else if(var2 >= this.height) { + var2 = this.height - 1; + } + + if(var3 < 0) { + var3 = 0; + } else if(var3 >= this.length) { + var3 = this.length - 1; + } + + this.data[(var2 * this.length + var3) * this.width + var1] = (byte)((this.data[(var2 * this.length + var3) * this.width + var1] & 15) + (var4 << 4)); + + for(var4 = 0; var4 < this.worldAccesses.size(); ++var4) { + ((IWorldAccess)this.worldAccesses.get(var4)).markBlockAndNeighborsNeedsUpdate(var1, var2, var3); + } + + } + + public final Material getBlockMaterial(int var1, int var2, int var3) { + var1 = this.getBlockId(var1, var2, var3); + return var1 == 0 ? Material.air : Block.blocksList[var1].material; + } + + public final boolean isWater(int var1, int var2, int var3) { + var1 = this.getBlockId(var1, var2, var3); + return var1 > 0 && Block.blocksList[var1].material == Material.water; + } + + public final MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2) { + if(!Float.isNaN(var1.xCoord) && !Float.isNaN(var1.yCoord) && !Float.isNaN(var1.zCoord)) { + if(!Float.isNaN(var2.xCoord) && !Float.isNaN(var2.yCoord) && !Float.isNaN(var2.zCoord)) { + int var3 = MathHelper.floor_float(var2.xCoord); + int var4 = MathHelper.floor_float(var2.yCoord); + int var5 = MathHelper.floor_float(var2.zCoord); + int var6 = MathHelper.floor_float(var1.xCoord); + int var7 = MathHelper.floor_float(var1.yCoord); + int var8 = MathHelper.floor_float(var1.zCoord); + int var9 = 20; + + while(var9-- >= 0) { + if(Float.isNaN(var1.xCoord) || Float.isNaN(var1.yCoord) || Float.isNaN(var1.zCoord)) { + return null; + } + + if(var6 == var3 && var7 == var4 && var8 == var5) { + return null; + } + + float var10 = 999.0F; + float var11 = 999.0F; + float var12 = 999.0F; + if(var3 > var6) { + var10 = (float)var6 + 1.0F; + } + + if(var3 < var6) { + var10 = (float)var6; + } + + if(var4 > var7) { + var11 = (float)var7 + 1.0F; + } + + if(var4 < var7) { + var11 = (float)var7; + } + + if(var5 > var8) { + var12 = (float)var8 + 1.0F; + } + + if(var5 < var8) { + var12 = (float)var8; + } + + float var13 = 999.0F; + float var14 = 999.0F; + float var15 = 999.0F; + float var16 = var2.xCoord - var1.xCoord; + float var17 = var2.yCoord - var1.yCoord; + float var18 = var2.zCoord - var1.zCoord; + if(var10 != 999.0F) { + var13 = (var10 - var1.xCoord) / var16; + } + + if(var11 != 999.0F) { + var14 = (var11 - var1.yCoord) / var17; + } + + if(var12 != 999.0F) { + var15 = (var12 - var1.zCoord) / var18; + } + + byte var19; + if(var13 < var14 && var13 < var15) { + if(var3 > var6) { + var19 = 4; + } else { + var19 = 5; + } + + var1.xCoord = var10; + var1.yCoord += var17 * var13; + var1.zCoord += var18 * var13; + } else if(var14 < var15) { + if(var4 > var7) { + var19 = 0; + } else { + var19 = 1; + } + + var1.xCoord += var16 * var14; + var1.yCoord = var11; + var1.zCoord += var18 * var14; + } else { + if(var5 > var8) { + var19 = 2; + } else { + var19 = 3; + } + + var1.xCoord += var16 * var15; + var1.yCoord += var17 * var15; + var1.zCoord = var12; + } + + Vec3D var20 = new Vec3D(var1.xCoord, var1.yCoord, var1.zCoord); + var6 = (int)(var20.xCoord = (float)MathHelper.floor_float(var1.xCoord)); + if(var19 == 5) { + --var6; + ++var20.xCoord; + } + + var7 = (int)(var20.yCoord = (float)MathHelper.floor_float(var1.yCoord)); + if(var19 == 1) { + --var7; + ++var20.yCoord; + } + + var8 = (int)(var20.zCoord = (float)MathHelper.floor_float(var1.zCoord)); + if(var19 == 3) { + --var8; + ++var20.zCoord; + } + + int var21 = this.getBlockId(var6, var7, var8); + Block var23 = Block.blocksList[var21]; + if(var21 > 0 && var23.isCollidable()) { + MovingObjectPosition var22 = var23.collisionRayTrace(this, var6, var7, var8, var1, var2); + if(var22 != null) { + return var22; + } + } + } + + return null; + } else { + return null; + } + } else { + return null; + } + } + + public final boolean growTrees(int var1, int var2, int var3) { + int var4 = this.random.nextInt(3) + 4; + boolean var5 = true; + if(var2 > 0 && var2 + var4 + 1 <= this.height) { + int var6; + int var8; + int var9; + int var10; + for(var6 = var2; var6 <= var2 + 1 + var4; ++var6) { + byte var7 = 1; + if(var6 == var2) { + var7 = 0; + } + + if(var6 >= var2 + 1 + var4 - 2) { + var7 = 2; + } + + for(var8 = var1 - var7; var8 <= var1 + var7 && var5; ++var8) { + for(var9 = var3 - var7; var9 <= var3 + var7 && var5; ++var9) { + if(var8 >= 0 && var6 >= 0 && var9 >= 0 && var8 < this.width && var6 < this.height && var9 < this.length) { + var10 = this.blocks[(var6 * this.length + var9) * this.width + var8] & 255; + if(var10 != 0) { + var5 = false; + } + } else { + var5 = false; + } + } + } + } + + if(!var5) { + return false; + } else { + var6 = this.blocks[((var2 - 1) * this.length + var3) * this.width + var1] & 255; + if((var6 == Block.grass.blockID || var6 == Block.dirt.blockID) && var2 < this.height - var4 - 1) { + this.setBlockWithNotify(var1, var2 - 1, var3, Block.dirt.blockID); + + int var13; + for(var13 = var2 - 3 + var4; var13 <= var2 + var4; ++var13) { + var8 = var13 - (var2 + var4); + var9 = 1 - var8 / 2; + + for(var10 = var1 - var9; var10 <= var1 + var9; ++var10) { + int var12 = var10 - var1; + + for(var6 = var3 - var9; var6 <= var3 + var9; ++var6) { + int var11 = var6 - var3; + if((Math.abs(var12) != var9 || Math.abs(var11) != var9 || this.random.nextInt(2) != 0 && var8 != 0) && !Block.opaqueCubeLookup[this.getBlockId(var10, var13, var6)]) { + this.setBlockWithNotify(var10, var13, var6, Block.leaves.blockID); + } + } + } + } + + for(var13 = 0; var13 < var4; ++var13) { + if(!Block.opaqueCubeLookup[this.getBlockId(var1, var2 + var13, var3)]) { + this.setBlockWithNotify(var1, var2 + var13, var3, Block.wood.blockID); + } + } + + return true; + } else { + return false; + } + } + } else { + return false; + } + } + + public final Entity getPlayerEntity() { + return this.playerEntity; + } + + public final void spawnEntityInWorld(Entity var1) { + this.entityMap.insert(var1); + var1.setWorld(this); + + for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).obtainEntitySkin(var1); + } + + } + + public final void releaseEntitySkin(Entity var1) { + this.entityMap.remove(var1); + + for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) { + ((IWorldAccess)this.worldAccesses.get(var2)).releaseEntitySkin(var1); + } + + } + + public final void createExplosion(Entity var1, float var2, float var3, float var4, float var5) { + TreeSet var6 = new TreeSet(); + float var7 = var5; + + int var8; + int var9; + int var10; + float var11; + float var18; + int var19; + int var20; + int var21; + int var22; + for(var8 = 0; var8 < 16; ++var8) { + for(var9 = 0; var9 < 16; ++var9) { + for(var10 = 0; var10 < 16; ++var10) { + if(var8 == 0 || var8 == 15 || var9 == 0 || var9 == 15 || var10 == 0 || var10 == 15) { + var11 = (float)var8 / 15.0F * 2.0F - 1.0F; + float var12 = (float)var9 / 15.0F * 2.0F - 1.0F; + float var13 = (float)var10 / 15.0F * 2.0F - 1.0F; + float var14 = (float)Math.sqrt((double)(var11 * var11 + var12 * var12 + var13 * var13)); + var11 /= var14; + var12 /= var14; + var13 /= var14; + float var15 = var5 * (0.7F + this.random.nextFloat() * 0.6F); + float var16 = var2; + float var17 = var3; + + for(var18 = var4; var15 > 0.0F; var15 -= 0.22500001F) { + var19 = (int)var16; + var20 = (int)var17; + var21 = (int)var18; + var22 = this.getBlockId(var19, var20, var21); + if(var22 > 0) { + var15 -= (Block.blocksList[var22].getExplosionResistance() + 0.3F) * 0.3F; + } + + if(var15 > 0.0F) { + int var23 = var19 + (var20 << 10) + (var21 << 10 << 10); + var6.add(Integer.valueOf(var23)); + } + + var16 += var11 * 0.3F; + var17 += var12 * 0.3F; + var18 += var13 * 0.3F; + } + } + } + } + } + + var5 *= 2.0F; + var8 = (int)(var2 - var5 - 1.0F); + var9 = (int)(var2 + var5 + 1.0F); + var10 = (int)(var3 - var5 - 1.0F); + int var29 = (int)(var3 + var5 + 1.0F); + int var30 = (int)(var4 - var5 - 1.0F); + int var31 = (int)(var4 + var5 + 1.0F); + List var32 = this.entityMap.getEntities(var1, (float)var8, (float)var10, (float)var30, (float)var9, (float)var29, (float)var31); + Vec3D var33 = new Vec3D(var2, var3, var4); + + float var27; + float var28; + float var43; + for(int var34 = 0; var34 < var32.size(); ++var34) { + Entity var36 = (Entity)var32.get(var34); + var27 = var36.posX - var2; + var28 = var36.posY - var3; + float var26 = var36.posZ - var4; + var18 = MathHelper.sqrt_float(var27 * var27 + var28 * var28 + var26 * var26) / var5; + if(var18 <= 1.0F) { + var26 = var36.posX - var2; + float var39 = var36.posY - var3; + float var40 = var36.posZ - var4; + float var41 = MathHelper.sqrt_float(var26 * var26 + var39 * var39 + var40 * var40); + var26 /= var41; + var39 /= var41; + var40 /= var41; + float var42 = this.getBlockDensity(var33, var36.boundingBox); + var43 = (1.0F - var18) * var42; + var36.attackEntityFrom(var1, (int)((var43 * var43 + var43) / 2.0F * 8.0F * var5 + 1.0F)); + var36.motionX += var26 * var43; + var36.motionY += var39 * var43; + var36.motionZ += var40 * var43; + } + } + + var5 = var7; + ArrayList var35 = new ArrayList(); + var35.addAll(var6); + + for(int var37 = var35.size() - 1; var37 >= 0; --var37) { + int var38 = ((Integer)var35.get(var37)).intValue(); + var8 = var38 & 1023; + var19 = var38 >> 10 & 1023; + var20 = var38 >> 20 & 1023; + if(var8 >= 0 && var19 >= 0 && var20 >= 0 && var8 < this.width && var19 < this.height && var20 < this.length) { + var21 = this.getBlockId(var8, var19, var20); + + for(var22 = 0; var22 <= 0; ++var22) { + var43 = (float)var8 + this.random.nextFloat(); + var27 = (float)var19 + this.random.nextFloat(); + float var24 = (float)var20 + this.random.nextFloat(); + float var25 = var43 - var2; + var7 = var27 - var3; + var28 = var24 - var4; + var11 = MathHelper.sqrt_float(var25 * var25 + var7 * var7 + var28 * var28); + var25 /= var11; + var7 /= var11; + var28 /= var11; + var11 = 0.5F / (var11 / var5 + 0.1F); + var11 *= this.random.nextFloat() * this.random.nextFloat() + 0.3F; + var25 *= var11; + var7 *= var11; + var28 *= var11; + this.spawnParticle("explode", (var43 + var2) / 2.0F, (var27 + var3) / 2.0F, (var24 + var4) / 2.0F, var25, var7, var28); + this.spawnParticle("smoke", var43, var27, var24, var25, var7, var28); + } + + if(var21 > 0) { + Block.blocksList[var21].dropBlockAsItemWithChance(this, var8, var19, var20, this.getBlockMetadata(var8, var19, var20), 0.3F); + this.setBlockWithNotify(var8, var19, var20, 0); + Block.blocksList[var21].onBlockDestroyedByExplosion(this, var8, var19, var20); + } + } + } + + } + + private float getBlockDensity(Vec3D var1, AxisAlignedBB var2) { + float var3 = 1.0F / ((var2.maxX - var2.minX) * 2.0F + 1.0F); + float var4 = 1.0F / ((var2.maxY - var2.minY) * 2.0F + 1.0F); + float var5 = 1.0F / ((var2.maxZ - var2.minZ) * 2.0F + 1.0F); + int var6 = 0; + int var7 = 0; + + for(float var8 = 0.0F; var8 <= 1.0F; var8 += var3) { + for(float var9 = 0.0F; var9 <= 1.0F; var9 += var4) { + for(float var10 = 0.0F; var10 <= 1.0F; var10 += var5) { + float var11 = var2.minX + (var2.maxX - var2.minX) * var8; + float var12 = var2.minY + (var2.maxY - var2.minY) * var9; + float var13 = var2.minZ + (var2.maxZ - var2.minZ) * var10; + if(this.rayTraceBlocks(new Vec3D(var11, var12, var13), var1) == null) { + ++var6; + } + + ++var7; + } + } + } + + return (float)var6 / (float)var7; + } + + public final Entity findSubclassOf(Class var1) { + for(int var2 = 0; var2 < this.entityMap.entities.size(); ++var2) { + Entity var3 = (Entity)this.entityMap.entities.get(var2); + if(var1.isAssignableFrom(var3.getClass())) { + return var3; + } + } + + return null; + } + + public final int fluidFlowCheck(int var1, int var2, int var3, int var4, int var5) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.height && var3 < this.length) { + int var6 = var1; + int var7 = var3; + int var8 = ((var2 << 10) + var3 << 10) + var1; + byte var9 = 0; + int var20 = var9 + 1; + this.coords[0] = var1 + (var3 << 10); + int var11 = -9999; + if(var4 == Block.waterStill.blockID || var4 == Block.waterMoving.blockID) { + var11 = Block.waterSource.blockID; + } + + if(var4 == Block.lavaStill.blockID || var4 == Block.lavaMoving.blockID) { + var11 = Block.lavaSource.blockID; + } + + int var10; + boolean var12; + label170: + do { + var12 = false; + int var13 = -1; + var10 = 0; + if(++floodFillCounter == 30000) { + Arrays.fill(this.floodFillCounters, (short)0); + floodFillCounter = 1; + } + + while(true) { + int var14; + do { + if(var20 <= 0) { + ++var2; + int[] var21 = this.floodedBlocks; + this.floodedBlocks = this.coords; + this.coords = var21; + var20 = var10; + continue label170; + } + + --var20; + var14 = this.coords[var20]; + } while(this.floodFillCounters[var14] == floodFillCounter); + + var1 = var14 % 1024; + var3 = var14 / 1024; + int var15 = var3 - var7; + + for(var15 *= var15; var1 > 0 && this.floodFillCounters[var14 - 1] != floodFillCounter && (this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == var4 || this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == var5); --var14) { + --var1; + } + + if(var1 > 0 && this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == var11) { + var12 = true; + } + + boolean var16 = false; + boolean var17 = false; + + for(boolean var18 = false; var1 < this.width && this.floodFillCounters[var14] != floodFillCounter && (this.blocks[(var2 * this.length + var3) * this.width + var1] == var4 || this.blocks[(var2 * this.length + var3) * this.width + var1] == var5); ++var1) { + byte var19; + boolean var22; + if(var3 > 0) { + var19 = this.blocks[(var2 * this.length + var3 - 1) * this.width + var1]; + if(var19 == var11) { + var12 = true; + } + + var22 = this.floodFillCounters[var14 - 1024] != floodFillCounter && (var19 == var4 || var19 == var5); + if(var22 && !var16) { + this.coords[var20++] = var14 - 1024; + } + + var16 = var22; + } + + if(var3 < this.length - 1) { + var19 = this.blocks[(var2 * this.length + var3 + 1) * this.width + var1]; + if(var19 == var11) { + var12 = true; + } + + var22 = this.floodFillCounters[var14 + 1024] != floodFillCounter && (var19 == var4 || var19 == var5); + if(var22 && !var17) { + this.coords[var20++] = var14 + 1024; + } + + var17 = var22; + } + + if(var2 < this.height - 1) { + var19 = this.blocks[((var2 + 1) * this.length + var3) * this.width + var1]; + var22 = var19 == var4 || var19 == var5; + if(var22 && !var18) { + this.floodedBlocks[var10++] = var14; + } + + var18 = var22; + } + + int var23 = var1 - var6; + var23 *= var23; + var23 += var15; + if(var23 > var13) { + var13 = var23; + var8 = ((var2 << 10) + var3 << 10) + var1; + } + + this.floodFillCounters[var14++] = floodFillCounter; + } + + if(var1 < this.width && this.blocks[(var2 * this.length + var3) * this.width + var1] == var11) { + var12 = true; + } + } + } while(var10 > 0); + + if(var12) { + return -9999; + } else { + return var8; + } + } else { + return -1; + } + } + + public final int floodFill(int var1, int var2, int var3, int var4, int var5) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.height && var3 < this.length) { + if(++floodFillCounter == 30000) { + Arrays.fill(this.floodFillCounters, (short)0); + floodFillCounter = 1; + } + + byte var6 = 0; + int var11 = var6 + 1; + this.coords[0] = var1 + (var3 << 10); + + do { + int var7; + do { + if(var11 <= 0) { + return 1; + } + + --var11; + var7 = this.coords[var11]; + } while(this.floodFillCounters[var7] == floodFillCounter); + + var1 = var7 % 1024; + var3 = var7 / 1024; + if(var1 == 0 || var1 == this.width - 1 || var2 == 0 || var2 == this.height - 1 || var3 == 0 || var3 == this.length - 1) { + return 2; + } + + while(var1 > 0 && this.floodFillCounters[var7 - 1] != floodFillCounter && (this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == var4 || this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == var5)) { + --var1; + --var7; + } + + if(var1 > 0 && this.blocks[(var2 * this.length + var3) * this.width + var1 - 1] == 0) { + return 0; + } + + boolean var8 = false; + + for(boolean var9 = false; var1 < this.width && this.floodFillCounters[var7] != floodFillCounter && (this.blocks[(var2 * this.length + var3) * this.width + var1] == var4 || this.blocks[(var2 * this.length + var3) * this.width + var1] == var5); ++var1) { + if(var1 == 0 || var1 == this.width - 1) { + return 2; + } + + byte var10; + boolean var12; + if(var3 > 0) { + var10 = this.blocks[(var2 * this.length + var3 - 1) * this.width + var1]; + if(var10 == 0) { + return 0; + } + + var12 = this.floodFillCounters[var7 - 1024] != floodFillCounter && (var10 == var4 || var10 == var5); + if(var12 && !var8) { + this.coords[var11++] = var7 - 1024; + } + + var8 = var12; + } + + if(var3 < this.length - 1) { + var10 = this.blocks[(var2 * this.length + var3 + 1) * this.width + var1]; + if(var10 == 0) { + return 0; + } + + var12 = this.floodFillCounters[var7 + 1024] != floodFillCounter && (var10 == var4 || var10 == var5); + if(var12 && !var9) { + this.coords[var11++] = var7 + 1024; + } + + var9 = var12; + } + + this.floodFillCounters[var7] = floodFillCounter; + ++var7; + } + } while(var1 >= this.width || this.blocks[(var2 * this.length + var3) * this.width + var1] != 0); + + return 0; + } else { + return 0; + } + } + + public final void extinguishFire(int var1, int var2, int var3, int var4) { + if(var4 == 0) { + --var2; + } + + if(var4 == 1) { + ++var2; + } + + if(var4 == 2) { + --var3; + } + + if(var4 == 3) { + ++var3; + } + + if(var4 == 4) { + --var1; + } + + if(var4 == 5) { + ++var1; + } + + if(this.getBlockId(var1, var2, var3) == Block.fire.blockID) { + this.setBlockWithNotify(var1, var2, var3, 0); + } + + } + + public final void setBlockTileEntity(int var1, int var2, int var3, TileEntity var4) { + var4.worldObj = this; + var4.xCoord = var1; + var4.yCoord = var2; + var4.zCoord = var3; + this.map.put(Integer.valueOf(var1 + (var2 << 10) + (var3 << 10 << 10)), var4); + this.list.add(var4); + } + + public final void removeBlockTileEntity(int var1, int var2, int var3) { + this.list.remove(this.map.remove(Integer.valueOf(var1 + (var2 << 10) + (var3 << 10 << 10)))); + } + + public final TileEntity getBlockTileEntity(int var1, int var2, int var3) { + int var4 = var1 + (var2 << 10) + (var3 << 10 << 10); + TileEntity var5 = (TileEntity)this.map.get(Integer.valueOf(var4)); + if(var5 == null) { + int var6 = this.getBlockId(var1, var2, var3); + BlockContainer var7 = (BlockContainer)Block.blocksList[var6]; + var7.onBlockAdded(this, var1, var2, var3); + var5 = (TileEntity)this.map.get(Integer.valueOf(var4)); + } + + return var5; + } + + public final void spawnParticle(String var1, float var2, float var3, float var4, float var5, float var6, float var7) { + for(int var8 = 0; var8 < this.worldAccesses.size(); ++var8) { + ((IWorldAccess)this.worldAccesses.get(var8)).spawnParticle(var1, var2, var3, var4, var5, var6, var7); + } + + } + + public final void randomDisplayUpdates(int var1, int var2, int var3) { + for(int var4 = 0; var4 < 1000; ++var4) { + int var5 = var1 + this.random.nextInt(16) - this.random.nextInt(16); + int var6 = var2 + this.random.nextInt(16) - this.random.nextInt(16); + int var7 = var3 + this.random.nextInt(16) - this.random.nextInt(16); + int var8 = this.getBlockId(var5, var6, var7); + if(var8 > 0) { + Block.blocksList[var8].randomDisplayTick(this, var5, var6, var7, this.rand); + } + } + + } + + public final String debugSkylightUpdates() { + return "" + this.tickList.size() + ". L: " + this.lightUpdates.debugLightUpdates(); + } + + public final void setLevel() { + for(int var1 = 0; var1 < this.worldAccesses.size(); ++var1) { + IWorldAccess var2 = (IWorldAccess)this.worldAccesses.get(var1); + + for(int var3 = 0; var3 < this.entityMap.entities.size(); ++var3) { + var2.releaseEntitySkin((Entity)this.entityMap.entities.get(var1)); + } + } + + } + + private void updateChunkLight(int var1) { + this.lightUpdates.updateDaylightCycle(var1); + } + + public final boolean canBlockSeeTheSky(int var1, int var2, int var3) { + if(this.heightMap[var1 + var3 * this.width] <= var2) { + return true; + } else { + while(var2 < this.height) { + if(Block.opaqueCubeLookup[this.getBlockId(var1, var2, var3)]) { + return false; + } + + ++var2; + } + + return true; + } + } + + static { + for(int var0 = 0; var0 <= 15; ++var0) { + float var1 = 1.0F - (float)var0 / 15.0F; + lightBrightnessTable[var0] = (1.0F - var1) / (var1 * 3.0F + 1.0F) * 0.95F + 0.05F; + } + + floodFillCounter = 0; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/Block.java b/src/teavm/java/net/minecraft/game/level/block/Block.java new file mode 100644 index 0000000..f6a8f8d --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/Block.java @@ -0,0 +1,721 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.entity.player.InventoryPlayer; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemBlock; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; + +public class Block { + private static StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F); + private static StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F); + private static StepSound soundGravelFootstep = new StepSound("gravel", 1.0F, 1.0F); + private static StepSound soundGrassFootstep = new StepSound("grass", 1.0F, 1.0F); + private static StepSound soundStoneFootstep = new StepSound("stone", 1.0F, 1.0F); + private static StepSound soundMetalFootstep = new StepSound("stone", 1.0F, 1.5F); + private static StepSound soundGlassFootstep = new StepSoundGlass("stone", 1.0F, 1.0F); + private static StepSound soundClothFootstep = new StepSound("cloth", 1.0F, 1.0F); + private static 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 int[] lightOpacity = new int[256]; + private static boolean[] canBlockGrass = new boolean[256]; + public static final boolean[] isBlockFluid = new boolean[256]; + public static final int[] lightValue = new int[256]; + public static final Block stone; + public static final BlockGrass grass; + public static final Block dirt; + public static final Block cobblestone; + public static final Block planks; + public static final Block sapling; + public static final Block bedrock; + public static final Block waterMoving; + public static final Block waterStill; + public static final Block lavaMoving; + public static final Block lavaStill; + public static final Block sand; + public static final Block gravel; + public static final Block oreGold; + public static final Block oreIron; + public static final Block oreCoal; + public static final Block wood; + public static final Block leaves; + public static final Block sponge; + public static final Block glass; + public static final Block clothRed; + public static final Block clothOrange; + public static final Block clothYellow; + public static final Block clothChartreuse; + public static final Block clothGreen; + public static final Block clothSpringGreen; + public static final Block clothCyan; + public static final Block clothCapri; + public static final Block clothUltramarine; + public static final Block clothViolet; + public static final Block clothPurple; + public static final Block clothMagenta; + public static final Block clothRose; + public static final Block clothDarkGray; + public static final Block clothGray; + public static final Block clothWhite; + public static final BlockFlower plantYellow; + public static final BlockFlower plantRed; + public static final BlockFlower mushroomBrown; + public static final BlockFlower mushroomRed; + public static final Block blockGold; + public static final Block blockSteel; + public static final Block stairDouble; + public static final Block stairSingle; + public static final Block brick; + public static final Block tnt; + public static final Block bookShelf; + public static final Block cobblestoneMossy; + public static final Block obsidian; + public static final Block torch; + public static final BlockFire fire; + public static final Block waterSource; + public static final Block lavaSource; + public static final Block crate; + public static final Block cog; + public static final Block oreDiamond; + public static final Block blockDiamond; + public static final Block workbench; + public static final Block crops; + public static final Block tilledField; + public static final Block stoneOvenIdle; + public static final Block stoneOvenActive; + public int blockIndexInTexture; + public final int blockID; + private float hardness; + private float resistance; + public float minX; + public float minY; + public float minZ; + public float maxX; + public float maxY; + public float maxZ; + public StepSound stepSound; + public float blockParticleGravity; + public final Material material; + + protected Block(int var1, Material var2) { + this.stepSound = soundPowderFootstep; + this.blockParticleGravity = 1.0F; + if(blocksList[var1] != null) { + throw new IllegalArgumentException("Slot " + var1 + " is already occupied by " + blocksList[var1] + " when adding " + this); + } else { + this.material = 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; + canBlockGrass[var1] = this.renderAsNormalBlock(); + isBlockFluid[var1] = false; + } + } + + protected Block(int var1, int var2, Material var3) { + this(var1, var3); + this.blockIndexInTexture = var2; + } + + protected final Block setLightOpacity(int var1) { + lightOpacity[this.blockID] = var1; + return this; + } + + private Block setLightValue(float var1) { + lightValue[this.blockID] = (int)(15.0F * var1); + return this; + } + + protected final Block setResistance(float var1) { + this.resistance = var1 * 3.0F; + return this; + } + + public boolean renderAsNormalBlock() { + return true; + } + + public int getRenderType() { + return 0; + } + + protected final Block setHardness(float var1) { + this.hardness = var1; + if(this.resistance < var1 * 5.0F) { + this.resistance = var1 * 5.0F; + } + + return this; + } + + protected final void setTickOnLoad(boolean var1) { + tickOnLoad[this.blockID] = var1; + } + + protected final void setBlockBounds(float var1, float var2, float var3, float var4, float var5, float var6) { + this.minX = var1; + this.minY = var2; + this.minZ = var3; + this.maxX = var4; + this.maxY = var5; + this.maxZ = var6; + } + + public float getBlockBrightness(World var1, int var2, int var3, int var4) { + return var1.getLightBrightness(var2, var3, var4); + } + + public boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + return !var1.isBlockNormalCube(var2, var3, var4); + } + + public int getBlockTexture(World 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 final AxisAlignedBB getSelectedBoundingBoxFromPool(int var1, int var2, int var3) { + return new AxisAlignedBB((float)var1 + this.minX, (float)var2 + this.minY, (float)var3 + this.minZ, (float)var1 + this.maxX, (float)var2 + this.maxY, (float)var3 + this.maxZ); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return new AxisAlignedBB((float)var1 + this.minX, (float)var2 + this.minY, (float)var3 + this.minZ, (float)var1 + this.maxX, (float)var2 + this.maxY, (float)var3 + this.maxZ); + } + + public boolean isOpaqueCube() { + return true; + } + + 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 5; + } + + 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 final float blockStrength(EntityPlayer var1) { + if(this.hardness < 0.0F) { + return 0.0F; + } else if(!var1.canHarvestBlock(this)) { + return 1.0F / this.hardness / 100.0F; + } else { + InventoryPlayer var2 = var1.inventory; + float var4 = 1.0F; + if(var2.mainInventory[var2.currentItem] != null) { + ItemStack var5 = var2.mainInventory[var2.currentItem]; + var4 = 1.0F * var5.getItem().getStrVsBlock(this); + } + + float var6 = var4; + if(var1.isInsideOfWater()) { + var6 = var4 / 5.0F; + } + + if(!var1.onGround) { + var6 /= 5.0F; + } + + return var6 / this.hardness / 30.0F; + } + } + + public final void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) { + this.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, 1.0F); + } + + public final void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) { + int var7 = this.quantityDropped(var1.random); + + for(int var8 = 0; var8 < var7; ++var8) { + if(var1.random.nextFloat() <= var6) { + int var9 = this.idDropped(var5, var1.random); + if(var9 > 0) { + float var10 = var1.random.nextFloat() * 0.7F + 0.15F; + float var11 = var1.random.nextFloat() * 0.7F + 0.15F; + float var12 = var1.random.nextFloat() * 0.7F + 0.15F; + EntityItem var13 = new EntityItem(var1, (float)var2 + var10, (float)var3 + var11, (float)var4 + var12, new ItemStack(var9)); + var13.delayBeforeCanPickup = 10; + var1.spawnEntityInWorld(var13); + } + } + } + + } + + public final float getExplosionResistance() { + return this.resistance / 5.0F; + } + + public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + var5 = var5.addVector((float)(-var2), (float)(-var3), (float)(-var4)); + var6 = var6.addVector((float)(-var2), (float)(-var3), (float)(-var4)); + Vec3D var12 = var5.getIntermediateWithXValue(var6, this.minX); + Vec3D var7 = var5.getIntermediateWithXValue(var6, this.maxX); + Vec3D var8 = var5.getIntermediateWithYValue(var6, this.minY); + Vec3D var9 = var5.getIntermediateWithYValue(var6, this.maxY); + Vec3D var10 = var5.getIntermediateWithZValue(var6, this.minZ); + var6 = var5.getIntermediateWithZValue(var6, this.maxZ); + if(!this.isVecInsideYZBounds(var12)) { + var12 = null; + } + + if(!this.isVecInsideYZBounds(var7)) { + var7 = null; + } + + if(!this.isVecInsideXZBounds(var8)) { + var8 = null; + } + + if(!this.isVecInsideXZBounds(var9)) { + var9 = null; + } + + if(!this.isVecInsideXYBounds(var10)) { + var10 = null; + } + + if(!this.isVecInsideXYBounds(var6)) { + var6 = null; + } + + Vec3D var11 = null; + if(var12 != null) { + var11 = var12; + } + + if(var7 != null && (var11 == null || var5.distance(var7) < var5.distance(var11))) { + var11 = var7; + } + + if(var8 != null && (var11 == null || var5.distance(var8) < var5.distance(var11))) { + var11 = var8; + } + + if(var9 != null && (var11 == null || var5.distance(var9) < var5.distance(var11))) { + var11 = var9; + } + + if(var10 != null && (var11 == null || var5.distance(var10) < var5.distance(var11))) { + var11 = var10; + } + + if(var6 != null && (var11 == null || var5.distance(var6) < var5.distance(var11))) { + var11 = var6; + } + + if(var11 == null) { + return null; + } else { + byte var13 = -1; + if(var11 == var12) { + var13 = 4; + } + + if(var11 == var7) { + var13 = 5; + } + + if(var11 == var8) { + var13 = 0; + } + + if(var11 == var9) { + var13 = 1; + } + + if(var11 == var10) { + var13 = 2; + } + + if(var11 == var6) { + var13 = 3; + } + + return new MovingObjectPosition(var2, var3, var4, var13, var11.addVector((float)var2, (float)var3, (float)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.minX && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ; + } + + private boolean isVecInsideXYBounds(Vec3D var1) { + return var1 == null ? false : var1.xCoord >= this.minX && 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 getRenderBlockPass() { + return 0; + } + + public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return true; + } + + 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) { + } + + public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + } + + static { + Block var10000 = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10.0F); + StepSound var1 = soundStoneFootstep; + Block var0 = var10000; + var0.stepSound = var1; + stone = var0; + var10000 = (new BlockGrass(2)).setHardness(0.6F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + grass = (BlockGrass)var0; + var10000 = (new BlockDirt(3, 2)).setHardness(0.5F); + var1 = soundGravelFootstep; + var0 = var10000; + var0.stepSound = var1; + dirt = var0; + var10000 = (new Block(4, 16, Material.rock)).setHardness(2.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + cobblestone = var0; + var10000 = (new Block(5, 4, Material.wood)).setHardness(2.0F).setResistance(5.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + planks = var0; + var10000 = (new BlockSapling(6, 15)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + sapling = var0; + var10000 = (new Block(7, 17, Material.rock)).setHardness(-1.0F).setResistance(6000000.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + bedrock = var0; + waterMoving = (new BlockFlowing(8, Material.water)).setHardness(100.0F).setLightOpacity(3); + waterStill = (new BlockStationary(9, Material.water)).setHardness(100.0F).setLightOpacity(3); + lavaMoving = (new BlockFlowing(10, Material.lava)).setHardness(0.0F).setLightValue(1.0F).setLightOpacity(255); + lavaStill = (new BlockStationary(11, Material.lava)).setHardness(100.0F).setLightValue(1.0F).setLightOpacity(255); + var10000 = (new BlockSand(12, 18)).setHardness(0.5F); + var1 = soundSandFootstep; + var0 = var10000; + var0.stepSound = var1; + sand = var0; + var10000 = (new BlockGravel(13, 19)).setHardness(0.6F); + var1 = soundGravelFootstep; + var0 = var10000; + var0.stepSound = var1; + gravel = var0; + var10000 = (new BlockOre(14, 32)).setHardness(3.0F).setResistance(5.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + oreGold = var0; + var10000 = (new BlockOre(15, 33)).setHardness(3.0F).setResistance(5.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + oreIron = var0; + var10000 = (new BlockOre(16, 34)).setHardness(3.0F).setResistance(5.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + oreCoal = var0; + var10000 = (new BlockLog(17)).setHardness(2.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + wood = var0; + var10000 = (new BlockLeaves(18, 52)).setHardness(0.2F).setLightOpacity(1); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + leaves = var0; + var10000 = (new BlockSponge(19)).setHardness(0.6F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + sponge = var0; + var10000 = (new BlockGlass(20, 49, Material.glass, false)).setHardness(0.3F); + var1 = soundGlassFootstep; + var0 = var10000; + var0.stepSound = var1; + glass = var0; + var10000 = (new Block(21, 64, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothRed = var0; + var10000 = (new Block(22, 65, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothOrange = var0; + var10000 = (new Block(23, 66, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothYellow = var0; + var10000 = (new Block(24, 67, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothChartreuse = var0; + var10000 = (new Block(25, 68, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothGreen = var0; + var10000 = (new Block(26, 69, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothSpringGreen = var0; + var10000 = (new Block(27, 70, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothCyan = var0; + var10000 = (new Block(28, 71, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothCapri = var0; + var10000 = (new Block(29, 72, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothUltramarine = var0; + var10000 = (new Block(30, 73, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothViolet = var0; + var10000 = (new Block(31, 74, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothPurple = var0; + var10000 = (new Block(32, 75, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothMagenta = var0; + var10000 = (new Block(33, 76, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothRose = var0; + var10000 = (new Block(34, 77, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothDarkGray = var0; + var10000 = (new Block(35, 78, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothGray = var0; + var10000 = (new Block(36, 79, Material.cloth)).setHardness(0.8F); + var1 = soundClothFootstep; + var0 = var10000; + var0.stepSound = var1; + clothWhite = var0; + var10000 = (new BlockFlower(37, 13)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + plantYellow = (BlockFlower)var0; + var10000 = (new BlockFlower(38, 12)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + plantRed = (BlockFlower)var0; + var10000 = (new BlockMushroom(39, 29)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + mushroomBrown = (BlockFlower)var0.setLightValue(2.0F / 16.0F); + var10000 = (new BlockMushroom(40, 28)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + mushroomRed = (BlockFlower)var0; + var10000 = (new BlockOreBlock(41, 39)).setHardness(3.0F).setResistance(10.0F); + var1 = soundMetalFootstep; + var0 = var10000; + var0.stepSound = var1; + blockGold = var0; + var10000 = (new BlockOreBlock(42, 38)).setHardness(5.0F).setResistance(10.0F); + var1 = soundMetalFootstep; + var0 = var10000; + var0.stepSound = var1; + blockSteel = var0; + var10000 = (new BlockStep(43, true)).setHardness(2.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + stairDouble = var0; + var10000 = (new BlockStep(44, false)).setHardness(2.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + stairSingle = var0; + var10000 = (new Block(45, 7, Material.rock)).setHardness(2.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + brick = var0; + var10000 = (new BlockTNT(46, 8)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + tnt = var0; + var10000 = (new BlockBookshelf(47, 35)).setHardness(1.5F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + bookShelf = var0; + var10000 = (new Block(48, 36, Material.rock)).setHardness(2.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + cobblestoneMossy = var0; + var10000 = (new BlockStone(49, 37)).setHardness(10.0F).setResistance(10.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + obsidian = var0; + var10000 = (new BlockTorch(50, 80)).setHardness(0.0F).setLightValue(14.0F / 16.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + torch = var0; + var10000 = (new BlockFire(51, 31)).setHardness(0.0F).setLightValue(1.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + fire = (BlockFire)var0; + var10000 = (new BlockSource(52, waterMoving.blockID)).setHardness(0.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + waterSource = var0; + var10000 = (new BlockSource(53, lavaMoving.blockID)).setHardness(0.0F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + lavaSource = var0; + var10000 = (new BlockChest(54)).setHardness(2.5F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + crate = var0; + var10000 = (new BlockGears(55, 62)).setHardness(0.5F); + var1 = soundMetalFootstep; + var0 = var10000; + var0.stepSound = var1; + cog = var0; + var10000 = (new BlockOre(56, 50)).setHardness(3.0F).setResistance(5.0F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + oreDiamond = var0; + var10000 = (new BlockOreBlock(57, 40)).setHardness(5.0F).setResistance(10.0F); + var1 = soundMetalFootstep; + var0 = var10000; + var0.stepSound = var1; + blockDiamond = var0; + var10000 = (new BlockWorkbench(58)).setHardness(2.5F); + var1 = soundWoodFootstep; + var0 = var10000; + var0.stepSound = var1; + workbench = var0; + var10000 = (new BlockCrops(59, 88)).setHardness(0.0F); + var1 = soundGrassFootstep; + var0 = var10000; + var0.stepSound = var1; + crops = var0; + var10000 = (new BlockFarmland(60)).setHardness(0.6F); + var1 = soundGravelFootstep; + var0 = var10000; + var0.stepSound = var1; + tilledField = var0; + var10000 = (new BlockFurnace(61, false)).setHardness(3.5F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + stoneOvenIdle = var0; + var10000 = (new BlockFurnace(62, true)).setHardness(3.5F); + var1 = soundStoneFootstep; + var0 = var10000; + var0.stepSound = var1; + stoneOvenActive = var0.setLightValue(14.0F / 16.0F); + + for(int var2 = 0; var2 < 256; ++var2) { + if(blocksList[var2] != null) { + Item.itemsList[var2] = new ItemBlock(var2 - 256); + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockBookshelf.java b/src/teavm/java/net/minecraft/game/level/block/BlockBookshelf.java new file mode 100644 index 0000000..a97dcf0 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockBookshelf.java @@ -0,0 +1,18 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.material.Material; + +public final class BlockBookshelf extends Block { + public BlockBookshelf(int var1, int var2) { + super(47, 35, Material.wood); + } + + public final int getBlockTextureFromSide(int var1) { + return var1 <= 1 ? 4 : this.blockIndexInTexture; + } + + public final int quantityDropped(Random var1) { + return 0; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockBreakable.java b/src/teavm/java/net/minecraft/game/level/block/BlockBreakable.java new file mode 100644 index 0000000..6ec44f7 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockBreakable.java @@ -0,0 +1,22 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public class BlockBreakable extends Block { + private boolean localFlag; + + protected BlockBreakable(int var1, int var2, Material var3, boolean var4) { + super(var1, var2, var3); + this.localFlag = var4; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockId(var2, var3, var4); + return !this.localFlag && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockChest.java b/src/teavm/java/net/minecraft/game/level/block/BlockChest.java new file mode 100644 index 0000000..f64bfe4 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockChest.java @@ -0,0 +1,204 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.IInventory; +import net.minecraft.game.InventoryLargeChest; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.tileentity.TileEntity; +import net.minecraft.game.level.block.tileentity.TileEntityChest; +import net.minecraft.game.level.material.Material; + +public final class BlockChest extends BlockContainer { + private Random random = new Random(); + + protected BlockChest(int var1) { + super(54, Material.wood); + this.blockIndexInTexture = 26; + } + + public final int getBlockTexture(World 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 final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture - 1 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture)); + } + + public final 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 final 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.random.nextFloat() * 0.8F + 0.1F; + float var9 = this.random.nextFloat() * 0.8F + 0.1F; + float var10 = this.random.nextFloat() * 0.8F + 0.1F; + + while(var7.stackSize > 0) { + int var11 = this.random.nextInt(21) + 10; + if(var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(var1, (float)var2 + var8, (float)var3 + var9, (float)var4 + var10, new ItemStack(var7.itemID, var11, var7.itemDamage)); + var12.motionX = (float)this.random.nextGaussian() * 0.05F; + var12.motionY = (float)this.random.nextGaussian() * 0.05F + 0.2F; + var12.motionZ = (float)this.random.nextGaussian() * 0.05F; + var1.spawnEntityInWorld(var12); + } + } + } + + super.onBlockRemoval(var1, var2, var3, var4); + } + + public final boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + Object var6 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4); + if(var1.isBlockNormalCube(var2, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.isBlockNormalCube(var2 - 1, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.isBlockNormalCube(var2 + 1, var3 + 1, var4)) { + return true; + } else if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.isBlockNormalCube(var2, var3 + 1, var4 - 1)) { + return true; + } else if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.isBlockNormalCube(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 final TileEntity getBlockEntity() { + return new TileEntityChest(); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockContainer.java b/src/teavm/java/net/minecraft/game/level/block/BlockContainer.java new file mode 100644 index 0000000..cf5b7be --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockContainer.java @@ -0,0 +1,23 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.tileentity.TileEntity; +import net.minecraft.game.level.material.Material; + +public abstract class BlockContainer extends Block { + protected BlockContainer(int var1, Material var2) { + super(var1, var2); + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + var1.setBlockTileEntity(var2, var3, var4, this.getBlockEntity()); + } + + 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 getBlockEntity(); +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockCrops.java b/src/teavm/java/net/minecraft/game/level/block/BlockCrops.java new file mode 100644 index 0000000..8a0d69c --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockCrops.java @@ -0,0 +1,111 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.entity.misc.EntityItem; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; + +public final class BlockCrops extends BlockFlower { + protected BlockCrops(int var1, int var2) { + super(59, 88); + this.blockIndexInTexture = 88; + this.setTickOnLoad(true); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + protected final boolean canThisPlantGrowOnThisBlockID(int var1) { + return var1 == Block.tilledField.blockID; + } + + public final 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) { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 < 7) { + int var11 = var4; + int var10 = var3; + int var9 = var2; + World var8 = var1; + float var12 = 1.0F; + int var13 = var1.getBlockId(var2, var3, var4 - 1); + int var14 = var1.getBlockId(var2, var3, var4 + 1); + int var15 = var1.getBlockId(var2 - 1, var3, var4); + int var16 = var1.getBlockId(var2 + 1, var3, var4); + int var17 = var1.getBlockId(var2 - 1, var3, var4 - 1); + int var18 = var1.getBlockId(var2 + 1, var3, var4 - 1); + int var19 = var1.getBlockId(var2 + 1, var3, var4 + 1); + int var20 = var1.getBlockId(var2 - 1, var3, var4 + 1); + boolean var23 = var15 == this.blockID || var16 == this.blockID; + boolean var22 = var13 == this.blockID || var14 == this.blockID; + boolean var7 = var17 == this.blockID || var18 == this.blockID || var19 == this.blockID || var20 == this.blockID; + + for(var14 = var2 - 1; var14 <= var9 + 1; ++var14) { + for(var16 = var11 - 1; var16 <= var11 + 1; ++var16) { + var17 = var8.getBlockId(var14, var10 - 1, var16); + float var24 = 0.0F; + if(var17 == Block.tilledField.blockID) { + var24 = 1.0F; + if(var8.getBlockMetadata(var14, var10 - 1, var16) > 0) { + var24 = 3.0F; + } + } + + if(var14 != var9 || var16 != var11) { + var24 /= 4.0F; + } + + var12 += var24; + } + } + + if(var7 || var23 && var22) { + var12 /= 2.0F; + } + + if(var5.nextInt((int)(100.0F / var12)) == 0) { + int var21 = var6 + 1; + var1.setBlockMetadata(var2, var3, var4, var21); + } + } + } + + } + + public final int getBlockTextureFromSideAndMetadata(int var1, int var2) { + if(var2 < 0) { + var2 = 7; + } + + return this.blockIndexInTexture + var2; + } + + public final int getRenderType() { + return 6; + } + + public final void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + super.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5); + + for(int var6 = 0; var6 < 3; ++var6) { + if(var1.random.nextInt(15) <= var5) { + float var7 = var1.random.nextFloat() * 0.7F + 0.15F; + float var8 = var1.random.nextFloat() * 0.7F + 0.15F; + float var9 = var1.random.nextFloat() * 0.7F + 0.15F; + EntityItem var10 = new EntityItem(var1, (float)var2 + var7, (float)var3 + var8, (float)var4 + var9, new ItemStack(Item.seeds)); + var10.delayBeforeCanPickup = 10; + var1.spawnEntityInWorld(var10); + } + } + + } + + public final int idDropped(int var1, Random var2) { + System.out.println("Get resource: " + var1); + return var1 == 7 ? Item.wheat.shiftedIndex : -1; + } + + public final int quantityDropped(Random var1) { + return 1; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockDirt.java b/src/teavm/java/net/minecraft/game/level/block/BlockDirt.java new file mode 100644 index 0000000..ed5e942 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockDirt.java @@ -0,0 +1,9 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.material.Material; + +public final class BlockDirt extends Block { + protected BlockDirt(int var1, int var2) { + super(3, 2, Material.ground); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFarmland.java b/src/teavm/java/net/minecraft/game/level/block/BlockFarmland.java new file mode 100644 index 0000000..84a4b31 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFarmland.java @@ -0,0 +1,123 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class BlockFarmland extends Block { + protected BlockFarmland(int var1) { + super(60, Material.ground); + this.blockIndexInTexture = 87; + this.setTickOnLoad(true); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 15.0F / 16.0F, 1.0F); + this.setLightOpacity(255); + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return new AxisAlignedBB((float)var1, (float)var2, (float)var3, (float)(var1 + 1), (float)(var2 + 1), (float)(var3 + 1)); + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public final int getBlockTextureFromSideAndMetadata(int var1, int var2) { + return var1 == 1 && var2 > 0 ? this.blockIndexInTexture - 1 : (var1 == 1 ? this.blockIndexInTexture : 2); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(var5.nextInt(5) == 0) { + int var8 = var4; + int var7 = var3; + int var6 = var2; + World var12 = var1; + int var9 = var2 - 4; + + int var10; + int var11; + boolean var10000; + label69: + while(true) { + if(var9 > var6 + 4) { + var10000 = false; + break; + } + + for(var10 = var7; var10 <= var7 + 1; ++var10) { + for(var11 = var8 - 4; var11 <= var8 + 4; ++var11) { + if(var12.getBlockMaterial(var9, var10, var11) == Material.water) { + var10000 = true; + break label69; + } + } + } + + ++var9; + } + + if(var10000) { + var1.setBlockMetadata(var2, var3, var4, 7); + return; + } + + byte var13 = var1.getBlockMetadata(var2, var3, var4); + if(var13 > 0) { + var1.setBlockMetadata(var2, var3, var4, var13 - 1); + return; + } + + var8 = var4; + var7 = var3; + var6 = var2; + var12 = var1; + var10 = var2; + + label49: + while(true) { + if(var10 > var6) { + var10000 = false; + break; + } + + for(var11 = var8; var11 <= var8; ++var11) { + if(var12.getBlockId(var10, var7 + 1, var11) == Block.crops.blockID) { + var10000 = true; + break label49; + } + } + + ++var10; + } + + if(!var10000) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + } + + } + + public final void onEntityWalking(World var1, int var2, int var3, int var4) { + if(var1.random.nextInt(4) == 0) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4); + if(var6.isSolid()) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + + } + + public final int idDropped(int var1, Random var2) { + return Block.dirt.idDropped(0, var2); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFire.java b/src/teavm/java/net/minecraft/game/level/block/BlockFire.java new file mode 100644 index 0000000..7a057b2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFire.java @@ -0,0 +1,272 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class BlockFire extends Block { + private int[] chanceToEncourageFire = new int[256]; + private int[] abilityToCatchFire = new int[256]; + + protected BlockFire(int var1, int var2) { + super(51, 31, 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); + + for(var1 = 0; var1 < 16; ++var1) { + this.setBurnRate(Block.clothRed.blockID + var1, 30, 60); + } + + this.setTickOnLoad(true); + } + + private void setBurnRate(int var1, int var2, int var3) { + this.chanceToEncourageFire[var1] = var2; + this.abilityToCatchFire[var1] = var3; + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public final int getRenderType() { + return 3; + } + + public final int quantityDropped(Random var1) { + return 0; + } + + public final int tickRate() { + return 20; + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 < 15) { + var1.setBlockMetadata(var2, var3, var4, var6 + 1); + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + if(!this.canNeighborCatchFire(var1, var2, var3, var4)) { + if(!var1.isBlockNormalCube(var2, var3 - 1, var4) || var6 > 3) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + + } else if(!this.canBlockCatchFire(var1, var2, var3 - 1, var4) && var6 == 15 && var5.nextInt(4) == 0) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + if(var6 % 5 == 0 && var6 > 5) { + 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, 100, var5); + this.tryToCatchBlockOnFire(var1, var2, var3 + 1, var4, 200, var5); + this.tryToCatchBlockOnFire(var1, var2, var3, var4 - 1, 300, var5); + this.tryToCatchBlockOnFire(var1, var2, var3, var4 + 1, 300, var5); + + for(int var16 = var2 - 1; var16 <= var2 + 1; ++var16) { + for(int var7 = var4 - 1; var7 <= var4 + 1; ++var7) { + for(int var8 = var3 - 1; var8 <= var3 + 4; ++var8) { + if(var16 != var2 || var8 != var3 || var7 != var4) { + int var9 = 100; + if(var8 > var3 + 1) { + var9 = 100 + (var8 - (var3 + 1)) * 100; + } + + int var10000; + if(var1.getBlockId(var16, var8, var7) != 0) { + var10000 = 0; + } else { + int var15 = this.getChanceToEncourageFire(var1, var16 + 1, var8, var7, 0); + var15 = this.getChanceToEncourageFire(var1, var16 - 1, var8, var7, var15); + var15 = this.getChanceToEncourageFire(var1, var16, var8 - 1, var7, var15); + var15 = this.getChanceToEncourageFire(var1, var16, var8 + 1, var7, var15); + var15 = this.getChanceToEncourageFire(var1, var16, var8, var7 - 1, var15); + var15 = this.getChanceToEncourageFire(var1, var16, var8, var7 + 1, var15); + var10000 = var15; + } + + int var10 = var10000; + if(var10 > 0 && var5.nextInt(var9) <= var10) { + var1.setBlockWithNotify(var16, var8, var7, 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 canNeighborCatchFire(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))))); + } + + public final boolean isCollidable() { + return false; + } + + public final boolean canBlockCatchFire(World var1, int var2, int var3, int var4) { + return this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)] > 0; + } + + private 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 final boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockNormalCube(var2, var3 - 1, var4) || this.canNeighborCatchFire(var1, var2, var3, var4); + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && !this.canNeighborCatchFire(var1, var2, var3, var4)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && !this.canNeighborCatchFire(var1, var2, var3, var4)) { + var1.setBlockWithNotify(var2, var3, var4, 0); + } else { + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + } + + public final boolean getChanceOfNeighborsEncouragingFire(int var1) { + return this.chanceToEncourageFire[var1] > 0; + } + + public final void fireSpread(World var1, int var2, int var3, int var4) { + boolean var5 = false; + var5 = fireCheck(var1, var2, var3 + 1, var4); + if(!var5) { + var5 = fireCheck(var1, var2 - 1, var3, var4); + } + + if(!var5) { + var5 = fireCheck(var1, var2 + 1, var3, var4); + } + + if(!var5) { + var5 = fireCheck(var1, var2, var3, var4 - 1); + } + + if(!var5) { + var5 = fireCheck(var1, var2, var3, var4 + 1); + } + + if(!var5) { + var5 = fireCheck(var1, var2, var3 - 1, var4); + } + + if(!var5) { + var1.setBlockWithNotify(var2, var3, var4, Block.fire.blockID); + } + + } + + public final void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + int var6; + float var7; + float var8; + float var9; + if(!var1.isBlockNormalCube(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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + } + + 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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + } + + 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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + } + + 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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + } + + 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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + } + + } 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", var7, var8, var9, 0.0F, 0.0F, 0.0F); + } + + } + } + + private static boolean fireCheck(World var0, int var1, int var2, int var3) { + int var4 = var0.getBlockId(var1, var2, var3); + if(var4 == Block.fire.blockID) { + return true; + } else if(var4 == 0) { + var0.setBlockWithNotify(var1, var2, var3, Block.fire.blockID); + return true; + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFlower.java b/src/teavm/java/net/minecraft/game/level/block/BlockFlower.java new file mode 100644 index 0000000..9a88615 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFlower.java @@ -0,0 +1,60 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public class BlockFlower extends Block { + protected BlockFlower(int var1, int var2) { + super(var1, Material.plants); + this.blockIndexInTexture = var2; + this.setTickOnLoad(true); + this.setBlockBounds(0.3F, 0.0F, 0.3F, 0.7F, 0.6F, 0.7F); + } + + public final 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 final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + super.onNeighborBlockChange(var1, var2, var3, var4, var5); + this.checkFlowerChange(var1, var2, var3, var4); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.checkFlowerChange(var1, var2, var3, var4); + } + + private void checkFlowerChange(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.getBlockLightValue(var2, var3, var4) >= 4 && var1.canBlockSeeTheSky(var2, var3, var4)) && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4)); + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return 1; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFlowing.java b/src/teavm/java/net/minecraft/game/level/block/BlockFlowing.java new file mode 100644 index 0000000..6e5ea43 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFlowing.java @@ -0,0 +1,241 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class BlockFlowing extends BlockFluid { + private int stillId1; + private int movingId1; + private Random rand = new Random(); + private int[] liquidIntArray = new int[]{0, 1, 2, 3}; + + protected BlockFlowing(int var1, Material var2) { + super(var1, var2); + this.blockIndexInTexture = 14; + if(var2 == Material.lava) { + this.blockIndexInTexture = 30; + } + + Block.isBlockFluid[var1] = true; + this.movingId1 = var1; + this.stillId1 = var1 + 1; + this.setBlockBounds(0.01F, -0.09F, 0.01F, 1.01F, 0.90999997F, 1.01F); + this.setTickOnLoad(true); + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId1); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.update(var1, var2, var3, var4, 0); + } + + public final boolean update(World var1, int var2, int var3, int var4, int var5) { + boolean var10 = false; + boolean var6 = this.canFlow(var1, var2 - 1, var3, var4) || this.canFlow(var1, var2 + 1, var3, var4) || this.canFlow(var1, var2, var3, var4 - 1) || this.canFlow(var1, var2, var3, var4 + 1); + int var7; + int var8; + int var9; + if(var6 && var1.getBlockMaterial(var2, var3 - 1, var4) == this.material) { + var5 = var1.floodFill(var2, var3 - 1, var4, this.movingId1, this.stillId1); + if(var5 == 1) { + var7 = var1.fluidFlowCheck(var2, var3, var4, this.movingId1, this.stillId1); + if(var7 != -9999) { + if(var7 < 0) { + return false; + } + + var8 = var7 % 1024; + var7 >>= 10; + var9 = var7 % 1024; + var7 >>= 10; + var2 = var7 % 1024; + var1.setBlockWithNotify(var8, var2, var9, 0); + return false; + } + + return false; + } + } + + var10 = this.liquidSpread2(var1, var2, var3, var4, var2, var3 - 1, var4); + + for(var7 = 0; var7 < 4; ++var7) { + var8 = this.rand.nextInt(4 - var7) + var7; + var9 = this.liquidIntArray[var7]; + this.liquidIntArray[var7] = this.liquidIntArray[var8]; + this.liquidIntArray[var8] = var9; + if(this.liquidIntArray[var7] == 0 && !var10) { + var10 = this.liquidSpread2(var1, var2, var3, var4, var2 - 1, var3, var4); + } + + if(this.liquidIntArray[var7] == 1 && !var10) { + var10 = this.liquidSpread2(var1, var2, var3, var4, var2 + 1, var3, var4); + } + + if(this.liquidIntArray[var7] == 2 && !var10) { + var10 = this.liquidSpread2(var1, var2, var3, var4, var2, var3, var4 - 1); + } + + if(this.liquidIntArray[var7] == 3 && !var10) { + var10 = this.liquidSpread2(var1, var2, var3, var4, var2, var3, var4 + 1); + } + } + + if(!var10 && var6) { + if(this.rand.nextInt(3) == 0) { + if(this.rand.nextInt(3) == 0) { + var10 = false; + + for(var7 = 0; var7 < 4; ++var7) { + var8 = this.rand.nextInt(4 - var7) + var7; + var9 = this.liquidIntArray[var7]; + this.liquidIntArray[var7] = this.liquidIntArray[var8]; + this.liquidIntArray[var8] = var9; + if(this.liquidIntArray[var7] == 0 && !var10) { + var10 = this.liquidSpread(var1, var2, var3, var4, var2 - 1, var3, var4); + } + + if(this.liquidIntArray[var7] == 1 && !var10) { + var10 = this.liquidSpread(var1, var2, var3, var4, var2 + 1, var3, var4); + } + + if(this.liquidIntArray[var7] == 2 && !var10) { + var10 = this.liquidSpread(var1, var2, var3, var4, var2, var3, var4 - 1); + } + + if(this.liquidIntArray[var7] == 3 && !var10) { + var10 = this.liquidSpread(var1, var2, var3, var4, var2, var3, var4 + 1); + } + } + } else if(this.material == Material.lava) { + var1.setBlockWithNotify(var2, var3, var4, Block.stone.blockID); + } else { + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + return false; + } else { + if(this.material == Material.water) { + var10 |= extinguishFireLava(var1, var2 - 1, var3, var4); + var10 |= extinguishFireLava(var1, var2 + 1, var3, var4); + var10 |= extinguishFireLava(var1, var2, var3, var4 - 1); + var10 |= extinguishFireLava(var1, var2, var3, var4 + 1); + } + + if(this.material == Material.lava) { + var10 |= flow(var1, var2 - 1, var3, var4); + var10 |= flow(var1, var2 + 1, var3, var4); + var10 |= flow(var1, var2, var3, var4 - 1); + var10 |= flow(var1, var2, var3, var4 + 1); + } + + if(!var10) { + var1.setTileNoUpdate(var2, var3, var4, this.stillId1); + } else { + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId1); + } + + return var10; + } + } + + private boolean liquidSpread(World var1, int var2, int var3, int var4, int var5, int var6, int var7) { + if(this.canFlow(var1, var5, var6, var7)) { + var1.setBlockWithNotify(var5, var6, var7, this.blockID); + var1.scheduleBlockUpdate(var5, var6, var7, this.blockID); + return true; + } else { + return false; + } + } + + private boolean liquidSpread2(World var1, int var2, int var3, int var4, int var5, int var6, int var7) { + if(!this.canFlow(var1, var5, var6, var7)) { + return false; + } else { + var2 = var1.fluidFlowCheck(var2, var3, var4, this.movingId1, this.stillId1); + if(var2 != -9999) { + if(var2 < 0) { + return false; + } + + var3 = var2 % 1024; + var2 >>= 10; + var4 = var2 % 1024; + var2 >>= 10; + var2 %= 1024; + if((var2 > var6 || !this.canFlow(var1, var5, var6 - 1, var7)) && var2 <= var6 && var3 != 0 && var3 != var1.width - 1 && var4 != 0 && var4 != var1.length - 1) { + return false; + } + + var1.setBlockWithNotify(var3, var2, var4, 0); + } + + var1.setBlockWithNotify(var5, var6, var7, this.blockID); + var1.scheduleBlockUpdate(var5, var6, var7, this.blockID); + return true; + } + } + + public final boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + if(var2 >= 0 && var3 >= 0 && var4 >= 0 && var2 < var1.width && var4 < var1.length) { + int var6 = var1.getBlockId(var2, var3, var4); + return var6 != this.movingId1 && var6 != this.stillId1 ? (var5 != 1 || var1.getBlockId(var2 - 1, var3, var4) != 0 && var1.getBlockId(var2 + 1, var3, var4) != 0 && var1.getBlockId(var2, var3, var4 - 1) != 0 && var1.getBlockId(var2, var3, var4 + 1) != 0 ? super.shouldSideBeRendered(var1, var2, var3, var4, var5) : true) : false; + } else { + return false; + } + } + + public final boolean isCollidable() { + return false; + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + } + + public final int tickRate() { + return this.material == Material.lava ? 25 : 5; + } + + public final int quantityDropped(Random var1) { + return 0; + } + + public final int getRenderBlockPass() { + return this.material == Material.water ? 1 : 0; + } + + private static boolean extinguishFireLava(World var0, int var1, int var2, int var3) { + if(var0.getBlockId(var1, var2, var3) == Block.fire.blockID) { + var0.setBlockWithNotify(var1, var2, var3, 0); + return true; + } else if(var0.getBlockId(var1, var2, var3) != Block.lavaMoving.blockID && var0.getBlockId(var1, var2, var3) != Block.lavaStill.blockID) { + return false; + } else { + var0.setBlockWithNotify(var1, var2, var3, Block.stone.blockID); + return true; + } + } + + private static boolean flow(World var0, int var1, int var2, int var3) { + if(Block.fire.getChanceOfNeighborsEncouragingFire(var0.getBlockId(var1, var2, var3))) { + Block.fire.fireSpread(var0, var1, var2, var3); + return true; + } else { + return false; + } + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFluid.java b/src/teavm/java/net/minecraft/game/level/block/BlockFluid.java new file mode 100644 index 0000000..60d50b2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFluid.java @@ -0,0 +1,215 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public class BlockFluid extends Block { + protected int stillId; + protected int movingId; + + protected BlockFluid(int var1, Material var2) { + super(var1, var2); + this.blockIndexInTexture = 14; + if(var2 == Material.lava) { + this.blockIndexInTexture = 30; + } + + Block.isBlockFluid[var1] = true; + this.movingId = var1; + this.stillId = var1 + 1; + this.setBlockBounds(0.01F, -0.09F, 0.01F, 1.01F, 0.90999997F, 1.01F); + this.setTickOnLoad(true); + this.setResistance(2.0F); + } + + public final int getBlockTextureFromSide(int var1) { + return this.material == Material.lava ? this.blockIndexInTexture : (var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture : this.blockIndexInTexture + 32)); + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public void onBlockAdded(World var1, int var2, int var3, int var4) { + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId); + } + + public void updateTick(World var1, int var2, int var3, int var4, Random var5) { + this.update(var1, var2, var3, var4, 0); + } + + public boolean update(World var1, int var2, int var3, int var4, int var5) { + boolean var7 = false; + + boolean var6; + do { + --var3; + if(!this.canFlow(var1, var2, var3, var4)) { + break; + } + + var6 = var1.setBlockWithNotify(var2, var3, var4, this.movingId); + if(var6) { + var7 = true; + } + } while(var6 && this.material != Material.lava); + + ++var3; + if(this.material == Material.water || !var7) { + var7 |= this.flow(var1, var2 - 1, var3, var4); + var7 |= this.flow(var1, var2 + 1, var3, var4); + var7 |= this.flow(var1, var2, var3, var4 - 1); + var7 |= this.flow(var1, var2, var3, var4 + 1); + } + + if(this.material == Material.lava) { + var7 |= extinguishFireLava(var1, var2 - 1, var3, var4); + var7 |= extinguishFireLava(var1, var2 + 1, var3, var4); + var7 |= extinguishFireLava(var1, var2, var3, var4 - 1); + var7 |= extinguishFireLava(var1, var2, var3, var4 + 1); + } + + if(!var7) { + var1.setTileNoUpdate(var2, var3, var4, this.stillId); + } else { + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId); + } + + return var7; + } + + protected final boolean canFlow(World var1, int var2, int var3, int var4) { + if(!var1.getBlockMaterial(var2, var3, var4).liquidSolidCheck()) { + return false; + } else { + if(this.material == Material.water) { + for(int var5 = var2 - 2; var5 <= var2 + 2; ++var5) { + for(int var6 = var3 - 2; var6 <= var3 + 2; ++var6) { + for(int var7 = var4 - 2; var7 <= var4 + 2; ++var7) { + if(var1.getBlockId(var5, var6, var7) == Block.sponge.blockID) { + return false; + } + } + } + } + } + + return true; + } + } + + private static boolean extinguishFireLava(World var0, int var1, int var2, int var3) { + if(Block.fire.getChanceOfNeighborsEncouragingFire(var0.getBlockId(var1, var2, var3))) { + Block.fire.fireSpread(var0, var1, var2, var3); + return true; + } else { + return false; + } + } + + private boolean flow(World var1, int var2, int var3, int var4) { + if(!this.canFlow(var1, var2, var3, var4)) { + return false; + } else { + boolean var5 = var1.setBlockWithNotify(var2, var3, var4, this.movingId); + if(var5) { + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId); + } + + return false; + } + } + + public final float getBlockBrightness(World var1, int var2, int var3, int var4) { + return this.material == Material.lava ? 100.0F : var1.getLightBrightness(var2, var3, var4); + } + + public boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + if(var2 >= 0 && var3 >= 0 && var4 >= 0 && var2 < var1.width && var4 < var1.length) { + int var6 = var1.getBlockId(var2, var3, var4); + return var6 != this.movingId && var6 != this.stillId ? (var5 != 1 || var1.getBlockId(var2 - 1, var3, var4) != 0 && var1.getBlockId(var2 + 1, var3, var4) != 0 && var1.getBlockId(var2, var3, var4 - 1) != 0 && var1.getBlockId(var2, var3, var4 + 1) != 0 ? super.shouldSideBeRendered(var1, var2, var3, var4, var5) : true) : false; + } else { + return false; + } + } + + public boolean isCollidable() { + return false; + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public boolean isOpaqueCube() { + return false; + } + + public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(var5 != 0) { + Material var6 = Block.blocksList[var5].material; + if(this.material == Material.water && var6 == Material.lava || var6 == Material.water && this.material == Material.lava) { + var1.setBlockWithNotify(var2, var3, var4, Block.stone.blockID); + } + } + + var1.scheduleBlockUpdate(var2, var3, var4, this.blockID); + } + + public int tickRate() { + return this.material == Material.lava ? 25 : 5; + } + + public int quantityDropped(Random var1) { + return 0; + } + + public int getRenderBlockPass() { + return this.material == Material.water ? 1 : 0; + } + + public final void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.material == Material.lava && var1.getBlockMaterial(var2, var3 + 1, var4) == Material.air && !var1.isBlockNormalCube(var2, var3 + 1, var4) && var5.nextInt(100) == 0) { + float var6 = (float)var2 + var5.nextFloat(); + float var7 = (float)var3 + this.maxY; + float var8 = (float)var4 + var5.nextFloat(); + var1.spawnParticle("lava", var6, var7, var8, 0.0F, 0.0F, 0.0F); + } + + if(this.material == Material.water) { + int var9; + if(liquidAirCheck(var1, var2 + 1, var3, var4)) { + for(var9 = 0; var9 < 4; ++var9) { + var1.spawnParticle("splash", (float)(var2 + 1) + 2.0F / 16.0F, (float)var3, (float)var4 + var5.nextFloat(), 0.0F, 0.0F, 0.0F); + } + } + + if(liquidAirCheck(var1, var2 - 1, var3, var4)) { + for(var9 = 0; var9 < 4; ++var9) { + var1.spawnParticle("splash", (float)var2 - 2.0F / 16.0F, (float)var3, (float)var4 + var5.nextFloat(), 0.0F, 0.0F, 0.0F); + } + } + + if(liquidAirCheck(var1, var2, var3, var4 + 1)) { + for(var9 = 0; var9 < 4; ++var9) { + var1.spawnParticle("splash", (float)var2 + var5.nextFloat(), (float)var3, (float)(var4 + 1) + 2.0F / 16.0F, 0.0F, 0.0F, 0.0F); + } + } + + if(liquidAirCheck(var1, var2, var3, var4 - 1)) { + for(var9 = 0; var9 < 4; ++var9) { + var1.spawnParticle("splash", (float)var2 + var5.nextFloat(), (float)var3, (float)var4 - 2.0F / 16.0F, 0.0F, 0.0F, 0.0F); + } + } + } + + } + + private static boolean liquidAirCheck(World var0, int var1, int var2, int var3) { + Material var4 = var0.getBlockMaterial(var1, var2, var3); + Material var5 = var0.getBlockMaterial(var1, var2 - 1, var3); + return !var4.getIsSolid() && !var4.getIsLiquid() ? var5.getIsSolid() || var5.getIsLiquid() : false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockFurnace.java b/src/teavm/java/net/minecraft/game/level/block/BlockFurnace.java new file mode 100644 index 0000000..f17b593 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockFurnace.java @@ -0,0 +1,104 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.tileentity.TileEntity; +import net.minecraft.game.level.block.tileentity.TileEntityFurnace; +import net.minecraft.game.level.material.Material; + +public final 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 final void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + setDefaultDirection(var1, var2, var3, var4); + } + + private static void setDefaultDirection(World var0, int var1, int var2, int var3) { + int var4 = var0.getBlockId(var1, var2, var3 - 1); + int var5 = var0.getBlockId(var1, var2, var3 + 1); + int var6 = var0.getBlockId(var1 - 1, var2, var3); + int var7 = var0.getBlockId(var1 + 1, var2, var3); + byte var8 = 3; + if(Block.opaqueCubeLookup[var4] && !Block.opaqueCubeLookup[var5]) { + var8 = 3; + } + + if(Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var4]) { + var8 = 2; + } + + if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var7]) { + var8 = 5; + } + + if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var6]) { + var8 = 4; + } + + var0.setBlockMetadata(var1, var2, var3, var8); + } + + public final int getBlockTexture(World 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 { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 == 0) { + setDefaultDirection(var1, var2, var3, var4); + var6 = var1.getBlockMetadata(var2, var3, var4); + } + + return var5 != var6 ? this.blockIndexInTexture : (this.isActive ? this.blockIndexInTexture + 16 : this.blockIndexInTexture - 1); + } + } + + public final void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + if(this.isActive) { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + float var7 = (float)var2 + 0.5F; + float var8 = (float)var3 + var5.nextFloat() * 6.0F / 16.0F; + float var9 = (float)var4 + 0.5F; + float var10 = var5.nextFloat() * 0.6F - 0.3F; + if(var6 == 4) { + var1.spawnParticle("smoke", var7 - 0.52F, var8, var9 + var10, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var7 - 0.52F, var8, var9 + var10, 0.0F, 0.0F, 0.0F); + } else if(var6 == 5) { + var1.spawnParticle("smoke", var7 + 0.52F, var8, var9 + var10, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var7 + 0.52F, var8, var9 + var10, 0.0F, 0.0F, 0.0F); + } else if(var6 == 2) { + var1.spawnParticle("smoke", var7 + var10, var8, var9 - 0.52F, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var7 + var10, var8, var9 - 0.52F, 0.0F, 0.0F, 0.0F); + } else { + if(var6 == 3) { + var1.spawnParticle("smoke", var7 + var10, var8, var9 + 0.52F, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var7 + var10, var8, var9 + 0.52F, 0.0F, 0.0F, 0.0F); + } + + } + } + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? Block.stone.blockID : (var1 == 0 ? Block.stone.blockID : (var1 == 3 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture)); + } + + public final 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; + } + + protected final TileEntity getBlockEntity() { + return new TileEntityFurnace(); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockGears.java b/src/teavm/java/net/minecraft/game/level/block/BlockGears.java new file mode 100644 index 0000000..c43f929 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockGears.java @@ -0,0 +1,35 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; + +public final class BlockGears extends Block { + protected BlockGears(int var1, int var2) { + super(55, 62, Material.circuits); + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public final int getRenderType() { + return 5; + } + + public final int quantityDropped(Random var1) { + return 1; + } + + public final boolean isCollidable() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockGlass.java b/src/teavm/java/net/minecraft/game/level/block/BlockGlass.java new file mode 100644 index 0000000..4129c7d --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockGlass.java @@ -0,0 +1,14 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.material.Material; + +public final class BlockGlass extends BlockBreakable { + public BlockGlass(int var1, int var2, Material var3, boolean var4) { + super(20, 49, var3, false); + } + + public final int quantityDropped(Random var1) { + return 0; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockGrass.java b/src/teavm/java/net/minecraft/game/level/block/BlockGrass.java new file mode 100644 index 0000000..cef63b8 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockGrass.java @@ -0,0 +1,39 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockGrass extends Block { + protected BlockGrass(int var1) { + super(2, Material.ground); + this.blockIndexInTexture = 3; + this.setTickOnLoad(true); + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? 0 : (var1 == 0 ? 2 : 3); + } + + public final 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) { + var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID); + } + } else { + if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) { + var2 = var2 + var5.nextInt(3) - 1; + var3 = var3 + var5.nextInt(5) - 3; + var4 = var4 + var5.nextInt(3) - 1; + if(var1.getBlockId(var2, var3, var4) == Block.dirt.blockID && var1.getBlockLightValue(var2, var3 + 1, var4) >= 4 && !var1.getBlockMaterial(var2, var3 + 1, var4).getCanBlockGrass()) { + var1.setBlockWithNotify(var2, var3, var4, Block.grass.blockID); + } + } + + } + } + + public final int idDropped(int var1, Random var2) { + return Block.dirt.idDropped(0, var2); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockGravel.java b/src/teavm/java/net/minecraft/game/level/block/BlockGravel.java new file mode 100644 index 0000000..5d47e77 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockGravel.java @@ -0,0 +1,14 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.item.Item; + +public final class BlockGravel extends BlockSand { + public BlockGravel(int var1, int var2) { + super(13, 19); + } + + public final int idDropped(int var1, Random var2) { + return var2.nextInt(10) == 0 ? Item.flint.shiftedIndex : this.blockID; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockLeaves.java b/src/teavm/java/net/minecraft/game/level/block/BlockLeaves.java new file mode 100644 index 0000000..fba0763 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockLeaves.java @@ -0,0 +1,37 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockLeaves extends BlockLeavesBase { + protected BlockLeaves(int var1, int var2) { + super(18, 52, Material.leaves, true); + this.setTickOnLoad(true); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + if(!var1.getBlockMaterial(var2, var3 - 1, var4).isSolid()) { + for(int var8 = var2 - 2; var8 <= var2 + 2; ++var8) { + for(int var6 = var3 - 1; var6 <= var3; ++var6) { + for(int var7 = var4 - 2; var7 <= var4 + 2; ++var7) { + if(var1.getBlockId(var8, var6, var7) == Block.wood.blockID) { + return; + } + } + } + } + + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + public final int quantityDropped(Random var1) { + return var1.nextInt(10) == 0 ? 1 : 0; + } + + public final int idDropped(int var1, Random var2) { + return Block.sapling.blockID; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockLeavesBase.java b/src/teavm/java/net/minecraft/game/level/block/BlockLeavesBase.java new file mode 100644 index 0000000..14ece31 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockLeavesBase.java @@ -0,0 +1,21 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public class BlockLeavesBase extends Block { + private boolean graphicsLevel = true; + + protected BlockLeavesBase(int var1, int var2, Material var3, boolean var4) { + super(var1, var2, var3); + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + int var6 = var1.getBlockId(var2, var3, var4); + return !this.graphicsLevel && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockLog.java b/src/teavm/java/net/minecraft/game/level/block/BlockLog.java new file mode 100644 index 0000000..423529f --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockLog.java @@ -0,0 +1,23 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.material.Material; + +public final class BlockLog extends Block { + protected BlockLog(int var1) { + super(17, Material.wood); + this.blockIndexInTexture = 20; + } + + public final int quantityDropped(Random var1) { + return 1; + } + + public final int idDropped(int var1, Random var2) { + return Block.wood.blockID; + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? 21 : (var1 == 0 ? 21 : 20); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockMushroom.java b/src/teavm/java/net/minecraft/game/level/block/BlockMushroom.java new file mode 100644 index 0000000..71e4fc7 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockMushroom.java @@ -0,0 +1,25 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.World; + +public final class BlockMushroom extends BlockFlower { + protected BlockMushroom(int var1, int var2) { + super(var1, var2); + this.setBlockBounds(0.3F, 0.0F, 0.3F, 0.7F, 0.4F, 0.7F); + } + + protected final boolean canThisPlantGrowOnThisBlockID(int var1) { + return Block.opaqueCubeLookup[var1]; + } + + public final boolean canBlockStay(World var1, int var2, int var3, int var4) { + if(var1.getBlockLightValue(var2, var3, var4) <= 13) { + var2 = var1.getBlockId(var2, var3 - 1, var4); + if(Block.opaqueCubeLookup[var2]) { + return true; + } + } + + return false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockOre.java b/src/teavm/java/net/minecraft/game/level/block/BlockOre.java new file mode 100644 index 0000000..61c0e0a --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockOre.java @@ -0,0 +1,19 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.item.Item; +import net.minecraft.game.level.material.Material; + +public final class BlockOre extends Block { + public BlockOre(int var1, int var2) { + super(var1, var2, Material.rock); + } + + public final 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 final int quantityDropped(Random var1) { + return 1; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockOreBlock.java b/src/teavm/java/net/minecraft/game/level/block/BlockOreBlock.java new file mode 100644 index 0000000..8d46faf --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockOreBlock.java @@ -0,0 +1,14 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.material.Material; + +public final class BlockOreBlock extends Block { + public BlockOreBlock(int var1, int var2) { + super(var1, Material.iron); + this.blockIndexInTexture = var2; + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockSand.java b/src/teavm/java/net/minecraft/game/level/block/BlockSand.java new file mode 100644 index 0000000..0d86bfd --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockSand.java @@ -0,0 +1,60 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public class BlockSand extends Block { + public BlockSand(int var1, int var2) { + super(var1, var2, Material.sand); + new Random(); + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + this.tryToFall(var1, var2, var3, var4); + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + this.tryToFall(var1, var2, var3, var4); + } + + private void tryToFall(World var1, int var2, int var3, int var4) { + int var5 = var3; + + while(true) { + int var8 = var5 - 1; + int var6 = var1.getBlockId(var2, var8, var4); + boolean var10000; + if(var6 == 0) { + var10000 = true; + } else if(var6 == Block.fire.blockID) { + var10000 = true; + } else { + Material var10 = Block.blocksList[var6].material; + var10000 = var10 == Material.water ? true : var10 == Material.lava; + } + + if(!var10000 || var5 < 0) { + if(var5 < 0) { + var1.setTileNoUpdate(var2, var3, var4, 0); + } + + if(var5 != var3) { + var6 = var1.getBlockId(var2, var5, var4); + if(var6 > 0 && Block.blocksList[var6].material != Material.air) { + var1.setTileNoUpdate(var2, var5, var4, 0); + } + + var1.swap(var2, var3, var4, var2, var5, var4); + } + + return; + } + + --var5; + if(var1.getBlockId(var2, var5, var4) == Block.fire.blockID) { + var1.setBlock(var2, var5, var4, 0); + } + } + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockSapling.java b/src/teavm/java/net/minecraft/game/level/block/BlockSapling.java new file mode 100644 index 0000000..504ab9a --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockSapling.java @@ -0,0 +1,28 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; + +public final class BlockSapling extends BlockFlower { + protected BlockSapling(int var1, int var2) { + super(6, 15); + this.setBlockBounds(10.0F * 0.01F, 0.0F, 10.0F * 0.01F, 0.9F, 0.8F, 0.9F); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9 && var5.nextInt(5) == 0) { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + if(var6 < 15) { + var1.setBlockMetadata(var2, var3, var4, var6 + 1); + return; + } + + var1.setTileNoUpdate(var2, var3, var4, 0); + if(!var1.growTrees(var2, var3, var4)) { + var1.setTileNoUpdate(var2, var3, var4, this.blockID); + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockSource.java b/src/teavm/java/net/minecraft/game/level/block/BlockSource.java new file mode 100644 index 0000000..a1a5982 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockSource.java @@ -0,0 +1,55 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockSource extends Block { + private int fluid; + + protected BlockSource(int var1, int var2) { + super(var1, Block.blocksList[var2].blockIndexInTexture, Material.water); + this.fluid = var2; + this.setTickOnLoad(true); + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + super.onBlockAdded(var1, var2, var3, var4); + if(var1.getBlockId(var2 - 1, var3, var4) == 0) { + var1.setBlockWithNotify(var2 - 1, var3, var4, this.fluid); + } + + if(var1.getBlockId(var2 + 1, var3, var4) == 0) { + var1.setBlockWithNotify(var2 + 1, var3, var4, this.fluid); + } + + if(var1.getBlockId(var2, var3, var4 - 1) == 0) { + var1.setBlockWithNotify(var2, var3, var4 - 1, this.fluid); + } + + if(var1.getBlockId(var2, var3, var4 + 1) == 0) { + var1.setBlockWithNotify(var2, var3, var4 + 1, this.fluid); + } + + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockId(var2 - 1, var3, var4) == 0) { + var1.setBlockWithNotify(var2 - 1, var3, var4, this.fluid); + } + + if(var1.getBlockId(var2 + 1, var3, var4) == 0) { + var1.setBlockWithNotify(var2 + 1, var3, var4, this.fluid); + } + + if(var1.getBlockId(var2, var3, var4 - 1) == 0) { + var1.setBlockWithNotify(var2, var3, var4 - 1, this.fluid); + } + + if(var1.getBlockId(var2, var3, var4 + 1) == 0) { + var1.setBlockWithNotify(var2, var3, var4 + 1, this.fluid); + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockSponge.java b/src/teavm/java/net/minecraft/game/level/block/BlockSponge.java new file mode 100644 index 0000000..50be912 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockSponge.java @@ -0,0 +1,35 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockSponge extends Block { + protected BlockSponge(int var1) { + super(19, Material.sponge); + this.blockIndexInTexture = 48; + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + for(int var5 = var2 - 2; var5 <= var2 + 2; ++var5) { + for(int var6 = var3 - 2; var6 <= var3 + 2; ++var6) { + for(int var7 = var4 - 2; var7 <= var4 + 2; ++var7) { + if(var1.isWater(var5, var6, var7)) { + var1.setBlock(var5, var6, var7, 0); + } + } + } + } + + } + + public final void onBlockRemoval(World var1, int var2, int var3, int var4) { + for(int var5 = var2 - 2; var5 <= var2 + 2; ++var5) { + for(int var6 = var3 - 2; var6 <= var3 + 2; ++var6) { + for(int var7 = var4 - 2; var7 <= var4 + 2; ++var7) { + var1.notifyBlocksOfNeighborChange(var5, var6, var7, var1.getBlockId(var5, var6, var7)); + } + } + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockStationary.java b/src/teavm/java/net/minecraft/game/level/block/BlockStationary.java new file mode 100644 index 0000000..ce310fe --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockStationary.java @@ -0,0 +1,58 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockStationary extends BlockFluid { + protected BlockStationary(int var1, Material var2) { + super(var1, var2); + this.movingId = var1 - 1; + this.stillId = var1; + this.setTickOnLoad(false); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + boolean var6 = false; + if(this.canFlow(var1, var2, var3 - 1, var4)) { + var6 = true; + } + + if(!var6 && this.canFlow(var1, var2 - 1, var3, var4)) { + var6 = true; + } + + if(!var6 && this.canFlow(var1, var2 + 1, var3, var4)) { + var6 = true; + } + + if(!var6 && this.canFlow(var1, var2, var3, var4 - 1)) { + var6 = true; + } + + if(!var6 && this.canFlow(var1, var2, var3, var4 + 1)) { + var6 = true; + } + + if(var5 != 0) { + Material var7 = Block.blocksList[var5].material; + if(this.material == Material.water && var7 == Material.lava || var7 == Material.water && this.material == Material.lava) { + var1.setBlockWithNotify(var2, var3, var4, Block.stone.blockID); + return; + } + } + + if(Block.fire.getChanceOfNeighborsEncouragingFire(var5)) { + var6 = true; + } + + if(var6) { + var1.setTileNoUpdate(var2, var3, var4, this.movingId); + var1.scheduleBlockUpdate(var2, var3, var4, this.movingId); + } + + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockStep.java b/src/teavm/java/net/minecraft/game/level/block/BlockStep.java new file mode 100644 index 0000000..8682a4b --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockStep.java @@ -0,0 +1,57 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockStep extends Block { + private boolean blockType; + + public BlockStep(int var1, boolean var2) { + super(var1, 6, Material.rock); + this.blockType = var2; + if(!var2) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + this.setLightOpacity(255); + } + + public final int getBlockTextureFromSide(int var1) { + return var1 <= 1 ? 6 : 5; + } + + public final boolean isOpaqueCube() { + return this.blockType; + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this == Block.stairSingle) { + } + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + if(this != Block.stairSingle) { + super.onBlockAdded(var1, var2, var3, var4); + } + + int var5 = var1.getBlockId(var2, var3 - 1, var4); + if(var5 == stairSingle.blockID) { + var1.setBlockWithNotify(var2, var3, var4, 0); + var1.setBlockWithNotify(var2, var3 - 1, var4, Block.stairDouble.blockID); + } + + } + + public final int idDropped(int var1, Random var2) { + return Block.stairSingle.blockID; + } + + public final boolean renderAsNormalBlock() { + return this.blockType; + } + + public final boolean shouldSideBeRendered(World var1, int var2, int var3, int var4, int var5) { + return var5 == 1 ? true : (!super.shouldSideBeRendered(var1, var2, var3, var4, var5) ? false : (var5 == 0 ? true : var1.getBlockId(var2, var3, var4) != this.blockID)); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockStone.java b/src/teavm/java/net/minecraft/game/level/block/BlockStone.java new file mode 100644 index 0000000..1bdbe74 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockStone.java @@ -0,0 +1,14 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.material.Material; + +public final class BlockStone extends Block { + public BlockStone(int var1, int var2) { + super(var1, var2, Material.rock); + } + + public final int idDropped(int var1, Random var2) { + return Block.cobblestone.blockID; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockTNT.java b/src/teavm/java/net/minecraft/game/level/block/BlockTNT.java new file mode 100644 index 0000000..bbfd755 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockTNT.java @@ -0,0 +1,31 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.entity.misc.EntityTNTPrimed; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockTNT extends Block { + public BlockTNT(int var1, int var2) { + super(46, 8, Material.tnt); + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 0 ? this.blockIndexInTexture + 2 : (var1 == 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture); + } + + public final int quantityDropped(Random var1) { + return 0; + } + + public final void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) { + EntityTNTPrimed var5 = new EntityTNTPrimed(var1, (float)var2 + 0.5F, (float)var3 + 0.5F, (float)var4 + 0.5F); + var5.fuse = var1.random.nextInt(var5.fuse / 4) + var5.fuse / 8; + var1.spawnEntityInWorld(var5); + } + + public final void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) { + EntityTNTPrimed var6 = new EntityTNTPrimed(var1, (float)var2 + 0.5F, (float)var3 + 0.5F, (float)var4 + 0.5F); + var1.spawnEntityInWorld(var6); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockTorch.java b/src/teavm/java/net/minecraft/game/level/block/BlockTorch.java new file mode 100644 index 0000000..42a576b --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockTorch.java @@ -0,0 +1,166 @@ +package net.minecraft.game.level.block; + +import java.util.Random; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; +import net.minecraft.game.physics.AxisAlignedBB; +import net.minecraft.game.physics.MovingObjectPosition; +import net.minecraft.game.physics.Vec3D; + +public final class BlockTorch extends Block { + protected BlockTorch(int var1, int var2) { + super(50, 80, Material.circuits); + this.setTickOnLoad(true); + } + + public final AxisAlignedBB getCollisionBoundingBoxFromPool(int var1, int var2, int var3) { + return null; + } + + public final boolean isOpaqueCube() { + return false; + } + + public final boolean renderAsNormalBlock() { + return false; + } + + public final int getRenderType() { + return 2; + } + + public final boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) { + return var1.isBlockNormalCube(var2 - 1, var3, var4) ? true : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : (var1.isBlockNormalCube(var2, var3, var4 + 1) ? true : var1.isBlockNormalCube(var2, var3 - 1, var4)))); + } + + public final void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) { + byte var6 = var1.getBlockMetadata(var2, var3, var4); + if(var5 == 1 && var1.isBlockNormalCube(var2, var3 - 1, var4)) { + var6 = 5; + } + + if(var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1)) { + var6 = 4; + } + + if(var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1)) { + var6 = 3; + } + + if(var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4)) { + var6 = 2; + } + + if(var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)) { + var6 = 1; + } + + var1.setBlockMetadata(var2, var3, var4, var6); + } + + public final void updateTick(World var1, int var2, int var3, int var4, Random var5) { + super.updateTick(var1, var2, var3, var4, var5); + if(var1.getBlockMetadata(var2, var3, var4) == 0) { + this.onBlockAdded(var1, var2, var3, var4); + } + + } + + public final void onBlockAdded(World var1, int var2, int var3, int var4) { + if(var1.isBlockNormalCube(var2 - 1, var3, var4)) { + var1.setBlockMetadata(var2, var3, var4, 1); + } else if(var1.isBlockNormalCube(var2 + 1, var3, var4)) { + var1.setBlockMetadata(var2, var3, var4, 2); + } else if(var1.isBlockNormalCube(var2, var3, var4 - 1)) { + var1.setBlockMetadata(var2, var3, var4, 3); + } else if(var1.isBlockNormalCube(var2, var3, var4 + 1)) { + var1.setBlockMetadata(var2, var3, var4, 4); + } else if(var1.isBlockNormalCube(var2, var3 - 1, var4)) { + var1.setBlockMetadata(var2, var3, var4, 5); + } + + this.dropTorchIfCantStay(var1, var2, var3, var4); + } + + public final void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) { + if(this.dropTorchIfCantStay(var1, var2, var3, var4)) { + byte var7 = var1.getBlockMetadata(var2, var3, var4); + boolean var6 = false; + if(!var1.isBlockNormalCube(var2 - 1, var3, var4) && var7 == 1) { + var6 = true; + } + + if(!var1.isBlockNormalCube(var2 + 1, var3, var4) && var7 == 2) { + var6 = true; + } + + if(!var1.isBlockNormalCube(var2, var3, var4 - 1) && var7 == 3) { + var6 = true; + } + + if(!var1.isBlockNormalCube(var2, var3, var4 + 1) && var7 == 4) { + var6 = true; + } + + if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && var7 == 5) { + var6 = true; + } + + if(var6) { + this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4)); + var1.setBlockWithNotify(var2, var3, var4, 0); + } + } + + } + + private boolean dropTorchIfCantStay(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 final MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) { + byte var7 = var1.getBlockMetadata(var2, var3, var4); + if(var7 == 1) { + this.setBlockBounds(0.0F, 0.2F, 0.35F, 0.3F, 0.8F, 0.65F); + } else if(var7 == 2) { + this.setBlockBounds(0.7F, 0.2F, 0.35F, 1.0F, 0.8F, 0.65F); + } else if(var7 == 3) { + this.setBlockBounds(0.35F, 0.2F, 0.0F, 0.65F, 0.8F, 0.3F); + } else if(var7 == 4) { + this.setBlockBounds(0.35F, 0.2F, 0.7F, 0.65F, 0.8F, 1.0F); + } else { + this.setBlockBounds(0.4F, 0.0F, 0.4F, 0.6F, 0.6F, 0.6F); + } + + return super.collisionRayTrace(var1, var2, var3, var4, var5, var6); + } + + public final void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) { + byte var9 = var1.getBlockMetadata(var2, var3, var4); + float var6 = (float)var2 + 0.5F; + float var7 = (float)var3 + 0.7F; + float var8 = (float)var4 + 0.5F; + if(var9 == 1) { + var1.spawnParticle("smoke", var6 - 0.27F, var7 + 0.22F, var8, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var6 - 0.27F, var7 + 0.22F, var8, 0.0F, 0.0F, 0.0F); + } else if(var9 == 2) { + var1.spawnParticle("smoke", var6 + 0.27F, var7 + 0.22F, var8, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var6 + 0.27F, var7 + 0.22F, var8, 0.0F, 0.0F, 0.0F); + } else if(var9 == 3) { + var1.spawnParticle("smoke", var6, var7 + 0.22F, var8 - 0.27F, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var6, var7 + 0.22F, var8 - 0.27F, 0.0F, 0.0F, 0.0F); + } else if(var9 == 4) { + var1.spawnParticle("smoke", var6, var7 + 0.22F, var8 + 0.27F, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var6, var7 + 0.22F, var8 + 0.27F, 0.0F, 0.0F, 0.0F); + } else { + var1.spawnParticle("smoke", var6, var7, var8, 0.0F, 0.0F, 0.0F); + var1.spawnParticle("flame", var6, var7, var8, 0.0F, 0.0F, 0.0F); + } + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/BlockWorkbench.java b/src/teavm/java/net/minecraft/game/level/block/BlockWorkbench.java new file mode 100644 index 0000000..64dfb85 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/BlockWorkbench.java @@ -0,0 +1,21 @@ +package net.minecraft.game.level.block; + +import net.minecraft.game.entity.player.EntityPlayer; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class BlockWorkbench extends Block { + protected BlockWorkbench(int var1) { + super(58, Material.wood); + this.blockIndexInTexture = 59; + } + + public final int getBlockTextureFromSide(int var1) { + return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? Block.planks.getBlockTextureFromSide(0) : (var1 != 2 && var1 != 4 ? this.blockIndexInTexture : this.blockIndexInTexture + 1)); + } + + public final boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) { + var5.displayWorkbenchGUI(); + return true; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/StepSound.java b/src/teavm/java/net/minecraft/game/level/block/StepSound.java new file mode 100644 index 0000000..f266928 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/StepSound.java @@ -0,0 +1,21 @@ +package net.minecraft.game.level.block; + +public class StepSound { + private String sound; + public final float soundVolume; + public final float soundPitch; + + public StepSound(String var1, float var2, float var3) { + this.sound = var1; + this.soundVolume = var2; + this.soundPitch = var3; + } + + public String stepSoundDir() { + return "step." + this.sound; + } + + public final String stepSoundDir2() { + return "step." + this.sound; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/StepSoundGlass.java b/src/teavm/java/net/minecraft/game/level/block/StepSoundGlass.java new file mode 100644 index 0000000..cea2361 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/StepSoundGlass.java @@ -0,0 +1,11 @@ +package net.minecraft.game.level.block; + +final class StepSoundGlass extends StepSound { + StepSoundGlass(String var1, float var2, float var3) { + super(var1, 1.0F, 1.0F); + } + + public final String stepSoundDir() { + return "random.glass"; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/StepSoundSand.java b/src/teavm/java/net/minecraft/game/level/block/StepSoundSand.java new file mode 100644 index 0000000..d51d877 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/StepSoundSand.java @@ -0,0 +1,11 @@ +package net.minecraft.game.level.block; + +final class StepSoundSand extends StepSound { + StepSoundSand(String var1, float var2, float var3) { + super(var1, 1.0F, 1.0F); + } + + public final String stepSoundDir() { + return "step.gravel"; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntity.java b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntity.java new file mode 100644 index 0000000..1feae51 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntity.java @@ -0,0 +1,20 @@ +package net.minecraft.game.level.block.tileentity; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.minecraft.game.level.World; + +public class TileEntity { + public World worldObj; + public int xCoord; + public int yCoord; + public int zCoord; + + public void readFromNBT(NBTTagCompound var1) { + } + + public void writeToNBT(NBTTagCompound var1) { + } + + public void updateEntity() { + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityChest.java b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityChest.java new file mode 100644 index 0000000..7c77a68 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityChest.java @@ -0,0 +1,84 @@ +package net.minecraft.game.level.block.tileentity; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.PeytonPlayz585.nbt.NBTTagList; +import net.minecraft.game.IInventory; +import net.minecraft.game.item.ItemStack; + +public final class TileEntityChest extends TileEntity implements IInventory { + private ItemStack[] chestContents = new ItemStack[36]; + + public final int getSizeInventory() { + return 27; + } + + public final ItemStack getStackInSlot(int var1) { + return this.chestContents[var1]; + } + + public final ItemStack decrStackSize(int var1, int var2) { + if(this.chestContents[var1] != null) { + ItemStack var3; + if(this.chestContents[var1].stackSize <= var2) { + var3 = this.chestContents[var1]; + this.chestContents[var1] = null; + return var3; + } else { + var3 = this.chestContents[var1].splitStack(var2); + if(this.chestContents[var1].stackSize == 0) { + this.chestContents[var1] = null; + } + + return var3; + } + } else { + return null; + } + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + this.chestContents[var1] = var2; + if(var2 != null && var2.stackSize > 64) { + var2.stackSize = 64; + } + + } + + public final String getInvName() { + return "Chest"; + } + + public final void readFromNBT(NBTTagCompound var1) { + NBTTagList var5 = var1.getTagList("Items"); + this.chestContents = new ItemStack[27]; + + for(int var2 = 0; var2 < var5.tagCount(); ++var2) { + NBTTagCompound var3 = (NBTTagCompound)var5.tagAt(var2); + int var4 = var3.getByte("Slot") & 255; + if(var4 >= 0 && var4 < this.chestContents.length) { + this.chestContents[var4] = new ItemStack(var3); + } + } + + } + + public final void writeToNBT(NBTTagCompound var1) { + var1.setString("id", "Chest"); + NBTTagList var2 = new NBTTagList(); + + for(int var3 = 0; var3 < this.chestContents.length; ++var3) { + if(this.chestContents[var3] != null) { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.chestContents[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Items", var2); + } + + public final int getInventoryStackLimit() { + return 64; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityFurnace.java b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityFurnace.java new file mode 100644 index 0000000..b3d74c3 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/block/tileentity/TileEntityFurnace.java @@ -0,0 +1,192 @@ +package net.minecraft.game.level.block.tileentity; + +import net.PeytonPlayz585.nbt.NBTTagCompound; +import net.PeytonPlayz585.nbt.NBTTagList; +import net.minecraft.game.IInventory; +import net.minecraft.game.item.Item; +import net.minecraft.game.item.ItemStack; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.material.Material; + +public final class TileEntityFurnace extends TileEntity implements IInventory { + private ItemStack[] furnaceItemStacks = new ItemStack[3]; + private int furnaceBurnTime = 0; + private int currentItemBurnTime = 0; + private int furnaceCookTime = 0; + + public final int getSizeInventory() { + return this.furnaceItemStacks.length; + } + + public final ItemStack getStackInSlot(int var1) { + return this.furnaceItemStacks[var1]; + } + + public final ItemStack decrStackSize(int var1, int var2) { + if(this.furnaceItemStacks[var1] != null) { + ItemStack var3; + if(this.furnaceItemStacks[var1].stackSize <= var2) { + var3 = this.furnaceItemStacks[var1]; + this.furnaceItemStacks[var1] = null; + return var3; + } else { + var3 = this.furnaceItemStacks[var1].splitStack(var2); + if(this.furnaceItemStacks[var1].stackSize == 0) { + this.furnaceItemStacks[var1] = null; + } + + return var3; + } + } else { + return null; + } + } + + public final void setInventorySlotContents(int var1, ItemStack var2) { + this.furnaceItemStacks[var1] = var2; + if(var2 != null && var2.stackSize > 64) { + var2.stackSize = 64; + } + + } + + public final String getInvName() { + return "Chest"; + } + + public final void readFromNBT(NBTTagCompound var1) { + super.readFromNBT(var1); + NBTTagList var2 = var1.getTagList("Items"); + this.furnaceItemStacks = new ItemStack[this.furnaceItemStacks.length]; + + for(int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + byte var5 = var4.getByte("Slot"); + if(var5 >= 0 && var5 < this.furnaceItemStacks.length) { + this.furnaceItemStacks[var5] = new ItemStack(var4); + } + } + + this.furnaceBurnTime = var1.getShort("BurnTime"); + this.furnaceCookTime = var1.getShort("CookTime"); + this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]); + System.out.println("Lit: " + this.furnaceBurnTime + "/" + this.currentItemBurnTime); + } + + public final void writeToNBT(NBTTagCompound var1) { + super.writeToNBT(var1); + var1.setShort("BurnTime", (short)this.furnaceBurnTime); + var1.setShort("CookTime", (short)this.furnaceCookTime); + var1.setString("id", "Furnace"); + NBTTagList var2 = new NBTTagList(); + + for(int var3 = 0; var3 < this.furnaceItemStacks.length; ++var3) { + if(this.furnaceItemStacks[var3] != null) { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.furnaceItemStacks[var3].writeToNBT(var4); + var2.setTag(var4); + } + } + + var1.setTag("Items", var2); + } + + public final int getInventoryStackLimit() { + return 64; + } + + public final int getCookProgressScaled(int var1) { + return this.furnaceCookTime * 24 / 200; + } + + public final int getBurnTimeRemainingScaled(int var1) { + return this.furnaceBurnTime * 12 / this.currentItemBurnTime; + } + + public final boolean isBurning() { + return this.furnaceBurnTime > 0; + } + + public final void updateEntity() { + boolean var1 = this.furnaceBurnTime > 0; + if(this.furnaceBurnTime > 0) { + --this.furnaceBurnTime; + } + + if(this.furnaceBurnTime == 0 && this.canSmelt()) { + this.currentItemBurnTime = this.furnaceBurnTime = getItemBurnTime(this.furnaceItemStacks[1]); + if(this.furnaceBurnTime > 0 && this.furnaceItemStacks[1] != null) { + --this.furnaceItemStacks[1].stackSize; + if(this.furnaceItemStacks[1].stackSize == 0) { + this.furnaceItemStacks[1] = null; + } + } + } + + if(this.isBurning() && this.canSmelt()) { + ++this.furnaceCookTime; + if(this.furnaceCookTime == 200) { + this.furnaceCookTime = 0; + if(this.canSmelt()) { + int var3 = smeltItem(this.furnaceItemStacks[0].getItem().shiftedIndex); + if(this.furnaceItemStacks[2] == null) { + this.furnaceItemStacks[2] = new ItemStack(var3, 1); + } else if(this.furnaceItemStacks[2].itemID == var3) { + ++this.furnaceItemStacks[2].stackSize; + } + + --this.furnaceItemStacks[0].stackSize; + if(this.furnaceItemStacks[0].stackSize <= 0) { + this.furnaceItemStacks[0] = null; + } + } + } + } else { + this.furnaceCookTime = 0; + } + + if(var1 != this.furnaceBurnTime > 0) { + boolean var10000 = this.furnaceBurnTime > 0; + int var5 = this.zCoord; + int var4 = this.yCoord; + int var8 = this.xCoord; + World var9 = this.worldObj; + boolean var2 = var10000; + byte var6 = var9.getBlockMetadata(var8, var4, var5); + TileEntity var7 = var9.getBlockTileEntity(var8, var4, var5); + if(var2) { + var9.setBlockWithNotify(var8, var4, var5, Block.stoneOvenActive.blockID); + } else { + var9.setBlockWithNotify(var8, var4, var5, Block.stoneOvenIdle.blockID); + } + + var9.setBlockMetadata(var8, var4, var5, var6); + var9.setBlockTileEntity(var8, var4, var5, var7); + } + + } + + private boolean canSmelt() { + if(this.furnaceItemStacks[0] == null) { + return false; + } else { + int var1 = smeltItem(this.furnaceItemStacks[0].getItem().shiftedIndex); + return var1 < 0 ? false : (this.furnaceItemStacks[2] == null ? true : (this.furnaceItemStacks[2].itemID != var1 ? false : (this.furnaceItemStacks[2].stackSize < 64 ? true : this.furnaceItemStacks[2].stackSize < Item.itemsList[var1].getItemStackLimit()))); + } + } + + private static int smeltItem(int var0) { + return var0 == Block.oreIron.blockID ? Item.ingotIron.shiftedIndex : (var0 == Block.oreGold.blockID ? Item.ingotGold.shiftedIndex : (var0 == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : (var0 == Block.sand.blockID ? Block.glass.blockID : (var0 == Item.porkRaw.shiftedIndex ? Item.porkCooked.shiftedIndex : (var0 == Block.cobblestone.blockID ? Block.stone.blockID : -1))))); + } + + private static int getItemBurnTime(ItemStack var0) { + if(var0 == null) { + return 0; + } else { + int var1 = var0.getItem().shiftedIndex; + return var1 < 256 && Block.blocksList[var1].material == Material.wood ? 300 : (var1 == Item.stick.shiftedIndex ? 100 : (var1 == Item.coal.shiftedIndex ? 1600 : 0)); + } + } +} diff --git a/src/teavm/java/net/minecraft/game/level/generator/LevelGenerator.java b/src/teavm/java/net/minecraft/game/level/generator/LevelGenerator.java new file mode 100644 index 0000000..c59bc85 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/generator/LevelGenerator.java @@ -0,0 +1,825 @@ +package net.minecraft.game.level.generator; + +import java.util.ArrayList; +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; +import net.minecraft.game.level.MobSpawner; +import net.minecraft.game.level.World; +import net.minecraft.game.level.block.Block; +import net.minecraft.game.level.block.BlockFlower; +import net.minecraft.game.level.generator.noise.NoiseGeneratorDistort; +import net.minecraft.game.level.generator.noise.NoiseGeneratorOctaves; +import util.IProgressUpdate; + +public final class LevelGenerator { + private IProgressUpdate guiLoading; + private int width; + private int depth; + private int height; + private Random rand = new Random(); + private byte[] blocksByteArray; + private int waterLevel; + private int groundLevel; + public boolean islandGen = false; + public boolean floatingGen = false; + public boolean flatGen = false; + public int levelType; + private int phaseBar; + private int phases; + private float phaseBareLength = 0.0F; + private int[] floodFillBlocks = new int[1048576]; + + public LevelGenerator(IProgressUpdate var1) { + this.guiLoading = var1; + } + + public final World generate(String var1, int var2, int var3, int var4) { + int var5 = 1; + if(this.floatingGen) { + var5 = (var4 - 64) / 48 + 1; + } + + this.phases = 13 + var5 * 4; + this.guiLoading.displayProgressMessage("Generating level"); + World var6 = new World(); + var6.waterLevel = this.waterLevel; + var6.groundLevel = this.groundLevel; + this.width = var2; + this.depth = var3; + this.height = var4; + this.blocksByteArray = new byte[var2 * var3 * var4]; + + int var7; + LevelGenerator var9; + int var21; + int var25; + int var31; + int var45; + int var51; + int var52; + int var53; + int var56; + for(var7 = 0; var7 < var5; ++var7) { + this.waterLevel = var4 - 32 - var7 * 48; + this.groundLevel = this.waterLevel - 2; + int[] var8; + NoiseGeneratorOctaves var13; + int var22; + double var32; + int[] var46; + if(this.flatGen) { + var8 = new int[var2 * var3]; + + for(var45 = 0; var45 < var8.length; ++var45) { + var8[var45] = 0; + } + + this.loadingBar(); + this.loadingBar(); + } else { + this.guiLoading.displayLoadingString("Raising.."); + this.loadingBar(); + var9 = this; + NoiseGeneratorDistort var10 = new NoiseGeneratorDistort(new NoiseGeneratorOctaves(this.rand, 8), new NoiseGeneratorOctaves(this.rand, 8)); + NoiseGeneratorDistort var11 = new NoiseGeneratorDistort(new NoiseGeneratorOctaves(this.rand, 8), new NoiseGeneratorOctaves(this.rand, 8)); + NoiseGeneratorOctaves var12 = new NoiseGeneratorOctaves(this.rand, 6); + var13 = new NoiseGeneratorOctaves(this.rand, 2); + int[] var14 = new int[this.width * this.depth]; + var22 = 0; + + label349: + while(true) { + if(var22 >= var9.width) { + var8 = var14; + this.guiLoading.displayLoadingString("Eroding.."); + this.loadingBar(); + var46 = var14; + var9 = this; + var11 = new NoiseGeneratorDistort(new NoiseGeneratorOctaves(this.rand, 8), new NoiseGeneratorOctaves(this.rand, 8)); + NoiseGeneratorDistort var50 = new NoiseGeneratorDistort(new NoiseGeneratorOctaves(this.rand, 8), new NoiseGeneratorOctaves(this.rand, 8)); + var52 = 0; + + while(true) { + if(var52 >= var9.width) { + break label349; + } + + var9.setNextPhase((float)var52 * 100.0F / (float)(var9.width - 1)); + + for(var53 = 0; var53 < var9.depth; ++var53) { + double var20 = var11.generateNoise((double)(var52 << 1), (double)(var53 << 1)) / 8.0D; + var22 = var50.generateNoise((double)(var52 << 1), (double)(var53 << 1)) > 0.0D ? 1 : 0; + if(var20 > 2.0D) { + int var58 = var46[var52 + var53 * var9.width]; + var58 = ((var58 - var22) / 2 << 1) + var22; + var46[var52 + var53 * var9.width] = var58; + } + } + + ++var52; + } + } + + double var23 = Math.abs(((double)var22 / ((double)var9.width - 1.0D) - 0.5D) * 2.0D); + var9.setNextPhase((float)var22 * 100.0F / (float)(var9.width - 1)); + + for(var25 = 0; var25 < var9.depth; ++var25) { + double var26 = Math.abs(((double)var25 / ((double)var9.depth - 1.0D) - 0.5D) * 2.0D); + double var28 = var10.generateNoise((double)((float)var22 * 1.3F), (double)((float)var25 * 1.3F)) / 6.0D + -4.0D; + double var30 = var11.generateNoise((double)((float)var22 * 1.3F), (double)((float)var25 * 1.3F)) / 5.0D + 10.0D + -4.0D; + var32 = var12.generateNoise((double)var22, (double)var25) / 8.0D; + if(var32 > 0.0D) { + var30 = var28; + } + + double var34 = Math.max(var28, var30) / 2.0D; + if(var9.islandGen) { + double var36 = Math.sqrt(var23 * var23 + var26 * var26) * (double)1.2F; + double var39 = var13.generateNoise((double)((float)var22 * 0.05F), (double)((float)var25 * 0.05F)) / 4.0D + 1.0D; + var36 = Math.min(var36, var39); + var36 = Math.max(var36, Math.max(var23, var26)); + if(var36 > 1.0D) { + var36 = 1.0D; + } + + if(var36 < 0.0D) { + var36 = 0.0D; + } + + var36 *= var36; + var34 = var34 * (1.0D - var36) - var36 * 10.0D + 5.0D; + if(var34 < 0.0D) { + var34 -= var34 * var34 * (double)0.2F; + } + } else if(var34 < 0.0D) { + var34 *= 0.8D; + } + + var14[var22 + var25 * var9.width] = (int)var34; + } + + ++var22; + } + } + + this.guiLoading.displayLoadingString("Soiling.."); + this.loadingBar(); + var46 = var8; + var9 = this; + int var49 = this.width; + var51 = this.depth; + var52 = this.height; + NoiseGeneratorOctaves var54 = new NoiseGeneratorOctaves(this.rand, 8); + NoiseGeneratorOctaves var55 = new NoiseGeneratorOctaves(this.rand, 8); + + for(var21 = 0; var21 < var49; ++var21) { + double var57 = Math.abs(((double)var21 / ((double)var49 - 1.0D) - 0.5D) * 2.0D); + var9.setNextPhase((float)var21 * 100.0F / (float)(var49 - 1)); + + for(int var24 = 0; var24 < var51; ++var24) { + double var64 = Math.abs(((double)var24 / ((double)var51 - 1.0D) - 0.5D) * 2.0D); + double var27 = Math.max(var57, var64); + var27 = var27 * var27 * var27; + int var29 = (int)(var54.generateNoise((double)var21, (double)var24) / 24.0D) - 4; + int var72 = var46[var21 + var24 * var49] + var9.waterLevel; + var31 = var72 + var29; + var46[var21 + var24 * var49] = Math.max(var72, var31); + if(var46[var21 + var24 * var49] > var52 - 2) { + var46[var21 + var24 * var49] = var52 - 2; + } + + if(var46[var21 + var24 * var49] <= 0) { + var46[var21 + var24 * var49] = 1; + } + + var32 = var55.generateNoise((double)var21 * 2.3D, (double)var24 * 2.3D) / 24.0D; + int var76 = (int)(Math.sqrt(Math.abs(var32)) * Math.signum(var32) * 20.0D) + var9.waterLevel; + var76 = (int)((double)var76 * (1.0D - var27) + var27 * (double)var9.height); + if(var76 > var9.waterLevel) { + var76 = var9.height; + } + + for(int var35 = 0; var35 < var52; ++var35) { + int var79 = (var35 * var9.depth + var24) * var9.width + var21; + int var37 = 0; + if(var35 <= var72) { + var37 = Block.dirt.blockID; + } + + if(var35 <= var31) { + var37 = Block.stone.blockID; + } + + if(var9.floatingGen && var35 < var76) { + var37 = 0; + } + + if(var9.blocksByteArray[var79] == 0) { + var9.blocksByteArray[var79] = (byte)var37; + } + } + } + } + + this.guiLoading.displayLoadingString("Growing.."); + this.loadingBar(); + var46 = var8; + var9 = this; + var49 = this.width; + var51 = this.depth; + var13 = new NoiseGeneratorOctaves(this.rand, 8); + var54 = new NoiseGeneratorOctaves(this.rand, 8); + var56 = this.waterLevel - 1; + if(this.levelType == 2) { + var56 += 2; + } + + for(var21 = 0; var21 < var49; ++var21) { + var9.setNextPhase((float)var21 * 100.0F / (float)(var49 - 1)); + + for(var22 = 0; var22 < var51; ++var22) { + boolean var60 = var13.generateNoise((double)var21, (double)var22) > 8.0D; + if(var9.islandGen) { + var60 = var13.generateNoise((double)var21, (double)var22) > -8.0D; + } + + if(var9.levelType == 2) { + var60 = var13.generateNoise((double)var21, (double)var22) > -32.0D; + } + + boolean var61 = var54.generateNoise((double)var21, (double)var22) > 12.0D; + if(var9.levelType == 1 || var9.levelType == 3) { + var60 = var13.generateNoise((double)var21, (double)var22) > -8.0D; + } + + var25 = var46[var21 + var22 * var49]; + int var65 = (var25 * var9.depth + var22) * var9.width + var21; + int var67 = var9.blocksByteArray[((var25 + 1) * var9.depth + var22) * var9.width + var21] & 255; + if((var67 == Block.waterMoving.blockID || var67 == Block.waterStill.blockID || var67 == 0) && var25 <= var9.waterLevel - 1 && var61) { + var9.blocksByteArray[var65] = (byte)Block.gravel.blockID; + } + + if(var67 == 0) { + int var69 = -1; + if(var25 <= var56 && var60) { + var69 = Block.sand.blockID; + if(var9.levelType == 1) { + var69 = Block.grass.blockID; + } + } + + if(var9.blocksByteArray[var65] != 0 && var69 > 0) { + var9.blocksByteArray[var65] = (byte)var69; + } + } + } + } + } + + this.guiLoading.displayLoadingString("Carving.."); + this.loadingBar(); + var9 = this; + var51 = this.width; + var52 = this.depth; + var53 = this.height; + var56 = var51 * var52 * var53 / 256 / 64 << 1; + + for(var21 = 0; var21 < var56; ++var21) { + var9.setNextPhase((float)var21 * 100.0F / (float)(var56 - 1)); + float var59 = var9.rand.nextFloat() * (float)var51; + float var63 = var9.rand.nextFloat() * (float)var53; + float var62 = var9.rand.nextFloat() * (float)var52; + var25 = (int)((var9.rand.nextFloat() + var9.rand.nextFloat()) * 200.0F); + float var66 = var9.rand.nextFloat() * (float)Math.PI * 2.0F; + float var68 = 0.0F; + float var71 = var9.rand.nextFloat() * (float)Math.PI * 2.0F; + float var70 = 0.0F; + float var73 = var9.rand.nextFloat() * var9.rand.nextFloat(); + + for(var31 = 0; var31 < var25; ++var31) { + var59 += MathHelper.sin(var66) * MathHelper.cos(var71); + var62 += MathHelper.cos(var66) * MathHelper.cos(var71); + var63 += MathHelper.sin(var71); + var66 += var68 * 0.2F; + var68 *= 0.9F; + var68 += var9.rand.nextFloat() - var9.rand.nextFloat(); + var71 += var70 * 0.5F; + var71 *= 0.5F; + var70 *= 12.0F / 16.0F; + var70 += var9.rand.nextFloat() - var9.rand.nextFloat(); + if(var9.rand.nextFloat() >= 0.25F) { + float var74 = var59 + (var9.rand.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var33 = var63 + (var9.rand.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var77 = var62 + (var9.rand.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var75 = ((float)var9.height - var33) / (float)var9.height; + float var80 = 1.2F + (var75 * 3.5F + 1.0F) * var73; + float var78 = MathHelper.sin((float)var31 * (float)Math.PI / (float)var25) * var80; + + for(var5 = (int)(var74 - var78); var5 <= (int)(var74 + var78); ++var5) { + for(int var81 = (int)(var33 - var78); var81 <= (int)(var33 + var78); ++var81) { + for(int var40 = (int)(var77 - var78); var40 <= (int)(var77 + var78); ++var40) { + float var41 = (float)var5 - var74; + float var42 = (float)var81 - var33; + float var48 = (float)var40 - var77; + var41 = var41 * var41 + var42 * var42 * 2.0F + var48 * var48; + if(var41 < var78 * var78 && var5 > 0 && var81 > 0 && var40 > 0 && var5 < var9.width - 1 && var81 < var9.height - 1 && var40 < var9.depth - 1) { + var7 = (var81 * var9.depth + var40) * var9.width + var5; + if(var9.blocksByteArray[var7] == Block.stone.blockID) { + var9.blocksByteArray[var7] = 0; + } + } + } + } + } + } + } + } + + var7 = this.populateOre(Block.oreCoal.blockID, 1000, 10, (var4 << 2) / 5); + int var44 = this.populateOre(Block.oreIron.blockID, 800, 8, var4 * 3 / 5); + var45 = this.populateOre(Block.oreGold.blockID, 500, 6, (var4 << 1) / 5); + var5 = this.populateOre(Block.oreDiamond.blockID, 800, 2, var4 / 5); + System.out.println("Coal: " + var7 + ", Iron: " + var44 + ", Gold: " + var45 + ", Diamond: " + var5); + this.guiLoading.displayLoadingString("Melting.."); + this.loadingBar(); + this.lavaGen(); + var6.cloudHeight = var4 + 2; + if(this.floatingGen) { + this.groundLevel = -128; + this.waterLevel = this.groundLevel + 1; + var6.cloudHeight = -16; + } else if(!this.islandGen) { + this.groundLevel = this.waterLevel + 1; + this.waterLevel = this.groundLevel - 16; + } else { + this.groundLevel = this.waterLevel - 9; + } + + this.guiLoading.displayLoadingString("Watering.."); + this.loadingBar(); + this.liquidThemeSpawner(); + if(!this.floatingGen) { + var5 = Block.waterStill.blockID; + if(this.levelType == 1) { + var5 = Block.lavaStill.blockID; + } + + for(var7 = 0; var7 < var2; ++var7) { + this.floodFill(var7, this.waterLevel - 1, 0, 0, var5); + this.floodFill(var7, this.waterLevel - 1, var3 - 1, 0, var5); + } + + for(var7 = 0; var7 < var3; ++var7) { + this.floodFill(var2 - 1, this.waterLevel - 1, var7, 0, var5); + this.floodFill(0, this.waterLevel - 1, var7, 0, var5); + } + } + + if(this.levelType == 0) { + var6.skyColor = 10079487; + var6.fogColor = 16777215; + var6.cloudColor = 16777215; + } + + if(this.levelType == 1) { + var6.cloudColor = 2164736; + var6.fogColor = 1049600; + var6.skyColor = 1049600; + var6.skylightSubtracted = var6.skyBrightness = 7; + var6.defaultFluid = Block.lavaMoving.blockID; + if(this.floatingGen) { + var6.cloudHeight = var4 + 2; + this.waterLevel = -16; + } + } + + if(this.levelType == 2) { + var6.skyColor = 13033215; + var6.fogColor = 13033215; + var6.cloudColor = 15658751; + var6.skylightSubtracted = var6.skyBrightness = 15; + var6.skyBrightness = 16; + var6.cloudHeight = var4 + 64; + } + + if(this.levelType == 3) { + var6.skyColor = 7699847; + var6.fogColor = 5069403; + var6.cloudColor = 5069403; + var6.skylightSubtracted = var6.skyBrightness = 12; + } + + var6.waterLevel = this.waterLevel; + var6.groundLevel = this.groundLevel; + this.guiLoading.displayLoadingString("Assembling.."); + this.loadingBar(); + this.setNextPhase(0.0F); + var6.generate(var2, var4, var3, this.blocksByteArray, (byte[])null); + this.guiLoading.displayLoadingString("Building.."); + this.loadingBar(); + this.setNextPhase(0.0F); + var6.findSpawn(); + generateHouse(var6); + this.guiLoading.displayLoadingString("Planting.."); + this.loadingBar(); + if(this.levelType != 1) { + this.growGrassOnDirt(var6); + } + + this.loadingBar(); + this.growTrees(var6); + if(this.levelType == 3) { + for(var5 = 0; var5 < 50; ++var5) { + this.growTrees(var6); + } + } + + short var43 = 100; + if(this.levelType == 2) { + var43 = 1000; + } + + this.loadingBar(); + this.populateFlowersAndMushrooms(var6, Block.plantYellow, var43); + this.loadingBar(); + this.populateFlowersAndMushrooms(var6, Block.plantRed, var43); + this.loadingBar(); + this.populateFlowersAndMushrooms(var6, Block.mushroomBrown, 50); + this.loadingBar(); + this.populateFlowersAndMushrooms(var6, Block.mushroomRed, 50); + this.guiLoading.displayLoadingString("Lighting.."); + this.loadingBar(); + + for(var7 = 0; var7 < 10000; ++var7) { + this.setNextPhase((float)(var7 * 100 / 10000)); + var6.updateLighting(); + } + + this.guiLoading.displayLoadingString("Spawning.."); + this.loadingBar(); + MobSpawner var47 = new MobSpawner(var6); + + for(var2 = 0; var2 < 1000; ++var2) { + this.setNextPhase((float)var2 * 100.0F / 999.0F); + var47.performSpawning(); + } + + var6.createTime = System.currentTimeMillis(); + var6.authorName = var1; + var6.name = "A Nice World"; + if(this.phaseBar != this.phases) { + throw new IllegalStateException("Wrong number of phases! Wanted " + this.phases + ", got " + this.phaseBar); + } else { + return var6; + } + } + + private static void generateHouse(World var0) { + int var1 = var0.xSpawn; + int var2 = var0.ySpawn; + int var3 = var0.zSpawn; + + for(int var4 = var1 - 3; var4 <= var1 + 3; ++var4) { + for(int var5 = var2 - 2; var5 <= var2 + 2; ++var5) { + for(int var6 = var3 - 3; var6 <= var3 + 3; ++var6) { + int var7 = var5 < var2 - 1 ? Block.obsidian.blockID : 0; + if(var4 == var1 - 3 || var6 == var3 - 3 || var4 == var1 + 3 || var6 == var3 + 3 || var5 == var2 - 2 || var5 == var2 + 2) { + var7 = Block.stone.blockID; + if(var5 >= var2 - 1) { + var7 = Block.planks.blockID; + } + } + + if(var6 == var3 - 3 && var4 == var1 && var5 >= var2 - 1 && var5 <= var2) { + var7 = 0; + } + + var0.setBlockWithNotify(var4, var5, var6, var7); + } + } + } + + var0.setBlockWithNotify(var1 - 3 + 1, var2, var3, Block.torch.blockID); + var0.setBlockWithNotify(var1 + 3 - 1, var2, var3, Block.torch.blockID); + } + + private void growGrassOnDirt(World var1) { + for(int var2 = 0; var2 < this.width; ++var2) { + this.setNextPhase((float)var2 * 100.0F / (float)(this.width - 1)); + + for(int var3 = 0; var3 < this.height; ++var3) { + for(int var4 = 0; var4 < this.depth; ++var4) { + if(var1.getBlockId(var2, var3, var4) == Block.dirt.blockID && var1.getBlockLightValue(var2, var3 + 1, var4) >= 4 && !var1.getBlockMaterial(var2, var3 + 1, var4).getCanBlockGrass()) { + var1.setBlock(var2, var3, var4, Block.grass.blockID); + } + } + } + } + + } + + private void growTrees(World var1) { + int var2 = this.width * this.depth * this.height / 80000; + + for(int var3 = 0; var3 < var2; ++var3) { + if(var3 % 100 == 0) { + this.setNextPhase((float)var3 * 100.0F / (float)(var2 - 1)); + } + + int var4 = this.rand.nextInt(this.width); + int var5 = this.rand.nextInt(this.height); + int var6 = this.rand.nextInt(this.depth); + + for(int var7 = 0; var7 < 25; ++var7) { + int var8 = var4; + int var9 = var5; + int var10 = var6; + + for(int var11 = 0; var11 < 20; ++var11) { + var8 += this.rand.nextInt(12) - this.rand.nextInt(12); + var9 += this.rand.nextInt(3) - this.rand.nextInt(6); + var10 += this.rand.nextInt(12) - this.rand.nextInt(12); + if(var8 >= 0 && var9 >= 0 && var10 >= 0 && var8 < this.width && var9 < this.height && var10 < this.depth) { + var1.growTrees(var8, var9, var10); + } + } + } + } + + } + + private void populateFlowersAndMushrooms(World var1, BlockFlower var2, int var3) { + var3 = (int)((long)this.width * (long)this.depth * (long)this.height * (long)var3 / 1600000L); + + for(int var4 = 0; var4 < var3; ++var4) { + if(var4 % 100 == 0) { + this.setNextPhase((float)var4 * 100.0F / (float)(var3 - 1)); + } + + int var5 = this.rand.nextInt(this.width); + int var6 = this.rand.nextInt(this.height); + int var7 = this.rand.nextInt(this.depth); + + for(int var8 = 0; var8 < 10; ++var8) { + int var9 = var5; + int var10 = var6; + int var11 = var7; + + for(int var12 = 0; var12 < 10; ++var12) { + var9 += this.rand.nextInt(4) - this.rand.nextInt(4); + var10 += this.rand.nextInt(2) - this.rand.nextInt(2); + var11 += this.rand.nextInt(4) - this.rand.nextInt(4); + if(var9 >= 0 && var11 >= 0 && var10 > 0 && var9 < this.width && var11 < this.depth && var10 < this.height && var1.getBlockId(var9, var10, var11) == 0 && var2.canBlockStay(var1, var9, var10, var11)) { + var1.setBlockWithNotify(var9, var10, var11, var2.blockID); + } + } + } + } + + } + + private int populateOre(int var1, int var2, int var3, int var4) { + int var5 = 0; + byte var26 = (byte)var1; + int var6 = this.width; + int var7 = this.depth; + int var8 = this.height; + var2 = var6 * var7 * var8 / 256 / 64 * var2 / 100; + + for(int var9 = 0; var9 < var2; ++var9) { + this.setNextPhase((float)var9 * 100.0F / (float)(var2 - 1)); + float var10 = this.rand.nextFloat() * (float)var6; + float var11 = this.rand.nextFloat() * (float)var8; + float var12 = this.rand.nextFloat() * (float)var7; + if(var11 <= (float)var4) { + int var13 = (int)((this.rand.nextFloat() + this.rand.nextFloat()) * 75.0F * (float)var3 / 100.0F); + float var14 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + float var15 = 0.0F; + float var16 = this.rand.nextFloat() * (float)Math.PI * 2.0F; + float var17 = 0.0F; + + for(int var18 = 0; var18 < var13; ++var18) { + var10 += MathHelper.sin(var14) * MathHelper.cos(var16); + var12 += MathHelper.cos(var14) * MathHelper.cos(var16); + var11 += MathHelper.sin(var16); + var14 += var15 * 0.2F; + var15 *= 0.9F; + var15 += this.rand.nextFloat() - this.rand.nextFloat(); + var16 += var17 * 0.5F; + var16 *= 0.5F; + var17 *= 0.9F; + var17 += this.rand.nextFloat() - this.rand.nextFloat(); + float var19 = MathHelper.sin((float)var18 * (float)Math.PI / (float)var13) * (float)var3 / 100.0F + 1.0F; + + for(int var20 = (int)(var10 - var19); var20 <= (int)(var10 + var19); ++var20) { + for(int var21 = (int)(var11 - var19); var21 <= (int)(var11 + var19); ++var21) { + for(int var22 = (int)(var12 - var19); var22 <= (int)(var12 + var19); ++var22) { + float var23 = (float)var20 - var10; + float var24 = (float)var21 - var11; + float var25 = (float)var22 - var12; + var23 = var23 * var23 + var24 * var24 * 2.0F + var25 * var25; + if(var23 < var19 * var19 && var20 > 0 && var21 > 0 && var22 > 0 && var20 < this.width - 1 && var21 < this.height - 1 && var22 < this.depth - 1) { + int var27 = (var21 * this.depth + var22) * this.width + var20; + if(this.blocksByteArray[var27] == Block.stone.blockID) { + this.blocksByteArray[var27] = var26; + ++var5; + } + } + } + } + } + } + } + } + + return var5; + } + + private void liquidThemeSpawner() { + int var1 = Block.waterStill.blockID; + if(this.levelType == 1) { + var1 = Block.lavaStill.blockID; + } + + int var2 = this.width * this.depth * this.height / 1000; + + for(int var3 = 0; var3 < var2; ++var3) { + if(var3 % 100 == 0) { + this.setNextPhase((float)var3 * 100.0F / (float)(var2 - 1)); + } + + int var4 = this.rand.nextInt(this.width); + int var5 = this.rand.nextInt(this.height); + int var6 = this.rand.nextInt(this.depth); + if(this.blocksByteArray[(var5 * this.depth + var6) * this.width + var4] == 0) { + long var7 = this.floodFill(var4, var5, var6, 0, 255); + if(var7 > 0L && var7 < 640L) { + this.floodFill(var4, var5, var6, 255, var1); + } else { + this.floodFill(var4, var5, var6, 255, 0); + } + } + } + + this.setNextPhase(100.0F); + } + + private void loadingBar() { + ++this.phaseBar; + this.phaseBareLength = 0.0F; + this.setNextPhase(0.0F); + } + + private void setNextPhase(float var1) { + if(var1 < 0.0F) { + throw new IllegalStateException("Failed to set next phase!"); + } else { + int var2 = (int)(((float)(this.phaseBar - 1) + var1 / 100.0F) * 100.0F / (float)this.phases); + this.guiLoading.setLoadingProgress(var2); + } + } + + private void lavaGen() { + int var1 = this.width * this.depth * this.height / 2000; + int var2 = this.groundLevel; + + for(int var3 = 0; var3 < var1; ++var3) { + if(var3 % 100 == 0) { + this.setNextPhase((float)var3 * 100.0F / (float)(var1 - 1)); + } + + int var4 = this.rand.nextInt(this.width); + int var5 = Math.min(Math.min(this.rand.nextInt(var2), this.rand.nextInt(var2)), Math.min(this.rand.nextInt(var2), this.rand.nextInt(var2))); + int var6 = this.rand.nextInt(this.depth); + if(this.blocksByteArray[(var5 * this.depth + var6) * this.width + var4] == 0) { + long var7 = this.floodFill(var4, var5, var6, 0, 255); + if(var7 > 0L && var7 < 640L) { + this.floodFill(var4, var5, var6, 255, Block.lavaStill.blockID); + } else { + this.floodFill(var4, var5, var6, 255, 0); + } + } + } + + this.setNextPhase(100.0F); + } + + private long floodFill(int var1, int var2, int var3, int var4, int var5) { + byte var6 = (byte)var5; + byte var22 = (byte)var4; + ArrayList var7 = new ArrayList(); + byte var8 = 0; + int var9 = 1; + + int var10; + for(var10 = 1; 1 << var9 < this.width; ++var9) { + } + + while(1 << var10 < this.depth) { + ++var10; + } + + int var11 = this.depth - 1; + int var12 = this.width - 1; + int var23 = var8 + 1; + this.floodFillBlocks[0] = ((var2 << var10) + var3 << var9) + var1; + long var14 = 0L; + var1 = this.width * this.depth; + + while(var23 > 0) { + --var23; + var2 = this.floodFillBlocks[var23]; + if(var23 == 0 && var7.size() > 0) { + this.floodFillBlocks = (int[])var7.remove(var7.size() - 1); + var23 = this.floodFillBlocks.length; + } + + var3 = var2 >> var9 & var11; + int var13 = var2 >> var9 + var10; + int var16 = var2 & var12; + + int var17; + for(var17 = var16; var16 > 0 && this.blocksByteArray[var2 - 1] == var22; --var2) { + --var16; + } + + while(var17 < this.width && this.blocksByteArray[var2 + var17 - var16] == var22) { + ++var17; + } + + int var18 = var2 >> var9 & var11; + int var19 = var2 >> var9 + var10; + if(var5 == 255 && (var16 == 0 || var17 == this.width - 1 || var13 == 0 || var13 == this.height - 1 || var3 == 0 || var3 == this.depth - 1)) { + return -1L; + } + + if(var18 != var3 || var19 != var13) { + System.out.println("Diagonal flood!?"); + } + + boolean var24 = false; + boolean var25 = false; + boolean var20 = false; + var14 += (long)(var17 - var16); + + for(var16 = var16; var16 < var17; ++var16) { + this.blocksByteArray[var2] = var6; + boolean var21; + if(var3 > 0) { + var21 = this.blocksByteArray[var2 - this.width] == var22; + if(var21 && !var24) { + if(var23 == this.floodFillBlocks.length) { + var7.add(this.floodFillBlocks); + this.floodFillBlocks = new int[1048576]; + var23 = 0; + } + + this.floodFillBlocks[var23++] = var2 - this.width; + } + + var24 = var21; + } + + if(var3 < this.depth - 1) { + var21 = this.blocksByteArray[var2 + this.width] == var22; + if(var21 && !var25) { + if(var23 == this.floodFillBlocks.length) { + var7.add(this.floodFillBlocks); + this.floodFillBlocks = new int[1048576]; + var23 = 0; + } + + this.floodFillBlocks[var23++] = var2 + this.width; + } + + var25 = var21; + } + + if(var13 > 0) { + byte var26 = this.blocksByteArray[var2 - var1]; + if((var6 == Block.lavaMoving.blockID || var6 == Block.lavaStill.blockID) && (var26 == Block.waterMoving.blockID || var26 == Block.waterStill.blockID)) { + this.blocksByteArray[var2 - var1] = (byte)Block.stone.blockID; + } + + var21 = var26 == var22; + if(var21 && !var20) { + if(var23 == this.floodFillBlocks.length) { + var7.add(this.floodFillBlocks); + this.floodFillBlocks = new int[1048576]; + var23 = 0; + } + + this.floodFillBlocks[var23++] = var2 - var1; + } + + var20 = var21; + } + + ++var2; + } + } + + return var14; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGenerator.java b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGenerator.java new file mode 100644 index 0000000..bc31ab2 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGenerator.java @@ -0,0 +1,5 @@ +package net.minecraft.game.level.generator.noise; + +public abstract class NoiseGenerator { + public abstract double generateNoise(double var1, double var3); +} diff --git a/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.java b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.java new file mode 100644 index 0000000..dd84f6b --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorDistort.java @@ -0,0 +1,15 @@ +package net.minecraft.game.level.generator.noise; + +public final class NoiseGeneratorDistort extends NoiseGenerator { + private NoiseGenerator source; + private NoiseGenerator distort; + + public NoiseGeneratorDistort(NoiseGenerator var1, NoiseGenerator var2) { + this.source = var1; + this.distort = var2; + } + + public final double generateNoise(double var1, double var3) { + return this.source.generateNoise(var1 + this.distort.generateNoise(var1, var3), var3); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorOctaves.java b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorOctaves.java new file mode 100644 index 0000000..1c66d68 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorOctaves.java @@ -0,0 +1,30 @@ +package net.minecraft.game.level.generator.noise; + +import java.util.Random; + +public final class NoiseGeneratorOctaves extends NoiseGenerator { + private NoiseGeneratorPerlin[] generatorCollection; + private int octaves; + + public NoiseGeneratorOctaves(Random var1, int var2) { + this.octaves = var2; + this.generatorCollection = new NoiseGeneratorPerlin[var2]; + + for(int var3 = 0; var3 < var2; ++var3) { + this.generatorCollection[var3] = new NoiseGeneratorPerlin(var1); + } + + } + + public final double generateNoise(double var1, double var3) { + double var5 = 0.0D; + double var7 = 1.0D; + + for(int var9 = 0; var9 < this.octaves; ++var9) { + var5 += this.generatorCollection[var9].generateNoise(var1 / var7, var3 / var7) * var7; + var7 *= 2.0D; + } + + return var5; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorPerlin.java b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorPerlin.java new file mode 100644 index 0000000..4ac5d84 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/generator/noise/NoiseGeneratorPerlin.java @@ -0,0 +1,66 @@ +package net.minecraft.game.level.generator.noise; + +import java.util.Random; + +import net.PeytonPlayz585.math.MathHelper; + +public final class NoiseGeneratorPerlin extends NoiseGenerator { + private int[] permutations; + + public NoiseGeneratorPerlin() { + this(new Random()); + } + + public NoiseGeneratorPerlin(Random var1) { + this.permutations = new int[512]; + + int var2; + for(var2 = 0; var2 < 256; this.permutations[var2] = var2++) { + } + + for(var2 = 0; var2 < 256; ++var2) { + int var3 = var1.nextInt(256 - var2) + var2; + int var4 = this.permutations[var2]; + this.permutations[var2] = this.permutations[var3]; + this.permutations[var3] = var4; + this.permutations[var2 + 256] = this.permutations[var2]; + } + + } + + private static double generateNoise(double var0) { + return var0 * var0 * var0 * (var0 * (var0 * 6.0D - 15.0D) + 10.0D); + } + + private static double lerp(double var0, double var2, double var4) { + return var2 + var0 * (var4 - var2); + } + + private static double grad(int var0, double var1, double var3, double var5) { + var0 &= 15; + double var8 = var0 < 8 ? var1 : var3; + double var10 = var0 < 4 ? var3 : (var0 != 12 && var0 != 14 ? var5 : var1); + return ((var0 & 1) == 0 ? var8 : -var8) + ((var0 & 2) == 0 ? var10 : -var10); + } + + public final double generateNoise(double var1, double var3) { + double var10 = 0.0D; + double var8 = var3; + int var2 = MathHelper.floor_double(var1) & 255; + int var21 = MathHelper.floor_double(var3) & 255; + int var4 = MathHelper.floor_double(0.0D) & 255; + double var6 = var1 - (double)MathHelper.floor_double(var1); + var8 -= (double)MathHelper.floor_double(var8); + var10 = 0.0D - (double)MathHelper.floor_double(0.0D); + double var15 = generateNoise(var6); + double var17 = generateNoise(var8); + double var19 = generateNoise(var10); + int var5 = this.permutations[var2] + var21; + int var12 = this.permutations[var5] + var4; + var5 = this.permutations[var5 + 1] + var4; + var2 = this.permutations[var2 + 1] + var21; + var21 = this.permutations[var2] + var4; + var2 = this.permutations[var2 + 1] + var4; + return lerp(var19, lerp(var17, lerp(var15, grad(this.permutations[var12], var6, var8, var10), grad(this.permutations[var21], var6 - 1.0D, var8, var10)), lerp(var15, grad(this.permutations[var5], var6, var8 - 1.0D, var10), grad(this.permutations[var2], var6 - 1.0D, var8 - 1.0D, var10))), lerp(var17, lerp(var15, grad(this.permutations[var12 + 1], var6, var8, var10 - 1.0D), grad(this.permutations[var21 + 1], var6 - 1.0D, var8, var10 - 1.0D)), lerp(var15, grad(this.permutations[var5 + 1], var6, var8 - 1.0D, var10 - 1.0D), grad(this.permutations[var2 + 1], var6 - 1.0D, var8 - 1.0D, var10 - 1.0D)))); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/material/Material.java b/src/teavm/java/net/minecraft/game/level/material/Material.java new file mode 100644 index 0000000..2e68163 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/material/Material.java @@ -0,0 +1,40 @@ +package net.minecraft.game.level.material; + +public class Material { + public static final Material air = new MaterialTransparent(); + public static final Material ground = new Material(); + public static final Material wood = new Material(); + public static final Material rock = new Material(); + public static final Material iron = new Material(); + public static final Material water = new MaterialLiquid(); + public static final Material lava = new MaterialLiquid(); + public static final Material leaves = new Material(); + public static final Material plants = new MaterialLogic(); + public static final Material sponge = new Material(); + public static final Material cloth = new Material(); + public static final Material fire = new MaterialTransparent(); + public static final Material sand = new Material(); + public static final Material circuits = new MaterialLogic(); + public static final Material glass = new Material(); + public static final Material tnt = new Material(); + + public boolean getIsLiquid() { + return false; + } + + public final boolean liquidSolidCheck() { + return !this.getIsLiquid() && !this.isSolid(); + } + + public boolean isSolid() { + return true; + } + + public boolean getCanBlockGrass() { + return true; + } + + public boolean getIsSolid() { + return true; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/material/MaterialLiquid.java b/src/teavm/java/net/minecraft/game/level/material/MaterialLiquid.java new file mode 100644 index 0000000..2f90b89 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/material/MaterialLiquid.java @@ -0,0 +1,11 @@ +package net.minecraft.game.level.material; + +public final class MaterialLiquid extends Material { + public final boolean getIsLiquid() { + return true; + } + + public final boolean isSolid() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/material/MaterialLogic.java b/src/teavm/java/net/minecraft/game/level/material/MaterialLogic.java new file mode 100644 index 0000000..95181c0 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/material/MaterialLogic.java @@ -0,0 +1,15 @@ +package net.minecraft.game.level.material; + +public final class MaterialLogic extends Material { + public final boolean isSolid() { + return false; + } + + public final boolean getCanBlockGrass() { + return false; + } + + public final boolean getIsSolid() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/material/MaterialTransparent.java b/src/teavm/java/net/minecraft/game/level/material/MaterialTransparent.java new file mode 100644 index 0000000..138dbcf --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/material/MaterialTransparent.java @@ -0,0 +1,15 @@ +package net.minecraft.game.level.material; + +public final class MaterialTransparent extends Material { + public final boolean isSolid() { + return false; + } + + public final boolean getCanBlockGrass() { + return false; + } + + public final boolean getIsSolid() { + return false; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/path/Path.java b/src/teavm/java/net/minecraft/game/level/path/Path.java new file mode 100644 index 0000000..7811654 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/path/Path.java @@ -0,0 +1,118 @@ +package net.minecraft.game.level.path; + +public final class Path { + private PathPoint[] pathPoints = new PathPoint[1024]; + private int count = 0; + + public final PathPoint addPoint(PathPoint var1) { + if(var1.index >= 0) { + throw new IllegalStateException("OW KNOWS!"); + } else { + if(this.count == this.pathPoints.length) { + PathPoint[] var2 = new PathPoint[this.count << 1]; + System.arraycopy(this.pathPoints, 0, var2, 0, this.count); + this.pathPoints = var2; + } + + this.pathPoints[this.count] = var1; + var1.index = this.count; + this.sortBack(this.count++); + return var1; + } + } + + public final void clearPath() { + this.count = 0; + } + + public final PathPoint dequeue() { + PathPoint var1 = this.pathPoints[0]; + this.pathPoints[0] = this.pathPoints[--this.count]; + this.pathPoints[this.count] = null; + if(this.count > 0) { + this.sortForward(0); + } + + var1.index = -1; + return var1; + } + + public final void changeDistance(PathPoint var1, float var2) { + float var3 = var1.distanceToTarget; + var1.distanceToTarget = var2; + if(var2 < var3) { + this.sortBack(var1.index); + } else { + this.sortForward(var1.index); + } + } + + private void sortBack(int var1) { + PathPoint var2 = this.pathPoints[var1]; + + int var4; + for(float var3 = var2.distanceToTarget; var1 > 0; var1 = var4) { + var4 = var1 - 1 >> 1; + PathPoint var5 = this.pathPoints[var4]; + if(var3 >= var5.distanceToTarget) { + break; + } + + this.pathPoints[var1] = var5; + var5.index = var1; + } + + this.pathPoints[var1] = var2; + var2.index = var1; + } + + private void sortForward(int var1) { + PathPoint var2 = this.pathPoints[var1]; + float var3 = var2.distanceToTarget; + + while(true) { + int var4 = 1 + (var1 << 1); + int var5 = var4 + 1; + if(var4 >= this.count) { + break; + } + + PathPoint var6 = this.pathPoints[var4]; + float var7 = var6.distanceToTarget; + PathPoint var8; + float var9; + if(var5 >= this.count) { + var8 = null; + var9 = Float.POSITIVE_INFINITY; + } else { + var8 = this.pathPoints[var5]; + var9 = var8.distanceToTarget; + } + + if(var7 < var9) { + if(var7 >= var3) { + break; + } + + this.pathPoints[var1] = var6; + var6.index = var1; + var1 = var4; + } else { + if(var9 >= var3) { + break; + } + + this.pathPoints[var1] = var8; + var8.index = var1; + var1 = var5; + } + } + + this.pathPoints[var1] = var2; + var2.index = var1; + } + + public final boolean isPathEmpty() { + return this.count == 0; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/path/PathEntity.java b/src/teavm/java/net/minecraft/game/level/path/PathEntity.java new file mode 100644 index 0000000..10e19c9 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/path/PathEntity.java @@ -0,0 +1,28 @@ +package net.minecraft.game.level.path; + +import net.minecraft.game.entity.Entity; +import net.minecraft.game.physics.Vec3D; + +public final class PathEntity { + private final PathPoint[] points; + private int pathIndex; + + public PathEntity(PathPoint[] var1) { + this.points = var1; + } + + public final void incrementPathIndex() { + ++this.pathIndex; + } + + public final boolean isFinished() { + return this.pathIndex >= this.points.length; + } + + public final Vec3D getPosition(Entity var1) { + float var2 = (float)this.points[this.pathIndex].xCoord + (float)((int)(var1.width + 1.0F)) * 0.5F; + float var3 = (float)this.points[this.pathIndex].yCoord; + float var4 = (float)this.points[this.pathIndex].zCoord + (float)((int)(var1.width + 1.0F)) * 0.5F; + return new Vec3D(var2, var3, var4); + } +} diff --git a/src/teavm/java/net/minecraft/game/level/path/PathPoint.java b/src/teavm/java/net/minecraft/game/level/path/PathPoint.java new file mode 100644 index 0000000..6018e64 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/path/PathPoint.java @@ -0,0 +1,46 @@ +package net.minecraft.game.level.path; + +import net.PeytonPlayz585.math.MathHelper; + +public final class PathPoint { + public final int xCoord; + public final int yCoord; + public final int zCoord; + public final int hash; + int index = -1; + float totalPathDistance; + float distanceToNext; + float distanceToTarget; + PathPoint previous; + public boolean isFirst = false; + + public PathPoint(int var1, int var2, int var3) { + this.xCoord = var1; + this.yCoord = var2; + this.zCoord = var3; + this.hash = var1 | var2 << 10 | var3 << 20; + } + + public final float distanceTo(PathPoint var1) { + float var2 = (float)(var1.xCoord - this.xCoord); + float var3 = (float)(var1.yCoord - this.yCoord); + float var4 = (float)(var1.zCoord - this.zCoord); + return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4); + } + + public final boolean equals(Object var1) { + return ((PathPoint)var1).hash == this.hash; + } + + public final int hashCode() { + return this.hash; + } + + public final boolean isAssigned() { + return this.index >= 0; + } + + public final String toString() { + return this.xCoord + ", " + this.yCoord + ", " + this.zCoord; + } +} diff --git a/src/teavm/java/net/minecraft/game/level/path/Pathfinder.java b/src/teavm/java/net/minecraft/game/level/path/Pathfinder.java new file mode 100644 index 0000000..25ac613 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/level/path/Pathfinder.java @@ -0,0 +1,222 @@ +package net.minecraft.game.level.path; + +import java.util.HashMap; +import java.util.Map; +import net.minecraft.game.entity.Entity; +import net.minecraft.game.level.World; +import net.minecraft.game.level.material.Material; + +public final class Pathfinder { + private World worldMap; + private Path path = new Path(); + private Map pointMap = new HashMap(); + private PathPoint[] pathOptions = new PathPoint[32]; + + public Pathfinder(World var1) { + this.worldMap = var1; + } + + public final PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) { + return this.addToPath(var1, var2.posX, var2.boundingBox.minY, var2.posZ, 16.0F); + } + + public final PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) { + return this.addToPath(var1, (float)var2 + 0.5F, (float)var3 + 0.5F, (float)var4 + 0.5F, 16.0F); + } + + private PathEntity addToPath(Entity var1, float var2, float var3, float var4, float var5) { + this.path.clearPath(); + this.pointMap.clear(); + PathPoint var6 = this.openPoint((int)var1.boundingBox.minX, (int)var1.boundingBox.minY, (int)var1.boundingBox.minZ); + PathPoint var22 = this.openPoint((int)(var2 - var1.width / 2.0F), (int)var3, (int)(var4 - var1.width / 2.0F)); + PathPoint var24 = new PathPoint((int)(var1.width + 1.0F), (int)(var1.height + 1.0F), (int)(var1.width + 1.0F)); + float var27 = var5; + PathPoint var26 = var24; + PathPoint var25 = var22; + Entity var23 = var1; + Pathfinder var20 = this; + var6.totalPathDistance = 0.0F; + var6.distanceToNext = var6.distanceTo(var22); + var6.distanceToTarget = var6.distanceToNext; + this.path.clearPath(); + this.path.addPoint(var6); + PathPoint var7 = var6; + + PathEntity var10000; + while(true) { + if(var20.path.isPathEmpty()) { + var10000 = var7 == var6 ? null : createEntityPath(var7); + break; + } + + PathPoint var8 = var20.path.dequeue(); + if(var8.hash == var25.hash) { + var10000 = createEntityPath(var25); + break; + } + + if(var8.distanceTo(var25) < var7.distanceTo(var25)) { + var7 = var8; + } + + var8.isFirst = true; + int var15 = 0; + byte var16 = 0; + if(var20.getVerticalOffset(var8.xCoord, var8.yCoord + 1, var8.zCoord, var26) > 0) { + var16 = 1; + } + + PathPoint var17 = var20.getSafePoint(var23, var8.xCoord, var8.yCoord, var8.zCoord + 1, var26, var16); + PathPoint var18 = var20.getSafePoint(var23, var8.xCoord - 1, var8.yCoord, var8.zCoord, var26, var16); + PathPoint var19 = var20.getSafePoint(var23, var8.xCoord + 1, var8.yCoord, var8.zCoord, var26, var16); + PathPoint var10 = var20.getSafePoint(var23, var8.xCoord, var8.yCoord, var8.zCoord - 1, var26, var16); + if(var17 != null && !var17.isFirst && var17.distanceTo(var25) < var27) { + ++var15; + var20.pathOptions[0] = var17; + } + + if(var18 != null && !var18.isFirst && var18.distanceTo(var25) < var27) { + var20.pathOptions[var15++] = var18; + } + + if(var19 != null && !var19.isFirst && var19.distanceTo(var25) < var27) { + var20.pathOptions[var15++] = var19; + } + + if(var10 != null && !var10.isFirst && var10.distanceTo(var25) < var27) { + var20.pathOptions[var15++] = var10; + } + + int var9 = var15; + + for(int var28 = 0; var28 < var9; ++var28) { + PathPoint var11 = var20.pathOptions[var28]; + float var12 = var8.totalPathDistance + var8.distanceTo(var11); + if(!var11.isAssigned() || var12 < var11.totalPathDistance) { + var11.previous = var8; + var11.totalPathDistance = var12; + var11.distanceToNext = var11.distanceTo(var25); + if(var11.isAssigned()) { + var20.path.changeDistance(var11, var11.totalPathDistance + var11.distanceToNext); + } else { + var11.distanceToTarget = var11.totalPathDistance + var11.distanceToNext; + var20.path.addPoint(var11); + } + } + } + } + + PathEntity var21 = var10000; + return var21; + } + + private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) { + PathPoint var8 = null; + if(this.getVerticalOffset(var2, var3, var4, var5) > 0) { + var8 = this.openPoint(var2, var3, var4); + } + + if(var8 == null && this.getVerticalOffset(var2, var3 + var6, var4, var5) > 0) { + var8 = this.openPoint(var2, var3 + var6, var4); + } + + if(var8 != null) { + var6 = 0; + + while(true) { + if(var3 > 0) { + int var7 = this.getVerticalOffset(var2, var3 - 1, var4, var5); + if(var7 > 0) { + if(var7 < 0) { + return null; + } + + ++var6; + if(var6 >= 4) { + return null; + } + + --var3; + var8 = this.openPoint(var2, var3, var4); + continue; + } + } + + Material var9 = this.worldMap.getBlockMaterial(var2, var3 - 1, var4); + if(var9 == Material.water || var9 == Material.lava) { + return null; + } + break; + } + } + + return var8; + } + + private final PathPoint openPoint(int var1, int var2, int var3) { + int var4 = var1 | var2 << 10 | var3 << 20; + PathPoint var5 = (PathPoint)this.pointMap.get(Integer.valueOf(var4)); + if(var5 == null) { + var5 = new PathPoint(var1, var2, var3); + this.pointMap.put(Integer.valueOf(var4), var5); + } + + return var5; + } + + private int getVerticalOffset(int var1, int var2, int var3, PathPoint var4) { + for(int var5 = var1; var5 < var1 + var4.xCoord; ++var5) { + if(var5 < 0 || var5 >= this.worldMap.width) { + return 0; + } + + for(int var6 = var2; var6 < var2 + var4.yCoord; ++var6) { + if(var6 < 0 || var6 >= this.worldMap.height) { + return 0; + } + + int var7 = var3; + + while(var7 < var3 + var4.zCoord) { + if(var7 >= 0 && var7 < this.worldMap.length) { + Material var8 = this.worldMap.getBlockMaterial(var1, var2, var3); + if(var8.getIsSolid()) { + return 0; + } + + if(var8 != Material.water && var8 != Material.lava) { + ++var7; + continue; + } + + return -1; + } + + return 0; + } + } + } + + return 1; + } + + private static PathEntity createEntityPath(PathPoint var0) { + int var1 = 1; + + PathPoint var2; + for(var2 = var0; var2.previous != null; var2 = var2.previous) { + ++var1; + } + + PathPoint[] var3 = new PathPoint[var1]; + var2 = var0; + --var1; + + for(var3[var1] = var0; var2.previous != null; var3[var1] = var2) { + var2 = var2.previous; + --var1; + } + + return new PathEntity(var3); + } +} diff --git a/src/teavm/java/net/minecraft/game/physics/AxisAlignedBB.java b/src/teavm/java/net/minecraft/game/physics/AxisAlignedBB.java new file mode 100644 index 0000000..c7931eb --- /dev/null +++ b/src/teavm/java/net/minecraft/game/physics/AxisAlignedBB.java @@ -0,0 +1,266 @@ +package net.minecraft.game.physics; + +public final class AxisAlignedBB { + private float epsilon = 0.0F; + public float minX; + public float minY; + public float minZ; + public float maxX; + public float maxY; + public float maxZ; + + public AxisAlignedBB(float var1, float var2, float var3, float var4, float var5, float var6) { + this.minX = var1; + this.minY = var2; + this.minZ = var3; + this.maxX = var4; + this.maxY = var5; + this.maxZ = var6; + } + + public final AxisAlignedBB addCoord(float var1, float var2, float var3) { + float var4 = this.minX; + float var5 = this.minY; + float var6 = this.minZ; + float var7 = this.maxX; + float var8 = this.maxY; + float var9 = this.maxZ; + if(var1 < 0.0F) { + var4 += var1; + } + + if(var1 > 0.0F) { + var7 += var1; + } + + if(var2 < 0.0F) { + var5 += var2; + } + + if(var2 > 0.0F) { + var8 += var2; + } + + if(var3 < 0.0F) { + var6 += var3; + } + + if(var3 > 0.0F) { + var9 += var3; + } + + return new AxisAlignedBB(var4, var5, var6, var7, var8, var9); + } + + public final AxisAlignedBB expand(float var1, float var2, float var3) { + if(this.minY > this.maxY) { + throw new IllegalArgumentException("NOOOOOO!"); + } else { + float var4 = this.minX - var1; + float var5 = this.minY - var2; + float var6 = this.minZ - var3; + var1 += this.maxX; + var2 += this.maxY; + var3 += this.maxZ; + return new AxisAlignedBB(var4, var5, var6, var1, var2, var3); + } + } + + public final float calculateXOffset(AxisAlignedBB var1, float var2) { + if(var1.maxY > this.minY && var1.minY < this.maxY) { + if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) { + float var3; + if(var2 > 0.0F && var1.maxX <= this.minX) { + var3 = this.minX - var1.maxX; + if(var3 < var2) { + var2 = var3; + } + } + + if(var2 < 0.0F && var1.minX >= this.maxX) { + var3 = this.maxX - var1.minX; + if(var3 > var2) { + var2 = var3; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public final float calculateYOffset(AxisAlignedBB var1, float var2) { + if(var1.maxX > this.minX && var1.minX < this.maxX) { + if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) { + float var3; + if(var2 > 0.0F && var1.maxY <= this.minY) { + var3 = this.minY - var1.maxY; + if(var3 < var2) { + var2 = var3; + } + } + + if(var2 < 0.0F && var1.minY >= this.maxY) { + var3 = this.maxY - var1.minY; + if(var3 > var2) { + var2 = var3; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public final float calculateZOffset(AxisAlignedBB var1, float var2) { + if(var1.maxX > this.minX && var1.minX < this.maxX) { + if(var1.maxY > this.minY && var1.minY < this.maxY) { + float var3; + if(var2 > 0.0F && var1.maxZ <= this.minZ) { + var3 = this.minZ - var1.maxZ; + if(var3 < var2) { + var2 = var3; + } + } + + if(var2 < 0.0F && var1.minZ >= this.maxZ) { + var3 = this.maxZ - var1.minZ; + if(var3 > var2) { + var2 = var3; + } + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public final 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 final void offset(float var1, float var2, float var3) { + this.minX += var1; + this.minY += var2; + this.minZ += var3; + this.maxX += var1; + this.maxY += var2; + this.maxZ += var3; + } + + public final AxisAlignedBB copy() { + return new AxisAlignedBB(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + } + + public final MovingObjectPosition calculateIntercept(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); + var2 = 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(var2)) { + var2 = null; + } + + Vec3D var8 = null; + if(var3 != null) { + var8 = var3; + } + + if(var4 != null && (var8 == null || var1.squareDistanceTo(var4) < var1.squareDistanceTo(var8))) { + var8 = var4; + } + + if(var5 != null && (var8 == null || var1.squareDistanceTo(var5) < var1.squareDistanceTo(var8))) { + var8 = var5; + } + + if(var6 != null && (var8 == null || var1.squareDistanceTo(var6) < var1.squareDistanceTo(var8))) { + var8 = var6; + } + + if(var7 != null && (var8 == null || var1.squareDistanceTo(var7) < var1.squareDistanceTo(var8))) { + var8 = var7; + } + + if(var2 != null && (var8 == null || var1.squareDistanceTo(var2) < var1.squareDistanceTo(var8))) { + var8 = var2; + } + + if(var8 == null) { + return null; + } else { + byte var9 = -1; + if(var8 == var3) { + var9 = 4; + } + + if(var8 == var4) { + var9 = 5; + } + + if(var8 == var5) { + var9 = 0; + } + + if(var8 == var6) { + var9 = 1; + } + + if(var8 == var7) { + var9 = 2; + } + + if(var8 == var2) { + var9 = 3; + } + + return new MovingObjectPosition(0, 0, 0, var9, var8); + } + } + + 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; + } +} diff --git a/src/teavm/java/net/minecraft/game/physics/MovingObjectPosition.java b/src/teavm/java/net/minecraft/game/physics/MovingObjectPosition.java new file mode 100644 index 0000000..38ff908 --- /dev/null +++ b/src/teavm/java/net/minecraft/game/physics/MovingObjectPosition.java @@ -0,0 +1,28 @@ +package net.minecraft.game.physics; + +import net.minecraft.game.entity.Entity; + +public final class MovingObjectPosition { + public int typeOfHit; + public int blockX; + public int blockY; + public int blockZ; + public int sideHit; + public Vec3D hitVec; + public Entity entityHit; + + public MovingObjectPosition(int var1, int var2, int var3, int var4, Vec3D var5) { + this.typeOfHit = 0; + this.blockX = var1; + this.blockY = var2; + this.blockZ = var3; + this.sideHit = var4; + this.hitVec = new Vec3D(var5.xCoord, var5.yCoord, var5.zCoord); + } + + public MovingObjectPosition(Entity var1) { + this.typeOfHit = 1; + this.entityHit = var1; + this.hitVec = new Vec3D(var1.posX, var1.posY, var1.posZ); + } +} diff --git a/src/teavm/java/net/minecraft/game/physics/Vec3D.java b/src/teavm/java/net/minecraft/game/physics/Vec3D.java new file mode 100644 index 0000000..4029b4d --- /dev/null +++ b/src/teavm/java/net/minecraft/game/physics/Vec3D.java @@ -0,0 +1,82 @@ +package net.minecraft.game.physics; + +import net.PeytonPlayz585.math.MathHelper; + +public final class Vec3D { + public float xCoord; + public float yCoord; + public float zCoord; + + public Vec3D(float var1, float var2, float var3) { + this.xCoord = var1; + this.yCoord = var2; + this.zCoord = var3; + } + + public final Vec3D subtract(Vec3D var1) { + return new Vec3D(this.xCoord - var1.xCoord, this.yCoord - var1.yCoord, this.zCoord - var1.zCoord); + } + + public final Vec3D normalize() { + float var1 = MathHelper.sqrt_float(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord); + return new Vec3D(this.xCoord / var1, this.yCoord / var1, this.zCoord / var1); + } + + public final Vec3D addVector(float var1, float var2, float var3) { + return new Vec3D(this.xCoord + var1, this.yCoord + var2, this.zCoord + var3); + } + + public final float distance(Vec3D var1) { + float var2 = var1.xCoord - this.xCoord; + float var3 = var1.yCoord - this.yCoord; + float var4 = var1.zCoord - this.zCoord; + return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4); + } + + public final float squareDistanceTo(Vec3D var1) { + float var2 = var1.xCoord - this.xCoord; + float var3 = var1.yCoord - this.yCoord; + float var4 = var1.zCoord - this.zCoord; + return var2 * var2 + var3 * var3 + var4 * var4; + } + + public final Vec3D getIntermediateWithXValue(Vec3D var1, float var2) { + float var3 = var1.xCoord - this.xCoord; + float var4 = var1.yCoord - this.yCoord; + float var5 = var1.zCoord - this.zCoord; + if(var3 * var3 < 1.0E-7F) { + return null; + } else { + var2 = (var2 - this.xCoord) / var3; + return var2 >= 0.0F && var2 <= 1.0F ? new Vec3D(this.xCoord + var3 * var2, this.yCoord + var4 * var2, this.zCoord + var5 * var2) : null; + } + } + + public final Vec3D getIntermediateWithYValue(Vec3D var1, float var2) { + float var3 = var1.xCoord - this.xCoord; + float var4 = var1.yCoord - this.yCoord; + float var5 = var1.zCoord - this.zCoord; + if(var4 * var4 < 1.0E-7F) { + return null; + } else { + var2 = (var2 - this.yCoord) / var4; + return var2 >= 0.0F && var2 <= 1.0F ? new Vec3D(this.xCoord + var3 * var2, this.yCoord + var4 * var2, this.zCoord + var5 * var2) : null; + } + } + + public final Vec3D getIntermediateWithZValue(Vec3D var1, float var2) { + float var3 = var1.xCoord - this.xCoord; + float var4 = var1.yCoord - this.yCoord; + float var5 = var1.zCoord - this.zCoord; + if(var5 * var5 < 1.0E-7F) { + return null; + } else { + var2 = (var2 - this.zCoord) / var5; + return var2 >= 0.0F && var2 <= 1.0F ? new Vec3D(this.xCoord + var3 * var2, this.yCoord + var4 * var2, this.zCoord + var5 * var2) : null; + } + } + + public final String toString() { + return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ")"; + } +} diff --git a/src/teavm/java/org/lwjgl/BufferUtils.java b/src/teavm/java/org/lwjgl/BufferUtils.java new file mode 100644 index 0000000..3a28add --- /dev/null +++ b/src/teavm/java/org/lwjgl/BufferUtils.java @@ -0,0 +1,19 @@ +package org.lwjgl; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public class BufferUtils extends GLAllocation { + public static FloatBuffer createFloatBuffer(int i1) { + return createDirectFloatBuffer(i1); + } + + public static IntBuffer createIntBuffer(int i1) { + return createDirectIntBuffer(i1); + } + + public static ByteBuffer createByteBuffer(int i1) { + return createDirectByteBuffer(i1); + } +} diff --git a/src/teavm/java/org/lwjgl/GLAllocation.java b/src/teavm/java/org/lwjgl/GLAllocation.java new file mode 100644 index 0000000..f115976 --- /dev/null +++ b/src/teavm/java/org/lwjgl/GLAllocation.java @@ -0,0 +1,60 @@ +package org.lwjgl; + +import java.nio.*; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +public class GLAllocation { + + public GLAllocation() { + } + + public static synchronized int generateDisplayLists(int i) { + int j = GL11.glGenLists(i); + displayLists.add(Integer.valueOf(j)); + displayLists.add(Integer.valueOf(i)); + return j; + } + + public static synchronized void generateTextureNames(IntBuffer intbuffer) { + + for (int i = intbuffer.position(); i < intbuffer.limit(); i++) { + int tx = GL11.glGenTextures(); + intbuffer.put(i, tx); + textureNames.add(Integer.valueOf(tx)); + } + + } + + public static synchronized void deleteTexturesAndDisplayLists() { + for (int i = 0; i < displayLists.size(); i += 2) { + GL11.glDeleteLists(((Integer) displayLists.get(i)).intValue(), + ((Integer) displayLists.get(i + 1)).intValue()); + } + + for (int j = 0; j < textureNames.size(); j++) { + GL11.glDeleteTextures(((Integer) textureNames.get(j)).intValue()); + } + + displayLists.clear(); + textureNames.clear(); + } + + public static ByteBuffer createDirectByteBuffer(int par0) { + return ByteBuffer.wrap(new byte[par0]).order(ByteOrder.nativeOrder()); + } + + public static IntBuffer createDirectIntBuffer(int par0) { + return IntBuffer.wrap(new int[par0]); + } + + public static FloatBuffer createDirectFloatBuffer(int par0) { + return FloatBuffer.wrap(new float[par0]); + } + + private static List displayLists = new ArrayList(); + private static List textureNames = new ArrayList(); + +} \ No newline at end of file diff --git a/src/teavm/java/org/lwjgl/opengl/GL11.java b/src/teavm/java/org/lwjgl/opengl/GL11.java new file mode 100644 index 0000000..6228c38 --- /dev/null +++ b/src/teavm/java/org/lwjgl/opengl/GL11.java @@ -0,0 +1,5 @@ +package org.lwjgl.opengl; + +public class GL11 extends WebGLManager { + +} diff --git a/src/teavm/java/org/lwjgl/opengl/GLObjectMap.java b/src/teavm/java/org/lwjgl/opengl/GLObjectMap.java new file mode 100644 index 0000000..9826cd5 --- /dev/null +++ b/src/teavm/java/org/lwjgl/opengl/GLObjectMap.java @@ -0,0 +1,55 @@ +package org.lwjgl.opengl; + +public class GLObjectMap { + private Object[] values; + private int size; + private int insertIndex; + public int allocatedObjects; + + public GLObjectMap(int initialSize) { + this.values = new Object[initialSize]; + this.size = initialSize; + this.insertIndex = 0; + this.allocatedObjects = 0; + } + + public int register(T obj) { + int start = insertIndex; + do { + ++insertIndex; + if (insertIndex >= size) { + insertIndex = 0; + } + if (insertIndex == start) { + resize(); + return register(obj); + } + } while (values[insertIndex] != null); + values[insertIndex] = obj; + ++allocatedObjects; + return insertIndex; + } + + public T free(int obj) { + if (obj >= size || obj < 0) + return null; + Object ret = values[obj]; + values[obj] = null; + --allocatedObjects; + return (T) ret; + } + + public T get(int obj) { + if (obj >= size || obj < 0) + return null; + return (T) values[obj]; + } + + private void resize() { + int oldSize = size; + size += size / 2; + Object[] oldValues = values; + values = new Object[size]; + System.arraycopy(oldValues, 0, values, 0, oldSize); + } +} \ No newline at end of file diff --git a/src/teavm/java/org/lwjgl/opengl/RealOpenGLEnums.java b/src/teavm/java/org/lwjgl/opengl/RealOpenGLEnums.java new file mode 100644 index 0000000..75a633b --- /dev/null +++ b/src/teavm/java/org/lwjgl/opengl/RealOpenGLEnums.java @@ -0,0 +1,2417 @@ +package org.lwjgl.opengl; + +public class RealOpenGLEnums { + + // Field descriptor #544 I + public static final int GL_ACCUM = 256; + + // Field descriptor #544 I + public static final int GL_LOAD = 257; + + // Field descriptor #544 I + public static final int GL_RETURN = 258; + + // Field descriptor #544 I + public static final int GL_MULT = 259; + + // Field descriptor #544 I + public static final int GL_ADD = 260; + + // Field descriptor #544 I + public static final int GL_NEVER = 512; + + // Field descriptor #544 I + public static final int GL_LESS = 513; + + // Field descriptor #544 I + public static final int GL_EQUAL = 514; + + // Field descriptor #544 I + public static final int GL_LEQUAL = 515; + + // Field descriptor #544 I + public static final int GL_GREATER = 516; + + // Field descriptor #544 I + public static final int GL_NOTEQUAL = 517; + + // Field descriptor #544 I + public static final int GL_GEQUAL = 518; + + // Field descriptor #544 I + public static final int GL_ALWAYS = 519; + + // Field descriptor #544 I + public static final int GL_CURRENT_BIT = 1; + + // Field descriptor #544 I + public static final int GL_POINT_BIT = 2; + + // Field descriptor #544 I + public static final int GL_LINE_BIT = 4; + + // Field descriptor #544 I + public static final int GL_POLYGON_BIT = 8; + + // Field descriptor #544 I + public static final int GL_POLYGON_STIPPLE_BIT = 16; + + // Field descriptor #544 I + public static final int GL_PIXEL_MODE_BIT = 32; + + // Field descriptor #544 I + public static final int GL_LIGHTING_BIT = 64; + + // Field descriptor #544 I + public static final int GL_FOG_BIT = 128; + + // Field descriptor #544 I + public static final int GL_DEPTH_BUFFER_BIT = 256; + + // Field descriptor #544 I + public static final int GL_ACCUM_BUFFER_BIT = 512; + + // Field descriptor #544 I + public static final int GL_STENCIL_BUFFER_BIT = 1024; + + // Field descriptor #544 I + public static final int GL_VIEWPORT_BIT = 2048; + + // Field descriptor #544 I + public static final int GL_TRANSFORM_BIT = 4096; + + // Field descriptor #544 I + public static final int GL_ENABLE_BIT = 8192; + + // Field descriptor #544 I + public static final int GL_COLOR_BUFFER_BIT = 16384; + + // Field descriptor #544 I + public static final int GL_HINT_BIT = 32768; + + // Field descriptor #544 I + public static final int GL_EVAL_BIT = 65536; + + // Field descriptor #544 I + public static final int GL_LIST_BIT = 131072; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BIT = 262144; + + // Field descriptor #544 I + public static final int GL_SCISSOR_BIT = 524288; + + // Field descriptor #544 I + public static final int GL_ALL_ATTRIB_BITS = 1048575; + + // Field descriptor #544 I + public static final int GL_POINTS = 0; + + // Field descriptor #544 I + public static final int GL_LINES = 1; + + // Field descriptor #544 I + public static final int GL_LINE_LOOP = 2; + + // Field descriptor #544 I + public static final int GL_LINE_STRIP = 3; + + // Field descriptor #544 I + public static final int GL_TRIANGLES = 4; + + // Field descriptor #544 I + public static final int GL_TRIANGLE_STRIP = 5; + + // Field descriptor #544 I + public static final int GL_TRIANGLE_FAN = 6; + + // Field descriptor #544 I + public static final int GL_QUADS = 7; + + // Field descriptor #544 I + public static final int GL_QUAD_STRIP = 8; + + // Field descriptor #544 I + public static final int GL_POLYGON = 9; + + // Field descriptor #544 I + public static final int GL_ZERO = 0; + + // Field descriptor #544 I + public static final int GL_ONE = 1; + + // Field descriptor #544 I + public static final int GL_SRC_COLOR = 768; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_SRC_COLOR = 769; + + // Field descriptor #544 I + public static final int GL_SRC_ALPHA = 770; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_SRC_ALPHA = 771; + + // Field descriptor #544 I + public static final int GL_DST_ALPHA = 772; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_DST_ALPHA = 773; + + // Field descriptor #544 I + public static final int GL_DST_COLOR = 774; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_DST_COLOR = 775; + + // Field descriptor #544 I + public static final int GL_SRC_ALPHA_SATURATE = 776; + + // Field descriptor #544 I + public static final int GL_CONSTANT_COLOR = 32769; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_CONSTANT_COLOR = 32770; + + // Field descriptor #544 I + public static final int GL_CONSTANT_ALPHA = 32771; + + // Field descriptor #544 I + public static final int GL_ONE_MINUS_CONSTANT_ALPHA = 32772; + + // Field descriptor #544 I + public static final int GL_TRUE = 1; + + // Field descriptor #544 I + public static final int GL_FALSE = 0; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE0 = 12288; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE1 = 12289; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE2 = 12290; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE3 = 12291; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE4 = 12292; + + // Field descriptor #544 I + public static final int GL_CLIP_PLANE5 = 12293; + + // Field descriptor #544 I + public static final int GL_BYTE = 5120; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_BYTE = 5121; + + // Field descriptor #544 I + public static final int GL_SHORT = 5122; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_SHORT = 5123; + + // Field descriptor #544 I + public static final int GL_INT = 5124; + + // Field descriptor #544 I + public static final int GL_UNSIGNED_INT = 5125; + + // Field descriptor #544 I + public static final int GL_FLOAT = 5126; + + // Field descriptor #544 I + public static final int GL_2_BYTES = 5127; + + // Field descriptor #544 I + public static final int GL_3_BYTES = 5128; + + // Field descriptor #544 I + public static final int GL_4_BYTES = 5129; + + // Field descriptor #544 I + public static final int GL_DOUBLE = 5130; + + // Field descriptor #544 I + public static final int GL_NONE = 0; + + // Field descriptor #544 I + public static final int GL_FRONT_LEFT = 1024; + + // Field descriptor #544 I + public static final int GL_FRONT_RIGHT = 1025; + + // Field descriptor #544 I + public static final int GL_BACK_LEFT = 1026; + + // Field descriptor #544 I + public static final int GL_BACK_RIGHT = 1027; + + // Field descriptor #544 I + public static final int GL_FRONT = 1028; + + // Field descriptor #544 I + public static final int GL_BACK = 1029; + + // Field descriptor #544 I + public static final int GL_LEFT = 1030; + + // Field descriptor #544 I + public static final int GL_RIGHT = 1031; + + // Field descriptor #544 I + public static final int GL_FRONT_AND_BACK = 1032; + + // Field descriptor #544 I + public static final int GL_AUX0 = 1033; + + // Field descriptor #544 I + public static final int GL_AUX1 = 1034; + + // Field descriptor #544 I + public static final int GL_AUX2 = 1035; + + // Field descriptor #544 I + public static final int GL_AUX3 = 1036; + + // Field descriptor #544 I + public static final int GL_NO_ERROR = 0; + + // Field descriptor #544 I + public static final int GL_INVALID_ENUM = 1280; + + // Field descriptor #544 I + public static final int GL_INVALID_VALUE = 1281; + + // Field descriptor #544 I + public static final int GL_INVALID_OPERATION = 1282; + + // Field descriptor #544 I + public static final int GL_STACK_OVERFLOW = 1283; + + // Field descriptor #544 I + public static final int GL_STACK_UNDERFLOW = 1284; + + // Field descriptor #544 I + public static final int GL_OUT_OF_MEMORY = 1285; + + // Field descriptor #544 I + public static final int GL_2D = 1536; + + // Field descriptor #544 I + public static final int GL_3D = 1537; + + // Field descriptor #544 I + public static final int GL_3D_COLOR = 1538; + + // Field descriptor #544 I + public static final int GL_3D_COLOR_TEXTURE = 1539; + + // Field descriptor #544 I + public static final int GL_4D_COLOR_TEXTURE = 1540; + + // Field descriptor #544 I + public static final int GL_PASS_THROUGH_TOKEN = 1792; + + // Field descriptor #544 I + public static final int GL_POINT_TOKEN = 1793; + + // Field descriptor #544 I + public static final int GL_LINE_TOKEN = 1794; + + // Field descriptor #544 I + public static final int GL_POLYGON_TOKEN = 1795; + + // Field descriptor #544 I + public static final int GL_BITMAP_TOKEN = 1796; + + // Field descriptor #544 I + public static final int GL_DRAW_PIXEL_TOKEN = 1797; + + // Field descriptor #544 I + public static final int GL_COPY_PIXEL_TOKEN = 1798; + + // Field descriptor #544 I + public static final int GL_LINE_RESET_TOKEN = 1799; + + // Field descriptor #544 I + public static final int GL_EXP = 2048; + + // Field descriptor #544 I + public static final int GL_EXP2 = 2049; + + // Field descriptor #544 I + public static final int GL_CW = 2304; + + // Field descriptor #544 I + public static final int GL_CCW = 2305; + + // Field descriptor #544 I + public static final int GL_COEFF = 2560; + + // Field descriptor #544 I + public static final int GL_ORDER = 2561; + + // Field descriptor #544 I + public static final int GL_DOMAIN = 2562; + + // Field descriptor #544 I + public static final int GL_CURRENT_COLOR = 2816; + + // Field descriptor #544 I + public static final int GL_CURRENT_INDEX = 2817; + + // Field descriptor #544 I + public static final int GL_CURRENT_NORMAL = 2818; + + // Field descriptor #544 I + public static final int GL_CURRENT_TEXTURE_COORDS = 2819; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_COLOR = 2820; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_INDEX = 2821; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_TEXTURE_COORDS = 2822; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_POSITION = 2823; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_POSITION_VALID = 2824; + + // Field descriptor #544 I + public static final int GL_CURRENT_RASTER_DISTANCE = 2825; + + // Field descriptor #544 I + public static final int GL_POINT_SMOOTH = 2832; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE = 2833; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE_RANGE = 2834; + + // Field descriptor #544 I + public static final int GL_POINT_SIZE_GRANULARITY = 2835; + + // Field descriptor #544 I + public static final int GL_LINE_SMOOTH = 2848; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH = 2849; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH_RANGE = 2850; + + // Field descriptor #544 I + public static final int GL_LINE_WIDTH_GRANULARITY = 2851; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE = 2852; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE_PATTERN = 2853; + + // Field descriptor #544 I + public static final int GL_LINE_STIPPLE_REPEAT = 2854; + + // Field descriptor #544 I + public static final int GL_LIST_MODE = 2864; + + // Field descriptor #544 I + public static final int GL_MAX_LIST_NESTING = 2865; + + // Field descriptor #544 I + public static final int GL_LIST_BASE = 2866; + + // Field descriptor #544 I + public static final int GL_LIST_INDEX = 2867; + + // Field descriptor #544 I + public static final int GL_POLYGON_MODE = 2880; + + // Field descriptor #544 I + public static final int GL_POLYGON_SMOOTH = 2881; + + // Field descriptor #544 I + public static final int GL_POLYGON_STIPPLE = 2882; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG = 2883; + + // Field descriptor #544 I + public static final int GL_CULL_FACE = 2884; + + // Field descriptor #544 I + public static final int GL_CULL_FACE_MODE = 2885; + + // Field descriptor #544 I + public static final int GL_FRONT_FACE = 2886; + + // Field descriptor #544 I + public static final int GL_LIGHTING = 2896; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_LOCAL_VIEWER = 2897; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_TWO_SIDE = 2898; + + // Field descriptor #544 I + public static final int GL_LIGHT_MODEL_AMBIENT = 2899; + + // Field descriptor #544 I + public static final int GL_SHADE_MODEL = 2900; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL_FACE = 2901; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL_PARAMETER = 2902; + + // Field descriptor #544 I + public static final int GL_COLOR_MATERIAL = 2903; + + // Field descriptor #544 I + public static final int GL_FOG = 2912; + + // Field descriptor #544 I + public static final int GL_FOG_INDEX = 2913; + + // Field descriptor #544 I + public static final int GL_FOG_DENSITY = 2914; + + // Field descriptor #544 I + public static final int GL_FOG_START = 2915; + + // Field descriptor #544 I + public static final int GL_FOG_END = 2916; + + // Field descriptor #544 I + public static final int GL_FOG_MODE = 2917; + + // Field descriptor #544 I + public static final int GL_FOG_COLOR = 2918; + + // Field descriptor #544 I + public static final int GL_DEPTH_RANGE = 2928; + + // Field descriptor #544 I + public static final int GL_DEPTH_TEST = 2929; + + // Field descriptor #544 I + public static final int GL_DEPTH_WRITEMASK = 2930; + + // Field descriptor #544 I + public static final int GL_DEPTH_CLEAR_VALUE = 2931; + + // Field descriptor #544 I + public static final int GL_DEPTH_FUNC = 2932; + + // Field descriptor #544 I + public static final int GL_ACCUM_CLEAR_VALUE = 2944; + + // Field descriptor #544 I + public static final int GL_STENCIL_TEST = 2960; + + // Field descriptor #544 I + public static final int GL_STENCIL_CLEAR_VALUE = 2961; + + // Field descriptor #544 I + public static final int GL_STENCIL_FUNC = 2962; + + // Field descriptor #544 I + public static final int GL_STENCIL_VALUE_MASK = 2963; + + // Field descriptor #544 I + public static final int GL_STENCIL_FAIL = 2964; + + // Field descriptor #544 I + public static final int GL_STENCIL_PASS_DEPTH_FAIL = 2965; + + // Field descriptor #544 I + public static final int GL_STENCIL_PASS_DEPTH_PASS = 2966; + + // Field descriptor #544 I + public static final int GL_STENCIL_REF = 2967; + + // Field descriptor #544 I + public static final int GL_STENCIL_WRITEMASK = 2968; + + // Field descriptor #544 I + public static final int GL_MATRIX_MODE = 2976; + + // Field descriptor #544 I + public static final int GL_NORMALIZE = 2977; + + // Field descriptor #544 I + public static final int GL_VIEWPORT = 2978; + + // Field descriptor #544 I + public static final int GL_MODELVIEW_STACK_DEPTH = 2979; + + // Field descriptor #544 I + public static final int GL_PROJECTION_STACK_DEPTH = 2980; + + // Field descriptor #544 I + public static final int GL_TEXTURE_STACK_DEPTH = 2981; + + // Field descriptor #544 I + public static final int GL_MODELVIEW_MATRIX = 2982; + + // Field descriptor #544 I + public static final int GL_PROJECTION_MATRIX = 2983; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MATRIX = 2984; + + // Field descriptor #544 I + public static final int GL_ATTRIB_STACK_DEPTH = 2992; + + // Field descriptor #544 I + public static final int GL_CLIENT_ATTRIB_STACK_DEPTH = 2993; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST = 3008; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST_FUNC = 3009; + + // Field descriptor #544 I + public static final int GL_ALPHA_TEST_REF = 3010; + + // Field descriptor #544 I + public static final int GL_DITHER = 3024; + + // Field descriptor #544 I + public static final int GL_BLEND_DST = 3040; + + // Field descriptor #544 I + public static final int GL_BLEND_SRC = 3041; + + // Field descriptor #544 I + public static final int GL_BLEND = 3042; + + // Field descriptor #544 I + public static final int GL_LOGIC_OP_MODE = 3056; + + // Field descriptor #544 I + public static final int GL_INDEX_LOGIC_OP = 3057; + + // Field descriptor #544 I + public static final int GL_COLOR_LOGIC_OP = 3058; + + // Field descriptor #544 I + public static final int GL_AUX_BUFFERS = 3072; + + // Field descriptor #544 I + public static final int GL_DRAW_BUFFER = 3073; + + // Field descriptor #544 I + public static final int GL_READ_BUFFER = 3074; + + // Field descriptor #544 I + public static final int GL_SCISSOR_BOX = 3088; + + // Field descriptor #544 I + public static final int GL_SCISSOR_TEST = 3089; + + // Field descriptor #544 I + public static final int GL_INDEX_CLEAR_VALUE = 3104; + + // Field descriptor #544 I + public static final int GL_INDEX_WRITEMASK = 3105; + + // Field descriptor #544 I + public static final int GL_COLOR_CLEAR_VALUE = 3106; + + // Field descriptor #544 I + public static final int GL_COLOR_WRITEMASK = 3107; + + // Field descriptor #544 I + public static final int GL_INDEX_MODE = 3120; + + // Field descriptor #544 I + public static final int GL_RGBA_MODE = 3121; + + // Field descriptor #544 I + public static final int GL_DOUBLEBUFFER = 3122; + + // Field descriptor #544 I + public static final int GL_STEREO = 3123; + + // Field descriptor #544 I + public static final int GL_RENDER_MODE = 3136; + + // Field descriptor #544 I + public static final int GL_PERSPECTIVE_CORRECTION_HINT = 3152; + + // Field descriptor #544 I + public static final int GL_POINT_SMOOTH_HINT = 3153; + + // Field descriptor #544 I + public static final int GL_LINE_SMOOTH_HINT = 3154; + + // Field descriptor #544 I + public static final int GL_POLYGON_SMOOTH_HINT = 3155; + + // Field descriptor #544 I + public static final int GL_FOG_HINT = 3156; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_S = 3168; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_T = 3169; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_R = 3170; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_Q = 3171; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_I = 3184; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_S_TO_S = 3185; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_R = 3186; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_G = 3187; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_B = 3188; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_A = 3189; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_R_TO_R = 3190; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_G_TO_G = 3191; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_B_TO_B = 3192; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_A_TO_A = 3193; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_I_SIZE = 3248; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_S_TO_S_SIZE = 3249; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_R_SIZE = 3250; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_G_SIZE = 3251; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_B_SIZE = 3252; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_I_TO_A_SIZE = 3253; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_R_TO_R_SIZE = 3254; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_G_TO_G_SIZE = 3255; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_B_TO_B_SIZE = 3256; + + // Field descriptor #544 I + public static final int GL_PIXEL_MAP_A_TO_A_SIZE = 3257; + + // Field descriptor #544 I + public static final int GL_UNPACK_SWAP_BYTES = 3312; + + // Field descriptor #544 I + public static final int GL_UNPACK_LSB_FIRST = 3313; + + // Field descriptor #544 I + public static final int GL_UNPACK_ROW_LENGTH = 3314; + + // Field descriptor #544 I + public static final int GL_UNPACK_SKIP_ROWS = 3315; + + // Field descriptor #544 I + public static final int GL_UNPACK_SKIP_PIXELS = 3316; + + // Field descriptor #544 I + public static final int GL_UNPACK_ALIGNMENT = 3317; + + // Field descriptor #544 I + public static final int GL_PACK_SWAP_BYTES = 3328; + + // Field descriptor #544 I + public static final int GL_PACK_LSB_FIRST = 3329; + + // Field descriptor #544 I + public static final int GL_PACK_ROW_LENGTH = 3330; + + // Field descriptor #544 I + public static final int GL_PACK_SKIP_ROWS = 3331; + + // Field descriptor #544 I + public static final int GL_PACK_SKIP_PIXELS = 3332; + + // Field descriptor #544 I + public static final int GL_PACK_ALIGNMENT = 3333; + + // Field descriptor #544 I + public static final int GL_MAP_COLOR = 3344; + + // Field descriptor #544 I + public static final int GL_MAP_STENCIL = 3345; + + // Field descriptor #544 I + public static final int GL_INDEX_SHIFT = 3346; + + // Field descriptor #544 I + public static final int GL_INDEX_OFFSET = 3347; + + // Field descriptor #544 I + public static final int GL_RED_SCALE = 3348; + + // Field descriptor #544 I + public static final int GL_RED_BIAS = 3349; + + // Field descriptor #544 I + public static final int GL_ZOOM_X = 3350; + + // Field descriptor #544 I + public static final int GL_ZOOM_Y = 3351; + + // Field descriptor #544 I + public static final int GL_GREEN_SCALE = 3352; + + // Field descriptor #544 I + public static final int GL_GREEN_BIAS = 3353; + + // Field descriptor #544 I + public static final int GL_BLUE_SCALE = 3354; + + // Field descriptor #544 I + public static final int GL_BLUE_BIAS = 3355; + + // Field descriptor #544 I + public static final int GL_ALPHA_SCALE = 3356; + + // Field descriptor #544 I + public static final int GL_ALPHA_BIAS = 3357; + + // Field descriptor #544 I + public static final int GL_DEPTH_SCALE = 3358; + + // Field descriptor #544 I + public static final int GL_DEPTH_BIAS = 3359; + + // Field descriptor #544 I + public static final int GL_MAX_EVAL_ORDER = 3376; + + // Field descriptor #544 I + public static final int GL_MAX_LIGHTS = 3377; + + // Field descriptor #544 I + public static final int GL_MAX_CLIP_PLANES = 3378; + + // Field descriptor #544 I + public static final int GL_MAX_TEXTURE_SIZE = 3379; + + // Field descriptor #544 I + public static final int GL_MAX_PIXEL_MAP_TABLE = 3380; + + // Field descriptor #544 I + public static final int GL_MAX_ATTRIB_STACK_DEPTH = 3381; + + // Field descriptor #544 I + public static final int GL_MAX_MODELVIEW_STACK_DEPTH = 3382; + + // Field descriptor #544 I + public static final int GL_MAX_NAME_STACK_DEPTH = 3383; + + // Field descriptor #544 I + public static final int GL_MAX_PROJECTION_STACK_DEPTH = 3384; + + // Field descriptor #544 I + public static final int GL_MAX_TEXTURE_STACK_DEPTH = 3385; + + // Field descriptor #544 I + public static final int GL_MAX_VIEWPORT_DIMS = 3386; + + // Field descriptor #544 I + public static final int GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 3387; + + // Field descriptor #544 I + public static final int GL_SUBPIXEL_BITS = 3408; + + // Field descriptor #544 I + public static final int GL_INDEX_BITS = 3409; + + // Field descriptor #544 I + public static final int GL_RED_BITS = 3410; + + // Field descriptor #544 I + public static final int GL_GREEN_BITS = 3411; + + // Field descriptor #544 I + public static final int GL_BLUE_BITS = 3412; + + // Field descriptor #544 I + public static final int GL_ALPHA_BITS = 3413; + + // Field descriptor #544 I + public static final int GL_DEPTH_BITS = 3414; + + // Field descriptor #544 I + public static final int GL_STENCIL_BITS = 3415; + + // Field descriptor #544 I + public static final int GL_ACCUM_RED_BITS = 3416; + + // Field descriptor #544 I + public static final int GL_ACCUM_GREEN_BITS = 3417; + + // Field descriptor #544 I + public static final int GL_ACCUM_BLUE_BITS = 3418; + + // Field descriptor #544 I + public static final int GL_ACCUM_ALPHA_BITS = 3419; + + // Field descriptor #544 I + public static final int GL_NAME_STACK_DEPTH = 3440; + + // Field descriptor #544 I + public static final int GL_AUTO_NORMAL = 3456; + + // Field descriptor #544 I + public static final int GL_MAP1_COLOR_4 = 3472; + + // Field descriptor #544 I + public static final int GL_MAP1_INDEX = 3473; + + // Field descriptor #544 I + public static final int GL_MAP1_NORMAL = 3474; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_1 = 3475; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_2 = 3476; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_3 = 3477; + + // Field descriptor #544 I + public static final int GL_MAP1_TEXTURE_COORD_4 = 3478; + + // Field descriptor #544 I + public static final int GL_MAP1_VERTEX_3 = 3479; + + // Field descriptor #544 I + public static final int GL_MAP1_VERTEX_4 = 3480; + + // Field descriptor #544 I + public static final int GL_MAP2_COLOR_4 = 3504; + + // Field descriptor #544 I + public static final int GL_MAP2_INDEX = 3505; + + // Field descriptor #544 I + public static final int GL_MAP2_NORMAL = 3506; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_1 = 3507; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_2 = 3508; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_3 = 3509; + + // Field descriptor #544 I + public static final int GL_MAP2_TEXTURE_COORD_4 = 3510; + + // Field descriptor #544 I + public static final int GL_MAP2_VERTEX_3 = 3511; + + // Field descriptor #544 I + public static final int GL_MAP2_VERTEX_4 = 3512; + + // Field descriptor #544 I + public static final int GL_MAP1_GRID_DOMAIN = 3536; + + // Field descriptor #544 I + public static final int GL_MAP1_GRID_SEGMENTS = 3537; + + // Field descriptor #544 I + public static final int GL_MAP2_GRID_DOMAIN = 3538; + + // Field descriptor #544 I + public static final int GL_MAP2_GRID_SEGMENTS = 3539; + + // Field descriptor #544 I + public static final int GL_TEXTURE_1D = 3552; + + // Field descriptor #544 I + public static final int GL_TEXTURE_2D = 3553; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_POINTER = 3568; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_SIZE = 3569; + + // Field descriptor #544 I + public static final int GL_FEEDBACK_BUFFER_TYPE = 3570; + + // Field descriptor #544 I + public static final int GL_SELECTION_BUFFER_POINTER = 3571; + + // Field descriptor #544 I + public static final int GL_SELECTION_BUFFER_SIZE = 3572; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WIDTH = 4096; + + // Field descriptor #544 I + public static final int GL_TEXTURE_HEIGHT = 4097; + + // Field descriptor #544 I + public static final int GL_TEXTURE_INTERNAL_FORMAT = 4099; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BORDER_COLOR = 4100; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BORDER = 4101; + + // Field descriptor #544 I + public static final int GL_DONT_CARE = 4352; + + // Field descriptor #544 I + public static final int GL_FASTEST = 4353; + + // Field descriptor #544 I + public static final int GL_NICEST = 4354; + + // Field descriptor #544 I + public static final int GL_LIGHT0 = 16384; + + // Field descriptor #544 I + public static final int GL_LIGHT1 = 16385; + + // Field descriptor #544 I + public static final int GL_LIGHT2 = 16386; + + // Field descriptor #544 I + public static final int GL_LIGHT3 = 16387; + + // Field descriptor #544 I + public static final int GL_LIGHT4 = 16388; + + // Field descriptor #544 I + public static final int GL_LIGHT5 = 16389; + + // Field descriptor #544 I + public static final int GL_LIGHT6 = 16390; + + // Field descriptor #544 I + public static final int GL_LIGHT7 = 16391; + + // Field descriptor #544 I + public static final int GL_AMBIENT = 4608; + + // Field descriptor #544 I + public static final int GL_DIFFUSE = 4609; + + // Field descriptor #544 I + public static final int GL_SPECULAR = 4610; + + // Field descriptor #544 I + public static final int GL_POSITION = 4611; + + // Field descriptor #544 I + public static final int GL_SPOT_DIRECTION = 4612; + + // Field descriptor #544 I + public static final int GL_SPOT_EXPONENT = 4613; + + // Field descriptor #544 I + public static final int GL_SPOT_CUTOFF = 4614; + + // Field descriptor #544 I + public static final int GL_CONSTANT_ATTENUATION = 4615; + + // Field descriptor #544 I + public static final int GL_LINEAR_ATTENUATION = 4616; + + // Field descriptor #544 I + public static final int GL_QUADRATIC_ATTENUATION = 4617; + + // Field descriptor #544 I + public static final int GL_COMPILE = 4864; + + // Field descriptor #544 I + public static final int GL_COMPILE_AND_EXECUTE = 4865; + + // Field descriptor #544 I + public static final int GL_CLEAR = 5376; + + // Field descriptor #544 I + public static final int GL_AND = 5377; + + // Field descriptor #544 I + public static final int GL_AND_REVERSE = 5378; + + // Field descriptor #544 I + public static final int GL_COPY = 5379; + + // Field descriptor #544 I + public static final int GL_AND_INVERTED = 5380; + + // Field descriptor #544 I + public static final int GL_NOOP = 5381; + + // Field descriptor #544 I + public static final int GL_XOR = 5382; + + // Field descriptor #544 I + public static final int GL_OR = 5383; + + // Field descriptor #544 I + public static final int GL_NOR = 5384; + + // Field descriptor #544 I + public static final int GL_EQUIV = 5385; + + // Field descriptor #544 I + public static final int GL_INVERT = 5386; + + // Field descriptor #544 I + public static final int GL_OR_REVERSE = 5387; + + // Field descriptor #544 I + public static final int GL_COPY_INVERTED = 5388; + + // Field descriptor #544 I + public static final int GL_OR_INVERTED = 5389; + + // Field descriptor #544 I + public static final int GL_NAND = 5390; + + // Field descriptor #544 I + public static final int GL_SET = 5391; + + // Field descriptor #544 I + public static final int GL_EMISSION = 5632; + + // Field descriptor #544 I + public static final int GL_SHININESS = 5633; + + // Field descriptor #544 I + public static final int GL_AMBIENT_AND_DIFFUSE = 5634; + + // Field descriptor #544 I + public static final int GL_COLOR_INDEXES = 5635; + + // Field descriptor #544 I + public static final int GL_MODELVIEW = 5888; + + // Field descriptor #544 I + public static final int GL_PROJECTION = 5889; + + // Field descriptor #544 I + public static final int GL_TEXTURE = 5890; + + // Field descriptor #544 I + public static final int GL_COLOR = 6144; + + // Field descriptor #544 I + public static final int GL_DEPTH = 6145; + + // Field descriptor #544 I + public static final int GL_STENCIL = 6146; + + // Field descriptor #544 I + public static final int GL_COLOR_INDEX = 6400; + + // Field descriptor #544 I + public static final int GL_STENCIL_INDEX = 6401; + + // Field descriptor #544 I + public static final int GL_DEPTH_COMPONENT = 6402; + + // Field descriptor #544 I + public static final int GL_RED = 6403; + + // Field descriptor #544 I + public static final int GL_GREEN = 6404; + + // Field descriptor #544 I + public static final int GL_BLUE = 6405; + + // Field descriptor #544 I + public static final int GL_ALPHA = 6406; + + // Field descriptor #544 I + public static final int GL_RGB = 6407; + + // Field descriptor #544 I + public static final int GL_RGBA = 6408; + + // Field descriptor #544 I + public static final int GL_LUMINANCE = 6409; + + // Field descriptor #544 I + public static final int GL_LUMINANCE_ALPHA = 6410; + + // Field descriptor #544 I + public static final int GL_BITMAP = 6656; + + // Field descriptor #544 I + public static final int GL_POINT = 6912; + + // Field descriptor #544 I + public static final int GL_LINE = 6913; + + // Field descriptor #544 I + public static final int GL_FILL = 6914; + + // Field descriptor #544 I + public static final int GL_RENDER = 7168; + + // Field descriptor #544 I + public static final int GL_FEEDBACK = 7169; + + // Field descriptor #544 I + public static final int GL_SELECT = 7170; + + // Field descriptor #544 I + public static final int GL_FLAT = 7424; + + // Field descriptor #544 I + public static final int GL_SMOOTH = 7425; + + // Field descriptor #544 I + public static final int GL_KEEP = 7680; + + // Field descriptor #544 I + public static final int GL_REPLACE = 7681; + + // Field descriptor #544 I + public static final int GL_INCR = 7682; + + // Field descriptor #544 I + public static final int GL_DECR = 7683; + + // Field descriptor #544 I + public static final int GL_VENDOR = 7936; + + // Field descriptor #544 I + public static final int GL_RENDERER = 7937; + + // Field descriptor #544 I + public static final int GL_VERSION = 7938; + + // Field descriptor #544 I + public static final int GL_EXTENSIONS = 7939; + + // Field descriptor #544 I + public static final int GL_S = 8192; + + // Field descriptor #544 I + public static final int GL_T = 8193; + + // Field descriptor #544 I + public static final int GL_R = 8194; + + // Field descriptor #544 I + public static final int GL_Q = 8195; + + // Field descriptor #544 I + public static final int GL_MODULATE = 8448; + + // Field descriptor #544 I + public static final int GL_DECAL = 8449; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV_MODE = 8704; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV_COLOR = 8705; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ENV = 8960; + + // Field descriptor #544 I + public static final int GL_EYE_LINEAR = 9216; + + // Field descriptor #544 I + public static final int GL_OBJECT_LINEAR = 9217; + + // Field descriptor #544 I + public static final int GL_SPHERE_MAP = 9218; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GEN_MODE = 9472; + + // Field descriptor #544 I + public static final int GL_OBJECT_PLANE = 9473; + + // Field descriptor #544 I + public static final int GL_EYE_PLANE = 9474; + + // Field descriptor #544 I + public static final int GL_NEAREST = 9728; + + // Field descriptor #544 I + public static final int GL_LINEAR = 9729; + + // Field descriptor #544 I + public static final int GL_NEAREST_MIPMAP_NEAREST = 9984; + + // Field descriptor #544 I + public static final int GL_LINEAR_MIPMAP_NEAREST = 9985; + + // Field descriptor #544 I + public static final int GL_NEAREST_MIPMAP_LINEAR = 9986; + + // Field descriptor #544 I + public static final int GL_LINEAR_MIPMAP_LINEAR = 9987; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MAG_FILTER = 10240; + + // Field descriptor #544 I + public static final int GL_TEXTURE_MIN_FILTER = 10241; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WRAP_S = 10242; + + // Field descriptor #544 I + public static final int GL_TEXTURE_WRAP_T = 10243; + + // Field descriptor #544 I + public static final int GL_CLAMP = 10496; + + // Field descriptor #544 I + public static final int GL_REPEAT = 10497; + + // Field descriptor #544 I + public static final int GL_CLIENT_PIXEL_STORE_BIT = 1; + + // Field descriptor #544 I + public static final int GL_CLIENT_VERTEX_ARRAY_BIT = 2; + + // Field descriptor #544 I + public static final int GL_ALL_CLIENT_ATTRIB_BITS = -1; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_FACTOR = 32824; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_UNITS = 10752; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_POINT = 10753; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_LINE = 10754; + + // Field descriptor #544 I + public static final int GL_POLYGON_OFFSET_FILL = 32823; + + // Field descriptor #544 I + public static final int GL_ALPHA4 = 32827; + + // Field descriptor #544 I + public static final int GL_ALPHA8 = 32828; + + // Field descriptor #544 I + public static final int GL_ALPHA12 = 32829; + + // Field descriptor #544 I + public static final int GL_ALPHA16 = 32830; + + // Field descriptor #544 I + public static final int GL_LUMINANCE4 = 32831; + + // Field descriptor #544 I + public static final int GL_LUMINANCE8 = 32832; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12 = 32833; + + // Field descriptor #544 I + public static final int GL_LUMINANCE16 = 32834; + + // Field descriptor #544 I + public static final int GL_LUMINANCE4_ALPHA4 = 32835; + + // Field descriptor #544 I + public static final int GL_LUMINANCE6_ALPHA2 = 32836; + + // Field descriptor #544 I + public static final int GL_LUMINANCE8_ALPHA8 = 32837; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12_ALPHA4 = 32838; + + // Field descriptor #544 I + public static final int GL_LUMINANCE12_ALPHA12 = 32839; + + // Field descriptor #544 I + public static final int GL_LUMINANCE16_ALPHA16 = 32840; + + // Field descriptor #544 I + public static final int GL_INTENSITY = 32841; + + // Field descriptor #544 I + public static final int GL_INTENSITY4 = 32842; + + // Field descriptor #544 I + public static final int GL_INTENSITY8 = 32843; + + // Field descriptor #544 I + public static final int GL_INTENSITY12 = 32844; + + // Field descriptor #544 I + public static final int GL_INTENSITY16 = 32845; + + // Field descriptor #544 I + public static final int GL_R3_G3_B2 = 10768; + + // Field descriptor #544 I + public static final int GL_RGB4 = 32847; + + // Field descriptor #544 I + public static final int GL_RGB5 = 32848; + + // Field descriptor #544 I + public static final int GL_RGB8 = 32849; + + // Field descriptor #544 I + public static final int GL_RGB10 = 32850; + + // Field descriptor #544 I + public static final int GL_RGB12 = 32851; + + // Field descriptor #544 I + public static final int GL_RGB16 = 32852; + + // Field descriptor #544 I + public static final int GL_RGBA2 = 32853; + + // Field descriptor #544 I + public static final int GL_RGBA4 = 32854; + + // Field descriptor #544 I + public static final int GL_RGB5_A1 = 32855; + + // Field descriptor #544 I + public static final int GL_RGBA8 = 32856; + + // Field descriptor #544 I + public static final int GL_RGB10_A2 = 32857; + + // Field descriptor #544 I + public static final int GL_RGBA12 = 32858; + + // Field descriptor #544 I + public static final int GL_RGBA16 = 32859; + + // Field descriptor #544 I + public static final int GL_TEXTURE_RED_SIZE = 32860; + + // Field descriptor #544 I + public static final int GL_TEXTURE_GREEN_SIZE = 32861; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BLUE_SIZE = 32862; + + // Field descriptor #544 I + public static final int GL_TEXTURE_ALPHA_SIZE = 32863; + + // Field descriptor #544 I + public static final int GL_TEXTURE_LUMINANCE_SIZE = 32864; + + // Field descriptor #544 I + public static final int GL_TEXTURE_INTENSITY_SIZE = 32865; + + // Field descriptor #544 I + public static final int GL_PROXY_TEXTURE_1D = 32867; + + // Field descriptor #544 I + public static final int GL_PROXY_TEXTURE_2D = 32868; + + // Field descriptor #544 I + public static final int GL_TEXTURE_PRIORITY = 32870; + + // Field descriptor #544 I + public static final int GL_TEXTURE_RESIDENT = 32871; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BINDING_1D = 32872; + + // Field descriptor #544 I + public static final int GL_TEXTURE_BINDING_2D = 32873; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY = 32884; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY = 32885; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY = 32886; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY = 32887; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY = 32888; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY = 32889; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_SIZE = 32890; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_TYPE = 32891; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_STRIDE = 32892; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_TYPE = 32894; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_STRIDE = 32895; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_SIZE = 32897; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_TYPE = 32898; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_STRIDE = 32899; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_TYPE = 32901; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_STRIDE = 32902; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_SIZE = 32904; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_TYPE = 32905; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_STRIDE = 32906; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY_STRIDE = 32908; + + // Field descriptor #544 I + public static final int GL_VERTEX_ARRAY_POINTER = 32910; + + // Field descriptor #544 I + public static final int GL_NORMAL_ARRAY_POINTER = 32911; + + // Field descriptor #544 I + public static final int GL_COLOR_ARRAY_POINTER = 32912; + + // Field descriptor #544 I + public static final int GL_INDEX_ARRAY_POINTER = 32913; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COORD_ARRAY_POINTER = 32914; + + // Field descriptor #544 I + public static final int GL_EDGE_FLAG_ARRAY_POINTER = 32915; + + // Field descriptor #544 I + public static final int GL_V2F = 10784; + + // Field descriptor #544 I + public static final int GL_V3F = 10785; + + // Field descriptor #544 I + public static final int GL_C4UB_V2F = 10786; + + // Field descriptor #544 I + public static final int GL_C4UB_V3F = 10787; + + // Field descriptor #544 I + public static final int GL_C3F_V3F = 10788; + + // Field descriptor #544 I + public static final int GL_N3F_V3F = 10789; + + // Field descriptor #544 I + public static final int GL_C4F_N3F_V3F = 10790; + + // Field descriptor #544 I + public static final int GL_T2F_V3F = 10791; + + // Field descriptor #544 I + public static final int GL_T4F_V4F = 10792; + + // Field descriptor #544 I + public static final int GL_T2F_C4UB_V3F = 10793; + + // Field descriptor #544 I + public static final int GL_T2F_C3F_V3F = 10794; + + // Field descriptor #544 I + public static final int GL_T2F_N3F_V3F = 10795; + + // Field descriptor #544 I + public static final int GL_T2F_C4F_N3F_V3F = 10796; + + // Field descriptor #544 I + public static final int GL_T4F_C4F_N3F_V4F = 10797; + + // Field descriptor #544 I + public static final int GL_LOGIC_OP = 3057; + + // Field descriptor #544 I + public static final int GL_TEXTURE_COMPONENTS = 4099; + + // Field descriptor #45 I + public static final int GL_TEXTURE_BINDING_3D = 32874; + + // Field descriptor #45 I + public static final int GL_PACK_SKIP_IMAGES = 32875; + + // Field descriptor #45 I + public static final int GL_PACK_IMAGE_HEIGHT = 32876; + + // Field descriptor #45 I + public static final int GL_UNPACK_SKIP_IMAGES = 32877; + + // Field descriptor #45 I + public static final int GL_UNPACK_IMAGE_HEIGHT = 32878; + + // Field descriptor #45 I + public static final int GL_TEXTURE_3D = 32879; + + // Field descriptor #45 I + public static final int GL_PROXY_TEXTURE_3D = 32880; + + // Field descriptor #45 I + public static final int GL_TEXTURE_DEPTH = 32881; + + // Field descriptor #45 I + public static final int GL_TEXTURE_WRAP_R = 32882; + + // Field descriptor #45 I + public static final int GL_MAX_3D_TEXTURE_SIZE = 32883; + + // Field descriptor #45 I + public static final int GL_BGR = 32992; + + // Field descriptor #45 I + public static final int GL_BGRA = 32993; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_BYTE_3_3_2 = 32818; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_BYTE_2_3_3_REV = 33634; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_6_5 = 33635; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_6_5_REV = 33636; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_4_4_4_4 = 32819; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_4_4_4_4_REV = 33637; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_5_5_5_1 = 32820; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_SHORT_1_5_5_5_REV = 33638; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_8_8_8_8 = 32821; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_8_8_8_8_REV = 33639; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_10_10_10_2 = 32822; + + // Field descriptor #45 I + public static final int GL_UNSIGNED_INT_2_10_10_10_REV = 33640; + + // Field descriptor #45 I + public static final int GL_RESCALE_NORMAL = 32826; + + // Field descriptor #45 I + public static final int GL_LIGHT_MODEL_COLOR_CONTROL = 33272; + + // Field descriptor #45 I + public static final int GL_SINGLE_COLOR = 33273; + + // Field descriptor #45 I + public static final int GL_SEPARATE_SPECULAR_COLOR = 33274; + + // Field descriptor #45 I + public static final int GL_CLAMP_TO_EDGE = 33071; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MIN_LOD = 33082; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MAX_LOD = 33083; + + // Field descriptor #45 I + public static final int GL_TEXTURE_BASE_LEVEL = 33084; + + // Field descriptor #45 I + public static final int GL_TEXTURE_MAX_LEVEL = 33085; + + // Field descriptor #45 I + public static final int GL_MAX_ELEMENTS_VERTICES = 33000; + + // Field descriptor #45 I + public static final int GL_MAX_ELEMENTS_INDICES = 33001; + + // Field descriptor #45 I + public static final int GL_ALIASED_POINT_SIZE_RANGE = 33901; + + // Field descriptor #45 I + public static final int GL_ALIASED_LINE_WIDTH_RANGE = 33902; + + // Field descriptor #45 I + public static final int GL_SMOOTH_POINT_SIZE_RANGE = 2834; + + // Field descriptor #45 I + public static final int GL_SMOOTH_POINT_SIZE_GRANULARITY = 2835; + + // Field descriptor #45 I + public static final int GL_SMOOTH_LINE_WIDTH_RANGE = 2850; + + // Field descriptor #45 I + public static final int GL_SMOOTH_LINE_WIDTH_GRANULARITY = 2851; + + // Field descriptor #76 I + public static final int GL_TEXTURE0 = 33984; + + // Field descriptor #76 I + public static final int GL_TEXTURE1 = 33985; + + // Field descriptor #76 I + public static final int GL_TEXTURE2 = 33986; + + // Field descriptor #76 I + public static final int GL_TEXTURE3 = 33987; + + // Field descriptor #76 I + public static final int GL_TEXTURE4 = 33988; + + // Field descriptor #76 I + public static final int GL_TEXTURE5 = 33989; + + // Field descriptor #76 I + public static final int GL_TEXTURE6 = 33990; + + // Field descriptor #76 I + public static final int GL_TEXTURE7 = 33991; + + // Field descriptor #76 I + public static final int GL_TEXTURE8 = 33992; + + // Field descriptor #76 I + public static final int GL_TEXTURE9 = 33993; + + // Field descriptor #76 I + public static final int GL_TEXTURE10 = 33994; + + // Field descriptor #76 I + public static final int GL_TEXTURE11 = 33995; + + // Field descriptor #76 I + public static final int GL_TEXTURE12 = 33996; + + // Field descriptor #76 I + public static final int GL_TEXTURE13 = 33997; + + // Field descriptor #76 I + public static final int GL_TEXTURE14 = 33998; + + // Field descriptor #76 I + public static final int GL_TEXTURE15 = 33999; + + // Field descriptor #76 I + public static final int GL_TEXTURE16 = 34000; + + // Field descriptor #76 I + public static final int GL_TEXTURE17 = 34001; + + // Field descriptor #76 I + public static final int GL_TEXTURE18 = 34002; + + // Field descriptor #76 I + public static final int GL_TEXTURE19 = 34003; + + // Field descriptor #76 I + public static final int GL_TEXTURE20 = 34004; + + // Field descriptor #76 I + public static final int GL_TEXTURE21 = 34005; + + // Field descriptor #76 I + public static final int GL_TEXTURE22 = 34006; + + // Field descriptor #76 I + public static final int GL_TEXTURE23 = 34007; + + // Field descriptor #76 I + public static final int GL_TEXTURE24 = 34008; + + // Field descriptor #76 I + public static final int GL_TEXTURE25 = 34009; + + // Field descriptor #76 I + public static final int GL_TEXTURE26 = 34010; + + // Field descriptor #76 I + public static final int GL_TEXTURE27 = 34011; + + // Field descriptor #76 I + public static final int GL_TEXTURE28 = 34012; + + // Field descriptor #76 I + public static final int GL_TEXTURE29 = 34013; + + // Field descriptor #76 I + public static final int GL_TEXTURE30 = 34014; + + // Field descriptor #76 I + public static final int GL_TEXTURE31 = 34015; + + // Field descriptor #76 I + public static final int GL_ACTIVE_TEXTURE = 34016; + + // Field descriptor #76 I + public static final int GL_CLIENT_ACTIVE_TEXTURE = 34017; + + // Field descriptor #76 I + public static final int GL_MAX_TEXTURE_UNITS = 34018; + + // Field descriptor #76 I + public static final int GL_NORMAL_MAP = 34065; + + // Field descriptor #76 I + public static final int GL_REFLECTION_MAP = 34066; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP = 34067; + + // Field descriptor #76 I + public static final int GL_TEXTURE_BINDING_CUBE_MAP = 34068; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X = 34069; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 34070; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 34071; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 34073; + + // Field descriptor #76 I + public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074; + + // Field descriptor #76 I + public static final int GL_PROXY_TEXTURE_CUBE_MAP = 34075; + + // Field descriptor #76 I + public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 34076; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_ALPHA = 34025; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_LUMINANCE = 34026; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_LUMINANCE_ALPHA = 34027; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_INTENSITY = 34028; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_RGB = 34029; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_RGBA = 34030; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSION_HINT = 34031; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 34464; + + // Field descriptor #76 I + public static final int GL_TEXTURE_COMPRESSED = 34465; + + // Field descriptor #76 I + public static final int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 34466; + + // Field descriptor #76 I + public static final int GL_COMPRESSED_TEXTURE_FORMATS = 34467; + + // Field descriptor #76 I + public static final int GL_MULTISAMPLE = 32925; + + // Field descriptor #76 I + public static final int GL_SAMPLE_ALPHA_TO_COVERAGE = 32926; + + // Field descriptor #76 I + public static final int GL_SAMPLE_ALPHA_TO_ONE = 32927; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE = 32928; + + // Field descriptor #76 I + public static final int GL_SAMPLE_BUFFERS = 32936; + + // Field descriptor #76 I + public static final int GL_SAMPLES = 32937; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE_VALUE = 32938; + + // Field descriptor #76 I + public static final int GL_SAMPLE_COVERAGE_INVERT = 32939; + + // Field descriptor #76 I + public static final int GL_MULTISAMPLE_BIT = 536870912; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_MODELVIEW_MATRIX = 34019; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_PROJECTION_MATRIX = 34020; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_TEXTURE_MATRIX = 34021; + + // Field descriptor #76 I + public static final int GL_TRANSPOSE_COLOR_MATRIX = 34022; + + // Field descriptor #76 I + public static final int GL_COMBINE = 34160; + + // Field descriptor #76 I + public static final int GL_COMBINE_RGB = 34161; + + // Field descriptor #76 I + public static final int GL_COMBINE_ALPHA = 34162; + + // Field descriptor #76 I + public static final int GL_SOURCE0_RGB = 34176; + + // Field descriptor #76 I + public static final int GL_SOURCE1_RGB = 34177; + + // Field descriptor #76 I + public static final int GL_SOURCE2_RGB = 34178; + + // Field descriptor #76 I + public static final int GL_SOURCE0_ALPHA = 34184; + + // Field descriptor #76 I + public static final int GL_SOURCE1_ALPHA = 34185; + + // Field descriptor #76 I + public static final int GL_SOURCE2_ALPHA = 34186; + + // Field descriptor #76 I + public static final int GL_OPERAND0_RGB = 34192; + + // Field descriptor #76 I + public static final int GL_OPERAND1_RGB = 34193; + + // Field descriptor #76 I + public static final int GL_OPERAND2_RGB = 34194; + + // Field descriptor #76 I + public static final int GL_OPERAND0_ALPHA = 34200; + + // Field descriptor #76 I + public static final int GL_OPERAND1_ALPHA = 34201; + + // Field descriptor #76 I + public static final int GL_OPERAND2_ALPHA = 34202; + + // Field descriptor #76 I + public static final int GL_RGB_SCALE = 34163; + + // Field descriptor #76 I + public static final int GL_ADD_SIGNED = 34164; + + // Field descriptor #76 I + public static final int GL_INTERPOLATE = 34165; + + // Field descriptor #76 I + public static final int GL_SUBTRACT = 34023; + + // Field descriptor #76 I + public static final int GL_CONSTANT = 34166; + + // Field descriptor #76 I + public static final int GL_PRIMARY_COLOR = 34167; + + // Field descriptor #76 I + public static final int GL_PREVIOUS = 34168; + + // Field descriptor #76 I + public static final int GL_DOT3_RGB = 34478; + + // Field descriptor #76 I + public static final int GL_DOT3_RGBA = 34479; + + // Field descriptor #76 I + public static final int GL_CLAMP_TO_BORDER = 33069; + + // Field descriptor #71 I + public static final int GL_ARRAY_BUFFER = 34962; + + // Field descriptor #71 I + public static final int GL_ELEMENT_ARRAY_BUFFER = 34963; + + // Field descriptor #71 I + public static final int GL_ARRAY_BUFFER_BINDING = 34964; + + // Field descriptor #71 I + public static final int GL_ELEMENT_ARRAY_BUFFER_BINDING = 34965; + + // Field descriptor #71 I + public static final int GL_VERTEX_ARRAY_BUFFER_BINDING = 34966; + + // Field descriptor #71 I + public static final int GL_NORMAL_ARRAY_BUFFER_BINDING = 34967; + + // Field descriptor #71 I + public static final int GL_COLOR_ARRAY_BUFFER_BINDING = 34968; + + // Field descriptor #71 I + public static final int GL_INDEX_ARRAY_BUFFER_BINDING = 34969; + + // Field descriptor #71 I + public static final int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 34970; + + // Field descriptor #71 I + public static final int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 34971; + + // Field descriptor #71 I + public static final int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 34972; + + // Field descriptor #71 I + public static final int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 34973; + + // Field descriptor #71 I + public static final int GL_WEIGHT_ARRAY_BUFFER_BINDING = 34974; + + // Field descriptor #71 I + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975; + + // Field descriptor #71 I + public static final int GL_STREAM_DRAW = 35040; + + // Field descriptor #71 I + public static final int GL_STREAM_READ = 35041; + + // Field descriptor #71 I + public static final int GL_STREAM_COPY = 35042; + + // Field descriptor #71 I + public static final int GL_STATIC_DRAW = 35044; + + // Field descriptor #71 I + public static final int GL_STATIC_READ = 35045; + + // Field descriptor #71 I + public static final int GL_STATIC_COPY = 35046; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_DRAW = 35048; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_READ = 35049; + + // Field descriptor #71 I + public static final int GL_DYNAMIC_COPY = 35050; + + // Field descriptor #71 I + public static final int GL_READ_ONLY = 35000; + + // Field descriptor #71 I + public static final int GL_WRITE_ONLY = 35001; + + // Field descriptor #71 I + public static final int GL_READ_WRITE = 35002; + + // Field descriptor #71 I + public static final int GL_BUFFER_SIZE = 34660; + + // Field descriptor #71 I + public static final int GL_BUFFER_USAGE = 34661; + + // Field descriptor #71 I + public static final int GL_BUFFER_ACCESS = 35003; + + // Field descriptor #71 I + public static final int GL_BUFFER_MAPPED = 35004; + + // Field descriptor #71 I + public static final int GL_BUFFER_MAP_POINTER = 35005; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_SRC = 33872; + + // Field descriptor #71 I + public static final int GL_FOG_COORD = 33873; + + // Field descriptor #71 I + public static final int GL_CURRENT_FOG_COORD = 33875; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_TYPE = 33876; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_STRIDE = 33877; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_POINTER = 33878; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY = 33879; + + // Field descriptor #71 I + public static final int GL_FOG_COORD_ARRAY_BUFFER_BINDING = 34973; + + // Field descriptor #71 I + public static final int GL_SRC0_RGB = 34176; + + // Field descriptor #71 I + public static final int GL_SRC1_RGB = 34177; + + // Field descriptor #71 I + public static final int GL_SRC2_RGB = 34178; + + // Field descriptor #71 I + public static final int GL_SRC0_ALPHA = 34184; + + // Field descriptor #71 I + public static final int GL_SRC1_ALPHA = 34185; + + // Field descriptor #71 I + public static final int GL_SRC2_ALPHA = 34186; + + // Field descriptor #71 I + public static final int GL_SAMPLES_PASSED = 35092; + + // Field descriptor #71 I + public static final int GL_QUERY_COUNTER_BITS = 34916; + + // Field descriptor #71 I + public static final int GL_CURRENT_QUERY = 34917; + + // Field descriptor #71 I + public static final int GL_QUERY_RESULT = 34918; + + // Field descriptor #71 I + public static final int GL_QUERY_RESULT_AVAILABLE = 34919; + + // Field descriptor #194 I + public static final int GL_SHADING_LANGUAGE_VERSION = 35724; + + // Field descriptor #194 I + public static final int GL_CURRENT_PROGRAM = 35725; + + // Field descriptor #194 I + public static final int GL_SHADER_TYPE = 35663; + + // Field descriptor #194 I + public static final int GL_DELETE_STATUS = 35712; + + // Field descriptor #194 I + public static final int GL_COMPILE_STATUS = 35713; + + // Field descriptor #194 I + public static final int GL_LINK_STATUS = 35714; + + // Field descriptor #194 I + public static final int GL_VALIDATE_STATUS = 35715; + + // Field descriptor #194 I + public static final int GL_INFO_LOG_LENGTH = 35716; + + // Field descriptor #194 I + public static final int GL_ATTACHED_SHADERS = 35717; + + // Field descriptor #194 I + public static final int GL_ACTIVE_UNIFORMS = 35718; + + // Field descriptor #194 I + public static final int GL_ACTIVE_UNIFORM_MAX_LENGTH = 35719; + + // Field descriptor #194 I + public static final int GL_ACTIVE_ATTRIBUTES = 35721; + + // Field descriptor #194 I + public static final int GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 35722; + + // Field descriptor #194 I + public static final int GL_SHADER_SOURCE_LENGTH = 35720; + + // Field descriptor #194 I + public static final int GL_SHADER_OBJECT = 35656; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC2 = 35664; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC3 = 35665; + + // Field descriptor #194 I + public static final int GL_FLOAT_VEC4 = 35666; + + // Field descriptor #194 I + public static final int GL_INT_VEC2 = 35667; + + // Field descriptor #194 I + public static final int GL_INT_VEC3 = 35668; + + // Field descriptor #194 I + public static final int GL_INT_VEC4 = 35669; + + // Field descriptor #194 I + public static final int GL_BOOL = 35670; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC2 = 35671; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC3 = 35672; + + // Field descriptor #194 I + public static final int GL_BOOL_VEC4 = 35673; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT2 = 35674; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT3 = 35675; + + // Field descriptor #194 I + public static final int GL_FLOAT_MAT4 = 35676; + + // Field descriptor #194 I + public static final int GL_SAMPLER_1D = 35677; + + // Field descriptor #194 I + public static final int GL_SAMPLER_2D = 35678; + + // Field descriptor #194 I + public static final int GL_SAMPLER_3D = 35679; + + // Field descriptor #194 I + public static final int GL_SAMPLER_CUBE = 35680; + + // Field descriptor #194 I + public static final int GL_SAMPLER_1D_SHADOW = 35681; + + // Field descriptor #194 I + public static final int GL_SAMPLER_2D_SHADOW = 35682; + + // Field descriptor #194 I + public static final int GL_VERTEX_SHADER = 35633; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 35658; + + // Field descriptor #194 I + public static final int GL_MAX_VARYING_FLOATS = 35659; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_ATTRIBS = 34921; + + // Field descriptor #194 I + public static final int GL_MAX_TEXTURE_IMAGE_UNITS = 34930; + + // Field descriptor #194 I + public static final int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660; + + // Field descriptor #194 I + public static final int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661; + + // Field descriptor #194 I + public static final int GL_MAX_TEXTURE_COORDS = 34929; + + // Field descriptor #194 I + public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 34370; + + // Field descriptor #194 I + public static final int GL_VERTEX_PROGRAM_TWO_SIDE = 34371; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 34338; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_SIZE = 34339; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_STRIDE = 34340; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_TYPE = 34341; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922; + + // Field descriptor #194 I + public static final int GL_CURRENT_VERTEX_ATTRIB = 34342; + + // Field descriptor #194 I + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 34373; + + // Field descriptor #194 I + public static final int GL_FRAGMENT_SHADER = 35632; + + // Field descriptor #194 I + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 35657; + + // Field descriptor #194 I + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 35723; + + // Field descriptor #194 I + public static final int GL_MAX_DRAW_BUFFERS = 34852; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER0 = 34853; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER1 = 34854; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER2 = 34855; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER3 = 34856; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER4 = 34857; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER5 = 34858; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER6 = 34859; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER7 = 34860; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER8 = 34861; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER9 = 34862; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER10 = 34863; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER11 = 34864; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER12 = 34865; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER13 = 34866; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER14 = 34867; + + // Field descriptor #194 I + public static final int GL_DRAW_BUFFER15 = 34868; + + // Field descriptor #194 I + public static final int GL_POINT_SPRITE = 34913; + + // Field descriptor #194 I + public static final int GL_COORD_REPLACE = 34914; + + // Field descriptor #194 I + public static final int GL_POINT_SPRITE_COORD_ORIGIN = 36000; + + // Field descriptor #194 I + public static final int GL_LOWER_LEFT = 36001; + + // Field descriptor #194 I + public static final int GL_UPPER_LEFT = 36002; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_FUNC = 34816; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_FAIL = 34817; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_PASS_DEPTH_FAIL = 34818; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_PASS_DEPTH_PASS = 34819; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_REF = 36003; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_VALUE_MASK = 36004; + + // Field descriptor #194 I + public static final int GL_STENCIL_BACK_WRITEMASK = 36005; + + // Field descriptor #194 I + public static final int GL_BLEND_EQUATION_RGB = 32777; + + // Field descriptor #194 I + public static final int GL_BLEND_EQUATION_ALPHA = 34877; + +} \ No newline at end of file diff --git a/src/teavm/java/org/lwjgl/opengl/WebGL.java b/src/teavm/java/org/lwjgl/opengl/WebGL.java new file mode 100644 index 0000000..7ac24d9 --- /dev/null +++ b/src/teavm/java/org/lwjgl/opengl/WebGL.java @@ -0,0 +1,1984 @@ +package org.lwjgl.opengl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.charset.Charset; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; + +import org.teavm.interop.Async; +import org.teavm.interop.AsyncCallback; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSFunctor; +import org.teavm.jso.JSObject; +import org.teavm.jso.ajax.ReadyStateChangeHandler; +import org.teavm.jso.ajax.XMLHttpRequest; +import org.teavm.jso.browser.TimerHandler; +import org.teavm.jso.browser.Window; +import org.teavm.jso.canvas.CanvasRenderingContext2D; +import org.teavm.jso.canvas.ImageData; +import org.teavm.jso.dom.events.Event; +import org.teavm.jso.dom.events.EventListener; +import org.teavm.jso.dom.events.KeyboardEvent; +import org.teavm.jso.dom.events.MessageEvent; +import org.teavm.jso.dom.events.MouseEvent; +import org.teavm.jso.dom.events.WheelEvent; +import org.teavm.jso.dom.html.HTMLCanvasElement; +import org.teavm.jso.dom.html.HTMLDocument; +import org.teavm.jso.dom.html.HTMLElement; +import org.teavm.jso.dom.html.HTMLImageElement; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Float32Array; +import org.teavm.jso.typedarrays.Int32Array; +import org.teavm.jso.typedarrays.Uint8Array; +import org.teavm.jso.typedarrays.Uint8ClampedArray; +import org.teavm.jso.webaudio.AudioBuffer; +import org.teavm.jso.webaudio.AudioBufferSourceNode; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.AudioListener; +import org.teavm.jso.webaudio.DecodeErrorCallback; +import org.teavm.jso.webaudio.DecodeSuccessCallback; +import org.teavm.jso.webaudio.GainNode; +import org.teavm.jso.webaudio.MediaEvent; +import org.teavm.jso.webaudio.PannerNode; +import org.teavm.jso.webgl.WebGLBuffer; +import org.teavm.jso.webgl.WebGLFramebuffer; +import org.teavm.jso.webgl.WebGLProgram; +import org.teavm.jso.webgl.WebGLRenderbuffer; +import org.teavm.jso.webgl.WebGLShader; +import org.teavm.jso.webgl.WebGLTexture; +import org.teavm.jso.webgl.WebGLUniformLocation; +import org.teavm.jso.websocket.CloseEvent; +import org.teavm.jso.websocket.WebSocket; + +import net.PeytonPlayz585.MinecraftMain; +import net.PeytonPlayz585.math.MathHelper; +import net.PeytonPlayz585.minecraft.AssetRepository; +import net.PeytonPlayz585.minecraft.Base64; +import net.PeytonPlayz585.minecraft.MinecraftImage; +import net.PeytonPlayz585.storage.LocalStorageManager; +//import net.PeytonPlayz585.teavm.IndexedDBFilesystem; +//import net.PeytonPlayz585.teavm.IndexedDBFilesystem.OpenState; +import net.PeytonPlayz585.teavm.WebGL2RenderingContext; +import net.PeytonPlayz585.teavm.WebGLQuery; +import net.PeytonPlayz585.teavm.WebGLVertexArray; + +import static net.PeytonPlayz585.teavm.WebGL2RenderingContext.*; + +public class WebGL { + + public static final boolean _wisWebGL() { + return true; + } + private static boolean isAnisotropicPatched = false; + public static final boolean _wisAnisotropicPatched() { + return isAnisotropicPatched; + } + public static final String _wgetShaderHeader() { + return "#version 300 es"; + } + + @JSBody(params = { }, script = "return window.location.href;") + private static native String getLocationString(); + + public static final boolean isSSLPage() { + return getLocationString().startsWith("https"); + } + + public static final InputStream loadResource(String path) { + byte[] file = loadResourceBytes(path); + if (file != null) { + return new ByteArrayInputStream(file); + } else { + return null; + } + } + + public static final byte[] loadResourceBytes(String path) { + return AssetRepository.getResource(path); + } + + public static final String fileContents(String path) { + byte[] contents = loadResourceBytes(path); + if(contents == null) { + return null; + }else { + return new String(contents, Charset.forName("UTF-8")); + } + } + + public static void onWindowUnload() { + LocalStorageManager.saveStorageG(); + LocalStorageManager.saveStorageP(); + } + + @JSBody(params = { }, script = "window.onbeforeunload = function(){javaMethods.get('org.lwjgl.opengl.WebGL.onWindowUnload()V').invoke();return false;};") + private static native void onBeforeCloseRegister(); + + public static final String[] fileContentsLines(String path) { + String contents = fileContents(path); + if(contents == null) { + return null; + }else { + return contents.replace("\r\n", "\n").split("[\r\n]"); + } + } + + @Async + public static native String downloadAssetPack(String assetPackageURI); + + private static void downloadAssetPack(String assetPackageURI, final AsyncCallback cb) { + final XMLHttpRequest request = XMLHttpRequest.create(); + request.setResponseType("arraybuffer"); + request.open("GET", assetPackageURI, true); + request.setOnReadyStateChange(new ReadyStateChangeHandler() { + @Override + public void stateChanged() { + if(request.getReadyState() == XMLHttpRequest.DONE) { + Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse()); + loadedPackage = new byte[bl.getByteLength()]; + for(int i = 0; i < loadedPackage.length; ++i) { + loadedPackage[i] = (byte) bl.get(i); + } + cb.complete("yee"); + } + } + }); + request.send(); + } + + @JSBody(params = { "obj" }, script = "window.currentContext = obj;") + private static native int setContextVar(JSObject obj); + + @JSBody(params = { "v", "s" }, script = "window[v] = s;") + public static native void setDebugVar(String v, String s); + + @JSBody(params = { }, script = "if(window.navigator.userActivation){return window.navigator.userActivation.hasBeenActive;}else{return false;}") + public static native boolean hasBeenActive(); + + public static HTMLDocument doc = null; + public static HTMLElement parent = null; + public static HTMLCanvasElement canvas = null; + public static CanvasRenderingContext2D canvasContext = null; + public static HTMLCanvasElement canvasBack = null; + public static WebGL2RenderingContext webgl = null; + public static Window win = null; + private static byte[] loadedPackage = null; + private static EventListener contextmenu = null; + private static EventListener mousedown = null; + private static EventListener mouseup = null; + private static EventListener mousemove = null; + private static EventListener keydown = null; + private static EventListener keyup = null; + private static EventListener keypress = null; + private static EventListener wheel = null; + private static String[] identifier = new String[0]; + + public static final String[] getIdentifier() { + return identifier; + } + + @JSBody(params = { }, script = "return window.navigator.userAgent;") + private static native String getUA(); + + @JSBody(params = { }, script = "return window.navigator.platform;") + private static native String getPlaf(); + + @JSBody(params = { "m" }, script = "return m.offsetX;") + private static native int getOffsetX(MouseEvent m); + + @JSBody(params = { "m" }, script = "return m.offsetY;") + private static native int getOffsetY(MouseEvent m); + + @JSBody(params = { "e" }, script = "return e.which;") + private static native int getWhich(KeyboardEvent e); + + public static final void initializeContext(HTMLElement rootElement, String assetPackageURI) { + parent = rootElement; + String s = parent.getAttribute("style"); + parent.setAttribute("style", (s == null ? "" : s)+"overflow-x:hidden;overflow-y:hidden;"); + win = Window.current(); + doc = win.getDocument(); + canvas = (HTMLCanvasElement)doc.createElement("canvas"); + width = rootElement.getClientWidth(); + height = rootElement.getClientHeight(); + canvas.setWidth(width); + canvas.setHeight(height); + canvasContext = (CanvasRenderingContext2D) canvas.getContext("2d"); + canvas.setAttribute("id", "deevis589723589"); + rootElement.appendChild(canvas); + canvasBack = (HTMLCanvasElement)doc.createElement("canvas"); + canvasBack.setWidth(width); + canvasBack.setHeight(height); + webgl = (WebGL2RenderingContext) canvasBack.getContext("webgl2", config()); + if(webgl == null) { + throw new RuntimeException("WebGL 2.0 is not supported in your browser ("+getUA()+")"); + } + setContextVar(webgl); + + webgl.getExtension("EXT_texture_filter_anisotropic"); + + win.addEventListener("contextmenu", contextmenu = new EventListener() { + @Override + public void handleEvent(MouseEvent evt) { + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("mousedown", mousedown = new EventListener() { + @Override + public void handleEvent(MouseEvent evt) { + int b = evt.getButton(); + buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = true; + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + forceMouseGrabbed(); + } + }); + canvas.addEventListener("mouseup", mouseup = new EventListener() { + @Override + public void handleEvent(MouseEvent evt) { + int b = evt.getButton(); + buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = false; + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("mousemove", mousemove = new EventListener() { + @Override + public void handleEvent(MouseEvent evt) { + mouseX = getOffsetX(evt); + mouseY = canvas.getClientHeight() - getOffsetY(evt); + mouseDX += evt.getMovementX(); + mouseDY += -evt.getMovementY(); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("keydown", keydown = new EventListener() { + @Override + public void handleEvent(KeyboardEvent evt) { + //keyStates[remapKey(evt.getKeyCode())] = true; + keyStates[remapKey(getWhich(evt))] = true; + keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + forceMouseGrabbed(); + } + }); + win.addEventListener("keyup", keyup = new EventListener() { + @Override + public void handleEvent(KeyboardEvent evt) { + //keyStates[remapKey(evt.getKeyCode())] = false; + keyStates[remapKey(getWhich(evt))] = false; + keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("keypress", keypress = new EventListener() { + @Override + public void handleEvent(KeyboardEvent evt) { + if(enableRepeatEvents && evt.isRepeat()) keyEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + canvas.addEventListener("wheel", wheel = new EventListener() { + @Override + public void handleEvent(WheelEvent evt) { + mouseEvents.add(evt); + evt.preventDefault(); + evt.stopPropagation(); + } + }); + win.addEventListener("blur", new EventListener() { + @Override + public void handleEvent(WheelEvent evt) { + isWindowFocused = false; + } + }); + win.addEventListener("focus", new EventListener() { + @Override + public void handleEvent(WheelEvent evt) { + isWindowFocused = true; + forceMouseGrabbed(); + } + }); + onBeforeCloseRegister(); + initFileChooser(); + +// OpenState st = IndexedDBFilesystem.initialize(); +// if(st != OpenState.OPENED) { +// if(st == OpenState.LOCKED) { +// MinecraftMain.showDatabaseLockedScreen("\nError: World folder is locked!\n\nYou are already playing Minecraft in a different Window.\nClose all other Minecraft instances and reload"); +// }else { +// MinecraftMain.showDatabaseLockedScreen("\nError: World folder could not be loaded!\n\n" + IndexedDBFilesystem.errorDetail()); +// } +// throw new MinecraftMain.AbortedLaunchException(); +// } + + downloadAssetPack(assetPackageURI); + + try { + AssetRepository.install(loadedPackage); + } catch (IOException e) { + e.printStackTrace(); + } + + mouseEvents.clear(); + keyEvents.clear(); + } + + @JSBody(params = { }, script = + "window.eagsFileChooser = {\r\n" + + "inputElement: null,\r\n" + + "openFileChooser: function(ext, mime){\r\n" + + "var el = window.eagsFileChooser.inputElement = document.createElement(\"input\");\r\n" + + "el.type = \"file\";\r\n" + + "el.multiple = false;\r\n" + + "el.addEventListener(\"change\", function(evt){\r\n" + + "var f = window.eagsFileChooser.inputElement.files;\r\n" + + "if(f.length == 0){\r\n" + + "window.eagsFileChooser.getFileChooserResult = null;\r\n" + + "}else{\r\n" + + "(async function(){\r\n" + + "window.eagsFileChooser.getFileChooserResult = await f[0].arrayBuffer();\r\n" + + "window.eagsFileChooser.getFileChooserResultName = f[0].name;\r\n" + + "})();\r\n" + + "}\r\n" + + "});\r\n" + + "window.eagsFileChooser.getFileChooserResult = null;\r\n" + + "window.eagsFileChooser.getFileChooserResultName = null;\r\n" + + "el.accept = mime;\r\n" + + "el.click();\r\n" + + "},\r\n" + + "getFileChooserResult: null,\r\n" + + "getFileChooserResultName: null\r\n" + + "};") + private static native void initFileChooser(); + + public static final void destroyContext() { + + } + + public static final void removeEventHandlers() { + win.removeEventListener("contextmenu", contextmenu); + win.removeEventListener("mousedown", mousedown); + win.removeEventListener("mouseup", mouseup); + win.removeEventListener("mousemove", mousemove); + win.removeEventListener("keydown", keydown); + win.removeEventListener("keyup", keyup); + win.removeEventListener("keypress", keypress); + win.removeEventListener("wheel", wheel); + } + + private static LinkedList mouseEvents = new LinkedList(); + private static LinkedList keyEvents = new LinkedList(); + + private static int mouseX = 0; + private static int mouseY = 0; + private static double mouseDX = 0.0D; + private static double mouseDY = 0.0D; + private static int width = 0; + private static int height = 0; + private static boolean enableRepeatEvents = false; + private static boolean isWindowFocused = true; + + @JSBody(params = { }, script = "return {antialias: false, depth: true, powerPreference: \"high-performance\", desynchronized: false, preserveDrawingBuffer: false, premultipliedAlpha: false, alpha: false};") + public static native JSObject config(); + + public static final int _wGL_TEXTURE_2D = TEXTURE_2D; + public static final int _wGL_DEPTH_TEST = DEPTH_TEST; + public static final int _wGL_LEQUAL = LEQUAL; + public static final int _wGL_GEQUAL = GEQUAL; + public static final int _wGL_GREATER = GREATER; + public static final int _wGL_LESS = LESS; + public static final int _wGL_BACK = BACK; + public static final int _wGL_FRONT = FRONT; + public static final int _wGL_FRONT_AND_BACK = FRONT_AND_BACK; + public static final int _wGL_COLOR_BUFFER_BIT = COLOR_BUFFER_BIT; + public static final int _wGL_DEPTH_BUFFER_BIT = DEPTH_BUFFER_BIT; + public static final int _wGL_BLEND = BLEND; + public static final int _wGL_RGBA = RGBA; + public static final int _wGL_RGB = RGB; + public static final int _wGL_RGB8 = RGB8; + public static final int _wGL_RGBA8 = RGBA8; + public static final int _wGL_UNSIGNED_BYTE = UNSIGNED_BYTE; + public static final int _wGL_UNSIGNED_SHORT = UNSIGNED_SHORT; + public static final int _wGL_SRC_ALPHA = SRC_ALPHA; + public static final int _wGL_ONE_MINUS_SRC_ALPHA = ONE_MINUS_SRC_ALPHA; + public static final int _wGL_ONE_MINUS_DST_COLOR = ONE_MINUS_DST_COLOR; + public static final int _wGL_ONE_MINUS_SRC_COLOR = ONE_MINUS_SRC_COLOR; + public static final int _wGL_ZERO = ZERO; + public static final int _wGL_CULL_FACE = CULL_FACE; + public static final int _wGL_TEXTURE_MIN_FILTER = TEXTURE_MIN_FILTER; + public static final int _wGL_TEXTURE_MAG_FILTER = TEXTURE_MAG_FILTER; + public static final int _wGL_LINEAR = LINEAR; + public static final int _wGL_EQUAL = EQUAL; + public static final int _wGL_SRC_COLOR = SRC_COLOR; + public static final int _wGL_ONE = ONE; + public static final int _wGL_NEAREST = NEAREST; + public static final int _wGL_CLAMP = CLAMP_TO_EDGE; + public static final int _wGL_TEXTURE_WRAP_S = TEXTURE_WRAP_S; + public static final int _wGL_TEXTURE_WRAP_T = TEXTURE_WRAP_T; + public static final int _wGL_REPEAT = REPEAT; + public static final int _wGL_DST_COLOR = DST_COLOR; + public static final int _wGL_DST_ALPHA = DST_ALPHA; + public static final int _wGL_FLOAT = FLOAT; + public static final int _wGL_SHORT = SHORT; + public static final int _wGL_TRIANGLES = TRIANGLES; + public static final int _wGL_TRIANGLE_STRIP = TRIANGLE_STRIP; + public static final int _wGL_TRIANGLE_FAN = TRIANGLE_FAN; + public static final int _wGL_LINE_STRIP = LINE_STRIP; + public static final int _wGL_LINES = LINES; + public static final int _wGL_PACK_ALIGNMENT = PACK_ALIGNMENT; + public static final int _wGL_UNPACK_ALIGNMENT = UNPACK_ALIGNMENT; + public static final int _wGL_TEXTURE0 = TEXTURE0; + public static final int _wGL_TEXTURE1 = TEXTURE1; + public static final int _wGL_TEXTURE2 = TEXTURE2; + public static final int _wGL_TEXTURE3 = TEXTURE3; + public static final int _wGL_VIEWPORT = VIEWPORT; + public static final int _wGL_VERTEX_SHADER = VERTEX_SHADER; + public static final int _wGL_FRAGMENT_SHADER = FRAGMENT_SHADER; + public static final int _wGL_ARRAY_BUFFER = ARRAY_BUFFER; + public static final int _wGL_ELEMENT_ARRAY_BUFFER = ELEMENT_ARRAY_BUFFER; + public static final int _wGL_STATIC_DRAW = STATIC_DRAW; + public static final int _wGL_DYNAMIC_DRAW = DYNAMIC_DRAW; + public static final int _wGL_INVALID_ENUM = INVALID_ENUM; + public static final int _wGL_INVALID_VALUE= INVALID_VALUE; + public static final int _wGL_INVALID_OPERATION = INVALID_OPERATION; + public static final int _wGL_OUT_OF_MEMORY = OUT_OF_MEMORY; + public static final int _wGL_CONTEXT_LOST_WEBGL = CONTEXT_LOST_WEBGL; + public static final int _wGL_FRAMEBUFFER_COMPLETE = FRAMEBUFFER_COMPLETE; + public static final int _wGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_ATTACHMENT; + public static final int _wGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; + public static final int _wGL_COLOR_ATTACHMENT0 = COLOR_ATTACHMENT0; + public static final int _wGL_DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL_ATTACHMENT; + public static final int _wGL_DEPTH_STENCIL = DEPTH_STENCIL; + public static final int _wGL_NEAREST_MIPMAP_LINEAR = NEAREST_MIPMAP_LINEAR; + public static final int _wGL_LINEAR_MIPMAP_LINEAR = LINEAR_MIPMAP_LINEAR; + public static final int _wGL_LINEAR_MIPMAP_NEAREST = LINEAR_MIPMAP_NEAREST; + public static final int _wGL_NEAREST_MIPMAP_NEAREST = NEAREST_MIPMAP_NEAREST; + public static final int _wGL_TEXTURE_MAX_LEVEL = TEXTURE_MAX_LEVEL; + public static final int _wGL_UNSIGNED_INT_24_8 = UNSIGNED_INT_24_8; + public static final int _wGL_UNSIGNED_INT = UNSIGNED_INT; + public static final int _wGL_ANY_SAMPLES_PASSED = ANY_SAMPLES_PASSED; + public static final int _wGL_QUERY_RESULT = QUERY_RESULT; + public static final int _wGL_QUERY_RESULT_AVAILABLE = QUERY_RESULT_AVAILABLE; + public static final int _wGL_TEXTURE_MAX_ANISOTROPY = TEXTURE_MAX_ANISOTROPY_EXT; + public static final int _wGL_DEPTH24_STENCIL8 = DEPTH24_STENCIL8; + public static final int _wGL_DEPTH_COMPONENT32F = DEPTH_COMPONENT32F; + public static final int _wGL_DEPTH_ATTACHMENT = DEPTH_ATTACHMENT; + public static final int _wGL_MULTISAMPLE = -1; + public static final int _wGL_LINE_SMOOTH = -1; + public static final int _wGL_READ_FRAMEBUFFER = READ_FRAMEBUFFER; + public static final int _wGL_DRAW_FRAMEBUFFER = DRAW_FRAMEBUFFER; + public static final int _wGL_FRAMEBUFFER = FRAMEBUFFER; + public static final int _wGL_POLYGON_OFFSET_FILL = POLYGON_OFFSET_FILL; + + public static final class TextureGL { + protected final WebGLTexture obj; + public int w = -1; + public int h = -1; + public boolean nearest = true; + public boolean anisotropic = false; + protected TextureGL(WebGLTexture obj) { + this.obj = obj; + } + } + public static final class BufferGL { + protected final WebGLBuffer obj; + protected BufferGL(WebGLBuffer obj) { + this.obj = obj; + } + } + public static final class ShaderGL { + protected final WebGLShader obj; + protected ShaderGL(WebGLShader obj) { + this.obj = obj; + } + } + private static int progId = 0; + public static final class ProgramGL { + protected final WebGLProgram obj; + protected final int hashcode; + protected ProgramGL(WebGLProgram obj) { + this.obj = obj; + this.hashcode = ++progId; + } + } + public static final class UniformGL { + protected final WebGLUniformLocation obj; + protected UniformGL(WebGLUniformLocation obj) { + this.obj = obj; + } + } + public static final class BufferArrayGL { + protected final WebGLVertexArray obj; + public boolean isQuadBufferBound; + protected BufferArrayGL(WebGLVertexArray obj) { + this.obj = obj; + this.isQuadBufferBound = false; + } + } + public static final class FramebufferGL { + protected final WebGLFramebuffer obj; + protected FramebufferGL(WebGLFramebuffer obj) { + this.obj = obj; + } + } + public static final class RenderbufferGL { + protected final WebGLRenderbuffer obj; + protected RenderbufferGL(WebGLRenderbuffer obj) { + this.obj = obj; + } + } + public static final class QueryGL { + protected final WebGLQuery obj; + protected QueryGL(WebGLQuery obj) { + this.obj = obj; + } + } + + public static final void _wglEnable(int p1) { + webgl.enable(p1); + } + public static final void _wglClearDepth(float p1) { + webgl.clearDepth(p1); + } + public static final void _wglDepthFunc(int p1) { + webgl.depthFunc(p1); + } + public static final void _wglCullFace(int p1) { + webgl.cullFace(p1); + } + private static int[] viewportCache = new int[4]; + public static final void _wglViewport(int p1, int p2, int p3, int p4) { + viewportCache[0] = p1; viewportCache[1] = p2; + viewportCache[2] = p3; viewportCache[3] = p4; + webgl.viewport(p1, p2, p3, p4); + } + public static final void _wglClear(int p1) { + webgl.clear(p1); + } + public static final void _wglClearColor(float p1, float p2, float p3, float p4) { + webgl.clearColor(p1, p2, p3, p4); + } + public static final void _wglDisable(int p1) { + webgl.disable(p1); + } + public static final int _wglGetError() { + return webgl.getError(); + } + public static final void _wglFlush() { + //webgl.flush(); + } + private static Uint8Array uploadBuffer = Uint8Array.create(ArrayBuffer.create(4 * 1024 * 1024)); + public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) { + if(p9 == null) { + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, null); + }else { + int len = p9.remaining(); + Uint8Array uploadBuffer1 = uploadBuffer; + for(int i = 0; i < len; ++i) { + uploadBuffer1.set(i, (short) ((int)p9.get() & 0xff)); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + } + public static final void _wglBlendFunc(int p1, int p2) { + webgl.blendFunc(p1, p2); + } + public static final void _wglBlendFuncSeparate(int p1, int p2, int p3, int p4) { + webgl.blendFuncSeparate(p1, p2, p3, p4); + } + public static final void _wglDepthMask(boolean p1) { + webgl.depthMask(p1); + } + public static final void _wglColorMask(boolean p1, boolean p2, boolean p3, boolean p4) { + webgl.colorMask(p1, p2, p3, p4); + } + public static final void _wglBindTexture(int p1, TextureGL p2) { + webgl.bindTexture(p1, p2 == null ? null : p2.obj); + } + public static final void _wglCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) { + webgl.copyTexSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8); + } + public static final void _wglTexParameteri(int p1, int p2, int p3) { + webgl.texParameteri(p1, p2, p3); + } + public static final void _wglTexParameterf(int p1, int p2, float p3) { + webgl.texParameterf(p1, p2, p3); + } + public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { + int len = p9.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p9.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) { + int len = p9.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p9.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglDeleteTextures(TextureGL p1) { + webgl.deleteTexture(p1.obj); + } + public static final void _wglDrawArrays(int p1, int p2, int p3) { + webgl.drawArrays(p1, p2, p3); + } + public static final void _wglDrawElements(int p1, int p2, int p3, int p4) { + webgl.drawElements(p1, p2, p3, p4); + } + public static final TextureGL _wglGenTextures() { + return new TextureGL(webgl.createTexture()); + } + public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) { + int len = p9.remaining(); + for(int i = 0; i < len; ++i) { + uploadBuffer.set(i, (short) ((int)p9.get() & 0xff)); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len); + webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data); + } + public static final void _wglActiveTexture(int p1) { + webgl.activeTexture(p1); + } + public static final ProgramGL _wglCreateProgram() { + return new ProgramGL(webgl.createProgram()); + } + public static final ShaderGL _wglCreateShader(int p1) { + return new ShaderGL(webgl.createShader(p1)); + } + public static final void _wglAttachShader(ProgramGL p1, ShaderGL p2) { + webgl.attachShader(p1.obj, p2.obj); + } + public static final void _wglDetachShader(ProgramGL p1, ShaderGL p2) { + webgl.detachShader(p1.obj, p2.obj); + } + public static final void _wglCompileShader(ShaderGL p1) { + webgl.compileShader(p1.obj); + } + public static final void _wglLinkProgram(ProgramGL p1) { + webgl.linkProgram(p1.obj); + } + public static final void _wglShaderSource(ShaderGL p1, String p2) { + webgl.shaderSource(p1.obj, p2); + } + public static final String _wglGetShaderInfoLog(ShaderGL p1) { + return webgl.getShaderInfoLog(p1.obj); + } + public static final String _wglGetProgramInfoLog(ProgramGL p1) { + return webgl.getProgramInfoLog(p1.obj); + } + public static final boolean _wglGetShaderCompiled(ShaderGL p1) { + return webgl.getShaderParameteri(p1.obj, COMPILE_STATUS) == 1; + } + public static final boolean _wglGetProgramLinked(ProgramGL p1) { + return webgl.getProgramParameteri(p1.obj, LINK_STATUS) == 1; + } + public static final void _wglDeleteShader(ShaderGL p1) { + webgl.deleteShader(p1.obj); + } + public static final void _wglDeleteProgram(ProgramGL p1) { + webgl.deleteProgram(p1.obj); + } + public static final BufferGL _wglCreateBuffer() { + return new BufferGL(webgl.createBuffer()); + } + public static final void _wglDeleteBuffer(BufferGL p1) { + webgl.deleteBuffer(p1.obj); + } + public static final void _wglBindBuffer(int p1, BufferGL p2) { + webgl.bindBuffer(p1, p2 == null ? null : p2.obj); + } + public static final void _wglBufferData0(int p1, IntBuffer p2, int p3) { + int len = p2.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p2.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.bufferData(p1, data, p3); + } + public static final void _wglBufferSubData0(int p1, int p2, IntBuffer p3) { + int len = p3.remaining(); + Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer()); + for(int i = 0; i < len; ++i) { + deevis.set(i, p3.get()); + } + Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4); + webgl.bufferSubData(p1, p2, data); + } + public static final void _wglBufferData(int p1, Object p2, int p3) { + webgl.bufferData(p1, (Int32Array)p2, p3); + } + public static final void _wglBufferSubData(int p1, int p2, Object p3) { + webgl.bufferSubData(p1, p2, (Int32Array)p3); + } + public static final void _wglBindAttribLocation(ProgramGL p1, int p2, String p3) { + webgl.bindAttribLocation(p1.obj, p2, p3); + } + public static final void _wglEnableVertexAttribArray(int p1) { + webgl.enableVertexAttribArray(p1); + } + public static final void _wglDisableVertexAttribArray(int p1) { + webgl.disableVertexAttribArray(p1); + } + public static final UniformGL _wglGetUniformLocation(ProgramGL p1, String p2) { + WebGLUniformLocation u = webgl.getUniformLocation(p1.obj, p2); + return u == null ? null : new UniformGL(u); + } + public static final void _wglBindAttributeLocation(ProgramGL p1, int p2, String p3) { + webgl.bindAttribLocation(p1.obj, p2, p3); + } + public static final void _wglUniform1f(UniformGL p1, float p2) { + if(p1 != null) webgl.uniform1f(p1.obj, p2); + } + public static final void _wglUniform2f(UniformGL p1, float p2, float p3) { + if(p1 != null) webgl.uniform2f(p1.obj, p2, p3); + } + public static final void _wglUniform3f(UniformGL p1, float p2, float p3, float p4) { + if(p1 != null) webgl.uniform3f(p1.obj, p2, p3, p4); + } + public static final void _wglUniform4f(UniformGL p1, float p2, float p3, float p4, float p5) { + if(p1 != null) webgl.uniform4f(p1.obj, p2, p3, p4, p5); + } + public static final void _wglUniform1i(UniformGL p1, int p2) { + if(p1 != null) webgl.uniform1i(p1.obj, p2); + } + public static final void _wglUniform2i(UniformGL p1, int p2, int p3) { + if(p1 != null) webgl.uniform2i(p1.obj, p2, p3); + } + public static final void _wglUniform3i(UniformGL p1, int p2, int p3, int p4) { + if(p1 != null) webgl.uniform3i(p1.obj, p2, p3, p4); + } + public static final void _wglUniform4i(UniformGL p1, int p2, int p3, int p4, int p5) { + if(p1 != null) webgl.uniform4i(p1.obj, p2, p3, p4, p5); + } + private static Float32Array mat2 = Float32Array.create(4); + private static Float32Array mat3 = Float32Array.create(9); + private static Float32Array mat4 = Float32Array.create(16); + public static final void _wglUniformMat2fv(UniformGL p1, float[] mat) { + mat2.set(mat); + if(p1 != null) webgl.uniformMatrix2fv(p1.obj, false, mat2); + } + public static final void _wglUniformMat3fv(UniformGL p1, float[] mat) { + mat3.set(mat); + if(p1 != null) webgl.uniformMatrix3fv(p1.obj, false, mat3); + } + public static final void _wglUniformMat4fv(UniformGL p1, float[] mat) { + mat4.set(mat); + if(p1 != null) webgl.uniformMatrix4fv(p1.obj, false, mat4); + } + private static int currentProgram = -1; + public static final void _wglUseProgram(ProgramGL p1) { + if(p1 != null && currentProgram != p1.hashcode) { + currentProgram = p1.hashcode; + webgl.useProgram(p1.obj); + } + } + public static final void _wglGetParameter(int p1, int size, int[] ret) { + if(p1 == _wGL_VIEWPORT) { + ret[0] = viewportCache[0]; + ret[1] = viewportCache[1]; + ret[2] = viewportCache[2]; + ret[3] = viewportCache[3]; + } + } + public static final void _wglPolygonOffset(float p1, float p2) { + webgl.polygonOffset(p1, p2); + } + public static final void _wglVertexAttribPointer(int p1, int p2, int p3, boolean p4, int p5, int p6) { + webgl.vertexAttribPointer(p1, p2, p3, p4, p5, p6); + } + public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) { + webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj); + } + public static final FramebufferGL _wglCreateFramebuffer() { + return new FramebufferGL(webgl.createFramebuffer()); + } + public static final void _wglDeleteFramebuffer(FramebufferGL p1) { + webgl.deleteFramebuffer(p1.obj); + } + public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) { + webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0); + } + public static final QueryGL _wglCreateQuery() { + return new QueryGL(webgl.createQuery()); + } + public static final void _wglBeginQuery(int p1, QueryGL p2) { + webgl.beginQuery(p1, p2.obj); + } + public static final void _wglEndQuery(int p1) { + webgl.endQuery(p1); + } + public static final void _wglDeleteQuery(QueryGL p1) { + webgl.deleteQuery(p1.obj); + } + public static final int _wglGetQueryObjecti(QueryGL p1, int p2) { + return webgl.getQueryParameter(p1.obj, p2); + } + public static final BufferArrayGL _wglCreateVertexArray() { + return new BufferArrayGL(webgl.createVertexArray()); + } + public static final void _wglDeleteVertexArray(BufferArrayGL p1) { + webgl.deleteVertexArray(p1.obj); + } + public static final void _wglBindVertexArray(BufferArrayGL p1) { + webgl.bindVertexArray(p1 == null ? null : p1.obj); + } + public static final void _wglDrawBuffer(int p1) { + webgl.drawBuffers(new int[] { p1 }); + } + public static final RenderbufferGL _wglCreateRenderBuffer() { + return new RenderbufferGL(webgl.createRenderbuffer()); + } + public static final void _wglBindRenderbuffer(RenderbufferGL p1) { + webgl.bindRenderbuffer(RENDERBUFFER, p1 == null ? null : p1.obj); + } + public static final void _wglRenderbufferStorage(int p1, int p2, int p3) { + webgl.renderbufferStorage(RENDERBUFFER, p1, p2, p3); + } + public static final void _wglFramebufferRenderbuffer(int p1, RenderbufferGL p2) { + webgl.framebufferRenderbuffer(FRAMEBUFFER, p1, RENDERBUFFER, p2 == null ? null : p2.obj); + } + public static final void _wglDeleteRenderbuffer(RenderbufferGL p1) { + webgl.deleteRenderbuffer(p1.obj); + } + public static final void _wglRenderbufferStorageMultisample(int p1, int p2, int p3, int p4) { + webgl.renderbufferStorageMultisample(RENDERBUFFER, p1, p2, p3, p4); + } + public static final void _wglBlitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10) { + webgl.blitFramebuffer(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); + } + public static final int _wglGetAttribLocation(ProgramGL p1, String p2) { + return webgl.getAttribLocation(p1.obj, p2); + } + + @JSBody(params = { "ctx", "p" }, script = "return ctx.getTexParameter(0x0DE1, p) | 0;") + private static final native int __wglGetTexParameteri(WebGL2RenderingContext ctx, int p); + public static final int _wglGetTexParameteri(int p1) { + return __wglGetTexParameteri(webgl, p1); + } + @JSBody(params = { "ctx", "p" }, script = "return (0.0 + ctx.getTexParameter(0x0DE1, p));") + private static final native float __wglGetTexParameterf(WebGL2RenderingContext ctx, int p); + public static final float _wglGetTexParameterf(int p1) { + return __wglGetTexParameterf(webgl, p1); + } + public static final boolean isWindows() { + return getPlaf().toLowerCase().contains("win"); + } + private static HTMLCanvasElement imageLoadCanvas = null; + private static CanvasRenderingContext2D imageLoadContext = null; + + @JSBody(params = { "buf", "mime" }, script = "return URL.createObjectURL(new Blob([buf], {type: mime}));") + private static native String getDataURL(ArrayBuffer buf, String mime); + + @JSBody(params = { "url" }, script = "URL.revokeObjectURL(url);") + private static native void freeDataURL(String url); + + public static final MinecraftImage loadPNG(byte[] data) { + ArrayBuffer arr = ArrayBuffer.create(data.length); + Uint8Array.create(arr).set(data); + return loadPNG0(arr); + } + + @Async + private static native MinecraftImage loadPNG0(ArrayBuffer data); + + private static void loadPNG0(ArrayBuffer data, final AsyncCallback ret) { + final HTMLImageElement toLoad = (HTMLImageElement) doc.createElement("img"); + toLoad.addEventListener("load", new EventListener() { + @Override + public void handleEvent(Event evt) { + if(imageLoadCanvas == null) { + imageLoadCanvas = (HTMLCanvasElement) doc.createElement("canvas"); + } + if(imageLoadCanvas.getWidth() < toLoad.getWidth()) { + imageLoadCanvas.setWidth(toLoad.getWidth()); + } + if(imageLoadCanvas.getHeight() < toLoad.getHeight()) { + imageLoadCanvas.setHeight(toLoad.getHeight()); + } + if(imageLoadContext == null) { + imageLoadContext = (CanvasRenderingContext2D) imageLoadCanvas.getContext("2d"); + } + imageLoadContext.clearRect(0, 0, toLoad.getWidth(), toLoad.getHeight()); + imageLoadContext.drawImage(toLoad, 0, 0, toLoad.getWidth(), toLoad.getHeight()); + ImageData pxlsDat = imageLoadContext.getImageData(0, 0, toLoad.getWidth(), toLoad.getHeight()); + Uint8ClampedArray pxls = pxlsDat.getData(); + int totalPixels = pxlsDat.getWidth() * pxlsDat.getHeight(); + freeDataURL(toLoad.getSrc()); + if(pxls.getByteLength() < totalPixels * 4) { + ret.complete(null); + return; + } + int[] pixels = new int[totalPixels]; + for(int i = 0; i < pixels.length; ++i) { + pixels[i] = (pxls.get(i * 4) << 16) | (pxls.get(i * 4 + 1) << 8) | pxls.get(i * 4 + 2) | (pxls.get(i * 4 + 3) << 24); + } + ret.complete(new MinecraftImage(pixels, pxlsDat.getWidth(), pxlsDat.getHeight(), true)); + } + }); + toLoad.addEventListener("error", new EventListener() { + @Override + public void handleEvent(Event evt) { + freeDataURL(toLoad.getSrc()); + ret.complete(null); + } + }); + String src = getDataURL(data, "image/png"); + if(src == null) { + ret.complete(null); + }else { + toLoad.setSrc(src); + } + } + + private static MouseEvent currentEvent = null; + private static KeyboardEvent currentEventK = null; + private static boolean[] buttonStates = new boolean[8]; + private static boolean[] keyStates = new boolean[256]; + public static final boolean mouseNext() { + currentEvent = null; + return !mouseEvents.isEmpty() && (currentEvent = mouseEvents.remove(0)) != null; + } + public static final int mouseGetEventButton() { + if(currentEvent == null) return -1; + int b = currentEvent.getButton(); + return b == 1 ? 2 : (b == 2 ? 1 : b); + } + public static final boolean mouseGetEventButtonState() { + return currentEvent == null ? false : currentEvent.getType().equals(MouseEvent.MOUSEDOWN); + } + public static final boolean mouseIsButtonDown(int p1) { + return buttonStates[p1]; + } + public static final int mouseGetEventDWheel() { + return ("wheel".equals(currentEvent.getType())) ? (((WheelEvent)currentEvent).getDeltaY() == 0.0D ? 0 : (((WheelEvent)currentEvent).getDeltaY() > 0.0D ? -1 : 1)) : 0; + } + public static final void mouseSetCursorPosition(int x, int y) { + + } + private static long mouseUngrabTimer = 0l; + private static int mouseUngrabTimeout = 0; + private static boolean needsPointerLock = false; + public static final void mouseSetGrabbed(boolean grabbed) { + needsPointerLock = grabbed; + if(grabbed) { + mouseDX = 0.0D; + mouseDY = 0.0D; + Window.setTimeout(new TimerHandler() { + @Override + public void onTimer() { + canvas.requestPointerLock(); + long t = System.currentTimeMillis(); + if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); + mouseUngrabTimeout = 0; + if(t - mouseUngrabTimer < 3000l) { + mouseUngrabTimeout = Window.setTimeout(new TimerHandler() { + @Override + public void onTimer() { + canvas.requestPointerLock(); + mouseUngrabTimeout = 0; + } + }, 3000 - (int)(t - mouseUngrabTimer)); + } + } + }, 200); + }else { + mouseUngrabTimer = System.currentTimeMillis(); + if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout); + mouseUngrabTimeout = 0; + doc.exitPointerLock(); + } + } + private static void forceMouseGrabbed() { + long t = System.currentTimeMillis(); + if(t - mouseUngrabTimer > 3000l) { + if(needsPointerLock && !isPointerLocked()) { + canvas.requestPointerLock(); + if(isPointerLocked()) { + needsPointerLock = false; + } + } + } + } + public static final int mouseGetDX() { + double dx = mouseDX; + mouseDX = 0.0D; + return (int)dx; + } + public static final int mouseGetDY() { + double dy = mouseDY; + mouseDY = 0.0D; + return (int)dy; + } + public static final int mouseGetX() { + return mouseX; + } + public static final int mouseGetY() { + return mouseY; + } + public static final int mouseGetEventX() { + return currentEvent == null ? -1 : currentEvent.getClientX(); + } + public static final int mouseGetEventY() { + return currentEvent == null ? -1 : canvas.getClientHeight() - currentEvent.getClientY(); + } + public static final boolean keysNext() { + if(unpressCTRL) { //un-press ctrl after copy/paste permission + keyEvents.clear(); + currentEventK = null; + keyStates[29] = false; + keyStates[157] = false; + keyStates[28] = false; + keyStates[219] = false; + keyStates[220] = false; + unpressCTRL = false; + return false; + } + currentEventK = null; + return !keyEvents.isEmpty() && (currentEventK = keyEvents.remove(0)) != null; + } + public static final int getEventKey() { + return currentEventK == null ? -1 : remapKey(getWhich(currentEventK)); + } + public static final char getEventChar() { + if(currentEventK == null) return '\0'; + String s = currentEventK.getKey(); + return currentEventK == null ? ' ' : (char) (s.length() > 1 ? '\0' : s.charAt(0)); + } + public static final boolean getEventKeyState() { + return currentEventK == null? false : !currentEventK.getType().equals("keyup"); + } + public static final boolean isKeyDown(int p1) { + if(unpressCTRL) { //un-press ctrl after copy/paste permission + keyStates[28] = false; + keyStates[29] = false; + keyStates[157] = false; + keyStates[219] = false; + keyStates[220] = false; + } + return keyStates[p1]; + } + public static final String getKeyName(int p1) { + return (p1 >= 0 && p1 < 256) ? LWJGLKeyNames[p1] : "null"; + } + public static final void setFullscreen(boolean p1) { + if(p1) { + fullscreen(); + } else { + exitFullscreen(); + } + } + + @JSBody(script = "if(!document.fullscreenElement){document.documentElement.requestFullscreen();}") + public static final native void fullscreen(); + + @JSBody(script = "if(document.fullscreenElement){document.exitFullscreen();}") + public static final native void exitFullscreen(); + + public static final boolean shouldShutdown() { + return false; + } + public static final boolean isFunctionKeyDown(boolean mod, int p1) { + return mod && p1 >= 59 && p1 <= 67 && getEventKey() == (2 + (p1 - 59)); + } + public static final boolean isFunctionKeyDown(int mod, int p1) { + return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & getEventKey() == (2 + (p1 - 59)); + } + public static final boolean isFunctionKeyHeldDown(int mod, int p1) { + return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & isKeyDown(2 + (p1 - 59)); + } + + @JSBody(params = { "obj" }, script = "if(obj.commit) obj.commit();") + private static native int commitContext(JSObject obj); + + public static final void updateDisplay() { + commitContext(webgl); + canvasContext.drawImage(canvasBack, 0d, 0d, canvas.getWidth(), canvas.getHeight()); + + int ww = canvas.getClientWidth(); + int hh = canvas.getClientHeight(); + if(ww != width || hh != height) { + width = ww; + height = hh; + canvasBack.setWidth(ww); + canvasBack.setHeight(hh); + } + + try { + Thread.sleep(1l); + } catch (InterruptedException e) { + ; + } + } + public static final void setVSyncEnabled(boolean p1) { + + } + public static final void enableRepeatEvents(boolean b) { + enableRepeatEvents = b; + } + + public static boolean isPointerLocked2() { + return mouseUngrabTimeout != 0 || isPointerLocked(); + } + + @JSBody(params = { }, script = "return document.pointerLockElement != null;") + public static native boolean isPointerLocked(); + + private static boolean pointerLockFlag = false; + + public static final boolean isFocused() { + boolean yee = isPointerLocked(); + boolean dee = pointerLockFlag; + pointerLockFlag = yee; + if(!dee && yee) { + mouseDX = 0.0D; + mouseDY = 0.0D; + } + return isWindowFocused && !(dee && !yee); + } + public static final int getScreenWidth() { + return win.getScreen().getAvailWidth(); + } + public static final int getScreenHeight() { + return win.getScreen().getAvailHeight(); + } + public static final int getCanvasWidth() { + int w = parent.getClientWidth(); + if(w != width) { + canvas.setWidth(w); + canvasBack.setWidth(w); + width = w; + } + return w; + } + public static final int getCanvasHeight() { + int h = parent.getClientHeight(); + if(h != height) { + canvas.setHeight(h); + canvasBack.setHeight(h); + height = h; + } + return h; + } + public static final void setDisplaySize(int x, int y) { + + } + public static final void syncDisplay(int performanceToFps) { + + } + + private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + public static final void saveScreenshot() { + saveScreenshot("screenshot_" + dateFormatSS.format(new Date()).toString() + ".png", canvas); + } + + @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=cvs.toDataURL(\"image/png\");a.download=name;a.click();") + private static native void saveScreenshot(String name, HTMLCanvasElement cvs); + + public static enum RateLimit { + NONE, FAILED, BLOCKED, FAILED_POSSIBLY_LOCKED, LOCKED, NOW_LOCKED; + } + + private static final Set rateLimitedAddresses = new HashSet(); + private static final Set blockedAddresses = new HashSet(); + + private static WebSocket sock = null; + private static boolean sockIsConnecting = false; + private static boolean sockIsConnected = false; + private static boolean sockIsAlive = false; + private static LinkedList readPackets = new LinkedList(); + private static RateLimit rateLimitStatus = null; + private static String currentSockURI = null; + + public static final RateLimit getRateLimitStatus() { + RateLimit l = rateLimitStatus; + rateLimitStatus = null; + return l; + } + public static final void logRateLimit(String addr, RateLimit l) { + if(l == RateLimit.BLOCKED) { + blockedAddresses.add(addr); + }else { + rateLimitedAddresses.add(addr); + } + } + public static final RateLimit checkRateLimitHistory(String addr) { + if(blockedAddresses.contains(addr)) { + return RateLimit.LOCKED; + }else if(rateLimitedAddresses.contains(addr)) { + return RateLimit.BLOCKED; + }else { + return RateLimit.NONE; + } + } + + @Async + public static native String connectWebSocket(String sockURI); + + private static void connectWebSocket(String sockURI, final AsyncCallback cb) { + sockIsConnecting = true; + sockIsConnected = false; + sockIsAlive = false; + rateLimitStatus = null; + currentSockURI = sockURI; + try { + sock = WebSocket.create(sockURI); + } catch(Throwable t) { + sockIsConnecting = false; + sockIsAlive = false; + return; + } + sock.setBinaryType("arraybuffer"); + sock.onOpen(new EventListener() { + @Override + public void handleEvent(MessageEvent evt) { + sockIsConnecting = false; + sockIsAlive = false; + sockIsConnected = true; + readPackets.clear(); + cb.complete("okay"); + } + }); + sock.onClose(new EventListener() { + @Override + public void handleEvent(CloseEvent evt) { + sock = null; + if(sockIsConnecting) { + if(rateLimitStatus == null) { + if(blockedAddresses.contains(currentSockURI)) { + rateLimitStatus = RateLimit.LOCKED; + }else if(rateLimitedAddresses.contains(currentSockURI)) { + rateLimitStatus = RateLimit.FAILED_POSSIBLY_LOCKED; + }else { + rateLimitStatus = RateLimit.FAILED; + } + } + }else if(!sockIsAlive) { + if(rateLimitStatus == null) { + if(blockedAddresses.contains(currentSockURI)) { + rateLimitStatus = RateLimit.LOCKED; + }else if(rateLimitedAddresses.contains(currentSockURI)) { + rateLimitStatus = RateLimit.BLOCKED; + } + } + } + boolean b = sockIsConnecting; + sockIsConnecting = false; + sockIsConnected = false; + sockIsAlive = false; + if(b) cb.complete("fail"); + } + }); + sock.onMessage(new EventListener() { + @Override + public void handleEvent(MessageEvent evt) { + sockIsAlive = true; + if(isString(evt.getData())) { + String stat = evt.getDataAsString(); + if(stat.equalsIgnoreCase("BLOCKED")) { + if(rateLimitStatus == null) { + rateLimitStatus = RateLimit.BLOCKED; + } + rateLimitedAddresses.add(currentSockURI); + }else if(stat.equalsIgnoreCase("LOCKED")) { + if(rateLimitStatus == null) { + rateLimitStatus = RateLimit.NOW_LOCKED; + } + rateLimitedAddresses.add(currentSockURI); + blockedAddresses.add(currentSockURI); + } + sockIsConnecting = false; + sockIsConnected = false; + sock.close(); + return; + } + Uint8Array a = Uint8Array.create(evt.getDataAsArray()); + byte[] b = new byte[a.getByteLength()]; + for(int i = 0; i < b.length; ++i) { + b[i] = (byte) (a.get(i) & 0xFF); + } + readPackets.add(b); + } + }); + } + + public static final boolean startConnection(String uri) { + String res = connectWebSocket(uri); + return "fail".equals(res) ? false : true; + } + public static final void endConnection() { + if(sock == null || sock.getReadyState() == 3) { + sockIsConnecting = false; + } + if(sock != null && !sockIsConnecting) sock.close(); + } + public static final boolean connectionOpen() { + if(sock == null || sock.getReadyState() == 3) { + sockIsConnecting = false; + } + return sock != null && !sockIsConnecting && sock.getReadyState() != 3; + } + @JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);") + private static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer); + public static final void writePacket(byte[] packet) { + if(sock != null && !sockIsConnecting) { + Uint8Array arr = Uint8Array.create(packet.length); + arr.set(packet); + nativeBinarySend(sock, arr.getBuffer()); + } + } + public static final byte[] readPacket() { + if(!readPackets.isEmpty()) { + return readPackets.remove(0); + }else { + return null; + } + } + public static final byte[] loadLocalStorage(String key) { + String s = win.getLocalStorage().getItem("_minecraft_alpha."+key); + if(s != null) { + return Base64.decodeBase64(s); + }else { + return null; + } + } + public static final void saveLocalStorage(String key, byte[] data) { + win.getLocalStorage().setItem("_minecraft_alpha."+key, Base64.encodeBase64String(data)); + } + public static final void openLink(String url) { + win.open(url, "_blank"); + } + public static final void redirectTo(String url) { + Window.current().getLocation().setFullURL(url); + } + + @JSBody(params = { "ext", "mime" }, script = "window.eagsFileChooser.openFileChooser(ext, mime);") + public static native void openFileChooser(String ext, String mime); + + public static final byte[] getFileChooserResult() { + ArrayBuffer b = getFileChooserResult0(); + if(b == null) return null; + Uint8Array array = Uint8Array.create(b); + byte[] ret = new byte[array.getByteLength()]; + for(int i = 0; i < ret.length; ++i) { + ret[i] = (byte) array.get(i); + } + return ret; + } + + @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResult; window.eagsFileChooser.getFileChooserResult = null; return ret;") + private static native ArrayBuffer getFileChooserResult0(); + + @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResultName; window.eagsFileChooser.getFileChooserResultName = null; return ret;") + public static native String getFileChooserResultName(); + + public static final void setListenerPos(float x, float y, float z, float vx, float vy, float vz, float pitch, float yaw) { + float var2 = MathHelper.cos(-yaw * 0.017453292F); + float var3 = MathHelper.sin(-yaw * 0.017453292F); + float var4 = -MathHelper.cos(pitch * 0.017453292F); + float var5 = MathHelper.sin(pitch * 0.017453292F); + AudioListener l = audioctx.getListener(); + l.setPosition(x, y, z); + l.setOrientation(-var3 * var4, -var5, -var2 * var4, 0.0f, 1.0f, 0.0f); + } + + private static int playbackId = 0; + private static final HashMap loadedSoundFiles = new HashMap(); + private static AudioContext audioctx = null; + private static float playbackOffsetDelay = 0.03f; + + public static final void setPlaybackOffsetDelay(float f) { + playbackOffsetDelay = f; + } + + @Async + public static native AudioBuffer decodeAudioAsync(ArrayBuffer buffer); + + private static void decodeAudioAsync(ArrayBuffer buffer, final AsyncCallback cb) { + audioctx.decodeAudioData(buffer, new DecodeSuccessCallback() { + @Override + public void onSuccess(AudioBuffer decodedData) { + cb.complete(decodedData); + } + }, new DecodeErrorCallback() { + @Override + public void onError(JSObject error) { + cb.complete(null); + } + }); + } + + private static final HashMap activeSoundEffects = new HashMap(); + + private static class AudioBufferX { + private final AudioBuffer buffer; + private AudioBufferX(AudioBuffer buffer) { + this.buffer = buffer; + } + } + + private static class AudioBufferSourceNodeX { + private final AudioBufferSourceNode source; + private final PannerNode panner; + private final GainNode gain; + private AudioBufferSourceNodeX(AudioBufferSourceNode source, PannerNode panner, GainNode gain) { + this.source = source; + this.panner = panner; + this.gain = gain; + } + } + + private static final AudioBuffer getBufferFor(String fileName) { + AudioBufferX ret = loadedSoundFiles.get(fileName); + if(ret == null) { + byte[] file = loadResourceBytes(fileName); + if(file == null) return null; + Uint8Array buf = Uint8Array.create(file.length); + buf.set(file); + ret = new AudioBufferX(decodeAudioAsync(buf.getBuffer())); + loadedSoundFiles.put(fileName, ret); + } + return ret.buffer; + } + public static final int beginPlayback(String fileName, float x, float y, float z, float volume, float pitch) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return -1; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + s.getPlaybackRate().setValue(pitch); + PannerNode p = audioctx.createPanner(); + p.setPosition(x, y, z); + p.setMaxDistance(volume * 16f + 0.1f); + p.setRolloffFactor(1f); + //p.setVelocity(0f, 0f, 0f); + p.setDistanceModel("linear"); + p.setPanningModel("HRTF"); + p.setConeInnerAngle(360f); + p.setConeOuterAngle(0f); + p.setConeOuterGain(0f); + p.setOrientation(0f, 1f, 0f); + GainNode g = audioctx.createGain(); + g.getGain().setValue(volume > 1.0f ? 1.0f : volume); + s.connect(g); + g.connect(p); + p.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + final int theId = ++playbackId; + activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g)); + s.setOnEnded(new EventListener() { + + @Override + public void handleEvent(MediaEvent evt) { + activeSoundEffects.remove(theId); + } + + }); + return theId; + } + public static final int beginPlaybackStatic(String fileName, float volume, float pitch) { + AudioBuffer b = getBufferFor(fileName); + if(b == null) return -1; + AudioBufferSourceNode s = audioctx.createBufferSource(); + s.setBuffer(b); + s.getPlaybackRate().setValue(pitch); + GainNode g = audioctx.createGain(); + g.getGain().setValue(volume > 1.0f ? 1.0f : volume); + s.connect(g); + g.connect(audioctx.getDestination()); + s.start(0.0d, playbackOffsetDelay); + final int theId = ++playbackId; + activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, null, g)); + s.setOnEnded(new EventListener() { + @Override + public void handleEvent(MediaEvent evt) { + activeSoundEffects.remove(theId); + } + + }); + return playbackId; + } + public static final void setPitch(int id, float pitch) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.source.getPlaybackRate().setValue(pitch); + } + } + public static final void setVolume(int id, float volume) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.gain.getGain().setValue(volume > 1.0f ? 1.0f : volume); + if(b.panner != null) b.panner.setMaxDistance(volume * 16f + 0.1f); + } + } + public static final void moveSound(int id, float x, float y, float z, float vx, float vy, float vz) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null && b.panner != null) { + b.panner.setPosition(x, y, z); + //b.panner.setVelocity(vx, vy, vz); + } + } + public static final void endSound(int id) { + AudioBufferSourceNodeX b = activeSoundEffects.get(id); + if(b != null) { + b.source.stop(); + activeSoundEffects.remove(id); + } + } + public static final boolean isPlaying(int id) { + return activeSoundEffects.containsKey(id); + } + public static final void openConsole() { + + } + private static boolean connected = false; + public static final void voiceConnect(String channel) { + win.alert("voice channels are not implemented yet"); + connected = true; + } + public static final void voiceVolume(float volume) { + + } + public static final boolean voiceActive() { + return connected; + } + public static final boolean voiceRelayed() { + return connected; + } + public static final String[] voiceUsers() { + return new String[0]; + } + public static final String[] voiceUsersTalking() { + return new String[0]; + } + public static final void voiceEnd() { + connected = false; + } + public static final void doJavascriptCoroutines() { + + } + public static final long maxMemory() { + return 1024*1024*1024; + } + public static final long totalMemory() { + return 1024*1024*1024; + } + public static final long freeMemory() { + return 0l; + } + public static final void exit() { + + } + + @JSBody(params = { }, script = "return window.navigator.userAgent;") + public static native String getUserAgent(); + + private static String[] LWJGLKeyNames = new String[] {"NONE", "ESCAPE", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "MINUS", "EQUALS", "BACK", "TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LBRACKET", "RBRACKET", "RETURN", "LCONTROL", "A", "S", "D", "F", "G", "H", "J", "K", "L", "SEMICOLON", "APOSTROPHE", "GRAVE", "LSHIFT", "BACKSLASH", "Z", "X", "C", "V", "B", "N", "M", "COMMA", "PERIOD", "SLASH", "RSHIFT", "MULTIPLY", "LMENU", "SPACE", "CAPITAL", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "NUMLOCK", "SCROLL", "NUMPAD7", "NUMPAD8", "NUMPAD9", "SUBTRACT", "NUMPAD4", "NUMPAD5", "NUMPAD6", "ADD", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD0", "DECIMAL", "null", "null", "null", "F11", "F12", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "F13", "F14", "F15", "F16", "F17", "F18", "null", "null", "null", "null", "null", "null", "KANA", "F19", "null", "null", "null", "null", "null", "null", "null", "CONVERT", "null", "NOCONVERT", "null", "YEN", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADEQUALS", "null", "null", "CIRCUMFLEX", "AT", "COLON", "UNDERLINE", "KANJI", "STOP", "AX", "UNLABELED", "null", "null", "null", "null", "NUMPADENTER", "RCONTROL", "null", "null", "null", "null", "null", "null", "null", "null", "null", "SECTION", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADCOMMA", "null", "DIVIDE", "null", "SYSRQ", "RMENU", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "FUNCTION", "PAUSE", "null", "HOME", "UP", "PRIOR", "null", "LEFT", "null", "RIGHT", "null", "END", "DOWN", "NEXT", "INSERT", "DELETE", "null", "null", "null", "null", "null", "null", "CLEAR", "LMETA", "RMETA", "APPS", "POWER", "SLEEP", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"}; + + private static int[] LWJGLKeyCodes = new int[] { + /* 0 */ -1, + /* 1 */ -1, + /* 2 */ -1, + /* 3 */ -1, + /* 4 */ -1, + /* 5 */ -1, + /* 6 */ -1, + /* 7 */ -1, + /* 8 */ 14, + /* 9 */ 15, + /* 10 */ -1, + /* 11 */ -1, + /* 12 */ -1, + /* 13 */ 28, + /* 14 */ -1, + /* 15 */ -1, + /* 16 */ 42, + /* 17 */ 29, + /* 18 */ 56, + /* 19 */ -1, + /* 20 */ -1, + /* 21 */ -1, + /* 22 */ -1, + /* 23 */ -1, + /* 24 */ -1, + /* 25 */ -1, + /* 26 */ -1, + /* 27 */ 1, + /* 28 */ -1, + /* 29 */ -1, + /* 30 */ -1, + /* 31 */ -1, + /* 32 */ 57, + /* 33 */ 210, + /* 34 */ 201, + /* 35 */ 207, + /* 36 */ 199, + /* 37 */ 203, + /* 38 */ 200, + /* 39 */ 205, + /* 40 */ 208, + /* 41 */ 205, + /* 42 */ 208, + /* 43 */ -1, + /* 44 */ -1, + /* 45 */ 210, + /* 46 */ 211, + /* 47 */ 211, + /* 48 */ 11, + /* 49 */ 2, + /* 50 */ 3, + /* 51 */ 4, + /* 52 */ 5, + /* 53 */ 6, + /* 54 */ 7, + /* 55 */ 8, + /* 56 */ 9, + /* 57 */ 10, + /* 58 */ -1, + /* 59 */ -1, + /* 60 */ -1, + /* 61 */ -1, + /* 62 */ -1, + /* 63 */ -1, + /* 64 */ -1, + /* 65 */ 30, + /* 66 */ 48, + /* 67 */ 46, + /* 68 */ 32, + /* 69 */ 18, + /* 70 */ 33, + /* 71 */ 34, + /* 72 */ 35, + /* 73 */ 23, + /* 74 */ 36, + /* 75 */ 37, + /* 76 */ 38, + /* 77 */ 50, + /* 78 */ 49, + /* 79 */ 24, + /* 80 */ 25, + /* 81 */ 16, + /* 82 */ 19, + /* 83 */ 31, + /* 84 */ 20, + /* 85 */ 22, + /* 86 */ 47, + /* 87 */ 17, + /* 88 */ 45, + /* 89 */ 21, + /* 90 */ 44, + /* 91 */ -1, + /* 92 */ -1, + /* 93 */ -1, + /* 94 */ -1, + /* 95 */ -1, + /* 96 */ -1, + /* 97 */ -1, + /* 98 */ -1, + /* 99 */ -1, + /* 100 */ -1, + /* 101 */ -1, + /* 102 */ -1, + /* 103 */ -1, + /* 104 */ -1, + /* 105 */ -1, + /* 106 */ -1, + /* 107 */ -1, + /* 108 */ -1, + /* 109 */ 12, + /* 110 */ 52, + /* 111 */ 53, + /* 112 */ -1, + /* 113 */ -1, + /* 114 */ -1, + /* 115 */ -1, + /* 116 */ -1, + /* 117 */ -1, + /* 118 */ -1, + /* 119 */ -1, + /* 120 */ -1, + /* 121 */ -1, + /* 122 */ -1, + /* 123 */ -1, + /* 124 */ -1, + /* 125 */ -1, + /* 126 */ -1, + /* 127 */ -1, + /* 128 */ -1, + /* 129 */ -1, + /* 130 */ -1, + /* 131 */ -1, + /* 132 */ -1, + /* 133 */ -1, + /* 134 */ -1, + /* 135 */ -1, + /* 136 */ -1, + /* 137 */ -1, + /* 138 */ -1, + /* 139 */ -1, + /* 140 */ -1, + /* 141 */ -1, + /* 142 */ -1, + /* 143 */ -1, + /* 144 */ -1, + /* 145 */ -1, + /* 146 */ -1, + /* 147 */ -1, + /* 148 */ -1, + /* 149 */ -1, + /* 150 */ -1, + /* 151 */ -1, + /* 152 */ -1, + /* 153 */ -1, + /* 154 */ -1, + /* 155 */ -1, + /* 156 */ -1, + /* 157 */ -1, + /* 158 */ -1, + /* 159 */ -1, + /* 160 */ -1, + /* 161 */ -1, + /* 162 */ -1, + /* 163 */ -1, + /* 164 */ -1, + /* 165 */ -1, + /* 166 */ -1, + /* 167 */ -1, + /* 168 */ -1, + /* 169 */ -1, + /* 170 */ -1, + /* 171 */ -1, + /* 172 */ -1, + /* 173 */ -1, + /* 174 */ -1, + /* 175 */ -1, + /* 176 */ -1, + /* 177 */ -1, + /* 178 */ -1, + /* 179 */ -1, + /* 180 */ -1, + /* 181 */ -1, + /* 182 */ -1, + /* 183 */ -1, + /* 184 */ -1, + /* 185 */ -1, + /* 186 */ 39, + /* 187 */ 13, + /* 188 */ 51, + /* 189 */ 12, + /* 190 */ 52, + /* 191 */ 53, + /* 192 */ -1, + /* 193 */ -1, + /* 194 */ -1, + /* 195 */ -1, + /* 196 */ -1, + /* 197 */ -1, + /* 198 */ -1, + /* 199 */ -1, + /* 200 */ -1, + /* 200 */ -1, + /* 201 */ -1, + /* 202 */ -1, + /* 203 */ -1, + /* 204 */ -1, + /* 205 */ -1, + /* 206 */ -1, + /* 207 */ -1, + /* 208 */ -1, + /* 209 */ -1, + /* 210 */ -1, + /* 211 */ -1, + /* 212 */ -1, + /* 213 */ -1, + /* 214 */ -1, + /* 215 */ -1, + /* 216 */ -1, + /* 217 */ -1, + /* 218 */ -1, + /* 219 */ 26, + /* 220 */ 43, + /* 221 */ 27, + /* 222 */ 40 + }; + + public static final int _wArrayByteLength(Object obj) { + return ((Int32Array)obj).getByteLength(); + } + + public static final Object _wCreateLowLevelIntBuffer(int len) { + return Int32Array.create(len); + } + + private static int appendbufferindex = 0; + private static Int32Array appendbuffer = Int32Array.create(ArrayBuffer.create(525000*4)); + + public static final void _wAppendLowLevelBuffer(Object arr) { + Int32Array a = ((Int32Array)arr); + if(appendbufferindex + a.getLength() < appendbuffer.getLength()) { + appendbuffer.set(a, appendbufferindex); + appendbufferindex += a.getLength(); + } + } + + public static final Object _wGetLowLevelBuffersAppended() { + Int32Array ret = Int32Array.create(appendbuffer.getBuffer(), 0, appendbufferindex); + appendbufferindex = 0; + return ret; + } + + private static int remapKey(int k) { + return (k > LWJGLKeyCodes.length || k < 0) ? -1 : LWJGLKeyCodes[k]; + } + + @JSFunctor + private static interface StupidFunctionResolveString extends JSObject { + void resolveStr(String s); + } + + private static boolean unpressCTRL = false; + + @Async + public static native String getClipboard(); + + private static void getClipboard(final AsyncCallback cb) { + final long start = System.currentTimeMillis(); + getClipboard0(new StupidFunctionResolveString() { + @Override + public void resolveStr(String s) { + if(System.currentTimeMillis() - start > 500l) { + unpressCTRL = true; + } + cb.complete(s); + } + }); + } + + @JSBody(params = { "cb" }, script = "if(!window.navigator.clipboard) cb(null); else window.navigator.clipboard.readText().then(function(s) { cb(s); }, function(s) { cb(null); });") + private static native void getClipboard0(StupidFunctionResolveString cb); + + @JSBody(params = { "str" }, script = "if(window.navigator.clipboard) window.navigator.clipboard.writeText(str);") + public static native void setClipboard(String str); + + @JSBody(params = { "obj" }, script = "return typeof obj === \"string\";") + private static native boolean isString(JSObject obj); + +// public static final boolean fileExists(String path) { +// return IndexedDBFilesystem.fileExists(path); +// } +// +// public static final boolean directoryExists(String path) { +// return IndexedDBFilesystem.directoryExists(path); +// } +// +// public static final boolean pathExists(String path) { +// return IndexedDBFilesystem.pathExists(path); +// } +// +// public static final void writeFile(String path, byte[] data) { +// IndexedDBFilesystem.writeFile(path, data); +// } +// +// public static final byte[] readFile(String path) { +// return IndexedDBFilesystem.readFile(path); +// } +// +// public static final long getLastModified(String path) { +// return IndexedDBFilesystem.getLastModified(path); +// } +// +// public static final int getFileSize(String path) { +// return IndexedDBFilesystem.getFileSize(path); +// } +// +// public static final void renameFile(String oldPath, String newPath) { +// IndexedDBFilesystem.renameFile(oldPath, newPath); +// } +// +// public static final void copyFile(String oldPath, String newPath) { +// IndexedDBFilesystem.copyFile(oldPath, newPath); +// } +// +// public static final void deleteFile(String path) { +// IndexedDBFilesystem.deleteFile(path); +// } +// +// public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) { +// return IndexedDBFilesystem.listFiles(path, listDirs, recursiveDirs); +// } + +// public static final Collection listFilesAndDirectories(String path) { +// return listFiles(path, true, false); +// } +// +// public static final Collection listFilesRecursive(String path) { +// return listFiles(path, false, true); +// } + + public static class FileEntry { + + public final String path; + public final boolean isDirectory; + public final long lastModified; + + public FileEntry(String path, boolean isDirectory, long lastModified) { + this.path = path; + this.isDirectory = isDirectory; + this.lastModified = lastModified; + } + + public String getName() { + int i = path.indexOf('/'); + if(i >= 0) { + return path.substring(i + 1); + }else { + return path; + } + } + + } + + private static String stripPath(String str) { + if(str.startsWith("/")) { + str = str.substring(1); + } + if(str.endsWith("/")) { + str = str.substring(0, str.length() - 1); + } + return str; + } + + @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=URL.createObjectURL(new Blob([cvs],{type:\"application/octet-stream\"}));a.download=name;a.click();URL.revokeObjectURL(a.href);") + private static native void downloadFile0(String name, ArrayBuffer cvs); + + public static final void downloadFile(String filename, byte[] data) { + Uint8Array b = Uint8Array.create(data.length); + b.set(data); + downloadFile0(filename, b.getBuffer()); + } + +} \ No newline at end of file diff --git a/src/teavm/java/org/lwjgl/opengl/WebGLManager.java b/src/teavm/java/org/lwjgl/opengl/WebGLManager.java new file mode 100644 index 0000000..dd5acf0 --- /dev/null +++ b/src/teavm/java/org/lwjgl/opengl/WebGLManager.java @@ -0,0 +1,1226 @@ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.HashMap; + +import net.PeytonPlayz585.glemu.FixedFunctionShader; + +import net.PeytonPlayz585.glemu.vector.*; + +public class WebGLManager extends WebGL { + + public static final int GL_ZERO = RealOpenGLEnums.GL_ZERO; + public static final int GL_ONE = RealOpenGLEnums.GL_ONE; + public static final int GL_TEXTURE_2D = RealOpenGLEnums.GL_TEXTURE_2D; + public static final int GL_SMOOTH = RealOpenGLEnums.GL_SMOOTH; + public static final int GL_DEPTH_TEST = RealOpenGLEnums.GL_DEPTH_TEST; + public static final int GL_LEQUAL = RealOpenGLEnums.GL_LEQUAL; + public static final int GL_ALPHA_TEST = RealOpenGLEnums.GL_ALPHA_TEST; + public static final int GL_GREATER = RealOpenGLEnums.GL_GREATER; + public static final int GL_BACK = RealOpenGLEnums.GL_BACK; + public static final int GL_PROJECTION = RealOpenGLEnums.GL_PROJECTION; + public static final int GL_MODELVIEW = RealOpenGLEnums.GL_MODELVIEW; + public static final int GL_COLOR_BUFFER_BIT = RealOpenGLEnums.GL_COLOR_BUFFER_BIT; + public static final int GL_DEPTH_BUFFER_BIT = RealOpenGLEnums.GL_DEPTH_BUFFER_BIT; + public static final int GL_LIGHTING = RealOpenGLEnums.GL_LIGHTING; + public static final int GL_FOG = RealOpenGLEnums.GL_FOG; + public static final int GL_COLOR_MATERIAL = RealOpenGLEnums.GL_COLOR_MATERIAL; + public static final int GL_BLEND = RealOpenGLEnums.GL_BLEND; + public static final int GL_RGBA = RealOpenGLEnums.GL_RGBA; + public static final int GL_UNSIGNED_BYTE = RealOpenGLEnums.GL_UNSIGNED_BYTE; + public static final int GL_TEXTURE_WIDTH = RealOpenGLEnums.GL_TEXTURE_WIDTH; + public static final int GL_LIGHT0 = RealOpenGLEnums.GL_LIGHT0; + public static final int GL_LIGHT1 = RealOpenGLEnums.GL_LIGHT1; + public static final int GL_POSITION = RealOpenGLEnums.GL_POSITION; + public static final int GL_DIFFUSE = RealOpenGLEnums.GL_DIFFUSE; + public static final int GL_SPECULAR = RealOpenGLEnums.GL_SPECULAR; + public static final int GL_AMBIENT = RealOpenGLEnums.GL_AMBIENT; + public static final int GL_FLAT = RealOpenGLEnums.GL_FLAT; + public static final int GL_LIGHT_MODEL_AMBIENT = RealOpenGLEnums.GL_LIGHT_MODEL_AMBIENT; + public static final int GL_FRONT_AND_BACK = RealOpenGLEnums.GL_FRONT_AND_BACK; + public static final int GL_AMBIENT_AND_DIFFUSE = RealOpenGLEnums.GL_AMBIENT_AND_DIFFUSE; + public static final int GL_MODELVIEW_MATRIX = RealOpenGLEnums.GL_MODELVIEW_MATRIX; + public static final int GL_PROJECTION_MATRIX = RealOpenGLEnums.GL_PROJECTION_MATRIX; + public static final int GL_VIEWPORT = RealOpenGLEnums.GL_VIEWPORT; + public static final int GL_RESCALE_NORMAL = RealOpenGLEnums.GL_RESCALE_NORMAL; + public static final int GL_SRC_ALPHA = RealOpenGLEnums.GL_SRC_ALPHA; + public static final int GL_ONE_MINUS_SRC_ALPHA = RealOpenGLEnums.GL_ONE_MINUS_SRC_ALPHA; + public static final int GL_ONE_MINUS_DST_COLOR = RealOpenGLEnums.GL_ONE_MINUS_DST_COLOR; + public static final int GL_ONE_MINUS_SRC_COLOR = RealOpenGLEnums.GL_ONE_MINUS_SRC_COLOR; + public static final int GL_CULL_FACE = RealOpenGLEnums.GL_CULL_FACE; + public static final int GL_TEXTURE_MIN_FILTER = RealOpenGLEnums.GL_TEXTURE_MIN_FILTER; + public static final int GL_TEXTURE_MAG_FILTER = RealOpenGLEnums.GL_TEXTURE_MAG_FILTER; + public static final int GL_LINEAR = RealOpenGLEnums.GL_LINEAR; + public static final int GL_COLOR_LOGIC_OP = RealOpenGLEnums.GL_COLOR_LOGIC_OP; + public static final int GL_OR_REVERSE = RealOpenGLEnums.GL_OR_REVERSE; + public static final int GL_EQUAL = RealOpenGLEnums.GL_EQUAL; + public static final int GL_SRC_COLOR = RealOpenGLEnums.GL_SRC_COLOR; + public static final int GL_TEXTURE = RealOpenGLEnums.GL_TEXTURE; + public static final int GL_FRONT = RealOpenGLEnums.GL_FRONT; + public static final int GL_COMPILE = RealOpenGLEnums.GL_COMPILE; + public static final int GL_NEAREST = RealOpenGLEnums.GL_NEAREST; + public static final int GL_CLAMP = RealOpenGLEnums.GL_CLAMP_TO_EDGE; + public static final int GL_TEXTURE_WRAP_S = RealOpenGLEnums.GL_TEXTURE_WRAP_S; + public static final int GL_TEXTURE_WRAP_T = RealOpenGLEnums.GL_TEXTURE_WRAP_T; + public static final int GL_REPEAT = RealOpenGLEnums.GL_REPEAT; + public static final int GL_BGRA = RealOpenGLEnums.GL_BGRA; + public static final int GL_UNSIGNED_INT_8_8_8_8_REV = RealOpenGLEnums.GL_UNSIGNED_INT_8_8_8_8_REV; + public static final int GL_DST_COLOR = RealOpenGLEnums.GL_DST_COLOR; + public static final int GL_POLYGON_OFFSET_FILL = RealOpenGLEnums.GL_POLYGON_OFFSET_FILL; + public static final int GL_NORMALIZE = RealOpenGLEnums.GL_NORMALIZE; + public static final int GL_DST_ALPHA = RealOpenGLEnums.GL_DST_ALPHA; + public static final int GL_FLOAT = RealOpenGLEnums.GL_FLOAT; + public static final int GL_TEXTURE_COORD_ARRAY = RealOpenGLEnums.GL_TEXTURE_COORD_ARRAY; + public static final int GL_SHORT = RealOpenGLEnums.GL_SHORT; + public static final int GL_COLOR_ARRAY = RealOpenGLEnums.GL_COLOR_ARRAY; + public static final int GL_VERTEX_ARRAY = RealOpenGLEnums.GL_VERTEX_ARRAY; + public static final int GL_TRIANGLES = RealOpenGLEnums.GL_TRIANGLES; + public static final int GL_NORMAL_ARRAY = RealOpenGLEnums.GL_NORMAL_ARRAY; + public static final int GL_TEXTURE_3D = RealOpenGLEnums.GL_TEXTURE_3D; + public static final int GL_FOG_MODE = RealOpenGLEnums.GL_FOG_MODE; + public static final int GL_EXP = RealOpenGLEnums.GL_EXP; + public static final int GL_FOG_DENSITY = RealOpenGLEnums.GL_FOG_DENSITY; + public static final int GL_FOG_START = RealOpenGLEnums.GL_FOG_START; + public static final int GL_FOG_END = RealOpenGLEnums.GL_FOG_END; + public static final int GL_FOG_COLOR = RealOpenGLEnums.GL_FOG_COLOR; + public static final int GL_TRIANGLE_STRIP = RealOpenGLEnums.GL_TRIANGLE_STRIP; + public static final int GL_PACK_ALIGNMENT = RealOpenGLEnums.GL_PACK_ALIGNMENT; + public static final int GL_UNPACK_ALIGNMENT = RealOpenGLEnums.GL_UNPACK_ALIGNMENT; + public static final int GL_QUADS = RealOpenGLEnums.GL_QUADS; + public static final int GL_INVALID_ENUM = RealOpenGLEnums.GL_INVALID_ENUM; + public static final int GL_INVALID_VALUE = RealOpenGLEnums.GL_INVALID_VALUE; + public static final int GL_INVALID_OPERATION = RealOpenGLEnums.GL_INVALID_OPERATION; + public static final int GL_OUT_OF_MEMORY = RealOpenGLEnums.GL_OUT_OF_MEMORY; + public static final int GL_CONTEXT_LOST_WEBGL = -144; + public static final int GL_TRIANGLE_FAN = RealOpenGLEnums.GL_TRIANGLE_FAN; + public static final int GL_LINE_STRIP = RealOpenGLEnums.GL_LINE_STRIP; + public static final int GL_LINES = RealOpenGLEnums.GL_LINES; + public static final int GL_NEAREST_MIPMAP_LINEAR = RealOpenGLEnums.GL_NEAREST_MIPMAP_LINEAR; + public static final int GL_TEXTURE_MAX_ANISOTROPY = -150; + public static final int GL_TEXTURE_MAX_LEVEL = RealOpenGLEnums.GL_TEXTURE_MAX_LEVEL; + public static final int GL_LINEAR_MIPMAP_LINEAR = RealOpenGLEnums.GL_LINEAR_MIPMAP_LINEAR; + public static final int GL_LINEAR_MIPMAP_NEAREST = RealOpenGLEnums.GL_LINEAR_MIPMAP_NEAREST; + public static final int GL_NEAREST_MIPMAP_NEAREST = RealOpenGLEnums.GL_NEAREST_MIPMAP_NEAREST; + + public static final boolean isWebGL = _wisWebGL(); + + private static final GLObjectMap texObjects = new GLObjectMap(256); + + private static boolean enableTexture2D = false; + private static boolean enableLighting = false; + private static boolean enableAlphaTest = false; + private static float alphaThresh = 0.1f; + + private static boolean isCompilingDisplayList = false; + private static DisplayList compilingDisplayList = null; + + private static boolean enableColorArray = false; + private static boolean enableNormalArray = false; + private static boolean enableTex0Array = false; + + private static float colorR = 1.0f; + private static float colorG = 1.0f; + private static float colorB = 1.0f; + private static float colorA = 1.0f; + + private static float normalX = 1.0f; + private static float normalY = 0.0f; + private static float normalZ = 0.0f; + + private static float tex0X = 0; + private static float tex0Y = 0; + + private static boolean enableColorMaterial = false; + + private static float fogColorR = 1.0f; + private static float fogColorG = 1.0f; + private static float fogColorB = 1.0f; + private static float fogColorA = 1.0f; + private static int fogMode = 1; + private static boolean fogEnabled = false; + private static boolean fogPremultiply = false; + private static float fogStart = 1.0f; + private static float fogEnd = 1.0f; + private static float fogDensity = 1.0f; + + private static int bytesUploaded = 0; + private static int vertexDrawn = 0; + private static int triangleDrawn = 0; + + private static int matrixMode = GL_MODELVIEW; + + static Matrix4f[] matModelV = new Matrix4f[32]; + static int matModelPointer = 0; + + static Matrix4f[] matProjV = new Matrix4f[6]; + static int matProjPointer = 0; + + static Matrix4f[] matTexV = new Matrix4f[16]; + static int matTexPointer = 0; + + static { + for (int i = 0; i < matModelV.length; ++i) { + matModelV[i] = new Matrix4f(); + } + for (int i = 0; i < matProjV.length; ++i) { + matProjV[i] = new Matrix4f(); + } + for (int i = 0; i < matTexV.length; ++i) { + matTexV[i] = new Matrix4f(); + } + } + + public static void glClearStack() { + matModelV[0].load(matModelV[matModelPointer]); + matModelPointer = 0; + matProjV[0].load(matProjV[matProjPointer]); + matProjPointer = 0; + matTexV[0].load(matTexV[matTexPointer]); + matTexPointer = 0; + } + + private static BufferGL quadsToTrianglesBuffer = null; + private static BufferArrayGL currentArray = null; + + private static class DisplayList { + private final int id; + private BufferArrayGL glarray; + private BufferGL glbuffer; + private int shaderMode; + private int listLength; + + private DisplayList(int id) { + this.id = id; + this.glarray = null; + this.glbuffer = null; + this.shaderMode = -1; + this.listLength = 0; + } + } + + private static final HashMap displayLists = new HashMap(); + private static final HashMap displayListsInitialized = new HashMap(); + + public static final int getDisplayListCount() { + return displayListsInitialized.size(); + } + + public static final void glEnable(int p1) { + switch (p1) { + case GL_DEPTH_TEST: + _wglEnable(_wGL_DEPTH_TEST); + break; + case GL_CULL_FACE: + _wglEnable(_wGL_CULL_FACE); + break; + case GL_BLEND: + _wglEnable(_wGL_BLEND); + break; + case GL_RESCALE_NORMAL: + break; + case GL_TEXTURE_2D: + enableTexture2D = true; + break; + case GL_LIGHTING: + enableLighting = true; + break; + case GL_ALPHA_TEST: + enableAlphaTest = true; + break; + case GL_FOG: + fogEnabled = true; + break; + case GL_COLOR_MATERIAL: + enableColorMaterial = true; + break; + case GL_POLYGON_OFFSET_FILL: + _wglEnable(_wGL_POLYGON_OFFSET_FILL); + default: + break; + } + } + + public static final void glShadeModel(int p1) { + + } + + public static final void glClearDepth(float p1) { + _wglClearDepth(-p1); + } + + public static final void glDepthFunc(int p1) { + int f = _wGL_GEQUAL; + switch (p1) { + case GL_GREATER: + f = _wGL_LESS; + break; + case GL_LEQUAL: + f = _wGL_GEQUAL; + break; + case GL_EQUAL: + f = _wGL_EQUAL; + default: + break; + } + _wglDepthFunc(f); + } + + public static final void glAlphaFunc(int p1, float p2) { + alphaThresh = p2; + } + + public static final void glCullFace(int p1) { + _wglCullFace(p1); + } + + public static final void glMatrixMode(int p1) { + matrixMode = p1; + } + + private static final Matrix4f getMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + return matModelV[matModelPointer]; + case GL_PROJECTION: + return matProjV[matProjPointer]; + case GL_TEXTURE: + return matTexV[matTexPointer]; + } + } + + public static final void glLoadIdentity() { + getMatrix().setIdentity(); + } + + public static final void glViewport(int p1, int p2, int p3, int p4) { + _wglViewport(p1, p2, p3, p4); + } + + public static final void glClear(int p1) { + _wglClear(p1); + } + + public static final void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) { + Matrix4f res = getMatrix(); + res.m00 = (float) (2.0f / (right - left)); + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = (float) (2.0f / (top - bottom)); + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = (float) (2.0f / (zFar - zNear)); + res.m23 = 0.0f; + res.m30 = (float) (-(right + left) / (right - left)); + res.m31 = (float) (-(top + bottom) / (top - bottom)); + res.m32 = (float) ((zFar + zNear) / (zFar - zNear)); + res.m33 = 1.0f; + } + + public static final void glOrtho(float left, float right, float bottom, float top, float zNear, float zFar) { + Matrix4f res = getMatrix(); + res.m00 = 2.0f / (right - left); + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = 2.0f / (top - bottom); + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = 2.0f / (zFar - zNear); + res.m23 = 0.0f; + res.m30 = -(right + left) / (right - left); + res.m31 = -(top + bottom) / (top - bottom); + res.m32 = (zFar + zNear) / (zFar - zNear); + res.m33 = 1.0f; + } + + private static final Vector3f deevis = new Vector3f(); + + public static final void glTranslatef(float p1, float p2, float p3) { + deevis.set(p1, p2, p3); + getMatrix().translate(deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glClearColor(float p1, float p2, float p3, float p4) { + _wglClearColor(p1, p2, p3, p4); + } + + public static final void glDisable(int p1) { + switch (p1) { + case GL_DEPTH_TEST: + _wglDisable(_wGL_DEPTH_TEST); + break; + case GL_CULL_FACE: + _wglDisable(_wGL_CULL_FACE); + break; + case GL_BLEND: + _wglDisable(_wGL_BLEND); + break; + case GL_RESCALE_NORMAL: + break; + case GL_TEXTURE_2D: + enableTexture2D = false; + break; + case GL_LIGHTING: + enableLighting = false; + break; + case GL_ALPHA_TEST: + enableAlphaTest = false; + break; + case GL_FOG: + fogEnabled = false; + break; + case GL_COLOR_MATERIAL: + enableColorMaterial = false; + break; + case GL_POLYGON_OFFSET_FILL: + _wglDisable(_wGL_POLYGON_OFFSET_FILL); + default: + break; + } + } + + public static final void glColor4f(float p1, float p2, float p3, float p4) { + colorR = p1; + colorG = p2; + colorB = p3; + colorA = p4; + } + + public static final int glGetError() { + int err = _wglGetError(); + if (err == _wGL_CONTEXT_LOST_WEBGL) + return GL_CONTEXT_LOST_WEBGL; + return err; + } + + public static final void glFlush() { + //...??? + } + + public static final void glLineWidth(float p1) { + + } + + public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + ByteBuffer p9) { + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glLight(int p1, int p2, FloatBuffer p3) { + + } + + public static final void glLightModel(int p1, FloatBuffer p2) { + + } + + private static Vector4f lightPos0vec0 = new Vector4f(); + private static Vector4f lightPos1vec0 = new Vector4f(); + private static Vector4f lightPos0vec = new Vector4f(); + private static Vector4f lightPos1vec = new Vector4f(); + + public static final void copyModelToLightMatrix() { + lightPos0vec0.set(lightPos0vec); + lightPos1vec0.set(lightPos1vec); + lightPos0vec.set(0.2f, 1.0f, -0.7f, 0.0f); + lightPos0vec.normalise(); + lightPos1vec.set(-0.2f, 1.0f, 0.7f, 0.0f); + lightPos1vec.normalise(); + Matrix4f.transform(matModelV[matModelPointer], lightPos0vec, lightPos0vec).normalise(); + Matrix4f.transform(matModelV[matModelPointer], lightPos1vec, lightPos1vec).normalise(); + } + + public static final void flipLightMatrix() { + lightPos0vec.x = -lightPos0vec.x; + lightPos1vec.x = -lightPos1vec.x; + lightPos0vec.y = -lightPos0vec.y; + lightPos1vec.y = -lightPos1vec.y; + lightPos0vec.z = -lightPos0vec.z; + lightPos1vec.z = -lightPos1vec.z; + } + + public static final void revertLightMatrix() { + lightPos0vec.set(lightPos0vec0); + lightPos1vec.set(lightPos1vec0); + } + + public static final void glPushMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + if (matModelPointer < matModelV.length - 1) { + ++matModelPointer; + matModelV[matModelPointer].load(matModelV[matModelPointer - 1]); + } else { + System.err.println("modelview matrix stack overflow"); + } + break; + case GL_PROJECTION: + if (matProjPointer < matProjV.length - 1) { + ++matProjPointer; + matProjV[matProjPointer].load(matProjV[matProjPointer - 1]); + } else { + System.err.println("projection matrix stack overflow"); + } + break; + case GL_TEXTURE: + if (matTexPointer < matTexV.length - 1) { + ++matTexPointer; + matTexV[matTexPointer].load(matTexV[matTexPointer - 1]); + } else { + System.err.println("texture matrix stack overflow"); + } + break; + } + } + + private static final float toRad = 0.0174532925f; + + public static final void glRotatef(float p1, float p2, float p3, float p4) { + deevis.set(p2, p3, p4); + getMatrix().rotate(p1 * toRad, deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glPopMatrix() { + switch (matrixMode) { + case GL_MODELVIEW: + default: + if (matModelPointer > 0) { + --matModelPointer; + } else { + System.err.println("modelview matrix stack underflow"); + } + break; + case GL_PROJECTION: + if (matProjPointer > 0) { + --matProjPointer; + } else { + System.err.println("projection matrix stack underflow"); + } + break; + case GL_TEXTURE: + if (matTexPointer > 0) { + --matTexPointer; + } else { + System.err.println("texture matrix stack underflow"); + } + break; + } + } + + public static final void glColorMaterial(int p1, int p2) { + + } + + public static final void glGetFloat(int p1, FloatBuffer p2) { + switch (p1) { + case GL_MODELVIEW_MATRIX: + default: + matModelV[matModelPointer].store(p2); + break; + case GL_PROJECTION_MATRIX: + matProjV[matProjPointer].store(p2); + break; + } + } + + public static final void glGetInteger(int p1, int[] p2) { + if (p1 == GL_VIEWPORT) { + _wglGetParameter(_wGL_VIEWPORT, 4, p2); + } + } + + public static final void glScalef(float p1, float p2, float p3) { + deevis.set(p1, p2, p3); + getMatrix().scale(deevis); + if (isCompilingDisplayList) { + throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + } + } + + public static final void glBlendFunc(int p1, int p2) { + fogPremultiply = (p1 == GL_ONE && p2 == GL_ONE_MINUS_SRC_ALPHA); + _wglBlendFunc(p1, p2); + } + + public static final void glBlendFuncSeparate(int p1, int p2, int p3, int p4) { + fogPremultiply = (p3 == GL_ONE && p4 == GL_ONE_MINUS_SRC_ALPHA); + _wglBlendFuncSeparate(p1, p2, p3, p4); + } + + public static final void glDepthMask(boolean p1) { + _wglDepthMask(p1); + } + + public static final void glColorMask(boolean p1, boolean p2, boolean p3, boolean p4) { + _wglColorMask(p1, p2, p3, p4); + } + + public static final void glBindTexture(int p1, int p2) { + TextureGL t = texObjects.get(p2); + _wglBindTexture(_wGL_TEXTURE_2D, t); + } + + public static final void glCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) { + _wglCopyTexSubImage2D(_wGL_TEXTURE_2D, p2, p3, p4, p5, p6, p7, p8); + } + + public static final void glTexParameteri(int p1, int p2, int p3) { + if(p3 == RealOpenGLEnums.GL_CLAMP_TO_EDGE || p3 == 10496) { + p3 = _wGL_CLAMP; + } + _wglTexParameteri(p1, p2, p3); + } + + public static final void glTexParameterf(int p1, int p2, float p3) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + int pp2 = 0; + switch (p2) { + default: + case GL_TEXTURE_MAX_ANISOTROPY: + pp2 = _wGL_TEXTURE_MAX_ANISOTROPY; + break; + } + _wglTexParameterf(pp1, pp2, p3); + } + + public static final void glLogicOp(int p1) { + + } + + public static final void glNormal3f(float p1, float p2, float p3) { + float len = (float) Math.sqrt(p1 * p1 + p2 * p2 + p3 * p3); + normalX = p1 / len; + normalY = p2 / len; + normalZ = p3 / len; + } + + public static final int glGenLists(int p1) { + int base = displayListId + 1; + for (int i = 0; i < p1; i++) { + int id = ++displayListId; + displayLists.put(id, new DisplayList(id)); + } + return base; + } + + public static final void _wglBindVertexArray0(BufferArrayGL p1) { + currentArray = p1; + _wglBindVertexArray(p1); + } + + private static int displayListId = 0; + + public static final void glCallList(int p1) { + if (!isCompilingDisplayList) { + DisplayList d = displayListsInitialized.get(p1); + if (d != null && d.listLength > 0) { + bindTheShader(d.shaderMode | getShaderModeFlag1()); + _wglBindVertexArray0(d.glarray); + _wglDrawQuadArrays(0, d.listLength); + shader.unuseProgram(); + vertexDrawn += d.listLength * 6 / 4; + triangleDrawn += d.listLength / 2; + } + } + } + + public static final void glNewList(int p1, int p2) { + if (!isCompilingDisplayList) { + compilingDisplayList = displayLists.get(p1); + if (compilingDisplayList != null) { + compilingDisplayList.shaderMode = -1; + compilingDisplayList.listLength = 0; + isCompilingDisplayList = true; + } + } + } + + public static final void glEndList() { + if (isCompilingDisplayList) { + isCompilingDisplayList = false; + Object upload = _wGetLowLevelBuffersAppended(); + int l = _wArrayByteLength(upload); + if (l > 0) { + if (compilingDisplayList.glbuffer == null) { + displayListsInitialized.put(compilingDisplayList.id, compilingDisplayList); + compilingDisplayList.glarray = _wglCreateVertexArray(); + compilingDisplayList.glbuffer = _wglCreateBuffer(); + FixedFunctionShader f = FixedFunctionShader.instance(compilingDisplayList.shaderMode); + _wglBindVertexArray0(compilingDisplayList.glarray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer); + f.setupArrayForProgram(); + } + _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer); + _wglBufferData(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + bytesUploaded += l; + } + } + } + + public static final void glColor3f(float p1, float p2, float p3) { + colorR = p1; + colorG = p2; + colorB = p3; + colorA = 1.0f; + } + + public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + /* + * int pp2 = 0; switch(p3) { default: case GL_RGBA: pp2 = _wGL_RGBA; break; case + * GL_BGRA: pp2 = _wGL_BGRA; break; } int pp3 = 0; switch(p7) { default: case + * GL_RGBA: pp3 = _wGL_RGBA; break; case GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining() * 4; + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glTexImage2D_2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + bytesUploaded += p9.remaining() * 4; + _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGB8, p4, p5, p6, _wGL_RGB, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + IntBuffer p9) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + /* + * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case + * GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining() * 4; + _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glDeleteTextures(int p1) { + _wglDeleteTextures(texObjects.free(p1)); + } + + public static final void glPolygonOffset(float p1, float p2) { + _wglPolygonOffset(p1, p2); + } + + public static final void glCallLists(IntBuffer p1) { + while (p1.hasRemaining()) { + glCallList(p1.get()); + } + } + + public static final void glEnableVertexAttrib(int p1) { + switch (p1) { + case GL_COLOR_ARRAY: + enableColorArray = true; + break; + case GL_NORMAL_ARRAY: + enableNormalArray = true; + break; + case GL_TEXTURE_COORD_ARRAY: + enableTex0Array = true; + break; + default: + break; + } + } + + public static final void glDisableVertexAttrib(int p1) { + switch (p1) { + case GL_COLOR_ARRAY: + enableColorArray = false; + break; + case GL_NORMAL_ARRAY: + enableNormalArray = false; + break; + case GL_TEXTURE_COORD_ARRAY: + enableTex0Array = false; + break; + default: + break; + } + } + + private static final int getShaderModeFlag0() { + int mode = 0; + mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0)); + mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0)); + mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0)); + return mode; + } + + private static final int getShaderModeFlag1() { + int mode = 0; + mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0)); + mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0)); + mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0)); + mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0)); + return mode; + } + + private static final int getShaderModeFlag() { + int mode = 0; + mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0)); + mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0)); + mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0)); + mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0)); + mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0)); + mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0)); + mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0)); + return mode; + } + + private static FixedFunctionShader shader = null; + + private static final void bindTheShader() { + bindTheShader(getShaderModeFlag()); + } + + private static final void bindTheShader(int mode) { + FixedFunctionShader s = shader = FixedFunctionShader.instance(mode); + s.useProgram(); + if (enableAlphaTest) { + s.setAlphaTest(alphaThresh); + } + s.setColor(colorR, colorG, colorB, colorA); + if (fogEnabled) { + s.setFogMode((fogPremultiply ? 2 : 0) + fogMode); + s.setFogColor(fogColorR, fogColorG, fogColorB, fogColorA); + s.setFogDensity(fogDensity); + s.setFogStartEnd(fogStart, fogEnd); + } + s.setModelMatrix(matModelV[matModelPointer]); + s.setProjectionMatrix(matProjV[matProjPointer]); + s.setTextureMatrix(matTexV[matTexPointer]); + if (enableColorMaterial && enableLighting) { + s.setNormal(normalX, normalY, normalZ); + s.setLightPositions(lightPos0vec, lightPos1vec); + } + s.setTex0Coords(tex0X, tex0Y); + } + + private static Object blankUploadArray = _wCreateLowLevelIntBuffer(525000); + + public static final void glDrawArrays(int p1, int p2, int p3, Object buffer) { + if (isCompilingDisplayList) { + if (p1 == GL_QUADS) { + if (compilingDisplayList.shaderMode == -1) { + compilingDisplayList.shaderMode = getShaderModeFlag0(); + } else { + if (compilingDisplayList.shaderMode != getShaderModeFlag0()) { + System.err.println("vertex format inconsistent in display list"); + } + } + compilingDisplayList.listLength += p3; + _wAppendLowLevelBuffer(buffer); + } else { + System.err.println("only GL_QUADS supported in a display list"); + } + } else { + bytesUploaded += _wArrayByteLength(buffer); + vertexDrawn += p3; + + bindTheShader(); + + _wglBindVertexArray0(shader.genericArray); + _wglBindBuffer(_wGL_ARRAY_BUFFER, shader.genericBuffer); + if (!shader.bufferIsInitialized) { + shader.bufferIsInitialized = true; + _wglBufferData(_wGL_ARRAY_BUFFER, blankUploadArray, _wGL_DYNAMIC_DRAW); + } + _wglBufferSubData(_wGL_ARRAY_BUFFER, 0, buffer); + + if (p1 == GL_QUADS) { + _wglDrawQuadArrays(p2, p3); + triangleDrawn += p3 / 2; + } else { + int drawMode = 0; + switch (p1) { + default: + case GL_TRIANGLES: + drawMode = _wGL_TRIANGLES; + triangleDrawn += p3 / 3; + break; + case GL_TRIANGLE_STRIP: + drawMode = _wGL_TRIANGLE_STRIP; + triangleDrawn += p3 - 2; + break; + case GL_TRIANGLE_FAN: + drawMode = _wGL_TRIANGLE_FAN; + triangleDrawn += p3 - 2; + break; + case GL_LINE_STRIP: + drawMode = _wGL_LINE_STRIP; + triangleDrawn += p3 - 1; + break; + case GL_LINES: + drawMode = _wGL_LINES; + triangleDrawn += p3 / 2; + break; + } + _wglDrawArrays(drawMode, p2, p3); + } + + shader.unuseProgram(); + + } + } + + private static final void _wglDrawQuadArrays(int p2, int p3) { + if (quadsToTrianglesBuffer == null) { + IntBuffer upload = isWebGL ? IntBuffer.wrap(new int[98400 / 2]) + : ByteBuffer.allocateDirect(98400 * 2).order(ByteOrder.nativeOrder()).asIntBuffer(); + for (int i = 0; i < 16384; ++i) { + int v1 = i * 4; + int v2 = i * 4 + 1; + int v3 = i * 4 + 2; + int v4 = i * 4 + 3; + upload.put(v1 | (v2 << 16)); + upload.put(v4 | (v2 << 16)); + upload.put(v3 | (v4 << 16)); + } + upload.flip(); + quadsToTrianglesBuffer = _wglCreateBuffer(); + _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer); + _wglBufferData0(_wGL_ELEMENT_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + } + if (!currentArray.isQuadBufferBound) { + currentArray.isQuadBufferBound = true; + _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer); + } + _wglDrawElements(_wGL_TRIANGLES, p3 * 6 / 4, _wGL_UNSIGNED_SHORT, p2 * 6 / 4); + } + + private static BufferArrayGL occlusion_vao = null; + private static BufferGL occlusion_vbo = null; + private static ProgramGL occlusion_program = null; + private static UniformGL occlusion_matrix_m = null; + private static UniformGL occlusion_matrix_p = null; + + private static final void initializeOcclusionObjects() { + occlusion_vao = _wglCreateVertexArray(); + occlusion_vbo = _wglCreateBuffer(); + + IntBuffer upload = (isWebGL ? IntBuffer.wrap(new int[108]) + : ByteBuffer.allocateDirect(108 << 2).order(ByteOrder.nativeOrder()).asIntBuffer()); + float[] verts = new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }; + for (int i = 0; i < verts.length; i++) { + upload.put(Float.floatToRawIntBits(verts[i])); + } + upload.flip(); + + _wglBindVertexArray(occlusion_vao); + _wglBindBuffer(_wGL_ARRAY_BUFFER, occlusion_vbo); + _wglBufferData0(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW); + _wglEnableVertexAttribArray(0); + _wglVertexAttribPointer(0, 3, _wGL_FLOAT, false, 12, 0); + + ShaderGL vert = _wglCreateShader(_wGL_VERTEX_SHADER); + ShaderGL frag = _wglCreateShader(_wGL_FRAGMENT_SHADER); + + String src = fileContents("/glsl/occl.glsl"); + _wglShaderSource(vert, _wgetShaderHeader() + "\n#define CC_VERT\n" + src); + _wglShaderSource(frag, _wgetShaderHeader() + "\n#define CC_FRAG\n" + src); + + _wglCompileShader(vert); + if (!_wglGetShaderCompiled(vert)) + System.err.println(("\n" + _wglGetShaderInfoLog(vert)).replace("\n", "\n[/glsl/occl.glsl][VERT] ") + "\n"); + + _wglCompileShader(frag); + if (!_wglGetShaderCompiled(frag)) + System.err.println(("\n" + _wglGetShaderInfoLog(frag)).replace("\n", "\n[/glsl/occl.glsl][FRAG] ") + "\n"); + + occlusion_program = _wglCreateProgram(); + + _wglAttachShader(occlusion_program, vert); + _wglAttachShader(occlusion_program, frag); + _wglLinkProgram(occlusion_program); + _wglDetachShader(occlusion_program, vert); + _wglDetachShader(occlusion_program, frag); + _wglDeleteShader(vert); + _wglDeleteShader(frag); + + if (!_wglGetProgramLinked(occlusion_program)) + System.err.println( + ("\n\n" + _wglGetProgramInfoLog(occlusion_program)).replace("\n", "\n[/glsl/occl.glsl][LINKER] ")); + + _wglUseProgram(occlusion_program); + occlusion_matrix_m = _wglGetUniformLocation(occlusion_program, "matrix_m"); + occlusion_matrix_p = _wglGetUniformLocation(occlusion_program, "matrix_p"); + + } + + private static final GLObjectMap queryObjs = new GLObjectMap(256); + + public static final int glCreateQuery() { + return queryObjs.register(_wglCreateQuery()); + } + + public static final void glBeginQuery(int obj) { + _wglBeginQuery(_wGL_ANY_SAMPLES_PASSED, queryObjs.get(obj)); + } + + public static final void glDeleteQuery(int obj) { + _wglDeleteQuery(queryObjs.free(obj)); + } + + private static final Matrix4f cachedOcclusionP = (Matrix4f) (new Matrix4f()).setZero(); + private static float[] occlusionModel = new float[16]; + private static float[] occlusionProj = new float[16]; + + public static final void glBindOcclusionBB() { + if (occlusion_vao == null) + initializeOcclusionObjects(); + _wglUseProgram(occlusion_program); + _wglBindVertexArray(occlusion_vao); + if (!cachedOcclusionP.equals(matProjV[matProjPointer])) { + cachedOcclusionP.load(matProjV[matProjPointer]); + cachedOcclusionP.store(occlusionProj); + _wglUniformMat4fv(occlusion_matrix_p, occlusionProj); + } + } + + public static final void glEndOcclusionBB() { + + } + + public static final void glDrawOcclusionBB(float posX, float posY, float posZ, float sizeX, float sizeY, + float sizeZ) { + glPushMatrix(); + glTranslatef(posX - sizeX * 0.01f, posY - sizeY * 0.01f, posZ - sizeZ * 0.01f); + glScalef(sizeX * 1.02f, sizeY * 1.02f, sizeZ * 1.02f); + matModelV[matModelPointer].store(occlusionModel); + _wglUniformMat4fv(occlusion_matrix_m, occlusionModel); + _wglDrawArrays(_wGL_TRIANGLES, 0, 36); + glPopMatrix(); + + } + + public static final void glEndQuery() { + _wglEndQuery(_wGL_ANY_SAMPLES_PASSED); + } + + public static final boolean glGetQueryResult(int obj) { + QueryGL q = queryObjs.get(obj); + return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT) > 0; + } + + public static final boolean glGetQueryResultAvailable(int obj) { + QueryGL q = queryObjs.get(obj); + return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT_AVAILABLE) > 0; + } + + public static final int glGenTextures() { + return texObjects.register(_wglGenTextures()); + } + + public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, + ByteBuffer p9) { + int pp1 = 0; + switch (p1) { + default: + case GL_TEXTURE_2D: + pp1 = _wGL_TEXTURE_2D; + break; + // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break; + } + /* + * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case + * GL_BGRA: pp3 = _wGL_BGRA; break; } + */ + bytesUploaded += p9.remaining(); + _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9); + } + + public static final void glFogi(int p1, int p2) { + if (p1 == GL_FOG_MODE) { + switch (p2) { + default: + case GL_LINEAR: + fogMode = 1; + break; + case GL_EXP: + fogMode = 2; + break; + } + } + } + + public static final void glFogf(int p1, float p2) { + switch (p1) { + case GL_FOG_START: + fogStart = p2; + break; + case GL_FOG_END: + fogEnd = p2; + break; + case GL_FOG_DENSITY: + fogDensity = p2; + break; + default: + break; + } + } + + public static final void glFog(int p1, FloatBuffer p2) { + if (p1 == GL_FOG_COLOR) { + fogColorR = p2.get(); + fogColorG = p2.get(); + fogColorB = p2.get(); + fogColorA = p2.get(); + } + } + + public static final void glDeleteLists(int p1, int p2) { + for (int i = 0; i < p2; i++) { + DisplayList d = displayListsInitialized.remove(p1 + i); + if (d != null) { + _wglDeleteVertexArray(d.glarray); + _wglDeleteBuffer(d.glbuffer); + } + displayLists.remove(p1 + i); + } + } + + public static final void glMultiTexCoord2f(int p1, float p2, float p3) { + tex0X = p2; + tex0Y = p3; + } + + private static Matrix4f unprojA = new Matrix4f(); + private static Matrix4f unprojB = new Matrix4f(); + private static Vector4f unprojC = new Vector4f(); + + public static final void gluUnProject(float p1, float p2, float p3, FloatBuffer p4, FloatBuffer p5, int[] p6, + FloatBuffer p7) { + unprojA.load(p4); + unprojB.load(p5); + Matrix4f.mul(unprojA, unprojB, unprojB); + unprojB.invert(); + unprojC.set(((p1 - (float) p6[0]) / (float) p6[2]) * 2f - 1f, ((p2 - (float) p6[1]) / (float) p6[3]) * 2f - 1f, + p3, 1.0f); + Matrix4f.transform(unprojB, unprojC, unprojC); + p7.put(unprojC.x / unprojC.w); + p7.put(unprojC.y / unprojC.w); + p7.put(unprojC.z / unprojC.w); + } + + public static final void gluPerspective(float fovy, float aspect, float zNear, float zFar) { + Matrix4f res = getMatrix(); + float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f); + res.m00 = cotangent / aspect; + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = cotangent; + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = (zFar + zNear) / (zFar - zNear); + res.m23 = -1.0f; + res.m30 = 0.0f; + res.m31 = 0.0f; + res.m32 = 2.0f * zFar * zNear / (zFar - zNear); + res.m33 = 0.0f; + } + + public static final void gluPerspectiveFlat(float fovy, float aspect, float zNear, float zFar) { + Matrix4f res = getMatrix(); + float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f); + res.m00 = cotangent / aspect; + res.m01 = 0.0f; + res.m02 = 0.0f; + res.m03 = 0.0f; + res.m10 = 0.0f; + res.m11 = cotangent; + res.m12 = 0.0f; + res.m13 = 0.0f; + res.m20 = 0.0f; + res.m21 = 0.0f; + res.m22 = ((zFar + zNear) / (zFar - zNear)) * 0.001f; + res.m23 = -1.0f; + res.m30 = 0.0f; + res.m31 = 0.0f; + res.m32 = 2.0f * zFar * zNear / (zFar - zNear); + res.m33 = 0.0f; + } + + public static final String gluErrorString(int p1) { + switch (p1) { + case GL_INVALID_ENUM: + return "GL_INVALID_ENUM"; + case GL_INVALID_VALUE: + return "GL_INVALID_VALUE"; + case GL_INVALID_OPERATION: + return "GL_INVALID_OPERATION"; + case GL_OUT_OF_MEMORY: + return "GL_OUT_OF_MEMORY"; + case GL_CONTEXT_LOST_WEBGL: + return "CONTEXT_LOST_WEBGL"; + default: + return "Unknown Error"; + } + } + + private static long lastBandwidthReset = 0l; + private static int lastBandwidth = 0; + + public static final int getBitsPerSecond() { + if (System.currentTimeMillis() - lastBandwidthReset > 1000) { + lastBandwidthReset = System.currentTimeMillis(); + lastBandwidth = bytesUploaded * 8; + bytesUploaded = 0; + } + return lastBandwidth; + } + + public static final int getVertexesPerSecond() { + int ret = vertexDrawn; + vertexDrawn = 0; + return ret; + } + + public static final int getTrianglesPerSecond() { + int ret = triangleDrawn; + triangleDrawn = 0; + return ret; + } + +} \ No newline at end of file diff --git a/src/teavm/java/util/IProgressUpdate.java b/src/teavm/java/util/IProgressUpdate.java new file mode 100644 index 0000000..4ca8572 --- /dev/null +++ b/src/teavm/java/util/IProgressUpdate.java @@ -0,0 +1,9 @@ +package util; + +public interface IProgressUpdate { + void displayProgressMessage(String var1); + + void displayLoadingString(String var1); + + void setLoadingProgress(int var1); +}