UE3 - UT3 Vehicle Problem - Cant find int?

  • Two Factor Authentication is now available on BeyondUnreal Forums. To configure it, visit your Profile and look for the "Two Step Verification" option on the left side. We can send codes via email (may be slower) or you can set up any TOTP Authenticator app on your phone (Authy, Google Authenticator, etc) to deliver codes. It is highly recommended that you configure this to keep your account safe.

QuadraxisMk2

New Member
Jun 23, 2008
4
0
0
Hello guys of Beyond Unreal, I seem to have a problem getting a vehicle to work. What I am attempting to do is create a custom vehicle based off the darkwalker, and have a Fury body as the torso. After many harsh hours of fixing error's, I've hit a roadblock.

Code:
Warning: Can't find 'intAUTVehicle_SAVIORexecPlayWarningSoundIfInCone' in 'SAVIOR.lib'
Warning: Can't find 'intAUTWalkerBase2execInitFeet' in 'SAVIOR.lib'
Warning: Can't find 'intAUTWalkerBase2execInitFeetOnLanding' in 'SAVIOR.lib'
Warning: Can't find 'intAUTWalkerBase2execDoTestStep' in 'SAVIOR.lib'
Error: (Function UTGame.UTGame:ActivateVehicleFactory:0062) Cannot use AllNavigationPoints() here - NavigationPointList not set up yet
Log: === Critical error: ===

The code that it says it cant find is in the script's. I have no clue how to fix the "Can't find 'int' " error, and I've tried looking around Epic's forum, and the BU forums, with very little success. The only thread I found that was similar was this http://gearsforums.epicgames.com/showthread.php?p=25409430 And it doesn't have any sort of fix.

Has anyone seen anything like this error, and if so, is there a fix?

Thanks for your time.
 

QuadraxisMk2

New Member
Jun 23, 2008
4
0
0
Code for SAVIOR

The code is a modified version of Epic's. Anyways, here it is.


BIG Update: Found a fix, vehicle is ingame but with some problems. I removed the native part from all the spots where it couldnt exec, and it doesn't crash my game when I run the Vehicle replacement mutator. However, I got a few new problem such as the camera being all screwed up, The leg's going underground (?) and the fury body, which I used as the torso, scraping the ground.

(What caught my eye is that the functions that it cant exec, they are all native).

HEres the two scripts that were acting up. If you need to look at any others, feel free to ask.

UTWalkerBase2
Code:
/**
 *
 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved. Modded By QuadraxisMk2
 */

class UTWalkerBase2 extends Actor
	abstract
	notplaceable;

// 3 legged walkers, by default
const NUM_WALKER_LEGS = 3;

enum EWalkerLegID
{
	WalkerLeg_Rear,
	WalkerLeg_FrontLeft,
	WalkerLeg_FrontRight
};

/** Skel mesh for the legs. */
var() /*const*/ editconst SkeletalMeshComponent	SkeletalMeshComponent;

/** Refs to shoulder lookat skelcontrols for each leg  */
var protected transient SkelControlLookat ShoulderSkelControl[NUM_WALKER_LEGS];
/** Names for the shoulder skelcontrol nodes for each leg (from the animtree) */
var protected const Name ShoulderSkelControlName[NUM_WALKER_LEGS];

/** If TRUE for corresponding foot, walking/stepping code will ignore that leg */
var() byte IgnoreFoot[NUM_WALKER_LEGS];

/** Handles used to move the walker feet around. */
var() UTWalkerStepHandle FootConstraints[NUM_WALKER_LEGS];

/** world time to advance to the next phase of the step - experimental walker leg code */
var float NextStepStageTime[NUM_WALKER_LEGS];

/** Time, in seconds, that each step stage lasts. */
var() const array<float> StepStageTimes;

/** which stage the step is in for each leg - experimental walker leg code */
var protected int StepStage[NUM_WALKER_LEGS];

/** used to play water effects when feet enter/exit water */
var byte FootInWater[NUM_WALKER_LEGS];
var ParticleSystem FootWaterEffect;

/** Min dist trigger to make foot a possible candidate for next step */
var() float MinStepDist;

/** Max leg extension */
var() float MaxLegReach;

/** Factor in range [0..1].  0 means no leg spread, 1 means legs are spread as far as possible. */
var() float LegSpreadFactor;
var() float	CustomGravityScale;
var() float LandedFootDistSq;

/** How far foot should embed into ground. */
var() protected const float FootEmbedDistance;


/** Bone names for this walker */
var const name FootBoneName[NUM_WALKER_LEGS];
var const name ShoulderBoneName[NUM_WALKER_LEGS];
var const name BaseBoneName;

/** Ref to the walker vehicle that we are attached to. */
var transient UTVehicle_Walker2	WalkerVehicle;

var protected const bool	bHasCrouchMode;
var	bool					bIsDead;

/** Where the feet are right now */
var vector CurrentFootPosition[NUM_WALKER_LEGS];

var array<MaterialImpactEffect> FootStepEffects;
var ParticleSystemComponent FootStepParticles[NUM_WALKER_LEGS];

/** Store indices into the legs array, used to map from rear/left/right leg designations to the model's leg indices.  Indexed by LegID. */
var transient int LegMapping[EWalkerLegID.EnumCount];

/** Base directions from the walker center for the legs to point, in walker-local space.  Indexed by LegID. */
var protected const vector BaseLegDirLocal[EWalkerLegID.EnumCount];

/**
 * Scalar to control how much velocity to add to the desired foot positions.  Indexed by LegID.
 * This effectively controls how far ahead of the walker the legs will try to reach while the walker
 * is moving.
 */
var() const float FootPosVelAdjScale[EWalkerLegID.EnumCount];

/** Names of the anim nodes for playing the step anim for a leg.  Used to fill in FootStepAnimNode array. */
var protected const Name	FootStepAnimNodeName[NUM_WALKER_LEGS];
/** Refs to AnimNodes used for playing step animations */
var protected AnimNode		FootStepAnimNode[NUM_WALKER_LEGS];

/** How far above the current foot position to begin interpolating towards. */
var() protected const float FootStepStartLift;
/** How far above the desired foot position to end the foot step interpolation */
var() protected const float FootStepEndLift;

struct native WalkerLegStepAnimData
{
	/** Where foot wants to be. */
	var vector				DesiredFootPosition;

	/** Normal of the surface at the desired foot position. */
	var vector				DesiredFootPosNormal;

	/** Physical material at the DesiredFootPosition */
	var PhysicalMaterial	DesiredFootPosPhysMaterial;

	/** True if we don't have a valid desired foot position for this leg. */
	var bool				bNoValidFootHold;
};

/** Indexed by LegID. */
var protected WalkerLegStepAnimData StepAnimData[EWalkerLegID.EnumCount];

/** keeps track of previous leg locations */
var protected vector PreviousTraceSeedLocation[NUM_WALKER_LEGS];

/** The walker legs's light environment */
var DynamicLightEnvironmentComponent LegLightEnvironment;

var float MaxFootStepEffectDist;



function PostBeginPlay()
{
	local int Idx;

	super.PostBeginPlay();

	// make sure the rb is awake
	SkeletalMeshComponent.WakeRigidBody();

	for (Idx=0; Idx<NUM_WALKER_LEGS; ++Idx)
	{
		// cache refs to footstep anims
		FootStepAnimNode[Idx] = SkeletalMeshComponent.FindAnimNode(FootStepAnimNodeName[Idx]);

		// cache refs to skel controls
		ShoulderSkelControl[Idx] = SkelControlLookAt(SkeletalMeshComponent.FindSkelControl(ShoulderSkelControlName[Idx]));
		if (ShoulderSkelControl[Idx] != None)
		{
			// turn it on
			ShoulderSkelControl[Idx].SetSkelControlActive(TRUE);
		}
	}
}

simulated function UpdateShadowSettings(bool bWantShadow)
{
	local bool bNewCastShadow, bNewCastDynamicShadow;

	if (SkeletalMeshComponent != None)
	{
		bNewCastShadow = default.SkeletalMeshComponent.CastShadow && bWantShadow;
		bNewCastDynamicShadow = default.SkeletalMeshComponent.bCastDynamicShadow && bWantShadow;
		if (bNewCastShadow != SkeletalMeshComponent.CastShadow || bNewCastDynamicShadow != SkeletalMeshComponent.bCastDynamicShadow)
		{
			SkeletalMeshComponent.CastShadow = bNewCastShadow;
			SkeletalMeshComponent.bCastDynamicShadow = bNewCastDynamicShadow;
			// defer if we can do so without it being noticeable
			if (LastRenderTime < WorldInfo.TimeSeconds - 1.0)
			{
				SetTimer(0.1 + FRand() * 0.5, false, 'ReattachMesh');
			}
			else
			{
				ReattachMesh();
			}
		}
	}
}

/** reattaches the mesh component, because settings were updated */
simulated function ReattachMesh()
{
	DetachComponent(SkeletalMeshComponent);
	AttachComponent(SkeletalMeshComponent);
}

/* epic ===============================================
* ::StopsProjectile()
*
* returns true if Projectiles should call ProcessTouch() when they touch this actor
*/
simulated function bool StopsProjectile(Projectile P)
{
	// Don't block projectiles fired from this vehicle
	return (P.Instigator != WalkerVehicle) && (bProjTarget || bBlockActors);
}

/** Called once to set up legs. */
native function InitFeet();

/** Called on landing to reestablish a foothold */
native function InitFeetOnLanding();

function SetWalkerVehicle(UTVehicle_Walker2 V)
{
	WalkerVehicle = V;
	SkeletalMeshComponent.SetShadowParent(WalkerVehicle.Mesh);
	SkeletalMeshComponent.SetLightEnvironment(LegLightEnvironment);
	InitFeet();
}

event PlayFootStep(int LegIdx)
{
	local AudioComponent AC;
	local UTPhysicalMaterialProperty PhysicalProperty;
	local int EffectIndex;

	local vector HitLoc,HitNorm,TraceLength;
	local TraceHitInfo HitInfo;

	if (FootStepEffects.Length == 0)
	{
		return;
	}

	// figure out what we landed on

	TraceLength = vector(QuatToRotator(SkeletalMeshComponent.GetBoneQuaternion(FootBoneName[LegIdx])))*5.0;
	//Trace(HitLoc,HitNorm, CurrentFootPosition[LegIdx]+TraceLength,CurrentFootPosition[LegIdx],true,,HitInfo);
	Trace(HitLoc,HitNorm, CurrentFootPosition[LegIdx]-TraceLength,CurrentFootPosition[LegIdx]-TraceLength*4.0,true,,HitInfo);
	if(HitInfo.PhysMaterial != none)
	{
		PhysicalProperty = UTPhysicalMaterialProperty(HitInfo.PhysMaterial.GetPhysicalMaterialProperty(class'UTPhysicalMaterialProperty')); //(StepAnimData[LegIdx].DesiredFootPosPhysMaterial.GetPhysicalMaterialProperty(class'UTPhysicalMaterialProperty'));
	}
	if (PhysicalProperty != None)
	{
		EffectIndex = FootStepEffects.Find('MaterialType', PhysicalProperty.MaterialType);
		if (EffectIndex == INDEX_NONE)
		{
			EffectIndex = 0;
		}
		// Footstep particle
		if (FootStepEffects[EffectIndex].ParticleTemplate != None && EffectIsRelevant(Location, false))
		{
			if (FootStepParticles[LegIdx] == None)
			{
				FootStepParticles[LegIdx] = new(self) class'UTParticleSystemComponent';
				FootStepParticles[LegIdx].bAutoActivate = false;
				SkeletalMeshComponent.AttachComponent(FootStepParticles[LegIdx], FootBoneName[LegIdx]);
			}
			FootStepParticles[LegIdx].SetTemplate(FootStepEffects[EffectIndex].ParticleTemplate);
			FootStepParticles[LegIdx].ActivateSystem();
		}
	}

	AC = WorldInfo.CreateAudioComponent(FootStepEffects[EffectIndex].Sound, false, true);
	if (AC != None)
	{
		AC.bUseOwnerLocation = false;

		// play it closer to the player if he's controlling the walker
		AC.Location = (PlayerController(WalkerVehicle.Controller) != None) ? 0.5 * (Location + CurrentFootPosition[LegIdx]) : CurrentFootPosition[LegIdx];

		AC.bAutoDestroy = true;
		AC.Play();
	}
	WalkerVehicle.TookStep(LegIdx);
}

event SpawnFootWaterEffect(int LegIdx)
{
	if (FootWaterEffect != None)
	{
		WorldInfo.MyEmitterPool.SpawnEmitter(FootWaterEffect, CurrentFootPosition[LegIdx]);
	}
}

/**
 * Default behavior when shot is to apply an impulse and kick the KActor.
 */
event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
{
	local vector ApplyImpulse;

	if (damageType.default.KDamageImpulse > 0 )
	{
		if ( VSize(momentum) < 0.001 )
		{
			`Log("Zero momentum to KActor.TakeDamage");
			return;
		}

		// Make sure we have a valid TraceHitInfo with our SkeletalMesh
		// we need a bone to apply proper impulse
		CheckHitInfo( HitInfo, SkeletalMeshComponent, Normal(Momentum), hitlocation );

		ApplyImpulse = Normal(momentum) * damageType.default.KDamageImpulse;
		if ( HitInfo.HitComponent != None )
		{
			HitInfo.HitComponent.AddImpulse(ApplyImpulse, HitLocation, HitInfo.BoneName);
		}
	}
}

function PlayDying()
{
	local int i;

	Lifespan = 8.0;
	CustomGravityScale = 1.5;
	bCollideWorld = true;
	bIsDead = true;

	// clear all constraints
	for ( i=0; i<3; i++ )
	{
		FootConstraints[i].ReleaseComponent();
	}

	SkeletalMeshComponent.SetTraceBlocking(true, false);
	SkeletalMeshComponent.SetBlockRigidBody(true);
	SkeletalMeshComponent.SetShadowParent(None);
	GotoState('DyingVehicle');
}

function AddVelocity( vector NewVelocity, vector HitLocation,class<DamageType> DamageType, optional TraceHitInfo HitInfo )
{
	if ( !IsZero(NewVelocity) )
	{
		if (Location.Z > WorldInfo.StallZ)
		{
			NewVelocity.Z = FMin(NewVelocity.Z, 0);
		}
		NewVelocity = DamageType.Default.VehicleMomentumScaling * DamageType.Default.KDamageImpulse * Normal(NewVelocity);
		SkeletalMeshComponent.AddImpulse(NewVelocity, HitLocation);
	}
}

state DyingVehicle
{
	event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
	{
		if ( DamageType == None )
			return;
		AddVelocity(Momentum, HitLocation, DamageType, HitInfo);
	}
}

/** cause a single step, used for debugging */
native function DoTestStep(int LegIdx, float Mag);

/** NOTE:  this is actually what changes the colors on the PowerOrb on the legs of the Walker **/
simulated function TeamChanged()
{
	local MaterialInterface NewMaterial;

	NewMaterial = WalkerVehicle.Mesh.GetMaterial(0);
	SkeletalMeshComponent.SetMaterial( 0, NewMaterial );

	NewMaterial = WalkerVehicle.Mesh.GetMaterial(1);
	SkeletalMeshComponent.SetMaterial( 1, NewMaterial );
}


/** NOTE:  this is actually what changes the colors on the PowerOrb on the legs of the Walker **/
simulated function SetBurnOut()
{
	local int TeamNum;
	local BurnOutDatum BOD;
	local MaterialInterface NewMaterial;

	TeamNum = WalkerVehicle.GetTeamNum();

	// we use the walker in DM maps where the team will be 255
	if( WalkerVehicle.PowerOrbBurnoutTeamMaterials.length < TeamNum )
	{
		TeamNum = 0;
	}

	// set our specific turret BurnOut Material
	if( ( WalkerVehicle.PowerOrbBurnoutTeamMaterials.length > 0 ) && ( WalkerVehicle.PowerOrbBurnoutTeamMaterials[TeamNum] != None ) )
	{
		NewMaterial = WalkerVehicle.PowerOrbBurnoutTeamMaterials[TeamNum];
		WalkerVehicle.Mesh.SetMaterial( 1, NewMaterial );
		BOD.MITV = WalkerVehicle.Mesh.CreateAndSetMaterialInstanceTimeVarying(1);
		WalkerVehicle.BurnOutMaterialInstances[WalkerVehicle.BurnOutMaterialInstances.length] = BOD;
	}
}


defaultproperties
{
	TickGroup=TG_PostAsyncWork

	Physics=PHYS_RigidBody

	bEdShouldSnap=true
	bStatic=false
	bCollideActors=true
	bBlockActors=false
	bWorldGeometry=false
	bCollideWorld=false
	bProjTarget=true
	bIgnoreEncroachers=true
	bNoEncroachCheck=true

	RemoteRole=ROLE_None

	Begin Object Class=DynamicLightEnvironmentComponent Name=LegLightEnvironmentComp
	    AmbientGlow=(R=0.2,G=0.2,B=0.2,A=1.0)
	End Object
	LegLightEnvironment=LegLightEnvironmentComp
	Components.Add(LegLightEnvironmentComp)


	Begin Object Class=SkeletalMeshComponent Name=LegMeshComponent
		CollideActors=true
		BlockActors=false
		BlockZeroExtent=true
		BlockNonZeroExtent=true
		PhysicsWeight=1
		bHasPhysicsAssetInstance=true
		BlockRigidBody=false
		RBChannel=RBCC_Nothing
		RBCollideWithChannels=(Default=TRUE,GameplayPhysics=TRUE,EffectPhysics=TRUE)
		bUseAsOccluder=FALSE
		bUpdateSkelWhenNotRendered=true
		bIgnoreControllersWhenNotRendered=true
		bAcceptsDecals=false
		bUseCompartment=FALSE
		LightEnvironment=LegLightEnvironmentComp
	End Object
	CollisionComponent=LegMeshComponent
	SkeletalMeshComponent=LegMeshComponent
	Components.Add(LegMeshComponent)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle0
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(0)=RB_FootHandle0
	Components.Add(RB_FootHandle0)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle1
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(1)=RB_FootHandle1
	Components.Add(RB_FootHandle1)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle2
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(2)=RB_FootHandle2
	Components.Add(RB_FootHandle2)

	MinStepDist=20.0
	MaxLegReach=450.0

	FootBoneName(0)=Leg1_End
	FootBoneName(1)=Leg2_End
	FootBoneName(2)=Leg3_End
	ShoulderBoneName(0)=Leg1_Shoulder
	ShoulderBoneName(1)=Leg2_Shoulder
	ShoulderBoneName(2)=Leg3_Shoulder

	BaseBoneName=Root
	CustomGravityScale=0.f
	FootEmbedDistance=8.0
	LandedFootDistSq=400.0

	ShoulderSkelControlName[0]="Shoulder1"
	ShoulderSkelControlName[1]="Shoulder2"
	ShoulderSkelControlName[2]="Shoulder3"

	BaseLegDirLocal[WalkerLeg_Rear]=(X=-1.f,Y=0.f,Z=0.f)
	BaseLegDirLocal[WalkerLeg_FrontLeft]=(X=0.5f,Y=-0.866025f,Z=0.f)
	BaseLegDirLocal[WalkerLeg_FrontRight]=(X=0.5f,Y=0.866025f,Z=0.f)

	FootPosVelAdjScale[WalkerLeg_Rear]=1.2f
	FootPosVelAdjScale[WalkerLeg_FrontLeft]=0.6f
	FootPosVelAdjScale[WalkerLeg_FrontRight]=0.6f

	FootStepStartLift=512.f
	FootStepEndLift=128.f

	StepStageTimes(0)=0.7f			// foot pickup and move forward
	StepStageTimes(1)=0.135f		// foot stab to ground at destination
	StepStageTimes(2)=1.f			// wait for foot to reach dest before forcibly ending step

	MaxFootStepEffectDist=5000.0
}

UTVehicle_SAVIOR

Code:
/**
 *
 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved. Modded By QuadraxisMk2
 */

class UTVehicle_SAVIOR extends UTVehicle_Walker2
      abstract;
      
var repnotify byte TurretFlashCount;
var repnotify rotator TurretWeaponRotation;
var byte TurretFiringMode;

var particleSystem BeamTemplate;

/** Holds the Emitter for the Beam */
var ParticleSystemComponent BeamEmitter[2];

/** Where to attach the Beam */
var name BeamSockets[2];

/** The name of the EndPoint parameter */
var name EndPointParamName;

var protected AudioComponent BeamAmbientSound;
var SoundCue BeamFireSound;

var float WarningConeMaxRadius;
var float LengthDarkWalkerWarningCone;
var AudioComponent WarningConeSound;
var name ConeParam;

var ParticleSystemComponent EffectEmitter;

var actor LastHitActor;

var bool bIsBeamActive;

/** radius to allow players under this darkwalker to gain entry */
var float CustomEntryRadius;

/** When asleep, monitor distance below darkwalker to make sure it isn't in the air. */
var float LastSleepCheckDistance;

/** Disable aggressive sleeping behaviour. */
var bool bSkipAggresiveSleep;

var float CustomGravityScaling;

/** @hack: replicated copy of bHoldingDuck for clients */
var bool bIsDucking;



replication
{
	if (!bNetOwner)
		bIsDucking;
	if (!IsSeatControllerReplicationViewer(1))
		TurretFlashCount, TurretWeaponRotation;
}

native simulated final function PlayWarningSoundIfInCone (Pawn Target);

simulated function PostBeginPlay()
{
	super.PostBeginPlay();
	AddBeamEmitter();
	SetTimer(1.0, TRUE, 'SleepCheckGroundDistance');
}

simulated event Destroyed()
{
	super.Destroyed();
	KillBeamEmitter();
	ClearTimer('SleepCheckGroundDistance');
}

simulated function SleepCheckGroundDistance()
{
	local vector HitLocation, HitNormal;
	local actor HitActor;
	local float SleepCheckDistance;

	bSkipAggresiveSleep = FALSE;

	if(!bDriving && !Mesh.RigidBodyIsAwake())
	{
		HitActor = Trace(HitLocation, HitNormal, Location - vect(0,0,1000), Location, TRUE);

		SleepCheckDistance = 1000.0;
		if(HitActor != None)
		{
			SleepCheckDistance = VSize(HitLocation - Location);
		}

		// If distance has changed, wake it
		if(Abs(SleepCheckDistance - LastSleepCheckDistance) > 10.0)
		{
			Mesh.WakeRigidBody();
			bSkipAggresiveSleep = TRUE;
			LastSleepCheckDistance = SleepCheckDistance;
		}
	}
}

simulated function AddBeamEmitter()
{
	local int i;
	if (WorldInfo.NetMode != NM_DedicatedServer)
	{
		for (i=0;i<2;i++)
		{
			if (BeamEmitter[i] == None)
			{
				if (BeamTemplate != None)
				{
					BeamEmitter[i] = new(Outer) class'UTParticleSystemComponent';
					BeamEmitter[i].SetTemplate(BeamTemplate);
					BeamEmitter[i].SecondsBeforeInactive=1.0f;
					BeamEmitter[i].SetHidden(true);
					Mesh.AttachComponentToSocket( BeamEmitter[i],BeamSockets[i] );
				}
			}
			else
			{
				BeamEmitter[i].ActivateSystem();
			}
		}
	}
}

simulated function KillBeamEmitter()
{
	local int i;
	for (i=0;i<2;i++)
	{
		if (BeamEmitter[i] != none)
		{
			//BeamEmitter[i].SetHidden(true);
			BeamEmitter[i].DeactivateSystem();
		}
	}
}

simulated function SetBeamEmitterHidden(bool bHide)
{
	local int i;

	if (bHide && EffectEmitter != None)
	{
		EffectEmitter.SetActive(false);
	}
	if ( WorldInfo.NetMode != NM_DedicatedServer )
	{
		if (bIsBeamActive != !bHide )
		{
			for (i=0; i<2; i++)
			{
					if (BeamEmitter[i] != none)
					{
						if(!bHide)
							BeamEmitter[i].SetHidden(bHide);
						else
							BeamEmitter[i].DeactivateSystem();
					}

					if (!bHide)
					{
						BeamAmbientSound.SoundCue = BeamFireSound;
						BeamAmbientSound.Play();
						BeamEmitter[i].ActivateSystem();
					}
					else
					{
						BeamAmbientSound.FadeOut(0.3f, 0.f);
					}
			}
		}
		bIsBeamActive = !bHide;
	}
}

/**
 * Detect the transition from vehicle to ground and vice versus and handle it
 */

simulated function actor FindWeaponHitNormal(out vector HitLocation, out Vector HitNormal, vector End, vector Start, out TraceHitInfo HitInfo)
{
	local Actor NewHitActor;

	NewHitActor = Super.FindWeaponHitNormal(HitLocation, HitNormal, End, Start, HitInfo);
	if (NewHitActor != LastHitActor && EffectEmitter != None)
	{
		EffectEmitter.SetActive(false);
	}
	LastHitActor = NewHitActor;
	return NewHitActor;
}


simulated function SpawnImpactEmitter(vector HitLocation, vector HitNormal, const out MaterialImpactEffect ImpactEffect, int SeatIndex)
{
	local rotator TmpRot;

	TmpRot = rotator(HitNormal);
	TmpRot.Pitch = NormalizeRotAxis(TmpRot.Pitch - 16384);

	if (EffectEmitter == None)
	{
		EffectEmitter = new(self) class'ParticleSystemComponent';
		EffectEmitter.SetTemplate(ImpactEffect.ParticleTemplate);
		EffectEmitter.SetAbsolute(true, true, true);
		EffectEmitter.SetScale(0.7);
		AttachComponent(EffectEmitter);
	}

	EffectEmitter.SetTranslation(HitLocation);
	EffectEmitter.SetRotation(TmpRot);
	EffectEmitter.SetActive(true);
}

simulated function VehicleWeaponImpactEffects(vector HitLocation, int SeatIndex)
{
	local int i;

	Super.VehicleWeaponImpactEffects(HitLocation, SeatIndex);

	if ( SeatIndex == 0 )
	{
		SetBeamEmitterHidden(false);
		for(i=0;i<2;i++)
		{
			BeamEmitter[i].SetVectorParameter(EndPointParamName, HitLocation);
		}
	}
}

simulated function VehicleWeaponStoppedFiring( bool bViaReplication, int SeatIndex )
{
	if (SeatIndex == 0)
	{
		SetBeamEmitterHidden(true);
	}
}

/** notification from WalkerBody that foot just landed */
function TookStep(int LegIdx)
{
	EyeStepOffset = MaxEyeStepOffset * FMin(1.0,VSize(Velocity)/AirSpeed);
}

function PassengerLeave(int SeatIndex)
{
	Super.PassengerLeave(SeatIndex);

	SetDriving(NumPassengers() > 0);
}

function bool PassengerEnter(Pawn P, int SeatIndex)
{
	local bool b;

	b = Super.PassengerEnter(P, SeatIndex);
	SetDriving(NumPassengers() > 0);
	return b;
}

simulated function VehicleCalcCamera(float DeltaTime, int SeatIndex, out vector out_CamLoc, out rotator out_CamRot, out vector CamStart, optional bool bPivotOnly)
{
	local UTPawn P;

	if (SeatIndex == 1)
	{
		// Handle the fixed view
		P = UTPawn(Seats[SeatIndex].SeatPawn.Driver);
		if (P != None && P.bFixedView)
		{
			out_CamLoc = P.FixedViewLoc;
			out_CamRot = P.FixedViewRot;
			return;
		}

		out_CamLoc = GetCameraStart(SeatIndex);
		CamStart = out_CamLoc;
		out_CamRot = Seats[SeatIndex].SeatPawn.GetViewRotation();
		return;
	}

	Super.VehicleCalcCamera(DeltaTime, SeatIndex, out_CamLoc, out_CamRot, CamStart, bPivotOnly);
}


/**
*  Overloading this from SVehicle to avoid torquing the walker head.
*/
function AddVelocity( vector NewVelocity, vector HitLocation, class<DamageType> DamageType, optional TraceHitInfo HitInfo )
{
	// apply hit at location, not hitlocation
	Super.AddVelocity(NewVelocity, Location, DamageType, HitInfo);
}

/**
  * Let pawns standing under me get in, if I have a driver.
  */
function bool InCustomEntryRadius(Pawn P)
{
	return ( (P.Location.Z < Location.Z) && (VSize2D(P.Location - Location) < CustomEntryRadius)
		&& FastTrace(P.Location, Location) );
}

event WalkerDuckEffect();

simulated function BlowupVehicle()
{
	local vector Impulse;
	Super.BlowupVehicle();
	Impulse = Velocity; //LastTakeHitInfo;
	Impulse.Z = 0;
	if(IsZero(Impulse))
	{
		Impulse = vector(Rotation); // forward if no velocity.
	}
	Impulse *= 4000/VSize(Impulse);
	Mesh.SetRBLinearVelocity(Impulse);
	Mesh.SetRBAngularVelocity(VRand()*5, true);
	bStayUpright = false;
	bCanFlip=true;
}

simulated function bool ShouldClamp()
{
	return false;
}

//=================================
// AI Interface

function bool ImportantVehicle()
{
	return true;
}

function bool RecommendLongRangedAttack()
{
	return true;
}

defaultproperties
{
	Begin Object Name=SVehicleMesh
		RBCollideWithChannels=(Default=TRUE,GameplayPhysics=TRUE,EffectPhysics=TRUE,Vehicle=TRUE,Untitled1=TRUE)
	End Object

	Begin Object Name=RB_BodyHandle
		LinearDamping=100.0
		LinearStiffness=99000.0
		AngularDamping=100.0
		AngularStiffness=99000.0
	End Object

	Health=1000
	MeleeRange=-100.0

	LegTraceOffset=(X=0,Y=0,Z=0)
	LegTraceZUpAmount=700

	COMOffset=(x=0,y=0.0,z=150)
	bCanFlip=false

	AirSpeed=350.0
	GroundSpeed=350.0

	bFollowLookDir=true
	bCanStrafe=true
	bTurnInPlace=true
	ObjectiveGetOutDist=750.0
	ExtraReachDownThreshold=450.0
	MaxDesireability=0.75
	SpawnRadius=125.0
	bNoZSmoothing=true
	BaseBodyOffset=(Z=0.0)
	LookForwardDist=40.0
	TeamBeaconOffset=(z=350.0)

	bUseSuspensionAxis=true

	bStayUpright=true
	StayUprightRollResistAngle=0.0			// will be "locked"
	StayUprightPitchResistAngle=0.0
	//StayUprightStiffness=10
	//StayUprightDamping=100

	WheelSuspensionTravel(WalkerStance_Standing)=600
	WheelSuspensionTravel(WalkerStance_Parked)=0
	WheelSuspensionTravel(WalkerStance_Crouched)=153
	SuspensionTravelAdjustSpeed=250
	HoverAdjust(WalkerStance_Standing)=-280.0
	HoverAdjust(WalkerStance_Parked)=0.0
	HoverAdjust(WalkerStance_Crouched)=-63.0

	Begin Object Class=UTVehicleSimHover Name=SimObject
		WheelSuspensionStiffness=100.0
		WheelSuspensionDamping=40.0
		WheelSuspensionBias=0.0
		MaxThrustForce=600.0
		MaxReverseForce=600.0
		LongDamping=0.3
		MaxStrafeForce=600.0
		LatDamping=0.3
		MaxRiseForce=0.0
		UpDamping=0.0
		TurnTorqueFactor=9000.0
		TurnTorqueMax=10000.0
		TurnDamping=3.0
		MaxYawRate=1.6
		PitchTorqueMax=35.0
		PitchDamping=0.1
		RollTorqueMax=50.0
		RollDamping=0.1
		MaxRandForce=0.0
		RandForceInterval=1000.0
		bCanClimbSlopes=true
		PitchTorqueFactor=0.0
		RollTorqueTurnFactor=0.0
		RollTorqueStrafeFactor=0.0
		bAllowZThrust=false
		bStabilizeStops=true
		StabilizationForceMultiplier=1.0
		bFullThrustOnDirectionChange=true
		bDisableWheelsWhenOff=false
		HardLimitAirSpeedScale=1.5
	End Object
	SimObj=SimObject
	Components.Add(SimObject)

	Begin Object Class=UTHoverWheel Name=RThruster
		BoneName="Tail"
		BoneOffset=(X=0,Y=0,Z=-20)
		WheelRadius=70
		SuspensionTravel=20
		bPoweredWheel=false
		SteerFactor=1.0
		LongSlipFactor=0.0
		LatSlipFactor=0.0
		HandbrakeLongSlipFactor=0.0
		HandbrakeLatSlipFactor=0.0
		bCollidesVehicles=FALSE
	End Object
	Wheels(0)=RThruster

	RespawnTime=45.0

	LengthDarkWalkerWarningCone=7500

	HoverBoardAttachSockets=(HoverAttach00,HoverAttach01)

	bHasCustomEntryRadius=true
	CustomEntryRadius=300.0

	bIgnoreStallZ=TRUE
	HUDExtent=250.0

	MaxEyeStepOffset=48.0
	EyeStepFadeRate=2.0
	EyeStepBlendRate=2.0
	BaseEyeheight=0
	Eyeheight=0

	bFindGroundExit=false
	bShouldAutoCenterViewPitch=FALSE

	bIsNecrisVehicle=true

	HornIndex=3
	CustomGravityScaling=0.9
}
 
Last edited:

Raven

Member
Jan 17, 2004
147
0
16
41
turniej.unreal.pl
I'm not in UT3, but what I want to say is common to all Unreal Engine versions :). There is reason why some parts of the code are native and you shouldn't just delete 'em. Instead make subclass of whatever you want to modify (UTWalkerBase is base class I suppose). Error "intAUTVehicle_SAVIORexecPlayWarningSoundIfInCone" means that function is declared as native (without number) and compiler is looking for it in dll/lib. Do not rewrite whole class - subclass it instead. It's easier and faster.
 

QuadraxisMk2

New Member
Jun 23, 2008
4
0
0
Apologies for this topic necro.

I tried to subclass the package's but got some errors when compiling, Forgot what they were, guess I am not used to subclassing stuff. If anyone needs the error's I got when I attempted to subclass, I can provide it.

Anyways.

After some frustration, deleting the vehicle, and starting from a older backup, I'm at the same spot where I was before, with the Fury Body Scraping the floor, and the leg's not even appearing. I did fix the camera issue however.

Error's from the test session.
(It had this string of error's twice)
ScriptWarning: UTVehicle_SAVIOR_Content vCTF-Suspense.TheWorld:persistentLevel.UTVehicle_SAVIOR_Content_0 (Function UTGame.UTVehicle:InitializeTurrets:0182) Failed to find skeletal controller named BaseAnimated (Seat 0) for UTVehicle_SAVIOR_Content_0 in AnimTree AT_VH_Fury
Log: USkeletalMeshComponent::AttachComponent : Could not find bone 'BodyRoot' in UTWalkerBase2_SAVIOR_0 attaching: Light0
Log: USkeletalMeshComponent::AttachComponent : Could not find bone 'BodyRoot' in UTWalkerBase2_SAVIOR_0 attaching: LegAttachPSC_0
Log: USkeletalMeshComponent::AttachComponent : Could not find bone 'BodyRoot' in UTWalkerBase2_SAVIOR_0 attaching: LegAttachPSC_1
Log: USkeletalMeshComponent::AttachComponent : Could not find bone 'BodyRoot' in UTWalkerBase2_SAVIOR_0 attaching: LegAttachPSC_2

Code used in the vehicle (2 parts of it, where the error's are originating from)

UTVehicle_SAVIOR_Content
Code:
/**
 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved.
 */

class UTVehicle_SAVIOR_Content extends UTVehicle_SAVIOR;

/** dynamic light which moves around following primary fire beam impact point */
var UTDarkWalkerBeamLight BeamLight;

var float HornImpulseMag;
var float VehicleHornModifier;
var ParticleSystemComponent DarkwalkerHornEffect;
var repnotify bool bSpeakerReady;
var float SpeakerRadius;
var float SpeakerRechargeTime;
var SoundCue HornAttackSound;


replication
{
	if (!bNetOwner)
		bSpeakerReady;
}

event MantaDuckEffect()
{
	if (bHoldingDuck)
	{
		VehicleEvent('CrushStart');
	}
	else
	{
		VehicleEvent('CrushStop');
	}
}

function DriverLeft()
{
	Super.DriverLeft();

	if (Role == ROLE_Authority && UTVWeap_SAVIORTurret(Seats[0].Gun) != none)
	{
		UTVWeap_SAVIORTurret(Seats[0].Gun).StopBeamFiring();
	}
}

/** Overloaded so we can attach the muzzle flash light to a custom socket */
simulated function CauseMuzzleFlashLight(int SeatIndex)
{
	Super.CauseMuzzleFlashLight(SeatIndex);

	if ( (SeatIndex == 0) && Seats[SeatIndex].MuzzleFlashLight != none )
	{
		Mesh.DetachComponent(Seats[SeatIndex].MuzzleFlashLight);
		Mesh.AttachComponentToSocket(Seats[SeatIndex].MuzzleFlashLight, 'PrimaryMuzzleFlash');
	}
}

simulated function SpawnImpactEmitter(vector HitLocation, vector HitNormal, const out MaterialImpactEffect ImpactEffect, int SeatIndex)
{
	Super.SpawnImpactEmitter(HitLocation, HitNormal, ImpactEffect, SeatIndex);

	if ( SeatIndex == 0 )
	{
		if (BeamLight == None || BeamLight.bDeleteMe)
		{
			BeamLight = Spawn(class'UTDarkWalkerBeamLight');
			BeamLight.AmbientSound.Play();
		}
		BeamLight.SetLocation(HitLocation + HitNormal*128);
	}
}

simulated function KillBeamEmitter()
{
	Super.KillBeamEmitter();

	if (BeamLight != None)
	{
		BeamLight.Destroy();
	}
}

simulated event Destroyed()
{
	Super.Destroyed();

	if (BeamLight != None)
	{
		BeamLight.Destroy();
	}
}

simulated function SetBeamEmitterHidden(bool bHide)
{
	Super.SetBeamEmitterHidden(bHide);

	if (bHide && BeamLight != None)
	{
		BeamLight.AmbientSound.Stop();
		BeamLight.Destroy();
	}
}

simulated function bool OverrideBeginFire(byte FireModeNum)
{
	if (FireModeNum == 1)
	{
		if (bSpeakerReady)
		{
			PlayHornAttack();
		}
		return true;
	}

	return false;
}

function byte ChooseFireMode()
{
	if (Controller != None && Controller.Enemy != None && bSpeakerReady && VSize2D(Controller.Enemy.Location - Location) <= SpeakerRadius)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

function bool NeedToTurn(vector Targ)
{
	// speaker fire is a radius, so if bot wants to do that, don't need to turn
	return (ChooseFireMode() == 1) ? false : Super.NeedToTurn(Targ);
}

simulated function PlayHornAttack()
{
	local Pawn HitPawn;
	local vector HornImpulse, HitLocation, HitNormal;
	local Pawn BoardPawn;
	local UTVehicle_Scavenger UTScav;
	local UTPawn OldDriver;
	local UTVehicle UTV;

	bSpeakerReady = false;

	if (Trace(HitLocation, HitNormal, Location - vect(0,0,600), Location) != None)
	{
		DarkwalkerHornEffect.SetTranslation(HitLocation - Location);
	}
	else
	{
		HitLocation = Location;
		HitLocation.Z -= 400;
		DarkwalkerHornEffect.SetTranslation(vect(0,0,-400));
	}
	if (WorldInfo.NetMode != NM_DedicatedServer)
	{
		PlaySound(HornAttackSound, true);
		DarkwalkerHornEffect.ActivateSystem();
	}

	if (Role == ROLE_Authority)
	{
		MakeNoise(1.0);

		foreach OverlappingActors(class 'Pawn', HitPawn, SpeakerRadius, HitLocation)
		{
			if ( (HitPawn.Mesh != None) && !WorldInfo.GRI.OnSameTeam(HitPawn, self))
			{
				// throw him outwards also
				HornImpulse = HitPawn.Location - HitLocation;
				HornImpulse.Z = 0;
				HornImpulse = HornImpulseMag * Normal(HornImpulse);
				HornImpulse.Z = 250.0;

				if (HitPawn.Physics != PHYS_RigidBody && HitPawn.IsA('UTPawn'))
				{
					HitPawn.Velocity += HornImpulse;
					UTPawn(HitPawn).ForceRagdoll();
					UTPawn(HitPawn).FeignDeathStartTime = WorldInfo.TimeSeconds + 1.5;
					HitPawn.LastHitBy = Controller;
				}
				else if( UTVehicle_Hoverboard(HitPawn) != none)
				{
					HitPawn.Velocity += HornImpulse;
					BoardPawn = UTVehicle_Hoverboard(HitPawn).Driver; // just in case the board gets destroyed from the ragdoll
					UTVehicle_Hoverboard(HitPawn).RagdollDriver();
					HitPawn = BoardPawn;
					HitPawn.LastHitBy = Controller;
				}
				else if ( HitPawn.Physics == PHYS_RigidBody )
				{
					UTV = UTVehicle(HitPawn);
					if(UTV != none)
					{
						// Special case for scavenger - force into ball mode for a bit.
						UTScav = UTVehicle_Scavenger(UTV);
						if(UTScav != None && UTScav.bDriving)
						{
							UTScav.BallStatus.bIsInBallMode = TRUE;
							UTScav.BallStatus.bBoostOnTransition = FALSE;
							UTScav.NextBallTransitionTime = WorldInfo.TimeSeconds + 2.0; // Stop player from putting legs out for 2 secs.
							UTScav.BallModeTransition();
						}
						// See if darkwalker forces this player out of vehicle.
						else if(UTV.bRagdollDriverOnDarkwalkerHorn)
						{
							OldDriver = UTPawn(UTV.Driver);
							if (OldDriver != None)
							{
								UTV.DriverLeave(true);
								OldDriver.Velocity += HornImpulse;
								OldDriver.ForceRagdoll();
								OldDriver.FeignDeathStartTime = WorldInfo.TimeSeconds + 1.5;
								OldDriver.LastHitBy = Controller;
							}
						}

						HitPawn.Mesh.AddImpulse(HornImpulse*VehicleHornModifier, HitLocation);
					}
					else
					{
						HitPawn.Mesh.AddImpulse(HornImpulse, HitLocation,, true);
					}
				}
			}
		}
	}
	SetTimer(SpeakerRechargeTime, false, 'ClearHornTimer');
}

simulated function ClearHornTimer()
{
	bSpeakerReady = true;
}

simulated event ReplicatedEvent(name VarName)
{
	if (VarName == 'bSpeakerReady')
	{
		if (!bSpeakerReady)
		{
			PlayHornAttack();
		}
	}
	else
	{
		Super.ReplicatedEvent(VarName);
	}
}

simulated function TeamChanged()
{
	local MaterialInterface NewMaterial;

	if( Team < PowerOrbTeamMaterials.length )
	{
		NewMaterial = PowerOrbTeamMaterials[Team];
	}
	else
	{
		NewMaterial = PowerOrbTeamMaterials[0];
	}

	if (NewMaterial != None)
	{
		Mesh.SetMaterial(1, NewMaterial);

		if (DamageMaterialInstance[1] != None)
		{
			DamageMaterialInstance[1].SetParent(NewMaterial);
		}
	}

	Super.TeamChanged();
}



defaultproperties
{
	Begin Object Name=CollisionCylinder
		CollisionHeight=100.0
		CollisionRadius=140.0
		Translation=(X=0.0,Y=0.0,Z=50.0)
	End Object

	Begin Object Name=SVehicleMesh
		SkeletalMesh=SkeletalMesh'VH_Fury.Mesh.SK_VH_Fury'
		PhysicsAsset=PhysicsAsset'VH_Fury.Mesh.SK_VH_Fury_Physics'
		AnimSets(0)=AnimSet'VH_Fury.Anims.K_VH_Fury'
		AnimTreeTemplate=AnimTree'VH_Fury.Anims.AT_VH_Fury'
		MorphSets[0]=MorphTargetSet'VH_Fury.Mesh.SK_VH_Fury_MorphTargets'
	End Object

	Begin Object Class=AudioComponent Name=WarningSound
		SoundCue=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_Darkwalker_WarningConeLoop'
	End Object
	WarningConeSound=WarningSound
	Components.Add(WarningSound);

	Seats(0)={( GunClass=class'UTVWeap_SAVIORTurret',
				GunSocket=(VH_Death),

				GunPivotPoints=(Base),
				TurretVarPrefix="",
				CameraTag=Link03,
				CameraOffset=-280,
				CameraSafeOffset=(Z=200),
				DriverDamageMult=0.0,
				SeatIconPos=(X=0.46,Y=0.2),
				TurretControls=(BaseAnimated),
				CameraBaseOffset=(X=40,Y=0,Z=0),
				MuzzleFlashLightClass=class'UTDarkWalkerMuzzleFlashLight',
				WeaponEffects=((SocketName=ArmSocket0,Scale3D=(X=5.0,Y=8.0,Z=8.0)),(SocketName=ArmSocket1,Scale3D=(X=5.0,Y=8.0,Z=8.0)),(SocketName=ArmSocket2,Scale3D=(X=5.0,Y=8.0,Z=8.0)),(SocketName=ArmSocket3,Scale3D=(X=5.0,Y=8.0,Z=8.0)))
				)}

	// These muzzleflashes are the idle effects it seems, so start them with the engine.
	VehicleEffects(0)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_MuzzleFlash',EffectSocket=MainGun_00)
	VehicleEffects(1)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_MuzzleFlash',EffectSocket=MainGun_01)

	VehicleEffects(2)=(EffectStartTag=TurretWeapon03,EffectEndTag=STOP_TurretWeapon00,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_Secondary_MuzzleFlash',EffectSocket=TurretBarrel_00)
	VehicleEffects(3)=(EffectStartTag=TurretWeapon00,EffectEndTag=STOP_TurretWeapon01,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_Secondary_MuzzleFlash',EffectSocket=TurretBarrel_01)
	VehicleEffects(4)=(EffectStartTag=TurretWeapon01,EffectEndTag=STOP_TurretWeapon02,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_Secondary_MuzzleFlash',EffectSocket=TurretBarrel_02)
	VehicleEffects(5)=(EffectStartTag=TurretWeapon02,EffectEndTag=STOP_TurretWeapon03,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_Secondary_MuzzleFlash',EffectSocket=TurretBarrel_03)

	VehicleEffects(6)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_AimBeam',EffectSocket=LT_AimBeamSocket)
	VehicleEffects(7)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_AimBeam',EffectSocket=RT_AimBeamSocket)
	VehicleEffects(8)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,EffectTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_PowerBall',EffectTemplate_Blue=ParticleSystem'VH_Darkwalker.Effects.P_VH_DarkWalker_PowerBall_Blue',EffectSocket=PowerBallSocket)
	VehicleEffects(9)=(EffectStartTag=DamageSmoke,EffectEndTag=NoDamageSmoke,bRestartRunning=false,EffectTemplate=ParticleSystem'Envy_Effects.Vehicle_Damage.P_Vehicle_Damage_1_DarkWalker',EffectSocket=DamageSmoke01)

	Begin Object Class=ParticleSystemComponent Name=HornEffect
		Template=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_HornEffect'
		bAutoActivate=false
		Translation=(x=0.0,y=0.0,z=-400.0)
		SecondsBeforeInactive=1.0f
	End Object
	Components.Add(HornEffect);
	DarkwalkerHornEffect=HornEffect;

	// Sounds
	// Engine sound.
	Begin Object Class=AudioComponent Name=MantaEngineSound
		SoundCue=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_EngineLoopCue'
	End Object
	EngineSound=MantaEngineSound
	Components.Add(MantaEngineSound);

	CollisionSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_CollideCue'
	EnterVehicleSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_StartCue'
	ExitVehicleSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_StopCue'

	// Scrape sound.
	Begin Object Class=AudioComponent Name=BaseScrapeSound
		SoundCue=SoundCue'A_Gameplay.A_Gameplay_Onslaught_MetalScrape01Cue'
	End Object
	ScrapeSound=BaseScrapeSound
	Components.Add(BaseScrapeSound);

	// Initialize sound parameters.
	EngineStartOffsetSecs=2.0
	EngineStopOffsetSecs=1.0

	BodyAttachSocketName=ExhaustSocket

	BeamTemplate=ParticleSystem'VH_DarkWalker.Effects.P_VH_DarkWalker_MainGun_Beam'
	BeamSockets(0)=ArmSocket0
	BeamSockets(1)=ArmSocket1
	BeamSockets(2)=ArmSocket2
	BeamSockets(3)=ArmSocket3
	EndPointParamName=LinkBeamEnd

	Begin Object Class=AudioComponent name=BeamAmbientSoundComponent
		bShouldRemainActiveIfDropped=true
		bStopWhenOwnerDestroyed=true
	End Object
	BeamAmbientSound=BeamAmbientSoundComponent
	Components.Add(BeamAmbientSoundComponent)

	BeamFireSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_FireBeamCue'
	FlagBone=Base

	HornAttackSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_HornCue'
	SpawnInSound=SoundCue'A_Vehicle_Generic.Vehicle.VehicleFadeInNecris01Cue'
	SpawnOutSound=SoundCue'A_Vehicle_Generic.Vehicle.VehicleFadeOutNecris01Cue'
	ExplosionSound=SoundCue'A_Vehicle_DarkWalker.Cue.A_Vehicle_DarkWalker_ExplosionCue'

	BigExplosionTemplates[0]=(Template=ParticleSystem'Envy_Effects.VH_Deaths.P_DarkWalker_Death_Main')
	BigExplosionSocket=PowerBallSocket
	BodyType=class'UTWalkerBase2_SAVIOR'

	bSpeakerReady=true
	SpeakerRadius=750.0f
	SpeakerRechargeTime=7.0
	HornImpulseMag=1250.0
	VehicleHornModifier=5.3f
	PassengerTeamBeaconOffset=(X=-150.0f,Y=0.0f,Z=0.0f)
	TargetLocationAdjustment=(Z=150.0)

	ConeParam=ConeScore

	DamageMorphTargets(0)=(InfluenceBone=Tail_Damage1,MorphNodeName=MorphNodeW_Bottom,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage2))
	DamageMorphTargets(1)=(InfluenceBone=Lt_Wing_Damage1,MorphNodeName=MorphNodeW_Left,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage1))
	DamageMorphTargets(2)=(InfluenceBone=Lt_Wing_Damage2,MorphNodeName=MorphNodeW_Left,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage1))
	DamageMorphTargets(3)=(InfluenceBone=Rt_Wing_Damage1,MorphNodeName=MorphNodeW_Right,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage1))
	DamageMorphTargets(4)=(InfluenceBone=Rt_Wing_Damage2,MorphNodeName=MorphNodeW_Right,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage1))
	DamageMorphTargets(5)=(InfluenceBone=Base_Animated,MorphNodeName=none,LinkedMorphNodeName=none,Health=100,DamagePropNames=(Damage3))

	DamageParamScaleLevels(0)=(DamageParamName=Damage1,Scale=3.0)
	DamageParamScaleLevels(1)=(DamageParamName=Damage2,Scale=3.0)
	DamageParamScaleLevels(2)=(DamageParamName=Damage3,Scale=3.0)

	HudCoords=(U=644,V=0,UL=-98,VL=129)

	TeamMaterials[0]=MaterialInstanceConstant'VH_Fury.Materials.MI_VH_Fury_Red'
	TeamMaterials[1]=MaterialInstanceConstant'VH_Fury.Materials.MI_VH_Fury_Blue'

	BurnOutMaterial[0]=MaterialInterface'VH_Fury.Materials.MITV_VH_Fury_Red_BO'
	BurnOutMaterial[1]=MaterialInterface'VH_Fury.Materials.MITV_VH_Fury_Blue_BO'

	PowerOrbTeamMaterials[0]=MaterialInterface'VH_DarkWalker.Materials.M_VH_Darkwalker_EnergyCore_Glow'
	PowerOrbTeamMaterials[1]=MaterialInterface'VH_DarkWalker.Materials.M_VH_Darkwalker_EnergyCore_Glow_Blue'
	PowerOrbBurnoutTeamMaterials[0]=MaterialInterface'VH_DarkWalker.Materials.MITV_VH_Darkwalker_EnergyCore_Glow_BO'
	PowerOrbBurnoutTeamMaterials[1]=MaterialInterface'VH_DarkWalker.Materials.MITV_VH_Darkwalker_EnergyCore_Glow_Blue_BO'

	SpawnMaterialLists[0]=(Materials=(MaterialInterface'VH_Fury.Materials.MI_VH_Fury_Spawn_Red'))
	SpawnMaterialLists[1]=(Materials=(MaterialInterface'VH_Fury.Materials.MI_VH_Fury_Spawn_Blue'))

	NeedToPickUpAnnouncement=(AnnouncementSound=SoundNodeWave'A_Announcer_Status.Status.A_StatusAnnouncer_ManTheDarkwalker')

	IconCoords=(U=907,UL=26,V=36,VL=37)

	bHasEnemyVehicleSound=true
	EnemyVehicleSound(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_EnemyDarkwalker'
	EnemyVehicleSound(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_EnemyDarkwalker'
	EnemyVehicleSound(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_EnemyDarkwalker'
	VehicleDestroyedSound(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_BotStatus_IGMale_EnemyDarkwalkerDestroyed'
	VehicleDestroyedSound(1)=SoundNodeWave'A_Character_Jester.BotStatus.A_BotStatus_Jester_EnemyDarkwalkerDestroyed'
	VehicleDestroyedSound(2)=SoundNodeWave'A_Character_Othello.BotStatus.A_BotStatus_Othello_EnemyDarkwalkerDestroyed'

	AIPurpose=AIP_Any
}

UTWalkerBase2
Code:
/**
 *
 * Copyright 1998-2007 Epic Games, Inc. All Rights Reserved. Modded By QuadraxisMk2
 */

class UTWalkerBase2 extends Actor
	abstract
	notplaceable;

// 3 legged walkers, by default
const NUM_WALKER_LEGS = 3;

enum EWalkerLegID
{
	WalkerLeg_Rear,
	WalkerLeg_FrontLeft,
	WalkerLeg_FrontRight
};

/** Skel mesh for the legs. */
var() /*const*/ editconst SkeletalMeshComponent	SkeletalMeshComponent;

/** Refs to shoulder lookat skelcontrols for each leg  */
var protected transient SkelControlLookat ShoulderSkelControl[NUM_WALKER_LEGS];
/** Names for the shoulder skelcontrol nodes for each leg (from the animtree) */
var protected const Name ShoulderSkelControlName[NUM_WALKER_LEGS];

/** If TRUE for corresponding foot, walking/stepping code will ignore that leg */
var() byte IgnoreFoot[NUM_WALKER_LEGS];

/** Handles used to move the walker feet around. */
var() UTWalkerStepHandle FootConstraints[NUM_WALKER_LEGS];

/** world time to advance to the next phase of the step - experimental walker leg code */
var float NextStepStageTime[NUM_WALKER_LEGS];

/** Time, in seconds, that each step stage lasts. */
var() const array<float> StepStageTimes;

/** which stage the step is in for each leg - experimental walker leg code */
var protected int StepStage[NUM_WALKER_LEGS];

/** used to play water effects when feet enter/exit water */
var byte FootInWater[NUM_WALKER_LEGS];
var ParticleSystem FootWaterEffect;

/** Min dist trigger to make foot a possible candidate for next step */
var() float MinStepDist;

/** Max leg extension */
var() float MaxLegReach;

/** Factor in range [0..1].  0 means no leg spread, 1 means legs are spread as far as possible. */
var() float LegSpreadFactor;
var() float	CustomGravityScale;
var() float LandedFootDistSq;

/** How far foot should embed into ground. */
var() protected const float FootEmbedDistance;


/** Bone names for this walker */
var const name FootBoneName[NUM_WALKER_LEGS];
var const name ShoulderBoneName[NUM_WALKER_LEGS];
var const name Base2BoneName;

/** Ref to the walker vehicle that we are attached to. */
var transient UTVehicle_Walker2	WalkerVehicle;

var protected const bool	bHasCrouchMode;
var	bool					bIsDead;

/** Where the feet are right now */
var vector CurrentFootPosition[NUM_WALKER_LEGS];

var array<MaterialImpactEffect> FootStepEffects;
var ParticleSystemComponent FootStepParticles[NUM_WALKER_LEGS];

/** Store indices into the legs array, used to map from rear/left/right leg designations to the model's leg indices.  Indexed by LegID. */
var transient int LegMapping[EWalkerLegID.EnumCount];

/** Base directions from the walker center for the legs to point, in walker-local space.  Indexed by LegID. */
var protected const vector BaseLegDirLocal[EWalkerLegID.EnumCount];

/**
 * Scalar to control how much velocity to add to the desired foot positions.  Indexed by LegID.
 * This effectively controls how far ahead of the walker the legs will try to reach while the walker
 * is moving.
 */
var() const float FootPosVelAdjScale[EWalkerLegID.EnumCount];

/** Names of the anim nodes for playing the step anim for a leg.  Used to fill in FootStepAnimNode array. */
var protected const Name	FootStepAnimNodeName[NUM_WALKER_LEGS];
/** Refs to AnimNodes used for playing step animations */
var protected AnimNode		FootStepAnimNode[NUM_WALKER_LEGS];

/** How far above the current foot position to begin interpolating towards. */
var() protected const float FootStepStartLift;
/** How far above the desired foot position to end the foot step interpolation */
var() protected const float FootStepEndLift;

struct native WalkerLegStepAnimData
{
	/** Where foot wants to be. */
	var vector				DesiredFootPosition;

	/** Normal of the surface at the desired foot position. */
	var vector				DesiredFootPosNormal;

	/** Physical material at the DesiredFootPosition */
	var PhysicalMaterial	DesiredFootPosPhysMaterial;

	/** True if we don't have a valid desired foot position for this leg. */
	var bool				bNoValidFootHold;
};

/** Indexed by LegID. */
var protected WalkerLegStepAnimData StepAnimData[EWalkerLegID.EnumCount];

/** keeps track of previous leg locations */
var protected vector PreviousTraceSeedLocation[NUM_WALKER_LEGS];

/** The walker legs's light environment */
var DynamicLightEnvironmentComponent LegLightEnvironment;

var float MaxFootStepEffectDist;



function PostBeginPlay()
{
	local int Idx;

	super.PostBeginPlay();

	// make sure the rb is awake
	SkeletalMeshComponent.WakeRigidBody();

	for (Idx=0; Idx<NUM_WALKER_LEGS; ++Idx)
	{
		// cache refs to footstep anims
		FootStepAnimNode[Idx] = SkeletalMeshComponent.FindAnimNode(FootStepAnimNodeName[Idx]);

		// cache refs to skel controls
		ShoulderSkelControl[Idx] = SkelControlLookAt(SkeletalMeshComponent.FindSkelControl(ShoulderSkelControlName[Idx]));
		if (ShoulderSkelControl[Idx] != None)
		{
			// turn it on
			ShoulderSkelControl[Idx].SetSkelControlActive(TRUE);
		}
	}
}

simulated function UpdateShadowSettings(bool bWantShadow)
{
	local bool bNewCastShadow, bNewCastDynamicShadow;

	if (SkeletalMeshComponent != None)
	{
		bNewCastShadow = default.SkeletalMeshComponent.CastShadow && bWantShadow;
		bNewCastDynamicShadow = default.SkeletalMeshComponent.bCastDynamicShadow && bWantShadow;
		if (bNewCastShadow != SkeletalMeshComponent.CastShadow || bNewCastDynamicShadow != SkeletalMeshComponent.bCastDynamicShadow)
		{
			SkeletalMeshComponent.CastShadow = bNewCastShadow;
			SkeletalMeshComponent.bCastDynamicShadow = bNewCastDynamicShadow;
			// defer if we can do so without it being noticeable
			if (LastRenderTime < WorldInfo.TimeSeconds - 1.0)
			{
				SetTimer(0.1 + FRand() * 0.5, false, 'ReattachMesh');
			}
			else
			{
				ReattachMesh();
			}
		}
	}
}

/** reattaches the mesh component, because settings were updated */
simulated function ReattachMesh()
{
	DetachComponent(SkeletalMeshComponent);
	AttachComponent(SkeletalMeshComponent);
}

/* epic ===============================================
* ::StopsProjectile()
*
* returns true if Projectiles should call ProcessTouch() when they touch this actor
*/
simulated function bool StopsProjectile(Projectile P)
{
	// Don't block projectiles fired from this vehicle
	return (P.Instigator != WalkerVehicle) && (bProjTarget || bBlockActors);
}

/** Called once to set up legs. */
function InitFeet();

/** Called on landing to reestablish a foothold */
function InitFeetOnLanding();

function SetWalkerVehicle(UTVehicle_Walker2 V)
{
	WalkerVehicle = V;
	SkeletalMeshComponent.SetShadowParent(WalkerVehicle.Mesh);
	SkeletalMeshComponent.SetLightEnvironment(LegLightEnvironment);
	InitFeet();
}

event PlayFootStep(int LegIdx)
{
	local AudioComponent AC;
	local UTPhysicalMaterialProperty PhysicalProperty;
	local int EffectIndex;

	local vector HitLoc,HitNorm,TraceLength;
	local TraceHitInfo HitInfo;

	if (FootStepEffects.Length == 0)
	{
		return;
	}

	// figure out what we landed on

	TraceLength = vector(QuatToRotator(SkeletalMeshComponent.GetBoneQuaternion(FootBoneName[LegIdx])))*5.0;
	//Trace(HitLoc,HitNorm, CurrentFootPosition[LegIdx]+TraceLength,CurrentFootPosition[LegIdx],true,,HitInfo);
	Trace(HitLoc,HitNorm, CurrentFootPosition[LegIdx]-TraceLength,CurrentFootPosition[LegIdx]-TraceLength*4.0,true,,HitInfo);
	if(HitInfo.PhysMaterial != none)
	{
		PhysicalProperty = UTPhysicalMaterialProperty(HitInfo.PhysMaterial.GetPhysicalMaterialProperty(class'UTPhysicalMaterialProperty')); //(StepAnimData[LegIdx].DesiredFootPosPhysMaterial.GetPhysicalMaterialProperty(class'UTPhysicalMaterialProperty'));
	}
	if (PhysicalProperty != None)
	{
		EffectIndex = FootStepEffects.Find('MaterialType', PhysicalProperty.MaterialType);
		if (EffectIndex == INDEX_NONE)
		{
			EffectIndex = 0;
		}
		// Footstep particle
		if (FootStepEffects[EffectIndex].ParticleTemplate != None && EffectIsRelevant(Location, false))
		{
			if (FootStepParticles[LegIdx] == None)
			{
				FootStepParticles[LegIdx] = new(self) class'UTParticleSystemComponent';
				FootStepParticles[LegIdx].bAutoActivate = false;
				SkeletalMeshComponent.AttachComponent(FootStepParticles[LegIdx], FootBoneName[LegIdx]);
			}
			FootStepParticles[LegIdx].SetTemplate(FootStepEffects[EffectIndex].ParticleTemplate);
			FootStepParticles[LegIdx].ActivateSystem();
		}
	}

	AC = WorldInfo.CreateAudioComponent(FootStepEffects[EffectIndex].Sound, false, true);
	if (AC != None)

	{
		AC.bUseOwnerLocation = false;

		// play it closer to the player if he's controlling the walker
		AC.Location = (PlayerController(WalkerVehicle.Controller) != None) ? 0.5 * (Location + CurrentFootPosition[LegIdx]) : CurrentFootPosition[LegIdx];

		AC.bAutoDestroy = true;
		AC.Play();
	}
	WalkerVehicle.TookStep(LegIdx);
}

event SpawnFootWaterEffect(int LegIdx)
{
	if (FootWaterEffect != None)
	{
		WorldInfo.MyEmitterPool.SpawnEmitter(FootWaterEffect, CurrentFootPosition[LegIdx]);
	}
}

/**
 * Default behavior when shot is to apply an impulse and kick the KActor.
 */
event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
{
	local vector ApplyImpulse;

	if (damageType.default.KDamageImpulse > 0 )
	{
		if ( VSize(momentum) < 0.001 )
		{
			`Log("Zero momentum to KActor.TakeDamage");
			return;
		}

		// Make sure we have a valid TraceHitInfo with our SkeletalMesh
		// we need a bone to apply proper impulse
		CheckHitInfo( HitInfo, SkeletalMeshComponent, Normal(Momentum), hitlocation );

		ApplyImpulse = Normal(momentum) * damageType.default.KDamageImpulse;
		if ( HitInfo.HitComponent != None )
		{
			HitInfo.HitComponent.AddImpulse(ApplyImpulse, HitLocation, HitInfo.BoneName);
		}
	}
}

