←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Odległość punktu od najbliższ...

Zablokowany

Gość_21977_* 23.02.2013

Jak można sprawdzić, jaka jest odległość punktu do najbliższej ściany?
Albo jak sprawdzić, czy sześcian o podanych wierzchołkach zawiera się w ścianie?

Docelowo, chcę przerobić Generator losowych spawnów, gdyż zdarza się, że losowane są
miejsca bardzo blisko ściany, przez co późniejszy box o wymiarach 50×50 jest częściowo w ścianie.

Próbowałem sprawdzić typ przestrzeni dla pobliskich punktów, lecz funkcja nie działa prawidłowo
stock wallCollision(Float:point[3]){
new Float:vec_add[10][3]={
{-50.0, -50.0, 50.0},
{-50.0, 0.0, 50.0},
{-50.0, 50.0, 50.0},
{0.0, -50.0, 50.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, 50.0},
{0.0, 50.0, 50.0},
{50.0, -50.0, 50.0},
{50.0, 0.0, 50.0},
{50.0, 50.0, 50.0}
};

for(new i, i<10; ++i){
new Float:vec[3];
for(new j, j<3; ++j){
vec[j]=point[j]+vec_add[i][j];
}
if(engfunc(EngFunc_PointContents, data)==CONTENTS_EMPTY){
continue;
}
break;
}

return (i==10);
}


Męczę się z tym i nie mogę znaleźć żadnych informacji, jak wykryć ścianę, może ktoś z Was wie, jak tego dokonać?
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 23.02.2013

Zamiast szukać odległości od najbliższej ściany możesz zrobić kilka traceline z punktów skrajnych i sprawdzac czy cały obszar traceline był pusty jednak jeżeli jest to obszar przeznaczony specjalnie dla gracza to możesz użyć tracehull
Odpowiedz

  • +
  • -
MarWit - zdjęcie MarWit 23.02.2013


stock findNearestWall( Float: fOrigin[ 3 ], Float: fReturn[ 3 ] )
{
new iTR = 0;
new Float: fDistance = 9999.0;
new Float: fEnd[ 3 ], Float: fDirection[ 3 ];

for( new Float: i = -180.0; i < 180.0; i += 10.0 )
{
fDirection[ 0 ] = 0.0; fDirection[ 1 ] = i; fDirection[ 2 ] = 0.0;
angle_vector( fDirection, 1, fDirection );
fDirection[ 0 ] *= 9999.0; fDirection[ 1 ] *= 9999.0;

engfunc( EngFunc_TraceLine, fOrigin, fDirection, IGNORE_MONSTERS, 0, iTR );
get_tr2( iTR, TR_vecEndPos, fEnd );
free_tr2( iTR );

if( vector_distance( fOrigin, fEnd ) < fDistance )
{
fReturn[ 0 ] = fEnd[ 0 ]; fReturn[ 1 ] = fEnd[ 1 ]; fReturn[ 2 ] = fEnd[ 2 ];
fDistance = vector_distance( fOrigin, fEnd );
}

}

return floatround( fDistance );
}
Odpowiedz

Gość_21977_* 02.03.2013

Dzięki wielkie, stock działa dokładnie tak, jak chciałem.
Odpowiedz

Gość_21977_* 02.03.2013

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, Dołączona grafika raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz
Zablokowany