Склад полезного кода [GoldSrc]

Сообщения
443
Реакции
319
Помог
13 раз(а)
https://dev-cs.ru/resources/50/
модели

спрайты ни откуда. Пока вспомнишь название плагина 100 лет пройдет. Стоки удобнее и индексируются.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Очень простой сток поиска оружия у игрока
Код:
stock rg_get_player_item(const id, const WeaponIdType:wid, const InventorySlotType:slot = NONE_SLOT) {
    new item = get_member(id, m_rgpPlayerItems, slot);
    while (!is_nullent(item)) {
        if (get_member(item, m_iId) == wid) {
            return item;
        }
        item = get_member(item, m_pNext);
    }

    return 0;
}
 
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
fantom, rg_has_item_by_name(const index, const item[])?
 
Последнее редактирование модератором:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
fl0wer, не вовращает ентити
 
Последнее редактирование модератором:
Сообщения
443
Реакции
319
Помог
13 раз(а)
Ищет по имени.
 
Последнее редактирование модератором:

Garey

ninjaCow
Сообщения
411
Реакции
1,051
Помог
10 раз(а)
Функция для генерации версии билда в стиле Valve Software. Может использоваться если лень менять версии в исходнике.
C-like:
stock valve_build_number(date[])
{ 
    static mond[12] =
    { 31,    28,    31,    30,    31,    30,    31,    31,    30,    31,    30,    31 };
    new m, d, y, b = 0;


    new mon = str_to_num(date[0])
    for (m = 0; m < 11; m++)
    {
        if (mon == m+1)
            break;
        d += mond[m];
    }

    d += str_to_num(date[3]) - 1;
    y = str_to_num(date[6]) - 1900;
    b = d + floatround((y - 1) * 365.25, floatround_floor);

    if (((y % 4) == 0) && m > 1)
    {
        b += 1;
    }
    return b;
}
Использование:
register_plugin(PLUGIN, fmt("%d", valve_build_number(__DATE__)-valve_build_number("10/24/1996")), AUTHOR);
Где вычитается дата генерированная при компиляции и дата первого релиза (для примера дата из Half-Life). и получается количество дней между этими датами. Например в последней версии HLDS это 8308
 
Сообщения
58
Реакции
2
Помог
2 раз(а)
Упращенное получение значения кваров сразу же после регистрации в plugin_init или же в других функциях по выбору.
Не придумал как проще реализовать get_cvar_isplit, если каждое проверять, получиться больше итераций, но для того, что бы показать как можно реализовать всё, сгодиться и такое исполнение

Код:
// get_cvar_ifloat( "cvar_param_float", "1.1" )
stock Float:get_cvar_ifloat( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return get_pcvar_float( t_cvar )
}

// get_cvar_iint( "cvar_param_int", "1" )
stock get_cvar_iint( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return get_pcvar_num( t_cvar )
}

// get_cvar_iflags( "cvar_param_flags", "ace" )
// or
// get_cvar_iflags( "cvar_param_flags", "all" )
stock get_cvar_iflags( key[], value[] )
{
    static t_cvar, tszcvar[25]
    t_cvar = register_cvar( key, value )
    get_pcvar_string(t_cvar,tszcvar,charsmax(tszcvar))
    return ( ( equal(tszcvar, "all") ) ? ADMIN_ALL : read_flags(tszcvar) )
}

// get_cvar_ibool( "cvar_param_bool", "1" )
stock bool:get_cvar_ibool( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return bool:( get_pcvar_num( t_cvar ) )
}

// get_cvar_isplit( "cvar_param_split", "240.0 43 0" )
stock get_cvar_isplit( key[], value[], wtype )
{
    static t_cvar, tszcvar[25], values[3][8]
    t_cvar = register_cvar( key, value )
    get_pcvar_string(t_cvar,tszcvar,charsmax(tszcvar))
    parse( tszcvar, values[0], 7, values[1], 7, values[2], 7 )
    new Float:param1 = str_to_float( values[0] )
    new param2 = str_to_num( values[1] )
    new bool:param3 = bool(str_to_num( values[1] ))
    return true
}
 
