diff --git a/dGame/dComponents/LevelProgressionComponent.cpp b/dGame/dComponents/LevelProgressionComponent.cpp index 07fa9dca..4c08fe20 100644 --- a/dGame/dComponents/LevelProgressionComponent.cpp +++ b/dGame/dComponents/LevelProgressionComponent.cpp @@ -43,47 +43,48 @@ void LevelProgressionComponent::LoadFromXml(tinyxml2::XMLDocument* doc) { void LevelProgressionComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { outBitStream->Write(bIsInitialUpdate || m_DirtyLevelInfo); - if (bIsInitialUpdate || m_DirtyLevelInfo) outBitStream->Write(m_Level); - m_DirtyLevelInfo = false; + if (bIsInitialUpdate || m_DirtyLevelInfo) { + outBitStream->Write(m_Level); + if (!bIsInitialUpdate) m_DirtyLevelInfo = false; + } } void LevelProgressionComponent::HandleLevelUp() { auto* rewardsTable = CDClientManager::Instance().GetTable(); const auto& rewards = rewardsTable->GetByLevelID(m_Level); - bool rewardingItem = rewards.size() > 0; + if (rewards.empty()) return; auto* inventoryComponent = m_ParentEntity->GetComponent(); auto* controllablePhysicsComponent = m_ParentEntity->GetComponent(); if (!inventoryComponent || !controllablePhysicsComponent) return; // Tell the client we beginning to send level rewards. - if (rewardingItem) GameMessages::NotifyLevelRewards(m_ParentEntity->GetObjectID(), m_ParentEntity->GetSystemAddress(), m_Level, rewardingItem); + GameMessages::NotifyLevelRewards(m_ParentEntity->GetObjectID(), m_ParentEntity->GetSystemAddress(), m_Level, true); for (auto* reward : rewards) { switch (reward->rewardType) { case 0: inventoryComponent->AddItem(reward->value, reward->count, eLootSourceType::LEVEL_REWARD); break; - case 4: - { + case 4: { auto* items = inventoryComponent->GetInventory(eInventoryType::ITEMS); + if (!items) continue; items->SetSize(items->GetSize() + reward->value); + break; } - break; case 9: SetSpeedBase(static_cast(reward->value)); controllablePhysicsComponent->SetSpeedMultiplier(GetSpeedBase() / 500.0f); break; case 11: case 12: - break; default: break; } } // Tell the client we have finished sending level rewards. - if (rewardingItem) GameMessages::NotifyLevelRewards(m_ParentEntity->GetObjectID(), m_ParentEntity->GetSystemAddress(), m_Level, !rewardingItem); + GameMessages::NotifyLevelRewards(m_ParentEntity->GetObjectID(), m_ParentEntity->GetSystemAddress(), m_Level, false); } void LevelProgressionComponent::SetRetroactiveBaseSpeed() { diff --git a/dGame/dComponents/LevelProgressionComponent.h b/dGame/dComponents/LevelProgressionComponent.h index 033e54e5..5be9756a 100644 --- a/dGame/dComponents/LevelProgressionComponent.h +++ b/dGame/dComponents/LevelProgressionComponent.h @@ -11,7 +11,7 @@ * */ -class LevelProgressionComponent : public Component { +class LevelProgressionComponent final : public Component { public: inline static const eReplicaComponentType ComponentType = eReplicaComponentType::LEVEL_PROGRESSION; @@ -45,7 +45,11 @@ public: * Sets the level of the entity * @param level the level to set */ - void SetLevel(uint32_t level) { m_Level = level; m_DirtyLevelInfo = true; } + void SetLevel(uint32_t level) { + if (m_Level == level) return; + m_Level = level; + m_DirtyLevelInfo = true; + } /** * Gets the current Speed Base of the entity @@ -98,7 +102,7 @@ private: float m_SpeedBase; /** - * The Character format version + * The Character format version. Certain bug fixes increment this version number. */ eCharacterVersion m_CharacterVersion;