|
|
|
@@ -146,9 +146,11 @@ Player* World::FindPlayerInZone(uint32 zone)
|
|
|
|
|
{
|
|
|
|
|
if (!itr->second)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
Player *player = itr->second->GetPlayer();
|
|
|
|
|
if (!player)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (player->IsInWorld() && player->GetZoneId() == zone)
|
|
|
|
|
{
|
|
|
|
|
// Used by the weather system. We return the player to broadcast the change weather message to him and all players in the zone.
|
|
|
|
@@ -269,12 +271,12 @@ World::AddSession_ (WorldSession* s)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
|
|
|
|
|
packet << uint8 (AUTH_OK);
|
|
|
|
|
packet << uint32 (0); // BillingTimeRemaining
|
|
|
|
|
packet << uint8 (0); // BillingPlanFlags
|
|
|
|
|
packet << uint32 (0); // BillingTimeRested
|
|
|
|
|
packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, 2 - WOTLK, must be set in database manually for each account
|
|
|
|
|
s->SendPacket (&packet);
|
|
|
|
|
packet << uint8(AUTH_OK);
|
|
|
|
|
packet << uint32(0); // BillingTimeRemaining
|
|
|
|
|
packet << uint8(0); // BillingPlanFlags
|
|
|
|
|
packet << uint32(0); // BillingTimeRested
|
|
|
|
|
packet << uint8(s->Expansion()); // 0 - normal, 1 - TBC, 2 - WOTLK, must be set in database manually for each account
|
|
|
|
|
s->SendPacket(&packet);
|
|
|
|
|
|
|
|
|
|
s->SendAddonsInfo();
|
|
|
|
|
|
|
|
|
@@ -298,7 +300,8 @@ World::AddSession_ (WorldSession* s)
|
|
|
|
|
|
|
|
|
|
bool World::HasRecentlyDisconnected(WorldSession* session)
|
|
|
|
|
{
|
|
|
|
|
if (!session) return false;
|
|
|
|
|
if (!session)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (uint32 tolerance = getIntConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
|
|
|
|
|
{
|
|
|
|
@@ -343,8 +346,6 @@ void World::AddQueuedPlayer(WorldSession* sess)
|
|
|
|
|
packet << uint32(GetQueuePos(sess)); // Queue position
|
|
|
|
|
packet << uint8(0); // Unk 3.3.0
|
|
|
|
|
sess->SendPacket(&packet);
|
|
|
|
|
|
|
|
|
|
//sess->SendAuthWaitQue (GetQueuePos (sess));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool World::RemoveQueuedPlayer(WorldSession* sess)
|
|
|
|
@@ -1684,6 +1685,7 @@ void World::SetInitialWorldSettings()
|
|
|
|
|
//to set mailtimer to return mails every day between 4 and 5 am
|
|
|
|
|
//mailtimer is increased when updating auctions
|
|
|
|
|
//one second is 1000 -(tested on win system)
|
|
|
|
|
//TODO: Get rid of magic numbers
|
|
|
|
|
mail_timer = ((((localtime(&m_gameTime)->tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
|
|
|
|
|
//1440
|
|
|
|
|
mail_timer_expires = ((DAY * IN_MILLISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
|
|
|
|
@@ -1813,9 +1815,9 @@ void World::RecordTimeDiff(const char *text, ...)
|
|
|
|
|
if (diff > m_int_configs[CONFIG_MIN_LOG_UPDATE])
|
|
|
|
|
{
|
|
|
|
|
va_list ap;
|
|
|
|
|
char str [256];
|
|
|
|
|
char str[256];
|
|
|
|
|
va_start(ap, text);
|
|
|
|
|
vsnprintf(str,256,text, ap);
|
|
|
|
|
vsnprintf(str, 256, text, ap);
|
|
|
|
|
va_end(ap);
|
|
|
|
|
sLog.outDetail("Difftime %s: %u.", str, diff);
|
|
|
|
|
}
|
|
|
|
@@ -1848,7 +1850,6 @@ void World::LoadAutobroadcasts()
|
|
|
|
|
bar.step();
|
|
|
|
|
|
|
|
|
|
Field *fields = result->Fetch();
|
|
|
|
|
|
|
|
|
|
std::string message = fields[0].GetString();
|
|
|
|
|
|
|
|
|
|
m_Autobroadcasts.push_back(message);
|
|
|
|
@@ -1882,10 +1883,12 @@ void World::Update(uint32 diff)
|
|
|
|
|
|
|
|
|
|
///- Update the different timers
|
|
|
|
|
for (int i = 0; i < WUPDATE_COUNT; ++i)
|
|
|
|
|
{
|
|
|
|
|
if (m_timers[i].GetCurrent() >= 0)
|
|
|
|
|
m_timers[i].Update(diff);
|
|
|
|
|
else
|
|
|
|
|
m_timers[i].SetCurrent(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
///- Update the game time and check for shutdown time
|
|
|
|
|
_UpdateGameTime();
|
|
|
|
@@ -1947,9 +1950,6 @@ void World::Update(uint32 diff)
|
|
|
|
|
{
|
|
|
|
|
if (m_timers[WUPDATE_CLEANDB].Passed())
|
|
|
|
|
{
|
|
|
|
|
//uint32 tmpDiff = (m_gameTime - m_startTime);
|
|
|
|
|
//uint32 maxClientsNum = sWorld.GetMaxActiveSessionCount();
|
|
|
|
|
|
|
|
|
|
m_timers[WUPDATE_CLEANDB].Reset();
|
|
|
|
|
LoginDatabase.PExecute("DELETE FROM logs WHERE (time + %u) < "UI64FMTD";",
|
|
|
|
|
sWorld.getIntConfig(CONFIG_LOGDB_CLEARTIME), uint64(time(0)));
|
|
|
|
@@ -1993,7 +1993,6 @@ void World::Update(uint32 diff)
|
|
|
|
|
if (m_timers[WUPDATE_CORPSES].Passed())
|
|
|
|
|
{
|
|
|
|
|
m_timers[WUPDATE_CORPSES].Reset();
|
|
|
|
|
|
|
|
|
|
sObjectAccessor.RemoveOldCorpses();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -2073,19 +2072,19 @@ namespace Trinity
|
|
|
|
|
{
|
|
|
|
|
// we need copy va_list before use or original va_list will corrupted
|
|
|
|
|
va_list ap;
|
|
|
|
|
va_copy(ap,*i_args);
|
|
|
|
|
va_copy(ap, *i_args);
|
|
|
|
|
|
|
|
|
|
char str [2048];
|
|
|
|
|
vsnprintf(str,2048,text, ap);
|
|
|
|
|
char str[2048];
|
|
|
|
|
vsnprintf(str, 2048, text, ap);
|
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
|
|
do_helper(data_list,&str[0]);
|
|
|
|
|
do_helper(data_list, &str[0]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
do_helper(data_list,(char*)text);
|
|
|
|
|
do_helper(data_list, (char*)text);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
char* lineFromMessage(char*& pos) { char* start = strtok(pos,"\n"); pos = NULL; return start; }
|
|
|
|
|
char* lineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = NULL; return start; }
|
|
|
|
|
void do_helper(WorldPacketList& data_list, char* text)
|
|
|
|
|
{
|
|
|
|
|
char* pos = text;
|
|
|
|
@@ -2156,7 +2155,7 @@ void World::SendGMText(int32 string_id, ...)
|
|
|
|
|
va_end(ap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// DEPRICATED, only for debug purpose. Send a System Message to all players (except self if mentioned)
|
|
|
|
|
/// DEPRECATED, only for debug purpose. Send a System Message to all players (except self if mentioned)
|
|
|
|
|
void World::SendGlobalText(const char* text, WorldSession *self)
|
|
|
|
|
{
|
|
|
|
|
WorldPacket data;
|
|
|
|
@@ -2224,7 +2223,7 @@ BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string dura
|
|
|
|
|
{
|
|
|
|
|
LoginDatabase.escape_string(nameOrIP);
|
|
|
|
|
LoginDatabase.escape_string(reason);
|
|
|
|
|
std::string safe_author=author;
|
|
|
|
|
std::string safe_author = author;
|
|
|
|
|
LoginDatabase.escape_string(safe_author);
|
|
|
|
|
|
|
|
|
|
uint32 duration_secs = TimeStringToSecs(duration);
|
|
|
|
@@ -2235,16 +2234,16 @@ BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string dura
|
|
|
|
|
{
|
|
|
|
|
case BAN_IP:
|
|
|
|
|
//No SQL injection as strings are escaped
|
|
|
|
|
resultAccounts = LoginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
|
|
|
|
|
LoginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
|
|
|
|
|
resultAccounts = LoginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'", nameOrIP.c_str());
|
|
|
|
|
LoginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')", nameOrIP.c_str(), duration_secs, safe_author.c_str(), reason.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case BAN_ACCOUNT:
|
|
|
|
|
//No SQL injection as string is escaped
|
|
|
|
|
resultAccounts = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
|
|
|
|
|
resultAccounts = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'", nameOrIP.c_str());
|
|
|
|
|
break;
|
|
|
|
|
case BAN_CHARACTER:
|
|
|
|
|
//No SQL injection as string is escaped
|
|
|
|
|
resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
|
|
|
|
|
resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'", nameOrIP.c_str());
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return BAN_SYNTAX_ERROR;
|
|
|
|
@@ -2274,8 +2273,7 @@ BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string dura
|
|
|
|
|
if (WorldSession* sess = FindSession(account))
|
|
|
|
|
if (std::string(sess->GetPlayerName()) != author)
|
|
|
|
|
sess->KickPlayer();
|
|
|
|
|
}
|
|
|
|
|
while (resultAccounts->NextRow());
|
|
|
|
|
} while (resultAccounts->NextRow());
|
|
|
|
|
|
|
|
|
|
return BAN_SUCCESS;
|
|
|
|
|
}
|
|
|
|
@@ -2438,16 +2436,11 @@ void World::ShutdownMsg(bool show, Player* player)
|
|
|
|
|
///- Display a message every 12 hours, hours, 5 minutes, minute, 5 seconds and finally seconds
|
|
|
|
|
if (show ||
|
|
|
|
|
(m_ShutdownTimer < 10) ||
|
|
|
|
|
// < 30 sec; every 5 sec
|
|
|
|
|
(m_ShutdownTimer<30 && (m_ShutdownTimer % 5) == 0) ||
|
|
|
|
|
// < 5 min ; every 1 min
|
|
|
|
|
(m_ShutdownTimer<5*MINUTE && (m_ShutdownTimer % MINUTE) == 0) ||
|
|
|
|
|
// < 30 min ; every 5 min
|
|
|
|
|
(m_ShutdownTimer<30*MINUTE && (m_ShutdownTimer % (5*MINUTE)) == 0) ||
|
|
|
|
|
// < 12 h ; every 1 h
|
|
|
|
|
(m_ShutdownTimer<12*HOUR && (m_ShutdownTimer % HOUR) == 0) ||
|
|
|
|
|
// > 12 h ; every 12 h
|
|
|
|
|
(m_ShutdownTimer>12*HOUR && (m_ShutdownTimer % (12*HOUR)) == 0))
|
|
|
|
|
(m_ShutdownTimer < 30 && (m_ShutdownTimer % 5) == 0) || // < 30 sec; every 5 sec
|
|
|
|
|
(m_ShutdownTimer < 5 * MINUTE && (m_ShutdownTimer % MINUTE) == 0) || // < 5 min ; every 1 min
|
|
|
|
|
(m_ShutdownTimer < 30 * MINUTE && (m_ShutdownTimer % (5 * MINUTE)) == 0) || // < 30 min ; every 5 min
|
|
|
|
|
(m_ShutdownTimer < 12 * HOUR && (m_ShutdownTimer % HOUR) == 0) || // < 12 h ; every 1 h
|
|
|
|
|
(m_ShutdownTimer > 12 * HOUR && (m_ShutdownTimer % (12 * HOUR)) == 0)) // > 12 h ; every 12 h
|
|
|
|
|
{
|
|
|
|
|
std::string str = secsToTimeString(m_ShutdownTimer);
|
|
|
|
|
|
|
|
|
@@ -2546,13 +2539,13 @@ void World::SendAutoBroadcast()
|
|
|
|
|
msg = *itr;
|
|
|
|
|
|
|
|
|
|
uint32 abcenter = sWorld.getIntConfig(CONFIG_AUTOBROADCAST_CENTER);
|
|
|
|
|
|
|
|
|
|
if (abcenter == 0)
|
|
|
|
|
{
|
|
|
|
|
sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
|
|
|
|
|
|
|
|
|
|
sLog.outString("AutoBroadcast: '%s'",msg.c_str());
|
|
|
|
|
}
|
|
|
|
|
if (abcenter == 1)
|
|
|
|
|
else if (abcenter == 1)
|
|
|
|
|
{
|
|
|
|
|
WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
|
|
|
|
|
data << msg;
|
|
|
|
@@ -2560,7 +2553,7 @@ void World::SendAutoBroadcast()
|
|
|
|
|
|
|
|
|
|
sLog.outString("AutoBroadcast: '%s'",msg.c_str());
|
|
|
|
|
}
|
|
|
|
|
if (abcenter == 2)
|
|
|
|
|
else if (abcenter == 2)
|
|
|
|
|
{
|
|
|
|
|
sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
|
|
|
|
|
|
|
|
|
@@ -2575,9 +2568,7 @@ void World::SendAutoBroadcast()
|
|
|
|
|
void World::UpdateRealmCharCount(uint32 accountId)
|
|
|
|
|
{
|
|
|
|
|
m_realmCharCallback.SetParam(accountId);
|
|
|
|
|
m_realmCharCallback.SetFutureResult(
|
|
|
|
|
CharacterDatabase.AsyncPQuery("SELECT COUNT(guid) FROM characters WHERE account = '%u'", accountId)
|
|
|
|
|
);
|
|
|
|
|
m_realmCharCallback.SetFutureResult(CharacterDatabase.AsyncPQuery("SELECT COUNT(guid) FROM characters WHERE account = '%u'", accountId));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void World::_UpdateRealmCharCount(QueryResult resultCharCount, uint32 accountId)
|
|
|
|
@@ -2607,7 +2598,6 @@ void World::InitDailyQuestResetTime()
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
Field *fields = result->Fetch();
|
|
|
|
|
|
|
|
|
|
mostRecentQuestTime = (time_t)fields[0].GetUInt64();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@@ -2630,11 +2620,8 @@ void World::InitDailyQuestResetTime()
|
|
|
|
|
// need reset (if we have quest time before last reset time (not processed by some reason)
|
|
|
|
|
if (mostRecentQuestTime && mostRecentQuestTime <= resetTime)
|
|
|
|
|
m_NextDailyQuestReset = mostRecentQuestTime;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// plan next reset time
|
|
|
|
|
else // plan next reset time
|
|
|
|
|
m_NextDailyQuestReset = (curTime >= curDayResetTime) ? curDayResetTime + DAY : curDayResetTime;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void World::InitRandomBGResetTime()
|
|
|
|
@@ -2647,8 +2634,8 @@ void World::InitRandomBGResetTime()
|
|
|
|
|
time_t curTime = time(NULL);
|
|
|
|
|
tm localTm = *localtime(&curTime);
|
|
|
|
|
localTm.tm_hour = getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR);
|
|
|
|
|
localTm.tm_min = 0;
|
|
|
|
|
localTm.tm_sec = 0;
|
|
|
|
|
localTm.tm_min = 0;
|
|
|
|
|
localTm.tm_sec = 0;
|
|
|
|
|
|
|
|
|
|
// current day reset time
|
|
|
|
|
time_t nextDayResetTime = mktime(&localTm);
|
|
|
|
@@ -2727,11 +2714,9 @@ void World::UpdateMaxSessionCounters()
|
|
|
|
|
void World::LoadDBVersion()
|
|
|
|
|
{
|
|
|
|
|
QueryResult result = WorldDatabase.Query("SELECT db_version, script_version, cache_id FROM version LIMIT 1");
|
|
|
|
|
//QueryResult* result = WorldDatabase.Query("SELECT version, creature_ai_version, cache_id FROM db_version LIMIT 1");
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
Field* fields = result->Fetch();
|
|
|
|
|
|
|
|
|
|
m_DBVersion = fields[0].GetString();
|
|
|
|
|
m_CreatureEventAIVersion = fields[1].GetString();
|
|
|
|
|
|
|
|
|
@@ -2789,8 +2774,7 @@ void World::LoadWorldStates()
|
|
|
|
|
m_worldstates[fields[0].GetUInt32()] = fields[1].GetUInt64();
|
|
|
|
|
bar.step();
|
|
|
|
|
++counter;
|
|
|
|
|
}
|
|
|
|
|
while (result->NextRow());
|
|
|
|
|
} while (result->NextRow());
|
|
|
|
|
|
|
|
|
|
sLog.outString();
|
|
|
|
|
sLog.outString(">> Loaded %u world states.", counter);
|
|
|
|
@@ -2817,7 +2801,6 @@ void World::ProcessQueryCallbacks()
|
|
|
|
|
{
|
|
|
|
|
QueryResult result;
|
|
|
|
|
|
|
|
|
|
//-UpdateRealmCharCount
|
|
|
|
|
if (m_realmCharCallback.IsReady())
|
|
|
|
|
{
|
|
|
|
|
uint32 param = m_realmCharCallback.GetParam();
|
|
|
|
|