User Tools

Site Tools


arma2:port_arma

ArmA to ArmA 2 port

How to port Armed Assault addon to ArmA 2. Also know as how to convert ArmA addon / mod. See also port OFP addon.

Helicopter

How to port ArmA to ArmA 2, this focuses on helicopter.

1) create p:\pmc\pmc_ch34 dir. this is what we consider our root now (pmc_ch34).

2) create $PBOPREFIX$ file in there. write there: pmc\pmc_ch34

3) create data dir into our root. what was our root? it is pmc_ch34 dir.

4) copy PMC_ch34.p3d and other related p3d models in the root.

5) copy the models textures (paa & rvmat) into pmc_ch34\data dir.

6) create config.cpp file into the root.

this is your example:

class CfgPatches
{
	class PMC_ch34
	{
		units[] = {};
		weapons[] = {};
		requiredVersion = 1;
		requiredAddons[] =
		{
			"CACharacters",
			"CACharacters2",
			"CAWeapons",
			"CA_Anims_Char",
			"CAAir"
		};
	};
};
 
class CfgFactionClasses
{
	class PMC
	{
		displayName = "PMC";
		priority = 1;
		side = 1;
	};
};
 
class CfgVehicleClasses
{
	class PMC_air
	{
		displayName = "PMC - Air";
	};
};
 
class CfgVehicles
{
	class MH60S;
 
	class PMC_ch34: MH60S
	{
		displayName = "CH34";
		faction = "PMC";
		model = "\pmc\pmc_ch34\pmc_ch34.p3d";
 
		weapons[] = {};
		magazines[] = {};
	};
};

7) create model.cfg file into the root.

add there just basic things:

class Rotation
{
	type = "rotation";
	memory = 1;
	minValue = 0;
	maxValue = 1;
	angle0 = 0;
	angle1 = 1;
};
 
class CfgSkeletons
{
	class Default
	{
		isDiscrete = 1;
		skeletonInherit = "";
		skeletonBones[] = {};
	};
	class Vehicle : Default {};
	class Car : Vehicle
	{
		skeletonBones[]=
		{
			"drivewheel","",
 
			"OtocVez","",
			"OtocHlaven","OtocVez",
 
			"damageHide","",
			"damageVez","OtocVez",
			"damageHlaven","OtocHlaven",
		};
	};
 
	class PMC_ch34: Car{};
};

8) create _run_moveobject.bat text file into the root. write the following into it:

for %%x in (*.p3d) do (\path\moveobject %%x vte_air\tex pmc\pmc_ch34\data)
for %%x in (*.p3d) do (\path\moveobject %%x vte_air pmc\pmc_ch34)
for %%x in (*.rvmat) do (\path\moveobject %%x vte_air\tex pmc\pmc_ch34\data)
pause

then run the _run_moveobject.bat file which executes moveobject for all the p3d files in the dir. if you notice the double vte_air replaces, the first is for the tex dir to moved into data and another is for the root so proxy's are moved also.

9) copy _run_moveobject.bat file into pmc_ch34\data dir and execute it there also.

10) run binpbo to binarize the pmc_ch34 dir. look for binarize log file for errors.

All done :)

That is the nutshell of how to port working ArmA helicopter to ArmA 2. When you test it around you'll find that there is many things to fix, but this way your helicopter is in-game and flying already. Rest is the fine tuning and polishing your addon.

Character

This explains how to port character / soldier model.

1) create p:\pmc\pmc_delta dir. this is what we consider our root now (pmc_delta).

2) create $PBOPREFIX$ file in there. write there: pmc\pmc_delta

3) create data dir into our root. what was our root? it is pmc_delta dir.

4) copy us_soldier_sabass.p3d and other related p3d models in the root.

5) copy the models textures (paa & rvmat) into pmc_delta\data dir.

6) create config.cpp file into the root.

class CfgPatches
{
	class PMC_delta
	{
		units[] = {};
		weapons[] = {};
		requiredAddons[] = {};
		requiredVersion = 1;
	};
};
 
class CfgVehicleClasses
{
	class PMC_usdeltaforce
	{
		displayName = "US Delta Force 1993";
	};
};
 
class CfgVehicles
{
	class FR_R;
	class PMC_delta_squadleader: FR_R
	{
		vehicleClass = "PMC_usdeltaforce";
		displayName = "Delta Force Squadleader";
		model = "\pmc\pmc_delta\pmc_us_soldier_sabmark.p3d";
 
