Raised This Month: $ Target: $400
 0% 

TraceRays - finding the floor from a position


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
FeuerSturm
AlliedModders Donor
Join Date: Apr 2004
Old 07-20-2009 , 11:15   Re: TraceRays - finding the floor from a position
Reply With Quote #1

you can use this if you're for example teleporting players and don't
want them to end up midair falling down the ground and die,
so you can directly teleport them on the ground.
FeuerSturm is offline
Machine
Senior Member
Join Date: Apr 2010
Old 06-27-2012 , 22:06   Re: TraceRays - finding the floor from a position
Reply With Quote #2

I was using this in a plugin of mine until I realized it was causing my l4d2 server to crash.

After investigating, I saw that the traceray was using up handles until all of them were filled up and weird things would happen.

It seems you need to CloseHandle all tracerays period. Doesn't even matter if its a global handle or not, it will even happen if you try to assign the same handle to another traceray and will use up addresses in memory.

This fixed it for me:
Code:
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); 
    } 
    CloseHandle(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); 
    }
    CloseHandle(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; 
    } 
}
Machine is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 18:24.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode