diff --git a/dGame/dGameMessages/ZoneMessages.cpp b/dGame/dGameMessages/ZoneMessages.cpp index 5d7b11804..e70882337 100644 --- a/dGame/dGameMessages/ZoneMessages.cpp +++ b/dGame/dGameMessages/ZoneMessages.cpp @@ -5,6 +5,8 @@ #include "BitStreamUtils.h" #include "CDClientManager.h" #include "Character.h" +#include "CDClientManager.h" +#include "CDLevelProgressionLookupTable.h" #include "CharacterComponent.h" #include "CppScripts.h" #include "DestroyableComponent.h" @@ -299,11 +301,25 @@ namespace GameMessages { } void NotifyServerLevelProcessingComplete::Handle(Entity& entity, const SystemAddress& sysAddr) { + // A player levels themselves up + if (!entity.IsPlayer() || entity.GetSystemAddress() != sysAddr) return; + auto* levelComp = entity.GetComponent(); if (!levelComp) return; auto* character = entity.GetComponent(); if (!character) return; + // The next level has to exist and the player needs the score for it + const uint32_t nextLevel = levelComp->GetLevel() + 1; + const auto nextLevelEntries = CDClientManager::GetTable()->Query([nextLevel](const CDLevelProgressionLookup& entry) { + return entry.id == nextLevel; + }); + + if (nextLevelEntries.empty() || character->GetUScore() < static_cast(nextLevelEntries.front().requiredUScore)) { + LOG("Player %llu asked for level %u with a score of %lld, which is not enough for it", entity.GetObjectID(), nextLevel, character->GetUScore()); + return; + } + //Update our character's level in memory: levelComp->SetLevel(levelComp->GetLevel() + 1);