Mesh "Commando": "CockGunL" vs. "CockGun"

Search and find cool Skins, or introduce your own ones!

Mesh "Commando": "CockGunL" vs. "CockGun"

Postby Barbie » Mon Jul 17, 2017 12:15 am

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().)
"Multiple exclamation marks," he went on, shaking his head, "are a sure sign of a diseased mind." --Terry Pratchett
User avatar
Barbie
Godlike
 
Posts: 1171
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: Mesh "Commando": "CockGunL" vs. "CockGun"

Postby Dr. Walter » Mon Jul 17, 2017 1:33 am

Most animations ending with "L" are two-handed weapon specific animations (weapons with mass greater than 20 as coded for most classes that use player models). You will see other two-handed idle animations as well such as "LookL", "Breath1L" and "WaveL" along with their single-hand counterparts. There are inconsistencies with regards to the naming conventions of other animations, however; "DodgeL" is a single frame animation for dodging to the left, "RunLg" is the two-handed weapon running animation, etc.

In terms of explicit animation differences for the "Botpack.Commando" Mesh, "CockGun" contains one-handed reloading for light mass weapons and "CockGunL" contains two-handed reloading for heavy mass weapons. Are you certain you see no difference? For reference, the starting frames of each animation differ in the following way: "CockGun" begins with the character holding a weapon with one hand and "CockGunL" begins with the character holding a weapon with two hands.

I am not familiar with the particular class you are rewriting but if you are using the "Commando" player model you may find this excerpt of PlayWaiting from Botpack.HumanBotPlus useful for reference in terms of usage for this and the other "L" idle animations:

Code: Select all
function PlayWaiting()
{
   local name newAnim;

   if ( Physics == PHYS_Swimming )
   {
      BaseEyeHeight = 0.7 * Default.BaseEyeHeight;
      if ( (Weapon == None) || (Weapon.Mass < 20) )
         LoopAnim('TreadSM');
      else
         LoopAnim('TreadLG');
   }
   else
   {   
      BaseEyeHeight = Default.BaseEyeHeight;
      if ( (Weapon != None) && Weapon.bPointing )
      {
         if ( Weapon.bRapidFire && ((bFire != 0) || (bAltFire != 0)) )
            LoopAnim('StillFRRP');
         else if ( Weapon.Mass < 20 )
            TweenAnim('StillSMFR', 0.3);
         else
            TweenAnim('StillFRRP', 0.3);
      }
      else
      {
         if ( Level.Game.bTeamGame
            && ((FRand() < 0.04)
               || ((AnimSequence == 'Chat1') && (FRand() < 0.75))) )
         {
            newAnim = 'Chat1';
         }
         else if ( FRand() < 0.1 )
         {
            if ( (Weapon == None) || (Weapon.Mass < 20) )
               PlayAnim('CockGun', 0.5 + 0.5 * FRand(), 0.3);
            else
               PlayAnim('CockGunL', 0.5 + 0.5 * FRand(), 0.3);
         }
         else
         {
            if ( (Weapon == None) || (Weapon.Mass < 20) )
            {
               if ( (FRand() < 0.75) && ((AnimSequence == 'Breath1') || (AnimSequence == 'Breath2')) )
                  newAnim = AnimSequence;
               else if ( FRand() < 0.5 )
                  newAnim = 'Breath1';
               else
                  newAnim = 'Breath2';
            }
            else
            {
               if ( (FRand() < 0.75) && ((AnimSequence == 'Breath1L') || (AnimSequence == 'Breath2L')) )
                  newAnim = AnimSequence;
               else if ( FRand() < 0.5 )
                  newAnim = 'Breath1L';
               else
                  newAnim = 'Breath2L';
            }
                        
            if ( AnimSequence == newAnim )
               LoopAnim(newAnim, 0.4 + 0.4 * FRand());
            else
               PlayAnim(newAnim, 0.4 + 0.4 * FRand(), 0.25);
         }
      }
   }
}


This particular Botpack base class would also be useful for other references and general usage of animations pertaining to player models. I assume this "Humane.Humangrant" is a ScriptedPawn conversion of a player model? I could also offer further advice in regards to animation usage, function and state modifications for such a conversion class since in the past I have created ScriptedPawns based on player models for Unreal 227.

Regards,
-Dr. Walter
λξ

Σ ζ

?
User avatar
Dr. Walter
Novice
 
Posts: 20
Joined: Sat May 17, 2014 11:03 pm
Location: DM-Gothic
Personal rank: Mild-Mannered Madman

Re: Mesh "Commando": "CockGunL" vs. "CockGun"

Postby Barbie » Mon Jul 17, 2017 3:12 am

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.

Dr. Walter wrote:I assume this "Humane.Humangrant" is a ScriptedPawn conversion of a player model?
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:
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'
}


(Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).

<EDIT>Added "code preview" for SBHumaneFixes</EDIT>
"Multiple exclamation marks," he went on, shaking his head, "are a sure sign of a diseased mind." --Terry Pratchett
User avatar
Barbie
Godlike
 
Posts: 1171
Joined: Fri Sep 25, 2015 9:01 pm
Location: moved without proper hashing

Re: Mesh "Commando": "CockGunL" vs. "CockGun"

Postby sektor2111 » Mon Jul 17, 2017 3:16 pm

Barbie wrote:(Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).
Thanks, good to know, now it's fixed :thuup: , at once with state charging...
Underground Location.
User avatar
sektor2111
Godlike
 
Posts: 2612
Joined: Sun May 09, 2010 6:15 pm
Location: Into personal private location.
Personal rank: 0.11

Re: Mesh "Commando": "CockGunL" vs. "CockGun"

Postby nogardilaref » Mon Jul 17, 2017 8:04 pm

Barbie wrote:(Nota bene: While digging into these animation functions, I probably found a bug in function SkaarjTrooper.PlayCock ()).

Image
nogardilaref
Average
 
Posts: 73
Joined: Tue Jun 20, 2017 1:00 pm
Personal rank: ⚋⚊⚌☰⚞⌖⚟☰⚌⚊⚋

Re: Mesh "Commando": "CockGunL" vs. "CockGun"

Postby sektor2111 » Tue Jul 18, 2017 5:15 am

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" :loool: .
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.
Underground Location.
User avatar
sektor2111
Godlike
 
Posts: 2612
Joined: Sun May 09, 2010 6:15 pm
Location: Into personal private location.
Personal rank: 0.11


Return to Skins

Who is online

Users browsing this forum: No registered users and 1 guest