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); }