void Container::removeThing(Thing* thing, uint32_t count) { Item* item = thing->getItem(); if (item == nullptr) { return /*RETURNVALUE_NOTPOSSIBLE*/; } int32_t index = getThingIndex(thing); if (index == -1) { return /*RETURNVALUE_NOTPOSSIBLE*/; } if (item->isStackable() && count != item->getItemCount()) { uint8_t newCount = static_cast<uint8_t>(std::max<int32_t>(0, item->getItemCount() - count)); const int32_t oldWeight = item->getWeight(); item->setItemCount(newCount); updateItemWeight(-oldWeight + item->getWeight()); //send change to client if (getParent()) { onUpdateContainerItem(index, item, item); } } else { updateItemWeight(-static_cast<int32_t>(item->getWeight())); //send change to client if (getParent()) { onRemoveContainerItem(index, item); } item->setParent(nullptr); itemlist.erase(itemlist.begin() + index); } }
bool Container::unserializeItemNode(FileLoader& f, NODE node, PropStream& propStream) { if(!Item::unserializeItemNode(f, node, propStream)) return false; uint32_t type; for(NODE nodeItem = f.getChildNode(node, type); nodeItem; nodeItem = f.getNextNode(nodeItem, type)) { //load container items if(type != OTBM_ITEM) return false; PropStream itemPropStream; f.getProps(nodeItem, itemPropStream); Item* item = Item::CreateItem(itemPropStream); if(!item) return false; if(!item->unserializeItemNode(f, nodeItem, itemPropStream)) return false; addItem(item); updateItemWeight(item->getWeight()); } return true; }
bool Container::unserializeItemNode(OTB::Loader& loader, const OTB::Node& node, PropStream& propStream) { bool ret = Item::unserializeItemNode(loader, node, propStream); if (!ret) { return false; } for (auto& itemNode : node.children) { //load container items if (itemNode.type != OTBM_ITEM) { // unknown type return false; } PropStream itemPropStream; if (!loader.getProps(itemNode, itemPropStream)) { return false; } Item* item = Item::CreateItem(itemPropStream); if (!item) { return false; } if (!item->unserializeItemNode(loader, itemNode, itemPropStream)) { return false; } addItem(item); updateItemWeight(item->getWeight()); } return true; }
void Container::addItemBack(Item* item) { addItem(item); updateItemWeight(item->getWeight()); //send change to client if (getParent() && (getParent() != VirtualCylinder::virtualCylinder)) { onAddContainerItem(item); } }
void Container::internalAddThing(uint32_t, Thing* thing) { Item* item = thing->getItem(); if (item == nullptr) { return; } item->setParent(this); itemlist.push_front(item); updateItemWeight(item->getWeight()); }
void Container::__addThingBack(Thing* thing) { Item* item = thing->getItem(); if (item == nullptr) { return /*RETURNVALUE_NOTPOSSIBLE*/; } addItem(item); updateItemWeight(item->getWeight()); //send change to client if (getParent() && (getParent() != VirtualCylinder::virtualCylinder)) { onAddContainerItem(item); } }
void Container::addThing(int32_t index, Thing* thing) { if (index >= static_cast<int32_t>(capacity())) { return /*RETURNVALUE_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if (item == nullptr) { return /*RETURNVALUE_NOTPOSSIBLE*/; } item->setParent(this); itemlist.push_front(item); updateItemWeight(item->getWeight()); //send change to client if (getParent() && (getParent() != VirtualCylinder::virtualCylinder)) { onAddContainerItem(item); } }
void Container::updateThing(Thing* thing, uint16_t itemId, uint32_t count) { int32_t index = getThingIndex(thing); if (index == -1) { return /*RETURNVALUE_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if (item == nullptr) { return /*RETURNVALUE_NOTPOSSIBLE*/; } const int32_t oldWeight = item->getWeight(); item->setID(itemId); item->setSubType(count); updateItemWeight(-oldWeight + item->getWeight()); //send change to client if (getParent()) { onUpdateContainerItem(index, item, item); } }
void Container::replaceThing(uint32_t index, Thing* thing) { Item* item = thing->getItem(); if (!item) { return /*RETURNVALUE_NOTPOSSIBLE*/; } Item* replacedItem = getItemByIndex(index); if (!replacedItem) { return /*RETURNVALUE_NOTPOSSIBLE*/; } itemlist[index] = item; item->setParent(this); updateItemWeight(-static_cast<int32_t>(replacedItem->getWeight()) + item->getWeight()); //send change to client if (getParent()) { onUpdateContainerItem(index, replacedItem, item); } replacedItem->setParent(nullptr); }
bool Container::unserializeItemNode(FileLoader& f, NODE node, PropStream& propStream) { bool ret = Item::unserializeItemNode(f, node, propStream); if (!ret) { return false; } uint32_t type; NODE nodeItem = f.getChildNode(node, type); while (nodeItem) { //load container items if (type != OTBM_ITEM) { // unknown type return false; } PropStream itemPropStream; if (!f.getProps(nodeItem, itemPropStream)) { return false; } Item* item = Item::CreateItem(itemPropStream); if (!item) { return false; } if (!item->unserializeItemNode(f, nodeItem, itemPropStream)) { return false; } addItem(item); updateItemWeight(item->getWeight()); nodeItem = f.getNextNode(nodeItem, type); } return true; }