BLOG | Вопросы от MayroN'а | и не только...

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fl0wer, Оно работает как-то криво-косо. Будто бы с задержкой. Либо я в момент тестирования был не в себе.
 
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Мб от фпс зависит
Мб. Я ведь всё тестирую в окне, а там каким-то фигом фпс бывает и до 40 падает. В фуллскрин'е стабильно сотка.
Но у меня все хорошо было для увеличения прыжка/дабл джампа.
Для этих целей как раз и использовал FL_ONGROUND с RG_CBasePlayer_Jump. Вот и говорю, оно будто бы с задержкой в долюсекунды. С пресинком такого нет.
Но я конечно же забил хрен и оставил RG_CBasePlayer_Jump)
 
Сообщения
494
Реакции
340
Помог
11 раз(а)
Имеется ввиду после того,как игрок совершил прыжок с большой высоты или просто упал без прыжка ( как бы необязательно прыгать) и после его касается земли и тут..пошел нужный код.
Простой базисный вариант. Для его дальнейшего развития подойдет.
Код:
#include <amxmodx>
#include <fakemeta>

const Float: g_sMinDistFallUnits = 150.0; // Минимальная дистанция для падения

new bool: g_bIsFall[MAX_PLAYERS+1];

public plugin_init()
{
    register_forward(FM_PlayerPreThink, "fw_PlayerPreThink");
}

public fw_PlayerPreThink(pPlayer)
{
    if(!is_user_alive(pPlayer))
        return;

    new iFlags;
    iFlags = pev(pPlayer, pev_flags);

    if(~iFlags & FL_ONGROUND && !g_bIsFall[pPlayer] && get_distance_to_floor(pPlayer) >= g_sMinDistFallUnits)
        g_bIsFall[pPlayer] = true;
    else if(iFlags & FL_ONGROUND && g_bIsFall[pPlayer])
    {
        // тут твои действия

        client_print_color(pPlayer, print_team_default, "Падение");
        g_bIsFall[pPlayer] = false;
    }
}

stock Float: get_distance_to_floor(pPlayer)
{
    new
        Float: fOriginStart[3],
        Float: fOriginEnd[3];

    pev(pPlayer, pev_origin, fOriginStart);
    fOriginEnd = fOriginStart;
    fOriginEnd[2] -= 8192.0;

    engfunc(EngFunc_TraceLine, fOriginStart, fOriginEnd, IGNORE_MONSTERS, pPlayer, 0);
    get_tr2(0, TR_vecEndPos, fOriginEnd);

    return get_distance_f(fOriginStart, fOriginEnd);
}
 

Вложения

Последнее редактирование:
Сообщения
1,496
Реакции
1,496
Помог
2 раз(а)
bizon,
Спасибо.
Обязательно отпишусь,как сделаю.
 
Сообщения
1,496
Реакции
1,496
Помог
2 раз(а)
bizon,
Можно же заменить на Хам?
RegisterHam(Ham_Player_PreThink

И ...проверил.

1. Багом значится, если будешь прыгать перед ( над обрывом ) - то пыль и камни рисуются ( хотя может так даже лучше )))
Ведь создаётся реализм перед высотой на краю,когда прыжки делаешь.Хотя ,когда стоишь и прыгаешь - это также происходит (
Но прыжок на месте я закрыл так вместе с приседанием
Код:
if((pev(id,pev_button) & ~IN_JUMP & ~IN_DUCK) && ~iFlags & FL_ONGROUND && !g_bIsFall[id] && get_distance_to_floor(id) >= g_sMinDistFallUnits)
2. Когда игрок прыгнул и розбился на смерть,камней нет.
А вот в новом раунде (спавне) это всё и показывает сразу же
Решением было создать Спавн и там обнулить булл
Код:
public Hook_Player_Fall(id)
{
    g_bIsFall[id] = false;
}
3. Когда совершаешь прыжок на голову игрока с высоты - камни летят с бошки

4. С лестницой также беда - при в двух направлениях ( подьём/спуск )

С 1м пунктом не принципиально но всё же,а вот 3й и 4й - точно нужно закрыть и можно оформлять

Можно же исправить как-то это всё?
 
Последнее редактирование:

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
494
Реакции
340
Помог
11 раз(а)
MayroN, я заюзал fm потому как нужны были трейсы.
Опять же я говорил, что этот алгоритм - "базис", его нужно дорабатывать.

1. Можно хоть hamsandwich, хоть reapi, хоть engine. Чекается первый кадр, как только игрок не FL_ONGROUND. Это ещё не значит, что игрок не на земле, флагов там достаточно же присваивается. Может, нужно будет сверять не дистанцию до земли, а velocity.
2. Не знаю, возможно будет нужно в такой ситуации дополнительно ловить хук Fall Damage. Если он перекрывает PreThink. В reapi он точно есть.
3. Так правильно, ты же все же "упал". Возможно, стоит заменить на тач с условными энтитями, не считая "player" - игрока. Либо же в стоке получения дистанции добавить проверку, что TR_pHit не игрок.
4. Флаг FL_ONGROUND потому что здесь не канает. Нужны доп. проверки.

Если сам не разберёшься, то помогу в принципе. Только лучше в ТГ, чтобы не флудить тут.
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
494
Реакции
340
Помог
11 раз(а)
RockTheStreet, ну теперь обсуждать каждый тест лог_амх с тестов тут тоже не комильфо)
Позориться своими очепятками дело такое себе)
 
Сообщения
1,496
Реакции
1,496
Помог
2 раз(а)
Сделал модель шагов.
Всё,что получилось по работоспособности - результат на видео
Не пойму,как можно закрыть баг над пропастью,когда ходит игрок и,что-бы они внизу не рисовались + также парят у воздухе


Код:
#include <amxmodx>
#include <engine>
#include <fun>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>

#define CLASSNAME_FOOTSTEPS_SNOW    "footsteps_snow"
#define FOOTSTEPS_SNOW    "models/footsteps_snow.mdl"

#define STEAM        "sprites/steam.spr"
new g_steam

new Float:g_iNextStep[33];

public plugin_precache()
{
    precache_model(FOOTSTEPS_SNOW);
   
    register_think(CLASSNAME_FOOTSTEPS_SNOW, "Close_Footsteps");
   
    register_forward(FM_PlayerPreThink, "Snow_Sound", 0);  

    g_steam = precache_model(STEAM);
}

public Snow_Sound(id)
{
    if(!is_user_alive(id))return FMRES_IGNORED;
   
    if(g_iNextStep[id] < get_gametime()) {
        new iOrigin[3];
        new Float:fAngles[3];
        get_user_origin(id, iOrigin);
        pev(id, pev_angles, fAngles);

        Create_Footsteps_Snow(iOrigin, fAngles);
       
        message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
        write_byte(TE_SPRITE);
        write_coord(iOrigin[0]);
        write_coord(iOrigin[1]);
        write_coord(iOrigin[2] -= 30);
        write_short(g_steam);
        write_byte(2);
        write_byte(255);
        message_end();
        g_iNextStep[id] = get_gametime() + 3.0;
    }

    return FMRES_IGNORED;
}

public Create_Footsteps_Snow(iOrigin[3], const Float:fAngles[3])
{
    new iEntity = create_entity("info_target");

    if(!pev_valid(iEntity)) return PLUGIN_HANDLED;
   
    new Float:fEntAngles[3], Float:fOrigin[3];
   
    IVecFVec(iOrigin, fOrigin);
   
    set_pev(iEntity, pev_origin, fOrigin);
    set_pev(iEntity, pev_classname, CLASSNAME_FOOTSTEPS_SNOW);
    set_pev(iEntity, pev_solid, SOLID_NOT);
   
    pev(iEntity, pev_angles, fEntAngles);
    fEntAngles[1] = fAngles[1];
    set_pev(iEntity, pev_angles, fEntAngles);

    engfunc(EngFunc_SetModel, iEntity, FOOTSTEPS_SNOW);

    //engfunc(EngFunc_SetSize, iEntity, Float:{ -1.0, -1.0, -1.0 }, Float:{ 1.0, 1.0, 1.0 } );

    drop_to_floor(iEntity);

    set_pev(iEntity, pev_nextthink, get_gametime() + 3.0);
   
    return PLUGIN_HANDLED;
}
 
Последнее редактирование:
Сообщения
936
Реакции
187
Помог
4 раз(а)
MayroN, Кажется кому-то пора обновлять игровой движок :derisive:
 
Сообщения
936
Реакции
187
Помог
4 раз(а)
MayroN, А какие координаты по Y когда шаги в воздухе?
Интересно они всегда в начальной точке объекта
 
Сообщения
336
Реакции
42
Помог
6 раз(а)
MayroN, А на картах где нет снега тоже будут следы (сорри за тупой вопрос)?
 

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

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