Once I get that upgrade to 36-hour days, I will tackle that. – Mychaeel
Legacy:VitalOverdose/The DropShip Controller
From Unreal Wiki, The Unreal Engine Documentation Site
Contents |
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|]]
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class DarkDropShip extends ONSattackCraft
placeable;
#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'
}
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|]]
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
}
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.
