←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak sprawdzić, czy gracz został trafiony w...

  • +
  • -
Jcr - zdjęcie Jcr 19.06.2015

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 ;)

Odpowiedz

  • +
  • -
Alelluja - zdjęcie Alelluja 19.06.2015

Może by IF'em ?

  • /* Parts of body for hits */
  • #define HIT_GENERIC        0    /* none */
  • #define HIT_HEAD        1
  • #define HIT_CHEST        2
  • #define HIT_STOMACH        3
  • #define HIT_LEFTARM        4
  • #define HIT_RIGHTARM        5
  • #define HIT_LEFTLEG        6
  • #define HIT_RIGHTLEG        7
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 19.06.2015

I wtedy starczy coś takiego?

if(HIT_RIGHTLEG)
          {
                   speeds[id] = get_user_maxspeed(id) * 0.5;
                   ColorChat(id, RED, "[DEBUG]^x04 TRAFIENIE W NOGE");          
          }
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 20.06.2015

if(get_pdata_int(id, 75) == HIT_RIGHTLEG)
{
	//INDEX 'ID' DOSTAL W NOGE
}
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 20.06.2015

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
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 20.06.2015

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?

Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 20.06.2015

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)

 

Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 20.06.2015

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

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 20.06.2015

Ajjjj, faktycznie, sorki...

 

A Ham_TraceAttack pre?

Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 20.06.2015

#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
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 20.06.2015

#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
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 20.06.2015

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
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 20.06.2015

RegisterHamPlayer(Ham_TraceAttack, "TraceAttack");

->

RegisterHam(Ham_TraceAttack, "player", "TraceAttack");
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 20.06.2015

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
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 21.06.2015

ok, poradziłem sobie, temat można zamknąć


GwynBleidD (22.06.2015 07:40):
Prosimy w takim razie o rozwiązanie.
Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 22.06.2015

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
Odpowiedz

  • +
  • -
Linux' - zdjęcie Linux' 22.06.2015

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.

Odpowiedz

  • +
  • -
Jcr - zdjęcie Jcr 22.06.2015

Jak będe w domu to sprawdze czy będzie działać lepiej


Użytkownik Jcr edytował ten post 22.06.2015 10:46
Odpowiedz

  • +
  • -
Asiap - zdjęcie Asiap 22.06.2015

switch (case) wykonuje sie szybciej niz else

Odpowiedz

  • +
  • -
Linux' - zdjęcie Linux' 22.06.2015

switch (case) wykonuje sie szybciej niz else

 

nie chodzi o switch tylko o get_pdata_int(id, 75).

Odpowiedz