コード例 #1
0
        private void KillAll(int key_code, int what)
        {
            UserInfo playerself = WorldSystem.Instance.GetPlayerSelf();

            if (null == playerself)
            {
                return;
            }
            ///
            if ((int)Keyboard.Event.Up == what)
            {
                for (LinkedListNode <UserInfo> linkNode = WorldSystem.Instance.UserManager.Users.FirstValue; null != linkNode; linkNode = linkNode.Next)
                {
                    UserInfo info = linkNode.Value;
                    if (info.GetId() != playerself.GetId())
                    {
                        info.SetHp(Operate_Type.OT_Absolute, 0);
                    }
                }
                for (LinkedListNode <NpcInfo> linkNode = WorldSystem.Instance.NpcManager.Npcs.FirstValue; null != linkNode; linkNode = linkNode.Next)
                {
                    NpcInfo info = linkNode.Value;
                    info.SetHp(Operate_Type.OT_Absolute, 0);
                }
            }
        }
コード例 #2
0
ファイル: UserManager.cs プロジェクト: myl2232/ArkCrossEngine
        public UserInfo AddUser(int id, int resId)
        {
            UserInfo user = NewUserInfo(id);

            user.LoadData(resId);
            m_Users.AddLast(user.GetId(), user);
            return(user);
        }
コード例 #3
0
        private void OnDropoutPlayEffect(UserInfo user, NpcInfo npc, string effect, string path, int dropType, int dropNum)
        {
            CharacterView view = EntityManager.Instance.GetCharacterViewById(user.GetId());

            if (null != view)
            {
                if (!String.IsNullOrEmpty(effect))
                {
                    GfxSystem.CreateAndAttachGameObject(effect, view.Actor, path, 1.0f);
                }
                GfxSystem.PlaySound(view.Actor, "Sound/Scene/UI_UP_PickupMoney", user.GetMovementStateInfo().GetFaceDir());
            }
            Network.NetworkSystem.Instance.SyncPickUpNpc(npc);
        }
コード例 #4
0
ファイル: RoleInfo.cs プロジェクト: myl2232/ArkCrossEngine
        public void FightingScoreChangeCB(float score, int id)
        {
            UserInfo user = GetPlayerSelfInfo();

            if (null != user && id == user.GetId() &&
                !Geometry.IsSameFloat(FightingScore, score))
            {
                if (WorldSystem.Instance.IsPureClientScene())
                {
                    GfxSystem.PublishGfxEvent("ge_fightscore_change", "lobby", FightingScore, score);//通知ui做效果
                }
                FightingScore = score;
                Network.LobbyNetworkSystem.Instance.UpdateFightingScore(score);
            }
        }
コード例 #5
0
        private void UpdateMoveState(UserInfo playerself, Vector3 targetpos, float towards)
        {
            CharacterView view = EntityManager.Instance.GetUserViewById(playerself.GetId());

            if (view != null && view.ObjectInfo.IsGfxMoveControl && Geometry.IsSamePoint(Vector3.Zero, targetpos))
            {
                //LogSystem.Debug("UpdateMoveState IsGfxMoveControl : {0} , targetpos : {1}", view.ObjectInfo.IsGfxMoveControl, targetpos.ToString());
                return;
            }
            PlayerMovement.Motion m = Geometry.IsSamePoint(Vector3.Zero, targetpos) ? PlayerMovement.Motion.Stop : PlayerMovement.Motion.Moving;
            pm_.JoyStickMotionChanged = pm_.JoyStickMotionStatus != m || !Geometry.IsSameFloat(m_lastDir, towards);
            pm_.JoyStickMotionStatus  = m;
            pm_.MoveDir = towards;
            if (Geometry.IsSamePoint(Vector3.Zero, targetpos))
            {
                pm_.JoyStickMotionStatus = PlayerMovement.Motion.Stop;
                m_IsJoystickControl      = false;
            }
            else
            {
                m_IsJoystickControl = true;
            }
        }
コード例 #6
0
        private void CreatePlayerSelfParters()
        {
            RoleInfo roleself = LobbyClient.Instance.CurrentRole;

            if (null == roleself)
            {
                return;
            }
            roleself.PartnerStateInfo.ActivePartnerHpPercent = 1.0f;
            UserInfo playerself = WorldSystem.Instance.GetPlayerSelf();

            roleself.ArenaStateInfo.CreatedPartners.Clear();
            foreach (int partnerid in roleself.ArenaStateInfo.FightPartners)
            {
                PartnerInfo partner     = roleself.PartnerStateInfo.GetPartnerInfoById(partnerid);
                NpcInfo     partner_npc = CreateParterner(playerself, partner);
                if (partner_npc != null)
                {
                    roleself.ArenaStateInfo.CreatedPartners.Add(partner.Id, partner_npc);
                }
            }
            SyncGfxUserInfo(playerself.GetId());
        }
コード例 #7
0
 internal void Create(UserInfo user)
 {
     Init();
     if (null != user)
     {
         m_User            = user;
         ObjectInfo.UnitId = m_User.GetUnitId();
         ObjectInfo.CampId = m_User.GetCampId();
         ObjectInfo.LinkId = m_User.GetLinkId();
         MovementStateInfo msi = m_User.GetMovementStateInfo();
         Vector3           pos = msi.GetPosition3D();
         float             dir = msi.GetFaceDir();
         CreateActor(m_User.GetId(), m_User.GetModel(), pos, dir, m_User.Scale);
         user.ActorId = Actor;
         UpdateXSoulEquip();
         InitAnimationSets();
         ObjectInfo.IsPlayer = true;
         if (user.GetId() == WorldSystem.Instance.PlayerSelfId)
         {
             GfxSystem.MarkPlayerSelf(Actor);
         }
     }
 }
コード例 #8
0
ファイル: IAiLogic.cs プロジェクト: myl2232/ArkCrossEngine
 public void Execute(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
 {
     if (user.GetAIEnable())
     {
         UserAiStateInfo userAi = user.GetAiStateInfo();
         if (userAi.CommandQueue.Count <= 0)
         {
             int curState = userAi.CurState;
             if (curState > (int)AiStateId.Invalid && curState < (int)AiStateId.MaxNum)
             {
                 UserAiStateHandler handler;
                 if (m_Handlers.TryGetValue(curState, out handler))
                 {
                     if (null != handler)
                     {
                         handler(user, aiCmdDispatcher, deltaTime);
                     }
                 }
                 else
                 {
                     LogSystem.Error("Illegal ai state: " + curState + " user:" + user.GetId());
                 }
             }
             else
             {
                 OnStateLogicInit(user, aiCmdDispatcher, deltaTime);
                 ChangeToState(user, (int)AiStateId.Idle);
             }
         }
         ExecuteCommandQueue(user, deltaTime);
     }
 }
コード例 #9
0
 private void OnUserSkill(UserInfo user, int skillId)
 {
     //user.SkillController.PushSkill(SkillCategory.kAttack, ScriptRuntime.Vector3.Zero);
     GfxSystem.PublishGfxEvent("Ai_InputSkillCmd", "Input", user.GetId());
 }
コード例 #10
0
 private void OnUserStartAttack(UserInfo user, float x, float y, float z)
 {
     GfxSystem.PublishGfxEvent("Ai_InputAttackCmd", "Input", user.GetId(), x, y, z);
 }
コード例 #11
0
 private void TouchHandle(int what, GestureArgs e)
 {
     try
     {
         UserInfo playerself = WorldSystem.Instance.GetPlayerSelf();
         if (null == playerself || null == e)
         {
             return;
         }
         CharacterView view = EntityManager.Instance.GetUserViewById(playerself.GetId());
         if (null != playerself.SkillController &&
             playerself.SkillController.GetSkillControlMode() != SkillControlMode.kTouch)
         {
             return;
         }
         if ((int)TouchEvent.Cesture == what)
         {
             string ename = e.name;
             if (GestureEvent.OnSingleTap.ToString() == ename)
             {
                 if (EnableMoveInput)
                 {
                     if (WorldSystem.Instance.IsPureClientScene() || WorldSystem.Instance.IsPveScene())
                     {
                         if (e.selectedObjID < 0)
                         {
                             playerself.SkillController.AddBreakSkillTask();
                             if (InputType.Touch == e.inputType)
                             {
                                 FindPath(new Vector3(e.airWelGamePosX, e.airWelGamePosY, e.airWelGamePosZ));
                             }
                             else if (InputType.Joystick == e.inputType)
                             {
                                 UpdateMoveState(playerself, new Vector3(e.airWelGamePosX, e.airWelGamePosY, e.airWelGamePosZ), e.towards);
                             }
                             UpdateTowards(playerself, e.towards);
                         }
                         else
                         {
                             Combat(playerself, e.selectedObjID, e.attackRange);
                         }
                         m_lastSelectObjId = e.selectedObjID;
                         ///
                         // GfxSystem.PublishGfxEvent("Op_InputEffect", "Input", GestureEvent.OnSingleTap, e.airWelGamePosX, e.airWelGamePosY, e.airWelGamePosZ, e.selectedObjID < 0 ? false : true, true);
                     }
                     else if (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene())
                     {
                         if (e.selectedObjID < 0)
                         {
                             if (InputType.Touch == e.inputType)
                             {
                                 NetworkSystem.Instance.SyncPlayerMoveToPos(new Vector3(e.airWelGamePosX, e.airWelGamePosY, e.airWelGamePosZ));
                             }
                             else if (InputType.Joystick == e.inputType)
                             {
                                 UpdateMoveState(playerself, new Vector3(e.airWelGamePosX, e.airWelGamePosY, e.airWelGamePosZ), e.towards);
                                 playerself.SkillController.AddBreakSkillTask();
                             }
                         }
                         else
                         {
                             NetworkSystem.Instance.SyncPlayerMoveToAttack(e.selectedObjID, e.attackRange);
                         }
                     }
                 }
             }
             else if (GestureEvent.OnFingerMove.ToString() == ename)
             {
                 if (EnableMoveInput)
                 {
                     if (view.ObjectInfo.IsGfxMoveControl && !view.ObjectInfo.IsGfxRotateControl)
                     {
                         UpdateTowards(playerself, e.towards);
                     }
                 }
             }
             else if (GestureEvent.OnSkillStart.ToString() == ename)
             {
                 if (null != playerself)
                 {
                     UserAiStateInfo info = playerself.GetAiStateInfo();
                     if ((int)AiStateId.Move == info.CurState)
                     {
                         StopFindPath(playerself, info);
                     }
                 }
             }
             else if (GestureEvent.OnEasyGesture.ToString() == ename)
             {
                 Vector3 targetpos = new Vector3(e.startGamePosX, e.startGamePosY, e.startGamePosZ);
                 if (Vector3.Zero != targetpos)
                 {
                     PushSkill(playerself, targetpos, e.attackRange);
                 }
             }
         }
     }
     catch (Exception ex)
     {
         LogicSystem.LogFromGfx("[Error]:Exception:{0}\n{1}", ex.Message, ex.StackTrace);
     }
 }
コード例 #12
0
        private void SummonPartner(int key_code, int what)
        {
            RoleInfo roleself = LobbyClient.Instance.CurrentRole;

            if (null == roleself)
            {
                return;
            }
            UserInfo playerself = WorldSystem.Instance.GetPlayerSelf();

            if (null == playerself)
            {
                return;
            }
            ///
            if ((int)Keyboard.Event.Up == what)
            {
                // summonpartner
                PartnerInfo partnerInfo = roleself.PartnerStateInfo.GetActivePartner();
                if (null != partnerInfo)
                {
                    Data_Unit data = new Data_Unit();
                    data.m_Id         = -1;
                    data.m_LinkId     = partnerInfo.LinkId;
                    data.m_CampId     = playerself.GetCampId();
                    data.m_Pos        = playerself.GetMovementStateInfo().GetPosition3D();
                    data.m_RotAngle   = 0;
                    data.m_AiLogic    = partnerInfo.GetAiLogic();
                    data.m_AiParam[0] = "";
                    data.m_AiParam[1] = "";
                    data.m_AiParam[2] = partnerInfo.GetAiParam().ToString();
                    data.m_IsEnable   = true;
                    NpcInfo npc = WorldSystem.Instance.NpcManager.AddNpc(data);
                    if (null != npc)
                    {
                        AppendAttributeConfig aac       = AppendAttributeConfigProvider.Instance.GetDataById(partnerInfo.GetAppendAttrConfigId());
                        float inheritAttackAttrPercent  = partnerInfo.GetInheritAttackAttrPercent();
                        float inheritDefenceAttrPercent = partnerInfo.GetInheritDefenceAttrPercent();
                        if (null != aac)
                        {
                            // attack
                            npc.GetBaseProperty().SetAttackBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().AttackBase *inheritAttackAttrPercent));
                            npc.GetBaseProperty().SetFireDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().FireDamage *inheritAttackAttrPercent);
                            npc.GetBaseProperty().SetIceDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().IceDamage *inheritAttackAttrPercent);
                            npc.GetBaseProperty().SetPoisonDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().PoisonDamage *inheritAttackAttrPercent);
                            // defence
                            npc.GetBaseProperty().SetHpMax(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().HpMax *inheritDefenceAttrPercent));
                            npc.GetBaseProperty().SetEnergyMax(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().EnergyMax *inheritDefenceAttrPercent));
                            npc.GetBaseProperty().SetADefenceBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().ADefenceBase *inheritDefenceAttrPercent));
                            npc.GetBaseProperty().SetMDefenceBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().MDefenceBase *inheritDefenceAttrPercent));
                            npc.GetBaseProperty().SetFireERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().FireERD *inheritDefenceAttrPercent);
                            npc.GetBaseProperty().SetIceERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().IceERD *inheritDefenceAttrPercent);
                            npc.GetBaseProperty().SetPoisonERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().PoisonERD *inheritDefenceAttrPercent);
                            // reset hp & energy
                            npc.SetHp(Operate_Type.OT_Absolute, npc.GetActualProperty().HpMax);
                            npc.SetEnergy(Operate_Type.OT_Absolute, npc.GetActualProperty().EnergyMax);
                        }
                        npc.SetAIEnable(true);
                        npc.GetSkillStateInfo().RemoveAllSkill();
                        npc.BornTime = TimeUtility.GetServerMilliseconds();
                        List <int> skillList = partnerInfo.GetSkillList();
                        if (null != skillList)
                        {
                            for (int i = 0; i < skillList.Count; ++i)
                            {
                                SkillInfo skillInfo = new SkillInfo(skillList[i]);
                                npc.GetSkillStateInfo().AddSkill(skillInfo);
                            }
                        }
                        npc.SkillController  = new SwordManSkillController(npc, GfxModule.Skill.GfxSkillSystem.Instance);
                        npc.OwnerId          = playerself.GetId();
                        playerself.PartnerId = npc.GetId();
                        EntityManager.Instance.CreateNpcView(npc.GetId());
                        if (partnerInfo.BornSkill > 0)
                        {
                            SkillInfo skillInfo = new SkillInfo(partnerInfo.BornSkill);
                            npc.GetSkillStateInfo().AddSkill(skillInfo);
                            npc.SkillController.ForceStartSkill(partnerInfo.BornSkill);
                        }
                        CharacterView view = EntityManager.Instance.GetCharacterViewById(npc.GetId());
                        if (null != view)
                        {
                            GfxSystem.SetLayer(view.Actor, "PhysicObj");
                        }
                    }
                }
            }
        }
コード例 #13
0
        private UserInfo CreateArenaTarget(ArenaTargetInfo target)
        {
            if (target == null)
            {
                return(null);
            }
            int      image_res_id = target.HeroId;
            UserInfo image_player = m_UserMgr.AddUser(image_res_id);

            if (null != image_player)
            {
                image_player.SceneContext = m_SceneContext;
                int campid = NetworkSystem.Instance.CampId == (int)CampIdEnum.Blue ? (int)CampIdEnum.Red : (int)CampIdEnum.Blue;
                image_player.SetCampId(campid);
                Data_Unit unit = m_CurScene.StaticData.ExtractData(DataMap_Type.DT_Unit, GlobalVariables.GetUnitIdByCampId(campid)) as Data_Unit;
                if (null != unit)
                {
                    image_player.GetAiStateInfo().AiLogic = unit.m_AiLogic;
                    image_player.SetAIEnable(true);
                    image_player.GetMovementStateInfo().SetPosition(unit.m_Pos);
                    image_player.GetMovementStateInfo().SetFaceDir(unit.m_RotAngle);
                }
                image_player.SetLevel(target.Level);
                image_player.SetNickName(target.Nickname);
                image_player.SkillController = new SwordManSkillController(image_player, GfxModule.Skill.GfxSkillSystem.Instance);
                if (null != m_SpatialSystem)
                {
                    m_SpatialSystem.AddObj(image_player.SpaceObject);
                }
                /// skills
                if (null != target.Skills)
                {
                    image_player.GetSkillStateInfo().RemoveAllSkill();
                    int skill_ct = target.Skills.Count;
                    for (int i = 0; i < skill_ct; i++)
                    {
                        SkillInfo info = target.Skills[i];
                        if (null != info)
                        {
                            SkillCategory cur_skill_pos = SkillCategory.kNone;
                            if (info.Postions.Presets[0] == SlotPosition.SP_A)
                            {
                                cur_skill_pos = SkillCategory.kSkillA;
                            }
                            else if (info.Postions.Presets[0] == SlotPosition.SP_B)
                            {
                                cur_skill_pos = SkillCategory.kSkillB;
                            }
                            else if (info.Postions.Presets[0] == SlotPosition.SP_C)
                            {
                                cur_skill_pos = SkillCategory.kSkillC;
                            }
                            else if (info.Postions.Presets[0] == SlotPosition.SP_D)
                            {
                                cur_skill_pos = SkillCategory.kSkillD;
                            }
                            info.Category = cur_skill_pos;
                            image_player.GetSkillStateInfo().AddSkill(info);
                            WorldSystem.Instance.AddSubSkill(image_player, info.SkillId, cur_skill_pos, info.SkillLevel);
                        }
                    }
                }
                Data_PlayerConfig playerData = PlayerConfigProvider.Instance.GetPlayerConfigById(image_player.GetLinkId());
                if (null != playerData && null != playerData.m_FixedSkillList &&
                    playerData.m_FixedSkillList.Count > 0)
                {
                    foreach (int skill_id in playerData.m_FixedSkillList)
                    {
                        SkillInfo info = new SkillInfo(skill_id, 1);
                        image_player.GetSkillStateInfo().AddSkill(info);
                    }
                }
                image_player.ResetSkill();
                /// equips
                if (null != target.Equips)
                {
                    int equip_ct = target.Equips.Length;
                    for (int i = 0; i < equip_ct; i++)
                    {
                        ItemDataInfo image_equip = target.Equips[i];
                        if (null != image_equip)
                        {
                            image_player.GetEquipmentStateInfo().ResetEquipmentData(i);
                            image_equip.ItemConfig = ItemConfigProvider.Instance.GetDataById(image_equip.ItemId);
                            if (null != image_equip.ItemConfig)
                            {
                                image_player.GetEquipmentStateInfo().SetEquipmentData(i, image_equip);
                            }
                        }
                    }
                }
                ///
                if (null != target.Legacys)
                {
                    int legacy_ct = target.Legacys.Length;
                    for (int i = 0; i < legacy_ct; i++)
                    {
                        ItemDataInfo image_legacy = target.Legacys[i];
                        if (null != image_legacy && image_legacy.IsUnlock)
                        {
                            image_player.GetLegacyStateInfo().ResetLegacyData(i);
                            image_legacy.ItemConfig = ItemConfigProvider.Instance.GetDataById(image_legacy.ItemId);
                            if (null != image_legacy.ItemConfig)
                            {
                                image_player.GetLegacyStateInfo().SetLegacyData(i, image_legacy);
                            }
                        }
                    }
                    image_player.GetLegacyStateInfo().UpdateLegacyComplexAttr();
                }
                foreach (ArenaXSoulInfo x in target.XSoulInfo)
                {
                    ItemDataInfo item = new ItemDataInfo();
                    item.ItemId     = x.ItemId;
                    item.Level      = x.Level;
                    item.Experience = x.Experience;
                    item.UpdateLevelByExperience();
                    ItemConfig config = ItemConfigProvider.Instance.GetDataById(item.ItemId);
                    if (config == null)
                    {
                        continue;
                    }
                    item.ItemConfig = config;
                    XSoulPartInfo part = new XSoulPartInfo((XSoulPart)config.m_WearParts, item);
                    part.ShowModelLevel = x.ModelLevel;
                    image_player.GetXSoulInfo().SetXSoulPartData((XSoulPart)config.m_WearParts, part);
                }
                image_player.SetPartnerInfo(target.ActivePartner);
                SetArenaCharacterCoefficient(image_player);
                UserAttrCalculator.Calc(image_player);
                image_player.SetHp(Operate_Type.OT_Absolute, image_player.GetActualProperty().HpMax);
                image_player.SetRage(Operate_Type.OT_Absolute, 0);
                image_player.SetEnergy(Operate_Type.OT_Absolute, image_player.GetActualProperty().EnergyMax);

                target.CreatedPartners.Clear();
                int total_hp = image_player.GetActualProperty().HpMax;
                //LogSystem.Error("---challenge target hp=" + image_player.GetActualProperty().HpMax);
                foreach (PartnerInfo partner in target.FightPartners)
                {
                    NpcInfo partner_npc = CreateParterner(image_player, partner);
                    if (partner_npc != null)
                    {
                        target.CreatedPartners.Add(partner.Id, partner_npc);
                        //LogSystem.Error("---parnter {0} hp={1}", partner.Id, partner_npc.GetBaseProperty().HpMax);
                        total_hp += partner_npc.GetBaseProperty().HpMax;
                    }
                }
                //LogSystem.Error("-----challenge target total hp=" + total_hp);
                EntityManager.Instance.CreateUserView(image_player.GetId());
                UserView image_view = EntityManager.Instance.GetUserViewById(image_player.GetId());
                image_view.UpdateEquipment();
                image_view.UpdateXSoulEquip();
            }
            SyncGfxUserInfo(image_player.GetId());
            return(image_player);
        }
コード例 #14
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > m_IntervalTime)
            {
                info.Time = 0;
                DropOutInfo dropInfo = npc.GetAiStateInfo().AiDatas.GetData <DropOutInfo>();
                if (null != dropInfo)
                {
                    if (npc.IsBorning)
                    {
                        Vector3 curPos = npc.GetMovementStateInfo().GetPosition3D();
                        if (dropInfo.BornTarget == Vector3.Zero)
                        {
                            double tempAngle = CrossEngineHelper.Random.NextFloat() * Math.PI;
                            float  length    = CrossEngineHelper.Random.NextFloat() * 3.0f;
                            dropInfo.BornTarget = curPos + new Vector3((float)Math.Cos(tempAngle), 0, (float)Math.Sin(tempAngle)) * length;
                            dropInfo.BornAngle  = (float)tempAngle;
                        }
                        //npc.GetMovementStateInfo().SetMoveDir(dropInfo.BornAngle);
                        //npc.GetMovementStateInfo().IsMoving = true;
                        //NotifyNpcWalk(npc);
                        return;
                    }
                    else
                    {
                        if (!dropInfo.IsBornOver)
                        {
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                        }
                    }
                }
                UserInfo target = null;
                target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_FRIEND, AiTargetType.USER) as UserInfo;
                if (null != target && !npc.NeedDelete)
                {
                    Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    float   dis       = Geometry.Distance(srcPos, targetPos);
                    float   angle     = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                    if (dis <= m_AttractRange && dis > m_PickUpRange)
                    {
                        // 吸取
                        float move = npc.GetActualProperty().MoveSpeed *m_IntervalTime / 1000;
                        npc.GetMovementStateInfo().SetMoveDir(angle);
                        //npc.GetMovementStateInfo().PositionY = targetPos.Y + (1 - dis / m_AttractRange) * m_Height;
                        //npc.GetMovementStateInfo().SetPosition2D(srcPos.X + move * (float)Math.Cos(angle), srcPos.Z + move * (float)Math.Sin(angle));
                        npc.GetMovementStateInfo().IsMoving = true;
                        NotifyNpcRun(npc);
                    }
                    else if (dis <= m_PickUpRange)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        string path = "";
                        if (null != dropInfo)
                        {
                            switch (dropInfo.DropType)
                            {
                            case DropOutType.GOLD:
                                target.Money += dropInfo.Value;
                                target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value);
                                path = "ef_head";
                                break;

                            case DropOutType.HP:
                                int addHp = (int)(target.GetActualProperty().HpMax *dropInfo.Value / 100.0f);
                                if (target.GetActualProperty().HpMax > addHp + target.Hp)
                                {
                                    target.SetHp(Operate_Type.OT_Relative, addHp);
                                }
                                else
                                {
                                    target.SetHp(Operate_Type.OT_Absolute, target.GetActualProperty().HpMax);
                                }
                                target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, addHp, 0);
                                path = "Bone_Root";
                                break;

                            case DropOutType.MP:
                                int addEnergy = (int)(target.GetActualProperty().EnergyMax *dropInfo.Value / 100.0f);
                                if (target.GetActualProperty().EnergyMax > addEnergy + target.Energy)
                                {
                                    target.SetEnergy(Operate_Type.OT_Relative, addEnergy);
                                }
                                else
                                {
                                    target.SetEnergy(Operate_Type.OT_Absolute, target.GetActualProperty().EnergyMax);
                                }
                                target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, 0, addEnergy);
                                path = "Bone_Root";
                                break;

                            case DropOutType.MULT_GOLD:
                                target.Money += dropInfo.Value;
                                target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value);
                                path = "ef_head";
                                break;
                            }
                            if (null != OnDropoutPlayEffect)
                            {
                                OnDropoutPlayEffect(target, npc, dropInfo.Particle, path, (int)dropInfo.DropType, dropInfo.Value);
                            }
                        }
                        npc.NeedDelete = true;
                    }
                }
            }
        }
