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