void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; //DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { uint32 itemId = this->GetEntry(); owner->DestroyItem(GetBagSlot(), GetSlot(), true); if (itemId == 39878) //Mysterious Egg { if (Item* Item = owner->StoreNewItemInInventorySlot(39883, 1)) owner->SendNewItem(Item, 1, true, false); } if (itemId == 44717) //Disgusting Jar { if (Item* Item = owner->StoreNewItemInInventorySlot(44718, 1)) owner->SendNewItem(Item, 1, true, false); } return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; //DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { owner->DestroyItem(GetBagSlot(), GetSlot(), true); //Some items with duration create new item after expire if((GetProto()->ExtraFlags & ITEM_EXTRA_CREATE_ITEM_ON_EXPIRE) && !loot.empty()) { for(LootItemList::iterator itr = loot.items.begin(); itr != loot.items.end(); ++itr) { if (Item* Item = owner->StoreNewItemInInventorySlot((*itr).itemid, (*itr).count)) owner->SendNewItem(Item,(*itr).count, true, false); } } return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database //Remove refundable flag for next time if item is no logner refundable if(HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_REFUNDABLE)) if(!GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) || (GetOwner() && GetOwner()->m_Played_time[0] > (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2*60*60))) RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_REFUNDABLE); }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; //DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { owner->DestroyItem(GetBagSlot(), GetSlot(), true); owner->HandleDestroyItemReplace(GetEntry(), GetBagSlot(), GetSlot(), GetPos()); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
std::string Item::GetDebugInfo() const { std::stringstream sstr; sstr << Object::GetDebugInfo() << "\n" << std::boolalpha << "Owner: " << GetOwnerGUID().ToString() << " Count: " << GetCount() << " BagSlot: " << std::to_string(GetBagSlot()) << " Slot: " << std::to_string(GetSlot()) << " Equipped: " << IsEquipped(); return sstr.str(); }
Bag::~Bag() { for (uint8 i = 0; i < MAX_BAG_SIZE; ++i) if (Item *item = m_bagslot[i]) { if (item->IsInWorld()) { sLog->outCrash( "Item %u (slot %u, bag slot %u) in bag %u (slot %u, bag slot %u, m_bagslot %u) is to be deleted but is still in world.", item->GetEntry(), (uint32) item->GetSlot(), (uint32) item->GetBagSlot(), GetEntry(), (uint32) GetSlot(), (uint32) GetBagSlot(), (uint32) i); item->RemoveFromWorld(); } delete m_bagslot[i]; } }
Bag::~Bag() { for (uint8 i = 0; i < MAX_BAG_SIZE; ++i) if (Item* item = m_bagslot[i]) { if (item->IsInWorld()) { TC_LOG_FATAL("entities.player.items", "Item %u (slot %u, bag slot %u) in bag %u (slot %u, bag slot %u, m_bagslot %u) is to be deleted but is still in world.", item->GetEntry(), (uint32)item->GetSlot(), (uint32)item->GetBagSlot(), GetEntry(), (uint32)GetSlot(), (uint32)GetBagSlot(), (uint32)i); item->RemoveFromWorld(); } delete m_bagslot[i]; } }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; sLog.outDebug("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; sLog->outDebug(LOG_FILTER_PLAYER_ITEMS, "Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff); if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff) { sScriptMgr->OnItemExpire(owner, GetTemplate()); owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; TC_LOG_DEBUG("entities.player.items", "Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff); if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff) { sScriptMgr->OnItemExpire(owner, GetTemplate()); owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; // DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff); if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff) { // used by eluna sHookMgr.OnExpire(owner, GetProto()); owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; // DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff); if (GetUInt32Value(ITEM_FIELD_DURATION) <= diff) { if (uint32 newItemId = sObjectMgr.GetItemExpireConvert(GetEntry())) owner->ConvertItem(this, newItemId); else owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; sLog.outDebug("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { uint32 itemId = this->GetEntry(); Script->ItemExpire(owner, GetProto()); owner->DestroyItem(GetBagSlot(), GetSlot(), true); ItemPosCountVec dest; if (itemId == 39878) //Mysterious Egg { uint8 msg = owner->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 39883, 1); if (msg == EQUIP_ERR_OK) { Item* item = owner->StoreNewItem(dest,39883,true); if (item) owner->SendNewItem(item,1,false,true); } } if (itemId == 44717) //Disgusting Jar { uint8 msg = owner->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 44718, 1); if (msg == EQUIP_ERR_OK) { Item* item = owner->StoreNewItem(dest,44718,true); if (item) owner->SendNewItem(item,1,false,true); } } return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database }
void Item::UpdateDuration(Player* owner, uint32 diff) { if (!GetUInt32Value(ITEM_FIELD_DURATION)) return; //DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)",GetEntry(),GetUInt32Value(ITEM_FIELD_DURATION),diff); if (GetUInt32Value(ITEM_FIELD_DURATION)<=diff) { owner->DestroyItem(GetBagSlot(), GetSlot(), true); return; } SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff); SetState(ITEM_CHANGED, owner); // save new time in database //Remove refundable flag for next time if item is no logner refundable if(HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_REFUNDABLE)) if(!GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) || (GetOwner() && GetOwner()->m_Played_time[0] > (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2*60*60))) RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_REFUNDABLE); }
bool Item::ItemContainerLoadLootFromDB() { // Loads the money and item loot associated with an openable item from the DB // Default. If there are no records for this item then it will be rolled for in Player::SendLoot() m_lootGenerated = false; ObjectGuid::LowType container_id = GetGUID().GetCounter(); // Save this for later use loot.containerID = container_id; // First, see if there was any money loot. This gets added directly to the container. PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEMCONTAINER_MONEY); stmt->setUInt32(0, container_id); PreparedQueryResult money_result = CharacterDatabase.Query(stmt); if (money_result) { Field* fields = money_result->Fetch(); loot.gold = fields[0].GetUInt32(); } // Next, load any items that were saved stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEMCONTAINER_ITEMS); stmt->setUInt32(0, container_id); PreparedQueryResult item_result = CharacterDatabase.Query(stmt); if (item_result) { // Get a LootTemplate for the container item. This is where // the saved loot was originally rolled from, we will copy conditions from it LootTemplate const* lt = LootTemplates_Item.GetLootFor(GetEntry()); if (lt) { do { // Create an empty LootItem LootItem loot_item = LootItem(); // Fill in the rest of the LootItem from the DB Field* fields = item_result->Fetch(); // item_id, itm_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix loot_item.itemid = fields[0].GetUInt32(); loot_item.count = fields[1].GetUInt32(); loot_item.follow_loot_rules = fields[2].GetBool(); loot_item.freeforall = fields[3].GetBool(); loot_item.is_blocked = fields[4].GetBool(); loot_item.is_counted = fields[5].GetBool(); loot_item.canSave = true; loot_item.is_underthreshold = fields[6].GetBool(); loot_item.needs_quest = fields[7].GetBool(); loot_item.randomPropertyId = fields[8].GetInt32(); loot_item.randomSuffix = fields[9].GetUInt32(); // Copy the extra loot conditions from the item in the loot template lt->CopyConditions(&loot_item); // If container item is in a bag, add that player as an allowed looter if (GetBagSlot()) loot_item.allowedGUIDs.insert(GetOwner()->GetGUID().GetCounter()); // Finally add the LootItem to the container loot.items.push_back(loot_item); // Increment unlooted count loot.unlootedCount++; } while (item_result->NextRow()); } } // Mark the item if it has loot so it won't be generated again on open m_lootGenerated = !loot.isLooted(); return m_lootGenerated; }