Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

поиск вендоров

тут можно задать вопрос по скриптингу
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

поиск вендоров

Post by MeLFiS »

Можна ли прописать строку чтобы чар искал вендоров токо в пределе дома в котором он стоит а не в пределах екрана ??
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: поиск вендоров

Post by CFA »

подобрать подходящую точку в доме, и подходящий finddistance
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

подобрать подходящую точку в доме, и подходящий finddistance
А если в доме 2-3-4 вендора?
Нашел 1го в углу подходишь к нему, скупаешь и как искать следующего стоя в углу? бежать обратно в центр?

вот, писал как раз для подобных случаев
http://stealth.od.ua/forum/viewtopic.php?p=6446#6446
задаешь в параметрах координаты 2х противоположных углов дома и вперед с песнями.
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

это получаетса надо указывать все углы каждого дома куда я буду реколится, а мне надо реколится и в пределах дома подходить к вендору
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

Можна ли прописать строку чтобы чар искал вендоров токо в пределе дома
получаетса надо указывать все углы каждого дома куда я буду реколится
а как стелс узнает внутри дома найденный вендор или нет?

ну попробуй заведи массив тайлов стен и обрабатывай статику при поиске .... :lol:

Любишь кататься....
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

WladL wrote:
а как стелс узнает внутри дома найденный вендор или нет?
Вот вот я об этом и говорю есть ли какойто облегченый способ поиска вендоров не за пределами дома

Или вобше как решить эту проблему пытаюсь как бы написать скрипт на скупку (
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

я этот вопрос обошел иначе - на нашем шарде если ты юзаешь горелку на обьект, а он не на линии видимости - то оно орет, что-то типа item is not in line of sight. мне остается только эту строку отлавливать и все.

такой себе мини-баг.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

а как же мне тогда быть чтобы он не бегал к вендорам которые в других домах ??
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

пошарился по исходникам 3 эмуляторов-серверов - везде проверка на LOS занимает несколько экранов текста

на стелсе будет поменьше, но все же в несколько строк это вместить не получится точно.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

А чем тебе вендоры за пределами дома не угодили? У них товар порченный? :)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

для примера кусок исходника

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 );
}
const int los_range = 20;
const int z_los_range = 60; // unused as yet

дальше надоело копировать, если кто-то серьезно захочет этим заняться - скину файлами.
сразу говорю - стелс этим хламом нагружать точно не буду, только скриптово.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

grundick wrote:А чем тебе вендоры за пределами дома не угодили? У них товар порченный? :)
Он реколится в один дом видит вендора в другом и как он до него доберетса ??
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

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;
комментировать не буду
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

а двери? :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

А двери уже давно поменяли! Поставили новые, современные, с механизмом автоматического открывания...
Post Reply