Пример #1
0
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);
}
Пример #2
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);
}