mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Some new gm ticket stuff.
This commit is contained in:
parent
9e3e741d9b
commit
f34c11be7f
8 changed files with 126 additions and 18 deletions
2
sql/330/3_character_ticket.sql
Normal file
2
sql/330/3_character_ticket.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
alter table `character_ticket`
|
||||||
|
add column `response_text` text CHARSET utf8 COLLATE utf8_general_ci NULL after `ticket_text`;
|
||||||
|
|
@ -43,15 +43,34 @@ void WorldSession::SendGMTicketGetTicket(uint32 status, char const* text)
|
||||||
SendPacket( &data );
|
SendPacket( &data );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldSession::SendGMResponse(GMTicket *ticket)
|
||||||
|
{
|
||||||
|
int len = strlen(ticket->GetText())+1+strlen(ticket->GetResponse())+1;
|
||||||
|
WorldPacket data(SMSG_GMRESPONSE_RECEIVED, 4+4+len+1+1+1);
|
||||||
|
data << uint32(123);
|
||||||
|
data << uint32(456);
|
||||||
|
data << ticket->GetText(); // issue text
|
||||||
|
data << ticket->GetResponse(); // response text 1
|
||||||
|
data << uint8(0); // response text 2
|
||||||
|
data << uint8(0); // response text 3
|
||||||
|
data << uint8(0); // response text 4
|
||||||
|
SendPacket(&data);
|
||||||
|
}
|
||||||
|
|
||||||
void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/ )
|
void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/ )
|
||||||
{
|
{
|
||||||
SendQueryTimeResponse();
|
SendQueryTimeResponse();
|
||||||
|
|
||||||
GMTicket* ticket = sTicketMgr.GetGMTicket(GetPlayer()->GetGUIDLow());
|
GMTicket* ticket = sTicketMgr.GetGMTicket(GetPlayer()->GetGUIDLow());
|
||||||
if(ticket)
|
if(ticket)
|
||||||
SendGMTicketGetTicket(0x06,ticket->GetText());
|
{
|
||||||
|
if(ticket->HasResponse())
|
||||||
|
SendGMResponse(ticket);
|
||||||
else
|
else
|
||||||
SendGMTicketGetTicket(0x0A,0);
|
SendGMTicketGetTicket(0x06, ticket->GetText());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SendGMTicketGetTicket(0x0A, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleGMTicketUpdateTextOpcode( WorldPacket & recv_data )
|
void WorldSession::HandleGMTicketUpdateTextOpcode( WorldPacket & recv_data )
|
||||||
|
|
@ -81,18 +100,19 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data )
|
||||||
uint32 map;
|
uint32 map;
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
std::string ticketText = "";
|
std::string ticketText = "";
|
||||||
|
uint8 isFollowup;
|
||||||
|
|
||||||
recv_data >> map >> x >> y >> z; // last check 2.4.3
|
recv_data >> map >> x >> y >> z; // last check 2.4.3
|
||||||
recv_data >> ticketText;
|
recv_data >> ticketText;
|
||||||
|
|
||||||
recv_data.read_skip<uint32>(); // unk1, 0
|
recv_data.read_skip<uint32>(); // unk1, 11 - talk to gm, 1 - report problem
|
||||||
recv_data.read_skip<uint8>(); // unk2, 1
|
recv_data >> isFollowup; // unk2, 1 - followup ticket
|
||||||
recv_data.read_skip<uint32>(); // unk3, 0
|
recv_data.read_skip<uint32>(); // unk3, 0
|
||||||
recv_data.read_skip<uint32>(); // unk4, 0
|
recv_data.read_skip<uint32>(); // unk4, 0
|
||||||
|
|
||||||
sLog.outDebug("TicketCreate: map %u, x %f, y %f, z %f, text %s", map, x, y, z, ticketText.c_str());
|
sLog.outDebug("TicketCreate: map %u, x %f, y %f, z %f, text %s", map, x, y, z, ticketText.c_str());
|
||||||
|
|
||||||
if(sTicketMgr.GetGMTicket(GetPlayer()->GetGUIDLow()))
|
if(sTicketMgr.GetGMTicket(GetPlayer()->GetGUIDLow()) && !isFollowup)
|
||||||
{
|
{
|
||||||
WorldPacket data( SMSG_GMTICKET_CREATE, 4 );
|
WorldPacket data( SMSG_GMTICKET_CREATE, 4 );
|
||||||
data << uint32(1); // 1 - You already have GM ticket
|
data << uint32(1); // 1 - You already have GM ticket
|
||||||
|
|
@ -100,6 +120,9 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isFollowup)
|
||||||
|
sTicketMgr.Delete(_player->GetGUIDLow());
|
||||||
|
|
||||||
sTicketMgr.Create(_player->GetGUIDLow(), ticketText.c_str());
|
sTicketMgr.Create(_player->GetGUIDLow(), ticketText.c_str());
|
||||||
|
|
||||||
SendQueryTimeResponse();
|
SendQueryTimeResponse();
|
||||||
|
|
@ -107,7 +130,6 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data )
|
||||||
WorldPacket data( SMSG_GMTICKET_CREATE, 4 );
|
WorldPacket data( SMSG_GMTICKET_CREATE, 4 );
|
||||||
data << uint32(2); // 2 - nothing appears (3-error creating, 5-error updating)
|
data << uint32(2); // 2 - nothing appears (3-error creating, 5-error updating)
|
||||||
SendPacket( &data );
|
SendPacket( &data );
|
||||||
DEBUG_LOG("update the ticket");
|
|
||||||
|
|
||||||
//TODO: Guard player map
|
//TODO: Guard player map
|
||||||
HashMapHolder<Player>::MapType &m = sObjectAccessor.GetPlayers();
|
HashMapHolder<Player>::MapType &m = sObjectAccessor.GetPlayers();
|
||||||
|
|
@ -157,3 +179,15 @@ void WorldSession::HandleGMSurveySubmit( WorldPacket & recv_data)
|
||||||
|
|
||||||
// TODO: chart this data in some way
|
// TODO: chart this data in some way
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldSession::HandleGMResponseResolve(WorldPacket & recv_data)
|
||||||
|
{
|
||||||
|
// empty opcode
|
||||||
|
sLog.outDebug("WORLD: %s", LookupOpcodeName(recv_data.GetOpcode()));
|
||||||
|
|
||||||
|
sTicketMgr.Delete(GetPlayer()->GetGUIDLow());
|
||||||
|
|
||||||
|
WorldPacket data(SMSG_GMRESPONSE_STATUS_UPDATE, 1);
|
||||||
|
data << uint8(0); // ask to fill out gm survey = 1
|
||||||
|
SendPacket(&data);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,8 @@ void GMTicketMgr::LoadGMTickets()
|
||||||
m_GMTicketMap.clear(); // For reload case
|
m_GMTicketMap.clear(); // For reload case
|
||||||
|
|
||||||
QueryResult *result = CharacterDatabase.Query(
|
QueryResult *result = CharacterDatabase.Query(
|
||||||
// 0 1 2
|
// 0 1 2 3
|
||||||
"SELECT guid, ticket_text,UNIX_TIMESTAMP(ticket_lastchange) FROM character_ticket");
|
"SELECT guid, ticket_text, response_text, UNIX_TIMESTAMP(ticket_lastchange) FROM character_ticket");
|
||||||
|
|
||||||
if( !result )
|
if( !result )
|
||||||
{
|
{
|
||||||
|
|
@ -59,7 +59,7 @@ void GMTicketMgr::LoadGMTickets()
|
||||||
Field* fields = result->Fetch();
|
Field* fields = result->Fetch();
|
||||||
|
|
||||||
uint32 guid = fields[0].GetUInt32();
|
uint32 guid = fields[0].GetUInt32();
|
||||||
m_GMTicketMap[guid] = GMTicket(guid, fields[1].GetCppString(), time_t(fields[2].GetUInt64()));
|
m_GMTicketMap[guid] = GMTicket(guid, fields[1].GetCppString(), fields[2].GetCppString(), time_t(fields[3].GetUInt64()));
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
} while (result->NextRow());
|
} while (result->NextRow());
|
||||||
|
|
@ -73,8 +73,8 @@ void GMTicketMgr::DeleteAll()
|
||||||
{
|
{
|
||||||
for(GMTicketMap::const_iterator itr = m_GMTicketMap.begin(); itr != m_GMTicketMap.end(); ++itr)
|
for(GMTicketMap::const_iterator itr = m_GMTicketMap.begin(); itr != m_GMTicketMap.end(); ++itr)
|
||||||
{
|
{
|
||||||
if(Player* owner = sObjectMgr.GetPlayer(MAKE_NEW_GUID(itr->first,0,HIGHGUID_PLAYER)))
|
if(Player* owner = sObjectMgr.GetPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
|
||||||
owner->GetSession()->SendGMTicketGetTicket(0x0A,0);
|
owner->GetSession()->SendGMTicketGetTicket(0x0A, 0);
|
||||||
}
|
}
|
||||||
CharacterDatabase.PExecute("DELETE FROM character_ticket");
|
CharacterDatabase.PExecute("DELETE FROM character_ticket");
|
||||||
m_GMTicketMap.clear();
|
m_GMTicketMap.clear();
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ class GMTicket
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
GMTicket(uint32 guid, const std::string& text, time_t update) : m_guid(guid), m_text(text), m_lastUpdate(update)
|
GMTicket(uint32 guid, const std::string& text, const std::string& responsetext, time_t update) : m_guid(guid), m_text(text), m_responseText(responsetext), m_lastUpdate(update)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -41,6 +41,11 @@ class GMTicket
|
||||||
return m_text.c_str();
|
return m_text.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* GetResponse() const
|
||||||
|
{
|
||||||
|
return m_responseText.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
uint64 GetLastUpdate() const
|
uint64 GetLastUpdate() const
|
||||||
{
|
{
|
||||||
return m_lastUpdate;
|
return m_lastUpdate;
|
||||||
|
|
@ -56,6 +61,18 @@ class GMTicket
|
||||||
CharacterDatabase.PExecute("UPDATE character_ticket SET ticket_text = '%s' WHERE guid = '%u'", escapedString.c_str(), m_guid);
|
CharacterDatabase.PExecute("UPDATE character_ticket SET ticket_text = '%s' WHERE guid = '%u'", escapedString.c_str(), m_guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetResponseText(const char* text)
|
||||||
|
{
|
||||||
|
m_responseText = text ? text : "";
|
||||||
|
m_lastUpdate = time(NULL);
|
||||||
|
|
||||||
|
std::string escapedString = m_responseText;
|
||||||
|
CharacterDatabase.escape_string(escapedString);
|
||||||
|
CharacterDatabase.PExecute("UPDATE character_ticket SET response_text = '%s' WHERE guid = '%u'", escapedString.c_str(), m_guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasResponse() { return !m_responseText.empty(); }
|
||||||
|
|
||||||
void DeleteFromDB() const
|
void DeleteFromDB() const
|
||||||
{
|
{
|
||||||
CharacterDatabase.PExecute("DELETE FROM character_ticket WHERE guid = '%u' LIMIT 1", m_guid);
|
CharacterDatabase.PExecute("DELETE FROM character_ticket WHERE guid = '%u' LIMIT 1", m_guid);
|
||||||
|
|
@ -69,12 +86,16 @@ class GMTicket
|
||||||
std::string escapedString = m_text;
|
std::string escapedString = m_text;
|
||||||
CharacterDatabase.escape_string(escapedString);
|
CharacterDatabase.escape_string(escapedString);
|
||||||
|
|
||||||
CharacterDatabase.PExecute("INSERT INTO character_ticket (guid, ticket_text) VALUES ('%u', '%s')", m_guid, escapedString.c_str());
|
std::string escapedString2 = m_responseText;
|
||||||
|
CharacterDatabase.escape_string(escapedString2);
|
||||||
|
|
||||||
|
CharacterDatabase.PExecute("INSERT INTO character_ticket (guid, ticket_text, response_text) VALUES ('%u', '%s', '%s')", m_guid, escapedString.c_str(), escapedString2.c_str());
|
||||||
CharacterDatabase.CommitTransaction();
|
CharacterDatabase.CommitTransaction();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
uint32 m_guid;
|
uint32 m_guid;
|
||||||
std::string m_text;
|
std::string m_text;
|
||||||
|
std::string m_responseText;
|
||||||
time_t m_lastUpdate;
|
time_t m_lastUpdate;
|
||||||
};
|
};
|
||||||
typedef std::map<uint32, GMTicket> GMTicketMap;
|
typedef std::map<uint32, GMTicket> GMTicketMap;
|
||||||
|
|
@ -113,7 +134,7 @@ class GMTicketMgr
|
||||||
|
|
||||||
void Create(uint32 guid, const char* text)
|
void Create(uint32 guid, const char* text)
|
||||||
{
|
{
|
||||||
GMTicket t = GMTicket(guid, text, time(NULL));
|
GMTicket t = GMTicket(guid, text, "", time(NULL));
|
||||||
t.SaveToDB();
|
t.SaveToDB();
|
||||||
m_GMTicketMap[guid] = t;
|
m_GMTicketMap[guid] = t;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ enum MangosStrings
|
||||||
LANG_COMMAND_TICKETVIEW = 290,
|
LANG_COMMAND_TICKETVIEW = 290,
|
||||||
LANG_COMMAND_TICKETON = 291,
|
LANG_COMMAND_TICKETON = 291,
|
||||||
LANG_COMMAND_TICKETOFF = 292,
|
LANG_COMMAND_TICKETOFF = 292,
|
||||||
LANG_COMMAND_TICKENOTEXIST = 293,
|
LANG_COMMAND_TICKETNOTEXIST = 293,
|
||||||
LANG_COMMAND_ALLTICKETDELETED = 294,
|
LANG_COMMAND_ALLTICKETDELETED = 294,
|
||||||
LANG_COMMAND_TICKETPLAYERDEL = 295,
|
LANG_COMMAND_TICKETPLAYERDEL = 295,
|
||||||
LANG_COMMAND_TICKETDEL = 296,
|
LANG_COMMAND_TICKETDEL = 296,
|
||||||
|
|
|
||||||
|
|
@ -2261,6 +2261,54 @@ bool ChatHandler::HandleTicketCommand(const char* args)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ticket respond
|
||||||
|
if(strncmp(px,"respond",8) == 0)
|
||||||
|
{
|
||||||
|
char *name = strtok(NULL, " ");
|
||||||
|
|
||||||
|
if(!name)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_CMD_SYNTAX);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string plName = name;
|
||||||
|
uint64 guid = sObjectMgr.GetPlayerGUIDByName(plName);
|
||||||
|
|
||||||
|
if(!guid)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_PLAYER_NOT_FOUND);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GMTicket* ticket = sTicketMgr.GetGMTicket(GUID_LOPART(guid));
|
||||||
|
|
||||||
|
if(!ticket)
|
||||||
|
{
|
||||||
|
PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST, GUID_LOPART(guid));
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* response = strtok(NULL, "");
|
||||||
|
|
||||||
|
if(!response)
|
||||||
|
{
|
||||||
|
SendSysMessage(LANG_CMD_SYNTAX);
|
||||||
|
SetSentErrorMessage(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ticket->SetResponseText(response);
|
||||||
|
|
||||||
|
if(Player* pl = sObjectMgr.GetPlayer(guid))
|
||||||
|
pl->GetSession()->SendGMResponse(ticket);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// ticket #num
|
// ticket #num
|
||||||
int num = atoi(px);
|
int num = atoi(px);
|
||||||
if(num > 0)
|
if(num > 0)
|
||||||
|
|
@ -2269,7 +2317,7 @@ bool ChatHandler::HandleTicketCommand(const char* args)
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num);
|
PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST, num);
|
||||||
SetSentErrorMessage(true);
|
SetSentErrorMessage(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -2324,7 +2372,7 @@ bool ChatHandler::HandleDelTicketCommand(const char *args)
|
||||||
QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_,num-1);
|
QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_,num-1);
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num);
|
PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST, num);
|
||||||
SetSentErrorMessage(true);
|
SetSentErrorMessage(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1290,7 +1290,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||||
/*0x4ED*/ { "SMSG_TOGGLE_XP_GAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
/*0x4ED*/ { "SMSG_TOGGLE_XP_GAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
/*0x4EE*/ { "SMSG_GMRESPONSE_DB_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
/*0x4EE*/ { "SMSG_GMRESPONSE_DB_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
/*0x4EF*/ { "SMSG_GMRESPONSE_RECEIVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
/*0x4EF*/ { "SMSG_GMRESPONSE_RECEIVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
/*0x4F0*/ { "CMSG_GMRESPONSE_RESOLVE", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4F0*/ { "CMSG_GMRESPONSE_RESOLVE", STATUS_LOGGEDIN, &WorldSession::HandleGMResponseResolve },
|
||||||
/*0x4F1*/ { "SMSG_GMRESPONSE_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
/*0x4F1*/ { "SMSG_GMRESPONSE_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
|
||||||
/*0x4F2*/ { "UMSG_UNKNOWN_1266", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4F2*/ { "UMSG_UNKNOWN_1266", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||||
/*0x4F3*/ { "UMSG_UNKNOWN_1267", STATUS_NEVER, &WorldSession::Handle_NULL },
|
/*0x4F3*/ { "UMSG_UNKNOWN_1267", STATUS_NEVER, &WorldSession::Handle_NULL },
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ class WorldSocket;
|
||||||
class QueryResult;
|
class QueryResult;
|
||||||
class LoginQueryHolder;
|
class LoginQueryHolder;
|
||||||
class CharacterHandler;
|
class CharacterHandler;
|
||||||
|
class GMTicket;
|
||||||
|
|
||||||
enum AccountDataType
|
enum AccountDataType
|
||||||
{
|
{
|
||||||
|
|
@ -184,6 +185,7 @@ class MANGOS_DLL_SPEC WorldSession
|
||||||
void SendSpiritResurrect();
|
void SendSpiritResurrect();
|
||||||
void SendBindPoint(Creature* npc);
|
void SendBindPoint(Creature* npc);
|
||||||
void SendGMTicketGetTicket(uint32 status, char const* text);
|
void SendGMTicketGetTicket(uint32 status, char const* text);
|
||||||
|
void SendGMResponse(GMTicket *ticket);
|
||||||
|
|
||||||
void SendAttackStop(Unit const* enemy);
|
void SendAttackStop(Unit const* enemy);
|
||||||
|
|
||||||
|
|
@ -340,6 +342,7 @@ class MANGOS_DLL_SPEC WorldSession
|
||||||
void HandleGMTicketUpdateTextOpcode(WorldPacket& recvPacket);
|
void HandleGMTicketUpdateTextOpcode(WorldPacket& recvPacket);
|
||||||
|
|
||||||
void HandleGMSurveySubmit(WorldPacket& recvPacket);
|
void HandleGMSurveySubmit(WorldPacket& recvPacket);
|
||||||
|
void HandleGMResponseResolve(WorldPacket& recv_data);
|
||||||
|
|
||||||
void HandleTogglePvP(WorldPacket& recvPacket);
|
void HandleTogglePvP(WorldPacket& recvPacket);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue