Author Topic: AutoRoad Fix: Help Wanted  (Read 572 times)

Hi, im trying to get the good old autoroad fixed, because when you place two of em next to each other, they make the straight road brick, but dont rotate to meet the ends of the roads.  How could I fix that?

Heres the whole thing minus the RTB prefs.
Quote
//Main Script
package ExclamationPoint_AutoRoad
{
   //Default Script Overwrite
   function FXDtsBrick::OnAdd(%this)
   {
      parent::OnAdd(%this);
      %this.schedule(1,AutoRoad_Eval);
   }
   function FXDtsBrick::onDeath(%this)
   {
      InitContainerBoxSearch(%this.getPosition(),"16 1 0.1",$TypeMasks::FXBrickObjectType);
      while(isObject(%brick = containerSearchNext()))
      {
         if(!%brick.isDead() && %brick.isAutoRoad && %brick.isPlanted() && getSubStr(%brick.getDatablock().getName(),0,15) $= "Brick32x32FRoad")
         {
            %x1 = mFloatLength(getWord(%this.getPosition(),0),1);
            %y1 = mFloatLength(getWord(%this.getPosition(),1),1);
            %z1 = mFloatLength(getWord(%this.getPosition(),2),1);
            %x2 = mFloatLength(getWord(%brick.getPosition(),0),1);
            %y2 = mFloatLength(getWord(%brick.getPosition(),1),1);
            %z2 = mFloatLength(getWord(%brick.getPosition(),2),1);
            if(%z1 == %z2 && %y1 == %y2 && %x1 != %x2)
               %brick.schedule(1,AutoRoad_Check);
         }
      }
      InitContainerBoxSearch(%this.getPosition(),"1 16 0.1",$TypeMasks::FXBrickObjectType);
      while(isObject(%brick = containerSearchNext()))
      {
         if(!%brick.isDead() && %brick.isAutoRoad &&%brick.isPlanted() && getSubStr(%brick.getDatablock().getName(),0,15) $= "Brick32x32FRoad")
         {
            %x1 = mFloatLength(getWord(%this.getPosition(),0),1);
            %y1 = mFloatLength(getWord(%this.getPosition(),1),1);
            %z1 = mFloatLength(getWord(%this.getPosition(),2),1);
            %x2 = mFloatLength(getWord(%brick.getPosition(),0),1);
            %y2 = mFloatLength(getWord(%brick.getPosition(),1),1);
            %z2 = mFloatLength(getWord(%brick.getPosition(),2),1);
            if(%z1 == %z2 && %x1 == %x2 && %y1 != %y2)
               %brick.schedule(1,AutoRoad_Check);
         }
      }
      parent::onDeath(%this);
   }
   
   //Script Base
   function AutoRoad_ChangeRoad(%this,%type,%dir,%ctrlz)
   {
      if(!isObject(%this))
         return;
      if(%this.numEvents > 0)
         for(%i = 0; %i < %this.numEvents; %i++)
         {
            %EventEnabled[%i] = %this.eventEnabled[%i];
            %EventInputIDx[%i] = %this.eventInputIDx[%i];
            %EventInput[%i] = %this.eventInput[%i];
            %EventDelay[%i] = %this.eventDelay[%i];
            %EventTargetIDx[%i] = %this.eventTargetIDx[%i];
            %EventTarget[%i] = %this.eventTarget[%i];
            %EventNT[%i] = %this.eventNT[%i];
            %EventOutputIDx[%i] = %this.eventOutputIDx[%i];
            %EventOutput[%i] = %this.eventOutput[%i];
            %EventOutputAppendClient[%i] = %this.eventOutputAppendClient[%i];
            %EventOutputParameter[%i,1] = %this.eventOutputParameter[%i,1];
            %EventOutputParameter[%i,2] = %this.eventOutputParameter[%i,2];
            %EventOutputParameter[%i,3] = %this.eventOutputParameter[%i,3];
            %EventOutputParameter[%i,4] = %this.eventOutputParameter[%i,4];
            %EventOutputParameter[%i,5] = %this.eventOutputParameter[%i,5];
            %EventOutputParameter[%i,6] = %this.eventOutputParameter[%i,6];
         }
      if(%this.Item > 0)
      {
         %Item =  %this.Item.getDatablock();
         %ItemPosition = %this.ItemPosition;
         %ItemDirection = %this.ItemDirection;
         %ItemRespawnTime = %this.ItemRespawnTime;
      }
      if(getSubStr(%this.getName(),"_",1)$="_")
         %NTObjectName = %this.getName();
      if(%this.Light > 0)
         %Light = %this.light.getDatablock();
      if(%this.Emitter > 0)
      {
         %EmitterDatablock = %this.Emitter.getEmitterDatablock();
         %EmitterDirection = %this.EmitterDirection;
      }
      %AngleID = %dir;
      %Position = %this.getPosition();
      %Rotation = IDtoRot(%AngleID);
      %ColorID = %this.getColorID();
      %ColorFXID = %this.getColorFXID();
      %ShapeFXID = %this.getShapeFXID();
      %Raycasting = %this.isRayCasting();
      %Colliding = %this.isColliding();
      %Rendering = %this.isRendering();
      if(!%RayCasting && !%Colliding && !%Rendering)
         return;
      %datablock = "Brick32x32FRoadAuto" @ %type @ "Data";
      %brick = new fxDtsBrick()
      {
         datablock = %dataBlock.getID();
         isPlanted = 1;
         isBaseplate = 0;
      };
      %brick.setRayCasting(%Raycasting);
      %brick.setColliding(%Colliding);
      %brick.setRendering(%Rendering);
      %brick.setColor(%ColorID);
      %brick.setColorFX(%ColorFXID);
      %brick.setPrint(%PrintID);
      %brick.setShapeFX(%ShapeFXID);
      %client = %this.getGroup().client;
      %this.getGroup().add(%brick);
      %brick.stackBL_ID = %this.getGroup().bl_ID;
      %brick.setNTOBjectName("");
      %null = %this.getID();
      %brick.setTrusted(1);
      %this.explode();
      %brick.setTransform(%Position SPC %Rotation);
      if(%i > 0)
         for(%j = 0; %j < %i; %j++)
         {
            %brick.EventInputIDx[%j] = %EventInputIDx[%j];
            %brick.EventInput[%j] = %EventInput[%j];
            %brick.EventDelay[%j] = %EventDelay[%j];
            %brick.EventTargetIDx[%j] = %EventTargetIDx[%j];
            %brick.EventTarget[%j] = %EventTarget[%j];
            %brick.EventNT[%j] = %EventNT[%j];
            %brick.EventOutputIDx[%j] = %EventOutputIDx[%j];
            %brick.EventOutput[%j] = %EventOutput[%j];
            %brick.EventOutputAppendClient[%j] = %EventOutputAppendClient[%j];
            %brick.EventOutputParameter[%j,1] = %EventOutputParameter[%j,1];
            %brick.EventOutputParameter[%j,2] = %EventOutputParameter[%j,2];
            %brick.EventOutputParameter[%j,3] = %EventOutputParameter[%j,3];
            %brick.EventOutputParameter[%j,4] = %EventOutputParameter[%j,4];
            %brick.EventOutputParameter[%j,5] = %EventOutputParameter[%j,5];
            %brick.EventOutputParameter[%j,6] = %EventOutputParameter[%j,6];
            %brick.numEvents++;
            %brick.setEventEnabled(%j,%EventEnabled[%j]);
         }
      if(%Item)
      {
         %brick.setItem(%Item);
         %brick.setItemPosition(%ItemPosition);
         %brick.setItemDirection(%ItemDirection);
         %brick.setItemRespawnTime(%ItemRespawnTime);
      }
      if(strLen(%NTObjectName))
         %brick.setNTObjecTName(%NTObjectName);
      if(%Light)
         %brick.setLight(%Light);
      if(%EmitterDatablock)
      {
         %brick.setEmitter(%EmitterDatablock);
         %brick.setEmitterDirection(%EmitterDirection);
      }
      if(%NTObjectName)
         %brick.setNTObjecTName(%NTObjectName);
      %brick.plant();
      if(isObject(%client))
         if(%ctrlz)
         {   %client.undoStack.head--;
            %client.undoStack.val[%client.undoStack.head] = %brick TAB "PLANT";
            %client.undoStack.head++;
         }
         else
         {
            for(%j = 0; %j < %client.undoStack.size; %j++)
               if(getField(%client.undoStack.val[%j],0) $= %null)
                  %client.undoStack.val[%j] = %brick TAB "PLANT";
         }
      %brick.schedule(3,AutoRoad_Set,1);
   }
   function AutoRoad_UpdateAll()
   {
      centerPrintAll("\c3!\c2AutoRoad\c6: Updating AutoRoads...",5,2);
      for(%i = 0; %i < MainBrickGroup.getCount(); %i++)
      {
         %subBrickGroup = MainBrickGroup.getObject(%i);
         for(%j = 0; %j < %subBrickGroup.getCount(); %j++)
            if(getSubStr(%subBrickGroup.getObject(%j).getDatablock().getName(),0,19) $= "Brick32x32FRoadAuto")
               if($ExclamationPoint::AutoRoad::AdminOnly)
               {
                  if(%subBrickGroup.client.isAdmin || %subBrickGroup.client.isSuperAdmin)
                     %subBrickGroup.getObject(%j).AutoRoad_Check();
               }
               else
                  %subBrickGroup.getObject(%j).AutoRoad_Check();
      }
   }
   function FXDtsBrick::AutoRoad_Check(%this,%lvl)
   {
      if(getSubStr(%this.getDatablock().getName(),0,15) $= "Brick32x32FRoad")
      {
         if(%this.isPlanted() && !%this.beingDuped)
         {
            InitContainerBoxSearch(%this.getPosition(),"1 16 0.1",$TypeMasks::FXBrickObjectType);
            while(isObject(%brick = containerSearchNext()))
            {
               if(!%brick.isDead() && %brick != %this && %brick.isPlanted() && getTrustLevel(%brick,%this) >= $ExclamationPoint::AutoRoad::TrustRequirement && getSubStr(%brick.getDatablock().getName(),0,15) $= "Brick32x32FRoad")
               {
                  %x1 = mFloatLength(getWord(%this.getPosition(),0),1);
                  %y1 = mFloatLength(getWord(%this.getPosition(),1),1);
                  %z1 = mFloatLength(getWord(%this.getPosition(),2),1);
                  %x2 = mFloatLength(getWord(%brick.getPosition(),0),1);
                  %y2 = mFloatLength(getWord(%brick.getPosition(),1),1);
                  %z2 = mFloatLength(getWord(%brick.getPosition(),2),1);
                  if(%z1 == %z2 && %x1 == %x2 && %y1 != %y2)
                  {
                     if(%y1 < %y2)
                        %brick0 = %brick;
                     else if(%y1 > %y2)
                        %brick2 = %brick;
                  }
               }
            }
            %pos = "";
            InitContainerBoxSearch(%this.getPosition(),"16 1 0.1",$TypeMasks::FXBrickObjectType);
            while(isObject(%brick = containerSearchNext()))
            {
               if(!%brick.isDead() && %brick != %this && %brick.isPlanted() && getTrustLevel(%brick,%this) >= $ExclamationPoint::AutoRoad::TrustRequirement && getSubStr(%brick.getDatablock().getName(),0,15) $= "Brick32x32FRoad")
               {
                  %x1 = mFloatLength(getWord(%this.getPosition(),0),1);
                  %y1 = mFloatLength(getWord(%this.getPosition(),1),1);
                  %z1 = mFloatLength(getWord(%this.getPosition(),2),1);
                  %x2 = mFloatLength(getWord(%brick.getPosition(),0),1);
                  %y2 = mFloatLength(getWord(%brick.getPosition(),1),1);
                  %z2 = mFloatLength(getWord(%brick.getPosition(),2),1);
                  if(%z1 == %z2 && %x1 != %x2 && %y1 == %y2)
                  {   
                     if(%x1 < %x2)
                        %brick1 = %brick;
                     else if(%x1 > %x2)
                        %brick3 = %brick;
                  }
               }
            }
            for(%i = 0; %i <= 3;%i++)
            {
               %k++;
               %k[%i] = 0;
               if(isObject(%brick[%i]))
               {
                  if(getSubStr(%brick[%i].getDatablock().getName(),0,19) $= "Brick32x32FRoadAuto" && %lvl)
                     %brick[%i].schedule(3,AutoRoad_Check);
                  switch$(%brick[%i].getDatablock().getName())
                  {
                     case "Brick32x32FRoadTData":
                        if(%i != %brick[%i].getAngleID() + 1 && %i != %brick[%i].getAngleID() - 3)
                        {
                           %k--;
                           %k[%i] = 1;
                        }
                     case "Brick32x32FRoadCData":
                        if(%i != %brick[%i].getAngleID() + 1 && %i != %brick[%i].getAngleID() + 2 && %i != %brick[%i].getAngleID() - 2 && %i != %brick[%i].getAngleID() - 3)
                        {
                           %k--;
                           %k[%i] = 1;
                        }
                     case "Brick32x32FRoadSData":
                        if(%i != %brick[%i].getAngleID() + 1 && %i != %brick[%i].getAngleID() - 1 && %i != %brick[%i].getAngleID() + 3 && %i != %brick[%i].getAngleID() - 3)
                        {
                           %k--;
                           %k[%i] = 1;
                        }
                     default:
                        %k--;
                        %k[%i] = 1;
                  }
               }
            }
            switch(%k)
            {
               case 1:
                  %Type = "T";
                  for(%i = 0; %i <= 3;%i++)
                     if(!%k[%i])
                        break;
                  %Dir = %i + 1;
                  if(%Dir == 4)
                     %Dir = 0;
               case 2:
                  for(%i = 0; %i <= 3;%i++)
                     if(!%k[%i])
                        %a[%b++] = %i;
                  if(%a1 + 2 == %a2 || %a1 - 2 == %a2 || %a1 == %a2)
                  {
                     %Type = "S";
                     %Dir = %a1 + 1;
                     if(%Dir == 4)
                        %Dir = 0;
                  }
                  else
                  {
                     %Type = "C";
                     %Dir = %a1 + 1;
                     if(%a1 == 0 && %a2 == 3)
                        %Dir = 0;
                  }
               case 3:
                  if($ExclamationPoint::AutoRoad::EndPoints)
                     %Type = "";
                  else
                     %Type = "S";
                  for(%i = 0; %i <= 3;%i++)
                     if(%k[%i])
                        break;
                  %Dir = %i;
               case 4:
                  %Type = "";
                  %Dir = 0;
               default:
                  %Type = "X";
                  %Dir = 0;
            }
            if(%lvl)
               %CtrlZ = 1;
            if(getSubStr(%this.getDatablock().getName(),0,19) $= "Brick32x32FRoadAuto")
               AutoRoad_ChangeRoad(%this,%Type,%Dir,%CtrlZ);
         }
         if(%this.beingDuped)
            %this.schedule(100,AutoRoad_Check,0);
      }
   }
   function FXDtsBrick::AutoRoad_Eval(%this)
   {
      if(!%this.getGroup().client.isAdmin && !%this.getGroup().client.isSuperAdmin && $ExclamationPoint::AutoRoad::AdminOnly)
         return;
      if(getSubStr(%this.getDatablock().getName(),0,19) $= "Brick32x32FRoadAuto")
         %this.isAutoRoad = 1;
      if(isObject(%this.client))
         %this.schedule(1,AutoRoad_Check,1);
   }
   function FXDtsBrick::AutoRoad_Set(%this,%val)
   {
      %this.isAutoRoad = %val;
   }
};
ActivatePackage(ExclamationPoint_AutoRoad);

//AutoRoad Bricks
datablock fxDTSBrickData(Brick32x32FRoadAutoData : Brick32x32FData)
{
   subCategory = "Road";
   uiName = "32x32 Road Auto";
};
datablock fxDTSBrickData(Brick32x32FRoadAutoSData : Brick32x32FRoadSData)
{
   Category = "";
   subCategory = "";
   uiName = "32x32F Road Auto S";
};
datablock fxDTSBrickData(Brick32x32FRoadAutoCData : Brick32x32FRoadCData)
{
   Category = "";
   subCategory = "";
   uiName = "32x32F Road Auto C";
};
datablock fxDTSBrickData(Brick32x32FRoadAutoXData : Brick32x32FRoadXData)
{
   Category = "";
   subCategory = "";
   uiName = "32x32F Road Auto X";
};
datablock fxDTSBrickData(Brick32x32FRoadAutoTData : Brick32x32FRoadTData)
{
   Category = "";
   subCategory = "";
   uiName = "32x32F Road Auto T";
};

Anyone's help would be appreciated.
Please include the area that needs to be changed, and what to change it to.
 :cookieMonster:

coding help? and when fixed, i need to reDL for my new laptop (i forgot to transfer it :o)