labelmaker
04-04-2009, 06:50
I stayed up all night figuring this one out. Just how do you find the floor from a position. Well Ive got your answer. :mrgreen:
As you can see angles are not x,y,z. Its actually pitch,yaw,roll
new Float:pos[3];
new Float:floor[3];
new Float:ceiling[3];
new Float:direction[3];
new Handle:trace;
new Float:totalHeight;
for(new i = 0; i < 11; ++i)
{
pos[0] = GetRandomFloat(MapX[0],MapX[1]);
pos[1] = GetRandomFloat(MapY[0],MapY[1]);
pos[2] = GetRandomFloat(MapZ[0],MapZ[1]);
direction[0] = 89.0;//thats right you'd think its a z value - this will point you down
trace = TR_TraceRayEx(pos, direction,MASK_PLAYERSOLID_BRUSHONLY, RayType_Infinite);
if(TR_DidHit(trace))
{
TR_GetEndPosition(floor, trace);
}
direction[0] = -89.0;//this will point you up
trace = TR_TraceRayEx(pos, direction,MASK_PLAYERSOLID_BRUSHONLY, RayType_Infinite);
if(TR_DidHit(trace))
{
TR_GetEndPosition(ceiling, trace);
}
//I find the height below to prevent players from becoming stuck
if (ceiling[2] < 0 && floor[2] < 0)
{
totalHeight = FloatAbs(ceiling[2]) - FloatAbs(floor[2]);
}
else if (ceiling[2] > 0 && floor[2] > 0)
{
totalHeight = ceiling[2] - floor[2];
}
else
{
totalHeight = FloatAbs(ceiling[2]) + FloatAbs(floor[2]);
}
if (FloatAbs(totalHeight) > 75.0)
{
pos[2] = floor[2] + 20;//once again keep those players out of the dirt
i = 11;
}
}
As you can see angles are not x,y,z. Its actually pitch,yaw,roll
new Float:pos[3];
new Float:floor[3];
new Float:ceiling[3];
new Float:direction[3];
new Handle:trace;
new Float:totalHeight;
for(new i = 0; i < 11; ++i)
{
pos[0] = GetRandomFloat(MapX[0],MapX[1]);
pos[1] = GetRandomFloat(MapY[0],MapY[1]);
pos[2] = GetRandomFloat(MapZ[0],MapZ[1]);
direction[0] = 89.0;//thats right you'd think its a z value - this will point you down
trace = TR_TraceRayEx(pos, direction,MASK_PLAYERSOLID_BRUSHONLY, RayType_Infinite);
if(TR_DidHit(trace))
{
TR_GetEndPosition(floor, trace);
}
direction[0] = -89.0;//this will point you up
trace = TR_TraceRayEx(pos, direction,MASK_PLAYERSOLID_BRUSHONLY, RayType_Infinite);
if(TR_DidHit(trace))
{
TR_GetEndPosition(ceiling, trace);
}
//I find the height below to prevent players from becoming stuck
if (ceiling[2] < 0 && floor[2] < 0)
{
totalHeight = FloatAbs(ceiling[2]) - FloatAbs(floor[2]);
}
else if (ceiling[2] > 0 && floor[2] > 0)
{
totalHeight = ceiling[2] - floor[2];
}
else
{
totalHeight = FloatAbs(ceiling[2]) + FloatAbs(floor[2]);
}
if (FloatAbs(totalHeight) > 75.0)
{
pos[2] = floor[2] + 20;//once again keep those players out of the dirt
i = 11;
}
}