aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/auth/2013_09_10_00_auth_misc.sql25
-rw-r--r--sql/updates/world/2013_09_10_01_world_command.sql15
-rw-r--r--src/server/game/Accounts/RBAC.h14
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp2
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt104
-rw-r--r--src/server/scripts/Commands/cs_group.cpp338
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp273
7 files changed, 394 insertions, 377 deletions
diff --git a/sql/updates/auth/2013_09_10_00_auth_misc.sql b/sql/updates/auth/2013_09_10_00_auth_misc.sql
new file mode 100644
index 00000000000..f62ecd83cab
--- /dev/null
+++ b/sql/updates/auth/2013_09_10_00_auth_misc.sql
@@ -0,0 +1,25 @@
+/* cs_group.cpp */
+
+SET @id = 472;
+
+-- Add new permissions
+DELETE FROM `rbac_permissions` WHERE `id` BETWEEN @id AND @id+6;
+INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
+(@id+0 , 'group'),
+(@id+1 , 'group leader'),
+(@id+2 , 'group disband'),
+(@id+3 , 'group remove'),
+(@id+4 , 'group join'),
+(@id+5 , 'group list'),
+(@id+6 , 'group summon');
+
+-- Add permissions to "corresponding Commands Role"
+DELETE FROM `rbac_role_permissions` WHERE `permissionId` BETWEEN @id AND @id+6;
+INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
+(4, @id+0),
+(4, @id+1),
+(4, @id+2),
+(4, @id+3),
+(4, @id+4),
+(4, @id+5),
+(4, @id+6);
diff --git a/sql/updates/world/2013_09_10_01_world_command.sql b/sql/updates/world/2013_09_10_01_world_command.sql
new file mode 100644
index 00000000000..3c287422cac
--- /dev/null
+++ b/sql/updates/world/2013_09_10_01_world_command.sql
@@ -0,0 +1,15 @@
+/* cs_group.cpp */
+
+SET @id = 472;
+
+-- Update command table with new RBAC permissions
+UPDATE `command` SET `permission` = @id+0 WHERE `name` = 'group';
+UPDATE `command` SET `permission` = @id+1 WHERE `name` = 'group leader';
+UPDATE `command` SET `permission` = @id+2 WHERE `name` = 'group disband';
+UPDATE `command` SET `permission` = @id+3 WHERE `name` = 'group remove';
+UPDATE `command` SET `permission` = @id+4 WHERE `name` = 'group join';
+UPDATE `command` SET `permission` = @id+5 WHERE `name` = 'group list';
+
+UPDATE `command` SET `permission` = @id+6, `name` = 'group summon', `help` =
+'Syntax: .group summon [$charactername]\r\n\r\nTeleport the given character and his group to you. Teleported only online characters but original selected group member can be offline.'
+WHERE `name` = 'groupsummon';
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 492a7197cfe..e03daba50bd 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -177,11 +177,11 @@ enum RBACPermissions
RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION = 275,
RBAC_PERM_COMMAND_CHARACTER_CHANGERACE = 276,
RBAC_PERM_COMMAND_CHARACTER_DELETED = 277,
- RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278,
RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279,
RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280,
- RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281, // Not in DB - console
- RBAC_PERM_COMMAND_CHARACTER_ERASE = 282, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281,
+ RBAC_PERM_COMMAND_CHARACTER_ERASE = 282,
RBAC_PERM_COMMAND_CHARACTER_LEVEL = 283,
RBAC_PERM_COMMAND_CHARACTER_RENAME = 284,
RBAC_PERM_COMMAND_CHARACTER_REPUTATION = 285,
@@ -299,6 +299,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_GOBJECT_SET_STATE = 397,
RBAC_PERM_COMMAND_GOBJECT_TARGET = 398,
RBAC_PERM_COMMAND_GOBJECT_TURN = 399,
+ // 400 - reuse
RBAC_PERM_COMMAND_GUILD = 401,
RBAC_PERM_COMMAND_GUILD_CREATE = 402,
RBAC_PERM_COMMAND_GUILD_DELETE = 403,
@@ -370,6 +371,13 @@ enum RBACPermissions
RBAC_PERM_COMMAND_NAMEANNOUNCE = 469,
RBAC_PERM_COMMAND_NOTIFY = 470,
RBAC_PERM_COMMAND_WHISPERS = 471,
+ RBAC_PERM_COMMAND_GROUP = 472,
+ RBAC_PERM_COMMAND_GROUP_LEADER = 473,
+ RBAC_PERM_COMMAND_GROUP_DISBAND = 474,
+ RBAC_PERM_COMMAND_GROUP_REMOVE = 475,
+ RBAC_PERM_COMMAND_GROUP_JOIN = 476,
+ RBAC_PERM_COMMAND_GROUP_LIST = 477,
+ RBAC_PERM_COMMAND_GROUP_SUMMON = 478,
// custom permissions 1000+
RBAC_PERM_MAX
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 3456041ddb2..c3b2b2038a3 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -59,6 +59,7 @@ void AddSC_event_commandscript();
void AddSC_gm_commandscript();
void AddSC_go_commandscript();
void AddSC_gobject_commandscript();
+void AddSC_group_commandscript();
void AddSC_guild_commandscript();
void AddSC_honor_commandscript();
void AddSC_instance_commandscript();
@@ -740,6 +741,7 @@ void AddCommandScripts()
AddSC_gm_commandscript();
AddSC_go_commandscript();
AddSC_gobject_commandscript();
+ AddSC_group_commandscript();
AddSC_guild_commandscript();
AddSC_honor_commandscript();
AddSC_instance_commandscript();
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index ce31fa1f4d3..c38789ed90a 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -8,109 +8,11 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+file(GLOB_RECURSE sources_Commands Commands/*.cpp Commands/*.h)
+
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- Commands/cs_account.cpp
- Commands/cs_achievement.cpp
- Commands/cs_arena.cpp
- Commands/cs_ban.cpp
- Commands/cs_bf.cpp
- Commands/cs_cast.cpp
- Commands/cs_character.cpp
- Commands/cs_cheat.cpp
- Commands/cs_debug.cpp
- Commands/cs_deserter.cpp
- Commands/cs_disable.cpp
- Commands/cs_event.cpp
- Commands/cs_gm.cpp
- Commands/cs_go.cpp
- Commands/cs_gobject.cpp
- Commands/cs_guild.cpp
- Commands/cs_honor.cpp
- Commands/cs_instance.cpp
- Commands/cs_learn.cpp
- Commands/cs_lfg.cpp
- Commands/cs_list.cpp
- Commands/cs_lookup.cpp
- Commands/cs_message.cpp
- Commands/cs_misc.cpp
- Commands/cs_modify.cpp
- Commands/cs_npc.cpp
- Commands/cs_quest.cpp
- Commands/cs_rbac.cpp
- Commands/cs_reload.cpp
- Commands/cs_reset.cpp
- Commands/cs_tele.cpp
- Commands/cs_ticket.cpp
- Commands/cs_server.cpp
- Commands/cs_titles.cpp
- Commands/cs_wp.cpp
- Commands/cs_mmaps.cpp
-# Commands/cs_pdump.cpp
-# Commands/cs_channel.cpp
-# Commands/cs_pet.cpp
-# Commands/cs_aura.cpp
-# Commands/cs_unaura.cpp
-# Commands/cs_nameannounce.cpp
-# Commands/cs_gmnameannounce.cpp
-# Commands/cs_announce.cpp
-# Commands/cs_gmannounce.cpp
-# Commands/cs_notify.cpp
-# Commands/cs_gmnotify.cpp
-# Commands/cs_appear.cpp
-# Commands/cs_summon.cpp
-# Commands/cs_groupsummon.cpp
-# Commands/cs_commands.cpp
-# Commands/cs_demorph.cpp
-# Commands/cs_die.cpp
-# Commands/cs_revive.cpp
-# Commands/cs_dismount.cpp
-# Commands/cs_guid.cpp
-# Commands/cs_help.cpp
-# Commands/cs_itemmove.cpp
-# Commands/cs_cooldown.cpp
-# Commands/cs_unlearn.cpp
-# Commands/cs_distance.cpp
-# Commands/cs_recall.cpp
-# Commands/cs_save.cpp
-# Commands/cs_saveall.cpp
-# Commands/cs_kick.cpp
-# Commands/cs_start.cpp
-# Commands/cs_taxicheat.cpp
-# Commands/cs_linkgrave.cpp
-# Commands/cs_neargrave.cpp
-# Commands/cs_explorecheat.cpp
-# Commands/cs_hover.cpp
-# Commands/cs_levelup.cpp
-# Commands/cs_showarea.cpp
-# Commands/cs_hidearea.cpp
-# Commands/cs_additem.cpp
-# Commands/cs_additemset.cpp
-# Commands/cs_bank.cpp
-# Commands/cs_wchange.cpp
-# Commands/cs_maxskill.cpp
-# Commands/cs_setskill.cpp
-# Commands/cs_whispers.cpp
-# Commands/cs_pinfo.cpp
-# Commands/cs_respawn.cpp
-# Commands/cs_send.cpp
-# Commands/cs_mute.cpp
-# Commands/cs_unmute.cpp
-# Commands/cs_movegens.cpp
-# Commands/cs_cometome.cpp
-# Commands/cs_damage.cpp
-# Commands/cs_combatstop.cpp
-# Commands/cs_flusharenapoints.cpp
-# Commands/cs_repairitems.cpp
-# Commands/cs_waterwalk.cpp
-# Commands/cs_freeze.cpp
-# Commands/cs_unfreeze.cpp
-# Commands/cs_listfreeze.cpp
-# Commands/cs_possess.cpp
-# Commands/cs_unpossess.cpp
-# Commands/cs_bindsight.cpp
-# Commands/cs_unbindsight.cpp
-# Commands/cs_playall.cpp
+ ${sources_Commands}
)
message(" -> Prepared: Commands")
diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp
new file mode 100644
index 00000000000..784ff216c41
--- /dev/null
+++ b/src/server/scripts/Commands/cs_group.cpp
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Chat.h"
+#include "Language.h"
+#include "LFG.h"
+#include "Player.h"
+#include "ObjectMgr.h"
+#include "GroupMgr.h"
+#include "ScriptMgr.h"
+
+class group_commandscript : public CommandScript
+{
+public:
+ group_commandscript() : CommandScript("group_commandscript") { }
+
+ ChatCommand* GetCommands() const OVERRIDE
+ {
+ static ChatCommand groupCommandTable[] =
+ {
+ { "leader", RBAC_PERM_COMMAND_GROUP_LEADER, false, &HandleGroupLeaderCommand, "", NULL },
+ { "disband", RBAC_PERM_COMMAND_GROUP_DISBAND, false, &HandleGroupDisbandCommand, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_GROUP_REMOVE, false, &HandleGroupRemoveCommand, "", NULL },
+ { "join", RBAC_PERM_COMMAND_GROUP_JOIN, false, &HandleGroupJoinCommand, "", NULL },
+ { "list", RBAC_PERM_COMMAND_GROUP_LIST, false, &HandleGroupListCommand, "", NULL },
+ { "summon", RBAC_PERM_COMMAND_GROUP_SUMMON, false, &HandleGroupSummonCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "group", RBAC_PERM_COMMAND_GROUP, false, NULL, "", groupCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ // Summon group of player
+ static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ Group* group = target->GetGroup();
+
+ std::string nameLink = handler->GetNameLink(target);
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* gmPlayer = handler->GetSession()->GetPlayer();
+ Group* gmGroup = gmPlayer->GetGroup();
+ Map* gmMap = gmPlayer->GetMap();
+ bool toInstance = gmMap->Instanceable();
+
+ // we are in instance, and can summon only player in our group with us as lead
+ if (toInstance && (
+ !gmGroup || group->GetLeaderGUID() != gmPlayer->GetGUID() ||
+ gmGroup->GetLeaderGUID() != gmPlayer->GetGUID()))
+ // the last check is a bit excessive, but let it be, just in case
+ {
+ handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* player = itr->GetSource();
+
+ if (!player || player == gmPlayer || !player->GetSession())
+ continue;
+
+ // check online security
+ if (handler->HasLowerSecurity(player, 0))
+ return false;
+
+ std::string plNameLink = handler->GetNameLink(player);
+
+ if (player->IsBeingTeleported())
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (toInstance)
+ {
+ Map* playerMap = player->GetMap();
+
+ if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId())
+ {
+ // cannot summon from instance to instance
+ handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
+ if (handler->needReportToTarget(player))
+ ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
+
+ // stop flight if need
+ if (player->IsInFlight())
+ {
+ player->GetMotionMaster()->MovementExpired();
+ player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ player->SaveRecallPosition();
+
+ // before GM
+ float x, y, z;
+ gmPlayer->GetClosePoint(x, y, z, player->GetObjectSize());
+ player->TeleportTo(gmPlayer->GetMapId(), x, y, z, player->GetOrientation());
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (group->GetLeaderGUID() != guid)
+ {
+ group->ChangeLeader(guid);
+ group->SendUpdate();
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ group->Disband();
+ return true;
+ }
+
+ static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ group->RemoveMember(guid);
+ return true;
+ }
+
+ static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerSource = NULL;
+ Player* playerTarget = NULL;
+ Group* groupSource = NULL;
+ Group* groupTarget = NULL;
+ uint64 guidSource = 0;
+ uint64 guidTarget = 0;
+ char* nameplgrStr = strtok((char*)args, " ");
+ char* nameplStr = strtok(NULL, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
+ return false;
+
+ if (!groupSource)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
+ return false;
+
+ if (groupTarget || playerTarget->GetGroup() == groupSource)
+ {
+ handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!groupSource->IsFull())
+ {
+ handler->PSendSysMessage(LANG_GROUP_FULL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ groupSource->AddMember(playerTarget);
+ groupSource->BroadcastGroupUpdate();
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
+ return true;
+ }
+
+ static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ Player* playerTarget;
+ uint64 guidTarget;
+ std::string nameTarget;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
+ {
+ playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ guidTarget = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
+ return false;
+
+ Group* groupTarget = NULL;
+ if (playerTarget)
+ groupTarget = playerTarget->GetGroup();
+
+ if (!groupTarget)
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
+ stmt->setUInt32(0, guidTarget);
+ PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
+ if (resultGroup)
+ groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
+ }
+
+ if (!groupTarget)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
+ Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
+ for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ Group::MemberSlot const& slot = *itr;
+
+ std::string flags;
+ if (slot.flags & MEMBER_FLAG_ASSISTANT)
+ flags = "Assistant";
+
+ if (slot.flags & MEMBER_FLAG_MAINTANK)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainTank");
+ }
+
+ if (slot.flags & MEMBER_FLAG_MAINASSIST)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainAssist");
+ }
+
+ if (flags.empty())
+ flags = "None";
+
+ Player* p = ObjectAccessor::FindPlayer((*itr).guid);
+ const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
+
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
+ GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
+ }
+
+ return true;
+ }
+};
+
+void AddSC_group_commandscript()
+{
+ new group_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 9c29e31af96..ce7c3e0f3a1 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -44,15 +44,6 @@ public:
ChatCommand* GetCommands() const OVERRIDE
{
- static ChatCommand groupCommandTable[] =
- {
- { "leader", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupLeaderCommand, "", NULL },
- { "disband", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupDisbandCommand, "", NULL },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupRemoveCommand, "", NULL },
- { "join", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupJoinCommand, "", NULL },
- { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupListCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
static ChatCommand petCommandTable[] =
{
{ "create", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCreatePetCommand, "", NULL },
@@ -76,7 +67,6 @@ public:
{ "unaura", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleUnAuraCommand, "", NULL },
{ "appear", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleAppearCommand, "", NULL },
{ "summon", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleSummonCommand, "", NULL },
- { "groupsummon", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGroupSummonCommand, "", NULL },
{ "commands", RBAC_PERM_PLAYER_COMMANDS, true, &HandleCommandsCommand, "", NULL },
{ "die", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDieCommand, "", NULL },
{ "revive", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReviveCommand, "", NULL },
@@ -116,7 +106,6 @@ public:
{ "freeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleFreezeCommand, "", NULL },
{ "unfreeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleUnFreezeCommand, "", NULL },
{ "listfreeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleListFreezeCommand, "", NULL },
- { "group", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", groupCommandTable },
{ "possess", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandlePossessCommand, "", NULL },
{ "unpossess", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandleUnPossessCommand, "", NULL },
{ "bindsight", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandleBindSightCommand, "", NULL },
@@ -546,97 +535,6 @@ public:
return true;
}
- // Summon group of player
- static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
- {
- Player* target;
- if (!handler->extractPlayerTarget((char*)args, &target))
- return false;
-
- // check online security
- if (handler->HasLowerSecurity(target, 0))
- return false;
-
- Group* group = target->GetGroup();
-
- std::string nameLink = handler->GetNameLink(target);
-
- if (!group)
- {
- handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- Map* gmMap = handler->GetSession()->GetPlayer()->GetMap();
- bool toInstance = gmMap->Instanceable();
-
- // we are in instance, and can summon only player in our group with us as lead
- if (toInstance && (
- !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) ||
- (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())))
- // the last check is a bit excessive, but let it be, just in case
- {
- handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* player = itr->GetSource();
-
- if (!player || player == handler->GetSession()->GetPlayer() || !player->GetSession())
- continue;
-
- // check online security
- if (handler->HasLowerSecurity(player, 0))
- return false;
-
- std::string plNameLink = handler->GetNameLink(player);
-
- if (player->IsBeingTeleported() == true)
- {
- handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- if (toInstance)
- {
- Map* playerMap = player->GetMap();
-
- if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId())
- {
- // cannot summon from instance to instance
- handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
- }
-
- handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
- if (handler->needReportToTarget(player))
- ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
-
- // stop flight if need
- if (player->IsInFlight())
- {
- player->GetMotionMaster()->MovementExpired();
- player->CleanupAfterTaxiFlight();
- }
- // save only in non-flight case
- else
- player->SaveRecallPosition();
-
- // before GM
- float x, y, z;
- handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize());
- player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation());
- }
-
- return true;
- }
static bool HandleCommandsCommand(ChatHandler* handler, char const* /*args*/)
{
@@ -2894,177 +2792,6 @@ public:
return true;
}
- static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
- if (group && group->GetLeaderGUID() != guid)
- {
- group->ChangeLeader(guid);
- group->SendUpdate();
- }
-
- return true;
- }
-
- static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
- if (group)
- group->Disband();
-
- return true;
- }
-
- static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid, true))
- if (group)
- group->RemoveMember(guid);
-
- return true;
- }
-
- static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
- {
- if (!*args)
- return false;
-
- Player* playerSource = NULL;
- Player* playerTarget = NULL;
- Group* groupSource = NULL;
- Group* groupTarget = NULL;
- uint64 guidSource = 0;
- uint64 guidTarget = 0;
- char* nameplgrStr = strtok((char*)args, " ");
- char* nameplStr = strtok(NULL, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
- {
- if (groupSource)
- {
- if (handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
- {
- if (!groupTarget && playerTarget->GetGroup() != groupSource)
- {
- if (!groupSource->IsFull())
- {
- groupSource->AddMember(playerTarget);
- groupSource->BroadcastGroupUpdate();
- handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
- return true;
- }
- else
- {
- // group is full
- handler->PSendSysMessage(LANG_GROUP_FULL);
- return true;
- }
- }
- else
- {
- // group is full or target player already in a group
- handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
- return true;
- }
- }
- }
- else
- {
- // specified source player is not in a group
- handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
- return true;
- }
- }
-
- return true;
- }
-
- static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
- {
- Player* playerTarget;
- uint64 guidTarget;
- std::string nameTarget;
-
- uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
-
- if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
- {
- playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
- guidTarget = parseGUID;
- }
- else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
- return false;
-
- Group* groupTarget = NULL;
- if (playerTarget)
- groupTarget = playerTarget->GetGroup();
-
- if (!groupTarget)
- {
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
- stmt->setUInt32(0, guidTarget);
- PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
- if (resultGroup)
- groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
- }
-
- if (groupTarget)
- {
- handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
- Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
- for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
- {
- Group::MemberSlot const& slot = *itr;
-
- std::string flags;
- if (slot.flags & MEMBER_FLAG_ASSISTANT)
- flags = "Assistant";
-
- if (slot.flags & MEMBER_FLAG_MAINTANK)
- {
- if (!flags.empty())
- flags.append(", ");
- flags.append("MainTank");
- }
-
- if (slot.flags & MEMBER_FLAG_MAINASSIST)
- {
- if (!flags.empty())
- flags.append(", ");
- flags.append("MainAssist");
- }
-
- if (flags.empty())
- flags = "None";
-
- Player* p = ObjectAccessor::FindPlayer((*itr).guid);
- const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
-
- handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
- GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
- }
- }
- else
- handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
-
- return true;
- }
-
static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
{
if (!*args)