trigger_push в regamedll

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
17
Реакции
2
На карте имеется несколкьо trigger_push блоков, но заметил, что в regamedll они не работают. Может это и не связано конкретно с движком, но хотелось бы восстановить задумку автора и вернуть этот функционал. Нашлось два плагина, которые решают эту проблему DRM_triggers_entities_fix и trigger_unpush. Последний и хотелось бы поправить. Дело в том, что где-то на середине карты возникает полоска шириною в метр, стоя на которой очень медленно, но всё же заметно для глаз, тебя сносит в правую часть карты до самого конца. Возникла мысль, что можно сделать проверку на текстуру под ногами, т.к она просто определяется по impulse 107. Посколько сайты amxmodx и alliedmods весь день лежали с ошибкой 500 и доставать из вебархива становилось всё муторнее, а goldsrc недоступен для регистрации и скачать ничего не получается, под конец вспомнил о существовании чатагпт. И вот что он мне насоветовал, правда нерабочее. Если позволите, для сохранности форматирования выложу одной котлетой в приложении. Поскольку знаний ни в amxx, ни в pawn не имеется, хотелось бы мнения экспертного сообщества - возможно ли это исправить, скажется ли такая проверка с текстурой на производительности?

Код:
#include <amxmodx>
#include <engine>
#include <cstrike>
#include <xs>
#include <hamsandwich>
#include <fakemeta>

#define PLUGIN "trigger_push fix for post-25th-anniversary builds"
#define VERSION "1.0.0"
#define AUTHOR "GameChaos"

#pragma semicolon 1

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    RegisterHam(Ham_Touch, "trigger_push", "OnTouch_TriggerPush");
}

stock Float:pev_f(_index,_field)
{
    new Float:f;
    pev(_index,_field,f);
    return f;
}

stock pev_i(_index,_field)
{
    new i;
    pev(_index,_field,i);
    return i;
}

// forward Float:[3]v3add(Float:a[3], Float:b[3]);
stock Float:v3add(Float:a[3], Float:b[3])
{
    new Float:result[3];
    for (new i = 0; i < 3; i++) {
        result[i] = a[i] + b[i];
    }
    return result;
}

// forward Float:[3]v3adds(Float:a[3], Float:b);
stock Float:v3adds(Float:a[3], Float:b)
{
    new Float:result[3];
    for (new i = 0; i < 3; i++) {
        result[i] = a[i] + b;
    }
    return result;
}

// forward Float:[3]v3mul(Float:a[3], Float:b[3]);
stock Float:v3mul(Float:a[3], Float:b[3])
{
    new Float:result[3];
    for (new i = 0; i < 3; i++) {
        result[i] = a[i] * b[i];
    }
    return result;
}

// forward Float:[3]v3muls(Float:a[3], Float:b);
stock Float:v3muls(Float:a[3], Float:b)
{
    new Float:result[3];
    for (new i = 0; i < 3; i++) {
        result[i] = a[i] * b;
    }
    return result;
}

// code recreated from https://github.com/ValveSoftware/halflife/blob/b1b5cf5892918535619b2937bb927e46cb097ba1/dlls/triggers.cpp#L1837
UTIL_Remove(entity)
{
    if (!is_valid_ent(entity))
    {
        return;
    }
    
    ExecuteHam(Ham_NS_UpdateOnRemove, entity);
    
    set_pev(entity, pev_flags, pev_i(entity, pev_flags) | FL_KILLME);
    set_pev(entity, pev_targetname, 0);
}

public OnTouch_TriggerPush(entity, toucher)
{
    new movetype = pev_i(toucher, pev_movetype);
    if (movetype == MOVETYPE_NONE
        || movetype == MOVETYPE_PUSH
        || movetype == MOVETYPE_NOCLIP
        || movetype == MOVETYPE_FOLLOW)
    {
        return HAM_SUPERCEDE;
    }
    new solid = pev_i(toucher, pev_solid);
    if (solid != SOLID_NOT && solid != SOLID_BSP)
    {
        // Instant trigger, just transfer velocity and remove
        new Float:speed = pev_f(entity, pev_speed);
        new Float:movedir[3];
        pev(entity, pev_movedir, movedir);
        new Float:vecPush[3];
        vecPush = v3muls(movedir, speed);
        new flags = pev_i(toucher, pev_flags);
        
        
        if (pev_i(entity, pev_spawnflags) & SF_TRIG_PUSH_ONCE)
        {
            new Float:velocity[3];
            pev(toucher, pev_velocity, velocity);
            velocity = v3add(velocity, vecPush);
            set_pev(toucher, pev_velocity, velocity);
            if (velocity[2] > 0)
            {
                set_pev(toucher, pev_flags, flags & (~FL_ONGROUND));
            }
            UTIL_Remove(entity);
        }
        else
        {
            // Push field, transfer to base velocity
            if (flags & FL_BASEVELOCITY)
            {
                new Float:basevelocity[3];
                pev(toucher, pev_basevelocity, basevelocity);
                vecPush = v3add(vecPush, basevelocity);
            }
            else
            {
                entity_set_int(toucher, EV_INT_flags, entity_get_int(toucher, EV_INT_flags) | FL_BASEVELOCITY);
            }
            
            set_pev(toucher, pev_basevelocity, vecPush);
            
            // ALERT( at_console, "Vel %f, base %f\n", pevToucher->velocity.z, pevToucher->basevelocity.z );
        }
    }
    return HAM_SUPERCEDE;
}
 

Вложения

  • 355.5 KB Просмотры: 24
Сообщения
17
Реакции
2
Можно закрывать. Решил сегодня ещё немного потеребонькать жпт и что-то более менее рабочее получилось. Возможно не на всех картах будет работать корректно (при 1000 вообще может запульнуть к чертям), но делал под конкретную карту и косяки поправил уже в ней.

Код:
#include <amxmodx>
#include <reapi>
#include <hamsandwich>
#include <xs>

#define DEFAULT_PUSH_SCALE 0.15
#pragma semicolon 1

new bool:g_isTouching[MAX_PLAYERS + 1];
new Float:g_pushScale;

public plugin_init()
{
    register_plugin("trigger_push fix (ReAPI)", "1.1", "www.mon.gs");
    RegisterHam(Ham_Touch, "trigger_push", "OnTouch_TriggerPush");
    register_cvar("trigger_push_scale", "0.25", FCVAR_SERVER);
}

public OnTouch_TriggerPush(ent, id)
{
    if (!is_user_alive(id) || is_user_bot(id))
        return HAM_IGNORED;

    g_isTouching[id] = true;

    new MoveType:movetype = MoveType:get_entvar(id, var_movetype);
    if (movetype == MoveType:MOVETYPE_NONE ||
        movetype == MoveType:MOVETYPE_PUSH ||
        movetype == MoveType:MOVETYPE_NOCLIP ||
        movetype == MoveType:MOVETYPE_FOLLOW)
        return HAM_SUPERCEDE;

    new Solid:solid = get_entvar(id, var_solid);
    if (solid == Solid:SOLID_NOT || solid == Solid:SOLID_BSP)
        return HAM_SUPERCEDE;

    new Float:speed = get_entvar(ent, var_speed);
    new Float:movedir[3];
    get_entvar(ent, var_movedir, movedir);

    g_pushScale = get_cvar_float("trigger_push_scale");
    if (g_pushScale <= 0.0)
        g_pushScale = DEFAULT_PUSH_SCALE;

    new Float:vecPush[3];
    xs_vec_mul_scalar(movedir, speed * g_pushScale, vecPush);
    xs_vec_mul_scalar(vecPush, g_pushScale, vecPush);

    if (vecPush[2] > 0.0 && vecPush[2] < 60.0)
        vecPush[2] = 60.0;

    set_entvar(id, var_basevelocity, vecPush);

    if (get_entvar(ent, var_spawnflags) & SF_TRIGGER_PUSH_ONCE)
    {
        set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);
        set_entvar(ent, var_targetname, 0);
    }

    return HAM_SUPERCEDE;
}
 

Вложения

  • 13.1 KB Просмотры: 34
Статус
В этой теме нельзя размещать новые ответы.

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

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