Обучение и помощь по скриптингу для MIRDOBRO777

Сообщения
113
Реакции
26
Ayk, заработало. А можно в массив вставлять переменную (квар)?
Я пытаюсь, но он ругается (error 008).
Например:
{ "weapon", "weapon_deagle", 5 }
Заменить число патронов на переменную:
{ "weapon", "weapon_deagle", iAmmo }
Так возможно делать?
 
Сообщения
113
Реакции
26
Что-то с оружием не могу понять что происходит.
Тестировал долгое время. Выдает все оружие или гранаты, но AWP ни разу не выдало.
В логах следующее (порядок строк соблюден):
L 08/14/2019 - 11:34:45: Start of error session.
L 08/14/2019 - 11:34:45: Info (map "de_dust2_3x3_lite") (file "addons/amxmodx/logs/error_20190814.log")
L 08/14/2019 - 11:34:45: [ReAPI] set_member: invalid or uninitialized entity
L 08/14/2019 - 11:34:45: [AMXX] Displaying debug trace (plugin "s.amxx", version "1.0")
L 08/14/2019 - 11:34:45: [AMXX] Run time error 10: native error (native "set_member")
L 08/14/2019 - 11:34:45: [AMXX] [0] s.sma::GiveItem (line 60)
L 08/14/2019 - 11:34:45: [AMXX] [1] s.sma::@Test (line 42)
После данной ошибки, мне выдало Scout с полным боезапасом (патроны).
Код:
#include <amxmodx>
#include <reapi>
//     log_to_file("addons\amxmodx\logs\test.txt" , "^nПродолжительность: %.2f^nКвар: %d^n", TaskGravity, anum);
//    emit_sound(0, CHAN_BODY, SOUND_FLASH, 1.0, ATTN_NORM, 0, PITCH_HIGH);
//https://dev-cs.ru/threads/7222/page-2

#define GetCvarDesc(%0) fmt("%L", LANG_SERVER, %0)
//#define MSG_GIVE "^3Действие ^4%d сек."
//new const TASK_NORMAL = 101

new const iAmmoMode = 1;
enum _:WEAPONS_DATA { ITEM_CASE[10], ITEM_NAME[10], WEAPON_NAME[20], VALUE_AMMO };
new const g_ItemList[][WEAPONS_DATA] = {
    { "weapon", "Glock18", "weapon_glock18", 4 },
    { "weapon", "Usp", "weapon_usp", 4 },
    { "weapon", "Deagle", "weapon_deagle", 4 },
    { "weapon", "AK47", "weapon_ak47", 3 },
    { "weapon", "M4A1", "weapon_m4a1", 3 },
    { "weapon", "Famas", "weapon_famas", 3 },
    { "weapon", "AUG", "weapon_aug", 3 },
    { "weapon", "Scout", "weapon_scout", 5 },
    { "weapon", "AWP", "weapon_awp", 5 },
    { "nade", "HE", "weapon_hegrenade", 5 },
    { "nade", "Freeze", "weapon_flashbang", 3 },
    { "nade", "Frost", "weapon_smokegrenade", 2 }
};

public plugin_init() {
    register_plugin("Testing", "1.0", "Admin");
//    register_dictionary("test.txt");
    register_clcmd("say /r", "@Test");

//    new pCvarAmmoNumMin = create_cvar("rulya_ammo_num_min", "1", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_AMMO_NUM_MIN"), true, 1.0);
//    new pCvarAmmoNumMax = create_cvar("rulya_ammo_num_max", "5", FCVAR_NONE, GetCvarDesc("RULYA_CVAR_AMMO_NUM_MAX"));

//    iAmmoNumMin = get_pcvar_num(pCvarAmmoNumMin);
//    iAmmoNumMax = get_pcvar_num(pCvarAmmoNumMax);
}

@Test(id) {
    new i = random(sizeof (g_ItemList));
    GiveItem(id, g_ItemList[i][ITEM_CASE], g_ItemList[i][ITEM_NAME], g_ItemList[i][WEAPON_NAME], g_ItemList[i][VALUE_AMMO]);
}

GiveItem(id, szCase[], szName[], szItem[], iValue) {
    new g_Ammo;
    if(iAmmoMode) g_Ammo = random(iValue);
    else g_Ammo = iValue;

    switch(szCase[0]) {
    case 'n': {
    rg_give_item(id, szItem);
    rg_set_user_bpammo(id, rg_get_weapon_info(szItem, WI_ID), g_Ammo);
    if(g_Ammo > 0) log_to_file("addons\amxmodx\logs\nade.txt" , "^nИмя: %s^nПатроны: %d^n", szName, g_Ammo);
    else log_to_file("addons\amxmodx\logs\no.txt" , "^nИмя: %s^nПатроны: %d^n", szName, g_Ammo);
}
    case 'w': {
    rg_remove_item(id, szItem, true);
    new iWpn = rg_give_item(id, szItem);
    set_member(iWpn, m_Weapon_iClip, g_Ammo);
    log_to_file("addons\amxmodx\logs\w.txt" , "^nИмя: %s^nПатроны: %d^n", szName, g_Ammo);
}
}
}
 
Сообщения
113
Реакции
26
С выдачей патронов разобрался путем установки принудительно "0":
rg_set_user_bpammo(id, rg_get_weapon_info(szItem, WI_ID), 0);
А вот с АВП не пойму в чем причина ошибки.
Закомментировал строку с выдачей АВП и все работает правильно, без ошибок в логах и выдает что надо.
Подскажите, пожалуйста, как правильно выдать АВП или может чего с массивом не так.
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
[ReAPI] set_member: invalid or uninitialized entity
Функция rg_give_item() может вернуть -1 если выдача итема не увенчалось успехом.
Результат надо проверять на валидность перед дальнейшей работой над предполагаемой энтити оружия.
Код:
    new iWpn = rg_give_item(id, szItem);
    if( is_nullent(iWpn) )
        return; // fail
    set_member(iWpn, m_Weapon_iClip, g_Ammo);
А вот с АВП не пойму в чем причина ошибки.
В коде проблем не вижу. Ну только если из-за рандома АВП просто напросто не попадается.
Возможно у тебя стоит плагин блокирующий АВП.
 
Сообщения
113
Реакции
26
Ayk, спасибо! Стоит плагин блокировки АВП на тестовом серваке и он не давал АВП. А на счет замены прочих функций, например подсветка или невидимость игрока, а также отлов игрока на лестнице, можешь подсказать замену из ReAPI?
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Сообщения
113
Реакции
26
Ayk,
Пролистал всю тему, что ты скинул, но не нашел замены вот таких функций:
Код:
    new flags = pev(id, pev_flags);
    if((flags & FL_ONGROUND) || (flags & FL_PARTIALGROUND)) {
и вот такая: entity_set_string(id, EV_SZ_viewmodel, "");
В инклюде ReAPI нашел "var_flags", но не пойму что это значит. Флаги доступа?
И в той теме действительно интересные решения есть. Спасибо! =)
P.S. Хочу просто убрать модули, которые можно заменить ReAPI.
 
Сообщения
38
Реакции
29
Помог
4 раз(а)
MIRDOBRO777, нет, не флаги доступа, юзай
C++:
get_entvar(index, var_flags)
set_entvar(index, var_viewmodel, "")
 
Сообщения
113
Реакции
26
Вот еще функции для замены.
Заменил сам:
Код:
    new Float:velocity[3];
//    entity_get_vector(id, EV_VEC_velocity, velocity); // что заменял
    get_entvar(id, var_origin, velocity); // правильно заменил?
// Далее аналогично
    velocity[2] = 250.0;
//    entity_set_vector(id, EV_VEC_velocity, velocity);
    set_entvar(id, var_origin, velocity);
А вот эту функцию не знаю как заменить: entity_set_int(id, EV_INT_gaitsequence, 6);
 
Сообщения
113
Реакции
26
Denzer,
на форуме по Вашей ссылке тоже вроде, что и в инклюде.
Вот Вы объяснили, что я ошибся и указал координаты, вместо ускорения. Мне так понятно сразу.
По описанию на английском я не понимаю о чем речь.
Поэтому и спрашиваю здесь.
Так чем заменить функцию установки свойства для игрока (в моем случае вроде при соприкосновении с поверхностью)?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Сообщения
113
Реакции
26
Приветствую, ребята!
Решил написать небольшую лотерею и взял код из другого плагина.
Переделал под себя и столкнулся с проблемой.
Когда вызываю главное меню и нажимаю на любую ставку, то меню просто закрывается, а должен происходить переход на вторую менюшку.
Коротко о сути рулетки:
Игрок делает ставку и во втором меню пытается предъугадать какое число выпадет и, соответственно, либо выигрывает, либо проигрывает.
Но не работает даже открытие второго меню. И еще вопрос к опытным людям, а ставку правильно я отлавливаю, чтобы потом либо списать, либо начислить деньги игроку?
Код:
#include <amxmodx>
#include <amxmisc>
#include <reapi>

