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>(); }
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); }
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); }
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); }
private void Awake() { mobAI = GetComponent <MobAI>(); mood = GetComponent <MobMood>(); mobExplore = GetComponent <MobExplore>(); }
private void Awake() { mobAi = GetComponent <MobAI>(); lbh = GetComponent <LivingHealthBehaviour>(); mobExplore = GetComponent <MobExplore>(); }
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; } }
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); }
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; }
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); } }
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); }
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); } }