mirror of
https://gitlab.com/YuukiPS/GSServer-CBT.git
synced 2025-02-04 19:29:23 +03:00
405 lines
10 KiB
Lua
405 lines
10 KiB
Lua
|
----------------------
|
|||
|
-- 这是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
|