bool ArtisanManager::stopSampling(PlayerObject* player, CurrentResource* resource, SurveyTool* tool) { Ham* ham = player->getHam(); bool stop = false; if(!resource || !tool || !player->isConnected() || !player->getSamplingState()||player->getSurveyState()) { stop = true; } // you can't take sample while under attack! if(player->states.checkState(CreatureState_Combat)) { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel_attack"), player); return false; } Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); if(!inventory) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_gone"), player); stop = true; } tool = dynamic_cast<SurveyTool*>(inventory->getObjectById(tool->getId())); if(!tool) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_gone"), player); stop = true; } uint32 actionCost = mSampleActionCost; if(!ham->checkMainPools(0,actionCost,0)) { //return message for sampling cancel based on HAM if(ham->mAction.getCurrentHitPoints() < (int32)actionCost) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player); stop = true; } } if (stop) { player->setSamplingState(false); gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); } return stop; }
void ObjectFactory::handleDatabaseJobComplete(void* ref,DatabaseResult* result) { OFAsyncContainer* asyncContainer = reinterpret_cast<OFAsyncContainer*>(ref); switch(asyncContainer->query) { case OFQuery_House: { PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asyncContainer->PlayerId)); if(!result->getRowCount()) { gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create house failed : no result"); break; } uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(!requestId) { gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create house failed : result is 0"); } mHouseFactory->requestObject(asyncContainer->ofCallback,requestId,0,0,asyncContainer->client); //now we need to update the Owners Lots //cave he might have logged out already - even if thats *very* unlikely (heck of a query that would have been) if(player) { gStructureManager->UpdateCharacterLots(asyncContainer->PlayerId); Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Deed* deed = dynamic_cast<Deed*>(gWorldManager->getObjectById(asyncContainer->DeedId)); //destroy it in the client gMessageLib->sendDestroyObject(asyncContainer->DeedId,player); //delete it out of the inventory inventory->deleteObject(deed); Datapad* thePad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); thePad->requestNewWaypoint("Player House",asyncContainer->coords,gWorldManager->getPlanetIdByName(gWorldManager->getPlanetNameThis()),1); } // now we need to link the deed to the factory in the db and remove it out of the inventory in the db int8 sql[250]; sprintf(sql,"UPDATE items SET parent_id = %I64u WHERE id = %"PRIu64"",requestId, asyncContainer->DeedId); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case OFQuery_Factory: { PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asyncContainer->PlayerId)); if(!result->getRowCount()) { gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create Factory failed : no result"); break; } uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(!requestId) { gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create Factory failed : result is 0"); } mFactoryFactory->requestObject(asyncContainer->ofCallback,requestId,0,0,asyncContainer->client); //now we need to update the Owners Lots //cave he might have logged out already - even if thats *very* unlikely (heck of a query that would have been) if(player) { gStructureManager->UpdateCharacterLots(asyncContainer->PlayerId); Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Deed* deed = dynamic_cast<Deed*>(gWorldManager->getObjectById(asyncContainer->DeedId)); //destroy it in the client gMessageLib->sendDestroyObject(asyncContainer->DeedId,player); //delete it out of the inventory inventory->deleteObject(deed); Datapad* thePad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); thePad->requestNewWaypoint("Player Factory",asyncContainer->coords,gWorldManager->getPlanetIdByName(gWorldManager->getPlanetNameThis()),1); } // now we need to link the deed to the factory in the db and remove it out of the inventory in the db int8 sql[250]; sprintf(sql,"UPDATE items SET parent_id = %I64u WHERE id = %"PRIu64"",requestId, asyncContainer->DeedId); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case OFQuery_Harvester: { if(!result->getRowCount()) { gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create Harvester failed"); break; } uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(requestId) { mHarvesterFactory->requestObject(asyncContainer->ofCallback,requestId,0,0,asyncContainer->client); //now we need to update the Owners Lots PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asyncContainer->PlayerId)); //cave he might have logged out already - even if thats *very* unlikely (heck of a query that would have been) if(player) { gStructureManager->UpdateCharacterLots(asyncContainer->PlayerId); Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Deed* deed = dynamic_cast<Deed*>(inventory->getObjectById(asyncContainer->DeedId)); //destroy it in the client gMessageLib->sendDestroyObject(asyncContainer->DeedId,player); //delete it out of the inventory inventory->deleteObject(deed); Datapad* thePad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); thePad->requestNewWaypoint("Harvester",asyncContainer->coords,gWorldManager->getPlanetIdByName(gWorldManager->getPlanetNameThis()),1); } // now we need to link the deed to the harvester in the db and remove it out of the inventory int8 sql[250]; sprintf(sql,"UPDATE items SET parent_id = %I64u WHERE id = %"PRIu64"",requestId, asyncContainer->DeedId); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } else gLogger->logMsg("ObjFactory::handleDatabaseJobComplete : create Harvester failed"); } break; case OFQuery_WaypointCreate: { uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(requestId) mWaypointFactory->requestObject(asyncContainer->ofCallback,requestId,0,0,asyncContainer->client); else gLogger->logMsg("ObjFactory::createWaypoint failed"); } break; case OFQuery_Item: { uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(requestId) mTangibleFactory->requestObject(asyncContainer->ofCallback,requestId,TanGroup_Item,0,asyncContainer->client); else gLogger->logMsg("ObjFactory::createItem failed"); } break; case OFQuery_ResourceContainerCreate: { uint64 requestId = 0; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); result->GetNextRow(binding,&requestId); mDatabase->DestroyDataBinding(binding); if(requestId) mTangibleFactory->requestObject(asyncContainer->ofCallback,requestId,TanGroup_ResourceContainer,0,asyncContainer->client); else gLogger->logMsg("ObjFactory::createResourceContainer failed"); } break; default: { mTangibleFactory->requestObject(asyncContainer->ofCallback,asyncContainer->Id,asyncContainer->Group,0,asyncContainer->client); } break; } mDbAsyncPool.free(asyncContainer); }
void ArtisanManager::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { PlayerObject* player = window->getOwner(); std::shared_ptr<SimpleEvent> sample_UI_event = nullptr; if(!player) { return; } Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); if(!inventory) { return; } WindowAsyncContainerCommand* asyncContainer = (WindowAsyncContainerCommand*)window->getAsyncContainer(); if(!asyncContainer) return; Ham* ham = player->getHam(); switch(window->getWindowType()) { // Sampling Radioactive Msg Box case SUI_Window_SmplRadioactive_MsgBox: { //we stopped the sampling if(action == 1) { player->getSampleData()->mPassRadioactive = false; player->getSampleData()->mPendingSample = false; gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); return; } else { player->getSampleData()->mPassRadioactive = true; player->getSampleData()->mPendingSample = true; if(ham->checkMainPools(0,mSampleActionCost*2,0)) { SurveyTool* tool = dynamic_cast<SurveyTool*>(inventory->getObjectById(asyncContainer->ToolId)); CurrentResource* resource = (CurrentResource*)asyncContainer->CurrentResource; player->getSampleData()->mNextSampleTime = Anh_Utils::Clock::getSingleton()->getLocalTime() + 4000; sample_UI_event = std::make_shared<SimpleEvent>(EventType("sample_radioactive"),0, 4000, std::bind(&ArtisanManager::sampleEvent,this, player, resource, tool)); } else { gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "gamble_no_action"), player); return; } } } break; case SUI_Window_SmplGamble_ListBox: { //action == 1 is cancel if(action == 1) { player->getSampleData()->mPendingSample = false; player->getSampleData()->mSampleGambleFlag = false; gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); player->updateMovementProperties(); gMessageLib->sendUpdateMovementProperties(player); gMessageLib->sendPostureAndStateUpdate(player); gMessageLib->sendSelfPostureUpdate(player); return; } else { if(element == 0) { player->getSampleData()->mPendingSample = true; player->getSampleData()->mSampleGambleFlag = false; SurveyTool* tool = dynamic_cast<SurveyTool*>(inventory->getObjectById(asyncContainer->ToolId)); CurrentResource* resource = (CurrentResource*)asyncContainer->CurrentResource; player->getSampleData()->mNextSampleTime = Anh_Utils::Clock::getSingleton()->getLocalTime() + 1000; sample_UI_event = std::make_shared<SimpleEvent>(EventType("sample_gamble"),0, 1000, std::bind(&ArtisanManager::sampleEvent,this, player, resource, tool)); } else { //action costs if(!ham->checkMainPools(0,mSampleActionCost*2,0)) { gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); player->getSampleData()->mSampleEventFlag = false; player->getSampleData()->mSampleGambleFlag = false; gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "gamble_no_action"), player); return; } player->getSampleData()->mPendingSample = true; //determine whether gamble is good or not int32 gambleRoll = int(gRandom->getRand()%2) + 1; if(gambleRoll == 1) { player->getSampleData()->mSampleEventFlag = true; player->getSampleData()->mSampleGambleFlag = true; } else { player->getSampleData()->mSampleEventFlag = false; player->getSampleData()->mSampleGambleFlag = false; gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "gamble_fail"), player); } SurveyTool* tool = dynamic_cast<SurveyTool*>(inventory->getObjectById(asyncContainer->ToolId)); CurrentResource* resource = (CurrentResource*)asyncContainer->CurrentResource; player->getSampleData()->mNextSampleTime = Anh_Utils::Clock::getSingleton()->getLocalTime() + 1000; sample_UI_event = std::make_shared<SimpleEvent>(EventType("sample_gamble"),0, 1000, std::bind(&ArtisanManager::sampleEvent,this, player, resource, tool)); } } } break; case SUI_Window_SmplWaypNode_ListBox: { if(action == 0) { //we hit ok and went for the wp if(element == 1) { player->getSampleData()->mPendingSample = false; player->getSampleData()->mSampleNodeFlag = true; player->getSampleData()->Position.x = player->mPosition.x +(((gRandom->getRand()%50)+1)); player->getSampleData()->Position.z = player->mPosition.z +(((gRandom->getRand()%50)+1)); player->getSampleData()->zone = gWorldManager->getZoneId(); player->getSampleData()->resource = (CurrentResource*)asyncContainer->CurrentResource; Datapad* datapad = player->getDataPad(); datapad->requestNewWaypoint("Resource Node", player->getSampleData()->Position ,static_cast<uint16>(gWorldManager->getZoneId()),Waypoint_blue); gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "node_waypoint"), player); gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); return; } //we ignored the node - so continue sampling if(element == 0) { player->getSampleData()->mPendingSample = true; player->getSampleData()->mSampleGambleFlag = false; SurveyTool* tool = dynamic_cast<SurveyTool*>(inventory->getObjectById(asyncContainer->ToolId)); CurrentResource* resource = (CurrentResource*)asyncContainer->CurrentResource; player->getSampleData()->mNextSampleTime = Anh_Utils::Clock::getSingleton()->getLocalTime() + 10000; sample_UI_event = std::make_shared<SimpleEvent>(EventType("sample_continue"),0, 10000, std::bind(&ArtisanManager::sampleEvent,this, player, resource, tool)); } } else { player->getSampleData()->mPendingSample = false; player->getSampleData()->mSampleNodeFlag = false; player->getSampleData()->Position.x = 0; player->getSampleData()->Position.z = 0; player->getSampleData()->resource = NULL; player->getSampleData()->zone = 0; gStateManager.setCurrentPostureState(player, CreaturePosture_Upright); return; } } break; } //notify the listeners if (sample_UI_event) gEventDispatcher.Notify(sample_UI_event); SAFE_DELETE(asyncContainer); }