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::HandleGuildPromoteOpcode(WorldPacket& recvPacket) { sLog.outDebug("WORLD: Received CMSG_GUILD_PROMOTE"); std::string plName; recvPacket >> plName; if(!normalizePlayerName(plName)) return; Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId()); if(!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD); return; } if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_PROMOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS); return; } uint64 plGuid; MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); if(!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S); return; } if(plGuid == GetPlayer()->GetGUID()) { SendGuildCommandResult(GUILD_INVITE_S, "", 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, GUILD_RANK_TOO_HIGH_S); return; } uint32 newRankId = slot->RankId - 1; //when promoting player, rank is decreased WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size data << (uint8)GE_PROMOTION; data << (uint8)3; // strings count data << GetPlayer()->GetName(); data << plName; data << guild->GetRankName(newRankId); guild->BroadcastPacket(&data); guild->ChangeRank(plGuid, newRankId); // Put record into guildlog guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId); }
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 WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_REMOVE"); 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_REMOVE)) { 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->RankId == GR_GUILDMASTER) { SendGuildCommandResult(GUILD_QUIT_S, "", ERR_GUILD_LEADER_LEAVE); return; } // do not allow to kick player with same or higher rights if (GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_QUIT_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } // possible last member removed, do cleanup, and no need events if (guild->DelMember(slot->guid)) { guild->Disband(); delete guild; return; } // Put record into guild log guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid); guild->BroadcastEvent(GE_REMOVED, plName.c_str(), _player->GetName()); }
void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) { std::string plName; //sLog.outDebug("WORLD: Received CMSG_GUILD_REMOVE"); recvPacket >> plName; if(!normalizePlayerName(plName)) return; Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId()); if(!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD); return; } if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_REMOVE)) { SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS); return; } uint64 plGuid; MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); if(!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S); return; } if(slot->RankId == GR_GUILDMASTER) { SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE); return; } //do not allow to kick player with same or higher rights if(GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_QUIT_S, plName, GUILD_RANK_TOO_HIGH_S); return; } guild->DelMember(plGuid); // Put record into guildlog guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0); WorldPacket data(SMSG_GUILD_EVENT, (2+20)); // guess size data << (uint8)GE_REMOVED; data << (uint8)2; // strings count data << plName; data << GetPlayer()->GetName(); guild->BroadcastPacket(&data); }
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::HandleGuildRemoveOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received CMSG_GUILD_REMOVE"); std::string plName; recvPacket >> plName; if(!normalizePlayerName(plName)) return; Guild* guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); if(!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_REMOVE)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } uint64 plGuid; MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); if(!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } if(slot->RankId == GR_GUILDMASTER) { SendGuildCommandResult(GUILD_QUIT_S, "", ERR_GUILD_LEADER_LEAVE); return; } // do not allow to kick player with same or higher rights if(GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_QUIT_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } guild->DelMember(plGuid); // Put record into guild log guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0); guild->BroadcastEvent(GE_REMOVED, 0, 2, plName, _player->GetName(), ""); }
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) { std::string name; Player *oldLeader = GetPlayer(); Guild *guild; //sLog.outDebug("WORLD: Received CMSG_GUILD_LEADER"); recvPacket >> name; if(!normalizePlayerName(name)) return; guild = objmgr.GetGuildById(oldLeader->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD); return; } if( oldLeader->GetGUID() != guild->GetLeader()) { SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS); return; } uint64 newLeaderGUID; MemberSlot* slot = guild->GetMemberSlot(name, newLeaderGUID); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S); return; } guild->SetLeader(newLeaderGUID); guild->ChangeRank(oldLeader->GetGUID(), GR_OFFICER); WorldPacket data(SMSG_GUILD_EVENT, (2+20)); // guess size data << (uint8)GE_LEADER_CHANGED; data << (uint8)2; // strings count data << oldLeader->GetName(); data << name.c_str(); guild->BroadcastPacket(&data); //sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)"); }
void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket) { sLog.outDebug("WORLD: Received CMSG_GUILD_LEADER"); std::string name; recvPacket >> name; Player *oldLeader = GetPlayer(); if(!normalizePlayerName(name)) return; Guild *guild = sObjectMgr.GetGuildById(oldLeader->GetGuildId()); if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } if (oldLeader->GetGUID() != guild->GetLeader()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } uint64 newLeaderGUID; MemberSlot* slot = guild->GetMemberSlot(name, newLeaderGUID); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } guild->SetLeader(newLeaderGUID); guild->ChangeRank(oldLeader->GetGUID(), GR_OFFICER); guild->BroadcastEvent(GE_LEADER_CHANGED, 0, 2, oldLeader->GetName(), name, ""); }
/// %Log the player out void WorldSession::LogoutPlayer(bool Save) { // finish pending transfers before starting the logout while(_player && _player->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); m_playerLogout = true; m_playerSave = Save; if (_player) { // Playerbot mod: log out all player bots owned by this toon if (GetPlayer()->GetPlayerbotMgr()) GetPlayer()->GetPlayerbotMgr()->LogoutAllBots(); sLog.outChar("Account: %d (IP: %s) Logout Character:[%s] (guid: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName() ,_player->GetGUIDLow()); if (ObjectGuid lootGuid = GetPlayer()->GetLootGuid()) DoLootRelease(lootGuid); ///- If the player just died before logging out, make him appear as a ghost //FIXME: logout must be delayed in case lost connection with client in time of combat if (GetPlayer()->GetDeathTimer()) { GetPlayer()->getHostileRefManager().deleteReferences(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); } else if (GetPlayer()->IsInCombat() && GetPlayer()->GetMap()) { GetPlayer()->CombatStop(); GetPlayer()->getHostileRefManager().setOnlineOfflineState(false); GetPlayer()->RemoveAllAurasOnDeath(); // build set of player who attack _player or who have pet attacking of _player std::set<Player*> aset; GuidSet& attackers = GetPlayer()->GetMap()->GetAttackersFor(GetPlayer()->GetObjectGuid()); for (GuidSet::const_iterator itr = attackers.begin(); itr != attackers.end();) { Unit* attacker = GetPlayer()->GetMap()->GetUnit(*itr++); if (!attacker) continue; Unit* owner = attacker->GetOwner(); // including player controlled case if(owner) { if(owner->GetTypeId() == TYPEID_PLAYER) aset.insert((Player*)owner); } else if(attacker->GetTypeId() == TYPEID_PLAYER) aset.insert((Player*)(attacker)); } GetPlayer()->SetPvPDeath(!aset.empty()); GetPlayer()->KillPlayer(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); // give honor to all attackers from set like group case for(std::set<Player*>::const_iterator itr = aset.begin(); itr != aset.end(); ++itr) (*itr)->RewardHonor(GetPlayer(),aset.size()); // give bg rewards and update counters like kill by first from attackers // this can't be called for all attackers. if(!aset.empty()) if(BattleGround *bg = GetPlayer()->GetBattleGround()) bg->HandleKillPlayer(GetPlayer(),*aset.begin()); } else if(GetPlayer()->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) { // this will kill character by SPELL_AURA_SPIRIT_OF_REDEMPTION GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); //GetPlayer()->SetDeathPvP(*); set at SPELL_AURA_SPIRIT_OF_REDEMPTION apply time GetPlayer()->KillPlayer(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); } else if (GetPlayer()->HasPendingBind()) { GetPlayer()->RepopAtGraveyard(); GetPlayer()->SetPendingBind(NULL, 0); } //drop a flag if player is carrying it if(BattleGround *bg = GetPlayer()->GetBattleGround()) bg->EventPlayerLoggedOut(GetPlayer()); ///- Teleport to home if the player is in an invalid instance if(!GetPlayer()->m_InstanceValid && !GetPlayer()->isGameMaster()) { GetPlayer()->TeleportToHomebind(); //this is a bad place to call for far teleport because we need player to be in world for successful logout //maybe we should implement delayed far teleport logout? } // FG: finish pending transfers after starting the logout // this should fix players beeing able to logout and login back with full hp at death position while(GetPlayer()->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { if(BattleGroundQueueTypeId bgQueueTypeId = GetPlayer()->GetBattleGroundQueueTypeId(i)) { GetPlayer()->RemoveBattleGroundQueueId(bgQueueTypeId); sBattleGroundMgr.m_BattleGroundQueues[ bgQueueTypeId ].RemovePlayer(GetPlayer()->GetObjectGuid(), true); } } ///- Reset the online field in the account table // no point resetting online in character table here as Player::SaveToDB() will set it to 1 since player has not been removed from world at this stage // No SQL injection as AccountID is uint32 if (!GetPlayer()->GetPlayerbotAI()) { static SqlStatementID id; SqlStatement stmt = LoginDatabase.CreateStatement(id, "UPDATE account SET active_realm_id = ? WHERE id = ?"); stmt.PExecute(uint32(0), GetAccountId()); } ///- If the player is in a guild, update the guild roster and broadcast a logout message to other guild members Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (guild) { if (MemberSlot* slot = guild->GetMemberSlot(GetPlayer()->GetObjectGuid())) { slot->SetMemberStats(GetPlayer()); slot->UpdateLogoutTime(); } guild->BroadcastEvent(GE_SIGNED_OFF, GetPlayer()->GetObjectGuid(), GetPlayer()->GetName()); } ///- Remove pet GetPlayer()->RemovePet(PET_SAVE_AS_CURRENT); GetPlayer()->InterruptNonMeleeSpells(true); if (VehicleKitPtr vehicle = GetPlayer()->GetVehicle()) GetPlayer()->ExitVehicle(); ///- empty buyback items and save the player in the database // some save parts only correctly work in case player present in map/player_lists (pets, etc) if(Save) GetPlayer()->SaveToDB(); ///- Leave all channels before player delete... GetPlayer()->CleanupChannels(); // LFG cleanup sLFGMgr.Leave(GetPlayer()); ///- If the player is in a group (or invited), remove him. If the group if then only 1 person, disband the group. GetPlayer()->UninviteFromGroup(); // remove player from the group if he is: // a) in group; b) not in raid group; c) logging out normally (not being kicked or disconnected) if(GetPlayer()->GetGroup() && !GetPlayer()->GetGroup()->isRaidGroup() && m_Socket) GetPlayer()->RemoveFromGroup(); ///- Send update to group if(GetPlayer()->GetGroup()) GetPlayer()->GetGroup()->SendUpdate(); ///- Broadcast a logout message to the player's friends sSocialMgr.SendFriendStatus(GetPlayer(), FRIEND_OFFLINE, GetPlayer()->GetObjectGuid(), true); sSocialMgr.RemovePlayerSocial (GetPlayer()->GetGUIDLow ()); // Playerbot - remember player GUID for update SQL below uint32 guid = GetPlayer()->GetGUIDLow(); ///- Remove the player from the world // the player may not be in the world when logging out // e.g if he got disconnected during a transfer to another map // calls to GetMap in this case may cause crashes if (GetPlayer()->IsInWorld()) { Map* _map = GetPlayer()->GetMap(); _map->Remove(GetPlayer(), true); } else { GetPlayer()->CleanupsBeforeDelete(); if (GetPlayer()->GetMap()) GetPlayer()->GetMap()->DeleteFromWorld(GetPlayer()); else { sObjectAccessor.RemoveObject(GetPlayer()); delete GetPlayer(); } } SetPlayer(NULL); // deleted in Remove/DeleteFromWorld call ///- Send the 'logout complete' packet to the client WorldPacket data( SMSG_LOGOUT_COMPLETE, 0 ); SendPacket( &data ); static SqlStatementID updChars; // Playerbot mod: commented out above and do this one instead SqlStatement stmt = CharacterDatabase.CreateStatement(updChars, "UPDATE characters SET online = 0 WHERE guid = ?"); stmt.PExecute(guid); DEBUG_LOG( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" ); } m_playerLogout = false; m_playerSave = false; m_playerRecentlyLogout = true; LogoutRequest(0); }
void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) { sLog.outDebug("WORLD: Received CMSG_GUILD_DEMOTE"); std::string plName; recvPacket >> plName; if(!normalizePlayerName(plName)) return; Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId()); if(!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD); return; } if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_DEMOTE)) { SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS); return; } uint64 plGuid; MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S); return; } if(plGuid == GetPlayer()->GetGUID()) { SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID); return; } //do not allow to demote same or higher rank if(GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_RANK_TOO_HIGH_S); return; } //do not allow to demote lowest rank if(slot->RankId >= guild->GetLowestRank()) { SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_ALREADY_LOWEST_RANK_S); return; } uint32 newRankId = slot->RankId + 1; //when demoting player, rank is increased guild->ChangeRank(plGuid, newRankId); // Put record into guildlog guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId); WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size data << (uint8)GE_DEMOTION; data << (uint8)3; // strings count data << GetPlayer()->GetName(); data << plName; data << guild->GetRankName(slot->RankId); guild->BroadcastPacket(&data); }
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()); }
void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) { DEBUG_LOG("WORLD: Received opcode CMSG_GUILD_REMOVE"); std::string plName; ObjectGuid targetGuid; recvPacket.ReadGuidMask<6, 5, 4, 0, 1, 3, 7, 2>(targetGuid); recvPacket.ReadGuidBytes<2, 6, 5, 7, 1, 4, 3, 0>(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_REMOVE)) { 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->RankId == GR_GUILDMASTER) { SendGuildCommandResult(GUILD_QUIT_S, "", ERR_GUILD_LEADER_LEAVE); return; } // do not allow to kick player with same or higher rights if (GetPlayer()->GetRank() >= slot->RankId) { SendGuildCommandResult(GUILD_QUIT_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; } // do not delete guilds that level are higher than undeletable if (guild->GetMemberSize() == 1 && guild->GetLevel() >= sWorld.getConfig(CONGIG_UINT32_GUILD_UNDELETABLE_LEVEL)) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL); return; } // possible last member removed, do cleanup, and no need events if (guild->DelMember(slot->guid)) { guild->Disband(); delete guild; return; } // Put record into guild log guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid); guild->BroadcastEvent(GE_REMOVED, plName.c_str(), _player->GetName()); }