mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/RBAC: Move group commands to RBAC (using individual permissions)
- group commands moved from cs_misc.cpp to own file - renamed groupsummon to "group summon"
This commit is contained in:
25
sql/updates/auth/2013_09_10_00_auth_misc.sql
Normal file
25
sql/updates/auth/2013_09_10_00_auth_misc.sql
Normal file
@@ -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);
|
||||
15
sql/updates/world/2013_09_10_01_world_command.sql
Normal file
15
sql/updates/world/2013_09_10_01_world_command.sql
Normal file
@@ -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';
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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")
|
||||
|
||||
338
src/server/scripts/Commands/cs_group.cpp
Normal file
338
src/server/scripts/Commands/cs_group.cpp
Normal file
@@ -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();
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user