local Buff_RespiratoryRecovery = { AddHealthFrequency = 5; ReplyPerSecond = 10.; WaitAddHealthTime = 3.; UpdateAddTime = 0; }; -- Script.Blueprint.UGCBuffs.BuffAction.Buff_RespiratoryRecovery function Buff_RespiratoryRecovery:LuaDoAction() if not UGCGameSystem.IsServer() then return true end UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaDoAction]Params:%s, %s, %s", self.Params[1], self.Params[2], self.Params[3]) -- 初始化参数 self.AddHealthFrequency = tonumber(self.Params[1]); -- 恢复频率 self.ReplyPerSecond = tonumber(self.Params[2]); -- 每秒回复 self.WaitAddHealthTime = tonumber(self.Params[3]); -- 受伤等待恢复时间 self.OwnerPawn = self:GetOwnerPawn() if UE.IsValid(self.OwnerPawn) and self.OwnerPawn:IsAlive() then UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaDoAction] IsValid") end -- 绑定Event传入的self可能有点问题,需要与存储OwnerPawn才能获取到正确的OwnerPawn UGCEventSystem.AddListener(EventEnum.PlayerInjuryInfo, self.PlayerInjuryInfo, self) --local Causer = self:GetBuffCauserActor() --if Causer then -- UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaDoAction] Succeed") --else -- UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaDoAction] Failure") --end return true end function Buff_RespiratoryRecovery:LuaUndoAction() if not UGCGameSystem.IsServer() then return true end UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaUndoAction]") UGCEventSystem.RemoveListener(EventEnum.PlayerInjuryInfo, self.PlayerInjuryInfo, self) return true end function Buff_RespiratoryRecovery:LuaResetAction() UGCLogSystem.Log("[Buff_RespiratoryRecovery_LuaResetAction]") return true end function Buff_RespiratoryRecovery:LuaUpdateAction(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 Buff_RespiratoryRecovery:PlayerInjuryInfo(VictimKey) if UE.IsValid(self.OwnerPawn) and self.OwnerPawn:IsAlive() then UGCLogSystem.Log("[Buff_RespiratoryRecovery_PlayerInjuryInfo] VictimKey:%s, OwnerPlayerKey:%s",tostring(VictimKey), tostring(self.OwnerPawn.PlayerKey)) if VictimKey == self.OwnerPawn.PlayerKey then self.PlayerVictimTime = UGCSystemLibrary.GetGameTime() UGCLogSystem.Log("[Buff_RespiratoryRecovery_PlayerInjuryInfo] Succeed") end end end function Buff_RespiratoryRecovery:AddPlayerHealth() local NowTime = UGCSystemLibrary.GetGameTime() local PlayerPawn = self:GetOwnerPawn() if UE.IsValid(PlayerPawn) and PlayerPawn:IsAlive() and (self.PlayerVictimTime == nil or (NowTime - self.PlayerVictimTime >= self.WaitAddHealthTime)) then UGCPawnAttrSystem.SetHealth(PlayerPawn, UGCPawnAttrSystem.GetHealth(PlayerPawn) + self.ReplyPerSecond / self.AddHealthFrequency) end end return Buff_RespiratoryRecovery;