bool MissionManager::checkCraftingMission(PlayerObject* player,NPCObject* npc) { Datapad* datapad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); if(datapad->hasMission()) //player has a mission { MissionList::iterator it = datapad->getMissions()->begin(); while(it != datapad->getMissions()->end()) { MissionObject* mission = dynamic_cast<MissionObject*>(*it); if(mission->getMissionType() == crafting) { if(mission->getStartNPC() == npc) { //This is the start npc for the deliver mission char mp[10]; sprintf(mp,"m%dp",mission->getNum()); gMessageLib->sendSpatialChat(npc,player,L"",mission->getTitleFile(),mp); mission->setStartNPC(NULL); gMessageLib->sendSystemMessage(player,L"","mission/mission_generic","deliver_received_data"); MissionObject* updater = new MissionObject(); updater->clear(); updater->setId(mission->getId()); updater->getWaypoint()->setId(mission->getId()+1); updater->getWaypoint()->setCoords(mission->getDestination().Coordinates); updater->getWaypoint()->setPlanetCRC(mission->getDestination().PlanetCRC); char name[150]; sprintf(name, "@%s:%s",mission->getTitleFile().getRawData(),mission->getTitle().getRawData()); updater->getWaypoint()->setName(name); updater->getWaypoint()->setActive(true); gMessageLib->sendMISO_Delta(updater,player); delete updater; return true; } else if(mission->getDestinationNPC() == npc && mission->getStartNPC() == NULL) { //This is the end npc for the deliver mission. char mr[10]; sprintf(mr,"m%dr",mission->getNum()); gMessageLib->sendSpatialChat(npc,player,L"",mission->getTitleFile(),mr); missionComplete(player,mission); mission->setDestinationNPC(NULL); it = datapad->removeMission(it); delete mission; return true; } } ++it; } } return false; }
/* * Player Accepted Mission */ void MissionManager::missionRequest(PlayerObject* player, uint64 mission_id) { Datapad* datapad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); //Move the mission from the player's mission bag to his datapad. MissionBag* mission_bag = dynamic_cast<MissionBag*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_MissionBag)); MissionObject* mission = mission_bag->getMissionById(mission_id); if(mission == NULL) { gLogger->logMsgF("ERROR: Failed to retrieve mission with id %"PRIu64". Unable to accept mission!", MSG_HIGH, mission_id); return; } //automatically checks the datapads capacity if(!datapad->addMission(mission)) { gMessageLib->sendSystemMessage(player,L"","mission/mission_generic","too_many_missions"); return; } mission_bag->removeMission(mission); gMessageLib->sendContainmentMessage(mission->getId(), datapad->getId(), 0xffffffff, player); //Replace it with a new mission. mission_bag->spawnNAdd(); //Send MissionGenericResponse to tell the client its been accepted gMessageLib->sendMissionGenericResponse(mission,player); //Update the name and mission waypoint MissionObject* updater = new MissionObject(); updater->clear(); updater->setId(mission->getId()); updater->setNameFile(mission->getTitleFile().getRawData()); updater->setName(mission->getTitle().getRawData()); if(mission->getMissionType() != survey) { updater->getWaypoint()->setId(mission->getId()+1); if(mission->getMissionType() == deliver || mission->getMissionType() == crafting) { updater->getWaypoint()->setCoords(mission->getStart().Coordinates); updater->getWaypoint()->setPlanetCRC(mission->getStart().PlanetCRC); } else { updater->getWaypoint()->setCoords(mission->getDestination().Coordinates); updater->getWaypoint()->setPlanetCRC(mission->getDestination().PlanetCRC); } char name[150]; sprintf(name, "@%s:%s",mission->getTitleFile().getRawData(),mission->getTitle().getRawData()); updater->getWaypoint()->setName(name); updater->getWaypoint()->setActive(true); } else { gMessageLib->sendSystemMessage(player,L"","mission/mission_generic","survey_start"); } //Accept the mission let the player know gMessageLib->sendPlayMusicMessage(WMSound_Mission_Accepted,player); //3887, 'sound/music_mission_accepted.snd' gMessageLib->sendMISO_Delta(updater,player); mission->sendAttributes(mission->getOwner()); delete updater; if(mission->getMissionType() == recon) mission->setTaskId(gWorldManager->addMissionToProcess(mission)); //check if we need to inform our group if((mission->getMissionType() == destroy)&&(player->getGroupId() != 0)) { // we are in a group and just accepted a destroy mission // check the missions and update the nearest waypoint GroupObject* group = gGroupManager->getGroupObject(player->getGroupId()); gGroupManager->sendGroupMissionUpdate(group); } return; }