Вопросы по AMXX

Сообщения
61
Реакции
3
Все привет. Есть несколько вопросов. Буду очень рад ответам от профи.
1) Хочу сделать квары, чтобы удобно изменять настройки, не изменяя исходник.
Я правильно понимаю, что есть 1 путь:
Например у меня есть цены на скорость, гравитацию и т.д.
C++:
s_cost = register_cvar("speed_cost", "6000")
get_pcvar_num(s_cost)
Дело в том, что мне не нравится длинная запись get_pcvar_num(s_cost)
А например #define s_cost 6000 как я понимаю служит для удобства только внутри исходника, а вне исходника прописав s_cost "N" например в server_cvars ничего меняться не будет ?

2) Как мне правильно взаимодействовать с Ham_CS_Player_ResetMaxSpeed и CurWeapon, чтобы скорость игрока не сбрасывалась при смене оружия.
Не могу найти примеров, чтобы понять как это работает. Если не трудно, напишите простой код, чтобы по команде появлялась скорость, которая не будет сбрасываться при смене оружия.

3) Взаимодействие со звуками
С помощью чего можно воспроизвести звук клиенту, например после захода на сервер воспроизвести "Hi"
Как реагировать на событие нажатие клавиши в меню, чтобы воспроизводился звук
Как вообще воспроизвести звук

Если можно, буду задавать новые вопросы в этой теме ниже.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
а вне исходника прописав s_cost "N"
s_cost - название переменной. Прописав её где либо ничего не изменится. Пришлось бы прописать speed_cost "значение". Если нужно менять квары на лету (без смены карты и прочего и максимально адекватно) нужно использовать функционал AMXX 1.8.3: create_cvar (можно и register_cvar однако create_cvar функциональнее) и bind_pcvar_*/hook_cvar_change.

Как мне правильно взаимодействовать с Ham_CS_Player_ResetMaxSpeed
return HAM_SUPERCEDE; -> блокировка обновления скорости.


С помощью чего можно воспроизвести звук клиенту, например после захода на сервер воспроизвести "Hi"
Как вообще воспроизвести звук
Можно использовать ReAPI функцию rg_send_audio или client_cmd (блочится протекторами).

Как реагировать на событие нажатие клавиши в меню, чтобы воспроизводился звук
Хукается меню и в хенлдлере в зависимости от выбранного пункта выполнять код.
 
Сообщения
61
Реакции
3
w0w, попробовал, все ровно скорость при смене оружия сбрасывается
C++:
#include <amxmisc>
#include <fun>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta_util>

#define PLUGIN  "Menu"
#define VERSION "1.01"
#define AUTHOR  "amax"

#define KEYS (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<9)
#define MAX_PLAYERS 32

new bool:g_speed[MAX_PLAYERS+1] = false;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);

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

register_menucmd(register_menuid("func_ServerShop"), KEYS, "func_ShopHandler");

RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "checkspeed", 0);
}


