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:
Vincent-Michael
2013-09-11 22:35:45 +02:00
26 changed files with 222 additions and 187 deletions

File diff suppressed because one or more lines are too long

View 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;

View File

@@ -0,0 +1 @@
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8455 AND `SourceEntry`=4;

View 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');

View File

@@ -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

View File

@@ -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, &lt);
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)

View File

@@ -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)

View File

@@ -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(&gtime);
uint32 season = ((ltime->tm_yday - 78 + 365)/91)%4;
struct tm ltime;
ACE_OS::localtime_r(&gtime, &ltime);
uint32 season = ((ltime.tm_yday - 78 + 365)/91)%4;
static char const* seasonName[WEATHER_SEASONS] = { "spring", "summer", "fall", "winter" };

View File

@@ -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;

View File

@@ -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)

View File

@@ -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());
}
}

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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);
}
};

View File

@@ -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);
}
};

View File

@@ -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;

View File

@@ -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_

View File

@@ -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

View File

@@ -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

View File

@@ -248,7 +248,6 @@ class ThunderingStormCheck
private:
WorldObject const* _source;
float _dist;
};
// 39365 - Thundering Storm

View File

@@ -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>

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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, &lt);
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)

View File

@@ -66,7 +66,7 @@ struct IntervalTimer
void Reset()
{
if (_current >= _interval)
_current -= _interval;
_current %= _interval;
}
void SetCurrent(time_t current)

View File

@@ -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);
}