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 ObjectController::_ExtractObject(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); FactoryCrate* crate = dynamic_cast<FactoryCrate*>(gWorldManager->getObjectById(targetId)); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); //gLogger->logMsgF("ObjectController::_ExtractObject: Container : %I64u",MSG_NORMAL,targetId); if(!crate) { gLogger->logMsg("ObjectController::_ExtractObject: Crate does not exist!"); return; } //get the crates containing container - inventory is a tangible, too - we can use the unified interface thks to virtual functions :) //add inventories to worldmanager ? TangibleObject* tO = dynamic_cast<TangibleObject* >(gWorldManager->getObjectById(crate->getParentId())); if(!tO) { tO = dynamic_cast<TangibleObject* >(inventory); if(!tO) { gLogger->logMsg("ObjectController::_ExtractObject: Crates parent does not exist!"); assert(false && "ObjectController::_ExtractObject inventory must be a tangible object"); return; } } if(!tO->checkCapacity()) { //check if we can fit an additional item in our inventory return; } //create the new item gObjectFactory->requestNewClonedItem(tO,crate->getLinkedObject()->getId(),tO->getId()); //decrease crate content int32 content = crate->decreaseContent(1); if(!content) { gMessageLib->sendDestroyObject(crate->getId(),playerObject); gObjectFactory->deleteObjectFromDB(crate->getId()); inventory->deleteObject(crate); return; } if(content < 0) { gLogger->logMsg("ObjectController::_ExtractObject: the crate now has negative content!"); assert(false && "ObjectController::_ExtractObject crate must not have negative content"); return; } gMessageLib->sendUpdateCrateContent(crate,playerObject); return; }