/// <summary> /// 实际选择目标 /// </summary> public override bool SelectTarget(RoleActor caster, SkillActive skill, ref List <RoleActor> targets) { if (!base.SelectTarget(caster, skill, ref targets)) { return(false); } List <RoleActor> roleList = new List <RoleActor>(); UInt32 actorTypes = (1 << (Int32)eActorGameType.Player) | (1 << (Int32)eActorGameType.Npc) | (1 << (Int32)eActorGameType.PlayerImage); var pos = caster.GetPosition(); if (!caster.HostMap.TourRoles(ref pos, skill.RangeMax, actorTypes, roleList)) { return(false); } foreach (var tar in roleList) { if (Util.DistanceH(tar.GetPosition(), caster.GetPosition()) <= skill.RangeMax) { targets.Add(tar); } } return(true); }
//Dictionary<ulong, TriggerProcessData_Server> mProcessDatas = new Dictionary<ulong, TriggerProcessData_Server>(); // delta为检测范围调整阈值 public eRet_EnterTrigger TryDoTrigger(RoleActor actor, RPC.RPCForwardInfo fwd, float delta = 1.0f) { if (!Enable) { return(eRet_EnterTrigger.NotEnable); } if (actor == null) { return(eRet_EnterTrigger.ActorIsNull); } if (!IsPositionIn(actor.GetPosition().X, actor.GetPosition().Z, delta)) { return(eRet_EnterTrigger.NotInArea); } var player = actor as PlayerInstance; if (player == null) { return(eRet_EnterTrigger.ActorIsNotPlayer); } if (TriggerData == null) { return(eRet_EnterTrigger.NotFindData); } player.JumpToMap((ushort)TriggerData.mapId, TriggerData.targetX, 0, TriggerData.targetZ, fwd); return(eRet_EnterTrigger.EnterMap); }
/// <summary> /// 实际选择目标 /// </summary> public override bool SelectTarget(RoleActor caster, SkillActive skill, ref List <RoleActor> targets) { if (!base.SelectTarget(caster, skill, ref targets)) { return(false); } List <RoleActor> roleList = new List <RoleActor>(); UInt32 actorTypes = (1 << (Int32)eActorGameType.Player) | (1 << (Int32)eActorGameType.Npc) | (1 << (Int32)eActorGameType.PlayerImage); var pos = caster.GetPosition(); if (!caster.HostMap.TourRoles(ref pos, skill.RangeMax, actorTypes, roleList)) { return(false); } foreach (var tar in roleList) { Vector3 dir = Util.DirToVector(caster.GetDirection()); Vector3 toTarDir = tar.GetPosition() - caster.GetPosition(); float angle = Util.Angle(dir, toTarDir); if (Math.Abs(angle) <= 90 && Math.Abs(tar.GetPosition().X - caster.GetPosition().X) <= skill.SkillData.selparam1 / 2 && Math.Abs(tar.GetPosition().Z - caster.GetPosition().Z) <= skill.SkillData.selparam2) { targets.Add(tar); } } return(true); }
public override bool FollowTarget(NPCInstance npc, RoleActor target) { if (!base.FollowTarget(npc, target)) { return(false); } Vector3 standPos = target.GetSurroundPosition(npc.GetPosition(), (int)npc.mCastSpellDistance, npc.Id); if (!Util.PassableForMod(npc.HostMap.Navigator, standPos)) { if (!Util.PassableForMod(npc.HostMap.Navigator, target.GetPosition())) { return(false); } standPos = target.GetPosition(); } if (!npc.MoveTo(standPos)) { return(false); } npc.ChangeState(eNPCState.FollowTarget); return(true); }
public virtual void OnRoleEnterMap(RoleActor role) { var loc = role.GetPosition(); var mapCell = GetMapCell(loc.X, loc.Z); mapCell.AddRole(role); }
public override bool FollowTarget(NPCInstance npc, RoleActor target) { if (!base.FollowTarget(npc, target)) { return(false); } //超出追击范围 if (Util.DistanceH(npc.GetPosition(), npc.mSpawnPoint) > npc.InMapData.followRange) { return(false); } npc.SelectSpell(); if (npc.CanCastSpell()) { //到释放技能距离 npc.ChangeState(eNPCState.WaitCoolDown); } else { if (npc.InMapData.followRange > 0) { Vector3 standPos = target.GetSurroundPosition(npc.GetPosition(), (int)npc.mCastSpellDistance, npc.Id); if (!Util.PassableForMod(npc.HostMap.Navigator, standPos)) { if (!Util.PassableForMod(npc.HostMap.Navigator, target.GetPosition())) { return(false); } standPos = target.GetPosition(); } if (!npc.MoveTo(standPos)) { return(false); } } npc.ChangeState(eNPCState.FollowTarget); } return(true); }
public bool CanCastSpell() { if (mAttackTarget == null) { return(false); } if (Util.DistanceH(mAttackTarget.GetPosition(), GetPosition()) > mCastSpellDistance) { return(false); } return(true); }
public void BroadcastRoleLeave(RoleActor role) { if (this.IsNullMap) { Log.Log.Common.Print(string.Format("Role {0} call RoleDirectionChanged in nullmap", role.RoleName)); return; } RPC.PackageWriter pkg = new RPC.PackageWriter(); Wuxia.H_RpcRoot.smInstance.RPC_RoleLeave(pkg, role.Id); this.SendPkg2Clients(role, role.GetPosition(), pkg); }
public virtual void OnRoleLeaveMap(RoleActor role) { // 广播给客户端 BroadcastRoleLeave(role); var loc = role.GetPosition(); var mapCell = GetMapCell(loc.X, loc.Z); mapCell.RemoveRole(role); if (mTransmitingNpc == role) { mTransmitingNpc = null; mNpcCreatingQueue.Clear(); } }
public bool CanCastSpell() { RoleActor target = GetTarget(mAttackTarget); if (target == null) { return(false); } if (Util.DistanceH(target.GetPosition(), GetPosition()) > mCastSpellDistance) { return(false); } return(true); }
public TriggerInstance InTriggerRange(RoleActor role) { if (null == role) { return(null); } foreach (var val in mTriggerDictionary) { if (Util.DistanceH(val.Value.GetPosition(), role.GetPosition()) < 1.0f) { return(val.Value); } } return(null); }
public bool CastSpell(SkillActive skill, ulong targetId) { if (null == skill || null == skill.Data) { return(false); } skill.mResult = eSkillResult.CastFailed; if (mPlayerStatus.IsHasBuffStatus(eBuffStatusType.眩晕)) { return(false); } if (skill.mStatus != eSkillStatus.Valid) { return(false); } if (skill.mStep != eSkillStep.Init) { return(false); } //检查条件 RoleActor target = mHostMap.GetRole(targetId); if (null != skill.Checker) { skill.mStep = eSkillStep.Check; //预选择目标检查 if (!skill.Checker.PreSelectTarget(this, skill, target)) { skill.Reset(); return(false); } if (null != target) { skill.mDistance = Util.DistanceH(target.GetPosition(), GetPosition()); } if (!skill.Checker.CheckSkillCondition(this, skill)) { skill.Reset(); return(false); } } //检查消耗 if (null != skill.Consumer) { skill.mStep = eSkillStep.Consume; if (!skill.Consumer.CheckSkillConsume(this, skill)) { skill.Reset(); return(false); } //实际消耗 //if (!skill.Consumer.SkillConsume(this, skill)) //{ // skill.Reset(); // return false; //} } if (skill.SkillData.cdTime > 0) { //技能CD float cdTime = skill.SkillData.cdTime; cdTime -= GameSet.Instance.SkillCDTimeSync; skill.SkillCD.AddCoolDown(cdTime, Time.time + cdTime); float protectTime = new float[] { skill.SkillData.protectTime, CSCommon.SCDefine.cCommonCD }.Max(); protectTime -= GameSet.Instance.SkillCDTimeSync; SkillCD.AddCoolDown(protectTime, Time.time + protectTime); } //广播技能效果 var pkg = new RPC.PackageWriter(); Wuxia.H_RpcRoot.smInstance.HIndex(pkg, Id).RPC_SpellSkill(pkg, skill.ID, skill.mTargetId); HostMap.SendPkg2Clients(null, this.GetPosition(), pkg); mCurrSkill = skill; //实际释放技能 return(DoCastSkill(skill)); }