So in my simulator game I added a pet shop GUI. Everything worked fine until I added a second pet. This is the link to the un-copylocked pet shop (Made by @Azarth) the main script is this:
-- this was for a question on scripting helpers - basic client server logic
local PetStorage = game:GetService('ServerStorage').Pets
local RemoteEvent = game:GetService("ReplicatedStorage").PetGiver
local NotificationModule = require ( script.Notification )
local Pets = {
['Cube'] = { Pet = PetStorage:WaitForChild("Cube"), Cost = 0 },
['Slime'] = { Pet = PetStorage:WaitForChild("Slime"), Cost = 1 }
}
local PlayerPets = {}
local function Assign(Player, newPet)
-- Delete old assigned pet to make way for new pet
if PlayerPets[Player] then
PlayerPets[Player]:Destroy()
end
-- Get previous pet name or newPet from Pets
local Pet = newPet and Pets[newPet].Pet:Clone() or Pets[PlayerPets[Player].Name].Pet:Clone()
-- Give pet
Pet.Parent = Player.Character
-- Assign pet
PlayerPets[Player] = Pet
-- SetNetworkOwner erorrs if Parent doesn't exist yet
repeat wait() until Player.Character
Pet.PrimaryPart:SetNetworkOwner(Player)
end
RemoteEvent.OnServerEvent:Connect(function(PlayerWhoFired, PetName)
assert(PetName, 'Provide a PetName')
assert(typeof(PetName) == 'string', 'PetName has to be a string!')
local MatchingKey = Pets[PetName]
-- is the pet even real? Client could have lied
if Pets[PetName] then
local leaderstats = PlayerWhoFired:FindFirstChild("leaderstats")
local rebirths = leaderstats and leaderstats:FindFirstChild("rebirths")
-- Are our rebirths actually >= to the requirement?
if rebirths then
if rebirths.Value >= MatchingKey.Cost then
-- They are, assign the new pet.
Assign(PlayerWhoFired, PetName)
else
-- Are not, notify client they lost the battle
NotificationModule.Message(PlayerWhoFired, ("You don't have enough"):format() )
end
end
else
-- Pet isn't real
NotificationModule.Message(PlayerWhoFired, 'That pet does not exist')
end
end)
game.Players.PlayerAdded:Connect(function(Player)
script.leaderstats:Clone().Parent = Player
Player.CharacterAdded:Connect(function(character)
-- give them their pet each time they respawn
if PlayerPets[Player] then
Assign(Player)
end
end)
end)
game.Players.PlayerRemoving:Connect(function(Player)
-- clean up referance
PlayerPets[Player.Name] = nil
end)
But this part is the problem of the scrip is the problem:
local PetStorage = game:GetService('ServerStorage').Pets
local RemoteEvent = game:GetService("ReplicatedStorage").PetGiver
local NotificationModule = require ( script.Notification )
local Pets = {
['Cube'] = { Pet = PetStorage:WaitForChild("Cube"), Cost = 0 },
['Slime'] = { Pet = PetStorage:WaitForChild("Slime"), Cost = 1 }
}
If I keep it like this only the slime works.
local PetStorage = game:GetService('ServerStorage').Pets
local RemoteEvent = game:GetService("ReplicatedStorage").PetGiver
local NotificationModule = require ( script.Notification )
local Pets = {
['Cube'] = { Pet = PetStorage:WaitForChild("Cube"), Cost = 0 }
}
But if I change it to this only the Cube works. Copylocked version of my game

3 comments
Sorry for the bad grammar.
Any error messages in the console? Those would be helpful if they are present. If not, what, exactly, is not working?
If I use the first script you can't buy the cube.