Некорректная работа плагина из-за несовпадения аргументов

Сообщения
113
Реакции
26
приветствую, ребята!
Я не скриптер, но частенько пытаюсь из других плагинов слепить что-то нужное мне. Так и на этот раз.
Только вот в массивах я вообще не очень понимаю...
Взял часть кода из разминки на данном форуме и захотел сделать себе информер режима игры, который будет зависеть от значения квара.
Но что-то пошло не так...
В общем там, где switch, сплошное несовпадение аргументов и, соответственно, на экране выводит при любом значении квара надпись "Only knife".
Подскажите, пожалуйста, кому не сложно в чем моя ошибка .
#include <amxmodx>
#define HUD_COLOR_RGB 67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS -1.0, 0.90 // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync, g_iMode;
enum InfoModes { FREE_BUY = 0, ONLY_KNIFE, EQUIP_MENU, AUTO_EQUIP, RANDOM_WEAPON }
new const g_szModes[InfoModes][] = {
"Free Buy",
"Only Knife",
"Equip Menu",
"Auto Equip",
"Random Weapon"
}
public plugin_init() {
register_plugin("HUD Mode", VERSION, "Vaqtincha")
register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
g_pCvarMode = register_cvar("amx_mode", "0")
g_iHudSync = CreateHudSyncObj()
}
public plugin_cfg() {
new iMode = get_pcvar_num(g_pCvarMode);
switch(iMode) {
case 0: g_iMode = FREE_BUY
case 1: g_iMode = ONLY_KNIFE
case 2: g_iMode = EQUIP_MENU
case 3: g_iMode = AUTO_EQUIP
case 4: g_iMode = RANDOM_WEAPON
}
}
public client_putinserver(id) {
if(get_pcvar_num(g_pCvarMode) < 0)
return;
else
set_task(1.0, "HudInfo", TASK_STATE_ID + id, .flags = "b");
}
public HudInfo() {
set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}
public client_disconnected(id) remove_task(TASK_STATE_ID + id);
 
Сообщения
113
Реакции
26
Код нужно вставлять с помощью "Код" во вкладке "Вставить".
Не успел отредактировать. Незрячий я и сложновато ориентироваться по форуму.
Вот код плагина:
Код:
#include <amxmodx>
#define HUD_COLOR_RGB   67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS   -1.0, 0.90  // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync, g_iMode;
enum InfoModes { FREE_BUY = 0, ONLY_KNIFE, EQUIP_MENU, AUTO_EQUIP, RANDOM_WEAPON }
new const g_szModes[InfoModes][] = {
 "Free Buy",
 "Only Knife",
 "Equip Menu",
 "Auto Equip",
 "Random Weapon"
}
public plugin_init() {
 register_plugin("HUD Mode", VERSION, "Vaqtincha")
 register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
 g_pCvarMode = register_cvar("amx_mode", "0")
 g_iHudSync = CreateHudSyncObj()
}
public plugin_cfg() {
 new iMode = get_pcvar_num(g_pCvarMode);
 switch(iMode) {
 case 0: g_iMode = FREE_BUY
 case 1: g_iMode = ONLY_KNIFE
 case 2: g_iMode = EQUIP_MENU
 case 3: g_iMode = AUTO_EQUIP
 case 4: g_iMode = RANDOM_WEAPON
}
}
public client_putinserver(id) {
 if(get_pcvar_num(g_pCvarMode) < 0)
 return;
 else
 set_task(1.0, "HudInfo", TASK_STATE_ID + id, .flags = "b");
}
public HudInfo() {
 set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
 ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}
public client_disconnected(id) remove_task(TASK_STATE_ID + id);
Спасибо за подсказки, буду набираться опыта по общению на форуме.
 

ifx

Сообщения
331
Реакции
153
Помог
4 раз(а)
В теме должны быть опубликованы попытки (diff кода или последовательность действий) самостоятельного поиска решения.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
MIRDOBRO777, Путь решения: составить алгоритм работы. На данный момент ваши действия (код) непонятны и задача не ясна, поэтому ответов и советов никто не дает.
Если нужно просто убрать предупреждения, то
Diff:
- new g_iMode
+ new InfoModes:g_iMode
В остальной части понимание кода затруднительно.
на экране выводит при любом значении квара надпись "Only knife"
Наверно потому, что if(get_pcvar_num(g_pCvarMode) < 0) не будет меньше 0.
 
