root/trunk/src/game/GMTicketHandler.cpp @ 263

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

Some missing changes. This should fix the bug that loading char causes crash.
Please do not commit to the other tip (I do not know how to delete it).

Original author: megamage
Date: 2008-11-20 17:40:13-06: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.