Exemple #1
0
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);
}
Exemple #2
0
//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);
                }
            }
    }
}
Exemple #3
0
/*!
\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);
}