diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 27 | ||||
-rw-r--r-- | src/game/Chat.h | 10 | ||||
-rw-r--r-- | src/game/Group.cpp | 84 | ||||
-rw-r--r-- | src/game/Group.h | 62 | ||||
-rw-r--r-- | src/game/GroupHandler.cpp | 3 | ||||
-rw-r--r-- | src/game/Language.h | 18 | ||||
-rw-r--r-- | src/game/Level1.cpp | 108 | ||||
-rw-r--r-- | src/game/Level2.cpp | 78 | ||||
-rw-r--r-- | src/game/Level3.cpp | 40 | ||||
-rw-r--r-- | src/game/MapManager.cpp | 4 |
10 files changed, 320 insertions, 114 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 4ce6babce60..48d3890dd4f 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -386,6 +386,8 @@ ChatCommand * ChatHandler::getCommandTable() { "changeentry", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeEntryCommand, "", NULL }, { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL }, { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlayEmoteCommand, "", NULL }, + { "follow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFollowCommand, "", NULL }, + { "unfollow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcUnFollowCommand, "", NULL }, //{ TODO: fix or remove this commands { "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNameCommand, "", NULL }, @@ -510,6 +512,7 @@ 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 }, @@ -535,8 +538,9 @@ ChatCommand * ChatHandler::getCommandTable() { "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL }, { "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL }, { "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL }, - { "chardelete", SEC_CONSOLE, true, &ChatHandler::HandleCombatStopCommand, "", NULL }, + { "chardelete", SEC_CONSOLE, true, &ChatHandler::HandleCharDeleteCommand, "", NULL }, { "sendmessage", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMessageCommand, "", NULL }, + { "repairitems", SEC_GAMEMASTER, false, &ChatHandler::HandleRepairitemsCommand, "", NULL }, { "freeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFreezeCommand, "", NULL }, { "unfreeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnFreezeCommand, "", NULL }, { "listfreeze", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListFreezeCommand, "", NULL }, @@ -1207,6 +1211,17 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text) return objmgr.GetGameTele(cId); } +const char *ChatHandler::GetName() const +{ + return m_session->GetPlayer()->GetName(); +} + +bool ChatHandler::needReportToTarget(Player* chr) const +{ + Player* pl = m_session->GetPlayer(); + return pl != chr && pl->IsVisibleGloballyFor(chr); +} + const char *CliHandler::GetTrinityString(int32 entry) const { return objmgr.GetTrinityStringForDBCLocale(entry); @@ -1224,6 +1239,16 @@ void CliHandler::SendSysMessage(const char *str) m_print("\r\n"); } +const char *CliHandler::GetName() const +{ + return GetTrinityString(LANG_CONSOLE_COMMAND); +} + +bool CliHandler::needReportToTarget(Player* /*chr*/) const +{ + return true; +} + bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline) { plr = NULL; diff --git a/src/game/Chat.h b/src/game/Chat.h index 72f0a2ec79e..cf254238d0a 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -71,12 +71,14 @@ class ChatHandler int ParseCommands(const char* text); + virtual char const* GetName() const; protected: explicit ChatHandler() : m_session(NULL) {} // for CLI subclass bool hasStringAbbr(const char* name, const char* part); virtual bool isAvailable(ChatCommand const& cmd) const; + virtual bool needReportToTarget(Player* chr) const; void SendGlobalSysMessage(const char *str); @@ -150,6 +152,9 @@ class ChatHandler bool HandleModifyHonorCommand (const char* args); bool HandleModifyRepCommand(const char* args); bool HandleModifyArenaCommand(const char* args); + + bool HandleNpcFollowCommand(const char* args); + bool HandleNpcUnFollowCommand(const char* args); bool HandleReloadCommand(const char* args); bool HandleReloadAllCommand(const char* args); @@ -349,6 +354,7 @@ class ChatHandler bool HandleTextEmoteCommand(const char* args); bool HandleNpcInfoCommand(const char* args); bool HandleHoverCommand(const char* args); + bool HandleWaterwalkCommand(const char* args); bool HandleLevelUpCommand(const char* args); bool HandleShowAreaCommand(const char* args); bool HandleHideAreaCommand(const char* args); @@ -416,7 +422,9 @@ class ChatHandler bool HandleCastTargetCommand(const char *args); bool HandleComeToMeCommand(const char *args); bool HandleCombatStopCommand(const char *args); + bool HandleCharDeleteCommand(const char *args); bool HandleSendMessageCommand(const char * args); + bool HandleRepairitemsCommand(const char* args); bool HandleFlushArenaPointsCommand(const char *args); //! Development Commands @@ -473,6 +481,8 @@ class CliHandler : public ChatHandler const char *GetTrinityString(int32 entry) const; bool isAvailable(ChatCommand const& cmd) const; void SendSysMessage(const char *str); + char const* GetName() const; + bool needReportToTarget(Player* chr) const; private: Print* m_print; diff --git a/src/game/Group.cpp b/src/game/Group.cpp index bf448df36f5..92c5b00e514 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -44,6 +44,7 @@ Group::Group() m_lootMethod = (LootMethod)0; m_looterGuid = 0; m_lootThreshold = ITEM_QUALITY_UNCOMMON; + m_subGroupsCounts = NULL; for(int i=0; i<TARGETICONCOUNT; i++) m_targetIcons[i] = 0; @@ -73,6 +74,8 @@ Group::~Group() for(uint8 i = 0; i < TOTAL_DIFFICULTIES; i++) for(BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) itr->second.save->RemoveGroup(this); + if (m_subGroupsCounts) + delete[] m_subGroupsCounts; } bool Group::Create(const uint64 &guid, const char * name) @@ -81,6 +84,10 @@ bool Group::Create(const uint64 &guid, const char * name) m_leaderName = name; m_groupType = isBGGroup() ? GROUPTYPE_RAID : GROUPTYPE_NORMAL; + + if (m_groupType == GROUPTYPE_RAID) + _initRaidSubGroupsCounter(); + m_lootMethod = GROUP_LOOT; m_lootThreshold = ITEM_QUALITY_UNCOMMON; m_looterGuid = guid; @@ -136,6 +143,10 @@ bool Group::LoadGroupFromDB(const uint64 &leaderGuid, QueryResult *result, bool } m_groupType = (*result)[13].GetBool() ? GROUPTYPE_RAID : GROUPTYPE_NORMAL; + + if (m_groupType == GROUPTYPE_RAID) + _initRaidSubGroupsCounter(); + m_difficulty = (*result)[14].GetUInt8(); m_mainTank = (*result)[0].GetUInt64(); m_mainAssistant = (*result)[1].GetUInt64(); @@ -178,9 +189,22 @@ bool Group::LoadMemberFromDB(uint32 guidLow, uint8 subgroup, bool assistant) member.group = subgroup; member.assistant = assistant; m_memberSlots.push_back(member); + + SubGroupCounterIncrease(subgroup); + return true; } +void Group::ConvertToRaid() +{ + m_groupType = GROUPTYPE_RAID; + + _initRaidSubGroupsCounter(); + + if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET isRaid = 1 WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid)); + SendUpdate(); +} + bool Group::AddInvite(Player *player) { if(!player || player->GetGroupInvite() || player->GetGroup()) @@ -386,7 +410,7 @@ void Group::SendLootStartRoll(uint32 CountDown, const Roll &r) } } -void Group::SendLootRoll(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) +void Group::SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) { WorldPacket data(SMSG_LOOT_ROLL, (8+4+8+4+4+4+1+1)); data << uint64(SourceGuid); // guid of the item rolled @@ -410,7 +434,7 @@ void Group::SendLootRoll(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, } } -void Group::SendLootRollWon(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) +void Group::SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) { WorldPacket data(SMSG_LOOT_ROLL_WON, (8+4+4+4+4+8+1+1)); data << uint64(SourceGuid); // guid of the item rolled @@ -453,7 +477,7 @@ void Group::SendLootAllPassed(uint32 NumberOfPlayers, const Roll &r) } } -void Group::GroupLoot(uint64 playerGUID, Loot *loot, Creature *creature) +void Group::GroupLoot(const uint64& playerGUID, Loot *loot, Creature *creature) { std::vector<LootItem>::iterator i; ItemPrototype const *item; @@ -509,7 +533,7 @@ void Group::GroupLoot(uint64 playerGUID, Loot *loot, Creature *creature) } } -void Group::NeedBeforeGreed(uint64 playerGUID, Loot *loot, Creature *creature) +void Group::NeedBeforeGreed(const uint64& playerGUID, Loot *loot, Creature *creature) { ItemPrototype const *item; Player *player = objmgr.GetPlayer(playerGUID); @@ -563,7 +587,7 @@ void Group::NeedBeforeGreed(uint64 playerGUID, Loot *loot, Creature *creature) } } -void Group::MasterLoot(uint64 playerGUID, Loot* /*loot*/, Creature *creature) +void Group::MasterLoot(const uint64& playerGUID, Loot* /*loot*/, Creature *creature) { Player *player = objmgr.GetPlayer(playerGUID); if(!player) @@ -599,7 +623,7 @@ void Group::MasterLoot(uint64 playerGUID, Loot* /*loot*/, Creature *creature) } } -void Group::CountRollVote(uint64 playerGUID, uint64 Guid, uint32 NumberOfPlayers, uint8 Choise) +void Group::CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 NumberOfPlayers, uint8 Choise) { Rolls::iterator rollI = GetRoll(Guid); if (rollI == RollId.end()) @@ -935,13 +959,20 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant) { // get first not-full group uint8 groupid = 0; - std::vector<uint8> temp(MAXRAIDSIZE/MAXGROUPSIZE); - for(member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) + if (m_subGroupsCounts) { - if (itr->group >= temp.size()) continue; - ++temp[itr->group]; - if(temp[groupid] >= MAXGROUPSIZE) - ++groupid; + bool groupFound = false; + for (; groupid < MAXRAIDSIZE/MAXGROUPSIZE; ++groupid) + { + if (m_subGroupsCounts[groupid] < MAXGROUPSIZE) + { + groupFound = true; + break; + } + } + // We are raid group and no one slot is free + if (!groupFound) + return false; } return _addMember(guid, name, isAssistant, groupid); @@ -963,6 +994,8 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant, u member.group = group; member.assistant = isAssistant; m_memberSlots.push_back(member); + + SubGroupCounterIncrease(group); if(player) { @@ -1001,7 +1034,10 @@ bool Group::_removeMember(const uint64 &guid) member_witerator slot = _getMemberWSlot(guid); if (slot != m_memberSlots.end()) + { + SubGroupCounterDecrease(slot->group); m_memberSlots.erase(slot); + } if(!isBGGroup()) CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", GUID_LOPART(guid)); @@ -1094,13 +1130,6 @@ void Group::_removeRolls(const uint64 &guid) } } -void Group::_convertToRaid() -{ - m_groupType = GROUPTYPE_RAID; - - if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET isRaid = 1 WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid)); -} - bool Group::_setMembersGroup(const uint64 &guid, const uint8 &group) { member_witerator slot = _getMemberWSlot(guid); @@ -1108,7 +1137,11 @@ bool Group::_setMembersGroup(const uint64 &guid, const uint8 &group) return false; slot->group = group; + + SubGroupCounterIncrease(group); + if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET subgroup='%u' WHERE memberGuid='%u'", group, GUID_LOPART(guid)); + return true; } @@ -1164,10 +1197,16 @@ void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group) Player *player = objmgr.GetPlayer(guid); if (!player) { + uint8 prevSubGroup; + prevSubGroup = GetMemberGroup(guid); + + SubGroupCounterDecrease(prevSubGroup); + if(_setMembersGroup(guid, group)) SendUpdate(); } - else ChangeMembersGroup(player, group); + else + ChangeMembersGroup(player, group); } // only for online members @@ -1177,6 +1216,11 @@ void Group::ChangeMembersGroup(Player *player, const uint8 &group) return; if(_setMembersGroup(player->GetGUID(), group)) { + uint8 prevSubGroup; + prevSubGroup = player->GetSubGroup(); + + SubGroupCounterDecrease(prevSubGroup); + player->GetGroupRef().setSubGroup(group); SendUpdate(); } diff --git a/src/game/Group.h b/src/game/Group.h index 540232731c8..24546195682 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -183,8 +183,8 @@ class TRINITY_DLL_SPEC Group ItemQualities GetLootThreshold() const { return m_lootThreshold; } // member manipulation methods - bool IsMember(uint64 guid) const { return _getMemberCSlot(guid) != m_memberSlots.end(); } - bool IsLeader(uint64 guid) const { return (GetLeaderGUID() == guid); } + bool IsMember(const uint64& guid) const { return _getMemberCSlot(guid) != m_memberSlots.end(); } + bool IsLeader(const uint64& guid) const { return (GetLeaderGUID() == guid); } bool IsAssistant(uint64 guid) const { member_citerator mslot = _getMemberCSlot(guid); @@ -194,7 +194,7 @@ class TRINITY_DLL_SPEC Group return mslot->assistant; } - bool SameSubGroup(uint64 guid1, uint64 guid2) const + bool SameSubGroup(uint64 guid1,const uint64& guid2) const { member_citerator mslot2 = _getMemberCSlot(guid2); if(mslot2==m_memberSlots.end()) @@ -211,6 +211,11 @@ class TRINITY_DLL_SPEC Group return (mslot1->group==slot2->group); } + + bool HasFreeSlotSubGroup(uint8 subgroup) const + { + return (m_subGroupsCounts && m_subGroupsCounts[subgroup] < MAXGROUPSIZE); + } bool SameSubGroup(Player const* member1, Player const* member2) const; @@ -228,25 +233,22 @@ class TRINITY_DLL_SPEC Group } // some additional raid methods - void ConvertToRaid() - { - _convertToRaid(); - SendUpdate(); - } + void ConvertToRaid(); + void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; } uint32 CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); void ChangeMembersGroup(const uint64 &guid, const uint8 &group); void ChangeMembersGroup(Player *player, const uint8 &group); - void SetAssistant(const uint64 &guid, const bool &state) + void SetAssistant(uint64 guid, const bool &state) { if(!isRaidGroup()) return; if(_setAssistantFlag(guid, state)) SendUpdate(); } - void SetMainTank(const uint64 &guid) + void SetMainTank(uint64 guid) { if(!isRaidGroup()) return; @@ -254,7 +256,7 @@ class TRINITY_DLL_SPEC Group if(_setMainTank(guid)) SendUpdate(); } - void SetMainAssistant(const uint64 &guid) + void SetMainAssistant(uint64 guid) { if(!isRaidGroup()) return; @@ -285,12 +287,12 @@ class TRINITY_DLL_SPEC Group /*********************************************************/ void SendLootStartRoll(uint32 CountDown, const Roll &r); - void SendLootRoll(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r); - void SendLootRollWon(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r); + void SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r); + void SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r); void SendLootAllPassed(uint32 NumberOfPlayers, const Roll &r); - void GroupLoot(uint64 playerGUID, Loot *loot, Creature *creature); - void NeedBeforeGreed(uint64 playerGUID, Loot *loot, Creature *creature); - void MasterLoot(uint64 playerGUID, Loot *loot, Creature *creature); + void GroupLoot(const uint64& playerGUID, Loot *loot, Creature *creature); + void NeedBeforeGreed(const uint64& playerGUID, Loot *loot, Creature *creature); + void MasterLoot(const uint64& playerGUID, Loot *loot, Creature *creature); Rolls::iterator GetRoll(uint64 Guid) { Rolls::iterator iter; @@ -304,7 +306,7 @@ class TRINITY_DLL_SPEC Group return RollId.end(); } void CountTheRoll(Rolls::iterator roll, uint32 NumberOfPlayers); - void CountRollVote(uint64 playerGUID, uint64 Guid, uint32 NumberOfPlayers, uint8 Choise); + void CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 NumberOfPlayers, uint8 Choise); void EndRoll(); void LinkMember(GroupReference *pRef) { m_memberMgr.insertFirst(pRef); } @@ -323,13 +325,24 @@ class TRINITY_DLL_SPEC Group void _removeRolls(const uint64 &guid); - void _convertToRaid(); bool _setMembersGroup(const uint64 &guid, const uint8 &group); bool _setAssistantFlag(const uint64 &guid, const bool &state); bool _setMainTank(const uint64 &guid); bool _setMainAssistant(const uint64 &guid); void _homebindIfInstance(Player *player); + + void _initRaidSubGroupsCounter() + { + // Sub group counters initialization + if (!m_subGroupsCounts) + m_subGroupsCounts = new uint8[MAXRAIDSIZE / MAXGROUPSIZE]; + + memset((void*)m_subGroupsCounts, 0, (MAXRAIDSIZE / MAXGROUPSIZE)*sizeof(uint8)); + + for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) + ++m_subGroupsCounts[itr->group]; + } member_citerator _getMemberCSlot(uint64 Guid) const { @@ -350,6 +363,18 @@ class TRINITY_DLL_SPEC Group } return m_memberSlots.end(); } + + void SubGroupCounterIncrease(uint8 subgroup) + { + if (m_subGroupsCounts) + ++m_subGroupsCounts[subgroup]; + } + + void SubGroupCounterDecrease(uint8 subgroup) + { + if (m_subGroupsCounts) + --m_subGroupsCounts[subgroup]; + } MemberSlotList m_memberSlots; GroupRefManager m_memberMgr; @@ -367,5 +392,6 @@ class TRINITY_DLL_SPEC Group uint64 m_looterGuid; Rolls RollId; BoundInstancesMap m_boundInstances[TOTAL_DIFFICULTIES]; + uint8* m_subGroupsCounts; }; #endif diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 90281c15ed7..5f384aa1d8d 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -551,6 +551,9 @@ void WorldSession::HandleGroupChangeSubGroupOpcode( WorldPacket & recv_data ) /** error handling **/ if(!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) return; + + if (!group->HasFreeSlotSubGroup(groupNr)) + return; /********************/ // everything's fine, do it diff --git a/src/game/Language.h b/src/game/Language.h index b4b4ae5e12f..5ef5b9c02f1 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -167,7 +167,8 @@ enum TrinityStrings LANG_MAIL_SENT = 169, LANG_SOUND_NOT_EXIST = 170, LANG_TELEPORTED_TO_BY_CONSOLE = 171, - // Room for more level 1 172-199 not used + LANG_CONSOLE_COMMAND = 172, + // Room for more level 1 173-199 not used // level 2 chat LANG_NO_SELECTION = 200, @@ -316,7 +317,14 @@ enum TrinityStrings LANG_GM_OFF = 333, LANG_GM_CHAT_ON = 334, LANG_GM_CHAT_OFF = 335, - // Room for more level 2 336-399 not used + LANG_YOU_REPAIR_ITEMS = 336, + LANG_YOUR_ITEMS_REPAIRED = 337, + LANG_YOU_SET_WATERWALK = 338, + LANG_YOUR_WATERWALK_SET = 339, + LANG_CREATURE_FOLLOW_YOU_NOW = 340, + LANG_CREATURE_NOT_FOLLOW_YOU = 341, + LANG_CREATURE_NOT_FOLLOW_YOU_NOW = 342, + // Room for more level 2 343-399 not used // level 3 chat LANG_SCRIPTS_RELOADED = 400, @@ -708,7 +716,7 @@ enum TrinityStrings LANG_ITEMLIST_GUILD = 1118, // Room for more level 3 1119-1199 not used - // Trinity custom patches 5000-9999 + // Trinity strings 5000-9999 LANG_COMMAND_FREEZE = 5000, LANG_COMMAND_FREEZE_ERROR = 5001, LANG_COMMAND_FREEZE_WRONG = 5002, @@ -716,7 +724,9 @@ enum TrinityStrings LANG_COMMAND_NO_FROZEN_PLAYERS = 5004, LANG_COMMAND_LIST_FREEZE = 5005, LANG_COMMAND_FROZEN_PLAYERS = 5006, - // Room for more Trinity custom patches 5007-9999 + LANG_INSTANCE_MUST_RAID_GRP = 5007, + LANG_INSTANCE_NOT_AS_GHOST = 5008, + // Room for more Trinity strings 5009-9999 // Use for not-in-svn patches 10000-10999 // opvp hp diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 0e8579b5c00..3543b3b91fa 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -324,7 +324,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) zone_x, zone_y, ground_z, floor_z, have_map, have_vmap ); sLog.outDebug("Player %s GPS call for %s '%s' (%s: %u):", - m_session->GetPlayer()->GetName(), + GetName(), (obj->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), obj->GetName(), (obj->GetTypeId() == TYPEID_PLAYER ? "GUID" : "Entry"), (obj->GetTypeId() == TYPEID_PLAYER ? obj->GetGUIDLow(): obj->GetEntry()) ); sLog.outDebug(GetTrinityString(LANG_MAP_POSITION), @@ -396,9 +396,8 @@ bool ChatHandler::HandleNamegoCommand(const char* args) } PSendSysMessage(LANG_SUMMONING, chr->GetName(),""); - - if (m_session->GetPlayer()->IsVisibleGloballyFor(chr)) - ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, GetName()); // stop flight if need if(chr->isInFlight()) @@ -697,7 +696,8 @@ bool ChatHandler::HandleModifyHPCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_HP, chr->GetName(), hp, hpm); - ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, m_session->GetPlayer()->GetName(), hp, hpm); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetName(), hp, hpm); chr->SetMaxHealth( hpm ); chr->SetHealth( hp ); @@ -740,7 +740,8 @@ bool ChatHandler::HandleModifyManaCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_MANA, chr->GetName(), mana, manam); - ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, m_session->GetPlayer()->GetName(), mana, manam); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetName(), mana, manam); chr->SetMaxPower(POWER_MANA,manam ); chr->SetPower(POWER_MANA, mana ); @@ -784,7 +785,8 @@ bool ChatHandler::HandleModifyEnergyCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_ENERGY, chr->GetName(), energy/10, energym/10); - ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, m_session->GetPlayer()->GetName(), energy/10, energym/10); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetName(), energy/10, energym/10); chr->SetMaxPower(POWER_ENERGY,energym ); chr->SetPower(POWER_ENERGY, energy ); @@ -830,7 +832,8 @@ bool ChatHandler::HandleModifyRageCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_RAGE, chr->GetName(), rage/10, ragem/10); - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_RAGE_CHANGED), m_session->GetPlayer()->GetName(), rage/10, ragem/10); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetName(), rage/10, ragem/10); chr->SetMaxPower(POWER_RAGE,ragem ); chr->SetPower(POWER_RAGE, rage ); @@ -908,11 +911,6 @@ bool ChatHandler::HandleModifyFactionCommand(const char* args) PSendSysMessage(LANG_YOU_CHANGE_FACTION, chr->GetGUIDLow(),factionid,flag,npcflag,dyflag); - //sprintf((char*)buf,"%s changed your Faction to %i.", m_session->GetPlayer()->GetName(), factionid); - //FillSystemMessageData(&data, m_session, buf); - - //chr->GetSession()->SendPacket(&data); - chr->setFaction(factionid); chr->SetUInt32Value(UNIT_FIELD_FLAGS,flag); chr->SetUInt32Value(UNIT_NPC_FLAGS,npcflag); @@ -958,8 +956,8 @@ bool ChatHandler::HandleModifySpellCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, chr->GetName()); - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, m_session->GetPlayer()->GetName(), spellflatid, val, mark); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, GetName(), spellflatid, val, mark); WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1+1+2+2)); data << uint8(spellflatid); @@ -1015,10 +1013,8 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args) { chr->SetTaxiCheater(true); PSendSysMessage(LANG_YOU_GIVE_TAXIS, chr->GetName()); - - if(chr != m_session->GetPlayer()) - // to send localized data to target - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_TAXIS_ADDED), m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetName()); return true; } @@ -1026,9 +1022,8 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args) { chr->SetTaxiCheater(false); PSendSysMessage(LANG_YOU_REMOVE_TAXIS, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_TAXIS_REMOVED), m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetName()); return true; } @@ -1069,9 +1064,8 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_ASPEED_CHANGED), m_session->GetPlayer()->GetName(), ASpeed); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetName(), ASpeed); chr->SetSpeed(MOVE_WALK, ASpeed,true); chr->SetSpeed(MOVE_RUN, ASpeed,true); @@ -1112,9 +1106,8 @@ bool ChatHandler::HandleModifySpeedCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_SPEED_CHANGED), m_session->GetPlayer()->GetName(), Speed); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetName(), Speed); chr->SetSpeed(MOVE_RUN,Speed,true); @@ -1152,9 +1145,8 @@ bool ChatHandler::HandleModifySwimCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_SWIM_SPEED_CHANGED), m_session->GetPlayer()->GetName(), Swim); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetName(), Swim); chr->SetSpeed(MOVE_SWIM,Swim,true); @@ -1192,9 +1184,8 @@ bool ChatHandler::HandleModifyBWalkCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_BACK_SPEED_CHANGED), m_session->GetPlayer()->GetName(), BSpeed); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetName(), BSpeed); chr->SetSpeed(MOVE_WALKBACK,BSpeed,true); @@ -1225,9 +1216,8 @@ bool ChatHandler::HandleModifyFlyCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_FLY_SPEED_CHANGED), m_session->GetPlayer()->GetName(), FSpeed); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetName(), FSpeed); chr->SetSpeed(MOVE_FLY,FSpeed,true); @@ -1257,9 +1247,8 @@ bool ChatHandler::HandleModifyScaleCommand(const char* args) } PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_SIZE_CHANGED), m_session->GetPlayer()->GetName(), Scale); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetName(), Scale); chr->SetFloatValue(OBJECT_FIELD_SCALE_X, Scale); @@ -1501,9 +1490,8 @@ bool ChatHandler::HandleModifyMountCommand(const char* args) } PSendSysMessage(LANG_YOU_GIVE_MOUNT, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_MOUNT_GIVED), m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetName()); chr->SetUInt32Value( UNIT_FIELD_FLAGS , 0x001000 ); chr->Mount(mId); @@ -1550,25 +1538,24 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args) if(newmoney <= 0 ) { PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, chr->GetName()); - - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_ALL_MONEY_GONE), m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetName()); chr->SetMoney(0); } else { PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), chr->GetName()); - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_MONEY_TAKEN), m_session->GetPlayer()->GetName(), abs(addmoney)); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetName(), abs(addmoney)); chr->SetMoney( newmoney ); } } else { PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, chr->GetName()); - if(chr != m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(ChatHandler(chr).GetTrinityString(LANG_YOURS_MONEY_GIVEN), m_session->GetPlayer()->GetName(), addmoney); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetName(), addmoney); chr->ModifyMoney( addmoney ); } @@ -1661,6 +1648,7 @@ bool ChatHandler::HandleTeleCommand(const char * args) // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = extractGameTeleFromLink((char*)args); + if (!tele) { SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); @@ -2074,14 +2062,8 @@ bool ChatHandler::HandleNameTeleCommand(const char * args) } PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str()); - - if (m_session) - { - if(m_session->GetPlayer()->IsVisibleGloballyFor(chr)) - ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName()); - } - else - ChatHandler(chr).SendSysMessage(LANG_TELEPORTED_TO_BY_CONSOLE); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName()); // stop flight if need if(chr->isInFlight()) @@ -2158,9 +2140,8 @@ bool ChatHandler::HandleGroupTeleCommand(const char * args) } PSendSysMessage(LANG_TELEPORTING_TO, pl->GetName(),"", tele->name.c_str()); - - if (m_session->GetPlayer() != pl && m_session->GetPlayer()->IsVisibleGloballyFor(pl)) - ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName()); + if (needReportToTarget(pl)) + ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName()); // stop flight if need if(pl->isInFlight()) @@ -2252,9 +2233,8 @@ bool ChatHandler::HandleGroupgoCommand(const char* args) } PSendSysMessage(LANG_SUMMONING, pl->GetName(),""); - - if (m_session->GetPlayer()->IsVisibleGloballyFor(pl)) - ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, m_session->GetPlayer()->GetName()); + if (needReportToTarget(pl)) + ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, GetName()); // stop flight if need if(pl->isInFlight()) diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 4164c5cde3c..f60b38b5522 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -44,6 +44,8 @@ #include <map> #include "GlobalEvents.h" +#include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand + static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] = { LANG_REP_HATED, LANG_REP_HOSTILE, LANG_REP_UNFRIENDLY, LANG_REP_NEUTRAL, @@ -4052,3 +4054,79 @@ bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/) CorpsesErase(); return true; } + +bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/) +{ + Player *target = getSelectedPlayer(); + + if(!target) + { + PSendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + + // Repair items + target->DurabilityRepairAll(false, 0, false); + + PSendSysMessage(LANG_YOU_REPAIR_ITEMS, target->GetName()); + if(needReportToTarget(target)) + ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetName()); + return true; +} + +bool ChatHandler::HandleNpcFollowCommand(const char* /*args*/) +{ + Player *player = m_session->GetPlayer(); + Creature *creature = getSelectedCreature(); + + if(!creature) + { + PSendSysMessage(LANG_SELECT_CREATURE); + SetSentErrorMessage(true); + return false; + } + + // Follow player - Using pet's default dist and angle + creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + PSendSysMessage(LANG_CREATURE_FOLLOW_YOU_NOW, creature->GetName()); + return true; +} + +bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/) +{ + Player *player = m_session->GetPlayer(); + Creature *creature = getSelectedCreature(); + + if(!creature) + { + PSendSysMessage(LANG_SELECT_CREATURE); + SetSentErrorMessage(true); + return false; + } + + if (creature->GetMotionMaster()->empty() || + creature->GetMotionMaster()->GetCurrentMovementGeneratorType ()!=TARGETED_MOTION_TYPE) + { + PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU); + SetSentErrorMessage(true); + return false; + } + + TargetedMovementGenerator<Creature> const* mgen + = static_cast<TargetedMovementGenerator<Creature> const*>((creature->GetMotionMaster()->top())); + + if(mgen->GetTarget()!=player) + { + PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU); + SetSentErrorMessage(true); + return false; + } + + // reset movement + creature->GetMotionMaster()->MovementExpired(true); + + PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU_NOW, creature->GetName()); + return true; +} diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index c2c8645a27d..74986f217d4 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -747,7 +747,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) if(targetPlayer) { - ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm); + ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,GetName(), gm); targetPlayer->GetSession()->SetSecurity(gm); } @@ -3728,14 +3728,14 @@ bool ChatHandler::HandleExploreCheatCommand(const char* args) if (flag != 0) { PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, chr->GetName()); - if(chr!=m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL,m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL,GetName()); } else { PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, chr->GetName()); - if(chr!=m_session->GetPlayer()) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING,m_session->GetPlayer()->GetName()); + if (needReportToTarget(chr)) + ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING,GetName()); } for (uint8 i=0; i<128; i++) @@ -3772,6 +3772,36 @@ bool ChatHandler::HandleHoverCommand(const char* args) return true; } +bool ChatHandler::HandleWaterwalkCommand(const char* args) +{ + if(!args) + return false; + + Player *player = getSelectedPlayer(); + if(!player) + { + PSendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + + if (strncmp(args, "on", 3) == 0) + player->SetMovement(MOVE_WATER_WALK); // ON + else if (strncmp(args, "off", 4) == 0) + player->SetMovement(MOVE_LAND_WALK); // OFF + else + { + SendSysMessage(LANG_USE_BOL); + return false; + } + + PSendSysMessage(LANG_YOU_SET_WATERWALK, args, player->GetName()); + if(needReportToTarget(player)) + ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetName()); + return true; + +} + bool ChatHandler::HandleLevelUpCommand(const char* args) { char* px = strtok((char*)args, " "); diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index e80cab60144..86206fef49b 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -165,7 +165,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player) { // probably there must be special opcode, because client has this string constant in GlobalStrings.lua // TODO: this is not a good place to send the message - player->GetSession()->SendAreaTriggerMessage("You must be in a raid group to enter %s instance", mapName); + player->GetSession()->SendAreaTriggerMessage(player->GetSession()->GetTrinityString(810), mapName); sLog.outDebug("MAP: Player '%s' must be in a raid group to enter instance of '%s'", player->GetName(), mapName); return false; } @@ -197,7 +197,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player) if (!instance_map) { - player->GetSession()->SendAreaTriggerMessage("You cannot enter %s while in a ghost mode", mapName); + player->GetSession()->SendAreaTriggerMessage(player->GetSession()->GetTrinityString(811), mapName); sLog.outDebug("MAP: Player '%s' doesn't has a corpse in instance '%s' and can't enter", player->GetName(), mapName); return false; } |