aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp4
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h10
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp9
-rw-r--r--src/server/game/World/World.cpp158
-rw-r--r--src/server/game/World/World.h21
-rw-r--r--src/server/game/World/WorldStates/WorldStateMgr.cpp65
-rw-r--r--src/server/game/World/WorldStates/WorldStateMgr.h2
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.cpp48
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.h4
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.cpp97
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.h13
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp6
13 files changed, 188 insertions, 253 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index 26d6648d15e..33e277421cf 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -521,8 +521,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME, "UPDATE instance_reset SET resettime = ? WHERE mapid = ? AND difficulty = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_UPD_CHAR_ONLINE, "UPDATE characters SET online = 1 WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN, "UPDATE characters SET name = ?, at_login = ? WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_WORLD_STATE, "REPLACE INTO world_state_value (Id, Value) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_WORLD_VARIABLE, "REPLACE INTO world_variable (Id, Value) VALUES (?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index ccae9b1f8f2..cbeba328986 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -405,8 +405,8 @@ enum CharacterDatabaseStatements : uint32
CHAR_UPD_GLOBAL_INSTANCE_RESETTIME,
CHAR_UPD_CHAR_ONLINE,
CHAR_UPD_CHAR_NAME_AT_LOGIN,
- CHAR_UPD_WORLDSTATE,
- CHAR_INS_WORLDSTATE,
+ CHAR_REP_WORLD_STATE,
+ CHAR_REP_WORLD_VARIABLE,
CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID,
CHAR_UPD_CHAR_INSTANCE,
CHAR_INS_CHAR_INSTANCE,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 8a638e638fc..d5ae045904b 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -7838,16 +7838,6 @@ enum WorldState : uint32
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
- WS_CLEANING_FLAGS = 20004, // Cleaning Flags
- WS_GUILD_DAILY_RESET_TIME = 20006, // Next guild cap reset time
- WS_MONTHLY_QUEST_RESET_TIME = 20007, // Next monthly quest reset time
- WS_DAILY_QUEST_RESET_TIME = 20008, // Next daily quest reset time
- WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME = 20009, // Next daily calendar deletions of old events time
- WS_GUILD_WEEKLY_RESET_TIME = 20050, // Next guild week reset time
};
#endif
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
index 4f67878885e..06956f865f3 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
@@ -36,12 +36,7 @@ void CharacterDatabaseCleaner::CleanDatabase()
uint32 oldMSTime = getMSTime();
- // check flags which clean ups are necessary
- QueryResult result = CharacterDatabase.PQuery("SELECT value FROM worldstates WHERE entry = %d", WS_CLEANING_FLAGS);
- if (!result)
- return;
-
- uint32 flags = (*result)[0].GetUInt32();
+ uint32 flags = sWorld->GetPersistentWorldVariable(World::CharacterDatabaseCleaningFlagsVarId);
// clean up
if (flags & CLEANING_FLAG_ACHIEVEMENT_PROGRESS)
@@ -62,7 +57,7 @@ void CharacterDatabaseCleaner::CleanDatabase()
// NOTE: In order to have persistentFlags be set in worldstates for the next cleanup,
// you need to define them at least once in worldstates.
flags &= sWorld->getIntConfig(CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS);
- CharacterDatabase.DirectPExecute("UPDATE worldstates SET value = %u WHERE entry = %d", flags, WS_CLEANING_FLAGS);
+ sWorld->SetPersistentWorldVariable(World::CharacterDatabaseCleaningFlagsVarId, flags);
sWorld->SetCleaningFlags(flags);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index b762853b02a..502afce812b 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -119,6 +119,21 @@ TC_GAME_API int32 World::m_visibility_notify_periodInInstances = DEFAULT_VISIBI
TC_GAME_API int32 World::m_visibility_notify_periodInBG = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
TC_GAME_API int32 World::m_visibility_notify_periodInArenas = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
+struct PersistentWorldVariable
+{
+ std::string Id;
+};
+
+PersistentWorldVariable const World::NextCurrencyResetTimeVarId{ "NextCurrencyResetTime" };
+PersistentWorldVariable const World::NextWeeklyQuestResetTimeVarId{ "NextWeeklyQuestResetTime" };
+PersistentWorldVariable const World::NextBGRandomDailyResetTimeVarId{ "NextBGRandomDailyResetTime" };
+PersistentWorldVariable const World::CharacterDatabaseCleaningFlagsVarId{ "PersistentCharacterCleanFlags" };
+PersistentWorldVariable const World::NextGuildDailyResetTimeVarId{ "NextGuildDailyResetTime" };
+PersistentWorldVariable const World::NextMonthlyQuestResetTimeVarId{ "NextMonthlyQuestResetTime" };
+PersistentWorldVariable const World::NextDailyQuestResetTimeVarId{ "NextDailyQuestResetTime" };
+PersistentWorldVariable const World::NextOldCalendarEventDeletionTimeVarId{ "NextOldCalendarEventDeletionTime" };
+PersistentWorldVariable const World::NextGuildWeeklyResetTimeVarId{ "NextGuildWeeklyResetTime" };
+
/// World constructor
World::World()
{
@@ -145,6 +160,7 @@ World::World()
mail_timer = 0;
mail_timer_expires = 0;
+ blackmarket_timer = 0;
m_isClosed = false;
@@ -2246,16 +2262,13 @@ void World::SetInitialWorldSettings()
sFormationMgr->LoadCreatureFormations();
TC_LOG_INFO("server.loading", "Loading World State templates...");
- sWorldStateMgr->LoadFromDB();
+ sWorldStateMgr->LoadFromDB(); // must be loaded before battleground, outdoor PvP and conditions
- TC_LOG_INFO("server.loading", "Loading World States..."); // must be loaded before battleground, outdoor PvP and conditions
- LoadWorldStates();
+ TC_LOG_INFO("server.loading", "Loading Persistend World Variables...");
+ LoadPersistentWorldVariables();
sWorldStateMgr->SetValue(WS_CURRENT_PVP_SEASON_ID, getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS) ? getIntConfig(CONFIG_ARENA_SEASON_ID) : 0, false, nullptr);
sWorldStateMgr->SetValue(WS_PREVIOUS_PVP_SEASON_ID, getIntConfig(CONFIG_ARENA_SEASON_ID) - getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS), false, nullptr);
- // 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), false, nullptr);
- sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, getWorldState(WS_WAR_MODE_ALLIANCE_BUFF_VALUE), false, nullptr);
sObjectMgr->LoadPhases();
@@ -2374,8 +2387,6 @@ void World::SetInitialWorldSettings()
m_timers[WUPDATE_BLACKMARKET].SetInterval(10 * IN_MILLISECONDS);
- blackmarket_timer = 0;
-
m_timers[WUPDATE_CHECK_FILECHANGES].SetInterval(500);
m_timers[WUPDATE_WHO_LIST].SetInterval(5 * IN_MILLISECONDS); // update who list cache every 5 seconds
@@ -2503,12 +2514,8 @@ void World::SetInitialWorldSettings()
void World::SetForcedWarModeFactionBalanceState(TeamId team, int32 reward)
{
- sWorldStateMgr->SetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (team == TEAM_ALLIANCE ? reward : 0), false, nullptr);
- sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (team == TEAM_HORDE ? reward : 0), false, 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));
+ sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (team == TEAM_ALLIANCE ? reward : 0), false, nullptr);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (team == TEAM_HORDE ? reward : 0), false, nullptr);
}
void World::DisableForcedWarModeFactionBalanceState()
@@ -3484,9 +3491,9 @@ void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount)
void World::InitQuestResetTimes()
{
- m_NextDailyQuestReset = sWorld->getWorldState(WS_DAILY_QUEST_RESET_TIME);
- m_NextWeeklyQuestReset = sWorld->getWorldState(WS_WEEKLY_QUEST_RESET_TIME);
- m_NextMonthlyQuestReset = sWorld->getWorldState(WS_MONTHLY_QUEST_RESET_TIME);
+ m_NextDailyQuestReset = sWorld->GetPersistentWorldVariable(NextDailyQuestResetTimeVarId);
+ m_NextWeeklyQuestReset = sWorld->GetPersistentWorldVariable(NextWeeklyQuestResetTimeVarId);
+ m_NextMonthlyQuestReset = sWorld->GetPersistentWorldVariable(NextMonthlyQuestResetTimeVarId);
}
static time_t GetNextDailyResetTime(time_t t)
@@ -3518,7 +3525,7 @@ void World::DailyReset()
ASSERT(now < next);
m_NextDailyQuestReset = next;
- sWorld->setWorldState(WS_DAILY_QUEST_RESET_TIME, uint64(next));
+ sWorld->SetPersistentWorldVariable(NextDailyQuestResetTimeVarId, uint64(next));
TC_LOG_INFO("misc", "Daily quests for all characters have been reset.");
}
@@ -3557,7 +3564,7 @@ void World::ResetWeeklyQuests()
ASSERT(now < next);
m_NextWeeklyQuestReset = next;
- sWorld->setWorldState(WS_WEEKLY_QUEST_RESET_TIME, uint64(next));
+ sWorld->SetPersistentWorldVariable(NextWeeklyQuestResetTimeVarId, uint64(next));
TC_LOG_INFO("misc", "Weekly quests for all characters have been reset.");
}
@@ -3593,7 +3600,7 @@ void World::ResetMonthlyQuests()
ASSERT(now < next);
m_NextMonthlyQuestReset = next;
- sWorld->setWorldState(WS_MONTHLY_QUEST_RESET_TIME, uint64(next));
+ sWorld->SetPersistentWorldVariable(NextMonthlyQuestResetTimeVarId, uint64(next));
TC_LOG_INFO("misc", "Monthly quests for all characters have been reset.");
}
@@ -3611,7 +3618,7 @@ void World::CheckScheduledResetTimes()
void World::InitRandomBGResetTime()
{
- time_t bgtime = sWorld->getWorldState(WS_BG_DAILY_RESET_TIME);
+ time_t bgtime = sWorld->GetPersistentWorldVariable(NextBGRandomDailyResetTimeVarId);
if (!bgtime)
m_NextRandomBGReset = GameTime::GetGameTime(); // game time not yet init
@@ -3634,14 +3641,14 @@ void World::InitRandomBGResetTime()
m_NextRandomBGReset = bgtime < curTime ? nextDayResetTime - DAY : nextDayResetTime;
if (!bgtime)
- sWorld->setWorldState(WS_BG_DAILY_RESET_TIME, uint32(m_NextRandomBGReset));
+ sWorld->SetPersistentWorldVariable(NextBGRandomDailyResetTimeVarId, uint32(m_NextRandomBGReset));
}
void World::InitCalendarOldEventsDeletionTime()
{
time_t now = GameTime::GetGameTime();
time_t nextDeletionTime = GetLocalHourTimestamp(now, getIntConfig(CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR));
- time_t currentDeletionTime = getWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME);
+ time_t currentDeletionTime = GetPersistentWorldVariable(NextOldCalendarEventDeletionTimeVarId);
// If the reset time saved in the worldstate is before now it means the server was offline when the reset was supposed to occur.
// In this case we set the reset time in the past and next world update will do the reset and schedule next one in the future.
@@ -3651,12 +3658,12 @@ void World::InitCalendarOldEventsDeletionTime()
m_NextCalendarOldEventsDeletionTime = nextDeletionTime;
if (!currentDeletionTime)
- sWorld->setWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME, uint64(m_NextCalendarOldEventsDeletionTime));
+ sWorld->SetPersistentWorldVariable(NextOldCalendarEventDeletionTimeVarId, uint64(m_NextCalendarOldEventsDeletionTime));
}
void World::InitGuildResetTime()
{
- time_t gtime = getWorldState(WS_GUILD_DAILY_RESET_TIME);
+ time_t gtime = GetPersistentWorldVariable(NextGuildDailyResetTimeVarId);
if (!gtime)
m_NextGuildReset = GameTime::GetGameTime(); // game time not yet init
@@ -3679,12 +3686,12 @@ void World::InitGuildResetTime()
m_NextGuildReset = gtime < curTime ? nextDayResetTime - DAY : nextDayResetTime;
if (!gtime)
- sWorld->setWorldState(WS_GUILD_DAILY_RESET_TIME, uint32(m_NextGuildReset));
+ sWorld->SetPersistentWorldVariable(NextGuildDailyResetTimeVarId, uint32(m_NextGuildReset));
}
void World::InitCurrencyResetTime()
{
- time_t currencytime = sWorld->getWorldState(WS_CURRENCY_RESET_TIME);
+ time_t currencytime = sWorld->GetPersistentWorldVariable(NextCurrencyResetTimeVarId);
if (!currencytime)
m_NextCurrencyReset = GameTime::GetGameTime(); // game time not yet init
@@ -3709,7 +3716,7 @@ void World::InitCurrencyResetTime()
m_NextCurrencyReset = currencytime < curTime ? nextWeekResetTime - getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL) * DAY : nextWeekResetTime;
if (!currencytime)
- sWorld->setWorldState(WS_CURRENCY_RESET_TIME, uint32(m_NextCurrencyReset));
+ sWorld->SetPersistentWorldVariable(NextCurrencyResetTimeVarId, uint32(m_NextCurrencyReset));
}
void World::ResetCurrencyWeekCap()
@@ -3721,7 +3728,7 @@ void World::ResetCurrencyWeekCap()
itr->second->GetPlayer()->ResetCurrencyWeekCap();
m_NextCurrencyReset = time_t(m_NextCurrencyReset + DAY * getIntConfig(CONFIG_CURRENCY_RESET_INTERVAL));
- sWorld->setWorldState(WS_CURRENCY_RESET_TIME, uint32(m_NextCurrencyReset));
+ sWorld->SetPersistentWorldVariable(NextCurrencyResetTimeVarId, uint32(m_NextCurrencyReset));
}
void World::ResetEventSeasonalQuests(uint16 event_id, time_t eventStartTime)
@@ -3750,7 +3757,7 @@ void World::ResetRandomBG()
itr->second->GetPlayer()->SetRandomWinner(false);
m_NextRandomBGReset = time_t(m_NextRandomBGReset + DAY);
- sWorld->setWorldState(WS_BG_DAILY_RESET_TIME, uint32(m_NextRandomBGReset));
+ sWorld->SetPersistentWorldVariable(NextBGRandomDailyResetTimeVarId, uint32(m_NextRandomBGReset));
}
void World::CalendarDeleteOldEvents()
@@ -3758,19 +3765,19 @@ void World::CalendarDeleteOldEvents()
TC_LOG_INFO("misc", "Calendar deletion of old events.");
m_NextCalendarOldEventsDeletionTime = time_t(m_NextCalendarOldEventsDeletionTime + DAY);
- sWorld->setWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME, uint64(m_NextCalendarOldEventsDeletionTime));
+ sWorld->SetPersistentWorldVariable(NextOldCalendarEventDeletionTimeVarId, uint64(m_NextCalendarOldEventsDeletionTime));
sCalendarMgr->DeleteOldEvents();
}
void World::ResetGuildCap()
{
m_NextGuildReset = time_t(m_NextGuildReset + DAY);
- sWorld->setWorldState(WS_GUILD_DAILY_RESET_TIME, uint32(m_NextGuildReset));
- uint32 week = getWorldState(WS_GUILD_WEEKLY_RESET_TIME);
+ sWorld->SetPersistentWorldVariable(NextGuildDailyResetTimeVarId, uint32(m_NextGuildReset));
+ uint32 week = GetPersistentWorldVariable(NextGuildWeeklyResetTimeVarId);
week = week < 7 ? week + 1 : 1;
TC_LOG_INFO("misc", "Guild Daily Cap reset. Week: %u", week == 1);
- sWorld->setWorldState(WS_GUILD_WEEKLY_RESET_TIME, week);
+ sWorld->SetPersistentWorldVariable(NextGuildWeeklyResetTimeVarId, week);
sGuildMgr->ResetTimes(week == 1);
}
@@ -3815,33 +3822,6 @@ bool World::IsBattlePetJournalLockAcquired(ObjectGuid battlenetAccountGuid)
return false;
}
-void World::LoadWorldStates()
-{
- uint32 oldMSTime = getMSTime();
-
- QueryResult result = CharacterDatabase.Query("SELECT entry, value FROM worldstates");
-
- if (!result)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 world states. DB table `worldstates` is empty!");
-
- return;
- }
-
- uint32 count = 0;
-
- do
- {
- Field* fields = result->Fetch();
- m_worldstates[fields[0].GetUInt32()] = fields[1].GetUInt32();
- ++count;
- }
- while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded %u world states in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-
-}
-
bool World::IsPvPRealm() const
{
return (getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP);
@@ -3852,38 +3832,38 @@ bool World::IsFFAPvPRealm() const
return getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP;
}
-// Setting a worldstate will save it to DB
-void World::setWorldState(uint32 index, uint32 value)
+int32 World::GetPersistentWorldVariable(PersistentWorldVariable const& var) const
{
- WorldStatesMap::const_iterator it = m_worldstates.find(index);
- if (it != m_worldstates.end())
- {
- if (it->second == value)
- return;
+ if (int32 const* value = Trinity::Containers::MapGetValuePtr(m_worldVariables, var.Id))
+ return *value;
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_WORLDSTATE);
+ return 0;
+}
- stmt->setUInt32(0, uint32(value));
- stmt->setUInt32(1, index);
+void World::SetPersistentWorldVariable(PersistentWorldVariable const& var, int32 value)
+{
+ m_worldVariables[var.Id] = value;
- CharacterDatabase.Execute(stmt);
- }
- else
- {
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_WORLDSTATE);
+ CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_WORLD_VARIABLE);
+ stmt->setStringView(0, var.Id);
+ stmt->setInt32(1, value);
+ CharacterDatabase.Execute(stmt);
+}
- stmt->setUInt32(0, index);
- stmt->setUInt32(1, uint32(value));
+void World::LoadPersistentWorldVariables()
+{
+ uint32 oldMSTime = getMSTime();
- CharacterDatabase.Execute(stmt);
+ if (QueryResult result = CharacterDatabase.Query("SELECT ID, Value FROM world_variable"))
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ m_worldVariables[fields[0].GetString()] = fields[1].GetInt32();
+ } while (result->NextRow());
}
- m_worldstates[index] = value;
-}
-uint32 World::getWorldState(uint32 index) const
-{
- WorldStatesMap::const_iterator it = m_worldstates.find(index);
- return it != m_worldstates.end() ? it->second : 0;
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " world variables in %u ms", m_worldVariables.size(), GetMSTimeDiffToNow(oldMSTime));
}
void World::ProcessQueryCallbacks()
@@ -3956,12 +3936,8 @@ void World::UpdateWarModeRewardValues()
outnumberedFactionReward = 5;
}
- sWorldStateMgr->SetValue(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (dominantFaction == TEAM_ALLIANCE ? outnumberedFactionReward : 0), false, nullptr);
- sWorldStateMgr->SetValue(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (dominantFaction == TEAM_HORDE ? outnumberedFactionReward : 0), false, 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));
+ sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_HORDE_BUFF_VALUE, 10 + (dominantFaction == TEAM_ALLIANCE ? outnumberedFactionReward : 0), false, nullptr);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_WAR_MODE_ALLIANCE_BUFF_VALUE, 10 + (dominantFaction == TEAM_HORDE ? outnumberedFactionReward : 0), false, nullptr);
}
Realm realm;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 214e9cbd6c0..044990acecd 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -561,6 +561,8 @@ enum RealmZone
REALM_ZONE_CN5_8 = 37 // basic-Latin at create, any at login
};
+struct PersistentWorldVariable;
+
/// Storage class for commands issued for delayed execution
struct TC_GAME_API CliCommandHolder
{
@@ -746,9 +748,19 @@ class TC_GAME_API World
return index < INT64_CONFIT_VALUE_COUNT ? m_int64_configs[index] : 0;
}
- void setWorldState(uint32 index, uint32 value);
- uint32 getWorldState(uint32 index) const;
- void LoadWorldStates();
+ static PersistentWorldVariable const NextCurrencyResetTimeVarId; // Next arena distribution time
+ static PersistentWorldVariable const NextWeeklyQuestResetTimeVarId; // Next weekly quest reset time
+ static PersistentWorldVariable const NextBGRandomDailyResetTimeVarId; // Next daily BG reset time
+ static PersistentWorldVariable const CharacterDatabaseCleaningFlagsVarId; // Cleaning Flags
+ static PersistentWorldVariable const NextGuildDailyResetTimeVarId; // Next guild cap reset time
+ static PersistentWorldVariable const NextMonthlyQuestResetTimeVarId; // Next monthly quest reset time
+ static PersistentWorldVariable const NextDailyQuestResetTimeVarId; // Next daily quest reset time
+ static PersistentWorldVariable const NextOldCalendarEventDeletionTimeVarId; // Next daily calendar deletions of old events time
+ static PersistentWorldVariable const NextGuildWeeklyResetTimeVarId; // Next guild week reset time
+
+ int32 GetPersistentWorldVariable(PersistentWorldVariable const& var) const;
+ void SetPersistentWorldVariable(PersistentWorldVariable const& var, int32 value);
+ void LoadPersistentWorldVariables();
/// Are we on a "Player versus Player" server?
bool IsPvPRealm() const;
@@ -862,8 +874,7 @@ class TC_GAME_API World
uint64 m_int64_configs[INT64_CONFIT_VALUE_COUNT];
bool m_bool_configs[BOOL_CONFIG_VALUE_COUNT];
float m_float_configs[FLOAT_CONFIG_VALUE_COUNT];
- typedef std::map<uint32, uint32> WorldStatesMap;
- WorldStatesMap m_worldstates;
+ std::unordered_map<std::string, int32> m_worldVariables;
uint32 m_playerLimit;
AccountTypes m_allowedSecurityLevel;
LocaleConstant m_defaultDbcLocale; // from config for one from loaded DBC locales
diff --git a/src/server/game/World/WorldStates/WorldStateMgr.cpp b/src/server/game/World/WorldStates/WorldStateMgr.cpp
index a09e9e82977..f753d0e0bc4 100644
--- a/src/server/game/World/WorldStates/WorldStateMgr.cpp
+++ b/src/server/game/World/WorldStates/WorldStateMgr.cpp
@@ -59,14 +59,14 @@ void WorldStateMgr::LoadFromDB()
Optional<uint32> mapId = Trinity::StringTo<uint32>(mapIdToken);
if (!mapId)
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with non-integer MapID (" STRING_VIEW_FMT "), map ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with non-integer MapID (" STRING_VIEW_FMT "), map ignored",
id, STRING_VIEW_FMT_ARG(mapIdToken));
continue;
}
if (!sMapStore.LookupEntry(*mapId))
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with invalid MapID (%u), map ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with invalid MapID (%u), map ignored",
id, *mapId);
continue;
}
@@ -76,7 +76,7 @@ void WorldStateMgr::LoadFromDB()
if (!mapIds.empty() && worldState.MapIds.empty())
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with nonempty MapIDs (" STRING_VIEW_FMT ") but no valid map id was found, ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with nonempty MapIDs (" STRING_VIEW_FMT ") but no valid map id was found, ignored",
id, STRING_VIEW_FMT_ARG(mapIds));
continue;
}
@@ -97,14 +97,14 @@ void WorldStateMgr::LoadFromDB()
AreaTableEntry const* areaTableEntry = sAreaTableStore.LookupEntry(*areaId);
if (!areaTableEntry)
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with invalid AreaID (%u), area ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with invalid AreaID (%u), area ignored",
id, *areaId);
continue;
}
if (worldState.MapIds.find(areaTableEntry->ContinentID) == worldState.MapIds.end())
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with AreaID (%u) not on any of required maps, area ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with AreaID (%u) not on any of required maps, area ignored",
id, *areaId);
continue;
}
@@ -114,14 +114,14 @@ void WorldStateMgr::LoadFromDB()
if (!areaIds.empty() && worldState.AreaIds.empty())
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with nonempty AreaIDs (" STRING_VIEW_FMT ") but no valid area id was found, ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with nonempty AreaIDs (" STRING_VIEW_FMT ") but no valid area id was found, ignored",
id, STRING_VIEW_FMT_ARG(areaIds));
continue;
}
}
else if (!areaIds.empty())
{
- TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %u with nonempty AreaIDs (" STRING_VIEW_FMT ") but is a realm wide world state, area requirement ignored",
+ TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with nonempty AreaIDs (" STRING_VIEW_FMT ") but is a realm wide world state, area requirement ignored",
id, STRING_VIEW_FMT_ARG(areaIds));
}
@@ -138,6 +138,40 @@ void WorldStateMgr::LoadFromDB()
} while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " world state templates %u ms", _worldStateTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
+
+ oldMSTime = getMSTime();
+
+ result = CharacterDatabase.Query("SELECT Id, Value FROM world_state_value");
+ uint32 savedValueCount = 0;
+ if (result)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ int32 worldStateId = fields[0].GetInt32();
+ WorldStateTemplate* worldState = Trinity::Containers::MapGetValuePtr(_worldStateTemplates, worldStateId);
+ if (!worldState)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `world_state_value` contains a value for unknown world state %d, ignored", worldStateId);
+ continue;
+ }
+
+ int32 value = fields[1].GetInt32();
+
+ if (!worldState->MapIds.empty())
+ {
+ for (uint32 mapId : worldState->MapIds)
+ _worldStatesByMap[mapId][worldStateId] = value;
+ }
+ else
+ _realmWorldStateValues[worldStateId] = value;
+
+ ++savedValueCount;
+ }
+ while (result->NextRow());
+ }
+
+ TC_LOG_INFO("server.loading", ">> Loaded %u saved world state values %u ms", savedValueCount, GetMSTimeDiffToNow(oldMSTime));
}
WorldStateTemplate const* WorldStateMgr::GetWorldStateTemplate(int32 worldStateId) const
@@ -192,6 +226,23 @@ void WorldStateMgr::SetValue(int32 worldStateId, int32 value, bool hidden, Map*
map->SetWorldStateValue(worldStateId, value, hidden);
}
+void WorldStateMgr::SaveValueInDb(int32 worldStateId, int32 value)
+{
+ if (!GetWorldStateTemplate(worldStateId))
+ return;
+
+ CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_WORLD_VARIABLE);
+ stmt->setInt32(0, worldStateId);
+ stmt->setInt32(1, value);
+ CharacterDatabase.Execute(stmt);
+}
+
+void WorldStateMgr::SetValueAndSaveInDb(int32 worldStateId, int32 value, bool hidden, Map* map)
+{
+ SetValue(worldStateId, value, hidden, map);
+ SaveValueInDb(worldStateId, value);
+}
+
WorldStateValueContainer WorldStateMgr::GetInitialWorldStatesForMap(Map const* map) const
{
WorldStateValueContainer initialValues;
diff --git a/src/server/game/World/WorldStates/WorldStateMgr.h b/src/server/game/World/WorldStates/WorldStateMgr.h
index d17cdb40310..17a3f7920ee 100644
--- a/src/server/game/World/WorldStates/WorldStateMgr.h
+++ b/src/server/game/World/WorldStates/WorldStateMgr.h
@@ -39,6 +39,8 @@ public:
int32 GetValue(int32 worldStateId, Map const* map) const;
void SetValue(int32 worldStateId, int32 value, bool hidden, Map* map);
+ void SaveValueInDb(int32 worldStateId, int32 value);
+ void SetValueAndSaveInDb(int32 worldStateId, int32 value, bool hidden, Map* map);
WorldStateValueContainer GetInitialWorldStatesForMap(Map const* map) const;
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.cpp b/src/server/scripts/Battlefield/BattlefieldTB.cpp
index 06eedebcb66..33fc29c1ecb 100644
--- a/src/server/scripts/Battlefield/BattlefieldTB.cpp
+++ b/src/server/scripts/Battlefield/BattlefieldTB.cpp
@@ -71,36 +71,35 @@ bool BattlefieldTB::SetupBattlefield()
m_Data32.resize(BATTLEFIELD_TB_DATA_MAX);
- m_saveTimer = 5 * MINUTE * IN_MILLISECONDS;
-
updatedNPCAndObjects = true;
m_updateObjectsTimer = 0;
// Was there a battle going on or time isn't set yet? Then use m_RestartAfterCrash
- if (sWorld->getWorldState(WS_BATTLEFIELD_TB_STATE_BATTLE) == 1 || sWorld->getWorldState(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE) == 0)
- sWorld->setWorldState(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_RestartAfterCrash);
+ if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_STATE_BATTLE, m_Map) == 1 || sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) < GameTime::GetGameTime())
+ {
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_RestartAfterCrash / IN_MILLISECONDS, false, m_Map);
+ }
// Set timer
- m_Timer = sWorld->getWorldState(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE);
+ m_Timer = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) - GameTime::GetGameTime();
// Defending team isn't set yet? Choose randomly.
- if (sWorld->getWorldState(WS_BATTLEFIELD_TB_FACTION_CONTROLLING) == 0)
- sWorld->setWorldState(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, uint32(urand(1, 2)));
+ if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) == 0)
+ sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, uint32(urand(1, 2)), false, m_Map);
// Set defender team
- SetDefenderTeam(TeamId(sWorld->getWorldState(WS_BATTLEFIELD_TB_FACTION_CONTROLLING) - 1));
+ SetDefenderTeam(TeamId(sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) - 1));
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_HORDE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
- SaveWorldStateValues();
-
// Create capture points
for (uint8 i = 0; i < TB_BASE_COUNT; i++)
{
@@ -186,14 +185,6 @@ bool BattlefieldTB::Update(uint32 diff)
m_updateObjectsTimer -= diff;
}
- if (m_saveTimer <= diff)
- {
- SaveWorldStateValues();
- m_saveTimer = 60 * IN_MILLISECONDS;
- }
- else
- m_saveTimer -= diff;
-
return m_return;
}
@@ -237,13 +228,6 @@ void BattlefieldTB::RemoveAurasFromPlayer(Player* player)
player->RemoveAurasDueToSpell(SPELL_TB_SPIRITUAL_IMMUNITY);
}
-void BattlefieldTB::SaveWorldStateValues()
-{
- sWorld->setWorldState(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, uint32(GetDefenderTeam()));
- sWorld->setWorldState(WS_BATTLEFIELD_TB_STATE_BATTLE, uint32(IsWarTime() ? 1 : 0));
- sWorld->setWorldState(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, uint32(!IsWarTime() ? m_Timer : 0));
-}
-
void BattlefieldTB::OnStartGrouping()
{
UpdateNPCsAndGameObjects();
@@ -270,7 +254,7 @@ void BattlefieldTB::OnBattleStart()
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, 0, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
@@ -285,7 +269,7 @@ void BattlefieldTB::OnBattleStart()
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_PREPARATIONS, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_BATTLE, 1, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 1, false, m_Map);
// Towers/spires
for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
@@ -336,12 +320,12 @@ void BattlefieldTB::OnBattleEnd(bool endByTimer)
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_NoWarBattleTime / IN_MILLISECONDS, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_NoWarBattleTime / IN_MILLISECONDS, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
@@ -349,7 +333,7 @@ void BattlefieldTB::OnBattleEnd(bool endByTimer)
sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
}
void BattlefieldTB::UpdateNPCsAndGameObjects()
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.h b/src/server/scripts/Battlefield/BattlefieldTB.h
index ac181bde5d9..9792ba818e4 100644
--- a/src/server/scripts/Battlefield/BattlefieldTB.h
+++ b/src/server/scripts/Battlefield/BattlefieldTB.h
@@ -575,8 +575,6 @@ class BattlefieldTB : public Battlefield
bool SetupBattlefield() override;
- void SaveWorldStateValues();
-
void HandleKill(Player* killer, Unit* victim) override;
//void OnUnitDeath(Unit* unit) override;
void PromotePlayer(Player* killer);
@@ -599,8 +597,6 @@ class BattlefieldTB : public Battlefield
bool warnedTwoMinutes;
bool warnedOneMinute;
- uint32 m_saveTimer;
-
bool updatedNPCAndObjects;
uint32 m_updateObjectsTimer;
diff --git a/src/server/scripts/Battlefield/BattlefieldWG.cpp b/src/server/scripts/Battlefield/BattlefieldWG.cpp
index 85dd74769e8..fcf9d6c3dc8 100644
--- a/src/server/scripts/Battlefield/BattlefieldWG.cpp
+++ b/src/server/scripts/Battlefield/BattlefieldWG.cpp
@@ -438,45 +438,30 @@ bool BattlefieldWG::SetupBattlefield()
m_Data32.resize(BATTLEFIELD_WG_DATA_MAX);
- m_saveTimer = 60000;
-
// Init Graveyards
SetGraveyardNumber(BATTLEFIELD_WG_GRAVEYARD_MAX);
// Load from db
- if (sWorld->getWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE) == 0
- && sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER) == 0
- && sWorld->getWorldState(ClockWorldState[0]) == 0)
+ if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, m_Map) == 0
+ && sWorldStateMgr->GetValue(ClockWorldState[0], m_Map) < GameTime::GetGameTime())
{
- sWorld->setWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0);
- sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, urand(0, 1));
- sWorld->setWorldState(ClockWorldState[0], m_NoWarBattleTime);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, urand(0, 1), false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(ClockWorldState[0], GameTime::GetGameTime() + m_NoWarBattleTime / IN_MILLISECONDS, false, m_Map);
}
- m_isActive = sWorld->getWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE) == 0;
- m_DefenderTeam = TeamId(sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER));
+ m_isActive = sWorldStateMgr->GetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, m_Map) == 0;
+ m_DefenderTeam = TeamId(sWorldStateMgr->GetValue(WS_BATTLEFIELD_WG_DEFENDER, m_Map));
- m_Timer = sWorld->getWorldState(ClockWorldState[0]);
+ m_Timer = sWorldStateMgr->GetValue(ClockWorldState[0], m_Map) - GameTime::GetGameTime();
if (m_isActive)
{
m_isActive = false;
m_Timer = m_RestartAfterCrash;
}
- auto loadSavedWorldState = [&](int32 id)
- {
- sWorldStateMgr->SetValue(id, sWorld->getWorldState(id), false, m_Map);
- };
-
- loadSavedWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE);
- loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDER);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_ATTACKER, GetAttackerTeam(), false, m_Map);
- sWorldStateMgr->SetValue(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
sWorldStateMgr->SetValue(ClockWorldState[1], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
- loadSavedWorldState(WS_BATTLEFIELD_WG_ATTACKED_A);
- loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDED_A);
- loadSavedWorldState(WS_BATTLEFIELD_WG_ATTACKED_H);
- loadSavedWorldState(WS_BATTLEFIELD_WG_DEFENDED_H);
for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
{
@@ -553,31 +538,6 @@ bool BattlefieldWG::SetupBattlefield()
return true;
}
-bool BattlefieldWG::Update(uint32 diff)
-{
- bool m_return = Battlefield::Update(diff);
- if (m_saveTimer <= diff)
- {
- auto saveWorldState = [&](int32 id)
- {
- sWorld->setWorldState(id, sWorldStateMgr->GetValue(id, m_Map));
- };
-
- sWorld->setWorldState(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, !m_isActive);
- sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, m_DefenderTeam);
- sWorld->setWorldState(ClockWorldState[0], m_Timer);
- saveWorldState(WS_BATTLEFIELD_WG_ATTACKED_A);
- saveWorldState(WS_BATTLEFIELD_WG_DEFENDED_A);
- saveWorldState(WS_BATTLEFIELD_WG_ATTACKED_H);
- saveWorldState(WS_BATTLEFIELD_WG_DEFENDED_H);
- m_saveTimer = 60 * IN_MILLISECONDS;
- }
- else
- m_saveTimer -= diff;
-
- return m_return;
-}
-
void BattlefieldWG::OnBattleStart()
{
// Spawn titan relic
@@ -593,10 +553,10 @@ void BattlefieldWG::OnBattleStart()
TC_LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_ATTACKER, GetAttackerTeam(), false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_BATTLE_END, 1, false, m_Map);
- sWorldStateMgr->SetValue(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(ClockWorldState[0], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
// Update tower visibility and update faction
for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
@@ -690,10 +650,11 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer)
else
worldStateId = GetDefenderTeam() == TEAM_HORDE ? WS_BATTLEFIELD_WG_ATTACKED_H : WS_BATTLEFIELD_WG_ATTACKED_A;
- sWorldStateMgr->SetValue(worldStateId, sWorldStateMgr->GetValue(worldStateId, m_Map) + 1, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(worldStateId, sWorldStateMgr->GetValue(worldStateId, m_Map) + 1, false, m_Map);
}
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 1, false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), false, m_Map);
+ sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 1, false, m_Map);
sWorldStateMgr->SetValue(WS_BATTLEFIELD_WG_SHOW_TIME_BATTLE_END, 0, false, m_Map);
sWorldStateMgr->SetValue(ClockWorldState[1], GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
@@ -722,13 +683,6 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer)
if (GameObject* portal = GetGameObject(*itr))
portal->SetRespawnTime(RESPAWN_ONE_DAY);
- // Saving data
- for (BfWGGameObjectBuilding* building : BuildingsInZone)
- building->Save();
-
- for (WintergraspWorkshop* workshop : Workshops)
- workshop->Save();
-
for (auto itr = m_PlayersInWar[GetDefenderTeam()].begin(); itr != m_PlayersInWar[GetDefenderTeam()].end(); ++itr)
{
if (Player* player = ObjectAccessor::FindPlayer(*itr))
@@ -1421,7 +1375,7 @@ void BfWGGameObjectBuilding::Rebuild()
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT - (_teamControl * 3));
- sWorldStateMgr->SetValue(_worldState, _state, false, _wg->GetMap());
+ sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
}
UpdateCreatureAndGo();
build->SetFaction(WintergraspFaction[_teamControl]);
@@ -1444,7 +1398,7 @@ void BfWGGameObjectBuilding::Damaged()
{
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DAMAGE - (_teamControl * 3));
- sWorldStateMgr->SetValue(_worldState, _state, false, _wg->GetMap());
+ sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
// Send warning message
if (_staticTowerInfo)
@@ -1468,7 +1422,7 @@ void BfWGGameObjectBuilding::Destroyed()
{
// Update worldstate
_state = WintergraspGameObjectState(BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DESTROY - (_teamControl * 3));
- sWorldStateMgr->SetValue(_worldState, _state, false, _wg->GetMap());
+ sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
// Warn players
if (_staticTowerInfo)
@@ -1522,8 +1476,7 @@ void BfWGGameObjectBuilding::Init(GameObject* go)
break;
}
- _state = WintergraspGameObjectState(sWorld->getWorldState(_worldState));
- sWorldStateMgr->SetValue(_worldState, _state, false, _wg->GetMap());
+ _state = WintergraspGameObjectState(sWorldStateMgr->GetValue(_worldState, _wg->GetMap()));
switch (_state)
{
case BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT:
@@ -1741,11 +1694,6 @@ void BfWGGameObjectBuilding::UpdateTurretAttack(bool disable)
}
}
-void BfWGGameObjectBuilding::Save()
-{
- sWorld->setWorldState(_worldState, _state);
-}
-
WintergraspWorkshop::WintergraspWorkshop(BattlefieldWG* wg, uint8 type)
{
ASSERT(wg && type < WG_MAX_WORKSHOP);
@@ -1776,7 +1724,7 @@ void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
{
// Updating worldstate
_state = BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT;
- sWorldStateMgr->SetValue(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
+ sWorldStateMgr->SetValueAndSaveInDb(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
// Warning message
if (!init)
@@ -1794,7 +1742,7 @@ void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
{
// Update worldstate
_state = BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT;
- sWorldStateMgr->SetValue(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
+ sWorldStateMgr->SetValueAndSaveInDb(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
// Warning message
if (!init)
@@ -1821,11 +1769,6 @@ void WintergraspWorkshop::UpdateGraveyardAndWorkshop()
GiveControlTo(_wg->GetDefenderTeam(), true);
}
-void WintergraspWorkshop::Save()
-{
- sWorld->setWorldState(_staticInfo->WorldStateId, _state);
-}
-
class Battlefield_wintergrasp : public BattlefieldScript
{
public:
diff --git a/src/server/scripts/Battlefield/BattlefieldWG.h b/src/server/scripts/Battlefield/BattlefieldWG.h
index ff17967f01f..c15bd592962 100644
--- a/src/server/scripts/Battlefield/BattlefieldWG.h
+++ b/src/server/scripts/Battlefield/BattlefieldWG.h
@@ -258,14 +258,6 @@ class BattlefieldWG : public Battlefield
void OnPlayerEnterZone(Player* player) override;
/**
- * \brief Called for update battlefield data
- * - Save battle timer in database every minutes
- * - Update imunity aura from graveyard
- * \param diff : time elapsed since the last call (in ms)
- */
- bool Update(uint32 diff) override;
-
- /**
* \brief Called when a creature is created
* - Update vehicle count
*/
@@ -353,7 +345,6 @@ class BattlefieldWG : public Battlefield
TeamId m_tenacityTeam;
uint32 m_tenacityStack;
- uint32 m_saveTimer;
ObjectGuid m_titansRelicGUID;
};
@@ -531,8 +522,6 @@ public:
void UpdateCreatureAndGo();
void UpdateTurretAttack(bool disable);
-
- void Save();
};
// Structure for the 6 workshop
@@ -556,8 +545,6 @@ public:
void GiveControlTo(TeamId teamId, bool init = false);
void UpdateGraveyardAndWorkshop();
-
- void Save();
};
#endif
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 69dd3e9fcee..97b772f18c9 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1381,17 +1381,17 @@ public:
if (daily)
{
sWorld->DailyReset();
- handler->PSendSysMessage("Daily quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->getWorldState(WS_DAILY_QUEST_RESET_TIME)).c_str());
+ handler->PSendSysMessage("Daily quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->GetPersistentWorldVariable(World::NextDailyQuestResetTimeVarId)).c_str());
}
if (weekly)
{
sWorld->ResetWeeklyQuests();
- handler->PSendSysMessage("Weekly quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->getWorldState(WS_WEEKLY_QUEST_RESET_TIME)).c_str());
+ handler->PSendSysMessage("Weekly quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->GetPersistentWorldVariable(World::NextWeeklyQuestResetTimeVarId)).c_str());
}
if (monthly)
{
sWorld->ResetMonthlyQuests();
- handler->PSendSysMessage("Monthly quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->getWorldState(WS_MONTHLY_QUEST_RESET_TIME)).c_str());
+ handler->PSendSysMessage("Monthly quests have been reset. Next scheduled reset: %s", TimeToHumanReadable(sWorld->GetPersistentWorldVariable(World::NextMonthlyQuestResetTimeVarId)).c_str());
}
return true;