In my game, each player gets their own customizable bunker which serves as a functional base and a home to chill out in while not playing in a game.
I’m trying to finish the save to instance function in my save script and it works fine when I have only one player joining but when more than one person joins, they overwrite the previous bunker it seems. It used to make loads of copies of bunkers before but I made the save_to_map function delete a players bunker if it already exists before converting a new one from a save.
First here is an explanation for how the map system works:
Here is the save script:
ServerStorage = game:GetService("ServerStorage")
Players = game:GetService("Players")
ReplicatedStorage = game.ReplicatedStorage
objectstore = ReplicatedStorage.bunker_obj_storage
default_omega_coins, default_likes, default_wins = 0, 0, 0
default_bunker_terrain_position_X = { --default values for the bunker terrain
133.657,-136.738,-210.173,-98.238,
-45.073,-117.141,26.994,-45.073,-45.641,
}
default_bunker_terrain_position_Y = {
67.784,67.784,67.784,67.784,3.047,
32.778,32.778,32.778,32.778
}
default_bunker_terrain_position_Z = {
36.928,232.613,-50.947,-124.507,
71.493,71.635,72.202,-0.433,143.56
}
--133.657, 67.784, 36.928
--148.27, 13.266, 249.27
default_bunker_terrain_size_X = {
214.27,179.03,187.07,248.27,
145.27,1.135,1.135,145.27,144.135
}
default_bunker_terrain_size_Y = {
13.266,13.266,13.266,13.266,
4.266,56.746,56.746,56.746,56.746
}
default_bunker_terrain_size_Z = {
571.86,333.84,396.15,256.27,
145.27,142.716,143.851,1.419,1.135
}
default_bunker_terrain_rotation_X = {
0,0,0,0,0,0,0,0,0,0
}
default_bunker_terrain_rotation_Y = {
0,-90,0,0,0,0,0,0,0,0
}
default_bunker_terrain_rotation_Z = {
0,0,0,0,0,0,0,0,0,0
}
default_bunker_materials = {
"Grass","Grass","Grass","Grass",
"Mud","Rock","Rock","Rock","Rock"
}
------------------------------------------------------------------------------------------------------------------------
DataStore2.Combine(
"TestA9", "Played", "Wins", "Ωmega Coins", "Likes", "bunker_name", "object_name", --datastore2 keys
"object_position_x", "object_position_y", "object_position_z",
"object_rotation_x", "object_rotation_y", "object_rotation_z",
"terrain_position_x", "terrain_position_y", "terrain_position_z",
"terrain_rotation_x", "terrain_rotation_y", "terrain_rotation_z",
"terrain_size_x", "terrain_size_y", "terrain_size_x",
"terrain_materials","spawnposX","spawnposZ","spawnrotZ","spawnrot"
)
default_spawnposX = -45.075
default_spawnposY = 79.396
default_spawnposZ = 153.495
default_spawnrot = 180
-----------------------------------------------------------------------------------------------------------------
Players.PlayerAdded:Connect(function(Player) --datastore variables
winsStore = DataStore2("Wins", Player)
coinStore = DataStore2("Ωmega Coins", Player)
likesStore = DataStore2("Likes", Player)
bunkernameStore = DataStore2("bunker_name", Player)
objectnameStore = DataStore2("object_name", Player)
objectpositionStoreX = DataStore2("object_position_x", Player)
objectpositionStoreY = DataStore2("object_position_y", Player)
objectpositionStoreZ = DataStore2("object_position_z", Player)
objectrotationStoreX = DataStore2("object_rotation_x", Player)
objectrotationStoreY = DataStore2("object_rotation_y", Player)
objectrotationStoreZ = DataStore2("object_rotation_z", Player)
terrainpositionStoreX = DataStore2("terrain_position_x", Player)
terrainpositionStoreY = DataStore2("terrain_position_y", Player)
terrainpositionStoreZ = DataStore2("terrain_position_z", Player)
terrainrotationStoreX = DataStore2("terrain_rotation_x", Player)
terrainrotationStoreY = DataStore2("terrain_rotation_y", Player)
terrainrotationStoreZ = DataStore2("terrain_rotation_z", Player)
terrainsizeStoreX = DataStore2("terrain_size_x", Player)
terrainsizeStoreY = DataStore2("terrain_size_y", Player)
terrainsizeStoreZ = DataStore2("terrain_size_z", Player)
-- :Get()Variables
objectpositionGetX = objectpositionStoreX:Get({})
objectpositionGetY = objectpositionStoreY:Get({})
objectpositionGetZ = objectpositionStoreZ:Get({})
objectrotationGetX = objectrotationStoreX:Get({})
objectrotationGetY = objectrotationStoreY:Get({})
objectrotationGetZ = objectrotationStoreZ:Get({})
terrainpositionGetX = terrainpositionStoreX:Get(default_bunker_terrain_position_X)
terrainpositionGetY = terrainpositionStoreY:Get(default_bunker_terrain_position_Y)
terrainpositionGetZ = terrainpositionStoreZ:Get(default_bunker_terrain_position_Z)
terrainrotationGetX = terrainrotationStoreX:Get(default_bunker_terrain_rotation_X)
terrainrotationGetY = terrainrotationStoreY:Get(default_bunker_terrain_rotation_Y)
terrainrotationGetZ = terrainrotationStoreZ:Get(default_bunker_terrain_rotation_Z)
terrainsizeGetX = terrainsizeStoreX:Get(default_bunker_terrain_size_X)
terrainsizeGetY = terrainsizeStoreY:Get(default_bunker_terrain_size_Y)
terrainsizeGetZ = terrainsizeStoreZ:Get(default_bunker_terrain_size_Z)
terrainmaterialsStore = DataStore2("terrain_materials", Player)
terrainmaterialsGet = terrainmaterialsStore:Get(default_bunker_materials)
spawnposXStore = DataStore2("spawnposX",Player)
spawnposXGet = spawnposXStore:Get(default_spawnposX)
spawnposYStore = DataStore2("spawnposY",Player)
spawnposYGet = spawnposYStore:Get(default_spawnposY)
spawnposZStore = DataStore2("spawnposZ",Player)
spawnposZGet = spawnposZStore:Get(default_spawnposZ)
spawnrotStore = DataStore2("spawnrot",Player)
spawnrotGet = spawnrotStore:Get(default_spawnrot)
playedStore = DataStore2("Played", Player)
local played = Instance.new("BoolValue", Player)
played.Name = "played"
if playedStore:Get(true) then
played = true
else
played = false
end
local leaderstats = Instance.new("Folder") do
leaderstats.Name = "leaderstats"
end
local wins = Instance.new("IntValue") do
wins.Name = "Wins"
wins.Parent = leaderstats
end
local omega_coins = Instance.new("IntValue") do
omega_coins.Name = "O$"
omega_coins.Parent = leaderstats
end
local likes = Instance.new("IntValue") do
likes.Name = "Likes"
likes.Parent = leaderstats
end
leaderstats.Parent = Player
function save_to_model(player, bunkernameStore) ---------------------------------------------------- function start, converts bunker save into map
local designated_bunker_position = Player:WaitForChild("designated_bunker_position").Value
if workspace.maps:FindFirstChild(Player.Name) then
workspace.maps[Player.name]:Destroy()
end
local newMap = ServerStorage.empty_map:Clone() do
newMap.Name = Player.Name
local name = Instance.new("StringValue", newMap.params)
name.Name = "name"
offset = Instance.new("NumberValue", newMap.params)
offset.Name = "offset"
while designated_bunker_position == 0 do
wait(0.01)
end
print(designated_bunker_position)
newMap.spawns["1"].Value = Vector3.new(spawnposXGet,spawnposYGet,spawnposZGet+designated_bunker_position)
newMap.spawns["1"].rot.Value = spawnrotGet
if bunkernameStore then
name.Value = bunkernameStore
else
name.Value = "Bunker Construction Site"
end
end
local terrain = newMap.terrain:WaitForChild("cubes")
for i, v in pairs(terrainmaterialsGet) do
print (i) print(v)
local Part = Instance.new("Part") do
Part.Name = v
Part.Size = Vector3.new(terrainsizeGetX[i], terrainsizeGetY[i], terrainsizeGetZ[i])
Part.CFrame = CFrame.new(terrainpositionGetX[i], terrainpositionGetY[i], terrainpositionGetZ[i]+designated_bunker_position)*
CFrame.Angles(math.rad(terrainrotationGetX[i]), math.rad(terrainrotationGetY[i]), math.rad(terrainrotationGetZ[i]))
Part.Parent = terrain
Part.Anchored = true
Part.Transparency = 1
Part.CanCollide = false
newMap.Parent = game.Workspace.maps
ReplicatedStorage.store_map:FireClient(player,player.Name)
end
for i, v in pairs (objectnameStore:Get({})) do
local obj = objectstore[v]:Clone()
obj.CFrame = CFrame.new(objectpositionGetX[i], objectpositionGetY[i], objectpositionGetZ[i])*
Vector3.new(objectrotationGetX[i], objectrotationGetY[i], objectrotationGetZ[i])
end
end
end --------------------------------------------------------------------------------------------- function end
function model_to_save(new_name) ---------------------------------------------------------function start, converts map into save
local terrain = workspace.maps[Player.Name].terrain:WaitForChild("cubes"):GetChildren()
local mapobj = workspace.maps[Player.Name].obj:GetChildren()
print(new_name)
bunkernameStore:Set("MrGuyROBLOX's Dungeon")
local
terrainpositionX,
terrainpositionY,
terrainpositionZ,
terrainrotationX,
terrainrotationY,
terrainrotationZ,
terrainsizeX,
terrainsizeY,
terrainsizeZ,
terrainmaterials,
objectpositionX,
objectpositionY,
objectpositionZ,
objectrotationX,
objectrotationY,
objectrotationZ = {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}
for i = 1, #terrain do
local child = terrain[i]
if child:IsA("Part") then
terrainpositionX[i] = child.Position.X
terrainpositionY[i] = child.Position.Y
terrainpositionZ[i] = child.Position.Z
terrainrotationX[i] = child.Rotation.X
terrainrotationY[i] = child.Rotation.Y
terrainrotationZ[i] = child.Rotation.Z
terrainsizeX[i] = child.Size.X
terrainsizeY[i] = child.Size.Y
terrainsizeZ[i] = child.Size.Z
terrainmaterials[i] = child.name
end
end
for i = 1, #mapobj do
local objchild = mapobj[i]
if objchild:IsA("Model") then
local partchild = #mapobj[i]
for i = 1, #partchild do
if partchild:IsA("Part", "MeshPart") then
objectpositionX[i] = partchild[i].Position.X
objectpositionY[i] = partchild[i].Position.Y
objectpositionZ[i] = partchild[i].Position.Z
objectrotationX = partchild[i].Orientation.X
objectrotationY = partchild[i].Orientation.Y
objectrotationZ = partchild[i].Orientation.Z
end
end
end
end
terrainpositionStoreX:Set(terrainpositionX)
terrainpositionStoreY:Set(terrainpositionY)
terrainpositionStoreZ:Set(terrainpositionZ)
terrainrotationStoreX:Set(terrainrotationX)
terrainrotationStoreY:Set(terrainrotationY)
terrainrotationStoreZ:Set(terrainrotationZ)
terrainsizeStoreX:Set(terrainsizeX)
terrainsizeStoreY:Set(terrainsizeY)
terrainsizeStoreZ:Set(terrainsizeZ)
terrainmaterialsStore:Set(terrainmaterials)
objectpositionStoreX:Set(objectpositionX)
objectpositionStoreY:Set(objectpositionY)
objectpositionStoreZ:Set(objectpositionZ)
objectrotationStoreX:Set(objectrotationX)
objectrotationStoreY:Set(objectrotationY)
objectrotationStoreZ:Set(objectrotationZ)
if not played then
playedStore:Set(true)
end
end -------------------------------------------------------------------------------------------function end
ReplicatedStorage:WaitForChild("load_map").OnServerEvent:Connect(function(player)
save_to_model(player)
end)
ReplicatedStorage:WaitForChild("save_map").OnServerEvent:Connect(function(name)
model_to_save(name)
end)
end)
I checked with other scripts and this seems to be the culprit. I think it’s something to do with the PlayerAdded event.
If you need anything else, just ask!