コード例 #1
0
        internal static Msg_RC_CreateNpc BuildCreateNpcMessage(NpcInfo npc)
        {
            Msg_RC_CreateNpc bder = new Msg_RC_CreateNpc();

            bder.npc_id  = npc.GetId();
            bder.unit_id = npc.GetUnitId();
            Vector3 pos = npc.GetMovementStateInfo().GetPosition3D();

            ArkCrossEngineMessage.Position pos_bd = new ArkCrossEngineMessage.Position();
            pos_bd.x            = (float)pos.X;
            pos_bd.z            = (float)pos.Z;
            bder.cur_pos        = pos_bd;
            bder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();
            bder.link_id        = npc.GetLinkId();
            if (npc.GetUnitId() <= 0)
            {
                bder.camp_id = npc.GetCampId();
            }
            if (npc.OwnerId > 0)
            {
                bder.owner_id = npc.OwnerId;
            }
            bder.level = npc.GetLevel();
            return(bder);
        }
コード例 #2
0
        internal static Msg_RC_NpcMove BuildNpcMoveMessage(NpcInfo npc)
        {
            Msg_RC_NpcMove npcMoveBuilder = new Msg_RC_NpcMove();

            if (npc.GetMovementStateInfo().IsMoving)
            {
                npcMoveBuilder.npc_id         = npc.GetId();
                npcMoveBuilder.is_moving      = true;
                npcMoveBuilder.move_direction = (float)npc.GetMovementStateInfo().GetMoveDir();
                npcMoveBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();
                npcMoveBuilder.cur_pos_x      = npc.GetMovementStateInfo().GetPosition3D().X;
                npcMoveBuilder.cur_pos_z      = npc.GetMovementStateInfo().GetPosition3D().Z;
                NpcAiStateInfo data = npc.GetAiStateInfo();
                npcMoveBuilder.target_pos_x         = npc.GetMovementStateInfo().TargetPosition.X;
                npcMoveBuilder.target_pos_z         = npc.GetMovementStateInfo().TargetPosition.Z;
                npcMoveBuilder.velocity_coefficient = (float)npc.VelocityCoefficient;
                npcMoveBuilder.velocity             = npc.GetActualProperty().MoveSpeed;
                npcMoveBuilder.move_mode            = (int)npc.GetMovementStateInfo().MovementMode;
            }
            else
            {
                npcMoveBuilder.npc_id    = npc.GetId();
                npcMoveBuilder.is_moving = false;
                npcMoveBuilder.cur_pos_x = npc.GetMovementStateInfo().GetPosition3D().X;
                npcMoveBuilder.cur_pos_z = npc.GetMovementStateInfo().GetPosition3D().Z;
            }
            return(npcMoveBuilder);
        }
コード例 #3
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo        info = npc.GetAiStateInfo();
            AiData_PvpNpc_General data = GetAiData(npc);

            if (null != data)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                if (data.PatrolPath.HavePathPoint)
                {
                    info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
                    info.Time    = 0;
                    data.FoundPath.Clear();
                    ChangeToState(npc, (int)AiStateId.Patrol);
                }
                else
                {
                    ChangeToState(npc, (int)AiStateId.Combat);
                }
            }
        }
コード例 #4
0
        private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            ChangeToState(npc, (int)AiStateId.Idle);
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > m_IntervalTime)
            {
                info.Time = 0;
                AiData_Demo_Melee data = GetAiData(npc);
                if (null != data)
                {
                    Vector3 targetPos            = info.HomePos;
                    ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
                    float powDistToHome          = Geometry.DistanceSquare(srcPos, info.HomePos);
                    if (powDistToHome <= 1)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        info.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Idle);
                    }
                    else
                    {
                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100, true, this);
                    }
                }
            }
        }
コード例 #5
0
ファイル: AiLogicUtility.cs プロジェクト: yqxflong/DashFire
        private void MoveHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                npc.GetMovementStateInfo().IsMoving = false;
                ChangeToState(npc, (int)AiStateId.Wait);
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 10)
            {
                info.Time = 0;
                Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                Vector3 startPos  = info.HomePos;
                Vector3 targetPos = npc.GetMovementStateInfo().TargetPosition;
                if (!IsReached(srcPos, targetPos))
                {
                    float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                    npc.GetMovementStateInfo().SetMoveDir(angle);
                    npc.GetMovementStateInfo().IsMoving = true;
                }
            }
        }
コード例 #6
0
        protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
            info.Time    = 0;
            info.Target  = 0;
            npc.GetMovementStateInfo().IsMoving = false;
        }
コード例 #7
0
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo        info   = npc.GetAiStateInfo();
            bool                  goHome = false;
            AiData_PveNpc_General data   = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    float   dist                 = (float)npc.GetActualProperty().AttackRange;
                    float   distGoHome           = (float)npc.GohomeRange;
                    Vector3 targetPos            = target.GetMovementStateInfo().GetPosition3D();
                    ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
                    float powDist                = Geometry.DistanceSquare(srcPos, targetPos);
                    float powDistToHome          = Geometry.DistanceSquare(srcPos, info.HomePos);
                    if (powDist < dist * dist)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        info.Time = 0;
                        data.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Combat);
                        NotifyNpcMove(npc);
                    }
                    else if (true) // 目标存活的情况下屏蔽掉gohome。
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                    else
                    {
                        goHome = true;
                    }
                }
                else
                {
                    goHome = true;
                }
                if (goHome)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    data.Time = 0;
                    ChangeToState(npc, (int)AiStateId.GoHome);
                }
            }
        }
コード例 #8
0
        internal static Msg_RC_NpcEnter BuildNpcEnterMessage(NpcInfo npc)
        {
            Msg_RC_NpcEnter bder = new Msg_RC_NpcEnter();

            bder.npc_id = npc.GetId();
            Vector3 pos = npc.GetMovementStateInfo().GetPosition3D();

            bder.cur_pos_x      = (float)pos.X;
            bder.cur_pos_z      = (float)pos.Z;
            bder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();
            return(bder);
        }
コード例 #9
0
        protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo        info = npc.GetAiStateInfo();
            AiData_PvpNpc_General data = GetAiData(npc);

            if (null != data)
            {
                info.Time = 0;
                npc.GetMovementStateInfo().IsMoving = false;
                info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
                info.Target  = 0;
            }
        }
コード例 #10
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                if (GetAiData(npc).HasPatrolData)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    ChangeToState(npc, (int)AiStateId.PatrolCommand);
                }
                else
                {
                    CharacterInfo target = null;
                    if (info.IsExternalTarget)
                    {
                        target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target);
                        if (null == target)
                        {
                            target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                            if (null != target)
                            {
                                info.Target = target.GetId();
                            }
                        }
                    }
                    else
                    {
                        target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                        if (null != target)
                        {
                            info.Target = target.GetId();
                        }
                    }
                    if (null != target)
                    {
                        NotifyNpcTargetChange(npc);
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        info.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Pursuit);
                    }
                }
            }
        }
コード例 #11
0
 private void TickDebugSpaceInfo()
 {
     if (GlobalVariables.Instance.IsDebug)
     {
         bool needDebug = false;
         foreach (User user in m_Room.RoomUsers)
         {
             if (user.IsDebug)
             {
                 needDebug = true;
                 break;
             }
         }
         if (needDebug)
         {
             Msg_RC_DebugSpaceInfo builder = new Msg_RC_DebugSpaceInfo();
             for (LinkedListNode <UserInfo> linkNode = UserManager.Users.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 UserInfo info = linkNode.Value;
                 Msg_RC_DebugSpaceInfo.DebugSpaceInfo infoBuilder = new Msg_RC_DebugSpaceInfo.DebugSpaceInfo();
                 infoBuilder.obj_id    = info.GetId();
                 infoBuilder.is_player = true;
                 infoBuilder.pos_x     = (float)info.GetMovementStateInfo().GetPosition3D().X;
                 infoBuilder.pos_z     = (float)info.GetMovementStateInfo().GetPosition3D().Z;
                 infoBuilder.face_dir  = (float)info.GetMovementStateInfo().GetFaceDir();
                 builder.space_infos.Add(infoBuilder);
             }
             for (LinkedListNode <NpcInfo> linkNode = NpcManager.Npcs.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 NpcInfo info = linkNode.Value;
                 Msg_RC_DebugSpaceInfo.DebugSpaceInfo infoBuilder = new Msg_RC_DebugSpaceInfo.DebugSpaceInfo();
                 infoBuilder.obj_id    = info.GetId();
                 infoBuilder.is_player = false;
                 infoBuilder.pos_x     = (float)info.GetMovementStateInfo().GetPosition3D().X;
                 infoBuilder.pos_z     = (float)info.GetMovementStateInfo().GetPosition3D().Z;
                 infoBuilder.face_dir  = (float)info.GetMovementStateInfo().GetFaceDir();
                 builder.space_infos.Add(infoBuilder);
             }
             foreach (User user in m_Room.RoomUsers)
             {
                 if (user.IsDebug)
                 {
                     user.SendMessage(builder);
                 }
             }
         }
     }
 }
