Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
cs_instance.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7Name: instance_commandscript
8%Complete: 100
9Comment: All instance related commands
10Category: commandscripts
11EndScriptData */
12
13#include "Chat.h"
14#include "Group.h"
15#include "InstanceSaveMgr.h"
16#include "InstanceScript.h"
17#include "MapManager.h"
18#include "Player.h"
19#include "ScriptMgr.h"
20
22{
23public:
24 instance_commandscript() : CommandScript("instance_commandscript") { }
25
26 std::vector<ChatCommand> GetCommands() const OVERRIDE
27 {
28 static std::vector<ChatCommand> instanceCommandTable =
29 {
34 };
35
36 static std::vector<ChatCommand> commandTable =
37 {
38 { "instance", rbac::RBAC_PERM_COMMAND_INSTANCE, true, NULL, "", instanceCommandTable },
39 };
40
41 return commandTable;
42 }
43
44 static std::string GetTimeString(uint64 time)
45 {
46 uint64 days = time / DAY, hours = (time % DAY) / HOUR, minute = (time % HOUR) / MINUTE;
47 std::ostringstream ss;
48 if (days)
49 ss << days << "d ";
50 if (hours)
51 ss << hours << "h ";
52 ss << minute << 'm';
53 return ss.str();
54 }
55
56 static bool HandleInstanceListBindsCommand(ChatHandler* handler, char const* /*args*/)
57 {
58 Player* player = handler->getSelectedPlayer();
59 if (!player)
60 player = handler->GetSession()->GetPlayer();
61
62 uint32 counter = 0;
63 for (uint8 i = 0; i < 15; ++i)
64 {
66 for (Player::BoundInstancesMap::const_iterator itr = binds.begin(); itr != binds.end(); ++itr)
67 {
68 InstanceSave* save = itr->second.save;
69 std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
70 handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
71 counter++;
72 }
73 }
74 handler->PSendSysMessage("player binds: %d", counter);
75
76 counter = 0;
77 if (Group* group = player->GetGroup())
78 {
79 for (uint8 i = 0; i < 15; ++i)
80 {
81 Group::BoundInstancesMap& binds = group->GetBoundInstances(DifficultyID(i));
82 for (Group::BoundInstancesMap::const_iterator itr = binds.begin(); itr != binds.end(); ++itr)
83 {
84 InstanceSave* save = itr->second.save;
85 std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
86 handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
87 counter++;
88 }
89 }
90 }
91 handler->PSendSysMessage("group binds: %d", counter);
92
93 return true;
94 }
95
96 static bool HandleInstanceUnbindCommand(ChatHandler* handler, char const* args)
97 {
98 if (!*args)
99 return false;
100
101 Player* player = handler->getSelectedPlayer();
102 if (!player)
103 player = handler->GetSession()->GetPlayer();
104
105 char* map = strtok((char*)args, " ");
106 char* pDiff = strtok(NULL, " ");
107 int8 diff = -1;
108 if (pDiff)
109 diff = atoi(pDiff);
110 uint16 counter = 0;
111 uint16 MapId = 0;
112
113 if (strcmp(map, "all"))
114 {
115 MapId = uint16(atoi(map));
116 if (!MapId)
117 return false;
118 }
119
120 for (uint8 i = 0; i < 15; ++i)
121 {
123 for (Player::BoundInstancesMap::iterator itr = binds.begin(); itr != binds.end();)
124 {
125 InstanceSave* save = itr->second.save;
126 if (itr->first != player->GetMapId() && (!MapId || MapId == itr->first) && (diff == -1 || diff == save->GetDifficulty()))
127 {
128 std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
129 handler->PSendSysMessage("unbinding map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
130 player->UnbindInstance(itr, DifficultyID(i));
131 counter++;
132 }
133 else
134 ++itr;
135 }
136 }
137 handler->PSendSysMessage("instances unbound: %d", counter);
138
139 return true;
140 }
141
142 static bool HandleInstanceStatsCommand(ChatHandler* handler, char const* /*args*/)
143 {
144 handler->PSendSysMessage("instances loaded: %d", sMapMgr->GetNumInstances());
145 handler->PSendSysMessage("players in instances: %d", sMapMgr->GetNumPlayersInInstances());
146 handler->PSendSysMessage("instance saves: %d", sInstanceSaveMgr->GetNumInstanceSaves());
147 handler->PSendSysMessage("players bound: %d", sInstanceSaveMgr->GetNumBoundPlayersTotal());
148 handler->PSendSysMessage("groups bound: %d", sInstanceSaveMgr->GetNumBoundGroupsTotal());
149
150 return true;
151 }
152
153 static bool HandleInstanceSaveDataCommand(ChatHandler* handler, char const* /*args*/)
154 {
155 Player* player = handler->GetSession()->GetPlayer();
156 Map* map = player->GetMap();
157 if (!map->IsInstance())
158 {
159 handler->PSendSysMessage("Map is not an instance.");
160 handler->SetSentErrorMessage(true);
161 return false;
162 }
163
164 if (!((InstanceMap*)map)->GetInstanceScript())
165 {
166 handler->PSendSysMessage("Map has no instance data.");
167 handler->SetSentErrorMessage(true);
168 return false;
169 }
170
171 ((InstanceMap*)map)->GetInstanceScript()->SaveToDB();
172
173 return true;
174 }
175};
176
@ MINUTE
Definition Common.h:119
@ HOUR
Definition Common.h:120
@ DAY
Definition Common.h:121
DifficultyID
Definition DBCEnums.h:330
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::int8_t int8
Definition Define.h:75
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
std::uint16_t uint16
Definition Define.h:78
#define sInstanceSaveMgr
#define sMapMgr
Definition MapManager.h:145
Player * getSelectedPlayer()
Definition Chat.cpp:829
WorldSession * GetSession()
Definition Chat.h:43
void PSendSysMessage(const char *format,...) ATTR_PRINTF(2
Definition Chat.cpp:221
void SetSentErrorMessage(bool val)
Definition Chat.h:114
CommandScript(const char *name)
Definition Group.h:147
UNORDERED_MAP< uint32, InstanceGroupBind > BoundInstancesMap
Definition Group.h:162
DifficultyID GetDifficulty() const
uint32 GetInstanceId() const
bool CanReset() const
time_t GetResetTime() const
Definition Map.h:238
bool IsInstance() const
Definition Map.h:368
void UnbindInstance(uint32 mapid, DifficultyID difficulty, bool unload=false)
Definition Player.cpp:13904
Group * GetGroup()
Definition Player.h:2972
UNORDERED_MAP< uint32, InstancePlayerBind > BoundInstancesMap
Definition Player.h:2917
BoundInstancesMap & GetBoundInstances(DifficultyID difficulty)
Definition Player.h:2928
uint32 GetMapId() const
Definition Object.h:546
Map * GetMap() const
Definition Object.h:740
Player * GetPlayer() const
static bool HandleInstanceListBindsCommand(ChatHandler *handler, char const *)
static bool HandleInstanceStatsCommand(ChatHandler *handler, char const *)
static bool HandleInstanceUnbindCommand(ChatHandler *handler, char const *args)
static std::string GetTimeString(uint64 time)
std::vector< ChatCommand > GetCommands() const OVERRIDE
static bool HandleInstanceSaveDataCommand(ChatHandler *handler, char const *)
void AddSC_instance_commandscript()
@ RBAC_PERM_COMMAND_INSTANCE
Definition RBAC.h:300
@ RBAC_PERM_COMMAND_INSTANCE_LISTBINDS
Definition RBAC.h:301
@ RBAC_PERM_COMMAND_INSTANCE_STATS
Definition RBAC.h:303
@ RBAC_PERM_COMMAND_INSTANCE_UNBIND
Definition RBAC.h:302
@ RBAC_PERM_COMMAND_INSTANCE_SAVEDATA
Definition RBAC.h:304