void ObjectController::_handleFindFriendDBReply(uint64 retCode,string friendName) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); friendName.convert(BSTRType_Unicode16); if(retCode == 0) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed_noname","","",L"",0,"","",friendName.getUnicode16()); return; } PlayerObject* searchObject = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(retCode)); if(!searchObject) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed","","",L"",0,"","",friendName.getUnicode16()); return; } //are we on our targets friendlist??? if(!searchObject->checkFriendList(player->getFirstName().getCrc())) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed","","",L"",0,"","",friendName.getUnicode16()); return; } Datapad* thePad = dynamic_cast<Datapad*>(searchObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); if(thePad && thePad->getCapacity()) { //the datapad automatically checks for waypoint caspacity and gives the relevant error messages thePad->requestNewWaypoint(searchObject->getFirstName().getAnsi(),searchObject->mPosition,static_cast<uint16>(gWorldManager->getZoneId()),Waypoint_blue); } }
void VehicleFactory::handleObjectReady(Object* object,DispatchClient* client) { if(Vehicle* vehicle = dynamic_cast<Vehicle*>(object)) { PlayerObject* player = gWorldManager->getPlayerByAccId(client->getAccountId()); if(player) { vehicle->setOwner(player); if(Datapad* datapad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad))) { datapad->addData(vehicle); gWorldManager->addObject(vehicle,true); //spawn it in the player's datapad gMessageLib->sendCreateInTangible(vehicle, datapad->getId(), player); //now spawn it in the world vehicle->call(); } } } }
void SpatialIndexManager::createInWorld(Object* object) { uint32 baseCell = 0xffffffff; //get parent object determine who to send creates for if(object->getParentId() == 0) { //just create in the SI - it will keep track of nearby players this->_AddObject(object); return; } Object* parent = gWorldManager->getObjectById(object->getParentId()); //start with equipped items if(parent->getType() == ObjType_Player) { PlayerObject* player = static_cast<PlayerObject*>(parent); //add to equiplist manually yet we dont use the objectcontainer for equipped items yet player->getEquipManager()->addEquippedObject(object); gContainerManager->createObjectToRegisteredPlayers(parent, object); //sendCreateObject(object,player,false); gContainerManager->updateEquipListToRegisteredPlayers(player); return; } if(parent) { //items in containers gContainerManager->createObjectToRegisteredPlayers(parent, object); return; } assert(false && "No valid parent"); }
void CharSheetManager::_processPlayerMoneyRequest(Message* message,DispatchClient* client) { PlayerObject* player = gWorldManager->getPlayerByAccId(client->getAccountId()); if(player == NULL) { DLOG(info) << "CharSheetManager::_processPlayerMoneyRequest: could not find player " << client->getAccountId(); return; } gMessageFactory->StartMessage(); gMessageFactory->addUint32(opPlayerMoneyResponse); gMessageFactory->addUint32(dynamic_cast<Bank*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->credits()); gMessageFactory->addUint32(dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getCredits()); Message* newMessage = gMessageFactory->EndMessage(); client->SendChannelA(newMessage,client->getAccountId(),CR_Client,3); }
void ObjectController::_handleDestroyInstrument(Item* item) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Item* tempInstrument = NULL; Item* permanentInstrument = NULL; // first, stop playing, if its currently in use if(playerObject->getPerformingState() == PlayerPerformance_Music) { // equipped instrument if(item == dynamic_cast<Item*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Instrument)) || playerObject->getPlacedInstrumentId()) { gEntertainerManager->stopEntertaining(playerObject); } } // handle destruction of instanced instruments, placed in world if(playerObject->getPlacedInstrumentId()) { // get the instruments tempInstrument = dynamic_cast<Item*>(gWorldManager->getObjectById(playerObject->getPlacedInstrumentId())); if(!tempInstrument) { gLogger->logMsg("ObjectController::handleDestroyInstrument : no temporary Instrument\n"); return; } permanentInstrument = dynamic_cast<Item*>(gWorldManager->getObjectById(tempInstrument->getPersistantCopy())); if(!permanentInstrument) { gLogger->logMsg("ObjectController::handleDestroyInstrument : no parent Instrument\n"); return; } // the temporary gets ALWAYS deleted // update the attributes of the permanent Instrument if(tempInstrument == item) { permanentInstrument->setPlaced(false); permanentInstrument->setNonPersistantCopy(0); playerObject->setPlacedInstrumentId(0); } // it is the permanent Instrument delete the temporary copy too else if(permanentInstrument == item) { destroyObject(tempInstrument->getId()); } } }
//============================================================================= bool Inventory::itemExist(uint32 familyId, uint32 typeId) { bool found = false; ObjectIDList::iterator invObjectIt = getObjects()->begin(); // Items inside inventory and child objects. while (invObjectIt != getObjects()->end()) { Object* object = getObjectById(*invObjectIt); Item* item = dynamic_cast<Item*>(object); if (item) { if ((item->getItemFamily() == familyId) && (item->getItemType() == typeId)) { found = true; break; } } invObjectIt++; } if (!found) { // Items equipped by the player. PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(this->getParentId())); if(!player) return found; ObjectList* objList = player->getEquipManager()->getEquippedObjects(); ObjectList::iterator equippedObjectIt = objList->begin(); while (equippedObjectIt != objList->end()) { Object* object = (*equippedObjectIt); Item* item = dynamic_cast<Item*>(object); if (item) { if ((item->getItemFamily() == familyId) && (item->getItemType() == typeId)) { found = true; break; } } equippedObjectIt++; } delete objList; } return found; }
void GroupManager::sendGroupMissionUpdate(GroupObject* group) { // this procedure ensures, that in case of a change in the mission pool of the group // all players get updated Mission waypoints // it concerns all players of the group on the zone, but not on other zones //get us the mission nearest to the most players on the Zone MissionObject* mission = getZoneGroupMission(group->getPlayerList()); if(!mission) return; //now set the GroupWaypoint for all onZone groupmembers Uint64List::iterator playerListIt = group->getPlayerList()->begin(); while(playerListIt != group->getPlayerList()->end()) { PlayerObject* player = dynamic_cast<PlayerObject*> (gWorldManager->getObjectById((*playerListIt))); Datapad* datapad = dynamic_cast<Datapad*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); WaypointObject* waypoint = datapad->getWaypointByName("@group:groupwaypoint"); // remove the old one if(waypoint) { gMessageLib->sendUpdateWaypoint(waypoint,ObjectUpdateAdd,player); datapad->removeWaypoint(waypoint); gObjectFactory->deleteObjectFromDB(waypoint); } else // create a new one if(datapad->getCapacity()) { datapad->requestNewWaypoint("@group:groupwaypoint",mission->getDestination().Coordinates,static_cast<uint16>(gWorldManager->getZoneId()),Waypoint_blue); gMessageLib->sendSystemMessage(player,L"","group","groupwaypoint"); } playerListIt++; } }
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 ObjectController::_handlePurchaseTicket(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); BString dataStr; BStringVector dataElements; uint16 elements; float purchaseRange = gWorldConfig->getConfiguration<float>("Player_TicketTerminalAccess_Distance",(float)10.0); if(playerObject->states.getPosture() == CreaturePosture_SkillAnimating) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject); return; } //however we are able to use the purchaseticket command in starports //without having to use a ticketvendor by just giving commandline parameters //when we are *near* a ticket vendor TravelTerminal* terminal = dynamic_cast<TravelTerminal*> (gWorldManager->getNearestTerminal(playerObject,TanType_TravelTerminal)); // iterate through the results if((!terminal)|| (glm::distance(terminal->mPosition, playerObject->mPosition) > purchaseRange)) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "too_far"), playerObject); return; } playerObject->setTravelPoint(terminal); message->getStringUnicode16(dataStr); // Have to convert BEFORE using split, since the conversion done there is removed It will assert().. evil grin... // Either do the conversion HERE, or better fix the split so it handles unicoe also. dataStr.convert(BSTRType_ANSI); elements = dataStr.split(dataElements,' '); if(elements < 4) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "route_not_available"), playerObject); return; } // get price and planet ids TicketProperties ticketProperties; gTravelMapHandler->getTicketInformation(dataElements,&ticketProperties); if(!ticketProperties.dstPoint) { gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "route_not_available"), playerObject); return; } uint8 roundTrip = 0; if(elements > 4) roundTrip = atoi(dataElements[4].getAnsi()); if(dataElements[4].getCrc() == BString("single").getCrc()) roundTrip = 0; //how many tickets will it be? uint32 amount = 1; if(roundTrip) amount = 2; Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); Bank* bank = dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank)); if(!inventory->checkSlots(static_cast<uint8>(amount))) { gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "inv_full"), playerObject); return; } if(roundTrip == 1) { ticketProperties.price *= 2; } // update bank or inventory credits if(!(inventory->updateCredits(-ticketProperties.price))) { if(!(bank->updateCredits(-ticketProperties.price))) { //gMessageLib->sendSystemMessage(entertainer,L"","travel","route_not_available"); gUIManager->createNewMessageBox(NULL,"ticketPurchaseFailed","The Galactic Travel Commission","You do not have enough money to complete the ticket purchase.",playerObject); return; } } if(playerObject->isConnected()) { gMessageLib->SendSystemMessage(::common::OutOfBand("base_player", "prose_pay_acct_success", "", "", "", "", "money/acct_n", "travelsystem", ticketProperties.price), playerObject); gObjectFactory->requestNewTravelTicket(inventory,ticketProperties,inventory->getId(),99); if(roundTrip == 1) { uint32 tmpId = ticketProperties.srcPlanetId; TravelPoint* tmpPoint = ticketProperties.srcPoint; ticketProperties.srcPlanetId = ticketProperties.dstPlanetId; ticketProperties.srcPoint = ticketProperties.dstPoint; ticketProperties.dstPlanetId = static_cast<uint16>(tmpId); ticketProperties.dstPoint = tmpPoint; gObjectFactory->requestNewTravelTicket(inventory,ticketProperties,inventory->getId(),99); } gUIManager->createNewMessageBox(NULL,"handleSUI","The Galactic Travel Commission","@travel:ticket_purchase_complete",playerObject); } }
void ObjectController::_handleTransferItemMisc(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { //we need to make sure that ONLY equipped items are contained by the player //all other items are contained by the inventory!!!!!!!! PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Object* itemObject = gWorldManager->getObjectById(targetId); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); BString dataStr; uint64 targetContainerId; uint32 linkType; float x,y,z; CellObject* cell; message->getStringUnicode16(dataStr); if(swscanf(dataStr.getUnicode16(),L"%" WidePRIu64 L" %u %f %f %f",&targetContainerId,&linkType,&x,&y,&z) != 5) { DLOG(info) << "ObjController::_handleTransferItemMisc: Error in parameters"; return; } if (!itemObject) { DLOG(warning) << "ObjController::_handleTransferItemMisc: No Object to transfer :("; return; } TangibleObject* tangible = dynamic_cast<TangibleObject*>(itemObject); if(!tangible) { //no tagible - get out of here DLOG(warning) << "ObjController::_handleTransferItemMisc: No tangible to transfer :("; return; } //get our containers Object* newContainer = gWorldManager->getObjectById(targetContainerId); Object* oldContainer = gWorldManager->getObjectById(tangible->getParentId()); DLOG(info) << "ObjController::_handleTransferItemMisc: parameters"; DLOG(info) << "ObjController::_handleTransferItemMisc: newcontainer : " << targetContainerId; DLOG(info) << "ObjController::_handleTransferItemMisc: oldcontainer : " << tangible->getParentId(); DLOG(info) << "ObjController::_handleTransferItemMisc: linktype : " << linkType; // We may want to transfer other things than items...basically tangibleObjects! // resourcecontainers / factory crates // first check whether its an instrument with persistant copy - thats a special case! Item* item = dynamic_cast<Item*>(itemObject); if (item) { //check if its only temporarily placed if(item->getItemFamily() == ItemFamily_Instrument) { if(item->getPersistantCopy()) { // gMessageLib->sendSystemMessage(playerObject,L"you cannot pick this up"); // You bet, I can! Remove the temp instrument from the world. // Do I have access to this instrument? if (item->getOwner() == playerObject->getId()) { playerObject->getController()->destroyObject(targetId); } return; } } } // A FYI: When we drop items, we use player pos. itemObject->mPosition = glm::vec3(x,y,z); if (!targetContainerId) { DLOG(info) << "ObjController::_handleTransferItemMisc:TargetContainer is 0 :("; //return; } //ok how to tackle this ... : //basically I want to use ObjectContainer as standard access point for item handling! //so far we have different accesses for Objects on the player and for the inventory and for ContainerObjects and for cells ... //lets begin by getting the target Object if(!checkTargetContainer(targetContainerId,itemObject)) { DLOG(info) << "ObjController::_handleTransferItemMisc:TargetContainer is not valid :("; return; } if(!checkContainingContainer(tangible->getParentId(), playerObject->getId())) { DLOG(info) << "ObjController::_handleTransferItemMisc:ContainingContainer is not allowing the transfer :("; return; } // Remove the object from whatever contains it. if(!removeFromContainer(targetContainerId, targetId)) { DLOG(info) << "ObjectController::_handleTransferItemMisc: removeFromContainer failed :( this might be caused by looting a corpse though"; return; } //we need to destroy the old radial ... our item now gets a new one //delete(itemObject->getRadialMenu()); itemObject->ResetRadialMenu(); itemObject->setParentId(targetContainerId); //Now update the registered watchers!! gContainerManager->updateObjectPlayerRegistrations(newContainer, oldContainer, tangible, linkType); //now go and move it to wherever it belongs cell = dynamic_cast<CellObject*>(newContainer); if (cell) { // drop in a cell //special case temp instrument if (item&&item->getItemFamily() == ItemFamily_Instrument) { if (playerObject->getPlacedInstrumentId()) { // We do have a placed instrument. uint32 instrumentType = item->getItemType(); if ((instrumentType == ItemType_Nalargon) || (instrumentType == ItemType_omni_box) || (instrumentType == ItemType_nalargon_max_reebo)) { // We are about to drop the real thing, remove any copied instrument. // item->setOwner(playerObject->getId(); playerObject->getController()->destroyObject(playerObject->getPlacedInstrumentId()); } } } itemObject->mPosition = playerObject->mPosition; //do the db update manually because of the position - unless we get an automated position save in itemObject->setParentId(targetContainerId); ResourceContainer* rc = dynamic_cast<ResourceContainer*>(itemObject); if(rc) mDatabase->executeSqlAsync(0,0,"UPDATE %s.resource_containers SET parent_id ='%I64u', oX='%f', oY='%f', oZ='%f', oW='%f', x='%f', y='%f', z='%f' WHERE id='%I64u'",mDatabase->galaxy(),itemObject->getParentId(), itemObject->mDirection.x, itemObject->mDirection.y, itemObject->mDirection.z, itemObject->mDirection.w, itemObject->mPosition.x, itemObject->mPosition.y, itemObject->mPosition.z, itemObject->getId()); else mDatabase->executeSqlAsync(0,0,"UPDATE %s.items SET parent_id ='%I64u', oX='%f', oY='%f', oZ='%f', oW='%f', x='%f', y='%f', z='%f' WHERE id='%I64u'",mDatabase->galaxy(),itemObject->getParentId(), itemObject->mDirection.x, itemObject->mDirection.y, itemObject->mDirection.z, itemObject->mDirection.w, itemObject->mPosition.x, itemObject->mPosition.y, itemObject->mPosition.z, itemObject->getId()); cell->addObjectSecure(itemObject); gMessageLib->sendDataTransformWithParent053(itemObject); itemObject->updateWorldPosition(); return; } PlayerObject* player = dynamic_cast<PlayerObject*>(newContainer); if(player) { //equip / unequip handles the db side, too if(!player->getEquipManager()->EquipItem(item)) { LOG(warning) << "ObjectController::_handleTransferItemMisc: Error equipping " << item->getId(); //panik!!!!!! } itemObject->setParentIdIncDB(newContainer->getId()); return; } //***************************************************************** //All special cases have been handled - now its just our generic ObjectContainer Type //some other container ... hopper backpack chest inventory etc if(newContainer) { newContainer->addObjectSecure(itemObject); itemObject->setParentIdIncDB(newContainer->getId()); return; } }
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; }
bool ObjectController::checkTargetContainer(uint64 targetContainerId, Object* object) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); TangibleObject* tangibleItem = dynamic_cast<TangibleObject*>(object); //if its a backpack etc we want to know how many items are in it! uint32 objectSize = tangibleItem->getHeadCount(); //******************** //this is a special case as we are equipping the item //so handle it separately if(playerObject->getId() == targetContainerId) { //check for equip restrictions!!!! //we cant drop that check - further down we assume that the transfer is accepted // a failing equip will just loose us our item in the receiving container and crash the server in the end return playerObject->getEquipManager()->CheckEquipable(object); } //***************************** //ok everything else is a tangible Object Object* targetContainer = gWorldManager->getObjectById(targetContainerId); //sanity check - if(!targetContainer) { //inventory is NOT part of the main ObjectMap - everything else should be in there if(inventory && (inventory->getId() != targetContainerId)) { return false; } if(inventory) targetContainer = dynamic_cast<TangibleObject*>(inventory); else { DLOG(info) << "ObjController::_handleTransferItemMisc: TargetContainer is NULL and not an inventory :("; return false; } } //====================================================================00 //check access permissions first bool access = false; bool fit = false; //******************** //The tutorial Container is a special case //so handle it separately Container* container = dynamic_cast<Container*>(targetContainer ); if (container) { if (gWorldConfig->isTutorial()) { // We don't allow users to place item in the container. // gMessageLib->sendSystemMessage(playerObject,L"","event_perk","chest_can_not_add"); gMessageLib->SendSystemMessage(L"",playerObject,"error_message","remove_only"); return false; } } //******************** //Factory Outputhopper is retrieve only //access has been granted through the UI already TangibleObject* tangibleContainer = dynamic_cast<TangibleObject*>(targetContainer); if((tangibleContainer)&&(strcmp(tangibleContainer->getName().getAnsi(),"ingredient_hopper")==0)) { //do we have access rights to the factories hopper?? this would have to be checked asynchronously //for now we can only access the hoppers UI through the client and checking our permission so its proven already //a hacker might in theory exploit this, though factories items should only be in memory when someone accesses the hopper access = true; } //==================================================================================== //get the mainOwner of the container - thats a building or a player or an inventory // uint64 ownerId = gSpatialIndexManager->getObjectMainParent(targetContainer); Object* objectOwner = dynamic_cast<Object*>(gWorldManager->getObjectById(ownerId)); if(BuildingObject* building = dynamic_cast<BuildingObject*>(objectOwner)) { if(building->hasAdminRights(playerObject->getId())) { access = true; //do we have enough room ? if(building->checkCapacity(objectSize)) { //***************************** //if it is the House wé dont need to check a containers capacity further down if(!tangibleContainer) //mainly as the container might not exist if its placed in the house directly return true; if(tangibleContainer->checkCapacity(objectSize,playerObject)) return true; else return false; } else { //This container is full. gMessageLib->SendSystemMessage(L"",playerObject,"container_error_message","container03"); return false; } } else { //You do not have permission to access that container. gMessageLib->SendSystemMessage(L"",playerObject,"container_error_message","container08"); return false; } } //********************************** //the inventory is *NOT* part of the worldmanagers ObjectMap //this is our inventory - we are allowed to put stuff in there - but is there still enough place ? if(inventory&& (inventory->getId() == ownerId)) { //make sure its our inventory!!!!!! access = ((inventory->getId()- INVENTORY_OFFSET) == playerObject->getId()); if(!access) { //You do not have permission to access that container. gMessageLib->SendSystemMessage(L"",playerObject,"container_error_message","container08"); return false; } //check space in inventory fit = inventory->checkCapacity(1,playerObject,true); if(!fit) { //This container is full. gMessageLib->SendSystemMessage(L"",playerObject,"container_error_message","container03"); return false; } } //if this is a tangible container (backpack, satchel) we want to make sure, //that we do not put another backpack in it. //in other words, the contained container MUST be smaller than the containing container //********************** //check capacity - return false if full //we wont get here if its an inventory if(tangibleContainer && (!tangibleContainer->checkCapacity(objectSize,playerObject))) //automatically sends errormsg to player { return false; } uint32 containingContainersize = tangibleContainer->getCapacity(); uint32 containedContainersize = tangibleItem->getCapacity(); //we can only add smaller containers inside other containers if(containedContainersize >= containingContainersize) { //This item is too bulky to fit inside this container. gMessageLib->SendSystemMessage(L"",playerObject,"container_error_message","container12"); return false; } return true; }
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 PlayerStructure::handleUIEvent(BString strCharacterCash, BString strHarvesterCash, UIWindow* window) { PlayerObject* player = window->getOwner(); if(!player) { return; } switch(window->getWindowType()) { case SUI_Window_Deposit_Power: { strCharacterCash.convert(BSTRType_ANSI); BString characterPower = strCharacterCash; strHarvesterCash.convert(BSTRType_ANSI); BString harvesterPower = strHarvesterCash; int32 harvesterPowerDelta = atoi(harvesterPower.getAnsi()); gStructureManager->deductPower(player,harvesterPowerDelta); this->setCurrentPower(getCurrentPower()+harvesterPowerDelta); gWorldManager->getDatabase()->executeSqlAsync(0,0,"UPDATE %s.structure_attributes SET value='%u' WHERE structure_id=%" PRIu64 " AND attribute_id=384",gWorldManager->getDatabase()->galaxy(),getCurrentPower(),this->getId()); } break; case SUI_Window_Pay_Maintenance: { strCharacterCash.convert(BSTRType_ANSI); strHarvesterCash.convert(BSTRType_ANSI); Bank* bank = dynamic_cast<Bank*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank)); Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); int32 bankFunds = bank->credits(); int32 inventoryFunds = inventory->getCredits(); int32 funds = inventoryFunds + bankFunds; int32 characterMoneyDelta = atoi(strCharacterCash.getAnsi()) - funds; int32 harvesterMoneyDelta = atoi(strHarvesterCash.getAnsi()) - this->getCurrentMaintenance(); // the amount transfered must be greater than zero if(harvesterMoneyDelta == 0 || characterMoneyDelta == 0) { return; } //lets get the money from the bank first if((bankFunds +characterMoneyDelta)< 0) { characterMoneyDelta += bankFunds; bankFunds = 0; inventoryFunds += characterMoneyDelta; } else { bankFunds += characterMoneyDelta; } if(inventoryFunds < 0) { return; } int32 maintenance = this->getCurrentMaintenance() + harvesterMoneyDelta; if(maintenance < 0) { return; } bank->credits(bankFunds); inventory->setCredits(inventoryFunds); gWorldManager->getDatabase()->destroyResult(gWorldManager->getDatabase()->executeSynchSql("UPDATE %s.banks SET credits=%u WHERE id=%" PRIu64 "",gWorldManager->getDatabase()->galaxy(),bank->credits(),bank->getId())); gWorldManager->getDatabase()->destroyResult(gWorldManager->getDatabase()->executeSynchSql("UPDATE %s.inventories SET credits=%u WHERE id=%" PRIu64 "",gWorldManager->getDatabase()->galaxy(),inventory->getCredits(),inventory->getId())); //send the appropriate deltas. gMessageLib->sendInventoryCreditsUpdate(player); gMessageLib->sendBankCreditsUpdate(player); //get the structures conditiondamage and see whether it needs repair uint32 damage = this->getDamage(); if(damage) { uint32 cost = this->getRepairCost(); uint32 all = cost*damage; if(maintenance <= (int32)all) { all -= (uint32)maintenance; damage = (uint32)(all/cost); maintenance = 0; } if(maintenance > (int32)all) { maintenance -= (int32)all; damage = 0; } //update the remaining damage in the db gWorldManager->getDatabase()->executeSqlAsync(0,0,"UPDATE %s.structures s SET s.condition= %u WHERE s.ID=%" PRIu64 "",gWorldManager->getDatabase()->galaxy(),damage,this->getId()); this->setDamage(damage); //Update the structures Condition gMessageLib->sendHarvesterCurrentConditionUpdate(this); } gWorldManager->getDatabase()->executeSqlAsync(0,0,"UPDATE %s.structure_attributes SET value='%u' WHERE structure_id=%" PRIu64 " AND attribute_id=382",gWorldManager->getDatabase()->galaxy(),maintenance,this->getId()); this->setCurrentMaintenance(maintenance); } break; } }
void ObjectController::_handleResourceContainerSplit(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); ResourceContainer* selectedContainer = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById(targetId)); Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); gLogger->logMsgF("ObjectController::_handleResourceContainerSplit: Container : %I64u",MSG_NORMAL,targetId); if(!selectedContainer) { gLogger->logMsg("ObjectController::_handleResourceContainerSplit: Container does not exist!"); return; } string dataStr; message->getStringUnicode16(dataStr); dataStr.convert(BSTRType_ANSI); BStringVector dataElements; uint16 elementCount = dataStr.split(dataElements,' '); if(!elementCount) { gLogger->logMsg("ObjectController::_handleResourceContainerSplit: Error in requestStr"); return; } uint32 splitOffAmount = boost::lexical_cast<uint32>(dataElements[0].getAnsi()); uint64 parentId = boost::lexical_cast<uint64>(dataElements[1].getAnsi()); if(selectedContainer->getParentId() == inventory->getId()) { //check if we can fit an additional resource container in our inventory if(!inventory->checkSlots(1)) { gMessageLib->sendSystemMessage(playerObject,L"","error_message","inv_full"); return; } mDatabase->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",selectedContainer->getAmount(),selectedContainer->getId()); // create a new one // update selected container contents selectedContainer->setAmount(selectedContainer->getAmount() - splitOffAmount); gMessageLib->sendResourceContainerUpdateAmount(selectedContainer,playerObject); gObjectFactory->requestNewResourceContainer(inventory,(selectedContainer->getResource())->getId(),parentId,99,splitOffAmount); return; } Item* item = dynamic_cast<Item*>(gWorldManager->getObjectById(parentId)); if(!item) { gLogger->logMsg("ObjectController::_ExtractObject: resourcecontainers parent does not exist!"); assert(false && "ObjectController::_ExtractObject resourcecontainers parent does not exist"); return; } if(!item->checkCapacity()) { //check if we can fit an additional item in our inventory gMessageLib->sendSystemMessage(playerObject,L"","container_error_message","container3"); return; } // update selected container contents selectedContainer->setAmount(selectedContainer->getAmount() - splitOffAmount); gMessageLib->sendResourceContainerUpdateAmount(selectedContainer,playerObject); gObjectFactory->requestNewResourceContainer(item,(selectedContainer->getResource())->getId(),parentId,99,splitOffAmount); }
void Inventory::getInsuredItems(SortedInventoryItemList* insuranceList) { // Clear the insurance list. insuranceList->clear(); ObjectIDList::iterator invObjectIt = getObjects()->begin(); // Items inside inventory and child objects. while (invObjectIt != getObjects()->end()) { Object* object = gWorldManager->getObjectById((*invObjectIt)); if (object&&object->hasInternalAttribute("insured")) { if (object->getInternalAttribute<bool>("insured")) { // Add the item to the insurance list. // Handle the list. if (object->hasAttribute("original_name")) { SortedInventoryItemList::iterator it = insuranceList->begin(); BString itemName((int8*)object->getAttribute<std::string>("original_name").c_str()); for (uint32 index = 0; index < insuranceList->size(); index++) { if (Anh_Utils::cmpistr(itemName.getAnsi(), (*it).first.getAnsi()) < 0) { break; } it++; } insuranceList->insert(it, std::make_pair(itemName,object->getId())); } } } invObjectIt++; } // Items equipped by the player. PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(this->getParentId())); if(!player) return; ObjectList* objList = player->getEquipManager()->getEquippedObjects(); ObjectList::iterator equippedObjectIt = objList->begin(); while (equippedObjectIt != objList->end()) { Object* object = (*equippedObjectIt); if (object->hasInternalAttribute("insured")) { if (object->getInternalAttribute<bool>("insured")) { // Add the item to the insurance list. // Handle the list. if (object->hasAttribute("original_name")) { SortedInventoryItemList::iterator it = insuranceList->begin(); BString itemName((int8*)object->getAttribute<std::string>("original_name").c_str()); for (uint32 index = 0; index < insuranceList->size(); index++) { if (Anh_Utils::cmpistr(itemName.getAnsi(), (*it).first.getAnsi()) < 0) { break; } it++; } insuranceList->insert(it, std::make_pair(itemName,object->getId())); } } } equippedObjectIt++; } delete objList; }
void ObjectController::destroyObject(uint64 objectId) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Datapad* datapad = playerObject->getDataPad(); Object* object = gWorldManager->getObjectById(objectId); //could be a schematic! ManufacturingSchematic* schem = datapad->getManufacturingSchematicById(objectId); if(schem != NULL) { //delete schematic datapad->removeManufacturingSchematic(objectId); //delete schematic object gObjectFactory->deleteObjectFromDB(schem); gMessageLib->sendDestroyObject(objectId,playerObject); return; } // could be a waypoint if(object == NULL) { object = datapad->getWaypointById(objectId); } // or something else if(object == NULL) { gLogger->log(LogManager::DEBUG,"ObjController::destroyObject: could not find object %"PRIu64"",objectId); return; } // waypoint if(object->getType() == ObjType_Waypoint) { // update our datapad if(!(datapad->removeWaypoint(objectId))) { gLogger->log(LogManager::DEBUG,"ObjController::handleDestroyObject: Error removing Waypoint from datapad %"PRIu64"",objectId); } gMessageLib->sendUpdateWaypoint(dynamic_cast<WaypointObject*>(object),ObjectUpdateDelete,playerObject); // delete from db gObjectFactory->deleteObjectFromDB(object); delete(object); } //Inangible Objects if(object->getType() == ObjType_Intangible) { //update the datapad if(!(datapad->removeData(objectId))) { gLogger->log(LogManager::DEBUG,"ObjController::handleDestroyObject: Error removing Data from datapad %"PRIu64"",objectId); } if(VehicleController* vehicle = dynamic_cast<VehicleController*>(object)) { vehicle->Store(); } gObjectFactory->deleteObjectFromDB(object); gMessageLib->sendDestroyObject(objectId,playerObject); delete(object); } // tangible else if(object->getType() == ObjType_Tangible) { TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); BuildingObject* building = dynamic_cast<BuildingObject*>(tangibleObject->getObjectMainParent(tangibleObject)); if(building) { if(!building->hasAdminRights(playerObject->getId())) { return; } } if(tangibleObject->getParentId() == 0) { return; } Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); // items if(Item* item = dynamic_cast<Item*>(tangibleObject)) { // handle any family specifics switch(item->getItemFamily()) { case ItemFamily_CraftingTools: _handleDestroyCraftingTool(dynamic_cast<CraftingTool*>(item)); break; case ItemFamily_Instrument: _handleDestroyInstrument(item); break; default: break; } // update the equiplist, if its an equipable item CreatureObject* creature = dynamic_cast<CreatureObject*>(gWorldManager->getObjectById(item->getParentId())); if(creature) { // remove from creatures slotmap creature->getEquipManager()->removeEquippedObject(object); //unequip it object->setParentId(inventory->getId()); gMessageLib->sendContainmentMessage_InRange(object->getId(),inventory->getId(),0xffffffff,creature); // send out the new equiplist gMessageLib->sendEquippedListUpdate_InRange(creature); } } //tangible includes items and resourcecontainers if(tangibleObject) { //if(tangible->getObjectMainParent(object) != inventory->getId()) if(tangibleObject->getKnownPlayers()->size()) { //this automatically destroys the object for the players in its vicinity tangibleObject->destroyKnownObjects(); } else { // destroy it for the player gMessageLib->sendDestroyObject(objectId,playerObject); } } // reset pending ui callbacks playerObject->resetUICallbacks(object); // delete from db CAVE :: mark if its an Object saved in the db!!!! // temporary placed instruments are not saved in the db gObjectFactory->deleteObjectFromDB(object); //it might be in a cell or in a container or in the inventory :) ObjectContainer* oc = dynamic_cast<ObjectContainer*>(gWorldManager->getObjectById(object->getParentId())); if(oc) { oc->deleteObject(object); } else { gWorldManager->destroyObject(object); } } }
void Instrument::prepareCustomRadialMenu(CreatureObject* player, uint8 itemCount) { // NOTE: player is also of type CreatureObject* !!! PlayerObject* playerObject = dynamic_cast<PlayerObject*>(player); mRadialMenu.reset(); mRadialMenu = RadialMenuPtr(new RadialMenu()); // RadialMenu* radial = new RadialMenu(); //string mInstrumentString = instrument->getName(); uint32 instrumentNr = this->getItemType(); if ((instrumentNr == ItemType_Nalargon) || (instrumentNr == ItemType_omni_box) || (instrumentNr == ItemType_nalargon_max_reebo)) { uint32 radId = 1; // We have to know if this is the real one or the copy. if (playerObject->getPlacedInstrumentId() == this->getId()) { // We are handling the copy if ((playerObject->getId() == this->getOwner()) && this->getPlaced()) { if ((playerObject->getPerformingState() == PlayerPerformance_Music)) { mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemUse,radAction_ObjCallback, "@radial_performance:stop_playing"); } else { mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemUse,radAction_ObjCallback, "@radial_performance:play_instrument"); } } else { // radial->addItem(radId++,0,radId_examine,radAction_Default); // radial->addItem(radId++,0,radId_itemPickup,radAction_Default); return; } mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_examine,radAction_Default); mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemPickup,radAction_Default); } else { // We may be handling the original instrument. Inventory* inventory = dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); if (inventory) { if (inventory->getId() == this->getParentId()) { // We have our real instrument in the inventory. // We can't drop if outside in the world. if (player->getParentId() == 0) { // Outside mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_examine,radAction_Default); mRadialMenu->addItem(static_cast<uint8>(radId),0,radId_itemDestroy, radAction_Default); } else { mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_examine,radAction_Default); mRadialMenu->addItem(static_cast<uint8>(radId),0,radId_itemDrop,radAction_Default); mRadialMenu->addItem(static_cast<uint8>(radId),0,radId_itemDestroy, radAction_Default); } if (playerObject->getPlacedInstrumentId() == 0) { // We do not have any other placed intrument out. mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemUse,radAction_ObjCallback,"Use"); } } else if (dynamic_cast<CellObject*>(gWorldManager->getObjectById(this->getParentId()))) { // It's either a original instrument, or someone else instrument, copy or original. // Time for some dirty... the original instrument does not have an owner. // Let's take advantage of that shortcoming. // Is this my instrument? if (this->getOwner() == player->getId()) { // Yes, are we handling the original instrument. // if (cell->getId() == this->getParentId()) { if ((playerObject->getPerformingState() == PlayerPerformance_Music)) { mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemUse,radAction_ObjCallback, "@radial_performance:stop_playing"); } else { mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemUse,radAction_ObjCallback, "@radial_performance:play_instrument"); } mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_examine,radAction_Default); mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_itemPickup,radAction_Default); } } else { // This is not my instrument. // gMessageLib->sendSystemMessage(playerObject,L"","error_message","insufficient_permissions"); mRadialMenu->addItem(static_cast<uint8>(radId++),0,radId_examine,radAction_Default); // radial->addItem(radId++,0,radId_itemPickup,radAction_Default); } } } } } // mRadialMenu = RadialMenuPtr(radial); // RadialMenuPtr radialPtr(radial); // mRadialMenu = radialPtr; }
//============================================================================= void BankTerminal::handleObjectMenuSelect(uint8 messageType, Object* srcObject) { PlayerObject* playerObject = (PlayerObject*)srcObject; switch(messageType) { case radId_bankDepositAll: // deposit all gTreasuryManager->bankDepositAll(playerObject); break; case radId_bankWithdrawAll: // withdraw all gTreasuryManager->bankWithdrawAll(playerObject); break; case radId_itemUse: case radId_bankTransfer: // deposit - withdraw gUIManager->createNewTransferBox(this,"handleDepositWithdraw", "@base_player:bank_title" ,"@base_player:bank_prompt", "Cash", "Bank" ,dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getCredits() ,dynamic_cast<Bank*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Bank))->getCredits() ,playerObject); break; case radId_bankItems: gTreasuryManager->bankOpenSafetyDepositContainer(playerObject); break; case radId_bankJoin: // join gTreasuryManager->bankJoin(playerObject); break; case radId_bankQuit: // quit gTreasuryManager->bankQuit(playerObject); break; default: gLogger->log(LogManager::NOTICE,"BankTerminal: Unhandled MenuSelect: %u", messageType); break; } }
void ObjectController::_handleGetAttributesBatch(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); BString requestStr; BStringVector dataElements; BStringVector dataElements2; uint16 elementCount; message->getStringUnicode16(requestStr); requestStr.convert(BSTRType_ANSI); requestStr.getRawData()[requestStr.getLength()] = 0; elementCount = requestStr.split(dataElements,' '); if(!elementCount) { return; } Message* newMessage; for(uint16 i = 0; i < elementCount; i++) { uint64 itemId = boost::lexical_cast<uint64>(dataElements[i].getAnsi()); Object* object = gWorldManager->getObjectById(itemId); if(object == NULL) { // could be a resource Resource* resource = gResourceManager->getResourceById(itemId); if(resource != NULL) { resource->sendAttributes(playerObject); continue; } //could be a schematic! Datapad* datapad = playerObject->getDataPad(); ManufacturingSchematic* schem = datapad->getManufacturingSchematicById(itemId); if(schem != NULL) { schem->sendAttributes(playerObject); continue; } MissionObject* mission = datapad->getMissionById(itemId); if(mission != NULL) { mission->sendAttributes(playerObject); continue; } IntangibleObject* data = datapad->getDataById(itemId); if(data != NULL) { data->sendAttributes(playerObject); continue; } // TODO: check our datapad items if(playerObject->isConnected()) { // default reply for schematics gMessageFactory->StartMessage(); gMessageFactory->addUint32(opAttributeListMessage); gMessageFactory->addUint64(itemId); gMessageFactory->addUint32(0); //gMessageFactory->addUint16(0); //gMessageFactory->addUint32(40); newMessage = gMessageFactory->EndMessage(); (playerObject->getClient())->SendChannelAUnreliable(newMessage, playerObject->getAccountId(), CR_Client, 8); } //finally, when we are crafting this could be the new item, not yet added to the worldmanager?? if(playerObject->getCraftingSession()) { if(playerObject->getCraftingSession()->getItem()&&playerObject->getCraftingSession()->getItem()->getId() == itemId) { playerObject->getCraftingSession()->getItem()->sendAttributes(playerObject); } } } else { // Tutorial: I (Eru) have to do some hacks here, since I don't know how to get the info of what object the client has selected (by single click) in the Inventory. if (gWorldConfig->isTutorial()) { // Let's see if the actual object is the food item "Melon" in our inventory. if (dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getId() == object->getParentId()) { //uint64 id = object->getId(); // Is it an Item? Item* item = dynamic_cast<Item*>(object); // Check if this item is a food item. if (item) { if (item->getItemFamily() == ItemFamily_Foods) { playerObject->getTutorial()->tutorialResponse("foodSelected"); } } } } object->sendAttributes(playerObject); } } }
//====================================================================================================================== // // update busy crafting tools, called every 2 seconds // bool WorldManager::_handleCraftToolTimers(uint64 callTime,void* ref) { CraftTools::iterator it = mBusyCraftTools.begin(); while(it != mBusyCraftTools.end()) { CraftingTool* tool = dynamic_cast<CraftingTool*>(getObjectById((*it))); if(!tool) { LOG(error) << "Missing crafting tool"; it = mBusyCraftTools.erase(it); continue; } PlayerObject* player = dynamic_cast<PlayerObject*>(getObjectById(tool->getParentId() - 1)); Item* item = tool->getCurrentItem(); if(player) { // we done, create the item if(!tool->updateTimer(callTime)) { // add it to the world, if it holds an item if(item) { Inventory* temp = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); if(!temp) continue; item->setParentId(temp->getId()); dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->addObject(item); gWorldManager->addObject(item,true); gMessageLib->sendCreateTano(item,player); gMessageLib->SendSystemMessage(::common::OutOfBand("system_msg", "prototype_transferred"), player); tool->setCurrentItem(NULL); } //in case of logout/in interplanetary travel it will be in the inventory already gMessageLib->sendUpdateTimer(tool,player); it = mBusyCraftTools.erase(it); tool->setAttribute("craft_tool_status","@crafting:tool_status_ready"); mDatabase->executeSqlAsync(0,0,"UPDATE %s.item_attributes SET value='@crafting:tool_status_ready' WHERE item_id=%" PRIu64 " AND attribute_id=18",mDatabase->galaxy(),tool->getId()); tool->setAttribute("craft_tool_time",boost::lexical_cast<std::string>(tool->getTimer())); gWorldManager->getDatabase()->executeSqlAsync(0,0,"UPDATE %s.item_attributes SET value='%i' WHERE item_id=%" PRIu64 " AND attribute_id=%u",mDatabase->galaxy(),tool->getId(),tool->getTimer(),AttrType_CraftToolTime); continue; } // update the time display gMessageLib->sendUpdateTimer(tool,player); tool->setAttribute("craft_tool_time",boost::lexical_cast<std::string>(tool->getTimer())); //gLogger->log(LogManager::DEBUG,"timer : %i",tool->getTimer()); mDatabase->executeSqlAsync(0,0,"UPDATE %s.item_attributes SET value='%i' WHERE item_id=%" PRIu64 " AND attribute_id=%u",mDatabase->galaxy(),tool->getId(),tool->getTimer(),AttrType_CraftToolTime); } ++it; } return(true); }
MissionObject* GroupManager::getZoneGroupMission(std::list<uint64>* members) { // we will iterate through all onZone groupmembers and compile a list of missions // we will find the mission nearest to the most players // and set the waypoints accordingly MissionObject* chosenMission = NULL; uint32 chosenRubberPoints = 0; if(!members->size()) return NULL; MissionGroupRangeList missionRangeList; //compile the missionlist Uint64List::iterator playerListIt = members->begin(); while(playerListIt != members->end()) { PlayerObject* groupMember = dynamic_cast<PlayerObject*> (gWorldManager->getObjectById((*playerListIt))); if(!groupMember) { playerListIt++; continue; } Datapad* datapad = dynamic_cast<Datapad*>(groupMember->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); MissionList* missionList = datapad->getMissions(); MissionList::iterator missionListIt = missionList->begin(); //add all Missions of the player to our List while(missionListIt != missionList->end()) { //the rubber point counter will be set to 0 initially missionRangeList.push_back(std::make_pair((*missionListIt),0)); missionListIt++; } playerListIt++; } //do we have missions in the first place ? if(!missionRangeList.size()) return NULL; //now iterate through all players and determine their nearest mission playerListIt = members->begin(); while(playerListIt != members->end()) { PlayerObject* groupMember = dynamic_cast<PlayerObject*> (gWorldManager->getObjectById((*playerListIt))); //now check for the nearest mission - increase its counter MissionGroupRangeList::iterator missionRangeListIt = missionRangeList.begin(); MissionGroupRangeList::iterator missionRangeListStorage = missionRangeList.begin(); while(missionRangeListIt != missionRangeList.end()) { MissionObject* nearestMission = NULL; float nearestDistance = 88000.0; MissionObject* currentMission = (*missionRangeListIt).first; float currentDistance = glm::distance(groupMember->mPosition, currentMission->getDestination().Coordinates); //store the nearest Mission if(currentDistance < nearestDistance) { nearestDistance = currentDistance; nearestMission = currentMission; //store the lists iterator for future reference missionRangeListStorage = missionRangeListIt; } missionRangeListIt++; } //now take the nearest Mission and give it a rubberpoint (*missionRangeListStorage).second++; //does our mission have enough rubberpoints? if((*missionRangeListStorage).second > (uint32)(members->size() /2)) { //jupp :) return (*missionRangeListStorage).first; } //remember the mission with the most rubberpoints anyway in case we dont have a clear winner if((*missionRangeListStorage).second > chosenRubberPoints) { chosenRubberPoints = (*missionRangeListStorage).second; chosenMission = (*missionRangeListStorage).first; } playerListIt++; } return chosenMission; }
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 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); }
void ObjectController::_handleResourceContainerTransfer(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); ResourceContainer* selectedContainer = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById(targetId)); if(selectedContainer) { string dataStr; message->getStringUnicode16(dataStr); dataStr.convert(BSTRType_ANSI); BStringVector dataElements; uint16 elementCount = dataStr.split(dataElements,' '); if(!elementCount) { gLogger->logMsg("ObjectController::_handleResourceContainerTransfer: Error in requestStr"); return; } ResourceContainer* targetContainer = dynamic_cast<ResourceContainer*>(gWorldManager->getObjectById(boost::lexical_cast<uint64>(dataElements[0].getAnsi()))); if(targetContainer && targetContainer->getResourceId() == selectedContainer->getResourceId()) { uint32 targetAmount = targetContainer->getAmount(); uint32 selectedAmount = selectedContainer->getAmount(); uint32 maxAmount = targetContainer->getMaxAmount(); uint32 newAmount; gLogger->logMsg("transfer resi"); // all fits if((newAmount = targetAmount + selectedAmount) <= maxAmount) { // update target container targetContainer->setAmount(newAmount); gMessageLib->sendResourceContainerUpdateAmount(targetContainer,playerObject); mDatabase->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",newAmount,targetContainer->getId()); // delete old container gMessageLib->sendDestroyObject(selectedContainer->getId(),playerObject); gObjectFactory->deleteObjectFromDB(selectedContainer); dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->deleteObject(selectedContainer); } // target container full, update both contents else if(newAmount > maxAmount) { uint32 selectedNewAmount = newAmount - maxAmount; targetContainer->setAmount(maxAmount); selectedContainer->setAmount(selectedNewAmount); gMessageLib->sendResourceContainerUpdateAmount(targetContainer,playerObject); gMessageLib->sendResourceContainerUpdateAmount(selectedContainer,playerObject); mDatabase->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",maxAmount,targetContainer->getId()); mDatabase->ExecuteSqlAsync(NULL,NULL,"UPDATE resource_containers SET amount=%u WHERE id=%"PRIu64"",selectedNewAmount,selectedContainer->getId()); } } } }
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; }
void ObjectController::destroyObject(uint64 objectId) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject); Datapad* datapad = dynamic_cast<Datapad*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); Object* object = gWorldManager->getObjectById(objectId); //could be a schematic! ManufacturingSchematic* schem = datapad->getManufacturingSchematicById(objectId); if(schem != NULL) { //delete schematic datapad->removeManufacturingSchematic(objectId); //delete schematic object gObjectFactory->deleteObjectFromDB(schem); gMessageLib->sendDestroyObject(objectId,playerObject); return; } // could be a waypoint if(object == NULL) { object = datapad->getWaypointById(objectId); } // or something else if(object == NULL) { gLogger->logMsgF("ObjController::destroyObject: could not find object %"PRIu64"",MSG_NORMAL,objectId); return; } // waypoint if(object->getType() == ObjType_Waypoint) { // update our datapad if(!(datapad->removeWaypoint(objectId))) { gLogger->logMsgF("ObjController::handleDestroyObject: Error removing Waypoint from datapad %"PRIu64"",MSG_NORMAL,objectId); } gMessageLib->sendUpdateWaypoint(dynamic_cast<WaypointObject*>(object),ObjectUpdateDelete,playerObject); // delete from db gObjectFactory->deleteObjectFromDB(object); delete(object); } //Inangible Objects if(object->getType() == ObjType_Intangible) { //update the datapad if(!(datapad->removeData(objectId))) { gLogger->logMsgF("ObjController::handleDestroyObject: Error removing Data from datapad %"PRIu64"",MSG_NORMAL,objectId); } if(Vehicle* vehicle = dynamic_cast<Vehicle*>(object)) { vehicle->store(); } gObjectFactory->deleteObjectFromDB(object); gMessageLib->sendDestroyObject(objectId,playerObject); } // tangible else if(object->getType() == ObjType_Tangible) { TangibleObject* tangibleObject = dynamic_cast<TangibleObject*>(object); // items if(Item* item = dynamic_cast<Item*>(tangibleObject)) { // Does the item have a owner? /* if (item->getOwner() != 0) { gLogger->logMsgF("ObjController::handleDestroyObject: OwnerId = %"PRIu64", playerId = %"PRIu64"", MSG_NORMAL, item->getOwner(), playerObject->getId()); // Yes, is it my item? if (item->getOwner() != playerObject->getId()) { // Not allowed to delete this item. gMessageLib->sendSystemMessage(playerObject,L"","error_message","insufficient_permissions"); return; } } */ // handle any family specifics switch(item->getItemFamily()) { case ItemFamily_CraftingTools: _handleDestroyCraftingTool(dynamic_cast<CraftingTool*>(item)); break; case ItemFamily_Instrument: _handleDestroyInstrument(item); break; default: break; } // destroy it for the player gMessageLib->sendDestroyObject(objectId,playerObject); // Also update the world...if the object is not private. if ((item->getParentId() != playerObject->getId()) && (item->getParentId() != dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getId())) { PlayerObjectSet* inRangePlayers = playerObject->getKnownPlayers(); PlayerObjectSet::iterator it = inRangePlayers->begin(); while(it != inRangePlayers->end()) { PlayerObject* targetObject = (*it); gMessageLib->sendDestroyObject(tangibleObject->getId(),targetObject); targetObject->removeKnownObject(tangibleObject); ++it; } tangibleObject->destroyKnownObjects(); } // update the equiplist, if its an equipable item CreatureObject* creature = dynamic_cast<CreatureObject*>(gWorldManager->getObjectById(item->getParentId())); if(creature) { // remove from creatures slotmap playerObject->getEquipManager()->removeEquippedObject(object); // send out the new equiplist gMessageLib->sendEquippedListUpdate_InRange(playerObject); // destroy it for players in range PlayerObjectSet* objList = playerObject->getKnownPlayers(); PlayerObjectSet::iterator it = objList->begin(); while(it != objList->end()) { gMessageLib->sendDestroyObject(objectId,(*it)); ++it; } } } else if(ResourceContainer* container = dynamic_cast<ResourceContainer*>(object)) { //gLogger->logMsg("destroy ressourcecontainer"); gMessageLib->sendDestroyObject(container->getId(),playerObject); } // reset pending ui callbacks playerObject->resetUICallbacks(object); // delete from db CAVE :: mark if its an Object saved in the db!!!! // temporary placed instruments are not saved in the db gObjectFactory->deleteObjectFromDB(object); // remove from inventory if(object->getParentId() == dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->getId()) { dynamic_cast<Inventory*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))->deleteObject(object); } // remove from world else { gWorldManager->destroyObject(object); } } }
void StructureManager::_HandleStructureRedeedCallBack(StructureManagerAsyncContainer* asynContainer,DatabaseResult* result) { PlayerStructure* structure = dynamic_cast<PlayerStructure*>(gWorldManager->getObjectById(asynContainer->mStructureId)); //if its a playerstructure boot all players and pets inside HouseObject* house = dynamic_cast<HouseObject*>(structure); if(house) { house->prepareDestruction(); } //destroy the structure here so the sf can still access the relevant data gObjectFactory->deleteObjectFromDB(structure); gMessageLib->sendDestroyObject_InRangeofObject(structure); gWorldManager->destroyObject(structure); PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asynContainer->mPlayerId)); uint64 deedId; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint64,0,8); uint64 count; count = result->getRowCount(); if (!count) { gLogger->logMsgLoadFailure("StructureManager::create deed no result...",MSG_NORMAL); mDatabase->DestroyDataBinding(binding); return; } result->GetNextRow(binding,&deedId); //return value of 0 means something wasnt found if(!deedId) { gLogger->logMsgF("StructureManager::create deed no valid return value...",MSG_NORMAL); mDatabase->DestroyDataBinding(binding); return; } //returnvalue of 1 means that there wasnt enough money on the deed if(deedId == 1) { gLogger->logMsgF("StructureManager::create deed with not enough maintenance...",MSG_NORMAL); gMessageLib->sendSysMsg(player, "player_structure","structure_destroyed "); mDatabase->DestroyDataBinding(binding); return; } if(player) { //load the deed into the inventory Inventory* inventory = dynamic_cast<Inventory*>(player->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory)); if(inventory) { //15 is itemfamily for deeds gObjectFactory->createIteminInventory(inventory,deedId,TanGroup_Item); } } UpdateCharacterLots(asynContainer->mPlayerId); mDatabase->DestroyDataBinding(binding); }
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; } } }