--!native --!optimize 2 local RunService = game:GetService("RunService") if RunService:IsServer() then error("ClientState can only be required on the client") end local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local Replica = require(ReplicatedStorage.Packages.replica) local ClientState = {} local HOTBAR_SIZE = 10 local localPlayer = Players.LocalPlayer local replicaForPlayer = nil local changed = Instance.new("BindableEvent") local function fireChanged() changed:Fire() end local function onReplicaNew(replica) local tags = replica.Tags or {} if tags.UserId ~= localPlayer.UserId and tags.Player ~= localPlayer then return end replicaForPlayer = replica replica:OnChange(fireChanged) fireChanged() end Replica.OnNew("ClientState", onReplicaNew) Replica.RequestData() function ClientState:IsReady(): boolean return replicaForPlayer ~= nil end function ClientState:GetReplica() return replicaForPlayer end function ClientState:GetSelectedSlot(): number? if not replicaForPlayer then return nil end return replicaForPlayer.Data.selectedSlot end local function getInventory() return replicaForPlayer and replicaForPlayer.Data.inventory or nil end function ClientState:GetItemInfo(blockId: any) if not replicaForPlayer or not blockId then return nil end local inv = getInventory() local entry = inv and inv[tostring(blockId)] if not entry then return nil end return { id = tostring(blockId), name = entry.name or tostring(blockId), count = entry.count, } end function ClientState:GetHotbarSlots(): {string} if not replicaForPlayer then local slots = table.create(HOTBAR_SIZE) for i = 1, HOTBAR_SIZE do slots[i] = "" end return slots end return replicaForPlayer.Data.hotbar or {} end function ClientState:GetSlotInfo(slot: number) if not replicaForPlayer then return nil end local hotbar = replicaForPlayer.Data.hotbar if not hotbar then return nil end local id = hotbar[slot] if not id then return nil end return ClientState:GetItemInfo(id) end function ClientState:GetSelectedBlock() if not replicaForPlayer then return nil end local slot = ClientState:GetSelectedSlot() if not slot then return nil end return ClientState:GetSlotInfo(slot) end function ClientState:SetSelectedSlot(slot: number) if not replicaForPlayer then return end local hotbar = replicaForPlayer.Data.hotbar if not hotbar then return end if slot and slot >= 1 and slot <= HOTBAR_SIZE then replicaForPlayer:FireServer("SelectHotbarSlot", slot) end end ClientState.Changed = changed.Event return ClientState