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 -- Features : Steve model/animations, catalog (implemented but not having entirety of blocks and items), inventory/crafting (might error), manual block -- placement/breaking, and the original player-mechanics movement/camera behavior (not fully accurate). -- 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. 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 F.rpPick = RaycastParams.new() F.rpPick.FilterType = Enum.RaycastFilterType.Exclude F.rpPick.RespectCanCollide = false 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) part:SetAttribute("MCLadderN", n) F.ladderSet = F.ladderSet or {} F.ladderSet[part] = 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 out of the world geometry in the selected cell. -- Every part that overlaps the cell is cut on its own, so each keeps its own -- material, color and transparency (for example a visible grass part and an -- invisible anti-cheat hitbox are never merged into one union). Roblox's CSG -- result is a UnionOperation; it is not expanded into a collection of Parts. 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) -- Collect every eligible world part whose bounds intersect the selected cell. 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 partInsideCell(part) 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 return true end local options = { CollisionFidelity = Enum.CollisionFidelity.Default, RenderFidelity = Enum.RenderFidelity.Automatic, SplitApart = false, } local function cutOnePart(target) if not (target and target.Parent) then return false end local targetParent = target.Parent local targetCFrame = target.CFrame local targetName = target.Name local targetAttributes = target:GetAttributes() 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(target, { cutter }, options) end) cutter:Destroy() local results = {} if cutOK and type(cutRaw) == "table" then for _, item in ipairs(cutRaw) do if typeof(item) == "Instance" and item:IsA("BasePart") then table.insert(results, item) 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() if partInsideCell(target) then pcall(function() target:Destroy() end) return true end warn("[PI3] Union cell cut failed for " .. targetName .. "; it was left unchanged.") return false end -- An empty successful result means this part was entirely inside the cell. if #results == 0 then pcall(function() target:Destroy() end) return true end for index, result in ipairs(results) do -- Each cut piece keeps the properties of the part it came from. pcall(function() result.CFrame = targetCFrame end) result.Name = index == 1 and targetName or (targetName .. "_CutPart" .. tostring(index)) pcall(function() result.Color = target.Color end) pcall(function() result.Material = target.Material end) pcall(function() result.MaterialVariant = target.MaterialVariant end) pcall(function() result.Reflectance = target.Reflectance end) pcall(function() result.Transparency = target.Transparency end) pcall(function() result.LocalTransparencyModifier = target.LocalTransparencyModifier end) pcall(function() result.Anchored = target.Anchored end) pcall(function() result.CanCollide = target.CanCollide end) pcall(function() result.CanQuery = target.CanQuery end) pcall(function() result.CanTouch = target.CanTouch end) pcall(function() result.CastShadow = target.CastShadow end) pcall(function() result.CollisionGroup = target.CollisionGroup end) pcall(function() result.CustomPhysicalProperties = target.CustomPhysicalProperties end) pcall(function() if result:IsA("PartOperation") and target:IsA("PartOperation") then result.UsePartColor = target.UsePartColor end end) for name, value in pairs(targetAttributes) do pcall(function() result:SetAttribute(name, value) end) end result:SetAttribute("MCClientUnionReplacement", true) result.Parent = targetParent end -- Keep textures, decals, surface GUIs and attachments from the original. local firstResult = results[1] for _, child in ipairs(target:GetChildren()) do if not child:IsA("BasePart") and not child:IsA("Model") and child.Parent == target then pcall(function() child.Parent = firstResult end) end end pcall(function() target:Destroy() end) return true end local changed = false for _, target in ipairs(targets) do if cutOnePart(target) then changed = true end end return changed 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 = (destroyPart:GetAttribute("MCBlockId") == "ladder") and destroyPart or 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 then F.checkLadders() end if removed and not abilities.instabuild and id and ITEMS[id] then F.spawnBlockDrop(id, cellCenter) 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 F.heldIsTool and F.heldIsTool() 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 -- Non-collidable block parts (the ladder plate) must be targetable too; other non-collidable -- parts fall back to the normal collidable-only ray. local r = workspace:Raycast(eye, dir, F.rpPick) if r and not r.Instance.CanCollide and not F.isMCBlock(r.Instance) then r = workspace:Raycast(eye, dir, rp) end -- 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) local ladderN if handId == "ladder" then -- Ladder attaches to a wall: prefer the clicked wall, otherwise the wall closest to where you look. local dirs = {} if math.abs(face.Y) < 0.5 then dirs[1] = -face end local lk = CFrame.Angles(0, yaw, 0).LookVector local h = { Vector3.xAxis, -Vector3.xAxis, Vector3.zAxis, -Vector3.zAxis } table.sort(h, function(a, b) return a:Dot(lk) > b:Dot(lk) end) for _, d in ipairs(h) do dirs[#dirs + 1] = d end for _, d in ipairs(dirs) do if workspace:Raycast(center, d * (BLOCK * 0.6), rp) then ladderN = -d break end end if not ladderN then return false end 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, ladderN or 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.toolInfo = {} F.clearIconCache = function(id) iconTpl[id] = nil end F.buildToolIcon = function(info) local f = Instance.new("Frame") f.BackgroundTransparency = 1 f.Size = UDim2.fromOffset(16 * GS, 16 * GS) if info.image and info.image ~= "" then local img = Instance.new("ImageLabel") img.BackgroundTransparency = 1 img.Size = UDim2.fromScale(1, 1) img.Image = info.image img.ScaleType = Enum.ScaleType.Fit img.Parent = f else local t = Instance.new("TextLabel") t.BackgroundTransparency = 1 t.Size = UDim2.fromScale(1, 1) t.Font = Enum.Font.Arcade t.TextScaled = true t.TextWrapped = true t.Text = info.name t.TextColor3 = Color3.new(1, 1, 1) t.TextStrokeTransparency = 0.3 t.Parent = f end return f end F.cloneIcon = function(id) if not iconTpl[id] then if F.toolInfo[id] then iconTpl[id] = F.buildToolIcon(F.toolInfo[id]) else iconTpl[id] = F.buildImage(ICON[id], GS) end 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.70 -- Slightly smaller main HUD hotbar only; creative/survival inventory screens stay unchanged. 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.Name = "InventoryDim" 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 = {} F.cViews = F.cViews or {} 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 if F.cViews[i] then F.setView(F.cViews[i], slots[i]) end end if F.updateGhosts then F.updateGhosts() 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 F.cButtons, F.cCatalogButtons = {}, {} -- True when a GuiObject and every ancestor are visible (a hidden parent keeps the child's own Visible true). F.guiShown = function(obj) while obj and obj:IsA("GuiObject") do if not obj.Visible then return false end obj = obj.Parent end return obj ~= nil end F.pointOnButton = function(btn, pos) if not (btn and F.guiShown(btn)) then return false end local ap, as = btn.AbsolutePosition, btn.AbsoluteSize return pos.X >= ap.X and pos.X <= ap.X + as.X and pos.Y >= ap.Y and pos.Y <= ap.Y + as.Y end F.findTouchTarget = function(pos) for _, b in ipairs(F.cCatalogButtons) do if F.pointOnButton(b, pos) then return nil, true end end for targetIdx, targetButton in pairs(F.cButtons) do if F.pointOnButton(targetButton, pos) then return targetIdx, false end end for targetIdx, targetButton in pairs(slotButtons) do if F.pointOnButton(targetButton, pos) then return targetIdx, false end end return nil, false end -- Builds the item view + click/touch button for one inventory slot on any panel. F.bindSlot = function(idx, p, parentView, parentBtn, viewStore, btnStore, hl) viewStore[idx] = F.newView(parentView, 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 = parentBtn btnStore[idx] = b local touchStart = 0 F.track(b.MouseEnter:Connect(function() hover = idx hl.Position = UDim2.fromOffset(p[1] * GS, p[2] * GS) hl.Visible = true refresh() end)) F.track(b.MouseLeave:Connect(function() if hover == idx then hover = nil hl.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 hl.Position = UDim2.fromOffset(p[1] * GS, p[2] * GS) hl.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 = F.pointOnButton(F.deleteButton, endPos) or F.pointOnButton(F.cDeleteButton, endPos) if hitDelete then carried = nil refresh() else local targetSlot, onCatalog = F.findTouchTarget(endPos) if onCatalog then carried = nil refresh() elseif 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 hl.Visible = false refresh() end end)) end for idx, p in pairs(layout) do F.bindSlot(idx, p, panel, panel, views, slotButtons, highlight) 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 (tabs, catalog placeholder, survival tab) --------------------------------------------------------------------- -- Layer 1 "Creative background ui": panel, tab backgrounds, empty catalog slots, -- search box + title, scroll track, survival layout, main hotbar slots. -- Layer 2 "Selection Gui": selected-tab backgrounds and catalog slot highlights. -- Layer 3 "Static Gui": category icons, search textbox, scroll button. -- Layer 4 "Placeholder Items": placeholder item icons per category (scrolls). -- Slot views/buttons for the main inventory sit above these four layers. do -- Asset ids supplied for the Minecraft button / container textures. local PANEL_IMAGE = "rbxassetid://82321763644703" local BUTTON_IMAGE = "rbxassetid://111461382199415" -- The panel image is slightly offset in its canvas; adjust these (in GUI units) if needed. -- Measured in Studio on a GS = 2 screen ({0,405},{0,350} at {0,0}); stored in GUI units so it scales. local PANEL_IMAGE_POS = Vector2.new(0, 0) local PANEL_IMAGE_SIZE = Vector2.new(202.5, 175) F.UI_ASSET = { panel = PANEL_IMAGE, button = BUTTON_IMAGE } local PX = { icons = { building = "6,1,1,1,826861;7,1,1,1,844d3e;8,1,1,1,9a6051;9,1,1,1,826861;4,2,2,1,9b6b5e;6,2,2,1,9a6051;8,2,1,4,9b6b5e;9,2,2,1,9a6051;11,2,1,1,9b6b5e;2,3,1,1,826861;3,3,1,1,844d3e;4,3,1,1,9a6051;5,3,1,2,9b6b5e;6,3,2,1,844d3e;9,3,1,1,9b6b5e;10,3,1,1,844d3e;11,3,2,1,9a6051;13,3,1,1,826861;1,4,1,1,826861;2,4,2,1,9a6051;4,4,1,2,9b6b5e;6,4,1,1,9a6051;7,4,1,1,9b6b5e;9,4,3,1,9a6051;12,4,1,1,9b6b5e;13,4,1,1,844d3e;14,4,1,1,624841;0,5,1,8,826861;1,5,1,1,3d2923;2,5,1,2,624841;3,5,1,1,844d3e;5,5,1,1,9a6051;6,5,2,1,844d3e;9,5,2,1,844d3e;11,5,1,1,9a6051;12,5,1,1,844d3e;13,5,1,1,39211b;14,5,1,1,3d2923;1,6,1,1,633d33;3,6,1,1,5e3529;4,6,1,1,844d3e;5,6,1,1,826861;6,6,4,1,9a6051;10,6,1,1,633d33;11,6,1,1,3d2923;12,6,1,1,39211b;13,6,1,2,3d2923;14,6,1,1,49332d;1,7,1,1,5e3529;2,7,1,1,633d33;3,7,1,1,624841;4,7,1,1,49332d;5,7,2,1,633d33;7,7,1,1,844d3e;8,7,1,1,633d33;9,7,3,1,39211b;12,7,1,1,3d2923;14,7,1,1,3d2923;1,8,1,1,633d33;2,8,2,1,5e3529;4,8,2,1,624841;6,8,1,2,633d33;7,8,1,1,5e3529;8,8,1,1,39211b;9,8,1,1,49332d;10,8,2,1,3d2923;12,8,2,1,39211b;14,8,1,5,49332d;1,9,1,2,5e3529;2,9,2,1,624841;4,9,2,1,5e3529;7,9,1,1,633d33;8,9,2,1,3d2923;10,9,1,1,39211b;11,9,2,2,3d2923;13,9,1,1,49332d;2,10,1,2,624841;3,10,1,1,633d33;4,10,1,1,624841;5,10,1,2,633d33;6,10,1,1,5e3529;7,10,1,2,624841;8,10,2,1,39211b;10,10,1,1,3d2923;13,10,1,1,3d2923;1,11,1,1,633d33;3,11,2,1,5e3529;6,11,1,1,624841;8,11,1,1,3d2923;9,11,1,3,49332d;10,11,2,1,39211b;12,11,1,2,3d2923;13,11,1,1,49332d;1,12,2,1,5e3529;3,12,1,1,633d33;4,12,2,1,624841;6,12,2,1,633d33;8,12,1,1,39211b;10,12,1,1,39211b;11,12,1,2,3d2923;13,12,1,1,39211b;1,13,1,1,826861;2,13,1,1,633d33;3,13,1,1,49332d;4,13,1,1,633d33;5,13,2,1,624841;7,13,1,1,5e3529;8,13,1,2,3d2923;10,13,1,2,3d2923;12,13,1,1,39211b;13,13,1,1,49332d;3,14,1,1,826861;4,14,1,1,624841;5,14,2,1,5e3529;7,14,1,2,624841;9,14,1,1,39211b;11,14,1,1,624841;12,14,1,1,826861;5,15,1,1,826861;6,15,1,1,633d33;8,15,1,1,39211b;9,15,1,1,49332d;", colored = "7,0,2,1,2f8a90;5,1,1,1,2f8a90;6,1,3,1,148990;9,1,1,5,168890;10,1,1,1,2f8a90;3,2,1,1,2f8a90;4,2,1,1,148990;5,2,2,1,168890;7,2,1,1,148990;8,2,1,3,168890;10,2,2,1,148990;12,2,1,1,2f8a90;1,3,1,1,2f8a90;2,3,1,2,168890;3,3,1,1,148990;4,3,2,1,168890;6,3,1,2,148990;7,3,1,1,168890;10,3,2,1,168890;12,3,1,2,148990;13,3,1,1,168890;14,3,1,1,2f8a90;1,4,1,2,0d5a5e;3,4,1,1,168890;4,4,1,1,148990;5,4,1,2,168890;7,4,1,1,148990;10,4,1,2,168890;11,4,1,1,148990;13,4,1,1,226a6f;14,4,1,9,043235;2,5,1,8,0d5a5e;3,5,1,1,226a6f;4,5,1,1,168890;6,5,2,1,168890;8,5,1,1,148990;11,5,1,1,0d5a5e;12,5,1,1,0b4043;13,5,1,7,083639;1,6,1,2,0a565c;3,6,1,1,0d5a5e;4,6,1,1,0e555b;5,6,1,2,0d5a5e;6,6,1,1,168890;7,6,1,1,148990;8,6,1,1,168890;9,6,1,1,0d5a5e;10,6,1,9,083639;11,6,1,1,043235;12,6,1,7,083639;3,7,1,2,0e555b;4,7,1,1,0d5a5e;6,7,1,1,0e555b;7,7,1,1,0d5a5e;8,7,1,1,0b4043;9,7,1,8,083639;11,7,1,1,083639;1,8,1,1,0d5a5e;4,8,2,1,0e555b;6,8,1,1,0d5a5e;7,8,1,8,0e555b;8,8,1,1,083639;11,8,1,1,043235;1,9,1,2,0a565c;3,9,2,1,0d5a5e;5,9,2,1,0e555b;8,9,1,1,043235;11,9,1,5,083639;3,10,2,1,0e555b;5,10,2,1,0d5a5e;8,10,1,3,083639;1,11,1,1,0d5a5e;3,11,3,1,0d5a5e;6,11,1,2,0e555b;1,12,1,1,0a565c;3,12,3,1,0e555b;13,12,1,1,043235;2,13,1,1,226a6f;3,13,4,1,0d5a5e;8,13,1,1,043235;12,13,1,1,0b4043;13,13,1,1,226a6f;4,14,1,1,226a6f;5,14,1,1,0a565c;6,14,1,1,0d5a5e;8,14,1,1,083639;11,14,1,1,226a6f;6,15,1,1,226a6f;8,15,1,1,0b4043;9,15,1,1,226a6f;", natural = "0,0,2,16,ededed;2,0,6,1,8b8b8b;8,0,1,1,8d8d8e;9,0,1,1,858381;10,0,1,1,597450;11,0,1,3,466b3d;12,0,1,1,597450;13,0,1,1,858381;14,0,1,1,8b8b8b;15,0,1,1,8d8d8e;2,1,4,1,8b8b8b;6,1,2,1,8d8d8e;8,1,1,1,597450;9,1,2,5,466b3d;12,1,3,4,466b3d;15,1,1,1,858381;2,2,3,1,8b8b8b;5,2,1,1,858381;6,2,1,1,597450;7,2,2,2,466b3d;15,2,1,3,466b3d;2,3,2,13,8b8b8b;4,3,1,1,858381;5,3,1,1,465a3a;6,3,1,1,466b3d;11,3,1,1,597450;4,4,1,1,597450;5,4,1,4,433422;6,4,2,1,465a3a;8,4,1,1,466b3d;11,4,1,2,466b3d;4,5,1,8,858381;6,5,2,1,433422;8,5,1,1,465a3a;12,5,1,1,466b3d;13,5,1,1,597450;14,5,1,1,466b3d;15,5,1,9,2f2419;6,6,1,7,50412b;7,6,2,3,433422;9,6,4,1,465a3a;13,6,1,1,433422;14,6,1,6,2f2419;9,7,3,2,433422;12,7,2,3,2f2419;5,8,1,1,50412b;5,9,1,3,433422;7,9,1,1,433422;8,9,4,2,50412b;7,10,1,3,50412b;12,10,2,1,433422;8,11,3,3,50412b;11,11,1,1,433422;12,11,2,1,2f2419;5,12,1,1,465a3a;11,12,1,4,50412b;12,12,1,3,2f2419;13,12,2,1,433422;4,13,1,3,8b8b8b;5,13,1,1,8d8d8e;6,13,1,1,858381;7,13,1,1,465a3a;13,13,2,1,2f2419;5,14,3,2,8b8b8b;8,14,1,1,858381;9,14,1,1,465a3a;10,14,1,1,50412b;13,14,1,1,433422;14,14,1,1,465a3a;15,14,1,1,858381;8,15,1,1,8b8b8b;9,15,1,1,8d8d8e;10,15,1,1,858381;12,15,1,1,465a3a;13,15,1,1,8b8b8b;14,15,1,1,8d8d8e;15,15,1,1,8b8b8b;", functional = "2,1,2,1,ae9366;9,1,3,1,ae9366;13,1,1,2,9d7e4b;1,2,1,1,ae9366;2,2,1,1,7c6138;3,2,5,1,ad8d57;8,2,1,1,967847;9,2,1,1,8e7245;10,2,1,1,ad8d57;11,2,1,1,967847;12,2,1,1,a5854f;1,3,1,1,ad8d57;2,3,1,1,705c3e;3,3,1,1,8e7245;4,3,1,5,ad8d57;5,3,1,1,967847;6,3,1,1,7c6138;7,3,1,3,a5854f;8,3,1,1,7c6138;9,3,1,1,705c3e;10,3,2,1,7c6138;12,3,1,1,9d7e4b;13,3,1,1,967847;1,4,1,4,ae9366;2,4,1,1,967847;3,4,1,1,9d7e4b;5,4,1,1,9d7e4b;6,4,1,2,8e7245;8,4,2,1,9d7e4b;10,4,1,1,8e7245;11,4,1,2,967847;12,4,1,2,a5854f;13,4,1,1,9d7e4b;2,5,1,1,ad8d57;3,5,1,1,967847;5,5,1,1,967847;8,5,1,1,ad8d57;9,5,1,1,967847;10,5,1,4,a5854f;13,5,1,1,a5854f;2,6,1,2,967847;3,6,1,1,7c6138;5,6,1,1,7c6138;6,6,1,1,705c3e;7,6,1,1,7c6138;8,6,1,1,967847;9,6,1,1,7c6138;11,6,1,1,8e7245;12,6,1,1,9d7e4b;13,6,1,1,967847;3,7,1,1,967847;5,7,1,1,9d7e4b;6,7,1,1,967847;7,7,2,1,8e7245;9,7,1,1,967847;11,7,1,1,9d7e4b;12,7,1,2,a5854f;13,7,1,2,9d7e4b;1,8,1,1,ad8d57;2,8,8,1,a5854f;11,8,1,1,a5854f;1,9,13,1,7c6138;1,10,1,1,7b6c55;2,10,5,1,705c3e;7,10,2,2,524027;9,10,5,1,705c3e;6,11,1,1,8e7245;9,11,1,5,7b6c55;6,12,1,1,967847;7,12,1,1,705c3e;8,12,1,4,524027;6,13,1,2,8e7245;7,13,1,1,7c6138;7,14,1,2,705c3e;6,15,1,1,7b6c55;", redstone = "7,2,2,1,5a2826;6,3,1,1,470702;7,3,1,1,750401;8,3,1,2,a10f02;9,3,1,1,480401;5,4,1,1,5a2826;6,4,1,1,a10f02;7,4,1,1,d00500;9,4,1,1,470702;10,4,1,1,5a2826;4,5,1,1,750401;5,5,1,4,a10f02;6,5,1,2,d00500;7,5,1,1,a10f02;8,5,1,1,750401;9,5,1,1,d00500;10,5,1,3,480401;11,5,1,1,2b0201;3,6,1,1,5a2826;4,6,1,1,a10f02;7,6,1,1,d00500;8,6,1,1,a10f02;9,6,1,2,750401;11,6,1,1,440906;12,6,1,1,5a2826;2,7,2,1,750401;4,7,1,1,d00500;6,7,1,1,750401;7,7,1,1,470702;8,7,1,1,d00500;11,7,1,1,a10f02;12,7,1,3,440906;13,7,1,3,2b0201;2,8,1,1,750401;3,8,2,1,a10f02;6,8,1,1,d00500;7,8,2,1,750401;9,8,1,1,480401;10,8,1,1,470702;11,8,1,1,750401;2,9,1,1,2b0201;3,9,1,1,480401;4,9,1,1,a10f02;5,9,1,2,d00500;6,9,1,1,a10f02;7,9,1,1,750401;8,9,1,2,480401;9,9,1,1,a10f02;10,9,2,1,480401;2,10,1,1,706464;3,10,1,1,2b0201;4,10,1,1,750401;6,10,1,1,750401;7,10,1,1,480401;9,10,1,1,750401;10,10,1,1,470702;11,10,1,1,440906;12,10,1,1,2b0201;13,10,1,1,706464;3,11,1,1,706464;4,11,1,1,2b0201;5,11,1,1,480401;6,11,1,1,440906;7,11,2,1,470702;9,11,1,1,440906;10,11,2,1,2b0201;12,11,1,1,706464;4,12,2,1,706464;6,12,4,1,2b0201;10,12,2,1,706464;6,13,4,1,706464;", hotbars = "6,0,2,1,987b4b;8,0,1,1,b08f5a;4,1,2,1,987b4b;6,1,2,1,b08f5a;8,1,1,1,987b4b;9,1,1,3,a58550;10,1,1,1,b08f5a;2,2,2,1,987b4b;4,2,1,1,b08f5a;5,2,3,1,987b4b;8,2,1,1,a58550;10,2,1,1,987b4b;11,2,1,2,a58550;12,2,1,1,b08f5a;1,3,1,1,987b4b;2,3,1,1,b08f5a;3,3,1,1,a58550;4,3,1,1,6f5c3d;5,3,1,3,a58550;6,3,1,1,b08f5a;7,3,1,1,987b4b;8,3,1,1,6f5c3d;10,3,1,1,b08f5a;12,3,1,2,987b4b;13,3,1,1,b08f5a;14,3,1,1,a58550;1,4,1,1,46371d;2,4,1,1,6f5c3d;3,4,2,1,987b4b;6,4,1,1,987b4b;7,4,2,1,a58550;9,4,2,1,987b4b;11,4,1,1,b08f5a;13,4,1,1,474a30;14,4,1,2,1e1914;1,5,2,3,42160c;3,5,1,1,3b2c13;4,5,1,1,6f5c3d;6,5,1,1,b08f5a;7,5,2,2,987b4b;9,5,2,1,b08f5a;11,5,1,1,46371d;12,5,1,1,1e1914;13,5,1,3,1e2d28;3,6,1,1,42160c;4,6,1,1,3b2c13;5,6,1,1,46371d;6,6,1,1,6f5c3d;9,6,1,1,474a30;10,6,2,1,1e1914;12,6,1,4,3b2c13;14,6,1,2,1e2d28;3,7,1,1,1e2d28;4,7,2,1,474a30;6,7,1,3,1e2d28;7,7,1,8,474a30;8,7,2,1,1e1914;10,7,1,1,42160c;11,7,1,2,3b2c13;1,8,1,1,474a30;2,8,1,1,6f5c3d;3,8,1,1,474a30;4,8,2,1,46371d;8,8,1,1,1e1914;9,8,1,2,42160c;10,8,1,1,1e1914;13,8,1,1,46371d;14,8,1,1,3b2c13;1,9,1,1,42160c;2,9,1,1,3b2c13;3,9,2,1,6f5c3d;5,9,1,1,46371d;8,9,1,1,42160c;10,9,1,2,3b2c13;11,9,1,1,46371d;13,9,2,1,1e1914;1,10,1,1,474a30;2,10,1,2,1e2d28;3,10,2,1,46371d;5,10,2,1,474a30;8,10,1,4,3b2c13;9,10,1,1,46371d;11,10,2,1,1e1914;13,10,2,2,1e2d28;1,11,1,1,42160c;3,11,1,1,46371d;4,11,1,2,42160c;5,11,1,1,1e1914;6,11,1,1,3b2c13;9,11,1,1,1e1914;10,11,1,3,1e2d28;11,11,2,1,42160c;1,12,1,1,6f5c3d;2,12,1,1,474a30;3,12,1,1,1e2d28;5,12,1,1,46371d;6,12,1,1,1e2d28;9,12,1,2,1e2d28;11,12,1,1,1e1914;12,12,1,1,42160c;13,12,1,1,46371d;14,12,1,1,6f5c3d;3,13,1,1,6f5c3d;4,13,1,1,46371d;5,13,1,1,3b2c13;6,13,1,2,474a30;11,13,1,1,3b2c13;12,13,1,1,6f5c3d;5,14,1,1,6f5c3d;8,14,1,1,42160c;9,14,1,1,46371d;10,14,1,1,6f5c3d;7,15,2,1,6f5c3d;", search = "5,1,6,1,ababab;3,2,2,1,969696;5,2,3,1,4f4e4e;8,2,1,1,373636;9,2,2,1,4f4e4e;11,2,1,1,ababab;12,2,1,1,969696;2,3,1,1,969696;3,3,1,1,2c2e2e;4,3,1,2,4f4e4e;5,3,1,1,ababab;6,3,1,1,969696;7,3,3,1,727373;10,3,1,1,4f4e4e;11,3,1,1,2c2e2e;12,3,1,1,373636;1,4,1,1,727373;2,4,1,1,373636;3,4,1,1,4f4e4e;5,4,2,2,2c2e2e;7,4,1,2,302f2f;8,4,1,4,673434;9,4,1,2,2c2e2e;10,4,1,1,373636;11,4,2,1,4f4e4e;13,4,1,1,181818;14,4,1,1,969696;0,5,1,1,727373;1,5,1,3,181818;2,5,1,1,4f4e4e;3,5,2,1,2c2e2e;10,5,1,4,302f2f;11,5,1,1,2c2e2e;12,5,1,1,373636;13,5,1,1,727373;14,5,1,3,2c2e2e;0,6,1,5,969696;2,6,1,2,373636;3,6,2,2,302f2f;5,6,1,3,2c2e2e;6,6,1,1,302f2f;7,6,1,1,373636;9,6,1,1,373636;11,6,2,2,302f2f;13,6,1,2,373636;6,7,1,1,373636;7,7,1,1,4f4e4e;9,7,1,1,727373;1,8,1,2,2c2e2e;2,8,1,1,969696;3,8,2,1,4f4e4e;6,8,2,1,302f2f;8,8,1,1,4f4e4e;9,8,1,1,2c2e2e;11,8,1,1,373636;12,8,1,1,4f4e4e;13,8,1,1,727373;14,8,1,2,302f2f;2,9,1,1,ababab;3,9,1,2,d5d5d5;4,9,1,1,ababab;5,9,1,1,181818;6,9,1,1,302f2f;7,9,2,1,2c2e2e;9,9,1,1,302f2f;10,9,1,1,373636;11,9,1,1,969696;12,9,1,1,727373;13,9,1,2,4f4e4e;1,10,1,1,373636;2,10,1,1,969696;4,10,3,1,d5d5d5;7,10,1,1,969696;8,10,2,1,d5d5d5;10,10,1,1,727373;11,10,2,1,4f4e4e;14,10,1,1,373636;1,11,1,1,ababab;2,11,1,1,373636;3,11,1,1,ababab;4,11,2,1,d5d5d5;6,11,1,2,ababab;7,11,1,2,727373;8,11,2,2,969696;10,11,1,2,4f4e4e;11,11,1,1,727373;12,11,1,1,4f4e4e;13,11,1,1,181818;2,12,1,1,969696;3,12,1,1,302f2f;4,12,1,1,4f4e4e;5,12,1,1,ababab;11,12,1,1,302f2f;12,12,1,1,373636;4,13,1,1,969696;5,13,5,1,181818;10,13,1,1,2c2e2e;11,13,1,1,d5d5d5;", tools = "5,1,1,1,5f5f53;6,1,4,1,0f2c23;10,1,1,1,306056;4,2,1,1,5f5f53;5,2,1,1,298973;6,2,2,1,27ad95;8,2,1,1,298973;9,2,1,1,27ad95;10,2,1,1,298973;11,2,1,1,324033;12,2,1,1,5e4e32;13,2,1,1,716e66;5,3,1,1,306056;6,3,3,1,0f2c23;9,3,1,1,306056;10,3,1,1,27ad95;11,3,1,1,3c7967;12,3,1,1,54421f;13,3,1,1,5e4e32;6,4,3,1,716e66;9,4,1,1,5f5f53;10,4,1,1,3c7967;11,4,1,1,27ad95;12,4,1,1,3c7967;13,4,1,1,324033;8,5,1,1,716e66;9,5,2,2,54421f;11,5,1,1,306056;12,5,1,1,27ad95;13,5,1,4,298973;14,5,1,4,324033;7,6,1,1,716e66;8,6,1,1,5e4e32;11,6,1,4,5f5f53;12,6,1,1,306056;6,7,1,1,5f5f53;7,7,2,1,54421f;9,7,1,1,5e4e32;12,7,1,2,324033;5,8,1,1,716e66;6,8,1,1,5e4e32;7,8,1,1,54421f;8,8,1,1,5e4e32;4,9,1,1,5f5f53;5,9,2,1,54421f;7,9,1,1,5e4e32;12,9,1,1,306056;13,9,1,1,27ad95;14,9,1,1,0f2c23;3,10,1,1,716e66;4,10,1,1,5e4e32;5,10,1,1,54421f;6,10,1,1,5e4e32;12,10,1,1,3c7967;13,10,1,1,306056;14,10,1,1,716e66;2,11,1,1,5f5f53;3,11,1,1,5e4e32;4,11,1,1,54421f;5,11,1,1,5e4e32;1,12,1,1,716e66;2,12,1,1,5e4e32;3,12,1,1,54421f;4,12,1,1,5e4e32;1,13,1,1,5e4e32;2,13,1,1,54421f;3,13,1,1,5e4e32;1,14,1,1,716e66;2,14,1,1,5f5f53;", combat = "0,0,11,1,8b8b8b;14,0,1,2,3a282e;0,1,8,2,8b8b8b;8,1,1,1,8a8a8a;9,1,1,1,8e8f8f;10,1,1,1,49343d;15,1,1,1,62565d;8,2,1,1,8e8f8f;9,2,1,2,62565d;13,2,1,1,54434c;14,2,1,1,62565d;15,2,1,1,868585;0,3,6,1,8b8b8b;6,3,1,1,8a8a8a;7,3,1,1,8e8f8f;8,3,1,1,49343d;10,3,1,1,54434c;12,3,1,1,2b161a;13,3,1,1,62565d;14,3,1,1,868585;15,3,1,1,8a8a8a;0,4,5,1,8b8b8b;5,4,1,1,8a8a8a;6,4,1,1,8e8f8f;7,4,1,1,62565d;8,4,2,1,54434c;10,4,1,1,62565d;11,4,1,1,49343d;12,4,1,1,62565d;13,4,1,1,868585;14,4,2,12,8b8b8b;0,5,1,2,8e8f8f;1,5,1,2,54434c;2,5,1,1,49343d;3,5,1,1,868585;4,5,1,1,8a8a8a;5,5,1,1,8e8f8f;6,5,1,1,49343d;7,5,1,1,54434c;8,5,1,1,3a282e;9,5,1,1,49343d;10,5,1,1,2b161a;11,5,1,1,62565d;12,5,1,1,868585;13,5,1,11,8b8b8b;2,6,1,1,62565d;3,6,1,1,54434c;4,6,1,1,8e8f8f;5,6,1,1,62565d;6,6,1,1,54434c;7,6,1,1,3a282e;8,6,1,1,49343d;9,6,1,1,3a282e;10,6,1,1,62565d;11,6,1,1,868585;12,6,1,10,8b8b8b;0,7,1,1,8b8b8b;1,7,1,2,868585;2,7,1,1,49343d;3,7,1,1,62565d;4,7,2,1,49343d;6,7,1,1,3a282e;7,7,1,1,49343d;8,7,1,1,2b161a;9,7,1,1,62565d;10,7,1,1,868585;11,7,1,9,8b8b8b;0,8,1,1,8a8a8a;2,8,1,1,3a282e;3,8,1,1,6d6769;4,8,1,2,62565d;5,8,2,1,49343d;7,8,1,1,3a282e;8,8,1,1,62565d;9,8,1,1,868585;10,8,1,3,8b8b8b;0,9,1,1,8b8b8b;1,9,1,2,8a8a8a;2,9,1,1,868585;3,9,1,1,54434c;5,9,1,1,54434c;6,9,1,3,2b161a;7,9,1,1,6d6769;8,9,1,2,868585;9,9,1,1,8b8b8b;0,10,1,1,8a8a8a;2,10,1,2,54434c;3,10,1,1,49343d;4,10,1,1,3a282e;5,10,1,1,49343d;7,10,1,1,49343d;9,10,1,1,8e8f8f;0,11,1,1,8e8f8f;1,11,1,1,54434c;3,11,1,1,2b161a;4,11,1,1,6d6769;5,11,1,1,3a282e;7,11,1,1,2b161a;8,11,1,1,3a282e;9,11,1,2,6d6769;10,11,1,3,8a8a8a;1,12,2,1,3a282e;3,12,1,1,62565d;4,12,1,1,8e8f8f;5,12,2,1,6d6769;7,12,1,1,3a282e;8,12,1,1,2b161a;0,13,2,1,3a282e;2,13,1,1,62565d;3,13,1,1,868585;4,13,2,1,8a8a8a;6,13,1,1,8e8f8f;7,13,1,1,6d6769;8,13,1,1,62565d;9,13,1,1,868585;0,14,2,1,2b161a;2,14,1,1,8e8f8f;3,14,4,2,8b8b8b;7,14,2,1,8e8f8f;9,14,2,2,8b8b8b;0,15,1,1,62565d;2,15,1,1,8b8b8b;7,15,2,1,8b8b8b;", food = "8,1,1,1,8e5b2b;9,1,1,1,7d4424;7,2,1,1,ac752e;8,2,1,2,7d4424;9,2,1,1,8e5b2b;7,3,1,1,8e5b2b;4,4,2,1,ac752e;6,4,1,1,8e5b2b;7,4,2,1,6d3019;9,4,1,1,7d4424;10,4,1,1,8e5b2b;2,5,1,1,ac752e;3,5,1,1,c28517;4,5,2,2,ecee7a;6,5,1,1,ac752e;7,5,1,1,7d4424;8,5,1,1,d29919;9,5,1,1,e5ca3f;10,5,1,1,c28517;11,5,1,1,6d3019;12,5,1,1,7d4424;1,6,1,3,ac752e;2,6,1,4,c28517;3,6,1,2,e5ca3f;6,6,4,1,ecee7a;10,6,1,3,e5ca3f;11,6,1,1,c28517;12,6,1,1,6d3019;13,6,1,2,7d4424;4,7,6,1,ebdb5c;11,7,1,1,e5ca3f;12,7,1,1,c28517;3,8,1,1,deb026;4,8,1,1,e5ca3f;5,8,1,1,ebdb5c;6,8,4,1,e5ca3f;11,8,1,2,ebdb5c;12,8,1,2,d29919;13,8,1,2,6d3019;1,9,1,1,7d4424;3,9,1,2,d29919;4,9,1,1,deb026;5,9,1,1,e5ca3f;6,9,1,1,deb026;7,9,1,1,d29919;8,9,3,1,deb026;1,10,1,1,8e5b2b;2,10,1,1,ac752e;4,10,3,1,d29919;7,10,2,1,deb026;9,10,1,1,d29919;10,10,1,1,deb026;11,10,1,1,e5ca3f;12,10,1,1,c28517;13,10,1,1,7d4424;2,11,1,1,7d4424;3,11,1,1,ac752e;4,11,1,1,d29919;5,11,2,1,deb026;7,11,2,1,d29919;9,11,1,2,deb026;10,11,1,1,e5ca3f;11,11,1,1,ac752e;12,11,1,2,6d3019;2,12,1,1,8e5b2b;3,12,1,2,7d4424;4,12,1,1,c28517;5,12,2,1,d29919;7,12,1,1,deb026;8,12,1,1,e5ca3f;10,12,1,1,c28517;11,12,1,1,7d4424;4,13,1,1,6d3019;5,13,1,1,d29919;6,13,1,1,c28517;7,13,1,1,ac752e;8,13,1,1,c28517;9,13,1,1,d29919;10,13,1,2,7d4424;11,13,1,1,6d3019;4,14,1,1,7d4424;5,14,5,1,6d3019;", ingredients = "11,1,1,1,717171;12,1,1,1,777777;8,2,1,1,717171;9,2,1,1,6a6a6a;10,2,1,1,777777;5,3,2,1,717171;7,3,1,1,777777;8,3,2,1,8f8f8f;10,3,1,1,aaaaaa;11,3,1,1,c9c9c9;12,3,1,1,aaaaaa;2,4,2,1,717171;7,4,1,1,aaaaaa;8,4,1,1,c9c9c9;9,4,3,2,d7d7d7;12,4,1,1,c9c9c9;13,4,1,1,aaaaaa;4,5,1,1,aaaaaa;5,5,1,1,c9c9c9;6,5,3,2,d7d7d7;12,5,1,1,d7d7d7;13,5,1,1,e6e6e6;14,5,1,2,c9c9c9;0,6,1,4,6a6a6a;1,6,1,1,aaaaaa;2,6,1,1,e6e6e6;3,6,1,1,e0e0e0;4,6,2,1,d7d7d7;9,6,1,1,e0e0e0;10,6,3,1,e6e6e6;13,6,1,1,e0e0e0;15,6,1,1,aaaaaa;1,7,1,2,8f8f8f;2,7,1,1,c9c9c9;3,7,1,1,e6e6e6;4,7,1,2,e0e0e0;5,7,1,1,d7d7d7;6,7,1,1,e0e0e0;7,7,4,1,e6e6e6;11,7,2,1,c9c9c9;14,7,1,1,777777;2,8,1,2,aaaaaa;3,8,1,1,c9c9c9;5,8,1,2,e0e0e0;6,8,2,1,e6e6e6;8,8,2,1,c9c9c9;10,8,1,1,aaaaaa;11,8,2,1,717171;1,9,1,1,777777;3,9,1,2,aaaaaa;4,9,1,2,c9c9c9;6,9,1,1,c9c9c9;7,9,1,1,8f8f8f;8,9,1,2,717171;9,9,1,1,6a6a6a;10,9,1,1,777777;14,9,1,1,777777;15,9,1,1,717171;0,10,2,1,717171;2,10,1,1,8f8f8f;5,10,1,2,aaaaaa;6,10,1,1,717171;7,10,1,2,6a6a6a;9,10,1,1,717171;13,10,1,2,6a6a6a;14,10,2,1,535353;2,11,1,2,717171;3,11,1,1,8f8f8f;4,11,1,1,aaaaaa;6,11,1,1,777777;8,11,2,1,6a6a6a;10,11,3,1,535353;3,12,1,1,6a6a6a;4,12,2,1,8f8f8f;6,12,1,1,6a6a6a;7,12,4,1,535353;4,13,1,1,6a6a6a;5,13,2,1,535353;7,13,1,1,6a6a6a;", spawn = "6,0,3,1,5c7559;5,1,1,1,5c7559;6,1,3,1,2b772c;9,1,1,1,4b7548;4,2,1,1,4b7548;5,2,1,1,2c8c31;6,2,1,1,33a639;7,2,2,1,51b04d;9,2,1,1,2c8c31;10,2,1,1,2b772c;3,3,1,1,4b7548;4,3,1,1,2b772c;5,3,2,1,51b04d;7,3,1,1,33a639;8,3,2,2,51b04d;10,3,1,1,2c8c31;11,3,1,1,3b5f37;2,4,1,2,5c7559;3,4,1,1,2b772c;4,4,1,1,51b04d;5,4,2,2,94d08d;7,4,1,2,51b04d;10,4,1,2,94d08d;11,4,1,2,2b772c;12,4,1,2,3b5f37;3,5,1,1,33a639;4,5,1,1,94d08d;8,5,1,1,33a639;9,5,1,1,51b04d;1,6,1,2,5c7559;2,6,1,1,2b772c;3,6,2,1,6fa46e;5,6,1,1,2b772c;6,6,1,1,5c7559;7,6,1,1,94d08d;8,6,1,2,51b04d;9,6,2,2,1a4017;11,6,1,1,2c8c31;12,6,2,1,4b7548;2,7,1,1,33a639;3,7,1,1,94d08d;4,7,1,2,6fa46e;5,7,1,1,1a4017;6,7,1,1,2b772c;7,7,1,1,51b04d;11,7,1,1,33a639;12,7,1,1,6fa46e;13,7,1,2,3b5f37;1,8,1,1,4b7548;2,8,2,1,6fa46e;5,8,1,1,6fa46e;6,8,1,1,2c8c31;7,8,2,3,1a4017;9,8,1,1,33a639;10,8,1,1,51b04d;11,8,2,1,2c8c31;1,9,1,2,5c7559;2,9,2,1,2c8c31;4,9,1,2,51b04d;5,9,1,2,2c8c31;6,9,1,2,1a4017;9,9,1,3,1a4017;10,9,2,1,33a639;12,9,1,2,6fa46e;13,9,1,1,5c7559;2,10,1,2,2b772c;3,10,1,1,33a639;10,10,1,1,33a639;11,10,1,1,6fa46e;13,10,1,1,4b7548;1,11,1,1,4b7548;3,11,1,1,2c8c31;4,11,1,1,33a639;5,11,2,1,2b772c;7,11,1,2,51b04d;8,11,1,2,2c8c31;10,11,2,1,2c8c31;12,11,1,1,2b772c;13,11,1,1,3b5f37;2,12,1,1,5c7559;3,12,1,1,2b772c;4,12,2,1,2c8c31;6,12,1,2,4b7548;9,12,2,1,2c8c31;11,12,1,1,2b772c;12,12,1,1,3b5f37;3,13,1,1,4b7548;4,13,1,1,2b772c;5,13,1,1,4b7548;7,13,1,1,5c7559;8,13,1,1,6fa46e;9,13,1,1,4b7548;10,13,1,1,2b772c;11,13,1,1,3b5f37;4,14,1,1,5c7559;5,14,1,1,1a4017;6,14,5,1,3b5f37;", operator = "7,0,3,1,a67b60;5,1,1,1,a67b60;6,1,1,1,91694e;7,1,1,1,a67b60;8,1,1,1,b8896c;9,1,1,1,a67b60;10,1,2,1,b8896c;3,2,1,3,a67b60;4,2,1,1,91694e;5,2,1,1,806453;6,2,1,1,71635f;7,2,3,3,b6a099;10,2,1,1,91694e;11,2,1,1,a67b60;12,2,1,1,b8896c;13,2,1,1,a67b60;1,3,2,1,a67b60;4,3,1,1,71635f;5,3,2,1,b6a099;10,3,2,1,b8896c;12,3,1,1,b6a099;13,3,2,1,b8896c;15,3,1,1,a67b60;1,4,1,3,806453;2,4,1,1,714f39;4,4,1,1,a67b60;5,4,1,1,806453;6,4,1,1,a67b60;10,4,1,1,a67b60;11,4,2,1,b8896c;13,4,1,1,91694e;14,4,1,1,714f39;15,4,1,6,564942;2,5,1,1,806453;3,5,2,2,714f39;5,5,1,1,91694e;6,5,1,1,b8896c;7,5,2,1,b6a099;9,5,2,1,b8896c;11,5,1,1,91694e;12,5,2,1,412f23;14,5,1,2,564942;2,6,1,1,564942;5,6,1,2,714f39;6,6,1,3,806453;7,6,2,1,a67b60;9,6,1,1,91694e;10,6,1,1,4d3d33;11,6,2,1,412f23;13,6,1,1,4d3d33;1,7,1,1,714f39;2,7,1,1,4d3d33;3,7,2,4,71635f;7,7,2,1,714f39;9,7,1,1,412f23;10,7,1,1,564942;11,7,1,2,4d3d33;12,7,1,1,564942;13,7,1,1,412f23;14,7,1,1,4d3d33;1,8,1,1,806453;2,8,1,2,412f23;5,8,1,4,71635f;7,8,1,2,806453;8,8,1,1,714f39;9,8,2,1,4d3d33;12,8,2,2,4d3d33;14,8,1,2,412f23;1,9,1,1,714f39;6,9,1,1,714f39;8,9,1,1,412f23;9,9,1,1,4d3d33;10,9,1,1,412f23;11,9,1,3,564942;1,10,1,3,806453;2,10,1,1,4d3d33;6,10,1,2,71635f;7,10,2,3,714f39;9,10,1,2,412f23;10,10,1,1,564942;12,10,1,2,4d3d33;13,10,1,3,412f23;14,10,1,1,4d3d33;15,10,1,1,71635f;2,11,1,1,714f39;3,11,1,1,564942;4,11,1,1,71635f;10,11,1,2,4d3d33;14,11,2,1,564942;2,12,1,1,806453;3,12,1,1,714f39;4,12,1,1,4d3d33;5,12,1,1,564942;6,12,1,3,806453;9,12,1,2,4d3d33;11,12,2,2,412f23;14,12,1,1,4d3d33;15,12,1,1,71635f;3,13,1,1,806453;4,13,2,1,714f39;7,13,1,1,806453;8,13,1,2,4d3d33;10,13,1,2,564942;13,13,1,1,71635f;5,14,1,1,806453;7,14,1,1,714f39;9,14,1,1,412f23;11,14,1,1,71635f;7,15,1,1,806453;8,15,1,1,714f39;9,15,1,1,71635f;", survival = "6,1,1,1,544d42;7,1,2,1,67491a;9,1,1,1,6e675a;4,2,1,1,6e675a;5,2,1,1,67491a;6,2,4,4,9c6d24;10,2,1,1,544d42;11,2,1,1,6e675a;2,3,1,1,544d42;3,3,1,2,67491a;4,3,2,2,9c6d24;10,3,2,1,9c6d24;12,3,1,1,67491a;13,3,1,1,6e675a;1,4,1,8,544d42;2,4,1,1,3d2d14;10,4,1,1,9c6d24;11,4,1,1,67491a;12,4,1,1,533d1a;13,4,1,1,22190d;14,4,1,8,6e675a;2,5,1,1,67491a;3,5,1,1,3d2d14;4,5,1,1,292115;5,5,1,2,533d1a;10,5,1,1,403626;11,5,1,1,292115;12,5,1,1,3d2d14;13,5,1,1,332611;2,6,1,2,3d2d14;3,6,2,1,67491a;6,6,1,1,403626;7,6,1,1,67491a;8,6,1,1,403626;9,6,1,1,292115;10,6,1,1,332611;11,6,1,1,403626;12,6,1,1,332611;13,6,1,6,22190d;3,7,1,1,332611;4,7,1,2,3d2d14;5,7,2,1,67491a;7,7,1,2,292115;8,7,1,1,332611;9,7,1,1,3d2d14;10,7,1,1,544d42;11,7,1,1,6e675a;12,7,1,1,292115;2,8,2,1,533d1a;5,8,1,1,3d2d14;6,8,1,1,533d1a;8,8,2,1,292115;10,8,2,2,403626;12,8,1,3,3d2d14;2,9,1,1,533d1a;3,9,2,3,67491a;5,9,1,1,533d1a;6,9,1,1,403626;7,9,2,1,22190d;9,9,1,1,332611;2,10,1,1,67491a;5,10,2,2,67491a;7,10,1,4,292115;8,10,1,3,332611;9,10,3,2,3d2d14;2,11,1,1,3d2d14;12,11,1,1,332611;2,12,1,1,6e675a;3,12,1,1,544d42;4,12,1,1,403626;5,12,1,1,533d1a;6,12,1,1,67491a;9,12,1,1,3d2d14;10,12,2,1,332611;12,12,1,1,544d42;5,13,1,1,403626;6,13,1,1,3d2d14;8,13,1,1,292115;9,13,1,1,22190d;10,13,1,1,544d42;6,14,1,1,6e675a;7,14,2,1,544d42;", }, ghosts = { chest = "15,0,1,16,a2a2a2;4,2,8,1,5f5f5f;2,3,2,1,5f5f5f;4,3,8,1,888888;12,3,2,1,5f5f5f;1,4,1,3,5f5f5f;2,4,2,1,888888;4,4,3,2,8b8b8b;7,4,2,9,8a8a8a;9,4,2,2,8b8b8b;11,4,1,1,8a8a8a;12,4,2,1,888888;14,4,1,3,5f5f5f;2,5,2,1,8a8a8a;11,5,1,1,8b8b8b;12,5,1,1,8a8a8a;13,5,1,1,888888;2,6,1,1,888888;3,6,2,2,8a8a8a;5,6,2,1,8b8b8b;9,6,1,7,8b8b8b;10,6,2,3,8a8a8a;12,6,1,2,888888;13,6,1,1,737373;2,7,1,2,5f5f5f;5,7,1,5,8a8a8a;6,7,1,4,8b8b8b;13,7,1,2,5f5f5f;3,8,1,1,888888;4,8,1,4,8a8a8a;12,8,1,1,737373;3,9,1,4,5f5f5f;10,9,1,4,8a8a8a;11,9,1,3,888888;12,9,1,4,5f5f5f;6,11,1,1,8a8a8a;4,12,1,1,888888;5,12,2,1,8b8b8b;11,12,1,1,737373;4,13,1,1,5f5f5f;5,13,1,1,888888;6,13,1,1,8a8a8a;7,13,4,1,888888;11,13,1,1,5f5f5f;5,14,6,1,5f5f5f;", legs = "15,1,1,15,a6a6a6;4,2,7,1,616161;11,2,1,1,676767;3,3,1,11,676767;4,3,7,1,7e7e7e;11,3,1,1,717171;12,3,1,1,676767;4,4,7,2,8a8a8a;11,4,1,9,7e7e7e;12,4,1,10,616161;4,6,2,1,8a8a8a;6,6,1,1,7e7e7e;7,6,1,1,616161;8,6,1,2,717171;9,6,2,1,8a8a8a;4,7,1,6,8a8a8a;5,7,1,6,7e7e7e;6,7,1,8,676767;9,7,1,1,717171;10,7,1,6,8a8a8a;9,8,1,5,676767;4,13,1,1,7e7e7e;5,13,1,1,717171;9,13,1,2,616161;10,13,1,1,7e7e7e;11,13,1,1,717171;3,14,3,1,616161;10,14,2,1,616161;12,14,1,1,676767;", boots = "15,0,1,16,a9a9a9;4,3,2,1,5e5e5e;6,3,1,8,666666;9,3,2,1,5e5e5e;11,3,1,1,666666;3,4,1,1,6b6b6b;4,4,1,7,8b8b8b;5,4,1,7,808080;9,4,1,7,666666;10,4,1,7,8b8b8b;11,4,1,5,808080;12,4,1,5,666666;3,5,1,3,666666;3,8,1,1,6b6b6b;2,9,1,1,6b6b6b;3,9,1,3,8b8b8b;11,9,1,3,8b8b8b;12,9,1,1,808080;13,9,1,1,666666;1,10,1,1,6b6b6b;2,10,1,2,8b8b8b;12,10,1,2,8b8b8b;13,10,1,2,808080;14,10,1,3,666666;0,11,1,1,808080;1,11,1,1,666666;4,11,1,1,808080;5,11,1,1,6b6b6b;10,11,1,1,666666;1,12,3,1,5e5e5e;4,12,1,1,6b6b6b;11,12,3,1,5e5e5e;", shield = "15,0,1,16,afafaf;6,1,1,2,747474;7,1,2,1,666666;3,2,1,2,747474;4,2,2,1,666666;7,2,1,11,8b8b8b;8,2,1,1,747474;9,2,3,1,666666;1,3,1,1,747474;2,3,1,1,666666;4,3,3,7,8a8a8a;8,3,2,9,8a8a8a;10,3,1,4,8b8b8b;11,3,1,1,747474;12,3,2,1,666666;1,4,1,2,666666;2,4,2,2,8a8a8a;11,4,2,2,8a8a8a;13,4,1,2,747474;14,4,1,2,666666;1,6,1,3,747474;2,6,1,3,666666;3,6,1,3,8a8a8a;11,6,1,3,8a8a8a;12,6,1,3,747474;13,6,1,3,666666;10,7,1,1,8a8a8a;10,8,1,3,8b8b8b;2,9,1,3,747474;3,9,1,3,666666;11,9,1,3,747474;12,9,1,3,666666;4,10,2,1,8a8a8a;6,10,1,2,8b8b8b;4,11,1,1,8a8a8a;5,11,1,1,8b8b8b;10,11,1,1,8a8a8a;3,12,1,1,747474;4,12,1,1,666666;5,12,2,1,8a8a8a;8,12,1,1,8a8a8a;9,12,1,1,828282;10,12,1,1,747474;11,12,1,1,666666;5,13,2,1,666666;7,13,1,1,8a8a8a;8,13,1,1,747474;9,13,2,1,666666;7,14,2,1,666666;", helmet = "4,2,8,1,5f5f5f;3,3,1,1,5f5f5f;12,3,1,1,5f5f5f;2,4,1,9,5f5f5f;13,4,1,9,5f5f5f;3,9,2,1,5f5f5f;11,9,2,1,5f5f5f;4,10,1,3,5f5f5f;11,10,1,3,5f5f5f;3,12,1,1,5f5f5f;12,12,1,1,5f5f5f;", }, xslot = "0,0,16,1,433436;16,0,1,1,86696a;17,0,1,1,a88080;0,1,1,1,433436;1,1,16,1,a88080;17,1,1,17,cdbab9;0,2,1,15,86696a;1,2,4,1,a88080;5,2,7,1,a97f80;12,2,3,1,a88080;15,2,1,1,a97f80;16,2,1,16,cdbab9;1,3,1,14,a88080;2,3,1,1,86696a;3,3,2,1,433436;5,3,1,1,a88080;6,3,5,1,a97f80;11,3,1,1,a88080;12,3,1,1,86696a;13,3,2,1,433436;15,3,1,1,a88080;2,4,1,1,a88080;3,4,1,1,86696a;4,4,2,1,433436;6,4,2,1,a88080;8,4,2,1,a97f80;10,4,1,1,a88080;11,4,1,1,86696a;12,4,2,1,433436;14,4,1,1,a88080;15,4,1,2,a97f80;2,5,1,7,a97f80;3,5,1,2,a88080;4,5,1,1,86696a;5,5,2,1,433436;7,5,3,1,a88080;10,5,1,1,86696a;11,5,2,1,433436;13,5,1,2,a88080;14,5,1,1,a97f80;4,6,1,1,a88080;5,6,1,1,86696a;6,6,2,1,433436;8,6,1,1,a88080;9,6,1,1,86696a;10,6,2,1,433436;12,6,1,1,a88080;14,6,2,1,a88080;3,7,2,1,a97f80;5,7,1,1,a88080;6,7,1,1,86696a;7,7,4,1,433436;11,7,1,3,a88080;12,7,4,2,a97f80;3,8,1,2,a88080;4,8,2,1,a97f80;6,8,1,1,a88080;7,8,1,1,86696a;8,8,2,2,433436;10,8,1,1,a88080;4,9,2,1,a88080;6,9,1,1,86696a;7,9,1,2,433436;10,9,1,2,433436;12,9,1,1,a97f80;13,9,3,1,a88080;3,10,1,2,a97f80;4,10,1,1,a88080;5,10,1,1,86696a;6,10,1,2,433436;8,10,2,1,86696a;11,10,1,2,433436;12,10,1,1,a88080;13,10,2,1,a97f80;15,10,1,1,a88080;4,11,1,1,86696a;5,11,1,2,433436;7,11,1,1,a88080;8,11,1,3,a97f80;9,11,1,1,a88080;10,11,1,1,86696a;12,11,1,2,433436;13,11,1,1,a88080;14,11,2,1,a97f80;2,12,1,1,a88080;3,12,1,1,86696a;4,12,1,2,433436;6,12,1,1,a88080;7,12,1,4,a97f80;9,12,1,2,a97f80;10,12,1,1,a88080;11,12,1,1,86696a;13,12,1,2,433436;14,12,2,1,a88080;2,13,1,1,86696a;3,13,1,1,433436;5,13,1,1,a88080;6,13,1,3,a97f80;10,13,1,3,a97f80;11,13,1,1,a88080;12,13,1,1,86696a;14,13,1,1,433436;15,13,1,2,a88080;2,14,1,1,a88080;3,14,1,1,86696a;4,14,1,1,a88080;5,14,1,2,a97f80;8,14,2,1,a88080;11,14,1,2,a97f80;12,14,1,1,a88080;13,14,1,1,86696a;14,14,1,1,a88080;2,15,3,1,a97f80;8,15,2,1,a97f80;12,15,4,1,a97f80;2,16,14,1,a88080;0,17,16,1,cdbab9;", titles = { building = "0,0,4,1,404040;12,0,1,1,404040;14,0,1,7,404040;20,0,1,7,404040;22,0,1,1,404040;39,0,4,1,404040;45,0,1,7,404040;59,0,1,7,404040;0,1,1,6,404040;4,1,1,2,404040;39,1,1,6,404040;43,1,1,2,404040;6,2,1,4,404040;10,2,1,5,404040;12,2,1,5,404040;17,2,3,1,404040;22,2,1,5,404040;24,2,1,5,404040;26,2,2,1,404040;31,2,4,1,404040;48,2,3,1,404040;54,2,3,1,404040;62,2,1,1,404040;66,2,4,1,404040;1,3,3,1,404040;16,3,1,3,404040;25,3,1,1,404040;28,3,1,4,404040;30,3,1,3,404040;34,3,1,5,404040;40,3,3,1,404040;47,3,1,3,404040;51,3,1,3,404040;53,3,1,3,404040;57,3,1,1,404040;61,3,1,1,404040;65,3,1,1,404040;4,4,1,2,404040;43,4,1,2,404040;60,4,1,1,404040;66,4,3,1,404040;9,5,1,2,404040;57,5,1,1,404040;61,5,1,1,404040;69,5,1,1,404040;1,6,3,1,404040;7,6,2,1,404040;17,6,3,1,404040;31,6,3,1,404040;40,6,3,1,404040;48,6,3,1,404040;54,6,3,1,404040;62,6,1,1,404040;65,6,4,1,404040;31,8,3,1,404040;", colored = "1,0,3,1,404040;12,0,1,7,404040;36,0,1,7,404040;41,0,4,1,404040;47,0,1,7,404040;61,0,1,7,404040;0,1,1,5,404040;4,1,1,1,404040;41,1,1,6,404040;45,1,1,2,404040;7,2,3,1,404040;15,2,3,1,404040;20,2,1,5,404040;22,2,2,1,404040;27,2,3,1,404040;33,2,3,1,404040;50,2,3,1,404040;56,2,3,1,404040;64,2,1,1,404040;68,2,4,1,404040;6,3,1,3,404040;10,3,1,3,404040;14,3,1,3,404040;18,3,1,3,404040;21,3,1,1,404040;24,3,1,1,404040;26,3,1,3,404040;30,3,1,2,404040;32,3,1,3,404040;42,3,3,1,404040;49,3,1,3,404040;53,3,1,3,404040;55,3,1,3,404040;59,3,1,1,404040;63,3,1,1,404040;67,3,1,1,404040;27,4,3,1,404040;45,4,1,2,404040;62,4,1,1,404040;68,4,3,1,404040;4,5,1,1,404040;59,5,1,1,404040;63,5,1,1,404040;71,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;15,6,3,1,404040;27,6,3,1,404040;33,6,3,1,404040;42,6,3,1,404040;50,6,3,1,404040;56,6,3,1,404040;64,6,1,1,404040;67,6,4,1,404040;", natural = "0,0,1,7,404040;4,0,1,7,404040;13,0,1,6,404040;35,0,1,7,404040;40,0,4,1,404040;46,0,1,7,404040;60,0,1,7,404040;1,1,1,2,404040;40,1,1,6,404040;44,1,1,2,404040;7,2,3,1,404040;12,2,1,1,404040;14,2,1,1,404040;17,2,1,4,404040;21,2,1,5,404040;23,2,1,5,404040;25,2,2,1,404040;30,2,3,1,404040;49,2,3,1,404040;55,2,3,1,404040;63,2,1,1,404040;67,2,4,1,404040;2,3,1,1,404040;10,3,1,4,404040;24,3,1,1,404040;27,3,1,1,404040;33,3,1,4,404040;41,3,3,1,404040;48,3,1,3,404040;52,3,1,3,404040;54,3,1,3,404040;58,3,1,1,404040;62,3,1,1,404040;66,3,1,1,404040;3,4,1,2,404040;7,4,3,1,404040;30,4,3,1,404040;44,4,1,2,404040;61,4,1,1,404040;67,4,3,1,404040;6,5,1,1,404040;20,5,1,2,404040;29,5,1,1,404040;58,5,1,1,404040;62,5,1,1,404040;70,5,1,1,404040;7,6,3,1,404040;14,6,2,1,404040;18,6,2,1,404040;30,6,3,1,404040;41,6,3,1,404040;49,6,3,1,404040;55,6,3,1,404040;63,6,1,1,404040;66,6,4,1,404040;", functional = "0,0,5,1,404040;25,0,1,6,404040;29,0,1,1,404040;49,0,1,7,404040;54,0,4,1,404040;60,0,1,7,404040;74,0,1,7,404040;0,1,1,6,404040;54,1,1,6,404040;58,1,1,2,404040;6,2,1,4,404040;10,2,1,5,404040;12,2,1,5,404040;14,2,2,1,404040;19,2,3,1,404040;24,2,1,1,404040;26,2,1,1,404040;29,2,1,5,404040;32,2,3,1,404040;37,2,1,5,404040;39,2,2,1,404040;44,2,3,1,404040;63,2,3,1,404040;69,2,3,1,404040;77,2,1,1,404040;81,2,4,1,404040;1,3,3,1,404040;13,3,1,1,404040;16,3,1,4,404040;18,3,1,3,404040;22,3,1,1,404040;31,3,1,3,404040;35,3,1,3,404040;38,3,1,1,404040;41,3,1,4,404040;47,3,1,4,404040;55,3,3,1,404040;62,3,1,3,404040;66,3,1,3,404040;68,3,1,3,404040;72,3,1,1,404040;76,3,1,1,404040;80,3,1,1,404040;44,4,3,1,404040;58,4,1,2,404040;75,4,1,1,404040;81,4,3,1,404040;9,5,1,2,404040;22,5,1,1,404040;43,5,1,1,404040;72,5,1,1,404040;76,5,1,1,404040;84,5,1,1,404040;7,6,2,1,404040;19,6,3,1,404040;26,6,2,1,404040;32,6,3,1,404040;44,6,3,1,404040;55,6,3,1,404040;63,6,3,1,404040;69,6,3,1,404040;77,6,1,1,404040;80,6,4,1,404040;", redstone = "0,0,4,1,404040;16,0,1,7,404040;25,0,1,6,404040;50,0,4,1,404040;56,0,1,7,404040;70,0,1,7,404040;0,1,1,6,404040;4,1,1,2,404040;50,1,1,6,404040;54,1,1,2,404040;7,2,3,1,404040;13,2,3,1,404040;19,2,4,1,404040;24,2,1,1,404040;26,2,1,1,404040;30,2,3,1,404040;35,2,1,5,404040;37,2,2,1,404040;42,2,3,1,404040;59,2,3,1,404040;65,2,3,1,404040;73,2,1,1,404040;77,2,4,1,404040;1,3,3,1,404040;6,3,1,3,404040;10,3,1,2,404040;12,3,1,3,404040;18,3,1,1,404040;29,3,1,3,404040;33,3,1,3,404040;36,3,1,1,404040;39,3,1,4,404040;41,3,1,3,404040;45,3,1,2,404040;51,3,3,1,404040;58,3,1,3,404040;62,3,1,3,404040;64,3,1,3,404040;68,3,1,1,404040;72,3,1,1,404040;76,3,1,1,404040;2,4,1,1,404040;7,4,3,1,404040;19,4,3,1,404040;42,4,3,1,404040;54,4,1,2,404040;71,4,1,1,404040;77,4,3,1,404040;3,5,1,1,404040;22,5,1,1,404040;68,5,1,1,404040;72,5,1,1,404040;80,5,1,1,404040;4,6,1,1,404040;7,6,3,1,404040;13,6,3,1,404040;18,6,4,1,404040;26,6,2,1,404040;30,6,3,1,404040;42,6,3,1,404040;51,6,3,1,404040;59,6,3,1,404040;65,6,3,1,404040;73,6,1,1,404040;76,6,4,1,404040;", hotbars = "1,0,3,1,404040;28,0,1,7,404040;33,0,1,7,404040;37,0,1,7,404040;46,0,1,6,404040;50,0,1,7,404040;0,1,1,2,404040;4,1,1,1,404040;7,2,3,1,404040;12,2,1,3,404040;16,2,1,3,404040;19,2,3,1,404040;25,2,3,1,404040;40,2,3,1,404040;45,2,1,1,404040;47,2,1,1,404040;51,2,3,1,404040;57,2,3,1,404040;62,2,1,5,404040;64,2,2,1,404040;69,2,4,1,404040;1,3,3,1,404040;10,3,1,4,404040;18,3,1,3,404040;22,3,1,2,404040;24,3,1,3,404040;34,3,3,1,404040;39,3,1,3,404040;43,3,1,3,404040;54,3,1,3,404040;60,3,1,4,404040;63,3,1,1,404040;66,3,1,1,404040;68,3,1,1,404040;4,4,1,2,404040;7,4,3,1,404040;19,4,3,1,404040;57,4,3,1,404040;69,4,3,1,404040;0,5,1,1,404040;6,5,1,1,404040;13,5,1,1,404040;15,5,1,1,404040;56,5,1,1,404040;72,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;14,6,1,1,404040;19,6,3,1,404040;25,6,3,1,404040;40,6,3,1,404040;47,6,2,1,404040;51,6,3,1,404040;57,6,3,1,404040;68,6,4,1,404040;", search = "1,0,3,1,404040;30,0,1,7,404040;39,0,3,1,404040;44,0,1,6,404040;0,1,1,2,404040;4,1,1,1,404040;40,1,1,6,404040;7,2,3,1,404040;13,2,3,1,404040;18,2,1,5,404040;20,2,2,1,404040;25,2,3,1,404040;32,2,2,1,404040;43,2,1,1,404040;45,2,1,1,404040;49,2,3,1,404040;54,2,2,1,404040;57,2,1,1,404040;61,2,4,1,404040;1,3,3,1,404040;6,3,1,3,404040;10,3,1,2,404040;16,3,1,4,404040;19,3,1,1,404040;22,3,1,1,404040;24,3,1,3,404040;28,3,1,1,404040;31,3,1,1,404040;34,3,1,4,404040;48,3,1,3,404040;52,3,1,2,404040;54,3,1,4,404040;56,3,1,4,404040;58,3,1,4,404040;60,3,1,1,404040;4,4,1,2,404040;7,4,3,1,404040;13,4,3,1,404040;49,4,3,1,404040;61,4,3,1,404040;0,5,1,1,404040;12,5,1,1,404040;28,5,1,1,404040;64,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;13,6,3,1,404040;25,6,3,1,404040;39,6,1,1,404040;41,6,1,1,404040;45,6,2,1,404040;49,6,3,1,404040;60,6,4,1,404040;", tools = "0,0,5,1,404040;18,0,1,7,404040;30,0,2,1,404040;38,0,1,6,404040;42,0,1,6,404040;45,0,1,6,404040;49,0,1,1,404040;51,0,1,7,404040;53,0,1,1,404040;56,0,1,6,404040;60,0,1,1,404040;2,1,1,6,404040;29,1,1,1,404040;32,1,1,1,404040;7,2,3,1,404040;13,2,3,1,404040;21,2,4,1,404040;30,2,2,1,404040;44,2,1,1,404040;46,2,1,1,404040;49,2,1,5,404040;53,2,1,5,404040;55,2,1,1,404040;57,2,1,1,404040;60,2,1,5,404040;63,2,3,1,404040;69,2,4,1,404040;6,3,1,3,404040;10,3,1,3,404040;12,3,1,3,404040;16,3,1,3,404040;20,3,1,1,404040;29,3,1,3,404040;31,3,1,1,404040;33,3,1,2,404040;62,3,1,3,404040;66,3,1,2,404040;68,3,1,1,404040;21,4,3,1,404040;32,4,1,2,404040;63,4,3,1,404040;69,4,3,1,404040;24,5,1,1,404040;72,5,1,1,404040;7,6,3,1,404040;13,6,3,1,404040;20,6,4,1,404040;30,6,2,1,404040;33,6,1,1,404040;39,6,3,1,404040;46,6,2,1,404040;57,6,2,1,404040;63,6,3,1,404040;68,6,4,1,404040;", combat = "1,0,3,1,404040;18,0,1,7,404040;31,0,1,6,404040;0,1,1,5,404040;4,1,1,1,404040;7,2,3,1,404040;12,2,2,1,404040;15,2,1,1,404040;19,2,3,1,404040;25,2,3,1,404040;30,2,1,1,404040;32,2,1,1,404040;6,3,1,3,404040;10,3,1,3,404040;12,3,1,4,404040;14,3,1,4,404040;16,3,1,4,404040;22,3,1,3,404040;28,3,1,4,404040;25,4,3,1,404040;4,5,1,1,404040;24,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;19,6,3,1,404040;25,6,3,1,404040;32,6,2,1,404040;", food = "0,0,5,1,404040;22,0,1,7,404040;28,0,2,1,404040;36,0,4,1,404040;48,0,1,1,404040;56,0,1,7,404040;0,1,1,6,404040;27,1,1,1,404040;30,1,1,1,404040;36,1,1,6,404040;40,1,1,5,404040;7,2,3,1,404040;13,2,3,1,404040;19,2,3,1,404040;28,2,2,1,404040;42,2,1,5,404040;44,2,2,1,404040;48,2,1,5,404040;50,2,1,5,404040;52,2,2,1,404040;59,2,1,1,404040;63,2,4,1,404040;1,3,3,1,404040;6,3,1,3,404040;10,3,1,3,404040;12,3,1,3,404040;16,3,1,3,404040;18,3,1,3,404040;27,3,1,3,404040;29,3,1,1,404040;31,3,1,2,404040;43,3,1,1,404040;46,3,1,1,404040;51,3,1,1,404040;54,3,1,4,404040;58,3,1,1,404040;62,3,1,1,404040;30,4,1,2,404040;57,4,1,1,404040;63,4,3,1,404040;58,5,1,1,404040;66,5,1,1,404040;7,6,3,1,404040;13,6,3,1,404040;19,6,3,1,404040;28,6,2,1,404040;31,6,1,1,404040;37,6,3,1,404040;59,6,1,1,404040;62,6,4,1,404040;", ingredients = "0,0,3,1,404040;32,0,1,7,404040;34,0,1,1,404040;49,0,1,6,404040;1,1,1,6,404040;4,2,1,5,404040;6,2,2,1,404040;11,2,4,1,404040;16,2,1,5,404040;18,2,2,1,404040;23,2,3,1,404040;29,2,3,1,404040;34,2,1,5,404040;37,2,3,1,404040;42,2,1,5,404040;44,2,2,1,404040;48,2,1,1,404040;50,2,1,1,404040;54,2,4,1,404040;5,3,1,1,404040;8,3,1,4,404040;10,3,1,3,404040;14,3,1,5,404040;17,3,1,1,404040;20,3,1,1,404040;22,3,1,3,404040;26,3,1,2,404040;28,3,1,3,404040;36,3,1,3,404040;40,3,1,2,404040;43,3,1,1,404040;46,3,1,4,404040;53,3,1,1,404040;23,4,3,1,404040;37,4,3,1,404040;54,4,3,1,404040;57,5,1,1,404040;0,6,1,1,404040;2,6,1,1,404040;11,6,3,1,404040;23,6,3,1,404040;29,6,3,1,404040;37,6,3,1,404040;50,6,2,1,404040;53,6,4,1,404040;11,8,3,1,404040;", spawn = "1,0,3,1,404040;33,0,5,1,404040;0,1,1,2,404040;4,1,1,1,404040;33,1,1,6,404040;6,2,4,1,404040;13,2,3,1,404040;18,2,1,4,404040;22,2,1,4,404040;24,2,1,5,404040;26,2,2,1,404040;40,2,4,1,404040;46,2,4,1,404040;52,2,4,1,404040;1,3,3,1,404040;6,3,1,6,404040;10,3,1,3,404040;16,3,1,4,404040;25,3,1,1,404040;28,3,1,4,404040;34,3,3,1,404040;39,3,1,3,404040;43,3,1,5,404040;45,3,1,3,404040;49,3,1,5,404040;51,3,1,1,404040;4,4,1,2,404040;13,4,3,1,404040;20,4,1,2,404040;52,4,3,1,404040;0,5,1,1,404040;12,5,1,1,404040;55,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;13,6,3,1,404040;19,6,1,1,404040;21,6,1,1,404040;34,6,4,1,404040;40,6,3,1,404040;46,6,3,1,404040;51,6,4,1,404040;40,8,3,1,404040;46,8,3,1,404040;", operator = "1,0,3,1,404040;31,0,1,6,404040;50,0,1,6,404040;54,0,1,6,404040;57,0,1,6,404040;61,0,1,1,404040;63,0,1,7,404040;65,0,1,1,404040;68,0,1,6,404040;72,0,1,1,404040;0,1,1,5,404040;4,1,1,5,404040;6,2,4,1,404040;13,2,3,1,404040;18,2,1,5,404040;20,2,2,1,404040;25,2,3,1,404040;30,2,1,1,404040;32,2,1,1,404040;36,2,3,1,404040;41,2,1,5,404040;43,2,2,1,404040;56,2,1,1,404040;58,2,1,1,404040;61,2,1,5,404040;65,2,1,5,404040;67,2,1,1,404040;69,2,1,1,404040;72,2,1,5,404040;75,2,3,1,404040;81,2,4,1,404040;6,3,1,6,404040;10,3,1,3,404040;12,3,1,3,404040;16,3,1,2,404040;19,3,1,1,404040;22,3,1,1,404040;28,3,1,4,404040;35,3,1,3,404040;39,3,1,3,404040;42,3,1,1,404040;45,3,1,1,404040;74,3,1,3,404040;78,3,1,2,404040;80,3,1,1,404040;13,4,3,1,404040;25,4,3,1,404040;75,4,3,1,404040;81,4,3,1,404040;24,5,1,1,404040;84,5,1,1,404040;1,6,3,1,404040;7,6,3,1,404040;13,6,3,1,404040;25,6,3,1,404040;32,6,2,1,404040;36,6,3,1,404040;51,6,3,1,404040;58,6,2,1,404040;69,6,2,1,404040;75,6,3,1,404040;80,6,4,1,404040;", }, } local CW, CH = 195, 136 local C_PANEL = Color3.fromRGB(198, 198, 198) local C_FILL = Color3.fromRGB(139, 139, 139) local C_DARK = Color3.fromRGB(55, 55, 55) local C_SHADOW = Color3.fromRGB(85, 85, 85) local C_WHITE = Color3.new(1, 1, 1) local C_BLACK = Color3.new(0, 0, 0) local function rect(parent, x, y, w, h, color, z, transparency) local f = Instance.new("Frame") f.BorderSizePixel = 0 f.BackgroundColor3 = color if transparency then f.BackgroundTransparency = transparency end f.Position = UDim2.fromOffset(x * GS, y * GS) f.Size = UDim2.fromOffset(w * GS, h * GS) f.ZIndex = z or 1 f.Parent = parent return f end local function holder(parent, name, x, y, w, h, z) local f = Instance.new("Frame") f.Name = name f.BackgroundTransparency = 1 f.BorderSizePixel = 0 f.Position = UDim2.fromOffset(x * GS, y * GS) f.Size = UDim2.fromOffset(w * GS, h * GS) f.ZIndex = z or 1 f.Parent = parent return f end -- Draws run-length-merged pixel rectangles ("x,y,w,h,rrggbb;..."). local function paint(parent, data, ox, oy, z) for x, y, w, h, hex in string.gmatch(data, "(%d+),(%d+),(%d+),(%d+),(%x+);") do rect(parent, ox + tonumber(x), oy + tonumber(y), tonumber(w), tonumber(h), Color3.fromRGB(tonumber(hex:sub(1, 2), 16), tonumber(hex:sub(3, 4), 16), tonumber(hex:sub(5, 6), 16)), z) end end -- One big gray rectangle plus a few long dark/white lines (not one Frame per pixel). local function slotGrid(parent, name, x, y, cols, rows, z) local g = holder(parent, name, x, y, cols * 18, rows * 18, z) rect(g, 0, 0, cols * 18, rows * 18, C_FILL, 1) for c = 0, cols - 1 do rect(g, c * 18 + 17, 0, 1, rows * 18, C_WHITE, 2) end for r = 0, rows - 1 do rect(g, 0, r * 18 + 17, cols * 18, 1, C_WHITE, 2) end for c = 0, cols - 1 do rect(g, c * 18, 0, 1, rows * 18, C_DARK, 3) end for r = 0, rows - 1 do rect(g, 0, r * 18, cols * 18, 1, C_DARK, 3) end return g end local function recess(parent, name, x, y, w, h, z) local g = holder(parent, name, x, y, w, h, z) rect(g, 0, 0, w, h, C_FILL, 1) rect(g, w - 1, 0, 1, h, C_WHITE, 2) rect(g, 0, h - 1, w, 1, C_WHITE, 2) rect(g, 0, 0, 1, h, C_DARK, 3) rect(g, 0, 0, w, 1, C_DARK, 3) return g end -- Tab shape (26 wide). Top tabs hang above the panel, bottom tabs below it. -- A "selected" tab is drawn light and extends over the panel edge. local function buildTab(parent, name, x, y, bottom, selected, z) local H = selected and 32 or 28 local g = holder(parent, name, x, y, 26, H, z) local fill = selected and C_PANEL or C_FILL if not bottom then local last = selected and 25 or (H - 1) rect(g, 1, 0, 24, 1, C_BLACK, 1) rect(g, 0, 1, 1, last, C_BLACK, 1) rect(g, 25, 1, 1, last, C_BLACK, 1) rect(g, 1, 1, 24, 2, C_WHITE, 2) rect(g, 1, 1, 2, last, C_WHITE, 2) rect(g, 3, 3, 20, last - 2, fill, 3) rect(g, 23, 3, 2, last - 2, selected and fill or C_SHADOW, 3) if selected then rect(g, 1, 26, 24, 6, C_PANEL, 5) end else local first = selected and 6 or 0 rect(g, 1, H - 1, 24, 1, C_BLACK, 1) rect(g, 0, first, 1, H - first, C_BLACK, 1) rect(g, 25, first, 1, H - first, C_BLACK, 1) rect(g, 1, first, 2, H - 1 - first, C_WHITE, 2) rect(g, 3, first, 20, H - 3 - first, fill, 3) rect(g, 23, first, 2, H - 3 - first, selected and fill or C_SHADOW, 3) rect(g, 3, H - 3, 22, 2, selected and fill or C_SHADOW, 3) if selected then rect(g, 1, 0, 24, 6, C_PANEL, 5) end end return g end -- Image + text button skin (the supplied gray button texture). F.skinImageButton = function(b, tint, onLoaded) local img = Instance.new("ImageLabel") img.Name = "ButtonImage" img.BackgroundTransparency = 1 img.Image = BUTTON_IMAGE img.ScaleType = Enum.ScaleType.Stretch img.ImageColor3 = tint or C_WHITE img.Size = UDim2.fromScale(1, 1) img.ZIndex = 1 img.Parent = b local label = Instance.new("TextLabel") label.Name = "ButtonText" label.BackgroundTransparency = 1 label.Size = UDim2.fromScale(1, 1) label.Font = b.Font label.Text = b.Text label.TextColor3 = b.TextColor3 label.TextSize = b.TextSize label.TextScaled = b.TextScaled label.TextTransparency = b.TextTransparency label.ZIndex = 2 label.Parent = b b.Text = "" -- The texture already has its own outline, so the button has no background/border/stroke. b.BackgroundTransparency = 1 b.BorderSizePixel = 0 return img, label end --------------------------------------------------------------- -- Window + the four layers --------------------------------------------------------------- local win = Instance.new("Frame") win.Name = "CreativeInventoryWindow" win.AnchorPoint = Vector2.new(0.5, 0.5) win.Position = UDim2.fromScale(0.5, 0.5) win.Size = UDim2.fromOffset(CW * GS, CH * GS) win.BackgroundTransparency = 1 win.BorderSizePixel = 0 win.Active = true win.ZIndex = 30 win.Visible = false win.Parent = invDim local winScale = Instance.new("UIScale") winScale.Scale = 0.55 winScale.Parent = win F.cWin = win local function newLayer(name, z) local g = Instance.new("Frame") g.Name = name g.BackgroundTransparency = 1 g.BorderSizePixel = 0 g.Size = UDim2.fromScale(1, 1) g.ZIndex = z g.Parent = win return g end local gBg = newLayer("Creative background ui", 1) local gSel = newLayer("Selection Gui", 2) local gStatic = newLayer("Static Gui", 3) local gItems = newLayer("Placeholder Items", 4) local gViews = newLayer("InventorySlotViews", 5) local gButtons = newLayer("InventorySlotButtons", 6) local TABS = { { id = "building", x = 0, bottom = false }, { id = "colored", x = 27, bottom = false }, { id = "natural", x = 54, bottom = false }, { id = "functional", x = 81, bottom = false }, { id = "redstone", x = 108, bottom = false }, { id = "hotbars", x = 142, bottom = false }, { id = "search", x = 169, bottom = false }, { id = "tools", x = 0, bottom = true }, { id = "combat", x = 27, bottom = true }, { id = "food", x = 54, bottom = true }, { id = "ingredients", x = 81, bottom = true }, { id = "spawn", x = 108, bottom = true }, { id = "operator", x = 142, bottom = true }, { id = "survival", x = 169, bottom = true }, } local SEARCH_TAB, SURVIVAL_TAB = 7, 14 local function tabY(t, selected) if not t.bottom then return -26 end return selected and 130 or 134 end local state = { tab = SEARCH_TAB, row = 0 } F.CI = { state = state } --------------------------------------------------------------- -- LAYER 1: Creative background ui --------------------------------------------------------------- for i, t in ipairs(TABS) do buildTab(gBg, "TabBackground_" .. t.id, t.x, tabY(t, false), t.bottom, false, 1) end local panelGroup = holder(gBg, "PanelBackground", 0, 0, CW, CH, 2) local fallback = holder(panelGroup, "FlatFallback", 0, 0, CW, CH, 1) rect(fallback, 0, 0, CW, CH, C_BLACK, 1) rect(fallback, 1, 1, CW - 2, CH - 2, C_SHADOW, 2) rect(fallback, 1, 1, CW - 4, CH - 4, C_WHITE, 3) rect(fallback, 3, 3, CW - 6, CH - 6, C_PANEL, 4) local panelImage = Instance.new("ImageLabel") panelImage.Name = "PanelImage" panelImage.BackgroundTransparency = 1 panelImage.Image = PANEL_IMAGE panelImage.ScaleType = Enum.ScaleType.Stretch panelImage.Position = UDim2.fromOffset(PANEL_IMAGE_POS.X * GS, PANEL_IMAGE_POS.Y * GS) panelImage.Size = UDim2.fromOffset(PANEL_IMAGE_SIZE.X * GS, PANEL_IMAGE_SIZE.Y * GS) panelImage.ZIndex = 2 panelImage.Parent = panelGroup F.CI.setPanelImage = function(nx, ny, w, h) PANEL_IMAGE_POS = Vector2.new(nx, ny) PANEL_IMAGE_SIZE = Vector2.new(w or PANEL_IMAGE_SIZE.X, h or PANEL_IMAGE_SIZE.Y) panelImage.Position = UDim2.fromOffset(PANEL_IMAGE_POS.X * GS, PANEL_IMAGE_POS.Y * GS) panelImage.Size = UDim2.fromOffset(PANEL_IMAGE_SIZE.X * GS, PANEL_IMAGE_SIZE.Y * GS) end task.spawn(function() local t0 = os.clock() while os.clock() - t0 < 8 do if panelImage.IsLoaded then fallback.Visible = false return end task.wait(0.25) end end) -- Catalog-only background (hidden on the survival tab). local catalogBg = holder(gBg, "CatalogBackground", 0, 0, CW, CH, 3) slotGrid(catalogBg, "CatalogSlots", 8, 17, 9, 5, 1) recess(catalogBg, "ScrollTrack", 176, 17, 14, 114, 1) local searchHeader = holder(catalogBg, "SearchHeader", 0, 0, CW, 20, 2) recess(searchHeader, "SearchBoxBackground", 81, 4, 91, 12, 1) -- The title shows the name of the selected category (the search tab also has the textbox). local titleFrames = {} for id, data in pairs(PX.titles) do local tf = holder(catalogBg, "CategoryTitle_" .. id, 8, 6, 90, 9, 2) paint(tf, data, 0, 0, 1) tf.Visible = false titleFrames[id] = tf end -- Survival tab background (armor, offhand, player box, main inventory, X). local survivalBg = holder(gBg, "SurvivalBackground", 0, 0, CW, CH, 3) rect(survivalBg, 73, 6, 32, 43, C_BLACK, 1) local ARMOR = { { idx = 5, x = 54, y = 6, ghost = "helmet" }, { idx = 6, x = 54, y = 33, ghost = "chest" }, { idx = 7, x = 108, y = 6, ghost = "legs" }, { idx = 8, x = 108, y = 33, ghost = "boots" }, { idx = 45, x = 35, y = 20, ghost = "shield" }, } local ghosts = {} for _, a in ipairs(ARMOR) do slotGrid(survivalBg, "Slot_" .. a.ghost, a.x - 1, a.y - 1, 1, 1, 2) local gh = holder(survivalBg, "Ghost_" .. a.ghost, a.x, a.y, 16, 16, 3) paint(gh, PX.ghosts[a.ghost], 0, 0, 1) ghosts[a.idx] = gh end slotGrid(survivalBg, "MainInventorySlots", 8, 53, 9, 3, 2) local xArt = holder(survivalBg, "DeleteSlotArt", 172, 111, 18, 18, 2) paint(xArt, PX.xslot, 0, 0, 1) -- Main hotbar slots: identical on every tab. slotGrid(gBg, "MainHotbarSlots", 8, 111, 9, 1, 4) F.updateGhosts = function() for idx, gh in pairs(ghosts) do gh.Visible = slots[idx] == nil end end --------------------------------------------------------------- -- LAYER 2: Selection Gui --------------------------------------------------------------- local selTabs = {} for i, t in ipairs(TABS) do local sel = buildTab(gSel, "SelectedTab_" .. t.id, t.x, tabY(t, true), t.bottom, true, 1) sel.Visible = (i == state.tab) selTabs[i] = sel end local catalogSel = {} for r = 0, 4 do for c = 0, 8 do local k = r * 9 + c + 1 local o = rect(gSel, 9 + c * 18, 18 + r * 18, 16, 16, C_WHITE, 2, 0.45) o.Name = "CatalogSlotSelect_" .. k o.Visible = false catalogSel[k] = o end end --------------------------------------------------------------- -- LAYER 3: Static Gui --------------------------------------------------------------- for i, t in ipairs(TABS) do if t.id == "natural" and ICON.grass_block then -- Reuse the script's own grass block icon (clean, correctly colored). local ic = F.cloneIcon("grass_block") ic.Name = "Icon_natural" ic.Position = UDim2.fromOffset((t.x + 5) * GS, (tabY(t, false) + 7) * GS) ic.Parent = gStatic else local ic = holder(gStatic, "Icon_" .. t.id, t.x + 5, tabY(t, false) + 7, 16, 16, 1) paint(ic, PX.icons[t.id], 0, 0, 1) end end local searchBox = Instance.new("TextBox") searchBox.Name = "SearchTextBox" searchBox.BackgroundTransparency = 1 searchBox.BorderSizePixel = 0 searchBox.Position = UDim2.fromOffset(83 * GS, 5 * GS) searchBox.Size = UDim2.fromOffset(88 * GS, 10 * GS) searchBox.Font = Enum.Font.Arcade searchBox.TextSize = 8 * GS searchBox.TextColor3 = C_WHITE searchBox.TextXAlignment = Enum.TextXAlignment.Left searchBox.ClearTextOnFocus = false searchBox.Text = "" searchBox.PlaceholderText = "" searchBox.ZIndex = 2 searchBox.Parent = gStatic local knob = holder(gStatic, "ScrollButton", 177, 18, 12, 15, 3) rect(knob, 0, 0, 12, 15, C_PANEL, 1) rect(knob, 0, 0, 12, 1, C_WHITE, 2) rect(knob, 0, 0, 1, 15, C_WHITE, 2) rect(knob, 11, 1, 1, 14, C_SHADOW, 2) rect(knob, 1, 14, 11, 1, C_SHADOW, 2) for _, ry in ipairs({ 5, 7, 9 }) do rect(knob, 2, ry, 8, 1, C_FILL, 3) end --------------------------------------------------------------- -- LAYER 4: placeholder items per category --------------------------------------------------------------- local CATALOG = { building = { "oak_log", "oak_planks", "stone", "cobblestone" }, colored = {}, natural = { "grass_block", "dirt", "stone", "cobblestone", "oak_log" }, functional = { "torch", "crafting_table", "ladder" }, redstone = {}, hotbars = {}, tools = { "diamond_pickaxe", "diamond_axe", "diamond_shovel", "bucket" }, combat = { "diamond_sword", "iron_helmet", "iron_chestplate", "iron_leggings", "iron_boots" }, food = { "apple", "bread", "cooked_beef" }, ingredients = { "coal", "iron_ingot", "diamond", "stick" }, spawn = {}, operator = {}, } local searchList, seen = {}, {} for _, id in ipairs({ "building", "colored", "natural", "functional", "redstone", "tools", "combat", "food", "ingredients", "spawn", "operator" }) do for _, item in ipairs(CATALOG[id]) do if not seen[item] then seen[item] = true; table.insert(searchList, item) end end end CATALOG.search = searchList -- Placeholder row counts so every category can scroll until more items are added. local PLACEHOLDER_ROWS = { building = 12, colored = 8, natural = 10, functional = 10, redstone = 7, hotbars = 5, search = 12, tools = 8, combat = 8, food = 7, ingredients = 8, spawn = 9, operator = 6, } local function itemName(id) if ITEMS[id] then return ITEMS[id].name end return (id:gsub("_", " "):gsub("(%a)([%w]*)", function(a, b) return a:upper() .. b end)) end local viewport = holder(gItems, "CatalogViewport", 9, 18, 162, 90, 1) viewport.ClipsDescendants = true local rowFrames, rowCount, shown = {}, {}, {} local searchQuery = "" local function fillRows(id) local rf = rowFrames[id] for _, ch in ipairs(rf:GetChildren()) do ch:Destroy() end local list = shown[id] local minRows = (id == "search" and searchQuery ~= "") and 5 or (PLACEHOLDER_ROWS[id] or 5) local rows = math.max(minRows, math.ceil(#list / 9)) rowCount[id] = rows rf.Size = UDim2.fromOffset(162 * GS, rows * 18 * GS) for n, itemId in ipairs(list) do local col, row = (n - 1) % 9, math.floor((n - 1) / 9) if ICON[itemId] then local icon = F.cloneIcon(itemId) icon.Position = UDim2.fromOffset(col * 18 * GS, row * 18 * GS) icon.Parent = rf end end end for _, t in ipairs(TABS) do if CATALOG[t.id] then shown[t.id] = CATALOG[t.id] local rf = holder(viewport, "Placeholder_" .. t.id, 0, 0, 162, 18, 1) rf.Visible = false rowFrames[t.id] = rf fillRows(t.id) end end local function maxRowFor(tabIndex) local id = TABS[tabIndex].id return math.max(0, (rowCount[id] or 5) - 5) end F.setCatalogScroll = function(row) local maxRow = maxRowFor(state.tab) row = math.clamp(math.floor(row + 0.5), 0, maxRow) state.row = row local rf = rowFrames[TABS[state.tab].id] if rf then rf.Position = UDim2.fromOffset(0, -row * 18 * GS) end local ky = 18 + (maxRow > 0 and math.floor(row / maxRow * 97 + 0.5) or 0) knob.Position = UDim2.fromOffset(177 * GS, ky * GS) end -- Search: shows every item whose name contains the typed text (e.g. "o" -> Oak Log, Cobblestone ...). local function refreshSearch() local q = string.lower(searchBox.Text) q = q:match("^%s*(.-)%s*$") or "" searchQuery = q local list = {} for _, id in ipairs(CATALOG.search) do local idText = id:gsub("_", " ") if q == "" or string.find(string.lower(itemName(id)), q, 1, true) or string.find(idText, q, 1, true) then table.insert(list, id) end end shown.search = list fillRows("search") if TABS[state.tab].id == "search" then state.row = 0 F.setCatalogScroll(0) end end F.track(searchBox:GetPropertyChangedSignal("Text"):Connect(refreshSearch)) -- Grabbing items from the catalog (Java creative rules): -- left click: pick up 1 (click again to add more up to a full stack) -- right click: pick up 1 (click again puts it back) -- shift+click: put a full stack into the hotbar (falls back to the inventory) -- middle click: pick up a full stack; number key: put a full stack in that hotbar slot -- clicking with a different item held, or on an empty slot, deletes the held item local function catalogItemAt(k) local r, c = math.floor((k - 1) / 9), (k - 1) % 9 local list = shown[TABS[state.tab].id] return list and list[(state.row + r) * 9 + c + 1] or nil end local function shiftDown() return UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.RightShift) end local function grabFromCatalog(itemId, kind) if itemId == nil or not ITEMS[itemId] then -- Empty slot or a display-only placeholder: the held item just disappears. if carried ~= nil then carried = nil refresh() end return end local maxN = F.maxOf(itemId) if kind == "shift" then local st = { id = itemId, n = maxN } F.insertStack(st, 36, 44) if st.n > 0 then F.insertStack(st, 9, 35) end elseif kind == "full" then carried = { id = itemId, n = maxN } elseif carried ~= nil then if kind == "left" and carried.id == itemId then carried.n = math.min(maxN, carried.n + 1) else carried = nil end else carried = { id = itemId, n = 1 } end F.updateCraft() refresh() end local hoverCatalog = nil local NUMBER_KEYS = { [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, } F.track(UIS.InputBegan:Connect(function(input) local n = NUMBER_KEYS[input.KeyCode] if n and hoverCatalog and invOpen and creative and state.tab ~= SURVIVAL_TAB and UIS:GetFocusedTextBox() == nil then local itemId = catalogItemAt(hoverCatalog) if itemId and ITEMS[itemId] then slots[35 + n] = { id = itemId, n = F.maxOf(itemId) } F.updateCraft() refresh() end end end)) --------------------------------------------------------------- -- Slot views / buttons (main inventory is identical on every tab) --------------------------------------------------------------- local cHighlight = Instance.new("Frame") cHighlight.Name = "SlotHighlight" cHighlight.BackgroundColor3 = C_WHITE cHighlight.BackgroundTransparency = 0.5 cHighlight.BorderSizePixel = 0 cHighlight.Size = UDim2.fromOffset(16 * GS, 16 * GS) cHighlight.ZIndex = 38 cHighlight.Visible = false cHighlight.Parent = gViews F.cHighlight = cHighlight for c = 0, 8 do F.bindSlot(36 + c, { 9 + c * 18, 112 }, gViews, gButtons, F.cViews, F.cButtons, cHighlight) end for _, a in ipairs(ARMOR) do F.bindSlot(a.idx, { a.x, a.y }, gViews, gButtons, F.cViews, F.cButtons, cHighlight) end for r = 0, 2 do for c = 0, 8 do F.bindSlot(9 + c + r * 9, { 9 + c * 18, 54 + r * 18 }, gViews, gButtons, F.cViews, F.cButtons, cHighlight) end end -- Catalog slot buttons: hover highlight (not a toggle) + grabbing items. for r = 0, 4 do for c = 0, 8 do local k = r * 9 + c + 1 local b = Instance.new("TextButton") b.Name = "CatalogSlot_" .. k b.Text = "" b.AutoButtonColor = false b.BackgroundTransparency = 1 b.BorderSizePixel = 0 b.Position = UDim2.fromOffset((8 + c * 18) * GS, (17 + r * 18) * GS) b.Size = UDim2.fromOffset(18 * GS, 18 * GS) b.ZIndex = 1 b.Parent = gButtons local touchStart = 0 F.track(b.MouseEnter:Connect(function() catalogSel[k].Visible = true hoverCatalog = k end)) F.track(b.MouseLeave:Connect(function() catalogSel[k].Visible = false if hoverCatalog == k then hoverCatalog = nil end end)) F.track(b.InputBegan:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 then grabFromCatalog(catalogItemAt(k), shiftDown() and "shift" or "left") elseif t == Enum.UserInputType.MouseButton2 then grabFromCatalog(catalogItemAt(k), "right") elseif t == Enum.UserInputType.MouseButton3 then grabFromCatalog(catalogItemAt(k), "full") elseif t == Enum.UserInputType.Touch then touchStart = os.clock() catalogSel[k].Visible = true end end)) F.track(b.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then catalogSel[k].Visible = false if touchStart > 0 then -- tap = pick up 1, long press = full stack into the hotbar (touch version of shift-click) local long = os.clock() - touchStart > 0.35 touchStart = 0 grabFromCatalog(catalogItemAt(k), long and "shift" or "left") end end end)) table.insert(F.cCatalogButtons, b) end end -- Scroll button: drag / click the track, snaps to one slot row at a time. local scrollHit = Instance.new("TextButton") scrollHit.Name = "ScrollTrackHit" scrollHit.Text = "" scrollHit.AutoButtonColor = false scrollHit.BackgroundTransparency = 1 scrollHit.BorderSizePixel = 0 scrollHit.Position = UDim2.fromOffset(177 * GS, 18 * GS) scrollHit.Size = UDim2.fromOffset(12 * GS, 112 * GS) scrollHit.ZIndex = 1 scrollHit.Parent = gButtons local dragging = false local function dragTo(py) local maxRow = maxRowFor(state.tab) if maxRow <= 0 then return end local unit = win.AbsoluteSize.X / CW local top = win.AbsolutePosition.Y + (18 + 7.5) * unit local frac = math.clamp((py - top) / (97 * unit), 0, 1) F.setCatalogScroll(frac * maxRow) end F.track(scrollHit.InputBegan:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 or t == Enum.UserInputType.Touch then dragging = true dragTo(input.Position.Y) end end)) F.track(UIS.InputChanged:Connect(function(input) local t = input.UserInputType if dragging and (t == Enum.UserInputType.MouseMovement or t == Enum.UserInputType.Touch) then dragTo(input.Position.Y) elseif t == Enum.UserInputType.MouseWheel and invOpen and creative and state.tab ~= SURVIVAL_TAB then local dir = math.sign(input.Position.Z) if dir ~= 0 then F.setCatalogScroll(state.row - dir) end end end)) F.track(UIS.InputEnded:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 or t == Enum.UserInputType.Touch then dragging = false end end)) -- X ("Destroy Item") slot, like Java creative: -- click with a stack held: deletes it; right-click: deletes one item of it -- shift+click: clears the whole inventory (touch: long press) local xButton = Instance.new("TextButton") xButton.Name = "DeleteAllItemsButton" xButton.Text = "" xButton.AutoButtonColor = false xButton.BackgroundTransparency = 1 xButton.BorderSizePixel = 0 xButton.Position = UDim2.fromOffset(172 * GS, 111 * GS) xButton.Size = UDim2.fromOffset(18 * GS, 18 * GS) xButton.ZIndex = 2 xButton.Parent = gButtons F.cDeleteButton = xButton local function clearInventory() for i = 1, 45 do slots[i] = nil end carried = nil F.updateCraft() refresh() end local xTouchStart = 0 F.track(xButton.InputBegan:Connect(function(input) local t = input.UserInputType if t == Enum.UserInputType.MouseButton1 then if shiftDown() then clearInventory() elseif carried ~= nil then carried = nil refresh() end elseif t == Enum.UserInputType.MouseButton2 then if carried ~= nil then carried.n -= 1 if carried.n <= 0 then carried = nil end refresh() end elseif t == Enum.UserInputType.Touch then xTouchStart = os.clock() end end)) F.track(xButton.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch and xTouchStart > 0 then local long = os.clock() - xTouchStart > 0.6 xTouchStart = 0 if long then clearInventory() elseif carried ~= nil then carried = nil refresh() end end end)) -- Category tabs. local tabButtons = {} for i, t in ipairs(TABS) do local b = Instance.new("TextButton") b.Name = "Tab_" .. t.id b.Text = "" b.AutoButtonColor = false b.BackgroundTransparency = 1 b.BorderSizePixel = 0 b.Position = UDim2.fromOffset(t.x * GS, (t.bottom and 136 or -26) * GS) b.Size = UDim2.fromOffset(26 * GS, 26 * GS) b.ZIndex = 1 b.Parent = gButtons tabButtons[i] = b F.track(b.Activated:Connect(function() if invOpen and creative then F.selectCreativeTab(i) end end)) end F.selectCreativeTab = function(i) if not TABS[i] then return end state.tab = i state.row = 0 inventoryPage = (i == SURVIVAL_TAB) and "survival" or "creative" hover = nil cHighlight.Visible = false for _, o in ipairs(catalogSel) do o.Visible = false end F.updateInventoryPage() refresh() end F.CI.applyState = function() local isSurvival = state.tab == SURVIVAL_TAB local showSearch = (not isSurvival) and state.tab == SEARCH_TAB catalogBg.Visible = not isSurvival searchHeader.Visible = showSearch searchBox.Visible = showSearch if not showSearch and searchBox:IsFocused() then searchBox:ReleaseFocus() end survivalBg.Visible = isSurvival knob.Visible = not isSurvival scrollHit.Visible = not isSurvival viewport.Visible = not isSurvival for i, sel in ipairs(selTabs) do sel.Visible = (i == state.tab) end for id, rf in pairs(rowFrames) do rf.Visible = (not isSurvival) and id == TABS[state.tab].id end for id, tf in pairs(titleFrames) do tf.Visible = (not isSurvival) and id == TABS[state.tab].id end for _, b in ipairs(F.cCatalogButtons) do b.Visible = not isSurvival end -- Armor / offhand / main-inventory item views only belong to the survival tab. for idx, v in pairs(F.cViews) do v.holder.Visible = (idx >= 36 and idx <= 44) or isSurvival end for idx, b in pairs(F.cButtons) do b.Visible = (idx >= 36 and idx <= 44) or isSurvival end xButton.Visible = isSurvival if isSurvival then dragging = false for _, o in ipairs(catalogSel) do o.Visible = false end end F.setCatalogScroll(state.row) F.updateGhosts() end F.updateInventoryPage = function() local showLegacy = invOpen and not creative local showCreative = invOpen and creative if creative then if inventoryPage == "creative" and state.tab == SURVIVAL_TAB then state.tab = SEARCH_TAB end if inventoryPage == "survival" then state.tab = SURVIVAL_TAB end end panel.Visible = showLegacy if F.deleteButton then F.deleteButton.Visible = showLegacy end creativePlaceholderOpen = showCreative win.Visible = showCreative if showCreative then F.CI.applyState() 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 if creative then if page == "survival" then state.tab = SURVIVAL_TAB elseif state.tab == SURVIVAL_TAB then state.tab = SEARCH_TAB end end hover = nil highlight.Visible = false cHighlight.Visible = false F.updateInventoryPage() refresh() end F.CI.applyState() end 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(0, 0, 0) dropInventoryButton.BackgroundTransparency = 0.18 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)) --------------------------------------------------------------------- -- 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.fromOffset(0, 0) debugPanel.Size = UDim2.fromScale(1, 1) debugPanel.BackgroundTransparency = 1 debugPanel.BorderSizePixel = 0 debugPanel.Visible = false debugPanel.ZIndex = 15 debugPanel.Parent = gui -- Java 1.20 F3 style: white text on a translucent gray bar per line, left and right columns. local function newDebugColumn(name, right) local col = Instance.new("Frame") col.Name = name col.BackgroundTransparency = 1 col.AutomaticSize = Enum.AutomaticSize.XY col.AnchorPoint = Vector2.new(right and 1 or 0, 0) col.Position = UDim2.new(right and 1 or 0, right and -2 or 2, 0, 2) col.Size = UDim2.fromOffset(0, 0) col.ZIndex = 16 col.Parent = debugPanel local layout = Instance.new("UIListLayout") layout.SortOrder = Enum.SortOrder.LayoutOrder layout.HorizontalAlignment = right and Enum.HorizontalAlignment.Right or Enum.HorizontalAlignment.Left layout.Parent = col return col end F.debugLeft = newDebugColumn("Left", false) F.debugRight = newDebugColumn("Right", true) F.debugLabels = { Left = {}, Right = {} } debugText = 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.45 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.45 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.45 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 /panelnudge x y [w h]") elseif cmd == "/panelnudge" then local nx, ny = tonumber(args[2]), tonumber(args[3]) if nx and ny and F.CI and F.CI.setPanelImage then F.CI.setPanelImage(nx, ny, tonumber(args[4]), tonumber(args[5])) F.appendChatLine("Panel image position set to " .. nx .. ", " .. ny .. " (GUI units; pixels = units x GS).") else F.appendChatLine("Usage: /panelnudge x y [width height] (GUI units; pixels = units x GS)") end 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 F.skinImageButton(b, isEnabled and Color3.new(1, 1, 1) or Color3.fromRGB(150, 150, 150)) 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.rpPick.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 CS = game:GetService("CollectionService") 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, handsFolder } local box = workspace:GetPartBoundsInBox(CFrame.new(pos + Vector3.new(0, 0.9 * BLOCK, 0)), Vector3.new(0.6 * BLOCK + 0.6, 1.7 * BLOCK, 0.6 * BLOCK + 0.6), climbOP) for _, p in ipairs(box) do if p:IsA("TrussPart") or p:GetAttribute("Climbable") == true or p:GetAttribute("MCClimb") == true or CS:HasTag(p, "Climbable") or (p.Parent and p.Parent:GetAttribute("Climbable") == true) 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.68 }, 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.68 }, 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.41 }, 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 elseif F.toolInfo[id] then local tinfo = F.toolInfo[id] local plate = basePart(Vector3.new(16, 16, 1) * PX * scale, Color3.new(1, 1, 1)) plate.Transparency = 1 plate.Parent = m m.PrimaryPart = plate for _, face in ipairs({ Enum.NormalId.Front, Enum.NormalId.Back }) do local sg = Instance.new("SurfaceGui") sg.Face = face sg.SizingMode = Enum.SurfaceGuiSizingMode.FixedSize sg.CanvasSize = Vector2.new(64, 64) sg.LightInfluence = 0 sg.Adornee = plate sg.Parent = plate if tinfo.image and tinfo.image ~= "" then local img = Instance.new("ImageLabel") img.BackgroundTransparency = 1 img.Size = UDim2.fromScale(1, 1) img.Image = tinfo.image img.ScaleType = Enum.ScaleType.Fit img.Parent = sg else local t = Instance.new("TextLabel") t.BackgroundTransparency = 1 t.Size = UDim2.fromScale(1, 1) t.Font = Enum.Font.Arcade t.TextScaled = true t.TextWrapped = true t.Text = tinfo.name t.TextColor3 = Color3.new(1, 1, 1) t.TextStrokeTransparency = 0 t.Parent = sg end 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.12 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 -- Hand sway: the held item lags behind camera rotation (xBob/yBob chase the view angles each tick). local xBob, yBob, xBobO, yBobO, bobInit = 0, 0, 0, 0, false local function wrapDeg(a) return (a + 180) % 360 - 180 end 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 xBobO, yBobO = xBob, yBob local mx, my = -math.deg(pitch), -math.deg(yaw) if not bobInit then xBob, yBob, xBobO, yBobO, bobInit = mx, my, mx, my, true else xBob += (mx - xBob) * 0.5 yBob += wrapDeg(my - yBob) * 0.5 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 -- Hand sway: tilt the hand/item by how far the view has turned since the lagging xBob/yBob values. local sway = CFrame.Angles(rad((-math.deg(pitch) - (xBobO + (xBob - xBobO) * alpha)) * 0.1), 0, 0) * CFrame.Angles(0, rad(wrapDeg(-math.deg(yaw) - (yBobO + (yBob - yBobO) * alpha)) * 0.1), 0) camCF = camCF * sway 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 -- Dropped stacks are represented only by their item models. Do not create -- a floating count label; the number of visible models communicates the stack. return visual, nil 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 -- A ladder needs a solid part behind it; when that support disappears the ladder breaks and drops. F.checkLadders = function() local set = F.ladderSet if not set then return end for part in pairs(set) do if not part.Parent then set[part] = nil else local n, cell = part:GetAttribute("MCLadderN"), part:GetAttribute("MCCell") if typeof(n) == "Vector3" and typeof(cell) == "Vector3" and not workspace:Raycast(cell, -n * (BLOCK * 0.6), rp) then set[part] = nil removeBlock(part) if not abilities.instabuild and ITEMS.ladder then F.spawnBlockDrop("ladder", cell) end end end end end -- Item entities use 20 TPS physics, gravity 0.04 and drag 0.98 per tick, -- 0.6 * 0.98 ground friction, a 0.25-block hitbox, pickup delay in ticks (10 for block drops, -- 40 for thrown items), and 6000-tick (5 minute) despawn. Separate dropped entities never merge; -- copies are added only when a single dropped entity already contains a multi-item stack. -- The pickup box of the player is expanded by 1 / 0.5 / 1 blocks. -- position is in studs, velocity in blocks per tick. F.spawnDropEntity = function(id, count, position, velocity, pickupDelay) count = math.floor(tonumber(count) or 0) if not id or count <= 0 or not ITEMS[id] or not H.createDropVisual then return nil end local visual = H.createDropVisual(id, count, position) local item = { id = id, count = count, visual = visual, position = position, prevPosition = position, velocity = velocity or Vector3.zero, onGround = false, age = 0, pickupDelay = pickupDelay or 10, hoverStart = math.random() * math.pi * 2, extras = {}, offsets = {}, collect = nil, } droppedItems[#droppedItems + 1] = item F.syncDropCopies(item) return item end -- Stacks render as several copies (1, 2, 3, 4, 5 for 1, <=16, <=32, <=48, more). F.syncDropCopies = function(item) local n = item.count local copies = n <= 1 and 1 or (n <= 16 and 2 or (n <= 32 and 3 or (n <= 48 and 4 or 5))) while #item.extras < copies - 1 do local c = item.visual:Clone() c.Parent = dropFolder item.extras[#item.extras + 1] = c item.offsets[#item.extras] = Vector3.new((math.random() * 2 - 1) * 0.15, (math.random() * 2 - 1) * 0.1, (math.random() * 2 - 1) * 0.15) * BLOCK end while #item.extras > copies - 1 do local c = table.remove(item.extras) table.remove(item.offsets) if c then c:Destroy() end end end F.destroyDrop = function(item) if item.visual then item.visual:Destroy() end for _, c in ipairs(item.extras) do c:Destroy() end item.extras = {} end 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 look = (CFrame.Angles(0, yaw or 0, 0) * CFrame.Angles(pitch or 0, 0, 0)).LookVector local spawnAt = (pos or Vector3.zero) + Vector3.new(0, ((eyeH or 1.62) - 0.3) * BLOCK, 0) -- Every player drop starts from the same hand/eye-relative position. -- Do not move later drops sideways to make artificial parking slots; keep each -- drop as its own entity while allowing its normal throw velocity and physics. local a, r = math.random() * math.pi * 2, math.random() * 0.02 local vel = look * 0.3 + Vector3.new(math.cos(a) * r, 0.1 + (math.random() - math.random()) * 0.1, math.sin(a) * r) return F.spawnDropEntity(id, count, spawnAt, vel, 40) ~= nil end -- Block drops pop out of the broken block with a small random hop and a 10 tick pickup delay. F.spawnBlockDrop = function(id, cell) local o = Vector3.new(math.random() * 0.5 - 0.25, math.random() * 0.5 - 0.25 - 0.125, math.random() * 0.5 - 0.25) * BLOCK local vel = Vector3.new(math.random() * 0.2 - 0.1, 0.2, math.random() * 0.2 - 0.1) return F.spawnDropEntity(id, 1, cell + o, vel, 10) end F.dropInventorySelection = function(dropAll) local stack, sourceIndex if carried then stack = carried sourceIndex = "carried" elseif ((panel and panel.Visible) or (F.cWin and F.cWin.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 F.toolInfo[stack.id] then if not F.dropRobloxTool(stack.id) then return end count = 1 elseif 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 -- Roblox Tools are mirrored into the Minecraft inventory: every Tool in the Backpack / Character -- becomes a one-item stack (its image as icon, or its name), the Roblox backpack UI is hidden, and -- the Minecraft hotbar selection equips / unequips the real Tool. local toolIds, toolCounter = setmetatable({}, { __mode = "k" }), 0 local function toolOwned(tool) if not tool or not tool.Parent then return false end local lp = Players.LocalPlayer local bp = lp and lp:FindFirstChildOfClass("Backpack") return (bp ~= nil and tool.Parent == bp) or (char ~= nil and tool.Parent == char) end F.refreshAllViews = function() for _, store in ipairs({ views, F.cViews, hudViews }) do for _, v in pairs(store) do v.id = nil end end if carriedView then carriedView.id = nil end refresh() end F.registerTool = function(tool) local id = toolIds[tool] if id then return id end toolCounter += 1 id = "rbx_tool_" .. toolCounter toolIds[tool] = id local info = { tool = tool, name = tool.Name, image = tool.TextureId } F.toolInfo[id] = info ITEMS[id] = { name = tool.Name, max = 1, robloxTool = true } F.track(tool:GetPropertyChangedSignal("TextureId"):Connect(function() info.image = tool.TextureId F.clearIconCache(id) F.refreshAllViews() end)) F.track(tool:GetPropertyChangedSignal("Name"):Connect(function() info.name = tool.Name ITEMS[id].name = tool.Name F.clearIconCache(id) F.refreshAllViews() end)) return id end local function listTools() local out = {} local lp = Players.LocalPlayer local bp = lp and lp:FindFirstChildOfClass("Backpack") if bp then for _, t in ipairs(bp:GetChildren()) do if t:IsA("Tool") then out[#out + 1] = t end end end if char then for _, t in ipairs(char:GetChildren()) do if t:IsA("Tool") then out[#out + 1] = t end end end return out end F.syncRobloxTools = function() local present, changed = {}, false for _, tool in ipairs(listTools()) do local id = F.registerTool(tool) present[id] = true local have = carried ~= nil and carried.id == id if not have then for i = 1, 45 do if slots[i] and slots[i].id == id then have = true break end end end if not have then local st = { id = id, n = 1 } F.insertStack(st, 36, 44) if st.n > 0 then F.insertStack(st, 9, 35) end changed = true end end for i = 1, 45 do local st = slots[i] if st and F.toolInfo[st.id] and not present[st.id] then slots[i] = nil changed = true end end if carried and F.toolInfo[carried.id] and not present[carried.id] then carried = nil changed = true end if changed then F.updateCraft() refresh() end end F.heldTool = function() local st = slots[36 + selected] local info = st and F.toolInfo[st.id] return info and info.tool or nil end F.heldIsTool = function() return F.heldTool() ~= nil end F.syncToolEquip = function() if F.playerDead or not char or not hum or hum.Health <= 0 then return end local want = F.heldTool() local cur = char:FindFirstChildOfClass("Tool") if want and toolOwned(want) then if cur ~= want then pcall(function() hum:EquipTool(want) end) end elseif cur then pcall(function() hum:UnequipTools() end) end -- In first person the Minecraft-style plate replaces the real handle. local tool = char:FindFirstChildOfClass("Tool") if tool then local hide = (viewMode == 0) and 1 or 0 for _, d in ipairs(tool:GetDescendants()) do if d:IsA("BasePart") then d.LocalTransparencyModifier = hide end end end end F.dropRobloxTool = function(id) local info = F.toolInfo[id] local tool = info and info.tool if not tool or not tool.Parent or not tool.CanBeDropped then return false end local handle = tool:FindFirstChild("Handle") if not handle or not handle:IsA("BasePart") then return false end local look = (CFrame.Angles(0, yaw or 0, 0) * CFrame.Angles(pitch or 0, 0, 0)).LookVector local from = (pos or Vector3.zero) + Vector3.new(0, ((eyeH or 1.62) - 0.3) * BLOCK, 0) handle.CanTouch = false tool.Parent = workspace handle.CFrame = CFrame.new(from + look * BLOCK) handle.AssemblyLinearVelocity = look * (0.3 * BLOCK * 20) + Vector3.new(0, 0.1 * BLOCK * 20, 0) task.delay(2, function() if handle.Parent then handle.CanTouch = true end end) task.defer(F.syncRobloxTools) return true end task.spawn(function() local sg = game:GetService("StarterGui") for _ = 1, 20 do if pcall(function() sg:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false) end) then break end task.wait(0.5) end end) do local lp = Players.LocalPlayer local function hookBackpack(bp) F.track(bp.ChildAdded:Connect(function() task.defer(F.syncRobloxTools) end)) F.track(bp.ChildRemoved:Connect(function() task.defer(F.syncRobloxTools) end)) end local bp = lp and lp:FindFirstChildOfClass("Backpack") if bp then hookBackpack(bp) end if lp then F.track(lp.ChildAdded:Connect(function(c) if c:IsA("Backpack") then hookBackpack(c) task.defer(F.syncRobloxTools) end end)) end task.defer(F.syncRobloxTools) end -- F3 debug screen modelled on Java 1.20; values come from the real game state where possible. local dbgFrames, dbgLastFps, dbgFps, dbgLastUpdate, dbgHeights, dbgHeightT = 0, os.clock(), 60, 0, { 0, 0, 0, 0 }, 0 local function dbgSetLines(colName, lines, container) local pool = F.debugLabels[colName] local right = colName == "Right" for i, text in ipairs(lines) do local l = pool[i] if not l then l = Instance.new("TextLabel") l.BorderSizePixel = 0 l.Font = Enum.Font.Arcade l.TextSize = 11 l.TextColor3 = Color3.new(1, 1, 1) l.TextXAlignment = right and Enum.TextXAlignment.Right or Enum.TextXAlignment.Left l.AutomaticSize = Enum.AutomaticSize.X l.Size = UDim2.fromOffset(0, 13) l.LayoutOrder = i l.ZIndex = 17 local pad = Instance.new("UIPadding") pad.PaddingLeft, pad.PaddingRight = UDim.new(0, 2), UDim.new(0, 2) pad.Parent = l l.Parent = container pool[i] = l end l.Visible = true l.Text = text l.BackgroundColor3 = Color3.fromRGB(80, 80, 80) l.BackgroundTransparency = text == "" and 1 or 0.44 end for i = #lines + 1, #pool do pool[i].Visible = false end end local FACING = { [0] = "south (Towards positive Z)", [1] = "west (Towards negative X)", [2] = "north (Towards negative Z)", [3] = "east (Towards positive X)", } F.updateDebugScreen = function() dbgFrames += 1 local now = os.clock() if now - dbgLastFps >= 0.5 then dbgFps = dbgFrames / (now - dbgLastFps) dbgFrames, dbgLastFps = 0, now end if now - dbgLastUpdate < 0.1 then return end dbgLastUpdate = now local p = pos or Vector3.zero local bx, by, bz = p.X / BLOCK, p.Y / BLOCK, p.Z / BLOCK local ix, iy, iz = math.floor(bx + 0.5), math.floor(by + 0.5), math.floor(bz + 0.5) local cx, cy, cz = math.floor(ix / 16), math.floor(iy / 16), math.floor(iz / 16) local mcYaw = ((180 - math.deg(yaw or 0)) + 180) % 360 - 180 local mcPitch = -math.deg(pitch or 0) local facing = FACING[math.floor(mcYaw / 90 + 0.5) % 4] -- Heightmaps: the highest solid surface above the player's column. if now - dbgHeightT > 0.5 then dbgHeightT = now local res = workspace:Raycast(Vector3.new(p.X, p.Y + 600, p.Z), Vector3.new(0, -1200, 0), rp) local h = res and math.floor(res.Position.Y / BLOCK + 0.5) or 0 dbgHeights = { h, h, h, h } end local clock = game:GetService("Lighting").ClockTime local skyLight = (clock >= 6 and clock < 18) and 15 or 4 local blocks = blockFolder and #blockFolder:GetChildren() or 0 local ents = #droppedItems local ping = 0 pcall(function() ping = game:GetService("Players").LocalPlayer:GetNetworkPing() * 1000 end) local mem = 0 pcall(function() mem = game:GetService("Stats"):GetTotalMemoryUsageMb() end) local vp = workspace.CurrentCamera and workspace.CurrentCamera.ViewportSize or Vector2.new(0, 0) local day = math.floor((F.dayTime or age or 0) / 24000) local left = { "Minecraft PI3 (PI3/vanilla)", string.format("%d fps T: inf vsync fancy-clouds B: 2", math.floor(dbgFps + 0.5)), string.format("Integrated server @ %d ms tick, 0 tx, 0 rx", math.floor(ping + 0.5)), string.format("C: %d/%d (s) D: 12, pC: 000, pU: 00, aB: 12", blocks, blocks), string.format("E: %d/%d, SD: 12", ents, ents + 1), string.format("P: 0. T: %d", ents + 1), "Client Chunk Cache: 625, 441", "ServerChunkCache: 2209", "minecraft:overworld FC: 0", "", string.format("XYZ: %.3f / %.5f / %.3f", bx, by, bz), string.format("Block: %d %d %d", ix, iy, iz), string.format("Chunk: %d %d %d in %d %d %d", ix % 16, iy % 16, iz % 16, cx, cy, cz), string.format("Facing: %s (%.1f / %.1f)", facing, mcYaw, mcPitch), string.format("Client Light: %d (%d sky, 0 block)", skyLight, skyLight), string.format("CH S: %d M: %d", dbgHeights[1], dbgHeights[2]), string.format("SH S: %d O: %d M: %d ML: %d", dbgHeights[1], dbgHeights[2], dbgHeights[3], dbgHeights[4]), "Biome: minecraft:plains", string.format("Local Difficulty: 0.75 // 0.00 (Day %d)", day), "Sounds: 0/247 + 0/8 (Mood 0%)", } local right = { "Java: Luau (Roblox) 64bit", string.format("Mem: %d%% %d/4096MB", math.floor(mem / 4096 * 100), math.floor(mem)), string.format("Allocated: %d%% %dMB", math.floor(mem / 4096 * 100), math.floor(mem)), "CPU: Roblox client", "", string.format("Display: %dx%d (Roblox)", vp.X, vp.Y), "Roblox " .. version(), "", } if not invOpen then local part, hitPos, hitNormal = F.pickBlock() if part and hitPos and hitNormal then local cell local bid = part:GetAttribute("MCBlockId") if bid then cell = part:GetAttribute("MCCell") elseif F.getGridCellCenter then cell = F.getGridCellCenter(part, hitPos, hitNormal) end cell = typeof(cell) == "Vector3" and cell or hitPos right[#right + 1] = string.format("Targeted Block: %d, %d, %d", math.floor(cell.X / BLOCK + 0.5), math.floor(cell.Y / BLOCK + 0.5), math.floor(cell.Z / BLOCK + 0.5)) right[#right + 1] = bid and ("minecraft:" .. bid) or ("roblox:" .. string.lower((part.Name:gsub("%s+", "_")))) end end dbgSetLines("Left", left, F.debugLeft) dbgSetLines("Right", right, F.debugRight) end local DROP_TICK = 0.05 local dropAcc = 0 local function stepDrop(item) local R = 0.125 * BLOCK item.prevPosition = item.position if item.collect then item.collect += 1 return item.collect >= 3 end if item.pickupDelay > 0 then item.pickupDelay -= 1 end item.age += 1 if item.age >= 6000 then return true end local v = item.velocity v = Vector3.new(v.X, v.Y - 0.04, v.Z) local p = item.position local onGround = false local d = v * BLOCK if d.Y ~= 0 then local sgn = d.Y > 0 and 1 or -1 local hit = workspace:Raycast(p, Vector3.new(0, d.Y + sgn * R, 0), dropRayParams) if hit then p = Vector3.new(p.X, hit.Position.Y - sgn * R, p.Z) if sgn < 0 then onGround = true end v = Vector3.new(v.X, 0, v.Z) else p += Vector3.new(0, d.Y, 0) end end for _, axis in ipairs({ "X", "Z" }) do local dv = axis == "X" and d.X or d.Z if dv ~= 0 then local sgn = dv > 0 and 1 or -1 local dir = axis == "X" and Vector3.new(dv + sgn * R, 0, 0) or Vector3.new(0, 0, dv + sgn * R) local hit = workspace:Raycast(p, dir, dropRayParams) if hit then local hp = axis == "X" and hit.Position.X or hit.Position.Z p = axis == "X" and Vector3.new(hp - sgn * R, p.Y, p.Z) or Vector3.new(p.X, p.Y, hp - sgn * R) v = axis == "X" and Vector3.new(0, v.Y, v.Z) or Vector3.new(v.X, v.Y, 0) else p += axis == "X" and Vector3.new(dv, 0, 0) or Vector3.new(0, 0, dv) end end end local fr = onGround and (0.6 * 0.98) or 0.98 v = Vector3.new(v.X * fr, v.Y * 0.98, v.Z * fr) if onGround and v.Y < 0 then v = Vector3.new(v.X, v.Y * -0.5, v.Z) end item.position, item.velocity, item.onGround = p, v, onGround if p.Y < workspace.FallenPartsDestroyHeight then return true end -- Deliberately do not merge this entity with nearby dropped items. Each drop -- remains its own entity; stack copies above are based only on this entity's count. -- Pickup: the player's box inflated by 1 / 0.5 / 1 blocks must touch the item's box. if item.pickupDelay <= 0 and pos and not F.playerDead then local rx = (0.3 + 1.0 + 0.125) * BLOCK if math.abs(p.X - pos.X) <= rx and math.abs(p.Z - pos.Z) <= rx and p.Y - R <= pos.Y + 2.3 * BLOCK and p.Y + R >= pos.Y - 0.5 * BLOCK then local pending = { id = item.id, n = item.count } F.insertStack(pending, 36, 44) if pending.n > 0 then F.insertStack(pending, 9, 35) end if pending.n < item.count then F.pickupDirty = true item.count = pending.n if item.count <= 0 then item.collect = 0 item.collectFrom = p else F.syncDropCopies(item) end end end end return false end F.updateDroppedItems = function(dt) dropRayParams.FilterDescendantsInstances = { char, model, H.handsFolder, dropFolder } dropAcc += math.clamp(dt or 0, 0, 0.25) local steps = 0 while dropAcc >= DROP_TICK and steps < 6 do dropAcc -= DROP_TICK steps += 1 for i = #droppedItems, 1, -1 do local item = droppedItems[i] if not item.visual or not item.visual.Parent or stepDrop(item) then F.destroyDrop(item) table.remove(droppedItems, i) end end end if F.pickupDirty then F.pickupDirty = false F.updateCraft() refresh() end -- Render with interpolation between ticks, plus Minecraft's bob and spin. local alpha = dropAcc / DROP_TICK local target = (pos or Vector3.zero) + Vector3.new(0, (eyeH or 1.62) * 0.5 * BLOCK, 0) for _, item in ipairs(droppedItems) do if item.visual and item.visual.Parent then local t = item.age + alpha local ip = item.prevPosition:Lerp(item.position, alpha) local rot = CFrame.Angles(0, t / 20 + item.hoverStart, 0) if item.collect then local k = ((item.collect + alpha) / 3) ^ 2 ip = (item.collectFrom or ip):Lerp(target, math.clamp(k, 0, 1)) item.visual:PivotTo(CFrame.new(ip) * rot) for i, c in ipairs(item.extras) do c:PivotTo(CFrame.new(ip + item.offsets[i]) * rot) end else local bob = (math.sin(t / 10 + item.hoverStart) * 0.1 + 0.1) * BLOCK local base = CFrame.new(ip + Vector3.new(0, bob, 0)) * rot item.visual:PivotTo(base) for i, c in ipairs(item.extras) do c:PivotTo(base * CFrame.new(item.offsets[i])) end end end end end local wasJumping = false F.tick = function() if F.playerDead then return end prevPos, prevBodyYaw, prevWalkSpeed = pos, bodyYaw, walkSpeed age += 1 H.handTick() if age % 10 == 0 then F.checkLadders() end F.syncToolEquip() if age % 10 == 5 then F.syncRobloxTools() end 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 local climbY = 0 if onClimb then fallDistance = 0 local fwdInput = -mv.Z if jumpReq or fwdInput > 0.1 then climbY = 0.2 elseif fwdInput < -0.1 and not sneaking then climbY = -0.2 else climbY = 0 end vel = Vector3.new(math.clamp(vel.X, -0.15, 0.15), climbY, 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 then vel = Vector3.new(vel.X, climbY, 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 F.updateDebugScreen then F.updateDebugScreen() 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 if hitPart:GetAttribute("MCBlockId") == "ladder" then -- Ladders have a thin plate hitbox, so outline the plate itself. selectBox.Adornee = hitPart else local cellCenter = F.getGridCellCenter(hitPart, hitPos, hitNormal) selectionProxy.CFrame = CFrame.new(cellCenter) selectBox.Adornee = selectionProxy end 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 = 74 camera.FieldOfView = 74 end local baseFOV = F.baseMovementFOV or 74 -- 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("Minecraft recreation, 1.20 PI3. Lol it looks like PIE") end __RunMinecraftClient()