#define get_player_money(%1)    get_member(%1, m_iAccount)
new g_Bet[33], SelectPlayer[33];

new const g_iBets[] = {1, 2, 3, 4, 5, 6, 7, 8};
new const prefix[] = "^1[^4MULTY^1]"

public plugin_init() {
    register_plugin("Multy Money", "1.0.0", "MirDobro777");

    register_clcmd("say /multy", "Multy_Menu");
    register_clcmd("say /r", "Multy_Menu");
    register_concmd("my_bet", "ReceivingBet");

    register_menu("BetMenu", 1023, "BetMenu_handler");
    register_menu("NumberMenu", 1023, "NumberMenu_handler");
}

public Multy_Menu(const id) {
    if(!is_user_connected(id)) return PLUGIN_HANDLED;
    SetGlobalTransTarget(id);

    new szMenu[MAX_MENU_LENGTH], iLen;
    new keys = MENU_KEY_0;

    if(get_player_money(id) < g_iBets[0]) {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "\rУ Вас недостаточно денег для игры в рулетку^n\wМинимальная сумма для одной игры: \r$%d^n", g_iBets[0]);
    } else {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "\yПожалуйста, сделайте Вашу ставку^n\wВаши деньги: \r$%d^n", get_player_money(id));
}
    
    for(new i, n = min(8, sizeof g_iBets); i < n; i++) {
    if(get_player_money(id) < g_iBets[i]) {
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%i. $%i", i + 1, g_iBets[i]);
    } else {
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%i. \w$%i", i + 1, g_iBets[i]);
    keys |= (1 << i);
}
}

    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r9. \yСвоя ставка");
    keys |= (1 << 8);
//    log_to_file("addons\amxmodx\logs\bets.txt" , "^n%i %i^n", 1, g_iBets[0]);

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0. Закрыть");
    keys |= (1 << 9);

    show_menu(id, keys, szMenu, -1, "Betmenu");
    return PLUGIN_HANDLED;
}

public BetMenu_handler(const id, iKey) {
    switch(iKey) {
    case 8: {
    client_cmd(id, "messagemode ^"my_bet^"");
    client_print(id, print_center, "Введите целое число Вашей ставки");
    return PLUGIN_HANDLED;
}
    case 9: return PLUGIN_HANDLED;
    default: {
    if(g_iBets[iKey] <= get_player_money(id)) {
    Select_Menu(id, g_iBets[iKey]);
    } else {
    Multy_Menu(id);
}
}
}

    return PLUGIN_HANDLED;
}

public Select_Menu(const id, iBet) {
    if(!is_user_connected(id)) return PLUGIN_HANDLED;

    new szMenu[MAX_MENU_LENGTH], iLen;
    new keys = MENU_KEY_0;
    g_Bet[id] = iBet;

    iLen = formatex(szMenu[iLen], charsmax(szMenu), "\yУгадайте совпадение числа^n\wВаши деньги: \r$%d \w| Ваша ставка: \r$%d^n", get_player_money(id), g_Bet[id]);
    
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r1. \wВыпадет число меньше 500 [ \yx2 \w]");
    keys |= (1 << 0);
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r2. \wВыпадет число больше 500 [ \yx2 \w]");
    keys |= (1 << 1);
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r3. Выпадет число 500 \w[ \yx10 \w]");
    keys |= (1 << 2);

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0. Отозвать ставку");
    keys |= (1 << 9);

    show_menu(id, keys, szMenu, -1, "Numbermenu");
    return PLUGIN_HANDLED;
}

public NumberMenu_handler(const id, iKey) {
    switch(iKey) {
    case 0: SelectPlayer[id] = 1;
    case 1: SelectPlayer[id] = 2;
    case 2: SelectPlayer[id] = 3;
    case 9: {
    Multy_Menu(id);
    return PLUGIN_HANDLED;
}
}

    Roll(id);
    return PLUGIN_HANDLED;
}

