TimberWoods / src /ServerScriptService /PlotManager.server.lua
algorembrant's picture
Upload 88 files
0712d5f verified
-- src/ServerScriptService/PlotManager.server.lua
local CollectionService = game:GetService("CollectionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local PlotConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("PlotConfig"))
local ClaimPlotEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("ClaimPlot")
-- Keeps track of which player owns which plot
local activePlots = {} -- [player.UserId] = plotPart
local function claimPlot(player, targetPlot)
-- Validate requested plot
if not targetPlot or not targetPlot:IsA("BasePart") then return end
if not CollectionService:HasTag(targetPlot, "EmptyPlot") then return end
-- Ensure player doesn't already own a plot
if activePlots[player.UserId] then
print(player.Name .. " already owns a plot.")
return
end
-- Ensure plot isn't already claimed
for _, ownedPlot in pairs(activePlots) do
if ownedPlot == targetPlot then
print("Plot already claimed.")
return
end
end
-- Grant Ownership
activePlots[player.UserId] = targetPlot
-- Change Plot Visuals
targetPlot.BrickColor = BrickColor.new("Bright green")
CollectionService:RemoveTag(targetPlot, "EmptyPlot")
CollectionService:AddTag(targetPlot, "ClaimedPlot")
targetPlot:SetAttribute("OwnerId", player.UserId)
print(player.Name .. " successfully claimed a plot.")
-- Load their Datastore Data onto this plot (Deferred to DatastoreManager)
_G.LoadPlayerData(player, targetPlot)
end
-- Handle Claim Event
ClaimPlotEvent.OnServerEvent:Connect(claimPlot)
-- Cleanup when player leaves
Players.PlayerRemoving:Connect(function(player)
local plot = activePlots[player.UserId]
if plot then
-- Save their data (Deferred to DatastoreManager)
_G.SavePlayerData(player, plot)
-- Reset Plot
plot.BrickColor = BrickColor.new("Dark stone grey")
CollectionService:RemoveTag(plot, "ClaimedPlot")
CollectionService:AddTag(plot, "EmptyPlot")
plot:SetAttribute("OwnerId", nil)
-- Delete all objects on the plot
for _, obj in pairs(plot:GetChildren()) do
if obj:IsA("Model") or obj:IsA("BasePart") then
obj:Destroy()
end
end
activePlots[player.UserId] = nil
end
end)