PreThink i wciśnięcie klawisza
A może sma?
15.08.2011
Siema.
Mam pytanie: chciałem wykryć naciśnięcie IN_ATTACK
Zrobiłem to tak:
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
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
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;
}
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
}
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;
}
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
Użytkownik A może sma? edytował ten post 15.08.2011 20:47
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.
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?
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?
DarkGL
15.08.2011
prethink jest wywoływany okolo 100 razy na sekunde cmdstart jest lepszym rozwiązaniem w tym przypadku
tu nie chodzi o wykorzystywany moduł tylko o forwardy których użyliśmyTzn. Dark wykorzystał fakemete a Goliath engine... Co jest optymalniejsze?
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
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
DarkGL
15.08.2011
jeśli funkcja ma być wywoływana jeden raz podczas wciśnięcia attack to warunek
możesz wtedy napisać po prostu
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)
DarkGL
15.08.2011
kod goliatha mnie zmylił ale patrząc teraz na twój to warunek powinnien być
if(buttons & IN_ATTACK)
A może sma?
15.08.2011
Yyy... Dark coś namieszałeś w tym warunku
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...)
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...)
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
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