GRRRRRRR i wish i learned c++ lol
i've been staring at the code now for like well... since i made the last post on here so an hour?
as far as i can tell it should work
from client_process.cpp... looks like it is pulling the items from the tmpmerchanttable[] array properly and sending them to the client when the merchant is browsed...
Code:
void Client::BulkSendMerchantInventory(int merchant_id, int16 npcid) {
const Item_Struct* handyitem = NULL;
int32 numItemSlots=80; //The max number of items passed in the transaction.
const Item_Struct *item;
std::list<MerchantList> merlist = zone->merchanttable[merchant_id];
std::list<MerchantList>::const_iterator itr;
if(merlist.size()==0){ //Attempt to load the data, it might have been missed if someone spawned the merchant after the zone was loaded
zone->LoadNewMerchantData(merchant_id);
merlist = zone->merchanttable[merchant_id];
if(merlist.size()==0)
return;
}
std::list<TempMerchantList> tmp_merlist = zone->tmpmerchanttable[npcid];
std::list<TempMerchantList>::iterator tmp_itr;
int32 i=1;
int8 handychance = 0;
for(itr = merlist.begin();itr != merlist.end() && i<numItemSlots;itr++){
MerchantList ml = *itr;
handychance = MakeRandomInt(0, merlist.size() + tmp_merlist.size() - 1 );
item = database.GetItem(ml.item);
if(item) {
if(handychance==0)
handyitem=item;
else
handychance--;
int charges=1;
if(item->ItemClass==ItemClassCommon)
charges=item->MaxCharges;
ItemInst* inst = database.CreateItem(item, charges);
if (inst) {
inst->SetPrice(item->Price*127/100);
inst->SetMerchantSlot(ml.slot);
inst->SetMerchantCount(-1); //unlimited
if(charges > 0)
inst->SetCharges(charges);
else
inst->SetCharges(1);
SendItemPacket(ml.slot-1, inst, ItemPacketMerchant);
safe_delete(inst);
}
}
i++;
}
std::list<TempMerchantList> origtmp_merlist = zone->tmpmerchanttable[npcid];
tmp_merlist.clear();
for(tmp_itr = origtmp_merlist.begin();tmp_itr != origtmp_merlist.end() && i<numItemSlots;tmp_itr++){
TempMerchantList ml = *tmp_itr;
item=database.GetItem(ml.item);
ml.slot=i;
if (item) {
if(handychance==0)
handyitem=item;
else
handychance--;
int charges=1;
if(item->ItemClass==ItemClassCommon && (sint16)ml.charges <= item->MaxCharges)
charges=ml.charges;
else
charges = item->MaxCharges;
ItemInst* inst = database.CreateItem(item, charges);
if (inst) {
inst->SetPrice(item->Price*127/100);
inst->SetMerchantSlot(ml.slot);
inst->SetMerchantCount(1);
if(charges > 0)
inst->SetCharges(charges);
else
inst->SetCharges(1);
SendItemPacket(ml.slot-1, inst, ItemPacketMerchant);
safe_delete(inst);
}
}
tmp_merlist.push_back(ml);
i++;
}
//this resets the slot
zone->tmpmerchanttable[npcid] = tmp_merlist;
Mob* merch = entity_list.GetMobByNpcTypeID(npcid);
if(merch != NULL && handyitem){
char handy_id[8]={0};
int greeting=rand()%5;
int greet_id=0;
switch(greeting){
case 1:
greet_id=MERCHANT_GREETING;
break;
case 2:
greet_id=MERCHANT_HANDY_ITEM1;
break;
case 3:
greet_id=MERCHANT_HANDY_ITEM2;
break;
case 4:
greet_id=MERCHANT_HANDY_ITEM3;
break;
default:
greet_id=MERCHANT_HANDY_ITEM4;
}
sprintf(handy_id,"%i",greet_id);
char merchantname[64]={0};
strncpy(merchantname,merch->GetName(),strlen(merch->GetName())-2);
if(greet_id!=MERCHANT_GREETING){
Message_StringID(10,GENERIC_STRINGID_SAY,merchantname,handy_id,this->GetName(),handyitem->Name);
}
else
Message_StringID(10,GENERIC_STRINGID_SAY,merchantname,handy_id,this->GetName());
merch->CastToNPC()->FaceTarget(this->CastToMob());
}
// safe_delete_array(cpi);
}
and the code for when a player sells an item to the npc... is below... and it also looks as if it is adding the item to both the database and the tmpmerchanttable[] array properly...
from zone.cpp
Code:
int Zone::SaveTempItem(int32 merchantid, int32 npcid, int32 item, sint32 charges, bool sold){
int freeslot = 0;
std::list<MerchantList> merlist = merchanttable[merchantid];
std::list<MerchantList>::const_iterator itr;
int32 i = 1;
for(itr = merlist.begin();itr != merlist.end();itr++){
MerchantList ml = *itr;
if(ml.item == item)
return 0;
else
i++;
}
std::list<TempMerchantList> tmp_merlist = tmpmerchanttable[npcid];
std::list<TempMerchantList>::const_iterator tmp_itr;
bool update_charges = false;
TempMerchantList ml;
while(freeslot == 0 && !update_charges){
freeslot = i;
for(tmp_itr = tmp_merlist.begin();tmp_itr != tmp_merlist.end();tmp_itr++){
ml = *tmp_itr;
if(ml.item == item){
update_charges = true;
freeslot = 0;
break;
}
if(ml.origslot==i)
freeslot=0;
}
i++;
}
if(update_charges){
tmp_merlist.clear();
std::list<TempMerchantList> oldtmp_merlist = tmpmerchanttable[npcid];
for(tmp_itr = oldtmp_merlist.begin();tmp_itr != oldtmp_merlist.end();tmp_itr++){
TempMerchantList ml2 = *tmp_itr;
if(ml2.item != item)
tmp_merlist.push_back(ml2);
}
if(sold)
ml.charges = ml.charges + charges;
else
ml.charges = charges;
if(!ml.origslot)
ml.origslot = ml.slot;
if(charges>0){
database.SaveMerchantTemp(npcid, ml.origslot, item, ml.charges);
tmp_merlist.push_back(ml);
}
else{
database.DeleteMerchantTemp(npcid,ml.origslot);
}
tmpmerchanttable[npcid] = tmp_merlist;
}
if(freeslot){
if(charges<0) //sanity check only, shouldnt happen
charges = 255;
database.SaveMerchantTemp(npcid, freeslot, item, charges);
tmp_merlist = tmpmerchanttable[npcid];
TempMerchantList ml2;
ml2.charges = charges;
ml2.item = item;
ml2.npcid = npcid;
ml2.slot = freeslot;
ml2.origslot = ml2.slot;
tmp_merlist.push_back(ml2);
tmpmerchanttable[npcid] = tmp_merlist;
}
return freeslot;
}
so as far as i can tell it should be displaying the items that were sold to the merchant unless im missing something somewhere...