public Roll(const id) {
    new iRandom = random_num(1, 1000), iReward;

    if(iRandom < 500 && SelectPlayer[id] == 1) {
    iReward = g_Bet[id] * 2;
    rg_add_account(id, get_player_money(id) + iReward, AS_SET);
    client_print_color(id, print_team_red, "%s ^4Поздравляем! На этот раз Вы угадали совпадение выпавшего числа: ^3%d", prefix, iRandom);
}
    else if(iRandom == 500 && SelectPlayer[id] == 3) {
    iReward = g_Bet[id] * 10;
    rg_add_account(id, get_player_money(id) + iReward, AS_SET);
    client_print_color(id, print_team_red, "%s ^4Поздравляем! На этот раз Вы угадали совпадение выпавшего числа: ^3%d", prefix, iRandom);
}
    else if(iRandom > 500 && SelectPlayer[id] == 2) {
    iReward = g_Bet[id] * 2;
    rg_add_account(id, get_player_money(id) + iReward, AS_SET);
    client_print_color(id, print_team_red, "%s ^4Поздравляем! На этот раз Вы угадали совпадение выпавшего числа: ^3%d", prefix, iRandom);
}
    else {
    client_print_color(id, print_team_red, "%s ^3Увы, но на этот раз Вы не угадали совпадение выпавшего числа: ^4%d", prefix, iRandom);
    rg_add_account(id, get_player_money(id) - g_Bet[id], AS_SET);
}

    Multy_Menu(id);
    return PLUGIN_HANDLED;
}

public ReceivingBet(const id) {
    new szParam[9];
    read_argv(1, szParam, charsmax(szParam));

    if(!is_str_num(szParam)) {
    client_print_color(id, print_team_red, "%s ^3Необходимо ввести целое число", prefix);
    return Multy_Menu(id);
}

    new iBet = str_to_num(szParam);

    if(get_player_money(id) < iBet) {
    client_print_color(id, print_team_red, "%s ^3У Вас недостаточно денег для такой ставки", prefix);
    return Multy_Menu(id);
}

    if(iBet < g_iBets[0]) {
    client_print_color(id, print_team_red, "%s ^3Своя ставка не может быть меньше первой ставки", prefix);
    return Multy_Menu(id);
}

    Select_Menu(id, iBet);
    return PLUGIN_HANDLED;
}
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
MIRDOBRO777, привет. У тебя неправильная работа с меню. Точнее, в show_menu title должен быть абсолютно такой же, как при регистрации меню. В данном случае он чувствителен к регистру.
 
Сообщения
113
Реакции
26
Ребята, снова с менюшкой не могу разобраться. Массив вроде освоил и понимаю как обращаться к нему и нужной ячейке, но в меню не отображаются пункты. Меню Вообще обрезанное.
Подскажите, пожалуйста, в чем ошибка или пример, где есть меню старого стиля и пункты меню берутся из массива.
[ru]
MSG_NEED_PLAYERS = ^3Для открытия магазина необходимо минимум ^4%d^3 игрока
MSG_ONLY_TT = ^3Магазин доступен только команде: ^4Зайцы
MSG_ONLY_ALIVE = ^3Доступно только ^4живым ^3игрокам
MSG_ROUND_LIMIT = ^3Достигнут лимит открытия магазина в этом раунде
MSG_MAP_LIMIT = ^3Достигнут лимит открытия магазина на этой карте
MSG_TIME_WAIT = ^3Следующую покупку можно совершить через ^4%d^3 сек., осталось подождать ^4%d^3 сек.
MSG_NADE1 = ^4Вы успешно купили ^3%s^4 гранату
MSG_NADE2 = ^4Вам выдана ^3%s^4 граната, количеством: ^4%d
MSG_NADE3 = ^3А могла бы быть ^4%s^3 граната

MENU_TITLE = \r%s\y, что будем приобретать?^n\wВаши деньги: \r$%d^n\wПокупок за карту: \r%d\w/\r%d
MENU_ROLL1 = Рулетка гранат \w[ \r$%d \w]
MENU_ROLL2 = Рулетка гранат [ \y$%d \w]
MENU_EXIT = \rЗакрыть

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

#pragma semicolon 1
#define VERSION "1.0"
#define is_user_vip(%0) (get_user_flags(%0) & VIP_FLAG)
#define get_player_money(%1)    get_member(%1, m_iAccount)

/*    Настройки    */
#define VIP_FLAG (ADMIN_IMMUNITY|ADMIN_LEVEL_H)
new const prefix[] = "^1[^4NADE^1]";
new const iTime = 20;
new const iCostRoll = 80;
new const iRoundLimitPlayer = 1;
new const iRoundLimitVip = 2;
new const iMapLimitPlayer = 10;
new const iMapLimitVip = 20;
new const iMinPlayers = 0;

