←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

dodanie expa graczu ktory skoczyl na glowe

  • +
  • -
Żuk - zdjęcie Ż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
Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie 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 :D

Odpowiedz

  • +
  • -
Żuk - zdjęcie Ż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

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 13.07.2019

trzeba zrobić taki timeout. podobnie jak rakiety w codmod

Odpowiedz

  • +
  • -
Żuk - zdjęcie Ż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.

Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie 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.

Odpowiedz

  • +
  • -
Żuk - zdjęcie Żuk 16.07.2019

sprawdze pod wieczor jak sie wyrobie :P

Odpowiedz

  • +
  • -
Robiin - zdjęcie 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)
Odpowiedz

  • +
  • -
Żuk - zdjęcie Żuk 18.07.2019

Ok, do zamknięcia, z wszystkim jak na razie się uporałem :)

Odpowiedz

  • +
  • -
Robiin - zdjęcie 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.

Odpowiedz

  • +
  • -
Żuk - zdjęcie Ż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;

	}

	
}

Odpowiedz

  • +
  • -
Żuk - zdjęcie Ż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

Odpowiedz