void StoreItemRandomValue(pItem pi,int tmpreg) { // Function Created by Magius(CHE) for trade System int max=0,min=0; if ( ! pi ) return; if (pi->good<0) return; if (tmpreg<0) { pItem pio=pi->getOutMostCont(); if (pio->isInWorld()) tmpreg=calcRegionFromXY( pio->getPosition() ); else { pChar pc=cSerializable::findCharBySerial(pio->getContSerial()); if (!pc) return; tmpreg=calcRegionFromXY( pc->getPosition() ); } } if (tmpreg<0 || tmpreg>255 || pi->good<0 || pi->good>255) return; min=region[tmpreg].goodrnd1[pi->good]; max=region[tmpreg].goodrnd2[pi->good]; if (max!=0 || min!=0) pi->rndvaluerate=(int) RandomNum(min,max); }
//o---------------------------------------------------------------------------o //| Function : void restockNPC(CChar *i, bool stockAll) //| Date : Unknown //| Programmer : UOX3 DevTeam //o---------------------------------------------------------------------------o //| Purpose : Restock NPC Vendors //o---------------------------------------------------------------------------o void restockNPC(CChar& i, bool stockAll) { if (!i.IsShop()) return; // if we aren't a shopkeeper, why bother? CItem *ci = i.GetItemAtLayer(IL_SELLCONTAINER); if (ValidateObject(ci)) { CDataList< CItem * > *ciCont = ci->GetContainsList(); for (CItem *c = ciCont->First(); !ciCont->Finished(); c = ciCont->Next()) if (ValidateObject(c)) { if (stockAll) { c->IncAmount(c->GetRestock()); c->SetRestock(0); } else if (c->GetRestock()) { UI16 stockAmt = UOX_MIN(c->GetRestock(), static_cast<UI16>((c->GetRestock() / 2) + 1)); c->IncAmount(stockAmt); c->SetRestock(c->GetRestock() - stockAmt); } if (cwmWorldState->ServerData()->TradeSystemStatus()) { CTownRegion *tReg = calcRegionFromXY(i.GetX(), i.GetY(), i.WorldNumber()); Items->StoreItemRandomValue(c, tReg); } } } }
/*! \brief trade System \author Magius(CHE) \todo Try to take a look to what is this and document it */ int calcGoodValue(pChar npc, pItem pi, int value,int goodtype) { if ( ! npc ) return 0; if ( ! pi ) return value; int actreg=calcRegionFromXY( npc->getPosition() ); int regvalue=0; int x; int good=pi->good; if (good<=INVALID || good >255 || actreg<=INVALID || actreg>255) return value; if (goodtype==1) regvalue=region[actreg].goodsell[pi->good]; // Vendor SELL if (goodtype==0) regvalue=region[actreg].goodbuy[pi->good]; // Vendor BUY x=(int) (value*abs(regvalue))/1000; if (regvalue<0) value-=x; else value+=x; if (value<=0) value=1; // Added by Magius(CHE) (2) return value; }
void checkregion(pChar pc) { if ( ! pc ) return; pClient client; pPC tmp; int calcreg, j; calcreg=calcRegionFromXY( pc->getPosition() ); if (calcreg!= pc->region) { pFunctionHandle evt = pc->getEvent(cChar::evtChrOnRegionChange); if(evt) { cVariantVector params = cVariantVector(3); params[0] = pc->getSerial(); params[1] = pc->region; params[2] = calcreg; evt->setParams(params); evt->execute(); } client = (tmp = dynamic_cast<pPC>(pc))? tmp->getClient() : NULL; if (client) { pweather(client); Calendar::commitSeason(pc); if (region[ pc->region ].name[0]!=0) { client->sysmessage("You have left %s.", region[ pc->region].name); } if (region[calcreg].name[0]!=0) { client->sysmessage("You have entered %s.", region[calcreg].name); } j=strcmp(region[calcreg].guardowner, region[pc->region].guardowner); if ( (region[calcreg].priv & rgnFlagGuarded)!=(region[pc->region].priv & rgnFlagGuarded) || (region[calcreg].priv & rgnFlagGuarded && j)) { if (region[calcreg].priv & rgnFlagGuarded) { if (region[calcreg].guardowner[0]==0) client->sysmessage("You are now under the protection of the guards."); else client->sysmessage("You are now under the protection of %s guards.", region[calcreg].guardowner); } else { if (region[pc->region].guardowner[0]==0) client->sysmessage("You are no longer under the protection of the guards."); else client->sysmessage("You are no longer under the protection of %s guards.", region[pc->region].guardowner); } } } pc->region=calcreg; if (client) client->playMidi(); } }
//<Anthalir> short calcRegionFromXY(sLocation pos) { return calcRegionFromXY(pos.x, pos.y); }