Beispiel #1
0
 public Mob(int objectId, NpcMetadata metadata) : base(objectId, metadata)
 {
     Animation = AnimationStorage.GetSequenceIdBySequenceName(metadata.Model, "Idle_A");
     AI        = MobAIManager.GetAI(metadata.AiInfo);
     Stats     = new(metadata);
     State     = NpcState.Normal;
 }
 public override void OnEnable()
 {
     base.OnEnable();
     playersLayer = LayerMask.NameToLayer("Players");
     npcLayer     = LayerMask.NameToLayer("NPC");
     checkMask    = LayerMask.GetMask("Players", "NPC", "Windows", "Objects");
     mobAI        = GetComponent <MobAI>();
 }
Beispiel #3
0
 public static float[] GetRandomPos(Map map, float x, float y, float range)
 {
     float[] pos     = new float[3];
     float[] unitvec = new float[3];
     pos[0]  = x;
     pos[1]  = y;
     unitvec = MobAI.GetRandomUnitVector();
     pos     = MobAI.Add(pos, MobAI.ScalarProduct(unitvec, Global.Random.Next(0, (int)range)));
     pos[2]  = map.GetHeight(pos[0], pos[1]);
     return(pos);
 }
Beispiel #4
0
    IEnumerator ActualSpawn(int num)
    {
        for (int i = 0; i < num; i++)
        {
            yield return(new WaitForSeconds(1.0f));

            MobAI mob = Instantiate(friendly, transform.position, Quaternion.identity);
            mob.ground     = ground;
            mob.collidable = collidable;
        }
        yield return(null);
    }
Beispiel #5
0
    private void Update()
    {
        gameObject.renderer.material.color = Color.Lerp(MaxDamageColor, MinDamageColor, curHP / maxHP); //Лерпим цвет моба по заданным в начале цветам. В примере: красный - моб почти полностью убит, синий - целый.
        if (curHP <= 0)                                                                                 //если ХП упало в ноль или ниже
        {
            MobAI mai = gameObject.GetComponent <MobAI>();                                              //подключаемся к компоненту AI моба
            if (mai != null)
            {
                GlobalVars.PlayerMoney += mai.mobPrice;                 //если он существует - добавляем денег игроку в размере цены за голову моба
            }

            if (explosionPrefab != null)
            {
                Instantiate(explosionPrefab, gameObject.transform.position, Quaternion.identity);
            }

            Destroy(gameObject);             //удаляем себя
        }
    }
        private static void ParseAI(XmlDocument document)
        {
            XmlNode behaviorsNode = document.SelectSingleNode("/ai/behavior");

            MobAI ai = new MobAI();

            foreach (XmlNode node in behaviorsNode)
            {
                NpcState          stateValue     = GetMobState(node.Name);
                NpcAction         newActionValue = GetMobAction(node.Attributes["action"]?.Value);
                MobMovement       movementValue  = GetMobMovement(node.Attributes["movement"]?.Value);
                MobAI.Condition[] conditions     = GetConditions(/*node*/);

                ai.Rules.TryAdd(stateValue, (newActionValue, movementValue, Array.Empty <MobAI.Condition>()));
            }

            string aiName = document.BaseURI.Split("MobAI/")[1];

            AiTable.Add(aiName, ai);
        }
Beispiel #7
0
 private void Awake()
 {
     mobAI      = GetComponent <MobAI>();
     mood       = GetComponent <MobMood>();
     mobExplore = GetComponent <MobExplore>();
 }
Beispiel #8
0
 private void Awake()
 {
     mobAi      = GetComponent <MobAI>();
     lbh        = GetComponent <LivingHealthBehaviour>();
     mobExplore = GetComponent <MobExplore>();
 }
