• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Solved Solved

did you try what i posted? it gives you the functionality you seem to be asking for, try TEXTCOLOR_LIGHTBLUE maybe
bro, i'm not searching for textcolors or any type of text :|
my request is to solve my problem with the c++ code, is not about my scripts of potions...
but, fine, i'll test it later.
maybe
@Slavi Dodo or @MatheusMkalo can give me some advice or soluction :oops:
:oops:
 
well you said you wanted to show the healed amount of mana potions just like healing, this does it in lua with just 1 line instead of source editing and recompiling..
it would be super easy to implement for every case where you restore mana, way easier than adding to source and recompiling imo
 
Replace Game::combatChangeMana with this:
Code:
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange, CombatOrigin origin)
{
    const Position& targetPos = target->getPosition();
    if (manaChange > 0) {
        Player* attackerPlayer;
        if (attacker) {
            attackerPlayer = attacker->getPlayer();
        } else {
            attackerPlayer = nullptr;
        }

        Player* targetPlayer = target->getPlayer();
        if (attackerPlayer && targetPlayer && attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
            return false;
        }

        if (origin != ORIGIN_NONE) {
            const auto& events = target->getCreatureEvents(CREATURE_EVENT_MANACHANGE);
            if (!events.empty()) {
                for (CreatureEvent* creatureEvent : events) {
                    creatureEvent->executeManaChange(target, attacker, manaChange, origin);
                }
                return combatChangeMana(attacker, target, manaChange, ORIGIN_NONE);
            }
        }

        int32_t realManaChange = target->getMana();
        target->changeMana(manaChange);
        realManaChange = target->getMana() - realManaChange;

        if (realManaChange > 0 && !target->isInGhostMode()) {
            std::string damageString = std::to_string(realManaChange) + " mana.";

            std::string spectatorMessage;
            if (!attacker) {
                spectatorMessage += ucfirst(target->getNameDescription());
                spectatorMessage += " was restored for " + damageString;
            } else {
                spectatorMessage += ucfirst(attacker->getNameDescription());
                spectatorMessage += " restored ";
                if (attacker == target) {
                    spectatorMessage += (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself" : "himself") : "itself");
                } else {
                    spectatorMessage += target->getNameDescription();
                }
                spectatorMessage += " for " + damageString;
            }

            TextMessage message;
            message.position = targetPos;
            message.primary.value = realManaChange;
            message.primary.color = TEXTCOLOR_MAYABLUE;

            SpectatorVec list;
            map.getSpectators(list, targetPos, false, true);
            for (Creature* spectator : list) {
                Player* tmpPlayer = spectator->getPlayer();
                if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
                    message.type = MESSAGE_HEALED;
                    message.text = "You restored " + target->getNameDescription() + " for " + damageString;
                } else if (tmpPlayer == targetPlayer) {
                    message.type = MESSAGE_HEALED;
                    if (!attacker) {
                        message.text = "You were restored for " + damageString;
                    } else if (targetPlayer == attackerPlayer) {
                        message.text = "You restore yourself for " + damageString;
                    } else {
                        message.text = "You were restored by " + attacker->getNameDescription() + " for " + damageString;
                    }
                } else {
                    message.type = MESSAGE_HEALED_OTHERS;
                    message.text = spectatorMessage;
                }
                tmpPlayer->sendTextMessage(message);
            }
        }
    } else {
        if (!target->isAttackable()) {
            if (!target->isInGhostMode()) {
                addMagicEffect(targetPos, CONST_ME_POFF);
            }
            return false;
        }

        Player* attackerPlayer;
        if (attacker) {
            attackerPlayer = attacker->getPlayer();
        } else {
            attackerPlayer = nullptr;
        }

        Player* targetPlayer = target->getPlayer();
        if (attackerPlayer && targetPlayer && attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
            return false;
        }

        int32_t manaLoss = std::min<int32_t>(target->getMana(), -manaChange);
        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
        if (blockType != BLOCK_NONE) {
            addMagicEffect(targetPos, CONST_ME_POFF);
            return false;
        }

        if (manaLoss <= 0) {
            return true;
        }

        if (origin != ORIGIN_NONE) {
            const auto& events = target->getCreatureEvents(CREATURE_EVENT_MANACHANGE);
            if (!events.empty()) {
                for (CreatureEvent* creatureEvent : events) {
                    creatureEvent->executeManaChange(target, attacker, manaChange, origin);
                }
                return combatChangeMana(attacker, target, manaChange, ORIGIN_NONE);
            }
        }

        target->drainMana(attacker, manaLoss);

        std::string damageString = std::to_string(manaLoss);
        std::string spectatorMessage = ucfirst(target->getNameDescription()) + " loses " + damageString + " mana";
        if (attacker) {
            spectatorMessage += " due to ";
            if (attacker == target) {
                spectatorMessage += (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her own attack" : "his own attack") : "its own attack");
            } else {
                spectatorMessage += "an attack by " + attacker->getNameDescription();
            }
        }
        spectatorMessage += '.';

        TextMessage message;
        message.position = targetPos;
        message.primary.value = manaLoss;
        message.primary.color = TEXTCOLOR_BLUE;

        SpectatorVec list;
        map.getSpectators(list, targetPos, false, true);
        for (Creature* spectator : list) {
            Player* tmpPlayer = spectator->getPlayer();
            if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
                message.type = MESSAGE_DAMAGE_DEALT;
                message.text = ucfirst(target->getNameDescription()) + " loses " + damageString + " mana due to your attack.";
            } else if (tmpPlayer == targetPlayer) {
                message.type = MESSAGE_DAMAGE_RECEIVED;
                if (!attacker) {
                    message.text = "You lose " + damageString + " mana.";
                } else if (targetPlayer == attackerPlayer) {
                    message.text = "You lose " + damageString + " mana due to your own attack.";
                } else {
                    message.text = "You lose " + damageString + " mana due to an attack by " + attacker->getNameDescription() + '.';
                }
            } else {
                message.type = MESSAGE_DAMAGE_OTHERS;
                message.text = spectatorMessage;
            }
            tmpPlayer->sendTextMessage(message);
        }
    }

    return true;
}
Seems like you missed some things (e.g changing mana). :p
 
