Advertisement
Guest User

Untitled

a guest
Feb 12th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.23 KB | None | 0 0
  1. bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange)
  2. {
  3. const Position& targetPos = target->getPosition();
  4. // std::cout << "Spustam statschange 0" << std::endl;
  5. if (healthChange > 0) {
  6. if (target->getHealth() <= 0) {
  7. return false;
  8. }
  9.  
  10. // std::cout << "Spustam statschange 1" << std::endl;
  11. for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
  12. if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
  13. return false;
  14. }
  15. Player* attackerPlayer;
  16. if (attacker) {
  17. attackerPlayer = attacker->getPlayer();
  18. } else {
  19. attackerPlayer = nullptr;
  20. }
  21.  
  22. Player* targetPlayer = target->getPlayer();
  23. if (attackerPlayer && targetPlayer) {
  24. if (g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && attackerPlayer->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && combatType != COMBAT_HEALING) {
  25. return false;
  26. }
  27.  
  28. // Rush Event combat
  29. if (attackerPlayer->getStorageValue(39753) > 0 && target->getStorageValue(39753) > 0) {
  30. return false;
  31. }
  32.  
  33. if (attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
  34. return false;
  35. }
  36. }
  37.  
  38. int32_t realHealthChange = target->getHealth();
  39. target->gainHealth(attacker, healthChange);
  40. realHealthChange = target->getHealth() - realHealthChange;
  41.  
  42. if (realHealthChange > 0 && !target->isInGhostMode()) {
  43. std::string pluralString = (realHealthChange != 1 ? "s." : ".");
  44. std::ostringstream ss;
  45. if (!attacker) {
  46. ss << ucfirst(target->getNameDescription()) << " was healed for " << realHealthChange << " hitpoint" << pluralString;
  47. } else if (attacker == target) {
  48. ss << ucfirst(attacker->getNameDescription()) << " healed " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself for " : "himself for ") : "itself for ") << realHealthChange << " hitpoint" << pluralString;
  49. } else {
  50. ss << ucfirst(attacker->getNameDescription()) << " healed " << target->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
  51. }
  52.  
  53. std::string spectatorMessage = ss.str();
  54.  
  55. TextMessage message;
  56. message.position = targetPos;
  57. message.primary.value = realHealthChange;
  58. message.primary.color = TEXTCOLOR_MAYABLUE;
  59.  
  60. SpectatorVec list;
  61. getSpectators(list, targetPos, false, true);
  62. for (Creature* spectator : list) {
  63. Player* tmpPlayer = spectator->getPlayer();
  64. if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
  65. ss.str("");
  66. ss << "You heal " << target->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
  67. message.type = MESSAGE_HEALED;
  68. message.text = ss.str();
  69. } else if (tmpPlayer == targetPlayer) {
  70. ss.str("");
  71. if (!attacker) {
  72. ss << "You were healed for " << realHealthChange << " hitpoint" << pluralString;
  73. } else if (targetPlayer == attackerPlayer) {
  74. ss << "You heal yourself for " << realHealthChange << " hitpoint" << pluralString;
  75. } else {
  76. ss << "You were healed by " << attacker->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
  77. }
  78. message.type = MESSAGE_HEALED;
  79. message.text = ss.str();
  80. } else {
  81. message.type = MESSAGE_HEALED_OTHERS;
  82. message.text = spectatorMessage;
  83. }
  84. tmpPlayer->sendTextMessage(message);
  85. }
  86. }
  87. } else {
  88. SpectatorVec list;
  89. getSpectators(list, targetPos, true, true);
  90.  
  91. if (!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR) {
  92. addMagicEffect(list, targetPos, CONST_ME_POFF);
  93. return true;
  94. }
  95.  
  96. Player* attackerPlayer;
  97. if (attacker) {
  98. attackerPlayer = attacker->getPlayer();
  99. } else {
  100. attackerPlayer = nullptr;
  101. }
  102.  
  103. Player* targetPlayer = target->getPlayer();
  104. if (attackerPlayer && targetPlayer) {
  105. if (g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && combatType != COMBAT_HEALING) {
  106. return false;
  107. }
  108.  
  109. if (attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
  110. return false;
  111. }
  112. }
  113.  
  114. int32_t damage = -healthChange;
  115. if (damage == 0) {
  116. return true;
  117. }
  118.  
  119. TextMessage message;
  120. message.position = targetPos;
  121.  
  122. if (target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE) {
  123. int32_t manaDamage = std::min<int32_t>(target->getMana(), damage);
  124. if (manaDamage != 0) {
  125. for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
  126. if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, (CombatType_t)0 , manaDamage))
  127. return false;
  128. }
  129. for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_CHANGEMANA)) {
  130. creatureEvent->executeChangeMana(target, attacker, manaDamage);
  131. }
  132.  
  133. target->drainMana(attacker, manaDamage);
  134. addMagicEffect(list, targetPos, CONST_ME_LOSEENERGY);
  135.  
  136. std::ostringstream ss;
  137. if (!attacker) {
  138. ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana.";
  139. } else if (attacker == target) {
  140. ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking an attack by " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself." : "himself.") : "itself.");
  141. } else {
  142. ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking an attack by " << attacker->getNameDescription() << '.';
  143. }
  144.  
  145. std::string spectatorMessage = ss.str();
  146.  
  147. message.primary.value = manaDamage;
  148. message.primary.color = TEXTCOLOR_BLUE;
  149.  
  150. for (Creature* spectator : list) {
  151. Player* tmpPlayer = spectator->getPlayer();
  152. if (tmpPlayer->getPosition().z == targetPos.z) {
  153. if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
  154. ss.str("");
  155. ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking your attack.";
  156. message.type = MESSAGE_DAMAGE_DEALT;
  157. message.text = ss.str();
  158. } else if (tmpPlayer == targetPlayer) {
  159. ss.str("");
  160. if (!attacker) {
  161. ss << "You lose " << manaDamage << " mana.";
  162. } else if (targetPlayer == attackerPlayer) {
  163. ss << "You lose " << manaDamage << " mana blocking an attack by yourself.";
  164. } else {
  165. ss << "You lose " << manaDamage << " mana blocking an attack by " << attacker->getNameDescription() << '.';
  166. }
  167. message.type = MESSAGE_DAMAGE_RECEIVED;
  168. message.text = ss.str();
  169. } else {
  170. message.type = MESSAGE_DAMAGE_OTHERS;
  171. message.text = spectatorMessage;
  172. }
  173. tmpPlayer->sendTextMessage(message);
  174. }
  175. }
  176.  
  177. damage = std::max<int32_t>(0, damage - manaDamage);
  178. }
  179. }
  180.  
  181. int32_t targetHealth = target->getHealth();
  182. damage = std::min<int32_t>(targetHealth, damage);
  183. if (damage > 0) {
  184. const auto& changeHealthEvents = target->getCreatureEvents(CREATURE_EVENT_CHANGEHEALTH);
  185. if (!changeHealthEvents.empty()) {
  186. CombatDamage tmpDamage;
  187. tmpDamage.primary.type = combatType;
  188. tmpDamage.primary.value = damage;
  189.  
  190. for (CreatureEvent* creatureEvent : changeHealthEvents) {
  191. creatureEvent->executeChangeHealth(target, attacker, tmpDamage);
  192. }
  193. }
  194. // std::cout << "Spustam statschange 2" << std::endl;
  195. for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
  196. if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
  197. return false;
  198. }
  199.  
  200. if (damage >= targetHealth) {
  201. for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_PREPAREDEATH)) {
  202. if (!creatureEvent->executeOnPrepareDeath(target, attacker)) {
  203. return false;
  204. }
  205. }
  206. }
  207.  
  208. target->drainHealth(attacker, damage);
  209. addCreatureHealth(list, target);
  210.  
  211. uint8_t hitEffect;
  212. combatGetTypeInfo(combatType, target, message.primary.color, hitEffect);
  213.  
  214. if (message.primary.color != TEXTCOLOR_NONE) {
  215. message.primary.value = damage;
  216. addMagicEffect(list, targetPos, hitEffect);
  217.  
  218. std::string pluralString = (damage != 1 ? "s" : "");
  219. std::ostringstream ss;
  220. if (!attacker) {
  221. ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << ".";
  222. } else if (attacker == target) {
  223. ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her" : "his") : "its") << " own attack.";
  224. } else {
  225. ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to an attack by " << attacker->getNameDescription() << '.';
  226. }
  227.  
  228. std::string spectatorMessage = ss.str();
  229. for (Creature* spectator : list) {
  230. Player* tmpPlayer = spectator->getPlayer();
  231. if (tmpPlayer->getPosition().z == targetPos.z) {
  232. if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
  233. ss.str("");
  234. ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to your attack.";
  235. message.type = MESSAGE_DAMAGE_DEALT;
  236. message.text = ss.str();
  237. } else if (tmpPlayer == targetPlayer) {
  238. ss.str("");
  239. if (!attacker) {
  240. ss << "You lose " << damage << " hitpoint" << pluralString << ".";
  241. } else if (targetPlayer == attackerPlayer) {
  242. ss << "You lose " << damage << " hitpoint" << pluralString << " due to your own attack.";
  243. } else {
  244. ss << "You lose " << damage << " hitpoint" << pluralString << " due to an attack by " << attacker->getNameDescription() << '.';
  245. }
  246. message.type = MESSAGE_DAMAGE_RECEIVED;
  247. message.text = ss.str();
  248. } else {
  249. message.type = MESSAGE_DAMAGE_OTHERS;
  250. message.text = spectatorMessage;
  251. }
  252. tmpPlayer->sendTextMessage(message);
  253. }
  254. }
  255. }
  256. }
  257. }
  258.  
  259. return true;
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement