OFPEC tags

From Bohemia Interactive Community
Revision as of 14:11, 22 June 2021 by Lou Montana (talk | contribs) (Text replacement - "y[ _]*\|[ _]*(arma[0-9]+)[ _]*\|[ _]+" to "y|$1|")
Jump to navigation Jump to search

A Tag, also referred as OFPEC tag, is a three to five characters identifier that is individual to each designer, and allows for proper distinction between different authors' content.

If an addon does not have a tag it could cause a conflict with another addon: this can cause your mission, game (or even your whole computer depending on the game) to crash.


Tags are used in the following mod/addon contents:

  • Global variables
  • Function names
  • New classes (in config.cpp files)
  • P3D names
  • Addon PBO names - this is less true in Arma 3 since mod management is made through Steam.
It is good practice for mission makers to use tags for global variables, but at present it is not compulsory.


History

Tags were originally introduced by OFPEC in 2002 as a way of avoiding conflicts between different addons. The system was so effective that it was officially adopted by BI as a requirement for their Addons at Ease initiative. Today, every respectable addon maker has their own individual tag.

OFPEC have created a list of all these tags, so that people can see who registered which tag in order to avoid a tag usage conflict.


Tag Rules

Valid Invalid
  • ARMA_Variable
  • ABC_Variable
  • A5555_Variable
  • 1ST_Variable
  • A_Variable
  • A234567_Variable
  • AbC_Variable
  • ABCVariable

Tags must:

  • be composed of letters and eventually numbers
  • be 3 to 5 characters long
  • be uppercase
  • start with a letter
  • followed by an underscore _
Following the regex ^[A-Z][A-Z0-9]{2,4}$.


Examples

Example 1

// considering MYTAG is the current tag
player setVariable ["MYTAG_hasDocuments", false];

waitUntil { sleep 1; player getVariable ["MYTAG_hasDocuments", false] };
MYTAG_DocumentsGrabbed = true;
publicVariable "MYTAG_DocumentsGrabbed";

Example 2

class MYTAG_Ranger: B_Soldier_F
{
	displayName = "MYTAG Ranger";
	model="\MYTAG_Rangers\MYTAG_Ranger";
}

this would use MYTAG_Rangers.pbo and MYTAG_Ranger.p3d files

Example 3

class CfgAmmo
{
	class Default {};
	class BulletSingle : Default {};
	class BulletBurst : BulletSingle {};
	class KozliceShell : BulletBurst {};
	class MYTAG_RemShell : KozliceShell
	{
		hit = 6;
		indirectHit = 6;
		indirectHitRange = 0.2;
	};
};

class CfgWeapons
{
	class Default {};
	class MGun : Default {};
	class Riffle: MGun {};
	class KozliceShell : Riffle {};
	class MYTAG_RemShell : KozliceShell
	{
		picture = "\MYTAG_Delta\MYTAG_m_kozlice2.paa";
		###
		ammo = MYTAG_RemShell;
		###
		sound[] = { "\MYTAG_Delta\MYTAG_shotgun.wav", db0, 1 };
		reloadMagazineSound[] = { "\MYTAG_Delta\MYTAG_shotgunreload.wav", db-80, 1 };
	};
	class Kozlice {};
	class MYTAG_Remington : Kozlice
	{
		displayName = "MYTAG_Remington";
		model = "\MYTAG_Delta\MYTAG_Remington";
		picture = "\MYTAG_Delta\MYTAG_w_kozlice.paa";
		muzzles[] = {MYTAG_RemingtonShellMuzzle};
		class MYTAG_RemingtonShellMuzzle : MYTAG_RemShell
		{
			magazines[] = { MYTAG_RemShell };
		}
	};
};

class CfgNonAIVehicles
{
	class ProxyWeapon {};
	class ProxyMYTAG_Remington: ProxyWeapon {};
};

This would be stored in MYTAG_Delta.pbo and use the MYTAG_Remington.p3d file.