I'm a doctor, not a mechanic

UE2:TeamVehicleFactory

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

This custom actor really duplicates much of the functionality of the ONSVehicleFactory subclasses, but the big feature is that nearly any vehicle class can be spawned. Although this actor cannot display the selected vehicle class in the editor, it does offer added controls that mappers for VCTF or other vehicle gametypes might want.

Features[edit]

  • The ability to spawn random vehicles from a list of vehicle classes
  • The ability to spawn nearly any vehicle class in gametypes that allow vehicles
  • The ability to trigger PreSpawn and (Post)Spawn events
  • The option to allow the vehicle to spawn over and crush other actors
  • The option to use this as either a triggerable or an automatic (timed) vehicle factory.
  • Greater control over spawn timing

Notes[edit]

  • If you use a TeamVehicleFactory "as is" in your custom map, please credit me in the readme file of the map. (SuperApe)
  • You have to supply spawning effects and sounds, via ScriptedTrigger, Emitter and the like. This is meant to allow flexibilty in the ways you want vehicles to spawn. An example VCTF map posted on this UP Forum thread gives my suggestion for spawning particles and sound. (It appears similar to pickup spawning.)
  • With bAutoSpawn on and without a PreSpawnTime of around 2 seconds, you run the risk of spawning a vehicle before headlights can be properly spawned at map start. Subsequent vehicles after map start will spawn headlights normally.
  • Turrets that are spawned automatically get an AIController. They are auto turrets; firing at enemies, or if set to neutral (team 255), firing at any non-neutral controlled pawn it detects.
  • The AS Spacefighters are spawned with a minimum velocity that makes them impractical to use. However, a custom launcher for these is easy to make with a TryToDrive() function.
  • This has a slightly larger bBlocked check radius than ONSVehicleFactory. ( 1.33 : 1.25 )

Properties[edit]

Main[edit]

int TeamNum 
Team Number to be set on spawn. 0= red, 1= blue, 255= neutral / none
bool bPlayerControl 
Only player instigators can trigger.
bool bAutoSpawn 
Will spawn at regular intervals. The triggering ability is disabled.
int RespawnTime 
Interval to wait before AutoSpawning.
name PreSpawnEvent 
Event to trigger before spawn.
int PreSpawnTime 
Time before spawn to trigger event. Will begin event this many seconds before the factory is set to AutoSpawn.
name SpawnEvent 
Event to trigger after spawn. A post spawn event.
bool bCrushable 
Allow spawning over colliding actors. Note: Turrets will normally spawn in collision with other actors, spawned vehicles will generally move out of the way.
int RetrySpawnTime 
Interval to wait if bBlocked.
bool bRandomFlip 
Neutral vehicles may face backwards.
bool bRandomSpawn 
Will spawn random vehicle class.
struct class<Vehicle> SpawnedVehicle 
Selected random vehicle class.
array<SpawnedVehicle> RandomVehicles 
List for random vehicle spawn.

Hidden[edit]

bool bWaiting 
Waiting to spawn.
int FactoryTime 
Time last spawn. (in Level.TimeSeconds)
bool bPreSpawn 
Should trigger PreSpawnEvent next.

Code[edit]

UE2 Actor >> SVehicleFactory >> TeamVehicleFactory (custom)
//==================================================================================
// TeamVehicleFactory.
// Spawn any Vehicle or Turret, set Team, pre & post spawn Events, timing, and more.
// Glenn 'SuperApe' Storm -- June 2004 -- Updated: July 2005
//==================================================================================
class TeamVehicleFactory extends SVehicleFactory
        placeable;
 
var()     int       TeamNum;            // 0= red, 1= blue, 255= neutral / none
var()     bool      bPlayerControl;     // Only player instigators can trigger
 
var()     bool      bAutoSpawn;         // Will spawn at regular intervals
var()     int       RespawnTime;        // Interval to wait before AutoSpawning
 
var       bool      bWaiting;           // About to spawn
var       int       FactoryTime;        // Time last spawn
 
var()     name      PreSpawnEvent;      // Event to trigger before spawn
var()     int       PreSpawnTime;       // Time before spawn to trigger event
var       bool      bPreSpawn;                        // Should trigger PreSpawnEvent next
var()     name      SpawnEvent;         // Event to trigger after spawn
 
var()     bool      bCrushable;         // Allow spawning over colliding actors
var()     int       RetrySpawnTime;     // Interval to wait if bBlocked
 
var()     bool      bRandomFlip;        // Neutral vehicles may face backwards
 
