--!native --!optimize 2 local BlockManager = {} BlockManager.BlockIdMappings = {} :: {BasePart} for _,v in pairs(game:GetService("ReplicatedStorage"):WaitForChild("Blocks"):GetChildren()) do BlockManager.BlockIdMappings[v:GetAttribute("n")] = v end BlockManager.UpdateIdMappings = {} :: {BasePart} for _,v in pairs(game:GetService("ReplicatedStorage"):WaitForChild("BlockUpdateOperations"):GetChildren()) do local success, reason = pcall(function() BlockManager.UpdateIdMappings[v:GetAttribute("n")] = require(v) end) if not success then warn("[BLOCKMANAGER] Invalid update operation",v:GetAttribute("n"),":",reason) end end local warnedBlockIds = {} function BlockManager:GetBlock(blockId: number, attr: {[typeof("")]: any}?) if not BlockManager.BlockIdMappings[blockId] then if not warnedBlockIds[blockId] then warnedBlockIds[blockId] = true warn("[BLOCKMANAGER] Invalid block id",blockId) end return script.invalid:Clone() end local b = BlockManager.BlockIdMappings[blockId]:Clone() b.Size = Vector3.new(3.95,3.95,3.95) for _,v in pairs(attr or {}) do b:SetAttribute(_,v) end if BlockManager.UpdateIdMappings[blockId] then local success, reason = pcall(function() BlockManager.UpdateIdMappings[blockId](b) end) if not success then warn("[BLOCKMANAGER] Failed update operation",blockId,":",reason) end end return b end -- ChatGPT Generated Func!!!! function BlockManager:GetBlockRotated(blockId: number, face: Enum.NormalId, attr: {[typeof("")]: any}?) -- Returns block with id blockId, rotated so the given face (NormalId) points north (+X). local block = BlockManager:GetBlock(blockId, attr) local rot = CFrame.new() if face == Enum.NormalId.Front then rot = CFrame.Angles(0, 0, 0) -- no rot elseif face == Enum.NormalId.Back then rot = CFrame.Angles(0, math.rad(180), 0) elseif face == Enum.NormalId.Left then rot = CFrame.Angles(0, math.rad(90), 0) elseif face == Enum.NormalId.Right then rot = CFrame.Angles(0, math.rad(-90), 0) elseif face == Enum.NormalId.Top then rot = CFrame.Angles(math.rad(-90), 0, 0) -- top +x elseif face == Enum.NormalId.Bottom then rot = CFrame.Angles(math.rad(90), 0, 0) -- bottom +x end -- ocbwoy3's fix block:PivotTo(rot) block.CFrame = CFrame.new(rot.Position) return block end return BlockManager