124 lines
4.4 KiB
Lua
124 lines
4.4 KiB
Lua
local BuffActionBase = require('Script.Global.BuffSystem.BuffActionBase')
|
||
|
||
local BuffAction_BulletHitApplyRadialDamage = setmetatable(
|
||
{
|
||
-- Param ---------------------------
|
||
-- 仅枪械武器触发
|
||
IsShootWeapon = true;
|
||
-- 筛选武器,若不为空则内部对应的武器攻击才会触发,若为空则全部武器均会触发
|
||
FilterWeaponItemID = {};
|
||
|
||
-- Damage --
|
||
MaxDamage = 20;
|
||
MinDamage = 20;
|
||
|
||
-- 内部范围,既最高伤害的范围
|
||
InnerRadius = 50;
|
||
-- 外部范围,既伤害范围,到该范围边界则为最低伤害
|
||
OuterRadius = 200;
|
||
-- Inner到Outer范围区间的伤害衰减指数
|
||
FallOff = 2;
|
||
-- Damage --
|
||
|
||
-- 冷却时间
|
||
CoolingTime = 2;
|
||
-- 粒子类型
|
||
ParticleType = nil;
|
||
-- 音效类型
|
||
SoundType = nil;
|
||
-- Param End -----------------------
|
||
|
||
-- 正在冷却
|
||
bIsCooling = false;
|
||
|
||
ShootWeaponType = {
|
||
EWeaponTypeNew.EWeaponTypeNew_Rifle,
|
||
EWeaponTypeNew.EWeaponTypeNew_SingleShotSniper,
|
||
EWeaponTypeNew.EWeaponTypeNew_BurstShotSniper,
|
||
EWeaponTypeNew.EWeaponTypeNew_Submachine,
|
||
EWeaponTypeNew.EWeaponTypeNew_ShotGun,
|
||
EWeaponTypeNew.EWeaponTypeNew_Pistol,
|
||
EWeaponTypeNew.EWeaponTypeNew_Crossbow,
|
||
}
|
||
},
|
||
{ __index = BuffActionBase, __metatable = BuffActionBase }
|
||
);
|
||
|
||
function BuffAction_BulletHitApplyRadialDamage:LuaDoAction()
|
||
BuffActionBase.LuaDoAction(self)
|
||
if not UGCGameSystem.IsServer() then return true end
|
||
UGCLogSystem.LogTree("[BuffAction_BulletHitApplyRadialDamage_LuaUndoAction]", self.ShootWeaponType)
|
||
|
||
-- 绑定Event传入的self可能有点问题,需要与存储OwnerPawn才能获取到正确的OwnerPawn
|
||
UGCEventSystem.AddListener(EventEnum.BulletHitCallBack, self.BulletHitCallBack, self)
|
||
-- 启用Tick
|
||
self:EnableTick()
|
||
end
|
||
|
||
function BuffAction_BulletHitApplyRadialDamage:LuaUndoAction()
|
||
BuffActionBase.LuaUndoAction(self)
|
||
if not UGCGameSystem.IsServer() then return true end
|
||
|
||
if self.CoolingHandle then
|
||
UGCEventSystem.StopTimer(self.CoolingHandle)
|
||
end
|
||
UGCEventSystem.RemoveListener(EventEnum.BulletHitCallBack, self.BulletHitCallBack, self)
|
||
end
|
||
|
||
--function BuffAction_BulletHitApplyRadialDamage:LuaUpdateAction(DeltaSeconds)
|
||
-- BuffActionBase.LuaUpdateAction(self, DeltaSeconds)
|
||
--end
|
||
|
||
function BuffAction_BulletHitApplyRadialDamage:CheckWeapon(InWeaponInst)
|
||
local WeaponItemID = InWeaponInst:GetWeaponItemID()
|
||
if #self.FilterWeaponItemID > 0 then
|
||
return table.hasValue(self.FilterWeaponItemID, WeaponItemID)
|
||
end
|
||
local WeaponTypeNew = InWeaponInst:GetWeaponTypeNew()
|
||
UGCLogSystem.Log("[BuffAction_BulletHitApplyRadialDamage_CheckWeapon] WeaponTypeNew:%s", tostring(WeaponTypeNew))
|
||
if self.IsShootWeapon then
|
||
return table.hasValue(self.ShootWeaponType, WeaponTypeNew)
|
||
end
|
||
return true
|
||
end
|
||
|
||
function BuffAction_BulletHitApplyRadialDamage:BulletHitCallBack(TargetPawn, WeaponInst, BulletInst, HitInfo)
|
||
if self:GetOwnerPawn() == TargetPawn and self.bIsCooling == false and self:CheckWeapon(WeaponInst) then
|
||
-- 冷却
|
||
if self.CoolingTime > 1e-2 then
|
||
self.bIsCooling = true
|
||
self.CoolingHandle = UGCEventSystem.SetTimer(UGCGameSystem.GameState, function()
|
||
self.bIsCooling = false
|
||
self.CoolingHandle = nil
|
||
end, self.CoolingTime)
|
||
end
|
||
local Pos = HitInfo.Location
|
||
-- 施加范围伤害
|
||
UGCGameSystem.ApplyRadialDamage(
|
||
self.MaxDamage,
|
||
self.MinDamage,
|
||
Pos,
|
||
self.InnerRadius,
|
||
self.OuterRadius,
|
||
self.FallOff,
|
||
EDamageType.RadialDamage,
|
||
{},
|
||
WeaponInst,
|
||
TargetPawn:GetController(),
|
||
ECollisionChannel.ECC_Visibility,
|
||
WeaponInst:GetWeaponItemID()
|
||
);
|
||
BuffSystemAPI.RPCAction(nil, self:GetInstID(), BuffActionConfig.EActionType.BulletHitApplyRadialDamage, "ClientExplosionFX", VectorHelper.ToLuaTable(Pos))
|
||
end
|
||
end
|
||
|
||
function BuffAction_BulletHitApplyRadialDamage:ClientExplosionFX(Pos)
|
||
if self.ParticleType then
|
||
ParticleConfig.AddParticleFromPosAndRot(self.ParticleType, Pos, nil, self.OuterRadius / 100)
|
||
end
|
||
if self.SoundType then
|
||
SoundSystem.PlaySound(self.SoundType, Pos, VectorHelper.RotZero())
|
||
end
|
||
end
|
||
|
||
return BuffAction_BulletHitApplyRadialDamage; |