Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Jak sprawdzić, czy gracz został trafiony w danego hitboxa

hitbox bodyhit hit

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
20 odpowiedzi w tym temacie

#1 Jcr

    Pomocny

  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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


  • +
  • -
  • 0

#2 Alelluja

    Miszcz jotbe

  • Power User

Reputacja: 491
Wszechobecny

  • Postów:981
  • GG:
Offline

Napisano 19.06.2015 19:38

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

  • +
  • -
  • 0

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/<------


#3 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#4 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 20.06.2015 01:48

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

  • +
  • -
  • 0

#5 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#6 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

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?


  • +
  • -
  • 0

#7 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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)

 


  • +
  • -
  • 0

#8 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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


  • +
  • -
  • 0

#9 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 20.06.2015 16:54

Ajjjj, faktycznie, sorki...

 

A Ham_TraceAttack pre?


  • +
  • -
  • 0

#10 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

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

  • +
  • -
  • 0

#11 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#12 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

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

  • +
  • -
  • 0

#13 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 20.06.2015 17:43

RegisterHamPlayer(Ham_TraceAttack, "TraceAttack");

->

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

  • +
  • -
  • 0

#14 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#15 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

Napisano 21.06.2015 17:46

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


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

  • +
  • -
  • 0

#16 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#17 Linux'

    Pan Pomocny

  • Power User

Reputacja: 549
Wszechwiedzący

  • Postów:1 501
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:AmxMod i SourceMod
Offline

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.


  • +
  • -
  • 0

b35020692_qesnxqa.png


#18 Jcr

    Pomocny

  • Autor tematu
  • Użytkownik

Reputacja: -3
Nowy

  • Postów:69
  • Lokalizacja:Wroclaw
Offline

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

  • +
  • -
  • 0

#19 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 22.06.2015 11:11

switch (case) wykonuje sie szybciej niz else


  • +
  • -
  • 0

#20 Linux'

    Pan Pomocny

  • Power User

Reputacja: 549
Wszechwiedzący

  • Postów:1 501
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:AmxMod i SourceMod
Offline

Napisano 22.06.2015 12:17

switch (case) wykonuje sie szybciej niz else

 

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


  • +
  • -
  • 0

b35020692_qesnxqa.png






Również z jednym lub większą ilością słów kluczowych: hitbox, bodyhit, hit

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych