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
 

Gargamel - zdjęcie

Gargamel

Rejestracja: 17.01.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 14.06.2014 20:53
-----

#643381 Problem z timerem

Napisane przez VertekS w 14.06.2014 16:41

Więc tak...

To co napisze poniżej piszesz w public kickmenu(id).

Tworzysz 31 elementową tablicę na nick gracza (31 elementów = 31 znaków):

new voteplayer[31];

Następnie pobierasz nick gracza, który wpisał komendę:

get_user_name(id, voteplayer, sizeof(voteplayer));

Natyw register_clcmd przekazuje ID gracza jako parametr, więc warto to wykorzystać. Parametry funkcji zobacz w dokumentacji. Operator sizeof sprawdza wielkość łańcucha znaków (i nie tylko jego), co można w tym wypadku użyć do poinformowania get_user_name, ile liter nicku gracza ma pobrać. Warto pamiętać, że nick gracza w CS może mieć maksymalnie 31 liter. 

Następnie przejdź do linii:

client_print(i, print_chat, "Gracz %id% rozpoczal glosowanie o wyrzucenie botow z serwera.");

...która była powodem błędów. ID gracza w CS jest traktowane jak zwykła liczba całkowita. Trzeba tylko pamiętać, że to musi być liczba z zakresu 1 - 32.

W celu wyświetlenia, kto zaczął głosowanie wykorzystaj wcześniej przygotowaną zmienną na nick. Poprawny zapis wygląda tak:

client_print(i, print_chat, "Gracz %s rozpoczal glosowanie o wyrzucenie botow z serwera.", voteplayer);

Plugin będzie działać w 99% poprawnie. Podczas testów zauważyłem, że musisz się zabezpieczyć przed sytuacją, kiedy żaden gracz nie głosuje (obecnie w takiej sytuacji boty są wyrzucane z serwera).


  • +
  • -
  • 1


#643203 Problem z timerem

Napisane przez GwynBleidD w 14.06.2014 08:28

4. W ten sposób nie wyrzuca się botów na serwerach CS'a. Najpierw musisz sprawdzić, czy gracz jest botem i wtedy wykonać na nim komendę AMXX - kick:

A to zależy od botów :) Niektóre po kicknięciu ich z serwera po prostu wrócą i należy wykonać komendę, która wyłącza całkowicie boty, a nie je kickować. Ale to:
            amx_exec @SERVER "epb_removebots"
nie jest poprawnym wykonaniem jakiejkolwiek komendy. Do tego używamy server_exec.
server_cmd("kick #%d ^"Gracz jest botem!^"", get_user_userid(id));

Dodatkowo jeżeli wartość wybrana w menu to MENU_EXIT, zniszcz menu za pomocą:

menu_destroy(menu)

NIE NIE I JESZCZE RAZ NIE!! W tym przypadku menu_destroy NIE UŻYWAMY !!

menu_destroy używamy, gdy generujemy menu tuż przed jego wyświetleniem dla pojedynczego gracza i nie mamy zamiaru wyświetlać tego samego menu drugi raz. W tym przypadku menu jest generowane na początku działania pluginu i jest wyświetlane jedno dla wszystkich graczy, więc po użyciu menu_destroy będzie mógł zagłosować TYLKO JEDEN GRACZ, bo po zagłosowaniu menu już nie będzie istnieć!
  • +
  • -
  • 2


#643184 Problem z timerem

Napisane przez VertekS w 14.06.2014 06:35

1. Nie ma takiej funkcji jak CreateTimer. Użyj set_task.

2. 

Action:kickmenu_wyniki(Handle:timer)

Zamień na:

public kickmenu_wyniki()

3. Funkcja kickmenuhandle nie jest zamknięta (brakuje nawiasu klamrowego na końcu funkcji).

4. W ten sposób nie wyrzuca się botów na serwerach CS'a. Najpierw musisz sprawdzić, czy gracz jest botem i wtedy wykonać na nim komendę AMXX - kick:

server_cmd("kick #%d ^"Gracz jest botem!^"", get_user_userid(id));

5. Po funkcji kickmenu_wyniki jest o jedna klamra za dużo.

6. Funkcja kickmenuhandle powinna zwracać wartość na końcu. Najlepiej zwrócić PLUGIN_HANDLED (i tak już nic nie robisz z tym menu po wybraniu opcji). Dodatkowo jeżeli wartość wybrana w menu to MENU_EXIT, zniszcz menu za pomocą:

menu_destroy(menu)

Kod jest brzydko napisany, ale to będziesz potrafił zoptymalizować sam p przeczytaniu artykułów w dziale tutoriale na tym forum (nie zawsze się operuje na 32 graczach / używa do tego pętli for). 


  • +
  • -
  • 1