public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_PlaySound buff_PlaySound = (Buff_PlaySound)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { if (v.UnitData.unitLayer == UnitLayer.Default) { continue; } if (buffHandlerVar.GetBufferValue(out BufferValue_AttackSuccess attackSuccess)) { if (attackSuccess.successDic.ContainsKey(v.Id)) { if (!attackSuccess.successDic[v.Id]) { continue; } } } PlayAudio(buff_PlaySound, v, buffHandlerVar.playSpeed, buffHandlerVar.skillId); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_HitEffect buff = (Buff_HitEffect)buffHandlerVar.data; if (buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targets)) { foreach (var v in targets.targets) { //未造成伤害就不给予效果 if (buffHandlerVar.GetBufferValue(out BufferValue_AttackSuccess attackSuccess)) { if (attackSuccess.successDic.ContainsKey(v.Id)) { if (!attackSuccess.successDic[v.Id]) { continue; } } } HitEffect(buff, v.Position, buffHandlerVar.skillId); } return; } if (!buffHandlerVar.GetBufferValue(out BufferValue_Pos value_Pos)) { return; } HitEffect(buff, value_Pos.aimPos, buffHandlerVar.skillId); }
public void Remove(BuffHandlerVar buffHandlerVar) { Buff_GiveSpecialDebuff buff = (Buff_GiveSpecialDebuff)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } //if (buff.currStackNum < buff.aimStackNum) return;//叠加层数没达到 foreach (var v in targetUnits.targets) { CharacterStateComponent unitState = v.GetComponent <CharacterStateComponent>(); //从一个特殊效果配置中,拿到对应效果的BuffGroup,添加到角色的BuffMgrComponent中 switch (buff.restrictionType) { case RestrictionType.击退: unitState.Set(SpecialStateType.NotInControl, false); break; case RestrictionType.眩晕: unitState.Set(SpecialStateType.CantDoAction, false); break; } } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } Buff_AddBuff addBuff = (Buff_AddBuff)buffHandlerVar.data; addBuff.buffGroup.sourceUnitId = buffHandlerVar.source.Id; foreach (var v in targetUnits.targets) { //未造成伤害就不给予效果 if (buffHandlerVar.GetBufferValue(out BufferValue_AttackSuccess attackSuccess)) { if (attackSuccess.successDic.ContainsKey(v.Id)) { if (!attackSuccess.successDic[v.Id]) { continue; } } } BuffMgrComponent buffMgr = v.GetComponent <BuffMgrComponent>(); buffMgr.AddBuffGroup(addBuff.buffGroup.BuffGroupId, addBuff.buffGroup); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { #if !SERVER Buff_PlayEffect buff = (Buff_PlayEffect)buffHandlerVar.data; if (buff.lockToTarget) { if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { PlayEffect_LockToTarget(v, buff, buffHandlerVar); } } else { if (!buffHandlerVar.GetBufferValue(out BufferValue_Pos pos)) { Log.Debug("找不到位置"); return; } PlayEffect(pos.aimPos, buff, buffHandlerVar); } #endif }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_GiveRecover buff = (Buff_GiveRecover)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { NumericComponent numericComponent = v.GetComponent <NumericComponent>(); if (buff.hpValue > 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.HP, v.Id, buff.hpValue); } if (buff.hpPct > 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.HP, v.Id, numericComponent.GetAsFloat(NumericType.HPMax_Final) * buff.hpPct); } if (buff.mpValue > 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.MP, v.Id, buff.mpValue); } if (buff.mpPct > 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.MP, v.Id, numericComponent.GetAsFloat(NumericType.MPMax_Final) * buff.mpPct); } } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_DirectDamage buff = (Buff_DirectDamage)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } GameCalNumericTool.DamageData damageData = new GameCalNumericTool.DamageData(); damageData.damageType = buff.damageType; damageData.damageValue = buff.damageValue; if (buffHandlerVar.bufferValues.TryGetValue(typeof(BufferValue_DamageAddPct), out var damageAddPct)) { damageData.damageValue = Mathf.RoundToInt((1 + ((BufferValue_DamageAddPct)damageAddPct).damageAddPct) * damageData.damageValue); } damageData.isCritical = false; SkillEffectComponent skillEffectComponent = buffHandlerVar.source.GetComponent <SkillEffectComponent>(); var effectData = skillEffectComponent.GetEffectData(buffHandlerVar.skillId); if (effectData != null) { damageData.damageValue = Mathf.RoundToInt((1 + effectData.coefficientAddPct) * damageData.damageValue); damageData.isCritical = effectData.critical; } if (!SkillHelper.tempData.ContainsKey((buffHandlerVar.source, buff.buffSignal))) { SkillHelper.tempData[(buffHandlerVar.source, buff.buffSignal)] = new Dictionary <Type, IBufferValue>();
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_DOT buff = (Buff_DOT)buffHandlerVar.data; NumericComponent numericComponent = buffHandlerVar.source.GetComponent <NumericComponent>(); //这里只是计算一下DOT的伤害(快照机制),实际DOT的处理是在BuffMgr中管理的 BuffHandlerVar.cacheDatas_int[(buffHandlerVar.source.Id, buff.buffSignal)] = Mathf.RoundToInt(numericComponent.GetAsFloat(buff.numericType) * buff.baseCoff * numericComponent.GetAsFloat(NumericType.FinalDamage_AddPct));
public void Remove(BuffHandlerVar buffHandlerVar) { UnityEngine.Debug.Log("移除强力buff"); buffHandlerVar.source.GetUnitComponent <CharacterStateComponent>().Set(SpecialStateType.PowerAttack, false); if (Effect != null) { GameEntry.Entity.HideEntity(Effect); } }
public void AddHandle(BuffHandlerVar buffHandlerVar) { BuffHandlerVar = buffHandlerVar; UnityEngine.Debug.Log("增加强力buff"); buffHandlerVar.source.GetUnitComponent <CharacterStateComponent>().Set(SpecialStateType.PowerAttack, true); GameEntry.Entity.ShowBuffEffect("buff_atk_add", buffHandlerVar.source.Id, "S_GC/Top", this); }
public async void ActionHandle(BuffHandlerVar buffHandlerVar) { #if !SERVER if (Game.Scene.GetComponent <GlobalConfigComponent>().networkPlayMode) { //联网模式是服务器发消息,才执行 return; } #endif try { Buff_Move buff_Move = (Buff_Move)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_Pos bufferValue_Pos)) { Log.Error("给移动的Buff提供的参数不包含目标位置! " + buffHandlerVar.skillId); return; } if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits bufferValue_TargetUnits)) { Log.Error("给移动的Buff提供的参数不包含移动的目标! " + buffHandlerVar.skillId); return; } foreach (var v in bufferValue_TargetUnits.targets) { if (buff_Move.resetDir) { v.Rotation = Quaternion.LookRotation(bufferValue_Pos.aimPos - v.Position, Vector3.up); } Vector3 aimPos = bufferValue_Pos.aimPos; //TODO: 下面的移动都不严谨, 要做位移的合法性检查 if (buff_Move.flash || buff_Move.moveDuration == 0) { //需要检查目标位置是否能瞬移过去,然后瞬移不过去的时候,找到最合理的一个点瞬移过去 //瞬移 v.Position = aimPos; } else { //需要检查目标位置是否能移动过去,如果不行的话,就不位移了 CharacterMoveComponent characterMoveComponent = buffHandlerVar.source.GetComponent <CharacterMoveComponent>(); float moveSpeed = Vector3.Distance(v.Position, aimPos) / buff_Move.moveDuration; await characterMoveComponent.MoveTo(aimPos, moveSpeed); } } } catch (Exception e) { Log.Error(e.ToString()); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_GiveNumeric buff = (Buff_GiveNumeric)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { Game.EventSystem.Run(EventIdType.NumbericChange, buff.numericType, v.Id, buff.value); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_EnhanceSkillEffect buff = (Buff_EnhanceSkillEffect)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { SkillEffectComponent skillEffectComponent = v.GetComponent <SkillEffectComponent>(); skillEffectComponent.AddEffectData(buff.skillId, buff.effectData); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_UpdateNumeric buff = (Buff_UpdateNumeric)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits bufferValue_TargetUnits)) { return; } NumericComponent numericComponent = buffHandlerVar.source.GetComponent <NumericComponent>(); if (buff.addValueByNumeric) { float value = numericComponent.GetAsFloat(buff.sourceNumeric) * buff.coefficient + buff.valueAdd; BuffHandlerVar.cacheDatas_float[(buffHandlerVar.source.Id, buff.buffSignal)] = value;
public void Remove(BuffHandlerVar buffHandlerVar) { #if !SERVER Buff_PlayEffect buff = (Buff_PlayEffect)buffHandlerVar.data; if (buff.duration > 0) { return; } if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { RemoveEffect(v.Id, buff.buffSignal, buff.effectObjId); } #endif }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { #if !SERVER if (Game.Scene.GetComponent <GlobalConfigComponent>().networkPlayMode) { //联网模式是服务器发消息,才执行 return; } #endif try { Buff_PushBack buff = (Buff_PushBack)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_Dir buffer_dir)) { return; } if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits bufferValue_TargetUnits)) { return; } foreach (var v in bufferValue_TargetUnits.targets) { if (buffHandlerVar.GetBufferValue(out BufferValue_AttackSuccess attackSuccess)) { if (attackSuccess.successDic.ContainsKey(v.Id)) { if (!attackSuccess.successDic[v.Id]) { continue; } } } Vector3 aimPos = v.Position + (buffer_dir.dir * buff.distance); PushBack(v, aimPos, buff).Coroutine(); } } catch (Exception e) { Log.Error(e.ToString()); } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { #if !SERVER Buff_PlayAnim buff_PlayAnim = (Buff_PlayAnim)buffHandlerVar.data; if (buff_PlayAnim.playSpeed == 0) { buff_PlayAnim.playSpeed = 1; } if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits bufferValue_TargetUnits)) { Log.Error("找不到对应的目标!"); return; } foreach (var v in bufferValue_TargetUnits.targets) { //角色动画 AnimatorComponent animatorComponent = v.GetComponent <AnimatorComponent>(); if (!string.IsNullOrEmpty(buff_PlayAnim.anim_boolValue)) { if (buff_PlayAnim.canBeInterrupted) { buffHandlerVar.cancelToken.Register(() => { animatorComponent.SetBoolValue(buff_PlayAnim.anim_boolValue, !buff_PlayAnim.boolValue); }); } animatorComponent.SetBoolValue(buff_PlayAnim.anim_boolValue, buff_PlayAnim.boolValue); } if (!string.IsNullOrEmpty(buff_PlayAnim.anim_triggerValue)) { animatorComponent.SetTrigger(buff_PlayAnim.anim_triggerValue); } float speed = buffHandlerVar.playSpeed * buff_PlayAnim.playSpeed; // animatorComponent.SetAnimatorSpeed(speed); } #endif }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_CostHP_MP cost = (Buff_CostHP_MP)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } foreach (var v in targetUnits.targets) { Unit target = v; NumericComponent numericComponent = target.GetComponent <NumericComponent>(); float updateHp = -cost.costHp - cost.costHpInPct * numericComponent.GetAsFloat(NumericType.HPMax_Final); float updateMp = -cost.costMp - cost.costMpInPct * numericComponent.GetAsFloat(NumericType.MPMax_Final); if (updateHp != 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.HP, target.Id, updateHp); } if (updateMp != 0) { Game.EventSystem.Run(EventIdType.NumbericChange, NumericType.MP, target.Id, updateMp); } } }
public IBufferValue[] ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_RangeDetection buff_RangeDetection = (Buff_RangeDetection)buffHandlerVar.data; if (!buffHandlerVar.GetBufferValue(out BufferValue_Pos bufferValue_Pos)) { return(null); } //主要目的是返回多个群体目标对象 BufferValue_TargetUnits bufferValue_TargetUnits = new BufferValue_TargetUnits(); PolyshapeQueryCallback polyshapeQueryCallback = new PolyshapeQueryCallback(); AABB ab = new AABB(); switch (buff_RangeDetection.shapeType) { case Buff_RangeDetection.CollisionShape.Box: //根据传入进来的方向和位置计算做范围检测的区域 if (!buffHandlerVar.GetBufferValue(out BufferValue_Dir bufferValue_Dir)) { Log.Error("Box检测没有收到方向 " + buffHandlerVar.skillId); return(null); } Vector2 pos = bufferValue_Pos.aimPos.ToVector2(); var transform = new Transform(in pos, bufferValue_Dir.dir.ToRotation2D().Angle); var Vertices = new Vector2[4]; float hx = buff_RangeDetection.shapeValue.x; float hy = buff_RangeDetection.shapeValue.y; Vertices[0].Set(-hx, -hy); Vertices[1].Set(hx, -hy); Vertices[2].Set(hx, hy); Vertices[3].Set(-hx, hy); for (var i = 0; i < 4; ++i) { Vertices[i] = MathUtils.Mul(transform, Vertices[i]); } ab.UpperBound = ab.LowerBound = Vertices[0]; for (var i = 1; i < 4; ++i) { var v = Vertices[i]; ab.LowerBound = Vector2.Min(ab.LowerBound, v); ab.UpperBound = Vector2.Max(ab.UpperBound, v); } var r = new Vector2(Settings.PolygonRadius, Settings.PolygonRadius); ab.LowerBound -= r; ab.UpperBound += r; break; case Buff_RangeDetection.CollisionShape.Circle: pos = bufferValue_Pos.aimPos.ToVector2(); transform = new Transform(in pos, 0); var p = MathUtils.Mul(transform.Rotation, transform.Position); float raidus = buff_RangeDetection.shapeValue.x; ab.LowerBound.Set(p.X - raidus, p.Y - raidus); ab.UpperBound.Set(p.X + raidus, p.Y + raidus); break; } //Log.Debug(ab.LowerBound.ToString() + ab.UpperBound.ToString()); PhysicWorldComponent.Instance.world.QueryAABB(polyshapeQueryCallback, ab); if (polyshapeQueryCallback.units == null || polyshapeQueryCallback.units.Count == 0) { Log.Debug("没有检测到任何单位"); return(null); } for (int i = polyshapeQueryCallback.units.Count - 1; i >= 0; i--) { //默认层(一般是特效,墙壁等) if (polyshapeQueryCallback.units[i].UnitData.groupIndex == GroupIndex.Default || polyshapeQueryCallback.units[i].UnitData.unitLayer == UnitLayer.Default) { polyshapeQueryCallback.units.RemoveAt(i); continue; } if (buff_RangeDetection.FindFriend) { if (polyshapeQueryCallback.units[i].UnitData.groupIndex != buffHandlerVar.source.UnitData.groupIndex) { polyshapeQueryCallback.units.RemoveAt(i); continue; } } else { if (polyshapeQueryCallback.units[i].UnitData.groupIndex == buffHandlerVar.source.UnitData.groupIndex) { polyshapeQueryCallback.units.RemoveAt(i); continue; } } //高度区域检测 if (Math.Abs((bufferValue_Pos.aimPos.y + buff_RangeDetection.halfHeight) - (polyshapeQueryCallback.units[i].Position.y + polyshapeQueryCallback.units[i].OffsetY)) > (buff_RangeDetection.halfHeight + polyshapeQueryCallback.units[i].HalfHeight)) { polyshapeQueryCallback.units.RemoveAt(i); Log.Debug("目前高度不在检测的范围内!"); continue; } else { Log.Debug("目前高度在检测的范围内!"); } } //拿到了所有检测到的Unit bufferValue_TargetUnits.targets = polyshapeQueryCallback.units.ToArray(); // Log.Debug("范围检测到了 " + bufferValue_TargetUnits.targets.Length+ " 个目标"); return(new IBufferValue[] { bufferValue_TargetUnits }); }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_EmitObj buff = buffHandlerVar.data as Buff_EmitObj; UnitData emitObjData = new UnitData(); if (!buff.FindFriend) { emitObjData.groupIndex = buffHandlerVar.source.UnitData.groupIndex; } else { switch (buffHandlerVar.source.UnitData.groupIndex) { case GroupIndex.Default: emitObjData.groupIndex = GroupIndex.Default; break; case GroupIndex.Player: emitObjData.groupIndex = GroupIndex.Monster; break; case GroupIndex.Monster: emitObjData.groupIndex = GroupIndex.Player; break; } } Log.Debug(string.Format("EmitObj {0} Source {1}", emitObjData.groupIndex, buffHandlerVar.source.UnitData.groupIndex)); emitObjData.unitLayer = buff.layer; emitObjData.layerMask = buff.layerMask; emitObjData.unitTag = UnitTag.Default; int index = 10000; if (buff.lockTarget) { if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } //每个单位都发射一个特效 foreach (var v in targetUnits.targets) { long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的. index++; #if !SERVER //特效 UnityEngine.GameObject go = null; go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体 var effectGo = go; Unit unit = UnitFactory.CreateEmitObj(id, go, emitObjData); go.SetActive(true); #else Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId); #endif Vector3 dir = (v.Position - buffHandlerVar.source.Position).normalized; Vector3 startPosOffset = buff.startPosOffset.ToV3(); unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z); Quaternion quaternion = Quaternion.LookRotation(dir, Vector3.up); unit.Rotation = quaternion; CollisionEvent_LockTarget(buffHandlerVar, unit, v, buff.emitSpeed).Coroutine(); } } else { if (!buffHandlerVar.GetBufferValue(out BufferValue_Dir buffer_dir)) { return; } long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的. #if !SERVER UnityEngine.GameObject go = null; go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体 var effectGo = go; Unit unit = UnitFactory.CreateEmitObj(id, go, emitObjData); go.SetActive(true); #else Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId); #endif Vector3 startPosOffset = buff.startPosOffset.ToV3(); Vector3 dir = buffer_dir.dir.normalized; unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z); //Log.Debug(string.Format("{0}使用者位置 方向{1} 初始位置偏移量{2},计算出的最终位置{3}", buffHandlerVar.source.Position, dir, startPosOffset, unit.Position)); Log.Debug(string.Format("飞行物体的高度{0}", unit.Position.y)); Quaternion quaternion = Quaternion.LookRotation(buffer_dir.dir, Vector3.up); unit.Rotation = quaternion; buffHandlerVar.source.Rotation = quaternion; Vector3 targetPos = dir * buff.emitSpeed * buff.duration + unit.Position; CollisionEvent(buffHandlerVar, unit, targetPos, buff.emitSpeed).Coroutine(); } }
public void PlayEffect_LockToTarget(Unit target, Buff_PlayEffect buff, BuffHandlerVar buffHandlerVar) { AddEffect(target, buff.buffSignal, buff.effectObjId, true, target.Position + buff.posOffset.ToV3(), buff.canBeInterrupted, buffHandlerVar.cancelToken, buff.duration, buffHandlerVar.skillId).Coroutine(); }
public void PlayEffect(Vector3 target, Buff_PlayEffect buff, BuffHandlerVar buffHandlerVar) { AddEffect(buffHandlerVar.source, buff.buffSignal, buff.effectObjId, false, target + buff.posOffset.ToV3(), buff.canBeInterrupted, buffHandlerVar.cancelToken, buff.duration, buffHandlerVar.skillId).Coroutine(); }
void ExecuteCollisionResult(BuffHandlerVar buffHandlerVar, (Unit, Vector3) result, Unit emitObj)
public static async ETTask Execute(this Pipeline_FixedTime pipeline_fixedTime, SkillHelper.ExecuteSkillParams skillParams, BuffHandlerVar buffHandlerVar) { if (pipeline_fixedTime.delayTime > 0) { await TimerComponent.Instance.WaitAsync((long)(pipeline_fixedTime.delayTime * skillParams.playSpeed * 1000), skillParams.cancelToken.Token); } SkillHelper.HandleBuffs(pipeline_fixedTime, buffHandlerVar, skillParams).Coroutine(); if (pipeline_fixedTime.fixedTime > 0) { await TimerComponent.Instance.WaitAsync((long)(pipeline_fixedTime.fixedTime * skillParams.playSpeed * 1000), skillParams.cancelToken.Token); } }
async ETVoid CollisionEvent(BuffHandlerVar buffHandlerVar, Unit emitObj, Vector3 targetPos, float speed) { var result = await emitObj.GetComponent <EmitObjMoveComponent>().MoveTo(targetPos, speed); ExecuteCollisionResult(buffHandlerVar, result, emitObj); }