void DeliverMissionObjectiveImplementation::updateMissionStatus(CreatureObject* player) { ManagedReference<MissionObject* > mission = this->mission.get(); if(mission == NULL) return; StringBuffer itemEntry; itemEntry << "m" << mission->getMissionNumber(); ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); StringId itemName; Locker lock(player); if (objectiveStatus == 0) { itemEntry << "l"; item = NULL; //TODO: create correct item. item = (player->getZoneServer()->createObject(STRING_HASHCODE("object/tangible/mission/mission_datadisk.iff"), 2)).castTo<TangibleObject*>(); if (item == NULL) { abort(); return; } Locker clocker(item, player); itemName.setStringId("mission/mission_deliver_neutral_easy", itemEntry.toString()); item->setObjectName(itemName, false); //Give player the item to deliver if (inventory->transferObject(item, -1, true)) { item->sendTo(player, true); } else { abort(); item->destroyObjectFromDatabase(true); return; } updateMissionTarget(player); objectiveStatus = PICKEDUPSTATUS; } else if (objectiveStatus == 1) { // check for item, then remove item if (item == NULL || !inventory->hasObjectInContainer(item->getObjectID())) { return; } Locker clocker2(item, player); item->destroyObjectFromWorld(true); item->destroyObjectFromDatabase(true); complete(); objectiveStatus = DELIVEREDSTATUS; } }
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); }