コード例 #12
0
        private void CombatHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            float rps = npc.GetActualProperty().Rps;

            if (rps > 0.001f && info.Time > 1000 / rps)
            {
                info.Time = 0;
                bool          toIdle = false;
                CharacterInfo target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target);
                if (null != target && npc.SpatialSystem.CanShoot(npc.SpaceObject, target.GetMovementStateInfo().GetPosition3D()))
                {
                    ScriptRuntime.Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    ScriptRuntime.Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    float powDist  = Geometry.DistanceSquare(srcPos, targetPos);
                    float dist     = (float)npc.GetActualProperty().AttackRange;
                    float distView = (float)npc.ViewRange;
                    if (powDist < dist * dist)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                    }
                    else if (powDist < distView * distView)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                    }
                    else
                    {
                        toIdle = true;
                    }
                }
                else
                {
                    toIdle = true;
                }
                if (toIdle)
                {
                    info.Time = 0;
                    npc.GetMovementStateInfo().IsMoving = false;
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
            }
        }
コード例 #13
0
 private void CheckImpact(NpcInfo npc)
 {
     DashFireSpatial.ISpatialSystem spatialSys = npc.SpatialSystem;
     if (null != spatialSys)
     {
         bool existNpcInAttackRange   = false;
         ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
         spatialSys.VisitObjectInCircle(srcPos, npc.GetActualProperty().AttackRange, (float distSqr, ISpaceObject obj) => {
             if (obj.GetObjType() == SpatialObjType.kNPC && (int)obj.GetID() != npc.GetId())
             {
                 NpcInfo npcObj = obj.RealObject as NpcInfo;
                 if (null != npcObj && npcObj.NpcType != (int)NpcTypeEnum.PvpTower)
                 {
                     existNpcInAttackRange = true;
                     return(false);
                 }
             }
             return(true);
         });
         if (existNpcInAttackRange)
         {
             ImpactInfo impactInfo = npc.GetSkillStateInfo().GetImpactInfoById(c_ImpactForTower);
             if (null == impactInfo)
             {
                 ServerNpcImpact(npc, c_ImpactForTower, npc);
             }
         }
     }
 }
コード例 #14
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                CharacterInfo target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                if (null != target)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    info.Time   = 0;
                    info.Target = target.GetId();
                    ChangeToState(npc, (int)AiStateId.Combat);
                    NotifyNpcTargetChange(npc);
                }
                else
                {
                }
            }
        }
コード例 #15
0
ファイル: AiLogicUtility.cs プロジェクト: yqxflong/DashFire
        public static void DoMoveCommandState(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            //执行状态处理
            AiData_ForMoveCommand data = GetAiDataForMoveCommand(npc);

            if (null == data)
            {
                return;
            }

            if (!data.IsFinish)
            {
                if (WayPointArrived(npc, data))
                {
                    MoveToNext(npc, data);
                }
            }

            //判断是否状态结束并执行相应处理
            if (null != data && data.IsFinish)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                npc.GetAiStateInfo().PopState();
            }
        }
コード例 #16
0
ファイル: AiLogicUtility.cs プロジェクト: yqxflong/DashFire
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            npc.GetMovementStateInfo().IsMoving = false;
            ChangeToState(npc, (int)AiStateId.Wait);
        }
コード例 #17
0
ファイル: AiLogicUtility.cs プロジェクト: yqxflong/DashFire
        private static void MoveToNext(NpcInfo npc, AiData_ForMoveCommand data)
        {
            if (++data.Index >= data.WayPoints.Count)
            {
                data.IsFinish = true;
                return;
            }

            var     move_info = npc.GetMovementStateInfo();
            Vector3 from      = move_info.GetPosition3D();
            Vector3 to        = data.WayPoints[data.Index];
            float   move_dir  = MoveDirection(from, to);

            float now      = TimeUtility.GetServerMilliseconds();
            float distance = Geometry.Distance(from, to);
            float speed    = npc.GetActualProperty().MoveSpeed;

            data.EstimateFinishTime = now + 1000 * (distance / speed);
            DLog._("ai_move", "[{0}]: now({1}), from({2}), to({3}), distance({4}), speed({5}), move_time({6}), estimate({7})",
                   npc.GetId(), now, from.ToString(), to.ToString(), distance, speed, 1000 * (distance / speed), data.EstimateFinishTime);

            move_info.IsMoving = true;
            move_info.SetMoveDir(move_dir);
            move_info.SetFaceDir(move_dir);
        }
コード例 #18
0
        private void PatrolHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                AiData_PvpNpc_General data = GetAiData(npc);
                if (null != data)
                {
                    CharacterInfo interestestTarget = GetInterestestTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                    if (null != interestestTarget)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        info.Time   = 0;
                        info.Target = interestestTarget.GetId();
                        data.FoundPath.Clear();
                        ChangeToState(npc, (int)AiStateId.Pursuit);
                    }
                    else
                    {
                        ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
                        if (!data.PatrolPath.IsReached(srcPos))
                        {
                            PathToTargetWithoutObstacle(npc, data.FoundPath, data.PatrolPath.CurPathPoint, 100);
                        }
                        else
                        {
                            data.PatrolPath.UseNextPathPoint();
                            data.FoundPath.Clear();
                            if (!data.PatrolPath.HavePathPoint)
                            {
                                info.Time = 0;
                                ChangeToState(npc, (int)AiStateId.Idle);
                            }
                        }
                        info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
                    }
                }
            }
        }
コード例 #19
0
        internal static Msg_RC_NpcFace BuildNpcFaceMessage(NpcInfo npc)
        {
            Msg_RC_NpcFace npcFaceBuilder = new Msg_RC_NpcFace();

            npcFaceBuilder.npc_id         = npc.GetId();
            npcFaceBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();
            return(npcFaceBuilder);
        }
コード例 #20
0
        private void DropNpc(Vector3 pos, int money, string model, string particle)
        {
            //给每个玩家掉落一个
            Data_Unit unit = new Data_Unit();

            unit.m_Id       = -1;
            unit.m_LinkId   = 100001;
            unit.m_AiLogic  = (int)AiStateLogicId.DropOut_AutoPick;
            unit.m_RotAngle = 0;
            for (LinkedListNode <UserInfo> linkNode = UserManager.Users.FirstValue; null != linkNode; linkNode = linkNode.Next)
            {
                UserInfo userInfo = linkNode.Value;
                if (null != userInfo)
                {
                    float x = CrossEngineHelper.Random.NextFloat() * 4 - 2;
                    float z = CrossEngineHelper.Random.NextFloat() * 4 - 2;
                    pos.X += x;
                    pos.Z += z;

                    NpcInfo npcInfo = NpcManager.AddNpc(unit);
                    npcInfo.GetMovementStateInfo().SetPosition(pos);
                    npcInfo.GetMovementStateInfo().SetFaceDir(0);
                    npcInfo.GetMovementStateInfo().IsMoving = false;
                    npcInfo.SetAIEnable(true);
                    npcInfo.SetCampId((int)CampIdEnum.Friendly);
                    npcInfo.OwnerId   = userInfo.GetId();
                    npcInfo.DropMoney = money;

                    DropOutInfo dropInfo = new DropOutInfo();
                    dropInfo.DropType = DropOutType.GOLD;
                    dropInfo.Value    = money;
                    dropInfo.Model    = model;
                    dropInfo.Particle = particle;
                    npcInfo.GetAiStateInfo().AiDatas.AddData <DropOutInfo>(dropInfo);
                    npcInfo.SetModel(dropInfo.Model);

                    User us = userInfo.CustomData as User;
                    if (null != us)
                    {
                        Msg_RC_CreateNpc builder = DataSyncUtility.BuildCreateNpcMessage(npcInfo);
                        us.SendMessage(builder);
                    }
                }
            }
        }
コード例 #21
0
        private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                AiData_PvpNpc_General data = GetAiData(npc);
                if (null != data)
                {
                    Vector3 targetPos            = info.HomePos;
                    ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
                    float powDistToHome          = Geometry.DistanceSquare(srcPos, info.HomePos);
                    if (powDistToHome <= 1)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        info.Time = 0;
                        data.FoundPath.Clear();
                        ChangeToState(npc, (int)AiStateId.Patrol);
                    }
                    else
                    {
                        PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100);

                        /*
                         * float angle = MathUtil.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                         * npc.GetMovementStateInfo().SetFaceDir(angle);
                         * npc.GetMovementStateInfo().SetMoveDir(angle);
                         * npc.GetMovementStateInfo().TargetPosition = targetPos;
                         * npc.GetMovementStateInfo().IsMoving = true;
                         */
                    }
                }
            }
        }
