I recently made this function, hopefully it will be helpful, it does scan for an empty space to spawn the NPC, i was wondering if its possible to add a feature to scan randomly ?
PHP Code:
find_location_around_origin(Float:fOrigin[3], Float:fMaxs[3], Float:fMins[3], Float:fDistance)
{
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];
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)
{
xs_vec_copy(fTestOrigin, fOrigin);
free_tr2(iTr2);
return 1;
}
fTestOrigin[0] -= fXShift;
}
fTestOrigin[1] -= fYShift;
}
free_tr2(iTr2);
return 0;
}