Jump to content

Recommended Posts

I am attempting to add Launcher animations and transitions for the prone stance. Selecting a launcher in prone only to make your character stand or crouch, revealing yourself to enemy fire or sight, is unacceptable. Not being able to ready a launcher or even fire one from the prone position is unacceptable.

 

ACE 1 and 2 did this by creating new States in the animation config, and altering the Actions for transitions. As ArmA 3 has added more actions and made some animation config entries defunct, I am having difficulty porting this feature over. Currently the animation state works correctly when switching from a rifle in prone to a launcher in prone. Attempting to switch to a launcher without a weapon (civil Lying) goes into multiple animations ending up in civil standing, and it does not work when switching from launcher standing or launcher kneeling. Can someone assist with this animation config?

 

class CfgPatches {
	class pizza_launcher_prone {
		units[] = {};
		weapons[] = {};
		requiredVersion = 1;
		requiredAddons[] = {"A3_Anims_F", "A3_Anims_F_Data","A3_Anims_F_Config_Sdr"};
		version = 1;
	};
};


class CfgMovesBasic {
	class Default;	// External class reference
	class Actions {
		
		class NoActions;	// External class reference
		class CivilStandActions;	// External class reference
		
		class CivilProneActions : CivilStandActions {
			SecondaryWeapon = "ACE_LauncherProne";
		};
		
		class PistolStandActions;	// External class reference
		
		class PistolProneActions : PistolStandActions {
			SecondaryWeapon = "ACE_LauncherProne";
		};
		
		class RifleBaseStandActions;	// External class reference
		
		class RifleProneActions : RifleBaseStandActions {
			SecondaryWeapon = "ACE_LauncherProne";
		};
		
		class LauncherKneelActions : NoActions {
			down = "ACE_LauncherProne";
			up = "AmovPercMstpSrasWlnrDnon";
			Lying = "ACE_LauncherProne";
			PlayerProne = "ACE_LauncherProne";
			EvasiveBack = "";
			Stand = "AmovPercMstpSrasWlnrDnon";
			PlayerStand = "AmovPercMstpSrasWlnrDnon";
			Crouch = "AmovPknlMstpSrasWlnrDnon";
			PlayerCrouch = "AmovPknlMstpSrasWlnrDnon";
		};
		
		class LauncherStandActions : LauncherKneelActions {
			down = "ACE_LauncherProne";
			PlayerProne = "ACE_LauncherProne";
			Lying = "ACE_LauncherProne";
		};
		
		class ACE_LauncherProneActions : LauncherKneelActions {
			stop = "ACE_LauncherProne";
			default = "ACE_LauncherProne";
			binocOn = "awopppnemstpsoptwbindnon_non";
			binocOff = "ACE_LauncherProne";
			handGunOn = "AmovPpneMstpSrasWpstDnon";
			ReloadRPG = "";
			GestureReloadRPG7[] = {"", ""};
			down = "AmovPercMstpSrasWlnrDnon";
			up = "AmovPknlMstpSrasWlnrDnon";
			PlayerStand = "AmovPercMstpSrasWlnrDnon";
			PlayerCrouch = "AmovPknlMstpSrasWlnrDnon";
			PlayerProne = "ACE_LauncherProne";
			Combat = "ACE_LauncherProne";
			Lying = "ACE_LauncherProne";
			Stand = "AmovPercMstpSrasWlnrDnon";
			Crouch = "AmovPknlMstpSrasWlnrDnon";
			die = "AdthPpneMstpSrasWrflDnon_1";
			Civil = "AmovPpneMstpSnonWnonDnon";
			CivilLying = "AmovPpneMstpSnonWnonDnon";
			walkF = "ACE_LauncherProneCrawlF";
			walkLF = "ACE_LauncherProneCrawlfl";
			walkRF = "ACE_LauncherProneCrawlfr";
			walkL = "ACE_LauncherProneCrawll";
			walkR = "ACE_LauncherProneCrawlr";
			walkLB = "ACE_LauncherProneCrawlbl";
			walkRB = "ACE_LauncherProneCrawlbr";
			walkB = "ACE_LauncherProneCrawlb";
			slowF = "ACE_LauncherProneCrawlf";
			slowLF = "ACE_LauncherProneCrawlfl";
			slowRF = "ACE_LauncherProneCrawlfr";
			slowL = "ACE_LauncherProneCrawll";
			slowR = "ACE_LauncherProneCrawlr";
			slowLB = "ACE_LauncherProneCrawlbl";
			slowRB = "ACE_LauncherProneCrawlbr";
			slowB = "ACE_LauncherProneCrawlb";
			fastF = "ACE_LauncherProneCrawlf";
			fastLF = "ACE_LauncherProneCrawlfl";
			fastRF = "ACE_LauncherProneCrawlfr";
			fastL = "ACE_LauncherProneCrawll";
			fastR = "ACE_LauncherProneCrawlr";
			fastLB = "ACE_LauncherProneCrawlbl";
			fastRB = "ACE_LauncherProneCrawlbr";
			fastB = "ACE_LauncherProneCrawlb";
			EvasiveForward = "";
			EvasiveLeft = "";
			EvasiveRight = "";
			EvasiveBack = "";
			turnL = "";
			turnR = "";
			turnLRelaxed = "";
			turnRRelaxed = "";
			getInCar = "AmovPknlMstpSrasWrflDnon";
			getOutCar = "AmovPknlMstpSrasWrflDnon";
			getInTank = "AmovPknlMstpSrasWrflDnon";
			getOutTank = "AmovPknlMstpSrasWrflDnon";
			upDegree = "ManPosWeapon";
			leanRRot = 0;
			leanRShift = 0;
			leanLRot = 0;
			leanLShift = 0;
			turnSpeed = 2;
		};
	};
};

class CfgMovesMaleSdr : CfgMovesBasic {
	class States {
		
		class ACE_LauncherProne : Default {
			actions = "ACE_LauncherProneActions";
			duty = -0.7;
			file = "\ace_anims\movement\ACE_Launcher_Lying.rtm";
			collisionShape = "A3\anims_f\Data\Geom\Sdr\Ppne.p3d";
			showWeaponAim = false;
			disableWeapons = false;
			disableWeaponsLong = false;
			enableMissile = true;
			canPullTrigger = true;
			aimPrecision = 0.3;
			speed = 1e+010;
			relSpeedMin = 0.7;
			relSpeedMax = 1.1;
			aiming = "aimingLauncher";
			looped = true;
			soundEnabled = false;
			connectTo[] = {};
			connectFrom[] = {};
			interpolateFrom[] = {"ACE_LauncherProne", 0.04};
			interpolateTo[] = {"ACE_LauncherProne", 0.04};
			enableBinocular = true;
			preload = false;
			headBobStrength = 0.20398;
			headBobMode = 2;
			leftHandIKBeg = true;
			leftHandIKCurve[] = {1};
			leftHandIKEnd = true;
			rightHandIKBeg = true;
			rightHandIKCurve[] = {1};
			rightHandIKEnd = true;
			weaponIK = 4;
			legs = "legsLyingAimingPistol";
			visibleSize = 0.15;
			onLandBeg = true;
			onLandEnd = true;
			leaningFactorBeg = 0;
			leaningFactorEnd = 0;
			enableOptics = 4;
		};
		
		class TransAnimBase; 
		
		class ACE_LauncherKneel_LauncherProne : TransAnimBase {
			actions = "ACE_LauncherProneActions";
			file = "\A3\anims_f\Data\Anim\Sdr\mov\knl\stp\ras\lnr\amovpknlmstpsraswlnrdnon_amovppnemstpsraswlnrdnon";
			speed = 0.33;
			weaponIK = 4;
			aiming = "aimingCivil";
			aimingBody = "aimingUpCivil";
			onLandBeg = false;
			onLandEnd = true;
			interpolationSpeed = 1;
			soundOverride = "laydown";
			soundEnabled = true;
			enableMissile = true;
			interpolateFrom[] = {"AmovPknlMstpSrasWlnrDnon", 0.01};
			interpolateTo[] = {"ACE_LauncherProne", 0.01};
		};
		
		class ACE_LauncherProne_LauncherKneel : TransAnimBase {
			actions = "LauncherKneelActions";
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\stp\ras\lnr\amovppnemstpsraswlnrdnon_amovpknlmstpsraswlnrdnon";
			speed = 0.31;
			aiming = "aimingCivil";
			aimingBody = "aimingUpCivil";
			onLandBeg = true;
			onLandEnd = false;
			enableMissile = true;
			interpolationSpeed = 1;
			soundOverride = "standup";
			soundEnabled = true;
			leaningFactorBeg = 0.5;
			leaningFactorEnd = 0.5;
			weaponIK = 4;
			interpolateFrom[] = {"ACE_LauncherProne", 0.01};
			interpolateTo[] = {"AmovPknlMstpSrasWlnrDnon", 0.01};
		};
		
