diff options
21 files changed, 133 insertions, 150 deletions
diff --git a/sql/updates/world/2013_09_11_00_world_cond.sql b/sql/updates/world/2013_09_11_00_world_cond.sql new file mode 100644 index 00000000000..4b0f307ef44 --- /dev/null +++ b/sql/updates/world/2013_09_11_00_world_cond.sql @@ -0,0 +1 @@ +DELETE FROM `conditions` WHERE  `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8455 AND `SourceEntry`=4; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 7f1d231ebd9..2f309c07cce 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5236,9 +5236,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) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 99242d622df..a0e1ec065cc 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1026,8 +1026,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) diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index 38d64eedd5c..0457dc7e033 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -93,8 +93,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" }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b1dc05e8d63..bfc512bc9a6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1738,7 +1738,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)); @@ -2777,7 +2779,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; @@ -2810,7 +2813,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; @@ -2837,7 +2841,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; @@ -2921,7 +2926,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; diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index b12e058a78f..dd6e104f135 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -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());                  }              } diff --git a/src/server/scripts/Commands/cs_pet.cpp b/src/server/scripts/Commands/cs_pet.cpp index 237b25634c1..315cf06e995 100644 --- a/src/server/scripts/Commands/cs_pet.cpp +++ b/src/server/scripts/Commands/cs_pet.cpp @@ -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)          { diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 11ee7b0e409..7561d1c4991 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1620,16 +1620,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 @@ -1647,13 +1647,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 diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 4bb989bf2e4..20b7d39815f 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -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_TYRANNUS_DEATH      = 0 +    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  };  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}; - -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, +    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 +{      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);          }  }; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index b738f0c9358..3b3f65c7704 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -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);          }  }; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp index a789d0c6a70..7aa8b123f98 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp @@ -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; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h index a9b88ca3066..e7a3b069ce3 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h @@ -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_ diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index c45d3704d5d..394fbc84253 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -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 diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 2a899d26d5a..1268207388c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -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 diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index 5e2e26b578a..38c14292289 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -248,7 +248,6 @@ class ThunderingStormCheck      private:          WorldObject const* _source; -        float _dist;  };  // 39365 - Thundering Storm diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h index 70ee32d2868..e3074ef45b9 100644 --- a/src/server/shared/Common.h +++ b/src/server/shared/Common.h @@ -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> diff --git a/src/server/shared/Logging/Appender.cpp b/src/server/shared/Logging/Appender.cpp index cde94fe3a7c..f47cbc3b095 100644 --- a/src/server/shared/Logging/Appender.cpp +++ b/src/server/shared/Logging/Appender.cpp @@ -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);  } diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index be7aab9cf5e..e6400176155 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -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);  } diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 7777842af17..b015e8daa35 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -457,8 +457,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) diff --git a/src/server/shared/Utilities/Timer.h b/src/server/shared/Utilities/Timer.h index 5bc19a2b779..b0b395865b4 100644 --- a/src/server/shared/Utilities/Timer.h +++ b/src/server/shared/Utilities/Timer.h @@ -66,7 +66,7 @@ struct IntervalTimer          void Reset()          {              if (_current >= _interval) -                _current -= _interval; +                _current %= _interval;          }          void SetCurrent(time_t current) diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp index 1bba3c2db09..48012b6eea8 100644 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/server/shared/Utilities/Util.cpp @@ -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);  }  | 
