void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_DEMOTE"); std::string plName; recvPacket >> plName; if (!normalizePlayerName(plName)) { return; } Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_DEMOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } MemberSlot* slot = guild->GetMemberSlot(plName); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (slot->guid == GetPlayer()->GetObjectGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_NAME_INVALID); return; } // do not allow to demote same or higher rank if (GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } // do not allow to demote lowest rank if (slot->RankId >= guild->GetLowestRank()) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_LOW_S); return; } uint32 newRankId = slot->RankId + 1; // when demoting player, rank is increased slot->ChangeRank(newRankId); // Put record into guild log guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid, newRankId); guild->BroadcastEvent(GE_DEMOTION, _player->GetName(), plName.c_str(), guild->GetRankName(slot->RankId).c_str()); }
void Guild::SetLeader(ObjectGuid guid) { MemberSlot* slot = GetMemberSlot(guid); if (!slot) { return; } m_LeaderGuid = guid; slot->ChangeRank(GR_GUILDMASTER); CharacterDatabase.PExecute("UPDATE guild SET leaderguid='%u' WHERE guildid='%u'", guid.GetCounter(), m_Id); }
void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_PROMOTE"); std::string plName; ObjectGuid targetGuid; recvPacket.ReadGuidMask<7, 2, 5, 6, 1, 0, 3, 4>(targetGuid); recvPacket.ReadGuidBytes<0, 5, 2, 3, 6, 4, 1, 7>(targetGuid); Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_PROMOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } if (!sObjectMgr.GetPlayerNameByGUID(targetGuid, plName)) return; MemberSlot* slot = guild->GetMemberSlot(targetGuid); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (slot->guid == GetPlayer()->GetObjectGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_NAME_INVALID); return; } // allow to promote only to lower rank than member's rank // guildmaster's rank = 0 // GetPlayer()->GetRank() + 1 is highest rank that current player can promote to if (GetPlayer()->GetRank() + 1 >= slot->RankId) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } uint32 newRankId = slot->RankId - 1; // when promoting player, rank is decreased slot->ChangeRank(newRankId); // Put record into guild log guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid, newRankId); guild->BroadcastEvent(GE_PROMOTION, _player->GetName(), plName.c_str(), guild->GetRankName(newRankId).c_str()); }
void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_SET_NOTE"); bool officer; uint32 noteLen; std::string name, note; ObjectGuid targetGuid; recvPacket.ReadGuidMask<1, 4, 5, 3, 0, 7>(targetGuid); officer = !recvPacket.ReadBit(); recvPacket.ReadGuidMask<6>(targetGuid); noteLen = recvPacket.ReadBits(8); recvPacket.ReadGuidMask<2>(targetGuid); recvPacket.ReadGuidBytes<4, 5, 0, 3, 1, 6, 7>(targetGuid); note = recvPacket.ReadString(noteLen); recvPacket.ReadGuidBytes<2>(targetGuid); Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (!guild->HasRankRight(GetPlayer()->GetRank(), officer ? GR_RIGHT_EOFFNOTE : GR_RIGHT_EPNOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } if (!sObjectMgr.GetPlayerNameByGUID(targetGuid, name)) return; MemberSlot* slot = guild->GetMemberSlot(targetGuid); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (officer) slot->SetOFFNOTE(note); else slot->SetPNOTE(note); guild->Roster(this); }
void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_LEADER"); std::string name = recvPacket.ReadString(recvPacket.ReadBits(7)); Player* oldLeader = GetPlayer(); if (!normalizePlayerName(name)) return; Guild* guild = sGuildMgr.GetGuildById(oldLeader->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (oldLeader->GetObjectGuid() != guild->GetLeaderGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } MemberSlot* oldSlot = guild->GetMemberSlot(oldLeader->GetObjectGuid()); if (!oldSlot) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } MemberSlot* slot = guild->GetMemberSlot(name); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (slot->guid == oldLeader->GetObjectGuid()) return; guild->SetLeader(slot->guid); // NOTE: GR_OFFICER might not actually be officer rank oldSlot->ChangeRank(GR_OFFICER); guild->BroadcastEvent(GE_LEADER_CHANGED, oldLeader->GetName(), name.c_str()); }
void WorldSession::HandleGuildSetRankOpcode(WorldPacket& recvPacket) { uint32 newRankId; std::string plName; ObjectGuid targetGuid, invokerGuid; recvPacket >> newRankId; recvPacket.ReadGuidMask<1, 7>(targetGuid); recvPacket.ReadGuidMask<4, 2>(invokerGuid); recvPacket.ReadGuidMask<4, 5, 6>(targetGuid); recvPacket.ReadGuidMask<1, 7>(invokerGuid); recvPacket.ReadGuidMask<2, 3, 0>(targetGuid); recvPacket.ReadGuidMask<6, 3, 0, 5>(invokerGuid); recvPacket.ReadGuidBytes<0>(targetGuid); recvPacket.ReadGuidBytes<1, 3, 5>(invokerGuid); recvPacket.ReadGuidBytes<7, 3>(targetGuid); recvPacket.ReadGuidBytes<0>(invokerGuid); recvPacket.ReadGuidBytes<1>(targetGuid); recvPacket.ReadGuidBytes<6>(invokerGuid); recvPacket.ReadGuidBytes<2, 5, 4>(targetGuid); recvPacket.ReadGuidBytes<2, 4>(invokerGuid); recvPacket.ReadGuidBytes<6>(targetGuid); recvPacket.ReadGuidBytes<7>(invokerGuid); DEBUG_LOG("WORLD: Received CMSG_GUILD_SET_RANK guid1 %s guid2 %s rank %u", targetGuid.GetString().c_str(), invokerGuid.GetString().c_str(), newRankId); Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (!sObjectMgr.GetPlayerNameByGUID(targetGuid, plName)) return; MemberSlot* slot = guild->GetMemberSlot(targetGuid); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if (slot->guid == GetPlayer()->GetObjectGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_NAME_INVALID); return; } if (slot->RankId == newRankId || newRankId >= guild->GetRanksSize()) return; bool promote = newRankId < slot->RankId; if (!guild->HasRankRight(GetPlayer()->GetRank(), promote ? GR_RIGHT_PROMOTE : GR_RIGHT_DEMOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } if (promote) { // allow to promote only to lower rank than member's rank // and only to rank not higher that invoker's if (GetPlayer()->GetRank() + 1 >= slot->RankId || newRankId <= GetPlayer()->GetRank()) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } } else { // do not allow to demote same or higher rank if (GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } } slot->ChangeRank(newRankId); // Put record into guild log guild->LogGuildEvent(promote ? GUILD_EVENT_LOG_PROMOTE_PLAYER : GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid, newRankId); guild->BroadcastEvent(promote ? GE_PROMOTION : GE_DEMOTION, _player->GetName(), plName.c_str(), guild->GetRankName(newRankId).c_str()); }