| |
|
| |
|
| | local Players = game:GetService("Players")
|
| | local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
| |
|
| | local QuestConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("QuestConfig"))
|
| | local QuestUpdateEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("QuestUpdateEvent")
|
| | local NotificationEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("NotificationEvent")
|
| |
|
| |
|
| | local playerQuests = {}
|
| |
|
| | local function initPlayerQuests(player)
|
| | playerQuests[player.UserId] = {}
|
| |
|
| |
|
| | for _, questId in ipairs(QuestConfig.StarterQuests) do
|
| | playerQuests[player.UserId][questId] = {
|
| | progress = 0,
|
| | completed = false,
|
| | }
|
| | end
|
| |
|
| |
|
| | task.delay(4, function()
|
| | if player.Parent then
|
| | QuestUpdateEvent:FireClient(player, "Init", playerQuests[player.UserId])
|
| | end
|
| | end)
|
| | end
|
| |
|
| | local function isQuestActive(player, questId)
|
| | local quests = playerQuests[player.UserId]
|
| | if not quests then return false end
|
| | local quest = quests[questId]
|
| | if not quest then return false end
|
| | return not quest.completed
|
| | end
|
| |
|
| | local function progressQuest(player, questType, amount)
|
| | local quests = playerQuests[player.UserId]
|
| | if not quests then return end
|
| |
|
| | for questId, questState in pairs(quests) do
|
| | if questState.completed then continue end
|
| |
|
| | local questDef = QuestConfig.Quests[questId]
|
| | if not questDef then continue end
|
| |
|
| | if questDef.Type == questType then
|
| | questState.progress = questState.progress + amount
|
| |
|
| | if questState.progress >= questDef.Target then
|
| | questState.progress = questDef.Target
|
| | questState.completed = true
|
| |
|
| |
|
| | if questDef.Reward.Cash then
|
| | local leaderstats = player:FindFirstChild("leaderstats")
|
| | if leaderstats then
|
| | local cash = leaderstats:FindFirstChild("Cash")
|
| | if cash then
|
| | cash.Value = cash.Value + questDef.Reward.Cash
|
| | end
|
| | end
|
| | end
|
| |
|
| | NotificationEvent:FireClient(player, "Quest Complete", questDef.Title .. " completed! +" .. tostring(questDef.Reward.Cash or 0) .. " Cash")
|
| |
|
| |
|
| | unlockNextQuests(player, questId)
|
| | end
|
| |
|
| |
|
| | QuestUpdateEvent:FireClient(player, "Update", {
|
| | questId = questId,
|
| | progress = questState.progress,
|
| | target = questDef.Target,
|
| | completed = questState.completed,
|
| | })
|
| | end
|
| | end
|
| | end
|
| |
|
| | function unlockNextQuests(player, completedQuestId)
|
| |
|
| | local unlockMap = {
|
| | ChopFirstTree = {"Chop10Trees"},
|
| | Chop10Trees = {"Chop50Trees"},
|
| | Chop50Trees = {"Chop200Trees"},
|
| | SellFirstWood = {"Earn5000"},
|
| | Earn5000 = {"Earn50000"},
|
| | BuildFirstStructure = {"Build10Structures"},
|
| | BuyFirstItem = {"ProcessFirstPlank"},
|
| | ProcessFirstPlank = {"ExploreAllBiomes"},
|
| | }
|
| |
|
| | local nextQuests = unlockMap[completedQuestId]
|
| | if nextQuests then
|
| | for _, nextId in ipairs(nextQuests) do
|
| | if not playerQuests[player.UserId][nextId] then
|
| | playerQuests[player.UserId][nextId] = {
|
| | progress = 0,
|
| | completed = false,
|
| | }
|
| |
|
| | local questDef = QuestConfig.Quests[nextId]
|
| | if questDef then
|
| | NotificationEvent:FireClient(player, "New Quest", "New quest unlocked: " .. questDef.Title)
|
| | end
|
| | end
|
| | end
|
| | end
|
| | end
|
| |
|
| |
|
| | _G.ProgressQuest = function(player, questType, amount)
|
| | progressQuest(player, questType, amount or 1)
|
| | end
|
| |
|
| | _G.GetPlayerQuests = function(player)
|
| | return playerQuests[player.UserId]
|
| | end
|
| |
|
| | Players.PlayerAdded:Connect(initPlayerQuests)
|
| | Players.PlayerRemoving:Connect(function(player)
|
| | playerQuests[player.UserId] = nil
|
| | end)
|
| |
|
| |
|
| | for _, player in ipairs(Players:GetPlayers()) do
|
| | task.spawn(function()
|
| | initPlayerQuests(player)
|
| | end)
|
| | end
|
| |
|