Последнее редактирование:
Сообщения
58
Реакции
2
Помог
2 раз(а)
Когда то написал эти строки, что бы запретить игрокам ставить объект не долеко от спавна противника.
Проверка находиться ли игрок в радиусе от спавна противника.

Код:
stock bool:check_player_spawn( id, Float:radius = 100.0 )
{
    static Float:origin[ 3 ], ent, szClassName[32], CsTeams:myTeam;
    ent = -1;
    myTeam = cs_get_user_team( id )
    get_entvar( id, var_origin, origin )
    
    while ( ( ent = find_ent_in_sphere( ent, origin, radius ) ) )
    {
        get_entvar( ent, var_classname, szClassName, charsmax ( szClassName ) )
        
        if( equal( szClassName, "info_player_start" ) && myTeam == CS_TEAM_T )
        {
            return true;
        } else if( equal( szClassName, "info_player_deathmatch" ) && myTeam == CS_TEAM_CT )
        {
            return true;
        }
    }
    
    return false;
}
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
pro100iweb, раз уже используется реапи, почему бы не избавиться от cstrike ?
 
Последнее редактирование модератором:
Сообщения
58
Реакции
2
Помог
2 раз(а)
Nordic Warrior, это как пример и к тому же не могу заменить на m_iTeam
 
Последнее редактирование модератором:
Сообщения
58
Реакции
2
Помог
2 раз(а)
Увидел продавали мод DM, где мне очень понравился щит, а именно то как он защищает от пушек. Только аналог EngFunc_TraceLine не нашел в ReApi

Код:
stock ProtectedShield( entity, target )
{
    static Float:EntityOrigin[3], Float:TargetOrigin[3], tr;
    get_entvar( entity, var_origin, EntityOrigin )
    get_entvar( target, var_origin, TargetOrigin )
    engfunc( EngFunc_TraceLine, EntityOrigin, TargetOrigin, DONT_IGNORE_MONSTERS, entity, tr )
   
    // Что видим и есть ли щит
    if( get_tr2( tr, TR_iHitgroup ) == 8 && get_member( target, m_bOwnsShield ) )
    {
        return true;
    }
   
    return false;
}
 
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
Упращенное получение значения кваров сразу же после регистрации в plugin_init или же в других функциях по выбору.
Не придумал как проще реализовать get_cvar_isplit, если каждое проверять, получиться больше итераций, но для того, что бы показать как можно реализовать всё, сгодиться и такое исполнение

Код:
// get_cvar_ifloat( "cvar_param_float", "1.1" )
stock Float:get_cvar_ifloat( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return get_pcvar_float( t_cvar )
}

// get_cvar_iint( "cvar_param_int", "1" )
stock get_cvar_iint( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return get_pcvar_num( t_cvar )
}

// get_cvar_iflags( "cvar_param_flags", "ace" )
// or
// get_cvar_iflags( "cvar_param_flags", "all" )
stock get_cvar_iflags( key[], value[] )
{
    static t_cvar, tszcvar[25]
    t_cvar = register_cvar( key, value )
    get_pcvar_string(t_cvar,tszcvar,charsmax(tszcvar))
    return ( ( equal(tszcvar, "all") ) ? ADMIN_ALL : read_flags(tszcvar) )
}

// get_cvar_ibool( "cvar_param_bool", "1" )
stock bool:get_cvar_ibool( key[], value[] )
{
    static t_cvar
    t_cvar = register_cvar( key, value )
    return bool:( get_pcvar_num( t_cvar ) )
}

// get_cvar_isplit( "cvar_param_split", "240.0 43 0" )
stock get_cvar_isplit( key[], value[], wtype )
{
    static t_cvar, tszcvar[25], values[3][8]
    t_cvar = register_cvar( key, value )
    get_pcvar_string(t_cvar,tszcvar,charsmax(tszcvar))
    parse( tszcvar, values[0], 7, values[1], 7, values[2], 7 )
    new Float:param1 = str_to_float( values[0] )
    new param2 = str_to_num( values[1] )
    new bool:param3 = bool(str_to_num( values[1] ))
    return true
}
Есть bind_pcvar_*

Когда то написал эти строки, что бы запретить игрокам ставить объект не долеко от спавна противника.
Проверка находиться ли игрок в радиусе от спавна противника.

Код:
stock bool:check_player_spawn( id, Float:radius = 100.0 )
{
    static Float:origin[ 3 ], ent, szClassName[32], CsTeams:myTeam;
    ent = -1;
    myTeam = cs_get_user_team( id )
    get_entvar( id, var_origin, origin )
 
    while ( ( ent = find_ent_in_sphere( ent, origin, radius ) ) )
    {
        get_entvar( ent, var_classname, szClassName, charsmax ( szClassName ) )
     
        if( equal( szClassName, "info_player_start" ) && myTeam == CS_TEAM_T )
        {
            return true;
        } else if( equal( szClassName, "info_player_deathmatch" ) && myTeam == CS_TEAM_CT )
        {
            return true;
        }
    }
 
    return false;
}
Можно онли реапи.

Увидел продавали мод DM, где мне очень понравился щит, а именно то как он защищает от пушек. Только аналог EngFunc_TraceLine не нашел в ReApi

Код:
stock ProtectedShield( entity, target )
{
    static Float:EntityOrigin[3], Float:TargetOrigin[3], tr;
    get_entvar( entity, var_origin, EntityOrigin )
    get_entvar( target, var_origin, TargetOrigin )
    engfunc( EngFunc_TraceLine, EntityOrigin, TargetOrigin, DONT_IGNORE_MONSTERS, entity, tr )
 
    // Что видим и есть ли щит
    if( get_tr2( tr, TR_iHitgroup ) == 8 && get_member( target, m_bOwnsShield ) )
    {
        return true;
    }
 
    return false;
}
Можно просто хитбокс щита включить игроку.
 
Последнее редактирование модератором:
Сообщения
58
Реакции
2
Помог
2 раз(а)
fl0wer, как бы я на тот момент использовал пример из regamedll
А вот bind_pcvar_ на 1.8.2 не было, так что использую то, что есть
Можно онли реапи.
Ну тут если кому то очень хочется его использовать, то может использовать CBasePlayer_Members структуру из reapi
 
Последнее редактирование модератором:
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
А вот bind_pcvar_ на 1.8.2 не было, так что использую то, что есть
Здесь не поддерживаются унылые версии.

Ну тут если кому то очень хочется его использовать, то может использовать CBasePlayer_Members структуру из reapi
А в кстрайке не тоже самое?
11 Мар 2020
как бы я на тот момент использовал пример из regamedll
Там нет такого треша.
 
Последнее редактирование модератором:
Сообщения
58
Реакции
2
Помог
2 раз(а)
Здесь не поддерживаются унылые версии.
Для кого как, но я мыслю логически. учитывая каждую деталь, да бы не возникло недоразумений в момент эксплуатации того или иного продукта в продакшене.

А в кстрайке не тоже самое?
Я так и не могу понять, что с ним не так, любой может использовать то, что ему нравиться.

Там нет такого треша.
Видим я мыслю иначе, так как вижу код по другому.
1583941622127.png
 
Последнее редактирование модератором:
Сообщения
443
Реакции
319
Помог
13 раз(а)
Преобразовывает ячейку в вид float'а без вызовов конструктора.
Int32 to float representation in pawn.
Код:
static const SING_CONST = 0x80000000;
stock Float:itof(num){
    static _exp,_isNegative,_abs,_mantissa;
    if (!num)return 0.0;
    _exp=158; _isNegative=0, _abs = num;
    if (num < 0){
        _isNegative = SING_CONST;
        _abs = -num;     // less memory using? im'not sure, maybe we should use bitwise operation + 1?
                        // btw i think it's better to use - there instead bitiwse.
    }
    while (!(_abs & SING_CONST)){_exp--;_abs <<= 1;}
    _mantissa=_abs>>8;
    return Float:(_isNegative | (_exp << 23) | (_mantissa & 0x7fffff));
}
Код:
new num123 = 5;
new num1234 = itof(num123);
server_print("%d is %d %f",num123, num1234, Float:num1234);
// output: 5 is 1084227584 5.000000
 
Последнее редактирование:
Сообщения
443
Реакции
319
Помог
13 раз(а)
Float to int representation.
floatround по скорости - быстрее.
C++:
ftoi(Float: num){
    static iNum, isNeg, _exp, _mantissa, i;
    iNum = _:num;
    isNeg = ((iNum >> 31)&1);
    _exp=((iNum >> 23)&0xFF); if(!_exp)return 0;
    _mantissa = ((iNum>>0)&0x7FFFFF)|0x800000;
    i = _mantissa>>(22-(_exp-128));
    return isNeg?-i:i;
}
C++:
server_print("%d %f is %d %f",num123, num123, num1234, Float:num1234);
// output is: 1084227584 5.000000 is 5 0.000000
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Player Team Changed event's.
Второй раз не буду писать текст так как в прошлый раз у меня 'У вас упала вкладка. Отправить данные в Mozilla Inc.?', бекапящий плагин форума тоже не сработал.

Кратко: позволяет отловить события смены команды, нужен лишь тем кто действительно понимает зачем. На данный момент намеренно пропускает backup -> new -> backup события происходящие в одном фрейме. Если вам действительно нужно чтобы и такие события ловились - пишите, сделаю.

Latest version: https://dev-cs.ru/threads/222/post-85730
Usage example:
C++:
#include <amxmodx>
#include <TeamChanged>

new const JUST_CONNECTED = -1;
new const DISCONNECTED = -2;
new playerTeams[32];

public client_putinserver(id){
    playerTeams[id-1]=JUST_CONNECTED;
}

public client_disconnected(id){
    playerTeams[id-1]=DISCONNECTED;
}
new fwd;
public plugin_init(){
    fwd = RegisterTeamChanged("OnTeamChanged");
}

public OnTeamChanged(const player, const oldTeam, const newTeam, const forwardIndex){
    client_print(0,print_chat,"Player %n changed team from %d to %d",player, oldTeam, newTeam);
    playerTeams[player-1]=newTeam;
    // ...
    // maybe also you should add connection check's, depend's on your implementation
}
C++:
/*
* Hook player changed team event
*
* @note The function will be called in the following manner:
*
* public Handler(const player, const newTeam, const oldTeam, const forwardIndex)
*
*   player             - Client index
*   newTeam            - New team
*   oldTeam            - Previous team
*   forwardIndex    - Forward value which was returned from RegisterTeamChanged
*
* @param callback    The forward to call
*
* @return            Returns a hook handle. Use EnableTeamChanged/DisableTeamChanged to toggle the forward on or off
*/
native RegisterTeamChanged(const callback[]);

/*
* Unregisters and remove a hook handle.
* Use the return value from RegisterTeamChanged as the parameter here!
*
* @param fwdId        The hook to stop
*
* @return            Returns true if the function is successfully executed, otherwise false
*/
native bool:UnRegisterTeamChanged(const fwdId);

/*
* Stops a hook from triggering.
* Use the return value from RegisterTeamChanged as the parameter here!
*
* @param fwdId        The hook to disable
*
* @return            Returns true if the function is successfully executed, otherwise false
*/
native bool:DisableTeamChanged(const fwdId);

/*
* Starts a hook back up.
* Use the return value from RegisterTeamChanged as the parameter here!
*
* @note Sometimes you should force-update values via SetPlayerTeam native if there's no active hooks in module,
*
* otherwise you gonna get instantly triggered event's if players teams were changed.
*
* @param fwdId        The hook to enable
*
* @return            Returns true if the function is successfully executed, otherwise false
*/
native bool:EnableTeamChanged(const fwdId);

/*
* Force set temporary team index
* Can be used for manual update team index if there r no active hook's and/or values r too old.
*
* @param client        Client index from 1 to 32
* @param team        Team index
*
* @return            Returns true if the function is successfully executed, otherwise false
*/
native bool:SetPlayerTeam(const client, const team);

amxx, change, team, hook, hook when player's team changed, hook player team changes, changes, player, amxmodx, team, changed


Upd: include updated, fixed typo via wrong arg order, newTeam -> oldTeam.

1584405091500.png
 
Последнее редактирование:

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

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