function PlayDying()
{
	local int i;

	Lifespan = 8.0;
	CustomGravityScale = 1.5;
	bCollideWorld = true;
	bIsDead = true;

	// clear all constraints
	for ( i=0; i<3; i++ )
	{
		FootConstraints[i].ReleaseComponent();
	}

	SkeletalMeshComponent.SetTraceBlocking(true, false);
	SkeletalMeshComponent.SetBlockRigidBody(true);
	SkeletalMeshComponent.SetShadowParent(None);
	GotoState('DyingVehicle');
}

function AddVelocity( vector NewVelocity, vector HitLocation,class<DamageType> DamageType, optional TraceHitInfo HitInfo )
{
	if ( !IsZero(NewVelocity) )
	{
		if (Location.Z > WorldInfo.StallZ)
		{
			NewVelocity.Z = FMin(NewVelocity.Z, 0);
		}
		NewVelocity = DamageType.Default.VehicleMomentumScaling * DamageType.Default.KDamageImpulse * Normal(NewVelocity);
		SkeletalMeshComponent.AddImpulse(NewVelocity, HitLocation);
	}
}

state DyingVehicle
{
	event TakeDamage(int Damage, Controller EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType, optional TraceHitInfo HitInfo, optional Actor DamageCauser)
	{
		if ( DamageType == None )
			return;
		AddVelocity(Momentum, HitLocation, DamageType, HitInfo);
	}
}

/** cause a single step, used for debugging */
function DoTestStep(int LegIdx, float Mag);

/** NOTE:  this is actually what changes the colors on the PowerOrb on the legs of the Walker **/
simulated function TeamChanged()
{
	local MaterialInterface NewMaterial;

	NewMaterial = WalkerVehicle.Mesh.GetMaterial(0);
	SkeletalMeshComponent.SetMaterial( 0, NewMaterial );

	NewMaterial = WalkerVehicle.Mesh.GetMaterial(1);
	SkeletalMeshComponent.SetMaterial( 1, NewMaterial );
}


/** NOTE:  this is actually what changes the colors on the PowerOrb on the legs of the Walker **/
simulated function SetBurnOut()
{
	local int TeamNum;
	local BurnOutDatum BOD;
	local MaterialInterface NewMaterial;

	TeamNum = WalkerVehicle.GetTeamNum();

	// we use the walker in DM maps where the team will be 255
	if( WalkerVehicle.PowerOrbBurnoutTeamMaterials.length < TeamNum )
	{
		TeamNum = 0;
	}

	// set our specific turret BurnOut Material
	if( ( WalkerVehicle.PowerOrbBurnoutTeamMaterials.length > 0 ) && ( WalkerVehicle.PowerOrbBurnoutTeamMaterials[TeamNum] != None ) )
	{
		NewMaterial = WalkerVehicle.PowerOrbBurnoutTeamMaterials[TeamNum];
		WalkerVehicle.Mesh.SetMaterial( 1, NewMaterial );
		BOD.MITV = WalkerVehicle.Mesh.CreateAndSetMaterialInstanceTimeVarying(1);
		WalkerVehicle.BurnOutMaterialInstances[WalkerVehicle.BurnOutMaterialInstances.length] = BOD;
	}
}