public func_ServerShop(id)
{
if(get_user_team(id) == 3)
{
client_print_color(id, print_team_default, "^4[Магазин] ^3Чтобы использовать шоп, войди в игру!");
return PLUGIN_HANDLED;
}

static szMenu[MAX_MENU_LENGTH], iLen;
new my_money = cs_get_user_money(id)

if(get_user_flags(id) & ADMIN_LEVEL_A) {
iLen = formatex(szMenu[iLen], charsmax(szMenu), "\wМагазин \r[\wСкидка: \yЕсть\r]^n^n");
} else {
iLen = formatex(szMenu[iLen], charsmax(szMenu), "\wМагазин \r[\wСкидка: \dНету\r]^n^n");
}
if(get_user_flags(id) & ADMIN_LEVEL_A) {
if(my_money < 8000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[1] » Купить скорость \r[$8000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[1] » \wКупить скорость \r[\y$8000\r]^n");
}
} else {
if(my_money < 10000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[1] » Купить скорость \r[$10000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[1] » \wКупить скорость \r[\y$10000\r]^n");
}
}
if(get_user_flags(id) & ADMIN_LEVEL_A) {
if(my_money < 6000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[2] » Купить гравитацию \r[$6000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[2] » \wКупить гравитацию \r[\y$6000\r]^n");
}
} else {
if(my_money < 8000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[2] » Купить гравитацию\r[$8000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[2] » \wКупить гравитация \r[\y$8000\r]^n");
}
}
if(get_user_flags(id) & ADMIN_LEVEL_A) {
if(my_money < 3000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[3] » Купить 255 HP и 255 AR \r[$3000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[3] » \wКупить 255 HP и 255 AR  \r[\y$3000\r]^n");
}
} else {
if(my_money < 4000) {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[3] » Купить 255 HP и 255 AR \r[$4000]^n");
} else {
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[3] » \wКупить 255 HP и 255 AR  \r[\y$4000\r]^n");
}
}
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[0] x \wВыйти^n^n\dvk.com/csdmbymax");

show_menu(id, KEYS, szMenu, -1, "func_ServerShop");
return PLUGIN_HANDLED;
}

public func_ShopHandler(id, iKeys)
{
new my_money = cs_get_user_money(id)
switch(iKeys)
{
case 0:if(get_user_flags(id) & ADMIN_LEVEL_A) {
    if(my_money < 8000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 8000);
        g_speed[id] = !g_speed[id];
        set_pev(id, pev_maxspeed, 1800.0);
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил большую скорость!");
    }
} else { 
    if(my_money < 10000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 10000)
        g_speed[id] = !g_speed[id];
        set_pev(id, pev_maxspeed, 1800.0);
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил большую скорость!")
    }
}
case 1:if(get_user_flags(id) & ADMIN_LEVEL_A) {
    if(my_money < 6000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 6000)
        set_user_gravity(id, 0.4)
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил гравитацию!")
    }
} else { 
    if(my_money < 8000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 8000)
        set_user_gravity(id, 0.4)
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил гравитацию!")
    }
}
case 2:if(get_user_flags(id) & ADMIN_LEVEL_A) {
    if(my_money < 3000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 3000)
        set_user_health(id, 255)
        set_user_armor(id, 255)
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил жизни и броню!")
    }
} else { 
    if(my_money < 8000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 4000)
        set_user_health(id, 255)
        set_user_armor(id, 255)
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил жизни и броню!")
    }
}
}
return PLUGIN_HANDLED
}

public Check_speed(id){

       

        if(g_speed[id])

                return HAM_SUPERCEDE;

               

        return HAM_IGNORED;

}

Можно ещё через событие curweapon попробовать...
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
amax, почему там g_speed[id] = !g_speed[id];? Если покупка идёт 1 раз то надо только g_speed[id] = true;. Нужно проверить что g_speed[id] вообще true а не false.

P.S. Нужно табуляцию использовать, ужасное форматирование кода.
1 Дек 2018
Не похоже что используется AMXX 1.8.3, если так и есть и не используется то не понятно как плагин тогда вообще компилится.
Код:
#if AMXX_VERSION_NUM < 183
    new Ham:Ham_CS_Player_ResetMaxSpeed = Ham_Item_PreFrame;
#endif
 
Сообщения
61
Реакции
3
w0w, Используется 1.9.0
Как сделать проверку для g_speed
 
Сообщения
61
Реакции
3
w0w, получилось через
Код:
register_event("CurWeapon","switchweapon","be") 

public switchweapon(id) 
{  
  if(g_speed[id])
  fm_set_user_maxspeed(id,1800.0)  
  return PLUGIN_CONTINUE  
}
Вопрос. Как отловить смерть игрока, чтобы выключить g_speed[id] == false;
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Сообщения
61
Реакции
3
Это костыль и очень плохой код (не к месту).[BGCOLOR=transparent][/BGCOLOR]
[BGCOLOR=transparent][/BGCOLOR]
Ну так, а что поделать, если через Ham никак не получается, я уже как только не пробовал, в интернете примеры разные брал - нифига.
В исходниках шопа только CurWeapon и вижу.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Ну так, а что поделать, если через Ham никак не получается, я уже как только не пробовал, в интернете примеры разные брал - нифига.
В исходниках шопа только CurWeapon и вижу.
Искать проблему, проверять почему не работает, как я уже и сказал может true вообще не выставляется игроку.
 
Сообщения
1,177
Реакции
2,144
Помог
57 раз(а)
Pre заменить на Post и выставлять скорость там
 
Сообщения
61
Реакции
3
BlackSignature, можно по подробнее о чем вы?

Ещё 2 вопроса.
1) Как логика работает с g_speed и т.д.
У меня это булевая переменная, которая принимает значения false - true
Но она со скоростью никак не связана вообще, почему тогда её сервер "слушается" и если true скорость работает, а при false нет?
Код:
new bool:g_speed[MAX_PLAYERS+1] = false;
new bool:g_grav[MAX_PLAYERS+1] = false;

RegisterHam(Ham_Spawn, "player", "Spawn_player", 1)
register_event("CurWeapon","switchweapon","be")
}

public Spawn_player(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
g_speed[id] = false // Как сервер понимает, что я хочу отрубить именно скорость
g_grav[id] = false
}
}

public switchweapon(id)
{ 
  if(g_speed[id]) // Как сервер понимает, что тут должно быть true для приминения скорости
  fm_set_user_maxspeed(id,1800.0) 
  return PLUGIN_CONTINUE 
}

case 0:if(get_user_flags(id) & ADMIN_LEVEL_A) {
    if(my_money < 8000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 8000)
        fm_set_user_maxspeed(id,1800.0)
        g_speed[id] = true
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил большую скорость!")

case 1:if(get_user_flags(id) & ADMIN_LEVEL_A) {
    if(my_money < 6000) {
        client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
        return PLUGIN_CONTINUE;
    } else {
        cs_set_user_money(id, my_money - 6000)
        set_user_gravity(id, 0.4)
        g_grav[id] = true
        client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил гравитацию!")
2) Взаимодействуют ли квары разных плагинов между собой?
Например в меню добавить квар из плагина с ценой оружия
 
Сообщения
1,177
Реакции
2,144
Помог
57 раз(а)
amax,
1) Перед использованием инструментов (нативы, форварды) научитесь ими пользоваться. Как минимум, когда применяете какой-то инструмент, зайдите для начала в индлюд(inc-файл) где объявляется этот инструмент, и прочитайте его описание. Если остаются вопросы, - гуглите по названию инструмента, ищите примеры(плагины), смотрите как это реализовано там. Вот например:
/**
* Returns if the client is alive.
*
* @note This will never return true if a client is not connected. If you need
* to know whether a client is alive, an additional call to
* is_user_connected() is unnecessary.

*
* @param index Client index
*
* @return 1 if client is alive, 0 otherwise
*/
native is_user_alive(index);
А у вас
Код:
if(is_user_alive(id) && is_user_connected(id))
Различие между Pre/Post, чтобы вы понимали:
1) Pre - до непосдрественного события. Т.е. вам говорят "я собираюсь сделать что-то вот с такими-то параметрами. Что ты хочешь с этим сделать?". И тут вы можете либо изменить параметры, либо вообще заблокировать событие (оно не произойдёт).
2) Post - после события. Т.е. "Я сделал вот это, с этими параметрами. Будь в курсе." Тут вы можете получить результат события, и опять же, параметры(аргументы). И на основе этого что-то сделать.

Т.е. в примере Ham_CS_Player_ResetMaxSpeed, вы можете либо заблокировать сброс скрости (Pre), либо переустановить нестандартную скорость после того как движок сбросит её (Post). Я предложил вам попробовать post предполагая, что что-то может конфиктовать с pre-вариантом (такое бывает). Но тут нужно быть уверенным, что проблема не в установке переменной, по которой работает логика в хуке Ham_CS_Player_ResetMaxSpeed (т.е. что переменная имеет на этот момент значение true).

