←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Rejestracja eventów takich ja...

Locked

  • +
  • -
Vasto_Lorde's Photo 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.

Quote

  • +
  • -
GwynBleidD's Photo 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ę. 

Quote

  • +
  • -
Vasto_Lorde's Photo 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

Quote

  • +
  • -
GwynBleidD's Photo 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).

Quote

  • +
  • -
G[o]Q's Photo 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

Quote

  • +
  • -
Vasto_Lorde's Photo Vasto_Lorde 10.11.2014

ExecuteForward(fwd_r_click,ret,id);
ExecuteForward(fwd_r_press,ret,id);

Z czym to się je?

Quote

  • +
  • -
G[o]Q's Photo G[o]Q 10.11.2014

podmien to sobie na funkcje ktore maja sie wykonac po wcisnieciu przycisku i przy trzymaniu przycisku

Quote

  • +
  • -
Vasto_Lorde's Photo 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.

Quote

  • +
  • -
sebul's Photo sebul 11.11.2014

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
Quote
Locked