Parachute флуд

Сообщения
83
Реакции
42
Помог
1 раз(а)
Прошу прощения, в чём смысл плагина парашюта без модели парашюта, помимо мнимой оптимизации? Это же эстетически и логически не верно...
 
Сообщения
67
Реакции
85
Leo_BH, Как так получилось, что у вас 11.0 версия "разработки" на 20 строк кода
Не воспринимай серьёзно. Было весёлое настроение, прибавлял по номеру версии за каждую мелкую правку.

В чем суть махинаций с гравитацией? Не улавливаю
C-like:
#include <amxmodx>
#include <reapi>
#define    get_bit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    set_bit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    clr_bit(%1,%2)    %1 &= ~(1 << (%2 & 31))
new g_bitAlive;
const Float:fall_speed = -100.0
public plugin_init(){
    register_plugin("Parachute Lite [ReAPI]", "12.0", "Leo_[BH]");
    RegisterHookChain(RG_CBasePlayer_Spawn, "RG_Spawn_Post", 1);
    RegisterHookChain(RG_CBasePlayer_Killed, "RG_Player_Killed", 0);
    RegisterHookChain(RG_CBasePlayer_PreThink, "RG_client_PreThink");
}
public RG_Spawn_Post(id) if(is_user_alive(id)) set_bit(g_bitAlive, id);
public RG_Player_Killed(id) clr_bit(g_bitAlive, id);
public RG_client_PreThink(id){
    if(!get_bit(g_bitAlive, id)) return;
    if (get_entvar(id, var_button) & IN_USE) {
        static Float:velocity[3]
        get_entvar(id, var_velocity, velocity);
        if (velocity[2] < 0.0) {
            velocity[2] = (velocity[2] + 40.0 < fall_speed) ? velocity[2] + 40.0 : fall_speed ;
            set_entvar(id, var_velocity, velocity);
        }
    }
}
#if AMXX_VERSION_NUM < 183
public client_disconnect(id) clr_bit(g_bitAlive, id);
#else
public client_disconnected(id) clr_bit(g_bitAlive, id);
#endif
awp_zigzag в помощь
Игрок зажал клавишу E и держал зажатой до столкновения с землёй.
Игрок зажал клавишу E и отпустил её в воздухе за короткое время до столкновения с землёй.
Использовать разные высоты для прыжков.
Если при любых обстоятельствах игрок не получает никакого урона от падения, тогда махинации с гравитацией здесь были бесполезные.
Кто решит проверить версию Lite 12.0 и предоставить отчёт о тестах, буду благодарен.
 
Последнее редактирование:
Сообщения
2,723
Реакции
2,997
Помог
60 раз(а)
Если это некая имитация физики, то еще как тот обосновано, но тогда это не lite
 
Сообщения
67
Реакции
85
Прошу прощения, в чём смысл плагина парашюта без модели парашюта, помимо мнимой оптимизации? Это же эстетически и логически не верно...
Мое личное мнение - парашют, это какая-то дичь, совсем не уместная в геймплее кс. Но скажи это владельцам серверов, которые ставят на свои сервера парашюты. И игрокам, которые говорят:
Парашют на сервере - КРУТО!
А таких полно.
Плагин я делал как раз потому, что у меня просили его сделать.

А почему ставят именно без модели:
Парашют без модели, он же сервер меньше грузит... (мнимая оптимизация)
Я поставлю парашют без модели, чтобы игрокам не закачивать модель себе в клиент (неумение пользоваться FastHTTPDownload)
Парашют нужен без модели, чтобы не отвлекать других игроков
Парашют нужен без модели, потому-что его использования сильно "палит" и тебя убивают!
Набор мнений основан на общении с владельцами серверов, игроками и случайными комментариями с сайтов.

А если уж дело зашло о логике...
Применение хотя-бы условно реалистичного парашюта в игре подразумевает под собой некое время на его раскрытия, только после чего должно следовать условное замедление в воздухе. По логике, зажимаем "E", и только на после ~ второй секунды начинаем замедление. И еще, парашют должен иметь обоснованную модель в виде рюкзака на спине и будет одноразовым (на 2 или 3 использования, как делаются парашюты(точнее основной и запасной/запасные)). Но практическое применение в Counter-Strike на большинстве карт этого условно логичного плагина парашюта сводится к нулю, это будет уместно только на очень высоких картах. Добавьте еще сюда звуки при раскрытии парашюта, звуки ветра при полете - вот вам и идея для реализации плагина, отличная в теории, но почти бесполезная на практике. Одна с тех идей, которые мне когда-то приходили в голову, но я от ее реализации отказался.

В целом, парашют в кс, который мы знаем, по логике вовсе не армейский парашют, а ближе к зонтику, на котором летают в мультиках и мультяшных играх. Кстати, неплохая идея для моделлеров - зонтик вместо парашюта в кс :smile3:
 
Сообщения
478
Реакции
249
Помог
6 раз(а)
Я поставлю парашют без модели, чтобы игрокам не закачивать модель себе в клиент (неумение пользоваться FastHTTPDownload)
В смысле неумение пользоваться FastHTTPDownload? Вы чёт недооцениваете владельцев серверов) Я думаю, это все умеют хотя-бы потому, что многие мониторинги требуют наличия FastDL. На популярных хостингах быстрая загрузка вообще автоматизирована, а те, кого угораздило поместить сервер на VDS или на свой комп, тем более понимают, что к чему. Да и вообще, это очень просто организовать.

Я вот пользуюсь парашютом без модели потому, что у меня принцип, чистый приближённый к классике паблик, с которого не грузится ни единого файла при первом коннекте кроме карт.
 
Сообщения
67
Реакции
85
В смысле неумение пользоваться FastHTTPDownload? Вы чёт недооцениваете владельцев серверов)
Безусловно, большинство владельцев серверов умеют ею пользоваться.
Просто после таких редких случаев:
123.PNG
Понятно, что не все.
21 Янв 2019
Я вот пользуюсь парашютом без модели потому, что у меня принцип, чистый приближённый к классике паблик, с которого не грузится ни единого файла при первом коннекте кроме карт.
Ну и отлично, можно это добавить в набор мнений, <<почему я ставлю парашют без модели>>.
 
Сообщения
337
Реакции
73
Предупреждения
9
Помог
1 раз(а)
Leo_BH, я этим уже 2 года пользуюсь. Какой лучше?

Код:
#include <amxmodx>
#include <hamsandwich>
#include <engine>

#define PARACHUTE_FLAG ADMIN_ALL // ADMIN_ALL для доступа всем игрокам

new g_iAlive[33];
new bool:g_bAccess[33];

public plugin_init()
{
    register_plugin("Parachute", "1.1", "maeStro | neygomon");
   
    RegisterHam(Ham_Spawn, "player", "fwdHamPlayerSpawn", true);
    RegisterHam(Ham_Killed, "player", "fwdHamPlayerKilled", true);
}

public client_putinserver(pClient)
{
    g_iAlive[pClient] = 0;
    g_bAccess[pClient] = (get_user_flags(pClient) & PARACHUTE_FLAG) ? true : false;
}
   
public fwdHamPlayerSpawn(pClient)
    g_iAlive[pClient] = is_user_alive(pClient);

public fwdHamPlayerKilled(pVictim)
    g_iAlive[pVictim] = 0;  
   
public client_PreThink(id)
{
    if(!g_iAlive[id] || ~get_user_button(id) & IN_USE || get_entity_flags(id) & FL_ONGROUND) return;

    static Float:velocity[3]; entity_get_vector(id, EV_VEC_velocity, velocity);
    if(velocity[2] < 0)
    {
        velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0;
        entity_set_vector(id, EV_VEC_velocity, velocity);
    }
}
 
Сообщения
67
Реакции
85
Leo_BH, я этим уже 2 года пользуюсь. Какой лучше?

Код:
#include <amxmodx>
#include <hamsandwich>
#include <engine>

#define PARACHUTE_FLAG ADMIN_ALL // ADMIN_ALL для доступа всем игрокам

new g_iAlive[33];
new bool:g_bAccess[33];

