[ROZWIĄZANE] Rejestracja eventów takich ja...
Vasto_Lorde
08.11.2014
Cześć. Ogólnie wprowadzając, tworzę mod, który wyklucza użycie broni palnej. I staram się znaleźć jak najwięcej sposobów na rejestracje "zachowań" gracza gdy gracz trzyma nóż (min przeładowanie, drop broni, atak, IN_USE, włączenie latarki, szprej). Właściwie pisząc ten temat sprawdzam trochę więcej źródeł niż wcześniej, więc pewnie sam znajdę niektóre odpowiedzi.
Napisałem kod:
#include <amxmodx> #include <hamsandwich> #include <engine> public plugin_init(){ register_plugin("Sprawdzenie przyciskow na nozu", "1.0", "Vasto_Lorde"); RegisterHam(Ham_Weapon_Reload, "weapon_knife", "KnifeReload"); RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "KnifePrimaryAttack"); //Dziala RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "KnifeSecondaryAttack"); //Dziala register_clcmd("drop", "KnifeDrop"); //Dziala register_clcmd("reload", "KnifeReload1"); register_clcmd("+reload", "KnifeReload2"); register_impulse(201, "KnifeSpray"); //Dziala register_impulse(100, "KnifeFlashlight"); //Dziala } public KnifeReload(ent){ client_print(0, print_chat, "Weapon_Reload - %i", ent); } public KnifePrimaryAttack(ent){ client_print(0, print_chat, "KnifePrimaryAttack - %i", ent); } public KnifeSecondaryAttack(ent){ client_print(0, print_chat, "KnifeSecondaryAttack - %i", ent); } public KnifeDrop(id){ if(get_user_weapon(id)==CSW_KNIFE) client_print(0, print_chat, "KnifeDrop - %i", id); } public KnifeReload1(id){ if(get_user_weapon(id)==CSW_KNIFE) client_print(0, print_chat, "Weapon_Reload1 - %i", id); } public KnifeReload2(id){ if(get_user_weapon(id)==CSW_KNIFE) client_print(0, print_chat, "Weapon_Reload2 - %i", id); } public KnifeSpray(id){ if(get_user_weapon(id)==CSW_KNIFE) client_print(0, print_chat, "KnifeSpray - %i", id); } public KnifeFlashlight(id){ if(get_user_weapon(id)==CSW_KNIFE) client_print(0, print_chat, "Flashlight - %i", id); } public client_PreThink(id){ if(get_user_weapon(id)==CSW_KNIFE){ new button=get_user_button(id); if(button&IN_RELOAD) client_print(0, print_chat, "cmdStartReload - %i", id); if(button&IN_USE) client_print(0, print_chat, "cmdStartUse - %i", id); } }
Zaliczone mam przyciski: G(drop), F(latara), T(szprej). Ale nie podoba mi się moje rozwiązanie (innego nie znalazłem) z IN_USE i IN_RELOAD. Bo Ham_Weapon_Reload oraz register_clcmd nie działają. Think wykonuje się za dużo razy, gdy kliknę przycisk wiadomość pojawia się co najmniej dwukrotnie. Jest jakiś bardziej efektywny sposób na zarejestrowanie przeładowania na nożu i IN_USE(+use)?
PS. Jeśli ktoś byłby zainteresowany innymi przyciskami to kolejno Q, Z, X, C można zarejestrować przy użyciu register_clcmd dla komend: lastinv, radio1, radio2, radio3.
GwynBleidD
09.11.2014
1. Zamiast thinka możesz użyć FM_CmdStart lub Ham_ObjectCaps (przynajmniej dla IN_USE). FM_CmdStart będzie się wykonywać tylko, gdy gracz faktycznie "coś" robi. Ma jednak tą samą wadę, co think że coś może się wykonać wiele razy... Ale! To nie jest wcale taka wada, jeśli wiesz jak to działa
Otóż prócz sprawdzenia co gracz naciska poprzez get_user_button, możesz również sprawdzić co naciskaŁ przy poprzednim wywołaniu eventu, poprzez get_user_oldbutton lub po prostu cachując przyciski wewnątrz pluginu. W taki sposób: jeśli gracz nie naciskał poprzednio IN_USE, a teraz to robi, oznacza to ni mniej, ni więcej że zaczął naciskać. Więc w tym momencie możesz wywołać jakąś akcję.
Vasto_Lorde
10.11.2014
Ja pier**le cały post w pizdu. Napisałem i połowa się wysłała. Trzeci raz od nowa:
Zrobiłem tak jak mówiłeś, wszystko jest w przyciski_noz2.
Wnioski: CmdStart wykonuje się zawsze, nawet jak nic nie robię. ObjectCaps wykonuje się ciągle gdy naciskam E. I nie da się tam użyć get_user_button & IN_USE && !get_user_oldbutton & IN_USE.
Lepsze rozwiązanie według mnie jest w przyciski_noz3 zerżnięte z coda. EmitSound nie wykonuje się często. Jesli ktoś ma jakieś obiekcje co do używania tej funkcji, zapraszam do podzielenia się nimi w tym temacie.
przyciski_noz4 to moja kompletna abstrakcja w poszukiwaniu rejestracji reloadu na nożu. Nie działa.
Ktoś ma jeszcze jakieś pomysły na ten przycisk R (prócz Thinku który był wymieniony wcześniej?)
Attached Files
GwynBleidD
10.11.2014
Na nożu reloada raczej inaczej się wykryć nie da, bo dalej jest już on odfiltrowany przez silnik gry (bo noża przecież nie przeładujesz).
G[o]Q
10.11.2014
U mnie takie cos dzialalo ok
public Fwd_CmdStart(id, uc_handle, seed){ if(!is_user_alive(id)) return; new buttons=get_uc(uc_handle,UC_Buttons); new old_buttons=pev(id,pev_oldbuttons); if(buttons & IN_RELOAD){ new ret; if(!(old_buttons & IN_RELOAD)) ExecuteForward(fwd_r_click,ret,id); else ExecuteForward(fwd_r_press,ret,id); } }
a do wykrywania IN_USE używałem Emit_Sounda ale w cmdstart tez mozna
Vasto_Lorde
10.11.2014
ExecuteForward(fwd_r_click,ret,id); ExecuteForward(fwd_r_press,ret,id);
Z czym to się je?
G[o]Q
10.11.2014
podmien to sobie na funkcje ktore maja sie wykonac po wcisnieciu przycisku i przy trzymaniu przycisku
Vasto_Lorde
10.11.2014
A myślałem, że za tym jakaś magia się kryje.
W pierwszym moim poście jest wzmianka o client_PreThink i potem o CmdStart. Oczywiście ten sposób działa. Dzięki za pomoc. Można zamknąć, bo więcej się chyba nie wymyśli.
sebul
11.11.2014
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL