From 8dc648db0e7fd16cf4c48a495e8530686c9b3648 Mon Sep 17 00:00:00 2001 From: prooheckcp <61127277+prooheckcp@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:54:39 +0100 Subject: [PATCH 1/2] Fixing bugs --- RoQuest/Client/init.lua | 8 ++++++- RoQuest/Server/init.lua | 48 ++++++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/RoQuest/Client/init.lua b/RoQuest/Client/init.lua index 30ea29e..255d373 100644 --- a/RoQuest/Client/init.lua +++ b/RoQuest/Client/init.lua @@ -539,6 +539,7 @@ function RoQuestClient:Init(lifeCycles: {QuestLifeCycle}?): () end) net:On("OnQuestStarted", function(questId: string, questProgress: QuestProgress?) + self:_OnQuestAvailable(questId) self:_OnQuestStarted(questId, questProgress) end) @@ -1013,6 +1014,11 @@ function RoQuestClient:_OnQuestObjectiveChanged(questId: string, objectiveId: st end local quest: Quest? = self:GetQuest(questId) + + if not quest then + return + end + quest:SetObjective(objectiveId, newAmount) end @@ -1244,7 +1250,7 @@ end @return boolean -- If it managed to give the quest to the player or not ]=] -function RoQuestClient:_GiveQuest(questId: string, questProgress: QuestProgress?): boolean +function RoQuestClient:_GiveQuest(questId: string, questProgress: QuestProgress?): boolean -- We also check if the quest is available because of repeatable quests if self:GetQuest(questId) and not self:CanGiveQuest(questId) then return false diff --git a/RoQuest/Server/init.lua b/RoQuest/Server/init.lua index ddf4bcf..ba0629f 100644 --- a/RoQuest/Server/init.lua +++ b/RoQuest/Server/init.lua @@ -1259,7 +1259,7 @@ function RoQuestServer:GiveQuest(player: Player, questId: string): boolean if not self:_GiveQuest(player, questId) then return false end - + self.OnQuestStarted:Fire(player, questId) return true @@ -1460,6 +1460,30 @@ function RoQuestServer:MakeQuestAvailable(player: Player, questId: string): () return end + local function searchQuestStatus(id: string) + if not self._RequiredQuestPointer[id] then + return false + end + + for pointerQuestId: string in self._RequiredQuestPointer[id] do + local pointerQuest: Quest? = self:GetQuest(player, pointerQuestId) + + if not pointerQuest or pointerQuest:GetCompleteCount() < quest:GetCompleteCount() then + return true + end + + if searchQuestStatus(pointerQuestId) then + return true + end + end + + return false + end + + if searchQuestStatus(questId) then + return + end + quest._CanRepeatQuest = true self:_NewPlayerAvailableQuest(player, questId) end @@ -1540,16 +1564,10 @@ function RoQuestServer:_QuestDelivered(player: Player, questId: string): () if not quest then return end - + self:_ChangeCompletedQuest(player, questId, nil) self:_ChangeDeliveredQuest(player, questId, quest:_GetQuestProgress()) - if self._RequiredQuestPointer[questId] then - for requiredQuestId: string in self._RequiredQuestPointer[questId] do - self:_NewPlayerAvailableQuest(player, requiredQuestId) - end - end - if quest.QuestRepeatableType == QuestRepeatableType.Infinite then self:MakeQuestAvailable(player, questId) elseif quest.QuestRepeatableType ~= QuestRepeatableType.Custom then @@ -1557,7 +1575,15 @@ function RoQuestServer:_QuestDelivered(player: Player, questId: string): () self._Troves[player]:Add(task.delay(timeForAvailable - quest:GetTimeSinceCompleted(), self.MakeQuestAvailable, self, player, questId)) end - self:_NewPlayerAvailableQuest(player, questId) + if self._RequiredQuestPointer[questId] then + for requiredQuestId: string in self._RequiredQuestPointer[questId] do + self:_NewPlayerAvailableQuest(player, requiredQuestId) + end + end + + for staticQuestId: string in self._StaticAvailableQuests do + self:MakeQuestAvailable(player, staticQuestId) + end end --[=[ @@ -1809,9 +1835,11 @@ function RoQuestServer:_GiveQuest(player: Player, questId: string, questProgress self:_ChangeAvailableState(player, questId, nil) self._Quests[player][questId] = questClone self:_ChangeDeliveredQuest(player, questId, nil) + if STATUS_CHANGED_REFERENCE[questClone:GetQuestStatus()] then self[STATUS_CHANGED_REFERENCE[questClone:GetQuestStatus()]](self, player, questId, questClone:_GetQuestProgress()) end + self._Troves[player]:Add(questClone) for _, lifeCycleName: string in questClone.LifeCycles do self:_CreateLifeCycle(player, questClone, lifeCycleName) @@ -1916,7 +1944,7 @@ function RoQuestServer:_NewPlayerAvailableQuest(player: Player, questId: string) if not quest then return end - + if not self:CanGiveQuest(player, questId) then if not self:_GetQuest(player, questId) then if not self._UnavailableQuests[player][questId] then From fcf9c91fca5e9ee5a564c97a9cdc3d6741a4bdea Mon Sep 17 00:00:00 2001 From: prooheckcp <61127277+prooheckcp@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:44:29 +0100 Subject: [PATCH 2/2] Up the version --- wally.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wally.toml b/wally.toml index 6df347b..ab4f25c 100644 --- a/wally.toml +++ b/wally.toml @@ -1,7 +1,7 @@ [package] name = "prooheckcp/roquest" description = "RoQuest is a sophisticated abstract implementation of a Quest System. Although it can self manage nearly everything it also allows for the developer to manually set and manage everything. API: prooheckcp.github.io/RoQuest/" -version = "0.1.1" +version = "0.1.2" license = "MIT" registry = "https://github.com/UpliftGames/wally-index" realm = "shared"