================================================================================
MU ONLINE GAMESERVER - INSTANT LEVELING BUG FIX
================================================================================
PROBLEM: Players jump from level 1 to 400 instantly when killing monsters.
FILE: GameServer/GameServer/ObjectManager.cpp
================================================================================
FIX 1: Experience Rate Multiplier (Line ~1319, 1333, 1531, 1545)
================================================================================
CHANGE: Add "/100" to expserver multiplication
BEFORE:
experience = ((damage*experience)/(int)lpMonster->MaxLife)*expserver;
AFTER:
experience = ((damage*experience)/(int)lpMonster->MaxLife)*expserver/100;
APPLY TO:
- Line ~1319: Normal experience (CharacterCalcExperienceAlone)
- Line ~1333: Master experience (CharacterCalcExperienceAlone)
- Line ~1531: Party normal experience (CharacterCalcExperienceParty)
- Line ~1545: Party master experience (CharacterCalcExperienceParty)
================================================================================
FIX 2: Division by Zero Protection (After line ~1292)
================================================================================
ADD AFTER: damage = ((damage>lpMonster->MaxLife)?(int)lpMonster->MaxLife:damage);
// Safety check: prevent division by zero
if(lpMonster->MaxLife == 0)
{
return;
}
================================================================================
FIX 3: Zero Experience Check (After line ~1386)
================================================================================
ADD BEFORE: if(this->CharacterLevelUp(...))
// Safety check: if experience is 0, don't process level up
if(experience == 0)
{
if (gServerInfo.m_DisableExpMessage == 0)
{
GCMonsterDieSend(lpObj->Index,lpMonster->Index,0,((type==0)?AttackDamage:0),flag);
}
return;
}
// Safety check: prevent overflow when casting QWORD to DWORD
DWORD experienceToAdd = (experience > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD)experience;
if(this->CharacterLevelUp(lpObj,experienceToAdd,gServerInfo.m_MaxLevelUp,EXPERIENCE_COMMON) == 0)
CHANGE: Replace (DWORD)experience with experienceToAdd in GCMonsterDieSend call
================================================================================
FIX 4: Infinite Leveling Prevention - Normal Level (Function: CharacterLevelUp)
================================================================================
ADD AFTER: if (lpObj->Level >= gServerInfo.m_MaxLevel) check:
// Safety check: prevent leveling if NextExperience is 0 or invalid
if(lpObj->NextExperience == 0)
{
lpObj->Experience += AddExperience;
return 0;
}
ADD INSIDE while(true) loop, BEFORE: if((lpObj->Experience+AddExperience) < lpObj->NextExperience)
// Safety check: prevent infinite leveling if NextExperience is 0 or invalid
if(lpObj->NextExperience == 0)
{
lpObj->Experience += AddExperience;
break;
}
================================================================================
FIX 5: Infinite Leveling Prevention - Master Level (Function: CharacterLevelUp)
================================================================================
ADD AFTER: if(lpObj->MasterLevel >= gServerInfo.m_MasterSkillTreeMaxLevel) check:
// Safety check: prevent leveling if MasterNextExperience is 0 or invalid
if(lpObj->MasterNextExperience == 0)
{
lpObj->MasterExperience += AddExperience;
return 0;
}
ADD INSIDE while(true) loop, BEFORE: if((lpObj->MasterExperience+AddExperience) < lpObj->MasterNextExperience)
// Safety check: prevent infinite leveling if MasterNextExperience is 0 or invalid
if(lpObj->MasterNextExperience == 0)
{
lpObj->MasterExperience += AddExperience;
break;
}
================================================================================
FIX 6: Party Experience - Same Fixes (Function: CharacterCalcExperienceParty)
================================================================================
APPLY FIX 3 (zero experience check + overflow protection) to party experience
calculation around line ~1619, same pattern as solo experience.
================================================================================
IMPORTANT NOTES:
================================================================================
1. Check your server config - ExperienceMultiplierConstA and
ExperienceMultiplierConstB should NOT be 0
2. Experience rate values in config are percentages:
- 100 = 100% (normal)
- 1000 = 1000% (10x experience)
3. Test thoroughly before deploying to production server
================================================================================
END OF FIX
================================================================================
Proof