Var Origin.

Сообщения
857
Реакции
144
Помог
25 раз(а)
Здравствуйте, есть кусок кода:
C++:
explodeNade(const grenade) {
    new id = get_entvar(grenade, var_owner), Float:flOriginPlayer[3], Float:flOriginNade[3];
    
    get_entvar(grenade, var_origin, flOriginNade);
    get_entvar(id, var_origin, flOriginPlayer);

    set_entvar(id, var_origin, flOriginNade);
    
    rh_emit_sound2(id, 0, CHAN_WEAPON, "weapons/heal.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    UTIL_ScreenFade(id);

    destroyNade(grenade);
}
Суть такая: Во время взрыва гранаты я получаю координаты гранаты и игрока, и затем задаю игроку координаты гранаты (Грубо говоря - телепорт).
Но вот есть 1 проблема, игрок застревает в текстурах.
Пытался поправить застревание через цикл while:
C++:
new iVacant;
while(!iVacant) {
    iVacant = is_hull_vacant(flOriginPlayer, HULL_HUMAN);
    flOriginPlayer[1] += 5.0;
}

if(iVacant)
    set_entvar(id, var_origin, flOriginNade);


stock bool:is_hull_vacant(Float:origin[3], hull) {
    new tr = 0;
    engfunc(EngFunc_TraceHull,origin,origin,0,hull,0,tr);
 
    if(!get_tr2(tr,TR_StartSolid) && !get_tr2(tr,TR_AllSolid) && get_tr2(tr,TR_InOpen))
        return true;
     
    return false;
}
Только вопрос. Какие координаты мне нужно получать? Ведь по сути я задаю координаты гранаты, мне нужно с ними именно работать?
 
Сообщения
3,331
Реакции
1,464
Помог
124 раз(а)
Benzogang_BabyTape, поищи в инете был плагин граната телепорт, глянь там
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Так граната же на земле, тебе координаты по оси Z нужно увеличивать.
flOriginPlayer[1] += 5.0;
->
flOriginPlayer[2] += 5.0;
24 Июн 2022
Если над игроком так и не окажется места для перемещения, сервер может повиснуть от бесконечного цикла.
Создавай трэйс от места гранаты до самой верхушки и ограничивай координаты по оси Z этим промежутком.
24 Июн 2022
А ещё нужно чекать, если игрок в положении сидя, то накидывать половину _maxsize к координатам по оси Z, чтобы он не застрял.
 
Последнее редактирование:
Сообщения
1,106
Реакции
319
сервер упадет с таким кодом если игрока нельзя вытащить,

ну или что там бывает при зацикливании)
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
сервер упадет с таким кодом если игрока нельзя вытащить,

ну или что там бывает при зацикливании)
Управление останется в этом цикле, и серв просто повиснет. Упасть просто не сможет, если в цикле не будет какая-нибудь условная мессага, которая переполнит буффер, тогда серв ляжет.

И да, координаты устанавливай лучше через EngFunc_SetOrigin
24 Июн 2022
EngFunc_SetOrigin переместит игрока в текущем кадре, var_origin - в следующем, а в следующем кадре может уже не быть места для перемещения, ведь проверку is_hull_vacant ты делал в предыдущем.
Это, конечно, маловероятно, но все же.
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
впихни checkstuck(player) в телепорт


Код:
public checkstuck(player)
{
    static Float:origin[3]
    static Float:mins[3], hull
    static Float:vec[3]
    static o
    if(is_user_alive(player))
    {
        get_entvar(player, var_origin, origin)
        hull = get_entvar(player, var_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN
        if (!is_hull_vacant(origin, hull,player) && get_entvar(player, var_movetype) != MOVETYPE_NOCLIP && !(get_entvar(player,var_solid) & SOLID_NOT))
        {
            get_entvar(player, var_mins, mins)
            vec[2] = origin[2]
            for (o=0; o < sizeof size; ++o)
            {
                vec[0] = origin[0] - mins[0] * size[o][0]
                vec[1] = origin[1] - mins[1] * size[o][1]
                vec[2] = origin[2] - mins[2] * size[o][2]
                if (is_hull_vacant(vec, hull,player))
                {
                    engfunc(EngFunc_SetOrigin, player, vec)
                    effects(player)
                    set_entvar(player,var_velocity,{0.0,0.0,0.0})
                    o = sizeof size
                }
            }
        }
    }
}


stock bool:is_hull_vacant(const Float:origin[3], hull,id) {
    static tr
    engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr)
    if (!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid)) //get_tr2(tr, TR_InOpen))
        return true
   
    return false
}
 
Сообщения
857
Реакции
144
Помог
25 раз(а)
bizon, учту, спасибо. Правда про это:
Если над игроком так и не окажется места для перемещения, сервер может повиснуть от бесконечного цикла.
Создавай трэйс от места гранаты до самой верхушки и ограничивай координаты по оси Z этим промежутком.
24 Июн 2022
А ещё нужно чекать, если игрок в положении сидя, то накидывать половину _maxsize к координатам по оси Z, чтобы он не застрял.
Не совсем понял. Конкретно про "трэйс", никогда с ним не работал.
 
Сообщения
857
Реакции
144
Помог
25 раз(а)
Limbooc, что за effect(player)? И что должно находится в массиву size?
24 Июн 2022
Limbooc, все, разобрался, твой метод помог. Спасибо всем огромное за подсказки.
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Benzogang_BabyTape,
Код:
get_entvar(player, var_movetype) != MOVETYPE_NOCLIP && !(get_entvar(player,var_solid) & SOLID_NOT)
Эти две проверки из цикла убери, поставь перед циклом. Нафиг на каждом шаге цикла они проверяются - не понятно.
Ну и
Код:
!(get_entvar(player,var_solid) & SOLID_NOT)
->
Код:
~get_entvar(player,var_solid) & SOLID_NOT
Бездумно копировать код тоже не всегда стоит.
 
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
Сообщения
494
Реакции
340
Помог
11 раз(а)
Расскажешь, что делает данный код и когда он будет давать единицу?
Не понял в чем зазгвоздка вопроса, в том, что семантически неверно вытащил и показал код без условия или в том, что я отрицание бита здесь неправильное?
25 Июн 2022
Up. Дело ночное, затупил, действительно.
Стало быть, условие нужно просто вытащить из цикла.
 
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
Не понял в чем зазгвоздка вопроса
В том, что оригинальное условие всегда истина, независимо от значения get_entvar(player,var_solid). Твоё условие всегда ложное.
Т.е. Оригинальная работа сломана. Отдельный вопрос зачем оно там было.
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Mistrick, меня завела подобного рода проверка в заблуждение, в сонных обстоятельствах я почему-то подумал, что там 3 параметр бит-сумма для var_solid.
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
Limbooc, что за effect(player)? И что должно находится в массиву size?

sorry забыл указать


Код:
new const Float:size[][3] = {
    {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}, {0.0, 1.0, 0.0}, {0.0, -1.0, 0.0}, {1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0},
    {0.0, 0.0, 2.0}, {0.0, 0.0, -2.0}, {0.0, 2.0, 0.0}, {0.0, -2.0, 0.0}, {2.0, 0.0, 0.0}, {-2.0, 0.0, 0.0}, {-2.0, 2.0, 2.0}, {2.0, 2.0, 2.0}, {2.0, -2.0, 2.0}, {2.0, 2.0, -2.0}, {-2.0, -2.0, 2.0}, {2.0, -2.0, -2.0}, {-2.0, 2.0, -2.0}, {-2.0, -2.0, -2.0},
    {0.0, 0.0, 3.0}, {0.0, 0.0, -3.0}, {0.0, 3.0, 0.0}, {0.0, -3.0, 0.0}, {3.0, 0.0, 0.0}, {-3.0, 0.0, 0.0}, {-3.0, 3.0, 3.0}, {3.0, 3.0, 3.0}, {3.0, -3.0, 3.0}, {3.0, 3.0, -3.0}, {-3.0, -3.0, 3.0}, {3.0, -3.0, -3.0}, {-3.0, 3.0, -3.0}, {-3.0, -3.0, -3.0},
    {0.0, 0.0, 4.0}, {0.0, 0.0, -4.0}, {0.0, 4.0, 0.0}, {0.0, -4.0, 0.0}, {4.0, 0.0, 0.0}, {-4.0, 0.0, 0.0}, {-4.0, 4.0, 4.0}, {4.0, 4.0, 4.0}, {4.0, -4.0, 4.0}, {4.0, 4.0, -4.0}, {-4.0, -4.0, 4.0}, {4.0, -4.0, -4.0}, {-4.0, 4.0, -4.0}, {-4.0, -4.0, -4.0},
    {0.0, 0.0, 5.0}, {0.0, 0.0, -5.0}, {0.0, 5.0, 0.0}, {0.0, -5.0, 0.0}, {5.0, 0.0, 0.0}, {-5.0, 0.0, 0.0}, {-5.0, 5.0, 5.0}, {5.0, 5.0, 5.0}, {5.0, -5.0, 5.0}, {5.0, 5.0, -5.0}, {-5.0, -5.0, 5.0}, {5.0, -5.0, -5.0}, {-5.0, 5.0, -5.0}, {-5.0, -5.0, -5.0}
}

Код:
public effects(id)
{
    if(!is_user_connected(id)) return;

    message_begin(MSG_ONE_UNRELIABLE,MsgId_StatusValue,{0,0,0},id )     
    write_short(1<<10)   // fade lasts this long duration
    write_short(1<<10)   // fade lasts this long hold time
    write_short(1<<1)   // fade type (in / out)
    write_byte(20)            // fade red
    write_byte(255)    // fade green
    write_byte(255)        // fade blue
    write_byte(255)    // fade alpha
    message_end()
}
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу