diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt index 6f3824991..1fc2b6d32 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt @@ -45,6 +45,8 @@ data class BlockState( val collisionShape: VoxelShape, val occlusionShape: VoxelShape, val outlineShape: VoxelShape, + val hardness: Float, + val requiresTool: Boolean, ) { override fun hashCode(): Int { @@ -116,7 +118,7 @@ data class BlockState( companion object { - fun deserialize(owner: Block, registries: Registries, data: JsonObject, models: Map): BlockState { + fun deserialize(block: Block, registries: Registries, data: JsonObject, models: Map): BlockState { val properties = data["properties"]?.asJsonObject?.let { getProperties(it) } ?: mutableMapOf() @@ -149,7 +151,7 @@ data class BlockState( } } - val tintColor: RGBColor? = data["tint_color"]?.asInt?.let { TintColorCalculator.getJsonColor(it) } ?: owner.tintColor + val tintColor: RGBColor? = data["tint_color"]?.asInt?.let { TintColorCalculator.getJsonColor(it) } ?: block.tintColor val material = registries.materialRegistry[ResourceLocation(data["material"].asString)]!! @@ -173,13 +175,13 @@ data class BlockState( val occlusionShape = data["occlusion_shapes"]?.asShape() ?: VoxelShape.EMPTY val outlineShape = data["outline_shape"]?.asShape() ?: VoxelShape.EMPTY - owner.renderOverride?.let { + block.renderOverride?.let { renderers.clear() renderers.addAll(it) } return BlockState( - block = owner, + block = block, properties = properties.toMap(), renderers = renderers, tintColor = tintColor, @@ -187,6 +189,8 @@ data class BlockState( collisionShape = collisionShape, occlusionShape = occlusionShape, outlineShape = outlineShape, + hardness = data["hardness"].asFloat, + requiresTool = data["requires_tool"]?.asBoolean ?: material.soft, ) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt index 01bdefe11..4ef4dccd7 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt @@ -38,7 +38,6 @@ open class Block( mappings: Registries, data: JsonObject, ) : RegistryItem { - open val hardness: Float = data["hardness"]?.asFloat ?: 0.0f open val explosionResistance: Float = data["explosion_resistance"]?.asFloat ?: 0.0f open val tintColor: RGBColor? = data["tint_color"]?.asInt?.let { TintColorCalculator.getJsonColor(it) } open val randomOffsetType: RandomOffsetTypes? = data["offset_type"]?.asString?.let { RandomOffsetTypes[it] } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/materials/Material.kt b/src/main/java/de/bixilon/minosoft/data/mappings/materials/Material.kt index cf1e5b8e4..06b4e4314 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/materials/Material.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/materials/Material.kt @@ -28,6 +28,7 @@ data class Material( val blockMotion: Boolean, val flammable: Boolean, val liquid: Boolean, + val soft: Boolean, val solidBlocking: Boolean, val replaceable: Boolean, val solid: Boolean, @@ -46,6 +47,7 @@ data class Material( blockMotion = data["blocks_motion"]?.asBoolean ?: false, flammable = data["flammable"]?.asBoolean ?: false, liquid = data["liquid"]?.asBoolean ?: false, + soft = data["is_soft"]?.asBoolean ?: false, solidBlocking = data["solid_blocking"]?.asBoolean ?: false, replaceable = data["replaceable"]?.asBoolean ?: false, solid = data["solid"]?.asBoolean ?: false, diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index 5e19d1640..bf6204347 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -64,9 +64,9 @@ class RenderWindow( val inputHandler = RenderWindowInputHandler(this) var windowId = 0L - private var deltaFrameTime = 0L + private var deltaFrameTime = 0.0 - private var lastFrame = 0L + private var lastFrame = 0.0 private val latch = CountUpAndDownLatch(1) private var renderingState = RenderingStates.RUNNING @@ -312,7 +312,7 @@ class RenderWindow( this.lastTickTimer = currentTickTime } - val currentFrame = System.currentTimeMillis() + val currentFrame = glfwGetTime() deltaFrameTime = currentFrame - lastFrame lastFrame = currentFrame diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt index 910ab1989..6dd547b9f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt @@ -33,7 +33,7 @@ class LeftClickHandler( private var breakPosition: Vec3i? = null private var breakBlockState: BlockState? = null - private var breakProgress: Float = -1.0f + private var breakProgress = -1.0 private var breakSelectedSlot: Int = -1 private var breakItemInHand: ItemStack? = null @@ -45,7 +45,7 @@ class LeftClickHandler( private fun clearDigging() { breakPosition = null breakBlockState = null - breakProgress = -1.0f + breakProgress = -1.0 breakSelectedSlot = -1 breakItemInHand = null @@ -58,7 +58,16 @@ class LeftClickHandler( } } - private fun checkBreaking(isKeyDown: Boolean, deltaTime: Long): Boolean { + private fun swingArm() { + val currentTime = System.currentTimeMillis() + if (currentTime - lastSwing <= ProtocolDefinition.TICK_TIME) { + return + } + lastSwing = currentTime + connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND)) + } + + private fun checkBreaking(isKeyDown: Boolean, deltaTime: Double): Boolean { val currentTime = System.currentTimeMillis() if (!isKeyDown) { @@ -97,7 +106,7 @@ class LeftClickHandler( breakPosition = raycastHit.blockPosition breakBlockState = raycastHit.blockState - breakProgress = 0.0f + breakProgress = 0.0 breakSelectedSlot = connection.player.selectedHotbarSlot breakItemInHand = connection.player.inventory.getHotbarSlot() @@ -109,29 +118,62 @@ class LeftClickHandler( connection.world.setBlockState(raycastHit.blockPosition, null) } - if (currentTime - breakSent <= ProtocolDefinition.TICK_TIME) { - return true - } - breakSent = currentTime + val canStartBreaking = currentTime - breakSent >= ProtocolDefinition.TICK_TIME + val canInstantBreak = connection.player.baseAbilities.canInstantBreak || connection.player.entity.gamemode == Gamemodes.CREATIVE if (canInstantBreak) { + if (!canStartBreaking) { + return true + } // creative if (currentTime - creativeLastHoldBreakTime <= ProtocolDefinition.TICK_TIME * 5) { return true } - connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND)) + swingArm() startDigging() finishDigging() creativeLastHoldBreakTime = currentTime + breakSent = currentTime return true } - startDigging() - connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND)) + if (breakPosition == null && !canStartBreaking) { + return true + } - breakProgress += 0.05f + breakSent = currentTime + + startDigging() + + swingArm() + + + var speedMultiplier = 1.0f + + var damage = speedMultiplier / raycastHit.blockState.hardness + + damage /= if (raycastHit.blockState.requiresTool) { + 100 + } else { + 30 + } + + when { + damage > 1.0f -> { + breakProgress = 1.0 + } + damage <= 0.0f -> { + breakProgress = 0.0 + } + else -> { + val ticks = 1.0f / damage + val seconds = (ticks / ProtocolDefinition.TICKS_PER_SECOND) + val progress = ((1.0f / seconds) * deltaTime) + breakProgress += progress + } + } if (breakProgress >= 1.0f) { finishDigging() @@ -143,8 +185,7 @@ class LeftClickHandler( renderWindow.inputHandler.registerCheckCallback(KeyBindingsNames.DESTROY_BLOCK) } - fun draw(deltaTime: Long) { - val currentTime = System.currentTimeMillis() + fun draw(deltaTime: Double) { val isKeyDown = renderWindow.inputHandler.isKeyBindingDown(KeyBindingsNames.DESTROY_BLOCK) // ToDo: Entity attacking val consumed = checkBreaking(isKeyDown, deltaTime) @@ -155,10 +196,6 @@ class LeftClickHandler( if (consumed) { return } - if (currentTime - lastSwing <= ProtocolDefinition.TICK_TIME) { - return - } - connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND)) - lastSwing = currentTime + swingArm() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/RightClickHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/RightClickHandler.kt index 3fe987747..a1bb7ed61 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/RightClickHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/RightClickHandler.kt @@ -117,7 +117,7 @@ class RightClickHandler( } - fun draw(deltaTime: Long) { + fun draw(deltaTime: Double) { // ToDo: Entity interaction, shield/sword blocking, etc checkInteraction(renderWindow.inputHandler.isKeyBindingDown(KeyBindingsNames.BLOCK_INTERACT)) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt index f36330cf7..af7b653db 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt @@ -211,7 +211,7 @@ class Camera( sendPositionToServer() } - fun draw(deltaTime: Long) { + fun draw(deltaTime: Double) { if (!currentPositionSent || !currentRotationSent) { recalculateViewProjectionMatrix() sendPositionToServer() @@ -224,7 +224,7 @@ class Camera( flyingSpeed } else { walkingSpeed - } * (deltaTime / 1000.0) + } * deltaTime val movementFront = Vec3(cameraFront) if (!Minosoft.getConfig().config.game.camera.noCipMovement) { movementFront.y = 0.0f diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt index 6fc8bdafa..03cecedeb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt @@ -276,7 +276,7 @@ class RenderWindowInputHandler( return false } - fun draw(delta: Long) { + fun draw(delta: Double) { camera.draw(delta) leftClickHandler.draw(delta) rightClickHandler.draw(delta) diff --git a/src/main/resources/assets/minosoft/mapping/pixlyzer_index.json b/src/main/resources/assets/minosoft/mapping/pixlyzer_index.json index ea6984d4d..c55c8de34 100644 --- a/src/main/resources/assets/minosoft/mapping/pixlyzer_index.json +++ b/src/main/resources/assets/minosoft/mapping/pixlyzer_index.json @@ -1 +1 @@ -{"21w14a":"ea77d7e2d8f756e7387e9d3917903fee45de7c00","21w13a":"35c5fa0f63bdc7ac0375a7b226dc753d2b3067dc","21w11a":"fd8d2dc202764146d6cc2ef39d1b9ee7688bec2c","21w10a":"d809659ea7f63049199e24398d6e0487f074f99e","21w08b":"19ce618be42ff7c6b7f61b7e1617efab551370da","21w08a":"5d30cfd99a2ac5da7f6fe92f57812cf2d0f7e1db","21w07a":"c6610fd2a210dfa7a9dd7f0c5d0961b8780305a2","21w06a":"d9d472fbb271c099b84baa1cd9b94656aba2cbeb","21w05b":"abd8a7bda90c1f30f0c732059d10d28ea3494ff7","21w05a":"4c87ae49f045801c77d65642a539af3fca14948e","21w03a":"f1c94c05f9afdbd71e90d5ab7f7759550b7759ed","1.16.5":"70fe6958afa4950442034b42469fdf94bb27441f","20w51a":"9ebbb00b410bd0ea350262dec47b1382f5b36f29","20w49a":"740b6536746dd90c25cce355560001cc805807cc","20w48a":"7cf6a612a8d7faf786b68ee4a912a3c6a16ef08c","20w46a":"2c8349e4e7dca3112e2e346651b16fc299ed89de","20w45a":"54afca6f479cbad563042c8c149d125b7917d509","1.16.2-pre3":"a12d5287fab7738de16a64be945d3094f10feb62","1.16.2-pre2":"7d0213a8868b72125d08832eeaaf3706484da529","1.16.2-pre1":"fe02fc6087f4790c204198813b74a36ce7f2ee1c","20w30a":"0c52afc1aa3ca8c20ea5da0151bd6992e3ed276f","20w29a":"0682465f4e807698c0ddfc9330d1887043d7aeee","20w28a":"9ce5a9f732227dda84ffc7232f579fac2d813046","20w27a":"cbc6bcf5c7128b66f8a3bc771424aa55e86e5cb7","1.16.1":"09f025bd815b94d8f582276f4019df045a3bd435","1.16":"40c08f94e03d1a094ca89bf515114d726bd8bac9","1.16-rc1":"4b0b44cc7cfcc88d827f68569029049f9ebd646f","1.16-pre8":"d36c0128c8e3fa639b258e425541072c0fefbce3","1.16-pre7":"0733ec035af7de42302f14c1b229831a662a69d9","1.16-pre6":"cef6f71759d0ec03603a5221ff76328af37b31c5","1.16-pre5":"183c9ffb81a1f9a21d997bd5a31baebe46c22e7a","1.16-pre4":"fceb8d9b8dbd3ad3259b13329625b83b82060731","1.16-pre3":"73dc1f89a4f245e3bb556bc61bd03c49ec138a57","1.16-pre2":"789476118c53d05a313baba662898f3631ced920","1.16-pre1":"718a5e3b7ad99dab73d202ae8934d7e8fed31adf","20w22a":"d0f02ef8dca5c46cd80259529b1c754e7d58f15f","20w21a":"de6d7d1a2f0b597f92494470c3f6c48c0be61ab9","20w20b":"dba1c32c3e750b34237e6af9602603514243add0","20w20a":"925d97824265dc900a057d178e4b315f42b47b52","20w19a":"c177aeb546be092d2b38f86d9b8a823b803f331d","20w18a":"cbf9e3b24e27e13a2d65224ca18fff148240ed00","20w17a":"5b2f63548a69ba8181703cbcd8464bca5012ffd6","20w16a":"95108738d0855a171af02fb8d2c487c58823712f","20w15a":"cdfa592431d0d7393b88b4d2bed94c1a7c68e402","20w14a":"0ffb470a674dce7403d9548dd9adbf98ab3c2772","20w14infinite":"59131c99e2aaae8f8516256cd6b2bcf2b4f21b05","20w13b":"c34e2246487c251e0b3d7e68bbbd07dab7de6926","20w13a":"256c4663e2ebae3e664d8107d245e52e96cb46b6","20w12a":"fd049756e5306790e07d67c07efbebad247ffe4e","20w11a":"5a0a83c48fef32f8df58432eeb8c4ceedef1793d","20w10a":"0256d650ab6c193964b6c7f355e513b509696f2e","20w09a":"bf08b0aff59bf2ba58c26e4dcf83713956e93253","20w08a":"7916ea583b4fb6d01106db45b50b854224ebcbd3","20w07a":"fb95d8a4a04ce7a6af393783b9a5facf33cab66f","20w06a":"c422b4d5a2c328bc871a03c0460555a684643051","1.16.5-rc1":"1312757ac610cde170824e0d2f9bfe836f46c17b","1.16.4":"c6a254c6d4efe34cb6ef58fecc2e3b3e1406379d","1.16.4-rc1":"9fdedc82fe16e3f1aac903bf8fa17a9209877930","1.16.4-pre2":"228e911f7f63da9e88c19bceafafed95a6dc82f3","1.16.4-pre1":"1b265a34dd4a14e4c5cb4856e30392a3d25c927c","1.16.3":"885a2879c88a70db36b762e0afe6486dd269650a","1.16.3-rc1":"da50b481d36a3c3f4d1690cd26000b9500de9cd4","1.16.2":"f6a149c52f073f738108f4674db63900a8ae1c84","1.16.2-rc2":"4eca6500f6e188837f4fc95d98a672253ff9e1e2","1.16.2-rc1":"7ef3bea391926374c80e29c187054a83cb904de4","1.15.2":"06d58a4391b0cb71180e6d696d71514e952e90e8","1.15.2-pre2":"23b4f40136f9ad669904f6a4c4b821efd30e4475","1.15.2-pre1":"2df679b6a48a2523b60d36f5a7a728c7b981eeb6","1.15.1":"1fd7f715ae94400ba46e399ae3612984e6db2ca7","1.15.1-pre1":"36e6670980fe17c66740429e96932f2959fdc95f","1.15":"a49b4d579a71adeaa9752014703b0bd2315af29a","1.15-pre7":"637c8d94760328cd366580a3586ed1b0a37c5ad9","1.15-pre6":"0332fb040e476cf9f84ac03c00fab68ad0175333","1.15-pre5":"07f997d9d9818c59141bd6c5e79c60f05512bb7b","1.15-pre4":"b0597069bfc210f8563230cfd4ce86c1173a602a","1.15-pre3":"d8eb262f4729682ee934a561d98030f3677858e8","1.15-pre2":"eb3b8d9a039a75a4f7399ab7d278222c750d0053","1.15-pre1":"1484a02cb7e24296cd39bcd55b028214c4cce915","19w46b":"69891c202b0ce368be3ed7a53b0c5090726b773e","19w46a":"99a8e36e643311b3dcb7d9be610d592da4d644aa","19w45b":"a988ba600404b51ae2e39f483264cc00dd78a71a","19w45a":"a111f84e9ff295e294befd221c8df88c1f6e9866","19w44a":"68306c8c062ad03b463fd28e5fe9a86701482935","19w42a":"ee331c7b22c02ce46e36196ed65bb02b297bcdec","19w41a":"408d1391dbbe5bd2ee35bc4d740f1650c7f05dcd","19w40a":"9684079f941dd82f1f82123fcdd4672cc454d7d3","19w39a":"b811604cf6e43519016292bc30f902d372961576","19w38b":"42f756a93f0522a9c893f036c3de078461cf5701","19w38a":"4693891cff2c8d76661a62cf71cd68841643d7b0","19w37a":"8dbbb3548ce39678bf7059961ce2010563a9b680","19w36a":"28d53d8d7da4ca8d5a7b852362283e5e3bc284c1","19w35a":"7719d28931592ab90c70f89a4e3d2d261b092349","19w34a":"a394a85300f6257346583ec8750f952a8dea89a4","1.14.4":"7ef6e68f70fae75fb90141583a5e51ba7b01d2a6","1.14.4-pre7":"210e5284ad1cb1242e90db9648c099fe96276a89","1.14.4-pre6":"0c57ddb54cd544a59b8587b23d027a0752d07916","1.14.4-pre5":"bae283fa6982fcda53e220e2ae53c24f18875043","1.14.4-pre4":"fabc63854536728294d09e56a1beece72fb16771","1.14.4-pre3":"2195ae6a3ad8d6279ca4648c481d480c46c1e9fc","1.14.4-pre2":"d20214fb2ac3e018e1a074063bb0c7c684bdf162","1.14.4-pre1":"81237a0354f97c397331fca74aef8631ce0cca33","1.14.3":"c260bc3009ba42bac5133c175c08d9417e620fb7","1.14.3-pre4":"a79220b67d7758f639945d80d001f8b0135ce65d","1.14.3-pre3":"62ef8dd85c438b04db73e953523c4492ebafbfa1","1.14.3-pre2":"8bedd60b99657e0e5cf83b8e1594788c6055b877","1.14.3-pre1":"bcde219f5c3a8f2d616e6577e07793ffb296bd6b","1.14.2":"58266ec4294c63276c7f628c2f41fef6a10c95cb","1.14.2 Pre-Release 4":"ba4891c3126023af3807d7624a7f069e3247eb0c","1.14.2 Pre-Release 3":"13dd1a14b589abb6eeb1a58b1c208109dae1600f","1.14.2 Pre-Release 2":"54f04ec460dfbdb0b543b6afab4a29c76702261f","1.14.2 Pre-Release 1":"71354888138db50749a2fdb4512c3055daf3f858","1.14.1":"6eb3209ee41c3a3fab6a3834e150972b39992a5f","1.14.1 Pre-Release 2":"f621a5bc8d428b5b9140c9a6ab54ca6ca6772389","1.14.1 Pre-Release 1":"bba13cecb85753c66c38e477f6fd47b43e9b5194","1.14":"6ced213dab0f59fc8629d8c5e658373eb9cf5d0c","1.14 Pre-Release 5":"5317a95d449a6258993e652f2602436cee4d3796","1.14 Pre-Release 4":"8dfcb0d985e4fd7162655c8e0eb7731032ac2bf3","1.14 Pre-Release 3":"fea442b33b2f4815272824905f65611477464c5e","1.14 Pre-Release 2":"1953e5b3944c1a8cea3618abbca0c7879398a0cd","1.14 Pre-Release 1":"488264eba3556b8549c0241fc19bc986c864f34f","19w14b":"cce33de8de23a089d3d7d07426ba14cf843cca05","19w14a":"e16b97684c811097a074012f7f22f154adb78f46","3D Shareware v1.34":"9871622b5cf87e2b658a2a4bd0ae403ab663fddc","19w13b":"de7b1e6ebda633d813fd6c7e0a54f409b95fd0c9","19w13a":"c9c8d67c181bfb9eb26a78f11237780c3eaf410e","19w12b":"ca8b33890db962d9b1806ab427aeff7e30e32305","19w12a":"7df41ec7abb67a86a9fbf3fb1aceb20d3a4fae39","19w11b":"054bc37ae4daa7d1361aaf77e321f2044678cc1b","19w11a":"cafef567ac2bcdbf2f2df48cd7e624f224ab10dc","21w15a":"061664284e6c10e117d432e10f5ba9edd704fd72","17w46a":"153dff89ed90f91758f847907cd4d48d3b553a3f","21w16a":"cb0f3ca6acbb1ccf96221fb55f18221ca4e22d6c","21w17a":"5a2ddb1e48337cb294d87b2e928e6420af40bada","21w18a":"760568746540eea28e21abb2611fc6a7aafe1e2d","21w19a":"88dd68eafe31c006a896a969ee1fa1bb62470a34","21w20a":"1c904b0387c072b0efbf31d0d8c8df3507479fc0"} +{"21w14a":"ea77d7e2d8f756e7387e9d3917903fee45de7c00","21w13a":"35c5fa0f63bdc7ac0375a7b226dc753d2b3067dc","21w11a":"fd8d2dc202764146d6cc2ef39d1b9ee7688bec2c","21w10a":"d809659ea7f63049199e24398d6e0487f074f99e","21w08b":"19ce618be42ff7c6b7f61b7e1617efab551370da","21w08a":"5d30cfd99a2ac5da7f6fe92f57812cf2d0f7e1db","21w07a":"c6610fd2a210dfa7a9dd7f0c5d0961b8780305a2","21w06a":"d9d472fbb271c099b84baa1cd9b94656aba2cbeb","21w05b":"abd8a7bda90c1f30f0c732059d10d28ea3494ff7","21w05a":"4c87ae49f045801c77d65642a539af3fca14948e","21w03a":"f1c94c05f9afdbd71e90d5ab7f7759550b7759ed","1.16.5":"24caee723f16b688780562d2cc39685c3c6901f7","20w51a":"9ebbb00b410bd0ea350262dec47b1382f5b36f29","20w49a":"740b6536746dd90c25cce355560001cc805807cc","20w48a":"7cf6a612a8d7faf786b68ee4a912a3c6a16ef08c","20w46a":"2c8349e4e7dca3112e2e346651b16fc299ed89de","20w45a":"54afca6f479cbad563042c8c149d125b7917d509","1.16.2-pre3":"a12d5287fab7738de16a64be945d3094f10feb62","1.16.2-pre2":"7d0213a8868b72125d08832eeaaf3706484da529","1.16.2-pre1":"fe02fc6087f4790c204198813b74a36ce7f2ee1c","20w30a":"0c52afc1aa3ca8c20ea5da0151bd6992e3ed276f","20w29a":"0682465f4e807698c0ddfc9330d1887043d7aeee","20w28a":"9ce5a9f732227dda84ffc7232f579fac2d813046","20w27a":"cbc6bcf5c7128b66f8a3bc771424aa55e86e5cb7","1.16.1":"09f025bd815b94d8f582276f4019df045a3bd435","1.16":"40c08f94e03d1a094ca89bf515114d726bd8bac9","1.16-rc1":"4b0b44cc7cfcc88d827f68569029049f9ebd646f","1.16-pre8":"d36c0128c8e3fa639b258e425541072c0fefbce3","1.16-pre7":"0733ec035af7de42302f14c1b229831a662a69d9","1.16-pre6":"cef6f71759d0ec03603a5221ff76328af37b31c5","1.16-pre5":"183c9ffb81a1f9a21d997bd5a31baebe46c22e7a","1.16-pre4":"fceb8d9b8dbd3ad3259b13329625b83b82060731","1.16-pre3":"73dc1f89a4f245e3bb556bc61bd03c49ec138a57","1.16-pre2":"789476118c53d05a313baba662898f3631ced920","1.16-pre1":"718a5e3b7ad99dab73d202ae8934d7e8fed31adf","20w22a":"d0f02ef8dca5c46cd80259529b1c754e7d58f15f","20w21a":"de6d7d1a2f0b597f92494470c3f6c48c0be61ab9","20w20b":"dba1c32c3e750b34237e6af9602603514243add0","20w20a":"925d97824265dc900a057d178e4b315f42b47b52","20w19a":"c177aeb546be092d2b38f86d9b8a823b803f331d","20w18a":"cbf9e3b24e27e13a2d65224ca18fff148240ed00","20w17a":"5b2f63548a69ba8181703cbcd8464bca5012ffd6","20w16a":"95108738d0855a171af02fb8d2c487c58823712f","20w15a":"cdfa592431d0d7393b88b4d2bed94c1a7c68e402","20w14a":"0ffb470a674dce7403d9548dd9adbf98ab3c2772","20w14infinite":"59131c99e2aaae8f8516256cd6b2bcf2b4f21b05","20w13b":"c34e2246487c251e0b3d7e68bbbd07dab7de6926","20w13a":"256c4663e2ebae3e664d8107d245e52e96cb46b6","20w12a":"fd049756e5306790e07d67c07efbebad247ffe4e","20w11a":"5a0a83c48fef32f8df58432eeb8c4ceedef1793d","20w10a":"0256d650ab6c193964b6c7f355e513b509696f2e","20w09a":"bf08b0aff59bf2ba58c26e4dcf83713956e93253","20w08a":"7916ea583b4fb6d01106db45b50b854224ebcbd3","20w07a":"fb95d8a4a04ce7a6af393783b9a5facf33cab66f","20w06a":"c422b4d5a2c328bc871a03c0460555a684643051","1.16.5-rc1":"1312757ac610cde170824e0d2f9bfe836f46c17b","1.16.4":"c6a254c6d4efe34cb6ef58fecc2e3b3e1406379d","1.16.4-rc1":"9fdedc82fe16e3f1aac903bf8fa17a9209877930","1.16.4-pre2":"228e911f7f63da9e88c19bceafafed95a6dc82f3","1.16.4-pre1":"1b265a34dd4a14e4c5cb4856e30392a3d25c927c","1.16.3":"885a2879c88a70db36b762e0afe6486dd269650a","1.16.3-rc1":"da50b481d36a3c3f4d1690cd26000b9500de9cd4","1.16.2":"f6a149c52f073f738108f4674db63900a8ae1c84","1.16.2-rc2":"4eca6500f6e188837f4fc95d98a672253ff9e1e2","1.16.2-rc1":"7ef3bea391926374c80e29c187054a83cb904de4","1.15.2":"7eed32004f491ad0da21ff1898998682ec4fa2a0","1.15.2-pre2":"23b4f40136f9ad669904f6a4c4b821efd30e4475","1.15.2-pre1":"2df679b6a48a2523b60d36f5a7a728c7b981eeb6","1.15.1":"1fd7f715ae94400ba46e399ae3612984e6db2ca7","1.15.1-pre1":"36e6670980fe17c66740429e96932f2959fdc95f","1.15":"a49b4d579a71adeaa9752014703b0bd2315af29a","1.15-pre7":"637c8d94760328cd366580a3586ed1b0a37c5ad9","1.15-pre6":"0332fb040e476cf9f84ac03c00fab68ad0175333","1.15-pre5":"07f997d9d9818c59141bd6c5e79c60f05512bb7b","1.15-pre4":"b0597069bfc210f8563230cfd4ce86c1173a602a","1.15-pre3":"d8eb262f4729682ee934a561d98030f3677858e8","1.15-pre2":"eb3b8d9a039a75a4f7399ab7d278222c750d0053","1.15-pre1":"1484a02cb7e24296cd39bcd55b028214c4cce915","19w46b":"69891c202b0ce368be3ed7a53b0c5090726b773e","19w46a":"99a8e36e643311b3dcb7d9be610d592da4d644aa","19w45b":"a988ba600404b51ae2e39f483264cc00dd78a71a","19w45a":"a111f84e9ff295e294befd221c8df88c1f6e9866","19w44a":"68306c8c062ad03b463fd28e5fe9a86701482935","19w42a":"ee331c7b22c02ce46e36196ed65bb02b297bcdec","19w41a":"408d1391dbbe5bd2ee35bc4d740f1650c7f05dcd","19w40a":"9684079f941dd82f1f82123fcdd4672cc454d7d3","19w39a":"b811604cf6e43519016292bc30f902d372961576","19w38b":"42f756a93f0522a9c893f036c3de078461cf5701","19w38a":"4693891cff2c8d76661a62cf71cd68841643d7b0","19w37a":"8dbbb3548ce39678bf7059961ce2010563a9b680","19w36a":"28d53d8d7da4ca8d5a7b852362283e5e3bc284c1","19w35a":"7719d28931592ab90c70f89a4e3d2d261b092349","19w34a":"a394a85300f6257346583ec8750f952a8dea89a4","1.14.4":"8f29d1044304b9e338ff5555e3fbc24aa651ac16","1.14.4-pre7":"210e5284ad1cb1242e90db9648c099fe96276a89","1.14.4-pre6":"0c57ddb54cd544a59b8587b23d027a0752d07916","1.14.4-pre5":"bae283fa6982fcda53e220e2ae53c24f18875043","1.14.4-pre4":"fabc63854536728294d09e56a1beece72fb16771","1.14.4-pre3":"2195ae6a3ad8d6279ca4648c481d480c46c1e9fc","1.14.4-pre2":"d20214fb2ac3e018e1a074063bb0c7c684bdf162","1.14.4-pre1":"81237a0354f97c397331fca74aef8631ce0cca33","1.14.3":"c260bc3009ba42bac5133c175c08d9417e620fb7","1.14.3-pre4":"a79220b67d7758f639945d80d001f8b0135ce65d","1.14.3-pre3":"62ef8dd85c438b04db73e953523c4492ebafbfa1","1.14.3-pre2":"8bedd60b99657e0e5cf83b8e1594788c6055b877","1.14.3-pre1":"bcde219f5c3a8f2d616e6577e07793ffb296bd6b","1.14.2":"58266ec4294c63276c7f628c2f41fef6a10c95cb","1.14.2 Pre-Release 4":"ba4891c3126023af3807d7624a7f069e3247eb0c","1.14.2 Pre-Release 3":"13dd1a14b589abb6eeb1a58b1c208109dae1600f","1.14.2 Pre-Release 2":"54f04ec460dfbdb0b543b6afab4a29c76702261f","1.14.2 Pre-Release 1":"71354888138db50749a2fdb4512c3055daf3f858","1.14.1":"6eb3209ee41c3a3fab6a3834e150972b39992a5f","1.14.1 Pre-Release 2":"f621a5bc8d428b5b9140c9a6ab54ca6ca6772389","1.14.1 Pre-Release 1":"bba13cecb85753c66c38e477f6fd47b43e9b5194","1.14":"6ced213dab0f59fc8629d8c5e658373eb9cf5d0c","1.14 Pre-Release 5":"5317a95d449a6258993e652f2602436cee4d3796","1.14 Pre-Release 4":"8dfcb0d985e4fd7162655c8e0eb7731032ac2bf3","1.14 Pre-Release 3":"fea442b33b2f4815272824905f65611477464c5e","1.14 Pre-Release 2":"1953e5b3944c1a8cea3618abbca0c7879398a0cd","1.14 Pre-Release 1":"488264eba3556b8549c0241fc19bc986c864f34f","19w14b":"cce33de8de23a089d3d7d07426ba14cf843cca05","19w14a":"e16b97684c811097a074012f7f22f154adb78f46","3D Shareware v1.34":"9871622b5cf87e2b658a2a4bd0ae403ab663fddc","19w13b":"de7b1e6ebda633d813fd6c7e0a54f409b95fd0c9","19w13a":"c9c8d67c181bfb9eb26a78f11237780c3eaf410e","19w12b":"ca8b33890db962d9b1806ab427aeff7e30e32305","19w12a":"7df41ec7abb67a86a9fbf3fb1aceb20d3a4fae39","19w11b":"054bc37ae4daa7d1361aaf77e321f2044678cc1b","19w11a":"cafef567ac2bcdbf2f2df48cd7e624f224ab10dc","21w15a":"061664284e6c10e117d432e10f5ba9edd704fd72","17w46a":"153dff89ed90f91758f847907cd4d48d3b553a3f","21w16a":"cb0f3ca6acbb1ccf96221fb55f18221ca4e22d6c","21w17a":"5a2ddb1e48337cb294d87b2e928e6420af40bada","21w18a":"760568746540eea28e21abb2611fc6a7aafe1e2d","21w19a":"88dd68eafe31c006a896a969ee1fa1bb62470a34","21w20a":"7387b2eb3f471495fef07d43d5f8d96e3de982ae"}