Момент начала падения игрока

Сообщения
30
Реакции
0
именно начало падения. То есть, тот первый кадр, когда игрок оказывается в воздухе, но при этом он не находится в прыжке

такой вариант не канает:

C++:
#include <amxmodx>
#include <engine>

#pragma semicolon 1

new bool:is_client_startfalling[32];

public plugin_init()
    register_plugin("hook_client_startfalling", "1.0", "author");

public client_PreThink(id)
{
    if (is_user_alive(id) && is_user_connected(id))
    {
        if (!(get_entity_flags(id) & FL_ONGROUND) && !(get_user_button(id) & IN_JUMP) && !(get_user_oldbutton(id) & IN_JUMP) && !is_client_startfalling[id])
            is_client_startfalling[id] = true;
    }
    
    if (is_client_startfalling[id])
        client_print(id, print_chat, " >> ты начял падать O_o"), is_client_startfalling[id] = false;
}
 
Сообщения
74
Реакции
36
Помог
4 раз(а)
Зацепи момент когда у него pev_velocity по оси Z становится < 0, это и будет означать что он падает. Или можешь использовать reapi, там есть мембер m_flFallVelocity, если он > 0 и у игрока нет флага FL_ONGROUND значит игрок падает.
 
Сообщения
30
Реакции
0
во-первых, отредачил свой код этот небольшой, который всё равно не работает, как надо:
C++:
#include <amxmodx>
#include <engine>

#pragma semicolon 1

new is_client_startfalling[32];

public plugin_init()
    register_plugin("hook_client_startfalling", "1.0", "author");

public client_putinserver(id)
    is_client_startfalling[id] = 0;

public client_disconnected(id)
    is_client_startfalling[id] = 0;

public client_PreThink(id)
{
    if (is_user_alive(id) && is_user_connected(id))
    {
        if (!(get_entity_flags(id) & FL_ONGROUND) && !(get_user_button(id) & IN_JUMP) && !(get_user_oldbutton(id) & IN_JUMP) && (is_client_startfalling[id] == 0))
            is_client_startfalling[id] = 1;
        
        if ((get_entity_flags(id) & FL_ONGROUND) || (get_entity_flags(id) & FL_INWATER) || (entity_get_int(id, EV_INT_movetype) == MOVETYPE_FLY))
            is_client_startfalling[id] = 0;
        
        if (is_client_startfalling[id] == 1)
        {
            is_client_startfalling[id] = -1;
            client_print(id, print_chat, " >> ты начял падать O_o");
        }
    }
}
а во-вторых, тупанул я с этим "падением" :D
я имел ввиду не уменьшение координаты Z, а факт нахождения игрока в воздухе без использования прыжка (то есть если игрок начал находится в воздухе и при он нажал на "прыжок", то это не будет считаться тем самым "падением")


CSBishop, извини, что ввёл в небольшое заблуждение))
 
Сообщения
838
Реакции
516
Помог
12 раз(а)
ham_jump вместо prethink'а
вызывается только тогда, когда игрок находится в воздухе
 
Сообщения
30
Реакции
0
BalbuR, во-первых, Ham_Player_Jump, во-вторых, форвард вызывается каждый кадр клиента с момента прыжка и до момента столкновения с полом
 
Сообщения
30
Реакции
0
вообше, в голове уже 10 минут висит идея такая: допустим, есть форвард client_startair, и если форвард Ham_Player_Jump и client_startair запустились одновремено, то нужно блокнуть форвард client_startair

написал инклюд и зарегал форвард:

C++:
#if defined _fw_is_client_startair_included
  #endinput
#endif
#define _fw_is_client_startair_included

forward client_startair(id);

C++:
#include <amxmodx>
#include <engine>
#include <fw_is_client_startair>

#pragma semicolon 1

new is_client_startair[32];
new client_startair_fwid;

public plugin_init()
    register_plugin("is_client_startair", "1.0", "author"), client_startair_fwid = CreateMultiForward("client_startair", ET_IGNORE, FP_CELL);

public client_putinserver(id)
    is_client_startair[id] = 0;

public client_disconnected(id)
    is_client_startair[id] = 0;

public client_PreThink(id)
{
    new ret;
    
    if (is_user_alive(id) && is_user_connected(id))
    {
        if (!(get_entity_flags(id) & FL_ONGROUND) && !(get_user_button(id) & IN_JUMP) && !(get_user_oldbutton(id) & IN_JUMP) && (is_client_startair[id] == 0))
            is_client_startair[id] = 1;
        
        if ((get_entity_flags(id) & FL_ONGROUND) || (get_entity_flags(id) & FL_INWATER) || (entity_get_int(id, EV_INT_movetype) == MOVETYPE_FLY))
            is_client_startair[id] = 0;
        
        if (is_client_startair[id] == 1)
        {
            is_client_startair[id] = -1;
            
            ExecuteForward(client_startair_fwid, ret, id);
        }
    }
}

public client_startair(id)
    client_print(id, print_chat, " >> ты начял падать O_o");
осталось понять, как это сделать :p
 

RSO

Сообщения
20
Реакции
0
а вот так вот не лучше ?

Код:
GetEntityFloorDistance Функция получает расстояние от определенного объекта до пола

nEntIndex - индекс объекта, от которого будем определять расстояние до пола.
Примечание: если объект на полу, то функция будет возвращать 0.

stock Float:GetEntityFloorDistance(const nEntIndex) {
        const COORD_BITS = 16;
        const COORD_MULTIPLIER = 8;
        const MIN_Z_COORD = -(1 << (COORD_BITS - 1)) / COORD_MULTIPLIER;
       
        // Optimization
        if (pev(nEntIndex, pev_flags) & FL_ONGROUND) {
                return 0.0;
        }
       
        new Float:vecStart[3], Float:vecEnd[3];
       
        pev(nEntIndex, pev_origin, vecStart);
        vecEnd = vecStart;
        vecEnd[2] = float(MIN_Z_COORD);
       
        engfunc(EngFunc_TraceMonsterHull, nEntIndex, vecStart, vecEnd, DONT_IGNORE_MONSTERS, nEntIndex, 0);
       
        get_tr2(0, TR_vecEndPos, vecEnd);
       
        return vecStart[2] - vecEnd[2];
}
и скорость по оси Z учитывать если надо конечно
 
Последнее редактирование:
Сообщения
30
Реакции
0
RSO, сток отличный, но он не подходит для моей задачи. Суть в том, чтобы отловить момент "переставания нахождения на земле", исключив при этом момент прыжка. То есть, нужно в PreThink'е проверить, что игрок находится не на земле, после чего проверить, совершил ли он в момент "переставания нахождения на земле" прыжок. Если не совершил, то выполняется какой-то код, если совершил — не выполняется
 
Сообщения
3,569
Реакции
1,560
Помог
133 раз(а)
drejblour, ну так проверяй как ты описал. флаги на отсутствие FL_ONGROUND и кнопки игрока на отсутсвие IN_JUMP.
 
Сообщения
30
Реакции
0
Nordic Warrior, я так делал, смотри выше. Но я так понимаю, я сделал неправильно. Кроме как get_user_button(id) & IN_JUMP, проверить прыгнул ли игрок, ничего на ум не приходит. У меня так в силу малого количества опыта и тугодумства :D
 

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

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