bool Container::viewItemNr(TYPE_OF_CONTAINERSLOTS nr, ScriptItem &item, Container *&cc) { auto it = items.find(nr); if (it != items.end()) { item = it->second; item.type = ScriptItem::it_container; item.itempos = nr; item.inside = this; if (item.isContainer()) { auto iterat = containers.find(nr); if (iterat != containers.end()) { cc = iterat->second; } else { cc = new Container(item.getId()); } } else { cc = nullptr; } return true; } else { items.erase(nr); cc = nullptr; return false; } }
void World::lookAtShowcaseItem(Player *cp, uint8_t showcase, unsigned char position) { ScriptItem titem; if (cp->isShowcaseOpen(showcase)) { Container *ps = cp->getShowcaseContainer(showcase); if (ps != nullptr) { Container *tc; if (ps->viewItemNr(position, titem, tc)) { std::shared_ptr<LuaItemScript> script = Data::CommonItems.script(titem.getId()); ScriptItem n_item = titem; n_item.type = ScriptItem::it_container; n_item.pos = cp->getPosition(); n_item.owner = cp; n_item.itempos = position; n_item.inside = ps; if (script && script->existsEntrypoint("LookAtItem")) { script->LookAtItem(cp, n_item); return; } lookAtItemScript->lookAtItem(cp, n_item); } } } }
bool World::erase(ScriptItem item, int amount) { if (amount > item.getNumber()) { amount = item.getNumber(); } if (item.type == ScriptItem::it_inventory || item.type == ScriptItem::it_belt) { //Wenn Item rechts belegt und links ein Belegt ist [Zweihanditem] das Belegt mit l�schen if (item.itempos == RIGHT_TOOL && (item.owner->GetItemAt(LEFT_TOOL)).getId() == BLOCKEDITEM) { item.owner->increaseAtPos(LEFT_TOOL, -255); } else if (item.itempos == LEFT_TOOL && (item.owner->GetItemAt(RIGHT_TOOL)).getId() == BLOCKEDITEM) { item.owner->increaseAtPos(RIGHT_TOOL, -255); } item.owner->increaseAtPos(item.itempos, -amount); return true; } //Item befindet sich auf einen Feld am Boden liegend. else if (item.type == ScriptItem::it_field) { try { Field &field = fieldAt(item.pos); bool erased=false; field.increaseItemOnStack(-amount, erased); if (erased) { sendRemoveItemFromMapToAllVisibleCharacters(item.pos); } else { sendSwapItemOnMapToAllVisibleCharacter(item.getId(), item.pos, item); } return true; } catch (FieldNotFound &) { logMissingField("erase", item.pos); return false; } } else if (item.type == ScriptItem::it_container) { if (item.inside) { item.inside->increaseAtPos(item.itempos, -amount); sendContainerSlotChange(item.inside, item.itempos); return true; } else { return false; } } return false; }
bool World::changeItem(ScriptItem item) { if (item.type == ScriptItem::it_inventory || item.type == ScriptItem::it_belt) { item.owner->items[ item.itempos ] = (Item)item; //Wenn character ein Spieler ist ein update schicken if (item.owner->getType() == Character::player) { dynamic_cast<Player *>(item.owner)->sendCharacterItemAtPos(item.itempos); } item.owner->updateAppearanceForAll(true); return true; } else if (item.type == ScriptItem::it_field) { try { Field &field = fieldAt(item.pos); Item it; if (field.takeItemFromStack(it)) { field.addItemOnStack(static_cast<Item>(item)); if (item.getId() != it.getId() || it.getNumber() != item.getNumber()) { sendSwapItemOnMapToAllVisibleCharacter(it.getId(), item.pos, item); } } return true; } catch (FieldNotFound &) { return false; } } else if (item.type == ScriptItem::it_container) { if (item.inside) { item.inside->changeItem(item); sendContainerSlotChange(item.inside, item.itempos); return true; } } return false; }
ItemStruct World::getItemStats(ScriptItem item) { const auto &data = Data::Items[item.getId()]; return data; }