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