ThunderElement.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using Server.MirDatabase;
  2. using System.Drawing;
  3. using S = ServerPackets;
  4. namespace Server.MirObjects.Monsters
  5. {
  6. public class ThunderElement : MonsterObject
  7. {
  8. protected internal ThunderElement(MonsterInfo info)
  9. : base(info)
  10. {
  11. }
  12. protected override void CompleteAttack(IList<object> data)
  13. {
  14. int damage = (int)data[1];
  15. DefenceType defence = (DefenceType)data[2];
  16. List<MapObject> targets = FindAllTargets(2, CurrentLocation);
  17. if (targets.Count == 0) return;
  18. for (int i = 0; i < targets.Count; i++)
  19. {
  20. MapObject target = targets[i];
  21. if (target == null || !target.IsAttackTarget(this) || target.CurrentMap != CurrentMap || target.Node == null) return;
  22. target.Attacked(this, damage, defence);
  23. }
  24. Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation });
  25. }
  26. protected override void ProcessTarget()
  27. {
  28. if (Target == null) return;
  29. if (InAttackRange() && CanAttack)
  30. {
  31. if (Envir.Random.Next(3) == 1)
  32. {
  33. int targetXOffset, targetYOffset;
  34. targetXOffset = Envir.Random.Next(-1, 2);
  35. targetYOffset = Envir.Random.Next(-1, 2);
  36. Point point = new Point(Target.CurrentLocation.X + targetXOffset, Target.CurrentLocation.Y + targetYOffset);
  37. MoveTo(point);
  38. }
  39. Attack();
  40. return;
  41. }
  42. if (Envir.Time < ShockTime)
  43. {
  44. Target = null;
  45. return;
  46. }
  47. MoveTo(Target.CurrentLocation);
  48. }
  49. protected override void Attack()
  50. {
  51. if (!Target.IsAttackTarget(this))
  52. {
  53. Target = null;
  54. return;
  55. }
  56. ActionTime = Envir.Time + 300;
  57. AttackTime = Envir.Time + AttackSpeed;
  58. int damage = GetAttackPower(Stats[Stat.MinDC], Stats[Stat.MaxDC]);
  59. if (damage == 0) return;
  60. DelayedAction action = new DelayedAction(DelayedType.Damage, Envir.Time + 300, Target, damage, DefenceType.MAC);
  61. ActionList.Add(action);
  62. }
  63. public override int Attacked(MonsterObject attacker, int damage, DefenceType type = DefenceType.ACAgility)
  64. {
  65. if (type != DefenceType.Repulsion) return 0;
  66. return base.Attacked(attacker, damage, type);
  67. }
  68. public override int Attacked(HumanObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
  69. {
  70. if (type != DefenceType.Repulsion) return 0;
  71. return base.Attacked(attacker, damage, type, damageWeapon);
  72. }
  73. public override int Pushed(MapObject pusher, MirDirection dir, int distance)
  74. {
  75. int result = base.Pushed(pusher, dir, distance);
  76. if (result > 0)
  77. {
  78. int damage;
  79. damage = distance * (Math.Max(50, (Envir.Random.Next(Stats[Stat.HP]) / 5)));
  80. if (pusher is PlayerObject)
  81. {
  82. //int damage = Math.Max(50, Envir.Random.Next(Stats[Stat.HP]));
  83. Attacked((PlayerObject)pusher, damage, DefenceType.Repulsion);
  84. }
  85. else if (pusher is MonsterObject) Attacked((MonsterObject)pusher, damage, DefenceType.Repulsion);
  86. }
  87. return result;
  88. }
  89. public override void PoisonDamage(int amount, MapObject Attacker)
  90. {
  91. return;
  92. }
  93. }
  94. }