Drzwi nie otwierane
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.
Kmf!p
14.03.2014
to cala
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; }
GwynBleidD
14.03.2014
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.
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
^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.
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
^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)
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; }