←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

PreThink i wciśnięcie klawisza

Zablokowany

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

Siema.
Mam pytanie: chciałem wykryć naciśnięcie IN_ATTACK
Zrobiłem to tak:
public client_PreThink(id)
{
if(!ma_klase[id])
{
return PLUGIN_CONTINUE;
}
if(!is_user_connected(id) || !is_user_alive(id))
{
return PLUGIN_CONTINUE;
}
if(!(get_user_button(id) & IN_ATTACK))
{
return PLUGIN_CONTINUE;
}
switch(tryb[id])
{
case 0:
{
return PLUGIN_CONTINUE;
}
case 1:
{
Funkcja1(id);
}
case 2:
{
Funkcja2(id);
}
}
return PLUGIN_CONTINUE;
}

Problem mam taki: Funkcje wykonują się cały czas, gdy trzymam przycisk ataku. Jak mogę zmienić kod by funkcja była wykonana raz? 1 kliknięcie = 1 wywołanie funkcji
Edit: @Down - działa :] Dziękuje
Użytkownik A może sma? edytował ten post 15.08.2011 20:45
Odpowiedz

  • +
  • -
Goliath - zdjęcie Goliath 15.08.2011

public client_PreThink(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
{
return PLUGIN_CONTINUE;
}
if(!ma_klase[id])
{
return PLUGIN_CONTINUE;
}
if(!(get_user_button(id) & IN_ATTACK) || get_user_oldbutton(id) & IN_ATTACK)
{
return PLUGIN_CONTINUE;
}
switch(tryb[id])
{
case 0:
{
return PLUGIN_CONTINUE;
}
case 1:
{
Funkcja1(id);
}
case 2:
{
Funkcja2(id);
}
}
return PLUGIN_CONTINUE;
}
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 15.08.2011

Powinno byc tak:

public client_PreThink(id)
{
if(!ma_klase[id] || !is_user_alive(id) || !is_user_connected(id))
return PLUGIN_CONTINUE

if((get_user_button(id) & IN_ATTACK) && !(get_user_oldbutton(id) != IN_ATTACK))
{
switch(tryb[id])
{
case 0: {
return PLUGIN_CONTINUE
}
case 1: {
Funkcja1(id)
}
case 2: {
Funkcja2(id)
}
}
}
return PLUGIN_CONTINUE
}
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 15.08.2011

a najlepiej i poprawnie będzie tak:

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "DarkGL"


public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_forward(FM_CmdStart,"fwd_CmdStart")
}

public fwd_CmdStart(id, uc_handle, seed) {
if(!is_user_alive(id) || !ma_klase[id]){
return FMRES_IGNORED;
}

new buttons = get_uc(uc_handle,UC_Buttons)
new oldbuttons = get_user_oldbutton(id);

if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
{
switch(tryb[id])
{
case 0: {
return FMRES_IGNORED;
}
case 1: {
Funkcja1(id)
}
case 2: {
Funkcja2(id)
}
}
}
return FMRES_IGNORED;
}
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

Edit: Ogólnie to sposób Goliatha działa :]
Użytkownik A może sma? edytował ten post 15.08.2011 20:47
Odpowiedz

Dwdov - zdjęcie Dwdov 15.08.2011

Marwit źle, to są bitsumy nie można tego porównywać przez " != ". Trzeba brać iloczyn ( & ) i wtedy użyć negacji albo na ~IN_ATTACK, albo wziąć to w nawias i dać ! przed nim.
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

A jeszcze takie małe pytanie: czy sposób Darka jest lepszy od sposobu Goliatha?
Tzn. Dark wykorzystał fakemete a Goliath engine... Co jest optymalniejsze?
I można jeszcze zablokować strzał w case 1 i case 2? A w case 0 normalnie strzela?
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 15.08.2011

prethink jest wywoływany okolo 100 razy na sekunde cmdstart jest lepszym rozwiązaniem w tym przypadku

Tzn. Dark wykorzystał fakemete a Goliath engine... Co jest optymalniejsze?

tu nie chodzi o wykorzystywany moduł tylko o forwardy których użyliśmy
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

@Dark: Mały błędzik Ci się wkradł: && w linijce:
if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
powodowało wywołanie funkcji kilkukrotnie podczas jednego przyciśnięcia
Zmieniłem na || i zadziałało :]
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 15.08.2011

jeśli funkcja ma być wywoływana jeden raz podczas wciśnięcia attack to warunek
if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
jest poprawny jak dasz tam || funkcja będzie wyoływana przy trzymaniu attack
możesz wtedy napisać po prostu
 if(buttons & IN_ATTACK)
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 15.08.2011

kod goliatha mnie zmylił ale patrząc teraz na twój to warunek powinnien być
if(buttons & IN_ATTACK)
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

Yyy... Dark coś namieszałeś w tym warunku :D
if((buttons & IN_ATTACK) || !(oldbuttons & IN_ATTACK)) - to działało (funkcja była wykonywana raz, przy puszczeniu klawisza - trzymałem klawisz 5 sek - po 5 sek była wykonana)
if(buttons & IN_ATTACK) - nie działało w ogóle - po prostu od razu wykonywało funkcję (nawet bez przyciśnięcia...)
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 15.08.2011

czyli chcesz wykonac funkcje przy puszczeniu attack tak ?
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 15.08.2011

W zasadzie to mi to obojętne czy wykona się funkcja wraz z kliknięciem czy wraz z puszczeniem klawisza.
Chodzi mi o to by funkcja wykonała się tylko jeden raz, nie zależnie od długości trzymania przycisku, ale za każdym razem gdy ktoś kliknie LPM.
Edit: Dobra, już osiągnąłem to co chciałem :] Dziękuję wszystkim za zainteresowanie i pomoc
Użytkownik A może sma? edytował ten post 15.08.2011 22:52
Odpowiedz
Zablokowany