поиск вендоров
Posted: 25.12.2009 19:18
				
				Можна ли прописать строку чтобы чар искал вендоров токо в пределе дома в котором он стоит а не в пределах екрана ??
			А если в доме 2-3-4 вендора?подобрать подходящую точку в доме, и подходящий finddistance
Можна ли прописать строку чтобы чар искал вендоров токо в пределе дома
а как стелс узнает внутри дома найденный вендор или нет?получаетса надо указывать все углы каждого дома куда я буду реколится
Вот вот я об этом и говорю есть ли какойто облегченый способ поиска вендоров не за пределами домаWladL wrote:
а как стелс узнает внутри дома найденный вендор или нет?
Code: Select all
bool uo_has_los( const LosObj& att, const LosObj& tgt )
{
    int x1, y1, z1; // one of the endpoints
    int x2, y2, z2; // the other endpoint
    int xd, yd, zd;
    int x, y, z;
    int ax, ay, az;
    int sx, sy, sz;
    int dx, dy, dz;
    if ( (att.y < tgt.y) ||
         (att.y == tgt.y && att.z < tgt.z) )
    {
        x1 = att.x;  y1 = att.y;  z1 = att.z+att.look_height;
        x2 = tgt.x;  y2 = tgt.y;  z2 = tgt.z+tgt.look_height;
    }
    else
    {
        x1 = tgt.x;  y1 = tgt.y;  z1 = tgt.z+tgt.look_height;
        x2 = att.x;  y2 = att.y;  z2 = att.z+att.look_height;
    }
    dx = x2 - x1;
    dy = y2 - y1;
    dz = z2 - z1;
    if (abs(dx) > los_range || abs(dy) > los_range)
        return false;
    
    if (!dx && !dy)
    {
        if (!dz)
            return true;
        if (att.z <= tgt.z && 
                     tgt.z <= att.z+att.obj_height)
        {
            return true;
        }
        if (att.z <= tgt.z+tgt.look_height && 
                     tgt.z+tgt.look_height <= att.z+att.obj_height)
        {
            return true;
        }
    }
    ax = ABS(dx) << 1;
    ay = ABS(dy) << 1;
    az = ABS(dz) << 1;
    sx = ZSGN(dx);
    sy = ZSGN(dy);
    sz = ZSGN(dz);
    x = x1;
    y = y1;
    z = z1;
    if (ax >= ay && ax >= az)            // x dominant 
    {
        yd = ay - (ax >> 1);
        zd = az - (ax >> 1);
        for (;;)
        {
            if (los_blocked( att, tgt, x, y, z ))
                return false;
            
            if (x == x2)
            {
                return true;
            }
            if (yd >= 0)
            {
                y += sy;
                yd -= ax;
            }
            if (zd >= 0)
            {
                z += sz;
                zd -= ax;
            }
            x += sx;
            yd += ay;
            zd += az;
        }
    }
    else if (ay >= ax && ay >= az)            //y dominant 
    {
        xd = ax - (ay >> 1);
        zd = az - (ay >> 1);
        for (;;)
        {
            if (los_blocked( att, tgt, x, y, z ))
                return false;
            if (y == y2)
            {
                return true;
            }
            if (xd >= 0)
            {
                x += sx;
                xd -= ay;
            }
            if (zd >= 0)
            {
                z += sz;
                zd -= ay;
            }
            y += sy;
            xd += ax;
            zd += az;
        }
    }
    else           // z dominant 
    {
        xd = ax - (az >> 1);
        yd = ay - (az >> 1);
        for (;;)
        {
            if (los_blocked( att, tgt, x, y, z ))
                return false;
            if (z == z2)
            {
                return true;
            }
            if (xd >= 0)
            {
                x += sx;
                xd -= az;
            }
            if (yd >= 0)
            {
                y += sy;
                yd -= az;
            }
            z += sz;
            xd += ax;
            yd += ay;
        }
    }
    return true;
}
Code: Select all
bool los_blocked( const LosObj& att, const LosObj& target, 
                  int x, int y, int z )
{
    //cout << "los_blocked: (" << x << "," << y << "," << z << ")" << endl;
    // if the target inhabits the location, LOS can't be blocked:
    if (att.x == x && 
        att.y == y && 
        att.z <= z && 
        z < att.z+att.obj_height)
    {
        return false;
    }
    if (target.x == x &&
        target.y == y &&
        target.z <= z &&
        z < target.z+target.obj_height)
    {
        return false;
    }
    
    if (config.exp_los_checks_map)
    {
        USTRUCT_MAPINFO mi;
        rawmapinfo( x, y, &mi );
        if ((landtile_flags[ mi.landtile ] & 
                         (USTRUCT_TILE::FLAG_BLOCKING|USTRUCT_TILE::FLAG_WALL)) 
                  == (USTRUCT_TILE::FLAG_BLOCKING|USTRUCT_TILE::FLAG_WALL) )
            return true;
    }
    
    return dynamic_item_blocks_los( att, target, x, y, z ) ||
           static_item_blocks_los( x, y, z );
}Он реколится в один дом видит вендора в другом и как он до него доберетса ??grundick wrote:А чем тебе вендоры за пределами дома не угодили? У них товар порченный?
Code: Select all
while NextVendor3(Dist,Vendor) and (not dead) do begin
	if ShowDebug then
		AddToSystemJournal('Vendor...'+GetName(Vendor));
	if GetPathArray(GetX(Vendor),GetY(Vendor),true,1,tPathArr) >= 0 then begin
		EasyMoveXY(GetX(Vendor),GetY(Vendor),1,false);
		UOSay('Bye '+GetName(Vendor)+' Buy Guards');
		CheckSave;
		//CheckLife;
		wait(6000);
		CheckLife;
	end;
end;