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.
|
Natywy jeden .inc kilka .sma obslugujacych funkcje
#1
Napisano 12.05.2011 13:50
Mamy jeden plik .inc
Część funkcji jest obsługiwanych przez plug1,
parę przez plug2,
i pozostałe przez plug3.
Nie wiem jak to prościej opisać, każdy z tych pluginów-bibliotek obsługuje inne funkcje z .inc i nie powtarzają się one w nich, każda funkcja jest obsługiwana tylko przez jeden plugin.
Chce porostu osiągnąć coś takiego że każdy plugin komunikuje się z każdym (niekoniecznie tak będzie w praktyce, może się okazać że jedna para się nie komunikuje).
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#2
Napisano 12.05.2011 14:40
#3
Napisano 12.05.2011 15:40
Dodano 18 maj 2011 - 19:33:
R3X chyba cie uduszę. To o co pytałem jest prawie nie możliwe (możliwe tylko w specyficznych warunkach) ponieważ plugin-biblioteka musi być w plugins.ini nad pluginami korzystającymi z natywów.
[warn=DarkGL]
R3X chyba cie uduszę - AHA[/warn]
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#4
Napisano 18.05.2011 19:47
Jest jeszcze prosta sztuczka z headerem: zarejestruj w nim wszystkie używane biblioteki. Pierwszy idzie header.amxx potem kolejność nie ma znaczenia, plugin poznajdują się nazwajem. Załączam działający przykład
Załączone pliki
#5
Napisano 19.05.2011 08:27
_header
C
A
B
Czy to zadziała? Czy dobrze rozumiem że to dzięki header pluginy teraz się odnajdą?
Ogólnie to już sobie poradziłem z tym i wyszło to całkiem lepiej niż początkowo chciałem, po prostu mam plugin-biblioteke zapewniający komunikacje między 4 pluginami, dodatkowo spełniać będzie dość istotną role jeśli chodzi o odczyt danych z bazy danych, ale temat ciągniemy dalej bo jest interesujący
PS. To
było bardziej tak żartobliwie, ale jak to bywa często przez kabel nasze emocje są mocno tłumione, a ja zapominałem dodać minkiR3X chyba cie uduszę
EDIT: Pojawił się problem.
Tak wygląda funkcja w pluginie obsługującym natywy:
public native_set_user_vip(id, bool:flag) { g_isVIP[id] = flag; return PLUGIN_CONTINUE;}Wcześniej wyglądała tak:
public native_set_user_vip(id, bool:flag) g_isVIP[id] = flag;Tak wygląda próba użycia funkcji natywnej:
if(access(id, FLAGS_VIP)) { bb_set_user_vip(id, true); g_isVIP[id] = true; log_to_file("addons/amxmodx/logs/bb_vip.log", "Jestes VIPEM"); } else { bb_set_user_vip(id, false); g_isVIP[id] = false; log_to_file("addons/amxmodx/logs/bb_vip.log", "Nie jestes VIPEM"); }Problem polega na tym że w żadnym z wypadków nie wykonują się polecenia które są po wywołaniu funkcji natywnej. Czyli nie mamy wypisywanych komunikatów do logów. Dlaczego tak się dzieje?
EDIT2: Dodałem jeszcze jeden wpis do logów, teraz wywołanie funkcji wygląda tak:
public client_putinserver(id) { log_to_file("addons/amxmodx/logs/bb_vip.log", "Client connect"); if(access(id, FLAGS_VIP)) { bb_set_user_vip(id, true); g_isVIP[id] = true; log_to_file("addons/amxmodx/logs/bb_vip.log", "Jestes VIPEM"); } else { bb_set_user_vip(id, false); g_isVIP[id] = false; log_to_file("addons/amxmodx/logs/bb_vip.log", "Nie jestes VIPEM"); } log_to_file("addons/amxmodx/logs/bb_vip.log", "Client connect end"); }Ostatni wpis Client connect end nie jest dodawany. Problem pojawia się nawet jeśli przeniosę całą zawartość client_putinserver do funkcji wywoływanej przy respieniu gracza.
Użytkownik diggs edytował ten post 19.05.2011 09:59
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#6
Napisano 19.05.2011 14:05
_header C A B
Pluginy nie są ładowane jeśli nie istnieje wymagana przez nie biblioteka. Jak zrobisz taki header to biblioteki będą istnieć, a w trakcie wykonania amxx znajdzie sobie te funkcje w pozostałych pluginach.
Co do natywu to przeszukaj logi błędów (error_DATA.log)
#7
Napisano 19.05.2011 19:48
L 05/03/2011 - 07:29:57: [AMXX] Displaying debug trace (plugin "basebuilderpro.amxx") L 05/03/2011 - 07:29:57: [AMXX] Run time error 4: index out of bounds L 05/03/2011 - 07:29:57: [AMXX] [0] basebuilderpro.sma::native_set_user_vip (line 34) L 05/03/2011 - 07:29:57: Unhandled dynamic native error L 05/03/2011 - 07:29:57: [AMXX] Displaying debug trace (plugin "bb_vip.amxx") L 05/03/2011 - 07:29:57: [AMXX] Run time error 10: native error (native "bb_set_user_vip") L 05/03/2011 - 07:29:57: [AMXX] [0] bb_vip.sma::vip_spawn (line 99)Ogólne założenie jakie chce osiągnąć to:
plugin bb_vip ma poinformować czy gracz jest vipem czy nie i za pomocą funkcji bb_set_user_vip(id, bool:flag) ustawia zmienną globalna typu bool w pluginie basebuilderpro i teraz inny plugin może dowiedzieć się czy gracz jest vipem czy też nie, pytając się pluginu basebuilderpro za pomocą bool:bb_is_user_vip(id) w odpowiedzi otrzymuje wartość zmiennej globalnej w której jest przechowywana informacja czy gracz jest vipem czy nie i podjąć odpowiednie kroki.
Użytkownik diggs edytował ten post 19.05.2011 19:49
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#8
Napisano 19.05.2011 19:52
new piecLiczb[5] piecLiczb[20] = 0;
#9
Napisano 19.05.2011 19:57
#define MAXPLAYERS 32 new bool:g_isVIP[MAXPLAYERS];
register_native("bb_set_user_vip", "native_set_user_vip");
public native_set_user_vip(id, bool:flag) { g_isVIP[id] = flag; return PLUGIN_CONTINUE;}Nie wiem co robię nie tak, myślę że błąd jest prosty i wynika z mojego małego doświadczenia w programowaniu.
Użytkownik diggs edytował ten post 19.05.2011 19:58
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#10
Napisano 19.05.2011 20:02
#define MAXPLAYERS 33bo licząc od 0 to index 32 jest 33-im elementem tablicy
public native_set_user_vip(id, bool:flag) { f(!is_user_connected(id)) return 0; g_isVIP[id] = flag; return 1; }a to rozwiąże problem out of bounds, ale jeśli podajesz coś większego niż 32 to nie wina natywu tylko wywołania w tym drugin pluginie; tam też sprawdzaj czy gracz jest na serwerze
#12
Napisano 19.05.2011 22:15
#13
Napisano 20.05.2011 11:38
Rozumiem ;] a całości nie przesłał bym na PW bo to jest kilka sporych pluginów.znasz przyczynę, więc szukaj błędu; nie ogarnę Twojego kodu znając kilkanaście linijek (nie mam zamiaru dostawać też całości na PW)
Dzięki za zwrócenie uwagi z rozmiarem tablicy zmieniłem od razu wartość we wszystkich pluginach.
Wracając do tematu, pozbyłem się błędu, teraz jest problem
Jeśli chodzi o błąd to nie wiem co w końcu pomogło funkcja wygląda teraz tak:
#define MAXPLAYERS 33 new bool:g_isVIP[MAXPLAYERS];
public native_set_user_vip(id, bool:flag) { if(!is_user_connected(id)) return PLUGIN_HANDLED; if (flag) g_isVIP[id] = true; else g_isVIP[id] = false; return PLUGIN_CONTINUE; }Teraz jest problem, przy sprawdzaniu czy gracz jest vipem za pomocą natywu...:
public bool:native_is_user_vip(id){ if(g_isVIP[id]) ColorChat(0, YELLOW, "Gracz jest Vipem"); else ColorChat(0, YELLOW, "Gracz nie jest Vipem"); return g_isVIP[id]; }native_is_user_vip i native_set_user_vip są w tym samym pluginie-bibliotece
...bez względu czy gracz jest vipem czy też nie plugin widzi go jako zwykłego gracza nie vipa (jeśli nim jest to jest problem).
EDIT:
Zmieniłem trochę wygląd funkcji
public native_set_user_vip(id, bool:flag) { if(!is_user_connected(id)) return PLUGIN_HANDLED; log_to_file("addons/amxmodx/logs/bb_vip.log", "przed"); if (flag) { g_isVIP[id] = true; log_to_file("addons/amxmodx/logs/bb_vip.log", "true"); } else { g_isVIP[id] = false; log_to_file("addons/amxmodx/logs/bb_vip.log", "false"); } log_to_file("addons/amxmodx/logs/bb_vip.log", "po"); return PLUGIN_CONTINUE; }W logach pokazuje się tylko "przed", już nie mam pojęcia co jest nie ta. Dodatkowo zrobiłem eksperyment z którego wynika że błąd z którym walczyliśmy kilka postów wyżej występuje jeśli nie ma tej linijki:
if(!is_user_connected(id)) return PLUGIN_HANDLED;
EDIT2:
Okroiłem funkcje na maxa
public native_set_user_vip(id) { log_to_file("addons/amxmodx/logs/bb_vip.log", "ID: %d", id); g_isVIP[id] = true; (line 41) log_to_file("addons/amxmodx/logs/bb_vip.log", "true"); }Wywołanie:
bb_set_user_vip(id);Wywoływana przy respie gracza (Ham_Spawn).
Logi:
L 05/04/2011 - 01:37:18: [AMXX] Displaying debug trace (plugin "bb_vip.amxx") L 05/04/2011 - 01:37:18: [AMXX] Run time error 10: native error (native "bb_set_user_vip") L 05/04/2011 - 01:37:18: [AMXX] [0] bb_vip.sma::vip_spawn (line 93) L 05/04/2011 - 01:38:24: [AMXX] Displaying debug trace (plugin "basebuilderpro.amxx") L 05/04/2011 - 01:38:24: [AMXX] Run time error 4: index out of bounds L 05/04/2011 - 01:38:24: [AMXX] [0] basebuilderpro.sma::native_set_user_vip (line 41) L 05/04/2011 - 01:38:24: Unhandled dynamic native error
Przełom
Uruchomiona taka funkcja
public native_set_user_vip(id) { log_to_file("addons/amxmodx/logs/bb_vip.log", "ID: %d", id); //g_isVIP[id] = true; log_to_file("addons/amxmodx/logs/bb_vip.log", "true"); }Daje takie logi:
L 05/04/2011 - 01:42:51: ID: 33 L 05/04/2011 - 01:42:51: trueDokładne wywołanie natywu:
RegisterHam(Ham_Spawn, "player", "vip_spawn", 1);
public vip_spawn(id) { if(access(id, ADMIN_BAN)) { bb_set_user_vip(id); g_isVIP[id] = true; } else { //bb_set_user_vip(id, 0); g_isVIP[id] = false; } }Pytanie: Czemu przesyłany jest nieprawidłowy id.
Zaraz dodam jeszcze wypisanie do logów id przed wywołanie natywu i powiem co to dało.
Oto logi:
L 05/04/2011 - 01:47:16: Przed ID: 1 L 05/04/2011 - 01:47:16: ID: 33 L 05/04/2011 - 01:47:16: trueWyszło coś bardzo dziwnego, ja już nie mam zielonego pojęcia o co chodzi.
Ja już nie ogarniam tego, R3X proszę o pomoc, nawet jak nie wiesz o co chodzi napisz.
Użytkownik diggs edytował ten post 20.05.2011 14:00
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#14
Napisano 20.05.2011 18:51
#15
Napisano 20.05.2011 20:03
register_native("bb_set_user_vip", "native_set_user_vip");Czyli wszystko jasne, przez domniemanie jest styl ustawiony na 0. Leci plusik za pomoc ;]
Jak możesz podpowiedz mi którego stylu używać. Na amxmodx.org piszą:
Więc lepiej wybrać styl taki jaki mam i odnosić się do argumentów przezStyle should always be 0. The "dJeyL" mode value of 1 is deprecated, since it is not properly compatible with any by-reference type.
get_param(1,2,3...)czy iść na łatwiznę? Który styl jest lepszy lub czym one się różnią po za przysłanymi argumentami. Teraz już wiem jak poprawnie pobrać parametry, proszę podpowiedz mi co do stylu natywów.
I naprawdę wielkie dzięki za taką pomoc, takich użytkowników jak ty powinno być więcej ;]
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#16
Napisano 20.05.2011 20:13
styl=1 jest w porządku dopóki nie chcesz czegoś zwrócić przez referencję, sam używam go właśnie dla operacji get/set
styl=0 jest bardziej elastyczny, upraszcza takie operacje jak zmienna liczba parametrów czy stworzenie forwardu dla pojedynczego pluginu, nie jest tak kłopotliwy jakby się wydawało ,a walidacja danych jest bardziej czytelna wg mnie
#17
Napisano 20.05.2011 20:24
Jutro będę z tym walczył dalej, dziś jestem padnięty, a czeka mnie jeszcze lektura PHP i MySQL ...
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#18
Napisano 25.05.2011 14:14
set_native_filter("myMod"); public myMod(const name[], index, trap){ if(!trap) return PLUGIN_HANDLED; return PLUGIN_CONTINUE; }
ta technika też pozwala na wczytanie pluginu bez włączonej jeszcze biblioteki
#19
Napisano 25.05.2011 22:25
Możesz na podstawie tych przykładów co podałeś pokazać zastosowanie tego bo myślę że niedługo będzie mi to potrzebne ponieważ zabieram się za dodanie kolejnego pluginu do tych które już "współpracują".
Użytkownik diggs edytował ten post 25.05.2011 22:26
cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
#20
Napisano 26.05.2011 12:26
w plugin_natives ustawiasz funkcje filtrującą
public plugin_natives(){ set_native_filter("native_filter"); }
a wyglądać ona powinna tak:
public native_filter(const szName[], funid, trap){ }i teraz problem z wczytaniem natywu będzie zgłaszany do tej funkcji native_filter,
szName[] - nazwa funkcji
funid - indeks funkcji
trap=
0- jeśli to problem z wczytaniem
1- jeśli to problem z wywołaniem
więc jak chcesz załadować pluign pomimo braku jakiejkolwiek funkcji to:
public native_filter(const szName[], funid, trap){ if(trap == 0) return PLUGIN_HANDLED; return PLUGIN_CONTINUE; }
Handled blokuje generowanie błędów i pozwala wczytać plugin, Continue pozwala na normalne przetwarzanie błędów
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych