예제 #1
0
        public EBTStatus HasEnemyInRange(int range)
        {
            ulong num = (ulong)((long)range * (long)range);
            List <CharHandle_t> gameChars = GameCharMgr.instance.GameChars;
            int count = gameChars.Count;

            for (int i = 0; i < count; i++)
            {
                CCChar handle = gameChars[i].handle;
                if (!m_wrapper.actor.IsSelfCamp(handle))
                {
                    MonsterLogic MonsterLogic = handle.AsMonster();
                    if (MonsterLogic != null)
                    {
                        ADTMonsterCfgInfo cfgInfo = MonsterLogic.cfgInfo;
                        if (cfgInfo != null && cfgInfo.bMonsterType == 2)
                        {
                            ObjAgent actorAgent = handle.pCharAgent;
                            if (actorAgent.GetCurBehavior() == eObjBehavMode.State_Idle || actorAgent.GetCurBehavior() == eObjBehavMode.State_Dead || actorAgent.GetCurBehavior() == eObjBehavMode.State_Null)
                            {
                                goto IL_E0;
                            }
                        }
                    }
                    ulong sqrMagnitudeLong2D = (ulong)(handle.location - m_wrapper.actor.location).sqrMagnitudeLong2D;
                    if (sqrMagnitudeLong2D < num)
                    {
                        return(EBTStatus.BT_SUCCESS);
                    }
                }
                IL_E0 :;
            }
            return(EBTStatus.BT_FAILURE);
        }
예제 #2
0
        public uint GetNearestEnemy(int srchR)
        {
            uint   objid        = 0;
            CCChar nearestEnemy = TargetSearcher.instance.GetNearestEnemy(m_wrapper.actor, srchR, 0u, true);

            if (nearestEnemy != null)
            {
                objid = nearestEnemy.ObjID;
            }
            // #if DEBUG_LOGOUT
            //             if (MobaGo.Game.Data.DebugMask.HasMask(MobaGo.Game.Data.DebugMask.E_DBG_MASK.MASK_MOVEDATA))
            //                 DebugHelper.LogOut("The id = " + m_wrapper.actorPtr.handle.ObjID + " targetid =  " + objid);
            // #endif
            return(objid);
        }
예제 #3
0
        public bool HasMemberHpLessThan(int hpRate)
        {
            Player ownerPlayer = CharHelper.GetOwnerPlayer(ref m_wrapper.actorPtr);

            ReadonlyContext <CharHandle_t> .Enumerator enumerator = ownerPlayer.GetAllHeroes().GetEnumerator();
            while (enumerator.MoveNext())
            {
                CharHandle_t current = enumerator.Current;
                CCChar       handle  = current.handle;
                if (hpRate > handle.pPropertyCtrl.actorHp * 10000 / handle.pPropertyCtrl.actorHpTotal)
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #4
0
        public uint GetLowHpFriendChar(int srchR, int HPRate, eSkillSlotType InSlot)
        {
            uint  filter = 0u;
            Skill skill  = m_wrapper.GetSkill(InSlot);

            if (skill != null && skill.cfgData != null)
            {
                filter = skill.cfgData.dwSkillTargetFilter;
            }
            CCChar lowHpTeamMember = TargetSearcher.instance.GetLowHpTeamMember(m_wrapper.actorPtr, srchR, HPRate, filter);

            if (lowHpTeamMember != null)
            {
                return(lowHpTeamMember.ObjID);
            }
            return(0u);
        }
예제 #5
0
        public bool IsDistanceToActorInRange(uint objID, int range)
        {
            CharHandle_t actor = GameCharMgr.instance.GetActor(objID);

            if (!actor)
            {
                return(false);
            }
            CCChar handle = actor.handle;
            long   num    = (long)range;

            if (handle.CharInfo != null)
            {
                num += (long)handle.CharInfo.iCollisionSize.x;
            }
            return((m_wrapper.actorLocation - handle.location).sqrMagnitudeLong2D < num * num);
        }
예제 #6
0
        public EBTStatus IsNearbyFriendStrongThanEnemy(int srchR, int strengthRate)
        {
            ulong num = (ulong)((long)srchR * (long)srchR);
            List <CharHandle_t> heroChars = GameCharMgr.instance.HeroChars;
            int count               = heroChars.Count;
            int sumCurHpSelfCamp    = 0;
            int sumTotalHpSelfCamp  = 0;
            int sumCurHpOtherCamp   = 0;
            int sumTotalHpOtherCamp = 0;

            for (int i = 0; i < count; i++)
            {
                CCChar handle             = heroChars[i].handle;
                ulong  sqrMagnitudeLong2D = (ulong)(handle.location - m_wrapper.actor.location).sqrMagnitudeLong2D;
                if (sqrMagnitudeLong2D < num)
                {
                    if (m_wrapper.actor.IsSelfCamp(handle))
                    {
                        sumCurHpSelfCamp   += handle.pPropertyCtrl.actorHp;
                        sumTotalHpSelfCamp += handle.pPropertyCtrl.actorHpTotal;
                    }
                    else
                    {
                        sumCurHpOtherCamp   += handle.pPropertyCtrl.actorHp;
                        sumTotalHpOtherCamp += handle.pPropertyCtrl.actorHpTotal;
                    }
                }
            }
            if (sumCurHpOtherCamp == 0)
            {
                return(EBTStatus.BT_SUCCESS);
            }
            if (sumCurHpSelfCamp * sumTotalHpOtherCamp * 10000 > sumCurHpOtherCamp * sumTotalHpSelfCamp * strengthRate)
            //(sumCurHpSelfCamp / sumTotalHpSelfCamp) / (sumTotalHpSelfCamp / sumTotalHpOtherCamp) > strengthRate / 10000
            {
                return(EBTStatus.BT_SUCCESS);
            }
            return(EBTStatus.BT_FAILURE);
        }
예제 #7
0
 public virtual void Born(CCChar actor)
 {
     m_wrapper       = actor.pCharCtrl;
     m_AgentFileName = "HostAI";
     base.SetCurAgentActive();
 }