I’m trying to make an equip system, but if I were to have the max of 5 towers equipped and equip another tower, it would replace the 5th slot with the tower, but instead, it attempts to create a new slot.
(specifically on module:equipTower function)
ModuleScript:
local module = {}
local serverscriptservice = game:GetService('ServerScriptService')
local profileservice = require(serverscriptservice.Services.ProfileService)
local players = game:GetService('Players')
local serverstorage = game:GetService('ReplicatedStorage')
local goodsignal = require(serverstorage.Services.GoodSignal)
local cachedProfiles = {}
local key = '!34w@!'
local dataformat = {
[1] = 'Warrior',
[2] = 'Slingshooter',
[3] = nil,
[4] = nil,
[5] = nil
}
local equipDatastore = profileservice.GetProfileStore('equipdatastore',dataformat)
local function loadData(player)
local profile = cachedProfiles[player]
if not player:FindFirstChild("towersEquipped") then
folder = Instance.new('Folder')
folder.Name = 'towersEquipped'
folder.Parent = player
else
task.spawn(function()
for _, v in ipairs(player:WaitForChild("towersEquipped"):GetChildren()) do
v:Destroy()
end
end)
end
for i, v in ipairs(profile.Data) do
if v ~= nil and v ~= '' then
local foo = v..'Lvl0'
local val = Instance.new('ObjectValue')
val.Value = serverstorage.Units[v]['LEVEL0'][foo]
val.Parent = folder
val.Name = i
val:SetAttribute('order',i)
val:SetAttribute('tower',v)
elseif v == '' then
local r = table.find(profile.Data,'')
table.remove(profile.Data,r)
end
end
end
function module:startModule(player)
local profile = equipDatastore:LoadProfileAsync(player.UserId..key,'ForceLoad')
if profile ~= nil then
profile:ListenToRelease(function()
cachedProfiles[player] = nil
player:Kick('Your data has been loaded remotely, Please rejoin.')
end)
if players:FindFirstChild(player.Name) then
cachedProfiles[player] = profile
loadData(player)
end
else
player:Kick('Unable to load equip data, Please rejoin.')
end
end
local function towerAlreadyEquipped(player, tower)
local profile = cachedProfiles[player]
local equippedTowers = player:FindFirstChild('towersEquipped')
for i, v in ipairs(profile.Data) do
if v == tower then
return true
end
end
return false
end
function module:equipTower(player,tower)
local profile = cachedProfiles[player]
local equippedTowers = player:FindFirstChild('towersEquipped')
print(#equippedTowers:GetChildren())
if profile ~= nil and #equippedTowers:GetChildren() ~= 5 and tower ~= nil or tower ~= '' then
if not towerAlreadyEquipped(player, tower) then
local place = #equippedTowers:GetChildren() + 1
table.insert(profile.Data,tower)
loadData(player)
elseif profile == nil then
return false
elseif tower == nil or tower == '' then
return false
end
elseif profile ~= nil and #equippedTowers:GetChildren() <= 5 and tower ~= nil or tower ~= '' then
--profile.Data[5] = tower
table.insert(profile.Data,5,tower)
loadData(player)
end
end
function module:unequipTower(player,tower)
local profile = cachedProfiles[player]
local equippedTowers = player:FindFirstChild('towersEquipped')
if profile ~= nil and tower then
for i, v in ipairs(equippedTowers:GetChildren()) do
if v:GetAttribute('tower') == tower then
local test = table.find(profile.Data,tower)
table.remove(profile.Data,test)
end
v:Destroy()
end
loadData(player)
end
end
players.PlayerRemoving:Connect(function(player)
local profile = cachedProfiles[player]
if profile ~= nil then
profile:Release()
end
end)
game:BindToClose(function()
for _, v in ipairs(players:GetChildren()) do
local profile = cachedProfiles[players]
if v:IsA('Player') and profile ~= nil then
profile:Release()
end
end
end)
return module