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

Revision 229, 52.1 kB (checked in by yumileroy, 17 years ago)

[svn] *** Source: MaNGOS ***
* Fixed build extractor at Windows Vista. Author: Vladimir
* Fixed comment text and code indentifiers spelling. Author: Vladimir & Paradox.
* Access cached member lists in guild handlers instead of querying the DB. Author: Hunuza
* Small fixes in send/received packet and simple code cleanup also. Author: Vladimir
* Not output error at loading empty character_ticket table. Author: Vladimir
* Not reset display model at shapeshift aura remove if it not set at apply. Author: Arthorius
* Applied props to few files.

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