diff options
Diffstat (limited to 'src')
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); |