Сообщения
113
Реакции
26
Если нужно просто убрать предупреждения, то
Diff:
- new g_iMode
+ new InfoModes:g_iMode
Данная поправка убрала предупреждение, но плагин не работает как надо.
В остальной части понимание кода затруднительно.
Данный код я выдрал из разминки и пытался переделать для себя
Суть плагина:
- в зависимости от значения квара amx_mode "0/1/2/3/4 и так далее", на экран должно выводить определенный текст из массива g_szModes[InfoModes].
Значение квара я буду менять через активацию (exec) определенных конфигов
Наверно потому, что if(get_pcvar_num(g_pCvarMode) < 0) не будет меньше 0.
Мне необходимо отключать отображение информера по значению квара "-1", поэтому я добавил проверку на значение менее 0. По задумке плагин должен останавливать выполнение таска.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
MIRDOBRO777, В таком случае, регистрируете квар и нужный момент берете его значение if(get_pcvar_num(g_pCvarMode) < 0) . При этом, придумайте свое название квара, а не amx_mode, т.к. этот квар уже занят и отвечает за метод авторизации на сервере
C++:
// Mode of logging to a server
// 0 - disable logging, players won't be checked (and access won't be set)
// 1 - normal mode which obey flags set in accounts
// 2 - kick all players not on list
//
// Default value: 1
amx_mode 1
В любом случае, значение квара нужно брать после выполнения ваших "определенных" конфигов
 
Сообщения
113
Реакции
26
zhorzh78,
Название квара сменил, забыл, что уже занят.
Решил залогировать действия плагина.
Вот часть кода с изменениями, + квар назвал "info_mode":
Код:
public client_putinserver(id) {
 if(get_pcvar_num(g_pCvarMode) < 0)
 log_to_file("addons\amxmodx\logs\cvar.txt","^nValue: %d^n", get_pcvar_num(g_pCvarMode));
// return;
 else
 log_to_file("addons\amxmodx\logs\mode.txt","^nMode: %s^nCvar: %d^n", g_szModes[g_iMode], get_pcvar_num(g_pCvarMode));
 set_task(1.0, "HudInfo", TASK_STATE_ID + id, .flags = "b");
}
А вот логи:
L 06/23/2019 - 15:37:00: Log file started (file "cstrike\addons\amxmodx\logs\mode.txt") (game "cstrike") (amx "1.9.0.5247")
L 06/23/2019 - 15:37:00:
Mode: Free Buy
Cvar: 0
L 06/23/2019 - 15:37:13:
Mode: Free Buy
Cvar: 1
L 06/23/2019 - 15:37:29:
Mode: Free Buy
Cvar: 2
L 06/23/2019 - 15:37:54:
Mode: Free Buy
Cvar: 3
L 06/23/2019 - 15:38:06:
Mode: Free Buy
Cvar: 4
При значении "-1", создает файл "cvar.txt" с содержимым значения "-1", то есть этот момент работает как надо.
Квар считывается корректно, но отображение текста не меняется. В чем снова ошибка? Простите, я чайник в массивах, так что не пойму почему не считывает значение квара и не сопоставляет со Switch
 
