GSServer-CBT/soggy_resources/lua/Actor/Quest/QuestActorProxy.lua

405 lines
10 KiB
Lua
Raw Permalink Normal View History

2022-11-21 11:30:31 +03:00
----------------------
-- 这是Lua端QuestActor的基类包含了控制Quest阶段的方法。继承自BaseActorProxy
-- @classmod QuestActorProxy
require('Actor/ActorCommon')
local baseActorProxy = require('Actor/BaseActorProxy')
local QuestActorProxy = class("QuestActorProxy", baseActorProxy)
QuestActorProxy.actorType = ActorType.QUEST_ACTOR
--- QuestActor描述的主任务的ID
QuestActorProxy.mainQuestID = 0
QuestActorProxy.shareData = nil
QuestActorProxy.clientData = nil
QuestActorProxy.subStartHandlers = nil
QuestActorProxy.subFinishHandlers = nil
local this = nil
local super = nil
local uActor = nil
function QuestActorProxy:OnDataLoad()
local sharePath = "Quest/Share/Q" .. tostring(self.mainQuestID) .. "ShareConfig"
main_id = self.mainQuestID
sub_ids = {}
rewind_data = {}
quest_data = {}
util.do_require(sharePath)
self.shareData =
{
SubIds = sub_ids,
RewindData = rewind_data,
QuestData = quest_data,
GetRewindData = function(self, questID)
return self.RewindData[tostring(questID)]
end,
GetQuestData = function(self, questID)
return self.QuestData[tostring(questID)]
end,
}
local clientPath = "Quest/Client/Q" .. tostring(self.mainQuestID) .. "ClientConfig"
self.clientData = require(clientPath)
util.unrequire(sharePath)
util.unrequire(clientPath)
main_id = nil
sub_ids = nil
rewind_data = nil
quest_data = nil
end
function QuestActorProxy:OnHandlerBuild()
self:OnSubStartHandlerBuild()
self:OnSubFinishHandlerBuild()
end
function QuestActorProxy:OnSubStartHandlerBuild()
self.subStartHandlers = {}
end
function QuestActorProxy:OnSubFinishHandlerBuild()
self.subFinishHandlers = {}
end
--- Sub Start Handlers Begin
--- Sub Start Handlers End
function QuestActorProxy:OnPreInit()
this = self
super = self.__super
end
function QuestActorProxy:OnPostInit()
uActor = self.uActor
if uActor ~= nil then
uActor:TryStartActor()
end
end
function QuestActorProxy:OnInit(alias)
self.alias = alias
local uActor = self:CreateUActor(alias)
self.uActor = uActor
self:Register()
end
-- local param begin
-- local param end
function QuestActorProxy:CreateUActor(alias)
local uActor = actorUtils.CreateActor(self, ActorType.QUEST_ACTOR, alias)
uActor = actorUtils.CreateQuestActor(self.mainQuestID, uActor)
return uActor
end
--- QuestActor当主任务开始时的回调
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnMainStart(quest)
print("main start " .. tostring(quest.QuestMainId))
end
--- QuestActor当子任务开始时的回调
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnSubStart(quest)
local questID = tostring(quest.QuestId)
print("sub start " .. questID)
if self.subStartHandlers == nil then
return
end
local handler = self.subStartHandlers[questID]
if handler ~= nil then
handler(self, quest)
end
end
--- QuestActor当子任务结束时的回调
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnSubFinished(quest)
local questID = tostring(quest.QuestId)
print("sub finished " .. questID)
if self.subFinishHandlers == nil then
end
local handler = self.subFinishHandlers[questID]
if handler ~= nil then
handler(self, quest)
end
end
--- QuestActor当主任务结束时的回调
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnMainFinished(quest)
print("main finished " .. tostring(quest.QuestMainId))
end
--- QuestActor当子任务失败时候的回调
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnSubFailed(quest)
print("sub failed " .. tostring(quest.QuestId))
end
--- QuestActor主任务回溯
-- @tparam QuestProxy quest c#端quest的对象
function QuestActorProxy:OnRewind(quest)
print("quest rewind " .. tostring(quest.QuestId) .. tostring(quest.state))
self:DoRewind(self.shareData:GetRewindData(quest.QuestId))
end
function QuestActorProxy:OnSoftRewind(quest)
print("quest soft rewind " .. tostring(quest.QuestId) .. tostring(quest.state))
return self:DoSoftRewind(self.shareData:GetRewindData(quest.QuestId))
end
function QuestActorProxy:DoRewind(rewindData)
print(rewindData)
if rewindData == nil then
return
end
--self:DoRewindAvatar(rewindData.avatar, false)
self:DoRewindNpc(rewindData.npcs)
self:DoRewindGadget(rewindData.gadgets)
self:DoRewindItem(rewindData.items)
end
function QuestActorProxy:DoSoftRewind(rewindData)
print(rewindData)
if rewindData == nil then
return
end
return false--self:DoRewindNpc(rewindData.npcs, true)
end
function QuestActorProxy:DoRewindAvatar(avatarRewindData, sceneCheck)
if avatarRewindData == nil then
return false
end
if sceneCheck == nil then
sceneCheck = true
end
local sceneID = avatarRewindData.scene_id
if sceneID == nil then
sceneID = sceneData.DefaultSceneID
end
if sceneCheck and sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
return false
end
local dummyPoint = sceneData:GetDummyPoint(sceneID, avatarRewindData.pos)
if dummyPoint == nil then
return
end
this:TransmitPlayer(0,dummyPoint.pos, dummyPoint.rot)
-- actorUtils.SetAvatarPos(dummyPoint.pos)
-- actorUtils.SetAvatarEuler(dummyPoint.rot)
actorUtils.SyncAvatarMotion()
return true
end
function QuestActorProxy:DoRewindNpc(npcRewindList, sceneCheck)
if npcRewindList == nil then
return false
end
if sceneCheck == nil then
sceneCheck = false
end
local needRewind = false
for i = 1 , #npcRewindList do
local npcRewindData = npcRewindList[i]
if npcRewindData ~= nil then
if npcRewindData.alias ~= nil then
print("Lua want to create npc " .. npcRewindData.alias)
else
print("Lua want to create npc " .. npcRewindData.id)
end
local sceneID = npcRewindData.scene_id
if sceneID == nil then
sceneID = sceneData.DefaultSceneID
end
repeat
if sceneCheck and sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
break
end
local data = actorData:GetByNpcRewindData(npcRewindData)
if data ~= nil then
actorMgr:CreateActorWithData(data)
end
needRewind = true
until true
end
end
return needRewind
end
function QuestActorProxy:DoRewindGadget(gadgetRewindList, sceneCheck)
if gadgetRewindList == nil then
return
end
if sceneCheck == nil then
sceneCheck = false
end
local needRewind = false
for i = 1, #gadgetRewindList do
local gadgetRewindData = gadgetRewindList[i]
if gadgetRewindData ~= nil then
if gadgetRewindData.alias ~= nil then
print("Lua want to create gadget " .. gadgetRewindData.alias)
else
print("Lua want to create gadget " .. gadgetRewindData.id)
end
local sceneID = gadgetRewindData.scene_id
if sceneID == nil then
sceneID = sceneData.DefaultSceneID
end
repeat
if sceneCheck and sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
break
end
local dummyPoint = sceneData:GetDummyPoint(sceneID, gadgetRewindData.pos)
if dummyPoint == nil then
print("Dummy Point " .. gadgetRewindData.pos .. " is nil")
break
end
if gadgetRewindData.script ~= nil then
local data = actorData:GetByGadgetRewindData(gadgetRewindData)
if data ~= nil then
actorMgr:CreateActorWithData(data)
end
else
self:SpawnGadget(gadgetRewindData.id, dummyPoint.pos, dummyPoint.rot, gadgetRewindData.alias, sceneID)
end
needRewind = true
until true
end
end
end
function QuestActorProxy:DoRewindItem(itemRewindList, sceneCheck)
if itemRewindList == nil then
return
end
if sceneCheck == nil then
sceneCheck = false
end
local needRewind = false
for i = 1 , #itemRewindList do
local itemRewindData = itemRewindList[i]
if itemRewindData ~= nil then
if itemRewindData.alias ~= nil then
print("Lua want to create item " .. itemRewindData.alias)
else
print("Lua want to create item " .. itemRewindData.id)
end
local sceneID = itemRewindData.scene_id
if sceneID == nil then
sceneID = sceneData.DefaultSceneID
end
repeat
if sceneCheck and sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
break
end
local dummyPoint = sceneData:GetDummyPoint(sceneID, itemRewindData.pos)
if dummyPoint == nil then
print("Dummy Point " .. itemRewindData.pos .. " is nil")
break
end
self:SpawnItem(itemRewindData.id, dummyPoint.pos, dummyPoint.rot.y, itemRewindData.alias, sceneID)
needRewind = true
until true
end
end
end
--- QuestActor结束一个子任务
-- @tparam bool isFailed 是否失败
-- @tparam QuestProxy quest c#端quest的对象如果quest为nil则结束当前任务
function QuestActorProxy:FinishQuest(isFailed, quest)
self.uActor:TryFinishCurrQuest(isFailed, quest)
end
--- QuestActor结束一个子任务
-- @tparam bool isFailed 是否失败
-- @tparam uint questId 想要结束的questId
function QuestActorProxy:FinishQuestID(isFailed, questId)
self.uActor:TryFinishCurrQuestID(isFailed, questId)
end
--- QuestActor结束一个子任务
-- @tparam bool isFailed 是否失败
-- @tparam QuestProxy quest c#端quest的对象如果quest为nil则结束当前任务
function QuestActorProxy:UnFinishQuest(isFailed, quest)
self.uActor:TryUnFinishCurrQuest(isFailed, quest)
end
QuestActorProxy.TaskOnPauseReminder = 1001
QuestActorProxy.TaskOnResumeReminder = 1002
function QuestActorProxy:Register()
self.uActor:StartQuest('+', self.OnMainStart)
self.uActor:StartSubQuest('+', self.OnSubStart)
self.uActor:FinishSubQuest('+', self.OnSubFinished)
self.uActor:FinishQuest('+', self.OnMainFinished)
self.uActor:FailedSubQuest('+', self.OnSubFailed)
self.uActor:RewindQuest('+', self.OnRewind)
self.uActor:RegisterSoftRewindQuest(self.OnSoftRewind)
self:RegisterTaskCB()
end
function QuestActorProxy:Start()
print("here quest start")
end
function QuestActorProxy:Destroy(isActorOnly)
self:UnregisterTaskCB()
self.uActor:StartQuest('-', self.OnMainStart)
self.uActor:StartSubQuest('-', self.OnSubStart)
self.uActor:FinishSubQuest('-', self.OnSubFinished)
self.uActor:FinishQuest('-', self.OnMainFinished)
self.uActor:FailedSubQuest('-', self.OnSubFailed)
self.uActor:RewindQuest('-', self.OnRewind)
self.uActor:UnregisterSoftRewindQuest(self.OnSoftRewind)
self:OnDestroy()
QuestActorProxy.DestroyActor(self.uActor, isActorOnly)
self.uActor = nil
self.shareData = nil
self.clientData = nil
self.mainQuestID = nil
self.subStartHandlers = nil
self.subFinishHandlers = nil
end
--Method
--Method End
return QuestActorProxy