• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

Feature Healing Text Color

Evil Hero

Legacy Member
TFS Developer
Joined
Dec 12, 2007
Messages
1,262
Solutions
28
Reaction score
737
Location
Germany
Hello,

Someone was requesting this, so i felt like posting it here for everyone.

Probably someone might find it usefull and this section is kinda dead anyways.

What does the code do?

You can decide to change the color to whatever you like to be shown for the animated text when you heal.

Made for TFS 0.3.5 Pl1 (works for most other distros aswell, you just have to replace it in other files)

Let's start...

game.cpp:

Search in the function:
Code:
bool Game::combatChangeHealth
for this:
Code:
addAnimatedText(list, targetPos, TEXTCOLOR_GREEN, buffer);
replace it with this:
Code:
addAnimatedText(list, targetPos, g_config.getNumber(ConfigManager::HEALTH_HEALING_COLOR), buffer);

Search in the function:
Code:
bool Game::combatChangeMana
for this:
Code:
addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);
replace it with this:
Code:
addAnimatedText(list, targetPos, g_config.getNumber(ConfigManager::MANA_HEALING_COLOR), buffer);

configmanager.cpp:
search for this:
Code:
m_confBool[SHOW_HEALING_DAMAGE_MONSTER] = getGlobalBool("showHealingDamageForMonsters", false);
place this under it:
Code:
m_confNumber[HEALTH_HEALING_COLOR] = getGlobalNumber("healthHealingColor", TEXTCOLOR_GREEN);
m_confNumber[MANA_HEALING_COLOR] = getGlobalNumber("manaHealingColor", TEXTCOLOR_DARKPURPLE);

configmanager.h:
search for this:
Code:
NAME_REPORT_TYPE,
place this under it:
Code:
HEALTH_HEALING_COLOR,
MANA_HEALING_COLOR,

Save and Compile....

Open your config.lua then and put those 2 things somewhere.
Code:
healthHealingColor = TEXTCOLOR_GREEN
manaHealingColor = TEXTCOLOR_DARKPURPLE


kind regards, Evil Hero.
 
Isn't it easier just to change it inside the source, then compile? That's how I've done it.. a lot easier imo, but rep++ for helping those who don't know much about the source.
 
Isn't it easier just to change it inside the source, then compile? That's how I've done it.. a lot easier imo, but rep++ for helping those who don't know much about the source.

You would have to compile again, if you want to change it again.
This way you can change it whenever you feel like for it.


kind regards, Evil Hero
 
Is this the same as ShowHealingDamage in config Lua? Or does this show like.. When my HP go up 1 hitpoint, will it show above my name a number saying "1" in green?
 
huh, did all the steps, even checked them twice, and nop, it doesn't work.

What errors do you get, ahh yea and keep in mind do not click on compile you have to rebuild instead.
 
for this:

Code:
addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);

what do i do with this?
 
for this:

Code:
addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);

what do i do with this?

replace it for
Code:
addAnimatedText(list, targetPos, g_config.getNumber(ConfigManager::MANA_HEALING_COLOR), buffer);
 
i got that but were is it? i searched game.cpp found nothing... im guessing it doesnt work for my tfs
btw im using v0.2.9(mystic spirit)
all i need to mana to be shown because health alrdy is on my tfs. can you help evil
 
Last edited:
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.
 
Last edited:
there is something wrong with this line
Code:
m_confInteger[ANIMATION_TEXT_ON_HEALMANA_COLOR] = getGlobalNumber(L, "manaChangeColor", TEXTCOLOR_DARKPURPLE);
 
ah well on 0.2.x it's still called:
[cpp]TEXTCOLOR_PURPLE[/cpp]
so just change it to this one :p


kind regards, Evil Hero.
 
Back
Top