mirror of
https://gitlab.com/YuukiPS/GSServer-CBT.git
synced 2024-12-25 07:19:22 +03:00
497 lines
13 KiB
Lua
497 lines
13 KiB
Lua
----------------------
|
||
-- 这是Lua端ActorManager,包含了创建和管理Actor的方法,可通关全局唯一的引用actorMgr访问
|
||
-- @module ActorManager
|
||
local ActorManager = {}
|
||
|
||
ActorManager.ActorDic = {}
|
||
ActorManager.Alias2EntityIDDic = {}
|
||
|
||
ActorManager.dummyActor = require('Actor/DummyActorProxy')
|
||
ActorManager.tempDefaultAlias = "Temp"
|
||
|
||
ActorManager.OnTest1 = function()
|
||
print("Test1")
|
||
actorMgr:CreateActor(actorMgr, "test", "Actor/Npc/Npc001Test")
|
||
end
|
||
|
||
ActorManager.OnTest2 = function()
|
||
print("Test2")
|
||
local actor = actorMgr:GetActor("test")
|
||
if actor ~= nil then
|
||
actor:Test()
|
||
end
|
||
end
|
||
|
||
ActorManager.OnTest3 = function()
|
||
print("Test3")
|
||
end
|
||
|
||
ActorManager.InitGlobal = function()
|
||
print("Actor Manager Init")
|
||
globalActor = actorMgr:CreateActor("global", "Actor/GlobalActorProxy")
|
||
end
|
||
|
||
ActorManager.InitSubGlobal = function()
|
||
for i = 1, #globalCfg.initSubActors do
|
||
local subGActorCfg = globalCfg.initSubActors[i]
|
||
if subGActorCfg ~= nil and subGActorCfg.alias ~= nil and subGActorCfg.metaPath ~= nil then
|
||
actorMgr:CreateActor(subGActorCfg.alias, subGActorCfg.metaPath)
|
||
end
|
||
end
|
||
for i = 1, #globalCfg.initAddSubActors do
|
||
local subGActorCfg = globalCfg.initAddSubActors[i]
|
||
if subGActorCfg ~= nil and subGActorCfg.alias ~= nil and subGActorCfg.metaPath ~= nil then
|
||
actorMgr:CreateActor(subGActorCfg.alias, subGActorCfg.metaPath)
|
||
end
|
||
end
|
||
end
|
||
|
||
ActorManager.RegisteSubGlobal = function(self, inputAlias, inputPath)
|
||
for i = 1, #globalCfg.initAddSubActors do
|
||
local subGActorCfg = globalCfg.initAddSubActors[i]
|
||
if subGActorCfg ~= nil and subGActorCfg.alias == inputAlias then
|
||
return
|
||
end
|
||
end
|
||
local subGActorCfg = {
|
||
alias = inputAlias,
|
||
metaPath = inputPath,
|
||
}
|
||
globalCfg.initAddSubActors[#globalCfg.initAddSubActors + 1] = subGActorCfg
|
||
if subGActorCfg ~= nil and subGActorCfg.alias ~= nil and subGActorCfg.metaPath ~= nil then
|
||
actorMgr:CreateActor(subGActorCfg.alias, subGActorCfg.metaPath)
|
||
end
|
||
end
|
||
|
||
ActorManager.UnregisteSubGlobal = function(self, alias)
|
||
for i = 1, #globalCfg.initAddSubActors do
|
||
local subGActorCfg = globalCfg.initAddSubActors[i]
|
||
if subGActorCfg ~= nil and subGActorCfg.alias == alias then
|
||
globalCfg.initAddSubActors[i] = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
--- actorMgr 创建一个Actor,一般actor已有在c#端的核心实例
|
||
-- @param self ActorManager实例本身
|
||
-- @tparam string alias 指定的别名
|
||
-- @tparam string metaPath 脚本路径
|
||
-- @tparam bool isAutoStart 是否自动开始
|
||
ActorManager.CreateActor = function(self, alias, metaPath, isAutoStart)
|
||
print("create actor called " .. tostring(alias))
|
||
print(tostring(metaPath))
|
||
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
|
||
if actor == nil then
|
||
local metaActor = require(metaPath)
|
||
actor = metaActor:new()
|
||
actor.metaPath = metaPath
|
||
actor:OnPreInit()
|
||
if alias == nil or alias == '' then
|
||
alias = actor.defaultAlias
|
||
end
|
||
ActorManager.ActorDic[alias] = actor
|
||
actor:OnInit(alias)
|
||
actor:OnPostInit()
|
||
end
|
||
|
||
if isAutoStart == nil then
|
||
isAutoStart = true
|
||
end
|
||
|
||
if isAutoStart then
|
||
actor:Start()
|
||
end
|
||
|
||
return actor
|
||
end
|
||
--- actorMgr 创建一个Actor,包含出身点,一般用于创建EntityActor
|
||
-- @param self ActorManager实例本身
|
||
-- @tparam string alias 指定的别名
|
||
-- @tparam string metaPath 脚本路径
|
||
-- @tparam uint configID 配置ID
|
||
-- @tparam uint dataIndex 数据索引
|
||
-- @tparam Vector3 bornPos 出生点
|
||
-- @tparam Vector3 bornDir 出生朝向(euler
|
||
-- @tparam bool isNetwork 是否服务器参与,一般用于需要移动很远、任务交互等的NPC
|
||
-- @tparam bool isAutoStart 是否自动开始
|
||
-- @tparam uint sceneID 场景ID,默认大世界3
|
||
ActorManager.CreateActorWithPos = function(self, alias, metaPath, configID, dataIndex, bornPos, bornDir,
|
||
isNetwork, isAutoStart, sceneID, noPerform, roomID)
|
||
if sceneID == nil then
|
||
sceneID = sceneData.DefaultSceneID
|
||
end
|
||
|
||
if roomID == nil then
|
||
if sceneID == 3 then
|
||
roomID = 0
|
||
else roomID = 1
|
||
end
|
||
end
|
||
|
||
if sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
|
||
if isNetwork and sceneData.currSceneID ~= -1 then
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
local metaActor = require(metaPath)
|
||
actorUtils.NotifyActorCreate(metaActor.actorType, alias, metaPath, configID, bornPos, bornDir,
|
||
sceneID, roomID)
|
||
end
|
||
self.dummyActor.alias = alias
|
||
return self.dummyActor
|
||
end
|
||
|
||
if noPerform == nil then
|
||
noPerform = true
|
||
end
|
||
|
||
print("create actor called " .. tostring(alias))
|
||
print(tostring(metaPath))
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
if actor ~= nil and actor:IsValid() ~= true then
|
||
ActorManager.ClearActor(self, alias)
|
||
actor = nil
|
||
end
|
||
|
||
if actor ~= nil then
|
||
if actor.defaultAlias == ActorManager.tempDefaultAlias then
|
||
local metaActor = require(metaPath)
|
||
if metaActor.defaultAlias ~= actor.defaultAlias then
|
||
ActorManager.ClearActor(self, alias)
|
||
actor = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
if actor == nil then
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
local metaActor = require(metaPath)
|
||
actor = metaActor:new()
|
||
actor.configID = configID
|
||
actor.dataIndex = dataIndex
|
||
actor.bornSceneID = sceneID
|
||
actor.bornRoomID = roomID
|
||
actor.bornPos = bornPos
|
||
actor.bornDir = bornDir
|
||
actor.isNetwork = isNetwork
|
||
actor.isAutoStart = true
|
||
actor.dontDestroyOnClear = false
|
||
if isAutoStart ~= nil then
|
||
actor.isAutoStart = isAutoStart
|
||
end
|
||
local preAlias = actor:PreGetAlias()
|
||
actor:OnPreInit()
|
||
if alias == nil or alias == '' then
|
||
if preAlias ~= nil then
|
||
alias = preAlias
|
||
else
|
||
alias = actor.defaultAlias
|
||
end
|
||
end
|
||
actor.alias = alias
|
||
actor.metaPath = metaPath
|
||
ActorManager.ActorDic[alias] = actor
|
||
actor:OnInit(alias)
|
||
if actor.uActor == nil then
|
||
ActorManager.ActorDic[alias] = nil
|
||
self.dummyActor.alias = alias
|
||
return self.dummyActor
|
||
else
|
||
actor:OnPostInit()
|
||
if actor.CheckShow ~= nil then
|
||
actor:CheckShow()
|
||
end
|
||
end
|
||
else
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
local metaActor = require(metaPath)
|
||
actor:ClearAllTask()
|
||
actor.bornSceneID = sceneID
|
||
actor.bornRoomID = roomID
|
||
if actor.SetPosAndTurnTo ~= nil then
|
||
actor:SetPosAndTurnTo(bornPos, M.Euler2DirXZ(bornDir), noPerform)
|
||
else
|
||
if actor.SetPos ~= nil then
|
||
actor:SetPos(bornPos, noPerform)
|
||
end
|
||
if actor.TurnTo ~= nil then
|
||
actor:TurnTo(M.Euler2DirXZ(bornDir))
|
||
end
|
||
end
|
||
if actor.CheckShow ~= nil then
|
||
actor:CheckShow()
|
||
end
|
||
actor:ClearActor()
|
||
if actor.SyncPos ~= nil then
|
||
actor:SyncPos(0)
|
||
actorUtils.NotifyActorCreateSoft(metaActor.actorType, alias, metaPath, configID, bornPos, bornDir,
|
||
sceneID, roomID)
|
||
end
|
||
if isAutoStart then
|
||
actor:Start()
|
||
end
|
||
end
|
||
return actor
|
||
end
|
||
--- actorMgr 通过ActorInfoData创建一个Actor
|
||
-- @param self ActorManager实例本身
|
||
-- @tparam ActorInfoData data 创建Actor需要的数据
|
||
ActorManager.CreateActorWithData = function(self, data)
|
||
local sceneID = data.sceneID
|
||
if sceneID == -1 and sceneID == nil then
|
||
sceneID = sceneData.DefaultSceneID
|
||
end
|
||
local roomID = data.roomID
|
||
if roomID == nil then
|
||
roomID = 0
|
||
end
|
||
|
||
local alias = data.alias
|
||
local metaPath = data.metaPath
|
||
local configID = data.configID
|
||
local dataIndex = data.dataIndex
|
||
local bornPos = data.bornPos
|
||
local bornDir = data.bornEuler
|
||
local isNetwork = data.isNetwork
|
||
local isAutoStart = data.isAutoStart
|
||
local isCheckHide = data.checkHide
|
||
local dontDestroyOnClear = data.dontDestroyOnClear
|
||
|
||
if sceneID ~= sceneData.currSceneID and sceneData.currSceneID ~= 1001 then
|
||
if isNetwork and sceneData.currSceneID ~= -1 then
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
local metaActor = require(metaPath)
|
||
actorUtils.NotifyActorCreate(metaActor.actorType, alias, metaPath, configID, bornPos, bornDir,
|
||
sceneID, roomID)
|
||
end
|
||
self.dummyActor.alias = alias
|
||
return self.dummyActor
|
||
end
|
||
|
||
local noPerform = data.noPerform
|
||
if noPerform == nil then
|
||
noPerform = true
|
||
end
|
||
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
if actor ~= nil and actor:IsValid() ~= true then
|
||
ActorManager.ClearActor(self, alias)
|
||
actor = nil
|
||
end
|
||
|
||
if actor ~= nil then
|
||
if actor.defaultAlias == ActorManager.tempDefaultAlias then
|
||
local metaActor = require(metaPath)
|
||
if metaActor.defaultAlias ~= actor.defaultAlias then
|
||
ActorManager.ClearActor(self, alias)
|
||
actor = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
if actor == nil then
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
local metaActor = require(metaPath)
|
||
actor = metaActor:new()
|
||
actor.configID = configID
|
||
actor.dataIndex = dataIndex
|
||
actor.bornSceneID = sceneID
|
||
actor.bornRoomID = roomID
|
||
actor.bornPos = bornPos
|
||
actor.bornDir = bornDir
|
||
actor.isNetwork = isNetwork
|
||
actor.isAutoStart = true
|
||
actor.actorData = data
|
||
actor.dontDestroyOnClear = dontDestroyOnClear
|
||
if isAutoStart ~= nil then
|
||
actor.isAutoStart = isAutoStart
|
||
end
|
||
local preAlias = actor:PreGetAlias()
|
||
actor:OnPreInit()
|
||
if alias == nil or alias == '' then
|
||
if preAlias ~= nil then
|
||
alias = preAlias
|
||
else
|
||
alias = actor.defaultAlias
|
||
end
|
||
end
|
||
actor.alias = alias
|
||
actor.metaPath = metaPath
|
||
ActorManager.ActorDic[alias] = actor
|
||
actor:OnInit(alias)
|
||
if actor.uActor == nil then
|
||
ActorManager.ActorDic[alias] = nil
|
||
self.dummyActor.alias = alias
|
||
return self.dummyActor
|
||
else
|
||
actor:OnPostInit()
|
||
if not isCheckHide then
|
||
if actor.CheckShow ~= nil then
|
||
actor:CheckShow()
|
||
end
|
||
end
|
||
end
|
||
else
|
||
actorUtils.NotifyActorPreCreate(alias)
|
||
actor:ClearAllTask()
|
||
actor.bornSceneID = sceneID
|
||
actor.bornRoomID = roomID
|
||
if actor.SetPosAndTurnTo ~= nil then
|
||
actor:SetPosAndTurnTo(bornPos, M.Euler2DirXZ(bornDir), noPerform)
|
||
else
|
||
if actor.SetPos ~= nil then
|
||
actor:SetPos(bornPos, noPerform)
|
||
end
|
||
if actor.TurnTo ~= nil then
|
||
actor:TurnTo(M.Euler2DirXZ(bornDir))
|
||
end
|
||
end
|
||
if not isCheckHide then
|
||
if actor.CheckShow ~= nil then
|
||
actor:CheckShow()
|
||
end
|
||
end
|
||
actor:ClearActor()
|
||
if actor.SyncPos ~= nil then
|
||
actor:SyncPos(0)
|
||
end
|
||
if isAutoStart then
|
||
actor:Start()
|
||
end
|
||
end
|
||
return actor
|
||
end
|
||
|
||
--- actorMgr 创建一个QuestActor, 一般不需要主动调用
|
||
-- @param self ActorManager实例本身
|
||
-- @tparam string alias 指定的别名
|
||
-- @tparam string metaPath 脚本路径
|
||
-- @tparam uint mainID 主任务ID
|
||
ActorManager.CreateQuestActor = function(self, alias, metaPath, mainID)
|
||
print("create quest actor called " .. tostring(alias) .. " . " .. tostring(mainID))
|
||
print(tostring(metaPath))
|
||
local metaActor = require(metaPath)
|
||
local actor = metaActor:new()
|
||
actor.mainQuestID = mainID
|
||
actor.metaPath = metaPath
|
||
print(actor.mainQuestID)
|
||
actor:OnPreInit()
|
||
if alias == nil or alias == '' then
|
||
alias = tostring(mainID)
|
||
end
|
||
ActorManager.ActorDic[alias] = actor
|
||
actor:OnDataLoad()
|
||
actor:OnHandlerBuild()
|
||
actor:OnInit(alias)
|
||
actor:OnPostInit()
|
||
return actor
|
||
end
|
||
--- actorMgr 获取一个Actor
|
||
-- @tparam string alias Actor别名
|
||
ActorManager.GetActor = function(self, alias)
|
||
local actor = ActorManager.ActorDic[alias]
|
||
if actor == nil then
|
||
ActorManager.dummyActor.alias = alias
|
||
return ActorManager.dummyActor
|
||
end
|
||
return actor
|
||
end
|
||
|
||
--- actorMgr 销毁一个EntityActor
|
||
-- @param self ActorManager实例本身
|
||
-- @tparam string alias Actor别名
|
||
-- @tparam bool isActorOnly 只销毁Actor
|
||
ActorManager.DestroyEntityActor = function(self, alias, isActorOnly)
|
||
if isActorOnly == nil then
|
||
isActorOnly = false
|
||
end
|
||
|
||
local actor = self:GetActorInternal(alias)
|
||
if isActorOnly and actor == nil then
|
||
return
|
||
end
|
||
|
||
if actor ~= nil then
|
||
actor:Destroy(isActorOnly)
|
||
else
|
||
actorUtils.NotifyActorDestroy(alias)
|
||
end
|
||
end
|
||
|
||
ActorManager.GetActorInternal = function(self, alias)
|
||
local actor = ActorManager.ActorDic[alias]
|
||
return actor
|
||
end
|
||
|
||
ActorManager.ClearActor = function(self, alias)
|
||
ActorManager.ActorDic[alias] = nil
|
||
end
|
||
|
||
ActorManager.DestroyActor = function(self, alias, isActorOnly)
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
if actor ~= nil then
|
||
actor:Destroy(isActorOnly)
|
||
end
|
||
ActorManager.ActorDic[alias] = nil
|
||
end
|
||
|
||
ActorManager.DestroyActorMeta = function(self, alias)
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
if actor ~= nil then
|
||
local metaPath = actor.metaPath
|
||
actor:Destroy(false)
|
||
if metaPath ~= nil then
|
||
util.unrequire(metaPath)
|
||
end
|
||
end
|
||
ActorManager.ActorDic[alias] = nil
|
||
end
|
||
|
||
ActorManager.Destroy = function(self)
|
||
for alias, actor in pairs(ActorManager.ActorDic) do
|
||
local metaPath = nil
|
||
if actor ~= nil then
|
||
metaPath = actor.metaPath
|
||
end
|
||
ActorManager.DestroyActor(ActorManager, alias, false)
|
||
if metaPath ~= nil then
|
||
util.unrequire(metaPath)
|
||
end
|
||
end
|
||
end
|
||
|
||
ActorManager.DestroySoft = function(self)
|
||
for alias, actor in pairs(ActorManager.ActorDic) do
|
||
if actor ~= nil and not actor.dontDestroyOnClear then
|
||
local metaPath = nil
|
||
if actor ~= nil then
|
||
metaPath = actor.metaPath
|
||
end
|
||
ActorManager.DestroyActor(ActorManager, alias, false)
|
||
if metaPath ~= nil then
|
||
util.unrequire(metaPath)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
ActorManager.StartActor = function(self, alias)
|
||
local actor = ActorManager.GetActorInternal(self, alias)
|
||
if actor ~= nil then
|
||
actor:Start()
|
||
end
|
||
end
|
||
|
||
ActorManager.SetEntityHandler = function(self, alias, runtimeID)
|
||
ActorManager.Alias2EntityIDDic[alias] = runtimeID
|
||
end
|
||
|
||
ActorManager.GetEntityHandler = function(self, alias)
|
||
return ActorManager.Alias2EntityIDDic[alias]
|
||
end
|
||
|
||
ActorManager.DestroyEntityHandler = function(self, alias)
|
||
ActorManager.Alias2EntityIDDic[alias] = nil
|
||
end
|
||
|
||
return ActorManager |