←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Zombie Plague 5.0
Błędy Assassin Mode

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2018

To już chyba błąd autora, bo ja tego nie zmieniałem. Po włączeniu Assassin Mode na więcej niż ~10 osób, w logach jest błąd w którym plugin wysyła wiadomość do id 0.

Na Nemesis Mode nie występuje ten błąd, bo wogóle nie ma message ScreenFade i ScreenShake.

 

Spoiler

 

zp50_gamemode_assassin.amxx:

Spoiler

 

Dodam, że tryby testowałem na XFakePlayers (bo podboty mózgu nie mają >.<).

W sumie to może być też wina botów bo co runde bez powodu ginie ich powoła.

Można jakoś naprawić ten błąd ?

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 04.08.2018

Pokaż całe sma, a jeśli to silnik to pokaż deklarację;

g_msgScreenFade
Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2018

ZP 5.0 to raczej kilkanaście - kilkadziesiąt mini-silników, nie widziałem jeszcze tej wersji z jednym dużym silnikiem, jest w ogóle taki ? xD

 

Cały plik zp50_gamemode_assassin.sma:

Załączony plik  zp50_gamemode_assassin.sma   6,28 KB   76 Ilość pobrań

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 04.08.2018

g_msgScreenShake = get_user_msgid("ScreenShake")
g_msgScreenFade = get_user_msgid("ScreenFade")

Nie powinno to być w init? Nie jestem pewny, czy zrobi to jakąkolwiek różnicę, ale według starego zp 4.3 jest to w init i warto spróbować. Jak nie zadziała, to poszukamy przyczyny gdzie indziej.

Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2018

Dodałem to do init i nic to nie zmieniło :P

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 04.08.2018

Sugerując się silnikiem 4.3 spróbuj zamienić pierwszy argument message_begin na:

MSG_ONE_UNRELIABLE

Podobno jest to "zawodna" metoda, ale warto spróbować. Od dłuższego czasu grzebie się z silnikiem 4.3 i nie miałem nigdy problemu z tym konkretnym errorem.

 

 

Sama rejestracja ScreenFade jest raczej poprawna - niezbyt złożona (zaledwie z deklaracji handlera, przypisania indexu wiadomości i użycia w message_begin), więc też mało prawdopodobne, że jest to problemem.


Użytkownik aSiorr edytował ten post 04.08.2018 20:06
Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 04.08.2018

Już tego próbowałem, nic to nie dało :/

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 04.08.2018

Sprawdź, potem dołącz plik z logiem z linii 216.

Załączone pliki

Odpowiedz

  • +
  • -
csMaster - zdjęcie csMaster 05.08.2018

Dalej to samo (chociaż to już chyba ten drugi message ?)

L 08/05/2018 - 12:36:19: gmsgScreenFade message id = 98 (Playerid: 2)
L 08/05/2018 - 12:36:19: Plugin called message_begin with an invalid message id (0).
L 08/05/2018 - 12:36:19: [AMXX] Displaying debug trace (plugin "zp50_gamemode_assassin.amxx")
L 08/05/2018 - 12:36:19: [AMXX] Run time error 10: native error (native "message_begin")
L 08/05/2018 - 12:36:19: [AMXX]    [0] zp50_gamemode_assassin.sma::zp_fw_gamemodes_start (line 166)
L 08/05/2018 - 12:36:19: Log file started (file "cstrike\addons\amxmodx\logs\ZombiePlague_20180805.log") (game "cstrike") (amx "1.8.2")

@edit aSiorr, zrobiłem tak samo z ScreenShake i już działa, nie bardzo wiem co to za różnica ale poprawione :P


Użytkownik csMaster edytował ten post 05.08.2018 11:50
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 05.08.2018

message_begin( MSG_ONE, gmsgScreenFade, {0,0,0}, id );

a

message_begin(MSG_ONE, g_msgScreenFade, _, id);

Przekazanie "_" czyli pominięcie argumentu powinno zostawić przypisaną do zmiennej wartość początkową:

float vecOrigin[3];

Jak na moje warunek pokazany niżej łapie się na tym, że vecOrigin ma wartości < 1, ale to może być tylko moje krzywe myślenie na ten moment.

 

Dokumentacja message_begin mówi, że argument ten:

origin - położenie źródła wiadomości, nie zawsze potrzebne.

Nie zawsze, ale ewidentnie czasami wymagane - jak widać po wcześniejszych postach.

 

Według source-code "messages":

if (params[2] < 1 || ((params[2] > 63) && !GET_USER_MSG_NAME(PLID, params[2], NULL))) // maximal number of engine messages 
{
	LogError(amx, AMX_ERR_NATIVE, "Plugin called message_begin with an invalid message id (%d).", params[2]);
	return 0;
}

"maximal number of engine messages" więc jest możliwość (jeśli dobrze interpretuje komentarz), że rzeczywiście zawołane zostało zbyt dużo "engine messages".

Wypadałoby wyprintować origin podawany do funkcji message_begin, żeby sprawdzić jaką rzeczywiście przyjmuje wartość - jeśli > 1 to nie przeszła druga część ifa, czyli zbyt dużo wiadomości silnika. Nie mam teraz czasu, żeby zagłębiać się w to, ale skoro problem rozwiązany to chyba nie ma co szukać dziury w całym.

 


Użytkownik aSiorr edytował ten post 05.08.2018 12:51
Odpowiedz