Menu w pętelce
exexe
28.04.2011
Witam.
Mam takie pytanie, robię menu w pętelce z użyciem const i enum, ale nie bardzo łapie jak pobierać położenie ? Jak ktoś nie wie o co chodzi, to pisać śmiało, wytłumaczę. Jeśli by się komuś chciało, to proszę też o zoptymalizowanie tego kodu, z góry dzięki.
Napisałem coś takiego, ale nie działa, proszę o poprawę lub napisanie tego od nowa:
Za każdą pomoc stawiam plusy !
Użytkownik x123 edytował ten post 28.04.2011 17:44
Mam takie pytanie, robię menu w pętelce z użyciem const i enum, ale nie bardzo łapie jak pobierać położenie ? Jak ktoś nie wie o co chodzi, to pisać śmiało, wytłumaczę. Jeśli by się komuś chciało, to proszę też o zoptymalizowanie tego kodu, z góry dzięki.
Napisałem coś takiego, ale nie działa, proszę o poprawę lub napisanie tego od nowa:
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
enum
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY,
TOTAL
};
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64], numer[6];
for ( new i = 0; i <= TOTAL; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja, numer[i]);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu, 0);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
new key = str_to_num(data);
set_user_health(id, g_type_prices[key]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Za każdą pomoc stawiam plusy !
Użytkownik x123 edytował ten post 28.04.2011 17:44
sebul
28.04.2011
Co do enuma, to daj go tak
i używaj "enumTOTAL", a co do Twojego pytania, to nie bardzo rozumiem... O jakie położenie chodzi?
enum _:enumTOTAL
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY
};
i używaj "enumTOTAL", a co do Twojego pytania, to nie bardzo rozumiem... O jakie położenie chodzi?
exexe
28.04.2011
W BM (plugin) enum jest napisany tak jak mówię i jakoś działa.
Co do położenia, chodziło mi o to:
Zrobiłem tak:
Są błędy:
Linie 44-48:
Co jest źle ?
Użytkownik x123 edytował ten post 28.04.2011 17:37
Co do położenia, chodziło mi o to:
new key = str_to_num(data); set_user_health(id, g_type_prices[key]);Nie jestem pewny czy to działa i czy dobrze to robię.
Zrobiłem tak:
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
enum _:TOTAL
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY
};
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64], numer[6];
for ( new i = 0; i <= TOTAL; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja, numer[i]);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu, 0);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
new key = str_to_num(data);
set_user_health(id, g_type_prices[key]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Są błędy:
L 04/28/2011 - 18:30:06: [AMXX] Displaying debug trace (plugin "test.amxx") L 04/28/2011 - 18:30:06: [AMXX] Run time error 4: index out of bounds L 04/28/2011 - 18:30:06: [AMXX] [0] test.sma::menus (line 46)
Linie 44-48:
for ( new i = 0; i <= TOTAL; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja, numer[i]);
}
Co jest źle ?
Użytkownik x123 edytował ten post 28.04.2011 17:37
exexe
28.04.2011
Chcę menu w pętelce, nabazgrałem coś, ale nie działa.
Co chcę: wpisuje /menu, otwiera się menu, gdy nacisnę 2 przycisk, hp ustawia się na 130, tak jak w pluginie.
Niezrozumiale, wiem, ale nie potrafię tego dokładnie opisać.
Co chcę: wpisuje /menu, otwiera się menu, gdy nacisnę 2 przycisk, hp ustawia się na 130, tak jak w pluginie.
Niezrozumiale, wiem, ale nie potrafię tego dokładnie opisać.
exexe
28.04.2011
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
2 pozycja to 130, gdy w menu wybierzesz 2 przycisk to dostaniesz 130 hp, już rozumiecie ?
To jest to "położenie".
Użytkownik x123 edytował ten post 28.04.2011 17:58
Knopers
28.04.2011
for ( new i = 0; i <= TOTAL; i++ )Na:
for ( new i = 0; i <= TOTAL - 1; i++ )
exexe
28.04.2011
Zrobiłem na 2 sposoby:
1.
2.
W obu przypadkach jest tak samo, daje tylko 115 hp, pozostałe funkcje nie reagują.
1.
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
enum _:TOTAL
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY
};
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64], numer[6];
for ( new i = 0; i <= TOTAL - 1; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja, numer[i]);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu, 0);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
new key = str_to_num(data);
set_user_health(id, g_type_prices[key]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
2.
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
enum
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY,
TOTAL
};
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64], numer[6];
for ( new i = 0; i <= TOTAL - 1; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja, numer[i]);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu, 0);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new data[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
new key = str_to_num(data);
set_user_health(id, g_type_prices[key]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
W obu przypadkach jest tak samo, daje tylko 115 hp, pozostałe funkcje nie reagują.
sebul
28.04.2011
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
enum _:TOTAL
{
PIERWSZY,
DRUGI,
TRZECI,
CZWARTY
};
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64];
for ( new i = 0; i < TOTAL; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
set_user_health(id, g_type_prices[item]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Tak powinno chyba śmigać, tylko dodałbym jeszcze warunek, żeby sprawdzało, czy gracz żyje, bo tak nie wiem czy nie będzie czasami sypało errorów.
Użytkownik sebul edytował ten post 28.04.2011 23:01
exexe
29.04.2011
Kolego sebul jesteś wielki, działa tak jak chciałem, wielkie dziękuje, plusiki już poleciały
Dostałeś też za inny post plusika, bo bardzo mi pomogłeś.
Temat do zamknięcia, dziękuje za udzieloną pomoc.
Dostałeś też za inny post plusika, bo bardzo mi pomogłeś.
Temat do zamknięcia, dziękuje za udzieloną pomoc.
sebul
29.04.2011
Ale jeszcze w sumie można by to napisać trochę krócej.
Czyli ten enum raczej był zbędny tutaj.
#include <amxmodx>
#include <fun>
#define PLUGIN "Test"
#define VERSION "0.1"
#define AUTHOR "x123"
#define TOTAL 4
new const g_type_names[TOTAL][] =
{
"115",
"130",
"170",
"200"
};
new g_type_prices[TOTAL] =
{
115,
130,
170,
200
};
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu", "menus");
}
public menus(id)
{
new menu = menu_create("Testowo", "menus_handler");
new opcja[64];
for ( new i = 0; i < TOTAL; i++ )
{
formatex(opcja, 63, "%s", g_type_names[i]);
menu_additem(menu, opcja);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
menu_display(id, menu);
}
public menus_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
if(is_user_alive(id)) set_user_health(id, g_type_prices[item]);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
Czyli ten enum raczej był zbędny tutaj.