GlacierWarrior.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Server.MirDatabase;
  2. using Server.MirEnvir;
  3. namespace Server.MirObjects.Monsters
  4. {
  5. public class GlacierWarrior : MonsterObject
  6. {
  7. public virtual byte TeleportEffect { get { return 4; } }
  8. protected internal GlacierWarrior(MonsterInfo info)
  9. : base(info)
  10. {
  11. }
  12. public override int Attacked(HumanObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
  13. {
  14. int attackerDamage = base.Attacked(attacker, damage, type, damageWeapon);
  15. int ownDamage = GetAttackPower(Stats[Stat.MinDC], Stats[Stat.MaxDC]);
  16. if (attackerDamage > ownDamage && Envir.Random.Next(2) == 0)
  17. {
  18. FindWeakerTarget();
  19. }
  20. return attackerDamage;
  21. }
  22. public override int Attacked(MonsterObject attacker, int damage, DefenceType type = DefenceType.ACAgility)
  23. {
  24. int attackerDamage = base.Attacked(attacker, damage, type);
  25. int ownDamage = GetAttackPower(Stats[Stat.MinDC], Stats[Stat.MaxDC]);
  26. if (attackerDamage > ownDamage && Envir.Random.Next(2) == 0)
  27. {
  28. FindWeakerTarget();
  29. }
  30. return attackerDamage;
  31. }
  32. private void FindWeakerTarget()
  33. {
  34. List<MapObject> targets = FindAllTargets(Info.ViewRange, CurrentLocation);
  35. if (targets.Count < 2) return;
  36. var newTarget = Target;
  37. for (int i = 0; i < targets.Count; i++)
  38. {
  39. if (targets[i].Stats[Stat.MinDC] >= Target.Stats[Stat.MinDC]) continue;
  40. newTarget = targets[i];
  41. }
  42. if (newTarget != Target)
  43. {
  44. Target = newTarget;
  45. TeleportToTarget(Target);
  46. }
  47. }
  48. private bool TeleportToTarget(MapObject target)
  49. {
  50. Direction = Functions.DirectionFromPoint(CurrentLocation, target.CurrentLocation);
  51. var reverse = Functions.ReverseDirection(Direction);
  52. var point = Functions.PointMove(target.CurrentLocation, reverse, 1);
  53. if (point != CurrentLocation)
  54. {
  55. if (Teleport(CurrentMap, point, true, TeleportEffect)) return true;
  56. }
  57. return false;
  58. }
  59. }
  60. }