PHP Code:
find_location_around_origin(Float:fOrigin[3], const Float:fMaxs[3], const Float:fMins[3], const Float:fDistance, const bool:bRandom=false, &Array:pArrayLocations = any:-1)
{
floor_origin(fOrigin, fOrigin);
fOrigin[2] += floatabs(fMins[2]);
static iTr2, Float:fTestOrigin[3], Float:fStart[3], Float:fEnd[3], Float:fYShift, Float:fXShift, i, d, iSafe;
static iOrder[][][3] =
{
{ { 0, 0, 1 }, { 0, 0, -1 } }, // Inner line
{ { 1, 1, 1 }, { 1, 1, -1 } }, // 4 square lines SIDES
{ { -1, -1, 1 }, { -1, -1, -1 } },
{ { -1, 1, 1 }, { -1, 1, -1 } },
{ { 1, -1, 1 }, { 1, -1, -1 } },
{ { 1, 1, 1 }, { -1, 1, 1 } }, // 4 square lines TOP
{ { 1, 1, 1 }, { 1, -1, 1 } },
{ { -1, -1, 1 }, { -1, 1, 1 } },
{ { -1, -1, 1 }, { 1, -1, 1 } },
{ { 1, 1, -1 }, { -1, 1, -1 } }, // 4 square lines BOTTOM
{ { 1, 1, -1 }, { 1, -1, -1 } },
{ { -1, -1, -1 }, { -1, 1, -1 } },
{ { -1, -1, -1 }, { 1, -1, -1 } },
{ { 1, 1, 1 }, { -1, 1, -1 } }, // front cross
{ { 1, 1, -1 }, { -1, 1, 1 } },
{ { 1, -1, 1 }, { -1, -1, -1 } }, // back cross
{ { 1, -1, -1 }, { -1, -1, 1 } },
{ { 1, 1, 1 }, { 1, -1, -1 } }, // right cross
{ { 1, 1, -1 }, { 1, -1, 1 } },
{ { -1, 1, 1 }, { -1, -1, -1 } }, // left cross
{ { -1, 1, -1 }, { -1, -1, 1 } },
{ { 1, 1, 1 }, { -1, -1, 1 } }, // up cross
{ { 1, -1, 1 }, { -1, 1, 1 } },
{ { 1, 1, -1 }, { -1, -1, -1 } }, // down cross
{ { 1, -1, -1 }, { -1, 1, -1 } }
};
fXShift = (fMaxs[0] - fMins[0]) ;
fYShift = (fMaxs[1] - fMins[1]) ;
const sizeofOrder = sizeof iOrder;
iTr2 = create_tr2();
fTestOrigin[1] = fOrigin[1] + fDistance;
fTestOrigin[2] = fOrigin[2];
static Float:fAngle, Float:fvBegin[3], Array:pTempArray=Invalid_Array;
if(bRandom || pArrayLocations != Array:-1)
{
pTempArray = ArrayCreate(3, 1);
}
while( floatabs(fTestOrigin[1] - fOrigin[1]) <= fDistance )
{
fAngle = floatasin( (fTestOrigin[1] - fOrigin[1]) / fDistance, degrees );
fvBegin[0] = floatcos(fAngle,degrees) * fDistance;
fvBegin[1] = floatsin(fAngle,degrees) * fDistance;
fTestOrigin[0] = fOrigin[0] + fvBegin[0];
while( get_distance_f(fTestOrigin, fOrigin) <= fDistance )
{
for( i = iSafe = 0; i < sizeofOrder; i++ )
{
for( d = 0; d < 3; d++ )
{
switch( iOrder[i][0][d] )
{
case -1: fStart[d] = fTestOrigin[d] + fMins[d];
case 0: fStart[d] = fTestOrigin[d];
case 1: fStart[d] = fTestOrigin[d] + fMaxs[d];
}
switch( iOrder[i][1][d] )
{
case -1: fEnd[d] = fTestOrigin[d] + fMins[d];
case 0: fEnd[d] = fTestOrigin[d];
case 1: fEnd[d] = fTestOrigin[d] + fMaxs[d];
}
}
// Traces...
engfunc(EngFunc_TraceLine, fStart, fEnd, DONT_IGNORE_MONSTERS, -1, iTr2);
if(get_tr2(iTr2, TR_pHit) == -1 && get_tr2(iTr2, TR_InOpen) && !get_tr2(iTr2, TR_StartSolid) && !get_tr2(iTr2, TR_AllSolid))
{
iSafe++;
}
}
if(iSafe >= sizeofOrder)
{
if(pTempArray == Invalid_Array)
{
xs_vec_copy(fTestOrigin, fOrigin);
free_tr2(iTr2);
return 1;
}
ArrayPushArray(pTempArray, fTestOrigin);
}
fTestOrigin[0] -= fXShift;
}
fTestOrigin[1] -= fYShift;
}
if(pTempArray != Invalid_Array)
{
if((i=ArraySize(pTempArray)) && bRandom)
{
ArrayGetArray(pTempArray, random(i), fOrigin);
}
if(pArrayLocations == any:-1)
{
ArrayDestroy(pTempArray);
}
else
{
pArrayLocations = pTempArray;
}
pTempArray = Invalid_Array;
free_tr2(iTr2);
return i;
}
free_tr2(iTr2);
return 0;
}