void Creature::onGainExperience(uint64_t gainExp, Creature* target) { if (gainExp == 0 || !master) { return; } gainExp /= 2; master->onGainExperience(gainExp, target); SpectatorHashSet spectators; g_game.map.getSpectators(spectators, position, false, true); if (spectators.empty()) { return; } TextMessage message(MESSAGE_EXPERIENCE_OTHERS, ucfirst(getNameDescription()) + " gained " + std::to_string(gainExp) + (gainExp != 1 ? " experience points." : " experience point.")); message.position = position; message.primary.color = TEXTCOLOR_WHITE_EXP; message.primary.value = gainExp; for (Creature* spectator : spectators) { spectator->getPlayer()->sendTextMessage(message); } }
bool ConditionRegeneration::executeCondition(Creature* creature, int32_t interval) { internalHealthTicks += interval; internalManaTicks += interval; if (creature->getZone() == ZONE_PROTECTION) { return ConditionGeneric::executeCondition(creature, interval); } if (internalHealthTicks >= healthTicks) { internalHealthTicks = 0; int32_t realHealthGain = creature->getHealth(); creature->changeHealth(healthGain); realHealthGain = creature->getHealth() - realHealthGain; if (isBuff && realHealthGain > 0) { Player* player = creature->getPlayer(); if (player) { std::string healString = std::to_string(realHealthGain) + (realHealthGain != 1 ? " hitpoints." : " hitpoint."); TextMessage message(MESSAGE_HEALED, "You were healed for " + healString); message.position = player->getPosition(); message.primary.value = realHealthGain; message.primary.color = TEXTCOLOR_MAYABLUE; player->sendTextMessage(message); SpectatorHashSet spectators; g_game.map.getSpectators(spectators, player->getPosition(), false, true); spectators.erase(player); if (!spectators.empty()) { message.type = MESSAGE_HEALED_OTHERS; message.text = player->getName() + " was healed for " + healString; for (Creature* spectator : spectators) { spectator->getPlayer()->sendTextMessage(message); } } } } } if (internalManaTicks >= manaTicks) { internalManaTicks = 0; if (Player* player = creature->getPlayer()) { int32_t realManaGain = player->getMana(); player->changeMana(manaGain); realManaGain = player->getMana() - realManaGain; if (isBuff && realManaGain > 0) { std::string manaGainString = std::to_string(realManaGain); TextMessage message(MESSAGE_HEALED, "You gained " + manaGainString + " mana."); message.position = player->getPosition(); message.primary.value = realManaGain; message.primary.color = TEXTCOLOR_MAYABLUE; player->sendTextMessage(message); SpectatorHashSet spectators; g_game.map.getSpectators(spectators, player->getPosition(), false, true); spectators.erase(player); if (!spectators.empty()) { message.type = MESSAGE_HEALED_OTHERS; message.text = player->getName() + " gained " + manaGainString + " mana."; for (Creature* spectator : spectators) { spectator->getPlayer()->sendTextMessage(message); } } } } } return ConditionGeneric::executeCondition(creature, interval); }