На карте имеется несколкьо 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