<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Wiremod.com Forums - Wiremod Addons</title>
		<link>http://www.wiremod.com/forum/</link>
		<description>Have you created a wiremod addon? Post it here.</description>
		<language>en</language>
		<lastBuildDate>Wed, 08 Sep 2010 17:03:34 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>http://www.wiremod.com/forum/images/vblue/misc/rss.png</url>
			<title>Wiremod.com Forums - Wiremod Addons</title>
			<link>http://www.wiremod.com/forum/</link>
		</image>
		<item>
			<title>Wire Socket Radio returns (once again)</title>
			<link>http://www.wiremod.com/forum/wiremod-addons/22340-wire-socket-radio-returns-once-again.html</link>
			<pubDate>Wed, 01 Sep 2010 19:05:11 GMT</pubDate>
			<description>I guess most of you know, that the WSR has been broken for a while, which was due to LuaSocket stopping to work. The long delay was mostly because...</description>
			<content:encoded><![CDATA[<div><!-- google_ad_section_start -->I guess most of you know, that the WSR has been broken for a while, which was due to LuaSocket stopping to work. The long delay was mostly because there was no suitable socket DLL to replace luasocket (and two more weeks of me getting too stuck with RL to realize there was a new one).<br />
<br />
But now (thanks to sebi99, having pointed me to <a href="http://www.facepunch.com/showthread.php?t=986055" target="_blank">LiteSocket</a>), the WSR should be once again up and functional.<br />
<br />
To get it working, update your WSR SVN (for those which don't have it, it's at <a href="http://subversion.assembla.com/svn/FreeFallProjects/Wire%20Socket%20Radio%20SingleDir" target="_blank">http://subversion.assembla.com/svn/FreeFallProjects/Wire Socket Radio SingleDir</a>). Then you need to copy Litesockets to your main lua dir to install it correctly. But before, make sure you got rid of LuaSocket. To do so, go into the gmod lua dir, then includes/modules, and delete the &quot;socket&quot; dir, &quot;socket.lua&quot; and &quot;gm_luasocket.dll&quot;. Then copy the &quot;includes&quot; dir from the SVN's lua dir over to your main gmod lua dir. And there you go, LiteSocket is installed correctly.<br />
<br />
I have been able to do some tests with a buddy of mine (Nikita on here), which showed the WSR to be working as well as it did before.<br />
<br />
So I'm somewhat happy it's back, and I would be happy to hear any kinds of comments, bugs you find, or projects you started with it.<br />
<br />
PS: For documentation check back on the main thread for it <a href="!11575!http://www.wiremod.com/forum/wiremod-addons/11575-wire-socket-radio-returns-re-v-3-a.html" target="_blank">here</a> (which got locked for some reason).<!-- google_ad_section_end --></div>

 ]]></content:encoded>
			<category domain="http://www.wiremod.com/forum/wiremod-addons/">Wiremod Addons</category>
			<dc:creator>Free Fall</dc:creator>
			<guid isPermaLink="true">http://www.wiremod.com/forum/wiremod-addons/22340-wire-socket-radio-returns-once-again.html</guid>
		</item>
		<item>
			<title>Unofficial Wiremod Extras Tools Tab Changer</title>
			<link>http://www.wiremod.com/forum/wiremod-addons/22339-unofficial-wiremod-extras-tools-tab-changer.html</link>
			<pubDate>Wed, 01 Sep 2010 13:58:09 GMT</pubDate>
			<description><![CDATA[For those who want it, attached is a .zip containing two programs for alternating between all UWSVN tools being placed under the "Wire" tab or under...]]></description>
			<content:encoded><![CDATA[<div><!-- google_ad_section_start -->For those who want it, attached is a .zip containing two programs for alternating between all UWSVN tools being placed under the &quot;Wire&quot; tab or under a new &quot;Wire - Unofficial&quot; Tab. The programs will NOT work while in-game. I hope this makes peoples lives easier.<br />
<br />
Help and support come to this forum, and I apologize in advance for any great delays in response by myself.<br />
<br />
WARNING!!! This has not been fully tested, it is simple enough and preliminary testing shows no problems. If a problem arises it is recommended you delete the folder mentioned in the README and re-download the SVN to replace the files.<br />
<br />
EDIT: Attachment updated to fix occasional bugs.<br />
<a href="http://www.wiremod.com/forum/attachments/wiremod-addons/8057-unofficial-wiremod-extras-tools-tab-changer-uwsvn_tabchanger.zip"  title="Name:  
Views: 
Size:  ">Attachment 8057</a><br />
<br />
Regards,<br />
Beowulf<!-- google_ad_section_end --></div>


	<div style="padding:10px">

	

	

	

	
		<fieldset class="fieldset">
			<legend>Attached Files</legend>
			<ul>
			<li>
	<img class="inlineimg" src="/zip.gif" alt="File Type: zip" />
	<a href="http://www.wiremod.com/forum/attachments/wiremod-addons/8057d1283430340-unofficial-wiremod-extras-tools-tab-changer-uwsvn_tabchanger.zip">UWSVN_TabChanger.zip</a> 
(8.0 KB)
</li> 
			</ul>
		</fieldset>
	

	</div>
 ]]></content:encoded>
			<category domain="http://www.wiremod.com/forum/wiremod-addons/">Wiremod Addons</category>
			<dc:creator>Beowulf</dc:creator>
			<guid isPermaLink="true">http://www.wiremod.com/forum/wiremod-addons/22339-unofficial-wiremod-extras-tools-tab-changer.html</guid>
		</item>
		<item>
			<title>Wired high-speed radio</title>
			<link>http://www.wiremod.com/forum/wiremod-addons/21976-wired-high-speed-radio.html</link>
			<pubDate>Fri, 13 Aug 2010 07:38:46 GMT</pubDate>
			<description><![CDATA[Image: http://www.garrysmod.org/img/?t=dll&id=107202  (http://www.garrysmod.org/downloads/?a=view&id=107202) 
 
This is a high-speed radio. You use...]]></description>
			<content:encoded><![CDATA[<div><!-- google_ad_section_start --><a href="http://www.garrysmod.org/downloads/?a=view&amp;id=107202" target="_blank"><img src="http://www.garrysmod.org/img/?t=dll&amp;id=107202" border="0" alt="" /></a><br />
<br />
This is a high-speed radio. You use it like any other high-speed device, but the memory is shared between every radio that is on the same channel.<br />
<br />
Notes:<ul><li>Each channel transmits 1024 fbytes.</li>
<li>A radio can be on up to 8 consecutive channels. Use the &quot;Num Channels&quot; input to change the number of channels.</li>
<li>Channel numbers can be any non-negative integers.</li>
</ul><!-- google_ad_section_end --></div>

 ]]></content:encoded>
			<category domain="http://www.wiremod.com/forum/wiremod-addons/">Wiremod Addons</category>
			<dc:creator>immibis</dc:creator>
			<guid isPermaLink="true">http://www.wiremod.com/forum/wiremod-addons/21976-wired-high-speed-radio.html</guid>
		</item>
		<item>
			<title><![CDATA[[E2] Tracing Systems]]></title>
			<link>http://www.wiremod.com/forum/wiremod-addons/21925-e2-tracing-systems.html</link>
			<pubDate>Mon, 09 Aug 2010 22:13:02 GMT</pubDate>
			<description><![CDATA[I have recently been working on a e2 extension for making a tracing system. 
 
What it does is give you functions to make "shapes" and then run...]]></description>
			<content:encoded><![CDATA[<div><!-- google_ad_section_start -->I have recently been working on a e2 extension for making a tracing system.<br />
<br />
What it does is give you functions to make &quot;shapes&quot; and then run traces to see if you hit them. It has a sharing system, which works just like datasignals. Set sharing to 0 and only your e2 can hit your shapes, set it to 1 and any of your e2s (which do not have sharing at 0) can hit your shapes, or set it to 2, and anyone with sharing set to 2 can hit your shapes (or any of your own e2 with sharing set to 1 or 2).<br />
<br />
The shapes is not entities, so normal traces wont hit them, and there is no collision issues with them. <b>Its just perfect for holo stuff!</b><br />
<br />
It has a convar (wire_shapes_max) to set max shapes per player, which defaults to 50.<br />
<br />
To make it easy to find the functions in e2-helper they got a prefix (ts, as in tracing system), except for data retrieval functions (instead search by the datatype xtd, as in tracedata) and the basic intersection functions (not really part of the system, but easyer to use if you only got one shape you want to trace with scope 0).<br />
<br />
<br />
The lua code needed (currently about 1500 lines):<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">/***********************************************************************************************************************<br />
Credits<br />
<br />
<br />
Feha - I am coding the stuff<br />
<br />
gmod lua wiki - they got a list of functions you can use.<br />
<br />
Inspired by the e2 extensions: holo, datasignals, gvars, entity and ranger.<br />
***********************************************************************************************************************/<br />
<br />
<br />
<br />
/****************************<br />
*****&nbsp; &nbsp;  Helper functions&nbsp; &nbsp;  *****<br />
****************************/<br />
<br />
--[<br />
local v = _R.Vector<br />
local Length = v.Length<br />
local Dot = v.Dot<br />
local Distance = v.Distance<br />
local sqrt = math.sqrt<br />
--]]<br />
<br />
local function E2VecToLuaVec( Vec )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Vector(Vec[1],Vec[2],Vec[3])<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function LuaVecToE2Vec( Vec )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (Vec) then return {Vec.x,Vec.y,Vec.z} end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return {0,0,0}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function E2AngToLuaAng( Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Angle(Ang[1],Ang[2],Ang[3])<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function LuaAngToE2Ang( Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (Ang) then return {Ang.p,Ang.y,Ang.r} end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return {0,0,0}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
//Default function make 1,0,0 have a length below 1<br />
local function Norm( Vec )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Vec / Length(Vec)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
<br />
/*********************************<br />
*****&nbsp; &nbsp;  Intersection functions&nbsp; &nbsp;  *****<br />
*********************************/<br />
<br />
local function RayPlaneIntersection( Start, Dir, Pos, Normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local A = Dot(Normal, Dir)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Check if the ray is aiming towards the plane (fail if it origin behind the plane, but that is checked later)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (A &lt; 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local B = Dot(Normal, Pos-Start)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Check if the ray origin in front of plane<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (B &lt; 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (Start + Dir * (B/A))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Check if the ray is parallel to the plane<br />
&nbsp; &nbsp; &nbsp; &nbsp; elseif (A == 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Check if the ray origin inside the plane<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Dot(Normal, Pos-Start) == 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function RayFaceIntersection( Start, Dir, Pos, Normal, Size, Rotation )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local hitPos = RayPlaneIntersection( Start, Dir, Pos, Normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; faceAngle = Normal:Angle()+Angle(0,0,Rotation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local localHitPos = WorldToLocal( hitPos, Angle(0,0,0), Pos, faceAngle )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local min = Size/-2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local max = Size/2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Because using Normal:Angle() for WorldToLocal() makes it think that axis is x, we need to use the local hitpos z as x.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (localHitPos.z &gt;= min.x and localHitPos.z &lt;= max.x) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (localHitPos.y &gt;= min.y and localHitPos.y &lt;= max.y) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local boxNormals = {<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(1,0,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(0,1,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(0,0,1),<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(-1,0,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(0,-1,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; Vector(0,0,-1)<br />
}<br />
local function RayAABBoxIntersection( Start, Dir, Pos, Size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Getting the sizes for the faces let us scale the box a lil.<br />
&nbsp; &nbsp; &nbsp; &nbsp; local boxSizes = {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.z,Size.y,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.z,Size.x,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.x,Size.y,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.z,Size.y,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.z,Size.x,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Vector(Size.x,Size.y,0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local closestDist<br />
&nbsp; &nbsp; &nbsp; &nbsp; local closestHitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; local closestNormal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for i=1,6 do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local normal = boxNormals[i]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local faceSize = boxSizes[i]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Dot(normal, Dir) &lt; 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local planePos = Pos + normal * (Size/2)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local HitPos = RayFaceIntersection( Start, Dir, planePos, normal, faceSize, 0 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (HitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local dist = Distance(HitPos, Start) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!closestDist or dist &lt; closestDist) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; closestDist = dist<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; closestHitPos = HitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; closestNormal = normal<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (closestHitPos) then return closestHitPos, closestNormal end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function RayOBBoxIntersection( Start, Dir, Pos, Size, Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //To use an oriented-bounding-box we make the ray local (so we can use the AABB code)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local localRayStart = WorldToLocal( Start, Angle(0,0,0), Pos, Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //The direction need to be local to 0,0,0 though<br />
&nbsp; &nbsp; &nbsp; &nbsp; local localRayDir = WorldToLocal( Dir, Angle(0,0,0), Vector(0,0,0), Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Use AABB code as that is easyer than calculating the normals of the faces and their angle aroudn that axis<br />
&nbsp; &nbsp; &nbsp; &nbsp; local localHitPos, localHitNormal = RayAABBoxIntersection( localRayStart, localRayDir, Vector(0,0,0), Size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //But we want the returned hitpos to be a world coord<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (localHitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos = LocalToWorld( localHitPos, Angle(0,0,0), Pos, Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitNormal = LocalToWorld( localHitNormal, Angle(0,0,0), Vector(0,0,0), Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hitPos, hitNormal<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function RayCircleIntersection( Start, Dir, Pos, Normal, Radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local HitPos = RayPlaneIntersection( Start, Dir, Pos, Normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (HitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local Dist = Distance(Pos, HitPos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Dist &lt; Radius) then return HitPos, Dist end<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function RaySphereIntersection( Start, Dir, Pos, Radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //New ray-sphere intersection code<br />
&nbsp; &nbsp; &nbsp; &nbsp; --[<br />
&nbsp; &nbsp; &nbsp; &nbsp; local A = 2 * Length(Dir)^2<br />
&nbsp; &nbsp; &nbsp; &nbsp; local B = 2 * Dot(Dir,Start - Pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local C = Length(Pos)^2 + Length(Start)^2 - 2 * Dot(Pos,Start) - Radius^2<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local BAC4 = B^2-(2*A*C)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (BAC4 &gt;= 0 and B &lt; 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Enter sphere<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Start + ((-sqrt(BAC4) - B) / A)*Dir<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Exits sphere<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //return Start + ((sqrt(BAC4) - B) / A)*Dir<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; --]]<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Old ray-sphere intersection code (slower)<br />
&nbsp; &nbsp; &nbsp; &nbsp; --[[<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Normal = Dir * -1<br />
&nbsp; &nbsp; &nbsp; &nbsp; local B = Normal:Dot(Pos-Start) / Normal:Dot(Dir)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //It is a ray, not line, for a line segment, just add a distance chek.<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (B &gt;= 0) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local HitPos = Start + Dir * B<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local Dist = Distance(Pos, HitPos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Dist &lt; Radius) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HitPos = HitPos - Dir * sqrt(Radius ^ 2 - Dist ^ 2)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return HitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; --]]<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ConeSphereIntersection( Start, Dir, Pos, Radius, Ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local HitPos = RaySphereIntersection( Start, Dir, Pos, Radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //If we hit with a normal trace we dont need to calculate for a cone<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (HitPos) then return HitPos, 0 end<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (Ang == 0) then return false end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Normal of the plane is -Dir because that makes the face perfectly perpendicular to the trace, and facing towards the origin<br />
&nbsp; &nbsp; &nbsp; &nbsp; HitPos = RayPlaneIntersection( Start, Dir, Pos, Dir * -1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!HitPos) then return false end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Calculate where on a circle would be closest to the plane hitpos<br />
&nbsp; &nbsp; &nbsp; &nbsp; HitPos = Pos + Norm(HitPos-Pos) * Radius<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Get angle between the vector we aim and vector to the circle &quot;hitpos&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; VecAng = math.Rad2Deg( math.acos( Dot( Norm(Dir), Norm(HitPos-Start) ) ) )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (VecAng &lt;= Ang) then return HitPos, VecAng end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return false<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
<br />
/************************<br />
*****&nbsp; &nbsp;  * functions&nbsp; &nbsp;  *****<br />
*************************/<br />
<br />
<br />
local playerAmount = {}<br />
local shapes = {}<br />
local sharing = {}<br />
<br />
CreateConVar(&quot;wire_shapes_max&quot;,&quot;50&quot;)<br />
local function ShapeCanCreate( ply )<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (playerAmount[ply] &lt; GetConVar(&quot;wire_shapes_max&quot;):GetInt()) then return true end<br />
end<br />
<br />
local function ShapeShare( share, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (share) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sharing[self.player][self.entity] = math.Clamp(share,0,2)<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
end<br />
<br />
<br />
local models = {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;plane&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;face&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;box&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;circle&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;sphere&quot;<br />
}<br />
<br />
local function ShapeCreate( index, model, radius, rotation, pos, normal, size, ang, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!table.HasValue( models, model )) then return &quot;Invalid model.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shapes[self.player][self.entity][index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerAmount[self.player] = playerAmount[self.player]+1<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Unmodifiable<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Index = index<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Entity = self.entity<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Owner = self.player<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Modifiable<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Model = model<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Radius = radius<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Rotation = rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Pos = pos<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Normal = normal<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Size = size<br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Ang = ang<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player][self.entity][index] = shape<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeModel( index, model, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!table.HasValue( models, model )) then return &quot;Invalid model.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Model = model<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeRadius( index, radius, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Radius = radius<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeRotation( index, rotation, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Rotation = rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapePos( index, pos, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Pos = shape.Parent.WorldToLocal(pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Pos = pos<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeAng( index, ang, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Ang = shape.Parent.WorldToLocal(ang)<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Ang = ang<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeNormal( index, normal, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Normal = WorldToLocal( normal, Angle(0,0,0), Vector(0,0,0), shape.Parent:GetAngles() )<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Normal = normal<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeSize( index, size, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Size = size<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeParent( index, parent, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Pos = parent:WorldToLocal(pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Ang = parent:WorldToLocalAngles(ang)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Normal = WorldToLocal( normal, Angle(0,0,0), Vector(0,0,0), parent:GetAngles() )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shape.Rotation = rotation //Work on<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; shape.Parent = parent<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeRemove( index, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local shape = shapes[self.player][self.entity][index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!shape) then return &quot;Invalid index.&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; playerAmount[self.player] = playerAmount[self.player]-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player][self.entity][index] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function ShapeClear( self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; for index,shape in pairs(shapes[self.player][self.entity]) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerAmount[self.player] = playerAmount[self.player]-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player][self.entity][index] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
end<br />
<br />
<br />
<br />
/***********************************<br />
*****&nbsp; &nbsp;  Ts intersection functions&nbsp; &nbsp;  *****<br />
***********************************/<br />
<br />
local function GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local parent = shape.Parent<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local pos = parent:LocalToWorld(shape.Pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local ang = parent:LocalToWorldAngles(shape.Ang)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local normal = LocalToWorld( shape.Normal, Angle(0,0,0), Vector(0,0,0), shape.Parent:GetAngles() )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local rotation = shape.Rotation //Work On<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Hit = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Index = shape.Index<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Radius = shape.Radius<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Rotation = rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Model = shape.Model<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.HitNormal = normal<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Size = shape.Size<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Pos = pos<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Ang = ang<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.Parent = shape.Parent<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.HitEntity = shape.Entity<br />
&nbsp; &nbsp; &nbsp; &nbsp; trace.HitOwner = shape.Owner<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
local function TsRayPlaneIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;plane&quot;) then <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos = RayPlaneIntersection( start, dir, pos, normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function TsRayFaceIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;face&quot;) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos = RayFaceIntersection( start, dir, pos, normal, shape.Size, rotation )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
local function TsRayBoxIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;box&quot;) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos, hitNormal = RayOBBoxIntersection( start, dir, pos, shape.Size, ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitNormal = hitNormal<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function TsRayCircleIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;circle&quot;) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos = RayCircleIntersection( start, dir, pos, normal, shape.Radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function TsRaySphereIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;sphere&quot;) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos = RaySphereIntersection( start, dir, pos, shape.Radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitNormal = Norm(hitPos - pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
local function TsRayIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local rayPlane = TsRayPlaneIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local rayFace = TsRayFaceIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local rayBox = TsRayBoxIntersection( start, dir, self)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local rayCircle = TsRayCircleIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local raySphere = TsRaySphereIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; table.Add(traces,rayPlane)<br />
&nbsp; &nbsp; &nbsp; &nbsp; table.Add(traces,rayFace)<br />
&nbsp; &nbsp; &nbsp; &nbsp; table.Add(traces,rayBox)<br />
&nbsp; &nbsp; &nbsp; &nbsp; table.Add(traces,rayCircle)<br />
&nbsp; &nbsp; &nbsp; &nbsp; table.Add(traces,raySphere)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
local function TsConeSphereIntersection( start, dir, angle, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; for ply,plyGates in pairs(shapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for gate,gateShapes in pairs(plyGates) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local continue = false<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If player is not same player who trace and e2's does not share with other players e2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ply ~= self.player and (sharing[ply][gate] ~= 2 or sharing[self.player][self.entity] ~= 2)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If e2 is not same as e2 that trace and e2 does not share at all<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (gate ~= self.entity and (sharing[ply][gate] == 0 or sharing[self.player][self.entity] == 0)) then continue = true end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!continue) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for k,shape in pairs(gateShapes) do<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Model == &quot;sphere&quot;) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local pos, ang, normal, rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (shape.Parent) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = GetWorldData(shape)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos, ang, normal, rotation = shape.Pos, shape.Ang, shape.Normal, shape.Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local hitPos, hitAngle = ConeSphereIntersection( start, dir, pos, shape.Radius, angle )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hitPos) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FillTraceData( trace, shape )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitAngle = hitAngle<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.StartPos = start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitPos = hitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace.HitNormal = Norm(hitPos - pos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.insert( traces, trace )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
<br />
/******************************<br />
*****&nbsp; &nbsp;  Retrieval functions&nbsp; &nbsp;  *****<br />
******************************/<br />
<br />
local function SortByDistance( traces, pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; table.sort(traces, function(a, b)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Distance(pos, a.HitPos) &lt; Distance(pos, b.HitPos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; end)<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return #traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function Count( traces )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return #traces<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
local function GetHit( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Hit<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitAngle( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].HitAngle<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitIndex( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Index<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitDistance( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local trace = traces[index]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Distance(trace.StartPos, trace.HitPos)<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitRadius( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Radius<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitRotation( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Rotation<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return 0<br />
end<br />
<br />
local function GetHitModel( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Model<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;&quot;<br />
end<br />
<br />
local function GetHitPos( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].HitPos<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitOrigin( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Pos<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitAng( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Ang<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitNormal( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].HitNormal<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitSize( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Size<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitParent( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].Parent<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitEntity( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].HitEntity<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
local function GetHitOwner( traces, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (traces[index]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return traces[index].HitOwner<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
end<br />
<br />
<br />
<br />
/************************<br />
*****&nbsp; &nbsp;  E2 Datatype&nbsp; &nbsp;  *****<br />
*************************/<br />
<br />
registerType(&quot;tracedata&quot;, &quot;xtd&quot;, {},<br />
&nbsp; &nbsp; &nbsp; &nbsp; nil,<br />
&nbsp; &nbsp; &nbsp; &nbsp; nil,<br />
&nbsp; &nbsp; &nbsp; &nbsp; function(retval)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if retval == nil then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if type(retval) ~= &quot;table&quot; then error(&quot;Return value is not a table, but a &quot;..type(retval)..&quot;!&quot;,0) end<br />
&nbsp; &nbsp; &nbsp; &nbsp; end,<br />
&nbsp; &nbsp; &nbsp; &nbsp; function(v)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return type(v) ~= &quot;table&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
)<br />
<br />
e2function tracedata operator=(tracedata lhs, tracedata rhs)<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.vars[lhs] = rhs<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.vclk[lhs] = true<br />
&nbsp; &nbsp; &nbsp; &nbsp; return rhs<br />
end<br />
<br />
e2function number operator_is(tracedata walker)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if walker then return 1 else return 0 end<br />
end<br />
<br />
<br />
<br />
/************************************<br />
*****&nbsp; &nbsp;  E2 Intersection functions&nbsp; &nbsp;  *****<br />
************************************/<br />
<br />
e2function vector rayPlaneIntersection( vector start, vector dir, vector pos, vector normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; normal = E2VecToLuaVec( normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RayPlaneIntersection( start, dir, pos, normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector rayFaceIntersection( vector start, vector dir, vector pos, vector normal, vector size, number ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; normal = E2VecToLuaVec( normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; size = E2VecToLuaVec( size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RayFaceIntersection( start, dir, pos, normal, size, ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector rayAABBoxIntersection( vector start, vector dir, vector pos, vector size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; size = E2VecToLuaVec( size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RayAABBoxIntersection( start, dir, pos, size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector rayOBBoxIntersection( vector start, vector dir, vector pos, vector size, angle ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; size = E2VecToLuaVec( size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; ang = E2AngToLuaAng( ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RayOBBoxIntersection( start, dir, pos, size, ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector rayCircleIntersection( vector start, vector dir, vector pos, vector normal, number radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; normal = E2VecToLuaVec( normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RayCircleIntersection( start, dir, pos, normal, radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector raySphereIntersection( vector start, vector dir, vector pos, number radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = RaySphereIntersection( start, dir, pos, radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
e2function vector coneSphereIntersection( vector start, vector dir, vector pos, number radius, number ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hitPos = ConeSphereIntersection( start, dir, pos, radius, ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec( hitPos )<br />
end<br />
<br />
<br />
<br />
/**************************<br />
*****&nbsp; &nbsp;  E2 * functions&nbsp; &nbsp;  *****<br />
**************************/<br />
<br />
e2function number tsShapeCanCreate( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetConVar(&quot;wire_shapes_max&quot;):GetInt() - playerAmount[self.player]<br />
end<br />
<br />
e2function void tsShapeShare( number share )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeShare( share, self )<br />
end<br />
<br />
e2function string tsShapeCreate( number index, string model, number radius, rotation, vector pos, vector normal, vector size, angle ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!ShapeCanCreate( self.player )) then return &quot;Limit reached&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; normal = E2VecToLuaVec( normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; size = E2VecToLuaVec( size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; ang = E2AngToLuaAng( ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeCreate( index, model, radius, rotation, pos, normal, size, ang, self )<br />
end<br />
<br />
e2function string tsShapeCreate( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!ShapeCanCreate( self.player )) then return &quot;Limit reached&quot; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeCreate( index, &quot;&quot;, 0, 0, Vector(0,0,0), Vector(0,0,0), Vector(0,0,0), Angle(0,0,0), self )<br />
end<br />
<br />
e2function string tsShapeModel( number index, string model )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeModel( index, model, self )<br />
end<br />
<br />
e2function string tsShapeRadius( number index, number radius )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeRadius( index, radius, self )<br />
end<br />
<br />
e2function string tsShapeRotation( number index, number rotation )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeRotation( index, rotation, self )<br />
end<br />
<br />
e2function string tsShapePos( number index, vector pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapePos( index, pos, self )<br />
end<br />
<br />
e2function string tsShapeAng( number index, angle ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; ang = E2AngToLuaAng( ang )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeAng( index, ang, self )<br />
end<br />
<br />
e2function string tsShapeNormal( number index, vector normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; normal = E2VecToLuaVec( normal )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeNormal( index, normal, self )<br />
end<br />
<br />
e2function string tsShapeSize( number index, vector size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; size = E2VecToLuaVec( size )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeSize( index, size, self )<br />
end<br />
<br />
e2function string tsShapeParent( number index, entity parent )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeParent( index, parent, self )<br />
end<br />
<br />
e2function string tsShapeRemove( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeRemove( index, self )<br />
end<br />
<br />
e2function void tsShapeClear( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ShapeClear( self )<br />
end<br />
<br />
<br />
<br />
/**************************************<br />
*****&nbsp; &nbsp;  E2 ts intersection functions&nbsp; &nbsp;  *****<br />
**************************************/<br />
<br />
e2function tracedata tsRayPlaneIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = TsRayPlaneIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsRayFaceIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces = TsRayFaceIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsRayBoxIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces =&nbsp; TsRayBoxIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsRayCircleIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces =&nbsp; TsRayCircleIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsRaySphereIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces =&nbsp; TsRaySphereIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsRayIntersection( vector start, vector dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces =&nbsp; TsRayIntersection( start, dir, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
e2function tracedata tsConeSphereIntersection( vector start, vector dir, number angle )<br />
&nbsp; &nbsp; &nbsp; &nbsp; start = E2VecToLuaVec( start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; dir = E2VecToLuaVec( dir )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local traces =&nbsp; TsConeSphereIntersection( start, dir, angle, self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SortByDistance( traces, start )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return traces<br />
end<br />
<br />
<br />
<br />
/*********************************<br />
*****&nbsp; &nbsp;  E2 Retrieval functions&nbsp; &nbsp;  *****<br />
*********************************/<br />
<br />
e2function number tracedata:sortByDistance( vector pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; pos = E2VecToLuaVec( pos )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return SortByDistance( this, pos )<br />
end<br />
<br />
e2function number tracedata:count( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return Count( this )<br />
end<br />
<br />
<br />
e2function number tracedata:hit( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHit( this, 1 )<br />
end<br />
<br />
e2function number tracedata:hit( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHit( this, index )<br />
end<br />
<br />
e2function number tracedata:hitAngle( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitAngle( this, 1 )<br />
end<br />
<br />
e2function number tracedata:hitAngle( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitAngle( this, index )<br />
end<br />
<br />
e2function number tracedata:index( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitIndex( this, 1 )<br />
end<br />
<br />
e2function number tracedata:index( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitIndex( this, index )<br />
end<br />
<br />
e2function number tracedata:distance( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitDistance( this, 1 )<br />
end<br />
<br />
e2function number tracedata:distance( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitDistance( this, index )<br />
end<br />
<br />
e2function number tracedata:radius( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitRadius( this, 1 )<br />
end<br />
<br />
e2function number tracedata:radius( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitRadius( this, index )<br />
end<br />
<br />
e2function number tracedata:rotation( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitRotation( this, 1 )<br />
end<br />
<br />
e2function number tracedata:rotation( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitRotation( this, index )<br />
end<br />
<br />
e2function string tracedata:model( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitModel( this, 1 )<br />
end<br />
<br />
e2function string tracedata:model( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitModel( this, index )<br />
end<br />
<br />
e2function vector tracedata:hitPos( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local hitPos = GetHitPos( this, 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(hitPos)<br />
end<br />
<br />
e2function vector tracedata:hitPos( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local hitPos = GetHitPos( this, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(hitPos)<br />
end<br />
<br />
e2function vector tracedata:pos( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local pos = GetHitOrigin( this, 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(pos)<br />
end<br />
<br />
e2function vector tracedata:pos( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local pos = GetHitOrigin( this, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(pos)<br />
end<br />
<br />
e2function angle tracedata:ang( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local ang = GetHitAng( this, 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaAngToE2Ang(ang)<br />
end<br />
<br />
e2function angle tracedata:ang( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local ang = GetHitAng( this, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaAngToE2Ang(ang)<br />
end<br />
<br />
e2function vector tracedata:hitNormal( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local hitNormal = GetHitNormal( this, 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(hitNormal)<br />
end<br />
<br />
e2function vector tracedata:hitNormal( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local hitNormal = GetHitNormal( this, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(hitNormal)<br />
end<br />
<br />
e2function vector tracedata:size( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local size = GetHitSize( this, 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(size)<br />
end<br />
<br />
e2function vector tracedata:size( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; local size = GetHitSize( this, index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return LuaVecToE2Vec(size)<br />
end<br />
<br />
e2function entity tracedata:parent( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitParent( this, 1 )<br />
end<br />
<br />
e2function entity tracedata:parent( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitParent( this, index )<br />
end<br />
<br />
e2function entity tracedata:entity( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitEntity( this, 1 )<br />
end<br />
<br />
e2function entity tracedata:entity( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitEntity( this, index )<br />
end<br />
<br />
e2function entity tracedata:owner( )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitOwner( this, 1 )<br />
end<br />
<br />
e2function entity tracedata:owner( number index )<br />
&nbsp; &nbsp; &nbsp; &nbsp; return GetHitOwner( this, index )<br />
end<br />
<br />
<br />
<br />
/*******************<br />
*****&nbsp; &nbsp;  Hooks&nbsp; &nbsp;  *****<br />
*******************/<br />
<br />
//When an e2 is spawned<br />
registerCallback(&quot;construct&quot;,function(self)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!sharing[self.player]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player] = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sharing[self.player] = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerAmount[self.player] = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player][self.entity] = {}<br />
&nbsp; &nbsp; &nbsp; &nbsp; sharing[self.player][self.entity] = 0<br />
end)<br />
<br />
//When an e2 is removed<br />
registerCallback(&quot;destruct&quot;,function(self)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (sharing[self.player][self.entity]) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShapeClear( self )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shapes[self.player][self.entity] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sharing[self.player][self.entity] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
end)<br />
<br />
<br />
//When player leaves, remove his shapes.<br />
hook.Add(&quot;PlayerDisconnected&quot;,&quot;playerdisconnected&quot;,function(ply)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (ply:IsValid() and ply:IsPlayer()) then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shapes[ply] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sharing[ply] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerAmount[ply] = nil<br />
&nbsp; &nbsp; &nbsp; &nbsp; end<br />
end)</code><hr />
</div> <br />
I have a demo e2 incase anyone would like to see example code:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">@name <br />
@inputs <br />
@outputs <br />
@persist <br />
@trigger <br />
<br />
if (first()) {<br />
&nbsp; &nbsp; runOnTick(1)<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; Size = vec(25,60,42)<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; holoCreate(1)<br />
&nbsp; &nbsp; holoScaleUnits(1,Size*1.04)<br />
&nbsp; &nbsp; holoAlpha(1,150)<br />
&nbsp; &nbsp; holoParent(1,entity())<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; holoCreate(2)<br />
&nbsp; &nbsp; holoModel(2,&quot;box&quot;)<br />
&nbsp; &nbsp; holoAlpha(2,200)<br />
&nbsp; &nbsp; holoColor(2,vec(0,0,255))<br />
&nbsp; &nbsp; holoScaleUnits(2,vec(5,2,2))<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; tsShapeShare(1)<br />
&nbsp; &nbsp; tsShapeCreate(1)<br />
&nbsp; &nbsp; tsShapeModel(1,&quot;box&quot;)<br />
&nbsp; &nbsp; tsShapePos(1,entity():pos())<br />
&nbsp; &nbsp; tsShapeAng(1,entity():angles())<br />
&nbsp; &nbsp; tsShapeSize(1,Size)<br />
&nbsp; &nbsp; tsShapeParent(1,entity())<br />
}<br />
<br />
XTD = tsRayIntersection(owner():shootPos(),owner():eye())<br />
holoPos(2,XTD:hitPos())<br />
holoAng(2,XTD:hitNormal():toAngle())</code><hr />
</div> <br />
<b>Documentation</b><br />
Setting the scope will also &quot;move&quot; the shapes you already created to the new scope.<br />
<br />
You can set propertys for shapes that does not really apply to them, such as size for planes.<br />
This wont mess anything up, but if you then trace and get size of the planes, you will get whatever you set it to.<br />
Can be used as extra variables for the shapes you might want other e2's to know, like when it was created.<br />
<br />
E2-helper documentation:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">if E2Helper then<br />
<br />
--Basic intersection functions<br />
E2Helper.Descriptions[&quot;rayPlaneIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a plane (pos, normal).&quot;<br />
E2Helper.Descriptions[&quot;rayFaceIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a face (pos, normal, size, rotation).&quot;<br />
E2Helper.Descriptions[&quot;rayAABBoxIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a axis aligned bounding box (pos, size).&quot;<br />
E2Helper.Descriptions[&quot;rayOBBoxIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a oriented&nbsp; bounding box (pos, size, angle).&quot;<br />
E2Helper.Descriptions[&quot;rayCircleIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a circle (pos, normal, radius).&quot;<br />
E2Helper.Descriptions[&quot;raySphereIntersection&quot;] = &quot;Return the position where a ray (start, dir) intersects with a sphere (pos, radius).&quot;<br />
E2Helper.Descriptions[&quot;coneSphereIntersection&quot;] = &quot;Return the position where a cone (start, dir, angle) intersects with a sphere (pos, radius).&quot;<br />
<br />
--Ts intersection functions<br />
E2Helper.Descriptions[&quot;tsRayPlaneIntersection&quot;] = &quot;Like rayPlaneIntersection() except it returns tracedata from all intersections with tracing system's planes&quot;<br />
E2Helper.Descriptions[&quot;tsRayFaceIntersection&quot;] = &quot;Like rayFaceIntersection() except it returns tracedata from all intersections with tracing system's faces&quot;<br />
E2Helper.Descriptions[&quot;tsRayBoxIntersection&quot;] = &quot;Like rayOBBoxIntersection() except it returns tracedata from all intersections with tracing system's boxes&quot;<br />
E2Helper.Descriptions[&quot;tsRayCircleIntersection&quot;] = &quot;Like rayOBBoxIntersection() except it returns tracedata from all intersections with tracing system's circles&quot;<br />
E2Helper.Descriptions[&quot;tsRaySphereIntersection&quot;] = &quot;Like raySphereIntersection() except it returns tracedata from all intersections with tracing system's spheres&quot;<br />
E2Helper.Descriptions[&quot;tsRayIntersection&quot;] = &quot;A ray trace that return tracedata from all intersections with tracing system's shapes&quot;<br />
E2Helper.Descriptions[&quot;tsConeSphereIntersection&quot;] = &quot;coneSphereIntersection() except it returns tracedata from all intersections with tracing system's spheres&quot;<br />
<br />
--Ts shape functions<br />
E2Helper.Descriptions[&quot;tsShapeCanCreate&quot;] = &quot;Returns how many shapes the player still can create.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeShare&quot;] = &quot;Sets the scope of the e2. Setting the scope determines what shapes the e2 can hit (and vice versa). Check the wiki (data signals) for more info about scopes.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeCreate&quot;] = &quot;Creates a shape. Can take alot of arguments, or just the index.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeModel&quot;] = &quot;Set the shape's model.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeRadius&quot;] = &quot;Set the shape's radius (spheres and circles).&quot;<br />
E2Helper.Descriptions[&quot;tsShapeRotation&quot;] = &quot;Set the shape's rotation (faces).&quot;<br />
E2Helper.Descriptions[&quot;tsShapePos&quot;] = &quot;Set the shape's position.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeAng&quot;] = &quot;Set the shape's angle.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeNormal&quot;] = &quot;Set the shape's normal (planes, faces and circles).&quot;<br />
E2Helper.Descriptions[&quot;tsShapeSize&quot;] = &quot;Set the shape's size (boxes).&quot;<br />
E2Helper.Descriptions[&quot;tsShapeParent&quot;] = &quot;Set the shape's parent.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeRemove&quot;] = &quot;Remove a shape.&quot;<br />
E2Helper.Descriptions[&quot;tsShapeClear&quot;] = &quot;Remove all shapes this e2 created.&quot;<br />
<br />
--Ts retrieval functions<br />
E2Helper.Descriptions[&quot;sortByDistance&quot;] = &quot;Sort the tracedata so hitpos of index 1 is closest to to vector. Returns the number of shapes in tracedata.&quot;<br />
E2Helper.Descriptions[&quot;count&quot;] = &quot;Return the number of shapes in tracedata.&quot;<br />
E2Helper.Descriptions[&quot;hit&quot;] = &quot;Returns if index exist in tracedata (same as index &lt;= xtd:count()).&quot;<br />
E2Helper.Descriptions[&quot;hitAngle&quot;] = &quot;Returns the angle between cone direction and direction to hitpos.&quot;<br />
E2Helper.Descriptions[&quot;index&quot;] = &quot;Returns the shape's index.&quot;<br />
E2Helper.Descriptions[&quot;distance&quot;] = &quot;Returns distance between hitpos and start of ray.&quot;<br />
E2Helper.Descriptions[&quot;radius&quot;] = &quot;Returns the shape's radius.&quot;<br />
E2Helper.Descriptions[&quot;rotation&quot;] = &quot;Returns the shape's rotation.&quot;<br />
E2Helper.Descriptions[&quot;model&quot;] = &quot;Returns the shape's model.&quot;<br />
E2Helper.Descriptions[&quot;hitPos&quot;] = &quot;Returns the position of where the shape got hit.&quot;<br />
E2Helper.Descriptions[&quot;pos&quot;] = &quot;Returns the shape's pos.&quot;<br />
E2Helper.Descriptions[&quot;ang&quot;] = &quot;Returns the shape's ang.&quot;<br />
E2Helper.Descriptions[&quot;hitNormal&quot;] = &quot;Returns the shape's normal.&quot;<br />
E2Helper.Descriptions[&quot;size&quot;] = &quot;Returns the shape's size.&quot;<br />
E2Helper.Descriptions[&quot;parent&quot;] = &quot;Returns the shape's parent.&quot;<br />
E2Helper.Descriptions[&quot;entity&quot;] = &quot;Returns the e2 that created the shape.&quot;<br />
E2Helper.Descriptions[&quot;owner&quot;] = &quot;Returns the owner that created the shape.&quot;<br />
<br />
end</code><hr />
</div> <br />
<b>Known bugs:</b><ul><li>Parenting faces does not affect the rotation around their axis.</li>
</ul><br />
<br />
If you find a bug, or got an idea, please tell me.<br />
Try to give me as much help to fix it though, such as posting console error (if there is any), or the e2 code that failed.<br />
<br />
<br />
Hope this will be usefull for people ;)<!-- google_ad_section_end --></div>

 ]]></content:encoded>
			<category domain="http://www.wiremod.com/forum/wiremod-addons/">Wiremod Addons</category>
			<dc:creator>feha</dc:creator>
			<guid isPermaLink="true">http://www.wiremod.com/forum/wiremod-addons/21925-e2-tracing-systems.html</guid>
		</item>
		<item>
			<title><![CDATA[[E2]HoloAnim Extension]]></title>
			<link>http://www.wiremod.com/forum/wiremod-addons/21920-e2-holoanim-extension.html</link>
			<pubDate>Mon, 09 Aug 2010 20:33:22 GMT</pubDate>
			<description>So on Unsmarts there were a few people making turrets with ungodly amounts of clip planes and they were off center regardless. This gave me an idea,...</description>
			<content:encoded><![CDATA[<div><!-- google_ad_section_start -->So on Unsmarts there were a few people making turrets with ungodly amounts of clip planes and they were off center regardless. This gave me an idea, allowing you to play animations (sequences) that props have built in. After about an hour I've got it working well. The video below is Divrans upgrading sentry, recorded by danking.<br />
<br />

<object class="restrain" type="application/x-shockwave-flash" width="640" height="385" data="http://www.youtube.com/v/dRapzkvDJn0">
	<param name="movie" value="http://www.youtube.com/v/dRapzkvDJn0" />
	<param name="wmode" value="transparent" />
	<!--[if IE 6]>
	<embed width="640" height="385" type="application/x-shockwave-flash" src="http://www.youtube.com/v/dRapzkvDJn0" />
	<![endif]--></object>
 <br />
<br />
To get this to work you must first overwrite the file in wire/lua/entities/gmod_wire_hologram/ called shared.lua with:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ENT.Type&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &quot;anim&quot;<br />
ENT.Base&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &quot;base_anim&quot;<br />
<br />
ENT.PrintName&nbsp; &nbsp; &nbsp;  = &quot;Wire Hologram&quot;<br />
ENT.Author&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &quot;McLovin, edited for animations by dlb&quot;<br />
<br />
ENT.Spawnable&nbsp; &nbsp; &nbsp;  = false<br />
ENT.AdminSpawnable&nbsp; = false<br />
<br />
ENT.AutomaticFrameAdvance = true<br />
<br />
--Taken from base_gmodentity--<br />
function ENT:SetPlayer( ply )<br />
&nbsp; &nbsp; &nbsp; &nbsp; self:SetVar( &quot;Founder&quot;, ply )<br />
&nbsp; &nbsp; &nbsp; &nbsp; self:SetVar( &quot;FounderIndex&quot;, ply:UniqueID() )<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; self:SetNetworkedString( &quot;FounderName&quot;, ply:Nick() )<br />
end<br />
<br />
function ENT:GetPlayer()<br />
&nbsp; &nbsp; &nbsp; &nbsp; return self:GetVar( &quot;Founder&quot;, NULL )<br />
end<br />
<br />
function ENT:Think()<br />
&nbsp; &nbsp; &nbsp; &nbsp; self:NextThink(CurTime())<br />
&nbsp; &nbsp; &nbsp; &nbsp; return true<br />
end</code><hr />
</div> and then in wire/lua/entities/gmod_wire_expression2/core/custom create a file called holoAnim with the following code:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">local CheckIndex = wire_holograms.CheckIndex<br />
<br />
local function SetHoloAnim( Holo, Animation, Frame, Rate )<br />
&nbsp; &nbsp; &nbsp; &nbsp; Holo.ent:ResetSequence(Animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; Holo.ent:SetCycle(Frame)<br />
&nbsp; &nbsp; &nbsp; &nbsp; Holo.ent:SetPlaybackRate(Rate)<br />
end<br />
<br />
<br />
e2function void holoAnim(index, string animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local Sequence = Holo.ent:LookupSequence(animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Sequence then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, Sequence, 0, 1)<br />
end<br />
<br />
e2function void holoAnim(index, string animation, frame)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local Sequence = Holo.ent:LookupSequence(animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Sequence then return end<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, Sequence, frame, 1)<br />
end<br />
<br />
e2function void holoAnim(index, string animation, frame, rate)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local Sequence = Holo.ent:LookupSequence(animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Sequence then return end<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, Sequence, frame, rate)<br />
end<br />
<br />
e2function void holoAnim(index, animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, animation, 0, 1)<br />
end<br />
<br />
e2function void holoAnim(index, animation, frame)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, animation, frame, 1)<br />
end<br />
<br />
e2function void holoAnim(index, animation, frame, rate)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHoloAnim(Holo, animation, frame, rate)<br />
end<br />
<br />
e2function number holoAnimLength(index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return 0 end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Holo.ent:SequenceDuration()<br />
end<br />
<br />
e2function number holoAnimNum(index, string animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return 0 end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; local Sequence = Holo.ent:LookupSequence(animation)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Sequence then return 0 end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Sequence<br />
end<br />
<br />
e2function void holoSetPose(index, string pose, value)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Holo.ent:SetPoseParameter( pose, value )<br />
end<br />
<br />
e2function number holoGetPose(index, string pose)<br />
&nbsp; &nbsp; &nbsp; &nbsp; local Holo = CheckIndex(self, index)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if not Holo then return end<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Holo.ent:GetPoseParameter( pose )<br />
end</code><hr />
</div> Then restart the server or your client(if you play singleplayer) and it should work. You need UWSVNs holoModel allowing any model so you can actually have models with animations.<br />
<br />
You should now have the following functions:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">holoAnim(index, string animation) - sets the animation of the holo to that of the string<br />
holoAnim(index, string animation, frame) - as above with start frame<br />
holoAnim(index, string animation, frame, rate) - as above with playback rate (1 is normal)<br />
<br />
holoAnim(index, string animation) - sets the animation of the holo to that of the number<br />
holoAnim(index, string animation, frame) - as above with start frame<br />
holoAnim(index, string animation, frame, rate) - as above with playback rate (1 is normal)<br />
<br />
holoAnimLength(index) - returns the length of the animation thats playing for the specified index<br />
holoAnimNum(index, string animation) - returns the number for that animation with the model of the holo specified<br />
<br />
holoSetPose(index, string pose, value) - sets the pose variable to that of value, for example you can set aim_yaw for a tf2 sentries rotation<br />
holoGetPose(index, string pose) - returns the value for the specified pose variable, for example aim_yaw on a tf2 sentry</code><hr />
</div> This e2 will cycle through the models animations, playing each one in full, you can wire a screen to the I output to get the anim numbers:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">@name HoloAnim Tester<br />
@outputs I<br />
<br />
if(first()){<br />
&nbsp; &nbsp; holoCreate(1)<br />
&nbsp; &nbsp; holoModel(1,&quot;models/dog.mdl&quot;)<br />
&nbsp; &nbsp; holoAnim(1,0)<br />
&nbsp; &nbsp; I++<br />
&nbsp; &nbsp; timer(&quot;changeanim&quot;,holoAnimLength(1)*1000)<br />
}<br />
if(clk(&quot;changeanim&quot;)){<br />
&nbsp; &nbsp; holoAnim(1,I)<br />
&nbsp; &nbsp; I++<br />
&nbsp; &nbsp; timer(&quot;changeanim&quot;,holoAnimLength(1)*1000)<br />
}</code><hr />
</div> Comments, critisism and advice below, thanks :D If you have a server that has this, leave a comment and I'll add it to the list.<br />
<br />
Credit to Cody for the idea, Flieboy for help finding the functions, Divran for testing and Danking for recording the video.<br />
<br />
Servers that have this addon:<br />
Unsmart's Wiremod Build Server - 89.238.160.112:27017<!-- google_ad_section_end --></div>

 ]]></content:encoded>
			<category domain="http://www.wiremod.com/forum/wiremod-addons/">Wiremod Addons</category>
			<dc:creator>ben1066</dc:creator>
			<guid isPermaLink="true">http://www.wiremod.com/forum/wiremod-addons/21920-e2-holoanim-extension.html</guid>
		</item>
	</channel>
</rss>
