--移动 local HitSystem = {} local private = {} local FP=FP local tempFPV2 = FP.newV2(0,1) local tempTime = FP.newV1(0) local LuaConst=LuaConst --[[ HitPush --]] function HitSystem.OnHitPush(entity, attacker, missile, duration, distance ,hitMoveDir,hitMoveDirOffsetAngle) if distance < FP.Const.Zero or attacker == nil then return end --↓策划要的特需:怪没死,就不能被推散 (手雷爆炸也不行) --if hitMoveDir > 0 and entity:IsAlive() then -- hitMoveDir = LuaConst.MissileHitMoveDirType.Missile --end --↑特需 local hitComponent = entity.components.hit entity.components.buff.CurrentBuffHitType = LuaConst.BuffHitType.HitPush local delta = LuaConst.TimeSpanMs / duration if hitMoveDir == LuaConst.MissileHitMoveDirType.Missile then tempFPV2:Reset(missile.MoveDir) elseif hitMoveDir == LuaConst.MissileHitMoveDirType.Away then tempFPV2:Reset(entity.components.move.LogicPos):Sub(attacker.components.move.LogicPos) if tempFPV2 == FP.Const.Vector2_Zero then tempFPV2:Reset(missile.MoveDir) end elseif hitMoveDir == LuaConst.MissileHitMoveDirType.FarMissile then tempFPV2:Reset(entity.components.move.LogicPos):Sub(missile.Pos) if tempFPV2 == FP.Const.Vector2_Zero then tempFPV2:Reset(missile.MoveDir) end end if hitMoveDirOffsetAngle ~= FP.Const.Zero then tempFPV2 = FP.V2.GetOffsetToAngle(hitMoveDirOffsetAngle, tempFPV2) end tempFPV2:Normalize() hitComponent.HitAddPos:Reset(tempFPV2):Mul(distance):Mul(delta) hitComponent.HitPushTimer:Reset() hitComponent.HitPushTotalTime:Reset(duration) entity.components.anim.LockCurAnimMove = true -- 注意,一定是在buff中的SetState(common) 之后 private.ExpressHitEnter(entity,hitComponent.HitAddPos) end --[[ HitDragRange --]] function HitSystem.OnHitDragRange(entity, attacker, missile, duration, dragParam) if not missile then return end entity.components.buff.CurrentBuffHitType = LuaConst.BuffHitType.HitDragRange local basePos = missile.Pos if dragParam.basePosType == LuaConst.BuffHitMoveBasePosType.Attacker then basePos = attacker.components.move.LogicPos end FP.V2.GetOffsetToForward(missile.MoveDir,dragParam.TerminalOffset, tempFPV2) -- tempFPV2 == terminalCenter local randRadius = LogicRandom.GetRangeValue(entity, 0, dragParam.TerminalRadius ,25) local randRadian = LogicRandom.GetRangeValue(entity, FP.Const.Zero, FP.Const.PI2 ,26) local targetOffset = FP.newV2(randRadius * FP.Math.Cos(randRadian), randRadius * FP.Math.Sin(randRadian)); local hitStartPos = entity.components.move.LogicPos tempFPV2:Add(basePos):Add(targetOffset) -- hitTargetPos = tempFPV2 local hitComponent = entity.components.hit --local delta = LuaConst.TimeSpanMs / duration hitComponent.HitAddPos:Reset(tempFPV2):Sub(hitStartPos):Div(duration):Mul(LuaConst.TimeSpanMs) hitComponent.HitPushTimer:Reset() hitComponent.HitPushTotalTime:Reset(duration) --动画的缩放 private.ExpressHitEnter(entity,hitComponent.HitAddPos) end --[[ HitDragDistance --]] function HitSystem.OnHitDragDistance(entity, attacker, missile, duration, dragParam) if not missile then return end entity.components.buff.CurrentBuffHitType = LuaConst.BuffHitType.HitDragDistance local basePos = missile.Pos if dragParam.basePosType == LuaConst.BuffHitMoveBasePosType.Attacker then basePos = attacker.components.move.LogicPos end FP.V2.GetOffsetToForward(missile.MoveDir,dragParam.TerminalOffset, tempFPV2) -- terminalCenter = tempFPV2 local hitStartPos = entity.components.move.LogicPos tempFPV2:Add(basePos) -- terminalPos = tempFPV2 local direction = FP.V2.Normalized(tempFPV2 - hitStartPos) local terminalDis = FP.V2.Magnitude(tempFPV2 - hitStartPos) --local hitTargetPos = tempFPV2 if terminalDis > dragParam.HorizontalDistance then -- 距离大于要移动的距离,重新设置终点位置 tempFPV2:Reset(direction):Mul(dragParam.HorizontalDistance):Add(hitStartPos) else --如果 拖拽目标点比移动的距离近,则需速度要保持不变,v = s/t ,s变小所以t等比变小 duration = FP.Math.Floor( FP.Math.Min(terminalDis / dragParam.HorizontalDistance, FP.Const.One) * duration) end local hitComponent = entity.components.hit hitComponent.HitAddPos:Reset(tempFPV2):Sub(hitStartPos):Div(duration):Mul(LuaConst.TimeSpanMs) hitComponent.HitPushTimer:Reset() hitComponent.HitPushTotalTime:Reset(duration) --动画的缩放 private.ExpressHitEnter(entity,hitComponent.HitAddPos) end --[[ 以特定的速度移动到特定的点。 --]] function HitSystem.HitMoveToPosBySpd(entity, targetPos, moveSpd) entity.components.buff.CurrentBuffHitType = LuaConst.BuffHitType.HitDragDistance local hitStartPos = entity:GetLogicPos() local hitComponent = entity.components.hit hitComponent.HitAddPos:Reset(targetPos):Sub(hitStartPos):Normalize() hitComponent.HitAddPos:Mul(moveSpd):Mul(LuaConst.TimeSpan) hitComponent.HitPushTimer:Reset() hitComponent.HitPushTotalTime:Reset(FP.V2.Distance(hitStartPos, targetPos):Div(moveSpd)):Mul(1000) end --[[ 以特定的时间到达特定的点。time:毫秒 --]] function HitSystem.HitMoveToPosOnTime(entity, targetPos, time) entity.components.buff.CurrentBuffHitType = LuaConst.BuffHitType.HitDragDistance local hitStartPos = entity:GetLogicPos() local hitComponent = entity.components.hit hitComponent.HitPushTimer:Reset() hitComponent.HitPushTotalTime:Reset(time) hitComponent.HitAddPos:Reset(targetPos):Sub(hitStartPos):Div(time):Mul(LuaConst.TimeSpanMs) -- 每帧移动的距离 end --[[ Tick --]] function HitSystem.OnLogicUpdate(entity) local hitComponent = entity.components.hit local buffComp = entity.components.buff if buffComp.CurrentBuffHitType == LuaConst.BuffHitType.None then return end tempTime:Reset(entity.components.timeScale:GetCurTimeScale()):Mul(LuaConst.TimeSpanMs) hitComponent.HitPushTimer:Add(tempTime) if hitComponent.HitPushTimer > hitComponent.HitPushTotalTime then buffComp.CurrentBuffHitType = LuaConst.BuffHitType.None end end function private.ExpressHitEnter(entity,hitAddPos) SystemManager.OnHitEnter(entity,hitAddPos) end --添加击飞buff的时候,时间缩放 -- local FlyAwayMinHeight = -0.3 -- local FlyAwayMaxHeight = 0.3 function HitSystem.OnHitFly(entity) --暂时不需要了 -- local moveComp = entity.components.move -- moveComp.FlyUpTimer = 0 -- moveComp.FlyUpRate = LogicRandom.GetRangeValue(entity, FlyAwayMinHeight, FlyAwayMaxHeight,27) -- local ts = FP.Const.One + moveComp.FlyUpRate / 2 -- SystemManager.OnAddTimeScale(entity, "hitFly", ts , -1, LuaConst.TimeScaleBreakType.HitFly ) -- print("加时间缩放:" , ts[1] , "|eid:" ,entity._logicInitData.EntityID ,"----|", LogicUpdateManager._clientHandleFrame) end return HitSystem