root/trunk/src/game/GMTicketHandler.cpp

Revision 279, 6.0 kB (checked in by yumileroy, 17 years ago)

Merged commit 269 (5f0e38da128a).

Original author: gvcoman
Date: 2008-11-21 14:34:05-05:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS
3 *
4 * Copyright (C) 2008 Trinity
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21#include "Common.h"
22#include "Language.h"
23#include "WorldPacket.h"
24#include "Log.h"
25#include "GMTicketMgr.h"
26#include "ObjectAccessor.h"
27#include "Player.h"
28#include "Chat.h"
29
30void WorldSession::SendGMTicketGetTicket(uint32 status, char const* text)
31{
32    int len = text ? strlen(text) : 0;
33    WorldPacket data( SMSG_GMTICKET_GETTICKET, (4+len+1+4+2+4+4) );
34    data << uint32(status);                                 // standard 0x0A, 0x06 if text present
35    if(status == 6)
36    {
37        data << text;                                       // ticket text
38        data << uint8(0x7);                                 // ticket category
39        data << float(0);                                   // time from ticket creation?
40        data << float(0);                                   // const
41        data << float(0);                                   // const
42        data << uint8(0);                                   // const
43        data << uint8(0);                                   // const
44    }
45    SendPacket( &data );
46}
47
48void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/ )
49{
50    WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 );
51    data << (uint32)time(NULL);
52    data << (uint32)0;
53    SendPacket( &data );
54
55    GMTicket* ticket = ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow());
56    if(ticket)
57        SendGMTicketGetTicket(0x06,ticket->GetText());
58    else
59        SendGMTicketGetTicket(0x0A,0);
60}
61
62void WorldSession::HandleGMTicketUpdateTextOpcode( WorldPacket & recv_data )
63{
64    CHECK_PACKET_SIZE(recv_data,1);
65
66    std::string ticketText;
67    recv_data >> ticketText;
68
69    if(GMTicket* ticket = ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow()))
70        ticket->SetText(ticketText.c_str());
71    else
72        sLog.outError("Ticket update: Player %s (GUID: %u) doesn't have active ticket", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow());
73}
74
75void WorldSession::HandleGMTicketDeleteOpcode( WorldPacket & /*recv_data*/ )
76{
77    ticketmgr.Delete(GetPlayer()->GetGUIDLow());
78
79    WorldPacket data( SMSG_GMTICKET_DELETETICKET, 4 );
80    data << uint32(9);
81    SendPacket( &data );
82
83    SendGMTicketGetTicket(0x0A, 0);
84}
85
86void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data )
87{
88    CHECK_PACKET_SIZE(recv_data, 4*4+1+2*4);
89
90    uint32 map;
91    float x, y, z;
92    std::string ticketText = "";
93    uint32 unk1, unk2;
94
95    recv_data >> map >> x >> y >> z;                        // last check 2.4.3
96    recv_data >> ticketText;
97
98    // recheck
99    CHECK_PACKET_SIZE(recv_data,4*4+(ticketText.size()+1)+2*4);
100
101    recv_data >> unk1 >> unk2;
102    // note: the packet might contain more data, but the exact structure of that is unknown
103
104    sLog.outDebug("TicketCreate: map %u, x %f, y %f, z %f, text %s, unk1 %u, unk2 %u", map, x, y, z, ticketText.c_str(), unk1, unk2);
105
106    if(ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow()))
107    {
108        WorldPacket data( SMSG_GMTICKET_CREATE, 4 );
109        data << uint32(1);
110        SendPacket( &data );
111        return;
112    }
113
114    ticketmgr.Create(_player->GetGUIDLow(), ticketText.c_str());
115
116    WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 );
117    data << (uint32)time(NULL);
118    data << (uint32)0;
119    SendPacket( &data );
120
121    data.Initialize( SMSG_GMTICKET_CREATE, 4 );
122    data << uint32(2);
123    SendPacket( &data );
124    DEBUG_LOG("update the ticket\n");
125
126    //TODO: Guard player map
127    HashMapHolder<Player>::MapType &m = ObjectAccessor::Instance().GetPlayers();
128    for(HashMapHolder<Player>::MapType::iterator itr = m.begin(); itr != m.end(); ++itr)
129    {
130        if(itr->second->GetSession()->GetSecurity() >= SEC_GAMEMASTER && itr->second->isAcceptTickets())
131            ChatHandler(itr->second).PSendSysMessage(LANG_COMMAND_TICKETNEW,GetPlayer()->GetName());
132    }
133}
134
135void WorldSession::HandleGMTicketSystemStatusOpcode( WorldPacket & /*recv_data*/ )
136{
137    WorldPacket data( SMSG_GMTICKET_SYSTEMSTATUS,4 );
138    data << uint32(1);                                      // we can also disable ticket system by sending 0 value
139
140    SendPacket( &data );
141}
142
143void WorldSession::HandleGMSurveySubmit( WorldPacket & recv_data)
144{
145    // GM survey is shown after SMSG_GM_TICKET_STATUS_UPDATE with status = 3
146    CHECK_PACKET_SIZE(recv_data,4+4);
147    uint32 x;
148    recv_data >> x;                                         // answer range? (6 = 0-5?)
149    sLog.outDebug("SURVEY: X = %u", x);
150
151    uint8 result[10];
152    memset(result, 0, sizeof(result));
153    for( int i = 0; i < 10; ++i)
154    {
155        CHECK_PACKET_SIZE(recv_data,recv_data.rpos()+4);
156        uint32 questionID;
157        recv_data >> questionID;                            // GMSurveyQuestions.dbc
158        if (!questionID)
159            break;
160
161        CHECK_PACKET_SIZE(recv_data,recv_data.rpos()+1+1);
162        uint8 value;
163        std::string unk_text;
164        recv_data >> value;                                 // answer
165        recv_data >> unk_text;                              // always empty?
166
167        result[i] = value;
168        sLog.outDebug("SURVEY: ID %u, value %u, text %s", questionID, value, unk_text.c_str());
169    }
170
171    CHECK_PACKET_SIZE(recv_data,recv_data.rpos()+1);
172    std::string comment;
173    recv_data >> comment;                                   // addional comment
174    sLog.outDebug("SURVEY: comment %s", comment.c_str());
175
176    // TODO: chart this data in some way
177}
Note: See TracBrowser for help on using the browser.