		accuracy = 3.5;
		cost = 400000;
		nameSound = "blackOp";
		camouflage = 0.7;
		threat[] = {1, 0.5, 0.1};
		canHideBodies = true;
		canDeactivateMines = true;
		nightVision = true;
		enableGPS = true;
 
		weapons[] = {};
		magazines[] = {};
 
		class Wounds
		{
			tex[] = {};
			mat[] =
			{
				"pmc\pmc_delta\data\us_rukavy_sab_hhl.rvmat",
				"pmc\pmc_delta\data\us_rukavy_sab_hhl_wound1.rvmat",
				"pmc\pmc_delta\data\us_rukavy_sab_hhl_wound2.rvmat",
				"pmc\pmc_delta\data\us_soldier_sabmark_body.rvmat",
				"pmc\pmc_delta\data\us_soldier_sabmark_body_wound1.rvmat",
				"pmc\pmc_delta\data\us_soldier_sabmark_body_wound2.rvmat"
			};
		};
	};
};

7) create model.cfg file into the root.

add there just basic things:

class Rotation
{
	type = "rotation";
	memory = 1;
	minValue = 0;
	maxValue = 1;
	angle0 = 0;
	angle1 = 1;
};
 
class CfgSkeletons
{
	class Default
	{
		isDiscrete = 1;
		skeletonInherit = "";
		skeletonBones[] = {};
	};
 
	class Head
	{
		isDiscrete = 0;
		skeletonInherit = "";
	  	skeletonBones[] =
	  	{
	  		"neck","",
			"neck1","neck",
			"head","neck1",
			"jaw","head",
			"chin","head",
			"jaw_rf","head",
			"jaw_rm","head",
			"jaw_rs","head",
			"jaw_lf","head",
			"jaw_lm","head",
			"jaw_ls","head",
			"ear_r","head",
			"ear_l","head",
			"lip_lc","head",
			"lip_lwlb","head",
			"lip_lwlf","head",
			"lip_lwm","head",
			"lip_lwrf","head",
			"lip_lwrb","head",
			"lip_rc","head",
			"lip_uprb","head",
			"lip_uprf","head",
			"lip_upm","head",
			"lip_uplf","head",
			"lip_uplb","head",
			"nose_tip","head",
			"nose_r","head",
			"nose_l","head",
			"zig_lt","head",
		    	"zig_lm","head",
		    	"zig_lb","head",
		    	"zig_rt","head",
		    	"zig_rm","head",
		    	"zig_rb","head",
		    	"cheek_r","head",
		    	"cheek_l","head",
			"eyebrow_lb","head",
			"eyebrow_lm","head",
			"eyebrow_lf","head",
			"corr","head",
			"eyebrow_rf","head",
			"eyebrow_rm","head",
			"eyebrow_rb","head",
			"eye_upr","head",
			"eye_lwr","head",
			"eye_upl","head",
			"eye_lwl","head",
			"cheek_rf","head",
			"cheek_rm","head",
			"cheek_rb","head",
			"cheek_lf","head",
			"cheek_lm","head",
			"cheek_lb","head",
			"forehead_l","head",
			"forehead_m","head",
			"forehead_r","head",
			"l_eye","head",
			"r_eye","head",
			"l_pupila","head",
			"r_pupila","head",
			"neck_t","head",
			"neck_b","head",
			"neck_r","head",
			"neck_l","head",
			"tongue_b","head",
			"tongue_m","head",
			"tongue_f","head"
		};
	};
 
