EvilCentipede.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Server.MirDatabase;
  2. using Server.MirEnvir;
  3. using S = ServerPackets;
  4. namespace Server.MirObjects.Monsters
  5. {
  6. public class EvilCentipede : MonsterObject
  7. {
  8. public bool Visible;
  9. public long VisibleTime;
  10. protected override bool CanAttack
  11. {
  12. get
  13. {
  14. return Visible && base.CanAttack;
  15. }
  16. }
  17. protected override bool CanMove { get { return false; } }
  18. public override bool Blocking
  19. {
  20. get
  21. {
  22. return Visible && base.Blocking;
  23. }
  24. }
  25. protected internal EvilCentipede(MonsterInfo info)
  26. : base(info)
  27. {
  28. Visible = false;
  29. }
  30. protected override void ProcessAI()
  31. {
  32. if (!Visible)
  33. SetHP(Stats[Stat.HP]);
  34. if (!Dead && Envir.Time > VisibleTime)
  35. {
  36. VisibleTime = Envir.Time + 2000;
  37. bool visible = FindNearby(Visible ? 7 : 3);
  38. if (!Visible && visible)
  39. {
  40. Visible = true;
  41. CellTime = Envir.Time + 500;
  42. Broadcast(GetInfo());
  43. Broadcast(new S.ObjectShow { ObjectID = ObjectID });
  44. ActionTime = Envir.Time + 2000;
  45. }
  46. if (Visible && !visible)
  47. {
  48. Visible = false;
  49. VisibleTime = Envir.Time + 3000;
  50. Broadcast(new S.ObjectHide { ObjectID = ObjectID });
  51. SetHP(Stats[Stat.HP]);
  52. }
  53. }
  54. base.ProcessAI();
  55. }
  56. public override void Turn(MirDirection dir)
  57. {
  58. }
  59. public override bool Walk(MirDirection dir) { return false; }
  60. public override bool IsAttackTarget(MonsterObject attacker)
  61. {
  62. return Visible && base.IsAttackTarget(attacker);
  63. }
  64. public override bool IsAttackTarget(HumanObject attacker)
  65. {
  66. return Visible && base.IsAttackTarget(attacker);
  67. }
  68. protected override void ProcessRoam() { }
  69. protected override void ProcessSearch()
  70. {
  71. if (Visible)
  72. base.ProcessSearch();
  73. }
  74. protected override void CompleteAttack(IList<object> data)
  75. {
  76. List<MapObject> targets = FindAllTargets(7, CurrentLocation, false);
  77. if (targets.Count == 0) return;
  78. for (int i = 0; i < targets.Count; i++)
  79. {
  80. Target = targets[i];
  81. Attack();
  82. }
  83. }
  84. protected override void ProcessTarget()
  85. {
  86. if (!CanAttack) return;
  87. if (!FindNearby(7)) return;
  88. ShockTime = 0;
  89. Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation });
  90. ActionList.Add(new DelayedAction(DelayedType.Damage, Envir.Time + 500));
  91. ActionTime = Envir.Time + 300;
  92. AttackTime = Envir.Time + AttackSpeed;
  93. }
  94. protected override void Attack()
  95. {
  96. int damage = GetAttackPower(Stats[Stat.MinDC], Stats[Stat.MaxDC]);
  97. if (damage == 0) return;
  98. if (Target.Attacked(this, damage, DefenceType.MAC) <= 0) return;
  99. PoisonTarget(Target, 5, 15, PoisonType.Green, 2000);
  100. PoisonTarget(Target, 15, 5, PoisonType.Paralysis, 2000);
  101. }
  102. public override Packet GetInfo()
  103. {
  104. return !Visible ? null : base.GetInfo();
  105. }
  106. }
  107. }