Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

ArraySetString oraz sposób na podmianę konkretnej linii w plikujak najlepiej zmienić pojedynczą linię w pliku


  • Zamknięty Temat jest zamknięty
2 odpowiedzi w tym temacie

#1 Sooldierr

    Zaawansowany

  • Użytkownik

Reputacja: 3
Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

Napisano 11.06.2015 15:52

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

  • +
  • -
  • 0

#2 Sooldierr

    Zaawansowany

  • Autor tematu
  • Użytkownik

Reputacja: 3
Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

Napisano 16.06.2015 09:29

problem rozwiazany, nieelegancko ale dziala. Temat do zamkniecia
  • +
  • -
  • 0

#3 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.06.2015 16:19

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Temat zamknięty na prośbę użytkownika.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych