Witam.
Od jakiegoś czasu pracuję nad pluginem Menu Komunikatów Admina.
Oprócz wyświetlania menu komunikatów stworzyłem także 3 inne funkcje:
- Dodawanie komunikatu
- Usuwanie komunikatu
- Edytowanie komunikatu
I tutaj mam problem, jeśli chodzi o te funkcje.
Plugin oparty jest o tablice dynamiczne. Pobiera z pliku komunikaty oraz odpowiadające im tytuły.
I jak na przykład chcę wyedytować komunikat to niestety mam z tym problem, nie wiem czemu nie działa to prawidłowo.
Admin wybiera z menu komunikatów który chce wyedytować, następnie pojawia się messagemode taki jak przy podawaniu własnego powodu bana.
Potem właśnie używam ArraySetString do wstawienia w miejsce starego komunikatu nowy. Czy ta funkcja działa może inaczej?
Miejsce wstawienia w Array to ID wybranego itemu (komunikatu) z menu.
Poniżej funkcja zczytująca nową treść komunikatu z messagemode:
public editing_statement(id, item) {
new statement_buff[128];
read_args(statement_buff, 127);
remove_quotes(statement_buff);
ArraySetString(statements, item, statement_buff);
client_print(id, print_console, "||| %s |||", statement_buff);
delete_file("addons/amxmodx/configs/statements.ini");
//write_file("addons/amxmodx/configs/statements.ini", s, item);
new FILE = fopen("addons/amxmodx/configs/statements.ini", "wt");
new buff_statement[128], buff_title[32];
for( new i = 0; i < size; i++)
{
ArrayGetString(titles, i, buff_title, 31);
ArrayGetString(statements, i, buff_statement, 127);
fprintf(FILE, "%s|%s", buff_title, buff_statement);
}
Toggle = 0;
ArrayDestroy(statements);
ArrayDestroy(titles);
fclose(FILE);
return PLUGIN_CONTINUE;
}
statements - dynamiczna tablica komunikatów
titles - dynamiczna tablica tytułów komunikatów
w client_print sprawdzam, czy komunikat został poprawnie zapisany i tak właśnie jest.
Jednak nie wiem czy funkcja ArraySetString działa tak jak myślę.
Czy ona nadpisuje element (stringa) w miejscu podanym parametrem (tutaj item)? Czy jakoś go modyfikuje, dopisuje coś?
W pliku to wygląda tak potem tak:
Polowanie|1 ZM na mapie - PolowanieZabawa przelacznikami|Zabawa przelacznikami/pulapkami na mapie = slay/kick/ban! Popychanie ZM|Popychamy innego zombie prawym przyciskiem myszy (w plecy) Zapraszanie znajomych|Zapraszaj znajomych na serwer - wiecej graczy to lepsza zabawa :) Forum Turek-City|Turek-City.pl - forum serwera Zombie Infection. Zapraszamy do dyskusji :) Propozycje, sugestie graczy|Chcesz zaproponowac zmiany, podzielic sie pomyslem lub zaproponowac mape? Zapraszamy na forum serwera :)
1 ZM na mapie - Polowanie - to jest wstawiony zedytowany komunikat
Zabawa przelacznikami - to jest tytuł następnego komunikatu
Jak widać po edycji się te 2 fragmenty skleiły, a powinno być tak:
Polowanie|1 ZM na mapie - Polowanie Zabawa przelacznikami|Zabawa przelacznikami/pulapkami na mapie = slay/kick/ban! Popychanie ZM|Popychamy innego zombie prawym przyciskiem myszy (w plecy) Zapraszanie znajomych|Zapraszaj znajomych na serwer - wiecej graczy to lepsza zabawa :) Forum Turek-City|Turek-City.pl - forum serwera Zombie Infection. Zapraszamy do dyskusji :) Propozycje, sugestie graczy|Chcesz zaproponowac zmiany, podzielic sie pomyslem lub zaproponowac mape? Zapraszamy na forum serwera :)
Próbowałem także zamienić fprintf na write_file , to po dokonaniu edycji powstawały puste linie pomiędzy komunikatami.
Tutaj funkcja wywołująca się po wyborze itemu z menu:
public Menu_Handler(id, menu, item)
{
if(Toggle == 0)
{
show_statement(item);
}
else if(Toggle == -1)
{
ArrayDeleteItem(Array:statements, item);
ArrayDeleteItem(Array:titles, item);
delete_file("addons/amxmodx/configs/statements.ini");
new FILE = fopen("addons/amxmodx/configs/statements.ini", "wt");
new buff_statement[128], buff_title[32];
for( new i = 0; i < size; i++)
{
ArrayGetString(Array:titles, i, buff_title, 31);
ArrayGetString(Array:statements, i, buff_statement, 127);
fprintf(FILE, "%s|%s", buff_title, buff_statement);
}
ArrayDestroy(Array:statements);
ArrayDestroy(Array:titles);
Toggle = 0;
fclose(FILE);
}
else if(Toggle == 1)
{
client_cmd(id, "messagemode amx_editingstatement");
}
return PLUGIN_HANDLED;
Obsługuje ona jednocześnie wyświetlanie komunikatów, usuwanie komunikatów oraz edycję komunikatów.
Odpowiednie komendy zmieniają wartość przełącznika, od którego uzależnione jest działanie tej funkcji.
A poniżej cały plugin
Załączone pliki
Użytkownik Sooldierr edytował ten post 11.06.2015 15:53


Dodatki SourceMod



Temat jest zamknięty
Admin_Statements.amxx









