void PlayerStructureTerminal::handleUIEvent(uint32 action,int32 element,string inputStr,UIWindow* window) { // gLogger->logMsgF("InsuranceTerminal::handleUIEvent You are here!",MSG_NORMAL); if(window == NULL) { return; } PlayerObject* playerObject = window->getOwner(); // window owner if(playerObject == NULL || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead()) { return; } /* switch(window->getWindowType()) { default: { } break; } */ // gLogger->logMsgF("CloningTerminal::handleUIEvent You sure handled this UI-event!, Action = %d",MSG_NORMAL, action); }
void CampTerminal::handleObjectMenuSelect(uint8 messageType,Object* srcObject) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(srcObject); if(!playerObject || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead()|| playerObject->checkState(CreatureState_Combat)) { return; } if(messageType == radId_serverTerminalManagementDestroy) { CampRegion* region = dynamic_cast<CampRegion*>(gWorldManager->getObjectById(this->mCampRegionId)); region->despawnCamp(); return; } if(messageType == radId_serverTerminalManagementStatus) { mAttributesMenu.clear(); //Camp* camp = dynamic_cast<Camp*>(gWorldManager->getObjectById(this->mCampId)); CampRegion* region = dynamic_cast<CampRegion*>(gWorldManager->getObjectById(this->mCampRegionId)); int8 text[64]; sprintf(text,"Owner: %s",region->getCampOwnerName().getAnsi()); mAttributesMenu.push_back(text); uint32 time = static_cast<uint32>(region->getUpTime()); uint32 hours = (uint32)time/3600; time -=(hours*3600); uint32 minutes = (uint32)(time)/60; time -=(minutes*60); uint32 seconds = (uint32)time; sprintf(text,"Up-Time: %u hours, %u minutes and %u seconds",hours, minutes, seconds); mAttributesMenu.push_back(text); sprintf(text,"Total Visitors: %u ", region->getVisitors()); mAttributesMenu.push_back(text); sprintf(text,"Current Visitors: %u ", region->getCurrentVisitors()); mAttributesMenu.push_back(text); //sprintf(text,"Healing Modifier: %f ", camp->getHealingModifier()); sprintf(text,"Healing Modifier: 0.65 "); mAttributesMenu.push_back(text); gUIManager->createNewListBox(this,"handleMainMenu","Camp status","Below is a summary of the status of the camp.", mAttributesMenu,playerObject,SUI_Window_ListBox); return; } gLogger->logMsgF("CampTerminal: Unhandled MenuSelect: %u",MSG_HIGH,messageType); }
void BankTerminal::handleUIEvent(BString strInventoryCash, BString strBankCash, UIWindow* window) { if(window == NULL) { return; } PlayerObject* playerObject = window->getOwner(); // window owner if(playerObject == NULL || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead() || playerObject->checkState(CreatureState_Combat)) { return; } // two money movement deltas stands for credits // variations into bank & inventory. // casting as signed cause one will be negative. // when inventoryDelta + bankDelta is not equal to zero, // that means player treasury has changed since // the transfer window opened. // we get the money deltas by parsing the string returned // by the SUI window strInventoryCash.convert(BSTRType_ANSI); strBankCash.convert(BSTRType_ANSI); int32 inventoryMoneyDelta = atoi(strInventoryCash.getAnsi()) - dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getCredits(); int32 bankMoneyDelta = atoi(strBankCash.getAnsi()) - dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->getCredits(); // the amount transfered must be greater than zero if(bankMoneyDelta == 0 || inventoryMoneyDelta == 0) { return; } gTreasuryManager->bankTransfer(inventoryMoneyDelta, bankMoneyDelta, playerObject); }
void TreasuryManager::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { // gLogger->logMsgF("CloningTerminal::handleUIEvent You are here!",MSG_NORMAL); if(window == NULL) { return; } PlayerObject* playerObject = window->getOwner(); // window owner if(playerObject == NULL || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead() || playerObject->checkState(CreatureState_Combat)) { return; } switch(window->getWindowType()) { case SUI_Window_Trade_BankTip_ConfirmSurcharge: { if (action == 1) { // That's the Cancel. //what } else { // This is the OK. (action == 0) TreasuryManagerAsyncContainer* asynContainer = (TreasuryManagerAsyncContainer*) window->getAsyncContainer(); handleBankTipSurchargeConfirmed(asynContainer); } } break; } }
void ObjectController::_handleSitServer(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); if(playerObject) { BString data; glm::vec3 chair_position; uint64 chairCell = 0; uint32 elementCount = 0; if(playerObject->checkPlayerCustomFlag(PlayerCustomFlag_LogOut)) { playerObject->togglePlayerFlagOff(PlayerCustomFlag_LogOut); gMessageLib->SendSystemMessage(::common::OutOfBand("logout", "aborted"), playerObject); } // see if we need to get out of sampling mode if(playerObject->getSamplingState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), playerObject); playerObject->setSamplingState(false); } message->getStringUnicode16(data); //Should be okay even if data is null! (I hope) // sitting on chair if(data.getLength()) { elementCount = swscanf(data.getUnicode16(), L"%f,%f,%f,%"WidePRIu64, &chair_position.x, &chair_position.y, &chair_position.z, &chairCell); if(elementCount == 4) { // outside playerObject->updatePosition(chairCell,chair_position); //this->mDirection = Anh_Math::Quaternion(); if(chairCell) { gMessageLib->sendDataTransformWithParent053(playerObject); } else { gMessageLib->sendDataTransform053(playerObject); } //gMessageLib->sendUpdateMovementProperties(playerObject); //gMessageLib->sendPostureAndStateUpdate(playerObject); gMessageLib->sendSitOnObject(playerObject); } } // sitting on ground else { //gMessageLib->sendPostureUpdate(playerObject); //gMessageLib->sendSelfPostureUpdate(playerObject); } gStateManager.setCurrentPostureState(playerObject, CreaturePosture_Sitting); } }
void InsuranceTerminal::handleUIEvent(uint32 action,int32 element,string inputStr,UIWindow* window) { // gLogger->logMsgF("InsuranceTerminal::handleUIEvent You are here!",MSG_NORMAL); if(window == NULL) { return; } PlayerObject* playerObject = window->getOwner(); // window owner if(playerObject == NULL || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead()|| playerObject->checkState(CreatureState_Combat)) { return; } switch(window->getWindowType()) { case SUI_Window_Insurance_Newbie_MessageBox: // Tried to insure item when still having free rounds left. { switch(action) { case 0: // Yes { // Player selected to continue with insurance of item even if no need for. // gLogger->logMsgF("SUI_Window_Insurance_Newbie_MessageBox Yes",MSG_NORMAL); // Build the items list and optional use error-messages if needed. BStringVector insuranceList; this->getUninsuredItems(playerObject, &insuranceList); // We should display all uninsured items that can be insured, and that are wearing or carrying in our inventory. // Items in backpackage or in other containers within our inventory shall also be handled. gUIManager->createNewListBox(this,"insure","@sui:mnu_insure","Select an item to insure.",insuranceList,playerObject,SUI_Window_Insurance_ListBox, SUI_MB_OKCANCEL); } break; case 1: // No { // Player selected to abort, since all items are still treated as insured. // gLogger->logMsgF("SUI_Window_Insurance_Newbie_MessageBox No",MSG_NORMAL); } break; default: { gLogger->logMsgF("SUI_Window_Insurance_Newbie_MessageBox Invalid selection!",MSG_NORMAL); } break; } } break; case SUI_Window_Insurance_ListBox: { switch (action) { case 0: // OK { // Insure one item. // gLogger->logMsgF("SUI_Window_Insurance_ListBox OK",MSG_NORMAL); Inventory* inventoryObject = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Bank* bankObject = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank)); if(!inventoryObject || !bankObject) return; int32 creditsInInventory = inventoryObject->getCredits(); int32 creditsAtBank = bankObject->getCredits(); if (mSortedInsuranceList.size() == 0) { // You have no insurable items. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "no_insurables"); } else if (element > (int32)mSortedInsuranceList.size() - 1 || element < 0) { // Unable to process insure item request. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "bad_insure_request"); } else { string selectedItemm((mSortedInsuranceList.at(element).first).getAnsi()); selectedItemm.convert(BSTRType_Unicode16); Object* object = gWorldManager->getObjectById(mSortedInsuranceList.at(element).second); if (!object) { // Invalid object. // Insure attempt failed. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "insure_fail"); break; } TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); if (!tangibleObject) { // Not a tangible object. // Insure attempt failed. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "insure_fail"); } else if (!tangibleObject->hasInternalAttribute("insured")) { // [Insurance] Item uninsurable: %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_item_uninsurable", "","", L"", 0, "", "", selectedItemm); } else if (tangibleObject->getInternalAttribute<bool>("insured")) { // [Insurance] Item already insured: %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_item_already_insured", "","", L"", 0, "", "", selectedItemm); } else if ((creditsAtBank+creditsInInventory) < mInsuranceFee) { // You have insufficient funds to insure your %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_nsf_insure", "","", L"", 0, "", "", selectedItemm); } else { int32 delta = creditsInInventory - mInsuranceFee; if(delta >= 0) { inventoryObject->updateCredits(-mInsuranceFee); } else if(delta < 0 && creditsAtBank >= (-delta)) { inventoryObject->updateCredits(mInsuranceFee + delta); bankObject->updateCredits(delta); } // The credits is drawn from the player inventory and/or bank. // System message: You successfully make a payment of %DI credits to %TO. gMessageLib->sendSystemMessage(playerObject, L"", "base_player", "prose_pay_acct_success", "terminal_name", "terminal_insurance", L"", mInsuranceFee); // Update attribute. // string str("insured"); tangibleObject->setInternalAttribute("insured","1"); gWorldManager->getDatabase()->ExecuteSqlAsync(NULL,NULL,"UPDATE item_attributes SET value=1 WHERE item_id=%"PRIu64" AND attribute_id=%u",tangibleObject->getId(), 1270); //gLogger->logMsgF("UPDATE item_attributes SET value=1 WHERE item_id=%"PRIu64" AND attribute_id=%u", MSG_NORMAL, tangibleObject->getId(), 1270); tangibleObject->setTypeOptions(tangibleObject->getTypeOptions() | 4); // Update insurance status. (void)gMessageLib->sendUpdateTypeOption(tangibleObject, playerObject); // You successfully insure your %TT. gMessageLib->sendSystemMessage(playerObject,L"","base_player","prose_insure_success", "","", L"", 0, "", "", selectedItemm); } /*else { // An attempt to insure your %TT has failed. Most likely, this is due to lack of funds. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_insure_fail", "","", L"", 0, "", "", selectedItemm); }*/ } } break; case 1: // Cancel { // gLogger->logMsgF("SUI_Window_Insurance_ListBox Cancel",MSG_NORMAL); } break; default: { // gLogger->logMsgF("SUI_Window_Insurance_ListBox Invalid selection!",MSG_NORMAL); } break; } } break; case SUI_Window_InsureAll_Newbie_MessageBox: { switch(action) { case 0: // Yes { // Player selected to continue with insurance of item even if no need for. // gLogger->logMsgF("SUI_Window_InsureAll_Newbie_MessageBox Yes",MSG_NORMAL); // Fetch all items that can be insured. BStringVector insuranceList; this->getUninsuredItems(playerObject, &insuranceList); uint32 insuranceFee = insuranceList.size() * mInsuranceFee; int8 sql[256]; sprintf(sql,"@terminal_ui:insure_all_d_prefix %u @terminal_ui:insure_all_d_suffix \n\n @terminal_ui:insure_all_confirm", insuranceFee); gUIManager->createNewMessageBox(this,"","@terminal_ui:insure_all_t",sql,playerObject, SUI_Window_InsuranceAll_MessageBox, SUI_MB_YESNO); } break; case 1: // No { // Player selected to abort, since all items are still treated as insured. // gLogger->logMsgF("SUI_Window_InsureAll_Newbie_MessageBox No",MSG_NORMAL); } break; default: { gLogger->logMsgF("SUI_Window_InsureAll_Newbie_MessageBox Invalid selection!",MSG_NORMAL); } break; } } break; case SUI_Window_InsuranceAll_MessageBox: { switch(action) { case 0: // Yes { // Insure all insurable items. int32 creditsAtBank = (dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->getCredits()); string selectedItemm; int32 fee = mSortedInsuranceList.size() * mInsuranceFee; if (mSortedInsuranceList.size() == 0) { // You do not have any items that can be insured. gMessageLib->sendSystemMessage(playerObject, L"", "terminal_ui", "no_insurable_items"); } else if (creditsAtBank < fee) { // You have insufficient funds to insure your %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_nsf_insure", "","", L"", 0, "", "", L"items"); } else { // Insure all the items. bool abortInsurance = false; // Let's clear the fatal error conditions first (object destroyed or invalid type), SortedInventoryItemList::iterator it = mSortedInsuranceList.begin(); while (it != mSortedInsuranceList.end()) { Object* object = gWorldManager->getObjectById((*it).second); if (!object) { // Invalid object, we abort this transaction. // Insure attempt failed. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "insure_fail"); abortInsurance = true; break; } TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); if (!tangibleObject) { // Not a tangible object, we abort this transaction. // Insure attempt failed. gMessageLib->sendSystemMessage(playerObject, L"", "error_message", "insure_fail"); abortInsurance = true; break; } it++; } if (abortInsurance) { break; } if ((dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->updateCredits(-fee))) { // The credits is drawn from the player bank. // System message: You successfully make a payment of %DI credits to %TO. gMessageLib->sendSystemMessage(playerObject, L"", "base_player", "prose_pay_acct_success", "terminal_name", "terminal_insurance", L"", fee); it = mSortedInsuranceList.begin(); while (it != mSortedInsuranceList.end()) { selectedItemm = (*it).first; selectedItemm.convert(BSTRType_Unicode16); Object* object = gWorldManager->getObjectById((*it).second); TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); if (!tangibleObject->hasInternalAttribute("insured")) { // This is not a fatal error, but should never happen. // [Insurance] Item uninsurable: %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_item_uninsurable", "","", L"", 0, "", "", selectedItemm); // fee -= insuranceFee; it++; continue; } if (tangibleObject->getInternalAttribute<bool>("insured")) { // This is not a fatal error, but should never happen. // [Insurance] Item already insured: %TT. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_item_already_insured", "","", L"", 0, "", "", selectedItemm); // fee -= insuranceFee; it++; continue; } // Insure the item. // Update attribute. tangibleObject->setInternalAttribute("insured","1"); gWorldManager->getDatabase()->ExecuteSqlAsync(NULL,NULL,"UPDATE item_attributes SET value=1 WHERE item_id=%"PRIu64" AND attribute_id=%u",tangibleObject->getId(), 1270); tangibleObject->setTypeOptions(tangibleObject->getTypeOptions() | 4); // Update insurance status. (void)gMessageLib->sendUpdateTypeOption(tangibleObject, playerObject); it++; } // Insurance transaction successfully completed. gMessageLib->sendSystemMessage(playerObject,L"","base_player","insure_success"); } else { // An attempt to insure your %TT has failed. Most likely, this is due to lack of funds. gMessageLib->sendSystemMessage(playerObject,L"","error_message","prose_insure_fail", "","", L"", 0, "", "", L"items"); } } } break; case 1: // No { // gLogger->logMsgF("SUI_Window_InsuranceAll_MessageBox No",MSG_NORMAL); } break; default: { gLogger->logMsgF("SUI_Window_InsuranceAll_MessageBox Invalid selection!",MSG_NORMAL); } break; } } break; default: { } break; } // gLogger->logMsgF("CloningTerminal::handleUIEvent You sure handled this UI-event!, Action = %d",MSG_NORMAL, action); }
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 ElevatorTerminal::handleObjectMenuSelect(uint8 messageType,Object* srcObject) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(srcObject); if(!playerObject || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead()) { return; } if(messageType == radId_elevatorUp) { gMessageLib->sendPlayClientEffectObjectMessage(gWorldManager->getClientEffect(mEffectUp),"",playerObject); // remove player from current position, elevators can only be inside CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(playerObject->getParentId())); if(cell) { cell->removeObject(playerObject); } else { gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,playerObject->getParentId()); } // put him into new one playerObject->mDirection = mDstDirUp; playerObject->mPosition = mDstPosUp; playerObject->setParentId(mDstCellUp); cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(mDstCellUp)); if(cell) { cell->addObjectSecure(playerObject); } else { gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,mDstCellUp); } gMessageLib->sendDataTransformWithParent(playerObject); } else if(messageType == radId_elevatorDown) { gMessageLib->sendPlayClientEffectObjectMessage(gWorldManager->getClientEffect(mEffectDown),"",playerObject); // remove player from current position, elevators can only be inside CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(playerObject->getParentId())); if(cell) { cell->removeObject(playerObject); } else { gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,playerObject->getParentId()); } // put him into new one playerObject->mDirection = mDstDirDown; playerObject->mPosition = mDstPosDown; playerObject->setParentId(mDstCellDown); cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(mDstCellDown)); if(cell) { cell->addObjectSecure(playerObject); } else { gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,mDstCellDown); } gMessageLib->sendDataTransformWithParent(playerObject); } else { gLogger->logMsgF("ElevatorTerminal: Unhandled MenuSelect: %u",MSG_HIGH,messageType); } }
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; } } }
bool ArtisanManager::handleRequestSurvey(Object* playerObject,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(playerObject); std::shared_ptr<SimpleEvent> start_survey_event = nullptr; if(cmdProperties) mSurveyMindCost = cmdProperties->mMindCost; // don't allow survey in buildings if(player->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), player); return false; } if(player->GetCreature()->getPerformingState() != PlayerPerformance_None) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } if(player->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_cant"), player); return false; } if(player->getSamplingState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_sample"), player); return false; } // checks if we are in combat, dead or incapacitated if (player->GetCreature()->states.checkState(CreatureState_Combat) || player->GetCreature()->states.checkPosture(CreaturePosture_Dead) || player->GetCreature()->states.checkLocomotion(CreatureLocomotion_Incapacitated)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(tool && resource) { player->setSurveyState(true); // play effect std::string effect = gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("survey_effect")); gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,player); gContainerManager->sendToRegisteredWatchers(player, [effect, player] (PlayerObject* const recipient) { gMessageLib->sendPlayClientEffectLocMessage(effect, player->mPosition, recipient); }); auto ham = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::ham::HamService>("HamService"); uint32 survey_cost = mSurveyMindCost; //are we able to sample in the first place ?? if(!ham->ApplyModifiedHamCosts(player->GetCreature(), 0, 0, survey_cost)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player); //message for stop sampling gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), player); player->getSampleData()->mPendingSurvey = false; player->GetCreature()->updateMovementProperties(); return false; } // send system message resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_survey", L"", L"", resourceName.getUnicode16()), player); // schedule execution start_survey_event = std::make_shared<SimpleEvent>(EventType("start_survey"),0, 5000, std::bind(&ArtisanManager::surveyEvent, this, player, resource, tool)); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_nothingfound")); return false; } // notify any listeners if (start_survey_event) gEventDispatcher.Notify(start_survey_event); return true; }
bool ArtisanManager::handleRequestCoreSample(Object* player,Object* target, Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(player); if(cmdProperties) // unfortunately it's not in this opcode // hardcode for now //mSampleActionCost = cmdProperties->mActionCost; mSampleActionCost = 150; if(playerObject->GetCreature()->getPerformingState() != PlayerPerformance_None || playerObject->checkIfMounted() || playerObject->GetCreature()->isDead() || playerObject->GetCreature()->states.checkState(CreatureState_Combat)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return false; } // can't sample while surveying if(playerObject->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_survey"), playerObject); return false; } // don't allow sampling in buildings if(playerObject->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), playerObject); return false; } uint64 localTime = Anh_Utils::Clock::getSingleton()->getLocalTime(); // don't allow more than one sample at a time if(playerObject->getSamplingState()) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } if(!playerObject->getNextSampleTime() || (int32)(playerObject->getNextSampleTime() - localTime) <= 0) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(resource == NULL || tool == NULL) { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_noresource"), playerObject); return false; } if((resource->getType()->getCategoryId() == 903)||(resource->getType()->getCategoryId() == 904)) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "must_have_harvester"), playerObject); return false; } playerObject->setSamplingState(true); auto terrain = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::terrain::TerrainService>("TerrainService"); if(terrain->IsWater(gWorldManager->getZoneId(), playerObject->mPosition.x, playerObject->mPosition.z)) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_swimming"), playerObject); return false; } resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_sampling", L"", L"", resourceName.getUnicode16()), playerObject); // change posture gStateManager.setCurrentPostureState(playerObject->GetCreature(), CreaturePosture_Crouched); // play animation gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("sample_effect")); // schedule execution std::shared_ptr<SimpleEvent> start_sample_event = nullptr; start_sample_event = std::make_shared<SimpleEvent>(EventType("start_sample"), 0, 2000, std::bind(&ArtisanManager::sampleEvent,this, playerObject, resource, tool)); // notify any listeners gEventDispatcher.Notify(start_sample_event); return true; }
bool ArtisanManager::handleRequestSurvey(Object* playerObject,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(playerObject); std::shared_ptr<SimpleEvent> start_survey_event = nullptr; if(cmdProperties) mSurveyMindCost = cmdProperties->mMindCost; // don't allow survey in buildings if(player->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), player); return false; } if(player->getPerformingState() != PlayerPerformance_None) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player); return false; } if(player->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_cant"), player); return false; } if(player->getSamplingState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_sample"), player); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(tool && resource) { player->setSurveyState(true); // play effect std::string effect = gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("survey_effect")); gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,player); PlayerObjectSet* playerList = player->getKnownPlayers(); PlayerObjectSet::iterator it = playerList->begin(); while(it != playerList->end()) { gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,(*it)); ++it; } uint32 mindCost = mSurveyMindCost; Ham* hamz = player->getHam(); //are we able to sample in the first place ?? if(!hamz->checkMainPools(0,0,mindCost)) { int32 myMind = hamz->mAction.getCurrentHitPoints(); //return message for sampling cancel based on HAM if(myMind < (int32)mindCost) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player); } //message for stop sampling gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), player); player->getSampleData()->mPendingSurvey = false; hamz->updateRegenRates(); player->updateMovementProperties(); return false; } hamz->performSpecialAction(0,0,(float)mindCost,HamProperty_CurrentHitpoints); // send system message resourceName.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_survey", L"", L"", resourceName.getUnicode16()), player); // schedule execution start_survey_event = std::make_shared<SimpleEvent>(EventType("start_survey"),0, 5000, std::bind(&ArtisanManager::surveyEvent, this, player, resource, tool)); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_nothingfound")); return false; } // notify any listeners if (start_survey_event) gEventDispatcher.Notify(start_survey_event); return true; }
bool ArtisanManager::handleRequestCoreSample(Object* player,Object* target, Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(player); if(cmdProperties) // unfortunately it's not in this opcode // hardcode for now //mSampleActionCost = cmdProperties->mActionCost; mSampleActionCost = 150; if(playerObject->getPerformingState() != PlayerPerformance_None || playerObject->checkIfMounted() || playerObject->isDead()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return false; } // can't sample while surveying if(playerObject->getSurveyState()) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_survey"), playerObject); return false; } // don't allow sampling in buildings if(playerObject->getParentId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), playerObject); return false; } uint64 localTime = Anh_Utils::Clock::getSingleton()->getLocalTime(); // don't allow more than one sample at a time if(playerObject->getSamplingState()) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } if(!playerObject->getNextSampleTime() || (int32)(playerObject->getNextSampleTime() - localTime) <= 0) { playerObject->getSampleData()->mPendingSample = false; playerObject->setNextSampleTime(localTime + 18000); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "tool_recharge_time", 0, 0, 0, (int32)(playerObject->getNextSampleTime() - localTime) / 1000), playerObject); return false; } SurveyTool* tool = dynamic_cast<SurveyTool*>(target); CurrentResource* resource = NULL; BString resourceName; message->getStringUnicode16(resourceName); resourceName.convert(BSTRType_ANSI); resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc())); if(resource == NULL || tool == NULL) { gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_noresource"), playerObject); return false; } if((resource->getType()->getCategoryId() == 903)||(resource->getType()->getCategoryId() == 904)) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "must_have_harvester"), playerObject); return false; } playerObject->setSamplingState(true); ArtisanHeightmapAsyncContainer* container = new ArtisanHeightmapAsyncContainer(this, HeightmapCallback_ArtisanSurvey); container->addToBatch(playerObject->mPosition.x,playerObject->mPosition.z); container->playerObject = playerObject; container->resource = resource; container->resourceName = resourceName; container->tool = tool; gHeightmap->addNewHeightMapJob(container); return true; }