File size: 2,553 Bytes
0712d5f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
-- 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)