Beispiel #9
0
 public void Update(object para)
 {
     dest = CurrentTarget();
     if (dest == null)
     {
         mob.ai.AIActivity = MobAI.Activity.LAZY;
         if (mob.ai.commands.ContainsKey("Chase") == true)
         {
             mob.ai.commands.Remove("Chase");
         }
         ;
         return;
     }
     mob.ai.AIActivity = MobAI.Activity.BUSY;
     if (mob.ai.commands.ContainsKey("Move") == true)
     {
         mob.ai.commands.Remove("Move");
     }
     attacktask.dActor = dest;
     if (mob.ai.commands.ContainsKey("Chase") == true)
     {
         if (attacktask.Activated() == true)
         {
             attacktask.Deactivate();
         }
         attacking = false;
         return;
     }
     if (dest.stance == Global.STANCE.DIE)
     {
         if (mob.Hate.ContainsKey(dest.id))
         {
             mob.Hate.Remove(dest.id);
         }
         if (attacktask.Activated() == true)
         {
             attacktask.Deactivate();
         }
         attacktask = null;
         return;
     }
     ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)dest.e;
     if (eh.C.state == MapClient.SESSION_STATE.LOGGEDOFF)
     {
         if (mob.Hate.ContainsKey(dest.id))
         {
             mob.Hate.Remove(dest.id);
         }
         if (attacktask.Activated() == true)
         {
             attacktask.Deactivate();
         }
         attacktask = null;
         return;
     }
     float[] src = new float[3] {
         mob.Actor.x, mob.Actor.y, mob.Actor.z
     };
     float[] dst = new float[3] {
         dest.x, dest.y, dest.z
     };
     if (MobAI.GetDistance2(src, dst) > (150 + (mob.Size)))
     {
         Chase chase = new Chase(this.mob, dest);
         mob.ai.commands.Add("Chase", chase);
         if (attacktask.Activated() == true)
         {
             attacktask.Deactivate();
         }
         attacking = false;
     }
     else
     {
         if (attacktask.Activated() == false)
         {
             attacktask.Activate();
         }
         attacking = true;
     }
 }
Beispiel #10
0
    public void Init(Creature owner, RefMob refMob, RefItem refItem, int level, int evolution)
    {
        base.Init(refMob, level, evolution);

        m_owner = owner;
        m_owner.AddFollower(this);

        CreatureType = m_owner.CreatureType;
        m_consumedSP = refItem.consumedSP;

        if (m_creatureProperty.MoveSpeed == 0f)
        {
            EnableNavMeshObstacleAvoidance(false);
        }

        Transformation(transform, evolution);

        switch(refMob.mobAI)
        {
        case MobAIType.Normal:
            m_ai = new MobAINormal();
            break;
        case MobAIType.Rotation:
            m_ai = new MobAIRotation();
            break;
        case MobAIType.FlyingAround:
            m_ai = new MobAIFlyingAround();
            break;
        case MobAIType.ItemShuttle:
            m_ai = new MobAIItemShuttle();
            break;
        case MobAIType.Pickup:
            m_ai = new MobAIPickup();
            ((MobAIPickup)(m_ai)).SetOwner(m_owner);
            CreatureType = Type.Npc;
            gameObject.layer = 0;
            break;
        case MobAIType.Follow:
            m_ai = new MobAIFollow();
            ((MobAIFollow)(m_ai)).SetOwner(m_owner);
            CreatureType = Type.ChampNpc;
            gameObject.layer = 0;
            StartCoroutine(DecSpEffect());
            break;
        }

        m_ai.Init(this);
    }
Beispiel #11
0
        public void Init(int ownerId,
                         MobAI aiType,
                         MoveArea moveArea,
                         int idleTime          = 4000,
                         byte chaseRange       = 10,
                         byte chaseSpeed       = 5,
                         int chaseTime         = 1000,
                         byte idleSpeed        = 1,
                         bool isAttack1Enabled = false,
                         bool isAttack2Enabled = false,
                         bool isAttack3Enabled = false,
                         byte attack1Range     = 1,
                         byte attack2Range     = 1,
                         byte attack3Range     = 1,
                         ushort attackType1    = 0,
                         ushort attackType2    = 0,
                         ushort attackType3    = 0,
                         Element attackAttrib1 = Element.None,
                         Element attackAttrib2 = Element.None,
                         Element attackAttrib3 = Element.None,
                         ushort attack1        = 0,
                         ushort attack2        = 0,
                         ushort attack3        = 0,
                         ushort attackPlus1    = 0,
                         ushort attackPlus2    = 0,
                         ushort attackPlus3    = 0,
                         int attackTime1       = 0,
                         int attackTime2       = 0,
                         int attackTime3       = 0)
        {
            _ownerId = ownerId;

            AI       = aiType;
            MoveArea = moveArea;

            _idleTime   = idleTime;
            _chaseRange = chaseRange;
            _chaseSpeed = chaseSpeed;
            _chaseTime  = chaseTime;

            _idleSpeed = idleSpeed;

            IsAttack1Enabled = isAttack1Enabled;
            IsAttack2Enabled = isAttack2Enabled;
            IsAttack3Enabled = isAttack3Enabled;

            AttackRange1 = attack1Range;
            AttackRange2 = attack2Range;
            AttackRange3 = attack3Range;

            AttackType1 = attackType1;
            AttackType2 = attackType2;
            AttackType3 = attackType3;

            AttackAttrib1 = attackAttrib1;
            AttackAttrib2 = attackAttrib2;
            AttackAttrib3 = attackAttrib3;

            Attack1 = attack1;
            Attack2 = attack2;
            Attack3 = attack3;

            AttackPlus1 = attackPlus1;
            AttackPlus2 = attackPlus2;
            AttackPlus3 = attackPlus3;

            AttackTime1 = attackTime1;
            AttackTime2 = attackTime2;
            AttackTime3 = attackTime3;

            SetupAITimers();

            State = AIState.Idle;
        }
