Legacy:VitalOverdose/The DropShip Controller

From Unreal Wiki, The Unreal Engine Documentation Site
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Vehicle Dropship

By Darknet & vitaloverdose

Works online

this is my solution to a long standing problem with creating a dropship that can carry vehicles. I spent quite a long time on this script.The ship was built and made flyable by darknet and i then subclassed the ship and added the dropship system. Theres no reason this cant be a single class its just splitting it up this way allows 2 people to work on the same project at the same time. This system if in the alpha test stage, it had been tested online by a few people as well as myself and so far all the reports have been good. We did have a moving hatch for the back door but because you cant animate collision on meshes online the idea had to be scraped.Though i think ive worked out a way around it .

Darknets Dropship.

Legacy_Shot00002.jpeg

<uscript> //----------------------------------------------------------- // //----------------------------------------------------------- class DarkDropShip extends ONSattackCraft

   placeable;
  1. exec OBJ LOAD FILE=..\animations\darkdropship_an.ukx

var int CurrentIndex; var bool bDoorIsOpen;

// AI hint Function Bool FastVehicle() { return true; }

Function Bool Dodge(eDoubleClickDir DoubleClickMove) { if ( FRand() < 0.7 ) { VehicleMovingTime = Level.TimeSeconds + 1; Rise = 1; } return False; }

simulated Function SpecialCalcBehindView(PlayerController PC, out actor ViewActor, out Vector CameraLocation, out Rotator CameraRotation ) { Local Vector CamLookAt, HitLocation, HitNormal, OffseTarget_Vector; Local Actor HitActor;

   Local Vector x, y, z;

if (DesiredTPCamDistance < TPCamDistance) TPCamDistance = FMax(DesiredTPCamDistance, TPCamDistance - CameraSpeed * (Level.TimeSeconds - LastCameraCalcTime)); else if (DesiredTPCamDistance > TPCamDistance) TPCamDistance = FMin(DesiredTPCamDistance, TPCamDistance + CameraSpeed * (Level.TimeSeconds - LastCameraCalcTime));

   GetAxes(PC.Rotation, x, y, z);

ViewActor = self; CamLookAt = GetCameraLocationStart() + (TPCamLookat >> Rotation) + TPCamWorldOffset;

OffseTarget_Vector = Vect(0, 0, 0); OffseTarget_Vector.X = -1.0 * TPCamDistance;

CameraLocation = CamLookAt + (OffseTarget_Vector >> PC.Rotation);

HitActor = Trace(HitLocation, HitNormal, CameraLocation, Location, true, Vect(40, 40, 40)); if ( HitActor != None && (HitActor.bWorldGeometry || HitActor == GetVehicleBase() || Trace(HitLocation, HitNormal, CameraLocation, Location, False, Vect(40, 40, 40)) != None ) ) CameraLocation = HitLocation;

   CameraRotation = Normalize(PC.Rotation + PC.ShakeRot);
   CameraLocation = CameraLocation + PC.ShakeOffset.X * x + PC.ShakeOffset.Y * y + PC.ShakeOffset.Z * z;

}

Function Died(Controller Killer, class<DamageType> damageType, Vector HitLocation) {

   Local Int I;
   if(Level.NetMode != NM_DedicatedServer)

{

   	for(i=0;i<TrailEffects.Length;I++)
       	TrailEffects[i].Destroy();
       TrailEffects.Length = 0;

for(i=0; i<StreamerEffect.Length; I++) StreamerEffect[i].Destroy(); StreamerEffect.Length = 0;

   }

Super.Died(Killer, damageType, HitLocation); }

simulated Function Destroyed() {

   Local Int I;
   if(Level.NetMode != NM_DedicatedServer)

{

   	for(i=0;i<TrailEffects.Length;I++)
       	TrailEffects[i].Destroy();
       TrailEffects.Length = 0;

for(i=0; i<StreamerEffect.Length; I++) StreamerEffect[i].Destroy(); StreamerEffect.Length = 0;

   }
   Super.Destroyed();

}

simulated event DrivingStatusChanged() { Local Vector RotX, RotY, RotZ;

Local Int I;

Super.DrivingStatusChanged();

   if (bDriving && Level.NetMode != NM_DedicatedServer && !bDropDetail)

{

       GetAxes(Rotation,RotX,RotY,RotZ);
       if (TrailEffects.Length == 0)
       {
           TrailEffects.Length = TrailEffectPositions.Length;
       	for(i=0;i<TrailEffects.Length;I++)
           	if (TrailEffects[i] == None )
           	{
               	TrailEffects[i] = Spawn(TrailEffectClass, self,, Location + (TrailEffectPositions[i] >> Rotation) );
               	TrailEffects[i].SetBase(self);
                   TrailEffects[i].SetRelativeRotation( rot(0,32768,0) );
               }
       }
       if (StreamerEffect.Length == 0)
       {
   		StreamerEffect.Length = StreamerEffectOffset.Length;
   		for(i=0; i<StreamerEffect.Length; I++)
       		if (StreamerEffect[i] == None )
       		{
       			StreamerEffect[i] = Spawn(StreamerEffectClass, self,, Location + (StreamerEffectOffset[i] >> Rotation) );
       			StreamerEffect[i].SetBase(self);
       		}
   	}
   }
   else
   {
       if (Level.NetMode != NM_DedicatedServer)
   	{
       	for(i=0;i<TrailEffects.Length;I++)
       	   TrailEffects[i].Destroy();
       	TrailEffects.Length = 0;
   		for(i=0; i<StreamerEffect.Length; I++)
               StreamerEffect[i].Destroy();
           StreamerEffect.Length = 0;
       }
   }

}

simulated Function Tick(float DeltaTime) {

   Local float EnginePitch, DesiredOpacity, DeltaOpacity, MaxOpacityChange, ThrustAmount;

Local TrailEmitter T;

   Local int I;

Local Vector RelVel; Local Bool NewStreamerActive, bIsBehindView; Local PlayerController PC;

   if(Level.NetMode != NM_DedicatedServer)

{

       EnginePitch = 64.0 + VSize(Velocity)/MaxPitchSpeed * 32.0;
       SoundPitch = FClamp(EnginePitch, 64, 96);
       RelVel = Velocity << Rotation;
       PC = Level.GetLocalPlayerController();

if (PC != None && PC.ViewTarget == self) bIsBehindView = PC.bBehindView; else

           bIsBehindView = True;
   	// Adjust Engine FX depending on being drive/velocity

if (!bIsBehindView) { for(i=0; i<TrailEffects.Length; I++) TrailEffects[i].SetThrustEnabled(False); }

       else
       {

ThrustAmount = FClamp(OutputThrust, 0.0, 1.0);

for(i=0; i<TrailEffects.Length; I++) { TrailEffects[i].SetThrustEnabled(true); TrailEffects[i].SetThrust(ThrustAmount); } }

// Update streamer opacity (limit max change speed) DesiredOpacity = (RelVel.X - StreamerOpacityRamp.Min)/(StreamerOpacityRamp.Max - StreamerOpacityRamp.Min); DesiredOpacity = FClamp(DesiredOpacity, 0.0, StreamerOpacityMax);

MaxOpacityChange = DeltaTime * StreamerOpacityChangeRate;

DeltaOpacity = DesiredOpacity - StreamerCurrentOpacity; DeltaOpacity = FClamp(DeltaOpacity, -MaxOpacityChange, MaxOpacityChange);

if(!bIsBehindView)

           StreamerCurrentOpacity = 0.0;
       else
   		StreamerCurrentOpacity += DeltaOpacity;

if(StreamerCurrentOpacity < 0.01) NewStreamerActive = False; else NewStreamerActive = true;

for(i=0; i<StreamerEffect.Length; I++) { if(NewStreamerActive) { if(!StreamerActive) { T = TrailEmitter(StreamerEffect[i].Emitters[0]); T.ResetTrail(); } StreamerEffect[i].Emitters[0].Disabled = False; StreamerEffect[i].Emitters[0].Opacity = StreamerCurrentOpacity; }

           else

{ StreamerEffect[i].Emitters[0].Disabled = true; StreamerEffect[i].Emitters[0].Opacity = 0.0; } }

StreamerActive = NewStreamerActive;

   }
   Super.Tick(DeltaTime);

}

Function float ImpactDamageModifier() {

   Local float Multiplier;
   Local Vector X, Y, Z;
   GetAxes(Rotation, X, Y, Z);
   if (ImpactInfo.ImpactNorm Dot Z > 0)
       Multiplier = 0.75-(ImpactInfo.ImpactNorm dot Z);
   else
       Multiplier = 1.0;
   return Super.ImpactDamageModifier() * Multiplier;

}

