bool Tutorial::isContainerEmpty(uint64 containerId) { bool empty = false; if (containerId == mContainerEventId) { Container* container = dynamic_cast<Container*>(gWorldManager->getObjectById(containerId)); if (container) { uint32 objectCount = 0; ObjectIDList* objList = container->getObjects(); ObjectIDList::iterator it = objList->begin(); ObjectIDList::iterator cEnd = objList->end(); while(it != cEnd) { TangibleObject* item = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(item->getPrivateOwner() == this->getPlayer()) { ++objectCount; } ++it; } empty = (objectCount == 0); } } return empty; }
bool TravelMapHandler::findTicket(PlayerObject* player, BString port) { uint32 zoneId = gWorldManager->getZoneId(); ObjectIDList* invObjects = dynamic_cast<Inventory*>(player->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()); uint16 srcPlanetId = static_cast<uint16>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_departure_planet")).c_str()))); // see if we got at least 1 if(srcPlanetId == zoneId && strcmp(srcPoint.getAnsi(),port.getAnsi()) == 0) { return false; } } ++it; } return true;; }
void TicketCollector::_createTicketSelectMenu(PlayerObject* playerObject) { BStringVector availableTickets; uint32 zoneId = gWorldManager->getZoneId(); 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()); uint16 srcPlanetId = static_cast<uint16>(gWorldManager->getPlanetIdByName((int8*)((ticket->getAttribute<std::string>("travel_departure_planet")).c_str()))); if(srcPlanetId == zoneId && strcmp(srcPoint.getAnsi(),mPortDescriptor.getAnsi()) == 0) { BString dstPoint = (int8*)((ticket->getAttribute<std::string>("travel_arrival_point")).c_str()); availableTickets.push_back(dstPoint.getAnsi()); } } ++it; } gUIManager->createNewListBox(this,"handleticketselect","select destination","Select destination",availableTickets,playerObject); }
//====================================================================================================================== // // create the inventory contents for its owner // void MessageLib::sendInventory(PlayerObject* playerObject) { if(!_checkPlayer(playerObject)) return; Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); //uint64 parentId = inventory->getParentId(); //to stop the server from crashing. if(!inventory) { assert(false && "MessageLib::sendInventory - Player has no inventory ???? :("); return; } inventory->setTypeOptions(256); //todo - just use sendcreate tangible and have it send the children, too!!!! // create the inventory sendCreateObjectByCRC(inventory,playerObject,false); sendContainmentMessage(inventory->getId(),inventory->getParentId(),4,playerObject); sendBaselinesTANO_3(inventory,playerObject); sendBaselinesTANO_6(inventory,playerObject); // create objects contained ObjectIDList* invObjects = inventory->getObjects(); ObjectIDList::iterator objIt = invObjects->begin(); while(objIt != invObjects->end()) { Object* object = gWorldManager->getObjectById((*objIt)); sendCreateObject(object,playerObject,false); ++objIt; } sendEndBaselines(inventory->getId(),playerObject); ObjectList* invEquippedObjects = playerObject->getEquipManager()->getEquippedObjects(); ObjectList::iterator objEIt = invEquippedObjects->begin(); while(objEIt != invEquippedObjects->end()) { if(TangibleObject* tangible = dynamic_cast<TangibleObject*>(*objEIt)) { sendCreateTangible(tangible,playerObject); } ++objEIt; } }
TangibleObject* FactoryCrate::getLinkedObject() { ObjectIDList* ol = this->getObjects(); ObjectIDList::iterator it = ol->begin(); //just get the first linked object - crates only have the one TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { assert(false && "FactoryCrate::getLinkedObject WorldManager did not return a valid TangibleObject"); return NULL; } return tO; }
//====================================================================================================================== // // create factory crate // bool MessageLib::sendCreateFactoryCrate(FactoryCrate* crate,PlayerObject* targetObject) { if(!_checkPlayer(targetObject)) return(false); sendCreateObjectByCRC(crate,targetObject,false); uint64 parentId = crate->getParentId(); sendContainmentMessage(crate->getId(),parentId,0xffffffff,targetObject); sendBaselinesTYCF_3(crate,targetObject); sendBaselinesTYCF_6(crate,targetObject); sendBaselinesTYCF_8(crate,targetObject); sendBaselinesTYCF_9(crate,targetObject); //check for our linked item and create it ObjectIDList* ol = crate->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { gLogger->log(LogManager::DEBUG,"Unable to find object with ID %PRIu64", (*it)); continue; } //PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetObject->getId())); sendCreateObject(tO,targetObject,false); it++; } sendEndBaselines(crate->getId(),targetObject); //now get the contained tangible and create it //sendCreateTangible(); return(true); }
//====================================================================================================================== // // creates all items childobjects // bool MessageLib::sendItemChildren(TangibleObject* srcObject,PlayerObject* targetObject) { if(!_checkPlayer(targetObject)) return(false); ObjectIDList* childObjects = srcObject->getObjects(); ObjectIDList::iterator childObjectsIt = childObjects->begin(); while(childObjectsIt != childObjects->end()) { // items if(TangibleObject* to = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*childObjectsIt)))) { gMessageLib->sendCreateTangible(to,targetObject); } ++childObjectsIt; } return(true); }
ObjectList BuildingObject::getAllCellChilds() { ObjectIDList* tmpList; ObjectList resultList; ObjectIDList::iterator childIt; CellObjectList::iterator cellIt = mCells.begin(); while(cellIt != mCells.end()) { tmpList = (*cellIt)->getObjects(); childIt = tmpList->begin(); while(childIt != tmpList->end()) { Object* childObject = gWorldManager->getObjectById((*childIt)); resultList.push_back(childObject); ++childIt; } ++cellIt; } return(resultList); }
ObjectList* FireworkShow::_getInventoryFireworks(PlayerObject* playerObject) { ObjectList* returnList = new ObjectList(); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); ObjectIDList* objList = inventory->getObjects(); ObjectIDList::iterator containerObjectIt = objList->begin(); while (containerObjectIt != objList->end()) { Object* object = gWorldManager->getObjectById((*containerObjectIt)); if (Item* item = dynamic_cast<Item*>(object)) { if(item->getItemFamily()==ItemFamily_FireWork && item->getItemType()!= ItemType_Firework_Show) { returnList->push_back(item); } } ++containerObjectIt; } return returnList; }
void ObjectFactory::deleteObjectFromDB(Object* object) { int8 sql[256]; switch(object->getType()) { case ObjType_Tangible: { TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); switch(tangibleObject->getTangibleGroup()) { case TanGroup_Item: { Item* item = dynamic_cast<Item*>(object); if(item->getItemType() == ItemFamily_ManufacturingSchematic) { ManufacturingSchematic* schem = dynamic_cast<ManufacturingSchematic*> (object); //first associated item sprintf(sql,"DELETE FROM items WHERE id = %"PRIu64"",schem->getItem()->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM item_attributes WHERE item_id = %"PRIu64"",schem->getItem()->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } ObjectIDList* objectList = item->getObjects(); ObjectIDList::iterator objIt = objectList->begin(); while(objIt != objectList->end()) { Object* object = gWorldManager->getObjectById((*objIt)); deleteObjectFromDB(object); ++objIt; } sprintf(sql,"DELETE FROM items WHERE id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM item_attributes WHERE item_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case TanGroup_ResourceContainer: { sprintf(sql,"DELETE FROM resource_containers WHERE id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case TanGroup_Terminal: { sprintf(sql,"DELETE FROM terminals WHERE id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; default:break; } } break; case ObjType_Intangible: { IntangibleObject* itno = dynamic_cast<IntangibleObject*>(object); switch(itno->getItnoGroup()) { case ItnoGroup_Vehicle: { sprintf(sql,"DELETE FROM vehicle_cutomization WHERE vehicles_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM vehicle_attributes WHERE vehicles_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM vehicles WHERE id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; default: break; } } break; case ObjType_Cell: { CellObject* cell = dynamic_cast<CellObject*>(object); ObjectIDList* cellObjects = cell->getObjects(); ObjectIDList::iterator objIt = cellObjects->begin(); while(objIt != cellObjects->end()) { Object* childObject = gWorldManager->getObjectById((*objIt)); if(PlayerObject* player = dynamic_cast<PlayerObject*>(childObject)) { //place the player in the world and db - do *NOT* delete him :P //player->setParentId(0,0xffffffff,player->getKnownPlayers(),true); } else if(CreatureObject* pet = dynamic_cast<CreatureObject*>(childObject)) { //place the player in the world and db - do *NOT* delete him :P //pet->setParentId(0,0xffffffff,pet->getKnownPlayers(),true); } else { deleteObjectFromDB(childObject); } ++objIt; sprintf(sql,"UPDATE characters SET parent_id = 0 WHERE parent_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } sprintf(sql,"DELETE FROM cells WHERE id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case ObjType_Building: { //only delete when a playerbuilding HouseObject* house = dynamic_cast<HouseObject*>(object); if(!house) { //no player building return; } CellObjectList* cellList = house->getCellList(); CellObjectList::iterator cellIt = cellList->begin(); while(cellIt != cellList->end()) { CellObject* cell = (*cellIt); deleteObjectFromDB(cell); //remove items in the building from world and db ++cellIt; } sprintf(sql,"DELETE FROM houses WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //sprintf(sql,"DELETE FROM terminals WHERE ID = %"PRIu64"",object->getId()); //mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM structures WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //Admin / Hopper Lists sprintf(sql,"DELETE FROM structure_admin_data WHERE StructureID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //update attributes cave redeed vs destroy sprintf(sql,"DELETE FROM structure_attributes WHERE Structure_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case ObjType_Structure: { //Harvester sprintf(sql,"DELETE FROM structures WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM harvesters WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); sprintf(sql,"DELETE FROM factories WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //Admin / Hopper Lists sprintf(sql,"DELETE FROM structure_admin_data WHERE StructureID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //update attributes cave redeed vs destroy sprintf(sql,"DELETE FROM structure_attributes WHERE Structure_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); //update hopper contents sprintf(sql,"DELETE FROM harvester_resources WHERE ID = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; case ObjType_Waypoint: { sprintf(sql,"DELETE FROM waypoints WHERE waypoint_id = %"PRIu64"",object->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,sql); } break; default:break; } }
bool ObjectController::_destroyOutOfRangeObjects(ObjectSet *inRangeObjects) { //TODO: when a container gets out of range //we need to destroy the children, too!!!!!!! // iterate our knowns PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); ObjectSet* knownObjects = player->getKnownObjects(); ObjectSet::iterator objIt = knownObjects->begin(); PlayerObjectSet* knownPlayers = player->getKnownPlayers(); PlayerObjectSet::iterator playerIt = knownPlayers->begin(); const uint32 objectDestroyLimit = 5000; // update players while(playerIt != knownPlayers->end()) { PlayerObject* playerObject = (*playerIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(playerObject) == inRangeObjects->end()) { // send a destroy to us gMessageLib->sendDestroyObject(playerObject->getId(),player); //If player is mounted destroy his mount too if(playerObject->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(playerObject->getMount()->getId(),player); player->removeKnownObject(playerObject->getMount()); playerObject->getMount()->removeKnownObject(player); } //send a destroy to him gMessageLib->sendDestroyObject(player->getId(),playerObject); //If we're mounted destroy our mount too if(player->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(player->getMount()->getId(),playerObject); playerObject->removeKnownObject(player->getMount()); player->getMount()->removeKnownObject(playerObject); } // we don't know each other anymore knownPlayers->erase(playerIt++); playerObject->removeKnownObject(player); continue; } ++playerIt; } // We may want to limit the amount of messages sent in one session. uint32 messageCount = 0; // update objects while(objIt != knownObjects->end()) { Object* object = (*objIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(object) == inRangeObjects->end()) { if(object->getType() == ObjType_Structure) { if(FactoryObject* factory = dynamic_cast<FactoryObject*>(object)) { //delete the hoppers contents TangibleObject* hopper = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(factory->getIngredientHopper())); if(hopper) { ObjectIDList* ol = hopper->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { assert(false && "ObjectController::_destroyOutOfRangeObjects WorldManager unable to find TangibleObject instance"); } tO->removeKnownObject(player); player->removeKnownObject(tO); gMessageLib->sendDestroyObject(tO->getId(),player); it++; } hopper->removeKnownObject(player); player->removeKnownObject(hopper); gMessageLib->sendDestroyObject(hopper->getId(),player); } hopper = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(factory->getOutputHopper())); if(hopper) { ObjectIDList* ol = hopper->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { assert(false && "ObjectController::_destroyOutOfRangeObjects WorldManager unable to find TangibleObject instance"); } //PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetObject->getId())); tO->removeKnownObject(player); player->removeKnownObject(tO); gMessageLib->sendDestroyObject(tO->getId(),player); it++; } hopper->removeKnownObject(player); player->removeKnownObject(hopper); gMessageLib->sendDestroyObject(hopper->getId(),player); } } } // send a destroy to us gMessageLib->sendDestroyObject(object->getId(),player); // we don't know each other anymore knownObjects->erase(objIt++); object->removeKnownObject(player); if (++messageCount >= objectDestroyLimit) { // gLogger->logMsg("Pausing sendDestroyObject()-calls."); break; } continue; } ++objIt; } // For test bool allDestroyed = false; if (objIt == knownObjects->end()) { // gLogger->logMsg("Finished sendDestroyObject()-calls."); allDestroyed = true; } return allDestroyed; }
void CraftingSession::bagResource(ManufactureSlot* manSlot,uint64 containerId) { //iterates through the slots filled resources //respectively create a new one if necessary //TODO : what happens if the container is full ? FilledResources::iterator resIt = manSlot->mFilledResources.begin(); manSlot->setFilledType(DST_Empty); while(resIt != manSlot->mFilledResources.end()) { uint32 amount = (*resIt).second; // see if we can add it to an existing container ObjectIDList* invObjects = dynamic_cast<Inventory*>(mOwner->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getObjects(); ObjectIDList::iterator listIt = invObjects->begin(); bool foundSameType = false; while(listIt != invObjects->end()) { // we are looking for resource containers ResourceContainer* resCont = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById((*listIt))); if(resCont) { uint32 targetAmount = resCont->getAmount(); uint32 maxAmount = resCont->getMaxAmount(); uint32 newAmount; if((resCont->getResourceId() == (*resIt).first) && (targetAmount < maxAmount)) { foundSameType = true; newAmount = targetAmount + amount; if(newAmount <= maxAmount) { // update target container resCont->setAmount(newAmount); gMessageLib->sendResourceContainerUpdateAmount(resCont,mOwner); gWorldManager->getDatabase()->executeSqlAsync(NULL,NULL,"UPDATE %s.resource_containers SET amount=%u WHERE id=%" PRIu64 "",mDatabase->galaxy(),newAmount,resCont->getId()); } // target container full, put in what fits, create a new one else if(newAmount > maxAmount) { uint32 selectedNewAmount = newAmount - maxAmount; resCont->setAmount(maxAmount); gMessageLib->sendResourceContainerUpdateAmount(resCont,mOwner); gWorldManager->getDatabase()->executeSqlAsync(NULL,NULL,"UPDATE %s.resource_containers SET amount=%u WHERE id=%" PRIu64 "",mDatabase->galaxy(),maxAmount,resCont->getId()); gObjectFactory->requestNewResourceContainer(dynamic_cast<Inventory*>(mOwner->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)),(*resIt).first,mOwner->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)->getId(),99,selectedNewAmount); } break; } } ++listIt; } // or need to create a new one if(!foundSameType) { gObjectFactory->requestNewResourceContainer(dynamic_cast<Inventory*>(mOwner->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)),(*resIt).first,mOwner->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)->getId(),99,amount); } ++resIt; } }
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; } } }
//============================================================================= // creates resource containers ín our inventory void HarvesterObject::createResourceContainer(uint64 resID, PlayerObject* player, uint32 amount) { //now create the resource container ObjectIDList* invObjects = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getObjects(); ObjectIDList::iterator listIt = invObjects->begin(); uint32 rAmount = amount; bool foundSameType = false; while(listIt != invObjects->end()) { // we are looking for resource containers ResourceContainer* resCont = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById((*listIt))); if(resCont) { uint32 targetAmount = resCont->getAmount(); uint32 maxAmount = resCont->getMaxAmount(); uint32 newAmount; if((resCont->getResourceId() == resID)) { //find out how much we can add to the container uint32 addAmount = maxAmount - targetAmount; if(addAmount >rAmount) { addAmount = rAmount; rAmount = 0; } else rAmount -= addAmount; if(addAmount) { // find out how big our container is now newAmount = targetAmount + addAmount; // update target container resCont->setAmount(newAmount); gMessageLib->sendResourceContainerUpdateAmount(resCont,player); gWorldManager->getDatabase()->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%I64u",newAmount,resCont->getId()); } } } ++listIt; } // or need to create a new one while(rAmount) { uint32 a = 100000; if( a > rAmount) a = rAmount; gObjectFactory->requestNewResourceContainer(dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)),resID,player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)->getId(),99,a); rAmount -= a; } }
bool ObjectController::removeFromContainer(uint64 targetContainerId, uint64 targetId) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Object* itemObject = gWorldManager->getObjectById(targetId); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); TangibleObject* targetContainer = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(targetContainerId)); TangibleObject* tangible = dynamic_cast<TangibleObject*>(itemObject); Item* item = dynamic_cast<Item*>(itemObject); // its us if (tangible->getParentId() == playerObject->getId()) { // unequip it return playerObject->getEquipManager()->unEquipItem(itemObject); } //the containerObject is the container used in the tutorial or some random dungeon container Container* container = dynamic_cast<Container*>(gWorldManager->getObjectById(tangible->getParentId())); if (container) { container->removeObject(itemObject); //gContainerManager->destroyObjectToRegisteredPlayers(container, tangible->getId()); if (gWorldConfig->isTutorial()) { playerObject->getTutorial()->transferedItemFromContainer(targetId, tangible->getParentId()); // If object is owned by player (private owned for instancing), we remove the owner from the object. // what is this used for ??? if (itemObject->getPrivateOwner() == playerObject->getId()) { itemObject->setPrivateOwner(0); } } return true; } //creature inventories are a special case - their items are temporary!!! we cannot loot them directly CreatureObject* unknownCreature; Inventory* creatureInventory; if (itemObject->getParentId() && (unknownCreature = dynamic_cast<CreatureObject*>(gWorldManager->getObjectById(itemObject->getParentId() - INVENTORY_OFFSET))) && (creatureInventory = dynamic_cast<Inventory*>(unknownCreature->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))) && (creatureInventory->getId() == itemObject->getParentId()) && (creatureInventory->getId() != inventory->getId())) { if(!creatureInventory->removeObject(itemObject)) { LOG(warning) << "ObjectController::removeFromContainer: Internal Error could not remove " << itemObject->getId() << " from creature inventory " << creatureInventory->getId(); return false; } // we destroy the item in this case as its a temporary!! // we do not want to clog the db with unlooted items gContainerManager->destroyObjectToRegisteredPlayers(creatureInventory, tangible->getId()); ObjectIDList* invObjList = creatureInventory->getObjects(); if (invObjList->size() == 0) { // Put this creature in the pool of delayed destruction and remove the corpse from scene. gWorldManager->addCreatureObjectForTimedDeletion(creatureInventory->getParentId(), LootedCorpseTimeout); } if (gWorldConfig->isTutorial()) { // TODO: Update tutorial about the loot. playerObject->getTutorial()->transferedItemFromContainer(targetId, creatureInventory->getId()); } //bail out here and request the item over the db - as the item in the NPC has a temporary id and we dont want that in the db // This ensure that we do not use/store any of the temp id's in the database. gObjectFactory->requestNewDefaultItem(inventory, item->getItemFamily(), item->getItemType(), inventory->getId(), 99, glm::vec3(), ""); return false; } //cells are NOT tangibles - thei are static Objects CellObject* cell; if(cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(itemObject->getParentId()))) { // Stop playing if we pick up the (permanently placed) instrument we are playing if (item && (item->getItemFamily() == ItemFamily_Instrument)) { uint32 instrumentType = item->getItemType(); if ((instrumentType == ItemType_Nalargon) || (instrumentType == ItemType_omni_box) || (instrumentType == ItemType_nalargon_max_reebo)) { // It's a placeable original instrument. // Are we targeting the instrument we actually play on? if (playerObject->getActiveInstrumentId() == item->getId()) { gEntertainerManager->stopEntertaining(playerObject); } } } //we *cannot* remove static tangibles like the structureterminal!!!! if(tangible->getStatic()) { return false; } // Remove object from cell. cell->removeObject(itemObject); return true; } //some other container ... hopper backpack chest etc TangibleObject* containingContainer = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(tangible->getParentId())); if(containingContainer && containingContainer->removeObject(itemObject)) { return true; } return false; }
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; } } }
//====================================================================================================================== // // create tangible // bool MessageLib::sendCreateTangible(TangibleObject* tangibleObject,PlayerObject* targetObject, bool sendchildren) { if(!_checkPlayer(targetObject)) { gLogger->log(LogManager::DEBUG,"MessageLib::sendCreateTangible No valid player"); return(false); } if(ResourceContainer* resContainer = dynamic_cast<ResourceContainer*>(tangibleObject)) { return sendCreateResourceContainer(resContainer,targetObject); } else if(FactoryCrate* crate = dynamic_cast<FactoryCrate*>(tangibleObject)) { return sendCreateFactoryCrate(crate,targetObject); } else if(tangibleObject->getTangibleGroup() == TanGroup_Static) { return sendCreateStaticObject(tangibleObject,targetObject); } uint64 parentId = tangibleObject->getParentId(); sendCreateObjectByCRC(tangibleObject,targetObject,false); if(parentId != 0) { // its in a cell, container, inventory if(parentId != targetObject->getId()) { // could be inside a crafting tool Object* parent = gWorldManager->getObjectById(parentId); CreatureObject* parentObject = dynamic_cast<CreatureObject*>(parent); if(parent && dynamic_cast<CraftingTool*>(parent)) { sendContainmentMessage(tangibleObject->getId(),parentId,0,targetObject); } // if equipped, also tie it to the object else if(parentObject) { Item* item = dynamic_cast<Item*>(tangibleObject); sendContainmentMessage(tangibleObject->getId(),parentObject->getId(),4,targetObject); } else { sendContainmentMessage(tangibleObject->getId(),tangibleObject->getParentId(),0xffffffff,targetObject); } } // or tied directly to an object else { sendContainmentMessage(tangibleObject->getId(),tangibleObject->getParentId(),4,targetObject); } } else { sendContainmentMessage(tangibleObject->getId(),tangibleObject->getParentId(),0xffffffff,targetObject); } sendBaselinesTANO_3(tangibleObject,targetObject); sendBaselinesTANO_6(tangibleObject,targetObject); //now check whether we have children!!! ObjectIDList* ol = tangibleObject->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { gLogger->log(LogManager::DEBUG,"MessageLib::sendCreateTangible::Unable to find object with ID %PRIu64", (*it)); it++; continue; } PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetObject->getId())); //for children add knownPlayers!!!! //tO->addKnownObjectSafe(player); //player->addKnownObjectSafe(tO); sendCreateObject(tO,player,false); it++; } sendEndBaselines(tangibleObject->getId(),targetObject); return(true); }
void ArtisanManager::finishSampling(PlayerObject* player, CurrentResource* resource, SurveyTool* tool, uint32 sampleAmount) { bool foundSameType = false; //grants 20xp -> 40xp inclusive -- Feature suggestion: Grant less XP for smaller samples, more xp for greater samples. IE: 20 + X*sampleSize gSkillManager->addExperience(XpType_resource_harvesting_inorganic,(int32)((gRandom->getRand()%20) + 20),player); // see if we can add it to an existing container Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); ObjectIDList* invObjects = inventory->getObjects(); ObjectIDList::iterator listIt = invObjects->begin(); while(listIt != invObjects->end()) { // we are looking for resource containers ResourceContainer* resCont = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById((*listIt))); if(resCont) { uint32 targetAmount = resCont->getAmount(); uint32 maxAmount = resCont->getMaxAmount(); uint32 newAmount; if(resCont->getResourceId() == resource->getId() && targetAmount < maxAmount) { foundSameType = true; if((newAmount = targetAmount + sampleAmount) <= maxAmount) { // update target container resCont->setAmount(newAmount); gMessageLib->sendResourceContainerUpdateAmount(resCont,player); gWorldManager->getDatabase()->executeSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",newAmount,resCont->getId()); } // target container full, put in what fits, create a new one else if(newAmount > maxAmount) { uint32 selectedNewAmount = newAmount - maxAmount; resCont->setAmount(maxAmount); gMessageLib->sendResourceContainerUpdateAmount(resCont,player); gWorldManager->getDatabase()->executeSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",maxAmount,resCont->getId()); gObjectFactory->requestNewResourceContainer(inventory,resource->getId(),inventory->getId(),99,selectedNewAmount); } break; } } ++listIt; } // or need to create a new one if(!foundSameType) { gObjectFactory->requestNewResourceContainer(inventory,resource->getId(),inventory->getId(),99,sampleAmount); } // deplete resource gResourceManager->setResourceDepletion(resource, sampleAmount); return; }