Ваш вариант с curweapon плох тем, что вызывается "вхолостую". Это способ решения, но он не совсем правильный.

Взаимодействуют ли квары разных плагинов между собой?
Да. Зарегав квар в одном плагине, можно получить его значение в другом. Изучайте scripting/include/cvars.inc

Но она со скоростью никак не связана вообще
Что значит не связана? А что она по вашему делает? Вы создали массив переменных, которые могут принимать значение false/true. На основе этого значения и работает логика. Допустим, отталкиваясь от текущего значения переменной, можно в меню покупки изменять цвет пункта, не позволять нажимать на этот пункт, или же при нажатии заставлять плагин вести себя иначе(не позволять покупать, если уже есть). То же самое и в хуке сброса скорости игрока. Можно отреагировать, совершить какие-то действия, а можно и проигнорировать - всё зависит от значения. Это и есть "связано".
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
Если нужно менять квары на лету (без смены карты и прочего и максимально адекватно) нужно использовать функционал AMXX 1.8.3: create_cvar (можно и register_cvar однако create_cvar функциональнее) и bind_pcvar_*/hook_cvar_change.
Не поясните ваше видение этого? Создается впечатление, что эти две новые функции- самое верное решение в работе с кварами. Только, решение чего, я так и не пойму. Вопрос навеян очередной любовью к "новому" в обновлении вашего плагина:
C++:
pCvar = create_cvar("ur_console_cmd", "1", FCVAR_NONE, "1 - it's enabled the console command to revive a player/team/everyone; 0 - disabled");
new iConsoleCmd = get_pcvar_num(pCvar);

pCvar = create_cvar("ur_console_cmd_name", "amx_revive", FCVAR_NONE, "Console command to revive players");
get_pcvar_string(pCvar, g_vCvar[CVAR_CONSOLE_CMD_NAME], charsmax(g_vCvar[CVAR_CONSOLE_CMD_NAME]));
Вам не показалось, что до выполнения конфига вы получите дефолтные значения кваров, т.к. получаете их сразу после регистрации?
И create_cvar тут ничем не поможет. Еще вопрос связан с тем, что при т.н. отказе от поддержки АМХ 182 в плагинах, по сути, появляются только эти функции, введение которых мало сказывается на расширении функционала, ну и еще парочка, у которых есть аналоги на низших версиях :dntknw:. При этом не всегда внедряются действительно новые и полезные функции.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Не поясните ваше видение этого? Создается впечатление, что эти две новые функции- самое верное решение в работе с кварами. Только, решение чего, я так и не пойму. Вопрос навеян очередной любовью к "новому" в обновлении вашего плагина:
А какие ещё варианты могут быть? Постоянно использовать get_pcvar_*? Получать значение при старте раунда/в любой другой момент? Зачем если есть эти удобные функции?

Вам не показалось, что до выполнения конфига вы получите дефолтные значения кваров, т.к. получаете их сразу после регистрации?
Стоило об этом написать именно в топике плагина, а так спасибо конечно за замечание, исправлю в след. обновлении.

Еще вопрос связан с тем, что при т.н. отказе от поддержки АМХ 182 в плагинах, по сути, появляются только эти функции, введение которых мало сказывается на расширении функционала, ну и еще парочка, у которых есть аналоги на низших версиях :dntknw:. При этом не всегда внедряются действительно новые и полезные функции.
В чём собственно тут проблема? То что не поддерживается AMXX 1.8.2 потому что используются эти функции? Я не вижу смысла в поддержке AMXX 1.8.2 который старый и ненужный по моему мнению, кто захочет обновится на более адекватную версию.
 
