local BuffActionBase = require('Script.Global.BuffSystem.BuffActionBase') local BuffAction_RespiratoryRecovery = setmetatable( { -- Param --------------------------- -- 每秒恢复量 ReplyPerSecond = 10.; -- 受击延迟恢复 WaitAddHealthTime = 3.; -- Param End ----------------------- -- 恢复频率 AddHealthFrequency = 10; UpdateAddTime = 0; }, { __index = BuffActionBase, __metatable = BuffActionBase } ); function BuffAction_RespiratoryRecovery:LuaDoAction() BuffActionBase.LuaDoAction(self) if not UGCGameSystem.IsServer() then return true end UGCLogSystem.Log("[BuffAction_RespiratoryRecovery_LuaDoAction]Params:%s, %s", self.ReplyPerSecond, self.WaitAddHealthTime) -- 绑定Event传入的self可能有点问题,需要与存储OwnerPawn才能获取到正确的OwnerPawn UGCEventSystem.AddListener(EventEnum.PlayerInjuryInfo, self.PlayerInjuryInfo, self) -- 启用Tick self:EnableTick() end function BuffAction_RespiratoryRecovery:LuaUndoAction() BuffActionBase.LuaUndoAction(self) if not UGCGameSystem.IsServer() then return true end UGCLogSystem.Log("[BuffAction_RespiratoryRecovery_LuaUndoAction]") UGCEventSystem.RemoveListener(EventEnum.PlayerInjuryInfo, self.PlayerInjuryInfo, self) end function BuffAction_RespiratoryRecovery:LuaUpdateAction(DeltaSeconds) BuffActionBase.LuaUpdateAction(self, DeltaSeconds) if not UGCGameSystem.IsServer() then return true end self.UpdateAddTime = self.UpdateAddTime + DeltaSeconds if self.UpdateAddTime >= (1. / self.AddHealthFrequency) then self.UpdateAddTime = self.UpdateAddTime - 1. / self.AddHealthFrequency self:AddPlayerHealth() end return true end function BuffAction_RespiratoryRecovery:PlayerInjuryInfo(VictimKey) if UE.IsValid(self:GetOwnerPawn()) and self:GetOwnerPawn():IsAlive() then if VictimKey == self:GetOwnerPawn().PlayerKey then self.PlayerVictimTime = UGCSystemLibrary.GetGameTime() UGCLogSystem.Log("[BuffAction_RespiratoryRecovery_PlayerInjuryInfo] Succeed") end end end function BuffAction_RespiratoryRecovery:AddPlayerHealth() local NowTime = UGCSystemLibrary.GetGameTime() if UE.IsValid(self:GetOwnerPawn()) and self:GetOwnerPawn():IsAlive() and (self.PlayerVictimTime == nil or (NowTime - self.PlayerVictimTime >= self.WaitAddHealthTime)) then UGCPawnAttrSystem.SetHealth(self:GetOwnerPawn(), UGCPawnAttrSystem.GetHealth(self:GetOwnerPawn()) + self.ReplyPerSecond / self.AddHealthFrequency) end end return BuffAction_RespiratoryRecovery;