aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp8
-rw-r--r--src/bindings/scripts/include/sc_creature.h2
-rw-r--r--src/bindings/scripts/scripts/guard/guards.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp5
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp13
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/undercity/undercity.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp1
-rw-r--r--src/game/Creature.cpp2
-rw-r--r--src/game/DynamicObject.cpp17
-rw-r--r--src/game/Map.cpp8
-rw-r--r--src/game/MapInstanced.cpp8
-rw-r--r--src/game/Object.cpp2
-rw-r--r--src/game/Player.cpp3
-rw-r--r--src/game/Spell.cpp19
-rw-r--r--src/game/Traveller.h2
-rw-r--r--src/game/Unit.cpp74
-rw-r--r--src/game/Unit.h21
-rw-r--r--src/game/WaypointMovementGenerator.cpp2
-rw-r--r--src/game/World.cpp26
-rw-r--r--src/game/World.h4
-rw-r--r--src/trinitycore/trinitycore.conf.dist5
35 files changed, 179 insertions, 95 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index 3db6ba16515..47bc01f183c 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -687,7 +687,7 @@ void ScriptedAI::DoZoneInCombat(Unit* pUnit)
for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* i_pl = i->getSource())
- if (!i_pl->isAlive())
+ if (i_pl->isAlive())
{
pUnit->SetInCombatWith(i_pl);
i_pl->SetInCombatWith(pUnit);
@@ -729,6 +729,12 @@ void ScriptedAI::DoModifyThreatPercent(Unit *pUnit, int32 pct)
m_creature->getThreatManager().modifyThreatPercent(pUnit, pct);
}
+void ScriptedAI::DoTeleportTo(float x, float y, float z, uint32 time)
+{
+ m_creature->Relocate(x,y,z);
+ m_creature->SendMonsterMove(x, y, z, time);
+}
+
void ScriptedAI::DoTeleportPlayer(Unit* pUnit, float x, float y, float z, float o)
{
if(!pUnit || pUnit->GetTypeId() != TYPEID_PLAYER)
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index 683110989b2..f9eb8c716d5 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -150,6 +150,8 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
float DoGetThreat(Unit *u);
void DoModifyThreatPercent(Unit *pUnit, int32 pct);
+ void DoTeleportTo(float x, float y, float z, uint32 time = 0);
+
//Teleports a player without dropping threat (only teleports to same map)
void DoTeleportPlayer(Unit* pUnit, float x, float y, float z, float o);
void DoTeleportAll(float x, float y, float z, float o);
diff --git a/src/bindings/scripts/scripts/guard/guards.cpp b/src/bindings/scripts/scripts/guard/guards.cpp
index 4d50626f177..01da1da33df 100644
--- a/src/bindings/scripts/scripts/guard/guards.cpp
+++ b/src/bindings/scripts/scripts/guard/guards.cpp
@@ -3286,7 +3286,7 @@ void SendClassTrainerMenu_guard_stormwind(Player *player, Creature *_Creature, u
player->SEND_GOSSIP_MENU(900,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Warrior
- player->SEND_POI(-8624.54, 402.61, 6, 6, 0, "Pig and Whistle Tavern");
+ player->SEND_POI(-8690.11, 324.85, 6, 6, 0, "Command Center");
player->SEND_GOSSIP_MENU(901,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Druid
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
index 4f02dd1afaf..9dc7f53efbe 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
@@ -192,8 +192,7 @@ struct TRINITY_DLL_DECL boss_talon_king_ikissAI : public ScriptedAI
float Y = target->GetPositionY();
float Z = target->GetPositionZ();
- m_creature->Relocate(X,Y,Z);
- m_creature->SendMonsterMove(X, Y, Z, 0, 0, 0);
+ DoTeleportTo(X,Y,Z);
DoCast(target,SPELL_BLINK_TELEPORT);
Blink = true;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index 1520330591c..dba57924e56 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -1463,8 +1463,7 @@ struct TRINITY_DLL_DECL boss_maievAI : public ScriptedAI
m_creature->AttackStop();
m_creature->InterruptNonMeleeSpells(false);
m_creature->GetMotionMaster()->Clear(false);
- m_creature->Relocate(x, y, z);
- m_creature->SendMonsterMove(x, y, z, 0, 0, 0);
+ DoTeleportTo(x, y, z);
DoCast(m_creature, SPELL_TELEPORT_VISUAL, true);
}
@@ -1940,7 +1939,7 @@ void boss_illidan_stormrageAI::HandleTalkSequence()
Akama->GetMotionMaster()->Clear(false);
//Akama->GetMotionMaster()->MoveIdle();
Akama->Relocate(x, y, z);
- Akama->SendMonsterMove(x, y, z, 0, 0, 0);//Illidan must not die until Akama arrives.
+ Akama->SendMonsterMove(x, y, z, 0);//Illidan must not die until Akama arrives.
Akama->GetMotionMaster()->MoveChase(m_creature);
}
}
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
index 51988bc42fe..e969898884e 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
@@ -306,8 +306,7 @@ struct TRINITY_DLL_DECL boss_victor_nefariusAI : public ScriptedAI
DoCast(m_creature,8149);
//Teleport self to a hiding spot (this causes errors in the Trinity log but no real issues)
- m_creature->Relocate(HIDE_X,HIDE_Y,HIDE_Z,0);
- m_creature->SendMonsterMove(HIDE_X,HIDE_Y,HIDE_Z,0,true,0);
+ DoTeleportTo(HIDE_X,HIDE_Y,HIDE_Z);
m_creature->addUnitState(UNIT_STAT_FLEEING);
//Spawn nef and have him attack a random target
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
index 2cc2e1e0a02..fa997c69afe 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
@@ -402,8 +402,7 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
Phase = 2;
m_creature->GetMotionMaster()->Clear();
- m_creature->Relocate(MIDDLE_X, MIDDLE_Y, MIDDLE_Z);
- m_creature->SendMonsterMove(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 0, 0, 0);
+ DoTeleportTo(MIDDLE_X, MIDDLE_Y, MIDDLE_Z);
Creature *pCreature;
for(uint8 i = 0; i < 4; i++)
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
index 0ef50b8dbf5..c027d3a4b90 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
@@ -815,8 +815,7 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
m_creature->GetPosition(x,y,z);
x = rand()%2 ? x+10+rand()%10 : x-10-rand()%10;
y = rand()%2 ? y+10+rand()%10 : y-10-rand()%10;
- m_creature->Relocate(x,y,z);
- m_creature->SendMonsterMove(x, y, m_creature->GetPositionZ(), 0,0,0);
+ DoTeleportTo(x, y, z);
}
Blink_Timer = 8000;
}else Blink_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
index e995a8adb07..e98fca723f3 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
@@ -95,10 +95,12 @@ struct TRINITY_DLL_DECL boss_shazzrahAI : public ScriptedAI
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
- m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(),0);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(),0,true,0);
+ if(target)
+ {
+ DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
DoCast(target,SPELL_ARCANEEXPLOSION);
DoResetThreat();
+ }
Blink_Timer = 45000;
}else Blink_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
index ad851eeaa1f..1a7e6b655e8 100644
--- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
@@ -718,6 +718,12 @@ struct TRINITY_DLL_DECL npc_overlord_morghorAI : public ScriptedAI
Unit* Illi = Unit::GetUnit((*m_creature), IllidanGUID);
+ if(!plr || !Illi)
+ {
+ EnterEvadeMode();
+ return 0;
+ }
+
switch(Step)
{
case 0: return 0; break;
@@ -803,13 +809,16 @@ struct TRINITY_DLL_DECL npc_overlord_morghorAI : public ScriptedAI
case 32: m_creature->GetMotionMaster()->MovePoint(0, -5085.77, 577.231, 86.6719); return 5000; break;
case 33: Reset(); return 100; break;
- default : return 9999999;
+ default : return 0;
}
}
void UpdateAI(const uint32 diff)
{
- if(ConversationTimer < diff)
+ if(!ConversationTimer)
+ return;
+
+ if(ConversationTimer <= diff)
{
if(Event && IllidanGUID && PlayerGUID)
{
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
index 32f563abd57..ba516352809 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
@@ -870,8 +870,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
m_creature->StopMoving();
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
- m_creature->Relocate(GRAVITY_X, GRAVITY_Y, GRAVITY_Z, 0);
- m_creature->SendMonsterMove(GRAVITY_X, GRAVITY_Y,GRAVITY_Z, 0, 0, 0);
+ DoTeleportTo(GRAVITY_X, GRAVITY_Y, GRAVITY_Z);
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature, SPELL_FULLPOWER);
@@ -935,8 +934,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
m_creature->StopMoving();
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
- m_creature->Relocate(GRAVITY_X, GRAVITY_Y, GRAVITY_Z, 0);
- m_creature->SendMonsterMove(GRAVITY_X, GRAVITY_Y, GRAVITY_Z, 0, 0, 0);
+ DoTeleportTo(GRAVITY_X, GRAVITY_Y, GRAVITY_Z);
// 1) Kael'thas will portal the whole raid right into his body
for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i)
{
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
index c6ba4d28cda..1b262fa2d0c 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
@@ -176,7 +176,7 @@ struct TRINITY_DLL_DECL boss_vemAI : public ScriptedAI
if(target)
{
DoCast(target, SPELL_CHARGE);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
+ //m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
AttackStart(target);
}
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
index b5debb45649..7c760fcd099 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
@@ -103,8 +103,7 @@ struct TRINITY_DLL_DECL boss_ouroAI : public ScriptedAI
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
- m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
+ DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
ChangeTarget_Timer = 10000 + rand()%10000;
}else ChangeTarget_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/undercity/undercity.cpp b/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
index 87c7614c3d4..8b2de36e3e4 100644
--- a/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
+++ b/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
@@ -86,7 +86,7 @@ struct TRINITY_DLL_DECL npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
if( Unit* target = Unit::GetUnit(*summoned,targetGUID) )
{
- target->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), myZ+15.0,0,0,0);
+ target->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), myZ+15.0,0);
target->Relocate(target->GetPositionX(), target->GetPositionY(), myZ+15.0);
summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false);
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
index 53c87a4a63b..34001fc7744 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
@@ -311,7 +311,7 @@ struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
if (target)
{
target->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
- target->SendMonsterMove(x,y,m_creature->GetPositionZ()+15,0,0,0);
+ target->SendMonsterMove(x,y,m_creature->GetPositionZ()+15,0);
}
Unit *Cloud = m_creature->SummonTrigger(x, y, m_creature->GetPositionZ()+16, 0, 15000);
if(Cloud)
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
index 1b19d9d92b7..e23b6beada1 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
@@ -365,8 +365,7 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI
m_creature->AttackStop();
m_creature->GetMotionMaster()->Clear();
- m_creature->Relocate(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2],0);
- m_creature->SendMonsterMove(JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2],0,0,0);
+ DoTeleportTo(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2]);
m_creature->StopMoving();
m_creature->CastSpell(m_creature, SPELL_FIRE_BOMB_CHANNEL, false);
//DoTeleportPlayer(m_creature, JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2], 0);
@@ -399,8 +398,7 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI
m_creature->AttackStop();
m_creature->GetMotionMaster()->Clear();
- m_creature->Relocate(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2],0);
- m_creature->SendMonsterMove(JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2],0,0,0);
+ DoTeleportTo(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2]);
m_creature->StopMoving();
m_creature->CastSpell(m_creature, SPELL_HATCH_ALL, false);
HatchAllEggs(2);
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index d0b247f2085..d1a7fa9fd13 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -338,8 +338,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
case 2:
case 3:
case 4:
- m_creature->Relocate(CENTER_X, CENTER_Y, CENTER_Z,0);
- m_creature->SendMonsterMove(CENTER_X, CENTER_Y, CENTER_Z,0,0,100);
+ DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100);
DoResetThreat();
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
m_creature->RemoveAurasDueToSpell(Transform[Phase].unaura);
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
index 2932676b58a..a6c2f633075 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
@@ -106,9 +106,6 @@ struct TRINITY_DLL_DECL boss_jeklikAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoCast(target,SPELL_CHARGE);
-
- m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
AttackStart(target);
}
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
index 0d27cdb72f7..14eb635a61a 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
@@ -165,7 +165,7 @@ struct TRINITY_DLL_DECL boss_mandokirAI : public ScriptedAI
else
{
DoCast(pUnit,SPELL_CHARGE);
- m_creature->SendMonsterMove(pUnit->GetPositionX(), pUnit->GetPositionY(), pUnit->GetPositionZ(), 0, true,1);
+ //m_creature->SendMonsterMove(pUnit->GetPositionX(), pUnit->GetPositionY(), pUnit->GetPositionZ(), 0, true,1);
AttackStart(pUnit);
}
}
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
index 865295f7c58..5b68dfb8390 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
@@ -83,8 +83,7 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target)
{
- m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
+ DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
DoCast(target,SPELL_AMBUSH);
}
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
index c426a6b2522..e2aa7d3049b 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
@@ -194,7 +194,6 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoCast(target,SPELL_CHARGE);
- m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
DoResetThreat();
AttackStart(target);
}
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 179143b1502..0e649c66c01 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1154,7 +1154,7 @@ void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint3
m_startMove = getMSTime();
m_moveTime = time;*/
- SendMonsterMove(x, y, z, type, MovementFlags, time);
+ SendMonsterMove(x, y, z, time);
}
Player *Creature::GetLootRecipient() const
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index 677a31b34de..12a9cd67500 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -52,15 +52,18 @@ void DynamicObject::AddToWorld()
void DynamicObject::RemoveFromWorld()
{
- // Make sure the object is back to grid container for removal as farsight targets
- // are switched to world container on creation and they are also set to active
- if (isActive())
+ ///- Remove the dynamicObject from the accessor
+ if(IsInWorld())
{
- GetMap()->SwitchGridContainers(this, false);
- setActive(false);
+ // Make sure the object is back to grid container for removal as farsight targets
+ // are switched to world container on creation and they are also set to active
+ if (isActive())
+ {
+ GetMap()->SwitchGridContainers(this, false);
+ setActive(false);
+ }
+ ObjectAccessor::Instance().RemoveObject(this);
}
- ///- Remove the dynamicObject from the accessor
- if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this);
WorldObject::RemoveFromWorld();
}
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index b3006709556..cb072d93e8d 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -312,16 +312,16 @@ void Map::RemoveFromGrid(Creature* obj, NGridType *grid, Cell const& cell)
}
template<class T>
-void Map::SwitchGridContainers(T* obj, bool active)
+void Map::SwitchGridContainers(T* obj, bool apply)
{
CellPair pair = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
Cell cell(pair);
NGridType *ngrid = getNGrid(cell.GridX(), cell.GridY());
GridType &grid = (*ngrid)(cell.CellX(), cell.CellY());
- if (active)
+ if(apply)
{
- if (!grid.GetWorldObject(obj->GetGUID(), obj))
+ assert(!grid.GetWorldObject(obj->GetGUID(), obj));
{
grid.RemoveGridObject<T>(obj, obj->GetGUID());
grid.AddWorldObject<T>(obj, obj->GetGUID());
@@ -329,7 +329,7 @@ void Map::SwitchGridContainers(T* obj, bool active)
}
else
{
- if (!grid.GetGridObject(obj->GetGUID(), obj))
+ assert(!grid.GetGridObject(obj->GetGUID(), obj));
{
grid.RemoveWorldObject<T>(obj, obj->GetGUID());
grid.AddGridObject<T>(obj, obj->GetGUID());
diff --git a/src/game/MapInstanced.cpp b/src/game/MapInstanced.cpp
index 47c0fb56b0c..fe99c5c5e71 100644
--- a/src/game/MapInstanced.cpp
+++ b/src/game/MapInstanced.cpp
@@ -148,7 +148,13 @@ Map* MapInstanced::GetInstance(const WorldObject* obj)
// instantiate or find existing bg map for player
// the instance id is set in battlegroundid
NewInstanceId = player->GetBattleGroundId();
- assert(NewInstanceId);
+ if(!NewInstanceId)
+ {
+ if(player->GetSession()->PlayerLoading())
+ return NULL;
+ else
+ assert(NewInstanceId);
+ }
map = _FindMap(NewInstanceId);
if(!map)
map = CreateBattleGround(NewInstanceId);
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 7ec15d40d7c..6c65667c9aa 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1101,7 +1101,7 @@ void WorldObject::AddToWorld()
void WorldObject::RemoveFromWorld()
{
- if(m_isActive && !isType(TYPEMASK_PLAYER))
+ if(m_isActive && IsInWorld() && !isType(TYPEMASK_PLAYER))
GetMap()->RemoveActiveObject(this);
Object::RemoveFromWorld();
}
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index f0f66d4c7f9..efa414fbfaf 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -9780,8 +9780,7 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
{
if( ItemPrototype const* pBagProto = pBag->GetProto() )
{
- if( pBagProto->Class==pProto->Class && pBagProto->SubClass==pProto->SubClass &&
- (!swap || pBag->GetSlot() != eslot ) )
+ if( pBagProto->Class==pProto->Class && (!swap || pBag->GetSlot() != eslot ) )
{
if(pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
return EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH;
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index f74bf664c5c..90a22d963e9 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2148,25 +2148,6 @@ void Spell::cancel()
finish(false);
- // Unsummon summon as possessed creatures on spell cancel
- if(m_caster->GetTypeId() == TYPEID_PLAYER)
- {
- for(int i = 0; i < 3; ++i)
- {
- if(m_spellInfo->Effect[i] == SPELL_EFFECT_SUMMON &&
- (m_spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED ||
- m_spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 ||
- m_spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3))
- {
- ((Player*)m_caster)->StopCastingCharm();
- break;
- // Possession is removed in the UnSummon function
- //if (m_caster->GetCharm())
- // ((TemporarySummon*)m_caster->GetCharm())->UnSummon();
- }
- }
- }
-
m_caster->RemoveDynObject(m_spellInfo->Id);
m_caster->RemoveGameObject(m_spellInfo->Id,true);
}
diff --git a/src/game/Traveller.h b/src/game/Traveller.h
index 436f8b051cd..b8865282672 100644
--- a/src/game/Traveller.h
+++ b/src/game/Traveller.h
@@ -107,7 +107,7 @@ template<>
inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t)
{
//Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
- i_traveller.SendMonsterMove(x, y, z, 0, MOVEMENTFLAG_WALK_MODE, t);
+ i_traveller.SendMonsterMove(x, y, z, t);
}
typedef Traveller<Creature> CreatureTraveller;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index f2e1867ac3c..3d3c4874b20 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -362,10 +362,41 @@ void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFl
transitTime = static_cast<uint32>(dist / speed + 0.5);
}
//float orientation = (float)atan2((double)dy, (double)dx);
- SendMonsterMove(x, y, z, 0, MovementFlags, transitTime, player);
+ SendMonsterMove(x, y, z, transitTime, player);
}
-void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
+void Unit::SendMonsterStop()
+{
+ WorldPacket data( SMSG_MONSTER_MOVE, (17 + GetPackGUID().size()) );
+ data.append(GetPackGUID());
+ data << GetPositionX() << GetPositionY() << GetPositionZ();
+ data << getMSTime();
+ data << uint8(1);
+ SendMessageToSet(&data, true);
+}
+
+void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player)
+{
+ WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
+ data.append(GetPackGUID());
+
+ data << GetPositionX() << GetPositionY() << GetPositionZ();
+ data << getMSTime();
+
+ data << uint8(0);
+ data << uint32((GetUnitMovementFlags() & MOVEMENTFLAG_LEVITATING) ? MOVEFLAG_FLY : MOVEFLAG_WALK);
+
+ data << Time; // Time in between points
+ data << uint32(1); // 1 single waypoint
+ data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
+
+ if(player)
+ player->GetSession()->SendPacket(&data);
+ else
+ SendMessageToSet( &data, true );
+}
+
+/*void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
{
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
data.append(GetPackGUID());
@@ -394,7 +425,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
}
//Movement Flags (0x0 = walk, 0x100 = run, 0x200 = fly/swim)
- data << uint32(GetTypeId() == TYPEID_PLAYER ? MOVEMENTFLAG_WALK_MODE : MovementFlags);
+ data << uint32((MovementFlags & MOVEMENTFLAG_LEVITATING) ? MOVEFLAG_FLY : MOVEFLAG_WALK);
data << Time; // Time in between points
data << uint32(1); // 1 single waypoint
@@ -404,9 +435,9 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
player->GetSession()->SendPacket(&data);
else
SendMessageToSet( &data, true );
-}
+}*/
-void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags)
+void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end)
{
uint32 traveltime = uint32(path.GetTotalLength(start, end) * 32);
@@ -418,13 +449,10 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uin
data << GetPositionY();
data << GetPositionZ();
- // unknown field - unrelated to orientation
- // seems to increment about 1000 for every 1.7 seconds
- // for now, we'll just use mstime
data << getMSTime();
data << uint8( 0 );
- data << uint32( MovementFlags );
+ data << uint32(((GetUnitMovementFlags() & MOVEMENTFLAG_LEVITATING) || isInFlight())? MOVEFLAG_FLY : MOVEFLAG_WALK);
data << uint32( traveltime );
data << uint32( pathSize );
data.append( (char*)path.GetNodes(start), pathSize * 4 * 3 );
@@ -4241,7 +4269,8 @@ bool Unit::AddAura(Aura *Aur)
m_interruptableAuras.push_back(Aur);
AddInterruptMask(Aur->GetSpellProto()->AuraInterruptFlags);
}
- if(Aur->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
+ if((Aur->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
+ && (Aur->GetModifier()->m_auraname != SPELL_AURA_MOD_POSSESS)) //only dummy aura is breakable
{
m_ccAuras.push_back(Aur);
}
@@ -4659,8 +4688,11 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
UpdateInterruptMask();
}
- if(Aur->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
+ if((Aur->GetSpellProto()->Attributes & SPELL_ATTR_BREAKABLE_BY_DAMAGE)
+ && (Aur->GetModifier()->m_auraname != SPELL_AURA_MOD_POSSESS)) //only dummy aura is breakable
+ {
m_ccAuras.remove(Aur);
+ }
}
// Set remove mode
@@ -4669,7 +4701,7 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
// Statue unsummoned at aura remove
Totem* statue = NULL;
bool channeled = false;
- if(IsChanneledSpell(AurSpellInfo))
+ if(Aur->GetAuraDuration() && IsChanneledSpell(AurSpellInfo))
{
if(!caster) // can be already located for IsSingleTargetSpell case
caster = Aur->GetCaster();
@@ -4696,6 +4728,22 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
}
}
}
+
+ // Unsummon summon as possessed creatures on spell cancel
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ for(int i = 0; i < 3; ++i)
+ {
+ if(AurSpellInfo->Effect[i] == SPELL_EFFECT_SUMMON &&
+ (AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED ||
+ AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 ||
+ AurSpellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3))
+ {
+ ((Player*)caster)->StopCastingCharm();
+ break;
+ }
+ }
+ }
}
}
@@ -11972,7 +12020,7 @@ void Unit::StopMoving()
// Relocate(GetPositionX(), GetPositionY(), z);
Relocate(GetPositionX(), GetPositionY(),GetPositionZ());
- SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0, true, 0);
+ SendMonsterStop();
// update position and orientation;
WorldPacket data;
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 64ac958ee2a..7d63b827e2b 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -529,6 +529,17 @@ enum NPCFlags
UNIT_NPC_FLAG_OUTDOORPVP = 0x20000000, // custom flag for outdoor pvp creatures
};
+enum MoveFlags
+{
+ MOVEFLAG_NONE = 0x00000000,
+ MOVEFLAG_SLIDE = 0x00000002,
+ MOVEFLAG_MARCH_ON_SPOT = 0x00000004,
+ MOVEFLAG_JUMP = 0x00000008,
+ MOVEFLAG_WALK = 0x00000100,
+ MOVEFLAG_FLY = 0x00000200, //For dragon (+walk = glide)
+ MOVEFLAG_ORIENTATION = 0x00000400, //Fix orientation
+};
+
enum MovementFlags
{
MOVEMENTFLAG_NONE = 0x00000000,
@@ -540,8 +551,8 @@ enum MovementFlags
MOVEMENTFLAG_RIGHT = 0x00000020,
MOVEMENTFLAG_PITCH_UP = 0x00000040,
MOVEMENTFLAG_PITCH_DOWN = 0x00000080,
- MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking
- MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
+ MOVEMENTFLAG_WALK_MODE = 0x00000100,
+ MOVEMENTFLAG_ONTRANSPORT = 0x00000200,
MOVEMENTFLAG_LEVITATING = 0x00000400,
MOVEMENTFLAG_FLY_UNK1 = 0x00000800,
MOVEMENTFLAG_JUMPING = 0x00001000,
@@ -1025,8 +1036,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SpellSchoolMask damageSchoolMask,uint32 AbsorbedDamage, uint32 Resist,bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo);
- void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
- void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags);
+ void SendMonsterStop();
+ void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player = NULL);
+ //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
+ void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end);
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime = 0, Player* player = NULL);
void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp
index 01161f44f57..12b72829248 100644
--- a/src/game/WaypointMovementGenerator.cpp
+++ b/src/game/WaypointMovementGenerator.cpp
@@ -249,7 +249,7 @@ FlightPathMovementGenerator::Initialize(Player &player)
// do not send movement, it was sent already
i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false);
- player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MOVEMENTFLAG_WALK_MODE|MOVEMENTFLAG_ONTRANSPORT);
+ player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd());
}
void FlightPathMovementGenerator::Finalize(Player & player)
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 481569a9c7a..7adb9f4d24f 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -244,7 +244,7 @@ World::AddSession_ (WorldSession* s)
if(decrease_session)
--Sessions;
- if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER )
+ if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER && !HasRecentlyDisconnected(s) )
{
AddQueuedPlayer (s);
UpdateMaxSessionCounters ();
@@ -273,6 +273,26 @@ World::AddSession_ (WorldSession* s)
}
}
+bool World::HasRecentlyDisconnected(WorldSession* session)
+{
+ if(!session) return false;
+
+ if(uint32 tolerance = getConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
+ {
+ for(DisconnectMap::iterator i = m_disconnects.begin(); i != m_disconnects.end(); ++i)
+ {
+ if(difftime(i->second, time(NULL)) < tolerance)
+ {
+ if(i->first == session->GetAccountId())
+ return true;
+ }
+ else
+ m_disconnects.erase(i);
+ }
+ }
+ return false;
+ }
+
int32 World::GetQueuePos(WorldSession* sess)
{
uint32 position = 1;
@@ -536,6 +556,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_ADDON_CHANNEL] = sConfig.GetBoolDefault("AddonChannel", true);
m_configs[CONFIG_GRID_UNLOAD] = sConfig.GetBoolDefault("GridUnload", true);
m_configs[CONFIG_INTERVAL_SAVE] = sConfig.GetIntDefault("PlayerSaveInterval", 900000);
+ m_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfig.GetIntDefault("DisconnectToleranceInterval", 0);
m_configs[CONFIG_INTERVAL_GRIDCLEAN] = sConfig.GetIntDefault("GridCleanUpDelay", 300000);
if(m_configs[CONFIG_INTERVAL_GRIDCLEAN] < MIN_GRID_DELAY)
@@ -2871,7 +2892,8 @@ void World::UpdateSessions( time_t diff )
///- and remove not active sessions from the list
if(!itr->second->Update(diff)) // As interval = 0
{
- RemoveQueuedPlayer (itr->second);
+ if(!RemoveQueuedPlayer(itr->second) && itr->second && getConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))
+ m_disconnects[itr->second->GetAccountId()] = time(NULL);
delete itr->second;
m_sessions.erase(itr);
}
diff --git a/src/game/World.h b/src/game/World.h
index 590ca60b439..4848c87ca5f 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -80,6 +80,7 @@ enum WorldConfigs
CONFIG_INTERVAL_GRIDCLEAN,
CONFIG_INTERVAL_MAPUPDATE,
CONFIG_INTERVAL_CHANGEWEATHER,
+ CONFIG_INTERVAL_DISCONNECT_TOLERANCE,
CONFIG_PORT_WORLD,
CONFIG_SOCKET_SELECTTIME,
CONFIG_GROUP_XP_DISTANCE,
@@ -389,6 +390,7 @@ class World
void AddQueuedPlayer(WorldSession*);
bool RemoveQueuedPlayer(WorldSession* session);
int32 GetQueuePos(WorldSession*);
+ bool HasRecentlyDisconnected(WorldSession*);
uint32 GetQueueSize() const { return m_QueuedPlayer.size(); }
/// \todo Actions on m_allowMovement still to be implemented
@@ -547,6 +549,8 @@ class World
WeatherMap m_weathers;
typedef UNORDERED_MAP<uint32, WorldSession*> SessionMap;
SessionMap m_sessions;
+ typedef UNORDERED_MAP<uint32, time_t> DisconnectMap;
+ DisconnectMap m_disconnects;
uint32 m_maxActiveSessionCount;
uint32 m_maxQueuedSessionCount;
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index 1ceb1ec37df..552e87f34bf 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -127,6 +127,10 @@ EAIErrorLevel = 2
# Player save interval (in milliseconds)
# Default: 900000 (15 min)
#
+# DisconnectToleranceInterval
+# Tolerance for disconnected players before putting in the queue. (in seconds)
+# Default: 0 (disabled)
+#
# vmap.enableLOS
# vmap.enableHeight
# Enable/Disable VMmap support for line of sight and height calculation
@@ -184,6 +188,7 @@ GridCleanUpDelay = 300000
MapUpdateInterval = 100
ChangeWeatherInterval = 600000
PlayerSaveInterval = 900000
+DisconnectToleranceInterval = 0
vmap.enableLOS = 0
vmap.enableHeight = 0
vmap.ignoreMapIds = "369"