I have three ideas I'm experimenting with to implement pseudo-random. This is the first.
Theory:
A random trigger to set off an auction in the auction channel for a given item sets a property on an individual mob --npc--. Then, should a player have an item and turn that item in, it results in some random reward.
Results:
No rewards yet, but the basics work.
Snippets:
Code:
npc::process
if (this->MerchantType>0)
if (rand()%650==2){
uint32 someitem = rand()%3500;
Item_Struct* item = database.GetItem(someitem);
if (item->name!=0)
if (rand()%2==0) {
entity_list.Message(0,MT_Auction, "%s auctions, 'WTS %s'", GetName(), item->name);
} else {
this->SetItemRequested(someitem);
entity_list.Message(0,MT_Auction, "%s auctions, 'WTT %s'", GetName(), item->name);
}
//else WTB
}
npc.h
/****************************************************
Merchant Role & AutoQuest Gen
*****************************************************/
void SetItemRequested(uint32 item) { ItemRequested=item;}
uint32 GetItemRequested(){return ItemRequested;}
uint32 ItemRequested;
client_process.cpp @2236
QueuePacket(outapp);
cout << "npc deal ended" << endl;
InTrade = 0;
TradeWithEnt = 0;
delete outapp;
if (tmp->IsNPC()) {
if (TradeList[0]==tmp->CastToNPC()->GetItemRequested()) {
this->Message(MT_Say, "%s says, 'Thank you for your hard work!'", tmp->GetName());
if (tmp->CastToNPC()->GetMaster() !=0)
this->Message(MT_Say, "%s says, 'I'm sure %s will look kindly upon this act'", tmp->GetName(), tmp->CastToNPC()->GetMaster());
//this->PutItemInInventory..
} else {
this->Message(MT_Say, "%s says, 'This is not what I wanted! No, not at all!'", tmp->GetName());
}
CheckQuests(zone->GetShortName(), "%%item%%", tmp->CastToNPC()->GetNPCTypeID(), TradeList[0]);
}
Notes:
You can test this out on Malevolent's Lab, a publicly available server on the EQEmu Network.
--MV