Replace Game::combatChangeMana with this:
Code:
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange, CombatOrigin origin)
{
    const Position& targetPos = target->getPosition();
    if (manaChange > 0) {
        Player* attackerPlayer;
        if (attacker) {
            attackerPlayer = attacker->getPlayer();
        } else {
            attackerPlayer = nullptr;
        }

        Player* targetPlayer = target->getPlayer();
        if (attackerPlayer && targetPlayer && attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
            return false;
        }

        if (origin != ORIGIN_NONE) {
            const auto& events = target->getCreatureEvents(CREATURE_EVENT_MANACHANGE);
            if (!events.empty()) {
                for (CreatureEvent* creatureEvent : events) {
                    creatureEvent->executeManaChange(target, attacker, manaChange, origin);
                }
                return combatChangeMana(attacker, target, manaChange, ORIGIN_NONE);
            }
        }

        int32_t realManaChange = target->getMana();
        target->changeMana(manaChange);
        realManaChange = target->getMana() - realManaChange;

        if (realManaChange > 0 && !target->isInGhostMode()) {
            std::string damageString = std::to_string(realManaChange) + " mana.";

            std::string spectatorMessage;
            if (!attacker) {
                spectatorMessage += ucfirst(target->getNameDescription());
                spectatorMessage += " was restored for " + damageString;
            } else {
                spectatorMessage += ucfirst(attacker->getNameDescription());
                spectatorMessage += " restored ";
                if (attacker == target) {
                    spectatorMessage += (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "herself" : "himself") : "itself");
                } else {
                    spectatorMessage += target->getNameDescription();
                }
                spectatorMessage += " for " + damageString;
            }

            TextMessage message;
            message.position = targetPos;
            message.primary.value = realManaChange;
            message.primary.color = TEXTCOLOR_MAYABLUE;

            SpectatorVec list;
            map.getSpectators(list, targetPos, false, true);
            for (Creature* spectator : list) {
                Player* tmpPlayer = spectator->getPlayer();
                if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
                    message.type = MESSAGE_HEALED;
                    message.text = "You restored " + target->getNameDescription() + " for " + damageString;
                } else if (tmpPlayer == targetPlayer) {
                    message.type = MESSAGE_HEALED;
                    if (!attacker) {
                        message.text = "You were restored for " + damageString;
                    } else if (targetPlayer == attackerPlayer) {
                        message.text = "You restore yourself for " + damageString;
                    } else {
                        message.text = "You were restored by " + attacker->getNameDescription() + " for " + damageString;
                    }
                } else {
                    message.type = MESSAGE_HEALED_OTHERS;
                    message.text = spectatorMessage;
                }
                tmpPlayer->sendTextMessage(message);
            }
        }
    } else {
        if (!target->isAttackable()) {
            if (!target->isInGhostMode()) {
                addMagicEffect(targetPos, CONST_ME_POFF);
            }
            return false;
        }

        Player* attackerPlayer;
        if (attacker) {
            attackerPlayer = attacker->getPlayer();
        } else {
            attackerPlayer = nullptr;
        }

        Player* targetPlayer = target->getPlayer();
        if (attackerPlayer && targetPlayer && attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) {
            return false;
        }

        int32_t manaLoss = std::min<int32_t>(target->getMana(), -manaChange);
        BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
        if (blockType != BLOCK_NONE) {
            addMagicEffect(targetPos, CONST_ME_POFF);
            return false;
        }

        if (manaLoss <= 0) {
            return true;
        }

        if (origin != ORIGIN_NONE) {
            const auto& events = target->getCreatureEvents(CREATURE_EVENT_MANACHANGE);
            if (!events.empty()) {
                for (CreatureEvent* creatureEvent : events) {
                    creatureEvent->executeManaChange(target, attacker, manaChange, origin);
                }
                return combatChangeMana(attacker, target, manaChange, ORIGIN_NONE);
            }
        }

        target->drainMana(attacker, manaLoss);

        std::string damageString = std::to_string(manaLoss);
        std::string spectatorMessage = ucfirst(target->getNameDescription()) + " loses " + damageString + " mana";
        if (attacker) {
            spectatorMessage += " due to ";
            if (attacker == target) {
                spectatorMessage += (targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her own attack" : "his own attack") : "its own attack");
            } else {
                spectatorMessage += "an attack by " + attacker->getNameDescription();
            }
        }
        spectatorMessage += '.';

        TextMessage message;
        message.position = targetPos;
        message.primary.value = manaLoss;
        message.primary.color = TEXTCOLOR_BLUE;

        SpectatorVec list;
        map.getSpectators(list, targetPos, false, true);
        for (Creature* spectator : list) {
            Player* tmpPlayer = spectator->getPlayer();
            if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
                message.type = MESSAGE_DAMAGE_DEALT;
                message.text = ucfirst(target->getNameDescription()) + " loses " + damageString + " mana due to your attack.";
            } else if (tmpPlayer == targetPlayer) {
                message.type = MESSAGE_DAMAGE_RECEIVED;
                if (!attacker) {
                    message.text = "You lose " + damageString + " mana.";
                } else if (targetPlayer == attackerPlayer) {
                    message.text = "You lose " + damageString + " mana due to your own attack.";
                } else {
                    message.text = "You lose " + damageString + " mana due to an attack by " + attacker->getNameDescription() + '.';
                }
            } else {
                message.type = MESSAGE_DAMAGE_OTHERS;
                message.text = spectatorMessage;
            }
            tmpPlayer->sendTextMessage(message);
        }
    }

    return true;
}
Seems like you missed some things (e.g changing mana). :p
thanks ninja, I'll test it and later back with the result, thanks alots!!
Edit: @Ninja I try compile and get an error:
13578522_1067831943298499_1526943185_n.png
 
Last edited:
Back
Top