	class OFP2_ManSkeleton
	{
		isDiscrete = 0;
		skeletonInherit = "";
		skeletonBones[] =
		{
			"Pelvis","",
			"Spine","Pelvis",
			"Spine1","Spine",
			"Spine2","Spine1",
			"Spine3","Spine2",
			"Camera","Pelvis",
			"weapon","Spine1",
			"launcher","Spine1",
			//Head skeleton in hierarchy
			"neck","Spine3",
			"neck1","neck",
			"head","neck1",
			"HeadCutScene","head",
			"jaw","head",
			"chin","head",
			"jaw_rf","head",
			"jaw_rm","head",
			"jaw_rs","head",
			"jaw_lf","head",
			"jaw_lm","head",
			"jaw_ls","head",
			"ear_r","head",
			"ear_l","head",
			"lip_lc","head",
			"lip_lwlb","head",
			"lip_lwlf","head",
			"lip_lwm","head",
			"lip_lwrf","head",
			"lip_lwrb","head",
			"lip_rc","head",
			"lip_uprb","head",
			"lip_uprf","head",
			"lip_upm","head",
			"lip_uplf","head",
			"lip_uplb","head",
			"nose_tip","head",
			"nose_r","head",
			"nose_l","head",
			"zig_lt","head",
			"zig_lm","head",
			"zig_lb","head",
			"zig_rt","head",
			"zig_rm","head",
			"zig_rb","head",
			"cheek_r","head",
			"cheek_l","head",
			"eyebrow_lb","head",
			"eyebrow_lm","head",
			"eyebrow_lf","head",
			"corr","head",
			"eyebrow_rf","head",
			"eyebrow_rm","head",
			"eyebrow_rb","head",
			"eye_upr","head",
			"eye_lwr","head",
			"eye_upl","head",
			"eye_lwl","head",
			"cheek_rf","head",
			"cheek_rm","head",
			"cheek_rb","head",
			"cheek_lf","head",
			"cheek_lm","head",
			"cheek_lb","head",
			"forehead_l","head",
			"forehead_m","head",
			"forehead_r","head",
			"l_eye","head",
			"r_eye","head",
			"l_pupila","head",
			"r_pupila","head",
			"neck_t","head",
			"neck_b","head",
			"neck_r","head",
			"neck_l","head",
			"tongue_b","head",
			"tongue_m","head",
			"tongue_f","head",
			//Left upper side
			"LeftShoulder","Spine3",
			"LeftArm","LeftShoulder",
			"LeftArmRoll","LeftArm",
			"LeftForeArm","LeftArmRoll",
			"LeftForeArmRoll","LeftForeArm",
			"LeftHand","LeftForeArmRoll",
			"LeftHandRing","LeftHand",
			"LeftHandRing1","LeftHandRing",
			"LeftHandRing2","LeftHandRing1",
			"LeftHandRing3","LeftHandRing2",
			"LeftHandPinky1","LeftHandRing",
			"LeftHandPinky2","LeftHandPinky1",
			"LeftHandPinky3","LeftHandPinky2",
			"LeftHandMiddle1","LeftHand",
			"LeftHandMiddle2","LeftHandMiddle1",
			"LeftHandMiddle3","LeftHandMiddle2",
			"LeftHandIndex1","LeftHand",
			"LeftHandIndex2","LeftHandIndex1",
			"LeftHandIndex3","LeftHandIndex2",
			"LeftHandThumb1","LeftHand",
			"LeftHandThumb2","LeftHandThumb1",
			"LeftHandThumb3","LeftHandThumb2",
			//Right upper side
			"RightShoulder","Spine3",
			"RightArm","RightShoulder",
			"RightArmRoll","RightArm",
			"RightForeArm","RightArmRoll",
			"RightForeArmRoll","RightForeArm",
			"RightHand","RightForeArmRoll",
			"RightHandRing","RightHand",
			"RightHandRing1","RightHandRing",
			"RightHandRing2","RightHandRing1",
			"RightHandRing3","RightHandRing2",
			"RightHandPinky1","RightHandRing",
			"RightHandPinky2","RightHandPinky1",
			"RightHandPinky3","RightHandPinky2",
			"RightHandMiddle1","RightHand",
			"RightHandMiddle2","RightHandMiddle1",
			"RightHandMiddle3","RightHandMiddle2",
			"RightHandIndex1","RightHand",
			"RightHandIndex2","RightHandIndex1",
			"RightHandIndex3","RightHandIndex2",
			"RightHandThumb1","RightHand",
			"RightHandThumb2","RightHandThumb1",
			"RightHandThumb3","RightHandThumb2",
			//Left lower side
			"LeftUpLeg","Pelvis",
			"LeftUpLegRoll","LeftUpLeg",
			"LeftLeg","LeftUpLegRoll",
			"LeftLegRoll","LeftLeg",
			"LeftFoot","LeftLegRoll",
			"LeftToeBase","LeftFoot",
			//Right lower side
			"RightUpLeg","Pelvis",
			"RightUpLegRoll","RightUpLeg",
			"RightLeg","RightUpLegRoll",
			"RightLegRoll","RightLeg",
			"RightFoot","RightLegRoll",
			"RightToeBase","RightFoot"
	    };
	    // location of pivot points (local axes) for hierarchical animation
	    pivotsModel = "";
	};
};
 
class CfgModels
{
	class Default
	{
		sectionsInherit = "";
		sections[] = {};
		skeletonName = "";
	};
 
	class Head: Default
	{
		sections[] =
		{
			"osobnost",
			"brejle"
		};
		skeletonName = "Head";
	};
 
	class PMC_us_soldier_sabass: Default
	{
		sections[] =
		{
	    		"osobnost",
			"Head_Injury",
			"Body_Injury",
			"l_leg_injury",
			"l_arm_injury",
			"r_arm_injury",
			"r_leg_injury",
	    		"clan",
			"clan_sign",
			"Camo",
			"CamoB",
			"medic"
		};
	  	skeletonName = "OFP2_ManSkeleton";
	};
};

8) create _run_moveobject.bat text file into the root. write the following into it:

for %%x in (*.p3d) do (\path\moveobject %%x ca\characters\data pmc\pmc_delta\data >nul)
for %%x in (*.p3d) do (\path\moveobject %%x ca\characters\hhl pmc\pmc_delta\data >nul)
for %%x in (*.p3d) do (\path\moveobject %%x ca\data pmc\pmc_delta\data >nul)
for %%x in (*.p3d) do (\path\moveobject %%x ca\wheeled\data pmc\pmc_delta\data >nul)

then run the _run_moveobject.bat file which executes moveobject for all the p3d files in the dir. if you notice the several ca\.. replaces, it just means that there are so many different directories to change.

9) copy _run_moveobject.bat file into pmc_delta\data dir, change the “*.p3d” to “*.rvmat” and execute it there also.

10) run binpbo to binarize the pmc_delta dir. look for binarize log file for errors.

All done :)

That is the nutshell of how to port working ArmA character to ArmA 2. The soldier is then pretty much done, there is not more fine tuning than that.

This tutorial is very short and not very descriptive, feel free to ask questions and/or offer solutions in PMC Tactical forum Porting ArmA (1) addon topic.

Terrain

Many objects in ArmA are not included in ArmA 2 anymore, this causes serious problems for porting terrains. The simplest way is to just include the objects found in your ArmA terrain into the extra “objects pbo” alongside with your new ArmA 2 terrain. This might not be the best choice regarding download sizes if you have rich ArmA object usage, but there just isn't any other practical way of doing it. Also remember that if each and every terrain maker includes this and that objects, then we end up the ArmA objects duped all over the community dozens of times and just using one major addon like CAA1 would be much better. However using CAA1 for just “few” objects is not practical due its (about 2gb) size.

To be more specific about objects you can just switch to ArmA 2 ones, are roads.

ArmA road ArmA 2 road
ca\roads\asf ca\roads2\asf2_
ca\roads\ces ca\roads2\grav_
ca\roads\runway_dirt_1.p3d ca\roads2\runway_dirt_1.p3d
ca\roads\runway_dirt_2.p3d ca\roads2\runway_dirt_2.p3d
ca\roads\runway_dirt_3.p3d ca\roads2\runway_dirt_3.p3d
ca\roads\runway_main.p3d ca\roads2\runway_main.p3d
ca\roads\runway_poj_end27.p3d ca\roads2\runway_poj_L_1_end.p3d
ca\roads\runway_poj_end9.p3d ca\roads2\runway_poj_L_1_end.p3d
ca\roads\runway_pojdraha.p3d ca\roads2\runway_poj_draha.p3d
ca\roads\sil ca\roads2\asf1_
ca\roads\silnice ca\roads2\asf1_

Some of the ArmA roads when changed to use ArmA 2 roads, cause ugly caps appearing in the road network, not on each and every piece but just maybe one, we do not have the object name and we assume its one object. Its most likely the ca\roads2\asf2_ road type.

The above roads list is work in progress and unconfirmed! please use caution when using this guide!

ArmA To ArmA 2 Roads

When porting ArmA roads into ArmA 2, meaning you just swap using arma ca\roads\asf25 to arma2 ca\roads2\asf25 then you get slight gaps in the road curves and perhaps other parts too, its barely noticeable though.

Possible solutions would be to remake the roads using actual ArmA 2 objects, but most cases that is not viable option (too much work).

Vehicle Get-In memory points

The old memory points for get-in driver/gunner/cargo which worked fine in ArmA do not work so hot anymore in ArmA 2.

These ArmA 2 get-in memory points work best if “pos_driver” is slightly off the side of the vehicle, then “pos_driver_dir” is very close to the pos_driver in the direction of the vehicle.

Also its unconfirmed, but if you have 2 pos_driver memory points and only one pos_driver_dir, it might not work at all but as said this is unconfirmed data. Be sure to check this if your get-in point's do not work.

Of course the “pos_driver” can be anything, BIS uses “pos driver” without the underscore, we use with underscore. The memory point name is defined in config.cpp for the vehicle.

arma2/port_arma.txt · Last modified: 2016-11-15 12:26 by snakeman