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

Сообщения
458
Реакции
263
Помог
9 раз(а)
Код:
//спецсимволы
new const COMMENTS[] =   {
    '#', ';'
};

new const QUOTE = '^"';

stock delete_comment(szString[])    {
    new len = strlen(szString);
    new bool: bInQuotes;

    for (new i; i < len; i++)   {
        if (szString[i] == QUOTE)    {
            bInQuotes = !bInQuotes;
        }

        if (bInQuotes)  {
            continue;
        }

        for (new c; c < sizeof COMMENTS; c++)   {
            if (szString[i] == COMMENTS[c]) {
                szString[i] = EOS;

                break;
            }
        }
    }
}

Код:
while (!feof(file)) {
    fgets(file, buffer, charsmax(buffer));

    if (buffer[0] == EOS || buffer[0] == ';')   {
        continue;
    }

    delete_comment(buffer);
    trim(buffer);

    parse(buffer, szIp, charsmax(szIp));

    g_iWhiteList++;
    ArrayPushString(g_aWhiteList, szIp);
}

input:
127.0.0.0 ; blablabla
output:
127.0.0.0
 
Сообщения
2,751
Реакции
3,014
Помог
61 раз(а)
1633698051472.png1633697981019.png
1633696041732.png

C++:
new CTSpawns[][2] = {
  {1,2}, {2,2}, {3,2},
  {1,1}, {2,1}, {3,1}
}

new TSpawns[][2] = {
  {1,4}, {2,4}, {3,4},
  {1,3}, {2,3}, {3,3}
}

public void OnPluginStart() {
  new Float: medium[2]

  GetMedium(CTSpawns, sizeof CTSpawns, medium)
  PrintToServer("CTSpawns medium(%.2f, %.2f)", medium[0], medium[1])

  GetMedium(TSpawns, sizeof TSpawns, medium)
  PrintToServer("TSpawns medium(%.2f, %.2f)", medium[0], medium[1])
}

GetMedium(inputSpawns[][], size, Float: outputPoint[]) {
  new mins[2] = {cellmax, cellmax}
  new maxs[2] = {cellmin, cellmin}

  getMins(inputSpawns, size, mins)
  getMaxs(inputSpawns, size, maxs)
  getMiddle(mins, maxs, outputPoint)
}

getMins(input[][], size, output[]) {
  #define _min(%1,%2) (%1 <= %2 ? %1 : %2)

  for(new i; i < size; i++)
    output[0] = _min(output[0], input[i][0])

  for(new i; i < size; i++)
    output[1] = _min(output[1], input[i][1])
}

getMaxs(input[][], size, output[]) {
  #define _max(%1,%2) (%1 >= %2 ? %1 : %2)

  for(new i; i < size; i++)
    output[0] = _max(output[0], input[i][0])

  for(new i; i < size; i++)
    output[1] = _max(output[1], input[i][1])
}

getMiddle(point1[], point2[], Float: output[]) {
  output[0] = (point1[0] + point2[0]) / 2.0
  output[1] = (point1[1] + point2[1]) / 2.0
}
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
SergeyShorokhov, эт все здорово, когда у тебя прямоугольничек получается описать спавнами. Есть кейсы, когда серединка у тебя будет в текстуре, и это мы опускаем случаи с координатой Z.
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Автор: ArKaNeMaN
Получение длины строки с учётом многобайтовых символов.

Код:
stock mb_strlen(const str[])
{
    new i = 0, len = 0;

    while(str[i])
    {
        len++;
        i += get_char_bytes(str[i]);
    }

    return len;
}
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Может кому-то понадобится, увидел в тырнете способ и сделал из него сток.

Мигание денег игрока(подобное появляется, когда пытаетесь купить оружие, а денег не хватает).

Код:
// id - игрок, кому отправить мигание денег
// blinkQty - количество миганий

// 104 = get_user_msgid("BlinkAcct")

stock blink_money(const id, const blinkQty = 1)
{
    message_begin(MSG_ONE, 104, .player = id);
    write_byte(blinkQty);
    message_end();
}
 
Последнее редактирование:
Сообщения
336
Реакции
414
Помог
7 раз(а)
Возвращает склоненное слово "секунда" в зависимости от цифры. Может потребоваться для таймеров или подобных вещей.

Код:
stock time_case(time)
{
    new szString[16];

    if(time % 10 == 1 && time % 10 != 11)
    {
        formatex(szString, charsmax(szString), "секунда");
        return szString;
    }
    else if(time % 10 >= 2 && time % 10 <= 4)
    {
        formatex(szString, charsmax(szString), "секунды");
        return szString;
    }

    formatex(szString, charsmax(szString), "секунд");
    return szString;
}
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
C++:
//[Время]
enum {
    ULD_Second = (1<<0),
    ULD_Minute = (1<<1),
    ULD_Hour = (1<<2),
    ULD_Day = (1<<3),
    ULD_Year = (1<<4),

    ULD_Timer = (ULD_Minute|ULD_Second),
    ULD_PlayTime = (ULD_Hour|ULD_Minute|ULD_Second),
    ULD_AllOnly = (ULD_Day|ULD_Hour|ULD_Minute|ULD_Second),
    ULD_All = (ULD_Year|ULD_Day|ULD_Hour|ULD_Minute|ULD_Second)
};

stock unixToLastData(bitType, iUnixTime, bool:bDayUnlimit = false) {
    new szTime[128], iLen;
    if(bitType & ULD_Year) { iLen += formatex(szTime[iLen], charsmax(szTime) - iLen, "%d лет, ", (iUnixTime / 31536000)); }
    if(bitType & ULD_Day) { iLen += formatex(szTime[iLen], charsmax(szTime) - iLen, "%d д., ", !bDayUnlimit ? ((iUnixTime / 86400) % 29) : (iUnixTime / 86400)); }
    if(bitType & ULD_Hour) { iLen += formatex(szTime[iLen], charsmax(szTime) - iLen, "%d час., ", ((iUnixTime / 3600) % 24)); }
    if(bitType & ULD_Minute) { iLen += formatex(szTime[iLen], charsmax(szTime) - iLen, "%d мин., ", ((iUnixTime / 60) % 60)); }
    if(bitType & ULD_Second) { iLen += formatex(szTime[iLen], charsmax(szTime) - iLen, "%02d сек., ", (iUnixTime % 60)); }
    szTime[iLen - 2] = '^0';
    return szTime;
}
Возвращает время до конца срока. unixToLastData(enum, время, если true то дни не будут уходить в 0*сброс*)
25 Ноя 2021
C++:
//[Прочее]
enum eData_CoolDown { //-> Кулдауны. Сюда вписывать свои
    Cooldown_SaveLink = 0,
    Cooldown_Storage
};
new Float:g_fReloadCooldown[MAX_PLAYERS + 1][eData_CoolDown];

stock isUserCooldown(pId, eData_CoolDown:iTask, Float:fTime = 0.1) {
    if(g_fReloadCooldown[pId][iTask] > get_gametime())
        return false;
    
    g_fReloadCooldown[pId][iTask] = get_gametime() + fTime;
    return true;
}

//Пример использования:
@test(pId) {
if(isUserCooldown(pId, Cooldown_SaveLink, (60.0 * 5))) { save_user_data(pId, false); }
}
Удобное решение с кулдаунами. Вернет true если кулдаун обновлен, false если время еще не истекло
25 Ноя 2021
Код:
stock zp_create_menu(szHandle[], szTitle[], any:...) {
    new szBuffer[512], iLen = formatex(szBuffer, charsmax(szBuffer), "\d[\yЛК\d] \w");
    if(numargs() > 2) vformat(szBuffer[iLen], charsmax(szBuffer) - iLen, szTitle, 3);
    else copy(szBuffer[iLen], charsmax(szBuffer) - iLen, szTitle);
    return menu_create(szBuffer, szHandle);
}
//Пример:
@test(pId) {
hMenu = zp_create_menu("HandleMenu_KickOfflineAccept", "Кикнуть игрока из клана офлайн?^n\wНик: \r%s^n\wПричина: \y%s",
    g_eUserOfflineData[pId][PlayerData_Name], szReason);

}
Создание newmenus с готовым префиксом в меню и без fmt / formatex

Так же в комплекте использую это:

C++:
stock Menu_SetRussian(hMenu, szExitName[]) {
    menu_setprop(hMenu, MPROP_NUMBER_COLOR, "\y");
    menu_setprop(hMenu, MPROP_NEXTNAME, "Далее");
    menu_setprop(hMenu, MPROP_BACKNAME, "Назад");
    menu_setprop(hMenu, MPROP_EXITNAME, szExitName);
}
 
Последнее редактирование:
Сообщения
74
Реакции
61
Помог
1 раз(а)
C++:
//Стиль можно брать свой
#define STATSX_SHELL_DESIGN8_STYLE_STAT "<meta charset=UTF-8><style>body{background:#242424;margin:20px;font-family:Tahoma}th{background:#2F3034;color:#BDB670;text-align:left} table{padding:4px;background:#4A4945;font-size:18px;color:#FFF}h2,h3{color:#D2D1CF}#c{background:#3B3C37}img{height:4px;background:#99CC00;margin:0 3px}#r{height:4px;background:#999900}#clr{background:none;color:#FFF;font-size:10px}</style>"

new bool:g_bJumpPosition;

stock addMotdLine(szBuffer[2048], &iLen, szTitleName[], szTitleInfo[], any:...) {
    new szInfo[1024];
    if(numargs() > 4) vformat(szInfo, charsmax(szInfo) - iLen, szTitleInfo, 5);
    else copy(szInfo, charsmax(szInfo), szTitleInfo);
   
    if(!g_bJumpPosition) { iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<tr><th>%s:<td>%s</tr>", szTitleName, szInfo); }
    else { iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<tr id=c><th>%s:<td>%s</tr>", szTitleName, szInfo); }
    g_bJumpPosition = !g_bJumpPosition;
}

stock showMotd_Test(pId) {
    g_bJumpPosition = false;
    new szBuffer[2048], iLen = formatex(szBuffer, charsmax(szBuffer), STATSX_SHELL_DESIGN8_STYLE_STAT);
    iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", g_szTitleName[iKey]);
    addMotdLine(szBuffer, iLen, "Описание", g_szTitleInfo[iKey]);
    addMotdLine(szBuffer, iLen, "Прогресс", "%d/100%%", getTitleProgress(pId, iKey));
    show_motd(pId, szBuffer, "");
}
Сток упрощает работу с МОТД, а именно меняет автоматически цвет линии в таблице. Лично мне сэкономило много времени. Чуть отредачить можно сделать под ТОП, ну или не парится и вручную прописывать
 

Вложения

Сообщения
336
Реакции
414
Помог
7 раз(а)
math_numbs - количество разрядов числа
math_first - первые разряды числа, если не указывать второй аргумент, то вернет, первый разряд числа.
math_last - последние разряды числа, если не указывать второй аргумент, то вернет, последний разряд числа.

Код:
stock math_numbs(num)
{
    return floatround(floatlog(float(num)), floatround_floor) + 1;
}

stock math_first(num, numeral = 1)
{
    new numbs = floatround(floatlog(float(num)), floatround_floor) + 1;
    return num / floatround(floatpower(10.0, float(numbs) - float(numeral)));
}

stock math_last(num, numeral = 1)
{
    return num % floatround(floatpower(10.0, float(numeral)));
}
1637912512965.png
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
C++:
//Стиль можно брать свой
#define STATSX_SHELL_DESIGN8_STYLE_STAT "<meta charset=UTF-8><style>body{background:#242424;margin:20px;font-family:Tahoma}th{background:#2F3034;color:#BDB670;text-align:left} table{padding:4px;background:#4A4945;font-size:18px;color:#FFF}h2,h3{color:#D2D1CF}#c{background:#3B3C37}img{height:4px;background:#99CC00;margin:0 3px}#r{height:4px;background:#999900}#clr{background:none;color:#FFF;font-size:10px}</style>"

new bool:g_bJumpPosition;

stock addMotdLine(szBuffer[2048], &iLen, szTitleName[], szTitleInfo[], any:...) {
    new szInfo[1024];
    if(numargs() > 4) vformat(szInfo, charsmax(szInfo) - iLen, szTitleInfo, 5);
    else copy(szInfo, charsmax(szInfo), szTitleInfo);
 
    if(!g_bJumpPosition) { iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<tr><th>%s:<td>%s</tr>", szTitleName, szInfo); }
    else { iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<tr id=c><th>%s:<td>%s</tr>", szTitleName, szInfo); }
    g_bJumpPosition = !g_bJumpPosition;
}

stock showMotd_Test(pId) {
    g_bJumpPosition = false;
    new szBuffer[2048], iLen = formatex(szBuffer, charsmax(szBuffer), STATSX_SHELL_DESIGN8_STYLE_STAT);
    iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", g_szTitleName[iKey]);
    addMotdLine(szBuffer, iLen, "Описание", g_szTitleInfo[iKey]);
    addMotdLine(szBuffer, iLen, "Прогресс", "%d/100%%", getTitleProgress(pId, iKey));
    show_motd(pId, szBuffer, "");
}
Сток упрощает работу с МОТД, а именно меняет автоматически цвет линии в таблице. Лично мне сэкономило много времени. Чуть отредачить можно сделать под ТОП, ну или не парится и вручную прописывать
Это обычно делается делением по модулю на 2, тогда бул не надо инвертить.
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Автор: ArKaNeMaN
Получение всех цифр из строки.

Код:
#define CharIsNumeric(%1) (%1 >= 0x30 && %1 <= 0x39)

ExtractDigitsFromString(const Str[], Out[], const OutLen)
{
    new iCharNum = 0, i = 0;
    
    while(iCharNum <= OutLen && Str[i])
    {
        if(CharIsNumeric(Str[i]))
        {
            Out[iCharNum] = Str[i];
            iCharNum++;
        }
        i++;
    }

    Out[iCharNum] = 0;
    return iCharNum;
}
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Время разговора в микрофон(именно разговора, а не использования микрофона)

Способ с использованием [WIP] Revoice Plus + [WIP] Voice Utils

Код:
#include <amxmodx>
#include <voiceutils>

new Float:g_PlayerTalkTime[MAX_PLAYERS + 1], Float:g_TimePressedTalkKey[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("Test Speak", "0.0.1", "Albertio");
}

public VU_OnStartSpeak(const index)
{
    g_TimePressedTalkKey[index] = get_gametime();
}

public VU_OnStopSpeak(const index)
{
    if(g_TimePressedTalkKey[index])
    {
        g_PlayerTalkTime[index] += (get_gametime() - g_TimePressedTalkKey[index]);
        g_TimePressedTalkKey[index] = 0.0;
        //client_print(index, print_chat, "%.2f", g_PlayerTalkTime[index]);
    }
}
Способ с использованием VTC + REAPI

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

new Float:g_PlayerTalkTime[MAX_PLAYERS + 1], Float:g_TimePressedTalkKey[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("Test Speak", "0.0.1", "Albertio");
}

public VTC_OnClientStartSpeak(const index)
{
    g_TimePressedTalkKey[index] = get_gametime();
}

public VTC_OnClientStopSpeak(const index)
{
    if(g_TimePressedTalkKey[index])
    {
        g_PlayerTalkTime[index] += (get_gametime() - g_TimePressedTalkKey[index]);
        g_TimePressedTalkKey[index] = 0.0;
        //client_print(index, print_chat, "%.2f", g_PlayerTalkTime[index]);
    }
}
 
Последнее редактирование:

Garey

ninjaCow
Сообщения
421
Реакции
1,056
Помог
10 раз(а)
Albertio, Спасибо. В revoice-plus оказывается не правильно работало определение speak и т.д. Исправил в последней версии.

Кстати второй пример из твоего сообщения будет работать и без voice utils и vtc (с Revoice Plus) т.к. в нем есть обратная совместимость с VTC.
 
Сообщения
25
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Javekson, error 033: array must be indexed (variable "g_UserID") что за меню такое? (amx 190)
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
satanizmov, g_UserID[id][i] = get_user_userid(i);
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Пример блока шагов из ссылки, которая в этом посте. Поскольку ресурс гуфнулся
Код:
#include <amxmodx>
#include <reapi>

public plugin_init() {
    RegisterHookChain(RH_SV_StartSound, "SV_StartSound");
}


public SV_StartSound(const recipients, const entity, const channel, const sample[], const volume, Float:attenuation, const fFlags, const pitch) {
    // check sample player/pl_XXXX.wav
    if (sample[0] != 'p' || sample[1] != 'l' || sample[7] != 'p' || sample[8] != 'l') {
        return HC_CONTINUE;
    }
  
    if (entity == 2/*the specified player*/ && recipients == 1) {
        return HC_SUPERCEDE;
    }

    return HC_CONTINUE;
}
 
Последнее редактирование:
Сообщения
336
Реакции
414
Помог
7 раз(а)
Перевод секунд в Часы Минуты Секунды.
Пример: inSec = 100(секунд), вернет 3 ссылочных аргумента, 0(outHour) часов 1(outMin) минут 40(outSec) секунд

Код:
stock ConvertSecToHourMinSec(inSec, &outHour, &outMin, &outSec)
{
    outHour = inSec / 3600;
  
    inSec %= 3600;
    outMin = inSec / 60;

    inSec %= 60;
    outSec = inSec;
}
 

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

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