I made a little quest system for my simulator game I'm making but I don't know if there is a way to make it better.
Script:
local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local HttpService = game:GetService("HttpService") local Remotes = ReplicatedStorage:WaitForChild("Remotes") local DataChanged = Remotes:WaitForChild("DataChanged") local Datastore2 = require(ReplicatedStorage:FindFirstChild("Datastore2")) local replicatedData = ReplicatedStorage:FindFirstChild("replicatedData") local Quests = require(ReplicatedStorage:WaitForChild("Quests")) local DataNum = ReplicatedStorage:WaitForChild("DataNum") function checkQuests(player, typ, data) -- Checks Quests local QuestData = Datastore2("Quest"..DataNum.Value, player) local InventoryData = Datastore2("Inventory"..DataNum.Value, player) local PetData = Datastore2("Pets"..DataNum.Value, player) local CoinData = Datastore2("Coins"..DataNum.Value, player) local DiamondData = Datastore2("Diamonds"..DataNum.Value,player) local playerQuestData = QuestData:Get({}) for QuestName,QuestTable in pairs(Quests) do if typ == "Inventory" then if (data[QuestTable.Food] and not playerQuestData[QuestName]) then if (data[QuestTable.Food] >= QuestTable.Amount) then local Reward = QuestTable.Reward local Type = Reward.Type local Value = Reward.Value local Amount = Reward.Amount QuestData:Update(function(currentData) currentData[QuestName] = true return currentData end) if Type == "Coins" then CoinData:Update(function(currentValue) currentValue = currentValue + Value return currentValue end) elseif Type == "Diamonds" then DiamondData:Update(function(currentAmount) currentAmount = currentAmount + Value return currentAmount end) elseif Type == "Inventory" then InventoryData:Update(function(currentDataTable) if currentDataTable[Value] then currentDataTable[Value] = currentDataTable[Value] + Amount else currentDataTable[Value] = Amount end end) elseif Type == "Pets" then PetData:Update(function(currentDataTable) if currentDataTable[Value] then currentDataTable[Value] = currentDataTable[Value] + Amount else currentDataTable[Value] = Amount end end) end end end elseif typ == "Coins" then if (data >= QuestTable.Amount) and (not playerQuestData[QuestName]) then end elseif typ == "Diamonds" then if (data >= QuestTable.Amount) and (not playerQuestData[QuestName]) then end elseif typ =="Pets" then end end end Players.PlayerAdded:Connect(function(player) local InventoryData = Datastore2("Inventory"..DataNum.Value, player) local PetData = Datastore2("Pets"..DataNum.Value, player) local CoinData = Datastore2("Coins"..DataNum.Value, player) local DiamondData = Datastore2("Diamonds"..DataNum.Value,player) local MaxBagData = Datastore2("MaxBag"..DataNum.Value, player) local playerInventory = InventoryData:Get({}) local playerPets = PetData:Get({}) local PlayerCoins = CoinData:Get(0) local playerDiamonds = DiamondData:Get(0) local MaxBagSize = MaxBagData:Get(10) local playerDataFolder = Instance.new("Folder") playerDataFolder.Name = player.UserId playerDataFolder.Parent = replicatedData local Inventory = Instance.new("StringValue") Inventory.Name = "Inventory" Inventory.Parent = playerDataFolder Inventory.Value = HttpService:JSONEncode(playerInventory) local Pets = Instance.new("StringValue") Pets.Name = "Pets" Pets.Parent = playerDataFolder Pets.Value = HttpService:JSONEncode(playerPets) local lb = Instance.new("Folder") lb.Name = "leaderstats" lb.Parent = player local Coins = Instance.new("NumberValue") Coins.Name = "Coins" Coins.Parent = lb Coins.Value = PlayerCoins local Diamonds = Instance.new("NumberValue") Diamonds.Name = "Diamonds" Diamonds.Parent = lb Diamonds.Value = playerDiamonds DiamondData:OnUpdate(function(currentAmount) Diamonds.Value = currentAmount DataChanged:FireClient(player, "Diamonds", currentAmount) end) CoinData:OnUpdate(function(currentAmount) Coins.Value = currentAmount DataChanged:FireClient(player, "Coins", currentAmount) end) PetData:OnUpdate(function(DecodedData) Pets.Value = HttpService:JSONEncode(DecodedData) DataChanged:FireClient(player, "Pets", DecodedData) end) InventoryData:OnUpdate(function(DecodedData) Inventory.Value = HttpService:JSONEncode(DecodedData) checkQuests(player, "Inventory", DecodedData) DataChanged:FireClient(player, "Inventory", DecodedData) end) MaxBagData:OnUpdate(function(currentAmount) end) end) Players.PlayerRemoving:Connect(function(player) local playerData = replicatedData:FindFirstChild(player.UserId) local InventoryData = Datastore2("Inventory", player) local PetData = Datastore2("Pets", player) local CoinData = Datastore2("Coins", player) local DiamondData = Datastore2("Diamonds",player) InventoryData:Save() PetData:Save() CoinData:Save() DiamondData:Save() if (playerData) then playerData:Destroy() end end)
Quest Module:
local replicatedStorage = game:GetService("ReplicatedStorage") local Datastore2 = replicatedStorage:WaitForChild("Datastore2") local DataNum = replicatedStorage:WaitForChild("DataNum") local Quests = { ["Apple Lover"] = { Food = "Apple", Amount = 5, Reward = { Type = "Diamonds", Value = 5, Amount = nil, } }, ["Banana Peels"] = { Food = "Banana", Amount = 10, Reward = { Type = "Inventory", Value = "Pineapple", Amount = 8, } }, } return Quests