• 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!

C++ Check if true or false inside config + break if false

Joriku

Working in the mines, need something?
Joined
Jul 16, 2016
Messages
1,078
Solutions
15
Reaction score
370
Location
Sweden
YouTube
Joriku
Hi,
trying to create a check for Skill Loss inside the config. Making it skip through any skill loss upon death if Boolean is false.
How would this be done? I just got into C++..

Original
Lua:
//Skill loss
        for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
            uint64_t sumSkillTries = 0;
            for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
                sumSkillTries += vocation->getReqSkillTries(i, c);
            }

            sumSkillTries += skills[i].tries;

            //uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
            while (lostSkillTries > skills[i].tries) {
                lostSkillTries -= skills[i].tries;

                if (skills[i].level <= 10) {
                    skills[i].level = 10;
                    skills[i].tries = 0;
                    lostSkillTries = 0;
                    break;
                }

                skills[i].tries = vocation->getReqSkillTries(i, skills[i].level);
                skills[i].level--;
            }

            skills[i].tries = std::max<int32_t>(0, skills[i].tries - lostSkillTries);
            skills[i].percent = Player::getPercentLevel(skills[i].tries, vocation->getReqSkillTries(i, skills[i].level));
        }

Mine, so far..
Lua:
//Skill loss
        for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
            uint64_t sumSkillTries = 0;
            for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
                sumSkillTries += vocation->getReqSkillTries(i, c);
            }

            sumSkillTries += skills[i].tries;

            // Config check for skill loss, true or false?
            if (!g_config.getBool(ConfigManager::SKILL_LOSS)) {
                //return;
                //return false;
                //break;
                // lostSkillTries = 0;
            } else {
            uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
            while (lostSkillTries > skills[i].tries) {
                lostSkillTries -= skills[i].tries;

                if (skills[i].level <= 10) {
                    skills[i].level = 10;
                    skills[i].tries = 0;
                    lostSkillTries = 0;
                    break;
                }

                skills[i].tries = vocation->getReqSkillTries(i, skills[i].level);
                skills[i].level--;
            }

            skills[i].tries = std::max<int32_t>(0, skills[i].tries - lostSkillTries);
            skills[i].percent = Player::getPercentLevel(skills[i].tries, vocation->getReqSkillTries(i, skills[i].level));
            }
        }

Added this into: config_definitions.hpp at: enum booleanConfig_t {
Lua:
SKILL_LOSS,
 
Solution
C++:
if (g_config.getBool(ConfigManager::SKILL_LOSS)) {
     for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
        uint64_t sumSkillTries = 0;
        for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
            sumSkillTries += vocation->getReqSkillTries(i, c);
        }

        sumSkillTries += skills[i].tries;

        uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
        while (lostSkillTries > skills[i].tries) {
            lostSkillTries -= skills[i].tries;

            if (skills[i].level <= 10) {
                skills[i].level = 10;
                skills[i].tries = 0;
                lostSkillTries = 0...
Let's see
Configmanager.cpp, looks ok to me.
Lua:
// Check for skill loss inside config
    boolean[SKILL_LOSS] = getGlobalBoolean(L, "skillLoss", false);

Config_definitions.hpp, looks ok to me aswell.
Lua:
SKILL_LOSS,

Then the code as of now
Lua:
//Skill loss
        // Config check for skill loss, true or false
        if (!g_config.getBool(ConfigManager::SKILL_LOSS)) { // false
            break; // break the function, stop it from losing any player skill.
        }

        if (g_config.getBool(ConfigManager::SKILL_LOSS)) { // true, continue with the skill loss code.
        for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
            uint64_t sumSkillTries = 0;
            for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
                sumSkillTries += vocation->getReqSkillTries(i, c);
            }

            sumSkillTries += skills[i].tries;

            uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
            while (lostSkillTries > skills[i].tries) {
                lostSkillTries -= skills[i].tries;

                if (skills[i].level <= 10) {
                    skills[i].level = 10;
                    skills[i].tries = 0;
                    lostSkillTries = 0;
                    break;
                }

                skills[i].tries = vocation->getReqSkillTries(i, skills[i].level);
                skills[i].level--;
            }

            skills[i].tries = std::max<int32_t>(0, skills[i].tries - lostSkillTries);
            skills[i].percent = Player::getPercentLevel(skills[i].tries, vocation->getReqSkillTries(i, skills[i].level));
            }
        }

Outcome:
1668039313561.png

The only thing I found about the "Is not a member of configmanager is this:
 
C++:
if (g_config.getBool(ConfigManager::SKILL_LOSS)) {
     for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
        uint64_t sumSkillTries = 0;
        for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
            sumSkillTries += vocation->getReqSkillTries(i, c);
        }

        sumSkillTries += skills[i].tries;

        uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
        while (lostSkillTries > skills[i].tries) {
            lostSkillTries -= skills[i].tries;

            if (skills[i].level <= 10) {
                skills[i].level = 10;
                skills[i].tries = 0;
                lostSkillTries = 0;
                break;
            }

            skills[i].tries = vocation->getReqSkillTries(i, skills[i].level);
            skills[i].level--;
        }

        skills[i].tries = std::max<int32_t>(0, skills[i].tries - lostSkillTries);
        skills[i].percent = Player::getPercentLevel(skills[i].tries, vocation->getReqSkillTries(i, skills[i].level));
    }
}
 