Сообщения
61
Реакции
3
BlackSignature, Pre/Post помогло, но почему то скорость теперь не сбрасывается после смерти и реконнекте.
Хотя гравитация сбрасывается. Игрался с Pre Post и return HAM_HANDLED не помогло, что я сделал не так?
Код:
#include <amxmisc>
#include <fun>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta_util>

#define PLUGIN  "Menu"
#define VERSION "1.01"
#define AUTHOR  "amax"

#define KEYS (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<9)
#define MAX_PLAYERS 32

new bool:g_speed[MAX_PLAYERS+1],g_grav[MAX_PLAYERS+1],g_invis[MAX_PLAYERS+1]

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
   
    register_clcmd("say /shop", "func_ServerShop");
    register_clcmd("shop", "func_ServerShop");
   
    register_menucmd(register_menuid("func_ServerShop"), KEYS, "func_ShopHandler");
    RegisterHam(Ham_Spawn, "player", "Spawn_player", 0);
    RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "checkspeed", 1);
}

public Spawn_player(id)
{
    if(is_user_alive(id) && is_user_connected(id))
    {
        g_speed[id] = false
        g_grav[id] = false
        g_invis[id] = false
    }
}

public checkspeed(id)
{
    if(g_speed[id])
    {
        return HAM_SUPERCEDE
    }
    return HAM_HANDLED
}

public func_ServerShop(id)
{
    if(get_user_team(id) == 3)
    {
        client_print_color(id, print_team_default, "^4[Магазин] ^3Чтобы использовать шоп, войди в игру!");
        return PLUGIN_HANDLED;
    }
   
    static szMenu[MAX_MENU_LENGTH], iLen;
    new my_money = cs_get_user_money(id)
   
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        iLen = formatex(szMenu[iLen], charsmax(szMenu), "\wМагазин \r[\yСкидка: \yЕсть\r]^n^n");
        } else {
        iLen = formatex(szMenu[iLen], charsmax(szMenu), "\wМагазин \r[\dСкидка: \dНету\r]^n^n");
    }
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        if(my_money < 8000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[1] » Купить скорость \r[$8000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[1] » \wКупить скорость \r[\y$8000\r]^n");
        }
        } else {
        if(my_money < 10000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[1] » Купить скорость \r[$10000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[1] » \wКупить скорость \r[\y$10000\r]^n");
        }
    }
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        if(my_money < 6000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[2] » Купить гравитацию \r[$6000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[2] » \wКупить гравитацию \r[\y$6000\r]^n");
        }
        } else {
        if(my_money < 8000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[2] » Купить гравитацию\r[$8000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[2] » \wКупить гравитация \r[\y$8000\r]^n");
        }
    }
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        if(my_money < 3000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[3] » Купить 255 HP и 255 AR \r[$3000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[3] » \wКупить 255 HP и 255 AR  \r[\y$3000\r]^n");
        }
        } else {
        if(my_money < 4000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[3] » Купить 255 HP и 255 AR \r[$4000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[3] » \wКупить 255 HP и 255 AR  \r[\y$4000\r]^n");
        }
    }
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        if(my_money < 3000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[4] » Купить невидимость \r[$13000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[4] » \wКупить невидимость  \r[\y$13000\r]^n");
        }
        } else {
        if(my_money < 4000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[4] » Купить невидимость \r[$16000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[4] » \wКупить невидимость  \r[\y$16000\r]^n");
        }
    }
    if(get_user_flags(id) & ADMIN_LEVEL_A) {
        if(my_money < 3000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[5] » Купить все гранаты \r[$3000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[5] » \wКупить все гранаты \r[\y$3000\r]^n");
        }
        } else {
        if(my_money < 2000) {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[5] » Купить все гранаты \r[$2000]^n");
            } else {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[5] » \wКупить все гранаты  \r[\y$2000\r]^n");
        }
    }
    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[0] x \wВыйти^n^n\dvk.com/csdmbymax");
   
    show_menu(id, KEYS, szMenu, -1, "func_ServerShop");
    return PLUGIN_HANDLED;
}

public func_ShopHandler(id, iKeys)
{
    new my_money = cs_get_user_money(id)
    switch(iKeys)
    {
        case 0:if(get_user_flags(id) & ADMIN_LEVEL_A) {
            if(my_money < 8000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 8000)
                fm_set_user_maxspeed(id,1800.0)
                g_speed[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил большую скорость!")
            }
            } else {
            if(my_money < 10000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 10000)
                fm_set_user_maxspeed(id,1800.0)
                g_speed[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил большую скорость!")
            }
        }
        case 1:if(get_user_flags(id) & ADMIN_LEVEL_A) {
            if(my_money < 6000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 6000)
                set_user_gravity(id, 0.4)
                g_grav[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил гравитацию!")
            }
            } else {
            if(my_money < 8000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 8000)
                set_user_gravity(id, 0.4)
                g_grav[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил гравитацию!")
            }
        }
        case 2:if(get_user_flags(id) & ADMIN_LEVEL_A) {
            if(my_money < 3000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 3000)
                set_user_health(id, 255)
                set_user_armor(id, 255)
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил жизни и броню!")
            }
            } else {
            if(my_money < 4000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 4000)
                set_user_health(id, 255)
                set_user_armor(id, 255)
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил жизни и броню!")
            }
        }
        case 3:if(get_user_flags(id) & ADMIN_LEVEL_A) {
            if(my_money < 13000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 13000)
                set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderTransAlpha,20)
                g_invis[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил невидимость!")
            }
            } else {
            if(my_money < 16000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 16000)
                set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderTransAlpha,20)
                g_invis[id] = true
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил невидимость!")
            }
        }
        case 4:if(get_user_flags(id) & ADMIN_LEVEL_A) {
            if(my_money < 2000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!")
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 2000)
                give_item(id,"weapon_hegrenade")
                give_item(id,"weapon_flashbang")
                give_item(id,"weapon_smokegrenade")
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил все гранаты!")
            }
            } else {
            if(my_money < 3000) {
                client_print_color(id, print_team_default, "^4[Магазин] ^3У тебя не хватает денег!");
                return PLUGIN_CONTINUE;
                } else {
                cs_set_user_money(id, my_money - 3000)
                give_item(id,"weapon_hegrenade")
                give_item(id,"weapon_flashbang")
                give_item(id,"weapon_smokegrenade")
                client_print_color(id, print_team_default, "^4[Магазин] ^3Ты купил все гранаты!")
            }
        }
    }
    return PLUGIN_HANDLED
}
 
Последнее редактирование:
Сообщения
1,177
Реакции
2,144
Помог
57 раз(а)
amax,
скорость теперь не сбрасывается после смерти и реконнекте
Потому что хук вызывается так же и в этих ситуациях, и если переменная = true, то идёт блокировка.
Правильная схема:
1) При покупке скорости выставить переменную в true, установить кастомную скорость
2) Не давать покупать скорость, если она уже куплена (если переменная уже = true)
3) Не препятствовать сбросу скорости, если игрок мёртв
4) Сбрасывать переменную при смерти игрока / Сбрасывать переменную при выходе игрока с сервера
 
Сообщения
61
Реакции
3
BlackSignature, 1) У меня итак g_speed[id] = true при покупке.
Зачем устанавливать кастомную скорость (я так понимаю стандартную) если мне нужна быстрая скорость?
2) Это пока не относится к проблеме.
3) Как это сделать?
4) Уже сделано

C++:
public Spawn_player(id)
{
    if(is_user_alive(id) && is_user_connected(id))
    {
        g_speed[id] = false
        g_grav[id] = false
        g_invis[id] = false
    }
}
 
Сообщения
2,721
Реакции
2,997
Помог
60 раз(а)
Есть несколько вопросов. Буду очень рад ответам от профи.
Первым делом ты даешь код — позже уже разбор полетов.
По другому никак, мы гадать не умеем и не будем.
 

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

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