Hi, I’m making a skins system for my tower defense game and as every game of them, we need to choose maximum 5 towers to start the match. So I’ve been trying to make that if you click on a tower in Inventory, it will open a new Frame which you can select the tower’s skins.
What do I want to achieve?
- I want the game automatically unequip the default tower so the player uses the skin and not both of them as 2 same towers.
What solutions I’ve tried so far?
This is an example of the module I am using for towers that have skins:
Module
local TowerShop = {
["Matt"] = {
["Name"] = "Matt",
["ImageAsset"] = "rbxassetid://9858238185",
["Description"] = "Shoots enemies from a close distance inflicting average damage.",
["Price"] = 0,
["Strength"] = 1,
["Range"] = 12,
["Cooldown"] = 1.508,
["DetectHidden"] = true,
["HasSkins"] = true,
["ForSale"] = true,
["LayoutOrder"] = 0,
["Skins"] = {
["Matt"] = {
["ImageAsset"] = "rbxassetid://9858238185",
["Name"] = "Matt",
["OriginalDefender"] = "Matt",
["Price"] = 0,
["LayoutOrder"] = 0,
},
["Criminal Matt"] = {
["ImageAsset"] = "rbxassetid://9858238185",
["Name"] = "Criminal Matt",
["OriginalDefender"] = "Matt",
["Price"] = 1,
["LayoutOrder"] = 1,
},
},
},
- As you can see, In every skin it has [“OriginalDefender”], thing that I use so the script looks for Default skin equipped and be removed from table when a different skin was selected.
This is the script I use to equip Towers:
InteractItem Remote Function
ReplicatedStorage.InteractItem.OnServerInvoke = function(player, itemName)
local shopItem = towers[itemName]
local playerData = data[player.UserId]
if shopItem and playerData then
local status = getItemStatus(player, itemName)
if status == "For Sale" and shopItem.Price <= playerData.Cents then
playerData.Cents -= shopItem.Price
table.insert(playerData.OwnedDefenders, shopItem.Name)
elseif status == "Owned" then
table.insert(playerData.SelectedDefenders, shopItem.Name)
if #playerData.SelectedDefenders > max_selected_defenders then
table.remove(playerData.SelectedDefenders, 1)
end
elseif status == "Equipped" then
if #playerData.SelectedDefenders > 1 then
local defenderToRemove = table.find(playerData.SelectedDefenders, itemName)
table.remove(playerData.SelectedDefenders, defenderToRemove)
end
end
return playerData
else
warn("Defender/Player data does not exist")
end
return false
end
And this is the script I use to switch skins:
Switch Skin Local Script
function showTowerSkins(defenderName)
for i, defender in pairs(towers[defenderName].Skins) do
local oldButton = skinsFrame:FindFirstChild(defender.Name)
if oldButton then
oldButton:Destroy()
end
local newButton = skinsFrame.Template:Clone()
newButton.Name = defender.Name
newButton.DefenderName.Text = defender.Name
newButton.CharacterTemplate.Image = defender.ImageAsset
newButton.Price.Visible = false
newButton.Visible = true
newButton.LayoutOrder = defender.LayoutOrder
newButton.Parent = skinsFrame
local status = getItemStatus(defender.Name)
if status == "Equipped" then
newButton.Equipped.Visible = true
newButton.Price.Visible = false
elseif status == "Owned" then
newButton.Equipped.Visible = false
newButton.Price.Visible = false
elseif status == "Unowned" then
newButton.Visible = false
end
newButton.CharacterTemplate.Activated:Connect(function()
switchSkins(defender.Name, defender.OriginalDefender)
gui.Menu.Inventory.ItemsFrame.Visible = true
gui.Menu.Inventory.SkinsFrame.Visible = false
sfx.Selection:Play()
end)
end
end
Switch Skin Script
ReplicatedStorage.SwitchSkin.OnServerInvoke = function(player, itemName, originalName)
local originalItem = towers[originalName].Skins
local playerData = data[player.UserId]
if table.find(playerData.SelectedDefenders, originalName) then
local defaultDefenderToRemove = table.find(playerData.SelectedDefenders, originalName)
table.remove(playerData.SelectedDefenders, defaultDefenderToRemove)
table.insert(playerData.SelectedDefenders, itemName)
print(itemName .. " has been equipped to SelectedDefenders")
print(defaultDefenderToRemove .. " has been removed from SelectedDefenders")
else
local skinDefenderToRemove = table.find(playerData.SelectedDefenders, itemName)
table.remove(playerData.SelectedDefenders, skinDefenderToRemove)
table.insert(playerData.SelectedDefenders, itemName)
print(itemName .. " has been equipped to SelectedDefenders")
end
end
ReplicatedStorage.GetData.OnServerInvoke = function(player)
return data[player.UserId]
end
What is the problem?
- It doesn’t let me replace the Skin for the Default, it seems to only replace Default for the selected skin.
robloxapp-20221125-1458383.wmv (1.0 MB)
Is there a way I can fix this? I’ve been trying to fix this alone like a week ago, but I couldn’t do it. Help is very appreciated!