void Tile::removeThing(Thing* thing, uint32_t count) { Creature* creature = thing->getCreature(); if (creature) { CreatureVector* creatures = getCreatures(); if (creatures) { CreatureVector::iterator it = std::find(creatures->begin(), creatures->end(), thing); if (it != creatures->end()) { g_game.map.clearSpectatorCache(); creatures->erase(it); } } return; } Item* item = thing->getItem(); if (!item) { return; } int32_t index = getThingIndex(item); if (index == -1) { return; } if (item == ground) { ground->setParent(nullptr); ground = nullptr; SpectatorVec list; g_game.map.getSpectators(list, getPosition(), true); onRemoveTileItem(list, std::vector<int32_t>(list.size(), 0), item); return; } TileItemVector* items = getItemList(); if (!items) { return; } const ItemType& itemType = Item::items[item->getID()]; if (itemType.alwaysOnTop) { auto it = std::find(items->getBeginTopItem(), items->getEndTopItem(), item); if (it == items->getEndTopItem()) { return; } std::vector<int32_t> oldStackPosVector; SpectatorVec list; g_game.map.getSpectators(list, getPosition(), true); for (Creature* spectator : list) { if (Player* tmpPlayer = spectator->getPlayer()) { oldStackPosVector.push_back(getStackposOfItem(tmpPlayer, item)); } } item->setParent(nullptr); items->erase(it); onRemoveTileItem(list, oldStackPosVector, item); } else { auto it = std::find(items->getBeginDownItem(), items->getEndDownItem(), item); if (it == items->getEndDownItem()) { return; } if (itemType.stackable && count != item->getItemCount()) { uint8_t newCount = static_cast<uint8_t>(std::max<int32_t>(0, static_cast<int32_t>(item->getItemCount() - count))); item->setItemCount(newCount); onUpdateTileItem(item, itemType, item, itemType); } else { std::vector<int32_t> oldStackPosVector; SpectatorVec list; g_game.map.getSpectators(list, getPosition(), true); for (Creature* spectator : list) { if (Player* tmpPlayer = spectator->getPlayer()) { oldStackPosVector.push_back(getStackposOfItem(tmpPlayer, item)); } } item->setParent(nullptr); items->erase(it); items->addDownItemCount(-1); onRemoveTileItem(list, oldStackPosVector, item); } } }
void Tile::__removeThing(Thing* thing, uint32_t count) { Creature* creature = thing->getCreature(); if(creature){ CreatureVector::iterator it = std::find(creatures.begin(), creatures.end(), thing); if(it == creatures.end()){ #ifdef __DEBUG__MOVESYS__ std::cout << "Failure: [Tile::__removeThing] creature not found" << std::endl; int *a = NULL; *a = 1; #endif return; //RET_NOTPOSSIBLE; } creatures.erase(it); return; } else{ Item* item = thing->getItem(); if(item == NULL){ #ifdef __DEBUG__MOVESYS__ std::cout << "Failure: [Tile::__removeThing] item == NULL" << std::endl; int *a = NULL; *a = 1; #endif return /*RET_NOTPOSSIBLE*/; } uint32_t index = __getIndexOfThing(item); if(index == -1){ #ifdef __DEBUG__MOVESYS__ std::cout << "Failure: [Tile::__removeThing] index == -1" << std::endl; int *a = NULL; *a = 1; #endif return /*RET_NOTPOSSIBLE*/; } if(item == ground){ onRemoveTileItem(index, item); ground->setParent(NULL); ground = NULL; return /*RET_NOERROR*/; } ItemVector::iterator iit; if(item->isAlwaysOnTop()){ for(iit = topItems.begin(); iit != topItems.end(); ++iit){ if(*iit == item){ onRemoveTileItem(index, item); (*iit)->setParent(NULL); topItems.erase(iit); return /*RET_NOERROR*/; } } } else{ for (iit = downItems.begin(); iit != downItems.end(); ++iit){ if(*iit == item){ if(item->isStackable() && count != item->getItemCount()){ int newCount = std::max(0, (int)(item->getItemCount() - count)); item->setItemCount(newCount); onUpdateTileItem(index, item, item); } else { onRemoveTileItem(index, item); (*iit)->setParent(NULL); downItems.erase(iit); } return /*RET_NOERROR*/; } } } } #ifdef __DEBUG__MOVESYS__ std::cout << "Failure: [Tile::__removeThing] thing not found" << std::endl; int *a = NULL; *a = 1; #endif }
void Tile::__removeThing(Thing* thing, uint32_t count) { Creature* creature = thing->getCreature(); if (creature) { CreatureVector* creatures = getCreatures(); if (creatures) { CreatureVector::iterator it = std::find(creatures->begin(), creatures->end(), thing); if (it != creatures->end()) { g_game.clearSpectatorCache(); creatures->erase(it); } } return; } Item* item = thing->getItem(); if (item) { int32_t index = __getIndexOfThing(item); if (index == -1) { return; } if (item == ground) { const SpectatorVec& list = g_game.getSpectators(getPosition()); std::vector<uint32_t> oldStackPosVector; for (SpectatorVec::const_iterator it = list.begin(), end = list.end(); it != end; ++it) { if (Player* tmpPlayer = (*it)->getPlayer()) { oldStackPosVector.push_back(getClientIndexOfThing(tmpPlayer, ground)); } } ground->setParent(NULL); ground = NULL; onRemoveTileItem(list, oldStackPosVector, item); return; } if (item->isAlwaysOnTop()) { TileItemVector* items = getItemList(); if (items) { for (ItemVector::iterator it = items->getBeginTopItem(); it != items->getEndTopItem(); ++it) { if (*it == item) { const SpectatorVec& list = g_game.getSpectators(getPosition()); std::vector<uint32_t> oldStackPosVector; for (SpectatorVec::const_iterator iit = list.begin(), iend = list.end(); iit != iend; ++iit) { if (Player* tmpPlayer = (*iit)->getPlayer()) { oldStackPosVector.push_back(getClientIndexOfThing(tmpPlayer, *it)); } } (*it)->setParent(NULL); items->erase(it); onRemoveTileItem(list, oldStackPosVector, item); return; } } } } else { TileItemVector* items = getItemList(); if (items) { for (ItemVector::iterator it = items->getBeginDownItem(); it != items->getEndDownItem(); ++it) { if (*it == item) { if (item->isStackable() && count != item->getItemCount()) { uint8_t newCount = (uint8_t)std::max<int32_t>(0, (int32_t)(item->getItemCount() - count)); updateTileFlags(item, true); item->setItemCount(newCount); updateTileFlags(item, false); const ItemType& it = Item::items[item->getID()]; onUpdateTileItem(item, it, item, it); } else { const SpectatorVec& list = g_game.getSpectators(getPosition()); std::vector<uint32_t> oldStackPosVector; for (SpectatorVec::const_iterator iit = list.begin(), iend = list.end(); iit != iend; ++iit) { if (Player* tmpPlayer = (*iit)->getPlayer()) { oldStackPosVector.push_back(getClientIndexOfThing(tmpPlayer, *it)); } } (*it)->setParent(NULL); items->erase(it); --items->downItemCount; onRemoveTileItem(list, oldStackPosVector, item); } return; } } } } } }
void Tile::__removeThing(Thing* thing, uint32_t count) { Creature* creature = thing->getCreature(); if(creature) { if(CreatureVector* creatures = getCreatures()) { CreatureVector::iterator it = std::find(creatures->begin(), creatures->end(), thing); if(it == creatures->end()) { #ifdef __DEBUG_MOVESYS__ std::clog << "[Failure - Tile::__removeThing] creature not found" << std::endl; #endif return/* RET_NOTPOSSIBLE*/; } g_game.clearSpectatorCache(); creatures->erase(it); --thingCount; } #ifdef __DEBUG_MOVESYS__ else std::clog << "[Failure - Tile::__removeThing] creature not found" << std::endl; #endif return; } Item* item = thing->getItem(); if(!item) { #ifdef __DEBUG_MOVESYS__ std::clog << "[Failure - Tile::__removeThing] item == NULL" << std::endl; #endif return/* RET_NOTPOSSIBLE*/; } int32_t index = __getIndexOfThing(item); if(index == -1) { #ifdef __DEBUG_MOVESYS__ std::clog << "[Failure - Tile::__removeThing] index == -1" << std::endl; #endif return/* RET_NOTPOSSIBLE*/; } if(item == ground) { const SpectatorVec& list = g_game.getSpectators(pos); std::vector<int32_t> oldStackposVector; Player* tmpPlayer = NULL; for(SpectatorVec::const_iterator it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer())) oldStackposVector.push_back(getClientIndexOfThing(tmpPlayer, ground)); } #ifdef __GROUND_CACHE__ std::map<Item*, int32_t>::iterator it = g_game.grounds.find(ground); bool erase = it == g_game.grounds.end(); if(!erase) { it->second--; erase = it->second < 1; if(erase) g_game.grounds.erase(it); } if(erase) { #endif ground->setParent(NULL); g_game.freeThing(ground); #ifdef __GROUND_CACHE__ } #endif ground = NULL; --thingCount; onRemoveTileItem(list, oldStackposVector, item); return/* RET_NOERROR*/; } TileItemVector* items = getItemList(); if(!items) return; if(item->isAlwaysOnTop()) { ItemVector::iterator it = std::find(items->getBeginTopItem(), items->getEndTopItem(), item); if(it != items->end()) { const SpectatorVec& list = g_game.getSpectators(pos); std::vector<int32_t> oldStackposVector; Player* tmpPlayer = NULL; for(SpectatorVec::const_iterator iit = list.begin(); iit != list.end(); ++iit) { if((tmpPlayer = (*iit)->getPlayer())) oldStackposVector.push_back(getClientIndexOfThing(tmpPlayer, item)); } item->setParent(NULL); items->erase(it); --thingCount; onRemoveTileItem(list, oldStackposVector, item); return/* RET_NOERROR*/; } } else { ItemVector::iterator it = std::find(items->getBeginDownItem(), items->getEndDownItem(), item); if(it != items->end()) { if(item->isStackable() && count != item->getItemCount()) { uint8_t newCount = (uint8_t)std::max((int32_t)0, (int32_t)(item->getItemCount() - count)); updateTileFlags(item, true); item->setItemCount(newCount); updateTileFlags(item, false); const ItemType& it = Item::items[item->getID()]; onUpdateTileItem(item, it, item, it); } else { const SpectatorVec& list = g_game.getSpectators(pos); std::vector<int32_t> oldStackposVector; Player* tmpPlayer = NULL; for(SpectatorVec::const_iterator iit = list.begin(); iit != list.end(); ++iit) { if((tmpPlayer = (*iit)->getPlayer())) oldStackposVector.push_back(getClientIndexOfThing(tmpPlayer, item)); } item->setParent(NULL); items->erase(it); --items->downItemCount; --thingCount; onRemoveTileItem(list, oldStackposVector, item); } return/* RET_NOERROR*/; } } #ifdef __DEBUG_MOVESYS__ std::clog << "[Failure - Tile::__removeThing] thing not found" << std::endl; #endif }