←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Drzwi nie otwierane

  • +
  • -
Kmf!p - zdjęcie Kmf!p 14.03.2014

Siema.

mam cos takiego:

if(find_sphere_class(id, "func_wall", 200.0, entlist, 2))

1. czemu mi nie dziala to na drzwi na dd2 ? jak zrobic zeby sprawdzic czy w poblizu niema drzwi lub sciany. 

2. jak sprawdzic czy nad glowa gracza jest sufit lub czy gracz jest na zewnatrz budynku.

Odpowiedz

  • +
  • -
Klakier - zdjęcie Klakier 14.03.2014

Daj całą funkcję

Odpowiedz

  • +
  • -
Kmf!p - zdjęcie Kmf!p 14.03.2014

to cala ;P

 

new entlist[3];
if(find_sphere_class(id, "func_wall", 200.0, entlist, 2))
{
client_print(id, print_chat, "Jestes zbyt blisko sciany");
return PLUGIN_CONTINUE;
}

 

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 14.03.2014

ad 1. Drzwi nie są ścianą. Drzwi możesz wyłapać poprzez func_door (przesuwane) oraz func_door_rotating (obracane, skrzydłowe itp).

ad 2. idź w górę i szukaj sufitu, jeśli znajdziesz koniec mapy, a nie znajdziesz sufitu - gracz jest na otwartej przestrzeni. Może to niestety dawać fałszywe wyniki np na cs_italy w tunelu gdy gracz stoi pod świetlikiem, może to się różnie zachować. Innej metody nie ma, nie da się sprawdzić też czy gracz jest w zamkniętej przestrzeni/wewnątrz budynku itp.
Odpowiedz

  • +
  • -
Kmf!p - zdjęcie Kmf!p 14.03.2014

1. no wiem ze tamte drzwi moge wylapac tak, ale skoro te drzwi nie sa sciana to czym sa ? czy nie da sie tego przechwycic.

2. a jak znajde koniec mapy ? ale cos mi sie zdaje ze to sporo kodu bedzie tym sposobem wiec raczej odpada. mi bardziej chodzi czy np. nad glowa jest pusto w odleglosci X

3. to moze jest jakis sposob czy w promieniu X wokol gracza jest pusto. jak cos jest np. sciana to blokuje wykonanie sie funkcji.

 

moze kawalek jakiegos kodu co moglo by mi pomoc?

cos takiego znalazlem, ale jak to uzyc.

CONTENTS_EMPTY

Użytkownik Kmf!p edytował ten post 14.03.2014 19:34
Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^Grzyboo 14.03.2014

if(engfunc(EngFunc_PointContents, vOrigin) == CONTENTS_EMPTY)

To sprawdza czy dany punkt jest pusty. Tzn nie ma ściany, wody itd. Gracz i chyba wszystkie enty liczą się jako empty

 

Co do drzwi na dd2 to nie jest func_wall prawdopodobnie. Tylko po prostu ściana, a nie byt.

Odpowiedz

  • +
  • -
Kmf!p - zdjęcie Kmf!p 14.03.2014

ale jak to zastosowac? bo chyba tak nie da rady:

new Float:vOrigin[3];
pev(id, pev_origin, vOrigin);
if(engfunc(EngFunc_PointContents, vOrigin) != CONTENTS_EMPTY)
{
client_print(id, print_chat, "Jestes zbyt blisko");
return PLUGIN_CONTINUE;
}

mowisz dany punkt ale to sprawdza w promieniu czy po nacelowaniu?


Użytkownik Kmf!p edytował ten post 14.03.2014 20:39
Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^Grzyboo 14.03.2014

Dany punkt.

new const Float:g_fDist = 17.0;

public CheckAround(id)
{
	new Float:vOrigin[3], Float:vOriginNew[3];
	pev(id, pev_origin, vOrigin);
	
	vOriginNew[0] = vOrigin[0] + g_fDist;
	vOriginNew[1] = vOrigin[1];
	vOriginNew[2] = vOrigin[2];
	
	if(IsEmpty(vOrigin))
		return 1;
	
	vOriginNew[0] = vOrigin[0] - g_fDist;
	
	if(IsEmpty(vOrigin))
		return 1;
	
	vOriginNew[0] = vOrigin[0];
	vOriginNew[1] = vOrigin[1] + g_fDist;
	
	if(IsEmpty(vOrigin))
		return 1;
	
	vOriginNew[1] = vOrigin[1] - g_fDist;
	
	if(IsEmpty(vOrigin))
		return 1;
	
	return 0;
	
}

public bool:IsEmpty(Float:vOrigin[3])
	return bool:(engfunc(EngFunc_PointContents, vOrigin) == CONTENTS_EMPTY);
	

To sprawdzi mniej więcej okolicę wokół gracza. Funkcja CheckAround zwróci 1 jeśli gracz stoi centralnie przy ścianie (Dotyka ściany i ściana nie jest na ukos)

Odpowiedz

  • +
  • -
Kmf!p - zdjęcie Kmf!p 15.03.2014

poradzilem juz se znalazlem cos takiego mniej wiecej to samo:

 
new Float:origin[3];
entity_get_vector(id, EV_VEC_origin, origin);
if(!czyDuzoMiejsca(origin, 150.0))
{
client_print(id, print_center, "Zbyt waskie przejscie!");
return PLUGIN_CONTINUE;
}
czyDuzoMiejsca(const Float:vfPunkt[3], Float:odleglosc){
    new Float:vfStart[3], Float:vfEnd[3];
    
    vfStart[0] = vfEnd[0] = vfPunkt[0];
    vfStart[1] = vfEnd[1] = vfPunkt[1];
    vfStart[2] = vfEnd[2] = vfPunkt[2];
    
    //1
    vfStart[0] += odleglosc;
    vfEnd[0] -= odleglosc;

    if(engfunc( EngFunc_PointContents, vfStart ) != CONTENTS_EMPTY
    && engfunc( EngFunc_PointContents, vfEnd ) != CONTENTS_EMPTY)
        return 0;

    
    //2
    vfStart[0] -= odleglosc;
    vfEnd[0] += odleglosc;
    vfStart[1] += odleglosc;
    vfEnd[1] -= odleglosc;
    
    if(engfunc( EngFunc_PointContents, vfStart ) != CONTENTS_EMPTY
    && engfunc( EngFunc_PointContents, vfEnd ) != CONTENTS_EMPTY)
        return 0;

    return 1;
}
Odpowiedz