Skip to content

Instantly share code, notes, and snippets.

@MajorTal
Created June 1, 2025 18:21
Show Gist options
  • Save MajorTal/001128fd1bbf37b63dc8ee0b6448c354 to your computer and use it in GitHub Desktop.
Save MajorTal/001128fd1bbf37b63dc8ee0b6448c354 to your computer and use it in GitHub Desktop.
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