The subject already tells it: is there any difference between the animations "CockGunL" and "CockGun" in the mesh of "Botpack.Commando"? As the name suggests, it can be the same animation just mirrored (L=left weapon hand), but by viewing them I cannot notice any difference.
(Background: I'm just coding a fix for "Humane.Humangrant" and rewriting the function PlayWaiting().)
Mesh "Commando": "CockGunL" vs. "CockGun"
-
- Godlike
- Posts: 3024
- Joined: Fri Sep 25, 2015 9:01 pm
- Location: moved without proper hashing
-
- Novice
- Posts: 20
- Joined: Sat May 17, 2014 11:03 pm
- Personal rank: living failure
- Location: ∞ + 1
Re: Mesh "Commando": "CockGunL" vs. "CockGun"
.
Last edited by Dr. Walter on Sun Jan 17, 2021 5:38 am, edited 1 time in total.
* ... get dunked on
-
- Godlike
- Posts: 3024
- Joined: Fri Sep 25, 2015 9:01 pm
- Location: moved without proper hashing
Re: Mesh "Commando": "CockGunL" vs. "CockGun"
Ah, thanks, that has helped - now where I know to put attention watching the animations I notice the difference, yes. 
BTW: Wouldn't it be nice to have that description in the wiki somewhere? For me these naming conventions are not self explanatory.
(Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).
<EDIT>Added "code preview" for SBHumaneFixes</EDIT>

BTW: Wouldn't it be nice to have that description in the wiki somewhere? For me these naming conventions are not self explanatory.
It is a bad coded subclass of SkaarjTrooper, see thread Invisible weapons in MH-Treasure2DXfixed. Instead of fixing that code I wrote a new sub class of SkaarjTrooper and put that into the package SBHumaneFixes. With that I can replace Humane.Humangrant, Humane.Recon and Humane.gunner with my classes (manually or by my MapPatcher). I will soon publish this helper library SBHumaneFixes; comments and improvements to the current version are welcome:Dr. Walter wrote:I assume this "Humane.Humangrant" is a ScriptedPawn conversion of a player model?
Code preview
Code: Select all
/******************************************************************************
A fix for package Humane.u: "Humangrant" (and the derived Gunner and Recon) are
calling parent's code what gets wired in Function Startup.BeginState().
How to use: Replace all "Humangrant", "Gunner" and "Recon" in a map with
"HumangrantSB", "GunnerSB" and "ReconSB".
The package "Humane.u" is still needed for the weapons.
16 Jul 2017, SeriousBarbie
******************************************************************************/
class HumangrantSB expands SkaarjTrooper;
#exec OBJ LOAD File="..\System\Humane.u"
#exec OBJ LOAD File="..\System\BotPack.u"
#exec MESH ORIGIN MESH=commando X=0 Y=0 Z=0
var(Sounds) sound BreathAgain;
function PlayTurning() {
BaseEyeHeight = Default.BaseEyeHeight;
if ( (Weapon == None) || (Weapon.Mass < 20) )
PlayAnim('TurnSM', 0.3, 0.3);
else
PlayAnim('TurnLG', 0.3, 0.3);
}
function PostBeginPlay() {
if (bButtonPusher && Mesh == LodMesh'Botpack.Commando')
bButtonPusher = false; // no animations given in 'Botpack.Commando'
super.PostBeginPlay();
}
function TweenTo(float tweentime) {
if (bFakeDeath)
return;
if (Region.Zone.bWaterZone)
{
TweenToSwimming(tweentime);
return;
}
TweenAnim('breath2l', tweentime);
}
function TweenToPatrolStop(float tweentime) {
TweenTo(tweentime);
}
function TweenToWaiting(float tweentime) {
TweenTo(tweentime);
}
function PlayTakeHit(float tweentime, vector HitLoc, int damage) {
if ( (Velocity.Z > 120) && (Health < 0.4 * Default.Health) && (FRand() < 0.33) )
PlayAnim('Dead2',0.7);
else if (AnimSequence != 'Dead2')
Super(ScriptedPawn).PlayTakeHit(tweentime, HitLoc, damage);
}
function PlayAnimCock(float animspeed) {
SetAlertness(-0.1);
if ((Weapon == None) || (Weapon.Mass < 20))
PlayAnim('CockGun', AnimSpeed, 0.7);
else
PlayAnim('CockGunL', AnimSpeed, 0.7);
PlayCock();
}
function PlayAnimBreath(float animspeed) {
local name AnimName;
SetAlertness(0.0);
if (FRand() > 0.5)
AnimName = 'Breath1';
else
AnimName = 'Breath2';
LoopAnim(AnimName, AnimSpeed, 0.5);
if ( ! bQuiet)
PlaySound(BreathAgain, SLOT_Talk);
}
function PlayAnimChat(float animspeed) {
local name AnimName;
SetAlertness(-0.3);
if (FRand() > 0.5)
AnimName = 'Chat1';
else
AnimName = 'Chat2';
LoopAnim(AnimName, AnimSpeed, 0.5);
if ( ! bQuiet)
PlaySound(Roam, SLOT_Talk);
}
function PlayAnimLook(float animspeed) {
local name AnimName;
SetAlertness(0.5);
if (FRand() > 0.5)
AnimName = 'look';
else
AnimName = 'lookL';
LoopAnim(AnimName, AnimSpeed, 0.5);
}
function PlayCock() {
// overriding needed because SkaarjTrooper.PlayCock() has a bug: Checking SelectSound but playing CockingSound...
if (Weapon != None)
{
if (Weapon.CockingSound != None)
PlaySound(Weapon.CockingSound, SLOT_Interact,,,700);
else if (Weapon.SelectSound != None)
PlaySound(Weapon.SelectSound, SLOT_Interact,,,700);
}
}
function bool IsBreathing() {
Return (AnimSequence == 'Breath1' || AnimSequence == 'Breath2');
}
function bool IsChatting() {
Return (AnimSequence == 'Chat1' || AnimSequence == 'Chat2');
}
function bool IsLooking() {
Return (AnimSequence == 'look' || AnimSequence == 'lookL');
}
//function Name GetNextAnimation
function PlayWaiting() {
// last defined in Skaarj.uc
local float decision;
local float animspeed;
if (Region.Zone.bWaterZone)
{
PlaySwimming();
return;
}
if (bFakeDeath)
return;
if (bButtonPusher)
{
PushButtons();
return;
}
animspeed = 0.3 + 0.6 * FRand(); //vary speed
decision = FRand();
if (decision < 0.25)
{
PlayAnimBreath(AnimSpeed);
}
else if (decision < 0.5)
{
PlayAnimCock(AnimSpeed);
}
else if (decision < 0.75)
{
PlayAnimChat(AnimSpeed);
}
else
PlayAnimLook(AnimSpeed);
}
function TweenToRunning(float tweentime) {
bButtonPusher = false;
bFakeDeath = false;
if (Region.Zone.bWaterZone)
{
TweenToSwimming(tweentime);
return;
}
if ( (AnimSequence == 'chat1') && (AnimFrame > 0.8) )
{
SetFall();
GotoState('FallingState', 'RiseUp');
}
else if (((AnimSequence != 'StillLgFr')) || ! bAnimLoop)
TweenAnim('RunLg', tweentime);
}
function Shield() {
return;
}
function TryToDuck(vector duckDir, bool bReversed)
{
local vector HitLocation, HitNormal, Extent;
local bool duckLeft;
local actor HitActor;
local float decision;
if ( (FRand() < 0.4) || (VSize(Velocity) < 50) )
{
Shield();
return;
}
duckDir.Z = 0;
duckLeft = !bReversed;
Extent.X = CollisionRadius;
Extent.Y = CollisionRadius;
Extent.Z = CollisionHeight;
HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent);
if (HitActor != None)
{
duckLeft = !duckLeft;
duckDir *= -1;
HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent);
}
if (HitActor != None)
{
Shield();
return;
}
HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir - MaxStepHeight * vect(0,0,1), Location + 200 * duckDir, false, Extent);
if (HitActor == None)
{
Shield();
return;
}
SetFall();
if ( duckLeft )
PlayAnim('DuckWlkL', 1.35);
else
PlayAnim('DuckWlkl', 1.35);
Velocity = duckDir * GroundSpeed;
Velocity.Z = 200;
SetPhysics(PHYS_Falling);
GotoState('FallingState','Ducking');
}
function bool CanFireAtEnemy()
{
local vector HitLocation, HitNormal,X,Y,Z, projStart, EnemyDir, EnemyUp;
local actor HitActor;
local float EnemyDist;
EnemyDir = Enemy.Location - Location;
EnemyDist = VSize(EnemyDir);
EnemyUp = Enemy.CollisionHeight * vect(0,0,0.8);
if ( EnemyDist > 300 )
{
EnemyDir = 300 * EnemyDir/EnemyDist;
EnemyUp = 300 * EnemyUp/EnemyDist;
}
if ( Weapon == None )
return false;
GetAxes(Rotation,X,Y,Z);
projStart = Location + Weapon.CalcDrawOffset() + Weapon.FireOffset.X * X + 1.2 * Weapon.FireOffset.Y * Y + Weapon.FireOffset.Z * Z;
if ( Weapon.IsA('ASMD') || Weapon.IsA('Minigun') || Weapon.IsA('Rifle') || Weapon.IsA('ShockRifle') || Weapon.IsA('minigun2') || Weapon.IsA('SniperRifle')) //instant hit
HitActor = Trace(HitLocation, HitNormal, Enemy.Location + EnemyUp, projStart, true);
else
HitActor = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
if ( HitActor == Enemy )
return true;
if ( (HitActor != None) && (VSize(HitLocation - Location) < 200) )
return false;
if ( (Pawn(HitActor) != None) && (AttitudeTo(Pawn(HitActor)) > ATTITUDE_Ignore) )
return false;
return true;
}
//Skaarj animations
function PlayPatrolStop()
{
local float decision;
if (Region.Zone.bWaterZone)
{
PlaySwimming();
return;
}
if ( bButtonPusher )
{
PushButtons();
return;
}
SetAlertness(0.2);
LoopAnim('LookL', 0.3 + 0.6 * FRand());
}
function PlayChallenge()
{
if (Region.Zone.bWaterZone)
{
PlaySwimming();
return;
}
if ( TryToCrouch() )
{
//TweenAnim('Duck', 0.12);
TweenAnim('Chat2', 0.12);
return;
}
PlayThreateningSound();
PlayAnim('StillFrRp', 0.8 + 0.5 * FRand(), 0.1);
}
function PlayRunning()
{
local float strafeMag;
local vector Focus2D, Loc2D, Dest2D;
local vector lookDir, moveDir, Y;
bFire = 0;
bAltFire = 0;
DesiredSpeed = MaxDesiredSpeed;
if (Region.Zone.bWaterZone)
{
PlaySwimming();
return;
}
if (Focus == Destination)
{
LoopAnim('RunLg', -0.9/GroundSpeed,, 0.5);
return;
}
Focus2D = Focus;
Focus2D.Z = 0;
Loc2D = Location;
Loc2D.Z = 0;
Dest2D = Destination;
Dest2D.Z = 0;
lookDir = Normal(Focus2D - Loc2D);
moveDir = Normal(Dest2D - Loc2D);
strafeMag = lookDir dot moveDir;
if (strafeMag > 0.8)
LoopAnim('StrafeR', -1.0/GroundSpeed,, 0.5);
else if (strafeMag < -0.8)
LoopAnim('StrafeL', -1.0/GroundSpeed,, 0.5);
else
{
Y = (lookDir Cross vect(0,0,1));
if ((Y Dot (Dest2D - Loc2D)) > 0)
{
if ( (AnimSequence == 'RunLg') || (AnimSequence == 'RunLg') )
LoopAnim('RunLg', -2.5/GroundSpeed,, 1.0);
else
LoopAnim('RunLgFr', -2.5/GroundSpeed,0.1, 1.0);
}
else
{
if ( (AnimSequence == 'RunLg') || (AnimSequence == 'RunLg') )
LoopAnim('RunLg', -2.5/GroundSpeed,, 1.0);
else
LoopAnim('RunLgFr', -2.5/GroundSpeed,0.1, 1.0);
}
}
}
function PlayMeleeAttack() {
local int hitdamage;
local float TargetDist, decision;
decision = FRand();
if (AnimSequence == 'Breath1l')
decision += 0.2;
else if (AnimSequence == 'Breath2l')
decision -= 0.2;
AttackSuccess = false;
//log("Start Melee Attack");
if (Region.Zone.bWaterZone || (decision < 0.5))
{
Acceleration = AccelRate * Normal(Target.Location - Location);
PlayAnim('Flip');
PlaySound(Spin, SLOT_Interact);
}
else
{
PlayAnim('Flip');
PlaySound(Claw, SLOT_Interact);
}
}
function PlayLeftDeath(name DamageType) {
if ( FRand() < 0.5 )
PlayAnim('Dead1',0.7,0.1);
else
PlayAnim('Dead7',0.7,0.1);
PlaySound(Die, SLOT_Talk, 4.5 * TransientSoundVolume);
}
function PlayGutDeath(name DamageType)
{
PlayAnim('Dead3',0.7, 0.1);
PlaySound(Die, SLOT_Talk, 4.5 * TransientSoundVolume);
}
function PlayRightDeath(name DamageType) {
if ( FRand() < 0.3 )
PlayAnim('Dead2',0.7,0.1);
else
PlayAnim('Dead3',0.7,0.1);
PlaySound(Die, SLOT_Talk, 4.5 * TransientSoundVolume);
}
function PlayBigDeath(name DamageType) {
if ( FRand() < 0.35 )
PlayAnim('Dead9B',0.7,0.1);
else
PlayAnim('Dead8',0.7,0.1);
PlaySound(Die2, SLOT_Talk, 4.5 * TransientSoundVolume);
}
function PlayFiring() {
TweenAnim('StillLgFr', 0.2);
if ( (Weapon != None) && (Weapon.AmmoType != None) )
Weapon.AmmoType.AmmoAmount = Weapon.AmmoType.Default.AmmoAmount;
}
function PlayHeadDeath(name DamageType) {
local carcass carc;
if (((DamageType == 'Decapitated') || ((Health < -20) && (FRand() < 0.5))) && ! Level.Game.bVeryLowGore)
{
carc = Spawn(class 'CreatureChunks',,, Location + CollisionHeight * vect(0,0,0.8), Rotation + rot(3000,0,16384) );
if (carc != None)
{
carc.Mesh = mesh'headmalem';
carc.Initfor(self);
carc.Velocity = Velocity + VSize(Velocity) * VRand();
carc.Velocity.Z = FMax(carc.Velocity.Z, Velocity.Z);
}
PlayAnim('Dead4',0.7,0.1);
}
else if ( FRand() < 0.5 )
PlayAnim('Dead1',0.7,0.1);
else
PlayAnim('Dead8',0.7,0.1);
PlaySound(Die, SLOT_Talk, 4.5 * TransientSoundVolume);
}
function PlayMovingAttack() {
local float strafeMag;
local vector Focus2D, Loc2D, Dest2D;
local vector lookDir, moveDir, Y;
local int bUseAltMode;
if (Weapon != None)
{
if ( Weapon.AmmoType != None )
Weapon.AmmoType.AmmoAmount = Weapon.AmmoType.Default.AmmoAmount;
Weapon.RateSelf(bUseAltMode);
ViewRotation = Rotation;
if ( bUseAltMode == 0 )
{
bFire = 1;
bAltFire = 0;
Weapon.Fire(1.0);
}
else
{
bFire = 0;
bAltFire = 1;
Weapon.AltFire(1.0);
}
}
else
{
PlayRunning();
return;
}
if (Region.Zone.bWaterZone)
{
PlaySwimming();
return;
}
DesiredSpeed = MaxDesiredSpeed;
if (Focus == Destination)
{
LoopAnim('RunLgFr', -0.9/GroundSpeed,, 0.4);
return;
}
Focus2D = Focus;
Focus2D.Z = 0;
Loc2D = Location;
Loc2D.Z = 0;
Dest2D = Destination;
Dest2D.Z = 0;
lookDir = Normal(Focus2D - Loc2D);
moveDir = Normal(Dest2D - Loc2D);
strafeMag = lookDir dot moveDir;
if (strafeMag > 0.8)
LoopAnim('StrafeR', -1.0/GroundSpeed,, 0.4);
else if (strafeMag < -0.8)
LoopAnim('StrafeL', -1.0/GroundSpeed,, 0.4);
else
{
MoveTimer += 0.2;
DesiredSpeed = 0.6;
Y = (lookDir Cross vect(0,0,1));
if ((Y Dot (Dest2D - Loc2D)) > 0)
{
if ( (AnimSequence == 'RunLgFr') || (AnimSequence == 'RunLgFr') )
LoopAnim('Runlgfr', -2.5/GroundSpeed,, 1.0);
else
LoopAnim('Runlgfr', -2.5/GroundSpeed,0.1, 1.0);
}
else
{
if ( (AnimSequence == 'Runsmfr') || (AnimSequence == 'Runsmfr') )
LoopAnim('runsmfr', -2.5/GroundSpeed,, 1.0);
else
LoopAnim('runsmfr', -2.5/GroundSpeed,0.1, 1.0);
}
}
}
function PlaySwimming()
{
BaseEyeHeight = 0.7 * Default.BaseEyeHeight;
if ((Weapon == None) || (Weapon.Mass < 20) )
LoopAnim('SwimSM');
else
LoopAnim('SwimLG');
}
function PlayVictoryDance() {
PlayAnim('Victory1', 0.6, 0.1);
}
function PlayLanded(float impactVel) {
if ( GetAnimGroup(AnimSequence) == 'MovingFire' )
TweenAnim('Landlgfr', 0.1);
else if (impactVel > 1.7 * JumpZ)
PlayAnim('Landlgfr',1.0,0.1);
else
TweenAnim('Landlgfr', 0.1);
}
function PlayInAir() {
if ( AnimSequence == 'Breath2l' )
PlayAnim('Breath2l', 0.4);
else if (AnimSequence == 'Cockgun')
PlayAnim('Chat1', 0.4);
else
TweenAnim('Lookl',0.4);
}
function TweenToFalling() {
if ( FRand() < 0.5 )
TweenAnim('walk', 0.2);
else
PlayAnim('Walk',0.7,0.1);
}
state MeleeAttack {
ignores SeePlayer, HearNoise, Bump;
ShieldDown:
DesiredRotation = Rotator(Enemy.Location - Location);
FinishAnim();
Goto('Begin');
}
state FallingState {
ignores Bump, Hitwall, HearNoise, WarnTarget;
function Landed(vector HitNormal)
{
local float landVol;
if ( AnimSequence == 'Dead2' )
{
landVol = 0.75 + Velocity.Z * 0.004;
LandVol = Mass * landVol * landVol * 0.01;
PlaySound(sound'Thump', SLOT_Interact, landVol);
GotoState('FallingState', 'RiseUp');
}
else if ( (AnimSequence == 'Chat1') || (AnimSequence == 'walk') )
{
landVol = Velocity.Z/JumpZ;
landVol = 0.008 * Mass * landVol * landVol;
if ( !FootRegion.Zone.bWaterZone )
PlaySound(Land, SLOT_Interact, FMin(20, landVol));
GotoState('FallingState', 'FinishDodge');
}
else
Super.Landed(HitNormal);
}
function PlayTakeHit(float tweentime, vector HitLoc, int damage)
{
if ( AnimSequence != 'Dead2' )
Global.PlayTakeHit(tweentime, HitLoc, damage);
}
LongFall:
if ( AnimSequence == 'Dead2' )
{
Sleep(1.5);
Goto('RiseUp');
}
if ( bCanFly )
{
SetPhysics(PHYS_Flying);
Goto('Done');
}
Sleep(0.7);
TweenToFighter(0.2);
if ( bHasRangedAttack && (Enemy != None) )
{
TurnToward(Enemy);
FinishAnim();
if ( CanFireAtEnemy() )
{
PlayRangedAttack();
FinishAnim();
}
PlayChallenge();
FinishAnim();
}
TweenToFalling();
if ( Velocity.Z > -150 ) //stuck
{
SetPhysics(PHYS_Falling);
if ( Enemy != None )
Velocity = groundspeed * normal(Enemy.Location - Location);
else
Velocity = groundspeed * VRand();
Velocity.Z = FMax(JumpZ, 250);
}
Goto('LongFall');
RiseUp:
FinishAnim();
bCanDuck = false;
DesiredRotation = Rotation;
Acceleration = vect(0,0,0);
if ( !bFakeDeath )
Sleep(1.0 + 6 * FRand());
PlayAnim('Walk', 0.7);
FinishDodge:
FinishAnim();
bCanDuck = true;
Goto('Done');
}
state RangedAttack {
ignores SeePlayer, HearNoise;
function PlayRangedAttack()
{
local float dist;
if ( GetAnimGroup(AnimSequence) == 'StillLgFr' )
{
TweenAnim('StillLgFr', 0.05);
FireWeapon();
return;
}
dist = VSize(Target.Location - Location + vect(0,0,1) * (CollisionHeight - Target.CollisionHeight));
if ( (FRand() < 0.2) && (dist < 150 + CollisionRadius + Target.CollisionRadius) && (Region.Zone.bWaterZone || !Target.Region.Zone.bWaterZone) )
{
PlaySound(Lunge, SLOT_Interact);
Velocity = 500 * (Target.Location - Location)/dist; //instant acceleration in that direction
Velocity.Z += 1.5 * dist;
if (Physics != PHYS_Swimming)
SetPhysics(PHYS_Falling);
Enable('Bump');
PlayAnim('walk');
}
else
{
Disable('Bump');
FireWeapon();
}
}
function TryToDuck(vector duckDir, bool bReversed)
{
if ( FRand() < 0.5 )
return;
bFire = 0;
bAltFire = 0;
if ( AnimSequence == 'runlgfr' )
{
TweenAnim('runlgfr', 0.15);
GotoState('RangedAttack');
return;
}
if ( GetAnimGroup(AnimSequence) == 'chat1' )
{
if (FRand() < 0.75)
GotoState('RThrust', 'walk');
return;
}
Shield();
}
function KeepAttacking()
{
if ( bFiringPaused )
return;
if ( (FRand() > ReFireRate) || (Enemy == None) || (Enemy.Health <= 0) || !CanFireAtEnemy() )
{
if ( GetAnimGroup(AnimSequence) == 'StillLgFr' )
{
PlayAnim('stillLgFr');
GotoState('RangedAttack', 'ShieldDown');
}
else
GotoState('Attacking');
}
}
function AnimEnd()
{
if ( (AnimSequence == 'Breath1l') || (FRand() < 0.5) || ((bFire == 0) && (bAltFire == 0)) )
GotoState('RangedAttack', 'DoneFiring');
else
TweenAnim('runlgfr', 0.5);
}
}
defaultproperties {
CollisionRadius=24
CollisionHeight=51
Acquire=None
BreathAgain=Sound'Botpack.MaleSounds.gasp02'
claw=Sound'UnrealShare.Male.MJump3'
Die=Sound'UnrealShare.Male.MDeath3'
Die2=Sound'UnrealShare.Male.MDeath4'
Fear=None
FootStep=Sound'Botpack.FemaleSounds.stone02'
FootStep2=Sound'Botpack.FemaleSounds.stone04'
HairFlip=None
HitSound1=Sound'UnrealShare.Male.MInjur1'
HitSound2=Sound'UnrealShare.Male.MInjur2'
HitSound3=Sound'UnrealShare.Male.MInjur3'
HitSound4=Sound'UnrealShare.Male.MInjur4'
Land=Sound'UnrealShare.Generic.Land1'
Lunge=None
Roam=None
slice=Sound'UnrealShare.Male.MLand3'
spin=Sound'UnrealShare.Male.MLand3'
syllable1=None
syllable2=None
syllable3=None
syllable4=None
syllable5=None
syllable6=None
Threaten=None
WaterStep=Sound'UnrealShare.Generic.LSplash'
WeaponType=Class'assaultgun'
LungeDamage=120
SpinDamage=140
ClawDamage=150
CarcassType=Class'Botpack.TMale1Carcass'
TimeBetweenAttacks=0.80
Aggressiveness=0.75
RefireRate=0.80
MeleeRange=0.50
Health=400
Skill=0.90
AnimSequence=WalkLg
AmbientSound=None
Skin=None
MenuName="Humangrant"
Mesh=LodMesh'Botpack.Commando'
DrawScale=1.20
MultiSkins(0)=Texture'commandoskins_grants.afbd1'
MultiSkins(1)=Texture'commandoskins_grants.afbd2Iron'
MultiSkins(2)=Texture'commandoskins_grants.afbd3'
MultiSkins(3)=Texture'commandoskins_grants.afbd4'
}
<EDIT>Added "code preview" for SBHumaneFixes</EDIT>
"If Origin not in center it be not in center." --Buggie
-
- Godlike
- Posts: 6473
- Joined: Sun May 09, 2010 6:15 pm
- Location: On the roof.
Re: Mesh "Commando": "CockGunL" vs. "CockGun"
Thanks, good to know, now it's fixedBarbie wrote:(Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).

-
- Masterful
- Posts: 577
- Joined: Tue Jun 20, 2017 1:00 pm
- Personal rank: ⚋⚊⚌☰⚞⌖⚟☰⚌⚊⚋
Re: Mesh "Commando": "CockGunL" vs. "CockGun"
Barbie wrote: (Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).

-
- Godlike
- Posts: 6473
- Joined: Sun May 09, 2010 6:15 pm
- Location: On the roof.
Re: Mesh "Commando": "CockGunL" vs. "CockGun"
Ah, related to frames naming "convention" this is recalling me what old people are saying: Do what the priest says not what the priest does, because we have under remark the advice about animations to be respected but all "Pawn" type in this UT has a default animation sequence "Fighter" which doesn't exist in at least 6 classes and some of them are doing errors in game at this point, lol "Convention"
.
It's like: Hey you need to do that, but I don't do that even if I have to. Sometimes this dumb default content is funny and good to learn how to not do.

It's like: Hey you need to do that, but I don't do that even if I have to. Sometimes this dumb default content is funny and good to learn how to not do.