Hello Scripting Community!
I was recently working on a script that would give items based on a dictionary which contained the item and its game pass ID, or list of player ID's that would receive the item. Here is my script below:
ms = game:GetService("MarketplaceService")
BB = script["Big Boing"];
LGC = script["Low Gravity Crystal"];
HC = script["Helicopter Crystal"];
HotTea = script["Hot Tea"];
noclip = script.Noclip
heal = script.Heal
local developers = { --list of devs by player id
98156531, --Me, JAG (TChilled)
1339309430, --pineapples353
1415880068 --TeasTown
}
local owner = {98156531} -- Me, JAG (TChilled)
local ItemList = {
[heal] = owner,
[noclip] = owner,
[BB] = developers,
[LGC] = 10734158,
[HC] = 10749790,
[HotTea] = 16334719
}
local OwnedItems = {}
--Gives tools to player
function RegisterItems(plr)
print("Running Register Items")
OwnedItems = {}
for item, id in pairs(ItemList) do
if tonumber(id) ~= nil then
local hasPass = ms:UserOwnsGamePassAsync(plr.UserId, id)
if hasPass then
local c = item:Clone()
c.Parent = plr:WaitForChild("Backpack")
OwnedItems[item] = true
print(c.Parent)
print(item, OwnedItems[item])
else
OwnedItems[item] = false
print(item, OwnedItems[item])
end
else
for i, v in pairs(id) do
if plr.UserId == v then
local c = item:Clone()
c.Parent = plr:WaitForChild("Backpack")
OwnedItems[item.Name] = true
print(c.Parent, c, item) -- Prints Backpack, the item (Ex: Noclip), and the item from the list (Again, noclip)
print(item, OwnedItems[item.Name]) -- Prints the item (Noclip) and true
break
else
OwnedItems[item.Name] = false
print(item, OwnedItems[item.Name])
end
end
end
end
local folder = Instance.new("Folder", script)
folder.Name = plr.Name
for item, owned in pairs(OwnedItems) do
if owned == true then
local val = Instance.new("BoolValue", folder)
val.Name = item
val.Value = true
end
end
game.ReplicatedStorage.ItemStatusUpdated:FireClient(plr, OwnedItems)
end
--Update tools based on true/false values for them
function UpdateItems(plr) --Only prints on player reset
print("Running Update Items")
local plrTools = script:FindFirstChild(plr.Name)
if plrTools then
plr:WaitForChild("Backpack"):ClearAllChildren()
for i, v in pairs(plrTools:GetChildren()) do
if v.Value == true then
print(v) -- prints the item (Ex: Noclip)
print(not plr:WaitForChild("Backpack"):FindFirstChild(v.Name)) -- prints true
if not plr:WaitForChild("Backpack"):FindFirstChild(v.Name) then
local item = plrTools:FindFirstChild(v.Name)
local c = item:Clone()
c.Parent = plr:WaitForChild("Backpack")
print(c.Parent) -- prints Backpack
end
end
end
end
end
game.Players.PlayerAdded:Connect(function(plr)
RegisterItems(plr)
plr.CharacterAdded:Connect(function()
UpdateItems(plr)
end)
end)
game.ReplicatedStorage.ItemStatusUpdated.OnServerEvent:Connect(function(plr,item)
OwnedItems = script:FindFirstChild(plr.Name):GetChildren()
for i, v in pairs(OwnedItems) do
if v.Name == item then
v.Value = not v.Value
end
end
end)
game.ReplicatedStorage.RequestToolStatus.OnServerInvoke = function(plr)
local EnabledItems = {}
OwnedItems = script:FindFirstChild(plr.Name):GetChildren()
for i, v in pairs(OwnedItems) do
EnabledItems[v.Name] = v.Value
end
return EnabledItems
end
When ran, it is sort of random on how the items are given. Sometimes they are given in a different order, but 90 percent of the time, most if not all are not given whatsoever, although the print values remain the same every test. While I have figured out how to fix the issue with the UpdateItems function (It gives the BoolValues, not the items), I can't seem to figure out why the RegisterItems function is not giving the player the items here, because as I've said before, they give some or none of the items (And when checked in the backpack of the client and the server, it is no different than what was displayed as given to the client.).
Any help is appreciated :)
