Core/WorldStates: Migrate war mode bonus value worldstates to new system

This commit is contained in:
Shauren
2022-07-01 15:19:31 +02:00
parent cfca26c264
commit 4ac86c13d2
6 changed files with 51 additions and 43 deletions

View File

@@ -0,0 +1,4 @@
DELETE FROM `world_state` WHERE `ID` IN (17042,17043);
INSERT INTO `world_state` (`ID`,`DefaultValue`,`MapIDs`,`AreaIDs`,`Comment`) VALUES
(17042,10,NULL,NULL,'Horde War Mode bonus'),
(17043,10,NULL,NULL,'Alliance War Mode bonus');

View File

@@ -9240,12 +9240,6 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(2491, 15); // NA_UI_GUARDS_LEFT
}
// Horde War Mode bonus
packet.Worldstates.emplace_back(17042, 10 + (sWorld->GetWarModeDominantFaction() == TEAM_ALLIANCE ? sWorld->GetWarModeOutnumberedFactionReward() : 0));
// Alliance War Mode bonus
packet.Worldstates.emplace_back(17043, 10 + (sWorld->GetWarModeDominantFaction() == TEAM_HORDE ? sWorld->GetWarModeOutnumberedFactionReward() : 0));
switch (zoneId)
{
case 1: // Dun Morogh

View File

@@ -7833,6 +7833,9 @@ enum WorldState : uint32
WS_BATTLEFIELD_TB_EAST_INTACT_NEUTRAL = 5451,
WS_BATTLEFIELD_TB_EAST_DAMAGED_NEUTRAL = 5452,
WS_WAR_MODE_HORDE_BUFF_VALUE = 17042,
WS_WAR_MODE_ALLIANCE_BUFF_VALUE = 17043,
WS_CURRENCY_RESET_TIME = 20001, // Next arena distribution time
WS_WEEKLY_QUEST_RESET_TIME = 20002, // Next weekly quest reset time
WS_BG_DAILY_RESET_TIME = 20003, // Next daily BG reset time

View File

@@ -160,9 +160,6 @@ World::World()
_guidAlert = false;
_warnDiff = 0;
_warnShutdownTime = GameTime::GetGameTime();
_warModeDominantFaction = TEAM_NEUTRAL;
_warModeOutnumberedFactionReward = 0;
}
/// World destructor
@@ -2248,6 +2245,10 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading World States..."); // must be loaded before battleground, outdoor PvP and conditions
LoadWorldStates();
// TODO: this is temporary until custom world states are purged from old world state saved values
sWorldStateMgr->SetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, getWorldState(WS_WAR_MODE_HORDE_BUFF_VALUE), nullptr);
sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, getWorldState(WS_WAR_MODE_ALLIANCE_BUFF_VALUE), nullptr);
sObjectMgr->LoadPhases();
TC_LOG_INFO("server.loading", "Loading Conditions...");
@@ -2494,8 +2495,12 @@ void World::SetInitialWorldSettings()
void World::SetForcedWarModeFactionBalanceState(TeamId team, int32 reward)
{
_warModeDominantFaction = team;
_warModeOutnumberedFactionReward = reward;
sWorldStateMgr->SetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (team == TEAM_ALLIANCE ? reward : 0), nullptr);
sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (team == TEAM_HORDE ? reward : 0), nullptr);
// save to db
setWorldState(WS_WAR_MODE_HORDE_BUFF_VALUE, sWorldStateMgr->GetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, nullptr));
setWorldState(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, sWorldStateMgr->GetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, nullptr));
}
void World::DisableForcedWarModeFactionBalanceState()
@@ -3919,33 +3924,35 @@ void World::UpdateWarModeRewardValues()
} while (result->NextRow());
}
_warModeDominantFaction = TEAM_NEUTRAL;
_warModeOutnumberedFactionReward = 0;
if (std::all_of(warModeEnabledFaction.begin(), warModeEnabledFaction.end(), [](int64 val) { return val == 0; }))
return;
int64 dominantFactionCount = warModeEnabledFaction[TEAM_ALLIANCE];
TeamId dominantFaction = TEAM_ALLIANCE;
if (warModeEnabledFaction[TEAM_ALLIANCE] < warModeEnabledFaction[TEAM_HORDE])
int32 outnumberedFactionReward = 0;
if (std::any_of(warModeEnabledFaction.begin(), warModeEnabledFaction.end(), [](int64 val) { return val != 0; }))
{
dominantFactionCount = warModeEnabledFaction[TEAM_HORDE];
dominantFaction = TEAM_HORDE;
int64 dominantFactionCount = warModeEnabledFaction[TEAM_ALLIANCE];
if (warModeEnabledFaction[TEAM_ALLIANCE] < warModeEnabledFaction[TEAM_HORDE])
{
dominantFactionCount = warModeEnabledFaction[TEAM_HORDE];
dominantFaction = TEAM_HORDE;
}
double total = warModeEnabledFaction[TEAM_ALLIANCE] + warModeEnabledFaction[TEAM_HORDE];
double pct = dominantFactionCount / total;
if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_20_PCT))
outnumberedFactionReward = 20;
else if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_10_PCT))
outnumberedFactionReward = 10;
else if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_5_PCT))
outnumberedFactionReward = 5;
}
double total = warModeEnabledFaction[TEAM_ALLIANCE] + warModeEnabledFaction[TEAM_HORDE];
double pct = dominantFactionCount / total;
sWorldStateMgr->SetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (dominantFaction == TEAM_ALLIANCE ? outnumberedFactionReward : 0), nullptr);
sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (dominantFaction == TEAM_HORDE ? outnumberedFactionReward : 0), nullptr);
if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_20_PCT))
_warModeOutnumberedFactionReward = 20;
else if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_10_PCT))
_warModeOutnumberedFactionReward = 10;
else if (pct >= sWorld->getFloatConfig(CONFIG_CALL_TO_ARMS_5_PCT))
_warModeOutnumberedFactionReward = 5;
else
return;
_warModeDominantFaction = dominantFaction;
// save to db
setWorldState(WS_WAR_MODE_HORDE_BUFF_VALUE, sWorldStateMgr->GetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, nullptr));
setWorldState(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, sWorldStateMgr->GetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, nullptr));
}
Realm realm;

View File

@@ -805,8 +805,6 @@ class TC_GAME_API World
bool IsGuidAlert() { return _guidAlert; }
// War mode balancing
TeamId GetWarModeDominantFaction() const { return _warModeDominantFaction; }
int32 GetWarModeOutnumberedFactionReward() const { return _warModeOutnumberedFactionReward; }
void SetForcedWarModeFactionBalanceState(TeamId team, int32 reward = 0);
void DisableForcedWarModeFactionBalanceState();
@@ -938,9 +936,6 @@ class TC_GAME_API World
// War mode balancing
void UpdateWarModeRewardValues();
TeamId _warModeDominantFaction; // the team that has higher percentage
int32 _warModeOutnumberedFactionReward;
friend class debug_commandscript;
};

View File

@@ -45,7 +45,7 @@
#include "SpellPackets.h"
#include "SpellScript.h"
#include "Vehicle.h"
#include "World.h"
#include "WorldStateMgr.h"
class spell_gen_absorb0_hitlimit1 : public AuraScript
{
@@ -4821,10 +4821,15 @@ class spell_gen_war_mode_enlisted : public AuraScript
if (!target)
return;
if (target->GetTeamId() == sWorld->GetWarModeDominantFaction())
return;
amount += sWorld->GetWarModeOutnumberedFactionReward();
switch (target->GetTeamId())
{
case TEAM_ALLIANCE:
amount = sWorldStateMgr->GetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, nullptr);
break;
case TEAM_HORDE:
amount = sWorldStateMgr->GetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, nullptr);
break;
}
}
void Register() override