// 矩形检测,获取最近的单位,进行激光链接 public override void Trigger() { FixedPoint minDis = new FixedPoint(999999); CCreature minCC = null; List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); Vector2d pos = m_caster.GetPos() + GetDir().normalized *new FixedPoint((m_triggerData.Length + m_triggerData.vBulletDeltaPos.z) * 0.5f); int angle = (int)FPCollide.GetAngle(GetDir()).value; FPObb obb = new FPObb(pos, new Vector2d(m_triggerData.Width, m_triggerData.Length), angle); if (FPCollide.bSphereOBB(playerS, obb)) { FixedPoint dis = Vector2d.Distance(creature.GetPos(), GetPos()); if (dis < minDis) { minDis = dis; minCC = creature; } } } if (minCC != null) { OnHitAddBuff(m_caster, minCC); Vector2d targetPos = GetPos() + GetDir().normalized *minDis; if (m_vCreature != null) { Vector3 tH = minCC.GetVObject().GetHitHeight(); GetVTrigger().SetLineTargetPos(targetPos.ToVector3() + tH); } } else { _CheckObstacle(); } }
/// <summary> /// 通过BUFF区域检测触发 /// </summary> public virtual void Trigger() { if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Circle) { FPSphere tSphere = new FPSphere(); tSphere.c = GetPos(); tSphere.r = new FixedPoint(m_triggerData.Length); List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); if (FPCollide.bSphereSphere(tSphere, playerS)) { OnHitAddBuff(m_caster, creature); } } } else if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Sector) { List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); FPSector sec = new FPSector(); sec.pos = GetPos(); sec.dir = GetDir(); sec.angle = new FixedPoint(m_triggerData.Width); sec.r = new FixedPoint(m_triggerData.Length); if (FPCollide.bSectorInside(sec, creature.GetPos())) { OnHitAddBuff(m_caster, creature); } } } else if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Rect) { List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); Vector2d pos = GetPos(); int angle = (int)FPCollide.GetAngle(GetDir()).value; FPObb obb = new FPObb(pos, new Vector2d(m_triggerData.Width, m_triggerData.Length), angle); if (FPCollide.bSphereOBB(playerS, obb)) { OnHitAddBuff(m_caster, creature); } } } if (m_triggerData.PosType == (int)eBuffTriggerPosType.CasterStartPos_SkillDir) { // 障碍碰撞 if (CMapMgr.m_map.IsblockNotAirWal((int)m_curPos.x.value, (int)m_curPos.y.value)) { Destory(); return; } if (PhysicsManager.Inst.IsblockNotAirWal((int)m_curPos.x, (int)m_curPos.y)) { Destory(); return; } // 子弹碰撞 FPSphere cur = new FPSphere(); cur.c = GetPos(); cur.r = GetR(); foreach (KeyValuePair <long, CBuffTrigger> item in CBuffTriggerMgr.m_dicSkill) { CBuffTrigger tri = item.Value; if (tri.m_triggerData.PosType == (int)eBuffTriggerPosType.CasterStartPos_SkillDir && tri != this && tri.m_caster != m_caster) { FPSphere triItem = new FPSphere(); triItem.c = tri.GetPos(); triItem.r = tri.GetR(); if (FPCollide.bSphereSphere(cur, triItem)) { Destory(); tri.Destory(); } } } } }