public plugin_init()
{
    register_plugin("Parachute", "1.1", "maeStro | neygomon");

    RegisterHam(Ham_Spawn, "player", "fwdHamPlayerSpawn", true);
    RegisterHam(Ham_Killed, "player", "fwdHamPlayerKilled", true);
}

public client_putinserver(pClient)
{
    g_iAlive[pClient] = 0;
    g_bAccess[pClient] = (get_user_flags(pClient) & PARACHUTE_FLAG) ? true : false;
}

public fwdHamPlayerSpawn(pClient)
    g_iAlive[pClient] = is_user_alive(pClient);

public fwdHamPlayerKilled(pVictim)
    g_iAlive[pVictim] = 0;

public client_PreThink(id)
{
    if(!g_iAlive[id] || ~get_user_button(id) & IN_USE || get_entity_flags(id) & FL_ONGROUND) return;

    static Float:velocity[3]; entity_get_vector(id, EV_VEC_velocity, velocity);
    if(velocity[2] < 0)
    {
        velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0;
        entity_set_vector(id, EV_VEC_velocity, velocity);
    }
}
Теоретически - этот:
C-like:
#include <amxmodx>
#include <reapi>
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
new g_bitAlive;
public plugin_init(){
register_plugin("Parachute Lite [ReAPI]", "14.0", "Leo_[BH]");
RegisterHookChain(RG_CBasePlayer_Spawn, "RG_Spawn_Post", 1);
RegisterHookChain(RG_CBasePlayer_Killed, "RG_Player_Killed", 1);
RegisterHookChain(RG_CBasePlayer_PreThink, "RG_client_PreThink");
}
public RG_Spawn_Post(id) if(is_user_alive(id)) set_bit(g_bitAlive, id);
public RG_Player_Killed(id) clr_bit(g_bitAlive, id);
#if AMXX_VERSION_NUM < 183
public client_disconnect(id) clr_bit(g_bitAlive, id);
#else
public client_disconnected(id) clr_bit(g_bitAlive, id);
#endif
public RG_client_PreThink(id){
if(!get_bit(g_bitAlive, id)) return;
if(get_entvar(id, var_button) & IN_USE){
static Float:velocity[3]; get_entvar(id, var_velocity, velocity);
if (velocity[2] < 0.0) {
velocity[2] = (velocity[2] + 40.0 < -100.0) ? velocity[2] + 40.0 : -100.0 ;
set_entvar(id, var_velocity, velocity);
}
}
}
Но еще меньшую нагрузку в теории дает Parachute 1.1 ReHLDS Team. Код есть тут
В целом, наиболее выгодный вариант хука движения игрока в воздухе для использования под парашют является:
PM_Move() -> PM_PlayerMove()-> PM_AirMove() , который вызывается только в случае:
Код:
// determine if we are not on ground
if(pmove->onground == -1)
 
Последнее редактирование:
Сообщения
83
Реакции
42
Помог
1 раз(а)
Мое личное мнение - парашют, это какая-то дичь, совсем не уместная в геймплее кс.
Дичь - это когда игрок парит без модели (имхо). Существуют карты, на которых без него реально неудобно играть.
В том же Battlefield он есть и думаю дикого дисбаланса в CS 1.6 он не вносит, тем более, если сервер - паблик.

Кстати говоря в своё время у меня стоял
Код:
#include <amxmodx>
#include <fakemeta>  
#include <hamsandwich>

//#define PARACHUTE_LEVEL ADMIN_LEVEL_E

#define _PLUGIN         "[ZP] Parachute"
#define _VERSION             "1.0"
#define _AUTHOR           "H.RED.ZONE"

#define PARACHUTE_MODEL "models/parachute.mdl"
                     
#define MAX_PLAYERS    32

#define MarkUserHasParachute(%0)    g_bitHasParachute |= (1<<(%0&31))
#define ClearUserHasParachute(%0)    g_bitHasParachute &= ~(1<<(%0&31))
#define HasUserParachute(%0)        g_bitHasParachute & (1<<(%0&31))

new g_bitHasParachute

new g_iUserParachute[MAX_PLAYERS+1]

new Float:g_flEntityFrame[MAX_PLAYERS+1]

new g_iModelIndex
new g_pCvarFallSpeed

new const PARACHUTE_CLASS[] = "parachute"

enum {
    deploy,
    idle,
    detach
}

public plugin_init() {
    register_plugin(_PLUGIN, _VERSION, _AUTHOR)

    g_pCvarFallSpeed = register_cvar("parachute_fallspeed", "100")

    register_forward( FM_CmdStart, "fw_Start" ) // *** Особенно нагрузочный форвад! ***

    RegisterHam(Ham_Spawn, "player", "Ham_CBasePlayer_Spawn_Post", 1)
    RegisterHam(Ham_Killed, "player", "Ham_CBasePlayer_Killed_Post", 1)
}

public plugin_precache() {
    g_iModelIndex = precache_model(PARACHUTE_MODEL)
}

public client_putinserver(id) {
    if( HasUserParachute(id) ) {
        new iEnt = g_iUserParachute[id]
        if( iEnt ) {
            RemoveUserParachute(id, iEnt)
        }
        ClearUserHasParachute(id)
    }
}

public client_disconnected(id) {
    if( HasUserParachute(id) ) {
        new iEnt = g_iUserParachute[id]
        if( iEnt ) {
            RemoveUserParachute(id, iEnt)
        }
        ClearUserHasParachute(id)
    }
}

public Ham_CBasePlayer_Killed_Post( id ) {
    if( HasUserParachute(id) ) {
        new iEnt = g_iUserParachute[id]
        if( iEnt ) {
            RemoveUserParachute(id, iEnt)
        }
        ClearUserHasParachute(id)
    }
}

public Ham_CBasePlayer_Spawn_Post(id) {
    if( is_user_alive(id) ) {
        if( HasUserParachute(id) ) {
            new iEnt = g_iUserParachute[id]
            if( iEnt ) {
                RemoveUserParachute(id, iEnt)
            }
        }
        MarkUserHasParachute(id)
    }
}

RemoveUserParachute(id, iEnt) {
    engfunc(EngFunc_RemoveEntity, iEnt)
    g_iUserParachute[id] = 0
}

CreateParachute(id) {
    static iszInfoTarget
    if( !iszInfoTarget ) {
        iszInfoTarget = engfunc(EngFunc_AllocString, "info_target")
    }

    new iEnt = engfunc(EngFunc_CreateNamedEntity, iszInfoTarget)
    if( iEnt > 0) {
        static iszClass = 0
        if( !iszClass ) {
            iszClass = engfunc(EngFunc_AllocString, PARACHUTE_CLASS)
        }
        set_pev_string(iEnt, pev_classname, iszClass)
        set_pev(iEnt, pev_aiment, id)
        set_pev(iEnt, pev_owner, id)
        set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)

        static iszModel = 0
        if( !iszModel ) {
            iszModel = engfunc(EngFunc_AllocString, PARACHUTE_MODEL)
        }
        set_pev_string(iEnt, pev_model, iszModel)
        set_pev(iEnt, pev_modelindex, g_iModelIndex)

        set_pev(iEnt, pev_sequence, deploy)
        set_pev(iEnt, pev_gaitsequence, 1)
        set_pev(iEnt, pev_frame, 0.0)

        //set_pev(iEnt, pev_rendermode, pev(id, pev_rendermode));
        //set_pev(iEnt, pev_renderfx, pev(id, pev_renderfx));
        //new Float:f_renderamt;
        //pev(id, pev_renderamt, f_renderamt);
        //set_pev(iEnt, pev_renderamt, f_renderamt);

        g_flEntityFrame[id] = 0.0
        g_iUserParachute[id] = iEnt
        MarkUserHasParachute(id)
        new Float:fVecOrigin[3]
        pev(id, pev_origin, fVecOrigin)

        return iEnt
    }
    return 0
}

public fw_Start(id) {
    if( ~HasUserParachute(id) || !is_user_alive(id) ) {
        return
    }
    //if( !(get_user_flags(id) & PARACHUTE_LEVEL) ) {
        //return
    //}

    new Float:flFrame
    new iEnt = g_iUserParachute[id]

    if(iEnt > 0 && pev(id, pev_flags) & FL_ONGROUND) {

        if( pev(iEnt, pev_sequence) != detach ) {
            set_pev(iEnt, pev_sequence, detach)
            set_pev(iEnt, pev_gaitsequence, 1)
            set_pev(iEnt, pev_frame, 0.0)
            g_flEntityFrame[id] = 0.0
            set_pev(iEnt, pev_animtime, 0.0)
            set_pev(iEnt, pev_framerate, 0.0)
            return
        }

        pev(iEnt, pev_frame, flFrame)
        if( flFrame > 252.0 ) {
            RemoveUserParachute(id, iEnt)
            return
        }

        flFrame += 2.0

        g_flEntityFrame[id] = flFrame
        set_pev(iEnt, pev_frame, flFrame)

        return
    }

    if( pev(id, pev_button) & IN_USE ) {
        new Float:fVecVelocity[3], Float:fVelocity_z
        pev(id, pev_velocity, fVecVelocity)
        fVelocity_z = fVecVelocity[2]

        if( fVelocity_z < 0.0 ) {
            if(iEnt <= 0) {
                iEnt = CreateParachute(id)
            }

            fVelocity_z = floatmin(fVelocity_z + 15.0, -get_pcvar_float(g_pCvarFallSpeed))
            fVecVelocity[2] = fVelocity_z
            set_pev(id, pev_velocity, fVecVelocity)

            if( pev(iEnt, pev_sequence) == deploy ) {
                flFrame = g_flEntityFrame[id]++

                if( flFrame > 100.0 ) {
                    set_pev(iEnt, pev_animtime, 0.0)
                    set_pev(iEnt, pev_framerate, 0.4)
                    set_pev(iEnt, pev_sequence, idle)
                    set_pev(iEnt, pev_gaitsequence, 1)
                    set_pev(iEnt, pev_frame, 0.0)
                    g_flEntityFrame[id] = 0.0
                }
                else {
                    set_pev(iEnt, pev_frame, flFrame)
                }
            }
        }
        else if(iEnt > 0) {
            RemoveUserParachute(id, iEnt)
        }
    }
    else if( iEnt > 0 && pev(id, pev_oldbuttons) & IN_USE ) {
        RemoveUserParachute(id, iEnt)
    }
}
Да, код жестокий, но лагов или ухудшений той же изменчивой стрельбы из игроков никто не ощущал.
 
Последнее редактирование:
Сообщения
160
Реакции
170
Помог
1 раз(а)
1. Парашют без модели = безалкогольному пиву,раз нет модели значит парашютом его называть нельзя.
2. Мнение что модель грузит сервер нелогично,при закачке новых карт грузится на много больше новых моделей и большинство клиентов даже не подозревают об этом.
3. Парашют палит. Любишь кататься люби и саночки возить.У любого плюса должен быть минус.
Думаю нет смысла ставить парашют без модели, намного проще убрать урон от падения или попробовать поставить менее паленную модель.
 

Вложения

Сообщения
3,388
Реакции
1,485
Помог
125 раз(а)
Leo_BH, wopox1337, а что насчет такого парашюта?

Код:
#include <amxmodx>
#include <engine>
#include <hamsandwich>
 
public plugin_init()
{
   register_plugin("Parachute", "1.0", "maeStro");
   RegisterHam(Ham_ObjectCaps, "player", "FwdHamObjectCaps");   
}
 
public FwdHamObjectCaps(id)
{
    if (!is_user_alive(id)||get_entity_flags(id) & FL_ONGROUND) return;
    static Float:velocity[3];
    entity_get_vector(id, EV_VEC_velocity, velocity);
    if(velocity[2] < 0)
    {
        velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0;
        entity_set_vector(id, EV_VEC_velocity, velocity);
    }
}
 
Сообщения
3,388
Реакции
1,485
Помог
125 раз(а)
fantom, поставил. у клиента повышается пинг под 90-100 с 25-27 при использовании парашюта, при этом у меня всё нормально.
Сейчас подвезу видео
23 Янв 2019

Смотреть пинг игрока НННННННННННННННННННННННН
 

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

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