		class ACE_RifleProne_LauncherProne : TransAnimBase {
			actions = "ACE_LauncherProneActions";
			file = "\A3\anims_f\Data\Anim\Sdr\mov\pne\stp\ras\rfl\AmovPpneMstpSrasWrflDnon_AwopPpneMstpSoptWbinDnon";
			speed = 0.66;
			disableWeapons = true;
			aiming = "aimingCivil";
			aimingBody = "aimingUpCivil";
			interpolationSpeed = 1;
			leftHandIKBeg = 0.0;
			leftHandIKCurve[] = {};
			leftHandIKEnd = 0.0;
			rightHandIKBeg = 0.0;
			rightHandIKCurve[] = {};
			rightHandIKEnd = 0.0;
			soundEnabled = false;
			leaningFactorBeg = 1.0;
			leaningFactorEnd = 0.5;
			interpolateFrom[] = {"AmovPpneMstpSrasWrflDnon", 0.01};
			interpolateTo[] = {"ACE_LauncherProne", 0.01};
			weaponIK = 4;
			onLandBeg = true;
			onLandEnd = true;
		};
		
		class ACE_LauncherProne_RifleProne : TransAnimBase {
			actions = "RifleProneActions";
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\stp\ras\pst\AmovPpneMstpSrasWpstDnon_AmovPpneMstpSrasWrflDnon_end";
			speed = 0.16;
			disableWeapons = true;
			aiming = "aimingCivil";
			aimingBody = "aimingUpCivil";
			interpolationSpeed = 1;
			leftHandIKBeg = 0.0;
			leftHandIKCurve[] = {0};
			leftHandIKEnd = false;
			rightHandIKBeg = 0.0;
			rightHandIKCurve[] = {0};
			rightHandIKEnd = false;
			soundEnabled = false;
			leaningFactorBeg = 0;
			leaningFactorEnd = 0;
			interpolateFrom[] = {"ACE_LauncherProne", 0.01};
			interpolateTo[] = {"AmovPpneMstpSrasWrflDnon", 0.01};
			weaponIK = 4;
			onLandBeg = true;
			onLandEnd = true;
		};
		
		class ACE_LauncherProneCrawlf : ACE_LauncherProne {
			actions = "ACE_LauncherProneActions";
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDf";
			speed = 0.9;
			collisionShape = "A3\anims_f\Data\Geom\Sdr\Ppne.p3d";
			duty = -0.3;
			leaningFactorBeg = 0;
			leaningFactorEnd = 0;
			disableWeapons = true;
			disableWeaponsLong = true;
			soundEnabled = true;
			connectTo[] = {"ACE_LauncherProneCrawlf", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlf", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlfl", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlfl", 0.025};
			weaponIK = 0;
		};
		
		class ACE_LauncherProneCrawlfl : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDfl";
			speed = 0.9;
			connectTo[] = {"ACE_LauncherProneCrawlfl", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlfl", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawll", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawll", 0.025};
		};
		
		class ACE_LauncherProneCrawll : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDl";
			speed = 1.2;
			connectTo[] = {"ACE_LauncherProneCrawll", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawll", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlbl", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlbl", 0.025};
		};
		
		class ACE_LauncherProneCrawlbl : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDbl";
			speed = 0.9;
			connectTo[] = {"ACE_LauncherProneCrawlbl", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlbl", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlb", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlb", 0.025};
		};
		
		class ACE_LauncherProneCrawlb : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDb";
			speed = 0.9;
			connectTo[] = {"ACE_LauncherProneCrawlb", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlb", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlbr", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlbr", 0.025};
		};
		
		class ACE_LauncherProneCrawlbr : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDbr";
			speed = 0.8;
			connectTo[] = {"ACE_LauncherProneCrawlbr", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlbr", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlr", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlr", 0.025};
		};
		
		class ACE_LauncherProneCrawlr : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDr";
			speed = 1.2;
			connectTo[] = {"ACE_LauncherProneCrawlr", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlr", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlfr", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlfr", 0.025};
		};
		
		class ACE_LauncherProneCrawlfr : ACE_LauncherProneCrawlf {
			file = "\A3\anims_f\Data\Anim\Sdr\Mov\pne\run\non\non\AmovPpneMrunSnonWnonDfr";
			speed = 0.75;
			connectTo[] = {"ACE_LauncherProneCrawlfr", 0.02};
			connectFrom[] = {"ACE_LauncherProneCrawlfr", 0.02};
			interpolateFrom[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlf", 0.025};
			interpolateTo[] = {"ACE_LauncherProne", 0.02, "ACE_LauncherProneCrawlf", 0.025};
		};
	};
	
	class Interpolations {
		ACE_LauncherProneMove[] = {2, "ACE_LauncherProne", "ACE_LauncherProneCrawlF", "ACE_LauncherProneCrawlfl", "ACE_LauncherProneCrawlfr", "ACE_LauncherProneCrawll", "ACE_LauncherProneCrawlr", "ACE_LauncherProneCrawlbl", "ACE_LauncherProneCrawlbr", "ACE_LauncherProneCrawlb"};
	};
};

 

Share this post


Link to post
Share on other sites

Anim configs are notoriously difficult to debug by proxy. So here some basics to help you understand the tech you are dealing with.
 

Quote

Attempting to switch to a launcher without a weapon (civil Lying) goes into multiple animations ending up in civil standing

This symptom means that the cost values are not balanced. The cost values are the values behind each animation state name in a linking parameter. (interpolates and connects). An A* system uses these cost values to find allowed and the most direct path to a new state. In your case ACE_LauncherProne links to all your movement states back and forth correctly. However, it may be that the transitions are too expensive. IIRC the standard cost A3 uses is 0.02.

But be warned, messing with cost values and available links can easily break other animation-chains you weren't even thinking of. A classic example I every now and then encounter is that the transition from standing unarmed to prone unarmed transitions through a free-fall state instead of a correct transition animation.
 

Quote

and it does not work when switching from launcher standing or launcher kneeling.

You will need to set up correct links to allow for this. For example:

In your action map (LauncherStandActions) you have correctly defined the lying and playerProne parameters to link to your new prone animation states. However, does your playerProne animation state (ACE_LauncherProne) know it can transition from the standing animation? The animation state that LauncherStandActions's default parameter links (From memory this should be AmovPercMstpSrasWlnrDnon) must also be connected to your ACE_LauncherProne state.

So ACE_LauncherProne should have either an interpolateFrom entry linking to AmovPercMstpSrasWlnrDnon or connectFrom a correct transition animation that serves as the bridge between LauncherStanding and LauncherProne animation states.

I know this sounds complex and uses a lot of specific terms, but RV animation configuration is a complex subject that requires extremely tidy work, which brings me to this:

class Interpolations {

Class interpolations is a thoroughly bad idea to use. While does get the job done of neatly creating interpolateWith links between all items in there, it makes debugging animation links so much more complex its not worth using it.
BI themselves aren't even using the -With type of links in regular animation states. Also, class Interpolations is so obscure and unused, that I believe the origins of this Launcher-Prone animation config come from SLX Mod for OFP/Arma1. That was the last time I saw class Interpolations being used.

Cheers, I hope this helps. Don't hesitate to ask specific questions when you're stuck. :)

  • Like 3

Share this post


Link to post
Share on other sites

Thank you for your response

 

So if I am not mistaken, I can create entries that only connect to the specific path i want to create, and make a lower cost value for them to make sure they are used instead of other transition entries? IE, defining an "ACE_Launcher_Standing_to_Prone" transition entry that has a low cost but only connects to the "ACE_Launcher" state and which is only connected to from the standing launcher state?

 

And yes, this is a port from ACE 2, which of course was a port from ACE 1, which animations originally came from SLX.

Share this post


Link to post
Share on other sites

Best of luck to you @PiZZADOX!

 

I hope you figure out a way of beating arma animations into prone-position submission :p

Share this post


Link to post
Share on other sites

After years of Hiatus and going back to play ArmA 2 instead, I've ported this feature over to ACE 3, it is currently in a PR here: https://github.com/acemod/ACE3/pull/7002

Nearly all the issues I faced before were do to what seems to be purposeful engine changes to prevent prone launchers in AT, not config issues.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×