Tak jak w temacie. Szukam funkcji, która umożliwi ustawienie, że gracza o danym ID można zabić tylko w głowę. Próbowałem już dwóch sposobów, ale żaden z nich nie działał. Z góry dzięki za pomoc.
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
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.
|
[ROZWIĄZANE] Gracza o danym ID można zabić tylko w głowę
Best Answer Gość_21977_* , 20.05.2014 17:35
RegisterHam(Ham_TraceAttack, "player", "Ham_TraceAttack_playerPre", 0);
public Ham_TraceAttack_playerPre( vid, // victim id // ofiara (moze nie byc graczem) id, // id // zabojca (jest graczem (klasa "player" przy RegisterHam) Float:damage, // obrazenia Float:dir[3], // wektor ataku tr, // trace result damagebits ){ if( is_user_alive(vid) // czy gracz żyje // && WARUNEK // vid == && damagebits & DMG_BULLET // czy obrażenia zadane pocikiem && get_tr2(tr, TR_iHitgroup) != HIT_HEAD // czy miejsce uderzenia to głowa ){ SetHamParamFloat(3, 0.0); // zmieniamy wartość obrażeń na 0 return HAM_HANDLED; // HANDLED! } return HAM_IGNORED; }
Edit.
damagebits & DMG_BULLETjest istotne z uwagi na możliwość zadania obrażeń "w głowę" przez upadek, kolizję, granat a nawet wybuchającą bombę (niestety, ale doświadczenie wymaga, by ten warunek dodać, dlatego szynka wydaje mi się tutaj lepszym rozwiązaniem). Go to the full post
#1
Posted 20.05.2014 16:09
#2
Posted 20.05.2014 17:01
Zabić czy zadac obrażenia to jest duża różnica? Bo mozna kogoś ubić by miał 1 hp (uderzając nie w głowę) ale go nie zabijać
Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!
Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują
#3
Posted 20.05.2014 17:03
Nie można zadawać obrażeń ani zabić gracza w inną część ciała niż głowa.
#4
Posted 20.05.2014 17:28
Czyli najzwyklejsze wyeliminowanie dmg. Nic prostszego.
public plugin_init() { /* . . .*/ register_forward(FM_TraceLine,"Tr"); } public Tr(Float:Start[3],Float:End[3],IM,id,tr) { if(!is_user_alive(id) || ~pev(id,pev_button) & IN_ATTACK) return FMRES_IGNORED; if(get_tr2(tr, TR_iHitgroup) != HIT_HEAD) return FMRES_SUPERCEDE return FMRES_IGNORED; }
Nigdy tym zbytnio się nie bawiłem bo nie miałem powodów ale raczej działa
Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!
Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują
#5 Gość_21977_*
Posted 20.05.2014 17:35 Best Answer
RegisterHam(Ham_TraceAttack, "player", "Ham_TraceAttack_playerPre", 0);
public Ham_TraceAttack_playerPre( vid, // victim id // ofiara (moze nie byc graczem) id, // id // zabojca (jest graczem (klasa "player" przy RegisterHam) Float:damage, // obrazenia Float:dir[3], // wektor ataku tr, // trace result damagebits ){ if( is_user_alive(vid) // czy gracz żyje // && WARUNEK // vid == && damagebits & DMG_BULLET // czy obrażenia zadane pocikiem && get_tr2(tr, TR_iHitgroup) != HIT_HEAD // czy miejsce uderzenia to głowa ){ SetHamParamFloat(3, 0.0); // zmieniamy wartość obrażeń na 0 return HAM_HANDLED; // HANDLED! } return HAM_IGNORED; }
Edit.
damagebits & DMG_BULLETjest istotne z uwagi na możliwość zadania obrażeń "w głowę" przez upadek, kolizję, granat a nawet wybuchającą bombę (niestety, ale doświadczenie wymaga, by ten warunek dodać, dlatego szynka wydaje mi się tutaj lepszym rozwiązaniem).
Edited by 21977, 20.05.2014 17:39.