int CognitiveMapRouter::FindExit(Pedestrian * p) { //check for former goal. if((*cm_storage)[p]->GetGraphNetwork()->HadNoDestination()) { sensor_manager->execute(p, SensorManager::INIT); } //Check if the Pedestrian already has a Dest. or changed subroom and needs a new one. if((*cm_storage)[p]->GetGraphNetwork()->ChangedSubRoom()) { //execute periodical sensors sensor_manager->execute(p, SensorManager::CHANGED_ROOM); int status = FindDestination(p); (*cm_storage)[p]->GetGraphNetwork()->UpdateSubRoom(); return status; } //std::cout << p->GetGlobalTime() << std::endl; if (std::fmod(p->GetGlobalTime(),sensor_manager->GetIntVPeriodicUpdate())==0.0 && p->GetGlobalTime()>0) { //Log->Write(std::to_string(p->GetGlobalTime())); sensor_manager->execute(p, SensorManager::PERIODIC); int status = FindDestination(p); //(*cm_storage)[p]->UpdateSubRoom(); return status; } return 1; }
bool ItemMover::LoadInventory(UnitAny *unit, int xpac, int source, int sourceX, int sourceY, bool shiftState, bool ctrlState, int stashUI, int invUI) { bool returnValue = false; memset(InventoryItemIds, 0, INVENTORY_WIDTH * INVENTORY_HEIGHT * sizeof(int)); memset(StashItemIds, 0, STASH_WIDTH * LOD_STASH_HEIGHT * sizeof(int)); memset(CubeItemIds, 0, CUBE_WIDTH * CUBE_HEIGHT * sizeof(int)); if (!xpac) { for (int x = 0; x < STASH_WIDTH; x++) { for (int y = CLASSIC_STASH_HEIGHT; y < LOD_STASH_HEIGHT; y++) { StashItemIds[y*STASH_WIDTH + x] = -1; } } } unsigned int itemId = 0; BYTE itemXSize, itemYSize; bool cubeInInventory = false, cubeAnywhere = false; for (UnitAny *pItem = unit->pInventory->pFirstItem; pItem; pItem = pItem->pItemData->pNextInvItem) { int *p, width; if (pItem->pItemData->ItemLocation == STORAGE_INVENTORY) { p = InventoryItemIds; width = INVENTORY_WIDTH; } else if (pItem->pItemData->ItemLocation == STORAGE_STASH) { p = StashItemIds; width = STASH_WIDTH; } else if (pItem->pItemData->ItemLocation == STORAGE_CUBE) { p = CubeItemIds; width = CUBE_WIDTH; } else { continue; } bool box = false; char *code = D2COMMON_GetItemText(pItem->dwTxtFileNo)->szCode; if (code[0] == 'b' && code[1] == 'o' && code[2] == 'x') { if (pItem->pItemData->ItemLocation == STORAGE_INVENTORY) { cubeInInventory = true; cubeAnywhere = true; } if (pItem->pItemData->ItemLocation == STORAGE_STASH) { cubeAnywhere = true; } box = true; } int xStart = pItem->pObjectPath->dwPosX; int yStart = pItem->pObjectPath->dwPosY; BYTE xSize = D2COMMON_GetItemText(pItem->dwTxtFileNo)->xSize; BYTE ySize = D2COMMON_GetItemText(pItem->dwTxtFileNo)->ySize; for (int x = xStart; x < xStart + xSize; x++) { for (int y = yStart; y < yStart + ySize; y++) { p[y*width + x] = pItem->dwUnitId; // If you click to move the cube into itself, your character ends up in // the amusing (and apparently permanent) state where he has no visible // cube and yet is unable to pick one up. Logging out does not fix it. // So we disable all cube movements to be on the safe side. if (x == sourceX && y == sourceY && pItem->pItemData->ItemLocation == source && !box) { // This is the item we want to move itemId = pItem->dwUnitId; itemXSize = xSize; itemYSize = ySize; } } } } int destination; if (ctrlState && shiftState && ((stashUI && cubeAnywhere) || (invUI && cubeInInventory)) && source != STORAGE_CUBE) { destination = STORAGE_CUBE; } else if (ctrlState) { destination = STORAGE_NULL; // i.e. the ground } else if (source == STORAGE_STASH || source == STORAGE_CUBE) { destination = STORAGE_INVENTORY; } else if (source == STORAGE_INVENTORY && D2CLIENT_GetUIState(UI_STASH)) { destination = STORAGE_STASH; } else if (source == STORAGE_INVENTORY && D2CLIENT_GetUIState(UI_CUBE)) { destination = STORAGE_CUBE; } else { return false; } // Find a spot for the item in the destination container if (itemId > 0) { returnValue = FindDestination(xpac, destination, itemId, itemXSize, itemYSize); } FirstInit = true; return returnValue; }