enum _:WEAPONS_DATA { szMenuItemName[64], iWeaponID[20], iAmmo, iCost }
new const g_ItemList[][WEAPONS_DATA] = {
    { "HE", "weapon_hegrenade", 5, 50 },
    { "Flash", "weapon_flashbang", 3, 80 },
    { "Frost", "weapon_smokegrenade", 2, 110 }
};

new g_RoundCounter[MAX_PLAYERS+1], g_MapCounter[MAX_PLAYERS+1], g_NowUsed[MAX_PLAYERS+1], g_LastTry;

public plugin_init() {
    register_plugin("Nade Shop", VERSION, "MIRDOBRO");
    register_dictionary("nade_shop.txt");

    register_clcmd("say /shop", "OpenMenu");

    RegisterHookChain(RG_CSGameRules_RestartRound, "@refwd_NewRound_Post", true);
    register_menu("NadesMenu", 1023, "NadesMenu_handler");
}

@refwd_NewRound_Post() {
    for (new i = 1; i <= MAX_PLAYERS; i++) {
    g_RoundCounter[i] = 0;
}
}

public OpenMenu(id) {
    new sysTime = get_systime();
    g_LastTry = g_NowUsed[id];
    new TimeRemaining = iTime - (sysTime - g_LastTry);
    new authid[32], name[32];
    get_user_authid(id,authid,31);
    get_user_name(id,name,31);
    new TeamName:team = any:get_member(id, m_iTeam);
    new iPlayerMoney = get_player_money(id);
    new NumLimit;
    if(!is_user_vip(id)) NumLimit = iMapLimitPlayer;
    else NumLimit = iMapLimitVip;

    if(!is_user_alive(id)) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_ONLY_ALIVE");
    log_to_file("addons\amxmodx\logs\alive.txt" , "^nНик: %s, %s^nБаланс: $%d^n", name, authid, get_player_money(id));
    return PLUGIN_HANDLED;
}

    if(team == TEAM_CT) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_ONLY_TT");
    log_to_file("addons\amxmodx\logs\team.txt" , "^nНик: %s, %s^nБаланс: $%d^n", name, authid, get_player_money(id));
    return PLUGIN_HANDLED;
}

    if(iMinPlayers > 0) {
    new iNumPlayers = get_playersnum_ex(GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV);
    new iNumSpectators = get_playersnum_ex(GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV | GetPlayers_MatchTeam, "SPECTATOR");
    new iNumUnassingned = get_playersnum_ex(GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV | GetPlayers_MatchTeam, "UNASSIGNED");

    if(iNumPlayers - (iNumSpectators + iNumUnassingned) < iMinPlayers) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_NEED_PLAYERS", iMinPlayers);
    log_to_file("addons\amxmodx\logs\online.txt" , "^nНик: %s, %s^nБаланс: $%d, Число: %d^n", name, authid, get_player_money(id), iMinPlayers);
    return PLUGIN_HANDLED;
}
}

    if(g_RoundCounter[id] == iRoundLimitPlayer && !is_user_vip(id)) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_ROUND_LIMIT");
    log_to_file("addons\amxmodx\logs\round_player.txt" , "^nНик: %s, %s^nБаланс: $%d, Лимит: %d/%d^n", name, authid, get_player_money(id), g_RoundCounter[id], iRoundLimitPlayer);
    return PLUGIN_HANDLED;
}
    else
    if(g_RoundCounter[id] == iRoundLimitVip) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_ROUND_LIMIT");
    log_to_file("addons\amxmodx\logs\round_vip.txt" , "^nНик: %s, %s^nБаланс: $%d, Лимит: %d/%d^n", name, authid, get_player_money(id), g_RoundCounter[id], iRoundLimitVip);
    return PLUGIN_HANDLED;
}

    if(g_MapCounter[id] == iMapLimitPlayer && !is_user_vip(id)) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_MAP_LIMIT");
    log_to_file("addons\amxmodx\logs\map_player.txt" , "^nНик: %s, %s^nБаланс: $%d, Лимит: %d/%d^n", name, authid, get_player_money(id), g_MapCounter[id], iMapLimitPlayer);
    return PLUGIN_HANDLED;
}
    else
    if(g_MapCounter[id] == iMapLimitVip) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_MAP_LIMIT");
    log_to_file("addons\amxmodx\logs\map_vip.txt" , "^nНик: %s, %s^nБаланс: $%d, Лимит: %d/%d^n", name, authid, get_player_money(id), g_MapCounter[id], iMapLimitVip);
    return PLUGIN_HANDLED;
}

    if(iTime > (sysTime - g_LastTry)) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_TIME_WAIT", iTime, TimeRemaining);
    log_to_file("addons\amxmodx\logs\time.txt" , "^nНик: %s, %s^nБаланс: $%d, Время: %d, Осталось: %d^n", name, authid, get_player_money(id), iTime, TimeRemaining);
    return PLUGIN_HANDLED;
    }

    SetGlobalTransTarget(id);
    new szMenu[MAX_MENU_LENGTH], iLen;
    new keys = MENU_KEY_0;

    iLen = formatex(szMenu[iLen], charsmax(szMenu), "%L^n", id, "MENU_TITLE", name, iPlayerMoney, g_MapCounter[id], NumLimit);

    for(new i = 0; i < sizeof(g_ItemList); i++) {
    if(iPlayerMoney < g_ItemList[i][iCost]) {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "^n\d%i. %s \w[ \r$%d \w]", i+1, g_ItemList[i][szMenuItemName], g_ItemList[i][iCost]);
    } else {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "^n\r%i. \w%s [ \y$%d \w]", i+1, g_ItemList[i][szMenuItemName], g_ItemList[i][iCost]);
    keys |= (1 << i);
}
}

    if(iPlayerMoney < iCostRoll) {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "^n\d9. %L", id, "MENU_ROLL1", iCostRoll);
    } else {
    iLen = formatex(szMenu[iLen], charsmax(szMenu), "^n\r9. \w%L", id, "MENU_ROLL2", iCostRoll);
    keys |= (1 << 8);
}

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0. \w%L", id, "MENU_EXIT");
    keys |= (1 << 9);

    show_menu(id, keys, szMenu, -1, "NadesMenu");
    return PLUGIN_HANDLED;
}