var()     bool      bRandomSpawn;       // Spawn random vehicle class
 
struct SpawnedVehicle
{
     var() class<Vehicle> SpawnVehicle; // Selected random vehicle class
};
var()     array<SpawnedVehicle>     RandomVehicles;   // List for random vehicle spawn
 
 
simulated function PostBeginPlay()
{
     Super.PostBeginPlay();
 
     if ( bAutoSpawn )
          bWaiting = true;
          bPreSpawn = true;
          if ( RespawnTime > 0 )
               FactoryTime = Level.TimeSeconds - RespawnTime + PreSpawnTime;
          else
               FactoryTime = Level.TimeSeconds - PreSpawnTime;
}
 
simulated event Trigger( Actor Other, Pawn EventInstigator )
{
     if ( bAutoSpawn )
          // bAutoSpawn overrides Trigger
          return;
 
     if ( !EventInstigator.IsA('UnrealPawn') && bPlayerControl )
          return;
 
     if ( VehicleCount >= MaxVehicleCount )
          return;
 
 
     if ( VehicleClass == None || ( bRandomSpawn && RandomVehicles.length > 0 ) )
     {
          Log("TeamVehicleFactory:"@self@"has no VehicleClass");
          return;
     }
 
     bWaiting = true;
     bPreSpawn = true;
     if ( RespawnTime > 0 )
          FactoryTime = Level.TimeSeconds - RespawnTime + PreSpawnTime;
     else
          FactoryTime = Level.TimeSeconds - PreSpawnTime;
}
 
simulated function SpawnItNow()
{
     local  Vehicle         CreatedVehicle;
     local  bool           bBlocked;
     local  Pawn              P;
     local  float          SV;
 
     bBlocked = false;
 
     if ( VehicleClass != None || ( bRandomSpawn && RandomVehicles.length > 0 ) )
     {
          if ( bRandomSpawn && RandomVehicles.length > 0 )
               VehicleClass = RandomVehicles[ int( FRand() * RandomVehicles.length ) ].SpawnVehicle;
          foreach CollidingActors(class'Pawn', P, VehicleClass.default.CollisionRadius * 1.33)
               bBlocked = true;
     }
     else
     {
          Log("TeamVehicleFactory:"@self@"has no VehicleClass");
          return;
     }
 
     if ( bBlocked && !bCrushable )
     {
          bWaiting = true;
          bPreSpawn = true;
          if ( RespawnTime > 0 )
               FactoryTime = Level.TimeSeconds - RespawnTime + RetrySpawnTime + PreSpawnTime;
          else
               FactoryTime = Level.TimeSeconds - RetrySpawnTime + PreSpawnTime;
          return;
     }
     else
     {
          if ( TeamNum == 255 )
          {
               if ( bRandomFlip && Rand(2) == 1 )
                    CreatedVehicle = spawn(VehicleClass, , , Location, Rotation + rot(0,32768,0));
               else
               CreatedVehicle = spawn(VehicleClass, , , Location, Rotation);
 
               // Unlock neutral vehicles
               CreatedVehicle.bTeamLocked = false;
          }
          else
          CreatedVehicle = spawn(VehicleClass, , , Location, Rotation);
 
          if ( CreatedVehicle != None )
          {
               VehicleCount++;
               CreatedVehicle.Event = Tag;
               CreatedVehicle.ParentFactory = self;
               CreatedVehicle.SetTeamNum(TeamNum);
               TriggerEvent(SpawnEvent, self, None);
          }
     }
}
 
event VehicleDestroyed(Vehicle V)
{
     Super.VehicleDestroyed(V);
 
     if ( bAutoSpawn )
     {
          bWaiting = true;
          bPreSpawn = true;
          FactoryTime = Level.TimeSeconds;
     }
}
 
simulated function Tick(float DeltaTime)
{
     if ( bWaiting )
     {
          if ( Level.TimeSeconds - FactoryTime < RespawnTime - PreSpawnTime )
               return;
 
          if ( VehicleCount < MaxVehicleCount )
                    if ( !bPreSpawn )
                    {
                         if ( Level.TimeSeconds - FactoryTime >= RespawnTime )
                         {
                              bWaiting = false;
                              FactoryTime = Level.TimeSeconds;
                              SpawnItNow();
                         }
                    }
                    else
                    {
                         bPreSpawn = false;
                         TriggerEvent(PreSpawnEvent, self, None);
                    }
     }
}

External Links[edit]

  • Mapping for VCTF – A thread on UnrealPlayground that includes a test map using this actor and suggested spawn EFX.

Related Topics[edit]