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

Сообщения
74
Реакции
61
Помог
1 раз(а)
Сток выполняет плавный блик света. Например, если день - он выполнит плавный переход в темноту и назад. Выполняется до тех пор, пока не вернётся в изначальный заданный свет (true). Например, был день, он будет понижать свет до ночи и назад до дня, или наоборот. Как-то так. Не знаю где может еще пригодиться, кроме как для погоды (удар грома)


C++:
#define DARKNESS_LIGHT_CHAR     'a'        // Кромейшая тьма
#define NIGHT_LIGHT_CHAR         'd'     // Ночь
#define DAY_LIGHT_CHAR             'f'        // День

//ent think 0.1
Controller_Thunder(bool:bReset = false) {
    static bool:bThunder = false, Float:fUpdateThunder, Float:fUpdateThunderLight, Float:fGameTime;
    if(bReset) { fUpdateThunder = 0.0; }
    fGameTime = get_gametime();
    if(bThunder) {
        if(fUpdateThunderLight > fGameTime) { return; }
        fUpdateThunderLight = fGameTime + 0.2;
        if(UTIL_SmootheDaylight(NIGHT_LIGHT_CHAR)) {
            bThunder = false;
        }
        return;
    } else {
        if(fUpdateThunder > fGameTime) {
            return;
        }
        bThunder = true;
        fUpdateThunder = fGameTime + random_float(160.0, 200.0);
    }
}

stock bool:UTIL_SmootheDaylight(iCharStart = NIGHT_LIGHT_CHAR, iCharEnd = DARKNESS_LIGHT_CHAR, bool:bReset = false) {
    static bool:bInverse, szCurrentChar[2], bool:bUp;
    if(szCurrentChar[0] == 0 || bReset) {
        szCurrentChar[0] = iCharStart;
        if(iCharStart > iCharEnd) { bInverse = true; bUp = true; }
        else { bInverse = false; bUp = false; }
    }
    if(!bInverse) {
        if(bUp) {
            if(++szCurrentChar[0] >= iCharStart) {
                UTIL_SetLight(szCurrentChar);
                bInverse = true;
                return true;
            }
        } else {
            if(++szCurrentChar[0] >= iCharEnd) {
                UTIL_SetLight(szCurrentChar);
                bInverse = true;
                return false;
            }
        }
    } else {
        if(bUp) {
            if(--szCurrentChar[0] <= iCharEnd) {
                UTIL_SetLight(szCurrentChar);
                bInverse = false;
                return false;
            }
        } else {
            if(--szCurrentChar[0] <= iCharStart) {
                UTIL_SetLight(szCurrentChar);
                bInverse = false;
                return true;
            }
        }
    }
    UTIL_SetLight(szCurrentChar);
    return false;
}

stock UTIL_SetLight(szLight[2] = "", bitFlagsEF = 0) {
    engfunc(EngFunc_LightStyle, bitFlagsEF, szLight);
}
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Может кому понадобятся арифметические функции
Код:
/* Сумма геометрической прогрессии */
// a1 - Первый член в прогрессии
// d - Разность в прогрессии
// n - До какого члена
stock GeoProg_SumFirstMembers(a1, d, n)
{
    return (a1 * (power(d, n) - 1)) / (d - 1);
}

/* N-ый член геометрической прогрессии */
// a1 - Первый член в прогрессии
// d - Разность в прогрессии
// n - До какого члена
stock GeoProg_CertainMember(a1, d, n)
{
    return a1 * power(d, n - 1);
}

/* Сумма арифметической прогрессии */
// a1 - Первый член в прогрессии
// d - Разность в прогрессии
// n - До какого члена
stock ArProg_SumFirstMembers(a1, d, n)
{
    return ((2 * a1 + d * (n - 1)) / 2) * n;
}

/* N-ый член арифметической прогрессии */
// a1 - Первый член в прогрессии
// d - Разность в прогрессии
// n - Какой член прогрессии нужно найти
stock ArProg_CertainMember(a1, d, n)
{
    return a1 + d * (n - 1);
}

/* Факториал */
// x - Число для нахождения факториала
stock Factorial(x)
{
    for(new y = x; y != 0; y--)
    {
        if(x == y)
        {
            continue;
        }
        x *= y;
    }
    return x;
}
 
Последнее редактирование:
Сообщения
397
Реакции
221
Помог
13 раз(а)
Сток для более удобной работы

Код:
/**
    История изменений:
        0.1 (15.10.2021) by b0t.
            - Первый релиз;
*/
#if !defined _reapi_included
    #include <reapi>
#endif
#if !defined _xs_included
    #include <xs>
#endif
#if !defined _fakemeta_included
    #include <fakemeta>
#endif
#if defined _reapi_v_included
    #endinput
#endif
#define _reapi_v_included
enum _:PERCENT_DATA {
    _IS_,                   //Какое число соответствует N процентов от исходного
    _GET_,                  //Сколько процентов составляет N-е число от исходного
    _ADD_,                  //Добавить N процентов к числу
    _SUB_                   //Вычесть N процентов от числа
};
/**
    * Узнать есть ли у игрока 'бессмертие'.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock bool:rg_get_user_godmode(const pPlayer) {
    return bool:(Float:get_entvar(pPlayer,var_takedamage) == DAMAGE_NO);
}
/**
    * Выдать/Забрать у игрока 'бессмертие'.
    *
    *   @param pPlayer      Игрок.
    *   @param bType        Включить/отключить
    *
    *   @return             -
*/
stock rg_set_user_godmode(const pPlayer,const bool:bType = false) {
    set_entvar(pPlayer,var_takedamage,bType ? DAMAGE_NO : DAMAGE_YES);
}
/**
    * Узнать есть ли у игрока 'ноклип'.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock bool:rg_get_user_noclip(const pPlayer) {
    return bool:(get_entvar(pPlayer,var_movetype) == MOVETYPE_NOCLIP);
}
/**
    * Выдать/Забрать у игрока 'ноклип'.
    *
    *   @param pPlayer      Игрок.
    *   @param bType        Включить/отключить
    *
    *   @return             -
*/
stock rg_set_user_noclip(const pPlayer,const bool:bType = false) {
    set_entvar(pPlayer,var_movetype,bType ? MOVETYPE_NOCLIP : MOVETYPE_WALK);
}
/**
    * Сделает объект видимым/невидимым.
    *
    *   @param iEnt         Объект
    *   @param bHide        Выключить/включить
    *
    *   @return             -
*/
stock rg_set_entity_invisibility(const iEnt, bool:bHide = true) {
    new iFlags = get_entvar(iEnt,var_effects);
    set_entvar(iEnt,var_effects,bHide ? (iFlags |= EF_NODRAW) : (iFlags &= ~EF_NODRAW))
}
/**
    * Узнать видно ли объект.
    *
    *   @param iEnt      Объект
    *
    *   @return             true -- если не видно
*/
stock bool:rg_get_user_invisibility(const iEnt) {
    return bool:(get_entvar(iEnt, var_effects) & EF_NODRAW)
}
/**
    * Какую скорость имеет игрок.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             float
*/
stock Float:rg_get_user_maxspeed(const pPlayer) {
    return Float:get_entvar(pPlayer,var_maxspeed);
}
/**
    * Устанавливает игроку скорость.
    *
    *   @param pPlayer      Игрок.
    *   @param fSpeed       Скорость(float)
    *
    *   @return             -
*/
stock rg_set_user_maxspeed(const pPlayer, Float:fSpeed = -1.0) {
    if(speed != -1)
        set_entvar(pPlayer,var_maxspeed,speed);
    else
        rg_reset_maxspeed(pPlayer);
}
/**
    * Устанавливает игроку гравитацию.
    *
    *   @param pPlayer      Игрок.
    *   @param fGravity       Скорость(float)
    *
    *   @return             -
*/
stock rg_set_user_gravity(const pPlayer,Float:fGravity = 1.0) {
    set_entvar(pPlayer,var_gravity,gravity);
}
/**
    * Какую гравитацию имеет игрок.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             float
*/
stock Float:rg_get_user_gravity(const pPlayer) {
    return Float:get_entvar(pPlayer,var_gravity);
}
/**
    * Вернёт true если у игрока есть прибор ночного виденья.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock rg_get_user_nvg(const pPlayer) {
    return get_member(pPlayer,m_bHasNightVision);
}
/**
    * Выдёт игроку прибор ночного виденья.
    *
    *   @param pPlayer      Игрок.
    *   @param bNvg         false/true
    *
    *   @return             -
*/
stock rg_set_user_nvg(const pPlayer,bool:bNvg = true) {
    set_member(pPlayer,m_bHasNightVision,bNvg);
}
/**
    * Устанавливает эффекты объекту
    *   @NOTE: Необходимые константы можно найти в 'amxconst.inc'
    *
    *   @param iEnt     Объект
    *   @param iFx      Эффекты
    *   @param fColor   Цвет = Float:{R,G,B}
    *   @param iRender  Режим рендеринга. Одна из констант kRender*
    *   @param iAmount  Объём (0-255)
    *
    *   @return             -
*/
stock rg_set_entity_rendering(const iEnt,
                                const iFx = kRenderFxNone,
                                const Float:fColor[] = {255.0,255.0,255.0},
                                const iRender = kRenderNormal,
                                const iAmount = 16) {
    set_entvar(iEnt,var_renderfx,iFx);
    set_entvar(iEnt,var_rendercolor,fColor);
    set_entvar(iEnt,var_rendermode,iRender);
    set_entvar(iEnt,var_renderamt,float(iAmount));
}
/**
    * Прибавит игроку здоровье
    *
    *   @param pPlayer      Игрок
    *   @param fHp          Здоровье
    *   @param bIsMax       Использовать мнимальный/максимальные значения(false/true)
    *   @param fHpMin       Минимальное кол-во здоровья
    *   @param fHpMax       Максимальное кол-во здоровья
    *
    *   @return             -
*/
stock rg_set_user_health(const pPlayer,const Float:fHp,const bool:bIsMax = false,const Float:fHpMin = 1.0,const Float:fHpMax = 100.0) {
    if(bIsMax)
        set_entvar(pPlayer,var_health,floatclamp((get_entvar(pPlayer,var_health)+fHp),fHpMin,fHpMax));
    else
        set_entvar(pPlayer,var_health,fHp);
}
/**
    * Заморозит/разморозит объект
    *
    *   @param iEnt     Объект
    *   @param bFreez   tru -- заморозит
    *
    *   @return             -
*/
stock rg_set_entity_frozen(const iEnt,const bool:bFreez = false) {
    new iFlags = get_entvar(iEnt,var_flags);
    set_entvar(iEnt,var_flags,bFreez ? (iFlags |= FL_FROZEN) : (iFlags &~ FL_FROZEN));
}
/**
    * "Передаст" деньги одного игрока другому
    *
    *   @param pPlayer      Игрок со счёта которого будем списывать
    *   @param pSender      Игрок, на счёт которому будем зачислять
    *   @param iAmmount     Сумма
    *   @param bUpdateHud   Обновлять худ денег
    *
    *   @return             -
*/
stock UTIL__TransferMoney(const pPlayer,const pSender,const iAmmount,const bool:bUpdateHud = false) {
    rg_add_account(pPlayer,-iAmmount,AS_SET,bUpdateHud);
    rg_add_account(pSender,iAmmount,AS_SET,bUpdateHud);
}
/**
    * Удалит ключи цветов из строки
    *
    *   @param szMessage     Массив с сообщением
    *   @param iMaxLen       Максимальный размер массива
    *   @param bType         true -- Удалять цвета из меню | false -- из чата
    *
    *   @return             -
*/
stock UTIL__ReplaceSimvols(szMessage[],const iMaxLen,const bool:bType = false) {
    switch(bType) {
        case false: {
            replace_all(szMessage,iMaxLen,"\r","");
            replace_all(szMessage,iMaxLen,"\y","");
            replace_all(szMessage,iMaxLen,"\d","");
            replace_all(szMessage,iMaxLen,"\w","");
        }
        case true: {
            replace_all(szMessage,iMaxLen,"^4","");
            replace_all(szMessage,iMaxLen,"^2","");
            replace_all(szMessage,iMaxLen,"^1","");
        }
    }
}
/**
    * Зарегистрирует команду во всех чатах + консоль
    *
    *   @param szCmd     Команда
    *   @param szFunc    Функция обработчик
    *
    *   @return             -
*/
stock UTIL__RegisterClCmd(const szCmd[],const szFunc[]) {
    register_clcmd(fmt("%s",szCmd),szFunc);
    register_clcmd(fmt("say /%s",szCmd),szFunc);
    register_clcmd(fmt("say_team /%s",szCmd),szFunc);
}
/**
    * Отображает меню игроку
    *   @NOTE: Если игрока нет на сервере -- уничтожит меню для избежания утечек памяти
    *
    *   @param pPlayer               Игрок
    *   @param iMenu            Меню
    *   @param szNextName       Оформление кнопки "Далее"
    *   @param szBackName       Оформление кнопки "Назад"
    *   @param szExitName       Оформление кнопки "Выход"
    *   @param szNumberColor    Цвет номеров (1,2,3...)
    *   @param iPage            С какой страницы открыть меню
    *
    *   @return             -
*/
stock UTIL__RegisterMenu(const pPlayer,
                        const iMenu,
                        const szNextName[] = "Назад",
                        const szBackName[] = "Далее",
                        const szExitName[] = "Выход",
                        const szNumberColor[] = "\y",
                        const iPage = 0) {
    
    if(menu_items(iMenu) <= 0 || !is_user_connected(pPlayer))
        menu_destroy(iMenu);
    else {
        menu_setprop(iMenu,MPROP_NEXTNAME,szNextName);
        menu_setprop(iMenu,MPROP_BACKNAME,szBackName);
        menu_setprop(iMenu,MPROP_EXITNAME,szExitName);
        menu_setprop(iMenu,MPROP_NUMBER_COLOR,szNumberColor);
        menu_display(pPlayer,iMenu,iPage);
    }
}
/**
    * Воспроизведёт звук игроку/всем
    *
    *   @param pPlayer          Игрок
    *   @param szSound          Звук в формате (.wav/.mp3)
    *   @param bStopSound       Остановить предыдущие(костыль)
    *
    *   @return             -
*/
stock UTIL__PlaySound(const pPlayer = 0,const szSound[],const bool:bStopSound = false) {
    if (bStopSound)
        client_cmd(pPlayer, "mp3 stop;stopsound");
        
    if(containi(szSound,".mp3") != -1)
        client_cmd(pPlayer,"mp3 play ^"sound/%s^"", szSound);
    else
        client_cmd(pPlayer,"spk ^"%s^"", szSound);
}
/**
    * Выдаёт игроку оружие
    *
    *   @param pPlayer          Игрок
    *   @param szWeaponName     Имя оружия (без weapon_)
    *   @param iGiveType        Как выдать
    *   @param iAmmo            Патроны в обойму
    *   @param iBpAmmo          Патроны в запас
    *
    *   @return             -
*/
stock UTIL__GiveWeapon(const pPlayer,const szWeaponName[],const GiveTyp:iGiveType = GT_DROP_AND_REPLACE,const iAmmo = 0,const iBpAmmo = 0) {
    new iWeapon = rg_give_item(pPlayer,fmt("weapon_%s",szWeaponName),iGiveType);
    if(is_nullent(iWeapon))
        return;
    
    new WeaponIdType:iWeaponID = get_member(iWeapon,m_iId);
    if(iAmmo)
        rg_set_user_ammo(pPlayer,iWeaponID,iAmmo);
    
    if(iBpAmmo)
        rg_set_user_bpammo(pPlayer,iWeaponID,iBpAmmo);
}
/**
    * Создаст имитацию взрыва гранаты
    *
    *   @param pOwner       Владелец взрыва
    *   @param fOrigin      Координаты(эпицентр)
    *   @param fDamage      Урон(чем дальше от эпицентра тем меньше урон)
    *   @param fRadius      Радиус взрыва
    *
    *   @return             -
*/
stock UTIL__CreateExplode(const pOwner = 0,Float:fOrigin[XYZ] = {0.0,0.0,0.0},const Float:fDamage = 0.0,const Float:fRadius = 0.0) {
    new iEnt = rg_create_entity("grenade", .useHashTable = true);
    if(is_nullent(iEnt))
        return PLUGIN_HANDLED;
    if(pOwner)
        set_member(iEnt,m_Grenade_iTeam,get_member(pOwner,m_iTeam));
    
    set_entvar(iEnt,var_owner,pOwner);
    rg_dmg_radius(fOrigin,iEnt,pOwner,fDamage,fRadius,0,DMG_GRENADE);
    set_entvar(iEnt,var_flags,FL_KILLME);
}
/**
    * Найдёт координаты неба
    *
    *   @param fOrigin       Начальные координаты для поиска
    *
    *   @return             Float:fOrigin
*/
stock UTIL__GetSkyOrigin(Float:fOrigin[XYZ]) {
    new iEntSky = engfunc(EngFunc_PointContents,fOrigin);
    while(iEntSky != CONTENTS_SKY) {
        fOrigin[Z] += 1.0;
        iEntSky = engfunc(EngFunc_PointContents,fOrigin);
    }
}
/**
    * Установить скорсоть объекту
    *
    *   @param iEnt             Объект
    *   @param fSpeed           Скорость
    *   @param fOriginStart     Начальные координаты
    *   @param fOriginEnd       Конечные координаты
    *   @param bSetAngles       Установить углы по пути движения
    *
    *   @return             -
*/
stock UTIL__SetEntitySpeed(const iEnt,const Float:fSpeed,const Float:fOriginStart[XYZ],const Float:fOriginEnd[XYZ],const bool:bSetAngles = false) {
    new fDistance = get_distance_f(fOriginStart,fOriginEnd);
    new fSetSpeed = fSpeed/fDistance;
    new Float:fVelocity[XYZ];
    get_entvar(iEnt,var_velocity,fVelocity);
    xs_vec_sub(fOriginEnd,fOriginStart,fVelocity);
    xs_vec_mul_scalar(fVelocity,fSpeed,fVelocity);
    set_entvar(iEnt,var_velocity,fVelocity);
    
    if(bSetAngles) {
        vector_to_angle(fVelocity,fAngles);
        set_entvar(iEnt,var_angles,fAngles);
    }
    
}
/**
    * Работа с процентами
    *
    *   @param iType        Как производить расчёт (См. PERCENT_DATA)
    *   @param fNum         Число
    *   @param fPercent     Проценты
    *
    *   @return             -
*/
stock UTIL__GetPercent(const PERCENT_DATA:iType = _IS_,const Float:fNum = 0.0,const Float:fPercent = 0.0) {
    new Float:fRatio
    switch(iType) {
        case _IS_:  return ((fNum/100.0) * fPercent);
        case _GET_: return ((fNum/fPercent) / 100.0)
        case _ADD_: {
            fRatio = fNum/100.0;
            return ((fRatio*fPercent) + fNum);
        }
        case _SUB_: {
            fRatio = fNum/100.0;
            return ((fRatio*fPercent) - fNum);
        }
    }
}
 

Вложения

Сообщения
397
Реакции
221
Помог
13 раз(а)
Сток для более удобной работы.
Добавил немного полезностей.

Код:
/**
    История изменений:
        0.1 (15.10.2021) by b0t.
            - Первый релиз;
        
        0.2 (28.05.2022) by b0t.
            - rg_set_user_health() -> rg_add_user_health();
            - UTIL__CreateExplode() -> UTIL__CreateExplodeGrenade();
            - rg_add_user_armor();
            - rg_users_1vs1();
            - rg_get_team_score_diff();
            - rg_get_team_count_diff();
            - rg_is_user_first_spawn();
            - UTIL__RemoveEntity();
            - UTIL__GetFlashState();
            - UTIL__RecordMessageInArray();
*/
#define INCLUDE_VERSION     "0.2"
#if !defined _reapi_included
    #include <reapi>
#endif
#if !defined _xs_included
    #include <xs>
#endif
#if !defined _fakemeta_included
    #include <fakemeta>
#endif
#if defined _reapi_v_included
    #endinput
#endif
#define _reapi_v_included
enum PERCENT_DATA {
    _IS_,                   //Какое число соответствует N процентов от исходного;
    _GET_,                  //Сколько процентов составляет N-е число от исходного;
    _ADD_,                  //Добавить N процентов к числу;
    _SUB_                   //Вычесть N процентов от числа;
};
enum FLASH_STATE {
    FLASH_NONE = 0,         //Ослепления нет;
    FLASH_TIME,             //Уже имеются просветы;
    FLASH_HOLD              //Ни чего не видно;
};
enum _:XYZ {
    Float:X,Float:Y,Float:Z
};
enum _:RGB {
    Float:R,Float:G,Float:B
};
#define IsValidPlayer(%0)           (1<=%0<=MaxClients)
/**
    * Узнать есть ли у игрока 'бессмертие'.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock bool:rg_get_user_godmode(const pPlayer) {
    return bool:(Float:get_entvar(pPlayer,var_takedamage) == DAMAGE_NO);
}
/**
    * Выдать/Забрать игроку 'бессмертие'.
    *
    *   @param pPlayer      Игрок.
    *   @param bType        Включить/отключить
    *
    *   @return             -
*/
stock rg_set_user_godmode(const pPlayer,const bool:bType = false) {
    set_entvar(pPlayer,var_takedamage,bType ? DAMAGE_NO : DAMAGE_YES);
}
/**
    * Узнать есть ли у игрока 'ноклип'.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock bool:rg_get_user_noclip(const pPlayer) {
    return bool:(get_entvar(pPlayer,var_movetype) == MOVETYPE_NOCLIP);
}
/**
    * Выдать/Забрать игроку 'ноклип'.
    *
    *   @param pPlayer      Игрок.
    *   @param bType        Включить/отключить
    *
    *   @return             -
*/
stock rg_set_user_noclip(const pPlayer,const bool:bType = false) {
    set_entvar(pPlayer,var_movetype,bType ? MOVETYPE_NOCLIP : MOVETYPE_WALK);
}
/**
    * Сделает объект видимым/невидимым.
    *
    *   @param iEnt         Объект
    *   @param bHide        Выключить/включить
    *
    *   @return             -
*/
stock rg_set_entity_invisibility(const iEnt, bool:bHide = true) {
    new iFlags = get_entvar(iEnt,var_effects);
    set_entvar(iEnt,var_effects,bHide ? (iFlags |= EF_NODRAW) : (iFlags &= ~EF_NODRAW))
}
/**
    * Узнать видно ли объект.
    *
    *   @param iEnt      Объект
    *
    *   @return             true -- если не видно
*/
stock bool:rg_get_user_invisibility(const iEnt) {
    return bool:(get_entvar(iEnt, var_effects) & EF_NODRAW)
}
/**
    * Какую скорость имеет игрок.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             float
*/
stock Float:rg_get_user_maxspeed(const pPlayer) {
    return Float:get_entvar(pPlayer,var_maxspeed);
}
/**
    * Устанавливает игроку скорость.
    *
    *   @param pPlayer      Игрок.
    *   @param fSpeed       Скорость(float)
    *
    *   @return             -
*/
stock rg_set_user_maxspeed(const pPlayer, Float:fSpeed = -1.0) {
    if(speed != -1)
        set_entvar(pPlayer,var_maxspeed,speed);
    else
        rg_reset_maxspeed(pPlayer);
}
/**
    * Устанавливает игроку гравитацию.
    *
    *   @param pPlayer      Игрок.
    *   @param fGravity     Гравитация(float)
    *
    *   @return             -
*/
stock rg_set_user_gravity(const pPlayer,Float:fGravity = 1.0) {
    set_entvar(pPlayer,var_gravity,gravity);
}
/**
    * Какую гравитацию имеет игрок.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             float
*/
stock Float:rg_get_user_gravity(const pPlayer) {
    return Float:get_entvar(pPlayer,var_gravity);
}
/**
    * Вернёт true если у игрока есть прибор ночного виденья.
    *
    *   @param pPlayer      Игрок.
    *
    *   @return             bool
*/
stock bool:rg_get_user_nvg(const pPlayer) {
    return bool:(get_member(pPlayer,m_bHasNightVision));
}
/**
    * Выдаёт игроку прибор ночного виденья.
    *
    *   @param pPlayer      Игрок.
    *   @param bNvg         false/true
    *
    *   @return             -
*/
stock rg_set_user_nvg(const pPlayer,bool:bNvg = true) {
    set_member(pPlayer,m_bHasNightVision,bNvg);
}
/**
    * Устанавливает эффекты объекту
    *   @NOTE: Необходимые константы можно найти в 'amxconst.inc'
    *
    *   @param iEnt     Объект
    *   @param iFx      Эффекты
    *   @param fColor   Цвет = Float:{R,G,B}
    *   @param iRender  Режим рендеринга. Одна из констант kRender*
    *   @param iAmount  Объём (0-255)
    *
    *   @return             -
*/
stock rg_set_entity_rendering(const iEnt,
                                const iFx = kRenderFxNone,
                                const Float:fColor[] = {255.0,255.0,255.0},
                                const iRender = kRenderNormal,
                                const iAmount = 16) {
    set_entvar(iEnt,var_renderfx,iFx);
    set_entvar(iEnt,var_rendercolor,fColor);
    set_entvar(iEnt,var_rendermode,iRender);
    set_entvar(iEnt,var_renderamt,float(iAmount));
}
/**
    * Прибавит игроку здоровье
    *
    *   @param pPlayer      Игрок
    *   @param fHp          Здоровье
    *   @param bIsMax       Использовать мнимальный/максимальные значения(false/true)
    *   @param fHpMin       Минимальное кол-во здоровья
    *   @param fHpMax       Максимальное кол-во здоровья
    *
    *   @return             -
*/
stock rg_add_user_health(const pPlayer,const Float:fHp,const bool:bIsMax = false,const Float:fHpMin = 1.0,const Float:fHpMax = 100.0) {
    if(bIsMax)
        set_entvar(pPlayer,var_health,floatclamp((Float:get_entvar(pPlayer,var_health)+fHp),fHpMin,fHpMax));
    else
        set_entvar(pPlayer,var_health,Float:get_entvar(pPlayer,var_health)+fHp);
}
/**
    * Прибавит игроку Броню
    *
    *   @param pPlayer      Игрок
    *   @param fAr          Броня
    *   @param bIsMax       Использовать мнимальный/максимальные значения(false/true)
    *   @param fArMin       Минимальное кол-во брони
    *   @param fArMax       Максимальное кол-во брони
    *
    *   @return             -
*/
stock rg_add_user_armor(const pPlayer,const Float:fAr,const bool:bIsMax = false,const Float:fArMin = 1.0,const Float:fArMax = 100.0) {
    if(bIsMax)
        set_entvar(pPlayer,var_armorvalue,floatclamp((Float:get_entvar(pPlayer,var_armorvalue)+fAr),fArMin,fArMax));
    else
        set_entvar(pPlayer,var_armorvalue,Float:get_entvar(pPlayer,var_armorvalue)+fAr);
}
/**
    * Заморозит/разморозит объект
    *
    *   @param iEnt     Объект
    *   @param bFreez   tru -- заморозит
    *
    *   @return             -
*/
stock rg_set_entity_frozen(const iEnt,const bool:bFreez = false) {
    new iFlags = get_entvar(iEnt,var_flags);
    set_entvar(iEnt,var_flags,bFreez ? (iFlags |= FL_FROZEN) : (iFlags &~ FL_FROZEN));
}
/**
    * Проверит если остались 1 на 1
    *   @NOTE: by Emma Jule
    *
    *
    *   @return             bool
*/
stock bool:rg_users_1vs1() {
    new iAliveTs,iAliveCTs;
    rg_initialize_player_counts(iAliveTs,iAliveCTs);
    return bool:(iAliveTs == 1 && iAliveCTs == 1);
}
/**
    * Получим разницу между победами КТ и ТТ
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     int
*/
stock rg_get_team_score_diff() {
    return abs(get_member_game(m_iNumTerroristWins) - get_member_game(m_iNumCTWins));
}
/**
    * Получим разницу между кол-вом игроков КТ и ТТ
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     int
*/
stock rg_get_team_count_diff() {
    return abs(get_member_game(m_iNumTerrorist) - get_member_game(m_iNumCT));
}
/**
    * Проверим является ли это первым спавном игрока
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     bool
*/
stock bool:rg_is_user_first_spawn(const pPlayer) {
    return bool:(get_member(pPlayer,m_iNumSpawns) == 1);
}
/**
    * "Передаст" деньги одного игрока другому
    *
    *   @param pPlayer      Игрок со счёта которого будем списывать
    *   @param pSender      Игрок, на счёт которому будем зачислять
    *   @param iAmmount     Сумма
    *   @param bUpdateHud   Обновлять худ денег
    *
    *   @return             -
*/
stock UTIL__TransferMoney(const pPlayer,const pSender,const iAmmount,const bool:bUpdateHud = false) {
    rg_add_account(pPlayer,-iAmmount,AS_SET,bUpdateHud);
    rg_add_account(pSender,iAmmount,AS_SET,bUpdateHud);
}
/**
    * Удалит ключи цветов из строки
    *
    *   @param szMessage     Массив с сообщением
    *   @param iMaxLen       Максимальный размер массива
    *   @param bMenu         true -- Удалять цвета из меню | false -- из чата
    *
    *   @return             -
*/
stock UTIL__ReplaceSimbols(szMessage[],const iMaxLen,const bool:bMenu = true) {
    switch(bMenu) {
        case true: {
            replace_all(szMessage,iMaxLen,"\r","");
            replace_all(szMessage,iMaxLen,"\y","");
            replace_all(szMessage,iMaxLen,"\d","");
            replace_all(szMessage,iMaxLen,"\w","");
        }
        case false: {
            replace_all(szMessage,iMaxLen,"^4","");
            replace_all(szMessage,iMaxLen,"^2","");
            replace_all(szMessage,iMaxLen,"^1","");
        }
    }
}
/**
    * Зарегистрирует команду во всех чатах + консоль
    *
    *   @param szCmd     Команда
    *   @param szFunc    Функция обработчик
    *
    *   @return             -
*/
stock UTIL__RegisterClCmd(const szCmd[],const szFunc[]) {
    register_clcmd(fmt("%s",szCmd),szFunc);
    register_clcmd(fmt("say /%s",szCmd),szFunc);
    register_clcmd(fmt("say_team /%s",szCmd),szFunc);
}
/**
    * Отображает меню игроку
    *   @NOTE: Если игрока нет на сервере -- уничтожит меню для избежания утечек памяти
    *
    *   @param pPlayer          Игрок
    *   @param iMenu            Меню
    *   @param szNextName       Оформление кнопки "Далее"
    *   @param szBackName       Оформление кнопки "Назад"
    *   @param szExitName       Оформление кнопки "Выход"
    *   @param szNumberColor    Цвет номеров (1,2,3...)
    *   @param iPage            С какой страницы открыть меню
    *
    *   @return             -
*/
stock UTIL__RegisterMenu(const pPlayer,
                        const iMenu,
                        const szNextName[] = "Назад",
                        const szBackName[] = "Далее",
                        const szExitName[] = "Выход",
                        const szNumberColor[] = "\y",
                        const iPage = 0) {
    
    if(menu_items(iMenu) <= 0 || !is_user_connected(pPlayer))
        menu_destroy(iMenu);
    else {
        menu_setprop(iMenu,MPROP_NEXTNAME,szNextName);
        menu_setprop(iMenu,MPROP_BACKNAME,szBackName);
        menu_setprop(iMenu,MPROP_EXITNAME,szExitName);
        menu_setprop(iMenu,MPROP_NUMBER_COLOR,szNumberColor);
        menu_display(pPlayer,iMenu,iPage);
    }
}
/**
    * Воспроизведёт звук игроку/всем
    *
    *   @param pPlayer          Игрок (0 если всем)
    *   @param szSound          Звук в формате (.wav/.mp3)
    *   @param bStopSound       Остановить предыдущие(костыль)
    *
    *   @return             -
*/
stock UTIL__PlaySound(const pPlayer = 0,const szSound[],const bool:bStopSound = false) {
    if (bStopSound)
        client_cmd(pPlayer, "mp3 stop;stopsound");
        
    if(containi(szSound,".mp3") != -1)
        client_cmd(pPlayer,"mp3 play ^"sound/%s^"", szSound);
    else
        client_cmd(pPlayer,"spk ^"%s^"", szSound);
}
/**
    * Выдаёт игроку оружие
    *   @NOTE: аналог rg_give_item(); с возможностью сразу задать патроны в запас/обойму
    *
    *   @param pPlayer          Игрок
    *   @param szWeaponName     Имя оружия (без weapon_)
    *   @param iGiveType        Как выдать
    *   @param iAmmo            Патроны в обойму
    *   @param iBpAmmo          Патроны в запас
    *
    *   @return             -
*/
stock UTIL__GiveWeapon(const pPlayer,const szWeaponName[],const GiveType:iGiveType = GT_DROP_AND_REPLACE,const iAmmo = 0,const iBpAmmo = 0) {
    new iWeapon = rg_give_item(pPlayer,fmt("weapon_%s",szWeaponName),iGiveType);
    if(is_nullent(iWeapon))
        return;
    
    new WeaponIdType:iWeaponID = get_member(iWeapon,m_iId);
    if(iAmmo)
        rg_set_user_ammo(pPlayer,iWeaponID,iAmmo);
    
    if(iBpAmmo)
        rg_set_user_bpammo(pPlayer,iWeaponID,iBpAmmo);
}
/**
    * Создаст имитацию взрыва гранаты
    *
    *   @param pOwner       Владелец взрыва
    *   @param fOrigin      Координаты(эпицентр)
    *   @param fDamage      Урон(чем дальше от эпицентра тем меньше урон)
    *   @param fRadius      Радиус взрыва
    *
    *   @return             -
*/
stock UTIL__CreateExplodeGrenade(const pOwner = 0,Float:fOrigin[XYZ] = {0.0,0.0,0.0},const Float:fDamage = 0.0,const Float:fRadius = 0.0) {
    new iEnt = rg_create_entity("grenade", .useHashTable = true);
    if(is_nullent(iEnt))
        return
    if(pOwner)
        set_member(iEnt,m_Grenade_iTeam,get_member(pOwner,m_iTeam));
    
    set_entvar(iEnt,var_owner,pOwner);
    rg_dmg_radius(fOrigin,iEnt,pOwner,fDamage,fRadius,0,DMG_GRENADE);
    set_entvar(iEnt,var_flags,FL_KILLME);
}
/**
    * Найдёт координаты неба
    *
    *   @param fOrigin       Начальные координаты для поиска
    *
    *   @return             float
*/
stock UTIL__GetSkyOrigin(Float:fOrigin[XYZ]) {
    new iEntSky = engfunc(EngFunc_PointContents,fOrigin);
    while(iEntSky != CONTENTS_SKY) {
        fOrigin[Z] += 1.0;
        iEntSky = engfunc(EngFunc_PointContents,fOrigin);
    }
}
/**
    * Установить скорость объекту
    *
    *   @param iEnt             Объект
    *   @param fSpeed           Скорость
    *   @param fOriginStart     Начальные координаты
    *   @param fOriginEnd       Конечные координаты
    *   @param bSetAngles       Установить углы по пути движения
    *
    *   @return             -
*/
stock UTIL__SetEntitySpeed(const iEnt,const Float:fSpeed,const Float:fOriginStart[XYZ],const Float:fOriginEnd[XYZ],const bool:bSetAngles = false) {
    new fDistance = get_distance_f(fOriginStart,fOriginEnd);
    new fSetSpeed = fSpeed/fDistance;
    new Float:fVelocity[XYZ];
    get_entvar(iEnt,var_velocity,fVelocity);
    xs_vec_sub(fOriginEnd,fOriginStart,fVelocity);
    xs_vec_mul_scalar(fVelocity,fSpeed,fVelocity);
    set_entvar(iEnt,var_velocity,fVelocity);
    
    if(bSetAngles) {
        vector_to_angle(fVelocity,fAngles);
        set_entvar(iEnt,var_angles,fAngles);
    }
}
/**
    * Работа с процентами
    *
    *   @param iType        Как производить расчёт (См. PERCENT_DATA)
    *   @param fNum         Число
    *   @param fPercent     Проценты
    *
    *   @return             float
*/
stock UTIL__GetPercent(const PERCENT_DATA:iType = _IS_,const Float:fNum = 0.0,const Float:fPercent = 0.0) {
    new Float:fRatio
    switch(iType) {
        case _IS_:  return ((fNum/100.0) * fPercent);
        case _GET_: return ((fNum/fPercent) / 100.0)
        case _ADD_: {
            fRatio = fNum/100.0;
            return ((fRatio*fPercent) + fNum);
        }
        case _SUB_: {
            fRatio = fNum/100.0;
            return ((fRatio*fPercent) - fNum);
        }
    }
}
/**
    * Удалит все объекты с указанным классом
    *
    *   @param szClassName  Класс объекта
    *
    *   @return             -
*/
stock UTIL__RemoveEntity(const szClassName[] = "") {  
    new iEntity = -1;
    while((iEntity = rg_find_ent_by_class(iEntity,szClassName))) {
        set_entvar(iEntity,var_flags,FL_KILLME);
    }
}
/**
    * Узнать степень ослепления игрока
    *   @NOTE: Спасибо за помощь 'Denzer'
    *       Source: https://dev-cs.ru/threads/17049/post-111311
    *
    *   @param pPlayer  Игрок
    *
    *   @return             int
*/
stock FLASH_STATE:UTIL__GetFlashState(const pPlayer) {
    new Float:flStartTime = Float:get_member(pPlayer, m_blindStartTime);
    new Float:flGameTime = get_gametime();
    
    if(flStartTime + Float:get_member(pPlayer, m_blindHoldTime) >= flGameTime)
        return FLASH_HOLD;
    if(flStartTime + Float:get_member(pPlayer, m_blindFadeTime) >= flGameTime)
        return FLASH_TIME;
    return FLASH_NONE;
}
/**
    * Разделит строку и запишет её в массив, типа 'Array', в виде отдельных аргументов или чисел
    *   @NOTE: Используется для записи в ячейки массива тапа 'Array' отдельных данных разделённых Спец. символом.
    *       Пример: szMessage[] = "Test1|Test2|Test3"
    *           UTIL__RecordMessageInArray(ArrayTest,szMessage,'|');
    *
    *       На выходе получим:
    *           new szArrayItem_One[64];
    *           ArrayGetString(ArrayTest,1,szArrayItem_One,charsmax(szArrayItem_One));
    *               szArrayItem_One = Test2
    *
    *   @param ArrayData        Array
    *   @param szMessage        Строка
    *   @param szSimbol         Разделяющий символ
    *   @param bCell            false -- если строка
    *
    *   @return             -
*/
stock UTIL__RecordMessageInArray(Array:ArrayData,const szMessage[],const szSimbol = ' ',bool:bCell = false) {
    new szLeft[256],szRight[256];
    strtok(szMessage,szLeft,charsmax(szLeft),szRight,charsmax(szRight),szSimbol);
    
    if(bCell)
        ArrayPushCell(ArrayData,str_to_num(szLeft));
    else
        ArrayPushString(ArrayData,szLeft);
    while(szRight[0] != EOS && strtok(szRight,szLeft,charsmax(szLeft),szRight,charsmax(szRight),szSimbol)) {
        if(bCell)
            ArrayPushCell(ArrayData,str_to_num(szLeft));
        else
            ArrayPushString(ArrayData,szLeft);
    }
}
 

Вложения

Сообщения
25
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
сток обнаружения скольжения на сюрф
Код:
stock is_player_sliding(index)
{
    if(!is_user_alive(index))
        return 0;

    new flags = entity_get_int(index, EV_INT_flags);
    if(flags & FL_ONGROUND)
        return 0;

    new Float:origin[3], Float:dest[3];
    pev(index, pev_origin, origin);

    dest[0] = origin[0];
    dest[1] = origin[1];
    dest[2] = origin[2] - 1.0;

    new ptr = create_tr2();
    engfunc(EngFunc_TraceHull, origin, dest, 0, flags & FL_DUCKING ? HULL_HEAD : HULL_HUMAN, index, ptr);
    new Float:flFraction;
    get_tr2(ptr, TR_flFraction, flFraction);
    if( flFraction >= 1.0 )
    {
        free_tr2(ptr);
        return 0;
    }

    get_tr2(ptr, TR_vecPlaneNormal, dest);
    free_tr2(ptr);

    return dest[2] <= 0.7;
}
 
Сообщения
552
Реакции
49
Предупреждения
2
Помог
4 раз(а)
Stock для установки анимации игроку которая есть в модели

Код:
stock UTIL_PlayerAnimation(const iPlayer, const szAnim[], Float: flFramerate)
{
   new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
      
   if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1) iAnimDesired = 0;

   set_pev(iPlayer, pev_frame, 0.0);
   set_pev(iPlayer, pev_framerate, flFramerate);
   set_pev(iPlayer, pev_animtime, get_gametime());
   set_pev(iPlayer, pev_sequence, iAnimDesired);
    
   set_pdata_int(iPlayer, 40, bLoops, linux_diff_weapon);
   set_pdata_int(iPlayer, 39, 0, linux_diff_weapon);
    
   set_pdata_float(iPlayer, 36, flFrameRate, linux_diff_weapon);
   set_pdata_float(iPlayer, 37, flGroundSpeed, linux_diff_weapon);
   set_pdata_float(iPlayer, 38, get_gametime(), linux_diff_weapon);
    
   set_pdata_int(iPlayer, 73, 28, linux_diff_player);
   set_pdata_int(iPlayer, 74, 28, linux_diff_player);
   set_pdata_float(iPlayer, 220, get_gametime(), linux_diff_player);
}

Код:
#define ANIMATION1 // где ANIMATION1 имя анимации
UTIL_PlayerAnimation(id, ANIMATION1, 0.5) // где ANIMATION1 имя анимации которое вы поставили в #define Где 0.5 скорость анимации где id айди игрока
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
Тоже самое (https://dev-cs.ru/threads/222/page-16#post-134259), только на ReAPI с указанием оффсета m_Activity

C-like:
/* -> Player Animation <- */
stock UTIL_PlayerAnimation( const pPlayer, const szAnim[ ], const Float: flFrameRateAnim = 1.0, const Activity: iActivity = ACT_RANGE_ATTACK1 )
{
    new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
    if ( ( iAnimDesired = lookup_sequence( pPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed ) ) == -1 )
        iAnimDesired = 0;

    static Float: flGameTime; flGameTime = get_gametime( );

    UTIL_SetEntityAnim( pPlayer, iAnimDesired, .flFrameRate = flFrameRateAnim );

    set_member( pPlayer, m_fSequenceLoops, bLoops );
    set_member( pPlayer, m_fSequenceFinished, 0 );
    set_member( pPlayer, m_flFrameRate, flFrameRate );
    set_member( pPlayer, m_flGroundSpeed, flGroundSpeed );
    set_member( pPlayer, m_flLastEventCheck, flGameTime );
    set_member( pPlayer, m_Activity, iActivity );
    set_member( pPlayer, m_IdealActivity, iActivity );
    set_member( pPlayer, m_flLastFired, flGameTime );
}

/* -> Entity Animation <- */
stock UTIL_SetEntityAnim( const pEntity, const iSequence = 0, const Float: flFrame = 0.0, const Float: flFrameRate = 1.0 )
{
    set_entvar( pEntity, var_frame, flFrame );
    set_entvar( pEntity, var_framerate, flFrameRate );
    set_entvar( pEntity, var_animtime, get_gametime( ) );
    set_entvar( pEntity, var_sequence, iSequence );
}
15 Окт 2022
Сток-аналог EngFunc_DropToFloor с возвращением нового значения в вашу переменную
C-like:
/* -> Drop Vector to floor <- */
stock UTIL_DropVectorToFloor( Float: vecOrigin[ ] )
{
    new Float: vecStart[ 3 ]; xs_vec_copy( vecOrigin, vecStart );
    vecOrigin[ 2 ] = -4096.0;

    engfunc( EngFunc_TraceLine, vecStart, vecOrigin, IGNORE_MONSTERS, 0, 0 );
    get_tr2( 0, TR_vecEndPos, vecOrigin );
}
15 Окт 2022
Сток преобразует число в текст и добавляет спецсимвол между тысячными
Оригинал: https://forums.alliedmods.net/showpost.php?p=2329155&postcount=1

C-like:
/**
* Format number to string with a special character
*/
stock UTIL_FormatNumber( iValue, szOutput[ ], iLen, const szSpecialChar = ' ' )
{
    static szBuffer[ 16 ], iOutputPos, iNumPos, iNumLen;
    szBuffer[ 0 ] = '^0', iOutputPos = iNumPos = iNumLen = 0;
    if ( iValue < 0 )
    {
        szOutput[ iOutputPos++ ] = '-';
        iValue = abs( iValue );
    }

    iNumLen = num_to_str( iValue, szBuffer, charsmax( szBuffer ) );
    if ( iNumLen <= 3 )
        iOutputPos += copy( szOutput[ iOutputPos ], iLen, szBuffer );
    else
    {
        while ( ( iNumPos < iNumLen ) && ( iOutputPos < iLen ) )
        {
            szOutput[ iOutputPos++ ] = szBuffer[ iNumPos++ ];
            if ( ( iNumLen - iNumPos ) && !( ( iNumLen - iNumPos ) % 3 ) )
                szOutput[ iOutputPos++ ] = szSpecialChar;
        }
        szOutput[ iOutputPos ] = EOS;
    }

    return iOutputPos;
}
Пример:
C-like:
new iValue = random_num( 10000, 99999999 );
new szFormatedValue[ 16 ]; UTIL_FormatNumber( iValue, szFormatedValue, charsmax( szFormatedValue ) );
server_print( "Input: %i, Output: %s", iValue, szFormatedValue );
Вывод:
Input: 82275013, Output: 82 275 013
 
Последнее редактирование:
Сообщения
91
Реакции
141
Помог
1 раз(а)
Устали регистрировать каждый раз векторные переменные через Float: vecParam[3] ?
Макрос для вас
C-like:
#define Vector3(%0) Float:%0[3]
Использование:
C-like:
new Vector3( vecOrigin );
static Vector3( vecVelocity );
public MyFirstFunction( const Vector3( vecOrigin ) )
15 Окт 2022
Макрос проверяет, пустой ли у вас вектор или нет
C-like:
#define IsNullVector(%0) bool: ((%0[0] + %0[1] + %0[2]) == 0.0)
15 Окт 2022
Макрос проверяет, пустая ли ваша string переменная или нет
C-like:
#define IsNullString(%0) bool: (%0[0] == EOS)
 
Сообщения
219
Реакции
42
t3rkecorejz about your UTIL_FormatNumber
I'm currently using this old stock years ago.
C-like:
stock add_point(number)
{
    new count, i, str[29], str2[35], len
    num_to_str(number, str, charsmax(str))
    len = strlen(str)

    for (i = 0; i < len; i++)
    {
        if (i != 0 && ((len - i) %3 == 0))
        {
            add(str2, charsmax(str2), ".", 1)
            count++
            add(str2[i+count], 1, str[i], 1)
        }
        else
            add(str2[i+count], 1, str[i], 1)
    }

    return str2;
}
What is it better? I think yours because is calling less natives.
But I need more experienced people arguments.
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
raulitop,
  • I don't know how much better, but it seems like (I could be wrong) all sorts of format, format, add and similar natives allocate separate memory each time for all this, and you still have it happening in a loop, when in the case I sent, there is a symbol replacement by just a value in a variable (w/o natives)
  • Support for negative numbers (less than zero)
  • And the stock itself is not mine, I sent the original
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
336
Реакции
414
Помог
7 раз(а)
Отправляет бартайм с дробным значением
Код:
stock rg_send_float_bartime(id, Float:flTime, bool:observer = true)
{
    new iCeilTime = floatround(flTime, floatround_ceil);
    new iStartTime = floatround((1.0 - flTime / iCeilTime) * 100);

    rg_send_bartime2(id, iCeilTime, iStartTime, observer);
}
 
  • Like a Boss
Реакции: Just
Сообщения
397
Реакции
221
Помог
13 раз(а)
Видел во всяких JB сборках странный сток для открытия всех дверей. Циклы в циклах и подобна дичь.

Код позволяет открыть все камеры
Код:
new Array:g_iArray__EntityDoors;

public plugin_precache() {
    g_iArray__EntityDoors = ArrayCreate(1);
    UTIL__GetDoors();
}

stock UTIL__GetDoors() {
    new iEnt = NULLENT;
    new szTargetName[256];
    while((iEnt = rg_find_ent_by_class(iEnt,"func_door"))) {
        get_entvar(iEnt,var_targetname,szTargetName,charsmax(szTargetName));
        if(szTargetName[0] == EOS)
            continue;
        
        ArrayPushCell(g_iArray__EntityDoors,iEnt);
    }
}

stock UTIL__OpenAllDoors() {
    for(new i,iEnt;i<ArraySize(g_iArray__EntityDoors);i++) {
        iEnt = ArrayGetCell(g_iArray__EntityDoors,i);
        dllfunc(DLLFunc_Use,iEnt,0);
    }
}
 
Сообщения
458
Реакции
263
Помог
9 раз(а)
b0t., што будет если кто-то «застрянет» в открывающейся двери?
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
malniata, не знаю можно ли вообще застрять в момент когда открывается дверь, а не закрывается.
Но если не изменяет память, то и в самих модах это не предусмотрено.

Я всего лишь немного упростил метод для открытия всех дверей. Не более
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Получает индекс команды, которая подряд выигрывает.
Код:
// iWins - сколько раундов должна та или иная команда выигрывать подряд
stock TeamName:rg_get_team_wins_row(const iWins)
{
    if(get_member_game(m_iNumConsecutiveCTLoses) >= iWins)
    {
        return TEAM_TERRORIST;
    }
    else if(get_member_game(m_iNumConsecutiveTerroristLoses) >= iWins)
    {
        return TEAM_CT;
    }
  
    return TEAM_UNASSIGNED;
}
30 Ноя 2022
Получение оставшегося времени до конца раунда
Код:
stock Float:rg_get_remaining_time()
{
    return (float(get_member_game(m_iRoundTimeSecs)) - get_gametime() + Float:get_member_game(m_fRoundStartTimeReal));
}
 
Последнее редактирование:
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Получает индекс команды, которая подряд проигрывает.
Код:
stock TeamName:rg_get_team_loses_row(const loses)
{
    if(get_member_game(m_iNumConsecutiveCTLoses) >= loses )
    {
        return TEAM_CT;
    }
    else if(get_member_game(m_iNumConsecutiveTerroristLoses) >= loses )
    {
        return TEAM_TERRORIST;
    }
    
    return TEAM_UNASSIGNED;
}
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Код:
stock TeamName:rg_get_team_loses_row(const loses)
{
    if(get_member_game(m_iNumConsecutiveCTLoses) >= loses )
    {
        return TEAM_CT;
    }
    else if(get_member_game(m_iNumConsecutiveTerroristLoses) >= loses )
    {
        return TEAM_TERRORIST;
    }
   
    return TEAM_UNASSIGNED;
}
Разрешите докопаться:
Код:
stock TeamName:rg_get_team_loses_row(const loses)
{
    return (get_member_game(m_iNumConsecutiveCTLoses) >= loses) ? TEAM_CT : (get_member_game(m_iNumConsecutiveTerroristLoses) >= loses) ? TEAM_TERRORIST : TEAM_UNASSIGNED;
}
 
Сообщения
658
Реакции
563
Предупреждения
8
Помог
9 раз(а)
hajimura, Молодец. Ухудшилось чтение кода.
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Что, в склад полезного кода теперь и шрифты добавляем? Прикольно
 

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

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