2 * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "WorldPacket.h"
21 #include "WorldSession.h"
23 #include "ObjectMgr.h"
27 #include "GossipDef.h"
28 #include "SocialMgr.h"
30 void WorldSession::HandleGuildQueryOpcode(WorldPacket
& recvPacket
)
32 sLog
.outDebug("WORLD: Received CMSG_GUILD_QUERY");
35 recvPacket
>> guildId
;
37 if(Guild
*guild
= sObjectMgr
.GetGuildById(guildId
))
43 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
46 void WorldSession::HandleGuildCreateOpcode(WorldPacket
& recvPacket
)
48 sLog
.outDebug("WORLD: Received CMSG_GUILD_CREATE");
53 if(GetPlayer()->GetGuildId()) // already in guild
56 Guild
*guild
= new Guild
;
57 if(!guild
->Create(GetPlayer(), gname
))
63 sObjectMgr
.AddGuild(guild
);
66 void WorldSession::HandleGuildInviteOpcode(WorldPacket
& recvPacket
)
68 sLog
.outDebug("WORLD: Received CMSG_GUILD_INVITE");
70 std::string Invitedname
, plname
;
71 Player
* player
= NULL
;
73 recvPacket
>> Invitedname
;
75 if(normalizePlayerName(Invitedname
))
76 player
= ObjectAccessor::FindPlayerByName(Invitedname
.c_str());
80 SendGuildCommandResult(GUILD_INVITE_S
, Invitedname
, ERR_GUILD_PLAYER_NOT_FOUND_S
);
84 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
87 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
91 // OK result but not send invite
92 if(player
->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow()))
95 // not let enemies sign guild charter
96 if (!sWorld
.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD
) && player
->GetTeam() != GetPlayer()->GetTeam())
98 SendGuildCommandResult(GUILD_INVITE_S
, Invitedname
, ERR_GUILD_NOT_ALLIED
);
102 if(player
->GetGuildId())
104 plname
= player
->GetName();
105 SendGuildCommandResult(GUILD_INVITE_S
, plname
, ERR_ALREADY_IN_GUILD_S
);
109 if(player
->GetGuildIdInvited())
111 plname
= player
->GetName();
112 SendGuildCommandResult(GUILD_INVITE_S
, plname
, ERR_ALREADY_INVITED_TO_GUILD_S
);
116 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_INVITE
))
118 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
122 sLog
.outDebug("Player %s Invited %s to Join his Guild", GetPlayer()->GetName(), Invitedname
.c_str());
124 player
->SetGuildIdInvited(GetPlayer()->GetGuildId());
125 // Put record into guildlog
126 guild
->LogGuildEvent(GUILD_EVENT_LOG_INVITE_PLAYER
, GetPlayer()->GetGUIDLow(), player
->GetGUIDLow(), 0);
128 WorldPacket
data(SMSG_GUILD_INVITE
, (8+10)); // guess size
129 data
<< GetPlayer()->GetName();
130 data
<< guild
->GetName();
131 player
->GetSession()->SendPacket(&data
);
133 sLog
.outDebug("WORLD: Sent (SMSG_GUILD_INVITE)");
136 void WorldSession::HandleGuildRemoveOpcode(WorldPacket
& recvPacket
)
138 sLog
.outDebug("WORLD: Received CMSG_GUILD_REMOVE");
141 recvPacket
>> plName
;
143 if(!normalizePlayerName(plName
))
146 Guild
* guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
149 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
153 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_REMOVE
))
155 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
160 MemberSlot
* slot
= guild
->GetMemberSlot(plName
, plGuid
);
163 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
167 if(slot
->RankId
== GR_GUILDMASTER
)
169 SendGuildCommandResult(GUILD_QUIT_S
, "", ERR_GUILD_LEADER_LEAVE
);
173 // do not allow to kick player with same or higher rights
174 if(GetPlayer()->GetRank() >= slot
->RankId
)
176 SendGuildCommandResult(GUILD_QUIT_S
, plName
, ERR_GUILD_RANK_TOO_HIGH_S
);
180 guild
->DelMember(plGuid
);
181 // Put record into guild log
182 guild
->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER
, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid
), 0);
184 guild
->BroadcastEvent(GE_REMOVED
, 0, 2, plName
, _player
->GetName(), "");
187 void WorldSession::HandleGuildAcceptOpcode(WorldPacket
& /*recvPacket*/)
190 Player
*player
= GetPlayer();
192 sLog
.outDebug("WORLD: Received CMSG_GUILD_ACCEPT");
194 guild
= sObjectMgr
.GetGuildById(player
->GetGuildIdInvited());
195 if(!guild
|| player
->GetGuildId())
198 // not let enemies sign guild charter
199 if (!sWorld
.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD
) && player
->GetTeam() != sObjectMgr
.GetPlayerTeamByGUID(guild
->GetLeader()))
202 if(!guild
->AddMember(GetPlayer()->GetGUID(),guild
->GetLowestRank()))
204 // Put record into guild log
205 guild
->LogGuildEvent(GUILD_EVENT_LOG_JOIN_GUILD
, GetPlayer()->GetGUIDLow(), 0, 0);
207 guild
->BroadcastEvent(GE_JOINED
, player
->GetGUID(), 1, player
->GetName(), "", "");
210 void WorldSession::HandleGuildDeclineOpcode(WorldPacket
& /*recvPacket*/)
212 sLog
.outDebug("WORLD: Received CMSG_GUILD_DECLINE");
214 GetPlayer()->SetGuildIdInvited(0);
215 GetPlayer()->SetInGuild(0);
218 void WorldSession::HandleGuildInfoOpcode(WorldPacket
& /*recvPacket*/)
220 sLog
.outDebug("WORLD: Received CMSG_GUILD_INFO");
222 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
225 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
229 WorldPacket
data(SMSG_GUILD_INFO
, (5*4 + guild
->GetName().size() + 1));
230 data
<< guild
->GetName();
231 data
<< guild
->GetCreatedDay();
232 data
<< guild
->GetCreatedMonth();
233 data
<< guild
->GetCreatedYear();
234 data
<< guild
->GetMemberSize();
235 data
<< guild
->GetMemberSize();
240 void WorldSession::HandleGuildRosterOpcode(WorldPacket
& /*recvPacket*/)
242 sLog
.outDebug("WORLD: Received CMSG_GUILD_ROSTER");
244 if(Guild
* guild
= sObjectMgr
.GetGuildById(_player
->GetGuildId()))
248 void WorldSession::HandleGuildPromoteOpcode(WorldPacket
& recvPacket
)
250 sLog
.outDebug("WORLD: Received CMSG_GUILD_PROMOTE");
253 recvPacket
>> plName
;
255 if(!normalizePlayerName(plName
))
258 Guild
* guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
261 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
264 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_PROMOTE
))
266 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
271 MemberSlot
* slot
= guild
->GetMemberSlot(plName
, plGuid
);
275 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
279 if(plGuid
== GetPlayer()->GetGUID())
281 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_NAME_INVALID
);
285 // allow to promote only to lower rank than member's rank
286 // guildmaster's rank = 0
287 // GetPlayer()->GetRank() + 1 is highest rank that current player can promote to
288 if(GetPlayer()->GetRank() + 1 >= slot
->RankId
)
290 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_RANK_TOO_HIGH_S
);
294 uint32 newRankId
= slot
->RankId
- 1; //when promoting player, rank is decreased
296 guild
->ChangeRank(plGuid
, newRankId
);
297 // Put record into guild log
298 guild
->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER
, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid
), newRankId
);
300 guild
->BroadcastEvent(GE_PROMOTION
, 0, 3, _player
->GetName(), plName
, guild
->GetRankName(newRankId
));
303 void WorldSession::HandleGuildDemoteOpcode(WorldPacket
& recvPacket
)
305 sLog
.outDebug("WORLD: Received CMSG_GUILD_DEMOTE");
308 recvPacket
>> plName
;
310 if(!normalizePlayerName(plName
))
313 Guild
* guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
317 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
321 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_DEMOTE
))
323 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
328 MemberSlot
* slot
= guild
->GetMemberSlot(plName
, plGuid
);
332 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
336 if(plGuid
== GetPlayer()->GetGUID())
338 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_NAME_INVALID
);
342 // do not allow to demote same or higher rank
343 if(GetPlayer()->GetRank() >= slot
->RankId
)
345 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_RANK_TOO_HIGH_S
);
349 // do not allow to demote lowest rank
350 if(slot
->RankId
>= guild
->GetLowestRank())
352 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_RANK_TOO_LOW_S
);
356 uint32 newRankId
= slot
->RankId
+ 1; //when demoting player, rank is increased
358 guild
->ChangeRank(plGuid
, newRankId
);
359 // Put record into guild log
360 guild
->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER
, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid
), newRankId
);
362 guild
->BroadcastEvent(GE_DEMOTION
, 0, 3, _player
->GetName(), plName
, guild
->GetRankName(slot
->RankId
));
365 void WorldSession::HandleGuildLeaveOpcode(WorldPacket
& /*recvPacket*/)
367 sLog
.outDebug("WORLD: Received CMSG_GUILD_LEAVE");
369 Guild
*guild
= sObjectMgr
.GetGuildById(_player
->GetGuildId());
372 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
376 if(_player
->GetGUID() == guild
->GetLeader() && guild
->GetMemberSize() > 1)
378 SendGuildCommandResult(GUILD_QUIT_S
, "", ERR_GUILD_LEADER_LEAVE
);
382 if(_player
->GetGUID() == guild
->GetLeader())
388 guild
->DelMember(_player
->GetGUID());
389 // Put record into guild log
390 guild
->LogGuildEvent(GUILD_EVENT_LOG_LEAVE_GUILD
, _player
->GetGUIDLow(), 0, 0);
392 guild
->BroadcastEvent(GE_LEFT
, _player
->GetGUID(), 1, _player
->GetName(), "", "");
394 SendGuildCommandResult(GUILD_QUIT_S
, guild
->GetName(), ERR_PLAYER_NO_MORE_IN_GUILD
);
397 void WorldSession::HandleGuildDisbandOpcode(WorldPacket
& /*recvPacket*/)
399 sLog
.outDebug("WORLD: Received CMSG_GUILD_DISBAND");
401 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
404 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
408 if(GetPlayer()->GetGUID() != guild
->GetLeader())
410 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
416 sLog
.outDebug("WORLD: Guild Successfully Disbanded");
419 void WorldSession::HandleGuildLeaderOpcode(WorldPacket
& recvPacket
)
421 sLog
.outDebug("WORLD: Received CMSG_GUILD_LEADER");
426 Player
*oldLeader
= GetPlayer();
428 if(!normalizePlayerName(name
))
431 Guild
*guild
= sObjectMgr
.GetGuildById(oldLeader
->GetGuildId());
435 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
439 if (oldLeader
->GetGUID() != guild
->GetLeader())
441 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
445 uint64 newLeaderGUID
;
446 MemberSlot
* slot
= guild
->GetMemberSlot(name
, newLeaderGUID
);
450 SendGuildCommandResult(GUILD_INVITE_S
, name
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
454 guild
->SetLeader(newLeaderGUID
);
455 guild
->ChangeRank(oldLeader
->GetGUID(), GR_OFFICER
);
457 guild
->BroadcastEvent(GE_LEADER_CHANGED
, 0, 2, oldLeader
->GetName(), name
, "");
460 void WorldSession::HandleGuildMOTDOpcode(WorldPacket
& recvPacket
)
462 sLog
.outDebug("WORLD: Received CMSG_GUILD_MOTD");
466 if(!recvPacket
.empty())
471 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
474 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
477 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_SETMOTD
))
479 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
483 guild
->SetMOTD(MOTD
);
485 guild
->BroadcastEvent(GE_MOTD
, 0, 1, MOTD
, "", "");
488 void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket
& recvPacket
)
490 sLog
.outDebug("WORLD: Received CMSG_GUILD_SET_PUBLIC_NOTE");
492 std::string name
,PNOTE
;
495 if(!normalizePlayerName(name
))
498 Guild
* guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
502 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
506 if (!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EPNOTE
))
508 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
513 MemberSlot
* slot
= guild
->GetMemberSlot(name
, plGuid
);
517 SendGuildCommandResult(GUILD_INVITE_S
, name
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
522 guild
->SetPNOTE(plGuid
, PNOTE
);
527 void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket
& recvPacket
)
529 sLog
.outDebug("WORLD: Received CMSG_GUILD_SET_OFFICER_NOTE");
531 std::string plName
, OFFNOTE
;
532 recvPacket
>> plName
;
534 if (!normalizePlayerName(plName
))
537 Guild
* guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
541 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
544 if (!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EOFFNOTE
))
546 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
551 MemberSlot
* slot
= guild
->GetMemberSlot(plName
, plGuid
);
555 SendGuildCommandResult(GUILD_INVITE_S
, plName
, ERR_GUILD_PLAYER_NOT_IN_GUILD_S
);
559 recvPacket
>> OFFNOTE
;
560 guild
->SetOFFNOTE(plGuid
, OFFNOTE
);
565 void WorldSession::HandleGuildRankOpcode(WorldPacket
& recvPacket
)
567 std::string rankname
;
569 uint32 rights
, MoneyPerDay
;
571 sLog
.outDebug("WORLD: Received CMSG_GUILD_RANK");
573 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
576 recvPacket
.rpos(recvPacket
.wpos()); // set to end to avoid warnings spam
577 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
580 else if(GetPlayer()->GetGUID() != guild
->GetLeader())
582 recvPacket
.rpos(recvPacket
.wpos()); // set to end to avoid warnings spam
583 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
587 recvPacket
>> rankId
;
588 recvPacket
>> rights
;
589 recvPacket
>> rankname
;
590 recvPacket
>> MoneyPerDay
;
592 for (int i
= 0; i
< GUILD_BANK_MAX_TABS
; ++i
)
595 uint32 BankSlotPerDay
;
597 recvPacket
>> BankRights
;
598 recvPacket
>> BankSlotPerDay
;
599 guild
->SetBankRightsAndSlots(rankId
, uint8(i
), uint16(BankRights
& 0xFF), uint16(BankSlotPerDay
), true);
602 sLog
.outDebug("WORLD: Changed RankName to %s , Rights to 0x%.4X", rankname
.c_str(), rights
);
604 guild
->SetBankMoneyPerDay(rankId
, MoneyPerDay
);
605 guild
->SetRankName(rankId
, rankname
);
607 if (rankId
== GR_GUILDMASTER
) // prevent loss leader rights
608 rights
= GR_RIGHT_ALL
;
610 guild
->SetRankRights(rankId
, rights
);
613 guild
->Roster(); // broadcast for tab rights update
616 void WorldSession::HandleGuildAddRankOpcode(WorldPacket
& recvPacket
)
618 sLog
.outDebug("WORLD: Received CMSG_GUILD_ADD_RANK");
620 std::string rankname
;
621 recvPacket
>> rankname
;
623 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
626 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
630 if(GetPlayer()->GetGUID() != guild
->GetLeader())
632 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
636 if(guild
->GetRanksSize() >= GUILD_RANKS_MAX_COUNT
) // client not let create more 10 than ranks
639 guild
->CreateRank(rankname
, GR_RIGHT_GCHATLISTEN
| GR_RIGHT_GCHATSPEAK
);
642 guild
->Roster(); // broadcast for tab rights update
645 void WorldSession::HandleGuildDelRankOpcode(WorldPacket
& /*recvPacket*/)
647 sLog
.outDebug("WORLD: Received CMSG_GUILD_DEL_RANK");
649 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
652 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
655 else if(GetPlayer()->GetGUID() != guild
->GetLeader())
657 SendGuildCommandResult(GUILD_INVITE_S
, "", ERR_GUILD_PERMISSIONS
);
664 guild
->Roster(); // broadcast for tab rights update
667 void WorldSession::SendGuildCommandResult(uint32 typecmd
, const std::string
& str
,uint32 cmdresult
)
669 WorldPacket
data(SMSG_GUILD_COMMAND_RESULT
, (8+str
.size()+1));
675 sLog
.outDebug("WORLD: Sent (SMSG_GUILD_COMMAND_RESULT)");
678 void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPacket
& recvPacket
)
680 sLog
.outDebug("WORLD: Received CMSG_GUILD_INFO_TEXT");
685 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
688 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
692 if(!guild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_MODIFY_GUILD_INFO
))
694 SendGuildCommandResult(GUILD_CREATE_S
, "", ERR_GUILD_PERMISSIONS
);
698 guild
->SetGINFO(GINFO
);
701 void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket
& recvPacket
)
703 sLog
.outDebug("WORLD: Received MSG_SAVE_GUILD_EMBLEM");
706 uint32 EmblemStyle
, EmblemColor
, BorderStyle
, BorderColor
, BackgroundColor
;
708 recvPacket
>> vendorGuid
;
709 recvPacket
>> EmblemStyle
>> EmblemColor
>> BorderStyle
>> BorderColor
>> BackgroundColor
;
711 Creature
*pCreature
= GetPlayer()->GetNPCIfCanInteractWith(vendorGuid
,UNIT_NPC_FLAG_TABARDDESIGNER
);
714 //"That's not an emblem vendor!"
715 SendSaveGuildEmblem(ERR_GUILDEMBLEM_INVALIDVENDOR
);
716 sLog
.outDebug("WORLD: HandleSaveGuildEmblemOpcode - Unit (GUID: %u) not found or you can't interact with him.", GUID_LOPART(vendorGuid
));
721 if(GetPlayer()->hasUnitState(UNIT_STAT_DIED
))
722 GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH
);
724 Guild
*guild
= sObjectMgr
.GetGuildById(GetPlayer()->GetGuildId());
727 //"You are not part of a guild!";
728 SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOGUILD
);
732 if (guild
->GetLeader() != GetPlayer()->GetGUID())
734 //"Only guild leaders can create emblems."
735 SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTGUILDMASTER
);
739 if(GetPlayer()->GetMoney() < 10*GOLD
)
741 //"You can't afford to do that."
742 SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTENOUGHMONEY
);
746 GetPlayer()->ModifyMoney(-10*GOLD
);
747 guild
->SetEmblem(EmblemStyle
, EmblemColor
, BorderStyle
, BorderColor
, BackgroundColor
);
749 //"Guild Emblem saved."
750 SendSaveGuildEmblem(ERR_GUILDEMBLEM_SUCCESS
);
755 void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket
& /* recvPacket */)
758 sLog
.outDebug("WORLD: Received (MSG_GUILD_EVENT_LOG_QUERY)");
760 if(uint32 GuildId
= GetPlayer()->GetGuildId())
761 if(Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
))
762 pGuild
->DisplayGuildEventLog(this);
765 /****** GUILD BANK *******/
767 void WorldSession::HandleGuildBankMoneyWithdrawn( WorldPacket
& /* recv_data */ )
769 sLog
.outDebug("WORLD: Received (MSG_GUILD_BANK_MONEY_WITHDRAWN)");
771 if(uint32 GuildId
= GetPlayer()->GetGuildId())
772 if(Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
))
773 pGuild
->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
776 void WorldSession::HandleGuildPermissions( WorldPacket
& /* recv_data */ )
778 sLog
.outDebug("WORLD: Received (MSG_GUILD_PERMISSIONS)");
780 if(uint32 GuildId
= GetPlayer()->GetGuildId())
782 if(Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
))
784 uint32 rankId
= GetPlayer()->GetRank();
786 WorldPacket
data(MSG_GUILD_PERMISSIONS
, 4*15+1);
787 data
<< uint32(rankId
); // guild rank id
788 data
<< uint32(pGuild
->GetRankRights(rankId
)); // rank rights
789 // money per day left
790 data
<< uint32(pGuild
->GetMemberMoneyWithdrawRem(GetPlayer()->GetGUIDLow()));
791 data
<< uint8(pGuild
->GetPurchasedTabs()); // tabs count
792 // why sending all info when not all tabs are purchased???
793 for(int i
= 0; i
< GUILD_BANK_MAX_TABS
; ++i
)
795 data
<< uint32(pGuild
->GetBankRights(rankId
, uint8(i
)));
796 data
<< uint32(pGuild
->GetMemberSlotWithdrawRem(GetPlayer()->GetGUIDLow(), uint8(i
)));
799 sLog
.outDebug("WORLD: Sent (MSG_GUILD_PERMISSIONS)");
804 /* Called when clicking on Guild bank gameobject */
805 void WorldSession::HandleGuildBankerActivate( WorldPacket
& recv_data
)
807 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANKER_ACTIVATE)");
811 recv_data
>> GoGuid
>> unk
;
813 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
816 if (uint32 GuildId
= GetPlayer()->GetGuildId())
818 if(Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
))
820 pGuild
->DisplayGuildBankTabsInfo(this); // this also will load guild bank if not yet
825 SendGuildCommandResult(GUILD_UNK1
, "", ERR_GUILD_PLAYER_NOT_IN_GUILD
);
828 /* Called when opening guild bank tab only (first one) */
829 void WorldSession::HandleGuildBankQueryTab( WorldPacket
& recv_data
)
831 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_QUERY_TAB)");
835 recv_data
>> GoGuid
>> TabId
>> unk1
;
837 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
840 uint32 GuildId
= GetPlayer()->GetGuildId();
844 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
848 if (TabId
>= pGuild
->GetPurchasedTabs())
851 // Let's update the amount of gold the player can withdraw before displaying the content
852 // This is useful if money withdraw right has changed
853 pGuild
->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
854 pGuild
->DisplayGuildBankContent(this, TabId
);
857 void WorldSession::HandleGuildBankDepositMoney( WorldPacket
& recv_data
)
859 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_DEPOSIT_MONEY)");
863 recv_data
>> GoGuid
>> money
;
868 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
871 if (GetPlayer()->GetMoney() < money
)
874 uint32 GuildId
= GetPlayer()->GetGuildId();
878 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
882 if (!pGuild
->GetPurchasedTabs())
885 CharacterDatabase
.BeginTransaction();
887 pGuild
->SetBankMoney(pGuild
->GetGuildBankMoney()+money
);
888 GetPlayer()->ModifyMoney(-int(money
));
889 GetPlayer()->SaveGoldToDB();
891 CharacterDatabase
.CommitTransaction();
894 if(_player
->GetSession()->GetSecurity() > SEC_PLAYER
&& sWorld
.getConfig(CONFIG_BOOL_GM_LOG_TRADE
))
896 sLog
.outCommand(_player
->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)",
897 _player
->GetName(),_player
->GetSession()->GetAccountId(),money
,GuildId
);
901 pGuild
->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_MONEY
, uint8(0), GetPlayer()->GetGUIDLow(), money
);
903 pGuild
->DisplayGuildBankTabsInfo(this);
904 pGuild
->DisplayGuildBankContent(this, 0);
905 pGuild
->DisplayGuildBankMoneyUpdate(this);
908 void WorldSession::HandleGuildBankWithdrawMoney( WorldPacket
& recv_data
)
910 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_WITHDRAW_MONEY)");
914 recv_data
>> GoGuid
>> money
;
919 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
922 uint32 GuildId
= GetPlayer()->GetGuildId();
926 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
930 if (!pGuild
->GetPurchasedTabs())
933 if (pGuild
->GetGuildBankMoney()<money
) // not enough money in bank
936 if (!pGuild
->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_WITHDRAW_GOLD
))
939 CharacterDatabase
.BeginTransaction();
941 if (!pGuild
->MemberMoneyWithdraw(money
, GetPlayer()->GetGUIDLow()))
943 CharacterDatabase
.RollbackTransaction();
947 GetPlayer()->ModifyMoney(money
);
948 GetPlayer()->SaveGoldToDB();
950 CharacterDatabase
.CommitTransaction();
953 pGuild
->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_MONEY
, uint8(0), GetPlayer()->GetGUIDLow(), money
);
955 pGuild
->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
956 pGuild
->DisplayGuildBankTabsInfo(this);
957 pGuild
->DisplayGuildBankContent(this, 0);
958 pGuild
->DisplayGuildBankMoneyUpdate(this);
961 void WorldSession::HandleGuildBankSwapItems( WorldPacket
& recv_data
)
963 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_SWAP_ITEMS)");
968 uint8 BankTab
, BankTabSlot
, AutoStore
;
969 uint8 PlayerSlot
= NULL_SLOT
;
970 uint8 PlayerBag
= NULL_BAG
;
971 uint8 BankTabDst
, BankTabSlotDst
, unk2
;
973 uint32 ItemEntry
, unk1
;
974 uint32 AutoStoreCount
= 0;
975 uint32 SplitedAmount
= 0;
977 recv_data
>> GoGuid
>> BankToBank
;
979 uint32 GuildId
= GetPlayer()->GetGuildId();
982 recv_data
.rpos(recv_data
.wpos()); // prevent additional spam at rejected packet
986 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
989 recv_data
.rpos(recv_data
.wpos()); // prevent additional spam at rejected packet
995 recv_data
>> BankTabDst
;
996 recv_data
>> BankTabSlotDst
;
997 recv_data
>> unk1
; // always 0
998 recv_data
>> BankTab
;
999 recv_data
>> BankTabSlot
;
1000 recv_data
>> ItemEntry
;
1001 recv_data
>> unk2
; // always 0
1002 recv_data
>> SplitedAmount
;
1004 if (BankTabSlotDst
>= GUILD_BANK_MAX_SLOTS
||
1005 (BankTabDst
== BankTab
&& BankTabSlotDst
== BankTabSlot
) ||
1006 BankTab
>= pGuild
->GetPurchasedTabs() ||
1007 BankTabDst
>= pGuild
->GetPurchasedTabs())
1009 recv_data
.rpos(recv_data
.wpos()); // prevent additional spam at rejected packet
1015 recv_data
>> BankTab
;
1016 recv_data
>> BankTabSlot
;
1017 recv_data
>> ItemEntry
;
1018 recv_data
>> AutoStore
;
1021 recv_data
>> AutoStoreCount
;
1022 recv_data
.read_skip
<uint8
>(); // ToChar (?), always and expected to be 1 (autostore only triggered in guild->ToChar)
1023 recv_data
.read_skip
<uint32
>(); // unknown, always 0
1027 recv_data
>> PlayerBag
;
1028 recv_data
>> PlayerSlot
;
1029 recv_data
>> ToChar
;
1030 recv_data
>> SplitedAmount
;
1033 if ((BankTabSlot
>= GUILD_BANK_MAX_SLOTS
&& BankTabSlot
!= 0xFF) ||
1034 BankTab
>= pGuild
->GetPurchasedTabs())
1036 recv_data
.rpos(recv_data
.wpos()); // prevent additional spam at rejected packet
1041 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
1047 pGuild
->SwapItems(_player
, BankTab
, BankTabSlot
, BankTabDst
, BankTabSlotDst
, SplitedAmount
);
1053 // allow work with inventory only
1054 if(!Player::IsInventoryPos(PlayerBag
, PlayerSlot
) && !(PlayerBag
== NULL_BAG
&& PlayerSlot
== NULL_SLOT
) )
1056 _player
->SendEquipError( EQUIP_ERR_NONE
, NULL
, NULL
);
1060 // BankToChar swap or char to bank remaining
1061 if (ToChar
) // Bank -> Char cases
1062 pGuild
->MoveFromBankToChar(_player
, BankTab
, BankTabSlot
, PlayerBag
, PlayerSlot
, SplitedAmount
);
1063 else // Char -> Bank cases
1064 pGuild
->MoveFromCharToBank(_player
, PlayerBag
, PlayerSlot
, BankTab
, BankTabSlot
, SplitedAmount
);
1067 void WorldSession::HandleGuildBankBuyTab( WorldPacket
& recv_data
)
1069 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_BUY_TAB)");
1074 recv_data
>> GoGuid
;
1077 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
1080 uint32 GuildId
= GetPlayer()->GetGuildId();
1084 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
1088 // m_PurchasedTabs = 0 when buying Tab 0, that is why this check can be made
1089 if (TabId
!= pGuild
->GetPurchasedTabs())
1092 uint32 TabCost
= GetGuildBankTabPrice(TabId
) * GOLD
;
1096 if (GetPlayer()->GetMoney() < TabCost
) // Should not happen, this is checked by client
1099 // Go on with creating tab
1100 pGuild
->CreateNewBankTab();
1101 GetPlayer()->ModifyMoney(-int(TabCost
));
1102 pGuild
->SetBankRightsAndSlots(GetPlayer()->GetRank(), TabId
, GUILD_BANK_RIGHT_FULL
, WITHDRAW_SLOT_UNLIMITED
, true);
1103 pGuild
->Roster(); // broadcast for tab rights update
1104 pGuild
->DisplayGuildBankTabsInfo(this);
1107 void WorldSession::HandleGuildBankUpdateTab( WorldPacket
& recv_data
)
1109 sLog
.outDebug("WORLD: Received (CMSG_GUILD_BANK_UPDATE_TAB)");
1114 std::string IconIndex
;
1116 recv_data
>> GoGuid
;
1119 recv_data
>> IconIndex
;
1124 if(IconIndex
.empty())
1127 if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid
, GAMEOBJECT_TYPE_GUILD_BANK
))
1130 uint32 GuildId
= GetPlayer()->GetGuildId();
1134 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
1138 if (TabId
>= pGuild
->GetPurchasedTabs())
1141 pGuild
->SetGuildBankTabInfo(TabId
, Name
, IconIndex
);
1142 pGuild
->DisplayGuildBankTabsInfo(this);
1143 pGuild
->DisplayGuildBankContent(this, TabId
);
1146 void WorldSession::HandleGuildBankLogQuery( WorldPacket
& recv_data
)
1148 sLog
.outDebug("WORLD: Received (MSG_GUILD_BANK_LOG_QUERY)");
1153 uint32 GuildId
= GetPlayer()->GetGuildId();
1157 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
1161 // GUILD_BANK_MAX_TABS send by client for money log
1162 if (TabId
>= pGuild
->GetPurchasedTabs() && TabId
!= GUILD_BANK_MAX_TABS
)
1165 pGuild
->DisplayGuildBankLogs(this, TabId
);
1168 void WorldSession::HandleQueryGuildBankTabText(WorldPacket
&recv_data
)
1170 sLog
.outDebug("WORLD: Received MSG_QUERY_GUILD_BANK_TEXT");
1175 uint32 GuildId
= GetPlayer()->GetGuildId();
1179 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
1183 if (TabId
>= pGuild
->GetPurchasedTabs())
1186 pGuild
->SendGuildBankTabText(this, TabId
);
1189 void WorldSession::HandleSetGuildBankTabText(WorldPacket
&recv_data
)
1191 sLog
.outDebug("WORLD: Received CMSG_SET_GUILD_BANK_TEXT");
1198 uint32 GuildId
= GetPlayer()->GetGuildId();
1202 Guild
*pGuild
= sObjectMgr
.GetGuildById(GuildId
);
1206 if (TabId
>= pGuild
->GetPurchasedTabs())
1209 pGuild
->SetGuildBankTabText(TabId
, Text
);
1212 void WorldSession::SendSaveGuildEmblem( uint32 msg
)
1214 WorldPacket
data(MSG_SAVE_GUILD_EMBLEM
, 4);
1215 data
<< uint32(msg
); // not part of guild
1216 SendPacket( &data
);