コード例 #22
0
        private void OnNpcImpact(NpcInfo npc, int impactId)
        {
            Scene scene = npc.SceneContext.CustomData as Scene;

            if (null != scene)
            {
                Msg_CRC_SendImpactToEntity sendImpactBuilder = new Msg_CRC_SendImpactToEntity();
                sendImpactBuilder.duration   = -1;
                sendImpactBuilder.impact_id  = impactId;
                sendImpactBuilder.sender_dir = npc.GetMovementStateInfo().GetFaceDir();
                sendImpactBuilder.sender_id  = npc.GetId();
                Vector3 pos = npc.GetMovementStateInfo().GetPosition3D();
                sendImpactBuilder.sender_pos   = new Position3D();
                sendImpactBuilder.sender_pos.x = pos.X;
                sendImpactBuilder.sender_pos.y = pos.Y;
                sendImpactBuilder.sender_pos.z = pos.Z;
                sendImpactBuilder.skill_id     = -1;
                sendImpactBuilder.target_id    = npc.GetId();
                scene.NotifyAreaUser(npc, sendImpactBuilder);
            }
        }
コード例 #23
0
        private void OnNpcMove(NpcInfo npc)
        {
            Scene scene = npc.SceneContext.CustomData as Scene;

            if (null != scene && !npc.GetMovementStateInfo().IsSkillMoving)
            {
                Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(npc);
                if (null != npcMoveBuilder)
                {
                    scene.NotifyAreaUser(npc, npcMoveBuilder);
                }
            }
        }
コード例 #24
0
ファイル: AiLogicUtility.cs プロジェクト: yqxflong/DashFire
 private static bool WayPointArrived(NpcInfo npc, AiData_ForMoveCommand data)
 {
     if (TimeUtility.GetServerMilliseconds() >= data.EstimateFinishTime)
     {
         var     move_info = npc.GetMovementStateInfo();
         Vector3 to        = data.WayPoints[data.Index];
         Vector3 now       = move_info.GetPosition3D();
         float   distance  = Geometry.Distance(now, to);
         DLog._("ai_move", "[{0}]: closest distance({1}) ", npc.GetId(), distance);
         return(true);
     }
     return(false);
 }
コード例 #25
0
        protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time = 0;
            npc.GetMovementStateInfo().IsMoving = false;
            info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
            info.Target  = 0;
            if (!string.IsNullOrEmpty(info.AiParam[0]))
            {
                if (int.Parse(info.AiParam[0]) == 0)
                {
                    InitPatrolData(npc);
                }
                else if (int.Parse(info.AiParam[0]) == 1)
                {
                    InitIdleAnim(npc);
                }
            }
            npc.GetActualProperty().SetMoveSpeed(Operate_Type.OT_Absolute, GetWalkSpeed(npc));
            npc.GetMovementStateInfo().MovementMode = MovementMode.LowSpeed;
        }
コード例 #26
0
        internal NpcInfo SummonNpc(int id, int owner_id, int owner_skillid, int npc_type_id, string modelPrefab, int skillid, int ailogicid, bool followsummonerdead,
                                   float x, float y, float z, string aiparamstr)
        {
            CharacterInfo charObj = SceneContext.GetCharacterInfoById(owner_id);

            if (charObj == null)
            {
                return(null);
            }
            NpcInfo   npc            = null;
            SkillInfo ownerSkillInfo = charObj.GetSkillStateInfo().GetSkillInfoById(owner_skillid);

            if (null != ownerSkillInfo)
            {
                if (null != ownerSkillInfo.m_EnableSummonNpcs && ownerSkillInfo.m_EnableSummonNpcs.Contains(npc_type_id))
                {
                    //ownerSkillInfo.m_EnableSummonNpcs.Remove(npc_type_id);

                    Data_Unit data = new Data_Unit();
                    data.m_Id       = -1;
                    data.m_LinkId   = npc_type_id;
                    data.m_CampId   = charObj.GetCampId();
                    data.m_IsEnable = true;
                    data.m_Pos      = new Vector3(x, y, z);
                    data.m_RotAngle = 0;
                    data.m_AiLogic  = ailogicid;
                    if (!string.IsNullOrEmpty(aiparamstr))
                    {
                        string[] strarry = aiparamstr.Split(new char[] { ',' }, 8);
                        int      i       = 0;
                        foreach (string str in strarry)
                        {
                            data.m_AiParam[i++] = str;
                        }
                    }
                    npc = NpcManager.AddNpc(data);
                    if (!string.IsNullOrEmpty(modelPrefab))
                    {
                        npc.SetModel(modelPrefab);
                    }
                    npc.FollowSummonerDead = followsummonerdead;
                    SkillInfo skillinfo = new SkillInfo(skillid);
                    npc.GetSkillStateInfo().AddSkill(skillinfo);
                    npc.GetMovementStateInfo().SetPosition(data.m_Pos);
                    npc.SummonOwnerId = charObj.GetId();
                    charObj.GetSkillStateInfo().AddSummonObject(npc);
                    AbstractNpcStateLogic.OnNpcSkill(npc, skillid);
                }
            }
            return(npc);
        }
