mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Accounts/RBAC.h src/server/game/Battlegrounds/ArenaTeam.cpp
This commit is contained in:
File diff suppressed because one or more lines are too long
7
sql/updates/world/2013_09_10_21_world_updates.sql
Normal file
7
sql/updates/world/2013_09_10_21_world_updates.sql
Normal file
@@ -0,0 +1,7 @@
|
||||
-- Update for Forgotten npcs to award credit.
|
||||
UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=27224 AND `source_type`=0 AND `id`=0 AND `link`=1;
|
||||
UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=27225 AND `source_type`=0 AND `id`=0 AND `link`=1;
|
||||
UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=27229 AND `source_type`=0 AND `id`=0 AND `link`=1;
|
||||
UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=27226 AND `source_type`=0 AND `id`=0 AND `link`=1;
|
||||
-- Forced model for Channel Bunny... should've used that earlier.
|
||||
UPDATE `creature` SET `modelid`=16925, `position_x`=1924.63, `position_y`=5574.76, `position_z`=273.122 WHERE `guid`=74872;
|
||||
1
sql/updates/world/2013_09_11_00_world_cond.sql
Normal file
1
sql/updates/world/2013_09_11_00_world_cond.sql
Normal file
@@ -0,0 +1 @@
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8455 AND `SourceEntry`=4;
|
||||
5
sql/updates/world/2013_09_11_01_world_sai.sql
Normal file
5
sql/updates/world/2013_09_11_01_world_sai.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
UPDATE `creature_template` SET`AIName`='SmartAI' WHERE `entry`=26321;
|
||||
DELETE FROM `creature_ai_scripts` WHERE `creature_id`=26321;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=26321;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
|
||||
(26321,0,0,0,8,0,100,1,47530,0,0,0,33,26321,0,0,0,0,0,7,0,0,0,0,0,0,0,'Lothalor Ancient - On Spellhit - Give Credit to Invoker');
|
||||
@@ -84,7 +84,7 @@ bool ArenaTeam::Create(uint64 captainGuid, uint8 type, std::string const& arenaT
|
||||
// Add captain as member
|
||||
AddMember(CaptainGuid);
|
||||
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "New ArenaTeam created [Id: %u] [Type: %u] [Captain low GUID: %u]", GetId(), GetType(), captainLowGuid);
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "New ArenaTeam created [Id: %u, Name: %s] [Type: %u] [Captain low GUID: %u]", GetId(), GetName().c_str(), GetType(), captainLowGuid);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -306,9 +306,9 @@ void ArenaTeam::SetCaptain(uint64 guid)
|
||||
newCaptain->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 0);
|
||||
if (oldCaptain)
|
||||
{
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u] [Type: %u].",
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u, Name: %s] [Type: %u].",
|
||||
oldCaptain->GetName().c_str(), oldCaptain->GetGUIDLow(), newCaptain->GetName().c_str(),
|
||||
newCaptain->GetGUIDLow(), GetId(), GetType());
|
||||
newCaptain->GetGUIDLow(), GetId(), GetName().c_str(), GetType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -329,7 +329,7 @@ void ArenaTeam::DelMember(uint64 guid, bool cleanDb)
|
||||
// delete all info regarding this team
|
||||
for (uint32 i = 0; i < ARENA_TEAM_END; ++i)
|
||||
player->SetArenaTeamInfoField(GetSlot(), ArenaTeamInfoType(i), 0);
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] left arena team type: %u [Id: %u].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId());
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] left arena team type: %u [Id: %u, Name: %s].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId(), GetName().c_str());
|
||||
}
|
||||
|
||||
// Only used for single member deletion, for arena team disband we use a single query for more efficiency
|
||||
@@ -349,7 +349,7 @@ void ArenaTeam::Disband(WorldSession* session)
|
||||
{
|
||||
BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName(), GetName(), "");
|
||||
if (Player* player = session->GetPlayer())
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId());
|
||||
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u, Name: %s].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId(), GetName().c_str());
|
||||
}
|
||||
|
||||
// Remove all members from arena team
|
||||
|
||||
@@ -5215,9 +5215,10 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
time_t curTime = time(NULL);
|
||||
tm* lt = localtime(&curTime);
|
||||
tm lt;
|
||||
ACE_OS::localtime_r(&curTime, <);
|
||||
uint64 basetime(curTime);
|
||||
TC_LOG_INFO(LOG_FILTER_GENERAL, "Returning mails current time: hour: %d, minute: %d, second: %d ", lt->tm_hour, lt->tm_min, lt->tm_sec);
|
||||
TC_LOG_INFO(LOG_FILTER_GENERAL, "Returning mails current time: hour: %d, minute: %d, second: %d ", lt.tm_hour, lt.tm_min, lt.tm_sec);
|
||||
|
||||
// Delete all old mails without item and without body immediately, if starting server
|
||||
if (!serverUp)
|
||||
|
||||
@@ -1192,8 +1192,11 @@ bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) con
|
||||
uint32 mask = 0;
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
{
|
||||
if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER)
|
||||
if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER
|
||||
&& Effects[i].TargetB.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetB.GetTarget() != TARGET_DEST_CASTER)
|
||||
{
|
||||
mask |= Effects[i].GetProvidedTargetMask();
|
||||
}
|
||||
}
|
||||
|
||||
if (mask & TARGET_FLAG_UNIT_MASK)
|
||||
|
||||
@@ -94,8 +94,9 @@ bool Weather::ReGenerate()
|
||||
//78 days between January 1st and March 20nd; 365/4=91 days by season
|
||||
// season source http://aa.usno.navy.mil/data/docs/EarthSeasons.html
|
||||
time_t gtime = sWorld->GetGameTime();
|
||||
struct tm * ltime = localtime(>ime);
|
||||
uint32 season = ((ltime->tm_yday - 78 + 365)/91)%4;
|
||||
struct tm ltime;
|
||||
ACE_OS::localtime_r(>ime, <ime);
|
||||
uint32 season = ((ltime.tm_yday - 78 + 365)/91)%4;
|
||||
|
||||
static char const* seasonName[WEATHER_SEASONS] = { "spring", "summer", "fall", "winter" };
|
||||
|
||||
|
||||
@@ -1798,7 +1798,9 @@ void World::SetInitialWorldSettings()
|
||||
//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());
|
||||
tm localTm;
|
||||
ACE_OS::localtime_r(&m_gameTime, &localTm);
|
||||
mail_timer = ((((localTm.tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
|
||||
//1440
|
||||
mail_timer_expires = ((DAY * IN_MILLISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
|
||||
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Mail timer set to: " UI64FMTD ", mail return is called every " UI64FMTD " minutes", uint64(mail_timer), uint64(mail_timer_expires));
|
||||
@@ -2818,7 +2820,8 @@ void World::InitDailyQuestResetTime()
|
||||
// client built-in time for reset is 6:00 AM
|
||||
// FIX ME: client not show day start time
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
tm localTm;
|
||||
ACE_OS::localtime_r(&curTime, &localTm);
|
||||
localTm.tm_hour = 6;
|
||||
localTm.tm_min = 0;
|
||||
localTm.tm_sec = 0;
|
||||
@@ -2851,7 +2854,8 @@ void World::InitRandomBGResetTime()
|
||||
|
||||
// generate time by config
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
tm localTm;
|
||||
ACE_OS::localtime_r(&curTime, &localTm);
|
||||
localTm.tm_hour = getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR);
|
||||
localTm.tm_min = 0;
|
||||
localTm.tm_sec = 0;
|
||||
@@ -2878,7 +2882,8 @@ void World::InitGuildResetTime()
|
||||
|
||||
// generate time by config
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
tm localTm;
|
||||
ACE_OS::localtime_r(&curTime, &localTm);
|
||||
localTm.tm_hour = getIntConfig(CONFIG_GUILD_RESET_HOUR);
|
||||
localTm.tm_min = 0;
|
||||
localTm.tm_sec = 0;
|
||||
@@ -3003,7 +3008,8 @@ void World::ResetMonthlyQuests()
|
||||
|
||||
// generate time
|
||||
time_t curTime = time(NULL);
|
||||
tm localTm = *localtime(&curTime);
|
||||
tm localTm;
|
||||
ACE_OS::localtime_r(&curTime, &localTm);
|
||||
|
||||
int month = localTm.tm_mon;
|
||||
int year = localTm.tm_year;
|
||||
|
||||
@@ -362,9 +362,9 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
char* oldEmail = strtok(NULL, " ");
|
||||
char* oldEmail = strtok((char*)args, " ");
|
||||
char* password = strtok(NULL, " ");
|
||||
char* email = strtok((char*)args, " ");
|
||||
char* email = strtok(NULL, " ");
|
||||
char* emailConfirmation = strtok(NULL, " ");
|
||||
|
||||
if (!oldEmail || !password || !email || !emailConfirmation)
|
||||
@@ -467,6 +467,7 @@ public:
|
||||
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
|
||||
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
|
||||
handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? "Yes" : "No");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword)))
|
||||
@@ -488,6 +489,7 @@ public:
|
||||
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
|
||||
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
|
||||
emailConfirmation);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strcmp(newPassword, passwordConfirmation) != 0)
|
||||
|
||||
@@ -436,21 +436,23 @@ public:
|
||||
do
|
||||
{
|
||||
time_t timeBan = time_t(fields2[0].GetUInt32());
|
||||
tm* tmBan = localtime(&timeBan);
|
||||
tm tmBan;
|
||||
ACE_OS::localtime_r(&timeBan, &tmBan);
|
||||
|
||||
if (fields2[0].GetUInt32() == fields2[1].GetUInt32())
|
||||
{
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
|
||||
accountName.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
fields2[2].GetCString(), fields2[3].GetCString());
|
||||
}
|
||||
else
|
||||
{
|
||||
time_t timeUnban = time_t(fields2[1].GetUInt32());
|
||||
tm* tmUnban = localtime(&timeUnban);
|
||||
tm tmUnban;
|
||||
ACE_OS::localtime_r(&timeUnban, &tmUnban);
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
|
||||
accountName.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
|
||||
accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
|
||||
fields2[2].GetCString(), fields2[3].GetCString());
|
||||
}
|
||||
}
|
||||
@@ -523,21 +525,23 @@ public:
|
||||
do
|
||||
{
|
||||
time_t timeBan = time_t(banFields[0].GetUInt32());
|
||||
tm* tmBan = localtime(&timeBan);
|
||||
tm tmBan;
|
||||
ACE_OS::localtime_r(&timeBan, &tmBan);
|
||||
|
||||
if (banFields[0].GetUInt32() == banFields[1].GetUInt32())
|
||||
{
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
|
||||
char_name.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
banFields[2].GetCString(), banFields[3].GetCString());
|
||||
}
|
||||
else
|
||||
{
|
||||
time_t timeUnban = time_t(banFields[1].GetUInt32());
|
||||
tm* tmUnban = localtime(&timeUnban);
|
||||
tm tmUnban;
|
||||
ACE_OS::localtime_r(&timeUnban, &tmUnban);
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
|
||||
char_name.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
|
||||
char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
|
||||
banFields[2].GetCString(), banFields[3].GetCString());
|
||||
}
|
||||
}
|
||||
@@ -602,20 +606,22 @@ public:
|
||||
handler->SendSysMessage("-------------------------------------------------------------------------------");
|
||||
Field* fields = result->Fetch();
|
||||
time_t timeBan = time_t(fields[1].GetUInt32());
|
||||
tm* tmBan = localtime(&timeBan);
|
||||
tm tmBan;
|
||||
ACE_OS::localtime_r(&timeBan, &tmBan);
|
||||
if (fields[1].GetUInt32() == fields[2].GetUInt32())
|
||||
{
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
|
||||
fields[0].GetCString(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
fields[3].GetCString(), fields[4].GetCString());
|
||||
}
|
||||
else
|
||||
{
|
||||
time_t timeUnban = time_t(fields[2].GetUInt32());
|
||||
tm* tmUnban = localtime(&timeUnban);
|
||||
tm tmUnban;
|
||||
ACE_OS::localtime_r(&timeUnban, &tmUnban);
|
||||
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
|
||||
fields[0].GetCString(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
|
||||
tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
|
||||
fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
|
||||
tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
|
||||
fields[3].GetCString(), fields[4].GetCString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
|
||||
CreatureTemplate const* creatrueTemplate = creatureTarget->GetCreatureTemplate();
|
||||
// Creatures with family 0 crashes the server
|
||||
if (!creatrueTemplate->family)
|
||||
{
|
||||
|
||||
@@ -1619,16 +1619,16 @@ class spell_halion_clear_debuffs : public SpellScriptLoader
|
||||
class TwilightCutterSelector
|
||||
{
|
||||
public:
|
||||
TwilightCutterSelector(Unit* caster, Unit* cutterCaster) : _caster(caster), _cutterCaster(cutterCaster) {}
|
||||
TwilightCutterSelector(Unit* caster, Unit* target) : _caster(caster), _channelTarget(target) {}
|
||||
|
||||
bool operator()(WorldObject* unit)
|
||||
{
|
||||
return !unit->IsInBetween(_caster, _cutterCaster, 4.0f);
|
||||
return !unit->IsInBetween(_caster, _channelTarget, 4.0f);
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* _caster;
|
||||
Unit* _cutterCaster;
|
||||
Unit* _channelTarget;
|
||||
};
|
||||
|
||||
class spell_halion_twilight_cutter : public SpellScriptLoader
|
||||
@@ -1646,13 +1646,10 @@ class spell_halion_twilight_cutter : public SpellScriptLoader
|
||||
return;
|
||||
|
||||
Unit* caster = GetCaster();
|
||||
if (Aura* cutter = caster->GetAura(SPELL_TWILIGHT_CUTTER))
|
||||
if (Unit* channelTarget = ObjectAccessor::GetUnit(*caster, caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT)))
|
||||
{
|
||||
if (Unit* cutterCaster = cutter->GetCaster())
|
||||
{
|
||||
unitList.remove_if(TwilightCutterSelector(caster, cutterCaster));
|
||||
return;
|
||||
}
|
||||
unitList.remove_if(TwilightCutterSelector(caster, channelTarget));
|
||||
return;
|
||||
}
|
||||
|
||||
// In case cutter caster werent found for some reason
|
||||
|
||||
@@ -23,26 +23,26 @@
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_PHASE2 = 1,
|
||||
SAY_PHASE3 = 2,
|
||||
SAY_DEATH = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_THROW_SARONITE = 5,
|
||||
SAY_CAST_DEEP_FREEZE = 6,
|
||||
SAY_AGGRO = 0,
|
||||
SAY_PHASE2 = 1,
|
||||
SAY_PHASE3 = 2,
|
||||
SAY_DEATH = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_THROW_SARONITE = 5,
|
||||
SAY_CAST_DEEP_FREEZE = 6,
|
||||
|
||||
SAY_TYRANNUS_DEATH = 0
|
||||
SAY_TYRANNUS_DEATH = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_PERMAFROST = 70326,
|
||||
SPELL_THROW_SARONITE = 68788,
|
||||
SPELL_THUNDERING_STOMP = 68771,
|
||||
SPELL_CHILLING_WAVE = 68778,
|
||||
SPELL_DEEP_FREEZE = 70381,
|
||||
SPELL_FORGE_MACE = 68785,
|
||||
SPELL_FORGE_BLADE = 68774,
|
||||
SPELL_PERMAFROST = 70326,
|
||||
SPELL_THROW_SARONITE = 68788,
|
||||
SPELL_THUNDERING_STOMP = 68771,
|
||||
SPELL_CHILLING_WAVE = 68778,
|
||||
SPELL_DEEP_FREEZE = 70381,
|
||||
SPELL_FORGE_MACE = 68785,
|
||||
SPELL_FORGE_BLADE = 68774
|
||||
};
|
||||
|
||||
#define SPELL_PERMAFROST_HELPER RAID_MODE<uint32>(68786, 70336)
|
||||
@@ -50,9 +50,9 @@ enum Spells
|
||||
|
||||
enum Phases
|
||||
{
|
||||
PHASE_ONE = 1,
|
||||
PHASE_TWO = 2,
|
||||
PHASE_THREE = 3
|
||||
PHASE_ONE = 1,
|
||||
PHASE_TWO = 2,
|
||||
PHASE_THREE = 3
|
||||
};
|
||||
|
||||
enum MiscData
|
||||
@@ -60,58 +60,45 @@ enum MiscData
|
||||
EQUIP_ID_SWORD = 49345,
|
||||
EQUIP_ID_MACE = 49344,
|
||||
ACHIEV_DOESNT_GO_TO_ELEVEN = 0,
|
||||
POINT_FORGE = 0,
|
||||
POINT_FORGE = 0
|
||||
};
|
||||
|
||||
Position const northForgePos = {722.5643f, -234.1615f, 527.182f, 2.16421f};
|
||||
Position const southForgePos = {639.257f, -210.1198f, 529.015f, 0.523599f};
|
||||
enum Events
|
||||
{
|
||||
EVENT_THROW_SARONITE = 1,
|
||||
EVENT_CHILLING_WAVE = 2,
|
||||
EVENT_DEEP_FREEZE = 3,
|
||||
EVENT_FORGE_JUMP = 4,
|
||||
EVENT_RESUME_ATTACK = 5
|
||||
};
|
||||
|
||||
Position const northForgePos = { 722.5643f, -234.1615f, 527.182f, 2.16421f };
|
||||
Position const southForgePos = { 639.257f, -210.1198f, 529.015f, 0.523599f };
|
||||
|
||||
class boss_garfrost : public CreatureScript
|
||||
{
|
||||
enum Events
|
||||
{
|
||||
EVENT_THROW_SARONITE = 1,
|
||||
EVENT_CHILLING_WAVE = 2,
|
||||
EVENT_DEEP_FREEZE = 3,
|
||||
EVENT_JUMP = 4,
|
||||
EVENT_FORGING = 5,
|
||||
EVENT_RESUME_ATTACK = 6,
|
||||
};
|
||||
public:
|
||||
boss_garfrost() : CreatureScript("boss_garfrost") { }
|
||||
|
||||
struct boss_garfrostAI : public BossAI
|
||||
{
|
||||
boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST)
|
||||
{
|
||||
}
|
||||
|
||||
void InitializeAI() OVERRIDE
|
||||
{
|
||||
if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
|
||||
me->IsAIEnabled = false;
|
||||
else if (!me->isDead())
|
||||
Reset();
|
||||
}
|
||||
boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) { }
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
events.Reset();
|
||||
_Reset();
|
||||
events.SetPhase(PHASE_ONE);
|
||||
SetEquipmentSlots(true);
|
||||
_permafrostStack = 0;
|
||||
|
||||
instance->SetBossState(DATA_GARFROST, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
DoCast(me, SPELL_PERMAFROST);
|
||||
me->CallForHelp(70.0f);
|
||||
events.ScheduleEvent(EVENT_THROW_SARONITE, 7000);
|
||||
|
||||
instance->SetBossState(DATA_GARFROST, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) OVERRIDE
|
||||
@@ -122,12 +109,11 @@ enum Events
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS)))
|
||||
tyrannus->AI()->Talk(SAY_TYRANNUS_DEATH);
|
||||
|
||||
instance->SetBossState(DATA_GARFROST, DONE);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/) OVERRIDE
|
||||
@@ -138,7 +124,7 @@ enum Events
|
||||
Talk(SAY_PHASE2);
|
||||
events.DelayEvents(8000);
|
||||
DoCast(me, SPELL_THUNDERING_STOMP);
|
||||
events.ScheduleEvent(EVENT_JUMP, 1500);
|
||||
events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -148,7 +134,7 @@ enum Events
|
||||
Talk(SAY_PHASE3);
|
||||
events.DelayEvents(8000);
|
||||
DoCast(me, SPELL_THUNDERING_STOMP);
|
||||
events.ScheduleEvent(EVENT_JUMP, 1500);
|
||||
events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -220,15 +206,15 @@ enum Events
|
||||
}
|
||||
events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE);
|
||||
break;
|
||||
case EVENT_JUMP:
|
||||
case EVENT_FORGE_JUMP:
|
||||
me->AttackStop();
|
||||
if (events.IsInPhase(PHASE_TWO))
|
||||
me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f);
|
||||
me->GetMotionMaster()->MoveJump(northForgePos, 25.0f, 15.0f, POINT_FORGE);
|
||||
else if (events.IsInPhase(PHASE_THREE))
|
||||
me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f);
|
||||
me->GetMotionMaster()->MoveJump(southForgePos, 25.0f, 15.0f, POINT_FORGE);
|
||||
break;
|
||||
case EVENT_RESUME_ATTACK:
|
||||
if (events.IsInPhase(PHASE_THREE))
|
||||
if (events.IsInPhase(PHASE_TWO))
|
||||
events.ScheduleEvent(EVENT_CHILLING_WAVE, 5000, 0, PHASE_TWO);
|
||||
else if (events.IsInPhase(PHASE_THREE))
|
||||
events.ScheduleEvent(EVENT_DEEP_FREEZE, 10000, 0, PHASE_THREE);
|
||||
@@ -248,7 +234,7 @@ enum Events
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_garfrostAI(creature);
|
||||
return GetPitOfSaronAI<boss_garfrostAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ enum Spells
|
||||
SPELL_STRANGULATING = 69413, //krick's selfcast in intro
|
||||
SPELL_SUICIDE = 7,
|
||||
SPELL_KRICK_KILL_CREDIT = 71308,
|
||||
SPELL_NECROMANTIC_POWER = 69753,
|
||||
SPELL_NECROMANTIC_POWER = 69753
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -71,7 +71,7 @@ enum Yells
|
||||
SAY_SYLVANAS_OUTRO_4 = 1,
|
||||
SAY_SYLVANAS_OUTRO_10 = 2,
|
||||
SAY_TYRANNUS_OUTRO_7 = 1,
|
||||
SAY_TYRANNUS_OUTRO_9 = 2,
|
||||
SAY_TYRANNUS_OUTRO_9 = 2
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -98,24 +98,24 @@ enum Events
|
||||
EVENT_OUTRO_11 = 18,
|
||||
EVENT_OUTRO_12 = 19,
|
||||
EVENT_OUTRO_13 = 20,
|
||||
EVENT_OUTRO_END = 21,
|
||||
EVENT_OUTRO_END = 21
|
||||
};
|
||||
|
||||
enum KrickPhase
|
||||
{
|
||||
PHASE_COMBAT = 1,
|
||||
PHASE_OUTRO = 2,
|
||||
PHASE_OUTRO = 2
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_OUTRO = 1,
|
||||
ACTION_OUTRO = 1
|
||||
};
|
||||
|
||||
enum Points
|
||||
{
|
||||
POINT_KRICK_INTRO = 364770,
|
||||
POINT_KRICK_DEATH = 364771,
|
||||
POINT_KRICK_DEATH = 364771
|
||||
};
|
||||
|
||||
static const Position outroPos[8] =
|
||||
@@ -127,7 +127,7 @@ static const Position outroPos[8] =
|
||||
{835.5887f, 139.4345f, 530.9526f, 0.0000000f}, // Tyrannus fly down Position (not sniffed)
|
||||
{828.9342f, 118.6247f, 514.5190f, 0.0000000f}, // Krick's Choke Position
|
||||
{828.9342f, 118.6247f, 509.4958f, 0.0000000f}, // Kirck's Death Position
|
||||
{914.4820f, 143.1602f, 633.3624f, 0.0000000f}, // Tyrannus fly up (not sniffed)
|
||||
{914.4820f, 143.1602f, 633.3624f, 0.0000000f} // Tyrannus fly up (not sniffed)
|
||||
};
|
||||
|
||||
class boss_ick : public CreatureScript
|
||||
@@ -142,14 +142,6 @@ class boss_ick : public CreatureScript
|
||||
ASSERT(_vehicle);
|
||||
}
|
||||
|
||||
void InitializeAI() OVERRIDE
|
||||
{
|
||||
if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
|
||||
me->IsAIEnabled = false;
|
||||
else if (!me->isDead())
|
||||
Reset();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
events.Reset();
|
||||
@@ -163,6 +155,8 @@ class boss_ick : public CreatureScript
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
if (Creature* krick = GetKrick())
|
||||
krick->AI()->Talk(SAY_KRICK_AGGRO);
|
||||
|
||||
@@ -170,8 +164,6 @@ class boss_ick : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 10000);
|
||||
events.ScheduleEvent(EVENT_SPECIAL, urand(30000, 35000));
|
||||
|
||||
instance->SetBossState(DATA_ICK, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void EnterEvadeMode() OVERRIDE
|
||||
@@ -281,7 +273,7 @@ class boss_ick : public CreatureScript
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_ickAI(creature);
|
||||
return GetPitOfSaronAI<boss_ickAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -296,14 +288,6 @@ class boss_krick : public CreatureScript
|
||||
{
|
||||
}
|
||||
|
||||
void InitializeAI() OVERRIDE
|
||||
{
|
||||
if (!_instanceScript || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
|
||||
me->IsAIEnabled = false;
|
||||
else if (!me->isDead())
|
||||
Reset();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
_events.Reset();
|
||||
@@ -509,7 +493,7 @@ class boss_krick : public CreatureScript
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_krickAI(creature);
|
||||
return GetPitOfSaronAI<boss_krickAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ class instance_pit_of_saron : public InstanceMapScript
|
||||
{
|
||||
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(Doors);
|
||||
_garfrostGUID = 0;
|
||||
_krickGUID = 0;
|
||||
@@ -292,7 +292,7 @@ class instance_pit_of_saron : public InstanceMapScript
|
||||
|
||||
if (dataHead1 == 'P' && dataHead2 == 'S')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
for (uint8 i = 0; i < EncounterCount; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
|
||||
@@ -15,14 +15,12 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DEF_PIT_OF_SARON_H
|
||||
#define DEF_PIT_OF_SARON_H
|
||||
|
||||
#include "Map.h"
|
||||
#include "Creature.h"
|
||||
#ifndef PIT_OF_SARON_H_
|
||||
#define PIT_OF_SARON_H_
|
||||
|
||||
#define PoSScriptName "instance_pit_of_saron"
|
||||
#define MAX_ENCOUNTER 3
|
||||
|
||||
uint32 const EncounterCount = 3;
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
@@ -37,7 +35,7 @@ enum DataTypes
|
||||
DATA_JAINA_SYLVANAS_1 = 5, // GUID of either Jaina or Sylvanas part 1, depending on team, as it's the same spawn.
|
||||
DATA_JAINA_SYLVANAS_2 = 6, // GUID of either Jaina or Sylvanas part 2, depending on team, as it's the same spawn.
|
||||
DATA_TYRANNUS_EVENT = 7,
|
||||
DATA_TEAM_IN_INSTANCE = 8,
|
||||
DATA_TEAM_IN_INSTANCE = 8
|
||||
};
|
||||
|
||||
enum CreatureIds
|
||||
@@ -94,17 +92,13 @@ enum GameObjectIds
|
||||
{
|
||||
GO_SARONITE_ROCK = 196485,
|
||||
GO_ICE_WALL = 201885,
|
||||
GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848,
|
||||
GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848
|
||||
};
|
||||
|
||||
template<class AI>
|
||||
AI* GetPitOfSaronAI(Creature* creature)
|
||||
{
|
||||
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
|
||||
if (instance->GetInstanceScript())
|
||||
if (instance->GetScriptId() == sObjectMgr->GetScriptId(PoSScriptName))
|
||||
return new AI(creature);
|
||||
return NULL;
|
||||
return GetInstanceAI<AI>(creature, PoSScriptName);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // PIT_OF_SARON_H_
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
{ GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
class instance_halls_of_lightning : public InstanceMapScript
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
{ GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
class instance_halls_of_stone : public InstanceMapScript
|
||||
|
||||
@@ -248,7 +248,6 @@ class ThunderingStormCheck
|
||||
|
||||
private:
|
||||
WorldObject const* _source;
|
||||
float _dist;
|
||||
};
|
||||
|
||||
// 39365 - Thundering Storm
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
#include <ace/Guard_T.h>
|
||||
#include <ace/RW_Thread_Mutex.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
#include <ace/OS_NS_time.h>
|
||||
|
||||
#if PLATFORM == PLATFORM_WINDOWS
|
||||
# include <ace/config-all.h>
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
|
||||
std::string LogMessage::getTimeStr(time_t time)
|
||||
{
|
||||
tm* aTm = localtime(&time);
|
||||
tm aTm;
|
||||
ACE_OS::localtime_r(&time, &aTm);
|
||||
char buf[20];
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d:%02d:%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d:%02d:%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -295,7 +295,8 @@ void Log::write(LogMessage* msg)
|
||||
std::string Log::GetTimestampStr()
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
tm* aTm = localtime(&t);
|
||||
tm aTm;
|
||||
ACE_OS::localtime_r(&t, &aTm);
|
||||
// YYYY year
|
||||
// MM month (2 digits 01-12)
|
||||
// DD day (2 digits 01-31)
|
||||
@@ -303,7 +304,7 @@ std::string Log::GetTimestampStr()
|
||||
// MM minutes (2 digits 00-59)
|
||||
// SS seconds (2 digits 00-59)
|
||||
char buf[20];
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "Errors.h"
|
||||
#include "ByteConverter.h"
|
||||
|
||||
#include <ace/OS_NS_time.h>
|
||||
#include <exception>
|
||||
#include <list>
|
||||
#include <map>
|
||||
@@ -585,8 +586,9 @@ class ByteBuffer
|
||||
|
||||
void AppendPackedTime(time_t time)
|
||||
{
|
||||
tm* lt = localtime(&time);
|
||||
append<uint32>((lt->tm_year - 100) << 24 | lt->tm_mon << 20 | (lt->tm_mday - 1) << 14 | lt->tm_wday << 11 | lt->tm_hour << 6 | lt->tm_min);
|
||||
tm lt;
|
||||
ACE_OS::localtime_r(&time, <);
|
||||
append<uint32>((lt.tm_year - 100) << 24 | lt.tm_mon << 20 | (lt.tm_mday - 1) << 14 | lt.tm_wday << 11 | lt.tm_hour << 6 | lt.tm_min);
|
||||
}
|
||||
|
||||
void put(size_t pos, const uint8 *src, size_t cnt)
|
||||
|
||||
@@ -66,7 +66,7 @@ struct IntervalTimer
|
||||
void Reset()
|
||||
{
|
||||
if (_current >= _interval)
|
||||
_current -= _interval;
|
||||
_current %= _interval;
|
||||
}
|
||||
|
||||
void SetCurrent(time_t current)
|
||||
|
||||
@@ -215,7 +215,8 @@ uint32 TimeStringToSecs(const std::string& timestring)
|
||||
|
||||
std::string TimeToTimestampStr(time_t t)
|
||||
{
|
||||
tm* aTm = localtime(&t);
|
||||
tm aTm;
|
||||
ACE_OS::localtime_r(&t, &aTm);
|
||||
// YYYY year
|
||||
// MM month (2 digits 01-12)
|
||||
// DD day (2 digits 01-31)
|
||||
@@ -223,7 +224,7 @@ std::string TimeToTimestampStr(time_t t)
|
||||
// MM minutes (2 digits 00-59)
|
||||
// SS seconds (2 digits 00-59)
|
||||
char buf[20];
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
|
||||
snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user