Tree.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using Server.MirDatabase;
  2. using S = ServerPackets;
  3. namespace Server.MirObjects.Monsters
  4. {
  5. public class Tree : MonsterObject
  6. {
  7. protected override bool CanMove { get { return false; } }
  8. protected override bool CanAttack { get { return false; } }
  9. protected override bool CanRegen { get { return false; } }
  10. protected internal Tree(MonsterInfo info)
  11. : base(info)
  12. {
  13. Direction = MirDirection.Up;
  14. }
  15. protected override void Attack() { }
  16. protected override void FindTarget() { }
  17. public override void Turn(MirDirection dir)
  18. {
  19. }
  20. public override bool Walk(MirDirection dir)
  21. {
  22. return false;
  23. }
  24. protected override void ProcessTarget() { }
  25. protected override void ProcessRegen() { }
  26. protected override void ProcessSearch() { }
  27. protected override void ProcessRoam() { }
  28. public override int Attacked(MonsterObject attacker, int damage, DefenceType type = DefenceType.ACAgility)
  29. {
  30. int armour = 0;
  31. //switch (type)
  32. //{
  33. // case DefenceType.ACAgility:
  34. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  35. // armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  36. // break;
  37. // case DefenceType.AC:
  38. // armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  39. // break;
  40. // case DefenceType.MACAgility:
  41. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  42. // armour = GetAttackPower(Stats[Stat.MinMAC], Stats[Stat.MaxMAC]);
  43. // break;
  44. // case DefenceType.MAC:
  45. // armour = GetAttackPower(Stats[Stat.MinMAC], Stats[Stat.MaxMAC]);
  46. // break;
  47. // case DefenceType.Agility:
  48. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  49. // break;
  50. //}
  51. if (type != DefenceType.ACAgility)
  52. {
  53. return 0;
  54. }
  55. else
  56. {
  57. if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  58. armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  59. }
  60. if (armour >= damage) return 0;
  61. ShockTime = 0;
  62. if (attacker.Info.AI == 6)
  63. EXPOwner = null;
  64. else if (attacker.Master != null)
  65. {
  66. if (EXPOwner == null || EXPOwner.Dead)
  67. EXPOwner = attacker.Master switch
  68. {
  69. HeroObject hero => hero.Owner,
  70. _ => attacker.Master
  71. };
  72. if (EXPOwner == attacker.Master)
  73. EXPOwnerTime = Envir.Time + EXPOwnerDelay;
  74. }
  75. Broadcast(new S.ObjectStruck { ObjectID = ObjectID, AttackerID = attacker.ObjectID, Direction = Direction, Location = CurrentLocation });
  76. ChangeHP(-1);
  77. return 1;
  78. }
  79. public override int Struck(int damage, DefenceType type = DefenceType.ACAgility)
  80. {
  81. return 0;
  82. }
  83. public override int Attacked(HumanObject attacker, int damage, DefenceType type = DefenceType.ACAgility, bool damageWeapon = true)
  84. {
  85. int armour = 0;
  86. //switch (type)
  87. //{
  88. // case DefenceType.ACAgility:
  89. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  90. // armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  91. // break;
  92. // case DefenceType.AC:
  93. // armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  94. // break;
  95. // case DefenceType.MACAgility:
  96. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  97. // armour = GetAttackPower(Stats[Stat.MinMAC], Stats[Stat.MaxMAC]);
  98. // break;
  99. // case DefenceType.MAC:
  100. // armour = GetAttackPower(Stats[Stat.MinMAC], Stats[Stat.MaxMAC]);
  101. // break;
  102. // case DefenceType.Agility:
  103. // if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  104. // break;
  105. //}
  106. if (type != DefenceType.ACAgility)
  107. {
  108. return 0;
  109. }
  110. else
  111. {
  112. if (Envir.Random.Next(Stats[Stat.Agility] + 1) > attacker.Stats[Stat.Accuracy]) return 0;
  113. armour = GetAttackPower(Stats[Stat.MinAC], Stats[Stat.MaxAC]);
  114. }
  115. if (armour >= damage) return 0;
  116. if (damageWeapon)
  117. attacker.DamageWeapon();
  118. ShockTime = 0;
  119. if (Master != null && Master != attacker)
  120. if (Envir.Time > Master.BrownTime && Master.PKPoints < 200)
  121. attacker.BrownTime = Envir.Time + Settings.Minute;
  122. if (EXPOwner == null || EXPOwner.Dead)
  123. EXPOwner = GetAttacker(attacker);
  124. if (EXPOwner == attacker)
  125. EXPOwnerTime = Envir.Time + EXPOwnerDelay;
  126. Broadcast(new S.ObjectStruck { ObjectID = ObjectID, AttackerID = attacker.ObjectID, Direction = Direction, Location = CurrentLocation });
  127. attacker.GatherElement();
  128. ChangeHP(-1);
  129. return 1;
  130. }
  131. public override void ApplyPoison(Poison p, MapObject Caster = null, bool NoResist = false, bool ignoreDefence = true) { }
  132. }
  133. }