void GroupManager::_processIsmIsGroupLeaderRequest(Message* message, DispatchClient* client) { uint64 requestId = message->getUint64(); uint64 playerId = message->getUint64(); uint64 groupId = message->getUint64(); GroupObject* group = this->getGroupById(groupId); if(!group) { gLogger->log(LogManager::DEBUG,"GroupManager::_processIsmIsGroupLeaderRequest: Couldnt find group with id %I64u; player %I64u",groupId,playerId); } gChatMessageLib->sendIsmIsGroupLeaderResponse(group->getLeader(), requestId, (group->getLeader()->getCharId() == playerId)); }
//====================================================================================================================== // someone wants to set master looter void GroupManager::_processGroupLootMasterRequest(Message* message, DispatchClient* client) { gLogger->log(LogManager::DEBUG,"_processGroupLootMasterRequest\n"); Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); if(player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupBaselineRequest player not found\n"); return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { gChatMessageLib->sendSystemMessage(player, L"@group:disbanded"); gChatMessageLib->sendIsmGroupCREO6deltaGroupId(0,player); return; } if(player != group->getLeader()) { gChatMessageLib->sendSystemMessage(player, L"@group:must_be_leader"); return; } gChatMessageLib->sendIsmGroupLootMasterResponse(player); }
void GroupManager::_processGroupDisband(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); if(player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupDisband: player not found\n"); } if(player->getGroupMemberIndex() == 0xFFFF) { // target hasnt accepted the invite yet return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { return; } if(player != group->getLeader()) { //sendSystemMessage(player, L"@group:must_be_leader"); group->removeMember(player); return; } group->disband(); }
void GroupManager::_processGroupUnInvite(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); if(player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupUnInvite: player not found"); return; } Player* targetPlayer = gChatManager->getPlayerByAccId(message->getUint32()); if(targetPlayer== NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupUnInvite: target not found"); return; } if(targetPlayer->getGroupMemberIndex() != 0xFFFF) { // target has already join the group return; } if(player->getGroupId() == 0) { return; } if(player->getGroupId() != targetPlayer->getGroupId()) { // not the same group return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { return; } if(player != group->getLeader()) { gChatMessageLib->sendSystemMessage(player,L"@group:must_be_leader"); return; } group->removeTempMember(targetPlayer); gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("uninvite_self"), player, NULL); gChatMessageLib->sendGroupSystemMessage(player->getName(), BString("uninvite_target"),targetPlayer, NULL); }
//====================================================================================================================== // Leader choosen a new master looter void GroupManager::_processGroupLootMasterResponse(Message* message, DispatchClient* client) { gLogger->log(LogManager::DEBUG,"_processGroupLootMasterResponse"); Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); Player* targetPlayer = gChatManager->getPlayerByAccId(message->getUint32()); if(targetPlayer == NULL || player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupLootMasterResponse player not found"); return; } if(targetPlayer->getGroupId() != player->getGroupId()) { return; } if(targetPlayer->getGroupMemberIndex() == 0xFFFF) { // target hasnt accepted the invite yet return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { gChatMessageLib->sendSystemMessage(player, L"@group:disbanded"); gChatMessageLib->sendIsmGroupCREO6deltaGroupId(0,player); return; } if(player != group->getLeader()) { gChatMessageLib->sendSystemMessage(player, L"@group:leader_only"); return; } if(targetPlayer->getCharId() == group->getMasterLooter()) { // no change needed return; } group->changeMasterLooter(targetPlayer); gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("set_new_master_looter"), NULL, group); }
void GroupManager::_processGroupMakeLeader(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); Player* targetPlayer = gChatManager->getPlayerByAccId(message->getUint32()); if(targetPlayer == NULL || player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupMakeLeader player not found"); return; } if(targetPlayer == player) { return; } if(targetPlayer->getGroupMemberIndex() == 0xFFFF) { // target hasnt accepted the invite yet return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { return; } if(player != group->getLeader()) { gChatMessageLib->sendSystemMessage(player, L"@group:must_be_leader"); return; } group->changeLeader(targetPlayer); }
void GroupManager::_processIsmInviteInRangeResponse(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(message->getUint32()); Player* targetPlayer = gChatManager->getPlayerByAccId(message->getUint32()); uint8 inRange = message->getUint8(); if(targetPlayer == NULL || player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processIsmInviteInRangeResponse player not found"); return; } // If we are not in range, inform the player and return. if(!inRange) { gChatMessageLib->sendSystemMessage(player, L"@error_message:error_invite_ran"); return; } // I must be the group leader and group not full before we bother checking target... GroupObject* group = NULL; uint64 groupId = player->getGroupId(); if (groupId != 0) { group = getGroupById(player->getGroupId()); if (group == NULL) { return; } // Sender in group. // if sender is not leader if(group->getLeader() != player) { gChatMessageLib->sendSystemMessage(player,L"@group:must_be_leader"); return; } // is it full? if(group->getMemberCount() >= 20) { gChatMessageLib->sendSystemMessage(group->getLeader(),L"@group:full"); return; } } // If target have me ignored, auto decline my invitation. BString ignoreName = player->getName(); ignoreName.toLower(); // check our ignorelist if (targetPlayer->checkIgnore(ignoreName.getCrc())) { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("decline_leader"), player, NULL); return; } // if target is member of a group already if(targetPlayer->getGroupId() != 0 && targetPlayer->getGroupMemberIndex() != 0xFFFF) { if(targetPlayer->getGroupId() == groupId) { gChatMessageLib->sendSystemMessage(player,L"This player is already in your group."); } else { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("already_grouped"), player, NULL); } return; } // if target in group and is considering to join a group if ((targetPlayer->getGroupMemberIndex() == 0xFFFF) && (targetPlayer->getGroupId() != 0)) { // considering to join your group if(targetPlayer->getGroupId() == player->getGroupId()) { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("considering_your_group"), player, NULL); } // considering to join another group else { gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("considering_other_group"), player, NULL); } return; } // the sender is not in a group, lets create a new one // and insert it in the group map if (groupId == 0) { groupId = this->getNextGroupId(); group = new GroupObject(player, groupId); mGroups.insert(std::make_pair(groupId, group)); } // add the target player as temp member group->addTempMember(targetPlayer); gChatMessageLib->sendGroupSystemMessage(targetPlayer->getName(), BString("invite_leader"), player, NULL); // tell the zone to display the invite box gChatMessageLib->sendIsmInviteRequest(player, targetPlayer); }
void GroupManager::_processGroupInviteResponse(Message* message, DispatchClient* client) { Player* player = gChatManager->getPlayerByAccId(client->getAccountId()); if(player == NULL) { gLogger->log(LogManager::DEBUG,"GroupManager::_processGroupInviteResponse: player not found"); return; } if(player->getGroupId() == 0 || player->getGroupMemberIndex() != 0xFFFF ) { // player hasnt been invited gChatMessageLib->sendSystemMessage(player,L"@group:must_be_invited"); return; } GroupObject* group = getGroupById(player->getGroupId()); if(group == NULL) { // the group has died im the mean time // lets tell zone to update groupId of this guy // and tell him the group is no more gChatMessageLib->sendIsmGroupCREO6deltaGroupId(0,player); gChatMessageLib->sendSystemMessage(player, L"@group:disbanded"); return; } // if player refuses to join the group if(message->getUint8() == 0) { gChatMessageLib->sendGroupSystemMessage(player->getName(), BString("decline_leader"), group->getLeader(), NULL); group->removeTempMember(player); return; } // if accept to join the group gChatMessageLib->sendSystemMessage(player, L"@group:joined_self"); player->setPositionX(message->getFloat()); player->setPositionZ(message->getFloat()); // if this is the first member, we have to // create objects in leader's client too Player *groupLeader = group->getLeader(); DispatchClient* clientLeader = groupLeader->getClient(); ChatAvatarId* avatarLeader = NULL; if(group->getSize() == 1) { // create the channel and create the group on leaders'client group->createChannel(); avatarLeader = new ChatAvatarId(); avatarLeader->setPlayer(group->getLeader()); avatarLeader->setGalaxy(gChatManager->getGalaxyName()); group->getChannel()->addUser(avatarLeader); group->sendCreate(group->getLeader()); gChatMessageLib->sendSystemMessage(group->getLeader(), L"@group:formed_self"); } // set the member index of the player player->setGroupMemberIndex(group->getSize()); // advise existing members group->broadcastDeltaAdd(player); // add the member to the list group->addMember(player); ChatAvatarId* avatar = new ChatAvatarId(); avatar->setPlayer(player); avatar->setGalaxy(gChatManager->getGalaxyName()); group->getChannel()->addUser(avatar); // create the group on the new client group->sendCreate(player); // gChatMessageLib->sendChatOnEnteredRoom(client, avatar, group->getChannel(), 0); // When we have changed number of members in group, we need to update the client also. // right now doing a quick and dirty for two players since not everything is working. if (avatarLeader) { gChatMessageLib->sendChatQueryRoomResults(clientLeader, group->getChannel(), 0); } gChatMessageLib->sendChatQueryRoomResults(client, group->getChannel(), 0); if (avatarLeader) { gChatMessageLib->sendChatOnEnteredRoom(clientLeader, avatarLeader, group->getChannel(), 0); } gChatMessageLib->sendChatOnEnteredRoom(client, avatar, group->getChannel(), 0); }
void GroupManager::joinGroup(CreatureObject* player) { //Pre: player locked //Post: player locked uint64 inviterID = player->getGroupInviterID(); Zone* zone = player->getZone(); if (zone == NULL) return; ManagedReference<ZoneServer*> server = zone->getZoneServer(); ManagedReference<SceneObject*> object = server->getObject(inviterID); if (object == NULL || !object->isPlayerCreature() || object == player) return; CreatureObject* inviter = cast<CreatureObject*>( object.get()); GroupObject* group = NULL; Locker clocker(inviter, player); group = inviter->getGroup(); if (group == NULL) { group = createGroup(inviter); if (group == NULL) return; } Locker clocker2(group, player); if (group->getGroupSize() >= 20) { clocker.release(); player->updateGroupInviterID(0); player->sendSystemMessage("The group is full."); return; } // if inviter IS in the group but is not the leader if (group->getLeader() != inviter && !playerIsInvitingOwnPet(inviter, player)) { player->updateGroupInviterID(0); StringIdChatParameter param("group", "prose_leader_changed"); // "%TU has abdicated group leadership to %TT." param.setTU( inviter->getDisplayedName() ); param.setTT( group->getLeader()->getDisplayedName() ) ; player->sendSystemMessage(param); return; } player->info("joining group"); player->updateGroup(group); group->addMember(player); if (player->isPlayerCreature()) { player->sendSystemMessage("@group:joined_self"); //Inform new member who the Master Looter is. if (group->getLootRule() == MASTERLOOTER) { StringIdChatParameter masterLooter("group","set_new_master_looter"); masterLooter.setTT(group->getMasterLooterID()); player->sendSystemMessage(masterLooter); } // clear invitee's LFG setting once a group is joined Reference<PlayerObject*> ghost = player->getSlottedObject("ghost").castTo<PlayerObject*>(); if (ghost != NULL) ghost->clearCharacterBit(PlayerObject::LFG, true); ManagedReference<ChatRoom*> groupChannel = group->getGroupChannel(); if (groupChannel != NULL) { groupChannel->sendTo(cast<CreatureObject*>(player)); groupChannel->addPlayer(cast<CreatureObject*>(player), false); } if (player->isPlayingMusic()) { ManagedReference<Facade*> facade = player->getActiveSession(SessionFacadeType::ENTERTAINING); ManagedReference<EntertainingSession*> session = dynamic_cast<EntertainingSession*> (facade.get()); if (session != NULL && session->isPlayingMusic()) { String song = session->getPerformanceName(); String bandSong = group->getBandSong(); if (bandSong == "") { Locker locker(group); group->setBandSong(song); } else { if (bandSong != song) { player->sendSystemMessage("@performance:music_join_band_stop"); // You must play the same song as the band. session->stopPlayingMusic(); } else { player->sendSystemMessage("@performance:music_join_band_self"); // You join with the band in the currently playing song. } } } } } player->updateGroupInviterID(0); }