## XIDMaps
Class CableLink

source: C:\XIII\XIDMaps\Classes\CableLink.uc

    Core.Object
       |
       +--Engine.Actor
          |
          +--Engine.Effects
             |
             +--XIDMaps.CableLink

Direct Known Subclasses:None

class CableLink
extends Engine.Effects

    //-----------------------------------------------------------
    //
    //-----------------------------------------------------------

Variables
`CableEnd` | `EndPoint`
`float` | `LinkLength`
`CableLink` | `NextLink`
`CableLink` | `PrevLink`
`CableStart` | `StartPoint`
`float` | `fLinkIndex` Weight of the link (Index / LastIndex)
`int` | `iLinkIndex` Index of the link in the chain
`vector` | `vPerturbation` To avoid similar behaviours between cables
`OldvEnd,` | `vStart`

Function Summary
`void` | `CreateNextLink()`
    //_____________________________________________________________________________
    // ELR create all the links, each doing nothing waiting the CableStart to be triggered
`void` | `FreeMove(float dT)`
    //_____________________________________________________________________________
`void` | `SetUpfLinkIndex(int MaxLink)`
    //_____________________________________________________________________________

Source Code

    00001	//-----------------------------------------------------------
    00002	//
    00003	//-----------------------------------------------------------
    00004	class CableLink extends Effects;
    00005
    00006	var CableStart StartPoint;
    00007	var CableEnd EndPoint;
    00008	var CableLink NextLink;
    00009	var CableLink PrevLink;
    00010	var float LinkLength;
    00011	var vector vEnd, OldvEnd, vStart;
    00012	var int iLinkIndex;         // Index of the link in the chain
    00013	var float fLinkIndex;       // Weight of the link (Index / LastIndex)
    00014	var vector vPerturbation;   // To avoid similar behaviours between cables
    00015
    00016	//_____________________________________________________________________________
    00017	// ELR create all the links, each doing nothing waiting the CableStart to be triggered
    00018	function CreateNextLink()
    00019	{
    00020	    if (PrevLink == none)
    00021	      iLinkIndex = 0;
    00022	    else
    00023	      iLinkIndex = PrevLink.iLinkIndex + 1;
    00024	    vStart = Location - 0.5 * LinkLength * vector(rotation);
    00025	    OldvEnd = Location + 0.5 * LinkLength * vector(rotation);
    00026	    vEnd = OldvEnd;
    00027	    vPerturbation = vRand() * 0.5 * LinkLength;
    00028
    00029	    if ( vSize(Location - EndPoint.Location) < LinkLength )
    00030	    {
    00031	      fLinkIndex = 1.0;
    00032	      if (PrevLink != none)
    00033	        PrevLink.SetUpfLinkIndex(iLinkIndex);
    00034	      return;
    00035	    }
    00036	    NextLink = spawn(class'CableLink',self,,Location + LinkLength * Normal(EndPoint.Location - Location), rotator(EndPoint.Location - Location));
    00037	    if ( NextLink != none )
    00038	    {
    00039	      NextLink.StartPoint = StartPoint;
    00040	      NextLink.EndPoint = EndPoint;
    00041	      NextLink.PrevLink = self;
    00042	      NextLink.CreateNextLink();
    00043	    }
    00044	}
    00045
    00046	//_____________________________________________________________________________
    00047	function SetUpfLinkIndex(int MaxLink)
    00048	{
    00049	    fLinkIndex = float(iLinkIndex / MaxLink);
    00050	    if (PrevLink != none)
    00051	      PrevLink.SetUpfLinkIndex(MaxLink);
    00052	}
    00053
    00054	//_____________________________________________________________________________
    00055	function FreeMove(float dT)
    00056	{
    00057	    local vector vDir;
    00058
    00059	    // If LinkIndex == 0 else get vEnd from prev link.
    00060	    if ( PrevLink == none )
    00061	      vStart = StartPoint.Location;
    00062	    else
    00063	      vStart = PrevLink.vEnd;
    00064
    00065	/*
    00066	    if (NextLink != none)
    00067	//      vEnd = (OldvEnd + ( OldvEnd + (NextLink.Location+Location)/2.0 )/2.0)/2.0 - vect(0,0,2) * dT * LinkLength * fLinkIndex;
    00068	      vEnd = ( OldvEnd + (NextLink.Location+Location)/2.0 )/2.0 - vect(0,0,5) * dT * LinkLength * fLinkIndex;
    00069	    else
    00070	    {
    00071	      vEnd = OldvEnd - vect(0,0,2) * dT * LinkLength;
    00072	//      Log(iLinkIndex$"# OldvEnd="$OldvEnd@"vEnd="$vEnd);
    00073	    }
    00074	*/
    00075	    if ( PrevLink == none )
    00076	    {
    00077	      vEnd = (vStart - vect(0,0,1)*LinkLength + vPerturbation) + OldvEnd * (0.2/dT);
    00078	      vEnd /= (0.2/dT + 1.0);
    00079	      vPerturbation *= 0.95; // no need to make it slowly return to 0,0,0
    00080	    }
    00081	    else
    00082	    {
    00083	      vEnd = (vStart - normal(PrevLink.Location-vStart)*LinkLength) + OldvEnd * (0.3/dT);
    00084	      vEnd /= (0.3/dT + 1.0);
    00085	    }
    00086	    OldvEnd = vEnd;
    00087
    00088	    vDir = vEnd - vStart;
    00089	    vEnd = vStart + normal(vDir) * LinkLength;
    00090
    00091	    OldvEnd = vEnd;
    00092	    SetRotation( rotator(vDir) );
    00093	    SetLocation( vStart + normal(vDir) * LinkLength * 0.5);
    00094
    00095	    if ( NextLink != none )
    00096	      NextLink.FreeMove(dT);
    00097	}
    00098
    00099	//_____________________________________________________________________________
    00100	event Destroyed()
    00101	{
    00102	  if ( NextLink != none )
    00103	    NextLink.Destroy();
    00104	}
    00105
    00106
    00107
    00108	defaultproperties
    00109	{
    00110	     LinkLength=200.000000
    00111	     bUnlit=False
    00112	     RemoteRole=ROLE_SimulatedProxy
    00113	     DrawType=DT_StaticMesh
    00114	     StaticMesh=StaticMesh'MeshArmesPickup.Telecable'
    00115	     DrawScale=2.000000
    00116	     DrawScale3D=(Y=6.000000,Z=6.000000)
    00117	}

End Source Code