local function __RunMinecraftClient() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local GuiService = game:GetService("GuiService") local ContextActionService = game:GetService("ContextActionService") local Lighting = game:GetService("Lighting") local lp = Players.LocalPlayer local camera = workspace.CurrentCamera while not camera do workspace:GetPropertyChangedSignal("CurrentCamera"):Wait() camera = workspace.CurrentCamera end local playerGui = lp:WaitForChild("PlayerGui") local oldCameraMode = lp.CameraMode local oldCameraMinZoom = lp.CameraMinZoomDistance local oldCameraMaxZoom = lp.CameraMaxZoomDistance local F = {} -- namespaces helper functions to stay within Luau local-register limits if shared.__MCSteveStop then pcall(shared.__MCSteveStop) end local conns = {} F.track = function(c) conns[#conns + 1] = c return c end local BLOCK = 2.75 local PX = BLOCK / 16 local TICK = 1 / 20 -- Build/Features : Steve model/animations, catalog, inventory/crafting, manual block -- placement/breaking, and the original player-mechanics movement/camera behavior (recreated). -- No initial world blocks are generated. Creative HUD omits hearts, hunger, and the XP bar. local WALK_BLOCKS_PER_SECOND = 4.317 local SPRINT_BLOCKS_PER_SECOND = 5.612 local SNEAK_BLOCKS_PER_SECOND = 1.295 local FLY_BLOCKS_PER_SECOND = 10.92 local FLY_SPRINT_BLOCKS_PER_SECOND = 21.6 local GROUND_SLIPPERINESS = 0.6 local BODY_MOVE_TURN_RESPONSE = 16.0 local BODY_TURN_RESPONSE = 8.5 local BODY_TURN_DEADZONE = math.rad(3) local MAX_HEAD_YAW = math.rad(38) local IMG = { inventory = {w=176,h=166,d="2:-;171:000000;4:-;1:000000;171:ffffff;1:000000;2:-;1:000000;172:ffffff;1:c6c6c6;1:000000;1:-;1:000000;3:ffffff;169:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;50:373737;1:8b8b8b;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;20:c6c6c6;17:373737;1:8b8b8b;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;20:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;1:8b8b8b;8:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;2:8b8b8b;7:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;3:8b8b8b;6:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;4:8b8b8b;5:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;5:8b8b8b;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;2:c6c6c6;15:8b8b8b;3:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;2:c6c6c6;16:8b8b8b;2:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;15:8b8b8b;3:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;5:8b8b8b;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;4:8b8b8b;5:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;3:8b8b8b;6:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;2:8b8b8b;7:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;11:c6c6c6;1:8b8b8b;8:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;20:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;20:c6c6c6;1:373737;16:8b8b8b;1:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;20:c6c6c6;1:8b8b8b;17:ffffff;2:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;21:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;40:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:373737;49:000000;1:ffffff;97:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;1:373737;49:000000;1:ffffff;17:373737;1:8b8b8b;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;49:000000;1:ffffff;1:373737;16:8b8b8b;1:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;50:ffffff;1:8b8b8b;17:ffffff;79:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;17:373737;1:8b8b8b;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;1:373737;16:8b8b8b;1:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;4:c6c6c6;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;1:8b8b8b;17:ffffff;4:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;170:c6c6c6;2:555555;2:000000;2:ffffff;169:c6c6c6;3:555555;1:000000;1:-;1:000000;1:c6c6c6;172:555555;1:000000;2:-;1:000000;171:555555;1:000000;4:-;171:000000;2:-"}, hotbar = {w=182,h=22,d="183:000000;2:cecece;2:ababab;2:939393;1:ababab;172:939393;1:6d6d6d;2:000000;1:ababab;3:5d5d5d;1:676767;2:5d5d5d;1:626262;1:5a5a5a;1:5d5d5d;1:5a5a5a;1:5d5d5d;1:5a5a5a;1:5d5d5d;1:676767;1:626262;1:5a5a5a;1:5d5d5d;1:707070;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:5a5a5a;3:5d5d5d;1:666666;2:5d5d5d;1:5a5a5a;1:5d5d5d;1:606060;3:5d5d5d;1:6b6b6b;2:5d5d5d;1:777777;1:626262;1:7e7e7e;2:5d5d5d;1:626262;1:5d5d5d;1:666666;2:626262;1:5d5d5d;1:626262;1:676767;1:606060;1:5d5d5d;1:626262;4:5d5d5d;1:707070;1:5d5d5d;1:7e7e7e;3:5d5d5d;1:5a5a5a;4:5d5d5d;1:606060;3:5d5d5d;1:565656;1:5d5d5d;1:626262;2:5d5d5d;1:707070;1:5d5d5d;1:808080;1:5a5a5a;1:5d5d5d;1:5a5a5a;3:5d5d5d;1:6b6b6b;1:5a5a5a;3:5d5d5d;1:5a5a5a;3:5d5d5d;1:626262;1:5d5d5d;1:707070;1:5d5d5d;1:7e7e7e;3:5d5d5d;1:606060;2:5d5d5d;1:707070;4:5d5d5d;1:5a5a5a;5:5d5d5d;1:676767;1:666666;1:7c7c7c;1:5a5a5a;5:5d5d5d;1:5a5a5a;1:5d5d5d;1:626262;8:5d5d5d;1:707070;1:5d5d5d;1:7e7e7e;5:5d5d5d;1:5a5a5a;5:5d5d5d;1:666666;1:5d5d5d;1:626262;1:5d5d5d;1:5a5a5a;1:606060;1:666666;1:5d5d5d;1:7a7a7a;1:666666;5:5d5d5d;1:606060;2:676767;3:5d5d5d;1:626262;4:5d5d5d;1:707070;1:474747;2:000000;1:ababab;1:666666;8:040404;1:0b0b04;1:040404;1:080904;5:040404;1:737373;1:606060;1:7e7e7e;1:5a5a5a;1:040404;1:0d0e04;11:040404;1:080904;1:040404;1:060604;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:060604;2:040404;1:080904;3:040404;1:060604;2:040404;1:080904;1:060604;2:040404;1:060604;1:7e7e7e;1:676767;1:7e7e7e;1:5d5d5d;7:040404;1:060604;8:040404;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:626262;7:040404;1:0f1004;1:060604;6:040404;1:060604;1:7e7e7e;1:6b6b6b;1:7e7e7e;1:5d5d5d;1:040404;1:060604;2:040404;1:060604;1:0f1004;5:040404;1:080904;4:040404;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;1:060604;2:040404;1:0b0b04;7:040404;1:060604;3:040404;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;3:040404;1:060604;3:040404;1:080904;7:040404;1:080904;1:7e7e7e;1:5d5d5d;1:808080;1:626262;4:040404;1:060604;4:040404;1:0b0b04;1:080904;1:060604;4:040404;1:7e7e7e;1:474747;2:000000;1:939393;1:606060;1:040404;1:1b1d04;2:272505;1:191a04;1:272505;1:272406;1:2e2a0b;1:272406;1:272505;1:272406;1:161804;4:272505;1:7e7e7e;1:565656;1:7e7e7e;1:626262;1:040404;1:2e2a0b;7:272505;1:252404;1:2c2808;1:2a2607;1:1b1d04;1:272505;1:202205;1:2a2607;1:848484;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;5:272505;1:2a2507;1:272505;1:272406;3:272505;1:252404;1:1b1d04;1:222205;1:202205;1:808080;1:5d5d5d;1:7c7c7c;1:5d5d5d;1:040404;1:272505;1:252404;1:272505;1:2e2b0a;1:272505;1:1b1d04;1:222205;3:272505;1:191a04;3:272505;1:272406;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5a5a5a;1:040404;1:272505;1:252404;1:272505;1:222205;1:252404;1:1b1d04;1:272505;1:222205;1:252404;1:272505;1:191a04;1:272505;1:302d0e;1:222205;1:252404;1:7e7e7e;1:5d5d5d;1:7a7a7a;1:626262;1:040404;1:272505;1:1d2004;2:272505;1:2a2607;4:272505;1:191a04;1:202205;1:272505;1:2e2b0a;1:1b1d04;1:272505;1:737373;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:1d2004;6:272505;1:272406;1:2c2808;1:202205;1:272505;1:202205;1:272406;1:2a2607;1:272505;1:7e7e7e;1:606060;1:7e7e7e;1:5d5d5d;1:060604;2:272505;2:252404;1:272505;1:252404;5:272505;2:252404;1:2e2b0a;1:272505;1:777777;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:222205;1:272505;1:252404;1:222205;2:272505;1:2a2607;1:272505;1:272406;1:2a2607;1:272505;1:302d0e;1:272505;1:302c0e;1:272505;1:7e7e7e;1:474747;2:000000;1:ababab;1:5d5d5d;1:040404;4:272505;1:252404;3:272505;2:252404;1:2a2607;3:272505;1:272406;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:252404;2:272505;1:252404;4:272505;1:302c0e;1:2a2507;1:272406;1:272505;1:2e2b0a;1:1b1d04;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;1:191a04;3:272505;1:202205;6:272505;1:252404;1:222205;2:272505;1:777777;1:626262;1:7e7e7e;1:5a5a5a;1:040404;3:272505;1:2c2808;3:272505;1:202205;1:272505;1:2e2b0a;5:272505;1:858585;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:0d0e04;1:272505;1:1b1d04;1:252404;1:302c0e;2:272505;1:272406;2:272505;1:2e2b0a;3:272505;1:161804;1:272505;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:2c2808;1:332e10;1:222205;5:272505;1:252404;2:272505;1:1b1d04;1:191a04;1:7a7a7a;1:606060;1:848484;1:606060;1:040404;1:272505;1:2c2808;1:2a2607;3:272505;1:2a2507;2:272505;1:1d2004;1:272505;1:2e2b0a;3:272505;1:7e7e7e;1:606060;1:7e7e7e;1:5d5d5d;1:040404;3:272505;1:252404;1:272505;1:1b1d04;1:332e10;1:272505;1:272406;1:1b1d04;1:222205;4:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:606060;1:040404;1:272505;1:252404;1:222205;1:272505;1:272406;1:2c2808;1:1b1d04;1:2c2808;1:2a2607;2:272505;1:202205;1:2c2808;1:2a2607;1:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:676767;1:040404;1:272505;1:2c2808;1:272505;1:191a04;1:272505;2:252404;1:272505;1:2a2607;1:2c2808;3:272505;1:2c2808;1:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:080904;2:272505;1:2a2607;5:272505;1:272406;6:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:272406;1:272505;1:2a2607;2:272505;1:2a2507;1:272505;1:2a2607;1:272505;1:1b1d04;1:272505;1:1b1d04;1:2e2a0b;1:272406;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;2:272505;1:272406;2:272505;2:252404;2:272505;1:2e2b0a;4:272505;1:222205;1:7e7e7e;1:5d5d5d;1:858585;1:626262;1:040404;1:252404;1:272406;1:2e2b0a;1:272505;1:272406;1:272505;1:1d2004;3:272505;1:1b1d04;2:272505;1:2c2808;1:272505;1:737373;1:666666;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;7:272505;1:2a2607;2:272505;1:302c0e;3:272505;1:7a7a7a;1:626262;1:858585;1:5d5d5d;1:040404;1:272505;1:222205;2:272505;1:2a2607;2:272505;1:1d2004;1:272505;1:191a04;1:272406;1:2a2507;1:272406;1:202205;1:272505;1:7c7c7c;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;3:272505;1:2e2a0b;1:2a2507;5:272505;1:1b1d04;2:2e2b0a;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:1d2004;1:272505;1:272406;1:2a2607;1:272505;1:2e2b0a;2:202205;1:272505;1:1b1d04;1:272505;1:202205;1:272406;1:2a2507;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:2c2808;1:2e2b0a;1:272505;1:1b1d04;4:272505;1:202205;1:2e2a0b;3:272505;1:2e2b0a;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:606060;1:040404;1:272505;1:272406;1:1b1d04;1:222205;1:272505;1:2a2507;2:272505;1:2a2607;1:272505;1:272406;3:272505;1:252404;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:626262;1:040404;1:272505;1:2a2507;5:272505;1:1d2004;1:272505;1:2e2b0a;1:1b1d04;2:272505;1:202205;1:2c2808;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:252404;1:272505;1:161804;1:272505;1:2e2b0a;1:272406;1:272505;1:202205;3:272505;1:1b1d04;1:1d2004;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:606060;1:060604;2:272505;1:202205;1:272505;1:202205;1:222205;5:272505;1:1b1d04;1:252404;2:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;1:161804;1:252404;1:272406;1:272505;1:1b1d04;1:332e11;1:272406;2:272505;1:202205;2:2a2507;1:202205;1:272505;1:848484;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;1:252404;1:272505;1:2a2607;1:252404;2:272505;1:272406;1:272505;1:2a2507;3:272505;1:332f11;1:272406;1:272505;1:848484;1:5d5d5d;1:737373;1:6d6d6d;1:060604;1:272505;1:302d0e;1:1d2004;2:272505;2:2e2b0a;1:222205;1:252404;6:272505;1:7e7e7e;1:626262;1:7e7e7e;1:5d5d5d;1:040404;1:302c0e;1:272505;1:161804;1:272406;5:272505;1:2c2808;2:272505;1:202205;2:272505;1:808080;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:272505;1:2a2607;1:272505;1:2e2a0b;10:272505;1:1d2004;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;3:272505;1:202205;5:272505;1:2a2607;1:2e2b0a;2:272505;1:2e2b0a;1:272505;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:2a2507;3:272505;1:252404;1:272406;2:272505;1:2e2b0a;3:272505;1:2e2a0b;2:272505;1:7e7e7e;1:666666;1:7e7e7e;1:5d5d5d;1:060604;2:272505;1:2e2b0a;2:272505;1:1b1d04;5:272505;1:161804;1:2c2808;1:222205;1:2a2607;1:777777;1:5d5d5d;1:7e7e7e;1:626262;1:040404;1:272505;1:202205;1:1b1d04;1:272505;1:2e2b0a;1:2c2808;3:272505;1:272406;1:1b1d04;3:272505;1:2e2a0b;1:848484;1:666666;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:2e2b0a;1:272505;1:252404;2:272505;1:191a04;5:272505;1:272406;1:191a04;1:7a7a7a;1:5d5d5d;1:8b8b8b;1:5d5d5d;1:060604;2:272505;1:252404;1:202205;1:272505;1:1b1d04;2:272505;1:252404;1:272505;1:272406;1:272505;1:2e2b0a;1:272505;1:2a2607;1:7e7e7e;1:626262;1:7e7e7e;1:5d5d5d;1:040404;4:272505;1:272406;1:272505;1:161804;1:272505;1:1b1d04;3:272505;1:252404;2:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:272505;2:191a04;3:272505;1:2e2a0b;8:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;2:272505;1:272406;2:272505;1:1d2004;1:272505;1:1b1d04;3:272505;1:2a2507;1:272505;1:161804;1:272505;1:7e7e7e;1:606060;1:7a7a7a;1:5d5d5d;1:060604;1:272505;1:272406;2:272505;1:302c0e;1:1b1d04;1:191a04;2:272505;1:222205;1:272505;1:1d2004;1:272505;1:1b1d04;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;3:272505;1:272406;1:202205;1:2e2b0a;1:272505;1:252404;1:272505;1:272406;1:272505;1:302c0e;3:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;1:2c2808;1:272505;1:2a2507;1:202205;1:2a2607;1:272406;1:2a2607;1:2c2808;1:2a2607;1:222205;1:1b1d04;1:222205;1:272505;1:202205;1:332e10;1:7e7e7e;1:4d4d4d;1:7e7e7e;1:5a5a5a;1:060604;5:272505;1:2a2507;3:272505;1:272406;3:272505;1:202205;1:272505;1:7a7a7a;1:606060;1:858585;1:5d5d5d;1:040404;6:272505;2:202205;2:272505;1:222205;1:1b1d04;1:272505;1:2a2507;1:272505;1:7e7e7e;1:666666;1:707070;1:5d5d5d;1:040404;3:272505;1:252404;2:272406;1:2c2808;2:272505;1:222205;1:2a2507;1:2c2808;2:272505;1:2e2b0a;1:7e7e7e;1:5d5d5d;1:737373;1:626262;1:040404;1:1b1d04;1:272505;1:202205;1:272505;1:302d0e;1:252404;1:272505;1:2e2b0a;1:252404;1:1b1d04;1:222205;1:272505;1:1b1d04;1:2e2a0b;1:272505;1:7a7a7a;1:5d5d5d;1:808080;1:5d5d5d;1:080904;1:2c2808;2:272505;1:2e2b0a;1:191a04;1:272505;1:1b1d04;1:252404;4:272505;1:2c2808;2:272505;1:777777;1:474747;2:000000;1:939393;1:606060;1:040404;1:272505;1:2a2607;1:1b1d04;2:272505;1:272406;1:202205;1:272505;1:2e2a0b;1:222205;2:272505;1:252404;1:2e2a0b;1:272505;1:7e7e7e;1:626262;1:7e7e7e;1:5d5d5d;1:080904;1:202205;1:272505;1:1b1d04;1:252404;4:272505;1:1b1d04;1:272505;1:2c2808;2:272505;1:252404;1:332e10;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:080904;1:202205;1:272505;1:222205;1:252404;1:272505;1:1d2004;3:272505;1:272406;5:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:202205;1:252404;1:222205;1:202205;1:1b1d04;6:272505;1:2a2507;2:272505;1:272406;1:7e7e7e;1:5d5d5d;1:808080;1:606060;1:040404;1:1d2004;1:272406;3:272505;1:2a2607;4:272505;1:332e10;1:272505;1:272406;1:2e2b0a;1:272505;1:7c7c7c;1:5d5d5d;1:808080;1:5a5a5a;1:0b0b04;1:272505;1:202205;1:2e2a0b;3:272505;1:2e2b0a;1:272406;2:272505;1:1d2004;2:272505;1:161804;1:332f11;1:7e7e7e;1:666666;1:7e7e7e;1:5d5d5d;1:040404;3:272505;1:1b1d04;1:272505;1:272406;9:272505;1:7a7a7a;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:1d2004;1:202205;1:272505;1:272406;5:272505;1:272406;1:252404;1:2e2b0a;1:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:060604;1:272505;1:272406;1:2a2507;1:252404;1:2a2607;1:1b1d04;1:272505;1:202205;1:272505;1:2a2507;1:2c2808;4:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:1d2004;1:272406;1:272505;1:2a2507;1:2c2808;2:252404;3:272505;1:1b1d04;2:272505;1:252404;1:272505;1:8b8b8b;1:5d5d5d;1:737373;1:5d5d5d;1:040404;4:272505;1:252404;1:272505;1:1d2004;1:252404;1:272505;1:272406;1:2e2b0a;1:272505;1:191a04;1:272505;1:252404;1:7e7e7e;1:5d5d5d;1:898989;1:5d5d5d;1:040404;1:1b1d04;1:272406;1:252404;3:272505;1:2a2607;1:302d0e;2:272505;1:252404;3:272505;1:222205;1:7c7c7c;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:252404;1:2a2607;1:332e11;1:272505;1:1b1d04;1:2a2607;5:272505;1:272406;1:1b1d04;2:272505;1:7a7a7a;1:676767;1:7c7c7c;1:4d4d4d;1:060604;2:272505;1:252404;1:1b1d04;1:272505;1:252404;3:272505;1:2c2808;1:252404;1:202205;1:272505;1:202205;1:2a2507;1:848484;1:666666;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;6:272505;1:2c2808;2:272505;1:2a2507;1:272406;1:222205;1:272505;1:2c2808;1:7e7e7e;1:5d5d5d;1:7c7c7c;1:5d5d5d;1:060604;1:272406;1:272505;1:332f11;1:332e10;1:1b1d04;1:272505;1:222205;1:2c2808;6:272505;1:222205;1:7e7e7e;1:5d5d5d;1:7a7a7a;1:5d5d5d;1:040404;1:272505;1:272406;1:252404;1:272406;1:272505;1:1d2004;1:1b1d04;1:272505;1:2a2607;1:161804;4:272505;1:2a2507;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:565656;1:040404;4:272505;1:1d2004;5:272505;1:252404;1:272406;1:272505;1:191a04;1:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:2a2507;3:272505;1:1b1d04;1:272505;1:2e2b0a;1:252404;3:272505;1:2c2808;1:272406;1:272505;1:2e2b0a;1:737373;1:5d5d5d;1:7a7a7a;1:5d5d5d;1:0f1004;2:272505;1:202205;2:272505;1:2e2a0b;1:272505;1:2a2507;1:272406;1:1b1d04;1:252404;1:2e2b0a;3:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:6b6b6b;1:040404;1:1b1d04;2:272505;1:252404;1:222205;2:1b1d04;1:202205;3:272505;1:1b1d04;1:272505;1:252404;1:272505;1:7e7e7e;1:5d5d5d;1:808080;1:5d5d5d;1:080904;1:1d2004;2:272505;1:1b1d04;2:272505;1:272406;1:2a2507;3:272505;1:2e2a0b;1:272505;1:252404;1:202205;1:848484;1:5d5d5d;1:858585;1:626262;1:040404;1:272505;1:272406;1:272505;1:252404;2:272505;1:2e2a0b;2:272505;1:222205;1:2a2507;1:252404;2:222205;1:272505;1:7e7e7e;1:5d5d5d;1:848484;1:5d5d5d;1:040404;1:2e2b0a;1:2a2607;1:141504;1:272406;1:191a04;4:272505;1:1b1d04;1:2e2b0a;1:1d2004;1:202205;1:2a2607;1:2e2b0a;1:808080;1:6b6b6b;1:858585;1:5d5d5d;1:040404;1:202205;1:1b1d04;3:272505;1:2c2808;1:252404;3:272505;1:252404;1:222205;2:272505;1:202205;1:7e7e7e;1:5d5d5d;1:737373;1:5d5d5d;1:060604;1:2a2507;1:1b1d04;2:272505;1:252404;1:272505;1:302c0e;1:272505;1:222205;1:272505;1:161804;1:272505;1:202205;2:272505;1:7a7a7a;1:5d5d5d;1:7e7e7e;1:5a5a5a;1:040404;1:1b1d04;3:272505;1:202205;1:272505;1:252404;1:191a04;7:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:666666;1:060604;2:272505;1:1b1d04;1:2a2507;4:272505;1:2a2607;3:272505;1:191a04;1:272505;1:272406;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;5:272505;1:2a2607;1:272505;1:202205;1:272505;2:272406;1:2c2808;1:1d2004;1:202205;1:222205;1:7a7a7a;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:191a04;1:2a2607;1:202205;1:272505;1:222205;1:2e2b0a;1:272505;1:252404;3:272505;1:1b1d04;1:272505;1:7a7a7a;1:5a5a5a;1:7c7c7c;1:5a5a5a;1:060604;4:272505;1:252404;1:272505;1:2e2b0a;8:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:202205;1:252404;1:2a2507;1:272505;1:1d2004;1:272505;1:2c2808;1:202205;1:272505;1:202205;1:2a2507;1:2e2a0b;1:272505;1:2a2507;1:7e7e7e;1:606060;1:7e7e7e;1:606060;1:080904;1:272505;1:2e2b0a;1:222205;9:272505;1:1b1d04;2:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;3:272505;1:2c2808;6:272505;1:202205;3:272505;1:7e7e7e;1:666666;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:272406;1:2c2808;4:272505;1:2a2607;3:272505;1:2a2607;3:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:606060;1:060604;1:272505;1:2a2607;3:272505;1:222205;1:2e2a0b;1:272406;1:272505;1:272406;1:272505;1:2e2b0a;1:272505;1:202205;1:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:676767;1:060604;3:272505;1:2a2607;1:2a2507;2:272505;1:272406;1:272505;1:1b1d04;1:272505;1:272406;1:2c2808;1:191a04;1:272505;1:7e7e7e;1:5d5d5d;1:737373;1:5d5d5d;1:060604;1:272505;1:2a2507;4:272505;1:121304;1:252404;1:272505;1:2a2607;1:272505;1:272406;1:2a2507;1:161804;1:272505;1:707070;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:252404;1:272505;1:222205;1:272505;1:2a2607;1:1b1d04;6:272505;1:252404;2:272505;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:626262;1:040404;1:272505;1:2a2507;1:2a2607;1:2a2507;2:272505;1:2a2607;1:1d2004;3:272505;1:202205;2:272505;1:272406;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5a5a5a;1:040404;3:272505;1:191a04;1:222205;1:1b1d04;1:252404;2:272505;1:272406;5:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:545454;1:040404;1:272505;1:252404;1:272505;2:272406;1:272505;1:272406;4:272505;1:2a2607;1:302d0e;2:252404;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;7:272505;1:1b1d04;1:272505;1:2a2507;1:272505;1:272406;1:202205;2:272505;1:7e7e7e;1:626262;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:2e2a0b;1:252404;3:272505;1:2c2808;1:2a2507;5:272505;1:2a2507;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:606060;1:060604;1:272505;1:2a2607;1:2e2b0a;1:2a2507;7:272505;1:272406;1:272505;1:1b1d04;1:2c2808;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:2e2b0a;1:272505;1:1d2004;1:272505;1:1b1d04;1:272505;1:252404;2:272505;1:202205;1:2a2607;1:252404;1:1b1d04;1:202205;1:272505;1:7a7a7a;1:5a5a5a;1:737373;1:5d5d5d;1:040404;2:272505;1:272406;1:2a2607;1:272505;1:1b1d04;9:272505;1:7e7e7e;1:5d5d5d;1:848484;1:5d5d5d;1:040404;5:272505;1:272406;1:191a04;2:272505;1:202205;4:272505;1:2a2607;1:7e7e7e;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:2c2808;1:191a04;1:2e2a0b;1:272505;1:272406;2:272505;1:2a2507;1:272505;1:302d0e;1:1d2004;2:272505;1:7e7e7e;1:5d5d5d;1:7c7c7c;1:5d5d5d;1:040404;1:2c2808;2:272505;1:2a2607;4:272505;1:202205;4:272505;1:252404;1:272406;1:7a7a7a;1:5d5d5d;1:858585;1:5d5d5d;1:040404;1:252404;3:272505;1:1b1d04;3:272505;1:202205;1:302d0e;3:272505;1:2e2a0b;1:272505;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:2e2b0a;1:1b1d04;3:272505;1:1b1d04;7:272505;1:858585;1:5d5d5d;1:7c7c7c;1:5d5d5d;1:040404;1:2a2507;1:252404;1:272505;1:252404;1:191a04;1:272505;1:272406;1:222205;1:272505;1:272406;3:272505;1:2a2507;1:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:202205;1:272505;1:1b1d04;1:272406;2:272505;1:252404;3:272505;1:2a2507;1:272505;2:252404;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;1:272505;1:2e2b0a;1:272505;1:2a2607;1:272505;1:252404;2:272505;1:2a2607;6:272505;1:7e7e7e;1:676767;1:858585;1:626262;1:040404;1:272406;2:272505;1:2a2607;2:272505;1:1b1d04;1:2e2a0b;1:272505;1:191a04;1:272505;1:252404;2:272505;1:252404;1:7e7e7e;1:5d5d5d;1:898989;1:707070;1:040404;2:272505;1:1b1d04;1:2e2a0b;1:272505;1:272406;1:222205;2:272505;1:202205;1:1d2004;1:252404;1:1b1d04;1:272406;1:272505;1:848484;1:666666;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:202205;1:272406;1:272505;1:2e2b0a;1:2a2507;2:272505;1:272406;2:252404;1:272406;3:272505;1:7e7e7e;1:5d5d5d;1:777777;1:5d5d5d;1:040404;4:272505;1:252404;1:2a2607;1:272505;1:2c2808;2:272505;1:1b1d04;2:272505;1:2e2b0a;1:222205;1:7e7e7e;1:5d5d5d;1:808080;1:5d5d5d;1:040404;1:252404;1:272505;1:272406;1:2a2607;1:272505;1:252404;1:272406;1:1b1d04;1:302c0e;1:2a2607;4:272505;1:272406;1:777777;1:5d5d5d;1:858585;1:5d5d5d;1:040404;1:191a04;1:252404;1:332f11;5:272505;1:252404;1:202205;1:272505;1:202205;1:2e2a0b;2:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;3:272505;1:202205;1:252404;1:2a2607;3:272505;1:272406;1:2a2507;4:272505;1:7e7e7e;1:626262;1:808080;1:5d5d5d;1:040404;7:272505;1:2c2808;4:272505;1:2c2808;1:1b1d04;1:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;9:272505;1:302c0e;4:272505;1:272406;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:202205;2:272505;1:202205;1:1b1d04;1:272505;1:272406;1:272505;1:2a2507;3:272505;1:252404;2:272505;1:808080;1:5d5d5d;1:858585;1:676767;1:040404;1:252404;2:272505;1:2e2b0a;3:272505;1:1b1d04;3:272505;1:2e2b0a;1:2a2607;1:1d2004;1:222205;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:272505;1:252404;2:272505;2:252404;1:272505;1:332e10;2:272505;1:272406;1:1d2004;3:272505;1:7c7c7c;1:606060;1:707070;1:5a5a5a;1:0d0e04;1:332e11;3:272505;1:272406;1:272505;1:252404;1:1d2004;2:202205;1:1b1d04;1:272505;1:202205;1:2a2607;1:252404;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:222205;3:272505;1:202205;4:272505;1:222205;2:272505;1:2a2507;1:7e7e7e;1:5d5d5d;1:7c7c7c;1:5d5d5d;1:040404;1:272505;1:1d2004;1:2c2808;3:272505;1:2c2808;1:272505;1:272406;1:2a2507;5:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:1b1d04;3:272505;2:222205;2:272505;1:272406;1:272505;1:252404;1:302c0e;2:272505;1:2c2808;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;2:272505;1:252404;1:191a04;1:272406;1:222205;1:272505;1:1b1d04;1:2c2808;1:272406;2:272505;1:1d2004;1:2e2b0a;1:272505;1:7e7e7e;1:474747;2:000000;1:939393;1:5d5d5d;1:040404;2:272505;1:191a04;1:252404;1:272505;1:1b1d04;1:272505;1:272406;2:272505;1:161804;1:272406;3:272505;1:808080;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;4:272505;1:222205;1:272505;1:252404;3:272505;1:1d2004;1:2e2b0a;3:272505;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:040404;1:332e10;1:2e2b0a;1:272406;2:272505;1:252404;2:272505;1:1b1d04;5:272505;1:202205;1:808080;1:5a5a5a;1:7e7e7e;1:5d5d5d;1:040404;1:222205;1:1b1d04;1:2c2808;1:1b1d04;1:2a2607;1:272505;1:2e2b0a;2:272505;1:191a04;1:272505;1:1b1d04;1:332e10;1:222205;1:272505;1:737373;1:606060;1:737373;1:5d5d5d;1:040404;1:1d2004;1:272505;1:252404;2:272505;1:2e2b0a;1:272505;1:2a2507;2:272505;1:1b1d04;1:272505;1:2c2808;2:272505;1:777777;1:5d5d5d;1:737373;1:5d5d5d;1:040404;1:272505;1:1b1d04;1:222205;1:272505;1:2a2607;1:272505;1:252404;1:272406;1:2a2507;1:272505;1:222205;1:252404;1:2a2607;1:2e2b0a;1:272406;1:7e7e7e;1:606060;1:808080;1:5a5a5a;1:040404;3:272505;1:2e2a0b;1:1b1d04;2:272505;1:191a04;1:222205;1:202205;3:272505;1:302d0e;1:2a2507;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:5d5d5d;1:060604;2:272505;1:222205;1:202205;1:272505;1:252404;1:202205;2:272406;2:272505;1:222205;2:272505;1:1b1d04;1:7c7c7c;1:5d5d5d;1:7a7a7a;1:666666;1:040404;1:272505;1:272406;1:2c2808;1:272505;1:1b1d04;1:2e2b0a;1:272505;1:1b1d04;2:272505;1:2a2607;1:202205;1:2a2507;1:272505;1:202205;1:7e7e7e;1:474747;2:000000;1:939393;1:707070;9:7e7e7e;1:898989;1:848484;2:7e7e7e;1:707070;1:898989;1:808080;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:6b6b6b;1:7e7e7e;1:7a7a7a;1:7e7e7e;1:848484;1:7a7a7a;1:7e7e7e;1:7a7a7a;1:7e7e7e;1:7c7c7c;2:7e7e7e;1:858585;2:7e7e7e;2:808080;1:7e7e7e;1:626262;1:7e7e7e;1:707070;1:7e7e7e;1:848484;2:7e7e7e;1:848484;1:7e7e7e;1:858585;1:7e7e7e;1:7c7c7c;3:7e7e7e;1:737373;1:808080;1:858585;1:7c7c7c;1:777777;1:5d5d5d;1:737373;1:6b6b6b;1:7c7c7c;1:777777;7:7e7e7e;1:808080;1:7e7e7e;2:848484;2:808080;1:7c7c7c;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:737373;3:7e7e7e;1:808080;1:7e7e7e;2:7a7a7a;3:7e7e7e;1:858585;1:7c7c7c;3:7e7e7e;1:7a7a7a;1:7e7e7e;1:5d5d5d;1:7e7e7e;1:737373;1:7e7e7e;1:7a7a7a;4:7e7e7e;1:808080;2:7e7e7e;1:737373;1:777777;2:808080;1:7e7e7e;1:808080;1:848484;1:7e7e7e;1:5a5a5a;1:777777;1:707070;2:7e7e7e;1:7c7c7c;4:7e7e7e;1:909090;2:7e7e7e;1:737373;4:7e7e7e;2:7c7c7c;1:5d5d5d;2:7a7a7a;1:909090;1:7a7a7a;8:7e7e7e;1:737373;1:7e7e7e;1:848484;1:7e7e7e;1:808080;2:7e7e7e;1:5d5d5d;1:7c7c7c;1:707070;5:7e7e7e;1:7c7c7c;1:7e7e7e;1:7c7c7c;1:7e7e7e;1:7c7c7c;1:777777;1:737373;3:7e7e7e;1:808080;1:7e7e7e;1:474747;2:000000;1:939393;1:676767;2:5d5d5d;1:606060;2:5d5d5d;2:626262;1:5d5d5d;1:5a5a5a;1:5d5d5d;1:676767;2:5d5d5d;1:666666;4:5d5d5d;1:6d6d6d;1:606060;1:666666;1:5d5d5d;1:5a5a5a;1:5d5d5d;1:626262;1:5d5d5d;1:606060;2:5d5d5d;1:5a5a5a;5:5d5d5d;1:565656;2:5d5d5d;1:707070;4:5d5d5d;2:626262;1:606060;3:5d5d5d;1:606060;4:5d5d5d;1:5a5a5a;3:5d5d5d;1:707070;5:5d5d5d;2:626262;3:5d5d5d;1:666666;2:5d5d5d;1:5a5a5a;2:626262;1:565656;2:5d5d5d;1:707070;1:5d5d5d;1:626262;3:5d5d5d;1:606060;2:5a5a5a;3:5d5d5d;1:666666;2:5d5d5d;1:606060;1:5d5d5d;1:606060;2:5d5d5d;1:707070;1:5d5d5d;1:666666;1:606060;1:5d5d5d;1:626262;5:5d5d5d;1:626262;1:565656;2:5d5d5d;1:606060;1:5d5d5d;1:606060;1:5d5d5d;1:606060;1:676767;1:5d5d5d;1:606060;1:5d5d5d;1:565656;1:606060;1:5d5d5d;1:5a5a5a;4:5d5d5d;1:606060;2:5d5d5d;1:5a5a5a;2:5d5d5d;2:5a5a5a;1:6b6b6b;2:5d5d5d;2:5a5a5a;5:5d5d5d;1:606060;2:5d5d5d;1:565656;3:5d5d5d;1:626262;2:5d5d5d;1:6d6d6d;3:5d5d5d;1:606060;5:5d5d5d;1:5a5a5a;7:5d5d5d;1:606060;1:474747;183:000000"}, hotbar_sel = {w=24,h=23,d="24:000000;1:040404;1:ffffff;1:fdfdfd;1:f6f6f6;1:f7f9f7;1:ddf0d8;1:fcfefc;2:d5e8d0;1:cee1c9;1:d4e7cf;1:d5e8d0;1:daedd5;2:d5e8d0;1:d8ebd3;1:d5e8d0;1:cde0c8;4:d5e8d0;1:a1b29d;2:040404;1:fcfcfc;3:a1b29d;1:9bac97;3:a1b29d;1:a0b19c;1:aebfaa;1:9aab96;1:a1b29d;1:90a18c;1:a2b39e;1:9aab96;1:a1b29d;1:9aab96;2:a1b29d;1:aabba6;1:a1b29d;1:5e6c5b;2:040404;1:f7f9f7;1:a1b29d;1:616f5e;1:5f6d5c;1:586655;1:5f6d5c;1:596756;1:5e6c5b;3:5f6d5c;1:62705f;1:5f6d5c;1:606e5d;1:5b6958;1:5f6d5c;1:5d6b5a;2:5f6d5c;1:a8b9a4;1:a5b6a1;1:5f6d5c;2:040404;1:ffffff;1:a1b29d;1:5f6d5c;16:-;1:d1e4cc;1:a1b29d;1:5f6d5c;2:040404;1:d5e8d0;1:acbda8;1:5f6d5c;16:-;1:e2f5dd;1:a1b29d;1:667463;2:040404;1:d5e8d0;1:a1b29d;1:5f6d5c;16:-;1:d5e8d0;1:a1b29d;1:657362;2:040404;1:d5e8d0;1:a1b29d;1:5f6d5c;16:-;1:d5e8d0;1:a1b29d;1:5f6d5c;2:040404;1:caddc5;1:a1b29d;1:5f6d5c;16:-;1:d5e8d0;1:a1b29d;1:5f6d5c;2:040404;1:d5e8d0;1:a1b29d;1:5f6d5c;16:-;1:d5e8d0;1:a9baa5;1:5f6d5c;2:040404;1:d6e9d1;1:a9baa5;1:5f6d5c;16:-;1:d8ebd3;1:a1b29d;1:566453;2:040404;1:d5e8d0;1:a1b29d;1:5f6d5c;16:-;1:def1d9;1:a1b29d;1:687665;2:040404;1:daedd5;1:a1b29d;1:5b6958;16:-;1:d5e8d0;1:a1b29d;1:5a6857;2:040404;1:d5e8d0;1:a3b49f;1:556352;16:-;1:d5e8d0;1:a1b29d;1:5f6d5c;2:040404;1:dcefd7;1:a1b29d;1:677564;16:-;1:d5e8d0;1:a1b29d;1:5f6d5c;2:040404;1:d5e8d0;1:a1b29d;1:6d7b6a;16:-;1:d5e8d0;1:9cad98;1:586655;2:040404;1:dcefd7;1:9dae99;1:616f5e;16:-;1:d5e8d0;1:a1b29d;1:606e5d;2:040404;1:caddc5;1:a1b29d;1:546251;16:-;1:cfe2ca;1:a4b5a0;1:657362;2:040404;1:d3e6ce;1:95a691;1:5a6857;16:-;1:d7ead2;1:a1b29d;1:5f6d5c;2:040404;1:d5e8d0;1:9fb09b;1:5c6a59;16:-;1:f8faf8;1:9fb09b;1:556352;2:040404;1:d6e9d1;1:a1b29d;1:d0e3cb;1:d3e6ce;2:d5e8d0;1:d8ebd3;1:cfe2ca;1:d1e4cc;1:d5e8d0;1:d2e5cd;6:d5e8d0;1:daedd5;2:f7f9f7;1:a1b29d;1:5f6d5c;2:040404;1:d5e8d0;2:a1b29d;1:abbca7;1:9aab96;1:a2b39e;2:a1b29d;1:99aa95;1:abbca7;1:a1b29d;1:9dae99;3:a1b29d;1:9eaf9a;1:a1b29d;1:9eaf9a;1:a1b29d;1:9fb09b;1:a0b19c;1:5f6d5c;2:040404;1:a1b29d;2:5f6d5c;2:647261;1:596756;1:5c6a59;2:5f6d5c;1:667463;1:677564;4:5f6d5c;1:5e6c5b;1:667463;1:5f6d5c;1:6e7c6b;1:5f6d5c;1:566453;1:606e5d;1:040404"}, xp_bg = {w=182,h=5,d="1:-;180:09100c;1:-;1:09100c;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;2:202b25;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;2:09100c;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;2:28332d;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;1:141f19;1:29352f;1:202c25;5:19241e;1:202c25;1:29352f;2:09100c;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;2:202b25;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:141f19;1:36433c;1:2e3a33;5:29352f;1:2e3a33;1:36433c;1:09100c;1:-;180:09100c;1:-"}, crosshair = {w=15,h=15,d="52:-;1:ffffff;14:-;1:ffffff;14:-;1:ffffff;14:-;1:ffffff;10:-;9:ffffff;10:-;1:ffffff;14:-;1:ffffff;14:-;1:ffffff;14:-;1:ffffff;52:-"}, } local ICON = { stone = {w=16,h=16,d="7:-;1:7f7f7f;1:8f8f8f;12:-;2:7f7f7f;1:8f8f8f;1:686868;2:747474;8:-;1:7f7f7f;1:8f8f8f;1:686868;1:8f8f8f;1:7f7f7f;1:747474;1:7f7f7f;1:686868;1:7f7f7f;1:686868;4:-;1:8f8f8f;1:747474;4:7f7f7f;1:747474;1:8f8f8f;1:7f7f7f;1:8f8f8f;2:7f7f7f;1:686868;1:7f7f7f;1:-;1:727272;2:7f7f7f;1:747474;2:8f8f8f;1:686868;2:8f8f8f;5:747474;1:7f7f7f;1:4c4c4c;1:5c5c5c;1:656565;1:5c5c5c;1:747474;1:7f7f7f;1:747474;3:7f7f7f;1:8f8f8f;3:7f7f7f;2:454545;1:4c4c4c;1:656565;1:727272;1:5c5c5c;1:656565;1:535353;1:8f8f8f;1:7f7f7f;2:747474;1:7f7f7f;1:747474;3:4c4c4c;1:454545;1:4c4c4c;2:656565;1:5c5c5c;1:656565;1:5c5c5c;1:535353;1:656565;1:7f7f7f;1:8f8f8f;1:555555;1:4c4c4c;1:3e3e3e;2:555555;1:3e3e3e;1:4c4c4c;1:727272;1:535353;1:727272;1:656565;1:727272;2:656565;1:5c5c5c;1:4c4c4c;1:3e3e3e;1:555555;3:454545;1:4c4c4c;1:454545;3:656565;2:5c5c5c;1:535353;2:5c5c5c;1:4c4c4c;1:454545;1:4c4c4c;1:555555;2:4c4c4c;1:555555;1:454545;1:5c5c5c;1:656565;1:5c5c5c;2:727272;1:5c5c5c;1:656565;1:727272;2:555555;1:3e3e3e;1:555555;2:4c4c4c;1:555555;1:454545;2:5c5c5c;1:727272;2:656565;1:727272;2:656565;1:454545;2:4c4c4c;1:3e3e3e;1:4c4c4c;1:3e3e3e;1:454545;1:555555;1:-;2:656565;1:5c5c5c;2:656565;1:5c5c5c;1:656565;2:4c4c4c;1:555555;2:454545;1:4c4c4c;1:454545;4:-;1:5c5c5c;2:656565;1:5c5c5c;1:727272;1:4c4c4c;1:454545;2:4c4c4c;1:555555;8:-;1:656565;2:727272;1:555555;2:4c4c4c;12:-;1:656565;1:4c4c4c;7:-"}, dirt = {w=16,h=16,d="7:-;1:79553a;1:966c4a;12:-;2:79553a;1:b9855c;1:593d29;1:79553a;1:b9855c;8:-;2:79553a;1:b9855c;2:79553a;1:966c4a;4:79553a;4:-;1:79553a;1:593d29;1:79553a;1:b9855c;1:79553a;1:966c4a;1:79553a;1:b9855c;2:593d29;2:79553a;2:b9855c;1:-;1:78563b;2:b9855c;1:745844;1:966c4a;1:79553a;1:966c4a;1:79553a;2:966c4a;1:b9855c;1:79553a;2:966c4a;1:79553a;1:6f4f37;2:60442e;1:946a49;1:878787;1:593d29;2:79553a;1:966c4a;1:593d29;1:b9855c;1:79553a;2:966c4a;1:483322;1:5a402c;1:483322;3:60442e;1:473020;1:60442e;1:79553a;1:966c4a;4:79553a;1:5a402c;1:6f4f37;1:483322;1:6f4f37;1:483322;1:60442e;2:78563b;1:946a49;2:60442e;1:946a49;1:79553a;1:966c4a;1:483322;1:5a402c;1:483322;1:5a402c;1:404040;1:483322;1:5a402c;1:60442e;1:946a49;1:60442e;2:473020;1:78563b;2:473020;1:5a402c;2:352418;2:483322;1:6f4f37;2:483322;1:78563b;1:60442e;1:78563b;2:60442e;1:473020;1:78563b;1:60442e;1:404040;1:6f4f37;1:5a402c;1:6f4f37;1:352418;1:483322;1:6f4f37;1:483322;1:473020;1:78563b;2:60442e;3:78563b;1:946a49;1:352418;1:483322;1:5a402c;1:352418;1:483322;1:352418;1:5a402c;1:6f4f37;2:60442e;2:78563b;1:946a49;2:60442e;1:78563b;1:483322;1:5a402c;1:352418;2:5a402c;1:483322;1:6f4f37;1:5a402c;1:-;1:78563b;1:473020;1:78563b;2:60442e;2:78563b;1:5a402c;2:6f4f37;1:483322;1:352418;2:5a402c;4:-;1:60442e;1:946a49;1:473020;1:60442e;1:473020;3:483322;1:352418;1:5a402c;8:-;2:60442e;1:78563b;1:5a402c;1:6f4f37;1:483322;12:-;1:473020;1:483322;7:-"}, cobblestone = {w=16,h=16,d="7:-;2:616161;12:-;1:b5b5b5;1:6e6d6d;1:888788;1:a6a6a6;1:888788;1:616161;8:-;2:616161;1:6e6d6d;2:888788;1:a6a6a6;2:888788;2:a6a6a6;4:-;1:616161;1:888788;6:6e6d6d;1:525252;4:616161;1:b5b5b5;1:-;1:4d4d4d;1:616161;1:6e6d6d;1:888788;1:616161;1:888788;1:525252;2:888788;4:a6a6a6;1:616161;1:6e6d6d;1:515151;1:848484;1:6c6c6c;1:4d4d4d;3:6e6d6d;1:a6a6a6;5:616161;1:b5b5b5;1:3a3a3a;1:515151;1:424141;2:585757;1:4d4d4d;1:909090;1:848484;3:616161;1:888788;2:b5b5b5;1:636363;1:515151;1:3a3a3a;1:515151;1:3a3a3a;1:6c6c6c;1:909090;1:848484;1:585757;1:848484;1:414141;1:909090;1:888788;1:616161;1:636363;1:313131;1:515151;1:424141;1:636363;1:515151;1:6c6c6c;1:4d4d4d;1:585757;1:6c6c6c;2:4d4d4d;1:6c6c6c;1:4d4d4d;1:6c6c6c;2:636363;1:3a3a3a;2:515151;1:636363;1:515151;1:424141;1:585757;1:6c6c6c;1:585757;2:4d4d4d;1:909090;1:848484;1:414141;1:3a3a3a;2:515151;1:424141;1:6c6c6c;2:515151;2:6c6c6c;2:4d4d4d;1:585757;1:6c6c6c;1:4d4d4d;1:585757;1:6c6c6c;1:424141;4:515151;1:3a3a3a;1:6c6c6c;1:515151;1:848484;1:6c6c6c;1:4d4d4d;1:909090;2:585757;1:4d4d4d;1:6c6c6c;1:515151;1:636363;1:515151;1:313131;4:3a3a3a;1:-;1:4d4d4d;1:585757;1:6c6c6c;1:848484;1:414141;1:848484;1:4d4d4d;1:6c6c6c;2:424141;1:636363;1:515151;1:3a3a3a;1:636363;4:-;1:4d4d4d;1:6c6c6c;1:585757;2:6c6c6c;1:424141;1:636363;1:3a3a3a;1:424141;1:3a3a3a;8:-;2:6c6c6c;1:585757;1:6c6c6c;1:424141;1:515151;12:-;1:585757;1:515151;7:-"}, oak_planks = {w=16,h=16,d="7:-;1:b8945f;1:af8f55;12:-;1:af8f55;1:c29d62;1:7e6237;1:b8945f;1:967441;1:c29d62;8:-;1:b8945f;1:c29d62;1:7e6237;1:b8945f;1:9f844d;1:c29d62;1:67502c;1:9f844d;1:b8945f;1:c29d62;4:-;1:af8f55;1:9f844d;1:7e6237;1:af8f55;1:b8945f;1:af8f55;1:67502c;1:967441;1:9f844d;1:c29d62;1:67502c;1:af8f55;1:b8945f;1:c29d62;1:-;1:8c7244;1:7e6237;1:af8f55;1:9f844d;1:b8945f;1:67502c;2:9f844d;1:c29d62;1:7e6237;1:af8f55;1:b8945f;1:af8f55;1:7e6237;1:967441;1:5a4527;1:93764c;1:8c7244;1:9b7d4e;2:967441;1:9f844d;1:c29d62;1:967441;2:af8f55;1:c29d62;1:7e6237;1:9f844d;1:745e3a;1:6e5839;1:5a4527;1:9b7d4e;1:785c34;2:93764c;1:9b7d4e;1:67502c;1:9f844d;2:b8945f;1:67502c;1:9f844d;1:745e3a;1:6e5839;1:695533;1:3d301a;1:6e5839;1:7f693d;1:8c7244;1:9b7d4e;1:524023;1:7f693d;1:8c7244;1:9b7d4e;1:67502c;1:9f844d;1:745e3a;2:5f4f2e;1:4b3a21;2:6e5839;1:5f4f2e;1:9b7d4e;1:644e2c;1:8c7244;1:785c34;1:9b7d4e;1:644e2c;1:93764c;1:7f693d;2:6e5839;1:4b3a21;1:5f4f2e;2:695533;1:5a4527;1:5f4f2e;2:93764c;1:8c7244;1:524023;2:93764c;1:8c7244;1:524023;1:4b3a21;1:745e3a;1:695533;1:5a4527;1:3d301a;1:745e3a;2:5f4f2e;1:7f693d;1:785c34;2:7f693d;1:9b7d4e;1:644e2c;1:7f693d;1:8c7244;2:6e5839;1:4b3a21;1:745e3a;1:5f4f2e;1:695533;1:3d301a;1:745e3a;1:7f693d;2:93764c;1:524023;1:8c7244;1:7f693d;1:9b7d4e;1:524023;1:3d301a;2:6e5839;1:5f4f2e;1:4b3a21;1:5f4f2e;1:695533;1:5f4f2e;1:-;1:524023;1:8c7244;1:7f693d;1:9b7d4e;1:644e2c;1:7f693d;1:785c34;2:695533;1:4b3a21;1:5f4f2e;1:6e5839;1:5f4f2e;1:3d301a;4:-;1:785c34;1:93764c;1:8c7244;1:93764c;1:524023;1:3d301a;1:745e3a;1:5f4f2e;1:5a4527;1:4b3a21;8:-;1:644e2c;1:7f693d;1:8c7244;2:695533;1:4b3a21;12:-;1:524023;1:4b3a21;7:-"}, oak_log = {w=16,h=16,d="7:-;2:4c3d26;12:-;1:4c3d26;1:af8f55;2:7e6237;1:b8945f;1:4c3d26;8:-;1:4c3d26;1:af8f55;1:9f844d;3:af8f55;1:b8945f;1:967441;1:c29d62;1:4c3d26;4:-;1:5f4a2b;1:b8945f;1:9f844d;1:b8945f;1:af8f55;1:967441;2:af8f55;1:9f844d;1:af8f55;1:b8945f;1:9f844d;1:b8945f;1:5f4a2b;1:-;1:3c301e;1:5f4a2b;1:b8945f;1:9f844d;2:af8f55;1:7e6237;2:af8f55;1:9f844d;1:af8f55;1:b8945f;1:9f844d;1:b8945f;1:5f4a2b;1:392c19;1:2c2213;1:4c3b22;1:2c2213;1:5f4a2b;1:af8f55;1:967441;1:b8945f;3:af8f55;1:967441;1:af8f55;1:5f4a2b;1:574327;1:453620;1:392c19;1:3c301e;1:4c3b22;1:2c2213;1:4c3b22;1:2c2213;1:5f4a2b;1:af8f55;2:967441;1:af8f55;1:5f4a2b;1:453620;1:21190e;1:2d2416;2:453620;2:5c482b;1:2c2213;1:4c3b22;1:3c301e;2:745a34;2:5f4a2b;1:453620;1:21190e;3:392c19;1:2d2416;1:453620;1:3c301e;1:5c482b;1:4c3b22;1:3c301e;1:4c3b22;1:2c2213;1:5c482b;1:4c3b22;1:2d2416;1:392c19;1:2d2416;2:392c19;1:453620;1:392c19;1:453620;1:5c482b;1:79603a;1:5c482b;1:745a34;1:5c482b;2:3c301e;1:4c3b22;1:21190e;1:392c19;1:2d2416;2:453620;1:392c19;2:453620;1:3c301e;1:745a34;1:4c3b22;1:5c482b;2:4c3b22;1:3c301e;1:5c482b;3:453620;1:574327;1:392c19;1:2d2416;2:453620;2:5c482b;1:4c3b22;1:2c2213;1:4c3b22;1:3c301e;1:4c3b22;1:5c482b;1:453620;1:5b482b;1:453620;1:21190e;1:453620;1:21190e;2:453620;1:-;1:745a34;1:5c482b;1:3c301e;1:4c3b22;1:2c2213;2:5c482b;1:453620;1:574327;1:392c19;1:21190e;1:392c19;1:2d2416;1:574327;4:-;3:3c301e;2:5c482b;1:2d2416;2:453620;1:21190e;1:2d2416;8:-;1:5c482b;1:745a34;1:5c482b;1:453620;1:574327;1:453620;12:-;1:4c3b22;1:453620;7:-"}, grass_block = {w=16,h=16,d="7:-;1:546e34;1:6e9044;12:-;1:577135;1:4a612d;1:4e6630;1:4b612e;1:577135;1:516931;8:-;1:556f34;1:587236;1:597436;1:516a32;1:495f2d;1:62803c;1:475c2b;1:516a32;1:485e2c;1:556f34;4:-;1:495f2d;1:556f34;1:4c632e;1:5d7a39;1:4f6730;1:495f2d;1:5d7939;1:485e2c;1:4c642f;1:425628;1:506831;1:62803c;1:6e9044;1:5e7b3a;1:-;1:405428;1:4d642f;1:455b2a;1:475c2b;1:526b32;1:536c32;1:536c33;1:4c642f;1:607e3b;1:4c642f;1:617f3c;1:445829;1:475d2b;1:5e7b3a;1:67863f;1:33421f;1:473020;2:405428;1:546d33;1:536c33;1:5b7738;1:526b32;1:4f6730;1:4a612d;1:506931;1:536c33;1:485e2c;1:516931;1:364621;1:2f3d1c;1:352418;1:60442e;2:473020;1:3a4c24;1:485d2c;1:465b2b;1:4c642f;1:5a7637;1:5d7a39;1:475c2b;1:516931;2:33421f;1:3a4c24;1:352418;1:483322;1:60442e;2:78563b;1:473020;1:485d2c;1:425628;1:3a4c24;1:4d642f;1:44592a;1:2f3d1c;3:352418;1:404040;1:483322;1:5a402c;1:60442e;1:946a49;1:60442e;3:473020;1:354620;1:3f5226;1:2f3d1c;1:2d3a1b;1:352418;2:483322;1:6f4f37;2:483322;1:78563b;1:60442e;1:78563b;2:60442e;1:473020;1:78563b;1:60442e;1:404040;1:6f4f37;1:5a402c;1:6f4f37;1:352418;1:483322;1:6f4f37;1:483322;1:473020;1:78563b;2:60442e;3:78563b;1:946a49;1:352418;1:483322;1:5a402c;1:352418;1:483322;1:352418;1:5a402c;1:6f4f37;2:60442e;2:78563b;1:946a49;2:60442e;1:78563b;1:483322;1:5a402c;1:352418;2:5a402c;1:483322;1:6f4f37;1:5a402c;1:-;1:78563b;1:473020;1:78563b;2:60442e;2:78563b;1:5a402c;2:6f4f37;1:483322;1:352418;2:5a402c;4:-;1:60442e;1:946a49;1:473020;1:60442e;1:473020;3:483322;1:352418;1:5a402c;8:-;2:60442e;1:78563b;1:5a402c;1:6f4f37;1:483322;12:-;1:473020;1:483322;7:-"}, crafting_table = {w=16,h=16,d="7:-;2:0e0b06;12:-;1:733920;1:9e5932;2:ae693c;1:9e5932;1:733920;8:-;1:733920;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;1:733920;4:-;1:0e0b06;1:41230e;1:ae693c;2:4b2b18;1:ae693c;2:553824;1:ae693c;2:4b2b18;1:ae693c;1:41230e;1:0e0b06;1:-;1:8c7244;1:0e0b06;1:41230e;1:ae693c;2:4b2b18;1:ae693c;1:4b2b18;1:553824;1:ae693c;1:4b2b18;1:553824;1:ae693c;1:41230e;1:0e0b06;1:0f0c07;1:93764c;1:8c7244;1:2c1a11;1:733920;2:ae693c;1:553824;1:9e5932;1:ae693c;1:553824;2:ae693c;1:733920;1:745e3a;1:6e5839;1:0f0c07;1:9b7d4e;1:785c34;1:93764c;1:3c2213;1:5c2d19;1:733920;1:9e5932;2:ae693c;1:9e5932;1:733920;1:2d190e;1:21130d;1:695533;1:3d301a;1:0f0c07;1:7f693d;1:341c0b;1:9b7d4e;1:15110a;1:7f693d;1:8c7244;1:9b7d4e;1:0e0b06;1:1a150d;1:745e3a;1:5f4f2e;1:16130a;1:4b3a21;2:6e5839;1:0f0c07;1:9b7d4e;1:201808;1:8c7244;1:2c1a11;1:9b7d4e;1:341c0b;1:93764c;1:141009;2:6e5839;1:4b3a21;1:2d190e;2:695533;1:5a4527;1:0f0c07;1:93764c;1:acacac;1:8c7244;1:15110a;1:93764c;2:201808;1:141009;1:4b3a21;1:745e3a;1:271508;1:21130d;1:3d301a;1:745e3a;1:5f4f2e;1:0f0c07;1:7f693d;1:785c34;1:7f693d;1:2c1a11;1:9b7d4e;1:cccccc;1:909090;1:141009;1:6e5839;1:181206;1:4b3a21;1:2d190e;1:5f4f2e;1:695533;1:3d301a;1:0f0c07;1:7f693d;2:93764c;1:0d0b06;1:8c7244;1:7f693d;1:acacac;1:141009;1:3d301a;1:818181;1:6c6c6c;1:21130d;1:4b3a21;1:5f4f2e;1:695533;1:0f0c07;1:-;1:524023;1:8c7244;1:2c1a11;1:9b7d4e;1:644e2c;1:acacac;1:141009;2:695533;1:4b3a21;1:2d190e;1:6e5839;1:5f4f2e;1:3d301a;4:-;1:141009;1:93764c;1:8c7244;1:cccccc;1:141009;1:3d301a;1:745e3a;1:5f4f2e;1:21130d;1:4b3a21;8:-;1:644e2c;1:7f693d;1:141009;2:695533;1:4b3a21;12:-;1:15110a;1:4b3a21;7:-"}, diamond_sword = {w=16,h=16,d="13:-;3:0e3f36;12:-;1:0e3f36;2:a4fdf0;1:082520;11:-;1:0e3f36;1:a4fdf0;1:2bc7ac;1:a4fdf0;1:082520;10:-;1:0e3f36;1:a4fdf0;1:2bc7ac;1:a4fdf0;1:082520;10:-;1:0e3f36;1:a4fdf0;1:2bc7ac;1:33ebcb;1:082520;10:-;1:0e3f36;1:a4fdf0;1:2bc7ac;1:33ebcb;1:082520;5:-;2:0e3f36;3:-;1:0e3f36;1:33ebcb;1:2bc7ac;1:33ebcb;1:082520;6:-;1:0e3f36;1:156355;1:0e3f36;1:-;1:0e3f36;1:33ebcb;1:2bc7ac;1:33ebcb;1:082520;8:-;1:0e3f36;1:1e8a77;1:082520;1:33ebcb;1:1e8a77;1:33ebcb;1:082520;9:-;1:0e3f36;2:1e8a77;1:156355;1:33ebcb;1:082520;11:-;1:0e3f36;1:156355;1:0e3f36;1:082520;11:-;1:493615;1:684e1e;1:082520;2:0e3f36;1:082520;9:-;1:493615;1:896727;1:281e0b;1:-;2:082520;1:0e3f36;1:082520;6:-;2:0e3f36;1:684e1e;1:281e0b;4:-;2:082520;6:-;1:0e3f36;1:156355;1:082520;13:-;3:082520;13:-"}, diamond_pickaxe = {w=16,h=16,d="38:-;5:0e3f36;10:-;1:0e3f36;1:33ebcb;1:2bc7ac;2:27b29a;1:2bc7ac;1:0e3f36;1:493615;1:684e1e;8:-;1:0e3f36;3:082520;2:27b29a;1:896727;1:281e0b;12:-;1:493615;1:2bc7ac;1:27b29a;1:082520;11:-;1:493615;1:684e1e;1:281e0b;1:27b29a;1:2bc7ac;1:082520;9:-;1:493615;1:896727;1:281e0b;1:-;1:082520;1:27b29a;1:082520;8:-;1:493615;1:684e1e;1:281e0b;2:-;1:082520;1:27b29a;1:082520;7:-;1:493615;1:896727;1:281e0b;3:-;1:082520;1:2bc7ac;1:082520;6:-;1:493615;1:684e1e;1:281e0b;4:-;1:082520;1:33ebcb;1:082520;5:-;1:493615;1:896727;1:281e0b;6:-;1:082520;5:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;13:-;2:281e0b;28:-"}, diamond_axe = {w=16,h=16,d="25:-;2:0e3f36;13:-;1:0e3f36;2:33ebcb;1:0e3f36;11:-;1:0e3f36;1:33ebcb;1:27b29a;1:2bc7ac;1:0e3f36;10:-;1:0e3f36;1:33ebcb;3:27b29a;1:493615;1:684e1e;9:-;1:082520;1:33ebcb;1:2bc7ac;1:27b29a;1:1e8a77;1:27b29a;1:281e0b;10:-;2:082520;1:493615;1:27b29a;1:1e8a77;1:27b29a;1:082520;10:-;1:493615;1:684e1e;1:281e0b;2:27b29a;1:082520;9:-;1:493615;1:896727;1:281e0b;1:-;2:082520;9:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;13:-;2:281e0b;28:-"}, diamond_shovel = {w=16,h=16,d="43:-;2:0e3f36;1:082520;12:-;1:0e3f36;2:33ebcb;1:27b29a;1:082520;10:-;1:0e3f36;1:33ebcb;1:2bc7ac;1:27b29a;1:33ebcb;1:082520;9:-;1:0e3f36;1:33ebcb;1:2bc7ac;1:27b29a;1:2bc7ac;1:33ebcb;1:082520;10:-;1:493615;1:27b29a;1:2bc7ac;1:33ebcb;1:082520;10:-;1:493615;1:896727;1:281e0b;1:33ebcb;1:082520;10:-;1:493615;1:896727;1:281e0b;1:-;1:082520;10:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;11:-;2:493615;1:896727;1:281e0b;12:-;1:493615;1:896727;1:281e0b;14:-;2:281e0b;27:-"}, iron_helmet = {w=16,h=16,d="53:-;6:2d2d2d;9:-;1:2d2d2d;1:969696;4:c6c6c6;1:6b6b6b;1:191919;7:-;1:2d2d2d;1:969696;1:d8d8d8;1:ffffff;1:d8d8d8;2:c6c6c6;1:969696;1:6b6b6b;1:191919;6:-;1:2d2d2d;1:c6c6c6;2:d8d8d8;2:c6c6c6;3:969696;1:191919;6:-;1:2d2d2d;2:c6c6c6;3:2d2d2d;1:191919;1:6b6b6b;1:969696;1:191919;6:-;1:2d2d2d;1:c6c6c6;1:2d2d2d;5:191919;1:969696;1:191919;6:-;1:2d2d2d;1:c6c6c6;1:2d2d2d;5:191919;1:6b6b6b;1:191919;6:-;1:2d2d2d;1:969696;6:191919;1:6b6b6b;1:191919;7:-;1:2d2d2d;1:191919;4:-;2:191919;68:-"}, iron_chestplate = {w=16,h=16,d="33:-;5:2d2d2d;4:-;5:2d2d2d;2:-;1:2d2d2d;1:ffffff;1:d8d8d8;1:c6c6c6;1:2d2d2d;4:-;1:2d2d2d;1:ffffff;1:d8d8d8;1:c6c6c6;1:2d2d2d;2:-;1:2d2d2d;1:d8d8d8;2:c6c6c6;1:969696;1:2d2d2d;2:-;1:2d2d2d;1:969696;1:d8d8d8;2:c6c6c6;1:2d2d2d;2:-;1:2d2d2d;3:c6c6c6;1:d8d8d8;1:969696;2:2d2d2d;1:969696;4:c6c6c6;1:2d2d2d;2:-;1:2d2d2d;1:6b6b6b;1:969696;1:c6c6c6;1:ffffff;3:d8d8d8;3:c6c6c6;1:969696;1:6b6b6b;1:2d2d2d;2:-;2:191919;1:6b6b6b;3:d8d8d8;5:c6c6c6;1:6b6b6b;2:191919;4:-;1:191919;2:d8d8d8;6:c6c6c6;1:191919;6:-;1:191919;1:c6c6c6;1:d8d8d8;5:c6c6c6;1:969696;1:191919;6:-;1:191919;7:c6c6c6;1:969696;1:191919;6:-;1:191919;1:969696;5:c6c6c6;2:969696;1:191919;6:-;1:191919;1:6b6b6b;6:969696;1:6b6b6b;1:191919;7:-;1:191919;1:6b6b6b;4:969696;1:6b6b6b;1:191919;9:-;6:191919;21:-"}, iron_leggings = {w=16,h=16,d="36:-;7:2d2d2d;1:191919;7:-;1:2d2d2d;1:d8d8d8;2:ffffff;2:d8d8d8;2:c6c6c6;1:6b6b6b;1:191919;6:-;1:2d2d2d;2:d8d8d8;5:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;1:d8d8d8;1:c6c6c6;3:969696;2:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;1:d8d8d8;1:c6c6c6;1:969696;2:191919;1:6b6b6b;1:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;2:c6c6c6;1:191919;2:-;1:191919;1:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;1:c6c6c6;1:969696;1:191919;2:-;1:2d2d2d;1:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;1:c6c6c6;1:969696;1:191919;2:-;1:2d2d2d;1:c6c6c6;1:969696;1:191919;6:-;1:2d2d2d;2:969696;1:191919;2:-;1:191919;2:969696;1:191919;6:-;1:2d2d2d;1:969696;1:6b6b6b;1:191919;2:-;1:191919;1:969696;1:6b6b6b;1:191919;6:-;1:191919;2:6b6b6b;1:191919;2:-;1:191919;2:6b6b6b;1:191919;6:-;4:191919;2:-;4:191919;35:-"}, iron_boots = {w=16,h=16,d="52:-;3:2d2d2d;2:-;3:2d2d2d;7:-;1:2d2d2d;1:ffffff;1:d8d8d8;1:191919;2:-;1:2d2d2d;1:ffffff;1:d8d8d8;1:191919;6:-;1:2d2d2d;2:d8d8d8;1:191919;2:-;1:2d2d2d;1:d8d8d8;1:c6c6c6;1:191919;6:-;1:2d2d2d;1:d8d8d8;1:c6c6c6;1:191919;2:-;1:2d2d2d;2:c6c6c6;1:191919;6:-;1:2d2d2d;2:c6c6c6;1:191919;2:-;1:2d2d2d;2:c6c6c6;1:191919;6:-;1:2d2d2d;1:c6c6c6;1:969696;1:191919;2:-;1:2d2d2d;2:c6c6c6;1:191919;5:-;1:2d2d2d;2:c6c6c6;1:969696;1:191919;2:-;1:2d2d2d;1:969696;1:c6c6c6;1:969696;1:191919;3:-;1:2d2d2d;2:c6c6c6;1:969696;1:6b6b6b;1:191919;2:-;1:2d2d2d;1:6b6b6b;1:969696;1:c6c6c6;1:969696;1:191919;2:-;1:2d2d2d;2:969696;1:6b6b6b;2:191919;2:-;2:191919;2:969696;1:6b6b6b;1:191919;2:-;1:2d2d2d;3:191919;6:-;4:191919;49:-"}, cooked_beef = {w=16,h=16,d="57:-;4:4e2719;11:-;1:4e2719;1:713f2d;1:7c4835;1:713f2d;1:8e523c;1:4e2719;9:-;1:4e2719;1:522f1f;1:985c43;1:8e523c;1:673728;1:713f2d;1:673728;1:4e2719;7:-;1:4e2719;2:8e523c;1:522f1f;1:7c4835;1:8e523c;1:522f1f;1:713f2d;1:2a160d;5:-;2:4e2719;1:673728;1:522f1f;1:985c43;1:8e523c;1:522f1f;1:7c4835;1:713f2d;1:522f1f;1:2a160d;4:-;1:4e2719;1:522f1f;1:7c4835;1:8e523c;1:673728;1:522f1f;1:985c43;1:8e523c;1:713f2d;1:673728;1:3f2116;1:2a160d;4:-;1:4e2719;1:713f2d;1:522f1f;1:985c43;2:8e523c;1:522f1f;1:985c43;1:673728;1:3f2116;1:2a160d;4:-;1:4e2719;1:713f2d;1:7c4835;1:985c43;1:522f1f;1:985c43;1:8e523c;1:713f2d;1:522f1f;2:3f2116;1:2a160d;4:-;1:4e2719;1:985c43;1:713f2d;1:7c4835;1:985c43;1:522f1f;1:713f2d;1:7c4835;1:673728;1:3f2116;1:2a160d;6:-;1:4e2719;1:985c43;2:8e523c;1:7c4835;1:673728;2:3f2116;1:2a160d;7:-;2:2a160d;1:522f1f;3:3f2116;2:2a160d;10:-;4:2a160d;23:-"}, bread = {w=16,h=16,d="25:-;4:654b17;10:-;2:654b17;1:8c661e;2:a27924;1:8c661e;1:654b17;8:-;1:654b17;1:8c661e;4:bc8927;1:a27924;1:8c661e;1:3f2e0e;6:-;1:654b17;1:bc8927;1:a27924;2:8c661e;3:bc8927;1:8c661e;1:3f2e0e;5:-;1:654b17;4:bc8927;1:a27924;1:8c661e;1:bc8927;1:a27924;1:8c661e;1:3f2e0e;4:-;1:654b17;6:bc8927;1:a27924;1:bc8927;1:8c661e;1:654b17;1:3f2e0e;3:-;1:654b17;1:8c661e;1:a27924;2:8c661e;4:bc8927;2:8c661e;1:4c3811;1:3f2e0e;3:-;1:654b17;3:bc8927;1:a27924;1:8c661e;2:bc8927;2:8c661e;1:654b17;1:3f2e0e;3:-;1:654b17;1:8c661e;4:bc8927;1:a27924;1:bc8927;2:8c661e;1:654b17;1:3f2e0e;4:-;1:654b17;1:a27924;5:bc8927;2:8c661e;1:654b17;1:3f2e0e;5:-;1:654b17;2:a27924;3:bc8927;2:8c661e;1:654b17;1:3f2e0e;6:-;1:574114;1:8c661e;2:a27924;3:8c661e;1:654b17;1:3f2e0e;7:-;1:574114;1:654b17;4:8c661e;1:654b17;1:3f2e0e;9:-;1:4c3811;3:654b17;1:4c3811;1:3f2e0e;11:-;1:4c3811;3:3f2e0e;9:-"}, apple = {w=16,h=16,d="25:-;1:752802;14:-;1:7e370e;1:542409;14:-;1:752802;12:-;2:9c1017;1:752802;1:542409;2:752802;8:-;1:9c1017;1:b4131e;1:ff969d;1:b4131e;1:542409;1:9c1017;1:dd1725;1:b4131e;2:752802;5:-;1:9c1017;1:b4131e;1:ff1c2b;1:ff5e69;3:ff969d;1:ff5e69;1:ff1c2b;1:b4131e;2:752802;4:-;1:9c1017;1:b4131e;6:ff1c2b;1:dd1725;1:ff1c2b;1:b4131e;1:752802;4:-;1:9c1017;1:b4131e;1:dd1725;1:ff1c2b;1:dd1725;1:ff1c2b;3:dd1725;1:ff1c2b;1:dd1725;1:54090e;4:-;1:752802;2:b4131e;2:dd1725;2:b4131e;1:dd1725;1:b4131e;1:ff1c2b;1:dd1725;1:54090e;4:-;1:752802;5:b4131e;1:dd1725;2:b4131e;1:ff1c2b;1:b4131e;1:54090e;5:-;1:752802;2:b4131e;1:dd1725;3:b4131e;1:dd1725;1:b4131e;1:54090e;6:-;1:752802;1:9c1017;3:b4131e;2:dd1725;1:b4131e;1:9c1017;1:54090e;7:-;1:54090e;1:9c1017;1:b4131e;2:9c1017;1:b4131e;1:9c1017;1:54090e;9:-;1:54090e;3:752802;2:54090e;21:-"}, stick = {w=16,h=16,d="45:-;1:493615;1:281e0b;13:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:684e1e;1:281e0b;12:-;1:493615;1:896727;1:281e0b;12:-;1:493615;1:896727;1:281e0b;13:-;2:281e0b;28:-"}, coal = {w=16,h=16,d="37:-;4:1c1c1e;11:-;1:1c1c1e;1:2e2e2e;2:323232;1:2e2e2e;1:1c1c1e;9:-;1:1c1c1e;1:252525;1:363636;1:393e46;1:323232;2:252525;1:1c1c1e;8:-;1:1c1c1e;1:363636;1:252525;1:323232;1:2e2e2e;1:323232;1:2e2e2e;1:252525;1:1c1c1e;7:-;1:1c1c1e;2:261e24;1:252525;1:363636;1:393e46;1:363636;1:323232;1:252525;1:1c1c1e;5:-;1:1c1c1e;1:252525;1:2e2e2e;1:252525;1:261e24;1:252525;2:363636;1:2e2e2e;1:252525;1:323232;1:101015;4:-;1:1c1c1e;1:2e2e2e;1:393e46;1:323232;1:252525;3:2e2e2e;1:252525;1:261e24;1:252525;1:101015;4:-;1:1c1c1e;1:252525;3:2e2e2e;3:252525;1:2e2e2e;3:261e24;1:101015;3:-;1:1c1c1e;3:252525;1:261e24;1:252525;1:2e2e2e;1:261e24;1:252525;1:1f1721;1:252525;1:1f1721;1:101015;3:-;1:1c1c1e;1:1f1721;1:261e24;1:252525;5:261e24;1:1f1721;1:261e24;1:1f1721;1:101015;4:-;1:101015;2:1f1721;1:261e24;1:252525;1:1f1721;2:261e24;2:1f1721;1:101015;6:-;1:101015;4:1f1721;4:101015;8:-;4:101015;23:-"}, iron_ingot = {w=16,h=16,d="42:-;2:5e5e5e;11:-;3:5e5e5e;2:a8a8a8;1:727272;7:-;3:5e5e5e;1:a8a8a8;4:d8d8d8;1:a8a8a8;1:727272;3:-;3:5e5e5e;1:a8a8a8;8:d8d8d8;1:a8a8a8;1:727272;1:-;1:5e5e5e;1:ffffff;10:d8d8d8;2:ffffff;1:d8d8d8;1:727272;1:5e5e5e;1:a8a8a8;1:ffffff;6:d8d8d8;3:ffffff;1:d8d8d8;1:727272;1:a8a8a8;1:353535;1:5e5e5e;2:a8a8a8;1:ffffff;2:d8d8d8;3:ffffff;1:d8d8d8;1:828282;2:727272;1:828282;1:a8a8a8;1:353535;1:5e5e5e;3:a8a8a8;2:ffffff;1:d8d8d8;1:828282;4:727272;3:a8a8a8;1:353535;1:5e5e5e;1:828282;2:a8a8a8;1:d8d8d8;1:828282;4:727272;2:a8a8a8;1:828282;2:353535;2:-;1:5e5e5e;1:828282;1:a8a8a8;1:d8d8d8;1:828282;2:727272;2:828282;3:353535;5:-;1:5e5e5e;1:828282;1:a8a8a8;1:828282;1:585858;3:353535;9:-;2:5e5e5e;2:353535;41:-"}, diamond = {w=16,h=16,d="38:-;4:11727a;11:-;1:11727a;3:ffffff;1:d5fff6;1:11727a;9:-;1:11727a;1:ffffff;2:4aedd9;1:a1fbe8;1:d5fff6;1:20c5b5;1:145e53;7:-;1:11727a;1:ffffff;1:4aedd9;2:a1fbe8;1:d5fff6;1:a1fbe8;1:4aedd9;1:20c5b5;1:145e53;6:-;1:11727a;1:ffffff;1:4aedd9;1:ffffff;1:d5fff6;1:ffffff;1:d5fff6;2:4aedd9;1:145e53;5:-;1:11727a;1:ffffff;1:4aedd9;1:ffffff;2:4aedd9;2:a1fbe8;1:1aaaa7;1:20c5b5;1:1aaaa7;1:145e53;4:-;1:11727a;1:ffffff;1:4aedd9;1:d5fff6;1:4aedd9;3:a1fbe8;1:1c919a;1:20c5b5;1:1aaaa7;1:145e53;4:-;1:11727a;2:ffffff;1:20c5b5;3:a1fbe8;1:4aedd9;1:1c919a;2:1aaaa7;1:145e53;4:-;1:11727a;1:d5fff6;2:4aedd9;4:1aaaa7;2:20c5b5;1:1c919a;1:145e53;5:-;1:145e53;1:4aedd9;1:1aaaa7;4:20c5b5;1:1aaaa7;1:20c5b5;1:145e53;6:-;1:145e53;1:2ce0d8;1:1aaaa7;4:20c5b5;1:1aaaa7;1:a1fbe8;1:145e53;7:-;1:145e53;1:1c919a;2:4aedd9;2:a1fbe8;1:20c5b5;1:145e53;9:-;6:145e53;21:-"}, bucket = {w=16,h=16,d="21:-;6:353535;8:-;2:353535;1:727272;3:969696;2:a8a8a8;2:353535;5:-;1:353535;2:727272;3:5f5f5f;3:727272;1:969696;1:727272;1:353535;4:-;1:353535;1:5f5f5f;3:545454;1:5f5f5f;4:727272;1:5f5f5f;1:353535;4:-;3:353535;2:545454;2:5f5f5f;2:727272;3:353535;4:-;1:353535;1:d8d8d8;1:a8a8a8;6:353535;1:727272;1:969696;1:353535;4:-;1:353535;4:d8d8d8;2:a8a8a8;1:969696;2:727272;1:969696;1:353535;4:-;1:353535;2:d8d8d8;1:ffffff;1:d8d8d8;2:a8a8a8;1:969696;2:727272;1:a8a8a8;1:353535;4:-;1:353535;1:a8a8a8;1:d8d8d8;1:ffffff;1:d8d8d8;2:a8a8a8;1:969696;2:727272;1:a8a8a8;1:353535;4:-;1:353535;1:727272;1:d8d8d8;1:ffffff;1:d8d8d8;2:a8a8a8;1:969696;2:727272;1:969696;1:353535;5:-;1:353535;3:d8d8d8;2:a8a8a8;1:969696;1:727272;1:969696;1:353535;6:-;1:353535;1:a8a8a8;2:d8d8d8;1:a8a8a8;2:969696;1:727272;1:969696;1:353535;7:-;1:353535;1:a8a8a8;1:d8d8d8;1:a8a8a8;1:969696;1:727272;1:969696;1:353535;9:-;6:353535;21:-"}, torch = {w=16,h=16,d="103:-;1:ffd800;1:ff8f00;14:-;1:ffff97;1:ffffff;14:-;1:9f7f50;1:6d5736;14:-;1:957546;1:55452e;14:-;1:9f7f50;1:423522;14:-;1:9f7f50;1:55452e;14:-;1:957546;1:55452e;14:-;1:6d5736;1:3d301d;14:-;1:9f7f50;1:3b2e1b;14:-;1:6d5736;1:372a17;7:-"}, ladder = {w=16,h=16,d="2:-;1:967441;1:513d24;8:-;1:967441;1:513d24;3:-;1:7e6237;1:b58d50;1:7e6237;1:967441;1:b58d50;1:967441;4:b58d50;1:967441;1:b58d50;1:7e6237;1:b58d50;2:-;1:67502c;1:7e6237;1:67502c;1:513d24;6:67502c;1:513d24;1:7e6237;2:67502c;3:-;1:513d24;1:3a2f1e;8:-;1:513d24;1:3a2f1e;4:-;1:967441;1:513d24;8:-;1:967441;1:513d24;3:-;2:b58d50;1:7e6237;1:967441;3:b58d50;1:967441;1:b58d50;2:967441;1:b58d50;1:7e6237;1:b58d50;2:-;1:67502c;1:7e6237;1:67502c;1:513d24;6:67502c;1:513d24;1:7e6237;2:67502c;3:-;1:513d24;1:3a2f1e;8:-;1:513d24;1:3a2f1e;4:-;1:967441;1:513d24;8:-;1:967441;1:513d24;3:-;2:b58d50;1:7e6237;1:967441;6:b58d50;1:967441;1:b58d50;2:7e6237;2:-;1:67502c;1:7e6237;1:67502c;1:513d24;6:67502c;1:513d24;1:7e6237;2:67502c;3:-;1:513d24;1:3a2f1e;8:-;1:513d24;1:3a2f1e;4:-;1:967441;1:513d24;8:-;1:967441;1:513d24;3:-;2:b58d50;1:7e6237;1:967441;1:b58d50;1:967441;4:b58d50;1:967441;1:b58d50;1:7e6237;1:b58d50;2:-;1:67502c;1:7e6237;1:67502c;1:513d24;6:67502c;1:513d24;1:7e6237;2:67502c;3:-;1:513d24;1:3a2f1e;8:-;1:513d24;1:3a2f1e;2:-"}, } local BTEX = { stone = {w=16,h=16,d="4:8f8f8f;1:7f7f7f;2:747474;1:7f7f7f;1:747474;1:686868;2:747474;6:7f7f7f;1:747474;1:7f7f7f;1:747474;6:7f7f7f;2:686868;1:747474;1:7f7f7f;1:747474;1:7f7f7f;1:747474;2:686868;3:747474;1:686868;3:747474;7:7f7f7f;2:8f8f8f;1:7f7f7f;1:8f8f8f;2:7f7f7f;2:8f8f8f;3:7f7f7f;4:747474;2:7f7f7f;3:747474;1:7f7f7f;1:747474;1:7f7f7f;4:8f8f8f;1:747474;3:7f7f7f;1:8f8f8f;7:7f7f7f;2:747474;1:686868;1:747474;1:686868;1:747474;1:8f8f8f;1:747474;2:7f7f7f;3:8f8f8f;1:747474;2:8f8f8f;3:747474;4:7f7f7f;2:747474;2:686868;1:747474;1:686868;2:747474;2:7f7f7f;3:747474;3:7f7f7f;3:8f8f8f;1:7f7f7f;1:8f8f8f;2:7f7f7f;3:8f8f8f;5:7f7f7f;1:747474;2:7f7f7f;1:8f8f8f;3:7f7f7f;3:8f8f8f;2:7f7f7f;4:8f8f8f;1:7f7f7f;1:686868;1:7f7f7f;1:747474;1:7f7f7f;2:747474;2:686868;1:747474;1:7f7f7f;1:747474;2:7f7f7f;3:747474;5:7f7f7f;2:8f8f8f;5:7f7f7f;2:8f8f8f;1:7f7f7f;1:8f8f8f;1:7f7f7f;3:747474;1:7f7f7f;1:8f8f8f;1:7f7f7f;2:747474;2:7f7f7f;2:686868;1:747474;1:686868;1:747474;2:8f8f8f;1:7f7f7f;2:747474;2:7f7f7f;3:747474;2:7f7f7f;3:747474;1:8f8f8f;1:7f7f7f;2:747474;9:7f7f7f;4:8f8f8f;6:7f7f7f;2:747474;1:7f7f7f;2:8f8f8f;2:7f7f7f;1:747474;2:7f7f7f"}, dirt = {w=16,h=16,d="1:b9855c;2:966c4a;2:79553a;1:b9855c;2:966c4a;2:79553a;1:593d29;2:79553a;1:b9855c;1:79553a;1:b9855c;1:79553a;1:966c4a;1:593d29;2:79553a;1:966c4a;1:878787;1:593d29;1:79553a;1:b9855c;1:966c4a;1:79553a;1:b9855c;1:966c4a;2:593d29;1:b9855c;2:79553a;1:593d29;1:b9855c;3:79553a;1:b9855c;3:79553a;2:593d29;1:b9855c;1:79553a;1:966c4a;1:6c6c6c;1:b9855c;1:79553a;1:966c4a;1:593d29;1:79553a;1:b9855c;2:966c4a;1:79553a;1:966c4a;1:79553a;1:b9855c;1:966c4a;1:79553a;1:966c4a;1:79553a;1:966c4a;1:b9855c;1:593d29;1:966c4a;2:79553a;1:966c4a;1:593d29;1:79553a;1:6c6c6c;1:79553a;1:966c4a;1:593d29;2:79553a;1:593d29;2:966c4a;1:79553a;1:966c4a;3:593d29;2:79553a;1:593d29;3:79553a;2:b9855c;3:79553a;1:878787;2:79553a;2:b9855c;1:79553a;2:b9855c;1:79553a;1:966c4a;1:79553a;1:966c4a;2:79553a;2:b9855c;2:966c4a;2:79553a;1:966c4a;1:593d29;2:966c4a;2:79553a;3:966c4a;2:79553a;1:966c4a;1:79553a;1:966c4a;1:79553a;1:593d29;1:79553a;2:966c4a;3:79553a;1:593d29;2:79553a;1:966c4a;1:593d29;2:79553a;2:593d29;5:79553a;2:b9855c;1:79553a;1:966c4a;1:79553a;1:966c4a;1:79553a;2:b9855c;1:79553a;1:b9855c;1:966c4a;1:593d29;2:b9855c;1:593d29;2:966c4a;1:878787;1:79553a;1:966c4a;2:79553a;2:966c4a;1:b9855c;1:79553a;1:966c4a;1:6c6c6c;2:966c4a;1:79553a;1:593d29;1:966c4a;1:79553a;1:593d29;1:79553a;1:593d29;1:966c4a;1:79553a;2:966c4a;1:b9855c;7:79553a;2:b9855c;1:79553a;1:966c4a;2:79553a;1:745844;1:79553a;2:966c4a;1:79553a;1:593d29;1:b9855c;1:593d29;1:79553a;1:b9855c;3:966c4a;1:79553a;1:593d29;1:b9855c;1:79553a;1:593d29;1:79553a;1:593d29;2:b9855c;1:79553a;1:966c4a;2:79553a;3:966c4a;1:79553a;1:b9855c;2:966c4a;1:79553a;1:878787;1:79553a;2:966c4a;2:79553a;2:966c4a;1:79553a;1:593d29"}, cobble = {w=16,h=16,d="1:6e6d6d;1:616161;2:a6a6a6;1:525252;2:616161;1:a6a6a6;1:b5b5b5;1:a6a6a6;1:888788;1:616161;1:888788;1:b5b5b5;1:a6a6a6;1:888788;1:616161;1:a6a6a6;1:b5b5b5;2:888788;1:525252;2:b5b5b5;1:a6a6a6;2:888788;1:525252;1:616161;1:888788;1:6e6d6d;1:888788;1:616161;1:a6a6a6;1:888788;1:a6a6a6;1:6e6d6d;1:616161;1:a6a6a6;2:888788;1:a6a6a6;1:6e6d6d;1:616161;1:525252;1:616161;1:888788;1:6e6d6d;2:616161;1:888788;1:6e6d6d;2:616161;1:888788;1:6e6d6d;1:888788;1:6e6d6d;1:616161;1:888788;1:a6a6a6;1:888788;1:616161;2:525252;1:6e6d6d;1:616161;1:888788;1:b5b5b5;1:a6a6a6;1:616161;1:888788;2:616161;1:b5b5b5;3:a6a6a6;1:888788;1:616161;1:b5b5b5;1:6e6d6d;1:a6a6a6;1:b5b5b5;2:888788;1:6e6d6d;1:616161;1:525252;2:888788;1:b5b5b5;1:a6a6a6;1:888788;1:6e6d6d;1:888788;1:a6a6a6;1:888788;1:616161;1:888788;1:a6a6a6;2:888788;1:6e6d6d;2:616161;1:6e6d6d;1:a6a6a6;1:888788;1:6e6d6d;1:616161;1:b5b5b5;2:888788;2:6e6d6d;2:888788;1:6e6d6d;1:616161;1:888788;1:b5b5b5;1:a6a6a6;1:616161;1:6e6d6d;1:888788;1:616161;1:888788;1:6e6d6d;1:616161;1:b5b5b5;1:a6a6a6;2:6e6d6d;1:616161;1:888788;1:b5b5b5;3:888788;2:616161;1:525252;1:6e6d6d;1:616161;1:b5b5b5;1:a6a6a6;1:888788;1:6e6d6d;1:888788;2:6e6d6d;2:888788;1:616161;1:6e6d6d;1:616161;1:888788;1:a6a6a6;1:616161;1:888788;1:6e6d6d;1:888788;1:6e6d6d;1:888788;2:616161;1:525252;1:616161;2:6e6d6d;1:616161;1:525252;2:a6a6a6;1:b5b5b5;1:888788;2:6e6d6d;2:616161;1:6e6d6d;1:888788;1:b5b5b5;1:a6a6a6;2:616161;1:525252;1:888788;2:b5b5b5;1:888788;1:6e6d6d;1:888788;1:b5b5b5;1:a6a6a6;1:6e6d6d;1:616161;1:b5b5b5;1:a6a6a6;1:888788;1:a6a6a6;1:6e6d6d;1:616161;2:888788;1:6e6d6d;1:888788;1:616161;1:b5b5b5;1:a6a6a6;2:888788;1:616161;1:a6a6a6;1:888788;1:6e6d6d;2:888788;1:6e6d6d;2:616161;1:888788;1:6e6d6d;2:a6a6a6;1:888788;1:6e6d6d;1:888788;1:6e6d6d;1:616161;1:6e6d6d;2:888788;1:6e6d6d;1:616161;1:a6a6a6;1:888788;3:616161;1:888788;2:616161;1:6e6d6d;1:888788;1:6e6d6d;1:616161;1:6e6d6d;2:616161;1:888788;1:b5b5b5;1:a6a6a6;1:888788;1:6e6d6d"}, planks = {w=16,h=16,d="1:b8945f;1:af8f55;1:b8945f;5:c29d62;1:b8945f;5:c29d62;1:b8945f;1:967441;2:b8945f;2:af8f55;1:967441;1:9f844d;1:af8f55;3:b8945f;2:af8f55;2:b8945f;2:9f844d;1:af8f55;3:b8945f;1:af8f55;1:b8945f;1:af8f55;4:9f844d;2:af8f55;2:b8945f;2:967441;2:7e6237;2:967441;1:7e6237;2:67502c;2:7e6237;1:67502c;1:7e6237;2:67502c;1:7e6237;1:67502c;1:b8945f;1:c29d62;1:9f844d;4:c29d62;1:9f844d;3:c29d62;1:b8945f;2:af8f55;1:9f844d;1:b8945f;1:af8f55;2:b8945f;1:af8f55;1:9f844d;1:af8f55;1:9f844d;1:967441;1:9f844d;2:af8f55;4:b8945f;1:af8f55;2:9f844d;1:af8f55;1:b8945f;3:af8f55;1:967441;3:b8945f;2:af8f55;3:9f844d;2:67502c;2:7e6237;1:967441;1:7e6237;4:67502c;3:7e6237;1:967441;1:7e6237;1:67502c;1:b8945f;2:c29d62;1:b8945f;2:af8f55;8:c29d62;1:b8945f;1:9f844d;1:b8945f;1:af8f55;4:b8945f;1:af8f55;3:9f844d;1:af8f55;1:9f844d;1:af8f55;2:9f844d;1:967441;1:c29d62;1:b8945f;2:af8f55;4:9f844d;4:af8f55;2:9f844d;1:b8945f;1:9f844d;2:67502c;1:7e6237;2:967441;1:7e6237;3:67502c;1:7e6237;1:967441;2:7e6237;3:67502c;1:c29d62;1:9f844d;1:b8945f;2:c29d62;2:b8945f;1:9f844d;3:c29d62;1:9f844d;1:c29d62;1:b8945f;2:c29d62;2:af8f55;2:b8945f;2:9f844d;1:af8f55;2:9f844d;2:b8945f;1:af8f55;1:b8945f;4:af8f55;2:9f844d;1:af8f55;1:b8945f;1:af8f55;1:9f844d;1:967441;2:b8945f;1:af8f55;5:9f844d;1:67502c;2:7e6237;2:67502c;1:7e6237;3:967441;1:7e6237;1:67502c;1:7e6237;4:67502c"}, log = {w=16,h=16,d="1:745a36;1:4c3d26;1:917142;2:745a36;1:382b18;1:917142;2:745a36;1:382b18;1:745a36;1:917142;1:4c3d26;1:917142;1:745a36;1:5f4a2b;1:745a36;1:4c3d26;1:987849;1:5f4a2b;1:745a36;1:382b18;1:987849;1:5f4a2b;1:745a36;1:382b18;1:745a36;1:917142;1:4c3d26;2:745a36;1:5f4a2b;1:745a36;1:382b18;2:5f4a2b;1:745a36;1:382b18;1:987849;1:5f4a2b;1:745a36;1:4c3d26;1:745a36;2:4c3d26;2:745a36;1:5f4a2b;1:917142;1:382b18;1:745a36;1:5f4a2b;1:745a36;1:4c3d26;1:745a36;1:5f4a2b;1:745a36;1:5f4a2b;1:745a36;1:382b18;1:4c3d26;1:745a36;1:917142;1:5f4a2b;1:917142;1:4c3d26;1:745a36;1:5f4a2b;1:745a36;1:382b18;1:745a36;1:5f4a2b;1:987849;1:5f4a2b;1:745a36;1:5f4a2b;1:745a36;1:4c3d26;1:917142;1:745a36;1:917142;1:745a36;1:4c3d26;1:745a36;1:917142;1:4c3d26;1:745a36;1:4c3d26;1:987849;1:5f4a2b;1:917142;1:4c3d26;1:745a36;1:4c3d26;1:917142;1:745a36;1:5f4a2b;1:745a36;1:4c3d26;1:745a36;1:917142;2:5f4a2b;1:745a36;1:917142;1:745a36;1:917142;2:745a36;1:4c3d26;1:917142;1:745a36;1:5f4a2b;1:745a36;1:382b18;1:745a36;1:917142;1:745a36;1:5f4a2b;1:917142;2:745a36;1:917142;1:5f4a2b;1:745a36;1:5f4a2b;1:917142;2:745a36;1:4c3d26;1:382b18;1:987849;2:745a36;1:5f4a2b;1:917142;1:745a36;1:5f4a2b;1:917142;1:5f4a2b;1:917142;1:5f4a2b;1:917142;3:745a36;1:4c3d26;1:987849;2:745a36;1:5f4a2b;2:745a36;1:5f4a2b;1:917142;1:4c3d26;1:917142;1:745a36;1:382b18;4:745a36;1:917142;1:745a36;1:5f4a2b;1:745a36;1:382b18;1:745a36;1:5f4a2b;1:745a36;1:4c3d26;1:917142;1:745a36;1:382b18;2:745a36;1:4c3d26;1:745a36;1:917142;1:745a36;1:5f4a2b;1:745a36;1:382b18;1:987849;2:745a36;1:382b18;1:987849;1:745a36;1:4c3d26;1:745a36;1:987849;1:4c3d26;2:745a36;1:917142;1:5f4a2b;1:917142;1:382b18;1:987849;1:5f4a2b;1:745a36;1:382b18;2:745a36;1:5f4a2b;1:745a36;1:987849;1:745a36;1:4c3d26;1:745a36;1:917142;2:745a36;1:4c3d26;1:917142;1:5f4a2b;1:745a36;1:4c3d26;4:745a36;1:917142;1:745a36;1:4c3d26;1:917142;2:745a36;1:917142;1:382b18;1:745a36;1:4c3d26;1:745a36;2:4c3d26;1:917142;2:745a36;1:917142;1:745a36;1:4c3d26;1:917142;1:4c3d26;1:745a36;1:917142;1:4c3d26;1:745a36;1:4c3d26;2:745a36;1:4c3d26;1:917142;1:745a36;1:5f4a2b"}, log_top = {w=16,h=16,d="1:5f4a2b;1:4c3d26;1:5f4a2b;1:745a36;1:5f4a2b;1:4c3d26;2:5f4a2b;1:745a36;1:4c3d26;2:5f4a2b;1:4c3d26;3:5f4a2b;1:4c3d26;4:b8945f;1:af8f55;1:b8945f;1:af8f55;1:c29d62;2:af8f55;4:b8945f;1:4c3d26;1:5f4a2b;1:b8945f;2:7e6237;2:967441;1:9f844d;1:967441;4:9f844d;2:967441;1:c29d62;2:5f4a2b;1:b8945f;1:7e6237;2:c29d62;4:b8945f;1:af8f55;3:b8945f;1:967441;1:b8945f;2:5f4a2b;1:af8f55;1:967441;1:b8945f;8:af8f55;1:b8945f;1:9f844d;1:af8f55;1:5f4a2b;1:4c3d26;1:b8945f;1:9f844d;1:b8945f;1:af8f55;2:967441;2:9f844d;2:967441;1:af8f55;1:b8945f;1:967441;1:af8f55;1:4c3d26;1:5f4a2b;1:af8f55;1:967441;2:af8f55;1:7e6237;4:af8f55;1:967441;2:af8f55;1:967441;1:b8945f;2:5f4a2b;1:af8f55;1:9f844d;1:b8945f;1:af8f55;1:967441;1:af8f55;2:9f844d;1:af8f55;1:9f844d;1:af8f55;1:b8945f;1:9f844d;1:af8f55;2:5f4a2b;1:af8f55;1:9f844d;1:b8945f;1:af8f55;1:967441;1:af8f55;1:9f844d;1:967441;1:af8f55;1:967441;1:af8f55;1:b8945f;1:967441;1:af8f55;1:5f4a2b;1:4c3d26;1:af8f55;1:9f844d;1:b8945f;1:af8f55;1:967441;4:af8f55;1:9f844d;2:af8f55;1:967441;1:af8f55;1:4c3d26;1:5f4a2b;1:af8f55;1:967441;1:b8945f;1:af8f55;2:967441;1:7e6237;1:967441;2:9f844d;1:af8f55;1:b8945f;1:9f844d;1:af8f55;2:5f4a2b;1:af8f55;1:9f844d;1:b8945f;8:af8f55;1:b8945f;1:967441;1:af8f55;1:5f4a2b;1:4c3d26;1:b8945f;1:9f844d;2:b8945f;1:af8f55;5:b8945f;1:c29d62;1:b8945f;1:967441;1:af8f55;1:4c3d26;1:5f4a2b;1:b8945f;1:9f844d;1:967441;1:9f844d;9:967441;1:b8945f;2:5f4a2b;3:b8945f;2:af8f55;1:b8945f;2:af8f55;1:c29d62;2:af8f55;3:b8945f;2:5f4a2b;1:4c3d26;3:5f4a2b;1:4c3d26;2:5f4a2b;1:745a36;1:4c3d26;2:5f4a2b;1:4c3d26;1:745a36;2:5f4a2b"}, grass_top = {w=16,h=16,d="1:546d33;1:6e9044;1:536c33;2:4c632e;1:516931;1:485e2c;1:4f6730;1:597537;1:556f34;1:4e6630;1:4c642f;1:4d652f;1:5e7b3a;1:3f5327;1:506831;1:546e34;1:4f6730;1:5a7637;1:556f34;1:577135;1:485e2c;1:577135;1:49602d;1:485e2c;1:607d3a;1:5e7b39;1:536c33;1:6e9044;1:4f6730;1:4c642f;1:4f6730;1:5c7838;1:506831;1:475c2b;1:4b612e;1:4d652f;1:4d642f;2:516a32;1:546d33;1:5a7537;1:5f7c3a;1:62803c;1:4c642f;1:435829;1:485e2c;1:67863f;1:435729;1:4b622e;1:4e6630;1:556f34;1:526b32;1:577135;1:475c2b;1:536c32;1:485e2c;1:4a612d;1:506831;1:556f34;1:516931;1:4f6730;1:5e7b3a;1:475c2b;1:5c7838;1:4a612d;1:62803c;1:4a612d;1:617f3c;1:62803c;1:4d642f;1:617f3c;1:698940;1:425628;1:485e2c;1:5e7b3a;1:617e3b;1:475d2b;1:4d642f;1:506831;1:577135;1:567035;1:445829;1:5e7b39;1:495f2d;1:556f34;1:546e34;1:587236;1:4c642f;1:546e34;1:4d642f;1:4a612d;1:445829;1:4d642f;1:506931;1:546d33;1:475d2b;1:587336;1:5d7a39;1:516a32;1:536c32;1:4a612d;1:4e6630;1:485e2c;1:4b612e;1:4c642f;1:66863f;1:617f3c;1:526b32;1:5e7b3a;1:556f34;2:516931;1:4c642f;1:597436;1:4f6730;1:516a32;1:465b2b;1:5d7939;1:4b612e;1:556f34;1:62803c;1:4c642f;1:495f2d;1:516931;1:5a7637;1:485e2c;1:607d3a;1:5e7b3a;1:587236;1:67863f;1:607e3b;1:617f3c;1:495f2d;1:62803c;1:587336;1:65843e;1:607e3b;1:49602d;1:536c32;1:4b622e;1:536c33;1:597537;1:475d2b;1:556f34;1:49602d;1:68873f;1:506831;1:4f6730;1:567035;1:607e3b;1:485e2c;1:4c642f;1:526b32;1:536c32;1:607d3a;1:506931;1:65843e;1:516931;1:495f2d;1:587236;1:597537;1:556f34;1:5d7a39;1:49602d;1:67863f;1:506931;1:536c33;1:6d8e43;1:44592a;1:5e7b3a;1:4a612d;1:516931;1:4d642f;1:556f34;1:516931;1:4b612e;1:62803c;1:4c632e;1:5c7838;1:556f34;1:4b612e;1:536c32;1:4d652f;1:556f34;1:536c32;1:4f6730;1:455b2a;1:65843e;1:485e2c;1:475c2b;1:4e6630;1:698940;1:556f34;1:495f2d;1:4e6630;1:577135;1:526b32;1:4b622e;1:455a2a;1:4e6630;1:526b32;1:4e6630;1:475c2b;1:5a7537;1:5d7a39;1:44592a;1:556f34;1:495f2d;1:5f7c3a;1:435729;1:536c32;1:475c2b;1:577135;1:495f2d;1:6e9044;1:5b7738;1:536c33;1:5f7c3a;1:587236;1:5a7637;1:4d642f;1:5f7c3a;1:62803c;1:5c7838;1:5b7738;1:6d8e43;1:455b2a;1:65843e;1:617e3b;1:546d33;1:536c33;1:475d2b;2:546e34;1:4c642f;1:607d3a;1:597436;1:4f6730;1:44592a;1:4b622e;1:556f34;1:4d642f;1:4d652f;1:5d7939;1:567035;1:546d33;1:536c33;1:506931;1:6c8d42;1:465b2b;1:607d3a;1:4b612e;1:516a32;1:4d642f;1:597537"}, grass_side = {w=16,h=16,d="1:607d3a;1:516a32;1:556f34;1:4f6730;1:607d3a;1:516a32;1:607d3a;2:556f34;1:5a7537;1:607d3a;1:5a7537;1:65833e;1:495f2d;1:5a7537;1:556f34;1:607d3a;1:4f6730;1:607d3a;1:516a32;1:65833e;1:593d29;1:607d3a;1:49602d;1:65833e;1:556f34;1:607d3a;1:536c33;1:607d3a;1:4f6730;1:607d3a;1:4f6730;1:556f34;1:593d29;1:65833e;1:4b612e;1:607d3a;1:593d29;1:516a32;1:593d29;1:607d3a;1:5a7537;1:556f34;1:62803c;1:593d29;1:435829;1:556f34;2:593d29;1:6c6c6c;2:593d29;1:526b32;3:593d29;1:485e2c;1:593d29;1:506831;1:593d29;1:79553a;2:593d29;1:79553a;1:966c4a;1:79553a;1:966c4a;1:b9855c;1:593d29;1:966c4a;2:79553a;3:593d29;1:6c6c6c;1:79553a;1:966c4a;1:593d29;2:79553a;1:593d29;2:966c4a;1:79553a;1:966c4a;3:593d29;2:79553a;1:593d29;3:79553a;2:b9855c;3:79553a;1:878787;2:79553a;2:b9855c;1:79553a;2:b9855c;1:79553a;1:966c4a;1:79553a;1:966c4a;2:79553a;2:b9855c;2:966c4a;2:79553a;1:966c4a;1:593d29;2:966c4a;2:79553a;3:966c4a;2:79553a;1:966c4a;1:79553a;1:966c4a;1:79553a;1:593d29;1:79553a;2:966c4a;3:79553a;1:593d29;2:79553a;1:966c4a;1:593d29;2:79553a;2:593d29;5:79553a;2:b9855c;1:79553a;1:966c4a;1:79553a;1:966c4a;1:79553a;2:b9855c;1:79553a;1:b9855c;1:966c4a;1:593d29;2:b9855c;1:593d29;2:966c4a;1:878787;1:79553a;1:966c4a;2:79553a;2:966c4a;1:b9855c;1:79553a;1:966c4a;1:6c6c6c;2:966c4a;1:79553a;1:593d29;1:966c4a;1:79553a;1:593d29;1:79553a;1:593d29;1:966c4a;1:79553a;2:966c4a;1:b9855c;7:79553a;2:b9855c;1:79553a;1:966c4a;2:79553a;1:745844;1:79553a;2:966c4a;1:79553a;1:593d29;1:b9855c;1:593d29;1:79553a;1:b9855c;3:966c4a;1:79553a;1:593d29;1:b9855c;1:79553a;1:593d29;1:79553a;1:593d29;2:b9855c;1:79553a;1:966c4a;2:79553a;3:966c4a;1:79553a;1:b9855c;2:966c4a;1:79553a;1:878787;1:79553a;2:966c4a;2:79553a;2:966c4a;1:79553a;1:593d29"}, ct_top = {w=16,h=16,d="1:19140c;2:0e0b06;1:19140c;1:41230e;6:733920;1:41230e;1:1a150d;1:0e0b06;1:1a150d;1:19140c;1:0e0b06;2:bc9862;1:41230e;1:9e5932;6:ae693c;1:9e5932;1:41230e;2:bc9862;2:0e0b06;1:bc9862;1:41230e;10:ae693c;1:41230e;1:bc9862;1:0e0b06;1:19140c;1:41230e;1:ae693c;1:553824;1:4b2b18;3:553824;4:4b2b18;1:553824;1:ae693c;1:41230e;1:19140c;1:41230e;1:9e5932;1:ae693c;1:553824;1:9e5932;1:ae693c;1:553824;2:ae693c;1:4b2b18;2:ae693c;1:553824;1:ae693c;1:9e5932;1:41230e;1:733920;2:ae693c;1:553824;2:ae693c;1:4b2b18;1:9e5932;1:ae693c;1:553824;1:9e5932;1:ae693c;1:553824;2:ae693c;2:733920;2:ae693c;2:553824;1:4b2b18;2:553824;1:4b2b18;2:553824;1:4b2b18;1:553824;2:ae693c;2:733920;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;2:733920;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;1:553824;2:ae693c;2:733920;2:ae693c;3:4b2b18;1:553824;2:4b2b18;2:553824;1:4b2b18;1:553824;2:ae693c;2:733920;2:ae693c;1:4b2b18;1:9e5932;1:ae693c;1:4b2b18;1:ae693c;1:9e5932;1:4b2b18;2:ae693c;1:553824;2:ae693c;1:733920;1:41230e;1:9e5932;1:ae693c;1:553824;1:9e5932;1:ae693c;1:4b2b18;2:ae693c;1:4b2b18;1:9e5932;1:ae693c;1:553824;1:ae693c;1:9e5932;1:41230e;1:1a150d;1:41230e;1:ae693c;2:553824;1:4b2b18;7:553824;1:ae693c;1:41230e;1:1a150d;1:0e0b06;1:bc9862;1:41230e;10:ae693c;1:41230e;1:bc9862;1:0e0b06;1:1a150d;2:bc9862;1:41230e;1:9e5932;6:ae693c;1:9e5932;1:41230e;2:bc9862;1:1a150d;1:19140c;1:1a150d;1:0e0b06;1:1a150d;1:41230e;6:733920;1:41230e;1:19140c;2:0e0b06;1:19140c"}, ct_front = {w=16,h=16,d="1:19140c;1:af8f55;1:b8945f;2:c29d62;1:382116;1:733920;2:4b2b18;1:733920;1:382116;3:c29d62;1:b8945f;2:19140c;1:b8945f;2:af8f55;1:967441;1:9f844d;1:382116;2:4b2b18;1:382116;2:af8f55;2:b8945f;1:9f844d;2:19140c;3:b8945f;1:af8f55;1:b8945f;1:af8f55;2:382116;2:9f844d;2:af8f55;2:b8945f;2:19140c;2:7e6237;2:967441;1:7e6237;1:67502c;2:1b160d;1:7e6237;1:67502c;3:41230e;1:7e6237;2:19140c;1:c29d62;1:9f844d;4:c29d62;2:4b2b18;2:c29d62;1:281e0b;1:af8f55;1:281e0b;1:9f844d;2:19140c;2:b8945f;1:41230e;1:9f844d;1:af8f55;1:9f844d;2:382116;2:af8f55;3:281e0b;1:b8945f;2:19140c;1:9f844d;1:af8f55;1:281e0b;3:af8f55;2:382116;2:b8945f;3:b5b5b5;1:9f844d;2:19140c;1:67502c;1:7e6237;1:281e0b;1:967441;1:7e6237;1:67502c;2:1b160d;1:67502c;1:7e6237;1:ffffff;2:d8d8d8;1:7e6237;2:19140c;2:c29d62;1:281e0b;2:af8f55;1:c29d62;2:4b2b18;2:c29d62;1:ffffff;2:d8d8d8;1:b8945f;2:19140c;1:af8f55;3:d8d8d8;1:b8945f;1:af8f55;2:382116;1:9f844d;1:af8f55;1:9f844d;2:d8d8d8;1:9f844d;2:19140c;1:b8945f;1:b5b5b5;1:d8d8d8;1:ffffff;2:9f844d;2:382116;3:af8f55;1:ffffff;1:d8d8d8;1:b8945f;2:19140c;1:67502c;1:7e6237;2:967441;1:7e6237;1:67502c;2:110e08;1:7e6237;1:967441;2:7e6237;1:d8d8d8;1:67502c;2:19140c;1:9f844d;1:b8945f;2:c29d62;2:b8945f;2:4b2b18;2:c29d62;1:9f844d;1:c29d62;1:ffffff;1:c29d62;2:19140c;1:af8f55;2:b8945f;2:9f844d;1:af8f55;2:382116;2:b8945f;1:af8f55;1:b8945f;2:af8f55;2:19140c;2:9f844d;1:af8f55;1:b8945f;1:af8f55;1:9f844d;2:382116;1:b8945f;1:af8f55;4:9f844d;1:19140c;1:1b160d;2:7e6237;2:67502c;1:7e6237;1:967441;1:19140c;1:1b160d;1:7e6237;1:67502c;1:7e6237;3:67502c;1:1b160d"}, ct_side = {w=16,h=16,d="1:19140c;1:af8f55;1:b8945f;2:c29d62;1:382116;1:733920;2:4b2b18;1:733920;1:382116;3:c29d62;1:b8945f;2:19140c;1:b8945f;2:af8f55;1:967441;1:9f844d;1:382116;2:4b2b18;1:382116;2:af8f55;2:b8945f;1:9f844d;2:19140c;3:b8945f;1:af8f55;1:b8945f;1:af8f55;2:262012;2:9f844d;2:af8f55;2:b8945f;2:19140c;2:7e6237;2:967441;1:7e6237;1:67502c;2:1b160d;1:7e6237;1:67502c;1:7e6237;2:67502c;1:7e6237;2:19140c;1:c29d62;1:9f844d;4:c29d62;2:4b2b18;2:c29d62;1:b8945f;2:af8f55;1:9f844d;2:19140c;2:b8945f;1:41230e;1:9f844d;1:41230e;1:9f844d;2:382116;2:af8f55;4:b8945f;2:19140c;1:9f844d;1:af8f55;1:281e0b;1:af8f55;1:281e0b;1:af8f55;2:382116;2:b8945f;2:af8f55;2:9f844d;2:19140c;1:67502c;2:7e6237;1:d8d8d8;1:7e6237;1:67502c;2:1b160d;1:67502c;3:7e6237;1:967441;1:7e6237;2:19140c;2:c29d62;1:d8d8d8;1:af8f55;1:d8d8d8;1:c29d62;2:4b2b18;5:c29d62;1:b8945f;2:19140c;1:af8f55;1:b8945f;1:b5b5b5;1:b8945f;1:b5b5b5;1:af8f55;2:382116;1:9f844d;1:af8f55;1:9f844d;1:af8f55;2:9f844d;2:19140c;1:b8945f;2:af8f55;3:9f844d;2:382116;3:af8f55;2:9f844d;1:b8945f;2:19140c;1:67502c;1:7e6237;2:967441;1:7e6237;1:67502c;2:110e08;1:7e6237;1:967441;2:7e6237;2:67502c;2:19140c;1:9f844d;1:b8945f;2:c29d62;2:b8945f;2:4b2b18;2:c29d62;1:9f844d;1:c29d62;1:b8945f;1:c29d62;2:19140c;1:af8f55;2:b8945f;2:9f844d;1:af8f55;2:382116;2:b8945f;1:af8f55;1:b8945f;2:af8f55;2:19140c;2:9f844d;1:af8f55;1:b8945f;1:af8f55;1:9f844d;2:382116;1:b8945f;1:af8f55;4:9f844d;1:19140c;1:1b160d;2:7e6237;2:67502c;1:7e6237;1:967441;1:19140c;1:1b160d;1:7e6237;1:67502c;1:7e6237;3:67502c;1:1b160d"}, } local PALETTE = { A = Color3.fromRGB(43, 30, 13), B = Color3.fromRGB(51, 36, 17), C = Color3.fromRGB(129, 83, 57), D = Color3.fromRGB(63, 42, 21), E = Color3.fromRGB(118, 75, 51), F = Color3.fromRGB(144, 89, 63), G = Color3.fromRGB(143, 94, 62), H = Color3.fromRGB(73, 37, 16), I = Color3.fromRGB(36, 24, 8), J = Color3.fromRGB(155, 99, 73), K = Color3.fromRGB(179, 121, 94), L = Color3.fromRGB(183, 131, 107), M = Color3.fromRGB(170, 114, 89), N = Color3.fromRGB(52, 37, 18), O = Color3.fromRGB(255, 255, 255), P = Color3.fromRGB(82, 61, 137), Q = Color3.fromRGB(106, 64, 48), R = Color3.fromRGB(148, 96, 62), S = Color3.fromRGB(119, 66, 53), T = Color3.fromRGB(66, 29, 10), U = Color3.fromRGB(38, 26, 10), V = Color3.fromRGB(58, 49, 137), W = Color3.fromRGB(55, 55, 55), X = Color3.fromRGB(40, 40, 40), Y = Color3.fromRGB(0, 204, 204), Z = Color3.fromRGB(0, 175, 175), a = Color3.fromRGB(0, 164, 164), b = Color3.fromRGB(10, 188, 188), c = Color3.fromRGB(65, 53, 155), d = Color3.fromRGB(70, 58, 165), e = Color3.fromRGB(4, 149, 149), f = Color3.fromRGB(0, 127, 127), g = Color3.fromRGB(5, 136, 136), h = Color3.fromRGB(0, 104, 104), i = Color3.fromRGB(3, 122, 122), j = Color3.fromRGB(74, 74, 74), k = Color3.fromRGB(63, 63, 63), l = Color3.fromRGB(85, 85, 85) } local SKIN = { "........AABAABBACCCCCCCC........................................", "........ABDABDBACCEEEECC........................................", "........ADBABABAFEEEEEEF........................................", "........ABABBBABFEEEEEEF........................................", "........AAABDABDFCEEEECF........................................", "........BBAABADDCFCCCCFG........................................", "........BDBABBBBGCGCGCGC........................................", "........ABBADBAACGHHHHCG........................................", "AABBAIAABBDDDDBAAAIABBAAABAAIABA................................", "ABAAIIBBIBBDDBDBDBIIAABAABDAIIBD................................", "BDBAABDBAJKLKMJNBDBAADBBABBAAIBB................................", "AIABBIAAJMKKMMMJAAIBBAIABBABAAAB................................", "ABABAFJIMOPMJPOMIJFABABABIIBBAIB................................", "BBABIJJJJMMQQMMJJJJIBABBAIIABIIA................................", "IAIFJGCRFGHSSTGCRCGJFIAIAIIAAIIA................................", "CFFJGJGCRCTHTHCGFGJGJFFCCCUUUUCC................................", "....VVVVWWXX........YMJFFJMYVVVVVVVV........ZZZaJMMM............", "....VVVVXXWW........YJFFFFJYVVVVVVVV........ZZZaMMJF............", "....VVVVWWXX........YJFFFFJYVVVVVVVV........ZbZaMMMM............", "....VVVVXXWW........YMJFFJMYVVVVVVVV........aZZaJMJF............", "ccVcdddVcVcccddVeeeeZaMJJMaZeeeeZaaeeeaZZZZaaaZZffffZZZZ........", "cVVcdddVcVccddddeggeZZeMMeZZeggeZZZZaZZZZZaaaZZZfhhfZaaZ........", "cVccdddccVccddddgiigaZaZgaZagiigeZZZeZZeZaaZZZaefhhfZZaa........", "cVccdddccVccdccdiiiieZZZeZZeiiiiaZZaeZZaffffffffhhhhffff........", "cVcccVVcccVcVVVViiiigaZZeZZgiiiiaZZeaZZaJJJFJFJFFFFFFJJJ........", "cVccdccdcVVccVVcgiiggaaZeZZggiigeZZeZZZeMMMJMJMMJFJJMMMM........", "cVccddddcVccddddggggeZZaeaZgggggeZZaZZaeJMMMMJMJJFJJMJJM........", "ccccddddcVccddddeggegZZeaaaeeggeeZZaZaaeJMMMMMMJJFJFMMMM........", "VVccddccccVVccccegeegeaeZZaeeegeaZZaaaegJMJMMMMJJJJFMMMM........", "jjVVVVVVVVjjjjjjeeeegeegaZZeeeeeaaaeaeggMMJMMMMMJJJJMMMM........", "WkjjjljjjjkWkjjkcVcVVVccVgaegVVccgegegVdMMJMMMJMJJJJMJMM........", "WWWkkjjkkWWWWkkWcVcccddcdcggcVccddcVgcddJMMJJMJJFJFJJJMJ........", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "........................................bbbbbbbZaaaaZbbb........", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "................................................................", "....................VVVVXXWW........aZZZMMMJ....................", "....................VVVVWWXX........aZZZFJMM....................", "....................VVVVXXWW........aZbZMMMM....................", "....................VVVVWWXX........aZZaFJMJ....................", "................ccVcddcccVccdddcffffZZaaaZZZZZZZ................", "................ccVccdddcVVcddddfhhfZZZaaaZZZaaZ................", "................ccVcVdddccVcddddfhhfeaZZZaaZaaZZ................", "................ccVccdddccVcdccdhhhhffffffffffffaaaaZbbbbbbbbbbZ", "................cVcccVVcccVcVVVVFFFFFJFJFJJJJJJF................", "................cVVccccdccVccVVcJJFJMMJMJMMMMMMM................", "................ccVccdddccVcddddJJFJJMJMMMMJMJJM................", "................ccVcVdddccccddddFJFJJMMMMMMJMMMM................", "................VVccVcddccVVccccFJJJJMMMMJMJMMMM................", "................jjVVVVVVVVjjjjjjJJJJMMMMMJMMMMMM................", "................WkjjjljjjjkWkjjkJJJJMJMMMJMMMMJM................", "................WWWkkjjkkWWWWkkWJFJFJJMJJMMJJMJJ................" } F.decodeRLE = function(s) local px, i = {}, 0 for count, hex in s:gmatch("(%d+):([%x%-]+)") do local c = false if hex ~= "-" then c = Color3.fromRGB(tonumber(hex:sub(1, 2), 16), tonumber(hex:sub(3, 4), 16), tonumber(hex:sub(5, 6), 16)) end for _ = 1, tonumber(count) do i += 1 px[i] = c end end return px end F.buildImage = function(img, s) if not img.px then img.px = F.decodeRLE(img.d) end local px, w, h = img.px, img.w, img.h local f = Instance.new("Frame") f.Size = UDim2.fromOffset(w * s, h * s) f.BackgroundTransparency = 1 f.BorderSizePixel = 0 for y = 0, h - 1 do local x = 0 while x < w do local c = px[y * w + x + 1] local run = 1 while x + run < w and px[y * w + x + run + 1] == c do run += 1 end if c then local p = Instance.new("Frame") p.BorderSizePixel = 0 p.BackgroundColor3 = c p.Position = UDim2.fromOffset(x * s, y * s) p.Size = UDim2.fromOffset(run * s, s) p.Parent = f end x += run end end return f end local vp = camera.ViewportSize local GS = math.clamp(math.floor(math.min(vp.X / 200, vp.Y / 180)), 1, 4) F.getPixel = function(x, y) return PALETTE[SKIN[y + 1]:sub(x + 1, x + 1)] end local model = Instance.new("Model") model.Name = "MinecraftSteve" F.paintFace = function(part, face, u, v, w, h, flipX, flipY) local g = Instance.new("SurfaceGui") g.Face = face g.SizingMode = Enum.SurfaceGuiSizingMode.FixedSize g.CanvasSize = Vector2.new(w * 16, h * 16) g.LightInfluence = 0.7 g.ZIndexBehavior = Enum.ZIndexBehavior.Sibling g.Parent = part for row = 0, h - 1 do local ty = v + (flipY and (h - 1 - row) or row) local col = 0 while col < w do local function tx(c) return u + (flipX and (w - 1 - c) or c) end local c = F.getPixel(tx(col), ty) local run = 1 while col + run < w and F.getPixel(tx(col + run), ty) == c do run += 1 end if c then local f = Instance.new("Frame") f.BorderSizePixel = 0 f.BackgroundColor3 = c f.Position = UDim2.fromScale(col / w, row / h) f.Size = UDim2.fromScale(run / w, 1 / h) f.Parent = g end col += run end end end F.paintBox = function(part, u, v, w, h, d) F.paintFace(part, Enum.NormalId.Top, u + d, v, w, d, true, true) F.paintFace(part, Enum.NormalId.Bottom, u + d + w, v, w, d) F.paintFace(part, Enum.NormalId.Right, u, v + d, d, h) F.paintFace(part, Enum.NormalId.Front, u + d, v + d, w, h) F.paintFace(part, Enum.NormalId.Left, u + d + w, v + d, d, h) F.paintFace(part, Enum.NormalId.Back, u + 2 * d + w, v + d, w, h) end F.toRb = function(v) return Vector3.new(-v.X, -v.Y, v.Z) * PX end local limbs = {} F.makeLimb = function(name, origin, size, pivot, u, v) local part = Instance.new("Part") part.Name = name part.Size = size * PX part.Color = Color3.fromRGB(176, 125, 96) part.Material = Enum.Material.SmoothPlastic part.Anchored, part.CanCollide, part.CanQuery, part.CanTouch = true, false, false, false part.CastShadow = true part.Parent = model F.paintBox(part, u, v, size.X, size.Y, size.Z) limbs[name] = { part = part, pivot = pivot, offset = CFrame.new(F.toRb(origin + size / 2)) } end F.makeLimb("head", Vector3.new(-4, -8, -4), Vector3.new(8, 8, 8), Vector3.new(0, 0, 0), 0, 0) F.makeLimb("body", Vector3.new(-4, 0, -2), Vector3.new(8, 12, 4), Vector3.new(0, 0, 0), 16, 16) F.makeLimb("rightArm", Vector3.new(-3, -2, -2), Vector3.new(4, 12, 4), Vector3.new(-5, 2, 0), 40, 16) F.makeLimb("leftArm", Vector3.new(-1, -2, -2), Vector3.new(4, 12, 4), Vector3.new(5, 2, 0), 32, 48) F.makeLimb("rightLeg", Vector3.new(-2, 0, -2), Vector3.new(4, 12, 4), Vector3.new(-1.9, 12, 0), 0, 16) F.makeLimb("leftLeg", Vector3.new(-2, 0, -2), Vector3.new(4, 12, 4), Vector3.new(1.9, 12, 0), 16, 48) F.placeLimb = function(l, root, pivot, rx, ry, rz) l.part.CFrame = root * CFrame.new(F.toRb(pivot)) * CFrame.fromEulerAnglesXYZ(-rx, -ry, rz) * l.offset end F.placeHead = function(root, pivot, pitch, relYaw) local head = limbs.head -- Use the same mirrored angle convention as every other Steve limb. -- Apply yaw and pitch separately so turning the head cannot roll/twist the neck. -- Head angles use the same direction as the camera: positive yaw turns right, -- and positive pitch looks upward. The previous negative signs inverted both axes. head.part.CFrame = root * CFrame.new(F.toRb(pivot)) * CFrame.Angles(0, relYaw, 0) * CFrame.Angles(pitch, 0, 0) * head.offset end F.poseSteve = function(root, pitch, relYaw, walkPos, walkSpeed, age, crouch, holdingItem, interpolatedSwing) local pi = math.pi local rArmX = math.cos(walkPos * 0.6662 + pi) * 2 * walkSpeed * 0.5 local lArmX = math.cos(walkPos * 0.6662) * 2 * walkSpeed * 0.5 local swingProgress = math.clamp(interpolatedSwing or F.swingProgress or 0, 0, 1) local eatBlend = math.clamp(F.eatAnimationBlend or (F.eating and 1 or 0), 0, 1) local eatElapsed = math.clamp(F.renderEatTime or F.eatTime or 0, 0, 32) local eatRemaining = 1 - eatElapsed / 32 local eatPull = 1 - eatRemaining ^ 27 local rArmY, lArmY, rArmSwingZ = 0, 0, 0 local bodySwingYaw = 0 -- ModelBiped's ITEM arm pose: a held item rests slightly forward instead of -- leaving the arm in the empty-hand walk pose. if holdingItem then rArmX = rArmX * 0.5 - pi / 10 end -- Minecraft 1.12 biped attack math. Use render-interpolated progress so this -- curve is smooth at 60 FPS even though the simulation advances at 20 TPS. if swingProgress > 0 then bodySwingYaw = math.sin(math.sqrt(swingProgress) * pi * 2) * 0.2 local eased = 1 - swingProgress eased = 1 - eased * eased * eased * eased local f2 = math.sin(eased * pi) local f3 = math.sin(swingProgress * pi) * -(pitch - 0.7) * 0.75 rArmX -= f2 * 1.2 + f3 -- Main-hand arm receives body yaw plus the extra 2x ModelBiped swing term. rArmY += bodySwingYaw * 3 lArmY += bodySwingYaw lArmX += bodySwingYaw rArmSwingZ = math.sin(swingProgress * pi) * -0.4 end -- Keep eating as a held-input action, with the arm easing toward the mouth -- during the same 32-tick use window as Java 1.12.x, not really accurate tho. if eatBlend > 0.001 then rArmX -= eatBlend * eatPull * 0.48 end local rLegX = math.cos(walkPos * 0.6662) * 1.4 * walkSpeed local lLegX = math.cos(walkPos * 0.6662 + pi) * 1.4 * walkSpeed local headP, bodyP = Vector3.new(0, 0, 0), Vector3.new(0, 0, 0) local rArmP = Vector3.new(-math.cos(bodySwingYaw) * 5, 2, math.sin(bodySwingYaw) * 5) local lArmP = Vector3.new(math.cos(bodySwingYaw) * 5, 2, -math.sin(bodySwingYaw) * 5) local rLegP, lLegP = Vector3.new(-1.9, 12, 0), Vector3.new(1.9, 12, 0) local bodyX = 0 if crouch then bodyX = 0.5 rArmX += 0.4 lArmX += 0.4 rLegP += Vector3.new(0, 0, 4) lLegP += Vector3.new(0, 0, 4) headP += Vector3.new(0, 4.2, 0) bodyP += Vector3.new(0, 3.2, 0) rArmP += Vector3.new(0, 3.2, 0) lArmP += Vector3.new(0, 3.2, 0) end local rBobZ = math.cos(age * 0.09) * 0.05 + 0.05 local lBobZ = -rBobZ rArmX += math.sin(age * 0.067) * 0.05 lArmX -= math.sin(age * 0.067) * 0.05 F.placeHead(root, headP, pitch, relYaw) F.placeLimb(limbs.body, root, bodyP, bodyX, bodySwingYaw, 0) F.placeLimb(limbs.rightArm, root, rArmP, rArmX, rArmY, rBobZ + rArmSwingZ) F.placeLimb(limbs.leftArm, root, lArmP, lArmX, lArmY, lBobZ) F.placeLimb(limbs.rightLeg, root, rLegP, rLegX, 0.005, 0.005) F.placeLimb(limbs.leftLeg, root, lLegP, lLegX, -0.005, -0.005) return rArmP, rArmX, rBobZ, rArmY, rArmSwingZ end local ITEMS = { diamond_sword = { name = "Diamond Sword", max = 1 }, diamond_pickaxe = { name = "Diamond Pickaxe", max = 1 }, diamond_axe = { name = "Diamond Axe", max = 1 }, diamond_shovel = { name = "Diamond Shovel", max = 1 }, cooked_beef = { name = "Steak" }, bread = { name = "Bread" }, apple = { name = "Apple" }, torch = { name = "Torch" }, stick = { name = "Stick" }, coal = { name = "Coal" }, iron_ingot = { name = "Iron Ingot" }, diamond = { name = "Diamond" }, bucket = { name = "Bucket", max = 16 }, stone = { name = "Stone", placeable = true, hardness = 1.5 }, dirt = { name = "Dirt", placeable = true, hardness = 0.5 }, cobblestone = { name = "Cobblestone", placeable = true, hardness = 2.0 }, oak_planks = { name = "Oak Planks", placeable = true, hardness = 2.0 }, oak_log = { name = "Oak Log", placeable = true, hardness = 2.0 }, grass_block = { name = "Grass Block", placeable = true, hardness = 0.6 }, crafting_table = { name = "Crafting Table", placeable = true, hardness = 2.5 }, ladder = { name = "Ladder", placeable = true, hardness = 0.4 }, } local slots = {} local carried = nil F.maxOf = function(id) return ITEMS[id].max or 64 end F.canPlace = function(idx, st) if idx == 0 or st == nil or ITEMS[st.id] == nil then return false end if idx >= 5 and idx <= 8 then return ITEMS[st.id].armorSlot == idx end return true end F.insertStack = function(st, a, b) if F.maxOf(st.id) > 1 then for i = a, b do local s = slots[i] if s and s.id == st.id and s.n < F.maxOf(s.id) then local mv = math.min(F.maxOf(s.id) - s.n, st.n) s.n += mv st.n -= mv if st.n <= 0 then return true end end end end for i = a, b do if not slots[i] and F.canPlace(i, st) then slots[i] = { id = st.id, n = st.n } st.n = 0 return true end end return st.n <= 0 end F.canFit = function(id, n, a, b) local room = 0 for i = a, b do local s = slots[i] if s == nil then room += F.maxOf(id) elseif s.id == id then room += F.maxOf(id) - s.n end end return room >= n end F.give = function(id, n, a, b) local st = { id = id, n = n } F.insertStack(st, a or 9, b or 44) end F.updateCraft = function() local g = {} local count = 0 for i = 1, 4 do g[i] = slots[i] and slots[i].id or nil if g[i] then count += 1 end end local r = nil if count == 1 then for i = 1, 4 do if g[i] == "oak_log" then r = { id = "oak_planks", n = 4 } end end elseif count == 2 then if (g[1] == "oak_planks" and g[3] == "oak_planks") or (g[2] == "oak_planks" and g[4] == "oak_planks") then r = { id = "stick", n = 4 } elseif (g[1] == "coal" and g[3] == "stick") or (g[2] == "coal" and g[4] == "stick") then r = { id = "torch", n = 4 } end elseif count == 4 then if g[1] == "oak_planks" and g[2] == "oak_planks" and g[3] == "oak_planks" and g[4] == "oak_planks" then r = { id = "crafting_table", n = 1 } end end slots[0] = r end F.consumeCraft = function() for i = 1, 4 do local s = slots[i] if s then s.n -= 1 if s.n <= 0 then slots[i] = nil end end end F.updateCraft() end slots[36] = { id = "diamond_sword", n = 1 } slots[37] = { id = "diamond_pickaxe", n = 1 } slots[38] = { id = "diamond_axe", n = 1 } slots[39] = { id = "diamond_shovel", n = 1 } slots[40] = { id = "cooked_beef", n = 64 } slots[41] = { id = "oak_planks", n = 64 } slots[42] = { id = "cobblestone", n = 64 } slots[43] = { id = "grass_block", n = 64 } slots[44] = { id = "dirt", n = 64 } F.give("stone", 64) F.give("dirt", 64) F.give("oak_log", 64) F.give("stick", 64) F.give("coal", 64) F.give("iron_ingot", 64) F.give("diamond", 32) F.give("apple", 64) F.give("bread", 64) F.give("bucket", 1) F.give("ladder", 64) -- Crafting table and torch remain available through crafting recipes. local abilities = { invulnerable = true, flying = false, mayfly = true, instabuild = true, mayBuild = true, flyingSpeed = 0.05, walkingSpeed = 0.1, } local creative = true local jumpTriggerTime = 0 local pos, eyeH, selected, refresh, touchJumpHeld, yaw, pitch, rp local invOpen = false local inventoryPage = "creative" local hudVisible = true local creativePlaceholder = nil local creativePlaceholderOpen = false local creativeTabButton = nil local panel local debugPanel, debugText local chatPanel, chatInput, chatHistoryLabel, chatRowsFrame local chatOpen = false local mobileDpad = nil local mobileMoveVector = Vector3.zero local mobileHeldDirections = { Forward = false, Back = false, Left = false, Right = false } local lastMobileForwardTap = -math.huge local sprintLatch = false local prevPos, vel local recalcTouchMove pos = Vector3.new(0, 10, 0) eyeH = 1.62 selected = 0 touchJumpHeld = false yaw, pitch = 0, 0 rp = RaycastParams.new() rp.FilterType = Enum.RaycastFilterType.Exclude rp.RespectCanCollide = true local entityRayParams = RaycastParams.new() entityRayParams.FilterType = Enum.RaycastFilterType.Exclude entityRayParams.RespectCanCollide = false F.setGameMode = function(isCreative) creative = isCreative if isCreative then abilities.mayfly = true abilities.instabuild = true abilities.invulnerable = true abilities.mayBuild = true else abilities.mayfly = false abilities.instabuild = false abilities.invulnerable = false abilities.flying = false abilities.mayBuild = true end if not invOpen then inventoryPage = isCreative and "creative" or "survival" else inventoryPage = isCreative and "creative" or "survival" end if F.updateInventoryPage then F.updateInventoryPage() end end F.setGameMode(true) local REACH_SURVIVAL = 4.5 local REACH_CREATIVE = 5.0 local DESTROY_DELAY_CREATIVE = 5 local isDestroying = false local destroyBlockPos = nil local destroyPart = nil local destroyingItemId = nil local destroyProgress = 0 local destroyTicks = 0 local destroyDelay = 0 local rightClickDelay = 0 local missTime = 0 do local old = workspace:FindFirstChild("MCBlocks") if old then old:Destroy() end end local char, hum, hrp local blockFolder = Instance.new("Folder") blockFolder.Name = "MCBlocks" blockFolder.Parent = workspace local existingDropFolder = workspace:FindFirstChild("MCDroppedItems") if existingDropFolder then existingDropFolder:Destroy() end local dropFolder = Instance.new("Folder") dropFolder.Name = "MCDroppedItems" dropFolder.Parent = workspace F.baseplateOriginals = {} -- retained empty for cleanup compatibility F.voxelOriginals = {} -- no voxel conversions are performed F.snapToGrid = function(v) return Vector3.new( math.floor(v.X / BLOCK + 0.5) * BLOCK, math.floor(v.Y / BLOCK + 0.5) * BLOCK, math.floor(v.Z / BLOCK + 0.5) * BLOCK ) end local BLOCK_COLORS = { stone = Color3.fromRGB(125, 125, 125), dirt = Color3.fromRGB(134, 96, 67), cobblestone = Color3.fromRGB(110, 110, 110), oak_planks = Color3.fromRGB(162, 130, 78), oak_log = Color3.fromRGB(102, 81, 50), grass_block = Color3.fromRGB(91, 138, 54), crafting_table = Color3.fromRGB(120, 90, 50), } F.isMCBlock = function(part) return part and part:IsA("BasePart") and part:GetAttribute("MCBlockId") ~= nil end -- Any raycastable world BasePart can be selected and broken. Generated dropped items -- are excluded so aiming at an item does not accidentally destroy the pickup. F.isBreakableTarget = function(part) if not (part ~= nil and part:IsA("BasePart") and part.Parent ~= nil) then return false end if dropFolder and part:IsDescendantOf(dropFolder) then return false end -- A part beneath a Model with a Humanoid is an entity, not a block/CSG target. if F.getEntityTarget and F.getEntityTarget(part) then return false end return true end local MCB = (function() local blocks = {} local bulkBuild = false local painted = setmetatable({}, { __mode = "k" }) local function cellKey(center) return math.floor(center.X / BLOCK + 0.5) .. ":" .. math.floor(center.Y / BLOCK + 0.5) .. ":" .. math.floor(center.Z / BLOCK + 0.5) end local function getBlockAt(center) return blocks[cellKey(center)] end local BLOCKFACES = { stone = { all = "stone" }, dirt = { all = "dirt" }, cobblestone = { all = "cobble" }, oak_planks = { all = "planks" }, oak_log = { top = "log_top", bottom = "log_top", side = "log" }, grass_block = { top = "grass_top", bottom = "dirt", side = "grass_side" }, crafting_table = { top = "ct_top", bottom = "planks", front = "ct_front", side = "ct_side" }, } local FACES = { { Enum.NormalId.Top, Vector3.yAxis }, { Enum.NormalId.Bottom, -Vector3.yAxis }, { Enum.NormalId.Front, -Vector3.zAxis }, { Enum.NormalId.Back, Vector3.zAxis }, { Enum.NormalId.Right, Vector3.xAxis }, { Enum.NormalId.Left, -Vector3.xAxis }, } local function faceTexKey(id, nid) local F = BLOCKFACES[id] if not F then return nil end if F.all then return F.all end if nid == Enum.NormalId.Top then return F.top end if nid == Enum.NormalId.Bottom then return F.bottom or F.top end if F.front and (nid == Enum.NormalId.Front or nid == Enum.NormalId.Left) then return F.front end return F.side end local function rectsOf(px, w, h) local used, out = {}, {} for y = 0, h - 1 do for x = 0, w - 1 do local i = y * w + x + 1 local c = px[i] if c and not used[i] then local rw = 1 while x + rw < w and px[i + rw] == c and not used[i + rw] do rw += 1 end local rh, ok = 1, true while ok and y + rh < h do for dx = 0, rw - 1 do local j = (y + rh) * w + x + dx + 1 if px[j] ~= c or used[j] then ok = false break end end if ok then rh += 1 end end for dy = 0, rh - 1 do for dx = 0, rw - 1 do used[(y + dy) * w + x + dx + 1] = true end end out[#out + 1] = { x = x, y = y, w = rw, h = rh, c = c } end end end return out end local faceTpl = {} local function faceTemplate(texKey, nid) local ck = texKey .. nid.Name local g = faceTpl[ck] if g then return g end local tex = BTEX[texKey] if not tex then return nil end if not tex.px then tex.px = F.decodeRLE(tex.d) end g = Instance.new("SurfaceGui") g.Face = nid g.SizingMode = Enum.SurfaceGuiSizingMode.FixedSize g.CanvasSize = Vector2.new(64, 64) g.LightInfluence = 0.5 g.ZIndexBehavior = Enum.ZIndexBehavior.Sibling for _, r in ipairs(rectsOf(tex.px, 16, 16)) do local f = Instance.new("Frame") f.BorderSizePixel = 0 f.BackgroundColor3 = r.c f.Position = UDim2.fromOffset(r.x * 4, r.y * 4) f.Size = UDim2.fromOffset(r.w * 4, r.h * 4) f.Parent = g end faceTpl[ck] = g return g end local function paintFaceOf(part, nid, id) local key = faceTexKey(id, nid) local tpl = key and faceTemplate(key, nid) if tpl then tpl:Clone().Parent = part end end local function refreshFaces(part) if bulkBuild or not part.Parent then return end local id = part:GetAttribute("MCBlockId") if not id or id == "ladder" then return end local cell = part:GetAttribute("MCCell") or part.Position local p = painted[part] if not p then p = {} painted[part] = p end for _, f in ipairs(FACES) do if not p[f[1]] then local nb = getBlockAt(cell + f[2] * BLOCK) if not nb or nb:GetAttribute("MCClimb") then p[f[1]] = true paintFaceOf(part, f[1], id) end end end end local function buildLadderVisual(part, center, n) local tex = ICON.ladder if not tex.px then tex.px = F.decodeRLE(tex.d) end local right = (-n):Cross(Vector3.yAxis) for _, r in ipairs(rectsOf(tex.px, 16, 16)) do local v = Instance.new("Part") v.Size = Vector3.new(r.w, r.h, 1) * PX v.Color = r.c v.Material = Enum.Material.SmoothPlastic v.Anchored, v.CanCollide, v.CanQuery, v.CanTouch, v.CastShadow = true, false, false, false, false local p = center - n * (BLOCK / 2) + n * (1.3 * PX) + right * ((r.x + r.w / 2 - 8) * PX) + Vector3.yAxis * ((8 - r.y - r.h / 2) * PX) v.CFrame = CFrame.fromMatrix(p, right, Vector3.yAxis, n) v.Parent = part end end local function createBlock(id, center, face) center = F.snapToGrid(center) if getBlockAt(center) then return nil end local part = Instance.new("Part") part.Name = id part.Anchored = true part.CanTouch = false part.TopSurface = Enum.SurfaceType.Smooth part.BottomSurface = Enum.SurfaceType.Smooth part.Material = Enum.Material.SmoothPlastic part:SetAttribute("MCBlockId", id) part:SetAttribute("MCCell", center) if id == "ladder" then local n = (face and math.abs(face.Y) < 0.5) and face or Vector3.zAxis local t = 2 / 16 * BLOCK local alongX = math.abs(n.X) > 0.5 part.Size = alongX and Vector3.new(t, BLOCK, BLOCK) or Vector3.new(BLOCK, BLOCK, t) part.CFrame = CFrame.new(center - n * (BLOCK / 2 - t / 2)) part.Transparency = 1 part.CanCollide = false part.CanQuery = true part.CastShadow = false part:SetAttribute("MCClimb", true) buildLadderVisual(part, center, n) else part.Size = Vector3.new(BLOCK, BLOCK, BLOCK) part.CFrame = CFrame.new(center) part.CanCollide = true part.CanQuery = true part.CastShadow = true part.Color = BLOCK_COLORS[id] or Color3.fromRGB(150, 150, 150) end blocks[cellKey(center)] = part part.Parent = blockFolder refreshFaces(part) return part end local function removeBlock(part) local cell = part:GetAttribute("MCCell") or part.Position blocks[cellKey(cell)] = nil painted[part] = nil part:Destroy() for _, f in ipairs(FACES) do local nb = getBlockAt(cell + f[2] * BLOCK) if nb then refreshFaces(nb) end end end return { get = getBlockAt, create = createBlock, remove = removeBlock, refresh = refreshFaces, paintFace = paintFaceOf, rects = rectsOf, FACES = FACES, BLOCKFACES = BLOCKFACES, blocks = blocks, setBulk = function(v) bulkBuild = v end, } end)() local getBlockAt, createBlock, removeBlock = MCB.get, MCB.create, MCB.remove -- All world geometry stays as its existing geometry. No baseplate chunking, -- voxelization, or replacement with generated block Parts is performed. -- A target cell is identified on the same world grid used by placed MC blocks. F.getGridCellCenter = function(part, hitPos, hitNormal) if F.isMCBlock(part) then return part:GetAttribute("MCCell") or F.snapToGrid(part.Position) end if not hitPos then return F.snapToGrid(part and part.Position or Vector3.zero) end local n = hitNormal or Vector3.yAxis local ax, ay, az = math.abs(n.X), math.abs(n.Y), math.abs(n.Z) local face if ay >= ax and ay >= az then face = Vector3.new(0, n.Y >= 0 and 1 or -1, 0) elseif ax >= az then face = Vector3.new(n.X >= 0 and 1 or -1, 0, 0) else face = Vector3.new(0, 0, n.Z >= 0 and 1 or -1) end return F.snapToGrid(hitPos - face * (BLOCK * 0.5)) end -- Cut exactly one grid-sized cube from the existing geometry. Roblox's CSG -- result is a UnionOperation; it is not expanded into a collection of Parts. -- If the selected cube contains the entire target, removing that target is the -- equivalent of breaking its only occupied cell. If CSG fails, leave it intact. F.cutGridCellWithUnion = function(source, cellCenter) if not (source and source.Parent and source:IsA("BasePart") and cellCenter) then return false end if source:IsDescendantOf(dropFolder) or source.Name == "MCSelectionGridProxy" then return false end if F.isMCBlock(source) then removeBlock(source) return true end local GeometryService = game:GetService("GeometryService") local half = BLOCK * 0.5 local cellCFrame = CFrame.new(cellCenter) local sourceParent = source.Parent local sourceCFrame = source.CFrame local sourceName = source.Name local sourceAttributes = source:GetAttributes() -- The selection cube is the target, not just the one BasePart that happened -- to be first in the raycast. Collect every eligible world part whose bounds -- intersect the selected Minecraft cell, including decorative Parts and unions. local excluded = { dropFolder, blockFolder, model } if char then table.insert(excluded, char) end local overlap = OverlapParams.new() overlap.FilterType = Enum.RaycastFilterType.Exclude overlap.FilterDescendantsInstances = excluded overlap.RespectCanCollide = false overlap.MaxParts = 0 local targets, seen = {}, {} local function addTarget(part) if not (part and part.Parent and part:IsA("BasePart")) then return end if seen[part] or part:IsDescendantOf(dropFolder) or part:IsDescendantOf(blockFolder) then return end if part.Name == "MCSelectionGridProxy" then return end if F.getEntityTarget and F.getEntityTarget(part) then return end local playerModel = part:FindFirstAncestorOfClass("Model") if playerModel and Players:GetPlayerFromCharacter(playerModel) then return end seen[part] = true table.insert(targets, part) end addTarget(source) local overlapOK, overlapping = pcall(function() return workspace:GetPartBoundsInBox(cellCFrame, Vector3.one * BLOCK, overlap) end) if overlapOK and type(overlapping) == "table" then for _, part in ipairs(overlapping) do addTarget(part) end end if #targets == 0 then return false end local function allTargetsInsideCell(parts) for _, part in ipairs(parts) do if not (part and part.Parent and part:IsA("BasePart")) then return false end for sx = -1, 1, 2 do for sy = -1, 1, 2 do for sz = -1, 1, 2 do local corner = part.CFrame:PointToWorldSpace(Vector3.new( part.Size.X * 0.5 * sx, part.Size.Y * 0.5 * sy, part.Size.Z * 0.5 * sz )) local localCorner = cellCFrame:PointToObjectSpace(corner) if math.abs(localCorner.X) > half + 0.01 or math.abs(localCorner.Y) > half + 0.01 or math.abs(localCorner.Z) > half + 0.01 then return false end end end end end return #parts > 0 end local function destroyAllCellTargets(parts) for _, part in ipairs(parts) do if part and part.Parent then pcall(function() part:Destroy() end) end end end local options = { CollisionFidelity = Enum.CollisionFidelity.Default, RenderFidelity = Enum.RenderFidelity.Automatic, SplitApart = false, } local intermediate = {} local csgBase = source -- Multiple objects in the same highlighted cell first become one CSG Union. -- This keeps geometry from Parts A/B/C together so the same cell cut removes -- all of them, rather than only whichever one the raycast returned. if #targets > 1 then local others = {} for _, part in ipairs(targets) do if part ~= source then table.insert(others, part) end end local unionOK, unionRaw = pcall(function() return GeometryService:UnionAsync(source, others, options) end) if not unionOK or type(unionRaw) ~= "table" or #unionRaw == 0 then if allTargetsInsideCell(targets) then destroyAllCellTargets(targets) return true end warn("[Minecraft 1.12.1] Could not union every part in the selected cell; originals left unchanged.") return false end for _, item in ipairs(unionRaw) do if typeof(item) == "Instance" then table.insert(intermediate, item) end end if #intermediate == 0 then return false end csgBase = intermediate[1] end local cutter = Instance.new("Part") cutter.Name = "MCUnionCutCutter" cutter.Size = Vector3.one * BLOCK cutter.CFrame = cellCFrame cutter.Anchored = true cutter.CanCollide = false cutter.CanTouch = false cutter.CanQuery = false cutter.CastShadow = false cutter.Transparency = 1 local cutOK, cutRaw = pcall(function() return GeometryService:SubtractAsync(csgBase, { cutter }, options) end) cutter:Destroy() local results = {} if cutOK and type(cutRaw) == "table" then for _, item in ipairs(cutRaw) do if typeof(item) == "Instance" then table.insert(results, item) end end end local function destroyIntermediate() for _, item in ipairs(intermediate) do if item then pcall(function() item:Destroy() end) end end end local function destroyResults() for _, item in ipairs(results) do if item then pcall(function() item:Destroy() end) end end end if not cutOK or type(cutRaw) ~= "table" then destroyResults() destroyIntermediate() if allTargetsInsideCell(targets) then destroyAllCellTargets(targets) return true end warn("[Minecraft 1.12.1] Union cell cut failed; all original parts were left unchanged.") return false end -- An empty successful result means every solid in the combined target was -- inside the selected cell and was removed by the cut. if #results == 0 then destroyIntermediate() for _, part in ipairs(targets) do if part and part.Parent then pcall(function() part:Destroy() end) end end return true end local firstResult = results[1] if not (firstResult and firstResult:IsA("BasePart")) then destroyResults() destroyIntermediate() return false end local function copySourceProperties(result, index) pcall(function() result.CFrame = sourceCFrame end) result.Name = index == 1 and sourceName or (sourceName .. "_CutPart" .. tostring(index)) pcall(function() result.Color = source.Color end) pcall(function() result.Material = source.Material end) pcall(function() result.MaterialVariant = source.MaterialVariant end) pcall(function() result.Reflectance = source.Reflectance end) pcall(function() result.Transparency = source.Transparency end) pcall(function() result.LocalTransparencyModifier = source.LocalTransparencyModifier end) pcall(function() result.Anchored = source.Anchored end) pcall(function() result.CanCollide = source.CanCollide end) pcall(function() result.CanQuery = source.CanQuery end) pcall(function() result.CanTouch = source.CanTouch end) pcall(function() result.CastShadow = source.CastShadow end) pcall(function() result.CollisionGroup = source.CollisionGroup end) pcall(function() result.CustomPhysicalProperties = source.CustomPhysicalProperties end) pcall(function() if result:IsA("PartOperation") and source:IsA("PartOperation") then result.UsePartColor = source.UsePartColor end end) for name, value in pairs(sourceAttributes) do pcall(function() result:SetAttribute(name, value) end) end result:SetAttribute("MCClientUnionReplacement", true) result.Parent = sourceParent end for index, result in ipairs(results) do if result and result:IsA("BasePart") then copySourceProperties(result, index) end end -- Preserve relevant children (textures, decals, surface GUIs and attachments) -- from each original on the resulting union instead of orphaning them. for _, oldPart in ipairs(targets) do for _, child in ipairs(oldPart:GetChildren()) do if not child:IsA("BasePart") and not child:IsA("Model") and child.Parent == oldPart then pcall(function() child.Parent = firstResult end) end end end -- The new union/cut geometry is ready before originals are removed. -- Roblox CSG returns new result instances, so this is a successful local -- replacement, not a hidden source or a temporary visual clone. for _, oldPart in ipairs(targets) do if oldPart and oldPart.Parent then pcall(function() oldPart:Destroy() end) end end destroyIntermediate() for index = 2, #results do local extra = results[index] if extra and not extra.Parent then pcall(function() extra.Parent = sourceParent end) end end return true end -- Resolving a target is deliberately read-only. The same hit cell is used for -- highlighting, breaking, and placement; no world geometry is changed here. F.resolveBreakTarget = function(part, hitPos, hitNormal) return part, hitPos, hitNormal end local selectBox = Instance.new("SelectionBox") selectBox.Color3 = Color3.new(0, 0, 0) selectBox.LineThickness = 0.012 selectBox.Transparency = 0.3 selectBox.Name = "MCSelectBox" local selectionProxy = Instance.new("Part") selectionProxy.Name = "MCSelectionGridProxy" selectionProxy.Size = Vector3.new(BLOCK, BLOCK, BLOCK) selectionProxy.Anchored = true selectionProxy.CanCollide = false selectionProxy.CanTouch = false selectionProxy.CanQuery = false selectionProxy.CastShadow = false selectionProxy.Transparency = 1 selectionProxy.Parent = workspace local crackOverlay = Instance.new("SelectionBox") crackOverlay.Color3 = Color3.new(1, 1, 1) crackOverlay.LineThickness = 0.025 crackOverlay.Transparency = 1 crackOverlay.Name = "MCCrackOverlay" F.setDestroyStage = function(stage) if stage < 0 or not destroyPart then crackOverlay.Adornee = nil crackOverlay.Transparency = 1 else -- Crack feedback follows the same single-cell proxy used for selection. crackOverlay.Adornee = selectionProxy crackOverlay.Transparency = 1 - math.clamp(stage / 9, 0, 1) * 0.85 end end F.getDestroyStage = function() return destroyProgress > 0 and math.floor(destroyProgress * 10) or -1 end F.getDestroyProgressFor = function(id) local h = (id == "baseplate") and 0.6 or ((ITEMS[id] and ITEMS[id].hardness) or 1.0) if h <= 0 then return 1 end return 1 / (h * 30) end F.stopDestroyBlock = function() if isDestroying then isDestroying = false destroyProgress = 0 destroyTicks = 0 F.setDestroyStage(-1) destroyPart = nil destroyBlockPos = nil destroyingItemId = nil end end F.destroyBlock = function(part, cellCenter) if not F.isBreakableTarget(part) then return false end local id = part:GetAttribute("MCBlockId") cellCenter = cellCenter or F.getGridCellCenter(part, nil, nil) local removed = F.cutGridCellWithUnion(part, cellCenter) if removed and not abilities.instabuild and id and ITEMS[id] then F.give(id, 1, 36, 44) refresh() end return removed end F.sameDestroyTarget = function(part, cellCenter) if not part or not destroyPart then return false end local held = slots[36 + selected] local sid = held and held.id or nil return part == destroyPart and cellCenter == destroyBlockPos and sid == destroyingItemId end F.startDestroyBlock = function(part, _direction, hitPos, hitNormal) if not abilities.mayBuild then return false end if not F.isBreakableTarget(part) then return false end local cellCenter = F.getGridCellCenter(part, hitPos, hitNormal) if abilities.instabuild then F.destroyBlock(part, cellCenter) destroyDelay = DESTROY_DELAY_CREATIVE return true end if not isDestroying or not F.sameDestroyTarget(part, cellCenter) then if isDestroying then F.stopDestroyBlock() end local id = part:GetAttribute("MCBlockId") local prog = F.getDestroyProgressFor(id) if prog >= 1 then F.destroyBlock(part, cellCenter) else isDestroying = true destroyPart = part destroyBlockPos = cellCenter local held = slots[36 + selected] destroyingItemId = held and held.id or nil destroyProgress = 0 destroyTicks = 0 F.setDestroyStage(0) end end return true end F.continueDestroyBlock = function(part, _direction, hitPos, hitNormal) if destroyDelay > 0 then destroyDelay -= 1 return true end if not F.isBreakableTarget(part) then return false end local cellCenter = F.getGridCellCenter(part, hitPos, hitNormal) if abilities.instabuild then destroyDelay = DESTROY_DELAY_CREATIVE F.destroyBlock(part, cellCenter) return true end if F.sameDestroyTarget(part, cellCenter) then if not part.Parent then isDestroying = false return false end local id = part:GetAttribute("MCBlockId") destroyProgress += F.getDestroyProgressFor(id) destroyTicks += 1 F.setDestroyStage(F.getDestroyStage()) if destroyProgress >= 1 then isDestroying = false F.destroyBlock(part, cellCenter) destroyProgress = 0 destroyTicks = 0 destroyDelay = DESTROY_DELAY_CREATIVE F.setDestroyStage(-1) destroyPart = nil end return true else return F.startDestroyBlock(part, _direction, hitPos, hitNormal) end end F.pickBlock = function() local reach = (abilities and abilities.instabuild) and REACH_CREATIVE or REACH_SURVIVAL local p = pos or Vector3.zero local eh = eyeH or 1.62 local y = yaw or 0 local pi = pitch or 0 local eye = p + Vector3.new(0, eh * BLOCK, 0) local look = (CFrame.Angles(0, y, 0) * CFrame.Angles(pi, 0, 0)).LookVector local dir = look * (reach * BLOCK) if not rp then return nil, nil, nil end local r = workspace:Raycast(eye, dir, rp) -- If the normal ray already hit a collidable limb, return it without extra work. if r and F.getEntityTarget then local alreadyEntity = F.getEntityTarget(r.Instance) if alreadyEntity then return r.Instance, r.Position, r.Normal end end -- Standard block targeting intentionally ignores non-collidable BaseParts. This -- second ray lets Humanoid limbs/accessories count as entities without changing -- which ordinary world parts are eligible for union-cut block breaking. local excluded = {} for _, item in ipairs(rp.FilterDescendantsInstances or {}) do excluded[#excluded + 1] = item end if dropFolder then excluded[#excluded + 1] = dropFolder end entityRayParams.FilterDescendantsInstances = excluded local blockDistance = r and (r.Position - eye).Magnitude or math.huge for _ = 1, 16 do local candidate = workspace:Raycast(eye, dir, entityRayParams) if not candidate then break end local entity, entityHumanoid if F.getEntityTarget then entity, entityHumanoid = F.getEntityTarget(candidate.Instance) end if entity and entityHumanoid then local entityDistance = (candidate.Position - eye).Magnitude if entityDistance < blockDistance then return candidate.Instance, candidate.Position, candidate.Normal end break end -- Skip non-collidable decorative parts only. A collidable obstacle blocks the -- entity ray here, matching the normal block ray's line-of-sight behavior. if candidate.Instance.CanCollide then break end excluded[#excluded + 1] = candidate.Instance entityRayParams.FilterDescendantsInstances = excluded end if not r then return nil, nil, nil end return r.Instance, r.Position, r.Normal end F.faceFromNormal = function(n) if typeof(n) ~= "Vector3" or n.Magnitude < 1e-6 then return Vector3.yAxis end local ax, ay, az = math.abs(n.X), math.abs(n.Y), math.abs(n.Z) if ay >= ax and ay >= az then return n.Y > 0 and Vector3.yAxis or -Vector3.yAxis elseif ax >= az then return n.X > 0 and Vector3.xAxis or -Vector3.xAxis else return n.Z > 0 and Vector3.zAxis or -Vector3.zAxis end end F.placeBlock = function(handId, hitPart, hitPos, hitNormal) if not abilities.mayBuild then return false end if not handId or not ITEMS[handId] or not ITEMS[handId].placeable then return false end if not hitPos or not hitNormal then return false end local face = F.faceFromNormal(hitNormal) local base if F.isMCBlock(hitPart) then base = hitPart:GetAttribute("MCCell") or hitPart.Position else base = F.snapToGrid(hitPos - face * (BLOCK * 0.5)) end local center = F.snapToGrid(base + face * BLOCK) if handId == "ladder" and math.abs(face.Y) > 0.5 then return false end local halfW = 0.6 * BLOCK / 2 * 0.9 local feet = pos local playerMin = feet - Vector3.new(halfW, 0.05, halfW) local playerMax = feet + Vector3.new(halfW, 1.8 * BLOCK - 0.05, halfW) local bmin = center - Vector3.new(BLOCK, BLOCK, BLOCK) * 0.5 local bmax = center + Vector3.new(BLOCK, BLOCK, BLOCK) * 0.5 if handId ~= "ladder" and playerMin.X < bmax.X and playerMax.X > bmin.X and playerMin.Y < bmax.Y and playerMax.Y > bmin.Y and playerMin.Z < bmax.Z and playerMax.Z > bmin.Z then return false end local part = createBlock(handId, center, face) if not part then return false end if not abilities.instabuild then local s = slots[36 + selected] if s and s.id == handId then s.n -= 1 if s.n <= 0 then slots[36 + selected] = nil end refresh() end end return true end local attackHeld = false local useHeld = false local swingTime = 0 local swinging = false local swingQueued = false F.startSwing = function() if not swinging then swingTime = 0 swingQueued = false swinging = true elseif swingTime >= 4 then -- Queue a follow-up swing rather than resetting the current one mid-arc. swingQueued = true end end F.startAttack = function() if invOpen or F.playerDead then return false end F.startSwing() if missTime > 0 then return false end local part, hitPos, normal = F.pickBlock() local entity, entityHumanoid if F.getEntityTarget then entity, entityHumanoid = F.getEntityTarget(part) end if entity and entityHumanoid then F.stopDestroyBlock() F.attackEntity(entity, entityHumanoid) return true end part, hitPos, normal = F.resolveBreakTarget(part, hitPos, normal) if F.isBreakableTarget(part) then F.startDestroyBlock(part, normal, hitPos, normal) F.startSwing() return true end F.stopDestroyBlock() if abilities.instabuild then missTime = 0 else missTime = 10 end return false end F.continueAttack = function(down) if F.playerDead then return end if not down then missTime = 0 F.stopDestroyBlock() return end if missTime > 0 or invOpen then return end local part, hitPos, normal = F.pickBlock() local entity, entityHumanoid if F.getEntityTarget then entity, entityHumanoid = F.getEntityTarget(part) end if entity and entityHumanoid then F.stopDestroyBlock() if F.attackEntity(entity, entityHumanoid) then F.startSwing() end return end part, hitPos, normal = F.resolveBreakTarget(part, hitPos, normal) if F.isBreakableTarget(part) then if F.continueDestroyBlock(part, normal, hitPos, normal) then F.startSwing() end else F.stopDestroyBlock() end end F.startUseItem = function() if F.playerDead or invOpen or F.eating then return end if rightClickDelay > 0 then return end local held = slots[36 + selected] local id = held and held.id or nil if id == "cooked_beef" or id == "bread" or id == "apple" then F.eating = true F.eatTime = 0 F.eatTimePrev = 0 F.eatItemId = id rightClickDelay = 32 return end rightClickDelay = 4 local part, hitPos, normal = F.pickBlock() -- Placement uses the hit face and shared grid directly; it must not replace -- the target part with voxel chunks as a side effect of placing a block. if not normal then return end if id and ITEMS[id] and ITEMS[id].placeable then F.placeBlock(id, part, hitPos, normal) F.startSwing() end end F.stopUseItem = function() useHeld = false if F.eating then -- Freeze the elapsed phase and let the render-smoothed blend fade out. -- Resetting eatTime here made the item/arm jump back to frame zero. F.eating = false F.eatItemId = nil rightClickDelay = 0 end end local gui = Instance.new("ScreenGui") gui.Name = "MinecraftGui" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.DisplayOrder = 50 gui.Parent = playerGui -- Separate ScreenGui for the control UI so it always renders above every other UI layer. local controlsGui = Instance.new("ScreenGui") controlsGui.Name = "MinecraftControlsGui" controlsGui.ResetOnSpawn = false controlsGui.IgnoreGuiInset = true controlsGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling controlsGui.DisplayOrder = 4000 controlsGui.Parent = playerGui selectBox.Parent = gui crackOverlay.Parent = gui local iconTpl = {} F.cloneIcon = function(id) if not iconTpl[id] then iconTpl[id] = F.buildImage(ICON[id], GS) end return iconTpl[id]:Clone() end F.textLabel = function(parent, size, z) local t = Instance.new("TextLabel") t.BackgroundTransparency = 1 t.Font = Enum.Font.Arcade t.TextSize = size t.TextXAlignment = Enum.TextXAlignment.Right t.TextYAlignment = Enum.TextYAlignment.Bottom t.ZIndex = z t.Text = "" t.Parent = parent return t end F.newView = function(parent, x, y, z) local v = {} v.holder = Instance.new("Frame") v.holder.BackgroundTransparency = 1 v.holder.Size = UDim2.fromOffset(16 * GS, 16 * GS) v.holder.Position = UDim2.fromOffset(x * GS, y * GS) v.holder.ZIndex = z v.holder.Parent = parent v.shadow = F.textLabel(v.holder, 8 * GS, z + 2) v.shadow.TextColor3 = Color3.fromRGB(62, 62, 62) v.shadow.Size = UDim2.fromOffset(17 * GS, 17 * GS) v.shadow.Position = UDim2.fromOffset(GS, GS) v.count = F.textLabel(v.holder, 8 * GS, z + 3) v.count.TextColor3 = Color3.new(1, 1, 1) v.count.Size = UDim2.fromOffset(17 * GS, 17 * GS) return v end F.setView = function(v, st) if st then if v.id ~= st.id then if v.icon then v.icon:Destroy() end v.icon = F.cloneIcon(st.id) v.icon.ZIndex = v.holder.ZIndex + 1 v.icon.Parent = v.holder v.id = st.id end local t = st.n > 1 and tostring(st.n) or "" v.count.Text = t v.shadow.Text = t else if v.icon then v.icon:Destroy() v.icon = nil end v.id = nil v.count.Text = "" v.shadow.Text = "" end end local hud = Instance.new("Frame") hud.Name = "MinecraftHUD" hud.BackgroundTransparency = 1 hud.Size = UDim2.fromScale(1, 1) hud.Parent = gui -- Restore the attachment's original hotbar. The previous merge accidentally -- removed this block while leaving refresh(), selectHotbar(), and the render loop -- referring to hudViews and selFrame. That nil reference stopped initialization -- before the GUI and player interactions could finish initializing. local MAIN_HOTBAR_SCALE = 0.78 -- Shrinks only the main HUD row that holds the grass block and tools. local hotbar = F.buildImage(IMG.hotbar, GS) hotbar.Name = "HotbarBackground" hotbar.Position = UDim2.new(0.5, -91 * GS * MAIN_HOTBAR_SCALE, 1, -23 * GS * MAIN_HOTBAR_SCALE) hotbar.ZIndex = 1 hotbar.Parent = hud local mainHotbarScale = Instance.new("UIScale") mainHotbarScale.Name = "MainHotbarScale" mainHotbarScale.Scale = MAIN_HOTBAR_SCALE mainHotbarScale.Parent = hotbar local selFrame = F.buildImage(IMG.hotbar_sel, GS) selFrame.Name = "HotbarSelection" selFrame.ZIndex = 2 selFrame.Parent = hotbar local hudViews = {} F.selectHotbar = function(i) i = math.clamp(math.floor(i), 0, 8) selected = i end for i = 0, 8 do hudViews[i] = F.newView(hotbar, 3 + i * 20, 3, 3) local button = Instance.new("TextButton") button.Name = "HotbarSlot" .. i button.BackgroundTransparency = 1 button.Text = "" button.AutoButtonColor = false button.Active = true button.Size = UDim2.fromOffset(20 * GS, 22 * GS) button.Position = UDim2.fromOffset(i * 20 * GS, 0) button.ZIndex = 20 button.Parent = hotbar local slotIndex = i F.track(button.Activated:Connect(function() F.selectHotbar(slotIndex) end)) F.track(button.InputBegan:Connect(function(input) local inputType = input.UserInputType if inputType == Enum.UserInputType.MouseButton1 or inputType == Enum.UserInputType.Touch then F.selectHotbar(slotIndex) end end)) end F.selectHotbar(8) -- Creative HUD keeps the hotbar and crosshair but has no XP bar. local crosshair = F.buildImage(IMG.crosshair, GS) crosshair.AnchorPoint = Vector2.new(0.5, 0.5) crosshair.Position = UDim2.fromScale(0.5, 0.5) crosshair.Parent = hud local nameLabel = Instance.new("TextLabel") nameLabel.BackgroundTransparency = 1 nameLabel.Font = Enum.Font.Arcade nameLabel.TextSize = 8 * GS nameLabel.TextColor3 = Color3.new(1, 1, 1) nameLabel.TextStrokeTransparency = 0.3 nameLabel.AnchorPoint = Vector2.new(0.5, 1) nameLabel.Position = UDim2.new(0.5, 0, 1, -(23 + 22) * GS * MAIN_HOTBAR_SCALE) nameLabel.Size = UDim2.fromOffset(200 * GS, 10 * GS) nameLabel.Text = "" nameLabel.Parent = hud local nameUntil, lastSel = 0, -1 invOpen = false local invDim = Instance.new("TextButton") invDim.Text = "" invDim.AutoButtonColor = false invDim.BackgroundColor3 = Color3.new(0, 0, 0) invDim.BackgroundTransparency = 0.55 invDim.BorderSizePixel = 0 invDim.Size = UDim2.fromScale(1, 1) invDim.Visible = false invDim.Parent = gui -- Keep the original inventory texture intact: the black player-preview rectangle, -- armor-slot art, crafting grid, arrow, and result slot all remain visible. No 2D Steve -- sprite is drawn over the preview area. panel = F.buildImage(IMG.inventory, GS) panel.Name = "SecondaryInventoryPanel" panel.AnchorPoint = Vector2.new(0.5, 0.5) panel.Position = UDim2.fromScale(0.5, 0.5) panel.Active = true panel.ZIndex = 30 panel.Parent = invDim for _, child in ipairs(panel:GetDescendants()) do if child:IsA("GuiObject") then child.ZIndex = 31 end end local inventoryScale = Instance.new("UIScale") inventoryScale.Scale = 0.55 inventoryScale.Parent = panel local layout = {} -- Vanilla 1.12.1 player-container positions on the unmodified 176x166 background. layout[0] = { 152, 28 } -- crafting output layout[1] = { 96, 17 } layout[2] = { 114, 17 } layout[3] = { 96, 35 } layout[4] = { 114, 35 } -- Armor slots are drawn by the original background; no 2D player preview is drawn. layout[5] = { 8, 8 } -- head layout[6] = { 8, 26 } -- chest layout[7] = { 8, 44 } -- legs layout[8] = { 8, 62 } -- feet for r = 0, 2 do for c = 0, 8 do layout[9 + c + r * 9] = { 8 + c * 18, 84 + r * 18 } end end for c = 0, 8 do layout[36 + c] = { 8 + c * 18, 142 } end layout[45] = { 77, 62 } local views = {} local slotButtons = {} local hover = nil local highlight = Instance.new("Frame") highlight.BackgroundColor3 = Color3.new(1, 1, 1) highlight.BackgroundTransparency = 0.5 highlight.BorderSizePixel = 0 highlight.Size = UDim2.fromOffset(16 * GS, 16 * GS) highlight.ZIndex = 38 highlight.Visible = false highlight.Parent = panel local carriedView = F.newView(gui, 0, 0, 30) carriedView.holder.Visible = false local tooltip = Instance.new("TextLabel") tooltip.BackgroundColor3 = Color3.fromRGB(16, 0, 16) tooltip.BackgroundTransparency = 0.06 tooltip.BorderSizePixel = 0 tooltip.Font = Enum.Font.Arcade tooltip.TextSize = 8 * GS tooltip.TextColor3 = Color3.new(1, 1, 1) tooltip.ZIndex = 40 tooltip.Visible = false tooltip.Size = UDim2.fromOffset(100 * GS, 12 * GS) tooltip.Parent = gui local stroke = Instance.new("UIStroke") stroke.Color = Color3.fromRGB(40, 0, 77) stroke.Thickness = GS stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border stroke.Parent = tooltip refresh = function() for i = 0, 45 do if views[i] then F.setView(views[i], slots[i]) end end for i = 0, 8 do if hudViews[i] then F.setView(hudViews[i], slots[36 + i]) end end F.setView(carriedView, carried) carriedView.holder.Visible = invOpen and carried ~= nil if hover ~= nil and slots[hover] and not carried then tooltip.Text = ITEMS[slots[hover].id].name tooltip.Size = UDim2.fromOffset((#tooltip.Text * 6 + 8) * GS, 12 * GS) tooltip.Visible = invOpen else tooltip.Visible = false end end F.quickMove = function(idx) local s = slots[idx] if not s then return end if (idx >= 1 and idx <= 4) or idx == 45 then F.insertStack(s, 9, 44) elseif idx >= 9 and idx <= 35 then F.insertStack(s, 36, 44) elseif idx >= 36 and idx <= 44 then F.insertStack(s, 9, 35) end if s and s.n <= 0 then slots[idx] = nil end F.updateCraft() end F.resultClick = function(shift) local r = slots[0] if not r then return end if shift then for _ = 1, 64 do r = slots[0] if not r then break end if not F.canFit(r.id, r.n, 9, 44) then break end F.insertStack({ id = r.id, n = r.n }, 9, 44) F.consumeCraft() end else if carried == nil then carried = { id = r.id, n = r.n } F.consumeCraft() elseif carried.id == r.id and carried.n + r.n <= F.maxOf(r.id) then carried.n += r.n F.consumeCraft() end end end F.clickSlot = function(idx, button, shift) if idx == 0 then F.resultClick(shift) refresh() return end if shift then F.quickMove(idx) refresh() return end local s = slots[idx] if button == 1 then if carried == nil then if s then carried = s slots[idx] = nil end elseif s == nil then if F.canPlace(idx, carried) then slots[idx] = carried carried = nil end elseif s.id == carried.id and F.maxOf(s.id) > 1 then local mv = math.min(F.maxOf(s.id) - s.n, carried.n) s.n += mv carried.n -= mv if carried.n <= 0 then carried = nil end elseif F.canPlace(idx, carried) then slots[idx], carried = carried, s end else if carried == nil then if s then local take = math.ceil(s.n / 2) carried = { id = s.id, n = take } s.n -= take if s.n <= 0 then slots[idx] = nil end end elseif s == nil then if F.canPlace(idx, carried) then slots[idx] = { id = carried.id, n = 1 } carried.n -= 1 end elseif s.id == carried.id and s.n < F.maxOf(s.id) then s.n += 1 carried.n -= 1 elseif F.canPlace(idx, carried) then slots[idx], carried = carried, s end if carried and carried.n <= 0 then carried = nil end end F.updateCraft() refresh() end for idx, p in pairs(layout) do views[idx] = F.newView(panel, p[1], p[2], 33) local b = Instance.new("TextButton") b.BackgroundTransparency = 1 b.Text = "" b.AutoButtonColor = false b.Size = UDim2.fromOffset(18 * GS, 18 * GS) b.Position = UDim2.fromOffset((p[1] - 1) * GS, (p[2] - 1) * GS) b.ZIndex = 42 b.Parent = panel slotButtons[idx] = b local touchStart = 0 F.track(b.MouseEnter:Connect(function() hover = idx highlight.Position = UDim2.fromOffset(p[1] * GS, p[2] * GS) highlight.Visible = true refresh() end)) F.track(b.MouseLeave:Connect(function() if hover == idx then hover = nil highlight.Visible = false refresh() end end)) F.track(b.InputBegan:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 then F.clickSlot(idx, 1, UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift)) elseif t == Enum.UserInputType.MouseButton2 then F.clickSlot(idx, 2, false) elseif t == Enum.UserInputType.Touch then touchStart = os.clock() F.activeTouchSlot = idx F.touchDragStartPos = Vector2.new(input.Position.X, input.Position.Y) F.touchDragStartTime = touchStart F.touchDragCanPick = carried == nil and slots[idx] ~= nil F.touchDragging = false hover = idx highlight.Position = UDim2.fromOffset(p[1] * GS, p[2] * GS) highlight.Visible = true end end)) F.track(b.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch and touchStart > 0 then local long = os.clock() - touchStart > 0.35 local endPos = Vector2.new(input.Position.X, input.Position.Y) if F.touchDragging then local hitDelete = false local deleteButton = F.deleteButton if deleteButton and deleteButton.Visible then local ap, as = deleteButton.AbsolutePosition, deleteButton.AbsoluteSize hitDelete = endPos.X >= ap.X and endPos.X <= ap.X + as.X and endPos.Y >= ap.Y and endPos.Y <= ap.Y + as.Y end if hitDelete then carried = nil refresh() else local targetSlot = nil for targetIdx, targetButton in pairs(slotButtons) do if targetButton.Visible then local ap, as = targetButton.AbsolutePosition, targetButton.AbsoluteSize if endPos.X >= ap.X and endPos.X <= ap.X + as.X and endPos.Y >= ap.Y and endPos.Y <= ap.Y + as.Y then targetSlot = targetIdx break end end end if targetSlot ~= nil then F.clickSlot(targetSlot, 1, false) end end else F.clickSlot(idx, long and 2 or 1, false) end touchStart = 0 F.activeTouchSlot = nil F.touchDragStartPos = nil F.touchDragCanPick = false F.touchDragging = false hover = nil highlight.Visible = false refresh() end end)) end F.track(invDim.InputBegan:Connect(function(input) if not invOpen or carried == nil then return end local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 or t == Enum.UserInputType.Touch then carried = nil refresh() elseif t == Enum.UserInputType.MouseButton2 then carried.n -= 1 if carried.n <= 0 then carried = nil end refresh() end end)) F.setInventory = function(open) if F.playerDead and open then return end if open == invOpen then return end invOpen = open if F.applyCameraMode then F.applyCameraMode() end invDim.Visible = open attackHeld = false useHeld = false if F.stopUseItem then F.stopUseItem() end touchJumpHeld = false F.stopDestroyBlock() if not open then for i = 1, 4 do if slots[i] then F.insertStack(slots[i], 9, 44) slots[i] = nil end end if carried then F.insertStack(carried, 9, 44) carried = nil end F.updateCraft() hover = nil highlight.Visible = false end if F.updateInventoryPage then F.updateInventoryPage() end crosshair.Visible = not open refresh() end local touchButtons = {} local sprintToggle, sneakToggle = false, false F.makeButton = function(label, order, cb, opts) opts = opts or {} local b = Instance.new("TextButton") b.Text = label b.Font = Enum.Font.Arcade b.TextSize = opts.textSize or 14 b.TextColor3 = Color3.new(1, 1, 1) b.BackgroundColor3 = Color3.fromRGB(0, 0, 0) b.BackgroundTransparency = 0.18 b.BorderSizePixel = 0 b.AutoButtonColor = false b.Size = opts.size or UDim2.fromOffset(74, 34) if opts.pos then b.Position = opts.pos else b.Position = UDim2.new(1, -84, 0.18, order * 42) end b.AnchorPoint = opts.anchor or Vector2.new(0, 0) b.ZIndex = 12 b.Parent = controlsGui if opts.hold then F.track(b.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then cb(b, true) end end)) F.track(b.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then cb(b, false) end end)) else F.track(b.Activated:Connect(function() cb(b) end)) end touchButtons[#touchButtons + 1] = b return b end F.paintToggle = function(b, _on) b.BackgroundColor3 = Color3.fromRGB(0, 0, 0); b.BackgroundTransparency = 0.18; b.BorderSizePixel = 0 end local viewMode = 0 local creativeBtn, flyBtn local cameraViewButton if UIS.TouchEnabled then -- Keep jump on the right. Sneak, inventory, primary and secondary actions -- are placed around the D-pad itself below. F.makeButton("○", 0, function(_, down) touchJumpHeld = down and not invOpen end, { hold = true, size = UDim2.fromOffset(70, 38), pos = UDim2.new(1, -82, 0.55, 0), color = Color3.fromRGB(70, 100, 160), textSize = 22, }) end F.deleteButton = Instance.new("TextButton") F.deleteButton.Name = "DeleteCarriedItem" F.deleteButton.AnchorPoint = Vector2.new(0, 0) -- Place the tiny X in the right margin aligned with the hotbar/inventory row. F.deleteButton.Position = UDim2.fromOffset(170 * GS, 142 * GS) F.deleteButton.Size = UDim2.fromOffset(12 * GS, 18 * GS) F.deleteButton.BackgroundColor3 = Color3.fromRGB(150, 45, 45) F.deleteButton.BorderSizePixel = 1 F.deleteButton.BorderColor3 = Color3.fromRGB(35, 20, 20) F.deleteButton.Text = "X" F.deleteButton.TextColor3 = Color3.new(1, 1, 1) F.deleteButton.Font = Enum.Font.Code F.deleteButton.TextScaled = true F.deleteButton.ZIndex = 46 F.deleteButton.Parent = panel F.track(F.deleteButton.Activated:Connect(function() if carried then carried = nil; refresh() end end)) --------------------------------------------------------------------- -- CREATIVE INVENTORY PLACEHOLDER --------------------------------------------------------------------- -- Reserved UI space for the future creative item browser. It is intentionally a -- placeholder: the survival inventory/crafting implementation above remains real. creativePlaceholder = Instance.new("Frame") creativePlaceholder.Name = "CreativeInventoryPlaceholder" creativePlaceholder.AnchorPoint = Vector2.new(0.5, 0.5) creativePlaceholder.Position = UDim2.fromScale(0.5, 0.5) creativePlaceholder.Size = UDim2.fromOffset(176 * GS, 166 * GS) creativePlaceholder.BackgroundColor3 = Color3.fromRGB(198, 198, 198) creativePlaceholder.BorderSizePixel = 0 creativePlaceholder.ZIndex = 20 creativePlaceholder.Visible = false creativePlaceholder.Parent = invDim local creativeInventoryScale = Instance.new("UIScale") creativeInventoryScale.Scale = 0.32 creativeInventoryScale.Parent = creativePlaceholder local cpStroke = Instance.new("UIStroke") cpStroke.Color = Color3.fromRGB(55, 55, 55) cpStroke.Thickness = math.max(1, GS) cpStroke.Parent = creativePlaceholder local cpTitle = Instance.new("TextLabel") cpTitle.BackgroundColor3 = Color3.fromRGB(55, 55, 55) cpTitle.BorderSizePixel = 0 cpTitle.Position = UDim2.fromOffset(3 * GS, 3 * GS) cpTitle.Size = UDim2.new(1, -6 * GS, 0, 18 * GS) cpTitle.Font = Enum.Font.Arcade cpTitle.TextSize = 9 * GS cpTitle.TextColor3 = Color3.new(1, 1, 1) cpTitle.Text = "CREATIVE INVENTORY" cpTitle.ZIndex = 21 cpTitle.Parent = creativePlaceholder local cpNote = Instance.new("TextLabel") cpNote.BackgroundTransparency = 1 cpNote.Position = UDim2.fromOffset(7 * GS, 24 * GS) cpNote.Size = UDim2.new(1, -14 * GS, 0, 23 * GS) cpNote.Font = Enum.Font.Code cpNote.TextSize = 8 * GS cpNote.TextColor3 = Color3.fromRGB(45, 45, 45) cpNote.TextWrapped = true cpNote.Text = "Creative catalog placeholder" cpNote.ZIndex = 21 cpNote.Parent = creativePlaceholder local cpSearch = Instance.new("TextBox") cpSearch.Name = "CreativeSearchPlaceholder" cpSearch.Position = UDim2.fromOffset(7 * GS, 49 * GS) cpSearch.Size = UDim2.new(1, -14 * GS, 0, 14 * GS) cpSearch.BackgroundColor3 = Color3.fromRGB(238, 238, 238) cpSearch.BorderSizePixel = 1 cpSearch.BorderColor3 = Color3.fromRGB(55, 55, 55) cpSearch.Font = Enum.Font.Code cpSearch.TextSize = 8 * GS cpSearch.TextColor3 = Color3.fromRGB(55, 55, 55) cpSearch.PlaceholderText = "Search items (not active yet)" cpSearch.Text = "" cpSearch.ClearTextOnFocus = false cpSearch.ZIndex = 21 cpSearch.Parent = creativePlaceholder local cpCategoryNames = { "BLOCKS", "DECOR", "TOOLS", "MISC" } for i, name in ipairs(cpCategoryNames) do local cat = Instance.new("TextButton") cat.Name = "CreativeCategory_" .. name cat.Position = UDim2.fromOffset((7 + (i - 1) * 41) * GS, 67 * GS) cat.Size = UDim2.fromOffset(39 * GS, 12 * GS) cat.BackgroundColor3 = Color3.fromRGB(145, 145, 145) cat.BorderSizePixel = 1 cat.BorderColor3 = Color3.fromRGB(55, 55, 55) cat.Font = Enum.Font.Code cat.TextSize = 6 * GS cat.TextColor3 = Color3.new(1, 1, 1) cat.Text = name cat.ZIndex = 21 cat.Parent = creativePlaceholder cat.Active = false end for row = 0, 2 do for col = 0, 8 do local cell = Instance.new("Frame") cell.Name = string.format("CreativeSlotPlaceholder_%02d", row * 9 + col + 1) cell.Position = UDim2.fromOffset((7 + col * 18) * GS, (83 + row * 18) * GS) cell.Size = UDim2.fromOffset(16 * GS, 16 * GS) cell.BackgroundColor3 = Color3.fromRGB(120, 120, 120) cell.BorderSizePixel = 1 cell.BorderColor3 = Color3.fromRGB(70, 70, 70) cell.ZIndex = 21 cell.Parent = creativePlaceholder end end local cpClose = Instance.new("TextButton") cpClose.Name = "SwitchToSurvivalInventory" cpClose.AnchorPoint = Vector2.new(1, 1) cpClose.Position = UDim2.new(1, -4 * GS, 1, -4 * GS) cpClose.Size = UDim2.fromOffset(54 * GS, 13 * GS) cpClose.BackgroundColor3 = Color3.fromRGB(100, 100, 100) cpClose.BorderSizePixel = 1 cpClose.BorderColor3 = Color3.fromRGB(40, 40, 40) cpClose.Font = Enum.Font.Arcade cpClose.TextSize = 7 * GS cpClose.TextColor3 = Color3.new(1, 1, 1) cpClose.Text = "SURVIVAL >" cpClose.ZIndex = 22 cpClose.Visible = true cpClose.Parent = creativePlaceholder local inventoryPageToggle = nil creativeTabButton = Instance.new("TextButton") creativeTabButton.Name = "SwitchToCreativeInventory" creativeTabButton.Position = UDim2.fromOffset(112 * GS, 5 * GS) creativeTabButton.Size = UDim2.fromOffset(59 * GS, 12 * GS) creativeTabButton.BackgroundColor3 = Color3.fromRGB(80, 110, 80) creativeTabButton.BorderSizePixel = 1 creativeTabButton.BorderColor3 = Color3.fromRGB(45, 45, 45) creativeTabButton.Font = Enum.Font.Code creativeTabButton.TextSize = 6 * GS creativeTabButton.TextColor3 = Color3.new(1, 1, 1) creativeTabButton.Text = "CREATIVE >" creativeTabButton.ZIndex = 25 creativeTabButton.Visible = false creativeTabButton.Parent = panel F.track(cpClose.Activated:Connect(function() if invOpen then F.setInventoryPage("survival") end end)) F.track(creativeTabButton.Activated:Connect(function() if invOpen and creative then F.setInventoryPage("creative") end end)) F.updateInventoryPage = function() local page = inventoryPage local showCreative = invOpen and creative and page == "creative" local showSurvival = invOpen and page == "survival" creativePlaceholderOpen = showCreative creativePlaceholder.Visible = showCreative panel.Visible = showSurvival if F.deleteButton then F.deleteButton.Visible = showSurvival end cpClose.Visible = false creativeTabButton.Visible = false if inventoryPageToggle then inventoryPageToggle.Visible = invOpen and creative inventoryPageToggle.Text = "" end if showCreative then creativePlaceholder.ZIndex = 50 else creativePlaceholder.ZIndex = 20 end if F.updateHudVisibility then F.updateHudVisibility() end end F.setInventoryPage = function(page) if page ~= "creative" and page ~= "survival" then return end if page == "creative" and not creative then return end inventoryPage = page hover = nil highlight.Visible = false if F.updateInventoryPage then F.updateInventoryPage() end refresh() end inventoryPageToggle = Instance.new("TextButton") inventoryPageToggle.Name = "InventoryPageToggle" inventoryPageToggle.AnchorPoint = Vector2.new(0, 0) -- A single toggle outside the panel's lower-right corner, so it does not cover slots. inventoryPageToggle.Position = UDim2.new(0.5, 46 * GS, 0.5, 45 * GS) inventoryPageToggle.Size = UDim2.fromOffset(18 * GS, 18 * GS) inventoryPageToggle.BackgroundColor3 = Color3.fromRGB(198, 198, 198) inventoryPageToggle.BorderSizePixel = 1 inventoryPageToggle.BorderColor3 = Color3.fromRGB(55, 55, 55) inventoryPageToggle.Text = "" inventoryPageToggle.ZIndex = 75 inventoryPageToggle.Visible = false inventoryPageToggle.Parent = invDim -- Pixel-painted vanilla-style chest face: no external image or asset dependency. local chestPixelFolder = Instance.new("Frame") chestPixelFolder.Name = "PixelChestIcon" chestPixelFolder.BackgroundTransparency = 1 chestPixelFolder.Position = UDim2.fromOffset(GS, GS) chestPixelFolder.Size = UDim2.fromOffset(16 * GS, 16 * GS) chestPixelFolder.Active = false chestPixelFolder.ZIndex = 76 chestPixelFolder.Parent = inventoryPageToggle -- A tiny isometric, blocky chest icon, using the vanilla inventory gray behind it. local chestPalette = { outline = Color3.fromRGB(52, 31, 17), deep = Color3.fromRGB(91, 49, 22), wood = Color3.fromRGB(148, 86, 38), light = Color3.fromRGB(190, 126, 61), top = Color3.fromRGB(214, 157, 82), glint = Color3.fromRGB(235, 190, 119), latch = Color3.fromRGB(127, 127, 127), metalLight = Color3.fromRGB(191, 191, 191), } local chestPixels = {} for y = 0, 15 do chestPixels[y] = {} end local function chestPixel(x, y, color) if x >= 0 and x < 16 and y >= 0 and y < 16 then chestPixels[y][x] = color end end -- Top plane: a shaded, slanted wooden lid. for y = 2, 5 do local leftEdge = 5 - (y - 2) local rightEdge = 10 + (y - 2) for x = leftEdge, rightEdge do local color = (y == 2 or x == leftEdge or x == rightEdge) and "outline" or "top" if y == 3 and x >= 7 and x <= 9 then color = "glint" end if y == 4 and x <= 5 then color = "light" end chestPixel(x, y, color) end end -- Front panel. for y = 5, 13 do for x = 2, 12 do local color if y == 5 or y == 13 or x == 2 or x == 12 then color = "outline" elseif y == 6 then color = "deep" elseif y == 7 or y == 8 then color = (x <= 4) and "light" or "wood" elseif y == 9 or y == 10 then color = (x <= 4) and "wood" or "light" elseif y == 11 or y == 12 then color = (x <= 4) and "deep" or "wood" end chestPixel(x, y, color) end end -- Darker right side gives the chest its Minecraft inventory-item perspective. for y = 5, 12 do for x = 12, 14 do local color if x == 12 or x == 14 or y == 5 or y == 12 then color = "outline" elseif x == 13 then color = (y <= 8) and "deep" or "wood" end chestPixel(x, y, color) end end -- Gold latch and lid seam. for x = 3, 12 do chestPixel(x, 6, "outline") end chestPixel(7, 7, "outline") chestPixel(8, 7, "latch") chestPixel(7, 8, "latch") chestPixel(8, 8, "metalLight") chestPixel(7, 9, "latch") chestPixel(8, 9, "outline") for x = 3, 11 do if x % 3 == 0 then chestPixel(x, 11, "light") end end for y = 0, 15 do for x = 0, 15 do local shade = chestPixels[y][x] if shade then local pixel = Instance.new("Frame") pixel.BorderSizePixel = 0 pixel.BackgroundColor3 = chestPalette[shade] pixel.Position = UDim2.fromOffset(x * GS, y * GS) pixel.Size = UDim2.fromOffset(GS, GS) pixel.ZIndex = 77 pixel.Parent = chestPixelFolder end end end F.track(inventoryPageToggle.Activated:Connect(function() if not invOpen or not creative then return end F.setInventoryPage(inventoryPage == "creative" and "survival" or "creative") end)) -- Raise the creative-page controls above the unchanged survival-page panel. for _, child in ipairs(creativePlaceholder:GetDescendants()) do if child:IsA("GuiObject") then child.ZIndex = child.ZIndex + 40 end end creativePlaceholder.ZIndex = 50 local dropInventoryButton = Instance.new("TextButton") dropInventoryButton.Name = "DropMainInventoryItem" dropInventoryButton.AnchorPoint = Vector2.new(0, 1) -- This button belongs to the main HUD hotbar, not the creative or survival inventory screen. dropInventoryButton.Position = UDim2.new(0.5, 91 * GS * MAIN_HOTBAR_SCALE + 3 * GS, 1, -1 * GS * MAIN_HOTBAR_SCALE) dropInventoryButton.Size = UDim2.fromOffset(34 * GS * MAIN_HOTBAR_SCALE, 18 * GS * MAIN_HOTBAR_SCALE) dropInventoryButton.BackgroundColor3 = Color3.fromRGB(48, 48, 48) dropInventoryButton.BackgroundTransparency = 0 dropInventoryButton.BorderSizePixel = 0 dropInventoryButton.Font = Enum.Font.Arcade dropInventoryButton.Text = "DROP" dropInventoryButton.TextSize = 7 * GS dropInventoryButton.TextColor3 = Color3.new(1, 1, 1) dropInventoryButton.AutoButtonColor = true dropInventoryButton.ZIndex = 25 dropInventoryButton.Parent = controlsGui F.track(dropInventoryButton.Activated:Connect(function() if F.dropInventorySelection then local all = UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift) F.dropInventorySelection(all) end end)) -- The creative catalog stays visibly unfinished and cannot be interacted with yet. local comingSoonOverlay = Instance.new("Frame") comingSoonOverlay.Name = "CreativeComingSoonOverlay" comingSoonOverlay.BackgroundColor3 = Color3.fromRGB(18, 18, 18) comingSoonOverlay.BackgroundTransparency = 0.35 comingSoonOverlay.BorderSizePixel = 0 comingSoonOverlay.Position = UDim2.fromScale(0, 0) comingSoonOverlay.Size = UDim2.fromScale(1, 1) comingSoonOverlay.Active = true comingSoonOverlay.ZIndex = 120 comingSoonOverlay.Parent = creativePlaceholder local comingSoonText = Instance.new("TextLabel") comingSoonText.Name = "ComingSoonText" comingSoonText.BackgroundTransparency = 1 comingSoonText.AnchorPoint = Vector2.new(0.5, 0.5) comingSoonText.Position = UDim2.fromScale(0.5, 0.5) comingSoonText.Size = UDim2.new(1, -10 * GS, 0, 28 * GS) comingSoonText.Font = Enum.Font.Arcade comingSoonText.Text = "Coming soon" comingSoonText.TextColor3 = Color3.fromRGB(255, 255, 255) comingSoonText.TextStrokeColor3 = Color3.fromRGB(0, 0, 0) comingSoonText.TextStrokeTransparency = 0.15 comingSoonText.TextScaled = true comingSoonText.ZIndex = 121 comingSoonText.Parent = comingSoonOverlay --------------------------------------------------------------------- -- POJAVLAUNCHER-STYLE TOUCH HUD: TOP BAR, D-PAD, CHAT AND DEBUG --------------------------------------------------------------------- local topToolbar = Instance.new("Frame") topToolbar.Name = "PojavTouchToolbar" topToolbar.AnchorPoint = Vector2.new(0.5, 0) topToolbar.Position = UDim2.new(0.5, 0, 0, 3) topToolbar.Size = UDim2.fromOffset(304, 31) topToolbar.BackgroundTransparency = 1 topToolbar.Visible = UIS.TouchEnabled topToolbar.ZIndex = 10 topToolbar.Parent = controlsGui local pojavButtons = {} F.makePojavTopButton = function(label, x, width, callback, alwaysVisible) local b = Instance.new("TextButton") b.Name = "Pojav_" .. label:gsub("[^%w]", "") b.Position = UDim2.fromOffset(x, 1) b.Size = UDim2.fromOffset(width, 27) b.BackgroundColor3 = Color3.fromRGB(0, 0, 0) b.BackgroundTransparency = 0.18 b.BorderSizePixel = 0 b.Text = label b.TextColor3 = Color3.fromRGB(245, 247, 250) b.TextSize = 10 b.Font = Enum.Font.Code b.AutoButtonColor = false b.ZIndex = 11 b.Parent = topToolbar F.track(b.Activated:Connect(callback)) pojavButtons[#pojavButtons + 1] = {button = b, always = alwaysVisible == true} return b end local debugEnabled = false F.updateHudVisibility = function() hud.Visible = hudVisible if debugPanel then debugPanel.Visible = hudVisible and debugEnabled end if topToolbar then -- Touch controls sit underneath inventory/chat overlays and never cover the inventory window. topToolbar.Visible = UIS.TouchEnabled for _, entry in ipairs(pojavButtons) do entry.button.Visible = (entry.always or hudVisible) end end for _, b in ipairs(touchButtons) do b.Visible = hudVisible end if mobileDpad then mobileDpad.Visible = hudVisible and UIS.TouchEnabled end if dropInventoryButton then dropInventoryButton.Visible = hudVisible end if chatPanel then chatPanel.Visible = hudVisible if chatInput then chatInput.Visible = hudVisible and chatOpen end end end F.toggleDebug = function() debugEnabled = not debugEnabled if debugPanel then debugPanel:SetAttribute("MCEnabled", debugEnabled) debugPanel.Visible = debugEnabled and hudVisible end end -- Debug readout is intentionally small and Pojav-like rather than a new full HUD. debugPanel = Instance.new("Frame") debugPanel.Name = "PojavDebugOverlay" debugPanel.Position = UDim2.new(0, 8, 0, 38) debugPanel.Size = UDim2.new(1, -16, 0, 112) debugPanel.BackgroundColor3 = Color3.new(0, 0, 0) debugPanel.BackgroundTransparency = 0.35 debugPanel.BorderSizePixel = 0 debugPanel.Visible = false debugPanel.ZIndex = 15 debugPanel.Parent = gui debugText = Instance.new("TextLabel") debugText.Name = "DebugText" debugText.BackgroundTransparency = 1 debugText.Position = UDim2.fromOffset(6, 4) debugText.Size = UDim2.new(1, -12, 1, -8) debugText.Font = Enum.Font.Code debugText.TextSize = 12 debugText.TextColor3 = Color3.new(1, 1, 1) debugText.TextXAlignment = Enum.TextXAlignment.Left debugText.TextYAlignment = Enum.TextYAlignment.Top debugText.TextWrapped = false debugText.ZIndex = 16 debugText.Parent = debugPanel chatPanel = Instance.new("Frame") chatPanel.Name = "JavaLocalChat" chatPanel.Position = UDim2.new(0, 0, 1, -188) chatPanel.Size = UDim2.new(1, 0, 0, 160) chatPanel.BackgroundTransparency = 1 chatPanel.BorderSizePixel = 0 chatPanel.Visible = true chatPanel.ZIndex = 90 chatPanel.Parent = gui chatRowsFrame = Instance.new("Frame") chatRowsFrame.Name = "ChatLines" chatRowsFrame.Position = UDim2.fromOffset(0, 0) chatRowsFrame.Size = UDim2.new(1, 0, 1, -30) chatRowsFrame.BackgroundTransparency = 1 chatRowsFrame.BorderSizePixel = 0 chatRowsFrame.ClipsDescendants = true chatRowsFrame.ZIndex = 90 chatRowsFrame.Parent = chatPanel local chatRowsLayout = Instance.new("UIListLayout") chatRowsLayout.Name = "BottomAlignedChatLayout" chatRowsLayout.FillDirection = Enum.FillDirection.Vertical chatRowsLayout.HorizontalAlignment = Enum.HorizontalAlignment.Left chatRowsLayout.VerticalAlignment = Enum.VerticalAlignment.Bottom chatRowsLayout.SortOrder = Enum.SortOrder.LayoutOrder chatRowsLayout.Padding = UDim.new(0, 0) chatRowsLayout.Parent = chatRowsFrame -- The row frame replaces the old large opaque chat rectangle. Each line receives -- its own translucent black background, like Java Edition's HUD chat. chatHistoryLabel = chatRowsFrame chatInput = Instance.new("TextBox") chatInput.Name = "ChatInput" chatInput.Position = UDim2.new(0, 0, 1, -27) chatInput.Size = UDim2.new(1, 0, 0, 25) chatInput.BackgroundColor3 = Color3.fromRGB(0, 0, 0) chatInput.BackgroundTransparency = 0.56 chatInput.BorderSizePixel = 0 chatInput.BorderColor3 = Color3.fromRGB(80, 80, 80) chatInput.TextColor3 = Color3.fromRGB(255, 255, 255) chatInput.PlaceholderColor3 = Color3.fromRGB(190, 190, 190) chatInput.PlaceholderText = "" chatInput.Text = "" chatInput.ClearTextOnFocus = false chatInput.Font = Enum.Font.Arcade chatInput.TextSize = 11 chatInput.TextXAlignment = Enum.TextXAlignment.Left chatInput.Visible = false chatInput.ZIndex = 92 chatInput.Parent = chatPanel local chatEntries = {} local function escapeRichText(value) return tostring(value):gsub("&", "&"):gsub("<", "<"):gsub(">", ">"):gsub('"', """):gsub("'", "'") end local function renderChatEntries() for _, child in ipairs(chatRowsFrame:GetChildren()) do if child:IsA("TextLabel") then child:Destroy() end end for index, entry in ipairs(chatEntries) do local row = Instance.new("TextLabel") row.Name = "ChatLine" .. tostring(index) row.LayoutOrder = index row.BackgroundColor3 = Color3.fromRGB(0, 0, 0) row.BackgroundTransparency = 0.56 row.BorderSizePixel = 0 row.Size = UDim2.new(1, 0, 0, 14) row.AutomaticSize = Enum.AutomaticSize.Y row.Font = Enum.Font.Arcade row.TextSize = 10 row.TextStrokeColor3 = Color3.fromRGB(0, 0, 0) row.TextStrokeTransparency = 0.60 row:SetAttribute("MCChatCreatedAt", entry.time or os.clock()) row.TextColor3 = Color3.fromRGB(255, 255, 255) row.TextXAlignment = Enum.TextXAlignment.Left row.TextYAlignment = Enum.TextYAlignment.Center row.TextWrapped = true row.RichText = true row.Text = entry.color and ('' .. escapeRichText(entry.text) .. '') or escapeRichText(entry.text) row.ZIndex = 91 row.Parent = chatRowsFrame end end F.appendChatLine = function(line, color) line = tostring(line or "") if not color and (line:match(" joined the game$") or line:match(" left the game$")) then color = "#FFFF55" -- Java formatting code §e (yellow). end table.insert(chatEntries, { text = line, color = color, time = os.clock() }) while #chatEntries > 8 do table.remove(chatEntries, 1) end renderChatEntries() end local chatFadeAccumulator = 0 F.track(RunService.Heartbeat:Connect(function(dt) chatFadeAccumulator += dt if chatFadeAccumulator < 0.1 then return end chatFadeAccumulator = 0 if not chatRowsFrame or not chatRowsFrame.Parent then return end local now = os.clock() for _, row in ipairs(chatRowsFrame:GetChildren()) do if row:IsA("TextLabel") then local createdAt = row:GetAttribute("MCChatCreatedAt") or now local age = math.max(0, now - createdAt) if chatOpen then row.Visible = true row.TextTransparency = 0 row.BackgroundTransparency = 0.56 else local fresh = age < 10 row.Visible = fresh if fresh then row.AutomaticSize = Enum.AutomaticSize.Y local fade = age <= 8 and 1 or math.clamp((10 - age) / 2, 0, 1) row.TextTransparency = 1 - fade row.BackgroundTransparency = 1 - 0.44 * fade else row.AutomaticSize = Enum.AutomaticSize.None row.Size = UDim2.new(1, 0, 0, 0) row.TextTransparency = 1 row.BackgroundTransparency = 1 end end end end end)) -- Announce the players already in this server, then watch future join/leave events. for _, existingPlayer in ipairs(Players:GetPlayers()) do if existingPlayer ~= lp then F.appendChatLine(tostring(existingPlayer.DisplayName or existingPlayer.Name) .. " joined the game") end end F.track(Players.PlayerAdded:Connect(function(joiningPlayer) if joiningPlayer ~= lp then F.appendChatLine(tostring(joiningPlayer.DisplayName or joiningPlayer.Name) .. " joined the game") end end)) F.track(Players.PlayerRemoving:Connect(function(leavingPlayer) if leavingPlayer ~= lp then F.appendChatLine(tostring(leavingPlayer.DisplayName or leavingPlayer.Name) .. " left the game") end end)) F.setChatOpen = function(open, focus) chatOpen = open == true renderChatEntries() chatPanel.Visible = hudVisible chatInput.Visible = hudVisible and chatOpen if F.applyCameraMode then F.applyCameraMode() end if open and focus then chatInput:CaptureFocus() else chatInput:ReleaseFocus() end if open then attackHeld, useHeld, touchJumpHeld = false, false, false if F.stopUseItem then F.stopUseItem() end F.stopDestroyBlock() end end F.executeLocalCommand = function(raw) local message = tostring(raw or ""):gsub("^%s+", ""):gsub("%s+$", "") if message == "" then return end chatInput.Text = "" if message:sub(1, 1) ~= "/" then F.appendChatLine("<" .. tostring(lp.DisplayName or lp.Name) .. "> " .. message) return end local args = {} for word in message:gmatch("%S+") do args[#args + 1] = word end local cmd = (args[1] or ""):lower() if cmd == "/help" then F.appendChatLine("/help /fly /gamemode creative|survival /tp x y z /time set day|night") elseif cmd == "/fly" then if abilities.mayfly then abilities.flying = not abilities.flying F.appendChatLine("Flight: " .. (abilities.flying and "enabled" or "disabled")) else F.appendChatLine("Flight is Creative-only.") end elseif cmd == "/gamemode" then local mode = (args[2] or ""):lower() if mode == "creative" then F.setGameMode(true) elseif mode == "survival" then F.setGameMode(false) else F.appendChatLine("Usage: /gamemode creative|survival") end if creativeBtn then F.paintToggle(creativeBtn, creative); creativeBtn.Text = creative and "Creative" or "Survival" end if flyBtn then flyBtn.Visible = creative; F.paintToggle(flyBtn, abilities.flying) end F.appendChatLine("Gamemode: " .. (creative and "Creative" or "Survival")) elseif cmd == "/tp" or cmd == "/teleport" then local x, y, z = tonumber(args[2]), tonumber(args[3]), tonumber(args[4]) if x and y and z then pos = Vector3.new(x * BLOCK, y * BLOCK, z * BLOCK) prevPos = pos vel = Vector3.zero F.appendChatLine(string.format("Teleported to %.1f %.1f %.1f", x, y, z)) else F.appendChatLine("Usage: /tp x y z") end elseif cmd == "/time" and (args[2] or ""):lower() == "set" then local value = (args[3] or ""):lower() if value == "day" then Lighting.ClockTime = 12; F.appendChatLine("Set local time to day.") elseif value == "night" then Lighting.ClockTime = 0; F.appendChatLine("Set local time to night.") else F.appendChatLine("Usage: /time set day|night") end else F.appendChatLine("Unknown command. Use /help.") end end F.track(chatInput.FocusLost:Connect(function(enterPressed) if enterPressed then F.executeLocalCommand(chatInput.Text); F.setChatOpen(false, false) end end)) F.makePojavTopButton("DEBUG", 0, 52, F.toggleDebug) F.makePojavTopButton("CHAT", 56, 46, function() local open = not chatOpen; F.setChatOpen(open, open) end) F.makePojavTopButton("KEYBOARD", 106, 65, function() F.setChatOpen(true, true) end) F.makePojavTopButton("GUI", 175, 43, function() hudVisible = not hudVisible F.updateHudVisibility() end, true) cameraViewButton = F.makePojavTopButton("1ST", 221, 81, function() viewMode = (viewMode + 1) % 3 if F.applyCameraMode then F.applyCameraMode() end end, true) -- Place directional buttons at bottom-left; these provide movement while touch -- camera look remains on the right side of the screen. if UIS.TouchEnabled then mobileDpad = Instance.new("Frame") mobileDpad.Name = "PojavDirectionalPad" mobileDpad.BackgroundTransparency = 1 mobileDpad.Size = UDim2.fromOffset(114, 114) mobileDpad.Position = UDim2.new(0, 10, 1, -184) mobileDpad.ZIndex = 10 mobileDpad.Parent = controlsGui local function makeDpadButton(name, symbol, x, y, direction) local b = Instance.new("TextButton") b.Name = "Move_" .. name b.Position = UDim2.fromOffset(x, y) b.Size = UDim2.fromOffset(36, 36) b.BackgroundColor3 = Color3.fromRGB(0, 0, 0) b.BackgroundTransparency = 0.18 b.BorderSizePixel = 0 b.AutoButtonColor = false b.TextColor3 = Color3.fromRGB(248, 249, 252) b.TextSize = 19 b.Font = Enum.Font.Code b.Text = symbol b.ZIndex = 11 b.Parent = mobileDpad local function begin() if direction == "Forward" then local now = os.clock() if now - lastMobileForwardTap <= 0.34 then sprintLatch = true end lastMobileForwardTap = now end mobileHeldDirections[direction] = true recalcTouchMove() end local function finish() mobileHeldDirections[direction] = false recalcTouchMove() end F.track(b.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then begin() end end)) F.track(b.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then finish() end end)) return b end makeDpadButton("Forward", "▲", 39, 0, "Forward") makeDpadButton("Left", "◀", 0, 39, "Left") makeDpadButton("Back", "▼", 39, 78, "Back") makeDpadButton("Right", "▶", 78, 39, "Right") local function makeDpadAction(name, label, x, y, color, callback, hold) local b = Instance.new("TextButton") b.Name = "Action_" .. name b.Position = UDim2.fromOffset(x, y) b.Size = UDim2.fromOffset(36, 36) b.BackgroundColor3 = Color3.fromRGB(0, 0, 0) b.BackgroundTransparency = 0.18 b.BorderSizePixel = 0 b.TextColor3 = Color3.fromRGB(255, 255, 255) b.Font = Enum.Font.Code b.Text = label b.TextWrapped = true b.TextScaled = true b.AutoButtonColor = false b.ZIndex = 11 b.Parent = mobileDpad if hold then F.track(b.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then callback(true) end end)) F.track(b.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then callback(false) end end)) else F.track(b.Activated:Connect(function() callback() end)) end return b end -- The 3x3 D-pad grid: actions occupy corners and the center without -- overlapping the four directional buttons. local mobileSneakButton mobileSneakButton = makeDpadAction("Sneak", "◇", 39, 39, Color3.fromRGB(98, 115, 135), function() sneakToggle = not sneakToggle if mobileSneakButton then mobileSneakButton.BackgroundColor3 = Color3.fromRGB(0, 0, 0) end end, false) makeDpadAction("PrimaryBreak", "PRI\n(BREAK)", 0, 0, Color3.fromRGB(160, 70, 70), function(down) if invOpen then return end if down then attackHeld = true; F.startAttack() else attackHeld = false; F.stopDestroyBlock() end end, true) makeDpadAction("SecondaryPlace", "SEC\n(PLACE)", 78, 0, Color3.fromRGB(70, 120, 70), function(down) if invOpen then return end if down then useHeld = true; F.startUseItem() else F.stopUseItem() end end, true) makeDpadAction("Inventory", "INV", 0, 78, Color3.fromRGB(95, 95, 115), function() F.setInventory(not invOpen) end, false) end F.updateCraft() refresh() if F.updateInventoryPage then F.updateInventoryPage() end F.updateHudVisibility() local rootVisualOffset = 3 pos = Vector3.new(0, 10, 0) prevPos = pos local spawnPos = pos vel = Vector3.zero local onGround = false local fallDistance = 0 local bodyYaw, prevBodyYaw = 0, 0 local sneaking, sprinting = false, false local cameraEyeH = 1.62 sprintLatch = false eyeH = 1.62 local jumpDelay = 0 local walkPos, walkSpeed, prevWalkSpeed = 0, 0, 0 local age = 0 --------------------------------------------------------------------- -- MINECRAFT-STYLE ENTITY HEALTH, HIT FLASHES, DEATH ANIMATION, AND DEATH SCREEN --------------------------------------------------------------------- F.playerDead = false F.pendingPlayerDeathMessage = nil F.entityAttackCooldown = 0 F.entityStates = setmetatable({}, { __mode = "k" }) F.observedHumanoids = setmetatable({}, { __mode = "k" }) local ENTITY_HEALTH_SCALE = 5 -- Roblox 100 health maps to 20 Minecraft health. local ENTITY_DEATH_TICKS = 20 -- Minecraft's familiar ~1-second death pose. local deathGui = Instance.new("ScreenGui") deathGui.Name = "MinecraftDeathScreen" deathGui.ResetOnSpawn = false deathGui.IgnoreGuiInset = true deathGui.DisplayOrder = 5000 deathGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling deathGui.Enabled = false deathGui.Parent = playerGui local deathTint = Instance.new("Frame") deathTint.Name = "RedDeathTint" deathTint.BackgroundColor3 = Color3.fromRGB(130, 0, 0) deathTint.BackgroundTransparency = 0.35 deathTint.BorderSizePixel = 0 deathTint.Size = UDim2.fromScale(1, 1) deathTint.Active = true deathTint.ZIndex = 1 deathTint.Parent = deathGui local deathTitle = Instance.new("TextLabel") deathTitle.Name = "DeathTitle" deathTitle.BackgroundTransparency = 1 deathTitle.AnchorPoint = Vector2.new(0.5, 0.5) deathTitle.Position = UDim2.fromScale(0.5, 0.318) deathTitle.Size = UDim2.new(0.64, 0, 0, 25) deathTitle.Font = Enum.Font.Arcade deathTitle.Text = "You died!" deathTitle.TextColor3 = Color3.fromRGB(255, 255, 255) deathTitle.TextStrokeColor3 = Color3.fromRGB(65, 0, 0) deathTitle.TextStrokeTransparency = 0.12 deathTitle.TextScaled = true deathTitle.ZIndex = 2 deathTitle.Parent = deathTint local deathCauseLabel = Instance.new("TextLabel") deathCauseLabel.Name = "DeathCause" deathCauseLabel.BackgroundTransparency = 1 deathCauseLabel.AnchorPoint = Vector2.new(0.5, 0.5) deathCauseLabel.Position = UDim2.fromScale(0.5, 0.392) deathCauseLabel.Size = UDim2.new(0.66, 0, 0, 17) deathCauseLabel.Font = Enum.Font.Arcade deathCauseLabel.Text = tostring(lp.Name) .. " was killed" deathCauseLabel.TextColor3 = Color3.fromRGB(255, 255, 255) deathCauseLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0) deathCauseLabel.TextStrokeTransparency = 0.35 deathCauseLabel.TextWrapped = true deathCauseLabel.TextScaled = true deathCauseLabel.ZIndex = 2 deathCauseLabel.Parent = deathTint local deathScoreLabel = Instance.new("TextLabel") deathScoreLabel.Name = "DeathScore" deathScoreLabel.BackgroundTransparency = 1 deathScoreLabel.AnchorPoint = Vector2.new(0.5, 0.5) deathScoreLabel.Position = UDim2.fromScale(0.5, 0.45) deathScoreLabel.Size = UDim2.new(0.64, 0, 0, 12) deathScoreLabel.Font = Enum.Font.Arcade deathScoreLabel.Text = "Score: 0" deathScoreLabel.TextColor3 = Color3.fromRGB(255, 221, 72) deathScoreLabel.TextScaled = true deathScoreLabel.ZIndex = 2 deathScoreLabel.Parent = deathTint local function makeDeathButton(name, caption, yScale, isEnabled) local b = Instance.new("TextButton") b.Name = name b.AnchorPoint = Vector2.new(0.5, 0.5) b.Position = UDim2.fromScale(0.5, yScale) b.Size = UDim2.new(0, math.min(210, math.max(138, vp.X * 0.46)), 0, math.clamp(math.floor(vp.Y * 0.030), 21, 26)) b.BackgroundColor3 = isEnabled and Color3.fromRGB(128, 128, 128) or Color3.fromRGB(82, 82, 82) b.BorderColor3 = Color3.fromRGB(24, 24, 24) b.BorderSizePixel = 2 b.Font = Enum.Font.Arcade b.Text = caption b.TextColor3 = Color3.fromRGB(255, 255, 255) b.TextTransparency = isEnabled and 0 or 0.45 b.TextScaled = false b.TextSize = 10 b.AutoButtonColor = isEnabled b.Active = isEnabled b.Selectable = isEnabled b.ZIndex = 3 b.Parent = deathTint local stroke = Instance.new("UIStroke") stroke.Color = isEnabled and Color3.fromRGB(190, 190, 190) or Color3.fromRGB(85, 85, 85) stroke.Thickness = 1 stroke.Parent = b return b end local deathRespawnButton = makeDeathButton("RespawnDisabled", "Respawn", 0.55, false) local deathQuitButton = makeDeathButton("Quit", "Title Screen", 0.61, true) F.track(deathQuitButton.Activated:Connect(function() -- Player:Kick from a LocalScript affects only this local player. pcall(function() lp:Kick("Quit from the Minecraft death screen") end) end)) F.hideDeathScreen = function() F.playerDead = false F.pendingPlayerDeathMessage = nil F.deathStartedAt = nil F.deathModelPivot = nil F.deathModelHeight = nil deathGui.Enabled = false pcall(function() RunService:UnbindFromRenderStep("MCSteve_DeathCamera") end) if F.deathCameraOriginalFOV and workspace.CurrentCamera then workspace.CurrentCamera.FieldOfView = F.deathCameraOriginalFOV end F.deathCameraOriginalFOV = nil F.deathCameraBaseCFrame = nil end F.beginPlayerDeath = function(message) if F.playerDead then return end F.playerDead = true F.deathStartedAt = os.clock() F.pendingPlayerDeathMessage = nil message = tostring(message or (tostring(lp.Name) .. " was killed")) deathCauseLabel.Text = message deathTitle.Text = "You died!" deathScoreLabel.Text = "Score: 0" deathGui.Enabled = true attackHeld, useHeld, touchJumpHeld = false, false, false if F.stopDestroyBlock then F.stopDestroyBlock() end if F.stopUseItem then F.stopUseItem() end pcall(function() F.deathModelPivot = model:GetPivot(); F.deathModelHeight = model:GetExtentsSize().Y end) local cam = workspace.CurrentCamera if cam then F.deathCameraOriginalFOV = cam.FieldOfView F.deathCameraBaseCFrame = cam.CFrame end F.appendChatLine(message) pcall(function() RunService:UnbindFromRenderStep("MCSteve_DeathCamera") end) RunService:BindToRenderStep("MCSteve_DeathCamera", Enum.RenderPriority.Camera.Value + 4, function() if not F.playerDead then return end local activeCamera = workspace.CurrentCamera if not activeCamera then return end local progress = math.clamp((os.clock() - (F.deathStartedAt or os.clock())) / 0.55, 0, 1) if F.deathCameraOriginalFOV then activeCamera.FieldOfView = F.deathCameraOriginalFOV + 8 * progress end if F.deathCameraBaseCFrame then activeCamera.CFrame = F.deathCameraBaseCFrame * CFrame.Angles(0, 0, math.rad(90 * progress)) end end) end F.getEntityTarget = function(part) if not (part and part:IsA("BasePart")) then return nil, nil end local node = part.Parent while node and node ~= workspace do if node:IsA("Model") then local targetHumanoid = node:FindFirstChildOfClass("Humanoid") if targetHumanoid and node ~= char and node ~= model and not (dropFolder and node:IsDescendantOf(dropFolder)) then return node, targetHumanoid end end node = node.Parent end return nil, nil end F.getEntityName = function(entity, targetHumanoid) local targetPlayer = entity and Players:GetPlayerFromCharacter(entity) if targetPlayer then return tostring(targetPlayer.Name) end if targetHumanoid then local ok, displayName = pcall(function() return targetHumanoid.DisplayName end) if ok and type(displayName) == "string" and displayName ~= "" and displayName ~= "Humanoid" then return displayName end end return entity and entity.Name or "Entity" end F.writeEntityHealth = function(entity, targetHumanoid, state) local hp = math.floor(math.max(0, state.health) * 100 + 0.5) / 100 local maxHp = math.floor(math.max(0, state.maxHealth) * 100 + 0.5) / 100 pcall(function() entity:SetAttribute("MinecraftHealth", hp) end) pcall(function() entity:SetAttribute("MinecraftMaxHealth", maxHp) end) pcall(function() targetHumanoid:SetAttribute("MinecraftHealth", hp) end) pcall(function() targetHumanoid:SetAttribute("MinecraftMaxHealth", maxHp) end) end F.getEntityState = function(entity, targetHumanoid) local state = F.entityStates[entity] if not state then state = { health = math.max(0, targetHumanoid.Health / ENTITY_HEALTH_SCALE), maxHealth = math.max(0.2, targetHumanoid.MaxHealth / ENTITY_HEALTH_SCALE), nativeHealth = targetHumanoid.Health, nativeMaxHealth = targetHumanoid.MaxHealth, dead = false, deathStarted = false, lastHitBy = nil, lastHitAt = -math.huge, } F.entityStates[entity] = state else if not state.dead then local currentNativeHealth = targetHumanoid.Health if currentNativeHealth ~= state.nativeHealth then state.health = math.clamp(state.health + (currentNativeHealth - state.nativeHealth) / ENTITY_HEALTH_SCALE, 0, state.maxHealth) state.nativeHealth = currentNativeHealth end local currentNativeMax = targetHumanoid.MaxHealth if currentNativeMax ~= state.nativeMaxHealth then state.maxHealth = math.max(0.2, currentNativeMax / ENTITY_HEALTH_SCALE) state.health = math.min(state.health, state.maxHealth) state.nativeMaxHealth = currentNativeMax end end end F.writeEntityHealth(entity, targetHumanoid, state) return state end F.makeEntityHighlight = function(entity) local highlightEffect = Instance.new("Highlight") highlightEffect.Name = "MinecraftEntityHitHighlight" highlightEffect.Adornee = entity highlightEffect.DepthMode = Enum.HighlightDepthMode.Occluded highlightEffect.FillColor = Color3.fromRGB(255, 0, 0) highlightEffect.OutlineColor = Color3.fromRGB(255, 0, 0) highlightEffect.FillTransparency = 0.7 highlightEffect.OutlineTransparency = 0.7 highlightEffect.Parent = entity return highlightEffect end F.beginEntityDeath = function(entity, targetHumanoid, state, hitHighlight) if not entity or not entity.Parent or state.deathStarted then return end state.dead = true state.deathStarted = true pcall(function() targetHumanoid.BreakJointsOnDeath = false end) state.health = 0 F.writeEntityHealth(entity, targetHumanoid, state) pcall(function() targetHumanoid.BreakJointsOnDeath = false end) local deathHighlight = hitHighlight if not (deathHighlight and deathHighlight.Parent) then deathHighlight = F.makeEntityHighlight(entity) end deathHighlight:SetAttribute("MCPersistentDeathHighlight", true) local entityName = F.getEntityName(entity, targetHumanoid) local deathMessage = entityName .. " was killed" state.deathMessage = deathMessage F.appendChatLine(deathMessage) local ok, startingPivot = pcall(function() return entity:GetPivot() end) if not ok then if deathHighlight and deathHighlight.Parent then deathHighlight:Destroy() end return end task.spawn(function() pcall(function() targetHumanoid.BreakJointsOnDeath = false end) local _, size = pcall(function() return entity:GetExtentsSize() end) local entityHeight = (typeof(size) == "Vector3") and size.Y or (BLOCK * 2) local startedAt = os.clock() local duration = ENTITY_DEATH_TICKS * TICK while entity.Parent do local progress = math.clamp((os.clock() - startedAt) / duration, 0, 1) -- Java 1.12 computes the corpse roll with sqrt(deathTime * 1.6). -- Render each frame, interpolate continuously, and lower the body as it falls. local rotationProgress = math.sqrt(math.clamp(progress * 1.6, 0, 1)) local downProgress = progress * progress * (3 - 2 * progress) local downwardOffset = math.min(entityHeight * 0.58, BLOCK * 1.65) * downProgress local targetPivot = startingPivot * CFrame.new(0, -downwardOffset, 0) * CFrame.Angles(0, 0, math.rad(90) * rotationProgress) pcall(function() entity:PivotTo(targetPivot) end) if progress >= 1 then break end RunService.Heartbeat:Wait() end -- Remove the dead NPC/player model after its death pose, rather than leaving -- an invisible humanoid or an empty model behind in this client's world. if entity and entity.Parent then pcall(function() entity:Destroy() end) end if deathHighlight and deathHighlight.Parent then pcall(function() deathHighlight:Destroy() end) end end) end F.attackEntity = function(entity, targetHumanoid) if F.playerDead or not (entity and entity.Parent and targetHumanoid and targetHumanoid.Parent) then return false end if F.entityAttackCooldown > 0 then return false end local state = F.getEntityState(entity, targetHumanoid) if state.dead or targetHumanoid.Health <= 0 or state.health <= 0 then if not state.dead and state.health <= 0 then F.beginEntityDeath(entity, targetHumanoid, state, nil) end return false end local hitHighlight = F.makeEntityHighlight(entity) local targetStack = slots[36 + selected] local heldId = targetStack and targetStack.id or nil local damageByItem = { diamond_sword = 7, diamond_axe = 6, diamond_pickaxe = 5, diamond_shovel = 4, stick = 1, } local damage = damageByItem[heldId] or 1 state.health = math.max(0, state.health - damage) state.lastHitBy = tostring(lp.DisplayName or lp.Name) state.lastHitAt = os.clock() F.entityAttackCooldown = 6 -- Mirror the translated Minecraft health back to this client's Humanoid copy. -- Set nativeHealth first so HealthChanged does not count our own write twice. state.nativeHealth = math.clamp(state.health * ENTITY_HEALTH_SCALE, 0, targetHumanoid.MaxHealth) if state.health <= 0 then F.beginEntityDeath(entity, targetHumanoid, state, hitHighlight) pcall(function() targetHumanoid.Health = 0 end) else pcall(function() targetHumanoid.Health = state.nativeHealth end) F.writeEntityHealth(entity, targetHumanoid, state) task.delay(TICK, function() if hitHighlight and hitHighlight.Parent and not hitHighlight:GetAttribute("MCPersistentDeathHighlight") then hitHighlight:Destroy() end end) end return true end F.observeHumanoid = function(targetHumanoid) if not targetHumanoid or F.observedHumanoids[targetHumanoid] then return end F.observedHumanoids[targetHumanoid] = true pcall(function() targetHumanoid.BreakJointsOnDeath = false end) local initialEntity = targetHumanoid.Parent if initialEntity and initialEntity:IsA("Model") and initialEntity ~= char and initialEntity ~= model and not (dropFolder and initialEntity:IsDescendantOf(dropFolder)) and Players:GetPlayerFromCharacter(initialEntity) ~= lp then F.getEntityState(initialEntity, targetHumanoid) end F.track(targetHumanoid.Died:Connect(function() local entity = targetHumanoid.Parent if not (entity and entity:IsA("Model")) then return end local targetPlayer = Players:GetPlayerFromCharacter(entity) if targetPlayer == lp or entity == char then F.beginPlayerDeath(F.pendingPlayerDeathMessage or (tostring(lp.Name) .. " was killed")) return end local state = F.getEntityState(entity, targetHumanoid) if not state.deathStarted then F.beginEntityDeath(entity, targetHumanoid, state, nil) end end)) F.track(targetHumanoid.HealthChanged:Connect(function() local entity = targetHumanoid.Parent if entity and entity:IsA("Model") then local state = F.entityStates[entity] if state and not state.dead then F.getEntityState(entity, targetHumanoid) end end end)) F.track(targetHumanoid:GetPropertyChangedSignal("MaxHealth"):Connect(function() local entity = targetHumanoid.Parent if entity and entity:IsA("Model") then local state = F.entityStates[entity] if state and not state.dead then F.getEntityState(entity, targetHumanoid) end end end)) end -- One initial scan, then only observe Humanoids newly added to Workspace. for _, descendant in ipairs(workspace:GetDescendants()) do if descendant:IsA("Humanoid") then F.observeHumanoid(descendant) end end F.track(workspace.DescendantAdded:Connect(function(descendant) if descendant:IsA("Humanoid") then F.observeHumanoid(descendant) end end)) local lastW = -math.huge F.wrap = function(a) return (a + math.pi) % (2 * math.pi) - math.pi end local controls pcall(function() controls = require(lp:WaitForChild("PlayerScripts"):WaitForChild("PlayerModule", 5)):GetControls() end) recalcTouchMove = function() local x, z = 0, 0 if mobileHeldDirections.Left then x -= 1 end if mobileHeldDirections.Right then x += 1 end if mobileHeldDirections.Forward then z -= 1 end if mobileHeldDirections.Back then z += 1 end mobileMoveVector = Vector3.new(x, 0, z) if mobileMoveVector.Magnitude > 1 then mobileMoveVector = mobileMoveVector.Unit end end F.getMove = function() local move = Vector3.zero if controls then local ok, v = pcall(function() return controls:GetMoveVector() end) if ok and typeof(v) == "Vector3" then move = v end end if move.Magnitude < 0.01 then local x = (UIS:IsKeyDown(Enum.KeyCode.D) and 1 or 0) - (UIS:IsKeyDown(Enum.KeyCode.A) and 1 or 0) local z = (UIS:IsKeyDown(Enum.KeyCode.S) and 1 or 0) - (UIS:IsKeyDown(Enum.KeyCode.W) and 1 or 0) move = Vector3.new(x, 0, z) end move += mobileMoveVector move = Vector3.new(move.X, 0, move.Z) if move.Magnitude > 1 then move = move.Unit end return move end F.hideOneAvatarObject = function(d) if d:IsA("BasePart") then d.LocalTransparencyModifier = 1 elseif d:IsA("Decal") then d.Transparency = 1 end end F.hideCharacterLocally = function(c) F.hiddenAvatarObjects = {} for _, d in ipairs(c:GetDescendants()) do if d:IsA("BasePart") or d:IsA("Decal") then F.hiddenAvatarObjects[#F.hiddenAvatarObjects + 1] = d F.hideOneAvatarObject(d) end end F.track(c.DescendantAdded:Connect(function(d) if char ~= c then return end if d:IsA("BasePart") or d:IsA("Decal") then F.hiddenAvatarObjects[#F.hiddenAvatarObjects + 1] = d F.hideOneAvatarObject(d) end end)) end F.bind = function(c) F.hideDeathScreen() char = c hum = c:WaitForChild("Humanoid") F.observeHumanoid(hum) F.oldCameraOffset = hum.CameraOffset cameraEyeH = 1.62 eyeH = 1.62 hum.CameraOffset = Vector3.zero hrp = c:WaitForChild("HumanoidRootPart") if UIS.TouchEnabled and controls then pcall(function() controls:Disable() end) end local off = (hum.RigType == Enum.HumanoidRigType.R6) and 3 or (hrp.Size.Y / 2 + hum.HipHeight) rootVisualOffset = off pos = hrp.Position - Vector3.new(0, off, 0) + Vector3.new(0, 0.05, 0) prevPos, spawnPos, vel = pos, pos, Vector3.zero onGround = false yaw = math.atan2(-hrp.CFrame.LookVector.X, -hrp.CFrame.LookVector.Z) bodyYaw, prevBodyYaw = yaw, yaw hrp.Anchored = false hum.PlatformStand = true hum.WalkSpeed = 0 hum.AutoRotate = false hum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None rp.FilterDescendantsInstances = { char, model } F.hideCharacterLocally(c) if F.applyCameraMode then F.applyCameraMode() end end F.applyCameraMode = function() camera = workspace.CurrentCamera or camera if not camera then return end camera.CameraType = Enum.CameraType.Custom if hum and hum.Parent then camera.CameraSubject = hum end local uiOpen = invOpen or chatOpen if uiOpen then -- Keep the native camera, but unlock the cursor while an interface is open. lp.CameraMode = Enum.CameraMode.Classic lp.CameraMinZoomDistance = oldCameraMinZoom lp.CameraMaxZoomDistance = oldCameraMaxZoom UIS.MouseBehavior = Enum.MouseBehavior.Default UIS.MouseIconEnabled = true elseif viewMode == 0 then lp.CameraMode = Enum.CameraMode.LockFirstPerson lp.CameraMinZoomDistance = oldCameraMinZoom lp.CameraMaxZoomDistance = oldCameraMaxZoom else lp.CameraMode = Enum.CameraMode.Classic -- Keep both third-person views at one fixed native-camera distance. lp.CameraMinZoomDistance = 12 lp.CameraMaxZoomDistance = 12 end if cameraViewButton then cameraViewButton.Text = ({[0] = "1ST", [1] = "3RD BACK", [2] = "3RD FRONT"})[viewMode] or "1ST" end end local W = 0.6 * BLOCK local STEP_HEIGHT = 0.6 * BLOCK local COLLISION_SKIN = 0.025 F.cast = function(p, h, d) local size = Vector3.new(W - 0.02, h * BLOCK - 0.02, W - 0.02) return workspace:Blockcast(CFrame.new(p + Vector3.new(0, h * BLOCK / 2, 0)), size, d, rp) end F.moveAxis = function(p, axis, amount, h) if math.abs(amount) <= 1e-5 then return p, false end local d = axis * amount local hit = F.cast(p, h, d) if hit then local travel = math.max(0, hit.Distance - COLLISION_SKIN) return p + d.Unit * travel, true end return p + d, false end F.tryStep = function(fromPosition, axis, amount, h) local upPosition, upHit = F.moveAxis(fromPosition, Vector3.yAxis, STEP_HEIGHT, h) if upHit then return fromPosition, false end local acrossPosition, acrossHit = F.moveAxis(upPosition, axis, amount, h) if acrossHit and (acrossPosition - upPosition).Magnitude < math.abs(amount) * 0.5 then return fromPosition, false end local downPosition, downHit = F.moveAxis(acrossPosition, Vector3.yAxis, -STEP_HEIGHT - COLLISION_SKIN * 2, h) if not downHit then return fromPosition, false end return downPosition, (downPosition - fromPosition).Magnitude > 0.001 end F.moveHorizontalAxis = function(p, axis, amount, h, grounded) local directPosition, hit = F.moveAxis(p, axis, amount, h) if not hit or not grounded then return directPosition, hit end local steppedPosition, stepped = F.tryStep(p, axis, amount, h) if stepped and (steppedPosition - p).Magnitude > math.abs(amount) * 0.5 then return steppedPosition, false end return directPosition, true end F.horizontal = function(p, dx, dz, h, grounded) local hx, hz = false, false if math.abs(dx) >= math.abs(dz) then p, hx = F.moveHorizontalAxis(p, Vector3.xAxis, dx, h, grounded) p, hz = F.moveHorizontalAxis(p, Vector3.zAxis, dz, h, grounded) else p, hz = F.moveHorizontalAxis(p, Vector3.zAxis, dz, h, grounded) p, hx = F.moveHorizontalAxis(p, Vector3.xAxis, dx, h, grounded) end return p, hx, hz end F.hasGroundAt = function(p, h) -- Use the original controller's short ground probe. A distant lower floor must -- not count as grounding, or the feet can stop above the baseplate. return F.cast(p, h, Vector3.new(0, -0.16, 0)) ~= nil end F.edgeClamp = function(p, dx, dz, h) local inc = 0.05 * BLOCK local function shrink(v) if math.abs(v) <= inc then return 0 end return v - math.sign(v) * inc end for _ = 1, 40 do if dx ~= 0 and not F.hasGroundAt(p + Vector3.new(dx, 0, 0), h) then dx = shrink(dx) else break end end for _ = 1, 40 do if dz ~= 0 and not F.hasGroundAt(p + Vector3.new(0, 0, dz), h) then dz = shrink(dz) else break end end for _ = 1, 40 do if dx ~= 0 and dz ~= 0 and not F.hasGroundAt(p + Vector3.new(dx, 0, dz), h) then dx = shrink(dx) dz = shrink(dz) else break end end return dx, dz end F.moveEntity = function(dx, dy, dz) local h = sneaking and 1.5 or 1.8 local startGround = onGround local p = pos if sneaking and startGround and dy <= 0 then dx, dz = F.edgeClamp(p, dx, dz, h) end -- Match the mechanics controller: resolve horizontal movement first, then fall. -- This lets the player leave an upper platform before ground contact is tested. local hx, hz p, hx, hz = F.horizontal(p, dx, dz, h, startGround) local hitY p, hitY = F.moveAxis(p, Vector3.yAxis, dy, h) local landed = hitY and dy < 0 pos = p onGround = landed or false if hitY then vel = Vector3.new(vel.X, 0, vel.Z) end if hx then vel = Vector3.new(0, vel.Y, vel.Z) end if hz then vel = Vector3.new(vel.X, vel.Y, 0) end return hx or hz end F.snapToNearbyGround = function(p, h, maxDistance) -- A short probe may find a nearby lower floor. Snap down to its exact surface -- instead of declaring grounded while leaving the player floating above it. local hit = F.cast(p, h, Vector3.new(0, -(maxDistance or 0.42), 0)) if not hit then return p, false end local settle = math.max(0, hit.Distance - COLLISION_SKIN) if settle > 0 then p -= Vector3.yAxis * settle end return p, true end local H = (function() local rectsOf, paintFaceOf, FACES, BLOCKFACES, getBlockAt = MCB.rects, MCB.paintFace, MCB.FACES, MCB.BLOCKFACES, MCB.get local climbOP = OverlapParams.new() climbOP.FilterType = Enum.RaycastFilterType.Exclude climbOP.RespectCanCollide = false local handsFolder = Instance.new("Folder") handsFolder.Name = "MCHands" handsFolder.Parent = workspace local function isOnClimbable() local b = getBlockAt(pos + Vector3.new(0, 0.05, 0)) if b and b:GetAttribute("MCClimb") then return true end climbOP.FilterDescendantsInstances = { char, model, blockFolder, handsFolder } local box = workspace:GetPartBoundsInBox(CFrame.new(pos + Vector3.new(0, 0.9 * BLOCK, 0)), Vector3.new(0.6 * BLOCK, 1.8 * BLOCK, 0.6 * BLOCK), climbOP) for _, p in ipairs(box) do if p:IsA("TrussPart") then return true end end return false end local Mcf = CFrame.Angles(0, 0, math.pi) local rad = math.rad local HANDHELD = { diamond_sword = true, diamond_pickaxe = true, diamond_axe = true, diamond_shovel = true, stick = true } local DISPLAY = { -- Non-block item transforms follow the Java 1.12.x item-model display settings. -- Generated items (food, ingots, gems, etc.) use generated.json's third-person pose; -- tools and swords use handheld.json's angled third-person pose. Block transforms -- are intentionally untouched. generated = { fp = { r = { 0, -90, 25 }, t = { 1.13, 3.2, 1.13 }, s = 0.60 }, tp = { r = { 0, 0, 0 }, t = { 0, 3, 1 }, s = 0.48 } }, handheld = { fp = { r = { 0, -90, 25 }, t = { 1.13, 3.2, 1.13 }, s = 0.60 }, tp = { r = { 0, -90, 55 }, t = { 0, 4, 0.5 }, s = 0.68 } }, block = { fp = { r = { 0, 45, 0 }, t = { 0, 0, 0 }, s = 0.36 }, tp = { r = { 75, 45, 0 }, t = { 0, 2.5, 0 }, s = 0.375 } }, } local function itemKind(id) if BLOCKFACES[id] then return "block" end return HANDHELD[id] and "handheld" or "generated" end local function isBlockItem(id) return BLOCKFACES[id] ~= nil or (ITEMS[id] ~= nil and ITEMS[id].placeable == true) end local function dispCF(d, kind) local translation = CFrame.new(Vector3.new(d.t[1], d.t[2], d.t[3]) / 16 * BLOCK) if kind == "block" then -- Preserve the existing block-item transform path, per the requested scope. return translation * CFrame.Angles(0, 0, rad(d.r[3])) * CFrame.Angles(0, rad(d.r[2]), 0) * CFrame.Angles(rad(d.r[1]), 0, 0) end -- Java 1.12 ItemTransformVec3f JSON display transforms are composed X, Y, Z. return translation * CFrame.Angles(rad(d.r[1]), 0, 0) * CFrame.Angles(0, rad(d.r[2]), 0) * CFrame.Angles(0, 0, rad(d.r[3])) end local function basePart(size, color) local p = Instance.new("Part") p.Size = size p.Color = color p.Material = Enum.Material.SmoothPlastic p.Anchored, p.CanCollide, p.CanQuery, p.CanTouch, p.CastShadow = true, false, false, false, false return p end local itemModels = {} local function getItemModel(id, scale) local key = id .. "@" .. scale local m = itemModels[key] if m then return m end m = Instance.new("Model") m.Name = key if itemKind(id) == "block" then local cube = basePart(Vector3.new(BLOCK, BLOCK, BLOCK) * scale, BLOCK_COLORS[id] or Color3.fromRGB(150, 150, 150)) cube.Parent = m m.PrimaryPart = cube for _, f in ipairs(FACES) do paintFaceOf(cube, f[1], id) end else local a = basePart(Vector3.new(0.05, 0.05, 0.05), Color3.new(1, 1, 1)) a.Transparency = 1 a.Parent = m m.PrimaryPart = a local tex = ICON[id] if tex then if not tex.px then tex.px = F.decodeRLE(tex.d) end for _, r in ipairs(rectsOf(tex.px, tex.w, tex.h)) do local v = basePart(Vector3.new(r.w, r.h, 1) * PX * scale, r.c) v.CFrame = CFrame.new(Vector3.new(r.x + r.w / 2 - 8, 8 - r.y - r.h / 2, 0) * PX * scale) v.Parent = m end end end itemModels[key] = m return m end local FIRST_PERSON_ARM_SCALE = 1.0 local fpArm = basePart(Vector3.new(4, 12, 4) * PX * FIRST_PERSON_ARM_SCALE, Color3.fromRGB(176, 125, 96)) fpArm.Name = "FPArm" F.paintBox(fpArm, 40, 16, 4, 12, 4) local curModel = nil local function showModel(m, cf) if curModel ~= m then if curModel then curModel.Parent = nil end curModel = m m.Parent = handsFolder end m:PivotTo(cf) end local function hideItem() if curModel then curModel.Parent = nil curModel = nil end end local function hideFP() fpArm.Parent = nil hideItem() end local attackPrev, attackCur = 0, 0 local handHeight, handHeightPrev = 0, 0 local shownId = nil local function handTick() attackPrev = attackCur if swinging then swingTime += 1 if swingTime >= 6 then -- End this six-tick swing at the wrapped zero phase. Render interpolation -- treats the 5/6 -> 0 boundary as 5/6 -> 1, matching Minecraft's partial-tick -- swing interpolation without playing the attack curve backward. swingTime = 0 if swingQueued then swingQueued = false swinging = true else swinging = false end attackCur = 0 else attackCur = math.clamp(swingTime / 6, 0, 1) end else attackCur = 0 end F.swingProgress = attackCur local held = slots[36 + selected] local id = held and held.id or nil handHeightPrev = handHeight handHeight += math.clamp((id == shownId and 1 or 0) - handHeight, -0.4, 0.4) if handHeight < 0.1 and id ~= shownId then shownId = id end end local function attackAnim(alpha) -- Interpolate like Minecraft's partial-tick swing value. The end transition -- from a high phase back to zero wraps forward to phase 1, rather than swinging -- the arm backward or snapping at the final frame. local d = attackCur - attackPrev if d < -0.5 then d += 1 end return math.clamp(attackPrev + d * math.clamp(alpha or 0, 0, 1), 0, 1) end local function updateFirstPerson(camCF, alpha) local atk = attackAnim(alpha) local inv = 1 - (handHeightPrev + (handHeight - handHeightPrev) * alpha) local s = math.sqrt(atk) local id = shownId if id == nil then hideItem() local chain = CFrame.new(Vector3.new( -0.3 * math.sin(s * math.pi) + 0.64000005, 0.4 * math.sin(s * 2 * math.pi) - 0.6 + inv * -0.6, -0.4 * math.sin(atk * math.pi) - 0.71999997) * BLOCK) * CFrame.Angles(0, rad(45), 0) * CFrame.Angles(0, rad(math.sin(s * math.pi) * 70), 0) * CFrame.Angles(0, 0, rad(math.sin(atk * atk * math.pi) * -20)) * CFrame.new(Vector3.new(-1, 3.6, 3.5) * BLOCK) * CFrame.Angles(0, 0, rad(120)) * CFrame.Angles(rad(200), 0, 0) * CFrame.Angles(0, rad(-135), 0) * CFrame.new(Vector3.new(5.6, 0, 0) * BLOCK) if slots[36 + selected] == nil then fpArm.CFrame = camCF * chain * CFrame.new(Vector3.new(-6, 6, 0) / 16 * BLOCK) * Mcf fpArm.Parent = handsFolder else fpArm.Parent = nil end else local kind = itemKind(id) local d = DISPLAY[kind].fp local eatBlend = math.clamp(F.eatAnimationBlend or (F.eating and 1 or 0), 0, 1) local eatElapsed = math.clamp(F.renderEatTime or F.eatTime or 0, 0, 32) local eatRemaining = 1 - eatElapsed / 32 local eatPull = 1 - eatRemaining ^ 27 local eatBob = 0 if eatRemaining < 0.8 then eatBob = math.abs(math.cos((32 - eatElapsed) / 4 * math.pi) * 0.1) end local chain = CFrame.new(Vector3.new(0.56, -0.52 + inv * -0.6, -0.72) * BLOCK) * CFrame.new(Vector3.new(-0.4 * math.sin(s * math.pi), 0.2 * math.sin(s * 2 * math.pi), -0.2 * math.sin(atk * math.pi)) * BLOCK) * CFrame.Angles(0, rad(45 + math.sin(atk * atk * math.pi) * -20), 0) * CFrame.Angles(0, 0, rad(math.sin(s * math.pi) * -20)) * CFrame.Angles(rad(math.sin(s * math.pi) * -80), 0, 0) -- Restored from the previous block-item pose: the final -45 degree Y rotation -- belongs to the shared hand chain. Item A keeps its current non-block display -- transform separately in dispCF; the block display transform remains independent. chain = chain * CFrame.Angles(0, rad(-45), 0) local eatTransform = CFrame.identity if kind ~= "block" and eatBlend > 0.001 then local amount = eatPull * eatBlend eatTransform = CFrame.new(Vector3.new(amount * 0.6, amount * -0.5 + eatBob * eatBlend, 0) * BLOCK) * CFrame.Angles(0, rad(amount * 90), 0) * CFrame.Angles(rad(amount * 10), 0, 0) * CFrame.Angles(0, 0, rad(amount * 30)) end -- Block item rotation intentionally stays on its existing transform path. fpArm.Parent = nil showModel(getItemModel(id, d.s), camCF * chain * eatTransform * dispCF(d, kind)) end end local function updateThirdPerson(root, armP, armX, bobZ, armY, armSwingZ) fpArm.Parent = nil local held = slots[36 + selected] if not held then hideItem() return end local kind = itemKind(held.id) local d = DISPLAY[kind].tp local cf = root * Mcf * CFrame.new(armP / 16 * BLOCK) * CFrame.Angles(armX, armY or 0, bobZ + (armSwingZ or 0)) local handOffset = CFrame.new(Vector3.new(1 / 16, 0.125, -0.625) * BLOCK) -- The pixel-art models are authored in an XY plane. Align that plane to the -- third-person hand first, then apply the independent display transform for this -- item kind. This fixes Item A without sharing its transform with block items. cf = cf * CFrame.Angles(rad(-90), 0, 0) * CFrame.Angles(0, rad(180), 0) * handOffset local eatBlend = math.clamp(F.eatAnimationBlend or (F.eating and 1 or 0), 0, 1) if kind ~= "block" and eatBlend > 0.001 then local elapsed = math.clamp(F.renderEatTime or F.eatTime or 0, 0, 32) local remaining = 1 - elapsed / 32 local amount = (1 - remaining ^ 27) * eatBlend local bob = remaining < 0.8 and math.abs(math.cos((32 - elapsed) / 4 * math.pi) * 0.1) or 0 -- The hand/item moves together, smoothly approaching the mouth while held. cf = cf * CFrame.new(Vector3.new(amount * 0.13, amount * 0.10 + bob * eatBlend, 0) * BLOCK) * CFrame.Angles(0, rad(amount * 35), 0) * CFrame.Angles(rad(amount * 10), 0, 0) * CFrame.Angles(0, 0, rad(amount * 18)) end cf = cf * dispCF(d, kind) showModel(getItemModel(held.id, d.s), cf) end local function createDropVisual(id, count, position) local visual = getItemModel(id, 0.22):Clone() visual.Name = "DroppedItem_" .. id for _, node in ipairs(visual:GetDescendants()) do if node:IsA("BasePart") then node.Anchored = true node.CanCollide = false node.CanTouch = false node.CanQuery = false node.CastShadow = true end end visual.Parent = dropFolder visual:PivotTo(CFrame.new(position)) local primary = visual.PrimaryPart local visiblePartCount = 0 for _, node in ipairs(visual:GetDescendants()) do if node:IsA("BasePart") and node ~= primary and node.Transparency < 1 then visiblePartCount += 1 end end if primary and visiblePartCount == 0 and itemKind(id) ~= "block" then primary.Transparency = 0 primary.Size = Vector3.new(0.28, 0.28, 0.28) primary.Color = (BLOCK_COLORS[id] or Color3.fromRGB(190, 170, 90)) end local countLabel = nil if primary then local billboard = Instance.new("BillboardGui") billboard.Name = "DropCount" billboard.Size = UDim2.fromOffset(32, 12) billboard.StudsOffset = Vector3.new(0, 0.45, 0) billboard.AlwaysOnTop = true billboard.MaxDistance = 70 billboard.Adornee = primary billboard.Parent = primary countLabel = Instance.new("TextLabel") countLabel.BackgroundTransparency = 1 countLabel.Size = UDim2.fromScale(1, 1) countLabel.Font = Enum.Font.Arcade countLabel.TextScaled = true countLabel.TextColor3 = Color3.new(1, 1, 1) countLabel.TextStrokeTransparency = 0.15 countLabel.Text = count > 1 and tostring(count) or "" countLabel.Parent = billboard end return visual, countLabel end return { isOnClimbable = isOnClimbable, handsFolder = handsFolder, handTick = handTick, updateFirstPerson = updateFirstPerson, updateThirdPerson = updateThirdPerson, swingAt = attackAnim, createDropVisual = createDropVisual, } end)() local droppedItems = {} local dropRayParams = RaycastParams.new() dropRayParams.FilterType = Enum.RaycastFilterType.Exclude dropRayParams.RespectCanCollide = true F.spawnItemDrop = function(id, count) count = math.floor(tonumber(count) or 0) if not id or count <= 0 or not ITEMS[id] or not H.createDropVisual then return false end local cam = workspace.CurrentCamera local look = cam and cam.CFrame.LookVector or Vector3.new(0, 0, -1) local spawnAt = (pos or Vector3.zero) + Vector3.new(0, 0.85 * BLOCK, 0) + look * (1.5 * BLOCK) local visual, countLabel = H.createDropVisual(id, count, spawnAt) local initialVelocity = look * (BLOCK * 1.5) + Vector3.new(0, BLOCK * 0.9, 0) droppedItems[#droppedItems + 1] = { id = id, count = count, visual = visual, countLabel = countLabel, position = spawnAt, velocity = initialVelocity, spin = math.random() * math.pi * 2, age = 0, grounded = false, pickupDelay = 0.5, } return true end F.dropInventorySelection = function(dropAll) local stack, sourceIndex if carried then stack = carried sourceIndex = "carried" elseif panel and panel.Visible and hover ~= nil and slots[hover] then stack = slots[hover] sourceIndex = hover else sourceIndex = 36 + selected stack = slots[sourceIndex] end if not stack or not stack.id or stack.n <= 0 then return end local count = dropAll and stack.n or 1 if not F.spawnItemDrop(stack.id, count) then return end stack.n -= count if stack.n <= 0 then if sourceIndex == "carried" then carried = nil else slots[sourceIndex] = nil end end F.updateCraft() refresh() end F.updateDroppedItems = function(dt) local cam = workspace.CurrentCamera dropRayParams.FilterDescendantsInstances = { char, model, H.handsFolder, dropFolder } dt = math.clamp(dt or 0, 0, 0.05) local pickupPoint = (pos or Vector3.zero) + Vector3.new(0, 0.65 * BLOCK, 0) local needsRefresh = false for i = #droppedItems, 1, -1 do local item = droppedItems[i] item.age += dt if not item.visual or not item.visual.Parent or item.age > 300 then if item.visual then item.visual:Destroy() end table.remove(droppedItems, i) else if not item.grounded then item.velocity = item.velocity + Vector3.new(0, -9.8 * BLOCK * dt, 0) local delta = item.velocity * dt local hit = workspace:Raycast(item.position, delta, dropRayParams) if hit then item.position = hit.Position + hit.Normal * 0.35 if hit.Normal.Y > 0.45 and item.velocity.Y <= 0 then item.grounded = true item.velocity = Vector3.zero else item.velocity = Vector3.new(item.velocity.X * -0.3, item.velocity.Y * -0.2, item.velocity.Z * -0.3) end else item.position += delta end else -- Minecraft-like gentle item bob and slow rotation while resting. item.position = Vector3.new(item.position.X, item.position.Y, item.position.Z) end item.spin += dt * 2.2 local bob = item.grounded and math.sin(item.age * 3.2) * 0.07 or 0 item.visual:PivotTo(CFrame.new(item.position + Vector3.new(0, bob, 0)) * CFrame.Angles(0, item.spin, 0)) if item.age >= item.pickupDelay and (item.position - pickupPoint).Magnitude <= BLOCK * 1.25 then local remaining = item.count local pending = { id = item.id, n = item.count } F.insertStack(pending, 9, 44) if pending.n < remaining then item.count = pending.n needsRefresh = true if item.count <= 0 then item.visual:Destroy() table.remove(droppedItems, i) else if item.countLabel then item.countLabel.Text = item.count > 1 and tostring(item.count) or "" end end end end end end if needsRefresh then refresh() end end local wasJumping = false F.tick = function() if F.playerDead then return end prevPos, prevBodyYaw, prevWalkSpeed = pos, bodyYaw, walkSpeed age += 1 H.handTick() F.eatTimePrev = F.eatTime or 0 if F.eating then F.eatTime = (F.eatTime or 0) + 1 if F.eatTime >= 32 then if not creative then local foodStack = slots[36 + selected] if foodStack and foodStack.id == F.eatItemId then foodStack.n -= 1 if foodStack.n <= 0 then slots[36 + selected] = nil end end end F.eating = false F.eatTime = 32 F.eatItemId = nil rightClickDelay = 0 refresh() end end if jumpDelay > 0 then jumpDelay -= 1 end if jumpTriggerTime > 0 then jumpTriggerTime -= 1 end if rightClickDelay > 0 then rightClickDelay -= 1 end if missTime > 0 then missTime -= 1 end local blockedByUI = invOpen or chatOpen or (chatInput ~= nil and chatInput:IsFocused()) local mv, jumpReq = Vector3.zero, false if not blockedByUI then mv = F.getMove() jumpReq = UIS:IsKeyDown(Enum.KeyCode.Space) or touchJumpHeld or (hum ~= nil and hum.Jump) if hum and hum.Jump then hum.Jump = false end end local inputForward = -mv.Z -- Sprint uses the original input; camera-relative movement below handles front-view inversion. sneaking = (not blockedByUI) and (UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift) or sneakToggle) and not abilities.flying if inputForward < 0.8 then sprintLatch = false end sprinting = (not blockedByUI) and (not sneaking) and inputForward >= 0.8 and ( UIS:IsKeyDown(Enum.KeyCode.LeftControl) or UIS:IsKeyDown(Enum.KeyCode.RightControl) or sprintToggle or sprintLatch ) local justToggledFlight = false if abilities.mayfly and not blockedByUI then if jumpReq and not wasJumping then if jumpTriggerTime == 0 then jumpTriggerTime = 7 else abilities.flying = not abilities.flying if abilities.flying and onGround then vel = Vector3.new(vel.X, 0, vel.Z) end justToggledFlight = true jumpTriggerTime = 0 end end end wasJumping = jumpReq if blockedByUI then vel = Vector3.zero walkSpeed += (0 - walkSpeed) * 0.4 walkPos += walkSpeed F.continueAttack(false) return end local cameraNow = workspace.CurrentCamera or camera local worldDirection = Vector3.zero if cameraNow then local cameraMove = mv if viewMode == 2 then cameraMove = Vector3.new(-mv.X, 0, -mv.Z) end local look = cameraNow.CFrame.LookVector local right = cameraNow.CFrame.RightVector local forwardFlat = Vector3.new(look.X, 0, look.Z) local rightFlat = Vector3.new(right.X, 0, right.Z) if forwardFlat.Magnitude > 1e-5 then forwardFlat = forwardFlat.Unit end if rightFlat.Magnitude > 1e-5 then rightFlat = rightFlat.Unit end worldDirection = rightFlat * cameraMove.X + forwardFlat * -cameraMove.Z if worldDirection.Magnitude > 1 then worldDirection = worldDirection.Unit end end local onClimb = (not abilities.flying) and H.isOnClimbable() local horizontalSpeed if abilities.flying then horizontalSpeed = sprinting and FLY_SPRINT_BLOCKS_PER_SECOND or FLY_BLOCKS_PER_SECOND elseif sneaking then horizontalSpeed = SNEAK_BLOCKS_PER_SECOND elseif sprinting then horizontalSpeed = SPRINT_BLOCKS_PER_SECOND else horizontalSpeed = WALK_BLOCKS_PER_SECOND end -- Match the companion controller: horizontal velocity is measured in blocks/tick, -- approaches the target speed using Minecraft's friction factor, and uses the same -- 20 TPS collision movement below. Default ground slipperiness is 0.6 (0.546 friction). local slipperiness = GROUND_SLIPPERINESS if onGround then local groundRay = workspace:Raycast(pos + Vector3.new(0, 0.04, 0), Vector3.new(0, -0.18, 0), rp) if groundRay and groundRay.Instance and groundRay.Instance:IsA("BasePart") then local tagged = groundRay.Instance:GetAttribute("MCSlipperiness") if typeof(tagged) == "number" then slipperiness = math.clamp(tagged, 0.1, 1.0) elseif groundRay.Instance.Material == Enum.Material.Ice then slipperiness = 0.98 end end end local friction = onGround and math.clamp(slipperiness * 0.91, 0.1, 0.99) or 0.91 local targetPerTick = horizontalSpeed / 20 local accel = (1 - friction) * targetPerTick local hv = Vector3.new(vel.X, 0, vel.Z) * friction if worldDirection.Magnitude > 0.001 and not blockedByUI then hv += worldDirection * accel end vel = Vector3.new(hv.X, vel.Y, hv.Z) if abilities.flying then local verticalInput = 0 if jumpReq and not justToggledFlight then verticalInput += 1 end if UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift) or sneakToggle then verticalInput -= 1 end local targetVertical = verticalInput * 0.12 vel = Vector3.new(vel.X, vel.Y * 0.55 + targetVertical * 0.45, vel.Z) F.moveEntity(vel.X * BLOCK, vel.Y * BLOCK, vel.Z * BLOCK) if onGround and vel.Y < 0 then vel = Vector3.new(vel.X, 0, vel.Z) end else if jumpReq then if onGround and jumpDelay == 0 and not blockedByUI then local newY = 0.42 -- Keep sprint-jumping at normal ground sprint speed. The previous -- extra horizontal impulse made a regular jump feel like flight sprint. vel = Vector3.new(vel.X, newY, vel.Z) jumpDelay = 10 end else jumpDelay = 0 end if onClimb then fallDistance = 0 local yd = math.max(vel.Y, -0.15) if yd < 0 and sneaking then yd = 0 end vel = Vector3.new(math.clamp(vel.X, -0.15, 0.15), yd, math.clamp(vel.Z, -0.15, 0.15)) end local hit = F.moveEntity(vel.X * BLOCK, vel.Y * BLOCK, vel.Z * BLOCK) if hit then sprintLatch = false end if onClimb and (hit or jumpReq) then vel = Vector3.new(vel.X, 0.2, vel.Z) end local heightBlocks = sneaking and 1.5 or 1.8 local groundedNow = false if vel.Y <= 0 then local groundedPosition groundedPosition, groundedNow = F.snapToNearbyGround(pos, heightBlocks, 0.42) if groundedNow then pos = groundedPosition end end if groundedNow then onGround = true vel = Vector3.new(vel.X, 0, vel.Z) else onGround = false if not onClimb then vel = Vector3.new(vel.X, (vel.Y - 0.08) * 0.98, vel.Z) end end if not onClimb then if not onGround then fallDistance = (fallDistance or 0) + math.max(0, -vel.Y) else if (fallDistance or 0) > 3 and not abilities.invulnerable then local dmg = math.floor(fallDistance - 3) if dmg > 0 and hum then local nextHealth = math.max(0, hum.Health - dmg * 2) if nextHealth <= 0 then F.pendingPlayerDeathMessage = tostring(lp.Name) .. " was killed" end hum.Health = nextHealth if nextHealth <= 0 then F.beginPlayerDeath(F.pendingPlayerDeathMessage) return end end end fallDistance = 0 end end end if math.abs(vel.X) < 0.003 then vel = Vector3.new(0, vel.Y, vel.Z) end if math.abs(vel.Z) < 0.003 then vel = Vector3.new(vel.X, vel.Y, 0) end if math.abs(vel.Y) < 0.003 then vel = Vector3.new(vel.X, 0, vel.Z) end local dxz = Vector3.new(pos.X - prevPos.X, 0, pos.Z - prevPos.Z).Magnitude / BLOCK local gaitTarget = math.min(dxz * 4, 1) -- Creative flight moves faster than walking, but vanilla-style limb animation -- continues at a regular walking cadence instead of becoming a rapid run cycle. if abilities.flying then gaitTarget = math.min(dxz, WALK_BLOCKS_PER_SECOND / 20) * 4 end walkSpeed += (gaitTarget - walkSpeed) * 0.4 walkPos += walkSpeed -- Smooth body turning rather than snapping the body to yaw every simulation tick. local yawDelta = F.wrap(yaw - bodyYaw) if dxz > 0.0025 or viewMode == 2 then local amount = 1 - math.exp(-BODY_MOVE_TURN_RESPONSE * TICK) bodyYaw = F.wrap(bodyYaw + yawDelta * amount) if math.abs(yawDelta) < math.rad(0.25) then bodyYaw = yaw end else local excess = math.abs(yawDelta) - MAX_HEAD_YAW if excess > 0 then local catchup = excess - math.min(excess, BODY_TURN_DEADZONE) local amount = 1 - math.exp(-BODY_TURN_RESPONSE * TICK) bodyYaw = F.wrap(bodyYaw + math.sign(yawDelta) * catchup * amount) end end if F.entityAttackCooldown > 0 then F.entityAttackCooldown -= 1 end F.continueAttack(attackHeld and not blockedByUI) if useHeld and rightClickDelay == 0 and not blockedByUI then F.startUseItem() end if pos.Y < workspace.FallenPartsDestroyHeight + 50 then pos, prevPos, vel = spawnPos, spawnPos, Vector3.zero end end local NUM = { [Enum.KeyCode.One] = 1, [Enum.KeyCode.Two] = 2, [Enum.KeyCode.Three] = 3, [Enum.KeyCode.Four] = 4, [Enum.KeyCode.Five] = 5, [Enum.KeyCode.Six] = 6, [Enum.KeyCode.Seven] = 7, [Enum.KeyCode.Eight] = 8, [Enum.KeyCode.Nine] = 9, } local ptr = Vector2.new(vp.X / 2, vp.Y / 2) F.isOverHotbar = function(pos2d) local objs = playerGui:GetGuiObjectsAtPosition(pos2d.X, pos2d.Y) for _, o in ipairs(objs) do if o:IsDescendantOf(hotbar) or o == dropInventoryButton or o:IsDescendantOf(dropInventoryButton) then return true end end return false end F.track(UIS.InputBegan:Connect(function(input, gpe) local t = input.UserInputType if t == Enum.UserInputType.Touch then ptr = Vector2.new(input.Position.X, input.Position.Y) return end if t == Enum.UserInputType.MouseButton1 and not invOpen and not chatOpen and not (chatInput and chatInput:IsFocused()) then local mp = UIS:GetMouseLocation() if F.isOverHotbar(mp) then return end if not gpe then attackHeld = true F.startAttack() end return end if t == Enum.UserInputType.MouseButton2 and not invOpen and not chatOpen and not (chatInput and chatInput:IsFocused()) then local mp = UIS:GetMouseLocation() if F.isOverHotbar(mp) then return end if not gpe then useHeld = true F.startUseItem() end return end if t ~= Enum.UserInputType.Keyboard then return end if F.playerDead then return end local k = input.KeyCode if k == Enum.KeyCode.Escape and chatOpen then F.setChatOpen(false, false) return end if UIS:GetFocusedTextBox() then return end if k == Enum.KeyCode.F1 then hudVisible = not hudVisible F.updateHudVisibility() return elseif k == Enum.KeyCode.F3 then F.toggleDebug() return elseif k == Enum.KeyCode.E then F.setInventory(not invOpen) elseif k == Enum.KeyCode.W then if os.clock() - lastW < 0.3 then sprintLatch = true end lastW = os.clock() elseif k == Enum.KeyCode.F5 or k == Enum.KeyCode.V then viewMode = (viewMode + 1) % 3 F.applyCameraMode() elseif k == Enum.KeyCode.F4 then F.setGameMode(not creative) if creativeBtn then creativeBtn.Text = creative and "Creative" or "Survival"; F.paintToggle(creativeBtn, creative) end if flyBtn then flyBtn.Visible = creative; F.paintToggle(flyBtn, abilities.flying) end nameLabel.Text = creative and "Creative Mode" or "Survival Mode" nameUntil = os.clock() + 2 elseif k == Enum.KeyCode.Q and not invOpen then local all = UIS:IsKeyDown(Enum.KeyCode.LeftControl) or UIS:IsKeyDown(Enum.KeyCode.RightControl) local s = slots[36 + selected] if s then local count = all and s.n or 1 if F.spawnItemDrop(s.id, count) then s.n -= count if s.n <= 0 then slots[36 + selected] = nil end refresh() end end elseif NUM[k] then local n = NUM[k] if invOpen and hover ~= nil and hover ~= 0 then local a, b = slots[hover], slots[35 + n] if (b == nil or F.canPlace(hover, b)) and (a == nil or F.canPlace(35 + n, a)) then slots[hover], slots[35 + n] = b, a F.updateCraft() refresh() end else F.selectHotbar(n - 1) end end end)) F.track(UIS.InputChanged:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.Touch then ptr = Vector2.new(input.Position.X, input.Position.Y) if invOpen and F.activeTouchSlot ~= nil and F.touchDragStartPos and F.touchDragCanPick and not F.touchDragging then local moved = (ptr - F.touchDragStartPos).Magnitude if moved >= 12 then F.touchDragging = true F.clickSlot(F.activeTouchSlot, 1, false) end end elseif t == Enum.UserInputType.MouseWheel and not invOpen and not chatOpen and not (chatInput and chatInput:IsFocused()) then local dir = math.sign(input.Position.Z) if dir ~= 0 then F.selectHotbar((selected - dir) % 9) end end end)) F.track(UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then attackHeld = false F.stopDestroyBlock() elseif input.UserInputType == Enum.UserInputType.MouseButton2 then F.stopUseItem() end end)) do local keys = { Enum.KeyCode.One, Enum.KeyCode.Two, Enum.KeyCode.Three, Enum.KeyCode.Four, Enum.KeyCode.Five, Enum.KeyCode.Six, Enum.KeyCode.Seven, Enum.KeyCode.Eight, Enum.KeyCode.Nine, Enum.KeyCode.KeypadOne, Enum.KeyCode.KeypadTwo, Enum.KeyCode.KeypadThree, Enum.KeyCode.KeypadFour, Enum.KeyCode.KeypadFive, Enum.KeyCode.KeypadSix, Enum.KeyCode.KeypadSeven, Enum.KeyCode.KeypadEight, Enum.KeyCode.KeypadNine, } for i = 1, 9 do local slot = i - 1 local name = "MCSteveHotbar" .. i ContextActionService:BindActionAtPriority(name, function(_, state) if state == Enum.UserInputState.Begin then if invOpen and hover ~= nil and hover ~= 0 then local a, b = slots[hover], slots[35 + i] if (b == nil or F.canPlace(hover, b)) and (a == nil or F.canPlace(35 + i, a)) then slots[hover], slots[35 + i] = b, a F.updateCraft() refresh() end else F.selectHotbar(slot) end end return Enum.ContextActionResult.Sink end, false, 3000, keys[i], keys[i + 9]) end ContextActionService:BindActionAtPriority("MCSteveScrollHotbar", function(_, state, input) if state == Enum.UserInputState.Change and not invOpen and input then local dir = math.sign(input.Position.Z) if dir ~= 0 then F.selectHotbar((selected - dir) % 9) end end return Enum.ContextActionResult.Sink end, false, 3000, Enum.UserInputType.MouseWheel) end local accum = 0 local renderState = { alpha = 0, ipos = pos, ibody = bodyYaw } F.update = function(dt) camera = workspace.CurrentCamera or camera if not camera or F.playerDead then return end if not (char and char.Parent and hrp and hrp.Parent) then return end accum += dt local n = 0 while accum >= TICK and n < 5 and not F.playerDead do accum -= TICK F.tick() n += 1 end if F.playerDead then accum = 0 return end if n == 5 then accum = 0 end local alpha = accum / TICK if debugPanel and debugPanel.Visible and debugText then local v = vel or Vector3.zero local mode = creative and "Creative" or "Survival" local view = ({[0] = "First person", [1] = "Back", [2] = "Front"})[viewMode] or "Unknown" debugText.Text = string.format( "Minecraft 1.12.1 (Steve / Luau)\nMode: %s View: %s Flying: %s\nXYZ: %.2f / %.2f / %.2f\nVelocity: %.3f / %.3f / %.3f Ground: %s\nInventory: %s Blocks: %d", mode, view, tostring(abilities.flying), pos.X / BLOCK, pos.Y / BLOCK, pos.Z / BLOCK, v.X, v.Y, v.Z, tostring(onGround), tostring(invOpen), blockFolder and #blockFolder:GetChildren() or 0 ) end local ipos = prevPos:Lerp(pos, alpha) local ibody = prevBodyYaw + F.wrap(bodyYaw - prevBodyYaw) * alpha renderState.alpha, renderState.ipos, renderState.ibody = alpha, ipos, ibody -- Keep the real character root synchronized before Roblox's native camera step. -- Viewmodel and Steve limbs are rendered separately after the camera updates. hrp.CFrame = CFrame.new(ipos + Vector3.new(0, rootVisualOffset, 0)) * CFrame.Angles(0, ibody, 0) hrp.AssemblyLinearVelocity = Vector3.zero hrp.AssemblyAngularVelocity = Vector3.zero if not invOpen then -- Hover/selection is read-only. Outline the shared-grid cell that the -- union-cut operation would remove; never replace or voxelize the target. local hitPart, hitPos, hitNormal = F.pickBlock() if F.isBreakableTarget(hitPart) and hitPos and hitNormal then local cellCenter = F.getGridCellCenter(hitPart, hitPos, hitNormal) selectionProxy.CFrame = CFrame.new(cellCenter) selectBox.Adornee = selectionProxy else selectBox.Adornee = nil end else selectBox.Adornee = nil end if selFrame and selFrame.Parent then selected = math.clamp(math.floor(selected or 0), 0, 8) selFrame.Position = UDim2.fromOffset((-1 + selected * 20) * GS, -1 * GS) end crosshair.Visible = (not invOpen) and viewMode ~= 2 if selected ~= lastSel then lastSel = selected local s = slots[36 + selected] nameLabel.Text = s and ITEMS[s.id].name or "" nameUntil = os.clock() + 2 end nameLabel.Visible = os.clock() < nameUntil and not invOpen if invOpen or chatOpen then -- The attachment camera must not recapture the cursor over interface controls. UIS.MouseBehavior = Enum.MouseBehavior.Default UIS.MouseIconEnabled = true end if invOpen then local mp = UIS.MouseEnabled and UIS:GetMouseLocation() or ptr carriedView.holder.Position = UDim2.fromOffset(mp.X - 8 * GS, mp.Y - 8 * GS) tooltip.Position = UDim2.fromOffset(mp.X + 8 * GS, mp.Y - 14 * GS) end end F.smoothedHeadYaw = F.smoothedHeadYaw or 0 F.smoothedHeadPitch = F.smoothedHeadPitch or 0 F.renderVisuals = function(renderDt) camera = workspace.CurrentCamera or camera if not camera then return end if F.playerDead then H.updateFirstPerson(camera.CFrame, 0) if viewMode ~= 0 then model.Parent = workspace if F.deathModelPivot then local elapsed = math.max(0, os.clock() - (F.deathStartedAt or os.clock())) local progress = math.clamp(elapsed / 1.0, 0, 1) local rotationProgress = math.sqrt(math.clamp(progress * 1.6, 0, 1)) local downProgress = progress * progress * (3 - 2 * progress) local modelHeight = F.deathModelHeight or (BLOCK * 2) local downwardOffset = math.min(modelHeight * 0.58, BLOCK * 1.65) * downProgress local corpsePivot = F.deathModelPivot * CFrame.new(0, -downwardOffset, 0) * CFrame.Angles(0, 0, math.rad(90) * rotationProgress) pcall(function() model:PivotTo(corpsePivot) end) end else model.Parent = nil end return end if not (char and char.Parent and hrp and hrp.Parent) then return end -- Keep sprint FOV separate from movement speed so Creative flight cannot trigger it. if F.fovCamera ~= camera then F.fovCamera = camera F.baseMovementFOV = camera.FieldOfView end local baseFOV = F.baseMovementFOV or camera.FieldOfView or 70 -- Only an explicit ground sprint changes the FOV. Do not infer sprinting from -- horizontal velocity, because Creative flight is naturally much faster. local sprintFOVActive = sprinting and not abilities.flying and not sneaking local targetFOV = baseFOV - (sprintFOVActive and 0.3 or 0) local fovBlend = 1 - math.exp(-7 * math.clamp(renderDt or (1 / 60), 0, 0.1)) camera.FieldOfView += (targetFOV - camera.FieldOfView) * fovBlend local alpha = renderState.alpha local eatPrev = F.eatTimePrev or F.eatTime or 0 local eatNow = F.eatTime or 0 F.renderEatTime = eatPrev + (eatNow - eatPrev) * alpha local renderAlpha = 1 - math.exp(-18 * math.clamp(renderDt or (1 / 60), 0, 0.1)) local eatBlendTarget = F.eating and 1 or 0 F.eatAnimationBlend = (F.eatAnimationBlend or 0) + (eatBlendTarget - (F.eatAnimationBlend or 0)) * renderAlpha local ipos = renderState.ipos local ibody = renderState.ibody local look = camera.CFrame.LookVector if viewMode == 2 then local facing = camera.CFrame.Position - hrp.Position if facing.Magnitude > 1e-5 then yaw = math.atan2(-facing.X, -facing.Z) end pitch = math.asin(math.clamp(-look.Y, -1, 1)) else yaw = math.atan2(-look.X, -look.Z) pitch = math.asin(math.clamp(look.Y, -1, 1)) end if viewMode == 0 then model.Parent = nil H.updateFirstPerson(camera.CFrame, alpha) else model.Parent = workspace local root = CFrame.new(ipos) * CFrame.Angles(0, ibody, 0) * CFrame.new(0, 24 * PX, 0) local ispeed = prevWalkSpeed + (walkSpeed - prevWalkSpeed) * alpha local targetHeadYaw = math.clamp(F.wrap(yaw - ibody), -math.rad(38), math.rad(38)) local targetHeadPitch = math.clamp(pitch, -math.rad(50), math.rad(50)) local smoothAlpha = 1 - math.exp(-14 * math.clamp(renderDt or (1 / 60), 0, 0.1)) F.smoothedHeadYaw = F.wrap(F.smoothedHeadYaw + F.wrap(targetHeadYaw - F.smoothedHeadYaw) * smoothAlpha) F.smoothedHeadPitch += (targetHeadPitch - F.smoothedHeadPitch) * smoothAlpha local interpolatedSwing = H.swingAt(alpha) local held = slots[36 + selected] local aP, aX, aZ, aY, aSwingZ = F.poseSteve(root, F.smoothedHeadPitch, F.smoothedHeadYaw, walkPos - walkSpeed * (1 - alpha), ispeed, age + alpha, sneaking, held ~= nil, interpolatedSwing) H.updateThirdPerson(root, aP, aX, aZ, aY, aSwingZ) end end shared.__MCSteveStop = function() pcall(function() RunService:UnbindFromRenderStep("MCSteve") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_SmoothSneakCamera") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_ResetPreviousCameraTransforms") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_ThirdPersonFrontView") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_HideLocalAvatar") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_CharacterAndHands") end) pcall(function() RunService:UnbindFromRenderStep("MCSteve_DroppedItems") end) for i = 1, 9 do pcall(function() ContextActionService:UnbindAction("MCSteveHotbar" .. i) end) end pcall(function() ContextActionService:UnbindAction("MCSteveScrollHotbar") end) for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end pcall(function() gui:Destroy() end) pcall(function() controlsGui:Destroy() end) pcall(function() if selectionProxy then selectionProxy:Destroy() end end) pcall(function() model:Destroy() end) pcall(function() if mobileDpad then mobileDpad:Destroy() end end) pcall(function() if controls and UIS.TouchEnabled then controls:Enable() end end) pcall(function() if H.handsFolder then H.handsFolder:Destroy() end end) pcall(function() if dropFolder then dropFolder:Destroy() end end) pcall(function() if blockFolder then blockFolder:Destroy() end end) for _, info in ipairs(F.baseplateOriginals or {}) do pcall(function() local part = info.part if part and part.Parent then part.LocalTransparencyModifier = info.localTransparencyModifier or 0 part.CanCollide = info.canCollide part.CanQuery = info.canQuery part.CanTouch = info.canTouch end end) end for _, info in ipairs(F.voxelOriginals or {}) do pcall(function() local part = info.part if part and part.Parent then part.LocalTransparencyModifier = info.localTransparencyModifier or 0 part.CanCollide = info.canCollide part.CanQuery = info.canQuery part.CanTouch = info.canTouch end end) end pcall(function() UIS.MouseBehavior = Enum.MouseBehavior.Default UIS.MouseIconEnabled = true camera.CameraType = Enum.CameraType.Custom lp.CameraMode = oldCameraMode lp.CameraMinZoomDistance = oldCameraMinZoom lp.CameraMaxZoomDistance = oldCameraMaxZoom if hrp then hrp.Anchored = false end if hum then hum.WalkSpeed = 16 hum.AutoRotate = true hum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Viewer hum.CameraOffset = F.oldCameraOffset or Vector3.zero camera.CameraSubject = hum end if char then for _, d in ipairs(char:GetDescendants()) do if d:IsA("BasePart") then d.LocalTransparencyModifier = 0 elseif d:IsA("Decal") then d.Transparency = 0 end end end end) shared.__MCSteveStop = nil end F.track(lp.CharacterAdded:Connect(F.bind)) F.bind(lp.Character or lp.CharacterAdded:Wait()) -- No initial terrain is created; manual block placement remains enabled. RunService:UnbindFromRenderStep("MCSteve_ResetPreviousCameraTransforms") RunService:UnbindFromRenderStep("MCSteve_ThirdPersonFrontView") local lastFrontCamera, lastFrontTransform = nil, CFrame.identity RunService:UnbindFromRenderStep("MCSteve_SmoothSneakCamera") RunService:BindToRenderStep("MCSteve_SmoothSneakCamera", Enum.RenderPriority.Camera.Value - 2, function(dt) if not hum or not hum.Parent then return end local uiBlocking = invOpen or chatOpen local sneakInput = UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift) or sneakToggle local targetEyeH = (sneakInput and not uiBlocking and not abilities.flying) and 1.27 or 1.62 local smoothAlpha = 1 - math.exp(-16 * math.clamp(dt, 0, 0.1)) cameraEyeH += (targetEyeH - cameraEyeH) * smoothAlpha eyeH = cameraEyeH hum.CameraOffset = Vector3.new(0, (cameraEyeH - 1.62) * BLOCK, 0) end) RunService:BindToRenderStep("MCSteve_ResetPreviousCameraTransforms", Enum.RenderPriority.Camera.Value - 1, function() local cam = workspace.CurrentCamera if not cam then lastFrontCamera = nil; lastFrontTransform = CFrame.identity; return end if lastFrontCamera == cam then cam.CFrame = cam.CFrame * lastFrontTransform:Inverse() end lastFrontCamera = cam lastFrontTransform = CFrame.identity end) RunService:BindToRenderStep("MCSteve_ThirdPersonFrontView", Enum.RenderPriority.Camera.Value + 1, function() local cam = workspace.CurrentCamera if not cam then return end if viewMode ~= 2 or invOpen or chatOpen then lastFrontCamera = cam lastFrontTransform = CFrame.identity return end local base = cam.CFrame local focus = cam.Focus.Position if hrp and hrp.Parent and (focus - hrp.Position).Magnitude > BLOCK * 8 then focus = hrp.Position + Vector3.new(0, rootVisualOffset * 0.1, 0) end local relative = base.Position - focus local frontPosition = focus + Vector3.new(-relative.X, relative.Y, -relative.Z) local front = CFrame.lookAt(frontPosition, focus) lastFrontTransform = base:ToObjectSpace(front) cam.CFrame = front end) RunService:UnbindFromRenderStep("MCSteve_HideLocalAvatar") RunService:BindToRenderStep("MCSteve_HideLocalAvatar", Enum.RenderPriority.Camera.Value + 1, function() if char and char.Parent then for _, descendant in ipairs(F.hiddenAvatarObjects or {}) do if descendant and descendant.Parent then F.hideOneAvatarObject(descendant) end end end end) RunService:BindToRenderStep("MCSteve_CharacterAndHands", Enum.RenderPriority.Camera.Value + 2, function(dt) if F.renderVisuals then F.renderVisuals(dt) end end) RunService:UnbindFromRenderStep("MCSteve_DroppedItems") RunService:BindToRenderStep("MCSteve_DroppedItems", Enum.RenderPriority.Camera.Value + 3, function(dt) if F.updateDroppedItems then F.updateDroppedItems(dt) end end) F.updateCameraViewButton = function() if cameraViewButton then cameraViewButton.Text = ({[0] = "1ST", [1] = "3RD BACK", [2] = "3RD FRONT"})[viewMode] or "1ST" end end F.track(RunService.Heartbeat:Connect(function(dt) F.update(dt) end)) print("test") end __RunMinecraftClient()