public void UpdateThink() { if (HasPlayer()) { return; } if (_unit != null) { if (_unit is KeepNpcCreature.KeepCreature) { KeepNpcCreature.KeepCreature npc = _unit as KeepNpcCreature.KeepCreature; if (((npc.Z - npc.SpawnPoint.Z > 120 || npc.SpawnPoint.Z - npc.Z > 30)) || !npc.PointWithinRadiusFeet(npc.WorldSpawnPoint, 200)) { ProcessCombatEnd(); return; } } } if (CurrentBrain != null && CurrentBrain.IsStart && !CurrentBrain.IsStop) { CurrentBrain.Think(); if (State == AiState.FIGHTING) { CurrentBrain.Fight(); } } Creature creature = _unit as Creature; if (creature == null || creature is Pet) { return; } if (!creature.PointWithinRadiusFeet(creature.WorldSpawnPoint, 200)) { ProcessCombatEnd(); } }
/*private bool IsNeutralFaction(Creature c) * { * if (c.Spawn.Faction == 0 || (((c.Spawn.Faction >> 8 & 0x1))) == 0) return true; * else return false; * }*/ public Unit GetAttackableUnit() { Unit unitOwner = GetUnit(); float maxRange = MaxAggroRange + unitOwner.Level / 1.5f; Unit target = null; lock (RangedEnemies) foreach (Unit enemy in RangedEnemies) { Player player = enemy as Player; if (player != null && player.StealthLevel > 0 && unitOwner.Level <= player.EffectiveLevel + 2) { continue; } if (!CombatInterface.CanAttack(unitOwner, enemy)) { continue; } float dist = _Owner.GetDistanceToObject(enemy, true); if (dist > maxRange) { continue; } if (unitOwner != null) { if (unitOwner is KeepNpcCreature.KeepCreature) { KeepNpcCreature.KeepCreature npc = unitOwner as KeepNpcCreature.KeepCreature; //Keep NPCs have additional hardening. If their target goes outside the keep, instantly reset. if (enemy.Z - npc.SpawnPoint.Z > 120 || npc.SpawnPoint.Z - enemy.Z > 30 || !enemy.PointWithinRadiusFeet(npc.WorldSpawnPoint, 200) || !npc.PointWithinRadiusFeet(npc.WorldSpawnPoint, 200)) { continue; } if (!enemy.LOSHit(npc)) { continue; } } else if (unitOwner is Creature) { Creature creature = unitOwner as Creature; if (creature is Pet) { Pet pet = creature as Pet; if (pet == null || pet.Owner == null) { continue; } //Only aggro if we have LOS to the owner. if (!enemy.LOSHit(pet.Owner)) { continue; } } else { //Standard NPC checks. if (!creature.PointWithinRadiusFeet(creature.WorldSpawnPoint, 200)) { continue; } if (!enemy.LOSHit(creature)) { continue; } } } else { } } maxRange = dist; target = enemy; } return(target); }
public bool SlayLowbies(Object Obj, object instigator) { Creature c = this.Obj as Creature; // We are casting the script initiator as a Creature if (!c.IsDead) { foreach (Player player in Obj.PlayersInRange.ToList()) { if (player != null) { if (player.Level < 31 && !player.IsDead && !player.IsInvulnerable && player.StealthLevel != 2 && c.PointWithinRadiusFeet(player, 150))// - removed { // c.Say("Don't waste my time " + player.Name + "!", SystemData.ChatLogFilters.CHATLOGFILTERS_MONSTER_SAY); // Banter // Nuking player in progress... player.SendClientMessage("You were killed by " + Obj.Name + " because you approached his lair with insufficient level."); player.ReceiveDamage(c, int.MaxValue); PacketOut damageOut = new PacketOut((byte)Opcodes.F_CAST_PLAYER_EFFECT, 24); damageOut.WriteUInt16(player.Oid); damageOut.WriteUInt16(player.Oid); damageOut.WriteUInt16(23584); // Terminate damageOut.WriteByte(0); damageOut.WriteByte(0); // DAMAGE EVENT damageOut.WriteByte(7); damageOut.WriteZigZag(-30000); damageOut.WriteByte(0); player.DispatchPacketUnreliable(damageOut, true, player); } } } } return(false); }