Beispiel #12
0
        public void Update(object para)
        {
            try
            {
                ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)dest.e;
                if (eh.C.state == MapClient.SESSION_STATE.LOGGEDOFF)
                {
                    this.status = CommandStatus.FINISHED;
                    return;
                }
                if (mob.Map.HasHeightMap())
                {
                    if (mob.Map.HeightMap.water_level != 0)
                    {
                        switch (mob.LivingSpace)
                        {
                        case Mob.Space.Land:
                            if (dest.z < mob.Map.HeightMap.water_level)
                            {
                                if (mob.Hate.ContainsKey(dest.id))
                                {
                                    mob.Hate.Remove(dest.id);
                                }
                                this.Status = CommandStatus.FINISHED;
                                return;
                            }
                            break;

                        case Mob.Space.Water:
                            if (dest.z >= mob.Map.HeightMap.water_level)
                            {
                                if (mob.Hate.ContainsKey(dest.id))
                                {
                                    mob.Hate.Remove(dest.id);
                                }
                                this.Status = CommandStatus.FINISHED;
                                return;
                            }
                            break;
                        }
                    }
                }

                if (mob.RunSpeed == 0 || mob.Actor.Tasks.ContainsKey("Freezing") || mob.Actor.BattleStatus.Additions.ContainsKey("LowerBodyParalysis"))
                {
                    return;
                }
                float[] src = new float[3] {
                    mob.Actor.x, mob.Actor.y, mob.Actor.z
                };
                float[] dst = new float[3] {
                    dest.x, dest.y, dest.z
                };
                if (MobAI.GetDistance2(src, dst) > (150 + mob.Size))
                {
                    int yaw = MobAI.GetYawFromVector(MobAI.GetUnitVector(src, dst));
                    dst = MobAI.Add(dst, MobAI.Inverse(MobAI.ScalarProduct(MobAI.GetUnitVector(src, dst), (80 + mob.Size))));

                    float[] diff;
                    if (MobAI.GetDistance(src, dst) > mob.RunSpeed)
                    {
                        diff = MobAI.Add(src, MobAI.ScalarProduct(MobAI.GetUnitVector(src, dst), mob.RunSpeed));
                    }
                    else
                    {
                        diff = new float[3] {
                            dst[0], dst[1], dst[2]
                        }
                    };
                    if (dst[0] != lastdst[0] || dst[1] != lastdst[1] || dst[2] != lastdst[2])
                    {
                        this.mob.Map.MoveActor(Map.MOVE_TYPE.START, this.mob.Actor, src, yaw, dst, 0, mob.mRunSpeed);
                    }
                    //src = diff;
                    lastdst            = dst;
                    this.mob.Actor.yaw = yaw;
                    this.mob.Actor.x   = diff[0];
                    this.mob.Actor.y   = diff[1];
                    this.mob.Actor.z   = diff[2];
                    if (this.mob.Map.HasHeightMap())
                    {
                        if ((this.mob.LivingSpace == Mob.Space.Amphibian || this.mob.LivingSpace == Mob.Space.Land) && diff[2] > this.mob.Map.HeightMap.water_level)
                        {
                            this.mob.Actor.z = mob.Map.GetHeight(diff[0], diff[1]);
                        }
                    }
                }
                else
                {
                    this.mob.Map.MoveActor(Map.MOVE_TYPE.STOP, this.mob.Actor, src, this.mob.Actor.yaw, src, 0, mob.mRunSpeed);
                    this.status = CommandStatus.FINISHED;
                }
            }
            catch (Exception ex)
            {
                Logger.ShowError(ex, null);
            }
        }
Beispiel #13
0
    public void Init(RefMob refMob, int mobLevel, RefItemSpawn[] refDropItems, bool boss)
    {
        base.Init(refMob, mobLevel, 0);

        RefMob = refMob;
        RefDropItems = refDropItems;
        Boss = boss;

        if (Random.Range(0f, 1f) < 0.3f)
            m_creatureProperty.BetaMoveSpeed = 1.7f;
        /*
        if (true == Boss)
        {
            transform.Find("FloatingHealthBarGUI").gameObject.SetActive(true);
        }*/

        GameObject prefDeathEffect = Resources.Load<GameObject>("Pref/mon_skin/"+refMob.prefBody+"_death");
        if (prefDeathEffect != null)
        {
            m_prefDeathEffect = prefDeathEffect;
        }

        foreach(RefMob.WeaponDesc weaponDesc in refMob.refWeaponItems)
        {
            if (weaponDesc.reqLevel > mobLevel)
                continue;

            if (weaponDesc.passive == true)
            {
                EquipPassiveSkillWeapon(new ItemWeaponData(weaponDesc.refItemId), weaponDesc);
            }
            else
            {
                EquipWeapon(new ItemWeaponData(weaponDesc.refItemId), weaponDesc);
            }

        }

        switch(refMob.mobAI)
        {
        case MobAIType.Normal:
            m_ai = new MobAINormal();
            break;
        case MobAIType.Rotation:
            m_ai = new MobAIRotation();
            break;
        case MobAIType.FlyingAround:
            m_ai = new MobAIFlyingAround();
            CreatureType = Type.MobNpc;
            break;
        case MobAIType.ItemShuttle:
            m_ai = new MobAIItemShuttle();
            break;
        case MobAIType.Dummy:
            m_ai = new MobAIDummy();
            break;
        case MobAIType.Bomber:
            m_ai = new MobAIBomber();
            break;
        case MobAIType.Egg:
            m_ai = new MobAIEgg();
            break;
        }

        m_ai.Init(this);
    }
Beispiel #14
0
        public void Update(object para)
        {
            try
            {
                if (mob.Map.HasHeightMap())
                {
                    if (mob.Map.HeightMap.water_level != 0)
                    {
                        switch (mob.LivingSpace)
                        {
                        case Mob.Space.Land:
                            if (dest[2] < mob.Map.HeightMap.water_level)
                            {
                                this.Status = CommandStatus.FINISHED;
                                return;
                            }
                            break;

                        case Mob.Space.Water:
                            if (dest[2] >= mob.Map.HeightMap.water_level)
                            {
                                this.Status = CommandStatus.FINISHED;
                                return;
                            }
                            break;
                        }
                    }
                }
                if (mob.WalkSpeed == 0 || mob.Actor.Tasks.ContainsKey("Freezing") || mob.Actor.BattleStatus.Additions.ContainsKey("LowerBodyParalysis"))
                {
                    return;
                }
                float[] src = new float[3] {
                    mob.Actor.x, mob.Actor.y, mob.Actor.z
                };
                float[] dst = dest;
                if (MobAI.GetDistance(src, dst) > 0)
                {
                    float[] diff;
                    int     yaw = MobAI.GetYawFromVector(MobAI.GetUnitVector(src, dst));
                    if (MobAI.GetDistance(src, dst) > mob.WalkSpeed)
                    {
                        diff = MobAI.Add(src, MobAI.ScalarProduct(MobAI.GetUnitVector(src, dst), mob.WalkSpeed));
                    }
                    else
                    {
                        diff = dst;
                    }
                    this.mob.Map.MoveActor(Map.MOVE_TYPE.START, this.mob.Actor, src, yaw, dst, 0, mob.mWalkSpeed);
                    src = diff;
                    this.mob.Actor.yaw = yaw;
                    this.mob.Actor.x   = src[0];
                    this.mob.Actor.y   = src[1];
                    this.mob.Actor.z   = src[2];
                }
                else
                {
                    this.mob.Map.MoveActor(Map.MOVE_TYPE.STOP, this.mob.Actor, src, this.mob.Actor.yaw, src, 0, mob.mWalkSpeed);
                    this.status = CommandStatus.FINISHED;
                }
            }
            catch (Exception ex)
            {
                Logger.ShowError(ex, null);
            }
        }