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, 0 gości, 0 anonimowych