root/trunk/src/game/GuildHandler.cpp @ 173

Revision 173, 54.3 kB (checked in by yumileroy, 17 years ago)

[svn] * Avoid access to bag item prototype for getting bag size, use related item update field instead as more fast source.
* Better check client inventory pos data received in some client packets to skip invalid cases.
* Removed some unnecessary database queries.
* Make guid lookup for adding ignore async.
* Added two parameter versions of the AsyncQuery? function
* Make queries for adding friends async. - Hunuza
* Replace some PQuery() calls with more simple Query() - Hunuza
* Mark spell as executed instead of deleteable to solve crash.
*** Source mangos.

**Its a big commit. so test with care... or without care.... whatever floats your boat.

Original author: KingPin?
Date: 2008-11-05 20:10:19-06:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
4 * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
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 "WorldPacket.h"
23#include "WorldSession.h"
24#include "World.h"
25#include "ObjectMgr.h"
26#include "Log.h"
27#include "Opcodes.h"
28#include "Guild.h"
29#include "MapManager.h"
30#include "GossipDef.h"
31#include "SocialMgr.h"
32
33void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
34{
35    CHECK_PACKET_SIZE(recvPacket, 4);
36
37    uint32 guildId;
38    Guild *guild;
39
40    //sLog.outDebug("WORLD: Received CMSG_GUILD_QUERY");
41
42    recvPacket >> guildId;
43
44    guild = objmgr.GetGuildById(guildId);
45    if(!guild)
46    {
47        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
48        return;
49    }
50
51    guild->Query(this);
52}
53
54void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
55{
56    CHECK_PACKET_SIZE(recvPacket, 1);
57
58    std::string gname;
59
60    //sLog.outDebug("WORLD: Received CMSG_GUILD_CREATE");
61
62    recvPacket >> gname;
63
64    if(GetPlayer()->GetGuildId())
65        return;
66
67    Guild *guild = new Guild;
68    if(!guild->create(GetPlayer()->GetGUID(),gname))
69    {
70        delete guild;
71        return;
72    }
73
74    objmgr.AddGuild(guild);
75}
76
77void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
78{
79    CHECK_PACKET_SIZE(recvPacket, 1);
80
81    std::string Invitedname, plname;
82
83    //sLog.outDebug("WORLD: Received CMSG_GUILD_INVITE");
84
85    Player * player = NULL;
86
87    recvPacket >> Invitedname;
88
89    if(normalizePlayerName(Invitedname))
90        player = ObjectAccessor::Instance().FindPlayerByName(Invitedname.c_str());
91
92    if(!player)
93    {
94        SendGuildCommandResult(GUILD_INVITE_S, Invitedname, GUILD_PLAYER_NOT_FOUND);
95        return;
96    }
97
98    Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
99    if(!guild)
100    {
101        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
102        return;
103    }
104
105    // OK result but not send invite
106    if(player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow()))
107        return;
108
109    // not let enemies sign guild charter
110    if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam())
111    {
112        SendGuildCommandResult(GUILD_INVITE_S, Invitedname, GUILD_NOT_ALLIED);
113        return;
114    }
115
116    if(player->GetGuildId())
117    {
118        plname = player->GetName();
119        SendGuildCommandResult(GUILD_INVITE_S, plname, ALREADY_IN_GUILD);
120        return;
121    }
122
123    if(player->GetGuildIdInvited())
124    {
125        plname = player->GetName();
126        SendGuildCommandResult(GUILD_INVITE_S, plname, ALREADY_INVITED_TO_GUILD);
127        return;
128    }
129
130    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_INVITE))
131    {
132        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
133        return;
134    }
135
136    sLog.outDebug("Player %s Invited %s to Join his Guild", GetPlayer()->GetName(), Invitedname.c_str());
137
138    player->SetGuildIdInvited(GetPlayer()->GetGuildId());
139    // Put record into guildlog
140    guild->LogGuildEvent(GUILD_EVENT_LOG_INVITE_PLAYER, GetPlayer()->GetGUIDLow(), player->GetGUIDLow(), 0);
141
142    WorldPacket data(SMSG_GUILD_INVITE, (8+10));            // guess size
143    data << GetPlayer()->GetName();
144    data << guild->GetName();
145    player->GetSession()->SendPacket(&data);
146
147    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_INVITE)");
148}
149
150void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
151{
152    CHECK_PACKET_SIZE(recvPacket, 1);
153
154    std::string plName;
155    uint64 plGuid;
156    uint32 plGuildId;
157    Guild *guild;
158    Player *player;
159
160    //sLog.outDebug("WORLD: Received CMSG_GUILD_REMOVE");
161
162    recvPacket >> plName;
163
164    if(!normalizePlayerName(plName))
165        return;
166
167    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
168    if(!guild)
169    {
170        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
171        return;
172    }
173   
174    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_REMOVE))
175    {
176        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
177        return;
178    }
179   
180    player = ObjectAccessor::Instance().FindPlayerByName(plName.c_str());
181    if(player)
182    {
183        plGuid = player->GetGUID();
184        plGuildId = player->GetGuildId();
185    }
186    else
187    {
188        plGuid = objmgr.GetPlayerGUIDByName(plName);
189        plGuildId = Player::GetGuildIdFromDB(plGuid);
190    }
191
192    if(!plGuid)
193    {
194        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
195        return;
196    }
197
198    if(plGuid == guild->GetLeader())
199    {
200        SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
201        return;
202    }
203
204    if(GetPlayer()->GetGuildId() != plGuildId)
205    {
206        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
207        return;
208    }
209
210    guild->DelMember(plGuid);
211    // Put record into guildlog
212    guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0);
213
214    WorldPacket data(SMSG_GUILD_EVENT, (2+20));             // guess size
215    data << (uint8)GE_REMOVED;
216    data << (uint8)2;                                       // strings count
217    data << plName;
218    data << GetPlayer()->GetName();
219    guild->BroadcastPacket(&data);
220}
221
222void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
223{
224    Guild *guild;
225    Player *player = GetPlayer();
226
227    //sLog.outDebug("WORLD: Received CMSG_GUILD_ACCEPT");
228
229    guild = objmgr.GetGuildById(player->GetGuildIdInvited());
230    if(!guild || player->GetGuildId())
231        return;
232
233    // not let enemies sign guild charter
234    if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != objmgr.GetPlayerTeamByGUID(guild->GetLeader()))
235        return;
236
237    if(!guild->AddMember(GetPlayer()->GetGUID(),guild->GetLowestRank()))
238        return;
239    // Put record into guildlog
240    guild->LogGuildEvent(GUILD_EVENT_LOG_JOIN_GUILD, GetPlayer()->GetGUIDLow(), 0, 0);
241
242    WorldPacket data(SMSG_GUILD_EVENT, (2+10));             // guess size
243    data << (uint8)GE_JOINED;
244    data << (uint8)1;
245    data << player->GetName();
246    guild->BroadcastPacket(&data);
247
248    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
249}
250
251void WorldSession::HandleGuildDeclineOpcode(WorldPacket& /*recvPacket*/)
252{
253    //sLog.outDebug("WORLD: Received CMSG_GUILD_DECLINE");
254
255    GetPlayer()->SetGuildIdInvited(0);
256    GetPlayer()->SetInGuild(0);
257}
258
259void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
260{
261    Guild *guild;
262    //sLog.outDebug("WORLD: Received CMSG_GUILD_INFO");
263
264    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
265    if(!guild)
266    {
267        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
268        return;
269    }
270
271    WorldPacket data(SMSG_GUILD_INFO, (5*4 + guild->GetName().size() + 1));
272    data << guild->GetName();
273    data << guild->GetCreatedDay();
274    data << guild->GetCreatedMonth();
275    data << guild->GetCreatedYear();
276    data << guild->GetMemberSize();
277    data << guild->GetMemberSize();
278
279    SendPacket(&data);
280}
281
282void WorldSession::HandleGuildRosterOpcode(WorldPacket& /*recvPacket*/)
283{
284    //sLog.outDebug("WORLD: Received CMSG_GUILD_ROSTER");
285
286    Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
287    if(!guild)
288        return;
289
290    guild->Roster(this);
291}
292
293void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
294{
295    CHECK_PACKET_SIZE(recvPacket, 1);
296
297    std::string plName;
298
299    //sLog.outDebug("WORLD: Received CMSG_GUILD_PROMOTE");
300
301    recvPacket >> plName;
302
303    if(!normalizePlayerName(plName))
304        return;
305       
306    Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
307    if(!guild)
308    {
309        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
310        return;
311    }
312    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_PROMOTE))
313    {
314        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
315        return;
316    }
317   
318    uint64 plGuid = objmgr.GetPlayerGUIDByName(plName);
319   
320    if(!plGuid)
321    {
322        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
323        return;
324    }
325    else if(plGuid == GetPlayer()->GetGUID())
326    {
327        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID);
328        return;
329    }
330   
331    int32 plRankId = guild->GetRank(GUID_LOPART(plGuid));
332    if(plRankId == -1)
333    {
334        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
335        return;
336    }
337    if(plRankId < 2 || (plRankId-1) < GetPlayer()->GetRank())
338        return;
339
340    uint32 newRankId = plRankId < guild->GetNrRanks() ? plRankId-1 : guild->GetNrRanks()-1;
341
342    guild->ChangeRank(plGuid, newRankId);
343    // Put record into guildlog
344    guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId);
345
346    WorldPacket data(SMSG_GUILD_EVENT, (2+30));             // guess size
347    data << (uint8)GE_PROMOTION;
348    data << (uint8)3;
349    data << GetPlayer()->GetName();
350    data << plName;
351    data << guild->GetRankName(newRankId);
352    guild->BroadcastPacket(&data);
353}
354
355void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
356{
357    CHECK_PACKET_SIZE(recvPacket, 1);
358
359    std::string plName;
360
361    //sLog.outDebug("WORLD: Received CMSG_GUILD_DEMOTE");
362
363    recvPacket >> plName;
364
365    if(!normalizePlayerName(plName))
366        return;
367
368    Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
369
370    if(!guild)
371    {
372        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
373        return;
374    }
375   
376    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_DEMOTE))
377    {
378        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
379        return;
380    }
381   
382    uint64 plGuid = objmgr.GetPlayerGUIDByName(plName);
383
384    if( !plGuid )
385    {
386        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
387        return;
388    }
389
390    if(plGuid == GetPlayer()->GetGUID())
391    {
392        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID);
393        return;
394    }
395
396    int32 plRankId = guild->GetRank(GUID_LOPART(plGuid));
397    if(plRankId == -1)
398    {
399        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
400        return;
401    }
402
403    if((plRankId+1) >= guild->GetNrRanks() || plRankId <= this->GetPlayer()->GetRank())
404        return;
405
406    guild->ChangeRank(plGuid, (plRankId+1));
407    // Put record into guildlog
408    guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), (plRankId+1));
409
410    WorldPacket data(SMSG_GUILD_EVENT, (2+30));             // guess size
411    data << (uint8)GE_DEMOTION;
412    data << (uint8)3;
413    data << GetPlayer()->GetName();
414    data << plName;
415    data << guild->GetRankName(plRankId+1);
416    guild->BroadcastPacket(&data);
417}
418
419void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/)
420{
421    std::string plName;
422    Guild *guild;
423
424    //sLog.outDebug("WORLD: Received CMSG_GUILD_LEAVE");
425
426    guild = objmgr.GetGuildById(_player->GetGuildId());
427    if(!guild)
428    {
429        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
430        return;
431    }
432    if(_player->GetGUID() == guild->GetLeader() && guild->GetMemberSize() > 1)
433    {
434        SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
435        return;
436    }
437
438    if(_player->GetGUID() == guild->GetLeader())
439    {
440        guild->Disband();
441        return;
442    }
443
444    plName = _player->GetName();
445
446    guild->DelMember(_player->GetGUID());
447    // Put record into guildlog
448    guild->LogGuildEvent(GUILD_EVENT_LOG_LEAVE_GUILD, _player->GetGUIDLow(), 0, 0);
449
450    WorldPacket data(SMSG_GUILD_EVENT, (2+10));             // guess size
451    data << (uint8)GE_LEFT;
452    data << (uint8)1;
453    data << plName;
454    guild->BroadcastPacket(&data);
455
456    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
457
458    SendGuildCommandResult(GUILD_QUIT_S, guild->GetName(), GUILD_PLAYER_NO_MORE_IN_GUILD);
459}
460
461void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/)
462{
463    std::string name;
464    Guild *guild;
465
466    //sLog.outDebug("WORLD: Received CMSG_GUILD_DISBAND");
467
468    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
469    if(!guild)
470    {
471        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
472        return;
473    }
474    if(GetPlayer()->GetGUID() != guild->GetLeader())
475    {
476        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
477        return;
478    }
479
480    guild->Disband();
481
482    //sLog.outDebug("WORLD: Guild Sucefully Disbanded");
483}
484
485void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket)
486{
487    CHECK_PACKET_SIZE(recvPacket, 1);
488
489    std::string name;
490    Player *newLeader;
491    uint64 newLeaderGUID;
492    uint32 newLeaderGuild;
493    Player *oldLeader = GetPlayer();
494    Guild *guild;
495
496    //sLog.outDebug("WORLD: Received CMSG_GUILD_LEADER");
497
498    recvPacket >> name;
499
500    if(!normalizePlayerName(name))
501        return;
502       
503    guild = objmgr.GetGuildById(oldLeader->GetGuildId());
504   
505    if(!guild)
506    {
507        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
508        return;
509    }
510   
511    if(oldLeader->GetGUID() != guild->GetLeader())
512    {
513        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
514        return;
515    }
516
517    newLeader = ObjectAccessor::Instance().FindPlayerByName(name.c_str());
518    if(newLeader)
519    {
520        newLeaderGUID = newLeader->GetGUID();
521        newLeaderGuild = newLeader->GetGuildId();
522    }
523    else
524    {
525        newLeaderGUID = objmgr.GetPlayerGUIDByName(name);
526        newLeaderGuild = Player::GetGuildIdFromDB(newLeaderGUID);
527    }
528    if(!newLeaderGUID)
529    {
530        SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_FOUND);
531        return;
532    }
533    if(oldLeader->GetGuildId() != newLeaderGuild)
534    {
535        SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
536        return;
537    }
538
539    guild->SetLeader(newLeaderGUID);
540    guild->ChangeRank(oldLeader->GetGUID(), GR_OFFICER);
541
542    WorldPacket data(SMSG_GUILD_EVENT, (2+20));             // guess size
543    data << (uint8)GE_LEADER_CHANGED;
544    data << (uint8)2;
545    data << oldLeader->GetName();
546    data << name.c_str();
547    guild->BroadcastPacket(&data);
548
549    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
550}
551
552void WorldSession::HandleGuildMOTDOpcode(WorldPacket& recvPacket)
553{
554    Guild *guild;
555    std::string MOTD;
556
557    //sLog.outDebug("WORLD: Received CMSG_GUILD_MOTD");
558
559    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
560    if(!guild)
561    {
562        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
563        return;
564    }
565    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_SETMOTD))
566    {
567        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
568        return;
569    }
570
571    if(!recvPacket.empty())
572        recvPacket >> MOTD;
573    else
574        MOTD = "";
575
576    guild->SetMOTD(MOTD);
577
578    WorldPacket data(SMSG_GUILD_EVENT, (2+MOTD.size()+1));
579    data << (uint8)GE_MOTD;
580    data << (uint8)1;
581    data << MOTD;
582    guild->BroadcastPacket(&data);
583
584    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
585}
586
587void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
588{
589    CHECK_PACKET_SIZE(recvPacket, 1);
590
591    Guild *guild;
592    Player *player;
593    uint64 plGuid;
594    uint32 plGuildId;
595    std::string name,PNOTE;
596
597    //sLog.outDebug("WORLD: Received CMSG_GUILD_SET_PUBLIC_NOTE");
598
599    recvPacket >> name;
600
601    if(!normalizePlayerName(name))
602        return;
603
604    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
605    if(!guild)
606    {
607        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
608        return;
609    }
610   
611    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EPNOTE))
612    {
613        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
614        return;
615    }
616   
617    player = ObjectAccessor::Instance().FindPlayerByName(name.c_str());
618    if(player)
619    {
620        plGuid = player->GetGUID();
621        plGuildId = player->GetGuildId();
622    }
623    else
624    {
625        plGuid = objmgr.GetPlayerGUIDByName(name);
626        plGuildId = Player::GetGuildIdFromDB(plGuid);
627    }
628
629    if(!plGuid)
630    {
631        SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_FOUND);
632        return;
633    }
634    else if(GetPlayer()->GetGuildId() != plGuildId)
635    {
636        SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
637        return;
638    }
639
640    recvPacket >> PNOTE;
641    guild->SetPNOTE(plGuid, PNOTE);
642
643    guild->Roster(this);
644}
645
646void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
647{
648    CHECK_PACKET_SIZE(recvPacket, 1);
649
650    Guild *guild;
651    Player *player;
652    uint64 plGuid;
653    uint32 plGuildId;
654    std::string plName, OFFNOTE;
655
656    //sLog.outDebug("WORLD: Received CMSG_GUILD_SET_OFFICER_NOTE");
657
658    recvPacket >> plName;
659
660    if(!normalizePlayerName(plName))
661        return;
662
663    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
664    if(!guild)
665    {
666        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
667        return;
668    }
669    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EOFFNOTE))
670    {
671        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
672        return;
673    }
674   
675    player = ObjectAccessor::Instance().FindPlayerByName(plName.c_str());
676    if(player)
677    {
678        plGuid = player->GetGUID();
679        plGuildId = player->GetGuildId();
680    }
681    else
682    {
683        plGuid = objmgr.GetPlayerGUIDByName(plName);
684        plGuildId = Player::GetGuildIdFromDB(plGuid);
685    }
686
687    if( !plGuid )
688    {
689        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_FOUND);
690        return;
691    }
692    else if(GetPlayer()->GetGuildId() != plGuildId)
693    {
694        SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
695        return;
696    }
697
698    recvPacket >> OFFNOTE;
699    guild->SetOFFNOTE(plGuid, OFFNOTE);
700
701    guild->Roster(this);
702}
703
704void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
705{
706    CHECK_PACKET_SIZE(recvPacket, 4+4+1+4*13);
707    //recvPacket.hexlike();
708
709    Guild *guild;
710    std::string rankname;
711    uint32 rankId;
712    uint32 rights, MoneyPerDay;
713    uint32 BankRights;
714    uint32 BankSlotPerDay;
715
716    //sLog.outDebug("WORLD: Received CMSG_GUILD_RANK");
717
718    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
719    if(!guild)
720    {
721        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
722        return;
723    }
724
725    else if(GetPlayer()->GetGUID() != guild->GetLeader())
726    {
727        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
728        return;
729    }
730
731    recvPacket >> rankId;
732    recvPacket >> rights;
733    recvPacket >> rankname;
734    recvPacket >> MoneyPerDay;
735
736    for (int i = 0; i < GUILD_BANK_MAX_TABS; ++i)
737    {
738        recvPacket >> BankRights;
739        recvPacket >> BankSlotPerDay;
740        guild->SetBankRightsAndSlots(rankId, uint8(i), uint16(BankRights & 0xFF), uint16(BankSlotPerDay), true);
741    }
742    sLog.outDebug("WORLD: Changed RankName to %s , Rights to 0x%.4X", rankname.c_str(), rights);
743
744    guild->SetBankMoneyPerDay(rankId, MoneyPerDay);
745    guild->SetRankName(rankId, rankname);
746
747    if(rankId==GR_GUILDMASTER)                              // prevent loss leader rights
748        rights |= GR_RIGHT_ALL;
749
750    guild->SetRankRights(rankId, rights);
751
752    guild->Query(this);
753    guild->Roster(this);
754}
755
756void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
757{
758    CHECK_PACKET_SIZE(recvPacket, 1);
759
760    Guild *guild;
761    std::string rankname;
762
763    //sLog.outDebug("WORLD: Received CMSG_GUILD_ADD_RANK");
764
765    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
766    if(!guild)
767    {
768        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
769        return;
770    }
771
772    if(GetPlayer()->GetGUID() != guild->GetLeader())
773    {
774        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
775        return;
776    }
777
778    if(guild->GetNrRanks() >= GUILD_MAX_RANKS)              // client not let create more 10 than ranks
779        return;
780
781    recvPacket >> rankname;
782
783    guild->CreateRank(rankname, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
784
785    guild->Query(this);
786    guild->Roster(this);
787}
788
789void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/)
790{
791    Guild *guild;
792    std::string rankname;
793
794    //sLog.outDebug("WORLD: Received CMSG_GUILD_DEL_RANK");
795
796    guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
797    if(!guild)
798    {
799        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
800        return;
801    }
802
803    else if(GetPlayer()->GetGUID() != guild->GetLeader())
804    {
805        SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
806        return;
807    }
808
809    guild->DelRank();
810
811    guild->Query(this);
812    guild->Roster(this);
813}
814
815void WorldSession::SendGuildCommandResult(uint32 typecmd,std::string str,uint32 cmdresult)
816{
817    WorldPacket data(SMSG_GUILD_COMMAND_RESULT, (8+str.size()+1));
818    data << typecmd;
819    data << str;
820    data << cmdresult;
821    SendPacket(&data);
822
823    //sLog.outDebug("WORLD: Sent (SMSG_GUILD_COMMAND_RESULT)");
824}
825
826void WorldSession::HandleGuildChangeInfoOpcode(WorldPacket& recvPacket)
827{
828    CHECK_PACKET_SIZE(recvPacket, 1);
829
830    //sLog.outDebug("WORLD: Received CMSG_GUILD_INFO_TEXT");
831
832    std::string GINFO;
833
834    recvPacket >> GINFO;
835
836    Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
837    if(!guild)
838    {
839        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
840        return;
841    }
842
843    if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_MODIFY_GUILD_INFO))
844    {
845        SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PERMISSIONS);
846        return;
847    }
848
849    guild->SetGINFO(GINFO);
850}
851
852void WorldSession::HandleGuildSaveEmblemOpcode(WorldPacket& recvPacket)
853{
854    CHECK_PACKET_SIZE(recvPacket, 8+4+4+4+4+4);
855
856    //sLog.outDebug("WORLD: Received MSG_SAVE_GUILD_EMBLEM");
857
858    uint64 vendorGuid;
859
860    uint32 EmblemStyle;
861    uint32 EmblemColor;
862    uint32 BorderStyle;
863    uint32 BorderColor;
864    uint32 BackgroundColor;
865
866    recvPacket >> vendorGuid;
867
868    Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, vendorGuid,UNIT_NPC_FLAG_TABARDDESIGNER);
869    if (!pCreature)
870    {
871        //"That's not an emblem vendor!"
872        SendSaveGuildEmblem(ERR_GUILDEMBLEM_INVALIDVENDOR);
873        sLog.outDebug("WORLD: HandleGuildSaveEmblemOpcode - Unit (GUID: %u) not found or you can't interact with him.", GUID_LOPART(vendorGuid));
874        return;
875    }
876
877    // remove fake death
878    if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
879        GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
880
881    recvPacket >> EmblemStyle;
882    recvPacket >> EmblemColor;
883    recvPacket >> BorderStyle;
884    recvPacket >> BorderColor;
885    recvPacket >> BackgroundColor;
886
887    Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
888    if(!guild)
889    {
890        //"You are not part of a guild!";
891        SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOGUILD);
892        return;
893    }
894
895    if (guild->GetLeader() != GetPlayer()->GetGUID())
896    {
897        //"Only guild leaders can create emblems."
898        SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTGUILDMASTER);
899        return;
900    }
901
902    if(GetPlayer()->GetMoney() < 10*GOLD)
903    {
904        //"You can't afford to do that."
905        SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTENOUGHMONEY);
906        return;
907    }
908
909    GetPlayer()->ModifyMoney(-10*GOLD);
910    guild->SetEmblem(EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor);
911
912    //"Guild Emblem saved."
913    SendSaveGuildEmblem(ERR_GUILDEMBLEM_SUCCESS);
914
915    guild->Query(this);
916}
917
918void WorldSession::HandleGuildEventLogOpcode(WorldPacket& /* recvPacket */)
919{
920                                                            // empty
921    sLog.outDebug("WORLD: Received (MSG_GUILD_EVENT_LOG_QUERY)");
922    //recvPacket.hexlike();
923
924    uint32 GuildId = GetPlayer()->GetGuildId();
925    if (GuildId == 0)
926        return;
927
928    Guild *pGuild = objmgr.GetGuildById(GuildId);
929    if(!pGuild)
930        return;
931
932    pGuild->DisplayGuildEventlog(this);
933}
934
935/******  GUILD BANK  *******/
936
937void WorldSession::HandleGuildBankGetMoneyAmount( WorldPacket & /* recv_data */ )
938{
939    sLog.outDebug("WORLD: Received (MSG_GUILD_BANK_MONEY_WITHDRAWN)");
940    //recv_data.hexlike();
941
942    uint32 GuildId = GetPlayer()->GetGuildId();
943    if (GuildId == 0)
944        return;
945
946    Guild *pGuild = objmgr.GetGuildById(GuildId);
947    if(!pGuild)
948        return;
949
950    pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
951}
952
953void WorldSession::HandleGuildBankGetRights( WorldPacket& /* recv_data */ )
954{
955    sLog.outDebug("WORLD: Received (MSG_GUILD_PERMISSIONS)");
956
957    uint32 GuildId = GetPlayer()->GetGuildId();
958    if (GuildId == 0)
959        return;
960
961    Guild *pGuild = objmgr.GetGuildById(GuildId);
962    if(!pGuild)
963        return;
964
965    uint32 rankId = GetPlayer()->GetRank();
966
967    WorldPacket data(MSG_GUILD_PERMISSIONS, 4*15+1);
968    data << uint32(rankId);                                 // guild rank id
969    data << uint32(pGuild->GetRankRights(rankId));          // rank rights
970                                                            // money per day left
971    data << uint32(pGuild->GetMemberMoneyWithdrawRem(GetPlayer()->GetGUIDLow()));
972    data << uint8(pGuild->GetPurchasedTabs());              // tabs count
973    for(int i = 0; i < GUILD_BANK_MAX_TABS; ++i)
974    {
975        data << uint32(pGuild->GetBankRights(rankId, uint8(i)));
976        data << uint32(pGuild->GetMemberSlotWithdrawRem(GetPlayer()->GetGUIDLow(), uint8(i)));
977    }
978    SendPacket(&data);
979    sLog.outDebug("WORLD: Sent (MSG_GUILD_PERMISSIONS)");
980}
981
982/* Called when clicking on Guild bank gameobject */
983void WorldSession::HandleGuildBankQuery( WorldPacket & recv_data )
984{
985    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANKER_ACTIVATE)");
986    CHECK_PACKET_SIZE(recv_data,8+1);
987    uint64 GoGuid;
988    uint8  unk;
989    recv_data >> GoGuid >> unk;
990
991    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
992        return;
993
994    if (uint32 GuildId = GetPlayer()->GetGuildId())
995    {
996        if(Guild *pGuild = objmgr.GetGuildById(GuildId))
997        {
998            pGuild->DisplayGuildBankTabsInfo(this);
999            return;
1000        }
1001    }
1002
1003    SendGuildCommandResult(GUILD_BANK_S, "", GUILD_PLAYER_NOT_IN_GUILD);
1004}
1005
1006/* Called when opening guild bank tab only (first one) */
1007void WorldSession::HandleGuildBankTabColon( WorldPacket & recv_data )
1008{
1009    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_QUERY_TAB)");
1010    CHECK_PACKET_SIZE(recv_data,8+1+1);
1011    uint64 GoGuid;
1012    uint8 TabId,unk1;
1013    recv_data >> GoGuid >> TabId >> unk1;
1014
1015    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1016        return;
1017
1018    uint32 GuildId = GetPlayer()->GetGuildId();
1019    if (GuildId == 0)
1020        return;
1021
1022    Guild *pGuild = objmgr.GetGuildById(GuildId);
1023    if(!pGuild)
1024        return;
1025
1026    // Let's update the amount of gold the player can withdraw before displaying the content
1027    // This is usefull if money withdraw right has changed
1028    pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
1029
1030    pGuild->DisplayGuildBankContent(this, TabId);
1031}
1032
1033void WorldSession::HandleGuildBankDeposit( WorldPacket & recv_data )
1034{
1035    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_DEPOSIT_MONEY)");
1036    CHECK_PACKET_SIZE(recv_data,8+4);
1037    uint64 GoGuid;
1038    uint32 money;
1039    recv_data >> GoGuid >> money;
1040
1041    if (!money)
1042        return;
1043
1044    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1045        return;
1046
1047    uint32 GuildId = GetPlayer()->GetGuildId();
1048    if (GuildId == 0)
1049        return;
1050
1051    Guild *pGuild = objmgr.GetGuildById(GuildId);
1052    if(!pGuild)
1053        return;
1054
1055    if (GetPlayer()->GetMoney() < money)
1056        return;
1057
1058    CharacterDatabase.BeginTransaction();
1059
1060    pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money);
1061    GetPlayer()->ModifyMoney(-int(money));
1062    GetPlayer()->SaveGoldToDB();
1063
1064    CharacterDatabase.CommitTransaction();
1065
1066    // logging money
1067    if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
1068    {
1069        sLog.outCommand("GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)",
1070            _player->GetName(),_player->GetSession()->GetAccountId(),money,GuildId);
1071    }
1072
1073    // log
1074    pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), GetPlayer()->GetGUIDLow(), money);
1075
1076    pGuild->DisplayGuildBankTabsInfo(this);
1077    pGuild->DisplayGuildBankContent(this, 0);
1078    pGuild->DisplayGuildBankMoneyUpdate();
1079}
1080
1081void WorldSession::HandleGuildBankWithdraw( WorldPacket & recv_data )
1082{
1083    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_WITHDRAW_MONEY)");
1084    CHECK_PACKET_SIZE(recv_data,8+4);
1085    uint64 GoGuid;
1086    uint32 money;
1087    recv_data >> GoGuid >> money;
1088
1089    if (!money)
1090        return;
1091
1092    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1093        return;
1094
1095    uint32 GuildId = GetPlayer()->GetGuildId();
1096    if (GuildId == 0)
1097        return;
1098
1099    Guild *pGuild = objmgr.GetGuildById(GuildId);
1100    if(!pGuild)
1101        return;
1102
1103    if (pGuild->GetGuildBankMoney()<money)                  // not enough money in bank
1104        return;
1105
1106    if (!pGuild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_WITHDRAW_GOLD))
1107        return;
1108
1109    CharacterDatabase.BeginTransaction();
1110
1111    if (!pGuild->MemberMoneyWithdraw(money, GetPlayer()->GetGUIDLow()))
1112    {
1113        CharacterDatabase.RollbackTransaction();
1114        return;
1115    }
1116
1117    GetPlayer()->ModifyMoney(money);
1118    GetPlayer()->SaveGoldToDB();
1119
1120    CharacterDatabase.CommitTransaction();
1121
1122    // Log
1123    pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), GetPlayer()->GetGUIDLow(), money);
1124
1125    pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
1126    pGuild->DisplayGuildBankTabsInfo(this);
1127    pGuild->DisplayGuildBankContent(this, 0);
1128    pGuild->DisplayGuildBankMoneyUpdate();
1129}
1130
1131void WorldSession::HandleGuildBankDepositItem( WorldPacket & recv_data )
1132{
1133    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_SWAP_ITEMS)");
1134    //recv_data.hexlike();
1135
1136    uint64 GoGuid;
1137    uint8 BankToBank;
1138
1139    uint8 BankTab, BankTabSlot, AutoStore, AutoStoreCount, PlayerSlot, PlayerBag, SplitedAmount = 0;
1140    uint8 BankTabDst, BankTabSlotDst, unk2, ToChar = 1;
1141    uint32 ItemEntry, unk1;
1142    bool BankToChar = false;
1143
1144    CHECK_PACKET_SIZE(recv_data,8+1);
1145    recv_data >> GoGuid >> BankToBank;
1146    if (BankToBank)
1147    {
1148        // recheck
1149        CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1+4+1+1+4+1+1);
1150        recv_data >> BankTabDst;
1151        recv_data >> BankTabSlotDst;
1152        recv_data >> unk1;                                  // always 0
1153        recv_data >> BankTab;
1154        recv_data >> BankTabSlot;
1155        recv_data >> ItemEntry;
1156        recv_data >> unk2;                                  // always 0
1157        recv_data >> SplitedAmount;
1158
1159        if (BankTabSlotDst >= GUILD_BANK_MAX_SLOTS)
1160            return;
1161        if (BankTabDst == BankTab && BankTabSlotDst == BankTabSlot)
1162            return;
1163    }
1164    else
1165    {
1166        // recheck
1167        CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1+4+1);
1168        recv_data >> BankTab;
1169        recv_data >> BankTabSlot;
1170        recv_data >> ItemEntry;
1171        recv_data >> AutoStore;
1172        if (AutoStore)
1173        {
1174            // recheck
1175            CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1);
1176            recv_data >> AutoStoreCount;
1177        }
1178        // recheck
1179        CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1);
1180        recv_data >> PlayerBag;
1181        recv_data >> PlayerSlot;
1182        if (!AutoStore)
1183        {
1184            // recheck
1185            CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1);
1186            recv_data >> ToChar;
1187            recv_data >> SplitedAmount;
1188        }
1189
1190        if (BankTabSlot >= GUILD_BANK_MAX_SLOTS && BankTabSlot != 0xFF)
1191            return;
1192    }
1193
1194    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1195        return;
1196
1197    uint32 GuildId = GetPlayer()->GetGuildId();
1198    if (GuildId == 0)
1199        return;
1200
1201    Guild *pGuild = objmgr.GetGuildById(GuildId);
1202    if(!pGuild)
1203        return;
1204
1205    Player *pl = GetPlayer();
1206
1207    // Bank <-> Bank
1208    if (BankToBank)
1209    {
1210        // empty operation
1211        if(BankTab==BankTabDst && BankTabSlot==BankTabSlotDst)
1212            return;
1213
1214        Item *pItemSrc = pGuild->GetItem(BankTab, BankTabSlot);
1215        if (!pItemSrc)                                      // may prevent crash
1216            return;
1217
1218        if(SplitedAmount > pItemSrc->GetCount())
1219            return;                                         // cheating?
1220        else if(SplitedAmount == pItemSrc->GetCount())
1221            SplitedAmount = 0;                              // no split
1222
1223        Item *pItemDst = pGuild->GetItem(BankTabDst, BankTabSlotDst);
1224
1225        if(BankTab!=BankTabDst)
1226        {
1227            // check dest pos rights (if different tabs)
1228            if(!pGuild->IsMemberHaveRights(pl->GetGUIDLow(), BankTabDst, GUILD_BANK_RIGHT_DEPOSIT_ITEM))
1229                return;
1230
1231            // check source pos rights (if different tabs)
1232            uint32 remRight = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab);
1233            if(remRight <= 0)
1234                return;
1235        }
1236
1237        if (SplitedAmount)
1238        {                                                   // Bank -> Bank item split (in empty or non empty slot
1239            GuildItemPosCountVec dest;
1240            uint8 msg = pGuild->CanStoreItem(BankTabDst,BankTabSlotDst,dest,SplitedAmount,pItemSrc,false);
1241            if( msg != EQUIP_ERR_OK )
1242            {
1243                pl->SendEquipError( msg, pItemSrc, NULL );
1244                return;
1245            }
1246
1247            Item *pNewItem = pItemSrc->CloneItem( SplitedAmount );
1248            if( !pNewItem )
1249            {
1250                pl->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, pItemSrc, NULL );
1251                return;
1252            }
1253
1254            CharacterDatabase.BeginTransaction();
1255            pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTab, pl->GetGUIDLow(), pItemSrc->GetEntry(), SplitedAmount, BankTabDst);
1256
1257            pl->ItemRemovedQuestCheck( pItemSrc->GetEntry(), SplitedAmount );
1258            pItemSrc->SetCount( pItemSrc->GetCount() - SplitedAmount );
1259            pItemSrc->FSetState(ITEM_CHANGED);
1260            pItemSrc->SaveToDB();                           // not in inventory and can be save standalone
1261            pGuild->StoreItem(BankTabDst,dest,pNewItem);
1262            CharacterDatabase.CommitTransaction();
1263        }
1264        else                                                // non split
1265        {
1266            GuildItemPosCountVec gDest;
1267            uint8 msg = pGuild->CanStoreItem(BankTabDst,BankTabSlotDst,gDest,pItemSrc->GetCount(),pItemSrc,false);
1268            if( msg == EQUIP_ERR_OK )                       // merge to
1269            {
1270                CharacterDatabase.BeginTransaction();
1271                pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTab,    pl->GetGUIDLow(), pItemSrc->GetEntry(), pItemSrc->GetCount(), BankTabDst);
1272
1273                pGuild->RemoveItem(BankTab, BankTabSlot);
1274                pGuild->StoreItem(BankTabDst, gDest, pItemSrc);
1275                CharacterDatabase.CommitTransaction();
1276            }
1277            else                                            // swap
1278            {
1279                gDest.clear();
1280                uint8 msg = pGuild->CanStoreItem(BankTabDst,BankTabSlotDst,gDest,pItemSrc->GetCount(),pItemSrc,true);
1281                if( msg != EQUIP_ERR_OK )
1282                {
1283                    pl->SendEquipError( msg, pItemSrc, NULL );
1284                    return;
1285                }
1286
1287                GuildItemPosCountVec gSrc;
1288                msg = pGuild->CanStoreItem(BankTab,BankTabSlot,gSrc,pItemDst->GetCount(),pItemDst,true);
1289                if( msg != EQUIP_ERR_OK )
1290                {
1291                    pl->SendEquipError( msg, pItemDst, NULL );
1292                    return;
1293                }
1294
1295                if(BankTab!=BankTabDst)
1296                {
1297                    // check source pos rights (item swapped to src)
1298                    if(!pGuild->IsMemberHaveRights(pl->GetGUIDLow(), BankTab, GUILD_BANK_RIGHT_DEPOSIT_ITEM))
1299                        return;
1300
1301                    // check dest pos rights (item swapped to src)
1302                    uint32 remRightDst = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTabDst);
1303                    if(remRightDst <= 0)
1304                        return;
1305                }
1306
1307                CharacterDatabase.BeginTransaction();
1308                pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTab,    pl->GetGUIDLow(), pItemSrc->GetEntry(), pItemSrc->GetCount(), BankTabDst);
1309                pGuild->LogBankEvent(GUILD_BANK_LOG_MOVE_ITEM, BankTabDst, pl->GetGUIDLow(), pItemDst->GetEntry(), pItemDst->GetCount(), BankTab);
1310
1311                pGuild->RemoveItem(BankTab, BankTabSlot);
1312                pGuild->RemoveItem(BankTabDst, BankTabSlotDst);
1313                pGuild->StoreItem(BankTab, gSrc, pItemDst);
1314                pGuild->StoreItem(BankTabDst, gDest, pItemSrc);
1315                CharacterDatabase.CommitTransaction();
1316            }
1317        }
1318        pGuild->DisplayGuildBankContentUpdate(BankTab,BankTabSlot,BankTab==BankTabDst ? BankTabSlotDst : -1);
1319        if(BankTab!=BankTabDst)
1320            pGuild->DisplayGuildBankContentUpdate(BankTabDst,BankTabSlotDst);
1321        return;
1322    }
1323
1324    // Player <-> Bank
1325
1326    // char->bank autostore click return BankTabSlot = 255 = NULL_SLOT
1327    // do similar for bank->char
1328    if(AutoStore && ToChar)
1329    {
1330        PlayerBag = NULL_BAG;
1331        PlayerSlot = NULL_SLOT;
1332    }
1333
1334    // allow work with inventory only
1335    if(!Player::IsInventoryPos(PlayerBag,PlayerSlot) && !(PlayerBag == NULL_BAG && PlayerSlot == NULL_SLOT) )
1336    {
1337        _player->SendEquipError( EQUIP_ERR_NONE, NULL, NULL );
1338        return;
1339    }
1340
1341    Item *pItemBank = pGuild->GetItem(BankTab, BankTabSlot);
1342    Item *pItemChar = GetPlayer()->GetItemByPos(PlayerBag, PlayerSlot);
1343    if (!pItemChar && !pItemBank)                           // Nothing to do
1344        return;
1345
1346    if (!pItemChar && !ToChar)                              // Problem to get item from player
1347        return;
1348
1349    if (!pItemBank && ToChar)                               // Problem to get bank item
1350        return;
1351
1352    // BankToChar swap or char to bank remaining
1353
1354    if (ToChar)                                             // Bank -> Char cases
1355    {
1356        if(SplitedAmount > pItemBank->GetCount())
1357            return;                                         // cheating?
1358        else if(SplitedAmount == pItemBank->GetCount())
1359            SplitedAmount = 0;                              // no split
1360
1361        if (SplitedAmount)
1362        {                                                   // Bank -> Char split to slot (patly move)
1363            Item *pNewItem = pItemBank->CloneItem( SplitedAmount );
1364            if( !pNewItem )
1365            {
1366                pl->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, pItemBank, NULL );
1367                return;
1368            }
1369
1370            ItemPosCountVec dest;
1371            uint8 msg = pl->CanStoreItem(PlayerBag, PlayerSlot, dest, pNewItem, false);
1372            if( msg != EQUIP_ERR_OK )
1373            {
1374                pl->SendEquipError( msg, pNewItem, NULL );
1375                delete pNewItem;
1376                return;
1377            }
1378
1379            // check source pos rights (item moved to inventory)
1380            uint32 remRight = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab);
1381            if(remRight <= 0)
1382            {
1383                delete pNewItem;
1384                return;
1385            }
1386
1387            CharacterDatabase.BeginTransaction();
1388            pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_ITEM, BankTab, pl->GetGUIDLow(), pItemBank->GetEntry(), SplitedAmount);
1389
1390            pItemBank->SetCount(pItemBank->GetCount()-SplitedAmount);
1391            pItemBank->FSetState(ITEM_CHANGED);
1392            pItemBank->SaveToDB();                          // not in inventory and can be save standalone
1393            pl->MoveItemToInventory(dest,pNewItem,true);
1394            pl->SaveInventoryAndGoldToDB();
1395
1396            pGuild->MemberItemWithdraw(BankTab, pl->GetGUIDLow());
1397            CharacterDatabase.CommitTransaction();
1398        }
1399        else                                                // Bank -> Char swap with slot (move)
1400        {
1401            ItemPosCountVec dest;
1402            uint8 msg = pl->CanStoreItem(PlayerBag, PlayerSlot, dest, pItemBank, false);
1403            if( msg == EQUIP_ERR_OK )                       // merge case
1404            {
1405                // check source pos rights (item moved to inventory)
1406                uint32 remRight = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab);
1407                if(remRight <= 0)
1408                    return;
1409
1410                CharacterDatabase.BeginTransaction();
1411                pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_ITEM, BankTab, pl->GetGUIDLow(), pItemBank->GetEntry(), pItemBank->GetCount());
1412
1413                pGuild->RemoveItem(BankTab, BankTabSlot);
1414                pl->MoveItemToInventory(dest,pItemBank,true);
1415                pl->SaveInventoryAndGoldToDB();
1416
1417                pGuild->MemberItemWithdraw(BankTab, pl->GetGUIDLow());
1418                CharacterDatabase.CommitTransaction();
1419            }
1420            else                                            // Bank <-> Char swap items
1421            {
1422                // check source pos rights (item swapped to bank)
1423                if(!pGuild->IsMemberHaveRights(pl->GetGUIDLow(), BankTab, GUILD_BANK_RIGHT_DEPOSIT_ITEM))
1424                    return;
1425
1426                if(pItemChar)
1427                {
1428                    if(!pItemChar->CanBeTraded())
1429                    {
1430                        _player->SendEquipError( EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pItemChar, NULL );
1431                        return;
1432                    }
1433                }
1434
1435                ItemPosCountVec iDest;
1436                msg = pl->CanStoreItem(PlayerBag, PlayerSlot, iDest, pItemBank, true);
1437                if( msg != EQUIP_ERR_OK )
1438                {
1439                    pl->SendEquipError( msg, pItemBank, NULL );
1440                    return;
1441                }
1442
1443                GuildItemPosCountVec gDest;
1444                if(pItemChar)
1445                {
1446                    msg = pGuild->CanStoreItem(BankTab,BankTabSlot,gDest,pItemChar->GetCount(),pItemChar,true);
1447                    if( msg != EQUIP_ERR_OK )
1448                    {
1449                        pl->SendEquipError( msg, pItemChar, NULL );
1450                        return;
1451                    }
1452                }
1453
1454                // check source pos rights (item moved to inventory)
1455                uint32 remRight = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab);
1456                if(remRight <= 0)
1457                    return;
1458
1459                if(pItemChar)
1460                {
1461                    // logging item move to bank
1462                    if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
1463                    {
1464                        sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
1465                            _player->GetName(),_player->GetSession()->GetAccountId(),
1466                            pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
1467                            GuildId);
1468                    }
1469                }
1470
1471                CharacterDatabase.BeginTransaction();
1472                pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_ITEM, BankTab, pl->GetGUIDLow(), pItemBank->GetEntry(), pItemBank->GetCount());
1473                if(pItemChar)
1474                    pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_ITEM, BankTab, pl->GetGUIDLow(), pItemChar->GetEntry(), pItemChar->GetCount());
1475
1476                pGuild->RemoveItem(BankTab, BankTabSlot);
1477                if(pItemChar)
1478                {
1479                    pl->MoveItemFromInventory(PlayerBag, PlayerSlot, true);
1480                    pItemChar->DeleteFromInventoryDB();
1481                }
1482
1483                if(pItemChar)
1484                    pGuild->StoreItem(BankTab, gDest, pItemChar);
1485                pl->MoveItemToInventory(iDest,pItemBank,true);
1486                pl->SaveInventoryAndGoldToDB();
1487
1488                pGuild->MemberItemWithdraw(BankTab, pl->GetGUIDLow());
1489                CharacterDatabase.CommitTransaction();
1490            }
1491        }
1492        pGuild->DisplayGuildBankContentUpdate(BankTab,BankTabSlot);
1493        return;
1494    }                                                       // End "To char" part
1495
1496    // Char -> Bank cases
1497
1498    if(!pItemChar->CanBeTraded())
1499    {
1500        _player->SendEquipError( EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pItemChar, NULL );
1501        return;
1502    }
1503
1504    // check source pos rights (item moved to bank)
1505    if(!pGuild->IsMemberHaveRights(pl->GetGUIDLow(), BankTab, GUILD_BANK_RIGHT_DEPOSIT_ITEM))
1506        return;
1507
1508    if(SplitedAmount > pItemChar->GetCount())
1509        return;                                             // cheating?
1510    else if(SplitedAmount == pItemChar->GetCount())
1511        SplitedAmount = 0;                                  // no split
1512
1513    if (SplitedAmount)
1514    {                                                       // Char -> Bank split to empty or non-empty slot (partly move)
1515        GuildItemPosCountVec dest;
1516        uint8 msg = pGuild->CanStoreItem(BankTab,BankTabSlot,dest,SplitedAmount,pItemChar,false);
1517        if( msg != EQUIP_ERR_OK )
1518        {
1519            pl->SendEquipError( msg, pItemChar, NULL );
1520            return;
1521        }
1522
1523        Item *pNewItem = pItemChar->CloneItem( SplitedAmount );
1524        if( !pNewItem )
1525        {
1526            pl->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, pItemChar, NULL );
1527            return;
1528        }
1529
1530        // logging item move to bank (before items merge
1531        if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
1532        {
1533            sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
1534                _player->GetName(),_player->GetSession()->GetAccountId(),
1535                pItemChar->GetProto()->Name1,pItemChar->GetEntry(),SplitedAmount,GuildId);
1536        }
1537
1538        CharacterDatabase.BeginTransaction();
1539        pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_ITEM, BankTab, pl->GetGUIDLow(), pItemChar->GetEntry(), SplitedAmount);
1540
1541        pl->ItemRemovedQuestCheck( pItemChar->GetEntry(), SplitedAmount );
1542        pItemChar->SetCount(pItemChar->GetCount()-SplitedAmount);
1543        pItemChar->SetState(ITEM_CHANGED);
1544        pl->SaveInventoryAndGoldToDB();
1545        pGuild->StoreItem(BankTab, dest, pNewItem);
1546        CharacterDatabase.CommitTransaction();
1547
1548        pGuild->DisplayGuildBankContentUpdate(BankTab,dest);
1549    }
1550    else                                                    // Char -> Bank swap with empty or non-empty (move)
1551    {
1552        GuildItemPosCountVec dest;
1553        uint8 msg = pGuild->CanStoreItem(BankTab,BankTabSlot,dest,pItemChar->GetCount(),pItemChar,false);
1554        if( msg == EQUIP_ERR_OK )                           // merge
1555        {
1556            // logging item move to bank
1557            if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
1558            {
1559                sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
1560                    _player->GetName(),_player->GetSession()->GetAccountId(),
1561                    pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
1562                    GuildId);
1563            }
1564
1565            CharacterDatabase.BeginTransaction();
1566            pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_ITEM, BankTab, pl->GetGUIDLow(), pItemChar->GetEntry(), pItemChar->GetCount());
1567
1568            pl->MoveItemFromInventory(PlayerBag, PlayerSlot, true);
1569            pItemChar->DeleteFromInventoryDB();
1570
1571            pGuild->StoreItem(BankTab,dest,pItemChar);
1572            pl->SaveInventoryAndGoldToDB();
1573            CharacterDatabase.CommitTransaction();
1574
1575            pGuild->DisplayGuildBankContentUpdate(BankTab,dest);
1576        }
1577        else                                                // Char <-> Bank swap items (posible NULL bank item)
1578        {
1579            ItemPosCountVec iDest;
1580            if(pItemBank)
1581            {
1582                msg = pl->CanStoreItem(PlayerBag, PlayerSlot, iDest, pItemBank, true);
1583                if( msg != EQUIP_ERR_OK )
1584                {
1585                    pl->SendEquipError( msg, pItemBank, NULL );
1586                    return;
1587                }
1588            }
1589
1590            GuildItemPosCountVec gDest;
1591            msg = pGuild->CanStoreItem(BankTab,BankTabSlot,gDest,pItemChar->GetCount(),pItemChar,true);
1592            if( msg != EQUIP_ERR_OK )
1593            {
1594                pl->SendEquipError( msg, pItemChar, NULL );
1595                return;
1596            }
1597
1598            if(pItemBank)
1599            {
1600                // check bank pos rights (item swapped with inventory)
1601                uint32 remRight = pGuild->GetMemberSlotWithdrawRem(pl->GetGUIDLow(), BankTab);
1602                if(remRight <= 0)
1603                    return;
1604            }
1605
1606            // logging item move to bank
1607            if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
1608            {
1609                sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
1610                    _player->GetName(),_player->GetSession()->GetAccountId(),
1611                    pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
1612                    GuildId);
1613            }
1614
1615            CharacterDatabase.BeginTransaction();
1616            if(pItemBank)
1617                pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_ITEM, BankTab, pl->GetGUIDLow(), pItemBank->GetEntry(), pItemBank->GetCount());
1618            pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_ITEM, BankTab, pl->GetGUIDLow(), pItemChar->GetEntry(), pItemChar->GetCount());
1619
1620            pl->MoveItemFromInventory(PlayerBag, PlayerSlot, true);
1621            pItemChar->DeleteFromInventoryDB();
1622            if(pItemBank)
1623                pGuild->RemoveItem(BankTab, BankTabSlot);
1624
1625            pGuild->StoreItem(BankTab,gDest,pItemChar);
1626            if(pItemBank)
1627                pl->MoveItemToInventory(iDest,pItemBank,true);
1628            pl->SaveInventoryAndGoldToDB();
1629            if(pItemBank)
1630                pGuild->MemberItemWithdraw(BankTab, pl->GetGUIDLow());
1631            CharacterDatabase.CommitTransaction();
1632
1633            pGuild->DisplayGuildBankContentUpdate(BankTab,gDest);
1634        }
1635    }
1636}
1637
1638void WorldSession::HandleGuildBankBuyTab( WorldPacket & recv_data )
1639{
1640    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_BUY_TAB)");
1641    CHECK_PACKET_SIZE(recv_data, 8+1);
1642    //recv_data.hexlike();
1643    uint64 GoGuid;
1644    uint8 TabId;
1645
1646    recv_data >> GoGuid;
1647    recv_data >> TabId;
1648
1649    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1650        return;
1651
1652    uint32 GuildId = GetPlayer()->GetGuildId();
1653    if (GuildId==0)
1654        return;
1655
1656    Guild *pGuild = objmgr.GetGuildById(GuildId);
1657    if(!pGuild)
1658        return;
1659
1660    uint32 TabCost = objmgr.GetGuildBankTabPrice(TabId) * GOLD;
1661    if (!TabCost)
1662        return;
1663
1664    if (pGuild->GetPurchasedTabs() >= GUILD_BANK_MAX_TABS)
1665        return;
1666
1667    if (TabId != pGuild->GetPurchasedTabs())                // purchased_tabs = 0 when buying Tab 0, that is why this check can be made
1668    {
1669        sLog.outError("Error: trying to buy a tab non contigous to owned ones");
1670        return;
1671    }
1672
1673    if (GetPlayer()->GetMoney() < TabCost)                  // Should not happen, this is checked by client
1674        return;
1675
1676    // Go on with creating tab
1677    pGuild->CreateNewBankTab();
1678    GetPlayer()->ModifyMoney(-int(TabCost));
1679    pGuild->SetBankMoneyPerDay(GetPlayer()->GetRank(), WITHDRAW_MONEY_UNLIMITED);
1680    pGuild->SetBankRightsAndSlots(GetPlayer()->GetRank(), TabId, GUILD_BANK_RIGHT_FULL, WITHDRAW_SLOT_UNLIMITED, true);
1681    pGuild->Roster(this);
1682    pGuild->DisplayGuildBankTabsInfo(this);
1683}
1684
1685void WorldSession::HandleGuildBankModifyTab( WorldPacket & recv_data )
1686{
1687    sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_UPDATE_TAB)");
1688    //recv_data.hexlike();
1689    CHECK_PACKET_SIZE(recv_data, 8+1+1+1);
1690    uint64 GoGuid;
1691    uint8 TabId;
1692    std::string Name;
1693    std::string IconIndex;
1694
1695    recv_data >> GoGuid;
1696    recv_data >> TabId;
1697    recv_data >> Name;
1698    recv_data >> IconIndex;
1699
1700    if(Name.empty())
1701        return;
1702
1703    if(IconIndex.empty())
1704        return;
1705
1706    if (!objmgr.IsGuildVaultGameObject(_player, GoGuid))
1707        return;
1708
1709    uint32 GuildId = GetPlayer()->GetGuildId();
1710    if (GuildId==0)
1711        return;
1712
1713    Guild *pGuild = objmgr.GetGuildById(GuildId);
1714    if(!pGuild)
1715        return;
1716
1717    pGuild->SetGuildBankTabInfo(TabId, Name, IconIndex);
1718    pGuild->DisplayGuildBankTabsInfo(this);
1719    pGuild->DisplayGuildBankContent(this, TabId);
1720}
1721
1722void WorldSession::HandleGuildBankLog( WorldPacket & recv_data )
1723{
1724    sLog.outDebug("WORLD: Received (MSG_GUILD_BANK_LOG_QUERY)");
1725    CHECK_PACKET_SIZE(recv_data, 1);
1726
1727    uint32 GuildId = GetPlayer()->GetGuildId();
1728    if (GuildId == 0)
1729        return;
1730
1731    Guild *pGuild = objmgr.GetGuildById(GuildId);
1732    if(!pGuild)
1733        return;
1734
1735    uint8 TabId;
1736    recv_data >> TabId;
1737
1738    pGuild->DisplayGuildBankLogs(this, TabId);
1739}
1740
1741void WorldSession::HandleGuildBankTabText(WorldPacket &recv_data)
1742{
1743    sLog.outDebug("WORLD: Received MSG_QUERY_GUILD_BANK_TEXT");
1744    CHECK_PACKET_SIZE(recv_data, 1);
1745
1746    uint32 GuildId = GetPlayer()->GetGuildId();
1747    if (GuildId == 0)
1748        return;
1749
1750    Guild *pGuild = objmgr.GetGuildById(GuildId);
1751    if(!pGuild)
1752        return;
1753
1754    uint8 TabId;
1755    recv_data >> TabId;
1756
1757    pGuild->SendGuildBankTabText(this, TabId);
1758}
1759
1760void WorldSession::HandleGuildBankSetTabText(WorldPacket &recv_data)
1761{
1762    sLog.outDebug("WORLD: Received CMSG_SET_GUILD_BANK_TEXT");
1763    CHECK_PACKET_SIZE(recv_data, 1+1);
1764
1765    uint32 GuildId = GetPlayer()->GetGuildId();
1766    if (GuildId == 0)
1767        return;
1768
1769    Guild *pGuild = objmgr.GetGuildById(GuildId);
1770    if(!pGuild)
1771        return;
1772
1773    uint8 TabId;
1774    std::string Text;
1775    recv_data >> TabId;
1776    recv_data >> Text;
1777
1778    pGuild->SetGuildBankTabText(TabId, Text);
1779}
1780
1781void WorldSession::SendSaveGuildEmblem( uint32 msg )
1782{
1783    WorldPacket data(MSG_SAVE_GUILD_EMBLEM, 4);
1784    data << uint32(msg);                                    // not part of guild
1785    SendPacket( &data );
1786}
Note: See TracBrowser for help on using the browser.