Сообщения
113
Реакции
26
zhorzh78,
Я изменил момент показа информера с входа игрока на сервер на момент отлова рестарта.
Вот весь плагин:
Код:
#include <amxmodx>
#define HUD_COLOR_RGB   67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS   -1.0, 0.90  // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync;
new InfoModes:g_iMode;
enum InfoModes { FREE_BUY = 0, ONLY_KNIFE, EQUIP_MENU, AUTO_EQUIP, RANDOM_WEAPON }
new const g_szModes[InfoModes][] = {
 "Free Buy",
 "Only Knife",
 "Equip Menu",
 "Auto Equip",
 "Random Weapon"
}
public plugin_init() {
 register_plugin("HUD Mode", VERSION, "Vaqtincha")
 register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
 g_pCvarMode = register_cvar("info_mode", "0")
 register_event("TextMsg", "game_start", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
 g_iHudSync = CreateHudSyncObj()
}
public plugin_cfg() {
 new iMode = get_pcvar_num(g_pCvarMode);
 switch(iMode) {
 case 0: g_iMode = FREE_BUY
 case 1: g_iMode = ONLY_KNIFE
 case 2: g_iMode = EQUIP_MENU
 case 3: g_iMode = AUTO_EQUIP
 case 4: g_iMode = RANDOM_WEAPON
}
}
public game_start() {
 if(get_pcvar_num(g_pCvarMode) < 0)
 log_to_file("addons\amxmodx\logs\cvar.txt","^nValue: %d^n", get_pcvar_num(g_pCvarMode));
// return;
 else
 log_to_file("addons\amxmodx\logs\mode.txt","^nMode: %s^nCvar: %d^n", g_szModes[g_iMode], get_pcvar_num(g_pCvarMode));
 set_task(1.0, "HudInfo", TASK_STATE_ID, .flags = "b");
}
public HudInfo() {
 set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
 ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}
public client_disconnected(id) remove_task(TASK_STATE_ID);
А вот часть кода с текстом, который выводится в информер:
[CODE]
new const g_szModes[InfoModes][] = {
 "Free Buy",
 "Only Knife",
 "Equip Menu",
 "Auto Equip",
 "Random Weapon"
}
При любом значении квара всегда выводит первую строку
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
MIRDOBRO777,
C++:
#include <amxmodx>
#define HUD_COLOR_RGB   67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS   -1.0, 0.90  // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync;
new InfoModes:g_iMode;
enum InfoModes { FREE_BUY = 0, ONLY_KNIFE, EQUIP_MENU, AUTO_EQUIP, RANDOM_WEAPON }
new const g_szModes[InfoModes][] = {
 "Free Buy",
 "Only Knife",
 "Equip Menu",
 "Auto Equip",
 "Random Weapon"
}
public plugin_init()
{
    register_plugin("HUD Mode", VERSION, "Vaqtincha")
    register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
    g_pCvarMode = register_cvar("info_mode", "0")
    bind_pcvar_num(g_pCvarMode, g_iMode)
    register_event("TextMsg", "game_start", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
    g_iHudSync = CreateHudSyncObj()
}

public game_start()
{
    if(get_pcvar_num(g_pCvarMode) < 0)
        log_to_file("addons\amxmodx\logs\cvar.txt","^nValue: %d^n", get_pcvar_num(g_pCvarMode));
// return;
    else
    {
        log_to_file("addons\amxmodx\logs\mode.txt","^nMode: %s^nCvar: %d^n", g_szModes[g_iMode], get_pcvar_num(g_pCvarMode));
        set_task(1.0, "HudInfo", TASK_STATE_ID, .flags = "b");
    }
}

public HudInfo()
{
    set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
    ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}

public client_disconnected(id)
    remove_task(TASK_STATE_ID);
23 Июн 2019
zhorzh78, Но, если вам нужен ваш вариант, то замените plugin_cfg на OnConfigsExecuted
 
Сообщения
113
Реакции
26
bind_pcvar_num(g_pCvarMode, g_iMode)
А что значит в двух словах данная строка?
Также замена данной функции, это что?
Вот еще как защитить код отвыхода за пределы массива?
Я поймал такую ошибку, когда поставил значение квара "5"
L 06/23/2019 - 23:37:14: [AMXX] Run time error 4: index out of bounds
L 06/23/2019 - 23:37:14: [AMXX] [0] HUD_info.sma::game_start (line 35)
Извиняюсь за надоедливость, но хочу все же понять суть кода и как он работает, дабы не задавать таких вопросов в будущем.
=======
P.S. Плагин заработал как надо! Спасибо, что откликнулись!
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Сообщения
113
Реакции
26
Ребята, извиняюсь за надоедливость.
Пробовал и id игрока подставлять для вывода каждому отдельно сообщение, поставил также сброс таска когда значение квара "-1".
После сброса таска ошибки стали реже, но все равно появляются.
Что можно еще сделать для исчезновения такой ошибки?
===========
Вот лог значения квара "info_mode" с точным временем:
L 06/27/2019 - 09:51:43:
Value: -1
------
А это сама ошибка:
L 06/27/2019 - 09:51:43: [AMXX] Run time error 4: index out of bounds
L 06/27/2019 - 09:51:43: [AMXX] [0] HUD_info.sma::HudInfo (line 46)
Время совпадает точно.
===========
Вот измененный исходник:
Код:
#include <amxmodx>
#include <reapi>
#define HUD_COLOR_RGB   67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS   -1.0, 0.90  // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync;
new InfoModes:g_iMode;
enum InfoModes { WARMUP = 0, TRAINING, HNS_PRO, WEAPONS, NONE }
new const g_szModes[InfoModes][10] = {
 "Warmup",
 "Training",
 "HnS Pro",
 "Weapons",
 "None"
}
public plugin_init()
{
 register_plugin("HUD Mode", VERSION, "Vaqtincha")
 register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
 g_pCvarMode = register_cvar("info_mode", "0")
 bind_pcvar_num(g_pCvarMode, g_iMode)
 register_event("TextMsg", "game_start", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
 g_iHudSync = CreateHudSyncObj()
}
public game_start() {
 if(get_pcvar_num(g_pCvarMode) < 0) {
 log_to_file("addons\amxmodx\logs\cvar.txt","^nValue: %d^n", get_pcvar_num(g_pCvarMode));
 remove_task(TASK_STATE_ID);
 return;
 } else {
 log_to_file("addons\amxmodx\logs\mode.txt","^nMode: %s^nCvar: %d^n", g_szModes[g_iMode], get_pcvar_num(g_pCvarMode));
 set_task(1.0, "HudInfo", TASK_STATE_ID, .flags = "b");
}
}
public HudInfo() {
 set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
 ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}
public client_disconnected(id)
 remove_task(TASK_STATE_ID);
 
Сообщения
271
Реакции
348
Помог
15 раз(а)
MIRDOBRO777, ну-да, потому что элементы массива в павне начинаются с 0, поэтому ошибку бьет. В таске сделайте проверку, чтоб не било.

п.с. не читал всю тему и немного не понял смысла плагина..
 
Сообщения
59
Реакции
28
Помог
1 раз(а)
Ребята, извиняюсь за надоедливость.
Пробовал и id игрока подставлять для вывода каждому отдельно сообщение, поставил также сброс таска когда значение квара "-1".
После сброса таска ошибки стали реже, но все равно появляются.
Что можно еще сделать для исчезновения такой ошибки?
===========
Вот лог значения квара "info_mode" с точным временем:
L 06/27/2019 - 09:51:43:
Value: -1
------
А это сама ошибка:
L 06/27/2019 - 09:51:43: [AMXX] Run time error 4: index out of bounds
L 06/27/2019 - 09:51:43: [AMXX] [0] HUD_info.sma::HudInfo (line 46)
Время совпадает точно.
===========
Вот измененный исходник:
Код:
#include <amxmodx>
#include <reapi>
#define HUD_COLOR_RGB   67, 218, 231 // цвет RGB худа
#define HUD_MSG_POS   -1.0, 0.90  // Позиция HUD сообщения о разминке
#define VERSION "1.0.21"
const TASK_STATE_ID = 59737
new g_pCvarMode, g_iHudSync;
new InfoModes:g_iMode;
enum InfoModes { WARMUP = 0, TRAINING, HNS_PRO, WEAPONS, NONE }
new const g_szModes[InfoModes][10] = {
"Warmup",
"Training",
"HnS Pro",
"Weapons",
"None"
}
public plugin_init()
{
register_plugin("HUD Mode", VERSION, "Vaqtincha")
register_cvar("warmup_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
g_pCvarMode = register_cvar("info_mode", "0")
bind_pcvar_num(g_pCvarMode, g_iMode)
register_event("TextMsg", "game_start", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
g_iHudSync = CreateHudSyncObj()
}
public game_start() {
if(get_pcvar_num(g_pCvarMode) < 0) {
log_to_file("addons\amxmodx\logs\cvar.txt","^nValue: %d^n", get_pcvar_num(g_pCvarMode));
remove_task(TASK_STATE_ID);
return;
} else {
log_to_file("addons\amxmodx\logs\mode.txt","^nMode: %s^nCvar: %d^n", g_szModes[g_iMode], get_pcvar_num(g_pCvarMode));
set_task(1.0, "HudInfo", TASK_STATE_ID, .flags = "b");
}
}
public HudInfo() {
set_hudmessage(HUD_COLOR_RGB, HUD_MSG_POS, .effects = 1, .holdtime = 1.0)
ShowSyncHudMsg(0, g_iHudSync, "[ Режим: %s ]", g_szModes[g_iMode])
}
public client_disconnected(id)
remove_task(TASK_STATE_ID);
не вижу 46 строки
 

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

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