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

Change Level to Experience

MaR0

Banned User
Joined
Apr 16, 2018
Messages
272
Solutions
3
Reaction score
29
hello how to change level instead of experience to make level come up caus i wanna make high exp level, level at my server stuck in 65 k in client i want make experience calculate level instead of level how?
thanks
 
Solution
This should work fine.

C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if (player->getLevel() >= 0xFFFF) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        if(player->getExperience() > 0x7FFFFFFF) {
            msg->AddU32(0x7FFFFFFF);
        } else {
            msg->AddU32(player->getExperience());
        }
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana())...
What I think you want is this:

Since the level is maxed out at 65k and experience can go higher, you want to show the level of the character on the experience bar instead. That way if the player is level 70k it will still show but on the experience bar.

That could be achieved by this:

on your protocolgame search for the funciton
Code:
void ProtocolGame::AddPlayerStats(NetworkMessage& msg)

there are two lines like this:

Code:
msg.add<uint64_t>(player->getExperience());
msg.add<uint16_t>(player->getLevel());


Change it to:

Code:
if (player->getLevel() >= std::numeric_limits<uint16_t>::max()) {
     msg.add<uint64_t>(player->getLevel());
     msg.add<uint16_t>(0);
} else {
     msg.add<uint64_t>(player->getExperience());
     msg.add<uint16_t>(player->getLevel())
}

What this will do:
If the player level is below 65k it'll show as usual, experience and level separeted, if its higher than 65k it'll show the real level on the experience bar and the level will be shown as 0 (zero)
 
What I think you want is this:

Since the level is maxed out at 65k and experience can go higher, you want to show the level of the character on the experience bar instead. That way if the player is level 70k it will still show but on the experience bar.

That could be achieved by this:

on your protocolgame search for the funciton
Code:
void ProtocolGame::AddPlayerStats(NetworkMessage& msg)

there are two lines like this:

Code:
msg.add<uint64_t>(player->getExperience());
msg.add<uint16_t>(player->getLevel());


Change it to:

Code:
if (player->getLevel() >= std::numeric_limits<uint16_t>::max()) {
     msg.add<uint64_t>(player->getLevel());
     msg.add<uint16_t>(0);
} else {
     msg.add<uint64_t>(player->getExperience());
     msg.add<uint16_t>(player->getLevel())
}

What this will do:
If the player level is below 65k it'll show as usual, experience and level separeted, if its higher than 65k it'll show the real level on the experience bar and the level will be shown as 0 (zero)
i've found this but i don't know what to change :/ ?
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());
#ifdef __ROGIER_HIGHLEVELS__
    if(player->getLevel() >= 350)
         msg->AddU32(0);
    else
         msg->AddU32(player->getExperience());
#else
    msg->AddU32(player->getExperience());
 
    if(player->getPlayerInfo(PLAYERINFO_LEVEL) > 65535)
         msg->AddU16(0);
    else
#endif //__ROGIER_HIGHLEVELS__
 
Post the whole function so I can help you.
here you are
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());
#ifdef __ROGIER_HIGHLEVELS__
    if(player->getLevel() >= 350)
         msg->AddU32(0);
    else
         msg->AddU32(player->getExperience());
#else
    msg->AddU32(player->getExperience());
   
    if(player->getPlayerInfo(PLAYERINFO_LEVEL) > 65535)
         msg->AddU16(0);
    else
#endif //__ROGIER_HIGHLEVELS__
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
   
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
 
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if(player->getLevel() >= 65535) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        msg->AddU32(player->getExperience());
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
        
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
  
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
 
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if(player->getLevel() >= 65535) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        msg->AddU32(player->getExperience());
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
      
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
 
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
while viewing my skills i take debug
 
try this
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());
    if(player->getLevel() >= 65535) {
        msg->AddU32((int32_t)player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        msg->AddU32(player->getExperience());
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
   
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
 
try this
C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());
    if(player->getLevel() >= 65535) {
        msg->AddU32((int32_t)player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        msg->AddU32(player->getExperience());
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
 
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
while log into server i take debug
 
What level is the character you are testing it with?
edit --

i dont fucking know what the fuck the rogier highlevels mean on that. I tested it with tfs 1.2 and it worked.
 
What level is the character you are testing it with?
look this code worked well level in character is 18,488 and the exp is 1,211,685,040
PZ3eP7E.png

C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());
    if(player->getLevel() >= 65535) {
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        msg->AddU16(player->getExperience());
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
      
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
 
This should work fine.

C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if (player->getLevel() >= 0xFFFF) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        if(player->getExperience() > 0x7FFFFFFF) {
            msg->AddU32(0x7FFFFFFF);
        } else {
            msg->AddU32(player->getExperience());
        }
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
 
Solution
This should work fine.

C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if (player->getLevel() >= 0xFFFF) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        if(player->getExperience() > 0x7FFFFFFF) {
            msg->AddU32(0x7FFFFFFF);
        } else {
            msg->AddU32(player->getExperience());
        }
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
workkeeeeed ty i love you as fuck !! thank you <3 :)
 
This should work fine.

C++:
void ProtocolGame::AddPlayerStats(NetworkMessage* msg)
{
    msg->AddByte(0xA0);
    msg->AddU16(player->getHealth());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXHEALTH));
    msg->AddU16((int32_t)player->getFreeCapacity());

    if (player->getLevel() >= 0xFFFF) {
        msg->AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
        msg->AddU16(0);
    } else {
        if(player->getExperience() > 0x7FFFFFFF) {
            msg->AddU32(0x7FFFFFFF);
        } else {
            msg->AddU32(player->getExperience());
        }
        msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
    }
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
    msg->AddU16(player->getMana());
    msg->AddU16(player->getPlayerInfo(PLAYERINFO_MAXMANA));
    msg->AddByte(player->getMagicLevel());
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
    msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
    msg->AddU16(3360); //stamina(minutes) //3360 max?
}
do you have any idea how to put max level?
 
What do you mean by that? Max level for what? Where?
by the way i have this at player.h
C++:
static uint64_t getExpForLevel(int32_t level)
       {
           return (uint64_t)std::ceil((double)(50 * level * level * level)/3 - (100 * level * level) + ((850 * level) / 3) - 200);
       }
also i have 8.60 server max level working on it with this but while i used it in my source it get many errors
Code:
static uint64_t getExpForLevel(uint32_t lv)
        {
            if(lv > 777777)
                    return 0;

            static std::map<uint32_t, uint64_t> cache;
            lv--;

            std::map<uint32_t, uint64_t>::iterator it = cache.find(lv);
            if(it != cache.end())
                return it->second;

            uint64_t exp = ((50ULL * (lv+1ULL) / 3ULL - 100ULL) * (lv+1ULL) + 850ULL / 3ULL) * (lv+1ULL) - 200ULL;
            cache[lv] = exp;
            return exp;
        }
 
Back
Top