dodanie expa graczu ktory skoczyl na glowe
Żuk
13.07.2019
Mam taki kod z alliedmodsow:
public OnCBasePlayer_PostThink( id ) { if( is_user_alive(id) ) { new Float:flFallVelocity = get_pdata_float(id, m_flFallVelocity) if( flFallVelocity > 10.0 ) { new target = pev(id, pev_groundentity) if( IsPlayer(target) && is_user_alive(target) ) { iExp[id] += gNumExp; // jak dodam to - to nic sie nie dzieje, nikt nic nie dostaje iExp[target] += gNumExp; // a to - gracz ktory zostal 'podeptany' dostaje expa i nie wiem jak to ugryzc;d // ExecuteHam(Ham_TakeDamage, target, id, id, flFallVelocity * 0.1, DMG_FALL) } } } }
kod jest stad:https://forums.allie... post connor'a)
potrzebuje dodac exp graczu ktory skoczyl drugiemu na glowe i nie zadal przy tym zadnego dmg
Użytkownik Żuk edytował ten post 13.07.2019 11:46
wonsz żeczny
13.07.2019
public forward_touch(toucher, touched) { if(!is_user_alive(toucher) || !is_user_alive(touched)) return; if(falling_speed[touched]) return; if(get_user_team(toucher) == get_user_team(touched)) return; new touched_origin[3], toucher_origin[3]; get_user_origin(touched, touched_origin); get_user_origin(toucher, toucher_origin); new Float:toucher_minsize[3], Float:touched_minsize[3]; pev(toucher,pev_mins,toucher_minsize); pev(touched,pev_mins,touched_minsize); if(touched_minsize[2] != -18.0) { if(!(toucher_origin[2] == touched_origin[2]+72 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+54 && toucher_minsize[2] == -18.0)) { return; } } else { if(!(toucher_origin[2] == touched_origin[2]+68 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+50 && toucher_minsize[2] == -18.0)) { return; } } if(is_user_alive(toucher) && is_user_alive(touched)) { iExp[toucher] += gNumExp; iExp[touched] += gNumExp; } } public forward_PlayerPreThink(id) { pev(id, pev_flFallVelocity, falling_speed[id]) }
Tylko, że jak stanie na głowie to stojąc na niej np. przez 5 sekund cały czas będzie dostawał expa, iExp[toucher] += gNumExp; to wykona się wtedy około 500 razy.
Myślę, że jakoś sobie poradzisz
Żuk
13.07.2019
ten kod jest z headsplasha wyciagniety:P tez mialem z nim pewien problem dlatego go olałem i szukałem innego rozwiązania
Żuk
16.07.2019
Jakoś tam sobie poradziłem, ale jeśli ma ktoś lepszy sposób na wykrycie skoku/ spadnięcia komuś na głowę (tak, że jeśli gracz na głowę skoczy to -> coś ale jeśli stoi -> stop dalszej czynności to byłbym wdzięczny.
wonsz żeczny
16.07.2019
Ja bym spróbował zrobić zmienną dotknal, jeśli dotknie to dotknal = true, i dać taska, który po 0.1 sekundy sprawdza czy gracz nadal dotyka, jeśli tak to dalej ustawiać dotknal = true a jeśli nie to dotknal = false.
na samym początku daj
if( dotknal[ toucher ] ) return;
i na końcu set_task i dotknal = false.
Robiin
16.07.2019
To może być overkill:
- Sprawdzaj czy gracz A podskoczył (np. używając flag),
- Sprawdzaj dotknięcie się dwóch entity o classname "player",
- Sprawdzaj wysokość gracza B i gracza A (jeśli A jest wyżej o wysokość bytu B, to przyjmijmy, że podskoczył mu nad głowę lub równo z nią)
Drugi sposób (zważając na to, że już do tej pory widzieliśmy taski co 0.1 sekundy z wykorzystaniem mnóstwa natywów i złożonych funkcji aby formatować tekst HUDu przy 32 graczach):
- Dla gracza, który się zrespi uruchom task co 0.1 sek.,
- Sprawdzaj dotknięcie się dwóch entity o classname "player",
- Sprawdzaj różnicę w wysokości graczy, których indeksy otrzymasz z eventu entity touch (podobnie do powyższego; jeśli A jest wyżej...),
- Sprawdzaj w tasku flagę FL_ONGROUND (jeśli dobrze pamiętam) - jeśli będzie ustawiona to znaczy, że gracz skaczący dotknął podłoża (więc tym samym nie może stać komuś na głowie)
Robiin
18.07.2019
Ok, do zamknięcia, z wszystkim jak na razie się uporałem
Warto powiedzieć w jaki sposób Ci się udało dla uniknięcia przyszłych tematów z tym samym problemem.
Żuk
20.07.2019
Na razie użyłem kodu z headsplasha + odpowiedni warunek i ustawienie zmiennej headjump:
if(touched_minsize[2] != -18.0) { if(!(toucher_origin[2] == touched_origin[2]+72 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+54 && toucher_minsize[2] == -18.0)) { headtest[toucher] = false; return; } } else { if(!(toucher_origin[2] == touched_origin[2]+68 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+50 && toucher_minsize[2] == -18.0)) { headjump[toucher] = false; return; } } if(headjump[toucher]) { return; } if(is_user_alive(touched)) { // tutaj kod headjump[toucher] = true; } }
Żuk
20.07.2019
f(!(toucher_origin[2] == touched_origin[2]+72 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+54 && toucher_minsize[2] == -18.0)) { headtest[toucher] = false; return; }
na
f(!(toucher_origin[2] == touched_origin[2]+72 && toucher_minsize[2] != -18.0) && !(toucher_origin[2] == touched_origin[2]+54 && toucher_minsize[2] == -18.0)) { headjump[toucher] = false; return; }
wkradl sie blad, juz brak edycji