Bulldog
UT2004 :: Actor >> Pawn >> Vehicle >> KVehicle >> KCar >> Bulldog (Package: Vehicles)
This is the first vehicle included with an Unreal gametype. It was introduced in UT2003, but was only available as a test map, "VehicleDemo". This is a Karma based vehicle (KVehicle). It is equipped with a homing rocket launcher.
Note: As the bulldog is not an ONSVehicle or ASVehicle class, the UT2004 version does not contain the proper code to navigate. While you are able to spawn a Bulldog from other Vehicle Factories and enter it, players will be unable to drive it or fire its weapon without custom modification. See UT2004 Bulldog Fix below.
Properties
Main
- float FireInterval
- float TargettingInterval
- vector RocketFireOffset
- Position (car ref frame) that rockets are launched from.
- float TargettingRange
- Material TargetMaterial
- vector HeadlightCoronaOffset[8]
- float TriggerSpeedThresh
- Maximum speed at which you can get in the vehicle.
Wheel Slip and Dust
- float DustSlipRate
- Ratio between dust kicked up and amount wheels are slipping.
- float DustSlipThresh
Bulldog Sounds
- float EnginePitchScale
- sound BulldogStartSound
- sound BulldogIdleSound
- float HitSoundThreshold
- sound BulldogSquealSound
- float SquealVelThresh
- sound BulldogHitSound
Bulldog Forces
- string BulldogStartForce
- string BulldogIdleForce
- string BulldogSquealForce
- string BulldogHitForce
Destroyed Bulldog
- class<Actor> DestroyedEffect
- sound DestroyedSound
Hidden
- float UntilNextImpact
- Used to prevent triggering sounds continuously.
- float DustDrop
- Distance below centre of tire to place dust.
Bulldog Triggers
- vector FrontTriggerOffset (const)
- BulldogTrigger FLTrigger
- BulldogTrigger FRTrigger
- BulldogTrigger FlipTrigger
- bool TriggerState
- true for on, false for off.
- bool FlipTriggerState
Headlight Projector
- vector HeadlightOffset (const)
- BulldogHeadlight Headlight
- bool HeadlightOn
Light Materials
- Material ReverseMaterial
- Material BrakeMaterial
- Material TailOffMaterial
- Material HeadlightOnMaterial
- Material HeadlightOffMaterial
- BulldogHeadlightCorona HeadlightCorona[8]
Wheel Dirt Emitter
- BulldogDust Dust[4]
- FL, FR, RL, RR
Weapon
- float FireCountdown
- float SinceLastTargetting
- Pawn CurrentTarget
Functions
(incomplete)
Events
UT2004 Bulldog Fix
The Bulldog in UT2004 is broken for a number of reasons; in part due to a move of KVehicle from a subclass of Pawn to a subclass of Vehicle, but also due to other changes that enable Vehicle support in UT2004.
Source Code
To fix it, you'll need to Create A Subclass of the Bulldog, ModifiedBulldog, and use this custom code. For a tutorial on using custom code, see Mapping Hello World. (Note: If you use the Script Editor to compile this code, omit the defaultProperties block and set those manually for each class.)
//============================================================================= // ModifiedBulldog. // Uses Vehicle.KDriverEnter() instead of KVehicle.KDriverEnter(), etc. // by SuperApe -- Dec 2005 //============================================================================= class ModifiedBulldog extends Bulldog placeable; var(Bulldog) sound BulldogShutDownSound; function Timer() { // Finished start sound AmbientSound = BulldogIdleSound; } function KDriverEnter( Pawn P ) { local Controller C; AmbientSound = BulldogStartSound; SetTimer( 1.0, false ); bDriving = True; StuckCount = 0; // We don't have pre-defined exit positions here, so we use the original player location as an exit point if ( !bRelativeExitPos ) { PlayerEnterredRotation = P.Rotation; ExitPositions[0] = P.Location + Vect(0,0,16); } // Set pawns current controller to control the vehicle pawn instead C = P.Controller; if ( !bCanCarryFlag && ( C.PlayerReplicationInfo.HasFlag != None ) ) P.DropFlag(); Driver = P; Driver.StartDriving( Self ); // Disconnect PlayerController from Driver and connect to SVehicle. C.bVehicleTransition = true; // to keep Bots from doing Restart() C.Unpossess(); Driver.SetOwner( self ); // This keeps the driver relevant. C.Possess( self ); C.bVehicleTransition = false; DrivingStatusChanged(); if ( PlayerController( C ) != None ) VehicleLostTime = 0; AttachFlag( PlayerReplicationInfo.HasFlag ); Level.Game.DriverEnteredVehicle( self, P ); ReceiveLocalizedMessage( class'Vehicles.BulldogMessage', 1 ); } event bool KDriverLeave( bool bForceLeave ) { local Controller C; local PlayerController PC; local bool havePlaced; local Pawn OldDriver; local int i; if( !bForceLeave && !Level.Game.CanLeaveVehicle(self, Driver) ) return false; if ( (PlayerReplicationInfo != None) && (PlayerReplicationInfo.HasFlag != None) ) Driver.HoldFlag(PlayerReplicationInfo.HasFlag); // Do nothing if we're not being driven if (Controller == None ) return false; // Before we can exit, we need to find a place to put the driver. // Iterate over array of possible exit locations. if ( (Driver != None) && (!bRemoteControlled || bHideRemoteDriver) ) { Driver.bHardAttach = false; Driver.bCollideWorld = true; Driver.SetCollision(true, true); havePlaced = PlaceExitingDriver(); // If we could not find a place to put the driver, leave driver inside as before. if (!havePlaced && !bForceLeave ) { Driver.bHardAttach = true; Driver.bCollideWorld = false; Driver.SetCollision(false, false); return false; } } bDriving = False; // Turn off bulldog headlights Headlight.DetachProjector(); Skins[2] = HeadlightOffMaterial; for(i=0; i<8; i++) HeadlightCorona[i].bHidden = true; // Reconnect Controller to Driver. C = Controller; if (C.RouteGoal == self) C.RouteGoal = None; if (C.MoveTarget == self) C.MoveTarget = None; C.bVehicleTransition = true; Controller.UnPossess(); if ( (Driver != None) && (Driver.Health > 0) ) { Driver.SetOwner( C ); C.Possess( Driver ); PC = PlayerController(C); if ( PC != None ) PC.ClientSetViewTarget( Driver ); // Set playercontroller to view the person that got out Driver.StopDriving( Self ); } C.bVehicleTransition = false; if ( C == Controller ) // If controller didn't change, clear it... Controller = None; Level.Game.DriverLeftVehicle(self, Driver); // Car now has no driver OldDriver = Driver; Driver = None; DriverLeft(); // Put brakes on before you get out :) Throttle = 0; Steering = 0; Rise = 0; PlaySound( BulldogShutDownSound, SLOT_Misc ); // If we succesfully got out of the car, make driver visible again. OldDriver.bHidden = false; AmbientSound = None; return true; } function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class<DamageType> DamageType) { Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType ); KAddImpulse( Momentum, HitLocation); } defaultproperties { DestroyedEffect=Class'myLevel.DECO_DestroyedBulldog' DestroyedSound=Sound'ONSVehicleSounds-S.Explosions.VehicleExplosion01' BulldogShutDownSound=Sound'ONSVehicleSounds-S.PRV.PRVStop01' BulldogStartSound=Sound'ONSVehicleSounds-S.PRV.PRVStart01' BulldogIdleSound=Sound'ONSVehicleSounds-S.RV.RVEng01' BulldogSquealSound=Sound'ONSVehicleSounds-S.PRV.DirtSkid03' BulldogHitSound=Sound'ONSVehicleSounds-S.CollisionSounds.VehicleCollision04' HornSounds(0)=Sound'ONSVehicleSounds-S.Horns.Horn03' bDontPossess=False Begin Object Class=KarmaParamsRBFull Name=KarmaParamsRBFull1 KInertiaTensor(0)=20.000000 KInertiaTensor(3)=30.000000 KInertiaTensor(5)=48.000000 KCOMOffset=(X=0.800000,Z=-0.700000) KLinearDamping=0.000000 KAngularDamping=0.000000 KStartEnabled=True bHighDetailOnly=False bClientOnly=False bKDoubleTickRate=True KFriction=1.600000 End Object KParams=KarmaParamsRBFull'myLevel.KarmaParamsRBFull1' }
This ModifiedBulldog uses a static mesh as a Destroyed Vehicle mesh. It's a subclass of Decoration → DECO_Smashable. Here's it's code:
//============================================================================= // DECO_DestroyedBulldog. //============================================================================= class DECO_DestroyedBulldog extends DECO_Smashable placeable; defaultproperties { EffectWhenDestroyed=Class'XEffects.RocketExplosion' Health=100 DrawType=DT_StaticMesh StaticMesh=StaticMesh'BulldogMeshes.Simple.S_Chassis' Physics=PHYS_Falling LifeSpan=5.000000 DrawScale=0.400000 Skins(0)=Texture'AS_Vehicles_TX.IonPlasmaTank.IonTankBodyDEAD' }
ModifiedBulldog Notes
Things that work:
- You can get in and out of the Bulldog and other vehicles.
- You can hear the horn, startup, idle and shutdown sounds (borrowed heavily from ONS vehicles)
- The destroyed Bulldog shows a mesh, not just a RocketExplosion effect.
- Headlights come on when driving, go off when not.
- All normal drivability and BulldogRocket? turret functionality, including homing rockets to vehicles or players with hud display on lock.
Things that don't work:
- If you jump out and the Bulldog keeps rolling (it has no parking brake without a driver, ATM) you loose the BulldogTrigger?s that enable you to get back in.
- The Deco_DestroyedBulldog mesh doesn't quite fall and hit the ground like it should, the tires simply disappear and there's no neat explosion or smoke.
- The Bulldog "dust" and "rocks" trail behind the bulldog no matter what terrain (or BSP) it's on. (should probably take the level's dust color property)
Technical Notes
The code for KVehicle, KCar and Bulldog is exactly the same as in UT2003, but it was it's interaction with Vehicle and Controller code that seemed to cause problems. The main things that were breaking the Bulldog were KVehicle.KDriverEnter() and KVehicles.KDriverLeave(), although there were many disabled things in the Bulldog code like sounds and the KAddImpulse when it gets hit.
Related Topics
- Vehicles – Main topic for Vehicles
- KVehicleFactory – Vehicle Factory for KVehicles
- BulldogFactory – KVehicleFactory that spawns Bulldogs
- Karma – Main topic for Karma
- BulldogRocket?
- Modifying the Bulldog
- Bulldog Player – Mod to have players spawn as a bulldog
- Mod Ideas/Mini Bulldogs
Discussion
SuperApe: I've been curious about this since UT2004 came out. Although, this just reminds me how badly the Bulldog handles; bad shocks that flop around and the momentum keeps the front tires from gripping enough to steer well. I'm still not sure exactly what part of those KVehicle functions broke it. Any thoughts on this are welcome here in the Discussion section. I will update the source code when we know more.
DaWrecka: On the subject of Bulldog handling, I did play around with this some in UT2003...While I stress I've NOT tried this with UT2004, in 2k3 I found cranking up the KActorGravScale of the Bulldog's KParams actually made it handle more-or-less as you would expect a jeep-thing to handle. A value of 3 worked nicely. That's assuming the level was in normal gravity of course...Reduced level gravity would bollocks the whole thing up just like normal.
Sweavo: I wonder whether a better idea is to steal the hellbender code and re-mesh it as a bulldog... Not that I'll get time to do that but there we go.