How can I replace Default skin for the selected one in a table

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!

Never mind, someone else helped me to fix this from other website.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.