From 00af95502e6fd070a98d0c23aa21446b3cd56471 Mon Sep 17 00:00:00 2001 From: KimLS Date: Fri, 6 Mar 2015 15:53:15 -0800 Subject: [PATCH] Wip merchant stuff, summoning should work now. --- common/inventory.cpp | 1 - common/shareddb.cpp | 8 ++++--- common/shareddb.h | 2 +- zone/client.h | 2 +- zone/client_packet.cpp | 15 ++++-------- zone/client_process.cpp | 5 ++-- zone/command.cpp | 51 ++++++++++++++++++++++++++--------------- zone/inventory.cpp | 2 +- zone/lua_client.cpp | 2 +- zone/questmgr.cpp | 2 +- zone/spell_effects.cpp | 2 +- zone/tradeskills.cpp | 6 ++--- 12 files changed, 54 insertions(+), 44 deletions(-) diff --git a/common/inventory.cpp b/common/inventory.cpp index 3c558910c..a0a14f18b 100644 --- a/common/inventory.cpp +++ b/common/inventory.cpp @@ -22,7 +22,6 @@ #include "data_verification.h" #include "string_util.h" #include -#include bool EQEmu::InventorySlot::IsValid() const { if(type_ == InvTypePersonal && EQEmu::ValueWithin(slot_, PersonalSlotCharm, PersonalSlotCursor)) { diff --git a/common/shareddb.cpp b/common/shareddb.cpp index cf18cac55..3b5170d75 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -1253,7 +1253,7 @@ ItemInst* SharedDatabase::CreateBaseItemOld(const ItemData* item, int16 charges) return inst; } -std::shared_ptr SharedDatabase::CreateItem(uint32 item_id, int16 charges) { +std::shared_ptr SharedDatabase::CreateItem(uint32 item_id, int16 charges, bool unique) { const ItemData* item = GetItem(item_id); if(item) { if(charges == 0 && item->MaxCharges == -1) { @@ -1265,8 +1265,10 @@ std::shared_ptr SharedDatabase::CreateItem(uint32 item_id, } std::shared_ptr inst = std::shared_ptr(new EQEmu::ItemInstance(item, charges)); - inst->SetSerialNumber(EQEmu::GetNextItemInstanceSerial()); - //Set Tracking here + if(unique) { + inst->SetSerialNumber(EQEmu::GetNextItemInstanceSerial()); + //Set Tracking here + } return inst; } diff --git a/common/shareddb.h b/common/shareddb.h index 506f62eef..f995bd0df 100644 --- a/common/shareddb.h +++ b/common/shareddb.h @@ -85,7 +85,7 @@ class SharedDatabase : public Database ItemInst* CreateItemOld(uint32 item_id, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0); ItemInst* CreateItemOld(const ItemData* item, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0); ItemInst* CreateBaseItemOld(const ItemData* item, int16 charges = 0); - std::shared_ptr CreateItem(uint32 item_id, int16 charges = 0); + std::shared_ptr CreateItem(uint32 item_id, int16 charges = 0, bool unique = true); /* Shared Memory crap diff --git a/zone/client.h b/zone/client.h index 5b6580b1e..860ac1dc7 100644 --- a/zone/client.h +++ b/zone/client.h @@ -829,7 +829,7 @@ public: bool SwapItem(const EQEmu::InventorySlot &src, const EQEmu::InventorySlot &dest, int number_in_stack); bool SummonItem(uint32 item_id, int16 charges, - const EQEmu::InventorySlot &slot, + const EQEmu::InventorySlot &slot = EQEmu::InventorySlot(EQEmu::InvTypePersonal, EQEmu::PersonalSlotCursor), uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index c67c334ab..d36207c9e 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -2628,7 +2628,7 @@ void Client::Handle_OP_AltCurrencyReclaim(const EQApplicationPacket *app) /* If you input more than you have currency wise, just give the max of the currency you currently have */ if (reclaim->count > max_currency) { - SummonItem(item_id, max_currency); + SummonItem(item_id, max_currency, 0); SetAlternateCurrencyValue(reclaim->currency_id, 0); } else { @@ -4889,14 +4889,14 @@ void Client::Handle_OP_CrystalCreate(const EQApplicationPacket *app) if (cr->type == 5) { if (cr->amount > GetEbonCrystals()) { - SummonItem(RuleI(Zone, EbonCrystalItemID), GetEbonCrystals()); + SummonItem(RuleI(Zone, EbonCrystalItemID), GetEbonCrystals(), 0); m_pp.currentEbonCrystals = 0; m_pp.careerEbonCrystals = 0; SaveCurrency(); SendCrystalCounts(); } else { - SummonItem(RuleI(Zone, EbonCrystalItemID), cr->amount); + SummonItem(RuleI(Zone, EbonCrystalItemID), cr->amount, 0); m_pp.currentEbonCrystals -= cr->amount; m_pp.careerEbonCrystals -= cr->amount; SaveCurrency(); @@ -4905,14 +4905,14 @@ void Client::Handle_OP_CrystalCreate(const EQApplicationPacket *app) } else if (cr->type == 4) { if (cr->amount > GetRadiantCrystals()) { - SummonItem(RuleI(Zone, RadiantCrystalItemID), GetRadiantCrystals()); + SummonItem(RuleI(Zone, RadiantCrystalItemID), GetRadiantCrystals(), 0); m_pp.currentRadCrystals = 0; m_pp.careerRadCrystals = 0; SaveCurrency(); SendCrystalCounts(); } else { - SummonItem(RuleI(Zone, RadiantCrystalItemID), cr->amount); + SummonItem(RuleI(Zone, RadiantCrystalItemID), cr->amount, 0); m_pp.currentRadCrystals -= cr->amount; m_pp.careerRadCrystals -= cr->amount; SaveCurrency(); @@ -12177,7 +12177,6 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) sizeof(Merchant_Purchase_Struct), app->size); return; } - RDTSC_Timer t1(true); Merchant_Purchase_Struct* mp = (Merchant_Purchase_Struct*)app->pBuffer; Mob* vendor = entity_list.GetMob(mp->npcid); @@ -12206,7 +12205,6 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) } if (!item->NoDrop) { - //Message(13,"%s tells you, 'LOL NOPE'", vendor->GetName()); return; } @@ -12319,10 +12317,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) QueuePacket(outapp); safe_delete(outapp); SendMoneyUpdate(); - t1.start(); Save(1); - t1.stop(); - std::cout << "Save took: " << t1.getDuration() << std::endl; return; } diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 662264d95..ba30b7abe 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -873,7 +873,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { int charges = 1; if (item->ItemClass == ItemClassCommon) charges = item->MaxCharges; - ItemInst* inst = database.CreateItemOld(item, charges); + auto inst = database.CreateItem(item->ID, charges, false); if (inst) { if (RuleB(Merchant, UsePriceMod)) { inst->SetPrice((item->Price * (RuleR(Merchant, SellCostMod)) * item->SellRate * Client::CalcPriceMod(merch, false))); @@ -887,8 +887,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { else inst->SetCharges(1); - SendItemPacket(ml.slot - 1, inst, ItemPacketMerchant); - safe_delete(inst); + SendItemPacket(EQEmu::InventorySlot(EQEmu::InvTypePersonal, ml.slot - 1), inst, ItemPacketMerchant); } } // Account for merchant lists with gaps. diff --git a/zone/command.cpp b/zone/command.cpp index e24e2425b..5aabf6563 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -5419,24 +5419,31 @@ void command_summonitem(Client *c, const Seperator *sep) } EQEmu::InventorySlot cursor(EQEmu::InvTypePersonal, EQEmu::PersonalSlotCursor); - if (item_status > c->Admin()) + bool v = false; + if (item_status > c->Admin()) { c->Message(13, "Error: Insufficient status to summon this item."); + return; + } else if (sep->argnum==2 && sep->IsNumber(2)) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor); else if (sep->argnum==3) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3])); else if (sep->argnum==4) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4])); else if (sep->argnum==5) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5])); else if (sep->argnum==6) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6])); else if (sep->argnum==7) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7])); else if (sep->argnum==8) - c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7]), atoi(sep->arg[8])); + v = c->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7]), atoi(sep->arg[8])); else { - c->SummonItem(itemid, -1, cursor); + v = c->SummonItem(itemid, -1, cursor); + } + + if(!v) { + c->Message(13, "Error: unable to summon item."); } } } @@ -5458,24 +5465,32 @@ void command_giveitem(Client *c, const Seperator *sep) item_status = static_cast(item->MinStatus); } - if (item_status > c->Admin()) + EQEmu::InventorySlot cursor(EQEmu::InvTypePersonal, EQEmu::PersonalSlotCursor); + bool v = false; + if (item_status > c->Admin()) { c->Message(13, "Error: Insufficient status to summon this item."); + return; + } else if (sep->argnum==2 && sep->IsNumber(2)) - t->SummonItem(itemid, atoi(sep->arg[2])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor); else if (sep->argnum==3) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3])); else if (sep->argnum==4) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4])); else if (sep->argnum==5) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5])); else if (sep->argnum==6) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6])); else if (sep->argnum==7) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7])); else if (sep->argnum == 7) - t->SummonItem(itemid, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7]), atoi(sep->arg[8])); + v = t->SummonItem(itemid, atoi(sep->arg[2]), cursor, atoi(sep->arg[3]), atoi(sep->arg[4]), atoi(sep->arg[5]), atoi(sep->arg[6]), atoi(sep->arg[7]), atoi(sep->arg[8])); else { - t->SummonItem(itemid); + v = t->SummonItem(itemid, -1, cursor); + } + + if(!v) { + c->Message(13, "Error: Unable to summon item on target."); } } } diff --git a/zone/inventory.cpp b/zone/inventory.cpp index 68ee62dc1..de89acd94 100644 --- a/zone/inventory.cpp +++ b/zone/inventory.cpp @@ -1649,7 +1649,7 @@ bool Client::SwapItem(MoveItemOld_Struct* move_in) { } else { if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit - SummonItem(src_inst->GetID(), src_inst->GetCharges()); + SummonItem(src_inst->GetID(), src_inst->GetCharges(), 0); DeleteItemInInventory(MainCursor); return true; diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index ac0ddcf99..400d2a419 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -672,7 +672,7 @@ void Lua_Client::SummonItem(uint32 item_id) { void Lua_Client::SummonItem(uint32 item_id, int charges) { Lua_Safe_Call_Void(); - self->SummonItem(item_id, charges); + self->SummonItem(item_id, charges, 0); } void Lua_Client::SummonItem(uint32 item_id, int charges, uint32 aug1) { diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 38d90b848..b129d00cc 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -189,7 +189,7 @@ void QuestManager::summonitem(uint32 itemid, int16 charges) { QuestManagerCurrentQuestVars(); if(!initiator) return; - initiator->SummonItem(itemid, charges); + initiator->SummonItem(itemid, charges, 0); } void QuestManager::write(const char *file, const char *str) { diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index aa3051ef1..c60923346 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -619,7 +619,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) strstr(transI->GetItem()->Name, "parts") || strstr(transI->GetItem()->Name, "Parts")){ CastToClient()->DeleteItemInInventory(MainCursor, fcharges, true); - CastToClient()->SummonItem(13073, fcharges); + CastToClient()->SummonItem(13073, fcharges, 0); } else{ Message(13, "You can only transmute flesh to bone."); diff --git a/zone/tradeskills.cpp b/zone/tradeskills.cpp index 4e3262de1..edd01b4aa 100644 --- a/zone/tradeskills.cpp +++ b/zone/tradeskills.cpp @@ -1068,7 +1068,7 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { itr = spec->onsuccess.begin(); while(itr != spec->onsuccess.end() && !spec->quest) { //should we check this crap? - SummonItem(itr->first, itr->second); + SummonItem(itr->first, itr->second, 0); item = database.GetItem(itr->first); if (this->GetGroup()) { entity_list.MessageGroup(this, true, MT_Skills, "%s has successfully fashioned %s!", GetName(), item->Name); @@ -1111,7 +1111,7 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { itr = spec->onfail.begin(); while(itr != spec->onfail.end()) { //should we check these arguments? - SummonItem(itr->first, itr->second); + SummonItem(itr->first, itr->second, 0); ++itr; } @@ -1126,7 +1126,7 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { while(itr != spec->salvage.end()) { for(sc = 0; sc < itr->second; sc++) if(zone->random.Roll(SalvageChance)) - SummonItem(itr->first, 1); + SummonItem(itr->first, 1, 0); ++itr; } }