Here it is...
Game.cpp:
replace:
[cpp]bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(target->getHealth() <= 0)
return false;
if(attacker && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && combatType != COMBAT_HEALING)
return false;
target->changeHealth(healthChange);
if(g_config.getBoolean(ConfigManager::ANIMATION_TEXT_ON_HEAL) && !target->getMonster() && !target->isInGhostMode())
{
const SpectatorVec& list = getSpectators(targetPos);
std::stringstream ss;
ss << "+" << healthChange;
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, NM_ME_MAGIC_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_GREEN, ss.str());
}
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return true;
}
if(attacker && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && combatType != COMBAT_HEALING)
return false;
int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
target->drainMana(attacker, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);
addMagicEffect(list, targetPos, NM_ME_LOSE_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}
Player* targetPlayer = target->getPlayer();
if(targetPlayer)
{
if(damage >= targetPlayer->getHealth())
{
//scripting event - onPrepareDeath
CreatureEvent* eventPrepareDeath = targetPlayer->getCreatureEvent(CREATURE_EVENT_PREPAREDEATH);
if(eventPrepareDeath)
eventPrepareDeath->executeOnPrepareDeath(targetPlayer, attacker);
}
}
damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);
TextColor_t textColor = TEXTCOLOR_NONE;
uint8_t hitEffect = 0;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = TEXTCOLOR_LIGHTGREEN;
hitEffect = NM_ME_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;
case RACE_BLOOD:
textColor = TEXTCOLOR_RED;
hitEffect = NM_ME_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;
case RACE_UNDEAD:
textColor = TEXTCOLOR_LIGHTGREY;
hitEffect = NM_ME_HIT_AREA;
break;
case RACE_FIRE:
textColor = TEXTCOLOR_ORANGE;
hitEffect = NM_ME_DRAW_BLOOD;
break;
case RACE_ENERGY:
textColor = TEXTCOLOR_PURPLE;
hitEffect = NM_ME_ENERGY_DAMAGE;
break;
default:
break;
}
if(splash)
{
internalAddItem(target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}
case COMBAT_ENERGYDAMAGE:
{
textColor = TEXTCOLOR_PURPLE;
hitEffect = NM_ME_ENERGY_DAMAGE;
break;
}
case COMBAT_EARTHDAMAGE:
{
textColor = TEXTCOLOR_LIGHTGREEN;
hitEffect = NM_ME_POISON_RINGS;
break;
}
case COMBAT_DROWNDAMAGE:
{
textColor = TEXTCOLOR_LIGHTBLUE;
hitEffect = NM_ME_LOSE_ENERGY;
break;
}
case COMBAT_FIREDAMAGE:
{
textColor = TEXTCOLOR_ORANGE;
hitEffect = NM_ME_HITBY_FIRE;
break;
}
case COMBAT_ICEDAMAGE:
{
textColor = TEXTCOLOR_SKYBLUE;
hitEffect = NM_ME_ICEATTACK;
break;
}
case COMBAT_HOLYDAMAGE:
{
textColor = TEXTCOLOR_YELLOW;
hitEffect = NM_ME_HOLYDAMAGE;
break;
}
case COMBAT_DEATHDAMAGE:
{
textColor = TEXTCOLOR_DARKRED;
hitEffect = NM_ME_SMALLCLOUDS;
break;
}
case COMBAT_LIFEDRAIN:
{
textColor = TEXTCOLOR_RED;
hitEffect = NM_ME_MAGIC_BLOOD;
break;
}
default:
break;
}
if(textColor != TEXTCOLOR_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);
addMagicEffect(list, targetPos, hitEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}
return true;
}
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
{
const Position& targetPos = target->getPosition();
const SpectatorVec& list = getSpectators(targetPos);
if(manaChange > 0)
{
if(attacker && target && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET))
return false;
target->changeMana(manaChange);
}
else
{
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return false;
}
if(attacker && target && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET))
return false;
int32_t manaLoss = std::min(target->getMana(), -manaChange);
BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
if(blockType != BLOCK_NONE)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return false;
}
if(manaLoss > 0)
{
target->drainMana(attacker, manaLoss);
char buffer[20];
sprintf(buffer, "%d", manaLoss);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}
return true;
}[/cpp]
with:
[cpp]bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(target->getHealth() <= 0)
return false;
if(attacker && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && combatType != COMBAT_HEALING)
return false;
target->changeHealth(healthChange);
if(g_config.getBoolean(ConfigManager::ANIMATION_TEXT_ON_HEAL) && !target->getMonster() && !target->isInGhostMode())
{
const SpectatorVec& list = getSpectators(targetPos);
std::stringstream ss;
ss << "+" << healthChange;
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, NM_ME_MAGIC_ENERGY);
addAnimatedText(list, targetPos, g_config.getNumber(ConfigManager::ANIMATION_TEXT_ON_HEAL_COLOR), ss.str());
}
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return true;
}
if(attacker && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET) && combatType != COMBAT_HEALING)
return false;
int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
target->drainMana(attacker, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);
addMagicEffect(list, targetPos, NM_ME_LOSE_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}
Player* targetPlayer = target->getPlayer();
if(targetPlayer)
{
if(damage >= targetPlayer->getHealth())
{
//scripting event - onPrepareDeath
CreatureEvent* eventPrepareDeath = targetPlayer->getCreatureEvent(CREATURE_EVENT_PREPAREDEATH);
if(eventPrepareDeath)
eventPrepareDeath->executeOnPrepareDeath(targetPlayer, attacker);
}
}
damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);
TextColor_t textColor = TEXTCOLOR_NONE;
uint8_t hitEffect = 0;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = TEXTCOLOR_LIGHTGREEN;
hitEffect = NM_ME_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;
case RACE_BLOOD:
textColor = TEXTCOLOR_RED;
hitEffect = NM_ME_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;
case RACE_UNDEAD:
textColor = TEXTCOLOR_LIGHTGREY;
hitEffect = NM_ME_HIT_AREA;
break;
case RACE_FIRE:
textColor = TEXTCOLOR_ORANGE;
hitEffect = NM_ME_DRAW_BLOOD;
break;
case RACE_ENERGY:
textColor = TEXTCOLOR_PURPLE;
hitEffect = NM_ME_ENERGY_DAMAGE;
break;
default:
break;
}
if(splash)
{
internalAddItem(target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}
case COMBAT_ENERGYDAMAGE:
{
textColor = TEXTCOLOR_PURPLE;
hitEffect = NM_ME_ENERGY_DAMAGE;
break;
}
case COMBAT_EARTHDAMAGE:
{
textColor = TEXTCOLOR_LIGHTGREEN;
hitEffect = NM_ME_POISON_RINGS;
break;
}
case COMBAT_DROWNDAMAGE:
{
textColor = TEXTCOLOR_LIGHTBLUE;
hitEffect = NM_ME_LOSE_ENERGY;
break;
}
case COMBAT_FIREDAMAGE:
{
textColor = TEXTCOLOR_ORANGE;
hitEffect = NM_ME_HITBY_FIRE;
break;
}
case COMBAT_ICEDAMAGE:
{
textColor = TEXTCOLOR_SKYBLUE;
hitEffect = NM_ME_ICEATTACK;
break;
}
case COMBAT_HOLYDAMAGE:
{
textColor = TEXTCOLOR_YELLOW;
hitEffect = NM_ME_HOLYDAMAGE;
break;
}
case COMBAT_DEATHDAMAGE:
{
textColor = TEXTCOLOR_DARKRED;
hitEffect = NM_ME_SMALLCLOUDS;
break;
}
case COMBAT_LIFEDRAIN:
{
textColor = TEXTCOLOR_RED;
hitEffect = NM_ME_MAGIC_BLOOD;
break;
}
default:
break;
}
if(textColor != TEXTCOLOR_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);
addMagicEffect(list, targetPos, hitEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}
return true;
}
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
{
const Position& targetPos = target->getPosition();
const SpectatorVec& list = getSpectators(targetPos);
if(manaChange > 0)
{
if(attacker && target && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET))
return false;
target->changeMana(manaChange);
if(g_config.getBoolean(ConfigManager::ANIMATION_TEXT_ON_HEALMANA) && !target->getMonster() && !target->isInGhostMode())
{
const SpectatorVec& list = getSpectators(targetPos);
std::stringstream ss;
ss << "+" << manaChange;
addAnimatedText(list, targetPos, g_config.getNumber(ConfigManager::ANIMATION_TEXT_ON_HEALMANA_COLOR), ss.str());
}
}
else
{
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return false;
}
if(attacker && target && attacker->defaultOutfit.lookFeet == target->defaultOutfit.lookFeet && g_config.getBoolean(ConfigManager::CANNOT_ATTACK_SAME_LOOKFEET))
return false;
int32_t manaLoss = std::min(target->getMana(), -manaChange);
BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
if(blockType != BLOCK_NONE)
{
addMagicEffect(list, targetPos, NM_ME_POFF);
return false;
}
if(manaLoss > 0)
{
target->drainMana(attacker, manaLoss);
char buffer[20];
sprintf(buffer, "%d", manaLoss);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}
return true;
}[/cpp]
configmanager.cpp
search:
[cpp]m_confBoolean[ANIMATION_TEXT_ON_HEAL] = (getGlobalString(L, "animationTextOnHeal", "yes") == "yes");[/cpp]
add this:
[cpp]m_confBoolean[ANIMATION_TEXT_ON_HEALMANA] = (getGlobalString(L, "animationTextOnHealMana", "yes") == "yes");[/cpp]
search for:
[cpp]m_confInteger[LEVEL_TO_CREATE_GUILD] = getGlobalNumber(L, "levelToCreateGuild", 8);[/cpp]
add this:
[cpp]m_confInteger[ANIMATION_TEXT_ON_HEALMANA_COLOR] = getGlobalNumber(L, "manaChangeColor", TEXTCOLOR_PURPLE);
m_confInteger[ANIMATION_TEXT_ON_HEAL_COLOR] = getGlobalNumber(L, "healthChangeColor", TEXTCOLOR_GREEN);[/cpp]
configmanager.h
search for:
[cpp]ANIMATION_TEXT_ON_HEAL,[/cpp]
add this:
[cpp]ANIMATION_TEXT_ON_HEALMANA,[/cpp]
search for:
[cpp]LEVEL_TO_CREATE_GUILD,[/cpp]
add this:
[cpp]ANIMATION_TEXT_ON_HEALMANA_COLOR,
ANIMATION_TEXT_ON_HEAL_COLOR,[/cpp]
config.lua
add this somewhere:
Lua:
animationTextOnHealMana = "yes"
healthChangeColor = TEXTCOLOR_GREEN -- or COLOR_GREEN depends, or use the number instead.
manaChangeColor = TEXTCOLOR_PURPLE -- or COLOR_DARKPURPLE depends, or use the number instead.
IMPORTANT! do not press compile, you need to rebuild instead!
Haven't tested it, so if you have any errors, just forward me them.
EDIT: fixed a few spelling errors, so please re copy.
kind regards, Evil Hero.