Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange)
- {
- const Position& targetPos = target->getPosition();
- // std::cout << "Spustam statschange 0" << std::endl;
- if (healthChange > 0) {
- if (target->getHealth() <= 0) {
- return false;
- }
- // std::cout << "Spustam statschange 1" << std::endl;
- for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
- if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
- return false;
- }
- Player* attackerPlayer;
- if (attacker) {
- attackerPlayer = attacker->getPlayer();
- } else {
- attackerPlayer = nullptr;
- }
- Player* targetPlayer = target->getPlayer();
- if (attackerPlayer && targetPlayer) {
- if (g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && attackerPlayer->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && combatType != COMBAT_HEALING) {
- return false;
- }
- // Rush Event combat
- if (attackerPlayer->getStorageValue(39753) > 0 && target->getStorageValue(39753) > 0) {
- return false;
- }
- if (attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
- return false;
- }
- }
- int32_t realHealthChange = target->getHealth();
- target->gainHealth(attacker, healthChange);
- realHealthChange = target->getHealth() - realHealthChange;
- if (realHealthChange > 0 && !target->isInGhostMode()) {
- std::string pluralString = (realHealthChange != 1 ? "s." : ".");
- std::ostringstream ss;
- if (!attacker) {
- ss << ucfirst(target->getNameDescription()) << " was healed for " << realHealthChange << " hitpoint" << pluralString;
- } else if (attacker == target) {
- ss << ucfirst(attacker->getNameDescription()) << " healed " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself for " : "himself for ") : "itself for ") << realHealthChange << " hitpoint" << pluralString;
- } else {
- ss << ucfirst(attacker->getNameDescription()) << " healed " << target->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
- }
- std::string spectatorMessage = ss.str();
- TextMessage message;
- message.position = targetPos;
- message.primary.value = realHealthChange;
- message.primary.color = TEXTCOLOR_MAYABLUE;
- SpectatorVec list;
- getSpectators(list, targetPos, false, true);
- for (Creature* spectator : list) {
- Player* tmpPlayer = spectator->getPlayer();
- if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
- ss.str("");
- ss << "You heal " << target->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
- message.type = MESSAGE_HEALED;
- message.text = ss.str();
- } else if (tmpPlayer == targetPlayer) {
- ss.str("");
- if (!attacker) {
- ss << "You were healed for " << realHealthChange << " hitpoint" << pluralString;
- } else if (targetPlayer == attackerPlayer) {
- ss << "You heal yourself for " << realHealthChange << " hitpoint" << pluralString;
- } else {
- ss << "You were healed by " << attacker->getNameDescription() << " for " << realHealthChange << " hitpoint" << pluralString;
- }
- message.type = MESSAGE_HEALED;
- message.text = ss.str();
- } else {
- message.type = MESSAGE_HEALED_OTHERS;
- message.text = spectatorMessage;
- }
- tmpPlayer->sendTextMessage(message);
- }
- }
- } else {
- SpectatorVec list;
- getSpectators(list, targetPos, true, true);
- if (!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR) {
- addMagicEffect(list, targetPos, CONST_ME_POFF);
- return true;
- }
- Player* attackerPlayer;
- if (attacker) {
- attackerPlayer = attacker->getPlayer();
- } else {
- attackerPlayer = nullptr;
- }
- Player* targetPlayer = target->getPlayer();
- if (attackerPlayer && targetPlayer) {
- if (g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && combatType != COMBAT_HEALING) {
- return false;
- }
- if (attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
- return false;
- }
- }
- int32_t damage = -healthChange;
- if (damage == 0) {
- return true;
- }
- TextMessage message;
- message.position = targetPos;
- if (target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE) {
- int32_t manaDamage = std::min<int32_t>(target->getMana(), damage);
- if (manaDamage != 0) {
- for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
- if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, (CombatType_t)0 , manaDamage))
- return false;
- }
- for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_CHANGEMANA)) {
- creatureEvent->executeChangeMana(target, attacker, manaDamage);
- }
- target->drainMana(attacker, manaDamage);
- addMagicEffect(list, targetPos, CONST_ME_LOSEENERGY);
- std::ostringstream ss;
- if (!attacker) {
- ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana.";
- } else if (attacker == target) {
- ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking an attack by " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself." : "himself.") : "itself.");
- } else {
- ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking an attack by " << attacker->getNameDescription() << '.';
- }
- std::string spectatorMessage = ss.str();
- message.primary.value = manaDamage;
- message.primary.color = TEXTCOLOR_BLUE;
- for (Creature* spectator : list) {
- Player* tmpPlayer = spectator->getPlayer();
- if (tmpPlayer->getPosition().z == targetPos.z) {
- if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
- ss.str("");
- ss << ucfirst(target->getNameDescription()) << " loses " << manaDamage << " mana blocking your attack.";
- message.type = MESSAGE_DAMAGE_DEALT;
- message.text = ss.str();
- } else if (tmpPlayer == targetPlayer) {
- ss.str("");
- if (!attacker) {
- ss << "You lose " << manaDamage << " mana.";
- } else if (targetPlayer == attackerPlayer) {
- ss << "You lose " << manaDamage << " mana blocking an attack by yourself.";
- } else {
- ss << "You lose " << manaDamage << " mana blocking an attack by " << attacker->getNameDescription() << '.';
- }
- message.type = MESSAGE_DAMAGE_RECEIVED;
- message.text = ss.str();
- } else {
- message.type = MESSAGE_DAMAGE_OTHERS;
- message.text = spectatorMessage;
- }
- tmpPlayer->sendTextMessage(message);
- }
- }
- damage = std::max<int32_t>(0, damage - manaDamage);
- }
- }
- int32_t targetHealth = target->getHealth();
- damage = std::min<int32_t>(targetHealth, damage);
- if (damage > 0) {
- const auto& changeHealthEvents = target->getCreatureEvents(CREATURE_EVENT_CHANGEHEALTH);
- if (!changeHealthEvents.empty()) {
- CombatDamage tmpDamage;
- tmpDamage.primary.type = combatType;
- tmpDamage.primary.value = damage;
- for (CreatureEvent* creatureEvent : changeHealthEvents) {
- creatureEvent->executeChangeHealth(target, attacker, tmpDamage);
- }
- }
- // std::cout << "Spustam statschange 2" << std::endl;
- for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE)) {
- if(!creatureEvent->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
- return false;
- }
- if (damage >= targetHealth) {
- for (CreatureEvent* creatureEvent : target->getCreatureEvents(CREATURE_EVENT_PREPAREDEATH)) {
- if (!creatureEvent->executeOnPrepareDeath(target, attacker)) {
- return false;
- }
- }
- }
- target->drainHealth(attacker, damage);
- addCreatureHealth(list, target);
- uint8_t hitEffect;
- combatGetTypeInfo(combatType, target, message.primary.color, hitEffect);
- if (message.primary.color != TEXTCOLOR_NONE) {
- message.primary.value = damage;
- addMagicEffect(list, targetPos, hitEffect);
- std::string pluralString = (damage != 1 ? "s" : "");
- std::ostringstream ss;
- if (!attacker) {
- ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << ".";
- } else if (attacker == target) {
- ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to " << (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her" : "his") : "its") << " own attack.";
- } else {
- ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to an attack by " << attacker->getNameDescription() << '.';
- }
- std::string spectatorMessage = ss.str();
- for (Creature* spectator : list) {
- Player* tmpPlayer = spectator->getPlayer();
- if (tmpPlayer->getPosition().z == targetPos.z) {
- if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
- ss.str("");
- ss << ucfirst(target->getNameDescription()) << " loses " << damage << " hitpoint" << pluralString << " due to your attack.";
- message.type = MESSAGE_DAMAGE_DEALT;
- message.text = ss.str();
- } else if (tmpPlayer == targetPlayer) {
- ss.str("");
- if (!attacker) {
- ss << "You lose " << damage << " hitpoint" << pluralString << ".";
- } else if (targetPlayer == attackerPlayer) {
- ss << "You lose " << damage << " hitpoint" << pluralString << " due to your own attack.";
- } else {
- ss << "You lose " << damage << " hitpoint" << pluralString << " due to an attack by " << attacker->getNameDescription() << '.';
- }
- message.type = MESSAGE_DAMAGE_RECEIVED;
- message.text = ss.str();
- } else {
- message.type = MESSAGE_DAMAGE_OTHERS;
- message.text = spectatorMessage;
- }
- tmpPlayer->sendTextMessage(message);
- }
- }
- }
- }
- }
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement