void ObjectController::_handlePurchaseTicket(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); BString dataStr; BStringVector dataElements; uint16 elements; float purchaseRange = gWorldConfig->getConfiguration<float>("Player_TicketTerminalAccess_Distance",(float)10.0); if(playerObject->states.getPosture() == CreaturePosture_SkillAnimating) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return; } //however we are able to use the purchaseticket command in starports //without having to use a ticketvendor by just giving commandline parameters //when we are *near* a ticket vendor TravelTerminal* terminal = dynamic_cast<TravelTerminal*> (gWorldManager->getNearestTerminal(playerObject,TanType_TravelTerminal)); // iterate through the results if((!terminal)|| (glm::distance(terminal->mPosition, playerObject->mPosition) > purchaseRange)) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "too_far"), playerObject); return; } playerObject->setTravelPoint(terminal); message->getStringUnicode16(dataStr); // Have to convert BEFORE using split, since the conversion done there is removed It will assert().. evil grin... // Either do the conversion HERE, or better fix the split so it handles unicoe also. dataStr.convert(BSTRType_ANSI); elements = dataStr.split(dataElements,' '); if(elements < 4) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "route_not_available"), playerObject); return; } // get price and planet ids TicketProperties ticketProperties; gTravelMapHandler->getTicketInformation(dataElements,&ticketProperties); if(!ticketProperties.dstPoint) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "route_not_available"), playerObject); return; } uint8 roundTrip = 0; if(elements > 4) roundTrip = atoi(dataElements[4].getAnsi()); if(dataElements[4].getCrc() == BString("single").getCrc()) roundTrip = 0; //how many tickets will it be? uint32 amount = 1; if(roundTrip) amount = 2; Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Bank* bank = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank)); if(!inventory->checkSlots(static_cast<uint8>(amount))) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "inv_full"), playerObject); return; } if(roundTrip == 1) { ticketProperties.price *= 2; } // update bank or inventory credits if(!(inventory->updateCredits(-ticketProperties.price))) { if(!(bank->updateCredits(-ticketProperties.price))) { //gMessageLib->sendSystemMessage(entertainer,L"","travel","route_not_available"); gUIManager->createNewMessageBox(NULL,"ticketPurchaseFailed","The Galactic Travel Commission","You do not have enough money to complete the ticket purchase.",playerObject); return; } } if(playerObject->isConnected()) { gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_pay_acct_success", "", "", "", "", "money/acct_n", "travelsystem", ticketProperties.price), playerObject); gObjectFactory->requestNewTravelTicket(inventory,ticketProperties,inventory->getId(),99); if(roundTrip == 1) { uint32 tmpId = ticketProperties.srcPlanetId; TravelPoint* tmpPoint = ticketProperties.srcPoint; ticketProperties.srcPlanetId = ticketProperties.dstPlanetId; ticketProperties.srcPoint = ticketProperties.dstPoint; ticketProperties.dstPlanetId = static_cast<uint16>(tmpId); ticketProperties.dstPoint = tmpPoint; gObjectFactory->requestNewTravelTicket(inventory,ticketProperties,inventory->getId(),99); } gUIManager->createNewMessageBox(NULL,"handleSUI","The Galactic Travel Commission","@travel:ticket_purchase_complete",playerObject); } }
void ObjectController::_handleResourceContainerSplit(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); ResourceContainer* selectedContainer = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById(targetId)); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); gLogger->logMsgF("ObjectController::_handleResourceContainerSplit: Container : %I64u",MSG_NORMAL,targetId); if(!selectedContainer) { gLogger->logMsg("ObjectController::_handleResourceContainerSplit: Container does not exist!"); return; } string dataStr; message->getStringUnicode16(dataStr); dataStr.convert(BSTRType_ANSI); BStringVector dataElements; uint16 elementCount = dataStr.split(dataElements,' '); if(!elementCount) { gLogger->logMsg("ObjectController::_handleResourceContainerSplit: Error in requestStr"); return; } uint32 splitOffAmount = boost::lexical_cast<uint32>(dataElements[0].getAnsi()); uint64 parentId = boost::lexical_cast<uint64>(dataElements[1].getAnsi()); if(selectedContainer->getParentId() == inventory->getId()) { //check if we can fit an additional resource container in our inventory if(!inventory->checkSlots(1)) { gMessageLib->sendSystemMessage(playerObject,L"","error_message","inv_full"); return; } mDatabase->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",selectedContainer->getAmount(),selectedContainer->getId()); // create a new one // update selected container contents selectedContainer->setAmount(selectedContainer->getAmount() - splitOffAmount); gMessageLib->sendResourceContainerUpdateAmount(selectedContainer,playerObject); gObjectFactory->requestNewResourceContainer(inventory,(selectedContainer->getResource())->getId(),parentId,99,splitOffAmount); return; } Item* item = dynamic_cast<Item*>(gWorldManager->getObjectById(parentId)); if(!item) { gLogger->logMsg("ObjectController::_ExtractObject: resourcecontainers parent does not exist!"); assert(false && "ObjectController::_ExtractObject resourcecontainers parent does not exist"); return; } if(!item->checkCapacity()) { //check if we can fit an additional item in our inventory gMessageLib->sendSystemMessage(playerObject,L"","container_error_message","container3"); return; } // update selected container contents selectedContainer->setAmount(selectedContainer->getAmount() - splitOffAmount); gMessageLib->sendResourceContainerUpdateAmount(selectedContainer,playerObject); gObjectFactory->requestNewResourceContainer(item,(selectedContainer->getResource())->getId(),parentId,99,splitOffAmount); }