PluginManager = {}; local Dir = "Script.Global.Plugin."; ------------------------------------------- 初始化 ------------------------------------------- PluginManager.Config = {}; PluginManager.Owner = nil; PluginManager.Plugins = {}; function PluginManager:Init(InOwner) UGCLogSystem.Log("[PluginManager:Init] 执行") self.Config = require(Dir .. "PluginConfig") self.Owner = InOwner; for i, v in pairs(self.Config) do UGCLogSystem.Log("[PluginManager:Init] Script = %s", v.Script); local PluginItem = require(v.Script); --local Item = setmetatable({}, { __index = PluginItem, __metatable = PluginItem, }); local Item = PluginItem; if _G[v.Name] then UGCLogSystem.Log("[PluginManager:Init] 存在 %s 的模块,请改名", v.Name); assert(false); else _G[v.Name] = Item; end self.Plugins[v.Name] = Item; self.Owner[v.Name] = Item; Item.PluginName = v.Name; table.func(Item, "Init", InOwner); -- 注册 RPC --if not table.hasFunc("SendRPC") then -- Item["SendRPC"] = function(Self, InFuncName, ...) -- -- end --end end -- 输出 _G --UGCLogSystem.LogTree(string.format("[PluginManager:Init] _G ="), _G); --for i, v in pairs(self.Plugins) do -- UGCLogSystem.Log("[PluginManager:Init] PluginName = %s", v.PluginName); --end UGCLogSystem.Log("[PluginManager:Init] 执行成功") end ------------------------------------------- 注册函数 ------------------------------------------- function PluginManager:OnClientAlready() self:PluginManagerFunc_Internal("OnClientAlready"); end function PluginManager:OnMapLoadComplete() self:PluginManagerFunc_Internal("OnMapLoadComplete"); end ---@param InCenterIndex int32 ---@param InCenter BP_ActorStart_C function PluginManager:OnSelectMapCenter(InCenterIndex, InCenter) self:PluginManagerFunc_Internal("OnSelectMapCenter", InCenterIndex, InCenter); end function PluginManager:OnPlayerLogin(InPlayerKey) self:PluginManagerFunc_Internal("OnPlayerLogin", InPlayerKey); end function PluginManager:OnPlayerLeave(InPlayerKey) self:PluginManagerFunc_Internal("OnPlayerLeave", InPlayerKey); end function PluginManager:OnPawnInit(Pawn) self:PluginManagerFunc_Internal("OnPawnInit", Pawn); end function PluginManager:OnPlayerTakeDamage(DamagedActor, Damage, DamageType, EventInstigator) self:PluginManagerFunc_Internal("OnPlayerTakeDamage", DamagedActor, Damage, DamageType, EventInstigator); end function PluginManager:OnPlayerDead(DeadPlayerKey, KillerPlayerKey) self:PluginManagerFunc_Internal("OnPlayerDead", DeadPlayerKey, KillerPlayerKey); end function PluginManager:BPReceiveDamage(DamagedActor, Damage, DamageType, InstigatedBy, DamageCauser) self:PluginManagerFunc_Internal("BPReceiveDamage", DamagedActor, Damage, DamageType, InstigatedBy, DamageCauser); end function PluginManager:OnPlayerRespawn(InPlayerKey) self:PluginManagerFunc_Internal("OnPlayerRespawn", InPlayerKey); end function PluginManager:OnPlayerPossessed(Pawn, NewController) self:PluginManagerFunc_Internal("OnPlayerPossessed", Pawn, NewController); end function PluginManager:OnPlayerPickup(PlayerController, Target, ItemID, Count) self:PluginManagerFunc_Internal("OnPlayerPickup", PlayerController, Target, ItemID, Count); end function PluginManager:OnPlayerGetWeapon(InPawn, Weapon) self:PluginManagerFunc_Internal("OnPlayerGetWeapon", InPawn, Weapon); end function PluginManager:OnWeaponBulletHit(InPawn, ShootWeapon, Bullet, HitInfo) self:PluginManagerFunc_Internal("OnWeaponBulletHit", InPawn, ShootWeapon, Bullet, HitInfo); end function PluginManager:OnPlayerShoot(InPawn, ShootWeapon, BulletID) self:PluginManagerFunc_Internal("OnPlayerShoot", InPawn, ShootWeapon, BulletID); end function PluginManager:PluginManagerFunc_Internal(InFunc, ...) local RetVal = 0; for i, v in pairs(self.Plugins) do local Val = table.func(v, InFunc, ...); if Val ~= nil then RetVal = RetVal + Val; end end return RetVal; end function PluginManager:SendPluginRPC(InPluginName, InFuncName, ...) if IsServer then if self.Plugins[InPluginName] == nil then UGCLogSystem.Log("[PluginManager:SendPluginRPC] 无法查找到 %s 的插件,请检查", InPluginName); return ; end UnrealNetwork.CallUnrealRPC_Multicast(self.Owner, "ReceivePluginRPC", InPluginName, InFuncName, ...); else end end function PluginManager:Get(InPluginName) return self.Plugins[InPluginName]; end return PluginManager;