public NadesMenu_handler(id, iKey) {
    if(!is_user_alive(id)) return PLUGIN_HANDLED;

    switch(iKey) {
    case 8: {
    new i = random(sizeof (g_ItemList));
    RollItem(id, g_ItemList[i][szMenuItemName], g_ItemList[i][iWeaponID], g_ItemList[i][iAmmo]);
}
    case 9: return PLUGIN_HANDLED;
    default: GiveItem(id, g_ItemList[iKey][szMenuItemName], g_ItemList[iKey][iWeaponID], g_ItemList[iKey][iCost]);
}

    return PLUGIN_HANDLED;
}

GiveItem(id, szName[], iItem[], szCost) {
    new sysTime = get_systime();
    new authid[32], name[32];
    get_user_authid(id,authid,31);
    get_user_name(id,name,31);

    rg_give_item(id, iItem, GT_REPLACE);
    rg_add_account(id, get_player_money(id) - szCost, AS_SET);
    g_RoundCounter[id]++;
    g_MapCounter[id]++;
    g_NowUsed[id] = sysTime;
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_NADE1", szName);
    log_to_file("addons\amxmodx\logs\nade.txt" , "^nНик: %s, %s^nБаланс: $%d, Цена: %d, %s^n", name, authid, get_player_money(id), szCost, szName);
}

RollItem(id, szName[], szItem[], iValue) {
    new g_Ammo = random(iValue);
    new sysTime = get_systime();
    new authid[32], name[32];
    get_user_authid(id,authid,31);
    get_user_name(id,name,31);

    rg_give_item(id, szItem);
    rg_set_user_bpammo(id, rg_get_weapon_info(szItem, WI_ID), g_Ammo);
    rg_add_account(id, get_player_money(id) - iCostRoll, AS_SET);
    g_RoundCounter[id]++;
    g_MapCounter[id]++;
    g_NowUsed[id] = sysTime;
    if(g_Ammo > 0) {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_NADE2", szName, g_Ammo);
    log_to_file("addons\amxmodx\logs\nade_plus.txt" , "^nНик: %s, %s^nБаланс: $%d, Цена: %d, Число: %d, %s^n", name, authid, get_player_money(id), iCostRoll, g_Ammo, szName);
    } else {
    client_print_color(id, print_team_red, "%s %L", prefix, id, "MSG_NADE3", szName);
    log_to_file("addons\amxmodx\logs\nade_minus.txt" , "^nНик: %s, %s^nБаланс: $%d, Цена: %d, Число: %d, %s^n", name, authid, get_player_money(id), iCostRoll, g_Ammo, szName);
}
}
 

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

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