Function Bool RecommendLongRangedAttack() { Return true; }


Function Bool PlaceExitingDriver() // <<<<<< FIXME Fix to not be specific to this class after demo {

Local Int I;

Local Vector tryPlace, Extent, HitLocation, HitNormal, ZOffset;

Extent = Driver.default.CollisionRadius * Vect(1,1,0); Extent *= 2; Extent.Z = Driver.default.CollisionHeight; ZOffset = Driver.default.CollisionHeight * Vect(0,0,1); if (Trace(HitLocation, HitNormal, Location + (ZOffset * 6), Location, False, Extent) != None ) return False;

//avoid running Driver over by placing in direction perpendicular to velocity if ( VSize(Velocity) > 100 ) { tryPlace = Normal(Velocity cross Vect(0,0,1)) * (CollisionRadius + Driver.default.CollisionRadius ) * 1.25 ; if ( FRand() < 0.5 ) tryPlace *= -1; //randomly prefer other side if ( (Trace(HitLocation, HitNormal, Location + tryPlace + ZOffset, Location + ZOffset, False, Extent) == None && Driver.SetLocation(Location + tryPlace + ZOffset)) || (Trace(HitLocation, HitNormal, Location - tryPlace + ZOffset, Location + ZOffset, False, Extent) == None && Driver.SetLocation(Location - tryPlace + ZOffset)) ) return true; }

for( i=0; i<ExitPositions.Length; I++) { if ( ExitPositions[0].Z != 0 ) ZOffset = Vect(0,0,1) * ExitPositions[0].Z; else ZOffset = Driver.default.CollisionHeight * Vect(0,0,2);

if ( bRelativeExitPos ) tryPlace = Location + ( (ExitPositions[i]-ZOffset) >> Rotation) + ZOffset; else tryPlace = ExitPositions[i];

// First, do a line check (stops us passing through things on exit). if ( bRelativeExitPos && Trace(HitLocation, HitNormal, tryPlace, Location + ZOffset, False, Extent) != None ) continue;

// Then see if we can place the player there. if ( !Driver.SetLocation(tryPlace) ) continue;

return true; } return False; }


//==================Mod off From ONSPR=====================================

Function AltFire(optional float F) //avoid sending altfire to weapon {

Super(Vehicle).AltFire(F);

}


static function StaticPrecache(LevelInfo L) {

   Super.StaticPrecache(L);

L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorWing'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorTailWing'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorGun'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj');

   L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead');
   L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames');
   L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames');
   L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames');
   L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
   L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot');
   L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1');
   L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorRed');
   L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorBlue');
   L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.AttackCraftNoColor');

L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlura');

   L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade');
   L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.raptorCOLORtest');
   L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment');

}

simulated Function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorWing'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorTailWing'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorGun'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj');

Super.UpdatePrecacheStaticMeshes(); }

simulated Function UpdatePrecacheMaterials() {

   Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead');
   Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames');
   Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames');
   Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames');
   Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
   Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot');
   Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1');
   Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorRed');
   Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorBlue');
   Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.AttackCraftNoColor');

Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlura');

   Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade');
   Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.raptorCOLORtest');
   Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment');

Super.UpdatePrecacheMaterials(); }

defaultproperties {

    MaxPitchSpeed=600.000000
    TrailEffectPositions(0)=(X=-672.000000,Y=-480.000000,Z=-20.000000)
    TrailEffectPositions(1)=(X=-672.000000,Y=480.000000,Z=-20.000000)
    MaxThrustForce=256.000000
    TurnDamping=500.000000
    PitchTorqueMax=15.000000
    PitchDamping=50.000000
    RollDamping=60.000000
    RedSkin=Texture'darkhoverskin.hoverskin.vehicletranportskin'
    BlueSkin=Texture'darkhoverskin.hoverskin.vehicletranportskin'
    VehicleMass=10.000000
    VehiclePositionString="in a Dark DropShip"
    VehicleNameString="Dark DropShip"
    bCanBeBaseForPawns=True
    GroundSpeed=1500.000000
    HealthMax=800.000000
    Health=800
    Mesh=SkeletalMesh'darkdropship_an.DropshipV5_3'

} </uscript>

Vitals DropShipSystem

