aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp75
-rw-r--r--src/bindings/scripts/include/sc_creature.h32
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp15
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp54
-rw-r--r--src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp4
-rw-r--r--src/game/Chat.cpp94
-rw-r--r--src/game/Chat.h5
-rw-r--r--src/game/InstanceData.cpp26
-rw-r--r--src/game/InstanceData.h27
-rw-r--r--src/game/Language.h9
-rw-r--r--src/game/Level1.cpp339
-rw-r--r--src/game/Level2.cpp355
-rw-r--r--src/game/Level3.cpp743
-rw-r--r--src/game/Pet.cpp99
-rw-r--r--src/game/Pet.h12
-rw-r--r--src/game/Player.cpp3
-rw-r--r--src/game/SpellMgr.cpp17
-rw-r--r--src/game/SpellMgr.h19
-rw-r--r--src/game/Unit.cpp38
-rw-r--r--src/game/World.cpp25
-rw-r--r--src/game/World.h1
31 files changed, 818 insertions, 1218 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index c1edc567457..6ab54b95428 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -84,29 +84,13 @@ ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), m_creature(cr
HeroicMode = m_creature->GetMap()->IsHeroic();
}
-void ScriptedAI::AttackStart(Unit* who, bool melee)
+void ScriptedAI::AttackStartNoMove(Unit* who)
{
if (!who)
return;
- if (m_creature->Attack(who, melee))
- {
- if(melee)
- DoStartMovement(who);
- else
- DoStartNoMovement(who);
- }
-}
-
-void ScriptedAI::AttackStart(Unit* who)
-{
- if (!who)
- return;
-
- if (m_creature->Attack(who, true))
- {
- DoStartMovement(who);
- }
+ if(m_creature->Attack(who, false))
+ DoStartNoMovement(who);
}
void ScriptedAI::UpdateAI(const uint32 diff)
@@ -650,6 +634,12 @@ void Scripted_NoMovementAI::AttackStart(Unit* who)
}
}
+BossAI::BossAI(Creature *c, uint32 id) : ScriptedAI(c)
+, bossId(id), summons(me), instance(c->GetInstanceData())
+, boundary(instance ? instance->GetBossBoundary(id) : NULL)
+{
+}
+
void BossAI::_Reset()
{
events.Reset();
@@ -673,6 +663,53 @@ void BossAI::_EnterCombat()
instance->SetBossState(bossId, IN_PROGRESS);
}
+bool BossAI::CheckBoundary(Unit *who)
+{
+ if(!boundary || !who)
+ return true;
+
+ for(BossBoundaryMap::const_iterator itr = boundary->begin(); itr != boundary->end(); ++itr)
+ {
+ switch(itr->first)
+ {
+ case BOUNDARY_N:
+ if(me->GetPositionX() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_S:
+ if(me->GetPositionX() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_E:
+ if(me->GetPositionY() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_W:
+ if(me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_NW:
+ if(me->GetPositionX() + me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_SE:
+ if(me->GetPositionX() + me->GetPositionY() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_NE:
+ if(me->GetPositionX() - me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_SW:
+ if(me->GetPositionX() - me->GetPositionY() < itr->second)
+ return false;
+ break;
+ }
+ }
+
+ return true;
+}
+
void BossAI::JustSummoned(Creature *summon)
{
summons.Summon(summon);
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index 80016619e8b..dc1b8f6144f 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -11,6 +11,7 @@
#include "Creature.h"
#include "CreatureAI.h"
#include "CreatureAIImpl.h"
+#include "InstanceData.h"
class ScriptedInstance;
@@ -55,9 +56,7 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//CreatureAI Functions
//*************
- //Called at each attack of m_creature by any victim
- void AttackStart(Unit *);
- void AttackStart(Unit *, bool melee);
+ void AttackStartNoMove(Unit *target);
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit *done_by, uint32 &damage) {}
@@ -204,27 +203,36 @@ struct TRINITY_DLL_DECL Scripted_NoMovementAI : public ScriptedAI
struct TRINITY_DLL_DECL BossAI : public ScriptedAI
{
- BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id)
- , summons(me), instance(c->GetInstanceData())
- {}
+ BossAI(Creature *c, uint32 id);
- uint32 bossId;
+ const uint32 bossId;
EventMap events;
SummonList summons;
- InstanceData *instance;
+ InstanceData * const instance;
+ const BossBoundaryMap * const boundary;
void JustSummoned(Creature *summon);
void SummonedCreatureDespawn(Creature *summon);
void UpdateAI(const uint32 diff) = 0;
- void _Reset();
- void _EnterCombat();
- void _JustDied();
-
void Reset() { _Reset(); }
void EnterCombat(Unit *who) { _EnterCombat(); }
void JustDied(Unit *killer) { _JustDied(); }
+
+ protected:
+ void _Reset();
+ void _EnterCombat();
+ void _JustDied();
+
+ bool CheckInRoom()
+ {
+ if(CheckBoundary(me))
+ return true;
+ EnterEvadeMode();
+ return false;
+ }
+ bool CheckBoundary(Unit *who);
};
#endif
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 68431cb81ee..855dd7f0d05 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -441,9 +441,9 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
return;
if(Phase == PHASE_FLIGHT || Phase == PHASE_DEMON)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit *who) {}
@@ -1415,16 +1415,16 @@ struct TRINITY_DLL_DECL boss_maievAI : public ScriptedAI
return;
if(Phase == PHASE_TALK_SEQUENCE)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else if(Phase == PHASE_DEMON || Phase == PHASE_TRANSFORM_SEQUENCE )
{
GETUNIT(Illidan, IllidanGUID);
if(Illidan && m_creature->IsWithinDistInMap(Illidan, 25))
BlinkToPlayer();//Do not let dread aura hurt her.
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
}
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DoAction(const int32 param)
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
index bb7e1a2c29e..46e08c40432 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
@@ -339,7 +339,7 @@ struct TRINITY_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
summoned->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
summoned->SetSpeed(MOVE_FLIGHT, 2.5);
if(victim)
- ((ScriptedAI*)summoned->AI())->AttackStart(victim,false);
+ AttackStartNoMove(victim);
}
else if(victim)
summoned->AI()->AttackStart(victim);
@@ -349,7 +349,7 @@ struct TRINITY_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
{
if(sentryDown)
{
- AttackStart(killer, false);
+ AttackStartNoMove(killer);
sentryDown = false;
}
else
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
index c675c8d7c27..476141dfa57 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
@@ -77,7 +77,7 @@ struct TRINITY_DLL_DECL boss_anubrekhanAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if(!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
index 7ac92252383..3e44b1c1f6e 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
@@ -99,7 +99,7 @@ struct TRINITY_DLL_DECL boss_gluthAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictimWithGaze())
+ if(!UpdateVictimWithGaze() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
index 90b82679c68..dad6fc9e0ee 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
@@ -202,7 +202,7 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictimByReact())
+ if(!UpdateVictimByReact() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
index 0302a93c488..06fdec15206 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
@@ -95,7 +95,7 @@ struct TRINITY_DLL_DECL boss_heiganAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if(!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
index 1f7b1a55daa..3299ab85c42 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
@@ -128,19 +128,8 @@ struct TRINITY_DLL_DECL boss_nothAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(me->HasReactState(REACT_AGGRESSIVE)) // ground
- {
- if(!UpdateVictim())
- return;
- }
- else // balcony
- {
- if(me->getThreatManager().isThreatListEmpty()) // if no enemy, go back at once
- {
- events.Reset();
- events.ScheduleEvent(EVENT_GROUND, 0);
- }
- }
+ if(!UpdateVictimByReact() || !CheckInRoom())
+ return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
index 71259df7824..dce3c974f47 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
@@ -171,13 +171,13 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI
if(!phase)
return;
+ if(!UpdateVictimByReact() || !CheckInRoom())
+ return;
+
events.Update(diff);
if(phase == PHASE_GROUND)
{
- if(!UpdateVictim())
- return;
-
while(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
@@ -224,12 +224,6 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI
}
else
{
- /*if(me->getThreatManager().isThreatListEmpty())
- {
- EnterEvadeMode();
- return;
- }*/
-
if(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
index 92f6180045a..d9a2c80064d 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
@@ -19,29 +19,29 @@
const DoorData doorData[] =
{
- {181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM},
- {181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE},
- {194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
- {181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
- {181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM},
- {181200, BOSS_NOTH, DOOR_TYPE_ROOM},
- {181201, BOSS_NOTH, DOOR_TYPE_PASSAGE},
- {181202, BOSS_NOTH, DOOR_TYPE_PASSAGE},
- {181202, BOSS_HEIGAN, DOOR_TYPE_ROOM},
- {181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
- {181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
- {181241, BOSS_LOATHEB, DOOR_TYPE_ROOM},
- {181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE},
- {181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM},
- {181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
- {181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
- {181121, BOSS_THADDIUS, DOOR_TYPE_ROOM},
- {181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE},
- {181124, BOSS_GOTHIK, DOOR_TYPE_ROOM},
- {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
- {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
- {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM},
- {0, 0, DOOR_TYPE_ROOM}, // EOF
+ {181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM, BOUNDARY_S},
+ {181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE, 0},
+ {194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
+ {181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
+ {181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM, BOUNDARY_SW},
+ {181200, BOSS_NOTH, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181201, BOSS_NOTH, DOOR_TYPE_PASSAGE, BOUNDARY_E},
+ {181202, BOSS_NOTH, DOOR_TYPE_PASSAGE, 0},
+ {181202, BOSS_HEIGAN, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, BOUNDARY_E},
+ {181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, 0},
+ {181241, BOSS_LOATHEB, DOOR_TYPE_ROOM, BOUNDARY_W},
+ {181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE, 0},
+ {181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM, 0},
+ {181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE, BOUNDARY_NW},
+ {181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE, 0},
+ {181121, BOSS_THADDIUS, DOOR_TYPE_ROOM, 0},
+ {181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE, 0},
+ {181124, BOSS_GOTHIK, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_S},
+ {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0},
+ {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE},
+ {0, 0, DOOR_TYPE_ROOM, 0}, // EOF
};
const MinionData minionData[] =
@@ -68,10 +68,10 @@ const float HeiganEruptionSlope[3] =
(-3637 - HeiganPos[1]) /(2771 - HeiganPos[0]),
};
-// 0 H O-->x
-// 1 |
-// 2 V
-// 3 y
+// 0 H x
+// 1 ^
+// 2 |
+// 3 y<--o
inline uint32 GetEruptionSection(float x, float y)
{
y -= HeiganPos[1];
diff --git a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
index e346b9c25fc..fe57e99c035 100644
--- a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
+++ b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
@@ -94,7 +94,7 @@ bool GossipSelect_npc_raliq_the_drunk(Player *player, Creature *_Creature, uint3
{
player->CLOSE_GOSSIP_MENU();
_Creature->setFaction(FACTION_HOSTILE_RD);
- ((npc_raliq_the_drunkAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
return true;
}
@@ -158,7 +158,7 @@ bool GossipHello_npc_salsalabim(Player *player, Creature *_Creature)
if( player->GetQuestStatus(QUEST_10004) == QUEST_STATUS_INCOMPLETE )
{
_Creature->setFaction(FACTION_HOSTILE_SA);
- ((npc_salsalabimAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
else
{
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
index dfeb7fea3e6..5f1d92beaf1 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
@@ -150,9 +150,9 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
void AttackStart(Unit* who)
{
if(Phase1)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DamageTaken(Unit* pKiller, uint32 &damage)
diff --git a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
index df3fe6dd0fe..6fdb4421b94 100644
--- a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
+++ b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
@@ -173,7 +173,7 @@ bool GossipSelect_npc_cooshcoosh(Player *player, Creature *_Creature, uint32 sen
{
player->CLOSE_GOSSIP_MENU();
_Creature->setFaction(FACTION_HOSTILE_CO);
- ((npc_cooshcooshAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
return true;
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index c58ff08c94e..c342b8283d5 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -258,9 +258,9 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
void AttackStart(Unit *who)
{
if(Phase == 2)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DoMeleeAttackIfReady()
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 4bd3c699345..9fe252154ed 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -495,13 +495,13 @@ ChatCommand * ChatHandler::getCommandTable()
static ChatCommand resetCommandTable[] =
{
- { "achievements", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAchievementsCommand, "", NULL },
- { "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL },
- { "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL },
- { "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL },
- { "stats", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetStatsCommand, "", NULL },
- { "talents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetTalentsCommand, "", NULL },
- { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAllCommand, "", NULL },
+ { "achievements", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetAchievementsCommand, "", NULL },
+ { "honor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetHonorCommand, "", NULL },
+ { "level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetLevelCommand, "", NULL },
+ { "spells", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetSpellsCommand, "", NULL },
+ { "stats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetStatsCommand, "", NULL },
+ { "talents", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetTalentsCommand, "", NULL },
+ { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetAllCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -634,7 +634,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable },
{ "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
{ "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
- { "reset", SEC_ADMINISTRATOR, false, NULL, "", resetCommandTable },
+ { "reset", SEC_ADMINISTRATOR, true, NULL, "", resetCommandTable },
{ "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
{ "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable },
@@ -680,7 +680,6 @@ ChatCommand * ChatHandler::getCommandTable()
{ "neargrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearGraveCommand, "", NULL },
{ "explorecheat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleExploreCheatCommand, "", NULL },
{ "hover", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHoverCommand, "", NULL },
- { "waterwalk", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWaterwalkCommand, "", NULL },
{ "levelup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLevelUpCommand, "", NULL },
{ "showarea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleShowAreaCommand, "", NULL },
{ "hidearea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHideAreaCommand, "", NULL },
@@ -702,7 +701,9 @@ ChatCommand * ChatHandler::getCommandTable()
{ "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL },
{ "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL },
{ "flusharenapoints",SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
- { "repairitems", SEC_GAMEMASTER, false, &ChatHandler::HandleRepairitemsCommand, "", NULL },
+ { "repairitems", SEC_GAMEMASTER, true, &ChatHandler::HandleRepairitemsCommand, "", NULL },
+ { "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL },
+
{ "freeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFreezeCommand, "", NULL },
{ "unfreeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnFreezeCommand, "", NULL },
{ "listfreeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListFreezeCommand, "", NULL },
@@ -1315,7 +1316,7 @@ char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** s
*something1 = strtok(NULL, ":|"); // extract something
strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces
- strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
+ strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
return cKey;
}
@@ -1593,6 +1594,77 @@ std::string ChatHandler::extractPlayerNameFromLink(char* text)
return name;
}
+bool ChatHandler::extractPlayerTarget(char* args, Player** player, uint64* player_guid /*=NULL*/,std::string* player_name /*= NULL*/)
+{
+ if (args && *args)
+ {
+ std::string name = extractPlayerNameFromLink(args);
+ if (name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* pl = objmgr.GetPlayer(name.c_str());
+
+ // if allowed player pointer
+ if(player)
+ *player = pl;
+
+ // if need guid value from DB (in name case for check player existence)
+ uint64 guid = !pl && (player_guid || player_name) ? objmgr.GetPlayerGUIDByName(name) : 0;
+
+ // if allowed player guid (if no then only online players allowed)
+ if(player_guid)
+ *player_guid = pl ? pl->GetGUID() : guid;
+
+ if(player_name)
+ *player_name = pl || guid ? name : "";
+ }
+ else
+ {
+ Player* pl = getSelectedPlayer();
+ // if allowed player pointer
+ if(player)
+ *player = pl;
+ // if allowed player guid (if no then only online players allowed)
+ if(player_guid)
+ *player_guid = pl ? pl->GetGUID() : 0;
+
+ if(player_name)
+ *player_name = pl ? pl->GetName() : "";
+ }
+
+ // some from req. data must be provided (note: name is empty if player not exist)
+ if((!player || !*player) && (!player_guid || !*player_guid) && (!player_name || player_name->empty()))
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+}
+
+void ChatHandler::extractOptFirstArg(char* args, char** arg1, char** arg2)
+{
+ char* p1 = strtok(args, " ");
+ char* p2 = strtok(NULL, " ");
+
+ if(!p2)
+ {
+ p2 = p1;
+ p1 = NULL;
+ }
+
+ if(arg1)
+ *arg1 = p1;
+
+ if(arg2)
+ *arg2 = p2;
+}
+
bool ChatHandler::needReportToTarget(Player* chr) const
{
Player* pl = m_session->GetPlayer();
diff --git a/src/game/Chat.h b/src/game/Chat.h
index 97570d2f250..fe0e197ee4b 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -560,11 +560,16 @@ class ChatHandler
char* extractKeyFromLink(char* text, char const* linkType, char** something1 = NULL);
char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL);
+ // if args have single value then it return in arg2 and arg1 == NULL
+ void extractOptFirstArg(char* args, char** arg1, char** arg2);
+
uint32 extractSpellIdFromLink(char* text);
uint64 extractGuidFromLink(char* text);
GameTele const* extractGameTeleFromLink(char* text);
bool GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline = false);
std::string extractPlayerNameFromLink(char* text);
+ // select by arg (name/link) or in-game selection online/offline player
+ bool extractPlayerTarget(char* args, Player** player, uint64* player_guid = NULL, std::string* player_name = NULL);
std::string playerLink(std::string const& name) const { return m_session ? "|cffffffff|Hplayer:"+name+"|h["+name+"]|h|r" : name; }
virtual std::string GetNameLink() const { return GetNameLink(m_session->GetPlayer()); }
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp
index 1eff6ba3efe..fcc708e274c 100644
--- a/src/game/InstanceData.cpp
+++ b/src/game/InstanceData.cpp
@@ -76,7 +76,7 @@ void InstanceData::LoadDoorData(const DoorData *data)
while(data->entry)
{
if(data->bossId < bosses.size())
- doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type)));
+ doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type, BoundaryType(data->boundary))));
++data;
}
@@ -143,7 +143,31 @@ void InstanceData::AddDoor(GameObject *door, bool add)
for(DoorInfoMap::iterator itr = lower; itr != upper; ++itr)
{
if(add)
+ {
itr->second.bossInfo->door[itr->second.type].insert(door);
+ switch(itr->second.boundary)
+ {
+ default:
+ case BOUNDARY_NONE:
+ break;
+ case BOUNDARY_N:
+ case BOUNDARY_S:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX();
+ break;
+ case BOUNDARY_E:
+ case BOUNDARY_W:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionY();
+ break;
+ case BOUNDARY_NW:
+ case BOUNDARY_SE:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX() + door->GetPositionY();
+ break;
+ case BOUNDARY_NE:
+ case BOUNDARY_SW:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX() - door->GetPositionY();
+ break;
+ }
+ }
else
itr->second.bossInfo->door[itr->second.type].erase(door);
}
diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h
index 9f7d4521fd1..43042a7f914 100644
--- a/src/game/InstanceData.h
+++ b/src/game/InstanceData.h
@@ -51,10 +51,30 @@ enum DoorType
MAX_DOOR_TYPES,
};
+enum BoundaryType
+{
+ BOUNDARY_NONE = 0,
+ BOUNDARY_N,
+ BOUNDARY_S,
+ BOUNDARY_E,
+ BOUNDARY_W,
+ BOUNDARY_NE,
+ BOUNDARY_NW,
+ BOUNDARY_SE,
+ BOUNDARY_SW,
+ BOUNDARY_MAX_X = BOUNDARY_N,
+ BOUNDARY_MIN_X = BOUNDARY_S,
+ BOUNDARY_MAX_Y = BOUNDARY_W,
+ BOUNDARY_MIN_Y = BOUNDARY_E,
+};
+
+typedef std::map<BoundaryType, float> BossBoundaryMap;
+
struct DoorData
{
uint32 entry, bossId;
DoorType type;
+ uint32 boundary;
};
struct MinionData
@@ -68,14 +88,16 @@ struct BossInfo
EncounterState state;
DoorSet door[MAX_DOOR_TYPES];
MinionSet minion;
+ BossBoundaryMap boundary;
};
struct DoorInfo
{
- explicit DoorInfo(BossInfo *_bossInfo, DoorType _type)
- : bossInfo(_bossInfo), type(_type) {}
+ explicit DoorInfo(BossInfo *_bossInfo, DoorType _type, BoundaryType _boundary)
+ : bossInfo(_bossInfo), type(_type), boundary(_boundary) {}
BossInfo *bossInfo;
DoorType type;
+ BoundaryType boundary;
};
struct MinionInfo
@@ -137,6 +159,7 @@ class TRINITY_DLL_SPEC InstanceData
void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL);
virtual void SetBossState(uint32 id, EncounterState state);
+ const BossBoundaryMap * GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
protected:
void SetBossNumber(uint32 number) { bosses.resize(number); }
void LoadDoorData(const DoorData *data);
diff --git a/src/game/Language.h b/src/game/Language.h
index 8bc01a7deea..2b063999951 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -96,7 +96,6 @@ enum TrinityStrings
LANG_CANNOT_GO_TO_INST_GM = 105,
LANG_CANNOT_GO_INST_INST = 106,
LANG_CANNOT_SUMMON_INST_INST = 107,
-
LANG_SUMMONING = 108,
LANG_SUMMONED_BY = 109,
LANG_TELEPORTING_TO = 110,
@@ -104,7 +103,6 @@ enum TrinityStrings
LANG_NO_PLAYER = 112,
LANG_APPEARING_AT = 113,
LANG_APPEARING_TO = 114,
-
LANG_BAD_VALUE = 115,
LANG_NO_CHAR_SELECTED = 116,
LANG_NOT_IN_GROUP = 117,
@@ -169,7 +167,7 @@ enum TrinityStrings
LANG_MAIL_SENT = 169,
LANG_SOUND_NOT_EXIST = 170,
- LANG_TELEPORTED_TO_BY_CONSOLE = 171,
+ LANG_CANT_TELEPORT_SELF = 171,
LANG_CONSOLE_COMMAND = 172,
LANG_YOU_CHANGE_RUNIC_POWER = 173,
LANG_YOURS_RUNIC_POWER_CHANGED = 174,
@@ -268,7 +266,7 @@ enum TrinityStrings
LANG_COMMAND_ADDVENDORITEMITEMS = 280,
LANG_COMMAND_KICKSELF = 281,
LANG_COMMAND_KICKMESSAGE = 282,
- LANG_COMMAND_KICKNOTFOUNDPLAYER = 283,
+ // 283, not used
LANG_COMMAND_WHISPERACCEPTING = 284,
LANG_COMMAND_WHISPERON = 285,
LANG_COMMAND_WHISPEROFF = 286,
@@ -855,7 +853,8 @@ enum TrinityStrings
//LANG_INSTANCE_NOT_AS_GHOST = 5008,
LANG_COMMAND_PLAYED_TO_ALL = 5009,
LANG_NPCINFO_LINKGUID = 5010,
- // Room for more Trinity strings 5011-9999
+ LANG_TELEPORTED_TO_BY_CONSOLE = 5011,
+ // Room for more Trinity strings 5012-9999
// Used for GM Announcements
LANG_GM_BROADCAST = 6613,
LANG_GM_NOTIFY = 6614,
diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp
index 45137c5b214..f9917a4e597 100644
--- a/src/game/Level1.cpp
+++ b/src/game/Level1.cpp
@@ -751,26 +751,28 @@ bool ChatHandler::HandleGPSCommand(const char* args)
//Summon Player
bool ChatHandler::HandleNamegoCommand(const char* args)
{
- if(!*args)
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if (!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
+ Player* _player = m_session->GetPlayer();
+ if (target == _player || target_guid == _player->GetGUID())
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ PSendSysMessage(LANG_CANT_TELEPORT_SELF);
SetSentErrorMessage(true);
return false;
}
- Player *chr = objmgr.GetPlayer(name.c_str());
- if (chr)
+ if (target)
{
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
// check online security
- if (HasLowerSecurity(chr, 0))
+ if (HasLowerSecurity(target, 0))
return false;
- if(chr->IsBeingTeleported())
+ if (target->IsBeingTeleported())
{
PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str());
SetSentErrorMessage(true);
@@ -779,32 +781,32 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
Map* pMap = m_session->GetPlayer()->GetMap();
- if(pMap->IsBattleGroundOrArena())
+ if (pMap->IsBattleGroundOrArena())
{
// only allow if gm mode is on
- if (!chr->isGameMaster())
+ if (!target->isGameMaster())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str());
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
// if both players are in different bgs
- else if (chr->GetBattleGroundId() && m_session->GetPlayer()->GetBattleGroundId() != chr->GetBattleGroundId())
+ else if (target->GetBattleGroundId() && m_session->GetPlayer()->GetBattleGroundId() != target->GetBattleGroundId())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG, nameLink.c_str());
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
- chr->SetBattleGroundId(m_session->GetPlayer()->GetBattleGroundId(), m_session->GetPlayer()->GetBattleGroundTypeId());
+ target->SetBattleGroundId(m_session->GetPlayer()->GetBattleGroundId(), m_session->GetPlayer()->GetBattleGroundTypeId());
// remember current position as entry point for return at bg end teleportation
- chr->SetBattleGroundEntryPoint(chr->GetMapId(),chr->GetPositionX(),chr->GetPositionY(),chr->GetPositionZ(),chr->GetOrientation());
+ target->SetBattleGroundEntryPoint(target->GetMapId(),target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),target->GetOrientation());
}
- else if(pMap->IsDungeon())
+ else if (pMap->IsDungeon())
{
- Map* cMap = chr->GetMap();
- if( cMap->Instanceable() && cMap->GetInstanceId() != pMap->GetInstanceId() )
+ Map* cMap = target->GetMap();
+ if (cMap->Instanceable() && cMap->GetInstanceId() != pMap->GetInstanceId())
{
// cannot summon from instance to instance
PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,nameLink.c_str());
@@ -813,9 +815,9 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
}
// we are in instance, and can summon only player in our group with us as lead
- if ( !m_session->GetPlayer()->GetGroup() || !chr->GetGroup() ||
- (chr->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) ||
- (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) )
+ if (!m_session->GetPlayer()->GetGroup() || !target->GetGroup() ||
+ (target->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) ||
+ (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()))
// the last check is a bit excessive, but let it be, just in case
{
PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,nameLink.c_str());
@@ -825,31 +827,31 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
}
PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),"");
- if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, GetNameLink().c_str());
+ if (needReportToTarget(target))
+ ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, nameLink.c_str());
// stop flight if need
- if(chr->isInFlight())
+ if (target->isInFlight())
{
- chr->GetMotionMaster()->MovementExpired();
- chr->m_taxi.ClearTaxiDestinations();
+ target->GetMotionMaster()->MovementExpired();
+ target->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
- chr->SaveRecallPosition();
+ target->SaveRecallPosition();
// before GM
float x,y,z;
- m_session->GetPlayer()->GetClosePoint(x,y,z,chr->GetObjectSize());
- chr->TeleportTo(m_session->GetPlayer()->GetMapId(),x,y,z,chr->GetOrientation());
+ m_session->GetPlayer()->GetClosePoint(x,y,z,target->GetObjectSize());
+ target->TeleportTo(m_session->GetPlayer()->GetMapId(),x,y,z,target->GetOrientation());
}
- else if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
+ else
{
// check offline security
- if (HasLowerSecurity(NULL, guid))
+ if (HasLowerSecurity(NULL, target_guid))
return false;
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),GetTrinityString(LANG_OFFLINE));
@@ -860,12 +862,7 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
m_session->GetPlayer()->GetPositionZ(),
m_session->GetPlayer()->GetOrientation(),
m_session->GetPlayer()->GetZoneId(),
- guid);
- }
- else
- {
- PSendSysMessage(LANG_NO_PLAYER, args);
- SetSentErrorMessage(true);
+ target_guid);
}
return true;
@@ -874,30 +871,31 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
//Teleport to Player
bool ChatHandler::HandleGonameCommand(const char* args)
{
- if(!*args)
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if (!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
Player* _player = m_session->GetPlayer();
-
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
+ if (target == _player || target_guid == _player->GetGUID())
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SendSysMessage(LANG_CANT_TELEPORT_SELF);
SetSentErrorMessage(true);
return false;
}
- Player *chr = objmgr.GetPlayer(name.c_str());
- if (chr)
+
+ if (target)
{
// check online security
- if (HasLowerSecurity(chr, 0))
+ if (HasLowerSecurity(target, 0))
return false;
- std::string chrNameLink = playerLink(name);
+ std::string chrNameLink = playerLink(target_name);
- Map* cMap = chr->GetMap();
- if(cMap->IsBattleGroundOrArena())
+ Map* cMap = target->GetMap();
+ if (cMap->IsBattleGroundOrArena())
{
// only allow if gm mode is on
if (!_player->isGameMaster())
@@ -907,7 +905,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
return false;
}
// if both players are in different bgs
- else if (_player->GetBattleGroundId() && _player->GetBattleGroundId() != chr->GetBattleGroundId())
+ else if (_player->GetBattleGroundId() && _player->GetBattleGroundId() != target->GetBattleGroundId())
{
PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,chrNameLink.c_str());
SetSentErrorMessage(true);
@@ -915,7 +913,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
}
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
- _player->SetBattleGroundId(chr->GetBattleGroundId(), chr->GetBattleGroundTypeId());
+ _player->SetBattleGroundId(target->GetBattleGroundId(), target->GetBattleGroundTypeId());
// remember current position as entry point for return at bg end teleportation
_player->SetBattleGroundEntryPoint(_player->GetMapId(),_player->GetPositionX(),_player->GetPositionY(),_player->GetPositionZ(),_player->GetOrientation());
}
@@ -929,7 +927,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
if (_player->GetGroup())
{
// we are in group, we can go only if we are in the player group
- if (_player->GetGroup() != chr->GetGroup())
+ if (_player->GetGroup() != target->GetGroup())
{
PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY,chrNameLink.c_str());
SetSentErrorMessage(true);
@@ -949,28 +947,27 @@ bool ChatHandler::HandleGonameCommand(const char* args)
// if the player or the player's group is bound to another instance
// the player will not be bound to another one
- InstancePlayerBind *pBind = _player->GetBoundInstance(chr->GetMapId(), chr->GetDifficulty());
- if(!pBind)
+ InstancePlayerBind *pBind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty());
+ if (!pBind)
{
Group *group = _player->GetGroup();
- InstanceGroupBind *gBind = group ? group->GetBoundInstance(chr->GetMapId(), chr->GetDifficulty()) : NULL;
- if(!gBind)
- {
- // if no bind exists, create a solo bind
- InstanceSave *save = sInstanceSaveManager.GetInstanceSave(chr->GetInstanceId());
- if(save) _player->BindToInstance(save, !save->CanReset());
- }
+ // if no bind exists, create a solo bind
+ InstanceGroupBind *gBind = group ? group->GetBoundInstance(target->GetMapId(), target->GetDifficulty()) : NULL;
+ // if no bind exists, create a solo bind
+ if (!gBind)
+ if (InstanceSave *save = sInstanceSaveManager.GetInstanceSave(target->GetInstanceId()))
+ _player->BindToInstance(save, !save->CanReset());
}
- _player->SetDifficulty(chr->GetDifficulty());
+ _player->SetDifficulty(target->GetDifficulty());
}
PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str());
- if (_player->IsVisibleGloballyFor(chr))
- ChatHandler(chr).PSendSysMessage(LANG_APPEARING_TO, GetNameLink().c_str());
+ if (needReportToTarget(target))
+ ChatHandler(target).PSendSysMessage(LANG_APPEARING_TO, GetNameLink().c_str());
// stop flight if need
- if(_player->isInFlight())
+ if (_player->isInFlight())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
@@ -981,20 +978,17 @@ bool ChatHandler::HandleGonameCommand(const char* args)
// to point to see at target with same orientation
float x,y,z;
- chr->GetContactPoint(m_session->GetPlayer(),x,y,z);
-
- _player->TeleportTo(chr->GetMapId(), x, y, z, _player->GetAngle( chr ), TELE_TO_GM_MODE);
+ target->GetContactPoint(_player,x,y,z);
- return true;
+ _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE);
}
-
- if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
+ else
{
// check offline security
- if (HasLowerSecurity(NULL, guid))
+ if (HasLowerSecurity(NULL, target_guid))
return false;
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str());
@@ -1002,83 +996,51 @@ bool ChatHandler::HandleGonameCommand(const char* args)
float x,y,z,o;
uint32 map;
bool in_flight;
- if(Player::LoadPositionFromDB(map,x,y,z,o,in_flight,guid))
- {
- // stop flight if need
- if(_player->isInFlight())
- {
- _player->GetMotionMaster()->MovementExpired();
- _player->m_taxi.ClearTaxiDestinations();
- }
- // save only in non-flight case
- else
- _player->SaveRecallPosition();
+ if (!Player::LoadPositionFromDB(map,x,y,z,o,in_flight,target_guid))
+ return false;
- _player->TeleportTo(map, x, y, z,_player->GetOrientation());
- return true;
+ // stop flight if need
+ if (_player->isInFlight())
+ {
+ _player->GetMotionMaster()->MovementExpired();
+ _player->m_taxi.ClearTaxiDestinations();
}
- }
+ // save only in non-flight case
+ else
+ _player->SaveRecallPosition();
- PSendSysMessage(LANG_NO_PLAYER, args);
+ _player->TeleportTo(map, x, y, z,_player->GetOrientation());
+ }
- SetSentErrorMessage(true);
- return false;
+ return true;
}
// Teleport player to last position
bool ChatHandler::HandleRecallCommand(const char* args)
{
- Player* chr = NULL;
-
- if(!*args)
- {
- chr = getSelectedPlayer();
- if(!chr)
- chr = m_session->GetPlayer();
-
- // check online security
- else if (HasLowerSecurity(chr, 0))
- return false;
- }
- else
- {
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- chr = objmgr.GetPlayer(name.c_str());
-
- if(!chr)
- {
- PSendSysMessage(LANG_NO_PLAYER, args);
- SetSentErrorMessage(true);
- return false;
- }
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
+ return false;
- // check online security
- if (HasLowerSecurity(chr, 0))
- return false;
- }
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
- if(chr->IsBeingTeleported())
+ if (target->IsBeingTeleported())
{
- PSendSysMessage(LANG_IS_TELEPORTED, GetNameLink(chr).c_str());
+ PSendSysMessage(LANG_IS_TELEPORTED, GetNameLink(target).c_str());
SetSentErrorMessage(true);
return false;
}
// stop flight if need
- if(chr->isInFlight())
+ if(target->isInFlight())
{
- chr->GetMotionMaster()->MovementExpired();
- chr->m_taxi.ClearTaxiDestinations();
+ target->GetMotionMaster()->MovementExpired();
+ target->m_taxi.ClearTaxiDestinations();
}
- chr->TeleportTo(chr->m_recallMap, chr->m_recallX, chr->m_recallY, chr->m_recallZ, chr->m_recallO);
+ target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO);
return true;
}
@@ -2407,18 +2369,12 @@ bool ChatHandler::HandleSaveAllCommand(const char* /*args*/)
//Send mail by command
bool ChatHandler::HandleSendMailCommand(const char* args)
{
- if(!*args)
- return false;
-
// format: name "subject text" "mail text"
-
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- }
char* tail1 = strtok(NULL, "");
if(!tail1)
@@ -2460,14 +2416,6 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
std::string subject = msgSubject;
std::string text = msgText;
- uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
- if(!receiver_guid)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -2475,11 +2423,9 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
uint32 stationery = MAIL_STATIONERY_GM;
uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0;
- Player *receiver = objmgr.GetPlayer(receiver_guid);
-
- WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE);
+ WorldSession::SendMailTo(target,messagetype, stationery, sender_guidlo, GUID_LOPART(target_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -2487,23 +2433,20 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
// teleport player to given game_tele.entry
bool ChatHandler::HandleTeleNameCommand(const char * args)
{
- if(!*args)
- return false;
-
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ char* nameStr;
+ char* teleStr;
+ extractOptFirstArg((char*)args,&nameStr,&teleStr);
+ if(!teleStr)
return false;
- }
-
- char* tail = strtok(NULL, "");
- if(!tail)
+
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(teleStr,&target,&target_guid,&target_name))
return false;
// id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
- GameTele const* tele = extractGameTeleFromLink(tail);
+ GameTele const* tele = extractGameTeleFromLink(teleStr);
if(!tele)
{
SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
@@ -2511,7 +2454,7 @@ bool ChatHandler::HandleTeleNameCommand(const char * args)
return false;
}
- MapEntry const * me = sMapStore.LookupEntry(tele->mapId);
+/* MapEntry const * me = sMapStore.LookupEntry(tele->mapId);
if(!me || me->IsBattleGroundOrArena())
{
SendSysMessage(LANG_CANNOT_TELE_TO_BG);
@@ -2519,16 +2462,17 @@ bool ChatHandler::HandleTeleNameCommand(const char * args)
return false;
}
- Player *chr = objmgr.GetPlayer(name.c_str());
- if (chr)
+ Player *chr = objmgr.GetPlayer(name.c_str());*/
+
+ if (target)
{
// check online security
- if (HasLowerSecurity(chr, 0))
+ if (HasLowerSecurity(target, 0))
return false;
- std::string chrNameLink = playerLink(name);
+ std::string chrNameLink = playerLink(target_name);
- if(chr->IsBeingTeleported()==true)
+ if(target->IsBeingTeleported()==true)
{
PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str());
SetSentErrorMessage(true);
@@ -2536,35 +2480,33 @@ bool ChatHandler::HandleTeleNameCommand(const char * args)
}
PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(),"", tele->name.c_str());
- if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetNameLink().c_str());
+ if (needReportToTarget(target))
+ ChatHandler(target).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetNameLink().c_str());
// stop flight if need
- if(chr->isInFlight())
+ if(target->isInFlight())
{
- chr->GetMotionMaster()->MovementExpired();
- chr->m_taxi.ClearTaxiDestinations();
+ target->GetMotionMaster()->MovementExpired();
+ target->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
- chr->SaveRecallPosition();
+ target->SaveRecallPosition();
- chr->TeleportTo(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation);
+ target->TeleportTo(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation);
}
- else if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
+ else
{
// check offline security
- if (HasLowerSecurity(NULL, guid))
+ if (HasLowerSecurity(NULL, target_guid))
return false;
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), GetMangosString(LANG_OFFLINE), tele->name.c_str());
Player::SavePositionInDB(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation,
- MapManager::Instance().GetZoneId(tele->mapId,tele->position_x,tele->position_y,tele->position_z),guid);
+ MapManager::Instance().GetZoneId(tele->mapId,tele->position_x,tele->position_y,tele->position_z),target_guid);
}
- else
- PSendSysMessage(LANG_NO_PLAYER, name.c_str());
return true;
}
@@ -2656,32 +2598,17 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args)
//Summon group of player
bool ChatHandler::HandleGroupgoCommand(const char* args)
{
- if(!*args)
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
return false;
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- Player *player = objmgr.GetPlayer(name.c_str());
- if (!player)
- {
- PSendSysMessage(LANG_NO_PLAYER, args);
- SetSentErrorMessage(true);
- return false;
- }
-
// check online security
- if (HasLowerSecurity(player, 0))
+ if (HasLowerSecurity(target, 0))
return false;
- Group *grp = player->GetGroup();
+ Group *grp = target->GetGroup();
- std::string nameLink = playerLink(name);
+ std::string nameLink = GetNameLink(target);
if(!grp)
{
@@ -2715,7 +2642,7 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
if (HasLowerSecurity(pl, 0))
return false;
- std::string plNameLink = playerLink(pl->GetName());
+ std::string plNameLink = GetNameLink(pl);
if(pl->IsBeingTeleported()==true)
{
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index f08ef8aa40d..212b5eaf98e 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -56,104 +56,89 @@ static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] =
//mute player for some times
bool ChatHandler::HandleMuteCommand(const char* args)
{
- if (!*args)
+ char* nameStr;
+ char* delayStr;
+ extractOptFirstArg((char*)args,&nameStr,&delayStr);
+ if(!delayStr)
return false;
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
return false;
- }
- char *timetonotspeak = strtok(NULL, " ");
- if(!timetonotspeak)
- return false;
+ uint32 account_id = target ? target->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(target_guid);
- uint32 notspeaktime = (uint32) atoi(timetonotspeak);
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
- if(!guid)
+ // find only player from same account if any
+ if(!target)
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
+ if(WorldSession* session = sWorld.FindSession(account_id))
+ target = session->GetPlayer();
}
- Player *chr = objmgr.GetPlayer(guid);
+ uint32 notspeaktime = (uint32) atoi(delayStr);
// must have strong lesser security level
- if(HasLowerSecurity (chr,guid,true))
+ if(HasLowerSecurity (target,target_guid,true))
return false;
- uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid);
-
time_t mutetime = time(NULL) + notspeaktime*60;
- if (chr)
- chr->GetSession()->m_muteTime = mutetime;
+ if (target)
+ target->GetSession()->m_muteTime = mutetime;
LoginDatabase.PExecute("UPDATE account SET mutetime = " I64FMTD " WHERE id = '%u'",uint64(mutetime), account_id );
- if(chr)
- ChatHandler(chr).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime);
+ if(target)
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_YOU_DISABLE_CHAT, nameLink.c_str(), notspeaktime);
-
return true;
}
//unmute player
bool ChatHandler::HandleUnmuteCommand(const char* args)
{
- if (!*args)
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
+ uint32 account_id = target ? target->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(target_guid);
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
- if(!guid)
+ // find only player from same account if any
+ if(!target)
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
+ if(WorldSession* session = sWorld.FindSession(account_id))
+ target = session->GetPlayer();
}
- Player *chr = objmgr.GetPlayer(guid);
-
// must have strong lesser security level
- if(HasLowerSecurity (chr,guid,true))
+ if(HasLowerSecurity (target,target_guid,true))
return false;
- uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid);
-
- if (chr)
+ if (target)
{
- if(chr->CanSpeak())
+ if(target->CanSpeak())
{
SendSysMessage(LANG_CHAT_ALREADY_ENABLED);
SetSentErrorMessage(true);
return false;
}
- chr->GetSession()->m_muteTime = 0;
+ target->GetSession()->m_muteTime = 0;
}
LoginDatabase.PExecute("UPDATE account SET mutetime = '0' WHERE id = '%u'", account_id );
- if(chr)
- ChatHandler(chr).PSendSysMessage(LANG_YOUR_CHAT_ENABLED);
+ if(target)
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str());
return true;
@@ -2127,7 +2112,7 @@ bool ChatHandler::HandleModifyMorphCommand(const char* args)
//kick player
bool ChatHandler::HandleKickPlayerCommand(const char *args)
{
- const char* kickName = strtok((char*)args, " ");
+/* const char* kickName = strtok((char*)args, " ");
char* kickReason = strtok(NULL, "\n");
std::string reason = "No Reason";
std::string kicker = "Console";
@@ -2218,7 +2203,25 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
PSendSysMessage(LANG_COMMAND_KICKNOTFOUNDPLAYER,nameLink.c_str());
return false;
}
+ }*/
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
+ return false;
+
+ if (m_session && target==m_session->GetPlayer())
+ {
+ SendSysMessage(LANG_COMMAND_KICKSELF);
+ SetSentErrorMessage(true);
+ return false;
}
+
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
+ // send before target pointer invalidate
+ PSendSysMessage(LANG_COMMAND_KICKMESSAGE,GetNameLink(target).c_str());
+ target->GetSession()->KickPlayer();
return true;
}
@@ -2246,48 +2249,15 @@ bool ChatHandler::HandleModifyPhaseCommand(const char* args)
//show info of player
bool ChatHandler::HandlePInfoCommand(const char* args)
{
- Player* target = NULL;
- uint64 targetGUID = 0;
+ char* nameStr;
+ char* subcommandStr;
+ extractOptFirstArg((char*)args,&nameStr,&subcommandStr);
- char* px = strtok((char*)args, " ");
- char* py = NULL;
-
- std::string name;
-
- if (px)
- {
- name = extractPlayerNameFromLink(px);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- target = objmgr.GetPlayer(name.c_str());
- if (target)
- py = strtok(NULL, " ");
- else
- {
- targetGUID = objmgr.GetPlayerGUIDByName(name);
- if(targetGUID)
- py = strtok(NULL, " ");
- else
- py = px;
- }
- }
-
- if(!target && !targetGUID)
- {
- target = getSelectedPlayer();
- }
-
- if(!target && !targetGUID)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
return false;
- }
uint32 accId = 0;
uint32 money = 0;
@@ -2302,8 +2272,6 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
if (HasLowerSecurity(target, 0))
return false;
- targetGUID = target->GetGUID();
- name = target->GetName(); // re-read for case getSelectedPlayer() target
accId = target->GetSession()->GetAccountId();
money = target->GetMoney();
total_player_time = target->GetTotalPlayedTime();
@@ -2314,32 +2282,25 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
else
{
// check offline security
- if (HasLowerSecurity(NULL, targetGUID))
+ if (HasLowerSecurity(NULL, target_guid))
return false;
// 0
- QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime FROM characters WHERE guid = '%u'", GUID_LOPART(targetGUID));
+ QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime FROM characters WHERE guid = '%u'", GUID_LOPART(target_guid));
if (!result)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
return false;
- }
+
Field *fields = result->Fetch();
total_player_time = fields[0].GetUInt32();
delete result;
Tokens data;
- if (!Player::LoadValuesArrayFromDB(data,targetGUID))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ if (!Player::LoadValuesArrayFromDB(data,target_guid))
return false;
- }
money = Player::GetUInt32ValueFromArray(data, PLAYER_FIELD_COINAGE);
level = Player::GetUInt32ValueFromArray(data, UNIT_FIELD_LEVEL);
- accId = objmgr.GetPlayerAccountIdByGUID(targetGUID);
+ accId = objmgr.GetPlayerAccountIdByGUID(target_guid);
}
std::string username = GetTrinityString(LANG_ERROR);
@@ -2368,9 +2329,9 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
delete result;
}
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
- PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetMangosString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGUID), username.c_str(), accId, security, last_ip.c_str(), last_login.c_str(), latency);
+ PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetMangosString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(target_guid), username.c_str(), accId, security, last_ip.c_str(), last_login.c_str(), latency);
std::string timeStr = secsToTimeString(total_player_time,true,true);
uint32 gold = money /GOLD;
@@ -2378,7 +2339,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
uint32 copp = (money % GOLD) % SILVER;
PSendSysMessage(LANG_PINFO_LEVEL, timeStr.c_str(), level, gold,silv,copp );
- if ( py && strncmp(py, "rep", 3) == 0 )
+ if( subcommandStr && strncmp(subcommandStr, "rep", 3) == 0 )
{
if(!target)
{
@@ -2507,27 +2468,18 @@ bool ChatHandler::HandleTicketCommand(const char* args)
return true;
}
- std::string name = extractPlayerNameFromLink(px);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
-
- if(!guid)
+ uint64 target_guid;
+ if(!extractPlayerTarget(px,NULL,&target_guid))
return false;
// ticket $char_name
- GMTicket* ticket = ticketmgr.GetGMTicket(GUID_LOPART(guid));
+ GMTicket* ticket = ticketmgr.GetGMTicket(GUID_LOPART(target_guid));
if(!ticket)
return false;
std::string time = TimeToTimestampStr(ticket->GetLastUpdate());
- ShowTicket(guid, ticket->GetText(), time.c_str());
+ ShowTicket(target_guid, ticket->GetText(), time.c_str());
return true;
}
@@ -2577,27 +2529,20 @@ bool ChatHandler::HandleDelTicketCommand(const char *args)
return true;
}
- std::string name = extractPlayerNameFromLink(px);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
-
- if(!guid)
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(px,&target,&target_guid,&target_name))
return false;
// delticket $char_name
- ticketmgr.Delete(GUID_LOPART(guid));
+ ticketmgr.Delete(GUID_LOPART(target_guid));
// notify players about ticket deleting
- if(Player* sender = objmgr.GetPlayer(guid))
- sender->GetSession()->SendGMTicketGetTicket(0x0A,0);
+ if(target)
+ target->GetSession()->SendGMTicketGetTicket(0x0A,0);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_COMMAND_TICKETPLAYERDEL,nameLink.c_str());
return true;
@@ -3644,39 +3589,11 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
//rename characters
bool ChatHandler::HandleCharacterRenameCommand(const char* args)
{
- Player* target = NULL;
- uint64 targetGUID = 0;
- std::string oldname;
-
- char* px = strtok((char*)args, " ");
-
- if(px)
- {
- oldname = extractPlayerNameFromLink(px);
- if(oldname.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- target = objmgr.GetPlayer(oldname.c_str());
-
- if (!target)
- targetGUID = objmgr.GetPlayerGUIDByName(oldname);
- }
-
- if(!target && !targetGUID)
- {
- target = getSelectedPlayer();
- }
-
- if(!target && !targetGUID)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- }
if(target)
{
@@ -3691,13 +3608,13 @@ bool ChatHandler::HandleCharacterRenameCommand(const char* args)
else
{
// check offline security
- if (HasLowerSecurity(NULL, targetGUID))
+ if (HasLowerSecurity(NULL, target_guid))
return false;
- std::string oldNameLink = playerLink(oldname);
+ std::string oldNameLink = playerLink(target_name);
- PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(targetGUID));
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", GUID_LOPART(targetGUID));
+ PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(target_guid));
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", GUID_LOPART(target_guid));
}
return true;
@@ -3706,39 +3623,11 @@ bool ChatHandler::HandleCharacterRenameCommand(const char* args)
// customize characters
bool ChatHandler::HandleCharacterCustomizeCommand(const char* args)
{
- Player* target = NULL;
- uint64 targetGUID = 0;
- std::string oldname;
-
- char* px = strtok((char*)args, " ");
-
- if(px)
- {
- oldname = extractPlayerNameFromLink(px);
- if(oldname.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- target = objmgr.GetPlayer(oldname.c_str());
-
- if (!target)
- targetGUID = objmgr.GetPlayerGUIDByName(oldname);
- }
-
- if(!target && !targetGUID)
- {
- target = getSelectedPlayer();
- }
-
- if(!target && !targetGUID)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- }
if(target)
{
@@ -3748,10 +3637,10 @@ bool ChatHandler::HandleCharacterCustomizeCommand(const char* args)
}
else
{
- std::string oldNameLink = playerLink(oldname);
+ std::string oldNameLink = playerLink(target_name);
- PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(targetGUID));
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(targetGUID));
+ PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(target_guid));
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(target_guid));
}
return true;
@@ -4035,41 +3924,16 @@ bool ChatHandler::HandleEventStopCommand(const char* args)
bool ChatHandler::HandleCombatStopCommand(const char* args)
{
- Player *player;
-
- if(*args)
- {
- std::string playername = extractPlayerNameFromLink((char*)args);
- if(playername.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- player = objmgr.GetPlayer(playername.c_str());
-
- if(!player)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
- }
- else
- {
- player = getSelectedPlayer();
-
- if (!player)
- player = m_session->GetPlayer();
- }
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
+ return false;
// check online security
- if (HasLowerSecurity(player, 0))
+ if (HasLowerSecurity(target, 0))
return false;
- player->CombatStop();
- player->getHostilRefManager().deleteReferences();
+ target->CombatStop();
+ target->getHostilRefManager().deleteReferences();
return true;
}
@@ -4303,16 +4167,11 @@ bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/)
return true;
}
-bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/)
+bool ChatHandler::HandleRepairitemsCommand(const char* args)
{
- Player *target = getSelectedPlayer();
-
- if(!target)
- {
- PSendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
return false;
- }
// check online security
if (HasLowerSecurity(target, 0))
@@ -4498,7 +4357,7 @@ bool ChatHandler::HandlePetUnlearnCommand(const char *args)
uint32 spellId = extractSpellIdFromLink((char*)args);
if(pet->HasSpell(spellId))
- pet->removeSpell(spellId);
+ pet->removeSpell(spellId, false);
else
PSendSysMessage("Pet doesn't have that spell");
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 9d43c348831..ac90a065315 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -2467,33 +2467,14 @@ bool ChatHandler::HandleLearnAllLangCommand(const char* /*args*/)
bool ChatHandler::HandleLearnAllDefaultCommand(const char* args)
{
- Player *player = NULL;
- if (*args)
- {
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- player = objmgr.GetPlayer(name.c_str());
- }
- else
- player = getSelectedPlayer();
-
- if(!player)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
return false;
- }
- player->learnDefaultSpells();
- player->learnQuestRewardedSpells();
+ target->learnDefaultSpells();
+ target->learnQuestRewardedSpells();
- PSendSysMessage(LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST,GetNameLink(player).c_str());
+ PSendSysMessage(LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST,GetNameLink(target).c_str());
return true;
}
@@ -3762,41 +3743,26 @@ bool ChatHandler::HandleLookupTaxiNodeCommand(const char * args)
*/
bool ChatHandler::HandleGuildCreateCommand(const char* args)
{
-
- if (!*args)
- return false;
-
- char *lname = strtok ((char*)args, " ");
- char *gname = strtok (NULL, "");
-
- if (!lname)
+ char* nameStr;
+ char* guildStr;
+ extractOptFirstArg((char*)args,&nameStr,&guildStr);
+ if(!guildStr)
return false;
- if (!gname)
- {
- SendSysMessage (LANG_INSERT_GUILD_NAME);
- SetSentErrorMessage (true);
+ Player* target;
+ if(!extractPlayerTarget(nameStr,&target))
return false;
- }
-
- std::string guildname = gname;
- Player* player = ObjectAccessor::Instance ().FindPlayerByName (lname);
- if (!player)
- {
- SendSysMessage (LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage (true);
- return false;
- }
+ std::string guildname = guildStr;
- if (player->GetGuildId())
+ if (target->GetGuildId())
{
SendSysMessage (LANG_PLAYER_IN_GUILD);
return true;
}
Guild *guild = new Guild;
- if (!guild->create (player,guildname))
+ if (!guild->create (target,guildname))
{
delete guild;
SendSysMessage (LANG_GUILD_NOT_CREATED);
@@ -3810,38 +3776,23 @@ bool ChatHandler::HandleGuildCreateCommand(const char* args)
bool ChatHandler::HandleGuildInviteCommand(const char *args)
{
- if (!*args)
+ char* nameStr;
+ char* guildNameStr;
+ extractOptFirstArg((char*)args,&nameStr,&guildNameStr);
+ if(!guildNameStr)
return false;
- char* par1 = strtok ((char*)args, " ");
- char* par2 = strtok (NULL, "");
- if(!par1 || !par2)
+ uint64 target_guid;
+ if(!extractPlayerTarget(nameStr,NULL,&target_guid))
return false;
- std::string glName = par2;
+ std::string glName = guildNameStr;
Guild* targetGuild = objmgr.GetGuildByName (glName);
if (!targetGuild)
return false;
- std::string plName = extractPlayerNameFromLink(par1);
- if(plName.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 plGuid = 0;
- if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
- plGuid = targetPlayer->GetGUID ();
- else
- plGuid = objmgr.GetPlayerGUIDByName (plName);
-
- if (!plGuid)
- return false;
-
// player's guild membership checked in AddMember before add
- if (!targetGuild->AddMember (plGuid,targetGuild->GetLowestRank ()))
+ if (!targetGuild->AddMember (target_guid,targetGuild->GetLowestRank ()))
return false;
return true;
@@ -3849,91 +3800,50 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args)
bool ChatHandler::HandleGuildUninviteCommand(const char *args)
{
- if (!*args)
+ Player* target;
+ uint64 target_guid;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid))
return false;
- char* par1 = strtok ((char*)args, " ");
- if(!par1)
- return false;
-
- std::string plName = extractPlayerNameFromLink(par1);
- if(plName.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 plGuid = 0;
- uint32 glId = 0;
- if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
- {
- plGuid = targetPlayer->GetGUID ();
- glId = targetPlayer->GetGuildId ();
- }
- else
- {
- plGuid = objmgr.GetPlayerGUIDByName (plName);
- glId = Player::GetGuildIdFromDB (plGuid);
- }
-
- if (!plGuid || !glId)
+ uint32 glId = target ? target->GetGuildId () : Player::GetGuildIdFromDB (target_guid);
+ if (!glId)
return false;
Guild* targetGuild = objmgr.GetGuildById (glId);
if (!targetGuild)
return false;
- targetGuild->DelMember (plGuid);
-
+ targetGuild->DelMember (target_guid);
return true;
}
bool ChatHandler::HandleGuildRankCommand(const char *args)
{
- if (!*args)
- return false;
-
- char* par1 = strtok ((char*)args, " ");
- char* par2 = strtok (NULL, " ");
- if (!par1 || !par2)
+ char* nameStr;
+ char* rankStr;
+ extractOptFirstArg((char*)args,&nameStr,&rankStr);
+ if(!rankStr)
return false;
- std::string plName = extractPlayerNameFromLink(par1);
- if(plName.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
return false;
- }
-
- uint64 plGuid = 0;
- uint32 glId = 0;
- if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
- {
- plGuid = targetPlayer->GetGUID ();
- glId = targetPlayer->GetGuildId ();
- }
- else
- {
- plGuid = objmgr.GetPlayerGUIDByName (plName);
- glId = Player::GetGuildIdFromDB (plGuid);
- }
-
- if (!plGuid || !glId)
+ uint32 glId = target ? target->GetGuildId () : Player::GetGuildIdFromDB (target_guid);
+ if (!glId)
return false;
Guild* targetGuild = objmgr.GetGuildById (glId);
if (!targetGuild)
return false;
- uint32 newrank = uint32 (atoi (par2));
+ uint32 newrank = uint32 (atoi (rankStr));
if (newrank > targetGuild->GetLowestRank ())
return false;
- targetGuild->ChangeRank (plGuid,newrank);
-
+ targetGuild->ChangeRank (target_guid,newrank);
return true;
}
@@ -4120,43 +4030,20 @@ bool ChatHandler::HandleModifyArenaCommand(const char * args)
bool ChatHandler::HandleReviveCommand(const char* args)
{
- Player* player = NULL;
- uint64 player_guid = 0;
+ Player* target;
+ uint64 target_guid;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid))
+ return false;
- if (*args)
+ if (target)
{
- std::string name = extractPlayerNameFromLink((char*)args);
- if (name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- player = objmgr.GetPlayer(name.c_str());
- if (!player)
- player_guid = objmgr.GetPlayerGUIDByName(name);
+ target->ResurrectPlayer(0.5f);
+ target->SpawnCorpseBones();
+ target->SaveToDB();
}
else
- player = getSelectedPlayer();
-
- if (player)
- {
- player->ResurrectPlayer(0.5f);
- player->SpawnCorpseBones();
- player->SaveToDB();
- }
- else if (player_guid)
- {
// will resurrected at login without corpse
- ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid);
- }
- else
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
+ ObjectAccessor::Instance().ConvertCorpseForPlayer(target_guid);
return true;
}
@@ -4613,26 +4500,27 @@ void ChatHandler::HandleCharacterLevel(Player* player, uint64 player_guid, uint3
bool ChatHandler::HandleCharacterLevelCommand(const char* args)
{
- char* px = strtok((char*)args, " ");
- char* py = strtok((char*)NULL, " ");
-
- // command format parsing
- char* pname = (char*)NULL;
- int32 newlevel = 0;
+ char* nameStr;
+ char* levelStr;
+ extractOptFirstArg((char*)args,&nameStr,&levelStr);
+ if(!levelStr)
+ return false;
- if(px && py) // .character level $name #level
+ // exception opt second arg: .character level $name
+ if(isalpha(levelStr[0]))
{
- newlevel = atoi(py);
- pname = px;
+ nameStr = levelStr;
+ levelStr = NULL; // current level will used
}
- else if(px && !py) // .character level $name OR .character level #level
- {
- if(isalpha(px[0])) // .character level $name
- pname = px;
- else // .character level #level
- newlevel = atoi(px);
- }
- // // .character level - progress reset
+
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
+ return false;
+
+ int32 oldlevel = target ? target->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,target_guid);
+ int32 newlevel = levelStr ? atoi(levelStr) : oldlevel;
if(newlevel < 1)
return false; // invalid level
@@ -4640,60 +4528,11 @@ bool ChatHandler::HandleCharacterLevelCommand(const char* args)
if(newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level
newlevel = STRONG_MAX_LEVEL;
- // player
- Player *chr = NULL;
- uint64 chr_guid = 0;
-
- std::string name;
-
- if(pname) // player by name
- {
- name = extractPlayerNameFromLink(pname);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- chr = objmgr.GetPlayer(name.c_str());
- if(!chr) // not in game
- {
- chr_guid = objmgr.GetPlayerGUIDByName(name);
- if (chr_guid == 0)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
- }
- }
- else // player by selection
- {
- chr = getSelectedPlayer();
-
- if (chr == NULL)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
-
- name = chr->GetName();
- }
-
- assert(chr || chr_guid);
-
- int32 oldlevel = chr ? chr->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,chr_guid);
-
- if(!px && !py) // .character level - progress reset
- newlevel = oldlevel;
+ HandleCharacterLevel(target,target_guid,oldlevel,newlevel);
- HandleCharacterLevel(chr,chr_guid,oldlevel,newlevel);
-
- if(m_session && m_session->GetPlayer() != chr) // including player==NULL
+ if(!m_session || m_session->GetPlayer() != target) // including player==NULL
{
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_YOU_CHANGE_LVL,nameLink.c_str(),newlevel);
}
@@ -4702,83 +4541,38 @@ bool ChatHandler::HandleCharacterLevelCommand(const char* args)
bool ChatHandler::HandleLevelUpCommand(const char* args)
{
- char* px = strtok((char*)args, " ");
- char* py = strtok((char*)NULL, " ");
-
- // command format parsing
- char* pname = (char*)NULL;
- int addlevel = 1;
-
- if(px && py) // .levelup name level
- {
- addlevel = atoi(py);
- pname = px;
- }
- else if(px && !py) // .levelup name OR .levelup level
- {
- if(isalpha(px[0])) // .levelup name
- pname = px;
- else // .levelup level
- addlevel = atoi(px);
- }
- // else .levelup - nothing do for preparing
-
- // player
- Player *chr = NULL;
- uint64 chr_guid = 0;
-
- std::string name;
+ char* nameStr;
+ char* levelStr;
+ extractOptFirstArg((char*)args,&nameStr,&levelStr);
- if(pname) // player by name
+ // exception opt second arg: .character level $name
+ if(levelStr && isalpha(levelStr[0]))
{
- name = extractPlayerNameFromLink(pname);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- chr = objmgr.GetPlayer(name.c_str());
- if(!chr) // not in game
- {
- chr_guid = objmgr.GetPlayerGUIDByName(name);
- if (chr_guid == 0)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
- }
+ nameStr = levelStr;
+ levelStr = NULL; // current level will used
}
- else // player by selection
- {
- chr = getSelectedPlayer();
-
- if (chr == NULL)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
- name = chr->GetName();
- }
-
- assert(chr || chr_guid);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
+ return false;
- int32 oldlevel = chr ? chr->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,chr_guid);
+ int32 oldlevel = target ? target->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,target_guid);
+ int32 addlevel = levelStr ? atoi(levelStr) : 1;
int32 newlevel = oldlevel + addlevel;
+
if(newlevel < 1)
newlevel = 1;
+
if(newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level
newlevel = STRONG_MAX_LEVEL;
- HandleCharacterLevel(chr,chr_guid,oldlevel,newlevel);
+ HandleCharacterLevel(target,target_guid,oldlevel,newlevel);
- if(m_session && m_session->GetPlayer() != chr) // including chr==NULL
+ if(!m_session || m_session->GetPlayer() != target) // including chr==NULL
{
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_YOU_CHANGE_LVL,nameLink.c_str(),newlevel);
}
@@ -5234,76 +5028,31 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/)
bool ChatHandler::HandleResetAchievementsCommand (const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- uint64 guid = 0;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
+ Player* target;
+ uint64 target_guid;
+ if (!extractPlayerTarget((char*)args,&target,&target_guid))
+ return false;
- guid = objmgr.GetPlayerGUIDByName(name);
- player = objmgr.GetPlayer(guid);
- }
+ if(target)
+ target->GetAchievementMgr().Reset();
else
- {
- player = getSelectedPlayer();
- if(player)
- guid = player->GetGUID();
- }
-
- if(!player && !guid)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- return true;
- }
-
- if(player)
- player->GetAchievementMgr().Reset();
- else if(guid)
- AchievementMgr::DeleteFromDB(GUID_LOPART(guid));
+ AchievementMgr::DeleteFromDB(GUID_LOPART(target_guid));
return true;
}
bool ChatHandler::HandleResetHonorCommand (const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
- player = objmgr.GetPlayer(guid);
- }
- else
- player = getSelectedPlayer();
-
- if(!player)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- return true;
- }
-
- player->SetUInt32Value(PLAYER_FIELD_KILLS, 0);
- player->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0);
- player->SetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY, 0);
- player->SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0);
- player->SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
+ Player* target;
+ if (!extractPlayerTarget((char*)args,&target))
+ return false;
- player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
+ target->SetUInt32Value(PLAYER_FIELD_KILLS, 0);
+ target->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0);
+ target->SetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY, 0);
+ target->SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0);
+ target->SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
+ target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
return true;
}
@@ -5365,138 +5114,71 @@ static bool HandleResetStatsOrLevelHelper(Player* player)
bool ChatHandler::HandleResetLevelCommand(const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
- player = objmgr.GetPlayer(guid);
- }
- else
- player = getSelectedPlayer();
-
- if(!player)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
+ Player* target;
+ if(!extractPlayerTarget((char*)args,&target))
return false;
- }
- if(!HandleResetStatsOrLevelHelper(player))
+ if(!HandleResetStatsOrLevelHelper(target))
return false;
// set starting level
- uint32 start_level = player->getClass() != CLASS_DEATH_KNIGHT
+ uint32 start_level = target->getClass() != CLASS_DEATH_KNIGHT
? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
: sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
- player->SetLevel(start_level);
- player->InitRunes();
- player->InitStatsForLevel(true);
- player->InitTaxiNodesForLevel();
- player->InitGlyphsForLevel();
- player->InitTalentForLevel();
- player->SetUInt32Value(PLAYER_XP,0);
+ target->SetLevel(start_level);
+ target->InitRunes();
+ target->InitStatsForLevel(true);
+ target->InitTaxiNodesForLevel();
+ target->InitGlyphsForLevel();
+ target->InitTalentForLevel();
+ target->SetUInt32Value(PLAYER_XP,0);
+
+ // reset level for pet
+ if(Pet* pet = target->GetPet())
+ pet->SynchronizeLevelWithOwner();
- // reset level to summoned pet
- Guardian* pet = player->GetGuardianPet();
- if(pet)
- {
- pet->InitStatsForLevel(1);
- if(pet->isPet())
- ((Pet*)pet)->InitTalentForLevel();
- }
return true;
}
bool ChatHandler::HandleResetStatsCommand(const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(name);
- player = objmgr.GetPlayer(guid);
- }
- else
- player = getSelectedPlayer();
-
- if(!player)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
+ Player* target;
+ if (!extractPlayerTarget((char*)args,&target))
return false;
- }
- if(!HandleResetStatsOrLevelHelper(player))
+ if (!HandleResetStatsOrLevelHelper(target))
return false;
- player->InitRunes();
- player->InitStatsForLevel(true);
- player->InitTaxiNodesForLevel();
- player->InitGlyphsForLevel();
- player->InitTalentForLevel();
+ target->InitRunes();
+ target->InitStatsForLevel(true);
+ target->InitTaxiNodesForLevel();
+ target->InitGlyphsForLevel();
+ target->InitTalentForLevel();
return true;
}
bool ChatHandler::HandleResetSpellsCommand(const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- uint64 playerGUID = 0;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- player = objmgr.GetPlayer(name.c_str());
- if(!player)
- playerGUID = objmgr.GetPlayerGUIDByName(name);
- }
- else
- player = getSelectedPlayer();
-
- if(!player && !playerGUID)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
- }
- if(player)
+ if(target)
{
- player->resetSpells();
+ target->resetSpells();
- ChatHandler(player).SendSysMessage(LANG_RESET_SPELLS);
- if(m_session->GetPlayer()!=player)
- PSendSysMessage(LANG_RESET_SPELLS_ONLINE,GetNameLink(player).c_str());
+ ChatHandler(target).SendSysMessage(LANG_RESET_SPELLS);
+ if(!m_session || m_session->GetPlayer()!=target)
+ PSendSysMessage(LANG_RESET_SPELLS_ONLINE,GetNameLink(target).c_str());
}
else
{
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(playerGUID));
- PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,pName);
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(target_guid));
+ PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,target_name);
}
return true;
@@ -5504,43 +5186,30 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
bool ChatHandler::HandleResetTalentsCommand(const char * args)
{
- char* pName = strtok((char*)args, "");
- Player *player = NULL;
- uint64 playerGUID = 0;
- if (pName)
- {
- std::string name = extractPlayerNameFromLink(pName);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- player = objmgr.GetPlayer(name.c_str());
- if(!player)
- playerGUID = objmgr.GetPlayerGUIDByName(name);
- }
- else
- player = getSelectedPlayer();
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if (!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
+ return false;
- if(player)
+ if (target)
{
- player->resetTalents(true);
+ target->resetTalents(true);
- ChatHandler(player).SendSysMessage(LANG_RESET_TALENTS);
- if(m_session->GetPlayer()!=player)
- PSendSysMessage(LANG_RESET_TALENTS_ONLINE,GetNameLink(player).c_str());
+ ChatHandler(target).SendSysMessage(LANG_RESET_TALENTS);
+ if (!m_session || m_session->GetPlayer()!=target)
+ PSendSysMessage(LANG_RESET_TALENTS_ONLINE,GetNameLink(target).c_str());
return true;
}
- else if (playerGUID)
+ else if (target_guid)
{
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_TALENTS), GUID_LOPART(playerGUID) );
- std::string nameLink = playerLink(pName);
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_TALENTS), GUID_LOPART(target_guid) );
+ std::string nameLink = playerLink(target_name);
PSendSysMessage(LANG_RESET_TALENTS_OFFLINE,nameLink.c_str());
return true;
}
+
// Try reset talenents as Hunter Pet
Creature* creature = getSelectedCreature();
if (creature && creature->isPet() && ((Pet *)creature)->getPetType() == HUNTER_PET)
@@ -5549,10 +5218,10 @@ bool ChatHandler::HandleResetTalentsCommand(const char * args)
Unit *owner = creature->GetOwner();
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
{
- player = (Player *)owner;
- ChatHandler(player).SendSysMessage(LANG_RESET_PET_TALENTS);
- if(m_session->GetPlayer()!=player)
- PSendSysMessage(LANG_RESET_PET_TALENTS_ONLINE,GetNameLink(player).c_str());
+ Player* owner_player = (Player *)owner;
+ ChatHandler(owner_player).SendSysMessage(LANG_RESET_PET_TALENTS);
+ if(!m_session || m_session->GetPlayer()!=owner_player)
+ PSendSysMessage(LANG_RESET_PET_TALENTS_ONLINE,GetNameLink(owner_player).c_str());
}
return true;
}
@@ -5576,11 +5245,15 @@ bool ChatHandler::HandleResetAllCommand(const char * args)
{
atLogin = AT_LOGIN_RESET_SPELLS;
sWorld.SendWorldText(LANG_RESETALL_SPELLS);
+ if(!m_session)
+ SendSysMessage(LANG_RESETALL_SPELLS);
}
else if(casename=="talents")
{
atLogin = AT_LOGIN_RESET_TALENTS;
sWorld.SendWorldText(LANG_RESETALL_TALENTS);
+ if(!m_session)
+ SendSysMessage(LANG_RESETALL_TALENTS);
}
else if(casename=="pet_spells")
{
@@ -6121,24 +5794,12 @@ bool ChatHandler::HandleBanInfoAccountCommand(const char* args)
bool ChatHandler::HandleBanInfoCharacterCommand(const char* args)
{
- if (!*args)
+ Player* target;
+ uint64 target_guid;
+ if(!extractPlayerTarget((char*)args,&target,&target_guid))
return false;
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint32 accountid = objmgr.GetPlayerAccountIdByPlayerName(name);
- if(!accountid)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
+ uint32 accountid = target ? target->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(target_guid);
std::string accountname;
if(!accmgr.GetName(accountid,accountname))
@@ -7242,18 +6903,12 @@ bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
//Send items by mail
bool ChatHandler::HandleSendItemsCommand(const char* args)
{
- if(!*args)
- return false;
-
// format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12]
-
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* receiver;
+ uint64 receiver_guid;
+ std::string receiver_name;
+ if(!extractPlayerTarget((char*)args,&receiver,&receiver_guid,&receiver_name))
return false;
- }
char* tail1 = strtok(NULL, "");
if(!tail1)
@@ -7349,14 +7004,6 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
}
}
- uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
- if(!receiver_guid)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -7364,8 +7011,6 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
uint32 stationery = MAIL_STATIONERY_GM;
uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0;
- Player *receiver = objmgr.GetPlayer(receiver_guid);
-
// fill mail
MailItemsInfo mi; // item list preparing
@@ -7380,7 +7025,7 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(receiver_name);
PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -7388,18 +7033,13 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
///Send money by mail
bool ChatHandler::HandleSendMoneyCommand(const char* args)
{
- if (!*args)
- return false;
-
/// format: name "subject text" "mail text" money
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ Player* receiver;
+ uint64 receiver_guid;
+ std::string receiver_name;
+ if(!extractPlayerTarget((char*)args,&receiver,&receiver_guid,&receiver_name))
return false;
- }
char* tail1 = strtok(NULL, "");
if (!tail1)
@@ -7446,14 +7086,6 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
std::string subject = msgSubject;
std::string text = msgText;
- uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
- if (!receiver_guid)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -7461,11 +7093,9 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
uint32 stationery = MAIL_STATIONERY_GM;
uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0;
- Player *receiver = objmgr.GetPlayer(receiver_guid);
-
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, money, 0, MAIL_CHECK_MASK_NONE);
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(receiver_name);
PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -7473,28 +7103,17 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
/// Send a message to a player in game
bool ChatHandler::HandleSendMessageCommand(const char* args)
{
- ///- Get the command line arguments
- std::string name = extractPlayerNameFromLink((char*)args);
- if(name.empty())
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ ///- Find the player
+ Player *rPlayer;
+ std::string rName;
+ if(!extractPlayerTarget((char*)args,&rPlayer,NULL,&rName))
return false;
- }
char* msg_str = strtok(NULL, "");
if(!msg_str)
return false;
- ///- Find the player and check that he is not logging out.
- Player *rPlayer = objmgr.GetPlayer(name.c_str());
- if(!rPlayer)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
+ ///- Check that he is not logging out.
if(rPlayer->GetSession()->isLogingOut())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
@@ -7508,7 +7127,7 @@ bool ChatHandler::HandleSendMessageCommand(const char* args)
rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
//Confirmation message
- std::string nameLink = playerLink(name);
+ std::string nameLink = playerLink(rName);
PSendSysMessage(LANG_SENDMESSAGE,nameLink.c_str(),msg_str);
return true;
}
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index 722db3ccb78..a1db50ee67a 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -275,7 +275,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
_LoadSpells();
_LoadSpellCooldowns();
LearnPetPassives();
- learnLevelupSpells();
+ InitLevelupSpellsForLevel();
CastPetAuras(current);
// Load action bar data
@@ -352,6 +352,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
}
}
+ //InitLevelupSpellsForLevel();
+
m_loading = false;
SynchronizeLevelWithOwner();
@@ -660,6 +662,9 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
for (PetSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
{
+ if(itr->second.state == PETSPELL_REMOVED)
+ continue;
+
if(IsPassiveSpell(itr->first))
continue;
@@ -736,8 +741,8 @@ void Pet::GivePetLevel(uint32 level)
return;
InitStatsForLevel(level);
+ InitLevelupSpellsForLevel();
InitTalentForLevel();
- learnLevelupSpells();
}
bool Pet::CreateBaseAtCreature(Creature* creature)
@@ -839,7 +844,7 @@ bool Guardian::InitStatsForLevel(uint32 petlevel)
else if (getLevel() <= cFamily->minScaleLevel)
scale = cFamily->minScale;
else
- scale = cFamily->minScale + (getLevel() - cFamily->minScaleLevel) / cFamily->maxScaleLevel * (cFamily->maxScale - cFamily->minScale);
+ scale = cFamily->minScale + float(getLevel() - cFamily->minScaleLevel) / cFamily->maxScaleLevel * (cFamily->maxScale - cFamily->minScale);
SetFloatValue(OBJECT_FIELD_SCALE_X, scale);
}
@@ -1095,7 +1100,7 @@ void Pet::_LoadSpells()
{
Field *fields = result->Fetch();
- addSpell(fields[0].GetUInt32(), fields[1].GetUInt16(), PETSPELL_UNCHANGED);
+ addSpell(fields[0].GetUInt32(), ActiveStates(fields[1].GetUInt16()), PETSPELL_UNCHANGED);
}
while( result->NextRow() );
@@ -1227,7 +1232,7 @@ void Pet::_SaveAuras()
}
}
-bool Pet::addSpell(uint32 spell_id,uint16 active /*= ACT_DECIDE*/, PetSpellState state /*= PETSPELL_NEW*/, PetSpellType type /*= PETSPELL_NORMAL*/)
+bool Pet::addSpell(uint32 spell_id,ActiveStates active /*= ACT_DECIDE*/, PetSpellState state /*= PETSPELL_NEW*/, PetSpellType type /*= PETSPELL_NORMAL*/)
{
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
if (!spellInfo)
@@ -1303,26 +1308,33 @@ bool Pet::addSpell(uint32 spell_id,uint16 active /*= ACT_DECIDE*/, PetSpellState
// skip unknown ranks
if(!HasSpell(rankSpellId))
continue;
- removeSpell(rankSpellId);
+ removeSpell(rankSpellId,false);
}
}
}
- else if(uint32 chainstart = spellmgr.GetFirstSpellInChain(spell_id))
+ else if(spellmgr.GetSpellRank(spell_id)!=0)
{
for (PetSpellMap::const_iterator itr2 = m_spells.begin(); itr2 != m_spells.end(); ++itr2)
{
if(itr2->second.state == PETSPELL_REMOVED) continue;
- if(spellmgr.GetFirstSpellInChain(itr2->first) == chainstart)
+ if( spellmgr.IsRankSpellDueToSpell(spellInfo,itr2->first) )
{
- newspell.active = itr2->second.active;
+ // replace by new high rank
+ if(spellmgr.IsHighRankOfSpell(spell_id,itr2->first))
+ {
+ newspell.active = itr2->second.active;
- if(newspell.active == ACT_ENABLED)
- ToggleAutocast(itr2->first, false);
+ if(newspell.active == ACT_ENABLED)
+ ToggleAutocast(itr2->first, false);
- oldspell_id = itr2->first;
- unlearnSpell(itr2->first);
- break;
+ oldspell_id = itr2->first;
+ unlearnSpell(itr2->first,false);
+ break;
+ }
+ // ignore new lesser rank
+ else if(spellmgr.IsHighRankOfSpell(itr2->first,spell_id))
+ return false;
}
}
}
@@ -1331,7 +1343,8 @@ bool Pet::addSpell(uint32 spell_id,uint16 active /*= ACT_DECIDE*/, PetSpellState
if (IsPassiveSpell(spell_id))
CastSpell(this, spell_id, true);
- else if(state == PETSPELL_NEW)
+ else
+ //m_charmInfo->AddSpellToAB(oldspell_id, spell_id);
m_charmInfo->AddSpellToAB(oldspell_id, spell_id, (ActiveStates)active);
if(newspell.active == ACT_ENABLED)
@@ -1365,22 +1378,33 @@ bool Pet::learnSpell(uint32 spell_id)
return true;
}
-void Pet::learnLevelupSpells()
+void Pet::InitLevelupSpellsForLevel()
{
- PetLevelupSpellMap const * spell_map = spellmgr.GetPetLevelupSpellMap();
- int8 level = getLevel();
- for(PetLevelupSpellMap::const_iterator itr = spell_map->lower_bound(GetCreatureInfo()->family); itr != spell_map->upper_bound(GetCreatureInfo()->family); ++itr)
+ uint32 family = GetCreatureInfo()->family;
+ if(!family)
+ return;
+
+ PetLevelupSpellSet const *levelupSpells = spellmgr.GetPetLevelupSpellList(family);
+ if(!levelupSpells)
+ return;
+
+ uint32 level = getLevel();
+
+ // PetLevelupSpellSet ordered by levels, process in reversed order
+ for(PetLevelupSpellSet::const_reverse_iterator itr = levelupSpells->rbegin(); itr != levelupSpells->rend(); ++itr)
{
- if(itr->second.first <= level)
- learnSpell(itr->second.second);
+ // will called first if level down
+ if(itr->first > level)
+ unlearnSpell(itr->second,true); // will learn prev rank if any
+ // will called if level up
else
- unlearnSpell(itr->second.second);
+ learnSpell(itr->second); // will unlearn prev rank if any
}
}
-bool Pet::unlearnSpell(uint32 spell_id)
+bool Pet::unlearnSpell(uint32 spell_id, bool learn_prev)
{
- if(removeSpell(spell_id))
+ if(removeSpell(spell_id,learn_prev))
{
if(!m_loading)
{
@@ -1393,7 +1417,7 @@ bool Pet::unlearnSpell(uint32 spell_id)
return false;
}
-bool Pet::removeSpell(uint32 spell_id)
+bool Pet::removeSpell(uint32 spell_id, bool learn_prev)
{
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end())
@@ -1421,6 +1445,27 @@ bool Pet::removeSpell(uint32 spell_id)
SetFreeTalentPoints(free_points > 0 ? free_points : 0);
}
+ if (learn_prev)
+ {
+ if (uint32 prev_id = spellmgr.GetPrevSpellInChain (spell_id))
+ {
+ // replace to next spell
+ if(!talentCost && !IsPassiveSpell(prev_id))
+ m_charmInfo->AddSpellToAB(spell_id, prev_id);
+
+ learnSpell(prev_id);
+ }
+ else
+ {
+ m_charmInfo->AddSpellToAB(spell_id, 0);
+
+ // need update action bar for last removed rank
+ if (Unit* owner = GetOwner())
+ if (owner->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)owner)->PetSpellInitialize();
+ }
+ }
+
return true;
}
@@ -1462,7 +1507,7 @@ void Pet::InitPetCreateSpells()
}
LearnPetPassives();
- learnLevelupSpells();
+ InitLevelupSpellsForLevel();
CastPetAuras(false);
}
@@ -1557,7 +1602,7 @@ bool Pet::resetTalents(bool no_cost)
// unlearn if first rank is talent or learned by talent
if (itrFirstId == talentInfo->RankID[j] || spellmgr.IsSpellLearnToSpell(talentInfo->RankID[j],itrFirstId))
{
- removeSpell(itr->first);
+ removeSpell(itr->first,false);
itr = m_spells.begin();
continue;
}
diff --git a/src/game/Pet.h b/src/game/Pet.h
index 63ad3979fe5..cd13bc5dc95 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -70,7 +70,7 @@ enum PetSpellType
struct PetSpell
{
- uint16 active;
+ ActiveStates active : 16;
PetSpellState state : 8;
PetSpellType type : 8;
@@ -199,12 +199,12 @@ class Pet : public Guardian
void _LoadSpells();
void _SaveSpells();
- bool addSpell(uint32 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, PetSpellType type = PETSPELL_NORMAL);
+ bool addSpell(uint32 spell_id,ActiveStates active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, PetSpellType type = PETSPELL_NORMAL);
bool learnSpell(uint32 spell_id);
void learnSpellHighRank(uint32 spellid);
- void learnLevelupSpells();
- bool unlearnSpell(uint32 spell_id);
- bool removeSpell(uint32 spell_id);
+ void InitLevelupSpellsForLevel();
+ bool unlearnSpell(uint32 spell_id, bool learn_prev);
+ bool removeSpell(uint32 spell_id, bool learn_prev);
PetSpellMap m_spells;
TeachSpellMap m_teachspells;
@@ -255,5 +255,5 @@ class Pet : public Guardian
assert(false);
}
};
-#endif
+#endif
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index c7d10029617..a94a63950f5 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -14482,7 +14482,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
// since the player may not be bound to the map yet, make sure subsequent
// getmap calls won't create new maps
- //SetInstanceId(map->GetInstanceId());
+ SetInstanceId(map->GetInstanceId());
// if the player is in an instance and it has been reset in the meantime teleport him to the entrance
if(GetInstanceId() && !sInstanceSaveManager.GetInstanceSave(GetInstanceId()))
@@ -20665,7 +20665,6 @@ bool Player::canSeeSpellClickOn(Creature const *c) const
for(SpellClickInfoMap::const_iterator itr = lower; itr != upper; ++itr)
{
- sLog.outError("%u %u %u %u", (uint32)itr->second.castFlags, itr->second.questId, itr->second.spellId);
if(itr->second.questId == 0 || GetQuestStatus(itr->second.questId) == QUEST_STATUS_INCOMPLETE)
return true;
}
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 4d5a9775d98..c7bf8cd5bac 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1953,6 +1953,8 @@ void SpellMgr::LoadPetLevelupSpellMap()
mPetLevelupSpellMap.clear(); // need for reload case
uint32 count = 0;
+ uint32 family_count = 0;
+
for (uint32 i = 0; i < sCreatureFamilyStore.GetNumRows(); ++i)
{
CreatureFamilyEntry const *creatureFamily = sCreatureFamilyStore.LookupEntry(i);
@@ -1977,17 +1979,24 @@ void SpellMgr::LoadPetLevelupSpellMap()
continue;
SpellEntry const *spell = sSpellStore.LookupEntry(skillLine->spellId);
- // not exist or triggered or talent
- if(!spell || !spell->spellLevel)
+ if(!spell) // not exist or triggered or talent
+ continue;
+
+ if(!spell->spellLevel)
continue;
- mPetLevelupSpellMap.insert(PetLevelupSpellMap::value_type(creatureFamily->ID, std::make_pair(spell->spellLevel , spell->Id )));
+
+ PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[creatureFamily->ID];
+ if(spellSet.empty())
+ ++family_count;
+
+ spellSet.insert(PetLevelupSpellSet::value_type(spell->spellLevel,spell->Id));
count++;
}
}
}
sLog.outString();
- sLog.outString( ">> Loaded %u pet levelup spells", count );
+ sLog.outString( ">> Loaded %u pet levelup and default spells for %u families", count, family_count );
}
/// Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book, etc
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 8a505feb27c..4427e4c6abb 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -669,9 +669,8 @@ typedef std::multimap<uint32, SpellLearnSpellNode> SpellLearnSpellMap;
typedef std::multimap<uint32, SkillLineAbilityEntry const*> SkillLineAbilityMap;
-//typedef std::multimap<uint32, uint32> PetLevelupSpellSet;
-//typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap;
-typedef std::multimap<uint32, std::pair < uint32,uint32 > >PetLevelupSpellMap;
+typedef std::multimap<uint32, uint32> PetLevelupSpellSet;
+typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap;
inline bool IsPrimaryProfessionSkill(uint32 skill)
{
@@ -970,6 +969,15 @@ class SpellMgr
return NULL;
}
+ PetLevelupSpellSet const* GetPetLevelupSpellList(uint32 petFamily) const
+ {
+ PetLevelupSpellMap::const_iterator itr = mPetLevelupSpellMap.find(petFamily);
+ if(itr != mPetLevelupSpellMap.end())
+ return &itr->second;
+ else
+ return NULL;
+ }
+
uint32 GetSpellCustomAttr(uint32 spell_id) const
{
if(spell_id >= mSpellCustomAttr.size())
@@ -1017,11 +1025,6 @@ class SpellMgr
return SpellAreaForAreaMapBounds(mSpellAreaForAreaMap.lower_bound(area_id),mSpellAreaForAreaMap.upper_bound(area_id));
}
- PetLevelupSpellMap const * GetPetLevelupSpellMap() const
- {
- return &mPetLevelupSpellMap;
- }
-
// Modifiers
public:
static SpellMgr& Instance();
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 235a2c99272..8b7677e6d2f 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -564,8 +564,8 @@ void Unit::DealDamageMods(Unit *pVictim, uint32 &damage, uint32* absorb)
//if( GetTypeId()== TYPEID_UNIT && ((Creature *)this)->AI())
// ((Creature *)this)->AI()->DamageDeal(pVictim, damage);
//Script Event damage taken
- if( pVictim->GetTypeId()== TYPEID_UNIT && ((Creature *)pVictim)->IsAIEnabled )
- ((Creature *)pVictim)->AI()->DamageTaken(this, damage);
+ //if( pVictim->GetTypeId()== TYPEID_UNIT && ((Creature *)pVictim)->IsAIEnabled )
+ // ((Creature *)pVictim)->AI()->DamageTaken(this, damage);
if(absorb && originalDamage > damage)
absorb += (originalDamage - damage);
@@ -575,6 +575,9 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
{
if( pVictim->GetTypeId()== TYPEID_UNIT)
{
+ if(((Creature *)pVictim)->IsAIEnabled)
+ ((Creature *)pVictim)->AI()->DamageTaken(this, damage);
+
// Set tagging
if(!pVictim->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_OTHER_TAGGER) && !((Creature*)pVictim)->isPet())
{
@@ -11763,20 +11766,30 @@ void CharmInfo::InitCharmCreateSpells()
bool CharmInfo::AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate)
{
- for(uint8 i = 0; i < 10; i++)
+ // new spell already listed for example in case prepered switch to lesser rank in Pet::removeSpell
+ for(uint8 i = 0; i < 10; ++i)
+ if (PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE)
+ if (newid && PetActionBar[i].SpellOrAction == newid)
+ return true;
+
+ // old spell can be leasted for example in case learn high rank
+ for(uint8 i = 0; i < 10; ++i)
{
- if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE) && PetActionBar[i].SpellOrAction == oldid)
+ if (PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE)
{
- PetActionBar[i].SpellOrAction = newid;
- if(!oldid)
+ if (PetActionBar[i].SpellOrAction == oldid)
{
- if(newstate == ACT_DECIDE)
- PetActionBar[i].Type = ACT_DISABLED;
- else
- PetActionBar[i].Type = newstate;
- }
+ PetActionBar[i].SpellOrAction = newid;
+ if (!oldid)
+ {
+ if (newstate == ACT_DECIDE)
+ PetActionBar[i].Type = ACT_DISABLED;
+ else
+ PetActionBar[i].Type = newstate;
+ }
- return true;
+ return true;
+ }
}
}
return false;
@@ -12794,6 +12807,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
pet->GetCharmInfo()->SetPetNumber(objmgr.GeneratePetNumber(), true);
// this enables pet details window (Shift+P)
pet->InitPetCreateSpells();
+ //pet->InitLevelupSpellsForLevel();
pet->InitTalentForLevel();
pet->SetHealth(pet->GetMaxHealth());
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 93d927c07eb..b514895a328 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -2830,31 +2830,6 @@ void World::KickAllLess(AccountTypes sec)
itr->second->KickPlayer();
}
-/// Kick (and save) the designated player
-bool World::KickPlayer(const std::string& playerName)
-{
- SessionMap::const_iterator itr;
-
- // session not removed at kick and will removed in next update tick
- for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
- {
- if(!itr->second)
- continue;
- Player *player = itr->second->GetPlayer();
- if(!player)
- continue;
- if( player->IsInWorld() )
- {
- if (playerName == player->GetName())
- {
- itr->second->KickPlayer();
- return true;
- }
- }
- }
- return false;
-}
-
/// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permban
BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author)
{
diff --git a/src/game/World.h b/src/game/World.h
index 62648ebce2c..522c4cef7c9 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -526,7 +526,6 @@ class World
bool IsPvPRealm() { return (getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP || getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP); }
bool IsFFAPvPRealm() { return getConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP; }
- bool KickPlayer(const std::string& playerName);
void KickAll();
void KickAllLess(AccountTypes sec);
BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);