bool Item::CanBeTraded(bool mail) const { if (m_lootGenerated) return false; if(!mail && IsBoundAccountWide()) // Dirty hack, because trade window is closing return false; if ((!mail || !IsBoundAccountWide()) && IsSoulBound()) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) ) return false; if (Player* owner = GetOwner()) { if (owner->CanUnequipItem(GetPos(),false) != EQUIP_ERR_OK ) return false; if (owner->GetLootGUID()==GetGUID()) return false; } if (IsBoundByEnchant()) return false; return true; }
bool Item::CanBeTraded(bool mail, bool trade) const { // Xinef: little protection if (m_lootGenerated) return false; if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_BOP_TRADEABLE) || !trade))) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty())) return false; if (Player* owner = GetOwner()) { if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK) return false; // Xinef: check if item is looted now if (owner->GetLootGUID() == GetGUID()) return false; } if (IsBoundByTempEnchant()) // pussywizard return false; if ((!mail || !IsBoundAccountWide()) && IsBoundByEnchant()) return false; return true; }
bool Item::CanBeTraded(bool mail, bool trade) const { if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_BOP_TRADEABLE) || !trade))) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) ) return false; if (Player* owner = GetOwner()) { if (owner->CanUnequipItem(GetPos(),false) != EQUIP_ERR_OK ) return false; if (owner->GetLootGUID()==GetGUID()) return false; } if (HasGeneratedLoot()) return false; if (IsBoundByEnchant()) return false; return true; }
void Store::IdentifyItem(CREItem *item) const { if ((item->Flags & IE_INV_ITEM_IDENTIFIED) || IsBag()) { return; } Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) { return; } if (itm->LoreToID <= Lore) { item->Flags |= IE_INV_ITEM_IDENTIFIED; } gamedata->FreeItem(itm, item->ItemResRef, 0); }
bool Item::CanBeTraded() const { if (IsSoulBound()) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) ) return false; if (Player* owner = GetOwner()) { if (owner->CanUnequipItem(GetPos(),false) != EQUIP_ERR_OK ) return false; if (owner->GetLootGUID()==GetGUID()) return false; } if (IsBoundByEnchant()) return false; return true; }
//some stores can recharge items - in original engine apparently all stores //did this. In gemrb there is a flag. void Store::RechargeItem(CREItem *item) { Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) { return; } //gemrb extension, some shops won't recharge items //containers' behaviour is inverted //bag 0 1 0 1 //flag 0 0 1 1 //recharge 1 0 0 1 if (IsBag() != !(Flags&IE_STORE_RECHARGE)) { bool feature = core->HasFeature(GF_SHOP_RECHARGE); for (int i=0;i<CHARGE_COUNTERS;i++) { ITMExtHeader *h = itm->GetExtHeader(i); if (h && (feature || h->RechargeFlags&IE_ITEM_RECHARGE) && item->Usages[i] < h->Charges) item->Usages[i] = h->Charges; } } gamedata->FreeItem(itm, item->ItemResRef, 0); }
bool Item::CanBeTraded(bool mail) const { if ((!mail || !IsBoundAccountWide()) && IsSoulBound()) return false; if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty())) return false; if (Player* owner = GetOwner()) { if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK) return false; if (owner->GetLootGuid() == GetObjectGuid()) return false; } if (HasGeneratedLoot()) return false; if (IsBoundByEnchant()) return false; return true; }
Bag* Item::ToBag() { return (IsBag() ? dynamic_cast<Bag* >(this) : nullptr); }