void BountyMissionObjectiveImplementation::updateWaypoint() { Locker locker(&syncMutex); ManagedReference<MissionObject* > mission = this->mission.get(); WaypointObject* waypoint = mission->getWaypointToMission(); if (waypoint == NULL) { Locker mlocker(mission); waypoint = mission->createWaypoint(); } Locker wplocker(waypoint); waypoint->setPlanetCRC(getTargetZoneName().hashCode()); Vector3 position = getTargetPosition(); waypoint->setPosition(position.getX(), 0, position.getY()); waypoint->setActive(true); mission->updateMissionLocation(); if (mission->getMissionLevel() == 1) { getPlayerOwner().get()->sendSystemMessage("@mission/mission_bounty_informant:target_location_received"); // Target Waypoint Received. } }
void BountyMissionObjectiveImplementation::abort() { Locker locker(&syncMutex); ManagedReference<CreatureObject*> owner = getPlayerOwner(); ManagedReference<MissionObject*> strongRef = mission.get(); MissionObjectiveImplementation::abort(); cancelAllTasks(); if (strongRef == NULL || owner == NULL) return; owner->getZoneServer()->getMissionManager()->removeBountyHunterFromPlayerBounty(strongRef->getTargetObjectId(), owner->getObjectID()); removeFromBountyLock(true); WaypointObject* waypoint = strongRef->getWaypointToMission(); if (waypoint != NULL && waypoint->isActive()) { Locker wplocker(waypoint); waypoint->setActive(false); } //Remove observers if (hasObservers()) { if (isPlayerTarget()) { removePlayerTargetObservers(); } else { removeNpcTargetObservers(); } } }
void ObjectController::_handleSetWaypointName(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); BString name; Datapad* datapad = player->getDataPad(); WaypointObject* waypoint = datapad->getWaypointById(targetId); int8 sql[1024],restStr[64],*sqlPointer; if(waypoint == NULL) { DLOG(info) << "ObjController::handlesetwaypointname: could not find waypoint "<< targetId; return; } message->getStringUnicode16(name); if(!(name.getLength())) return; waypoint->setName(name); name.convert(BSTRType_ANSI); sprintf(sql,"UPDATE %s.waypoints SET name='",mDatabase->galaxy()); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->escapeString(sqlPointer,name.getAnsi(),name.getLength()); sprintf(restStr,"' WHERE waypoint_id=%" PRIu64 "",targetId); strcat(sql,restStr); mDatabase->executeSqlAsync(NULL,NULL,sql); gMessageLib->sendUpdateWaypoint(waypoint,ObjectUpdateChange,player); }
WaypointObject* WaypointFactory::_createWaypoint(DatabaseResult* result) { WaypointObject* waypoint = new WaypointObject(); result->GetNextRow(mWaypointBinding,(void*)waypoint); waypoint->mName.convert(BSTRType_Unicode16); waypoint->setPlanetCRC(waypoint->getModelString().getCrc()); return waypoint; }
bool DeliverMissionObjectiveImplementation::updateMissionTarget(CreatureObject* player) { //Now update the waypoint to the new target ManagedReference<MissionObject* > mission = this->mission.get(); if(mission == NULL) return false; WaypointObject* waypoint = mission->getWaypointToMission(); Locker locker(waypoint); waypoint->setPlanetCRC(mission->getEndPlanet().hashCode()); waypoint->setPosition(destinationSpawnPoint->getPosition()->getX(), 0, destinationSpawnPoint->getPosition()->getY()); waypoint->setActive(true); mission->updateMissionLocation(); return true; }
void ObjectController::_handleSetWaypointActiveStatus(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); WaypointObject* waypoint = NULL; Datapad* datapad = player->getDataPad(); waypoint = datapad->getWaypointById(targetId); if(waypoint) { waypoint->toggleActive(); mDatabase->executeSqlAsync(0,0,"UPDATE %s.waypoints set active=%u WHERE waypoint_id=%" PRIu64 "",mDatabase->galaxy(),(uint8)waypoint->getActive(),targetId); } else { DLOG(info) << "ObjController::handleSetWaypointStatus: could not find waypoint " << targetId; } }
void DestroyMissionObjectiveImplementation::activate() { MissionObjectiveImplementation::activate(); ManagedReference<MissionObject* > mission = this->mission.get(); if ((hasObservers() && lairObject != NULL) || mission == NULL) { return; } if (spawnActiveArea == NULL) { spawnActiveArea = ( Core::lookupObject<ZoneServer>("ZoneServer")->createObject(String("object/mission_spawn_area.iff").hashCode(), 1)).castTo<MissionSpawnActiveArea*>(); Locker alocker(spawnActiveArea); spawnActiveArea->setMissionObjective(_this.get()); } if (spawnActiveArea->getZone() == NULL) { String planetName = mission->getStartPlanet(); Zone* zone = Core::lookupObject<ZoneServer>("ZoneServer")->getZone(planetName); if (zone == NULL) { abort(); return; } Locker alocker(spawnActiveArea); spawnActiveArea->initializePosition(mission->getStartPositionX(), 0, mission->getStartPositionY()); spawnActiveArea->setRadius(128.f); zone->transferObject(spawnActiveArea, -1, false); //info("inserting to zone " + zone->getPlanetName(), true); } WaypointObject* waypoint = mission->getWaypointToMission(); if (waypoint == NULL) waypoint = mission->createWaypoint(); waypoint->setPlanetCRC(mission->getStartPlanet().hashCode()); waypoint->setPosition(mission->getStartPositionX(), 0, mission->getStartPositionY()); waypoint->setActive(true); mission->updateMissionLocation(); }
////============================================================================= //// //// survey event //// // void ArtisanManager::surveyEvent(PlayerObject* player, CurrentResource* resource, SurveyTool* tool) { if(tool && resource && player->isConnected()) { Datapad* datapad = player->getDataPad(); ResourceLocation highestDist = gMessageLib->sendSurveyMessage(tool->getInternalAttribute<uint16>("survey_range"),tool->getInternalAttribute<uint16>("survey_points"),resource,player); // this is 0, if resource is not located if(highestDist.position.y == 5.0) { WaypointObject* waypoint = datapad->getWaypointByName("Resource Survey"); // remove the old one if(waypoint) { gMessageLib->sendUpdateWaypoint(waypoint,ObjectUpdateDelete,player); datapad->updateWaypoint(waypoint->getId(), waypoint->getName(), glm::vec3(highestDist.position.x,0.0f,highestDist.position.z), static_cast<uint16>(gWorldManager->getZoneId()), player->getId(), WAYPOINT_ACTIVE); } else { // create a new one if(datapad->getCapacity()) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "survey_waypoint"), player); //gMessageLib->sendSystemMessage(this,L"","survey","survey_waypoint"); } //the datapad automatically checks if there is room and gives the relevant error message datapad->requestNewWaypoint("Resource Survey", glm::vec3(highestDist.position.x,0.0f,highestDist.position.z),static_cast<uint16>(gWorldManager->getZoneId()),Waypoint_blue); } gMissionManager->checkSurveyMission(player,resource,highestDist); } } player->getSampleData()->mPendingSurvey = false; }
bool DeliverMissionObjectiveImplementation::activateWithResult() { ManagedReference<CreatureObject*> owner = getPlayerOwner(); ManagedReference<MissionObject* > mission = this->mission.get(); if (owner == NULL || mission == NULL) { return false; } Zone* zone = owner->getZone(); if (zone == NULL) { return false; } CreatureManager* creatureManager = zone->getCreatureManager(); PlanetManager* planetManager = zone->getPlanetManager(); if (planetManager == NULL) { return false; } TerrainManager* terrainManager = planetManager->getTerrainManager(); if (terrainManager == NULL) { return false; } ZoneServer* zoneServer = owner->getZoneServer(); if (zoneServer == NULL) { return false; } MissionManager* missionManager = zoneServer->getMissionManager(); if (missionManager == NULL) { return false; } //Select spawn type. int spawnType = NpcSpawnPoint::NEUTRALSPAWN; switch (mission->getFaction()) { case FactionManager::FACTIONIMPERIAL: spawnType = NpcSpawnPoint::IMPERIALSPAWN; break; case FactionManager::FACTIONREBEL: spawnType = NpcSpawnPoint::REBELSPAWN; break; default: spawnType = NpcSpawnPoint::NEUTRALSPAWN; break; } //Spawn target and destination NPC's. //Target NPC //Find a free spawn point. targetSpawnPoint = missionManager->getFreeNpcSpawnPoint(mission->getStartPlanetCRC(), mission->getStartPositionX(), mission->getStartPositionY(), spawnType); if (targetSpawnPoint == NULL) { return false; } Vector3* targetPosition = targetSpawnPoint->getPosition(); if (targetPosition == NULL) { return false; } //Destination NPC. //Find a free spawn point. int retries = 10; destinationSpawnPoint = NULL; while (retries > 0 && (destinationSpawnPoint == NULL || destinationSpawnPoint == targetSpawnPoint)) { destinationSpawnPoint = missionManager->getFreeNpcSpawnPoint(mission->getEndPlanet().hashCode(), mission->getEndPositionX(), mission->getEndPositionY(), spawnType); retries--; } if (destinationSpawnPoint == NULL || destinationSpawnPoint == targetSpawnPoint) { return false; } missionManager->allocateMissionNpcs(targetSpawnPoint, destinationSpawnPoint, terrainManager, creatureManager); //Create waypoint and activate it. if (objectiveStatus == 0) { WaypointObject* waypoint = mission->getWaypointToMission(); Locker locker(waypoint); waypoint->setPlanetCRC(mission->getStartPlanetCRC()); waypoint->setPosition(targetPosition->getX(), 0, targetPosition->getY()); waypoint->setActive(true); mission->updateMissionLocation(); } else { updateMissionTarget(getPlayerOwner().get()); } return true; }
void EntertainerMissionObjectiveImplementation::activate() { Locker _lock(_this.getReferenceUnsafeStaticCast()); ManagedReference<MissionObject* > mission = this->mission.get(); MissionObjectiveImplementation::activate(); if (hasObservers()) { return; } if (mission == NULL) return; ManagedReference<ZoneServer*> zoneServer = Core::lookupObject<ZoneServer>("ZoneServer"); if (locationActiveArea == NULL) { locationActiveArea = ( zoneServer->createObject(STRING_HASHCODE("object/active_area.iff"), 1)).castTo<ActiveArea*>(); } if (!locationActiveArea->isInQuadTree()) { String planetName = mission->getStartPlanet(); Zone* zone = zoneServer->getZone(planetName); Locker locker(locationActiveArea); locationActiveArea->initializePosition(mission->getStartPositionX(), 0, mission->getStartPositionY()); locationActiveArea->setRadius(32.f); if (zone != NULL) { zone->transferObject(locationActiveArea, -1, true); } else { error("Failed to insert entertainer location to zone."); abort(); return; } } Locker locationLocker(locationActiveArea); ManagedReference<MissionObserver*> observer1 = new MissionObserver(_this.getReferenceUnsafeStaticCast()); addObserver(observer1, true); locationActiveArea->registerObserver(ObserverEventType::ENTEREDAREA, observer1); ManagedReference<MissionObserver*> observer2 = new MissionObserver(_this.getReferenceUnsafeStaticCast()); addObserver(observer2, true); locationActiveArea->registerObserver(ObserverEventType::EXITEDAREA, observer2); locationLocker.release(); WaypointObject* waypoint = mission->getWaypointToMission(); if (waypoint == NULL) { Locker mlocker(mission); waypoint = mission->createWaypoint(); } Locker wplocker(waypoint); waypoint->setPlanetCRC(mission->getStartPlanetCRC()); waypoint->setPosition(mission->getStartPositionX(), 0, mission->getStartPositionY()); waypoint->setActive(true); mission->updateMissionLocation(); }
void Tutorial::handleDatabaseJobComplete(void* ref,DatabaseResult* result) { TutorialQueryContainer* asyncContainer = reinterpret_cast<TutorialQueryContainer*>(ref); switch(asyncContainer->mQueryType) { case TutorialQuery_MainData: { DataBinding* binding = gWorldManager->getDatabase()->createDataBinding(3); binding->addField(DFT_uint32,offsetof(Tutorial,mState),4,0); binding->addField(DFT_int32,offsetof(Tutorial,mSubState),4,1); binding->addField(DFT_bstring,offsetof(Tutorial,mStartingProfession),64,2); uint64 count = result->getRowCount(); if (count == 1) { result->getNextRow(binding,this); } else if (count == 0) { // First time, no tutorial data saved. mSubState = 1; mState = 1; // Save the state. (gWorldManager->getDatabase())->executeSqlAsync(0,0,"INSERT INTO %s.character_tutorial VALUES (%" PRIu64 ",%u,%u)",gWorldManager->getDatabase()->galaxy(),asyncContainer->mId,mState, mSubState); } gWorldManager->getDatabase()->destroyDataBinding(binding); // Here we go... this->startScript(); } break; case TutorialQuery_PlanetLocation: { PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asyncContainer->mId)); if (player) { DataBinding* binding = gWorldManager->getDatabase()->createDataBinding(4); TutorialStartingLocation startingLocation; binding->addField(DFT_uint32, offsetof(TutorialStartingLocation, destinationPlanet), 4, 0); binding->addField(DFT_float, offsetof(TutorialStartingLocation, destX), 4, 1); binding->addField(DFT_float, offsetof(TutorialStartingLocation, destY), 4, 2); binding->addField(DFT_float, offsetof(TutorialStartingLocation, destZ), 4, 3); result->getNextRow(binding, &startingLocation); startingLocation.destX += (gRandom->getRand()%5 - 2); startingLocation.destZ += (gRandom->getRand()%5 - 2); gMessageLib->sendClusterZoneTransferRequestByPosition(player, glm::vec3(startingLocation.destX, startingLocation.destY, startingLocation.destZ), startingLocation.destinationPlanet); // create waypoint at starting location. glm::vec3 position; position.x = startingLocation.destX; position.z = startingLocation.destZ; Datapad* datapad = player->getDataPad(); WaypointObject* wp = datapad->getWaypointByName("@ui:cpt_avatar_location"); if(wp) { datapad->removeWaypoint(wp->getId()); } datapad->requestNewWaypoint("@ui:cpt_avatar_location", position, startingLocation.destinationPlanet, Waypoint_blue); //send starting emails sendStartingMails(); } else { } } break; default: { } break; } delete asyncContainer; }