コード例 #15
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            if (npc.IsDead())
            {
                return;
            }
            if (npc.IsUnderControl())
            {
                // 被动进入战斗
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                CharacterInfo target = AiLogicUtility.GetRandomTargetHelper(npc, CharacterRelation.RELATION_ENEMY, AiTargetType.ALL);
                if (null != target)
                {
                    info.Target = target.GetId();
                    NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Pursuit);
                }
                else
                {
                    if ((int)NpcTypeEnum.Partner == npc.NpcType)
                    {
                        CharacterInfo owner = npc.SceneContext.GetCharacterInfoById(npc.OwnerId);
                        if (null != owner)
                        {
                            Vector3 targetPos = owner.GetMovementStateInfo().GetPosition3D();
                            Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                            if (Geometry.DistanceSquare(targetPos, srcPos) > 16)
                            {
                                AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, info.Time, true, this);
                            }
                            else
                            {
                                npc.GetMovementStateInfo().IsMoving = false;
                                NotifyNpcMove(npc);
                            }
                        }
                        else
                        {
                            UserInfo master = AiLogicUtility.GetRandomTargetHelper(npc, CharacterRelation.RELATION_FRIEND, AiTargetType.USER) as UserInfo;
                            if (null != master)
                            {
                                npc.OwnerId = master.GetId();
                            }
                        }
                    }
                    else
                    {
                        if (null != GetAiPatrolData(npc))
                        {
                            npc.GetMovementStateInfo().IsMoving = false;
                            ChangeToState(npc, (int)AiStateId.Patrol);
                        }
                    }
                }
                info.Time = 0;
            }
        }