Added logic to Convert UScore to Coins for Level 45 Characters (#348)

This commit is contained in:
David Markowitz
2022-02-02 22:50:02 -08:00
committed by GitHub
parent dac8ec621c
commit 13980c4133
8 changed files with 54 additions and 16 deletions

View File

@@ -42,7 +42,7 @@ CharacterComponent::CharacterComponent(Entity* parent, Character* character) : C
if (character->GetZoneID() != Game::server->GetZoneID()) {
m_IsLanding = true;
}
if (LandingAnimDisabled(character->GetZoneID()) || LandingAnimDisabled(Game::server->GetZoneID()) || m_LastRocketConfig.empty()) {
m_IsLanding = false; //Don't make us land on VE/minigames lol
}

View File

@@ -558,7 +558,7 @@ void GameMessages::SendNotifyMissionTask(Entity* entity, const SystemAddress& sy
SEND_PACKET
}
void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, int sourceType) {
void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, eLootSourceType sourceType) {
CBITSTREAM
CMSGHEADER
@@ -566,9 +566,8 @@ void GameMessages::SendModifyLEGOScore(Entity* entity, const SystemAddress& sysA
bitStream.Write((uint16_t)GAME_MSG_MODIFY_LEGO_SCORE);
bitStream.Write(score);
//Stuff stolen from the old codebase, no idea why this works. The proper implementation didn't for some reason.
bitStream.Write((int32_t)129);
bitStream.Write((unsigned char)0);
bitStream.Write(sourceType != LOOT_SOURCE_NONE);
if (sourceType != LOOT_SOURCE_NONE) bitStream.Write(sourceType);
SEND_PACKET
}

View File

@@ -69,7 +69,7 @@ namespace GameMessages {
void SendNotifyMission(Entity * entity, const SystemAddress& sysAddr, int missionID, int missionState, bool sendingRewards);
void SendNotifyMissionTask(Entity * entity, const SystemAddress& sysAddr, int missionID, int taskMask, std::vector<float> updates);
void SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, int sourceType);
void SendModifyLEGOScore(Entity* entity, const SystemAddress& sysAddr, int64_t score, eLootSourceType sourceType);
void SendUIMessageServerToSingleClient(Entity* entity, const SystemAddress& sysAddr, const std::string& message, NDGFxValue args);
void SendUIMessageServerToAllClients(const std::string& message, NDGFxValue args);

View File

@@ -14,6 +14,7 @@
#include "dLocale.h"
#include "dLogger.h"
#include "dServer.h"
#include "dZoneManager.h"
Mission::Mission(MissionComponent* missionComponent, const uint32_t missionId) {
m_MissionComponent = missionComponent;
@@ -421,11 +422,15 @@ void Mission::YieldRewards() {
}
}
int32_t coinsToSend = 0;
if (info->LegoScore > 0) {
characterComponent->SetUScore(characterComponent->GetUScore() + info->LegoScore);
if (info->isMission) {
GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), info->LegoScore, 2);
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT;
if(characterComponent->GetLevel() >= dZoneManager::Instance()->GetMaxLevel()) {
// Since the character is at the level cap we reward them with coins instead of UScore.
coinsToSend += info->LegoScore * dZoneManager::Instance()->GetLevelCapCurrencyConversion();
} else {
characterComponent->SetUScore(characterComponent->GetUScore() + info->LegoScore);
GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), info->LegoScore, lootSource);
}
}
@@ -455,8 +460,9 @@ void Mission::YieldRewards() {
inventoryComponent->AddItem(pair.first, count);
}
if (info->reward_currency_repeatable > 0) {
character->SetCoins(character->GetCoins() + info->reward_currency_repeatable, LOOT_SOURCE_MISSION);
if (info->reward_currency_repeatable > 0 || coinsToSend > 0) {
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT;
character->SetCoins(character->GetCoins() + info->reward_currency_repeatable + coinsToSend, lootSource);
}
return;
@@ -487,9 +493,9 @@ void Mission::YieldRewards() {
inventoryComponent->AddItem(pair.first, count);
}
if (info->reward_currency > 0) {
if (info->reward_currency > 0 || coinsToSend > 0) {
eLootSourceType lootSource = info->isMission ? LOOT_SOURCE_MISSION : LOOT_SOURCE_ACHIEVEMENT;
character->SetCoins(character->GetCoins() + info->reward_currency, lootSource);
character->SetCoins(character->GetCoins() + info->reward_currency + coinsToSend, lootSource);
}
if (info->reward_maxinventory > 0) {

View File

@@ -1304,8 +1304,8 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
CharacterComponent* character = entity->GetComponent<CharacterComponent>();
if (character) character->SetUScore(character->GetUScore() + uscore);
GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), uscore, LOOTTYPE_NONE);
// LOOT_SOURCE_MODERATION should work but it doesn't. Relog to see uscore changes
GameMessages::SendModifyLEGOScore(entity, entity->GetSystemAddress(), uscore, LOOT_SOURCE_MODERATION);
}
if (chatCommand == "pos" && entity->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) {