206 lines
5.8 KiB
Lua
206 lines
5.8 KiB
Lua
|
---@class BP_BuffController_C:AActor
|
|||
|
---@field DefaultSceneRoot USceneComponent
|
|||
|
---@field PlayerBuffs table<int32, table<int32, BuffItem>> <PlayerKey = { [BuffId = BuffItem]}> 所有玩家拥有的 Buff
|
|||
|
---@field GlobalBuffIndex int32
|
|||
|
|
|||
|
--Edit Below--
|
|||
|
---@type BP_BuffController_C
|
|||
|
local BP_BuffController = {
|
|||
|
-- 玩家拥有的Buff
|
|||
|
PlayerBuffs = {};
|
|||
|
|
|||
|
-- Buff 添加的 Index
|
|||
|
GlobalBuffIndex = 0;
|
|||
|
};
|
|||
|
|
|||
|
BP_BuffController.ControllerInst = nil;
|
|||
|
|
|||
|
function BP_BuffController:ReceiveBeginPlay()
|
|||
|
self.SuperClass.ReceiveBeginPlay(self);
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController.GetBuffController()
|
|||
|
if BP_BuffController.ControllerInst == nil then
|
|||
|
local AllActor = GameplayStatics.GetAllActorsOfClass(UGCGameSystem.GameState, BP_BuffController.GetSelfClass(), {})
|
|||
|
if AllActor:Num() > 0 then
|
|||
|
BP_BuffController.ControllerInst = AllActor[0];
|
|||
|
else
|
|||
|
BP_BuffController.ControllerInst = ScriptGameplayStatics.SpawnActor(UGCGameSystem.GameState, BP_BuffController.GetManagerClass(),
|
|||
|
VectorHelper.VectorZero(),
|
|||
|
VectorHelper.RotZero(),
|
|||
|
VectorHelper.ScaleOne());
|
|||
|
end
|
|||
|
end
|
|||
|
return BP_BuffController.ControllerInst;
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController:ReceiveTick(DeltaTime)
|
|||
|
self.SuperClass.ReceiveTick(self, DeltaTime);
|
|||
|
|
|||
|
self:TickBuff(DeltaTime);
|
|||
|
|
|||
|
if self:HasAuthority() then
|
|||
|
--- 移除时间到了的 Buff
|
|||
|
local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self);
|
|||
|
local RemoveBuffs = {};
|
|||
|
for PlayerKey, Buffs in pairs(self.PlayerBuffs) do
|
|||
|
for BuffId, BuffItem in pairs(Buffs) do
|
|||
|
if BuffItem.ContinueTime > 0 then
|
|||
|
for BuffIndex, SingleItem in pairs(BuffItem.Items) do
|
|||
|
if SingleItem.EndTime <= ServerTime then
|
|||
|
RemoveBuffs[#RemoveBuffs + 1] = {
|
|||
|
PlayerKey = PlayerKey,
|
|||
|
BuffId = BuffId,
|
|||
|
RemoveIndex = BuffIndex, -- 这个index是 GlobalBuffIndex
|
|||
|
};
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
for i = 1, #RemoveBuffs do
|
|||
|
self:RemoveBuff(RemoveBuffs[i].PlayerKey, RemoveBuffs[i].BuffId, RemoveBuffs[i].RemoveIndex);
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--[[
|
|||
|
function BP_BuffController:ReceiveEndPlay()
|
|||
|
self.SuperClass.ReceiveEndPlay(self);
|
|||
|
end
|
|||
|
--]]
|
|||
|
|
|||
|
function BP_BuffController:GetReplicatedProperties()
|
|||
|
return "PlayerBuffs"
|
|||
|
end
|
|||
|
|
|||
|
--[[
|
|||
|
function BP_BuffController:GetAvailableServerRPCs()
|
|||
|
return
|
|||
|
end
|
|||
|
--]]
|
|||
|
|
|||
|
--- 给玩家添加 Buff
|
|||
|
---@protected
|
|||
|
---@param InPlayerKey int32 玩家 Key
|
|||
|
---@param InBuffId int32 BuffType
|
|||
|
---@return
|
|||
|
function BP_BuffController:AddBuff(InPlayerKey, InBuffId, ...)
|
|||
|
local ActionInfo = BuffConfig.BuffActionInfo[InBuffId];
|
|||
|
if ActionInfo == nil then
|
|||
|
UGCLogSystem.Log("[BP_BuffController:AddBuff_Private] 不存在当前 BuffId: %d", InBuffId)
|
|||
|
return nil
|
|||
|
end
|
|||
|
local BuffInst = require(ActionInfo.Path);
|
|||
|
if BuffInst == nil then
|
|||
|
UGCLogSystem.LogError("[BP_BuffController:AddBuff_Private] 无法 require Buff[%d]:[%s]", InBuffId, ActionInfo.Path);
|
|||
|
return nil;
|
|||
|
end
|
|||
|
|
|||
|
-- 添加到表中
|
|||
|
if self.PlayerBuffs[InPlayerKey] == nil then
|
|||
|
self.PlayerBuffs[InPlayerKey] = {};
|
|||
|
end
|
|||
|
if self.PlayerBuffs[InPlayerKey][InBuffId] == nil then
|
|||
|
self.PlayerBuffs[InPlayerKey][InBuffId] = {};
|
|||
|
end
|
|||
|
|
|||
|
self.GlobalBuffIndex = self.GlobalBuffIndex + 1;
|
|||
|
local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self);
|
|||
|
|
|||
|
--- 检查一下是否需要冷却
|
|||
|
|
|||
|
-- 开启 Init
|
|||
|
table.func(BuffInst, "Init", InBuffId, InPlayerKey, ...)
|
|||
|
|
|||
|
-- 添加的瞬间就会执行一次
|
|||
|
table.func(BuffInst, "ApplyBuff", InBuffId, InPlayerKey, ...);
|
|||
|
|
|||
|
--- 将参数放到每一个 Inst里面
|
|||
|
BuffInst["Vars"] = {
|
|||
|
InBuffId,
|
|||
|
InPlayerKey,
|
|||
|
...
|
|||
|
};
|
|||
|
|
|||
|
-- 判断是否需要一添加就移除
|
|||
|
if BuffInst["bRunOnce"] ~= nil and BuffInst["bRunOnce"] == true then
|
|||
|
UGCLogSystem.Log("[BP_BuffController:AddBuff_Private] BuffId: %d 只执行一次", InBuffId)
|
|||
|
return BuffInst;
|
|||
|
end
|
|||
|
|
|||
|
local CooldownTime = BuffInst["CooldownTime"];
|
|||
|
if type(CooldownTime) ~= "number" then
|
|||
|
CooldownTime = 0;
|
|||
|
end
|
|||
|
|
|||
|
self.PlayerBuffs[InPlayerKey][InBuffId][self.GlobalBuffIndex] = {
|
|||
|
StartTime = ServerTime,
|
|||
|
Inst = BuffInst,
|
|||
|
PlayerKey = InPlayerKey,
|
|||
|
BuffId = InBuffId,
|
|||
|
EndTime = ServerTime + CooldownTime,
|
|||
|
};
|
|||
|
|
|||
|
return BuffInst;
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController:RemoveBuff(InPlayerKey, InBuffId, InBuffIndex)
|
|||
|
local BuffItem = self.PlayerBuffs[InPlayerKey][InBuffId][InBuffIndex];
|
|||
|
self:RemoveBuff(BuffItem.Inst);
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController:RemoveBuff(InBuffInst)
|
|||
|
-- 遍历所有
|
|||
|
for PlayerKey, Buffs in pairs(self.PlayerBuffs) do
|
|||
|
local RemoveBuffId = nil;
|
|||
|
for BuffId, BuffItem in pairs(Buffs) do
|
|||
|
local Index = nil;
|
|||
|
for BuffIndex, SingleItem in pairs(BuffItem.Items) do
|
|||
|
if SingleItem.Inst == InBuffInst then
|
|||
|
-- 移除当前的
|
|||
|
Index = BuffIndex;
|
|||
|
end
|
|||
|
end
|
|||
|
if Index ~= nil then
|
|||
|
table.func(BuffItem[Index].Inst, "RemoveBuff", table.unpackTable(BuffItem[Index].Inst.Vars))
|
|||
|
BuffItem[Index] = nil; -- 移除
|
|||
|
end
|
|||
|
|
|||
|
if table.isEmpty(BuffItem) then
|
|||
|
RemoveBuffId = BuffId;
|
|||
|
end
|
|||
|
end
|
|||
|
if RemoveBuffId ~= nil then
|
|||
|
Buffs[RemoveBuffId] = nil;
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
---@param InPlayerKey int32 要移除的玩家 Key
|
|||
|
function BP_BuffController:RemovePlayerBuff(InPlayerKey)
|
|||
|
for BuffId, BuffItem in pairs(self.PlayerBuffs[InPlayerKey]) do
|
|||
|
for BuffIndex, SingleItem in pairs(BuffItem.Items) do
|
|||
|
table.func(SingleItem.Inst, "RemoveBuff", table.unpackTable(SingleItem.Inst.Vars));
|
|||
|
end
|
|||
|
end
|
|||
|
self.PlayerBuffs[InPlayerKey] = {};
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController:TickBuff(InDeltaTime)
|
|||
|
if self:HasAuthority() then
|
|||
|
for PlayerKey, Buffs in pairs(self.PlayerBuffs) do
|
|||
|
for BuffId, BuffItem in pairs(Buffs) do
|
|||
|
for BuffIndex, SingleItem in pairs(BuffItem.Items) do
|
|||
|
table.func(SingleItem.Inst, "Tick", SingleItem.BuffId, SingleItem.PlayerKey, InDeltaTime);
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_BuffController.GetSelfClass()
|
|||
|
return UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/BUFF/BP_BuffController.BP_BuffController_C'));
|
|||
|
end
|
|||
|
|
|||
|
return BP_BuffController;
|