Jak sprawdzić, czy gracz został trafiony w...
Jcr
19.06.2015
Witam, takie pytanko mam, potrzebuje sprawdzić czy gracz został trafiony, np w noge.
Dokładnie chodzi mi o coś takiego:
Jeśli gracz został trafiony w noge, to { kod }
Z góry dzięki za pomoc
Alelluja
19.06.2015
Może by IF'em ?
- /* Parts of body for hits */
- #define HIT_GENERIC 0 /* none */
- #define HIT_HEAD 1
- #define HIT_CHEST 2
- #define HIT_STOMACH 3
- #define HIT_LEFTARM 4
- #define HIT_RIGHTARM 5
- #define HIT_LEFTLEG 6
- #define HIT_RIGHTLEG 7
Jcr
19.06.2015
I wtedy starczy coś takiego?
if(HIT_RIGHTLEG) { speeds[id] = get_user_maxspeed(id) * 0.5; ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE"); }
Jcr
20.06.2015
Ok, mam coś takiego:
... #define HIT_RIGHTLEG 7 ... public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_event("PlayerHit", "player_hit", "1=0"); } ... public player_hit(id) { if(get_pdata_int(id, 75) == HIT_RIGHTLEG) { speeds[id] = get_user_maxspeed(id) * 0.5; ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE"); return FMRES_SUPERCEDE; } }
Co oznacza liczba 75 w "if(get_pdata_int(id, 75) == HIT_RIGHTLEG)"
Analogicznie do tego, zostało zrobione dla innych częsci ciała np:
... #define HIT_LEFTLEG 6 ... if(get_pdata_int(id, 75) == HIT_LEFTLEG)
I po trafieniu w którąkolwiek część ciała nic się nie dzieje
Użytkownik Jcr edytował ten post 20.06.2015 15:00
Rivit
20.06.2015
register_forward(FM_TraceLine, "TraceLine", 1); public TraceLine(Float:start[3], Float:end[3], conditions, id, trace) { new iHit = get_tr2(trace, TR_pHit); if(!is_user_alive(iHit) || !is_user_alive(id)) return FMRES_IGNORED; if(get_tr2(trace, TR_iHitgroup) == HIT_HEAD) { //w banie } return FMRES_IGNORED; }
Co oznacza liczba 75 w "if(get_pdata_int(id, 75) == HIT_RIGHTLEG)"
Numer offsetu
http://amxx.pl/topic...-offsety-pdata/
i skąd Ty wziąłes event playerHit?
Jcr
20.06.2015
register_forward(FM_TraceLine, "TraceLine", 1); public TraceLine(Float:start[3], Float:end[3], conditions, id, trace) { new iHit = get_tr2(trace, TR_pHit); if(!is_user_alive(iHit) || !is_user_alive(id)) return FMRES_IGNORED; if(get_tr2(trace, TR_iHitgroup) == HIT_HEAD) { //w banie } return FMRES_IGNORED; }
Co oznacza liczba 75 w "if(get_pdata_int(id, 75) == HIT_RIGHTLEG)"
Numer offsetu
http://amxx.pl/topic...-offsety-pdata/
i skąd Ty wziąłes event playerHit?
Kod który podesłałeś odpada, przetestowany, on sprawdza czy dana część ciała jest pod celownikiem, jak ktoś rzuci granat w Ciebie, z celownikiem na głowie, to działa tak jakby w Ciebie strzelił z czegoś (wykonuje się kod z "if(get_tr2(trace, TR_iHitgroup) == HIT_HEAD)")
playerhit gdzies w jakims pluginie widziałem, ale chyba jakiś inaczej się to zwało
Spróbuję to hamem zrobić
Ham_TakeDamage if(dmgbits & DMG_BULLET)
Jcr
20.06.2015
dobra mam cosik takiego:
... register_event("Damage", "player_hit", "b", "2!=0") ... public player_hit(id) { if(get_pdata_int(id, 75) == HIT_RIGHTLEG) { speeds[id] = get_user_maxspeed(id) * 0.5; ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE"); } ...
Po hicie dalej nic się nie dzieje
Asiap
20.06.2015
#include <amxmodx> #include <hamsandwich> #include <fakemeta> public plugin_init() { RegisterHamPlayer(Ham_TraceAttack, "TraceAttack"); } public TraceAttack(id, attacker) { if(!is_user_connected(id) || !is_user_connected(attacker)) { return; } switch(get_pdata_int(id, 75)) { case HIT_RIGHTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w prawa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w prawa noge", attacker); } case HIT_LEFTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w lewa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w lewa noge", attacker); } } }
Użytkownik Asiap edytował ten post 20.06.2015 17:10
Jcr
20.06.2015
#include <amxmodx> #include <hamsandwich> #include <fakemeta> public plugin_init() { RegisterHamPlayer(Ham_TraceAttack, "TraceAttack"); } public TraceAttack(id, attacker) { if(!is_user_connected(id) || !is_user_connected(attacker)) { return; } switch(get_pdata_int(id, 75)) { case HIT_RIGHTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w prawa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w prawa noge", attacker); } case HIT_LEFTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w lewa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w lewa noge", attacker); } } }
Zarówno lokalny jak i webowy compilator zwraca błąd w
error 017: undefined symbol "RegisterHamPlayer"
czyli ta linijka : RegisterHamPlayer(Ham_TraceAttack, "TraceAttack");
Edit: poprawiłem sobie na: RegisterHam(Ham_TraceAttack, "attacker", "TraceAttack"); i poszło, zaraz napisze czy działa sam plugin prawidłowo
Edit2: Niestety, dalej nie działa (w podanym przypadku nie wyświetla wiadomości, plugin skompilował się bez errorów ani warningów)
Użytkownik Jcr edytował ten post 20.06.2015 17:32
Asiap
20.06.2015
Bo byt eventu nie moze byc "attacker"...
ustaw na "player"
proponuje korzystac z kompilatora https://spider.limetech.org/
Użytkownik Asiap edytował ten post 20.06.2015 17:39
Rivit
20.06.2015
RegisterHamPlayer(Ham_TraceAttack, "TraceAttack");
->
RegisterHam(Ham_TraceAttack, "player", "TraceAttack");
Jcr
20.06.2015
mam już tak:
RegisterHam(Ham_TraceAttack, "player", "TraceAttack");
Niestety kod z case'ów dalej się nie wykonuje przy trafieniu
public TraceAttack(id, attacker) { if(!is_user_connected(id) || !is_user_connected(attacker)) { return; } switch(get_pdata_int(id, 75)) { case HIT_RIGHTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w prawa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w prawa noge", attacker); } case HIT_LEFTLEG: { client_print(attacker, print_chat, "Trafilam gracza #%d w lewa noge", id); client_print(id, print_chat, "Gracz #%d trafil mnie w lewa noge", attacker); } } }
Próbowałem sobie zmienić kod z case'a żeby się upewnić, że się nie wykonuje, dałem:
case HIT_LEFTLEG: { ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE"); }
i też nie działa
Użytkownik Jcr edytował ten post 20.06.2015 17:57
Jcr
22.06.2015
Sory za ppp, ale nie moge edytować tego z notatką.
Ostatecznie (niestety) użyłem funkcji z pluginu: [ http://amxx.pl/topic/550-drop-weapons-on-hit/ ] czyli sprawdzania czy dana część gracza jest pod celownikiem + do tego jeszcze muszę zrobić wykluczenie na granaty, nóż i broń bez amunicji :[
Dokładnie, chodzi o to co zaproponował TIBACK:
register_forward(FM_TraceLine, "TraceLine", 1); public TraceLine(Float:start[3], Float:end[3], conditions, id, trace) { new iHit = get_tr2(trace, TR_pHit); if(!is_user_alive(iHit) || !is_user_alive(id)) return FMRES_IGNORED; if(get_tr2(trace, TR_iHitgroup) == HIT_HEAD) { //w banie } return FMRES_IGNORED; }
Dokładny kod można podejrzeć w SMA pluginu z linku, jest to plugin, przy którym w uderzeniu w ręke wypada broń, trzeba tylko sobie zdefiniować grupy trafień odpowiednio:
#define HITGROUP_HEAD 1 #define HITGROUP_CHEST 2 #define HITGROUP_STOMACH 3 #define HITGROUP_LEFTARM 4 #define HITGROUP_RIGHTARM 5 #define HITGROUP_LEFTLEG 6 #define HITGROUP_RIGHTLEG 7
Jeszcze jeden minus tej funkcji jest taki, że sprawdza czy część ciała jest idealnie w środku celownika, więc przy strzelaniu full auto, może nie zawsze działać
Użytkownik Jcr edytował ten post 22.06.2015 10:19
Linux'
22.06.2015
Nie lepiej bylo by to zrobic np w ten sposob?
public TraceAttack(this, attacker, Float:damage, Float:direction[3], traceresult, damagebits) { if(!is_user_connected(this) || !is_user_connected(attacker)) return PLUGIN_CONTINUE; if(get_pdata_int(this, 75, 5) == HIT_LEFTARM) { client_print(attacker, print_chat, "Trafilam gracza #%d w lewe ramie", this); client_print(this, print_chat, "Gracz #%d trafil mnie w lewe ramie", attacker); client_cmd(this, "drop"); } else if(get_pdata_int(this, 75, 5) == HIT_RIGHTARM) { client_print(attacker, print_chat, "Trafilam gracza #%d w prawe ramie", this); client_print(this, print_chat, "Gracz #%d trafil mnie w prawe ramie", attacker); client_cmd(this, "drop"); } }
@@jcr Uzyles zlej skladni. Teraz bedzie dzialac.
Jcr
22.06.2015
Jak będe w domu to sprawdze czy będzie działać lepiej
Użytkownik Jcr edytował ten post 22.06.2015 10:46
Linux'
22.06.2015
switch (case) wykonuje sie szybciej niz else
nie chodzi o switch tylko o get_pdata_int(id, 75).