Legacy:VitalOverdose/The DropShip Controller

From Unreal Wiki, The Unreal Engine Documentation Site
Revision as of 16:14, 19 November 2007 by Sweavo (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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.

[[Image: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.

[[Image: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.