Ive left the logs i used for testing in the code.

The ship has 7 weapons on it , mainly to give the bots something to do while the craft is in flight although im not 100% sure this function is working correctly but it wont effect the way the ship works in anyway if it dosent.

  • The ship has to land on reletivly flat ground before it will release the vecs.
  • The ship can carry as meny vehicles as you can fit on or in it but each vehicle adds weight to the dropship making it harder to fly.
  • The system uses 3 simulated states to get the job done gravitysucks,VehicleParked VehicleFlying.
  • The system can tell altitude of the craft as well as tilt.
  • You have to land on relativly flat ground.

Legacy_DropShip.jpeg

<uscript> Class DropShipSystem extends DarkDropShip;

var () Bool bEject_If_Inverted; // (could be fun..) var () float fMaxDistanceDownToCheck; // set at level stalz var () float MinGroundClearance; // a numb slightly > than the distance of

                                                             // center point of the vec to the ground           

var () float scanrange; // the size of the cargobay var () Array < vector > TraceOffsets; // the craft fires trace lines to the

                                                             // ground to measure altitude and Tilt 
                                                             // during the gravitySucks state

var array < onsvehicle > cargorec; var () bool bSeekFlyingEscorts; var () Bool bSeekEscorts; var () bool bontheground; var () sound LandedSound; var () sound Takeoffsound; var () ephysics BackUpphysics;

replication {
            reliable
            if (bNetDirty  &&  role == role_authority)
                bontheground;
            }
simulated function PostBeginPlay()
{
 local rotator bonerot;
 log(self$"postbeginplay has been called");
 Ksetactorgravscale(0.1);
 bonerot=getbonerotation( 'middle_middle_weapon');
 //bonerot.yaw += rotation.yaw+32768;
 SetBoneRotation( 'middle_middle_weapon', bonerot );
 SetBoneRotation( 'Left_Front_weapon', bonerot );
 SetBoneRotation( 'Right_Front_weapon', bonerot );
 SetBoneRotation( 'left_middle_weapon', bonerot );
 SetBoneRotation( 'right_middle_weapon', bonerot );
 SetBoneRotation( 'Right_rear_weapon', bonerot );
 SetBoneRotation( 'Left_rear_weapon', bonerot );
}
simulated function capturevecs ()
{
 local onsvehicle foundvec;
                                                                             // log(self$"capturevecs was called");
 cargorec.length=0;
 foreach visiblecollidingactors(class'OnsVehicle',foundvec,Scanrange)
        {
                                                                             // log("capturevecs:found a vec"$foundvec$". so thats "$cargorec.length$"found so far");
         if (( foundvec != self ) && (foundvec.bVehicleOnGround) && ( vsize( foundvec.velocity ) < 20))
            {
                                                                             // log(foundvec$"will be made cargo");
             Addweight();
             cargorec.insert(0,1);
             cargorec[0]                           = foundvec;
             BackUpphysics                         = foundvec.physics;
             cargorec[0].bhardattach               = True;
             cargorec[0].SetPhysics(PHYS_None );                             // Remove the Physics from the Target Vehicle
             cargorec[0].Setbase(self );
             cargorec[0].bAllowViewChange          = bEject_If_Inverted;     // Sets inverted optiOns on the Vec
             cargorec[0].bDriverCannotLeaveVehicle = true;                   // Locks the vehicles until the flight is over
             cargorec[0].setcollision( False , False , true );               // Switch off the collision on the Vehicle
            }
       }
 }
 simulated function EnlistEscorts()
 {
 local pawn foundpawn;
                                                                             // log("EnlistEscorts() has started");
 foreach visiblecollidingactors(class'pawn',foundpawn,Scanrange*2)
        {
                                                                             // log("EnlistEscorts(): found a pawn = "$foundpawn);
         if ((foundpawn.isa('xbot')&&(!foundpawn.IsHumanControlled()) &&
            (driver.controller.SameTeamAs(foundpawn.controller)) ))
            {
                                                                             // log("EnlistEscorts(): found It was an xbot +not human controlled = ");
            if (((bSeekFlyingEscorts) && foundpawn.IsA('onsraptor')) ||
               ((bSeekEscorts ) && (foundpawn.isa('onsattackcraft'))))
               {
                                                                             // log("EnlistEscorts(): it wa a bot controlled vec = ");
                 bot(foundpawn.controller).SetOrders('follow',Driver.Controller);
               }
            }
       }
}
simulated function releasevecs()
{
 local int I;
                                                                             //    log("Time to release the cargo"$cargorec.length);
 if (cargorec.length > 0)
    {
                                                                             //   log("releasevecs():releasing"$cargorec[i]);
     for ( i=0 ; I< cargorec.length ; I++ )
         {
          cargorec[i].bHardattach              = false;
          cargorec[i].SetBase(None);                                         // Releasing Target Vec
          cargorec[i].SetPhysics(BackUpphysics);                             // Returns old physics
          cargorec[i].setcollision(true , True , true);                      // Switches the collision back on.
          cargorec[i].bDriverCannotLeaveVehicle = False;                     // Unlocks the Vehicle
         }
     cargorec.length=0;
    }
 }
simulated function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> DamageType)
{
 momentum = momentum*0.01;
 if (damage>Health)
     Releasevecs();
 super.takedamage( Damage,  instigatedBy,  Hitlocation,  Momentum,  DamageType);
}
simulated function subweight()
{
 local float Thegrav;                                                        // log("subweight()");
 thegrav=kgetactorgravscale() - (0.02*cargorec.length);
 ksetactorgravscale(thegrav);                                                // log("subweight:new weight is "$thegrav);
}
simulated function Addweight()
{                                                                            //log("Addweight()");
 local float Thegrav;
 thegrav=kgetactorgravscale()+ 0.02;
 ksetactorgravscale(thegrav);
}
simulated function loudnoise(sound sfx)
{
                                                                             // log("loudnoise()");
 makenoise(1.0);
 playsound(sfx);
}


simulated function Destroyed()
{
                                                                             // log("Destroyed()");
 ReleaseVecs();                                                              // log("Destroyed:ReleaseVecs()");
 DarkhoverSpawner(owner).Destroyed();                                        // log("informed "$owner$" im about to die");
 super.Destroyed();
}
simulated  function bool CheckbOnTheGround()
{
 local Vector TraceStart, TraceEnd,    HitLocation,HitNormal;
 Local float  Dist,       MarkerDist,  Total_DistanceDiff;
 Local int    I;
 local actor  HitActor;
                                                                             // log("CheckbOnTheGround()");
 if (traceoffsets[0] != vect(0,0,0))
     TraceOffsets  .insert (0,1);                                            // making blank space for first 'marker' trace
 for ( I = 0 ; I < TraceOffsets.length; I++)
     {
     TraceStart = Location + TraceOffsets[i];
     TraceEnd   = TraceStart - ( fMaxDistanceDownToCheck * Vect(0,0,1) );
     HitActor   = Trace(HitLocation , HitNormal , TraceEnd , TraceStart , true);
     Dist       = VSize(TraceStart-HitLocation);
     if ( I == 0 )
          MarkerDist = dist;
     else
     if ( HitActor != none )
          Total_DistanceDiff = MarkerDist - Dist;
     }
 if ( MarkerDist <= MinGroundClearance)
    {
                                                                             // log('CheckbOnTheGround:Ground clearence is good');
    if  (Total_DistanceDiff < 100)
        {
                                                                             // log(Self$"CheckbOnTheGround:Total diff on ground clearence was less than 100 - returning true");
         if ( vsize(velocity) < 10 )
            {
                                                                             // log ("CheckbOnTheGround():velocity is now correct to im  - returning true");
             return true;
            }
        }
    }
else                                                                         // log ("CheckbOnTheGround:returning false");
return false;
}

/////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////auto simulated state GravitySucks auto simulated state GravitySucks {

simulated function Timer()                                                   // perform a scan
 {                                                                           // log("=========state () GravitySucks:Timer() started");
  bOnTheGround=CheckbOnTheGround();
  if  ( bOnTheGround == true )
      {
                                                                             // log("GravitySucks:Timer:I am on the ground as bOnTheGround ="$bOnTheGround);
       if (landedsound!=None)
           Loudnoise(landedsound);
       GotoState('VehicleParked');                                           // log("GravitySucks:Timer():GotoState('VehicleParked') was just called'");
       return;
      }                                                                      // log("GravitySucks:Timer():Im NOT on the ground this time'");
SetTimer(0.1 , False);
super.timer();
}

Begin:

                                                                             // log("==========state GravitySucks:state code has been called");

SetTimer(0.1 , False); }

//////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////// simulated state VehicleParked /

simulated state VehicleParked {

simulated function bool TryToDrive(Pawn P)
{
                                                                             // log(" TryToDrive():an attempt to drive was made by"$p);
 super.TryToDrive(P);
}
simulated function ClientKDriverEnter(PlayerController PC)
{
                                                                             // log("VehicleParked:ClientKDriverenter START");
 Capturevecs ();                                                             // log("VehicleParked:ClientKDriverenter enlistescorts() - has been called and returned");
 enlistescorts();                                                            // log("VehicleParked:ClientKDriverenter enlistescorts() - has been called and returned");
 GotoState ( 'VehicleFlying' );                                              // log("VehicleParked:ClientKDriverenter gotostate 'VehicleFlying' has been called");
 super.ClientKDriverEnter( PC );
}
 simulated function KDriverEnter(pawn p)
{
                                                                             // log("VehicleParked:KDriverenter                              START");
 Capturevecs ();                                                             // log("VehicleParked:KDriverenter Capturevecs ()               has been called and returned");
 enlistescorts();                                                            // log("VehicleParked:KDriverenter enlistescorts ()             has been called and returned");
 GotoState ( 'VehicleFlying' );                                              // log("VehicleParked:KDriverenterGotoState ( 'VehicleFlying' ) has been called and returned");
 super.KDriverEnter( P );
}

Begin:

                                                                             // log("now in state () VehicleParked start of state code");

} //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// state VehicleFlying

state VehicleFlying {

simulated function ClientKDriverLeave(PlayerController PC)
{                                                                            // log("VehicleFlying:ClientKDriverLeave releasevecs() has been called and returned ");
                                                                             // log("VehicleFlying:ClientKDriverLeave releasevecs() has been called and returned");
 releasevecs();                                                              // log("VehicleFlying:ClientKDriverLeave subweight()   has been called and returned");
 subweight();                                                                // log("VehicleFlying:ClientKDriverLeave goto state GravitySucks has been called ");
 GotoState('GravitySucks');
 super.clientkDriverleave(PC);
}
simulated event bool KDriverLeave( bool bForceLeave )
{
                                                                             // log("VehicleFlying:KDriverLeave              * Started *");
 releasevecs();                                                              // log("VehicleFlying:KDriverLeave:releasevecs()              has been called and returned");
 subweight();                                                                // log("VehicleFlying:KDriverLeave:subweight()                has been called and returned");
 GotoState('GravitySucks');                                                  // log("VehicleFlying:KDriverLeave :GotoState('GravitySucks') has been called and returned");
 super.kDriverleave(bForceLeave);
}

begin: if (takeoffsound!=None)

   loudnoise(takeoffsound);
                                                                             // log("now in state VehicleFlying");

}

defaultproperties {

    fMaxDistanceDownToCheck=5000.000000
    MinGroundClearance=260.000000
    scanrange=1024.000000
    TraceOffsets(0)=(X=100.000000)
    TraceOffsets(1)=(X=-100.000000)
    TraceOffsets(2)=(Y=100.000000)
    TraceOffsets(3)=(Y=-100.000000)
    bSeekFlyingEscorts=True
    bSeekEscorts=True
    DriverWeapons(0)=(WeaponClass=Class'darkhover.Mortician_Head',WeaponBone="middle_front_weapon")
    PassengerWeapons(0)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="right_front_weapon")
    PassengerWeapons(1)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="left_front_weapon")
    PassengerWeapons(2)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="right_middle_weapon")
    PassengerWeapons(3)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="left_middle_weapon")
    PassengerWeapons(4)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="left_rear_weapon")
    PassengerWeapons(6)=(WeaponPawnClass=Class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone="right_rear_weapon")
    VehicleMass=12.000000
    TPCamDistance=1400.000000
    bPathColliding=True

} </uscript>

Heres a link to a smal vid showing the dropship in action : - DropshipVid(you might get an error until the video has finished buffering/downloading).

Discussion

Vitaloverdose im trested in taking this script further if anyone has a decent static mesh for a dropship.

Ambershee: Take a look at the Leviathan. That deploys into a static weapon using animation and has the collision intact.

detour187 In one of the bonus packs for ut2004 there is a map called 'thrust' that has a decent dropship, I'll see If I could get the file.