Wip merchant stuff, summoning should work now.

This commit is contained in:
KimLS 2015-03-06 15:53:15 -08:00
parent dda8ae4803
commit 00af95502e
12 changed files with 54 additions and 44 deletions

View File

@ -22,7 +22,6 @@
#include "data_verification.h"
#include "string_util.h"
#include <map>
#include <queue>
bool EQEmu::InventorySlot::IsValid() const {
if(type_ == InvTypePersonal && EQEmu::ValueWithin(slot_, PersonalSlotCharm, PersonalSlotCursor)) {

View File

@ -1253,7 +1253,7 @@ ItemInst* SharedDatabase::CreateBaseItemOld(const ItemData* item, int16 charges)
return inst;
}
std::shared_ptr<EQEmu::ItemInstance> SharedDatabase::CreateItem(uint32 item_id, int16 charges) {
std::shared_ptr<EQEmu::ItemInstance> 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<EQEmu::ItemInstance> SharedDatabase::CreateItem(uint32 item_id,
}
std::shared_ptr<EQEmu::ItemInstance> inst = std::shared_ptr<EQEmu::ItemInstance>(new EQEmu::ItemInstance(item, charges));
inst->SetSerialNumber(EQEmu::GetNextItemInstanceSerial());
//Set Tracking here
if(unique) {
inst->SetSerialNumber(EQEmu::GetNextItemInstanceSerial());
//Set Tracking here
}
return inst;
}

View File

@ -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<EQEmu::ItemInstance> CreateItem(uint32 item_id, int16 charges = 0);
std::shared_ptr<EQEmu::ItemInstance> CreateItem(uint32 item_id, int16 charges = 0, bool unique = true);
/*
Shared Memory crap

View File

@ -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,

View File

@ -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;
}

View File

@ -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.

View File

@ -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<int16>(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.");
}
}
}

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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.");

View File

@ -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;
}
}