Пример #1
0
        /// <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);
        }
Пример #2
0
        //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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        public virtual void OnRoleEnterMap(RoleActor role)
        {
            var loc     = role.GetPosition();
            var mapCell = GetMapCell(loc.X, loc.Z);

            mapCell.AddRole(role);
        }
Пример #6
0
        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);
        }
Пример #7
0
        public bool CanCastSpell()
        {
            if (mAttackTarget == null)
            {
                return(false);
            }

            if (Util.DistanceH(mAttackTarget.GetPosition(), GetPosition()) > mCastSpellDistance)
            {
                return(false);
            }

            return(true);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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();
            }
        }
Пример #10
0
        public bool CanCastSpell()
        {
            RoleActor target = GetTarget(mAttackTarget);

            if (target == null)
            {
                return(false);
            }

            if (Util.DistanceH(target.GetPosition(), GetPosition()) > mCastSpellDistance)
            {
                return(false);
            }

            return(true);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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));
        }