Solution
Update:
Managed to solve the issue by adding config_functions.hpp in and changing

This
Lua:
if (g_config.getBool(ConfigManager::SKILL_LOSS)) {

Into this
Lua:
if (g_configManager().getBoolean(SKILL_LOSS)) {

Result:
Lua:
//Skill loss
        if (g_configManager().getBoolean(SKILL_LOSS)) {
            for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) { //for each skill
        uint64_t sumSkillTries = 0;
        for (uint16_t c = 11; c <= skills[i].level; ++c) { //sum up all required tries for all skill levels
            sumSkillTries += vocation->getReqSkillTries(i, c);
        }

        sumSkillTries += skills[i].tries;

        uint32_t lostSkillTries = static_cast<uint32_t>(sumSkillTries * deathLossPercent);
        while (lostSkillTries > skills[i].tries) {
            lostSkillTries -= skills[i].tries;

            if (skills[i].level <= 10) {
                skills[i].level = 10;
                skills[i].tries = 0;
                lostSkillTries = 0;
                break;
            }

            skills[i].tries = vocation->getReqSkillTries(i, skills[i].level);
            skills[i].level--;
        }

        skills[i].tries = std::max<int32_t>(0, skills[i].tries - lostSkillTries);
        skills[i].percent = Player::getPercentLevel(skills[i].tries, vocation->getReqSkillTries(i, skills[i].level));
            }
        }

So in total, files needed of change was:
player.cpp
configmanager.cpp
config_functions.hpp
config_definitions.hpp

Testing it out..

---UPDATE---
So, WinSCP had some sort of issue and did not update any files. After restarting it, this solved it. Skill losses are no more an issue. Thank you Sarah!
Post automatically merged:

So, auto merge.

For magic level losses, do this:
move the double deathlosspercent out of the config check.
Like this:
Lua:
double deathLossPercent = getLostPercent() * (unfairFightReduction / 100.);

        //Magic level loss
    if (g_configManager().getBoolean(MAGIC_LOSS)) { // config for true or false, magic level loss.
        uint64_t sumMana = 0;
        uint64_t lostMana = 0;

        //sum up all the mana
        for (uint32_t i = 1; i <= magLevel; ++i) {
            sumMana += vocation->getReqMana(i);
        }

        sumMana += manaSpent;

        // Charm bless bestiary
        if (lastHitCreature && lastHitCreature->getMonster()) {
            if (charmRuneBless != 0) {
                const MonsterType* mType = g_monsters().getMonsterType(lastHitCreature->getName());
                if (mType && mType->info.raceid == charmRuneBless) {
                    deathLossPercent = (deathLossPercent * 90) / 100;
                }
            }
        }

        lostMana = static_cast<uint64_t>(sumMana * deathLossPercent);

        while (lostMana > manaSpent && magLevel > 0) {
            lostMana -= manaSpent;
            manaSpent = vocation->getReqMana(magLevel);
            magLevel--;
        }

        manaSpent -= lostMana;

        uint64_t nextReqMana = vocation->getReqMana(magLevel + 1);
        if (nextReqMana > vocation->getReqMana(magLevel)) {
            magLevelPercent = Player::getPercentLevel(manaSpent, nextReqMana);
        } else {
            magLevelPercent = 0;
        }
    }
 
Last edited:
Back
Top