void TicketCollector::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { if (!action && element != -1 && mShuttle != NULL && mShuttle->availableInPort()) { uint32 zoneId = gWorldManager->getZoneId(); PlayerObject* playerObject = window->getOwner(); if(playerObject->getSurveyState() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead()) { return; } // in range check if(playerObject->getParentId() != mParentId || (glm::distance(playerObject->mPosition, this->mPosition) > 10.0f)) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_too_far"), playerObject); return; } ObjectIDList* invObjects = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getObjects(); ObjectIDList::iterator it = invObjects->begin(); while(it != invObjects->end()) { if(TravelTicket* ticket = dynamic_cast<TravelTicket*>(gWorldManager->getObjectById((*it)))) { BString srcPoint = (int8*)((ticket->getAttribute<std::string>("travel_departure_point")).c_str()); BString dstPointStr = (int8*)((ticket->getAttribute<std::string>("travel_arrival_point")).c_str()); uint16 srcPlanetId = static_cast<uint16>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_departure_planet")).c_str()))); uint16 dstPlanetId = static_cast<uint16>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_arrival_planet")).c_str()))); BStringVector* items = (dynamic_cast<UIListBox*>(window))->getDataItems(); BString selectedDst = items->at(element); selectedDst.convert(BSTRType_ANSI); if(srcPlanetId == zoneId && (strcmp(srcPoint.getAnsi(),mPortDescriptor.getAnsi()) == 0) && (strcmp(dstPointStr.getAnsi(),selectedDst.getAnsi()) == 0)) { if(TravelPoint* dstPoint = gTravelMapHandler->getTravelPoint(dstPlanetId,dstPointStr)) { glm::vec3 destination; // getRand(5) return 0-4, then sub 2, and you get equal of random values at both sides of zero. (-2, -1, 0, 1, 2) destination.x = dstPoint->spawnX + (gRandom->getRand()%5 - 2); destination.y = dstPoint->spawnY; destination.z = dstPoint->spawnZ + (gRandom->getRand()%5 - 2); // If it's on this planet, then just warp, otherwize zone if(dstPlanetId == zoneId) { // only delete the ticket if we are warping on this planet. TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(ticket->getParentId())); gContainerManager->deleteObject(ticket, tO); gWorldManager->warpPlanet(playerObject,destination,0); } else { gMessageLib->sendClusterZoneTransferRequestByTicket(playerObject, ticket->getId(), dstPoint->planetId); } } else { DLOG(info) << "TicketCollector: Error getting TravelPoint"; } break; } } ++it; } } }
void TravelMapHandler::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { if(!action && element != -1 ) { uint32 zoneId = gWorldManager->getZoneId(); PlayerObject* playerObject = window->getOwner(); UITicketSelectListBox* listBox = dynamic_cast<UITicketSelectListBox*>(window); if(playerObject->getSurveyState() || playerObject->getSamplingState() || !listBox) return; Shuttle* shuttle = listBox->getShuttle(); if(!shuttle) { return; } if (!shuttle->availableInPort()) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "shuttle_not_available"), playerObject); return; } if((playerObject->getParentId() != shuttle->getParentId()) || (glm::distance(playerObject->mPosition, shuttle->mPosition) > 25.0f)) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_too_far"), playerObject); return; } ObjectIDList* invObjects = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getObjects(); ObjectIDList::iterator it = invObjects->begin(); while(it != invObjects->end()) { TravelTicket* ticket = dynamic_cast<TravelTicket*>(gWorldManager->getObjectById((*it))); if(ticket) { BString srcPoint = (int8*)((ticket->getAttribute<std::string>("travel_departure_point")).c_str()); BString dstPointStr = (int8*)((ticket->getAttribute<std::string>("travel_arrival_point")).c_str()); uint16 srcPlanetId = static_cast<uint8>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_departure_planet")).c_str()))); uint16 dstPlanetId = static_cast<uint8>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_arrival_planet")).c_str()))); BStringVector* items = (dynamic_cast<UIListBox*>(window))->getDataItems(); BString selectedDst = items->at(element); selectedDst.convert(BSTRType_ANSI); if(srcPlanetId == zoneId && (strcmp(dstPointStr.getAnsi(),selectedDst.getAnsi()) == 0)&&(strcmp(srcPoint.getAnsi(),listBox->getPort().getAnsi()) == 0)) { TravelPoint* dstPoint = gTravelMapHandler->getTravelPoint(dstPlanetId,dstPointStr); if(dstPoint != NULL) { glm::vec3 destination; destination.x = dstPoint->spawnX + (gRandom->getRand()%5 - 2); destination.y = dstPoint->spawnY; destination.z = dstPoint->spawnZ + (gRandom->getRand()%5 - 2); // If it's on this planet, then just warp, otherwize zone if(dstPlanetId == zoneId) { // only delete the ticket if we are warping on this planet. TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(ticket->getParentId())); gContainerManager->deleteObject(ticket, tO); gWorldManager->warpPlanet(playerObject,destination,0); } else { gMessageLib->sendClusterZoneTransferRequestByTicket(playerObject,ticket->getId(), dstPoint->planetId); } } else { } break; } } ++it; } } }