コード例 #27
0
ファイル: NpcView.cs プロジェクト: yqxflong/DashFire
 public void Create(NpcInfo npc)
 {
     Init();
     if (null != npc)
     {
         m_Npc = npc;
         m_Npc.OnBeginAttack = ResetShootAnimation;
         MovementStateInfo msi = m_Npc.GetMovementStateInfo();
         Vector3           pos = msi.GetPosition3D();
         float             dir = msi.GetFaceDir();
         CreateActor(m_Npc.GetId(), m_Npc.GetModel(), pos, dir, m_Npc.Scale);
         InitAnimationSets();
         UpdateWeaponModel(m_Npc);
     }
 }
コード例 #28
0
        private void OnNpcSkill(NpcInfo npc, int skillId)
        {
            Scene scene = npc.SceneContext.CustomData as Scene;

            if (null != scene)
            {
                SkillInfo skillInfo = npc.GetSkillStateInfo().GetCurSkillInfo();
                if (null == skillInfo || !skillInfo.IsSkillActivated)
                {
                    SkillInfo curSkillInfo = npc.GetSkillStateInfo().GetSkillInfoById(skillId);
                    if (null != curSkillInfo)
                    {
                        long curTime = TimeUtility.GetServerMilliseconds();
                        if (!curSkillInfo.IsInCd(curTime / 1000.0f))
                        {
                            curSkillInfo.StartTime = curTime / 1000.0f;
                            curSkillInfo.BeginCD();
                            scene.SkillSystem.StartSkill(npc.GetId(), skillId);

                            Msg_RC_NpcSkill skillBuilder = new Msg_RC_NpcSkill();
                            skillBuilder.npc_id   = npc.GetId();
                            skillBuilder.skill_id = skillId;
                            ArkCrossEngineMessage.Position posBuilder1 = new ArkCrossEngineMessage.Position();
                            posBuilder1.x               = npc.GetMovementStateInfo().GetPosition3D().X;
                            posBuilder1.z               = npc.GetMovementStateInfo().GetPosition3D().Z;
                            skillBuilder.stand_pos      = posBuilder1;
                            skillBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();

                            LogSystem.Debug("Send Msg_RC_NpcSkill, EntityId={0}, SkillId={1}",
                                            npc.GetId(), skillId);
                            scene.NotifyAreaUser(npc, skillBuilder);
                        }
                    }
                }
            }
        }
コード例 #29
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                npc.GetMovementStateInfo().IsMoving = false;
                ChangeToState(npc, (int)AiStateId.PatrolCommand);
            }
        }
コード例 #30
0
        private Vector3 GetHomePosition(NpcInfo npc, AiData_PvpNpc_General data)
        {
            Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
            Vector3 pt     = new Vector3();

            if (data.PatrolPath.GetNearstPoint(npc.SpatialSystem, npc.AvoidanceRadius, srcPos, ref pt))
            {
                if (!npc.SpatialSystem.GetCellMapView(npc.AvoidanceRadius).CanPass(pt))
                {
                    if (!AiLogicUtility.GetWalkablePosition(npc.SpatialSystem.GetCellMapView(npc.AvoidanceRadius), pt, srcPos, ref pt))
                    {
                        pt = srcPos;
                    }
                }
            }
            return(pt);
        }