Scripting Tags

From Bohemia Interactive Community
Revision as of 12:00, 2 October 2024 by Lou Montana (talk | contribs) (Lou Montana moved page OFPEC tags to Scripting Tags: Name standard)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

Before 2022 and Arma Reforger era, a tag was three to five characters long.

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.
    Note: for Real Virtuality games (OFP → Arma 3) pbo names tags should be lower case for Linux server compatibility.
It is good practice for mission framework makers to use tags for global variables as well.


Rules

Valid Invalid
  • ARM4_Variable
  • ABC_Variable
  • A2345678_Variable
  • 1ST_Variable
  • A_Variable
  • A234567890_Variable
  • AbC_Variable
  • ABCVariable

Tags must:

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


History

Tags were originally introduced by OFPEC in 2002 as a way to avoid 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.


Examples

Scripting

// 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";

Unit Config

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

Weapon Config

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.