Hello, my friend and I want to create a tower defence type game, and I’m the scripter and my friends the builder. This is the 2nd time I’ve tried making a game like TDS but both times I’ve got confused because I have almost no experience with datastores and I am wondering how tower games save the players towers equipped, the ones bought, the ones not bought, and the coins
just try saving a string value of the tower’s name and when the player rejoins, get the tower with the name that equals the string value / saved value.
and about the coin saving thing, you can save a table full of information using SetAsync()
eg: SavedData = {Coins = 10, MiniGunner = false, etc}
is there a way you could do that with tables and tell the server which ones they have and not have dependent on that table
yea of course, just set the saved value of something like MiniGunner = false to —> MiniGunner = true when the player buys the item and using SetAsync and GetAsync you should be able to save and load your DataStore Values
I’m new to datastores how would i use setasync and getasync
you should first get the DataStoreService by typing
local DSS = game:GetService("DataStoreService")
and Get your DataStore by typing
local MyDataStore = DSS:GetDataStore("HERE SHOULD BE YOUR DATASTORE NAME", "Players")
After that you should then make a function that creates a Key to every player’s DataStore
say it as the player has a key to his own house and he’s the only one that has the access to his home’s door cause of the key he owns and that’s exactly what we want to achieve here, we do that by typing
function GenerateDataKey(Player)
local Key = "UID_" .. Player.userId
return Key
end
you can use the GetAsync() function to get the player’s Data using their generated Key
local Key = GenerateDataKey(player)
local data = MyDataStore:GetAsync(Key)
we should also detect if the player has saved values or is he new to the game by saying:
if data then
-- Here you will have to input the player's saved data into an IntValue or something
-- eg: Money.Value = data.Money
end
you will do all of this when the player joins the game, now lets say the player leaves and you want to save his data, here comes SetAsync(), you will to do that by also create a key for the player and getting the intvalues and saving them.
local Key = GenerateDataKey(Player)
local Data = {Money.Value, MiniGunner.Value, etc}
MyDataStore:SetAsync(Key, Data)
and that’s it for DataStore, hope you learned something new from this.
Im pretty sure i did this wrong but does it go like this
local DSS = game:GetService("DataStoreService")
game.Players.PlayerAdded:connect(function(Player)
local MyDataStore = DSS:GetDataStore("HERE SHOULD BE YOUR DATASTORE NAME", "Players")
local function GenerateDataKey(Player)
local Key = "UID_" .. Player.userId
return Key
end
local Key = GenerateDataKey(Player)
local data = MyDataStore:GetAsync(Key)
if data then
-- Here you will have to input the player's saved data into an IntValue or something
-- eg: Money.Value = data.Money
end
local Key = GenerateDataKey(Player)
local towers = {
}
MyDataStore:SetAsync(Key, data)
end)
local DSS = game:GetService("DataStoreService")
local MyDataStore = DSS:GetDataStore("HERE SHOULD BE YOUR DATASTORE NAME", "Players")
local function GenerateDataKey(Player)
local Key = "UID_" .. Player.userId
return Key
end
game.Players.PlayerAdded:connect(function(Player)
local Key = GenerateDataKey(Player)
local data = MyDataStore:GetAsync(Key)
if data then
-- Here you will have to input the player's saved data into an IntValue or something
-- eg: Money.Value = data.Money
end
end)
game.Players.PlayerRemoved:Connect(function(Player)
local Key = GenerateDataKey(Player)
local towers = {
}
MyDataStore:SetAsync(Key, data)
end)
Thanks, but now how would i make this work, how would other scripts see if i had the towers or not, and how could i update the list of tower
Look into ModuleScripts. This should be the primary way your game’s data gets managed.
Here’s an example:
-- GameData ModuleScript
local GameData = {}
local players = {}
function GameData:SetPlayerTowers(player, towers)
players[player.UserId] = towers
end
function GameData:GetTowers(player)
return players[player.UserId] or {}
end
return GameData
how would i call this from the server?
There’s a lot of tutorials on module scripts out there:
- Intro to Module Scripts
- Basic ModuleScript Tutorial for Beginners
- How To Use Module Scripts in Roblox Studio
Google is your friend.
Here’s how you would use the above script when a player gets added:
local GameData = require(path.to.module)
game:GetService('Players').PlayerAdded:Connect(function(player)
-- TODO: Try to get saved data from a datastore
-- Set some default tower if theres no existing data for the player
GameData:SetPlayerTowers(player, {
SomeRandomTower = {
...
}
})
end)
-- Handle saving when a player leaves
game:GetService('Players').PlayerRemoving:Connect(function(player)
-- TODO: Save the data to a datastore
--[[
Didn't make this method in the post above
but ideally you would just delete the player from the players table
]]--
GameData:RemovePlayerTowers(player)
end)
so my script is currently
local GameData = require(game.ReplicatedStorage.ModuleScript)
game:GetService('Players').PlayerAdded:Connect(function(player)
-- TODO: Try to get saved data from a datastore
-- Set some default tower if theres no existing data for the player
GameData:SetPlayerTowers(player, {
Frost = true
})
end)
-- Handle saving when a player leaves
game:GetService('Players').PlayerRemoving:Connect(function(player)
-- TODO: Save the data to a datastore
--[[
Didn't make this method in the post above
but ideally you would just delete the player from the players table
]]--
GameData:RemovePlayerTowers(player)
end)
but how do i give them towers because the changes i made don’t work, how do i give them a starter tower and how do i check which towers they own and don’t
That’s up to you to do I have no idea how your tower system works.
As for checking which they have:
if (GameData:GetTowers(player).Frost == true) then
-- has Frost tower so do stuff
end
how do i add towers to their inventory remotely?
I don’t really know what you’re asking here. You would just add a new method to the GameData
module called something like :AddTower()
how do i do that I’m confused?
table.insert()
into the player in the game data
how should it work correctly??
you need to use datastores for saving people literally explained that to you above