←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Menu w pętelce

Zablokowany

  • +
  • -
exexe - zdjęcie 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:
#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
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 28.04.2011

Co do enuma, to daj go tak
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?
Odpowiedz

  • +
  • -
exexe - zdjęcie 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:
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
Odpowiedz

  • +
  • -
Muzzi - zdjęcie Muzzi 28.04.2011

Napisz dokładnie o co CI chodzi bo nie da się Ciebie zrozumieć.
Odpowiedz

  • +
  • -
exexe - zdjęcie 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ć.
Odpowiedz

  • +
  • -
Svizz - zdjęcie Svizz 28.04.2011

A więc o jakim położeniu ty mówiłeś?
Odpowiedz

  • +
  • -
exexe - zdjęcie 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
Odpowiedz

  • +
  • -
Knopers - zdjęcie Knopers 28.04.2011

for ( new i = 0; i <= TOTAL; i++ )
Na:
for ( new i = 0; i <= TOTAL - 1; i++ )
Odpowiedz

  • +
  • -
exexe - zdjęcie exexe 28.04.2011

Zrobiłem na 2 sposoby:

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ą.
Odpowiedz

  • +
  • -
sebul - zdjęcie 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
Odpowiedz

  • +
  • -
exexe - zdjęcie exexe 29.04.2011

Kolego sebul jesteś wielki, działa tak jak chciałem, wielkie dziękuje, plusiki już poleciały :blaga: ^D^
Dostałeś też za inny post plusika, bo bardzo mi pomogłeś.

Temat do zamknięcia, dziękuje za udzieloną pomoc.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 29.04.2011

Ale jeszcze w sumie można by to napisać trochę krócej.
#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.
Odpowiedz
Zablokowany