defaultproperties
{
	TickGroup=TG_PostAsyncWork

	Physics=PHYS_RigidBody

	bEdShouldSnap=true
	bStatic=false
	bCollideActors=true
	bBlockActors=false
	bWorldGeometry=false
	bCollideWorld=false
	bProjTarget=true
	bIgnoreEncroachers=true
	bNoEncroachCheck=true

	RemoteRole=ROLE_None

	Begin Object Class=DynamicLightEnvironmentComponent Name=LegLightEnvironmentComp
	    AmbientGlow=(R=0.2,G=0.2,B=0.2,A=1.0)
	End Object
	LegLightEnvironment=LegLightEnvironmentComp
	Components.Add(LegLightEnvironmentComp)


	Begin Object Class=SkeletalMeshComponent Name=LegMeshComponent
		CollideActors=true
		BlockActors=false
		BlockZeroExtent=true
		BlockNonZeroExtent=true
		PhysicsWeight=1
		bHasPhysicsAssetInstance=true
		BlockRigidBody=false
		RBChannel=RBCC_Nothing
		RBCollideWithChannels=(Default=TRUE,GameplayPhysics=TRUE,EffectPhysics=TRUE)
		bUseAsOccluder=FALSE
		bUpdateSkelWhenNotRendered=true
		bIgnoreControllersWhenNotRendered=true
		bAcceptsDecals=false
		bUseCompartment=FALSE
		LightEnvironment=LegLightEnvironmentComp
	End Object
	CollisionComponent=LegMeshComponent
	SkeletalMeshComponent=LegMeshComponent
	Components.Add(LegMeshComponent)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle0
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(0)=RB_FootHandle0
	Components.Add(RB_FootHandle0)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle1
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(1)=RB_FootHandle1
	Components.Add(RB_FootHandle1)

	Begin Object Class=UTWalkerStepHandle Name=RB_FootHandle2
		LinearDamping=50.0
		LinearStiffness=10000.0
	End Object
	FootConstraints(2)=RB_FootHandle2
	Components.Add(RB_FootHandle2)

	MinStepDist=20.0
	MaxLegReach=450.0

	FootBoneName(0)=Leg1_End
	FootBoneName(1)=Leg2_End
	FootBoneName(2)=Leg3_End
	ShoulderBoneName(0)=Leg1_Shoulder
	ShoulderBoneName(1)=Leg2_Shoulder
	ShoulderBoneName(2)=Leg3_Shoulder

	Base2BoneName=BodyRoot
	CustomGravityScale=0.f
	FootEmbedDistance=8.0
	LandedFootDistSq=400.0

	ShoulderSkelControlName[0]="Shoulder1"
	ShoulderSkelControlName[1]="Shoulder2"
	ShoulderSkelControlName[2]="Shoulder3"

	BaseLegDirLocal[WalkerLeg_Rear]=(X=-1.f,Y=0.f,Z=0.f)
	BaseLegDirLocal[WalkerLeg_FrontLeft]=(X=0.5f,Y=-0.866025f,Z=0.f)
	BaseLegDirLocal[WalkerLeg_FrontRight]=(X=0.5f,Y=0.866025f,Z=0.f)

	FootPosVelAdjScale[WalkerLeg_Rear]=1.2f
	FootPosVelAdjScale[WalkerLeg_FrontLeft]=0.6f
	FootPosVelAdjScale[WalkerLeg_FrontRight]=0.6f

	FootStepStartLift=512.f
	FootStepEndLift=128.f

	StepStageTimes(0)=0.7f			// foot pickup and move forward
	StepStageTimes(1)=0.135f		// foot stab to ground at destination
	StepStageTimes(2)=1.f			// wait for foot to reach dest before forcibly ending step

	MaxFootStepEffectDist=5000.0
}

Something tells me it is not finding the points in which to attach the legs, which confuses me. If anyone could diagnose this, it would be splendid.

<Quad>
 

QuadraxisMk2

New Member
Jun 23, 2008
4
0
0
2 year topic necro update

Meh, 2 year+ topic necromancy FTL (hope I don't get banned for this).

Anyways, a while back I realized my problem was that the function IS executing, but it is doing nothing. For example, I 'altered' the line with the setup the legs (keeping in mind that this is called as a native) changing it from a native to non-native, and it worked. It just is not executing anything.

function DoTestStep(int LegIdx, float Mag);

Works, but it does nothing. Big whoops!


Step 2: Figure out how to step up the legs and 'make it happen'.

Hopefully I will be more active now...

<Quad>
 
Last edited: