aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/game/Instances/InstanceScript.h2
-rw-r--r--src/server/game/Miscellaneous/Language.h4
-rw-r--r--src/server/scripts/Commands/cs_instance.cpp144
4 files changed, 146 insertions, 6 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 020ed1a686a..afaf1999d45 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -698,6 +698,8 @@ enum RBACPermissions
RBAC_PERM_COMMAND_AHBOT_RELOAD = 792,
RBAC_PERM_COMMAND_AHBOT_STATUS = 793,
RBAC_PERM_COMMAND_GUILD_INFO = 794,
+ RBAC_PERM_COMMAND_INSTANCE_SET_BOSS_STATE = 795,
+ RBAC_PERM_COMMAND_INSTANCE_GET_BOSS_STATE = 796,
// custom permissions 1000+
RBAC_PERM_MAX
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 4b5a461418d..f16ed4fdc97 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -241,6 +241,8 @@ class InstanceScript : public ZoneScript
virtual void FillInitialWorldStates(WorldPacket& /*data*/) { }
+ uint32 GetEncounterCount() const { return bosses.size(); }
+
protected:
void SetHeaders(std::string const& dataHeaders);
void SetBossNumber(uint32 number) { bosses.resize(number); }
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index ae8221ef49f..f7db4e0f9bd 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1108,8 +1108,10 @@ enum TrinityStrings
LANG_COMMAND_INST_STAT_GROUPSBOUND = 5054,
LANG_NOT_DUNGEON = 5055, // Map is not a dungeon.
LANG_NO_INSTANCE_DATA = 5056, // Map has no instance data.
+ LANG_COMMAND_INST_SET_BOSS_STATE = 5057,
+ LANG_COMMAND_INST_GET_BOSS_STATE = 5058,
- // Room for more Trinity strings 5057-9999
+ // Room for more Trinity strings 5059-9999
// Level requirement notifications
LANG_SAY_REQ = 6604,
diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp
index a426c49a5f7..d2cec87e08f 100644
--- a/src/server/scripts/Commands/cs_instance.cpp
+++ b/src/server/scripts/Commands/cs_instance.cpp
@@ -40,11 +40,13 @@ public:
{
static ChatCommand instanceCommandTable[] =
{
- { "listbinds", rbac::RBAC_PERM_COMMAND_INSTANCE_LISTBINDS, false, &HandleInstanceListBindsCommand, "", NULL },
- { "unbind", rbac::RBAC_PERM_COMMAND_INSTANCE_UNBIND, false, &HandleInstanceUnbindCommand, "", NULL },
- { "stats", rbac::RBAC_PERM_COMMAND_INSTANCE_STATS, true, &HandleInstanceStatsCommand, "", NULL },
- { "savedata", rbac::RBAC_PERM_COMMAND_INSTANCE_SAVEDATA, false, &HandleInstanceSaveDataCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "listbinds", rbac::RBAC_PERM_COMMAND_INSTANCE_LISTBINDS, false, &HandleInstanceListBindsCommand, "", NULL },
+ { "unbind", rbac::RBAC_PERM_COMMAND_INSTANCE_UNBIND, false, &HandleInstanceUnbindCommand, "", NULL },
+ { "stats", rbac::RBAC_PERM_COMMAND_INSTANCE_STATS, true, &HandleInstanceStatsCommand, "", NULL },
+ { "savedata", rbac::RBAC_PERM_COMMAND_INSTANCE_SAVEDATA, false, &HandleInstanceSaveDataCommand, "", NULL },
+ { "setbossstate", rbac::RBAC_PERM_COMMAND_INSTANCE_SET_BOSS_STATE, true, &HandleInstanceSetBossStateCommand, "", NULL },
+ { "getbossstate", rbac::RBAC_PERM_COMMAND_INSTANCE_GET_BOSS_STATE, true, &HandleInstanceGetBossStateCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
@@ -187,6 +189,138 @@ public:
return true;
}
+
+ static bool HandleInstanceSetBossStateCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char* param1 = strtok((char*)args, " ");
+ char* param2 = strtok(nullptr, " ");
+ char* param3 = strtok(nullptr, " ");
+ uint32 encounterId = 0;
+ int32 state = 0;
+ Player* player = nullptr;
+ std::string playerName;
+
+ // Character name must be provided when using this from console.
+ if (!param2 || (!param3 && !handler->GetSession()))
+ {
+ handler->PSendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!param3)
+ player = handler->GetSession()->GetPlayer();
+ else
+ {
+ playerName = param3;
+ if (normalizePlayerName(playerName))
+ player = sObjectAccessor->FindPlayerByName(playerName);
+ }
+
+ if (!player)
+ {
+ handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Map* map = player->GetMap();
+ if (!map->IsDungeon())
+ {
+ handler->PSendSysMessage(LANG_NOT_DUNGEON);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!map->ToInstanceMap()->GetInstanceScript())
+ {
+ handler->PSendSysMessage(LANG_NO_INSTANCE_DATA);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ encounterId = atoi(param1);
+ state = atoi(param2);
+
+ // Reject improper values.
+ if (state > TO_BE_DECIDED || encounterId > map->ToInstanceMap()->GetInstanceScript()->GetEncounterCount())
+ {
+ handler->PSendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ map->ToInstanceMap()->GetInstanceScript()->SetBossState(encounterId, (EncounterState)state);
+ handler->PSendSysMessage(LANG_COMMAND_INST_SET_BOSS_STATE, encounterId, state);
+ return true;
+ }
+
+ static bool HandleInstanceGetBossStateCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char* param1 = strtok((char*)args, " ");
+ char* param2 = strtok(nullptr, " ");
+ uint32 encounterId = 0;
+ Player* player = nullptr;
+ std::string playerName;
+
+ // Character name must be provided when using this from console.
+ if (!param1 || (!param2 && !handler->GetSession()))
+ {
+ handler->PSendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!param2)
+ player = handler->GetSession()->GetPlayer();
+ else
+ {
+ playerName = param2;
+ if (normalizePlayerName(playerName))
+ player = sObjectAccessor->FindPlayerByName(playerName);
+ }
+
+ if (!player)
+ {
+ handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Map* map = player->GetMap();
+ if (!map->IsDungeon())
+ {
+ handler->PSendSysMessage(LANG_NOT_DUNGEON);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!map->ToInstanceMap()->GetInstanceScript())
+ {
+ handler->PSendSysMessage(LANG_NO_INSTANCE_DATA);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (encounterId > map->ToInstanceMap()->GetInstanceScript()->GetEncounterCount())
+ {
+ handler->PSendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ encounterId = atoi(param1);
+
+ uint8 state = map->ToInstanceMap()->GetInstanceScript()->GetBossState(encounterId);
+ handler->PSendSysMessage(LANG_COMMAND_INST_GET_BOSS_STATE, encounterId, state);
+ return true;
+ }
};
void AddSC_instance_commandscript()