bool CraftingManager::HandleCreatePrototype(Object* object, Object* target,Message* message, ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(object); CraftingSession* session = player->getCraftingSession(); BString dataStr; uint32 mode,counter; if(!session) return false; message->getStringUnicode16(dataStr); if(swscanf(dataStr.getUnicode16(),L"%u %u",&counter,&mode) != 2) { gCraftingSessionFactory->destroySession(player->getCraftingSession()); return false; } session->createPrototype(mode,counter); return true; }
bool CraftingManager::HandleCreateManufactureSchematic(Object* object, Object* target,Message* message, ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(object); CraftingSession* session = player->getCraftingSession(); BString dataStr; uint32 counter; if(!session) return false; message->getStringUnicode16(dataStr); if(swscanf(dataStr.getUnicode16(),L"%u",&counter) != 1) { gCraftingSessionFactory->destroySession(player->getCraftingSession()); return false; } //gLogger->hexDump(message->getData(),message->getSize()); session->createManufactureSchematic(counter); return true; }
bool CraftingManager::HandleCancelCraftingSession(Object* object,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(object); message->setIndex(24); /*uint32 counter = */ message->getUint32(); gCraftingSessionFactory->destroySession(playerObject->getCraftingSession()); //client complains over crafting tool already having an item when we go out of the slot screen!!!!! return true; }
void CraftingManager::handleCraftExperiment(Object* object, Message* message) { PlayerObject* player = dynamic_cast<PlayerObject*>(object); CraftingSession* session = player->getCraftingSession(); uint8 counter = message->getUint8(); uint32 propCount = message->getUint32(); std::vector<std::pair<uint32,uint32> > properties; if(!session || player->getCraftingStage() != 3) return; for(uint32 i = 0; i < propCount; i++) properties.push_back(std::make_pair(message->getUint32(),message->getUint32())); session->experiment(counter,properties); }
void CraftingManager::handleCraftCustomization(Object* object,Message* message) { PlayerObject* player = dynamic_cast<PlayerObject*>(object); CraftingSession* session = player->getCraftingSession(); BString itemName; uint8 hmmm1,hmmm2; uint32 amount,color; if(!session) return; player->setCraftingStage(4); message->getStringUnicode16(itemName); itemName.convert(BSTRType_ANSI); message->getUint8(hmmm1); message->getUint32(amount); message->getUint8(hmmm2); CustomizationList* cList; cList = session->getManufacturingSchematic()->getCustomizationList(); CustomizationList::iterator custIt = cList->begin(); uint32 i = 0; while((custIt != cList->end())&&(i < hmmm2)) { message->getUint32(color); message->getUint32(color); session->getItem()->setCustomization(static_cast<uint8>((*custIt)->cutomizationIndex),(uint16)color,3); i++; ++custIt; } int8 sql[550]; sprintf(sql, "INSERT INTO item_customization VALUES (%"PRIu64", %u, %u)",session->getItem()->getId(), session->getItem()->getCustomization(1), session->getItem()->getCustomization(2)); mDatabase->executeAsyncSql(sql); session->setProductionAmount(amount); session->customize(itemName.getAnsi()); }
void CraftingManager::handleCraftEmptySlot(Object* object,Message* message) { PlayerObject* player = dynamic_cast<PlayerObject*>(object); CraftingSession* session = player->getCraftingSession(); uint32 slotId = message->getUint32(); uint64 containerId = message->getUint64(); uint8 counter = message->getUint8(); // make sure we have a valid session and are in the assembly stage if(session && player->getCraftingStage() == 2) { session->handleEmptySlot(slotId,containerId,counter); } // it failed else { gMessageLib->sendCraftAcknowledge(opCraftEmptySlot,CraftError_Not_In_Assembly_Stage,counter,player); } }
bool CraftingManager::HandleSelectDraftSchematic(Object* object,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(object); CraftingSession* session = playerObject->getCraftingSession(); //DraftSchematic* schematic = NULL; BString dataStr; uint32 schematicIndex = 0; message->getStringUnicode16(dataStr); if(session) { if(swscanf(dataStr.getUnicode16(),L"%u",&schematicIndex) != 1 || !session->selectDraftSchematic(schematicIndex)) { gCraftingSessionFactory->destroySession(session); } } return true; }
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); } } }
bool CraftingManager::HandleNextCraftingStage(Object* object, Object* target,Message* message, ObjectControllerCmdProperties* cmdProperties) { PlayerObject* playerObject = dynamic_cast<PlayerObject*>(object); CraftingSession* session = playerObject->getCraftingSession(); BString dataStr; uint32 counter = 1; if(!session) return false; message->getStringUnicode16(dataStr); if(dataStr.getLength() == 0) { //Command Line Entry counter = session->getCounter(); } else { uint32 resultCount = swscanf(dataStr.getUnicode16(),L"%u",&counter); if(resultCount != 1) { gCraftingSessionFactory->destroySession(session); return false; } } switch(session->getStage()) { case 1: { //Player's Macro is wrong! :p } break; case 2: { session->assemble(counter); } break; case 3: { session->experimentationStage(counter); } break; case 4: { session->customizationStage(counter); //session->creationStage(counter); } break; case 5: { session->creationStage(counter); } break; default: { } break; } return true; }