diff options
author | Manuel <manue.l@live.com.ar> | 2011-01-16 15:13:22 -0300 |
---|---|---|
committer | Manuel <manue.l@live.com.ar> | 2011-01-16 15:13:22 -0300 |
commit | 98d3cc01d58d9bbdd8b02f1f64bb3432649aa2c2 (patch) | |
tree | 93b7235de06ffbd4f18ccf58ec62f7e079d7d7f5 | |
parent | 7b7327acdcbeadc5ec509da4520190205d640f52 (diff) | |
parent | df334f194c7b0da49fd1c1a4f821df78a0e25fb8 (diff) |
Merge branch 'master' of github.com:TrinityCore/TrinityCore
33 files changed, 196 insertions, 147 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index 94b1b296bea..4c7b081d67e 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -1847,7 +1847,10 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES ( 72089, 'spell_marrowgar_bone_spike_graveyard'), ( 69140, 'spell_marrowgar_coldflame'), ( 72705, 'spell_marrowgar_coldflame'), -( 69147, 'spell_marrowgar_coldflame_trigger'), +( 69146, 'spell_marrowgar_coldflame_damage'), +( 70823, 'spell_marrowgar_coldflame_damage'), +( 70824, 'spell_marrowgar_coldflame_damage'), +( 70825, 'spell_marrowgar_coldflame_damage'); ( 69075, 'spell_marrowgar_bone_storm'), ( 70834, 'spell_marrowgar_bone_storm'), ( 70835, 'spell_marrowgar_bone_storm'), diff --git a/sql/updates/2011_01_16_0_world_spell_script_names.sql b/sql/updates/2011_01_16_0_world_spell_script_names.sql new file mode 100644 index 00000000000..2d0c1f28efd --- /dev/null +++ b/sql/updates/2011_01_16_0_world_spell_script_names.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_marrowgar_coldflame_trigger'; +DELETE FROM `spell_script_names` WHERE `spell_id` IN (69146,70823,70824,70825) AND `ScriptName`='spell_marrowgar_coldflame_damage'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(69146,'spell_marrowgar_coldflame_damage'), +(70823,'spell_marrowgar_coldflame_damage'), +(70824,'spell_marrowgar_coldflame_damage'), +(70825,'spell_marrowgar_coldflame_damage'); diff --git a/sql/updates/3.3.5a_old/09632_character_arena_team_member.sql b/sql/updates/3.3.5a_old/09632_characters_arena_team_member.sql index cc33ecbb78b..cc33ecbb78b 100644 --- a/sql/updates/3.3.5a_old/09632_character_arena_team_member.sql +++ b/sql/updates/3.3.5a_old/09632_characters_arena_team_member.sql diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp index fefd89a16a5..ba7ed560589 100755 --- a/src/server/game/AI/EventAI/CreatureEventAI.cpp +++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp @@ -1231,8 +1231,8 @@ void CreatureEventAI::DoFindFriendlyMissingBuff(std::list<Creature*>& _list, flo cell.Visit(p, grid_creature_searcher, *me->GetMap()); } -//********************************* -//*** Functions used globally *** +// ********************************* +// *** Functions used globally *** void CreatureEventAI::DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target) { diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 36f31c52e8e..f94a41dfb10 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -45,9 +45,9 @@ struct ScriptedAI : public CreatureAI explicit ScriptedAI(Creature* pCreature); virtual ~ScriptedAI() {} - //************* + // ************* //CreatureAI Functions - //************* + // ************* void AttackStartNoMove(Unit *pTarget); @@ -81,9 +81,9 @@ struct ScriptedAI : public CreatureAI // Called when AI is temporarily replaced or put back when possess is applied or removed void OnPossess(bool /*apply*/) {} - //************* + // ************* // Variables - //************* + // ************* //Pointer to creature we are manipulating Creature* me; @@ -91,9 +91,9 @@ struct ScriptedAI : public CreatureAI //For fleeing bool IsFleeing; - //************* + // ************* //Pure virtual functions - //************* + // ************* //Called at creature reset either by death or evade void Reset() {} @@ -101,9 +101,9 @@ struct ScriptedAI : public CreatureAI //Called at creature aggro either by MoveInLOS or Attack Start void EnterCombat(Unit* /*who*/) {} - //************* + // ************* //AI Helper Functions - //************* + // ************* //Start movement toward victim void DoStartMovement(Unit* pVictim, float fDistance = 0, float fAngle = 0); diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 4043aa9e966..a10f8090927 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -2374,7 +2374,7 @@ bool ChatHandler::HandleChangeWeather(const char *args) return false; } - //*Change the weather of a cell + // *Change the weather of a cell char* px = strtok((char*)args, " "); char* py = strtok(NULL, " "); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 404b3d91b8c..d8dfecdb70c 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22492,9 +22492,9 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const return false; } -//*********************************** -//-------------TRINITY--------------- -//*********************************** +// *********************************** +// -------------TRINITY--------------- +// *********************************** void Player::StopCastingBindSight() { diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 2687f1ea233..7381f059940 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -180,8 +180,11 @@ Transport::Transport(uint32 period, uint32 script) : GameObject(), m_period(peri Transport::~Transport() { - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();) - (*(itr++))->ForcedDespawn(); + for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) + { + (*itr)->SetTransport(NULL); + GetMap()->AddObjectToRemoveList(*itr); + } m_NPCPassengerSet.clear(); diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index af04b6c7f65..2405d6c2b40 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -45,11 +45,6 @@ ObjectAccessor::ObjectAccessor() ObjectAccessor::~ObjectAccessor() { - for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) - { - itr->second->RemoveFromWorld(); - delete itr->second; - } } WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, uint64 guid) @@ -385,6 +380,15 @@ void ObjectAccessor::Update(uint32 /*diff*/) } } +void ObjectAccessor::UnloadAll() +{ + for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) + { + itr->second->RemoveFromWorld(); + delete itr->second; + } +} + /// Define the static members of HashMapHolder template <class T> UNORDERED_MAP< uint64, T* > HashMapHolder<T>::m_objectMap; diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index b8087a84f1e..c8be042ef8d 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -40,6 +40,7 @@ class DynamicObject; class WorldObject; class Vehicle; class Map; +class WorldRunnable; template <class T> class HashMapHolder @@ -84,6 +85,7 @@ class HashMapHolder class ObjectAccessor { friend class ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>; + friend class WorldRunnable; ObjectAccessor(); ~ObjectAccessor(); ObjectAccessor(const ObjectAccessor&); @@ -254,6 +256,9 @@ class ObjectAccessor typedef ACE_Thread_Mutex LockType; + protected: + void UnloadAll(); + private: Player2CorpsesMapType i_player2corpse; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 3f0dedda06e..a18c67384fe 100755 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2542,7 +2542,7 @@ void Guild::_MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAm player->GetName(), player->GetGUIDLow(), pItemSrc->GetEntry(), tabId, slotId, destTabId, destSlotId, pItemSrc->GetEntry()); //return; // Commented out for now, uncomment when it's verified that this causes a crash!! } - //*/ + // */ // 3. Check destination rights if (!pDest->HasStoreRights(pSrc)) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b754c87ccb1..cf26daed48a 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1020,9 +1020,9 @@ void Map::UnloadAll() } } -//***************************** +// ***************************** // Grid function -//***************************** +// ***************************** GridMap::GridMap() { m_flags = 0; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 8da8a184aef..c98bdce473b 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -60,9 +60,9 @@ struct ScriptAction ScriptInfo const* script; // pointer to static script data }; -//****************************************** +// ****************************************** // Map file format defines -//****************************************** +// ****************************************** #define MAP_MAGIC 'SPAM' #define MAP_VERSION_MAGIC '1.1v' #define MAP_AREA_MAGIC 'AERA' diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index d829c8e30d3..7b6d0a64460 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -45,16 +45,6 @@ MapManager::MapManager() MapManager::~MapManager() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - delete iter->second; - - for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) - { - (*i)->RemoveFromWorld(); - delete *i; - } - - Map::DeleteStateMachine(); } void MapManager::Initialize() @@ -305,17 +295,23 @@ bool MapManager::IsValidMAP(uint32 mapid) void MapManager::UnloadAll() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - iter->second->UnloadAll(); + for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) + { + (*i)->RemoveFromWorld(); + delete *i; + } - while (!i_maps.empty()) + for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();) { - delete i_maps.begin()->second; - i_maps.erase(i_maps.begin()); + iter->second->UnloadAll(); + delete iter->second; + i_maps.erase(iter++); } if (m_updater.activated()) m_updater.deactivate(); + + Map::DeleteStateMachine(); } void MapManager::InitMaxInstanceId() diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f811b20d9d8..125203dfdeb 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1142,9 +1142,9 @@ void AuraEffect::UpdatePeriodic(Unit * caster) } else { - //********************************************** + // ********************************************** // This feature uses only in arenas - //********************************************** + // ********************************************** // Here need increase mana regen per tick (6 second rule) // on 0 tick - 0 (handled in 2 second) // on 1 tick - 166% (handled in 4 second) @@ -1931,7 +1931,7 @@ void AuraEffect::PeriodicDummyTick(Unit * target, Unit * caster) const } case 54798: // FLAMING Arrow Triggered Effect { - if (!target->ToCreature() || !caster->ToCreature()->IsVehicle()) + if (!target || !target->ToCreature() || !caster->ToCreature()->IsVehicle()) return; Unit *rider = caster->GetVehicleKit()->GetPassenger(0); diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 1d775c9c825..0d7f163c0ea 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -606,17 +606,17 @@ class Spell int32 m_damage; // Damge in effects count here int32 m_healing; // Healing in effects count here - //****************************************** + // ****************************************** // Spell trigger system - //****************************************** + // ****************************************** uint32 m_procAttacker; // Attacker trigger flags uint32 m_procVictim; // Victim trigger flags uint32 m_procEx; void prepareDataForTriggerSystem(AuraEffect const * triggeredByAura); - //***************************************** + // ***************************************** // Spell target subsystem - //***************************************** + // ***************************************** // Targets store structures and data struct TargetInfo { diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 3f8edaab09a..29a58d79165 100755 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -306,8 +306,8 @@ void CreatureTextMgr::BuildMonsterChat(WorldPacket *data, WorldObject* source, C { sLog->outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent WHISPER msg to Non-Player target. Ignoring.",source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow()); return; - //*data << (uint32)1; // target name length - //*data << (uint8)0; // target name + // *data << (uint32)1; // target name length + // *data << (uint8)0; // target name } *data << (uint32)(strlen(text)+1); *data << text; diff --git a/src/server/scripts/Examples/example_creature.cpp b/src/server/scripts/Examples/example_creature.cpp index 7556d639770..7cc62b1d49d 100644 --- a/src/server/scripts/Examples/example_creature.cpp +++ b/src/server/scripts/Examples/example_creature.cpp @@ -88,11 +88,11 @@ class example_creature : public CreatureScript struct example_creatureAI : public ScriptedAI { - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** //This is the constructor, called only once when the Creature is first created example_creatureAI(Creature *c) : ScriptedAI(c) {} - //*** CUSTOM VARIABLES **** + // *** CUSTOM VARIABLES **** //These variables are for use only by this individual script. //Nothing else will ever call them but us. @@ -105,7 +105,7 @@ class example_creature : public CreatureScript uint32 m_uiPhase; // The current battle phase we are in uint32 m_uiPhaseTimer; // Timer until phase transition - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** //This is called after spawn and whenever the core decides we need to evade void Reset() { @@ -119,7 +119,7 @@ class example_creature : public CreatureScript me->RestoreFaction(); } - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** // Enter Combat called once per combat void EnterCombat(Unit* pWho) { @@ -127,7 +127,7 @@ class example_creature : public CreatureScript DoScriptText(SAY_AGGRO, me, pWho); } - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** // Attack Start is called when victim change (including at start of combat) // By default, attack pWho and start movement toward the victim. //void AttackStart(Unit* pWho) @@ -135,14 +135,14 @@ class example_creature : public CreatureScript // ScriptedAI::AttackStart(pWho); //} - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** // Called when going out of combat. Reset is called just after. void EnterEvadeMode() { DoScriptText(SAY_EVADE, me); } - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** //Our Receive emote function void ReceiveEmote(Player* /*pPlayer*/, uint32 uiTextEmote) { @@ -159,7 +159,7 @@ class example_creature : public CreatureScript } } - //*** HANDLED FUNCTION *** + // *** HANDLED FUNCTION *** //Update AI is called Every single map update (roughly once every 50ms if a player is within the grid) void UpdateAI(const uint32 uiDiff) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 08bfd7128f5..031c0faaf01 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -78,13 +78,13 @@ enum Creatures { MOB_CTHUN_PORTAL = 15896, - //***** Main Phase 1 ******** + // ***** Main Phase 1 ******** BOSS_EYE_OF_CTHUN = 15589, MOB_CLAW_TENTACLE = 15725, MOB_EYE_TENTACLE = 15726, MOB_SMALL_PORTAL = 15904, - //***** Main Phase 2 ******** + // ***** Main Phase 2 ******** MOB_BODY_OF_CTHUN = 15809, MOB_GIANT_CLAW_TENTACLE = 15728, MOB_GIANT_EYE_TENTACLE = 15334, @@ -94,7 +94,7 @@ enum Creatures enum Spells { - //***** Main Phase 1 ******** + // ***** Main Phase 1 ******** //Eye Spells SPELL_FREEZE_ANIM = 16245, SPELL_GREEN_BEAM = 26134, @@ -108,7 +108,7 @@ enum Spells SPELL_GROUND_RUPTURE = 26139, SPELL_HAMSTRING = 26141, - //***** Main Phase 2 ****** + // ***** Main Phase 2 ****** //Body spells //#define SPELL_CARAPACE_CTHUN 26156 //Was removed from client dbcs SPELL_TRANSFORM = 26232, @@ -142,7 +142,7 @@ enum Yells //Text emote EMOTE_WEAKENED = -1531011, - //****** Out of Combat ****** + // ****** Out of Combat ****** // Random Wispers - No txt only sound // The random sound is chosen by the client. RANDOM_SOUND_WHISPER = 8663, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 70cc7a331cf..db79ed39b2f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1059,7 +1059,7 @@ class npc_ball_of_flame : public CreatureScript struct npc_ball_of_flameAI : public ScriptedAI { - npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature) + npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { despawnTimer = 0; } @@ -1102,6 +1102,15 @@ class npc_ball_of_flame : public CreatureScript } } + void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) + { + if (!instance || damageType != SPELL_DIRECT_DAMAGE) + return; + + if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000)) + instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false)); + } + void UpdateAI(const uint32 diff) { if (!despawnTimer) @@ -1117,6 +1126,7 @@ class npc_ball_of_flame : public CreatureScript } private: + InstanceScript* instance; uint64 chaseGUID; uint32 despawnTimer; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index cfdb7f05a05..d4d51e98b3d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -139,7 +139,7 @@ class boss_blood_queen_lana_thel : public CreatureScript void Reset() { - events.Reset(); + _Reset(); events.ScheduleEvent(EVENT_BERSERK, 330000); events.ScheduleEvent(EVENT_VAMPIRIC_BITE, 15000); events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500, EVENT_GROUP_CANCELLABLE); @@ -151,8 +151,6 @@ class boss_blood_queen_lana_thel : public CreatureScript me->SetSpeed(MOVE_FLIGHT, 0.642857f, true); offtank = NULL; vampires.clear(); - - instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, NOT_STARTED); } void EnterCombat(Unit* who) @@ -164,6 +162,7 @@ class boss_blood_queen_lana_thel : public CreatureScript return; } + me->setActive(true); DoZoneInCombat(); Talk(SAY_AGGRO); instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); @@ -174,6 +173,7 @@ class boss_blood_queen_lana_thel : public CreatureScript void JustDied(Unit* /*killer*/) { + _JustDied(); Talk(SAY_DEATH); instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN); instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR); @@ -184,11 +184,11 @@ class boss_blood_queen_lana_thel : public CreatureScript instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELIRIOUS_SLASH); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); - instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, DONE); } void JustReachedHome() { + _JustReachedHome(); Talk(SAY_WIPE); instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, FAIL); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index d8af0a8a3e6..bf28de2d80c 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -257,8 +257,8 @@ class boss_deathbringer_saurfang : public CreatureScript void Reset() { + _Reset(); me->SetReactState(REACT_DEFENSIVE); - events.Reset(); events.SetPhase(PHASE_COMBAT); frenzy = false; me->SetPower(POWER_ENERGY, 0); @@ -269,8 +269,6 @@ class boss_deathbringer_saurfang : public CreatureScript DoCast(me, SPELL_RUNE_OF_BLOOD_S, true); me->RemoveAurasDueToSpell(SPELL_BERSERK); me->RemoveAurasDueToSpell(SPELL_FRENZY); - summons.DespawnAll(); - instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED); } void EnterCombat(Unit* who) @@ -283,6 +281,9 @@ class boss_deathbringer_saurfang : public CreatureScript } // oh just screw intro, enter combat - no exploits please + me->setActive(true); + DoZoneInCombat(); + events.SetPhase(PHASE_COMBAT); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); introDone = true; @@ -301,11 +302,11 @@ class boss_deathbringer_saurfang : public CreatureScript void JustDied(Unit* /*killer*/) { + _JustDied(); DoCastAOE(SPELL_ACHIEVEMENT, true); Talk(SAY_DEATH); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); - instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, DONE); if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) creature->AI()->DoAction(ACTION_START_OUTRO); } @@ -327,6 +328,7 @@ class boss_deathbringer_saurfang : public CreatureScript void JustReachedHome() { + _JustReachedHome(); instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, FAIL); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index fff982fe7d9..576ac2db454 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -98,7 +98,7 @@ class boss_festergut : public CreatureScript void Reset() { - events.Reset(); + _Reset(); events.ScheduleEvent(EVENT_BERSERK, 300000); events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000)); events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); @@ -111,12 +111,10 @@ class boss_festergut : public CreatureScript gasDummyGUID = gasDummy->GetGUID(); for (uint8 i = 0; i < 3; ++i) { - gasDummy->RemoveAurasDueToSpell(gaseousBlight[i]); + me->RemoveAurasDueToSpell(gaseousBlight[i]); gasDummy->RemoveAurasDueToSpell(gaseousBlightVisual[i]); } } - - instance->SetBossState(DATA_FESTERGUT, NOT_STARTED); } void EnterCombat(Unit* who) @@ -128,19 +126,19 @@ class boss_festergut : public CreatureScript return; } + me->setActive(true); Talk(SAY_AGGRO); if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) gasDummyGUID = gasDummy->GetGUID(); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_COMBAT); - - DoZoneInCombat(me); + DoZoneInCombat(); } void JustDied(Unit* /*killer*/) { + _JustDied(); Talk(SAY_DEATH); - instance->SetBossState(DATA_FESTERGUT, DONE); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); @@ -149,6 +147,7 @@ class boss_festergut : public CreatureScript void JustReachedHome() { + _JustReachedHome(); instance->SetBossState(DATA_FESTERGUT, FAIL); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index f9721c5d066..0c44d27d4e5 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -180,9 +180,9 @@ class boss_lady_deathwhisper : public CreatureScript void Reset() { + _Reset(); me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)); me->SetLastManaUse(0xFFFFFFFF); // hacky, but no other way atm to prevent mana regen - events.Reset(); events.SetPhase(PHASE_ONE); addWaveCounter = 0; nextVengefulShadeTarget = 0; @@ -191,7 +191,6 @@ class boss_lady_deathwhisper : public CreatureScript me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); - instance->SetBossState(DATA_LADY_DEATHWHISPER, NOT_STARTED); } void MoveInLineOfSight(Unit* who) @@ -230,6 +229,9 @@ class boss_lady_deathwhisper : public CreatureScript return; } + me->setActive(true); + DoZoneInCombat(); + events.Reset(); events.SetPhase(PHASE_ONE); // phase-independent events @@ -254,8 +256,6 @@ class boss_lady_deathwhisper : public CreatureScript { Talk(SAY_DEATH); - instance->SetBossState(DATA_LADY_DEATHWHISPER, DONE); - std::set<uint32> livingAddEntries; // Full House achievement for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -284,11 +284,12 @@ class boss_lady_deathwhisper : public CreatureScript } } - summons.DespawnAll(); + _JustDied(); } void JustReachedHome() { + _JustReachedHome(); instance->SetBossState(DATA_LADY_DEATHWHISPER, FAIL); summons.DespawnAll(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 72e514bbe29..ef1e9cc24b6 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -50,6 +50,7 @@ enum Spells // Coldflame SPELL_COLDFLAME_PASSIVE = 69145, + SPELL_COLDFLAME_SUMMON = 69147, }; static const uint32 boneSpikeSummonId[3] = {69062, 72669, 72670}; @@ -103,22 +104,23 @@ class boss_lord_marrowgar : public CreatureScript void Reset() { + _Reset(); me->SetSpeed(MOVE_RUN, baseSpeed, true); me->RemoveAurasDueToSpell(SPELL_BONE_STORM); me->RemoveAurasDueToSpell(SPELL_BERSERK); - events.Reset(); events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(10000, 15000), EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000)); events.ScheduleEvent(EVENT_ENRAGE, 600000); - instance->SetBossState(DATA_LORD_MARROWGAR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) { Talk(SAY_AGGRO); + me->setActive(true); + DoZoneInCombat(); instance->SetBossState(DATA_LORD_MARROWGAR, IN_PROGRESS); } @@ -126,11 +128,12 @@ class boss_lord_marrowgar : public CreatureScript { Talk(SAY_DEATH); - instance->SetBossState(DATA_LORD_MARROWGAR, DONE); + _JustDied(); } void JustReachedHome() { + _JustReachedHome(); instance->SetBossState(DATA_LORD_MARROWGAR, FAIL); instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(true)); // reset } @@ -281,7 +284,6 @@ class npc_coldflame : public CreatureScript return; Creature* creOwner = owner->ToCreature(); DoCast(me, SPELL_COLDFLAME_PASSIVE, true); - float x, y, z; // random target case if (!owner->HasAura(SPELL_BONE_STORM)) { @@ -295,23 +297,17 @@ class npc_coldflame : public CreatureScript return; } - target->GetPosition(x, y, z); - float scale = 70.0f / me->GetExactDist2d(x, y); - x = me->GetPositionX() + (x - me->GetPositionX()) * scale; - y = me->GetPositionY() + (y - me->GetPositionY()) * scale; + me->SetOrientation(me->GetAngle(target)); } else { - me->GetPosition(x, y, z); MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()); Position const* ownerPos = marrowgarAI->GetLastColdflamePosition(); float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI); MapManager::NormalizeOrientation(ang); - x += 50.0f * cosf(ang); - y += 50.0f * sinf(ang); + me->SetOrientation(ang); } - me->GetMotionMaster()->MovePoint(POINT_TARGET_COLDFLAME, x, y, z); - events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 400); + events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200); } void UpdateAI(const uint32 diff) @@ -321,20 +317,18 @@ class npc_coldflame : public CreatureScript if (events.ExecuteEvent() == EVENT_COLDFLAME_TRIGGER) { if (me->HasAura(SPELL_COLDFLAME_PASSIVE)) - DoCast(SPELL_COLDFLAME_PASSIVE); - events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 400); + { + float x, y; + me->GetPosition(x, y); + x += 5.5f * cos(me->GetOrientation()); + y += 5.5f * sin(me->GetOrientation()); + me->NearTeleportTo(x, y, me->GetPositionZ(), me->GetOrientation()); + DoCast(SPELL_COLDFLAME_SUMMON); + } + events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200); } } - void MovementInform(uint32 type, uint32 id) - { - if (type != POINT_MOTION_TYPE || id != POINT_TARGET_COLDFLAME) - return; - - // stop triggering but dont despawn - me->RemoveAura(SPELL_COLDFLAME_PASSIVE); - } - private: EventMap events; }; @@ -436,6 +430,34 @@ class spell_marrowgar_coldflame : public SpellScriptLoader } }; +class spell_marrowgar_coldflame_damage : public SpellScriptLoader +{ + public: + spell_marrowgar_coldflame_damage() : SpellScriptLoader("spell_marrowgar_coldflame_damage") { } + + class spell_marrowgar_coldflame_damage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_marrowgar_coldflame_damage_AuraScript); + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + if (DynamicObject* owner = GetDynobjOwner()) + if (GetTarget()->GetExactDist2d(owner) > owner->GetRadius() || GetTarget()->HasAura(SPELL_IMPALED)) + PreventDefaultAction(); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_marrowgar_coldflame_damage_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_marrowgar_coldflame_damage_AuraScript(); + } +}; + class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader { public: @@ -451,22 +473,20 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader if (Creature* marrowgar = GetCaster()->ToCreature()) { CreatureAI* marrowgarAI = marrowgar->AI(); - bool yell = false; uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); for (uint8 i = 0; i < boneSpikeCount; ++i) { // select any unit but not the tank Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_IMPALED); + // try the tank only in first iteration if (!target && !i) target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_IMPALED); if (!target) - break; - yell = true; + return; target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true); } - if (yell) - marrowgarAI->Talk(SAY_BONESPIKE); + marrowgarAI->Talk(SAY_BONESPIKE); } } @@ -493,13 +513,12 @@ class spell_marrowgar_bone_storm : public SpellScriptLoader void RecalculateDamage(SpellEffIndex /*effIndex*/) { - int32 dmg = GetHitDamage(); float distance = GetHitUnit()->GetExactDist2d(GetCaster()); if (distance < 5.0f) return; - float distVar = distance >= 20.0f ? 4 : (10.0f/3.0f); - SetHitDamage(int32(dmg * distVar / distance)); + float distVar = distance >= 40.0f ? 4 : (10.0f/3.0f); + SetHitDamage(int32(GetHitDamage() * distVar / distance)); } void Register() @@ -520,6 +539,7 @@ void AddSC_boss_lord_marrowgar() new npc_coldflame(); new npc_bone_spike(); new spell_marrowgar_coldflame(); + new spell_marrowgar_coldflame_damage(); new spell_marrowgar_bone_spike_graveyard(); new spell_marrowgar_bone_storm(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 89eba957708..153902eef9f 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -221,6 +221,7 @@ class boss_professor_putricide : public CreatureScript return; } + me->setActive(true); events.Reset(); events.ScheduleEvent(EVENT_BERSERK, 600000); events.ScheduleEvent(EVENT_SLIME_PUDDLE, 10000); @@ -240,6 +241,7 @@ class boss_professor_putricide : public CreatureScript void JustReachedHome() { + _JustReachedHome(); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); if (events.GetPhaseMask() & PHASE_MASK_COMBAT) instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL); @@ -253,8 +255,8 @@ class boss_professor_putricide : public CreatureScript void JustDied(Unit* /*killer*/) { + _JustDied(); Talk(SAY_DEATH); - instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, DONE); } void JustSummoned(Creature* summon) @@ -290,6 +292,7 @@ class boss_professor_putricide : public CreatureScript summon->ClearUnitState(UNIT_STAT_CASTING); summon->GetMotionMaster()->MoveIdle(); summon->m_Events.AddEvent(new StartMovementEvent(*summon), summon->m_Events.CalculateTime(3500)); + me->SetReactState(REACT_PASSIVE); } return; case NPC_CHOKING_GAS_BOMB: @@ -703,7 +706,11 @@ class npc_volatile_ooze : public CreatureScript void UpdateAI(const uint32 diff) { - if (!UpdateVictim()) + // simplified update, we do not want to select new target + if (!me->isInCombat()) + return; + + if (!me->getVictim()) return; if (!newTargetSelectTimer) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 4e845e82a64..3141961782e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -100,15 +100,12 @@ class boss_rotface : public CreatureScript void Reset() { - events.Reset(); + _Reset(); events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000); events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000); events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000); infectionStage = 0; infectionCooldown = 14000; - summons.DespawnAll(); - - instance->SetBossState(DATA_ROTFACE, NOT_STARTED); } void EnterCombat(Unit* who) @@ -120,23 +117,24 @@ class boss_rotface : public CreatureScript return; } + me->setActive(true); Talk(SAY_AGGRO); if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); - - DoZoneInCombat(me); + DoZoneInCombat(); } void JustDied(Unit* /*killer*/) { + _JustDied(); Talk(SAY_DEATH); - instance->SetBossState(DATA_ROTFACE, DONE); if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_DEATH); } void JustReachedHome() { + _JustReachedHome(); instance->SetBossState(DATA_ROTFACE, FAIL); instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(true)); // reset } diff --git a/src/server/scripts/Northrend/sholazar_basin.cpp b/src/server/scripts/Northrend/sholazar_basin.cpp index 38dcfd4d8de..53dfca49d5f 100644 --- a/src/server/scripts/Northrend/sholazar_basin.cpp +++ b/src/server/scripts/Northrend/sholazar_basin.cpp @@ -497,7 +497,7 @@ public: { switch (sayStep) { - case 1: + case 0: { switch (me->GetEntry()) { @@ -509,7 +509,7 @@ public: sayStep++; break; } - case 2: + case 1: { switch (me->GetEntry()) { @@ -521,7 +521,7 @@ public: sayStep++; break; } - case 3: + case 2: { switch (me->GetEntry()) { @@ -555,17 +555,17 @@ public: { switch (i) { - case 1: + case 0: if (NPC_HEMET != me->GetEntry()) continue; else break; - case 2: + case 1: if (NPC_HADRIUS != me->GetEntry()) continue; else break; - case 3: + case 2: if (NPC_TAMARA != me->GetEntry()) continue; else @@ -577,7 +577,7 @@ public: caster->ToPlayer()->KilledMonsterCredit(me->GetEntry(), 0); caster->ToPlayer()->Say(SAY_OFFER, LANG_UNIVERSAL); - sayStep = 1; + sayStep = 0; break; } } diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/shared/Database/DatabaseWorker.cpp index 248e3c20d12..209ca35abae 100644 --- a/src/server/shared/Database/DatabaseWorker.cpp +++ b/src/server/shared/Database/DatabaseWorker.cpp @@ -47,6 +47,5 @@ int DatabaseWorker::svc() delete request; } - m_conn->Close(); return 0; } diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index 27a5c051ccb..9f0e51b429b 100755 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -109,9 +109,9 @@ class DatabaseWorkerPool /// Now we just wait until m_queue gives the signal to the worker threads to stop T* t = m_connections[IDX_ASYNC][i]; DatabaseWorker* worker = t->m_worker; - worker->wait(); // t->Close(); is called from worker thread + worker->wait(); delete worker; - --m_connectionCount[IDX_ASYNC]; + t->Close(); } sLog->outSQLDriver("Asynchronous connections on databasepool '%s' terminated. Proceeding with synchronous connections.", m_connectionInfo.database.c_str()); @@ -123,7 +123,6 @@ class DatabaseWorkerPool //while (1) // if (t->LockIfReady()) -- For some reason deadlocks us t->Close(); - --m_connectionCount[IDX_SYNCH]; } sLog->outSQLDriver("All connections on databasepool %s closed.", m_connectionInfo.database.c_str()); diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index bc861e6b039..10b7e00aa99 100755 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -72,8 +72,6 @@ void usage(const char *prog) /// Launch the Trinity server extern int main(int argc, char **argv) { - ACE::init(); - ///- Command line parsing to get the configuration file name char const* cfg_file = _TRINITY_CORE_CONFIG; int c=1; @@ -151,8 +149,6 @@ extern int main(int argc, char **argv) // 1 - shutdown at error // 2 - restart command used, this code can be used by restarter for restart Trinityd - ACE::fini(); - return ret; } diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 7dd4c1fa930..b4d9fa7eb7c 100755 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -174,7 +174,7 @@ int Master::Run() CoredSignalHandler SignalBREAK; #endif /* _WIN32 */ - // Register realmd's signal handlers + // Register core's signal handlers ACE_Sig_Handler Handler; Handler.register_handler(SIGINT, &SignalINT); Handler.register_handler(SIGTERM, &SignalTERM); @@ -290,7 +290,7 @@ int Master::Run() } // set server offline - LoginDatabase.PExecute("UPDATE realmlist SET color = color | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET color = color | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); // when the main thread closes the singletons get unloaded // since worldrunnable uses them, it will crash if unloaded after master @@ -484,12 +484,12 @@ void Master::clearOnlineAccounts() { // Cleanup online status for characters hosted at current realm /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'? - LoginDatabase.PExecute( + LoginDatabase.DirectPExecute( "UPDATE account SET online = 0 WHERE online > 0 " "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID); - CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0"); + CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online<>0"); // Battleground instance ids reset at server restart - CharacterDatabase.Execute("UPDATE character_battleground_data SET instance_id = 0"); + CharacterDatabase.DirectExecute("UPDATE character_battleground_data SET instance_id = 0"); } diff --git a/src/server/worldserver/WorldThread/WorldRunnable.cpp b/src/server/worldserver/WorldThread/WorldRunnable.cpp index df07a4e3bf0..acf71223791 100755 --- a/src/server/worldserver/WorldThread/WorldRunnable.cpp +++ b/src/server/worldserver/WorldThread/WorldRunnable.cpp @@ -90,6 +90,6 @@ void WorldRunnable::run() sWorldSocketMgr->StopNetwork(); + sObjectAccessor->UnloadAll(); // unload 'i_player2corpse' storage and remove from world sMapMgr->UnloadAll(); // unload all grids (including locked in memory) - } |