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
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Napisano 19.06.2015 19:16
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
Napisano 19.06.2015 19:38
Może by IF'em ?
Moje Pluginy | Paczki:
------> http://amxx.pl/topic...od/#entry687942 <------ 500 Postów 27.05.2015
------> http://amxx.pl/topic...monety-lombard/<------
------> http://amxx.pl/topic...-na-ammo-packi/<------
Napisano 19.06.2015 20:31
I wtedy starczy coś takiego?
if(HIT_RIGHTLEG) { speeds[id] = get_user_maxspeed(id) * 0.5; ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE"); }
Napisano 20.06.2015 01:48
if(get_pdata_int(id, 75) == HIT_RIGHTLEG) { //INDEX 'ID' DOSTAL W NOGE }
Napisano 20.06.2015 14:56
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
Napisano 20.06.2015 15:55
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?
Napisano 20.06.2015 16:11
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)
Napisano 20.06.2015 16:35
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
Napisano 20.06.2015 16:54
Ajjjj, faktycznie, sorki...
A Ham_TraceAttack pre?
Napisano 20.06.2015 17:06
#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
Napisano 20.06.2015 17:19
#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
Napisano 20.06.2015 17:38
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
Napisano 20.06.2015 17:43
RegisterHamPlayer(Ham_TraceAttack, "TraceAttack");
->
RegisterHam(Ham_TraceAttack, "player", "TraceAttack");
Napisano 20.06.2015 17:56
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
Napisano 21.06.2015 17:46
ok, poradziłem sobie, temat można zamknąć
Napisano 22.06.2015 10:18
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
Napisano 22.06.2015 10:25
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.
Napisano 22.06.2015 10:44
Jak będe w domu to sprawdze czy będzie działać lepiej
Użytkownik Jcr edytował ten post 22.06.2015 10:46
Napisano 22.06.2015 11:11
switch (case) wykonuje sie szybciej niz else
Inny
sklep SMS na serwer 1.6darmowy sklep sms z usługami z poziomu gry cs 1.6 Napisany przez KrwioPijca, 31.08.2016 ![]() |
|
![]() |
|||
Connect Sound 1.0Muzyka podczas wchodzenia na serwer Napisany przez Split, 30.07.2014 ![]() |
|
![]() |
0 użytkowników, 1 gości, 0 anonimowych