void World::changeQuality(ScriptItem item, short int amount) { short int tmpQuality = ((amount+item.getDurability())<100) ? (amount + item.getQuality()) : (item.getQuality() - item.getDurability() + 99); if (tmpQuality%100 > 0) { item.setQuality(tmpQuality); changeItem(item); } else { erase(item, item.getNumber()); } }
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; }