Created
June 1, 2025 18:21
-
-
Save MajorTal/001128fd1bbf37b63dc8ee0b6448c354 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local DataStoreService = game:GetService("DataStoreService") | |
local poleDataStore = DataStoreService:GetDataStore("PolePlacementData") | |
local Players = game:GetService("Players") | |
local GRID_SIZE = 4 -- Same grid size you used earlier | |
-- Helper to snap positions | |
local function snapToGrid(position) | |
return Vector3.new( | |
math.floor(position.X / GRID_SIZE + 0.5) * GRID_SIZE, | |
position.Y, | |
math.floor(position.Z / GRID_SIZE + 0.5) * GRID_SIZE | |
) | |
end | |
-- Save poles for a player's room | |
local function savePoles(player) | |
local roomName = player:GetAttribute("Room") | |
local room = workspace.PlayerRooms:FindFirstChild(roomName) | |
if not room then return end | |
local polesData = {} | |
for _, pole in ipairs(room:GetChildren()) do | |
if pole:IsA("BasePart") then | |
table.insert(polesData, { | |
x = pole.Position.X, | |
y = pole.Position.Y, | |
z = pole.Position.Z | |
}) | |
end | |
end | |
local success, err = pcall(function() | |
poleDataStore:SetAsync(player.UserId, polesData) | |
end) | |
if not success then | |
warn("Failed to save poles for player:", player.Name, err) | |
end | |
end | |
-- Load poles for a player's room | |
local function loadPoles(player) | |
local roomName = player:GetAttribute("Room") | |
local room = workspace.PlayerRooms:FindFirstChild(roomName) | |
if not room then return end | |
local success, polesData = pcall(function() | |
return poleDataStore:GetAsync(player.UserId) | |
end) | |
if success and polesData then | |
-- First, clear existing poles in the room | |
for _, child in ipairs(room:GetChildren()) do | |
if child:IsA("BasePart") then | |
child:Destroy() | |
end | |
end | |
-- Recreate poles | |
for _, poleInfo in ipairs(polesData) do | |
local poleTemplate = game.ServerStorage.Pole.Handle:Clone() | |
poleTemplate.Anchored = true | |
poleTemplate.CanCollide = true | |
poleTemplate.CFrame = CFrame.new(poleInfo.x, poleInfo.y, poleInfo.z) | |
* CFrame.Angles(0, 0, math.rad(90)) | |
poleTemplate.Parent = room | |
end | |
else | |
warn("No poles data found or error for player:", player.Name) | |
end | |
end | |
-- Auto-save on leaving | |
Players.PlayerRemoving:Connect(function(player) | |
savePoles(player) | |
end) | |
-- Load poles on join | |
Players.PlayerAdded:Connect(function(player) | |
player.CharacterAdded:Connect(function() | |
loadPoles(player) | |
end) | |
end) | |
-- Save data when server shuts down | |
game:BindToClose(function() | |
for _, player in ipairs(Players:GetPlayers()) do | |
savePoles(player) | |
end | |
end) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment