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

Сообщения
141
Реакции
201
Помог
5 раз(а)
C++:
// Надет ли глушитель
bool:IsWeaponSilenced(const ItemId){
    static WeaponState:State; State = get_member(ItemId, m_Weapon_iWeaponState);
    return bool:(State & WPNSTATE_USP_SILENCED || State & WPNSTATE_M4A1_SILENCED);
}
почему не макрос?
 
Последнее редактирование модератором:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
А так же: почему статик? Почему неправильная работа с битами?
 
Последнее редактирование модератором:

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
Последнее редактирование модератором:
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
Сток позволяет отправить звук одному игроку или всем, как в rg_send_audio(), но с той разницей, что в rg_send_audio звуки перебивают друг друга, что бывает очень неудобно.
Код:
stock rg_send_audio2(const iPlayer, const szAudio[])
{
    if(!iPlayer)
    {
        for(new i = 1; i <= MaxClients; i++)
        {
            if(!is_user_connected(i) || is_user_hltv(i) || is_user_bot(i))
                continue;

            rh_emit_sound2(i, i, CHAN_STATIC, szAudio);
        }
    }
    else
    {
        rh_emit_sound2(iPlayer, iPlayer, CHAN_STATIC, szAudio);
    }
}
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
sbelov020, эмитсаунд по другому работает.
 
Последнее редактирование модератором:
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
d3m37r4, я в курсе, как они работают
 
Последнее редактирование модератором:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
sbelov020, одно другим не заменяется. Send_audio воспроизводит мессагу для игрока, а emit_sound эмулирует звук от указанного объекта.
 
Последнее редактирование модератором:
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
d3m37r4, я ещё раз повторяю, я знаю, как работают эти функции. Мне нужно было воспроизводить звуки игрокам индивидуально, но чтоб они не перебивали друг друга и без клиент команды - я нашел такой способ. Теперь делюсь им со всеми.
 
Последнее редактирование модератором:
Сообщения
169
Реакции
462
Помог
2 раз(а)
Макросы для работы с битсуммами
C++:
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define reset_bit(%1,%2) (%1 &= ~(1 << (%2 & 31)))
#define invert_bit(%1,%2) (%1 ^= (1 << (%2 & 31)))
Часто вижу юзают set_bit и reset_bit (он же clr_bit). Но иногда, в зависимости от какого-то условия, приходится либо устанавливать бит, либо занулить. Что приводит примерно к такому коду:
C++:
    new bool:someCondition = true;
    if (someCondition)
    {
        set_bit(g_bits, playerIndex);
    }
    else
    {
        clr_bit(g_bits, playerIndex);
    }
В этом случае, было бы удобней без макроса clr_bit (ИМХО). Использовать только макрос set_bit, в который можно передавать значение true (установить бит) и flase (очистить бит). Сам макрос выглядит так:

#define set_bit(%1,%2,%3) (%3 && (%1 |= (1 << (%2 & 31))) || (%1 &= ~(1 << (%2 & 31))))
Теперь, можно переписать код который под спойлером, без макроса clr_bit:
C++:
    new bool:someCondition = true;
    set_bit(g_bits, playerIndex, someCondition);
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
@the_hunter, есть же togglebit
toggle - переключение бита, с нуля на 1 и обратно. Не нужно путать. Это немного другое. А если нужно быть уверенным, что бит будет очищен или установлен? То есть делаю toggle - ожидаю что бит будет 0 (но бит по каким-либо причинам и так был 0) получаю 1.
Ведь биты могут быть изменены в других функциях. А хранятся все в глобальной переменной.
 
Последнее редактирование модератором:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Данным стоком можно только что выданное оружие сделать активным. Ну или например сделать переключение на последнее активное.
Зависимости:
Код:
#include <hamsandwich>
#include <reapi>
Код:
stock bool:switchItem(const id, const item) {
    if (is_nullent(item)) {
        return false;
    }

    new activeItem = get_member(id, m_pActiveItem);
    if (is_nullent(activeItem)) {
        return false;
    }

    if (!ExecuteHamB(Ham_Item_CanHolster, activeItem)) {
        return false;
    }

    if (!ExecuteHamB(Ham_Item_CanDeploy, item)) {
        return false;
    }

    set_member(id, m_pLastItem, activeItem);
    ExecuteHamB(Ham_Item_Holster, activeItem, 0);

    set_member(id, m_pActiveItem, item);
    ExecuteHamB(Ham_Item_Deploy, item);
    return true;
}
 
Сообщения
192
Реакции
148
Помог
1 раз(а)
fantom, rg_switch_weapon есть же
 
Последнее редактирование модератором:
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Ruby, не заметил. И вправду есть. Ну в любом случае пример не навредит.
 
Последнее редактирование модератором:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Пример открытия стандартного меню закупки, может использоваться в CSDM (пример использования тут), чтобы не городить свои кастомные менюхи.

Код:
#include <reapi>

public plugin_init() {
    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "HC_CBasePlayer_OnSpawnEquip_Post", true);
}

public HC_CBasePlayer_OnSpawnEquip_Post(const id, bool:addDefault, bool:equipGame) {
    OpenDefaultBuyMenu(id);
}

OpenDefaultBuyMenu(id) {
    _show_vgui_menu(id, VGUI_Menu_Buy, (MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_0), "#Buy");
    set_member(id, m_iMenu, Menu_Buy);    // for oldstyle menu
}

stock _show_vgui_menu(const index, const any:menu, const keys, text[]) {
    if(get_member(index, m_bVGUIMenus) || menu > any:VGUI_Menu_Buy_Item) {
        static msgVGUIMenu;

        if(!msgVGUIMenu ) {
            msgVGUIMenu = get_user_msgid("VGUIMenu");
        }

        message_begin(index ? MSG_ONE : MSG_ALL, msgVGUIMenu, _, index);
        write_byte(menu);
        write_short(keys);
        write_char(-1);
        write_byte(0);
        write_string(text);
        message_end();
    } else {
        show_menu(index, keys, text);
    }
}
 
Сообщения
66
Реакции
42
Исправленный и рабочий вариант: https://dev-cs.ru/threads/222/page-7#post-70997


Код:
Этот сток позволит конвертировать число в Kilo формат, как в соц. сетях

// By impossible
stock kilo(num)
{

                  new s[10]; num_to_str(num, s, charsmax(s))

                  if (num > 999) {
                              new l = num > 99999 ? 3 : num > 9999 ? 2 : 1

                              switch (s[l])
                              {
                                                case: '1': replace(s, charsmax(s), s[l], ".1K")
                                                case: '2': replace(s, charsmax(s), s[l], ".2K")
                                                case: '3': replace(s, charsmax(s), s[l], ".3K")
                                                case: '4': replace(s, charsmax(s), s[l], ".4K")
                                                case: '5': replace(s, charsmax(s), s[l], ".5K")
                                                case: '6': replace(s, charsmax(s), s[l], ".6K")
                                                case: '7': replace(s, charsmax(s), s[l], ".7K")
                                                case: '8': replace(s, charsmax(s), s[l], ".8K")
                                                case: '9': replace(s, charsmax(s), s[l], ".9K")
                                                default: replace(s, charsmax(s), s[l], "K")
                                }
                   }

                   return s;
}
 
Последнее редактирование модератором:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Impossible, оберни код в тэг соответствующий.
 
Последнее редактирование модератором:

Garey

ninjaCow
Сообщения
422
Реакции
1,056
Помог
10 раз(а)
Impossible,
Код:
server_print("%s", kilo(1000));
server_print("%s", kilo(10000));
server_print("%s", kilo(100000));
>>>
1K
1K0
1K00
так и должно работать? и что за kilo формат? имеется ввиду это?
19598
 
Последнее редактирование модератором:
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Garey, да. Правда, применения этому в 1.6 - не вижу. Вернее, не вижу смысла. Разве что, в каких-то системах накопления чего-либо, в эстетических целях оформления.
 
Последнее редактирование модератором:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Minni, стата дамага, правда код нерабочий.
 
Последнее редактирование модератором:

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

Сверху Снизу