core: fix hotbar

This commit is contained in:
2026-01-08 23:52:32 +02:00
parent 2c41f40151
commit 2a0dd51659
8 changed files with 429 additions and 53 deletions

View File

@@ -2,15 +2,39 @@
--!optimize 2
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local ClientStateService = require(script.Parent.ClientState)
local Shared = ReplicatedStorage:WaitForChild("Shared")
local ModsFolder = ReplicatedStorage:WaitForChild("Mods")
local BlocksFolderRS = ReplicatedStorage:FindFirstChild("Blocks") or Instance.new("Folder")
BlocksFolderRS.Name = "Blocks"
BlocksFolderRS.Parent = ReplicatedStorage
local BlocksFolderSS = ServerStorage:FindFirstChild("Blocks") or Instance.new("Folder")
BlocksFolderSS.Name = "Blocks"
BlocksFolderSS.Parent = ServerStorage
local Util = require(Shared.Util)
local TG = require("./ServerChunkManager/TerrainGen")
local TG = require(script.TerrainGen)
local Players = game:GetService("Players")
local blockIdMap = {}
local rebuildBlockIdMap
local function syncBlocksToServerStorage()
BlocksFolderSS:ClearAllChildren()
for _, child in ipairs(BlocksFolderRS:GetChildren()) do
child:Clone().Parent = BlocksFolderSS
end
ClientStateService:SetBlocksFolder(BlocksFolderSS)
if rebuildBlockIdMap then
rebuildBlockIdMap()
end
end
BlocksFolderRS.ChildAdded:Connect(syncBlocksToServerStorage)
BlocksFolderRS.ChildRemoved:Connect(syncBlocksToServerStorage)
do
local workspaceModFolder = game:GetService("Workspace"):WaitForChild("mods")
@@ -22,6 +46,8 @@ end
local ML = require(Shared.ModLoader)
ML.loadModsS()
syncBlocksToServerStorage()
ClientStateService:Init()
do
local bv = Instance.new("BoolValue")
@@ -67,7 +93,7 @@ local tickRemote = ReplicatedStorage.Tick
local remotes = ReplicatedStorage:WaitForChild("Remotes")
local placeRemote = remotes:WaitForChild("PlaceBlock")
local breakRemote = remotes:WaitForChild("BreakBlock")
local blocksFolder = ReplicatedStorage:WaitForChild("Blocks")
local blocksFolder = BlocksFolderSS
local function propogate(a, cx, cy, cz, x, y, z, bd)
task.synchronize()
tickRemote:FireAllClients(a, cx, cy, cz, x, y, z, bd)
@@ -75,9 +101,8 @@ local function propogate(a, cx, cy, cz, x, y, z, bd)
end
local MAX_REACH = 512
local blockIdMap = {}
local function rebuildBlockIdMap()
rebuildBlockIdMap = function()
table.clear(blockIdMap)
for _, block in ipairs(blocksFolder:GetChildren()) do
local id = block:GetAttribute("n")
@@ -113,6 +138,17 @@ local function resolveBlockId(blockId: any): string | number | nil
return blockIdMap[blockId]
end
local function playerCanUseBlock(player: Player, resolvedId: any): boolean
if not ClientStateService:HasInInventory(player, resolvedId) then
return false
end
local selected = ClientStateService:GetSelectedBlockId(player)
if not selected then
return false
end
return tostring(selected) == tostring(resolvedId)
end
local function getServerChunk(cx: number, cy: number, cz: number)
task.desynchronize()
local chunk = TG:GetChunk(cx, cy, cz)
@@ -176,6 +212,9 @@ placeRemote.OnServerEvent:Connect(function(player, cx, cy, cz, x, y, z, blockId)
if not resolvedId then
return reject("invalid id")
end
if not playerCanUseBlock(player, resolvedId) then
return reject("not in inventory/hotbar")
end
local blockPos = Util.ChunkPosToCFrame(Vector3.new(cx, cy, cz), Vector3.new(x, y, z)).Position
if isBlockInsidePlayer(blockPos) then