// Register all particles below!

// Example how to register particles from a mod
/*
modded class ParticleList
{
	static const int MODDED_PARTICLE = RegisterParticle( "mod_folder/" , "my_modded_particle");
}
*/

class ParticleList
{
	ref static map<int, string> m_ParticlePaths; // Contains full paths to all particles. WARNING: Paths are without the '.ptc' suffix!
	ref static map<string, int> m_ParticleNames; // Contains file NAME (without suffix) to id. 
	
	static int m_lastID = 0;
	
	// REGISTER ALL PARTICLES BELOW:
	
	static const int INVALID						= -1;
	static const int NONE							= 0; // 0 does not exist either, valid particle starts from 1
	static const int PARTICLE_TEST					= RegisterParticle("_test_orientation");
	static const int DEBUG_DOT						= RegisterParticle("debug_dot");
	static const int DEBUG_DOT5M					= RegisterParticle("debug_dot5m");
	
	// FIREPLACE	
	// Normal fireplace
	static const int CAMP_FIRE_START				= RegisterParticle("fire_small_camp_01_start");
	static const int CAMP_SMALL_FIRE 				= RegisterParticle("fire_small_camp_01");
	static const int CAMP_NORMAL_FIRE				= RegisterParticle("fire_medium_camp_01");
	static const int CAMP_SMALL_SMOKE 				= RegisterParticle("smoke_small_camp_01");
	static const int CAMP_NORMAL_SMOKE				= RegisterParticle("smoke_medium_camp_01");
	static const int CAMP_FIRE_END					= RegisterParticle("fire_small_camp_01_end");
	static const int CAMP_STEAM_2END				= RegisterParticle("steam_medium_camp_2end");
	static const int CAMP_STEAM_EXTINGUISH_START	= RegisterParticle("default_01");
	static const int CAMP_STOVE_FIRE				= RegisterParticle("fire_small_stove_01");
	static const int CAMP_STOVE_FIRE_START			= RegisterParticle("fire_small_stove_01_start");
	static const int CAMP_STOVE_FIRE_END			= RegisterParticle("fire_small_stove_01_end");
	static const int CAMP_NO_IGNITE_WIND			= RegisterParticle("fire_extinguish_wind");
	// Fireplace indoor
	static const int HOUSE_FIRE_START				= RegisterParticle("fire_small_house_01_start");
	static const int HOUSE_SMALL_FIRE 				= RegisterParticle("fire_small_house_01");
	static const int HOUSE_SMALL_SMOKE 				= RegisterParticle("smoke_small_house_01");
	static const int HOUSE_NORMAL_FIRE				= RegisterParticle("fire_medium_house_01");
	static const int HOUSE_NORMAL_SMOKE				= RegisterParticle("smoke_medium_house_01");
	static const int HOUSE_FIRE_END					= RegisterParticle("fire_small_house_01_end");
	static const int HOUSE_FIRE_STEAM_2END			= RegisterParticle("steam_medium_house_2end");
	// Fireplace in barrel with holes
	static const int BARREL_FIRE_START				= RegisterParticle("fire_small_barrel_01_start");
	static const int BARREL_SMALL_FIRE 				= RegisterParticle("fire_small_barrel_01");
	static const int BARREL_SMALL_SMOKE 			= RegisterParticle("smoke_small_barrel_01");
	static const int BARREL_NORMAL_FIRE				= RegisterParticle("fire_medium_barrel_01");
	static const int BARREL_NORMAL_SMOKE			= RegisterParticle("smoke_medium_barrel_01");
	static const int BARREL_FIRE_END				= RegisterParticle("fire_small_barrel_01_end");
	static const int BARREL_FIRE_STEAM_2END			= RegisterParticle("steam_medium_camp_2end");
	// Fireplace in indoor oven
	static const int OVEN_FIRE_START				= RegisterParticle("fire_small_oven_01_start");
	static const int OVEN_SMALL_FIRE 				= RegisterParticle("fire_small_oven_01");
	static const int OVEN_NORMAL_FIRE				= RegisterParticle("fire_medium_oven_01");
	static const int OVEN_FIRE_END					= RegisterParticle("fire_small_ovenl_01_end");
	
	// COOKING
	static const int COOKING_BOILING_EMPTY			= RegisterParticle("cooking_boiling_empty");
	static const int COOKING_BOILING_START			= RegisterParticle("cooking_boiling_start");
	static const int COOKING_BOILING_DONE			= RegisterParticle("cooking_boiling_done");
	static const int COOKING_BAKING_START			= RegisterParticle("cooking_baking_start");
	static const int COOKING_BAKING_DONE			= RegisterParticle("cooking_baking_done");	
	static const int COOKING_DRYING_START			= RegisterParticle("cooking_drying_start");
	static const int COOKING_DRYING_DONE			= RegisterParticle("cooking_drying_done");
	static const int COOKING_BURNING_DONE			= RegisterParticle("cooking_burning_done");
	static const int ITEM_HOT_VAPOR					= RegisterParticle("item_hot_vapor");
	
	// TORCH
	static const int TORCH_T3						= RegisterParticle("fire_small_torch_01");
	static const int TORCH_T1						= RegisterParticle("fire_small_torch_02");
	static const int TORCH_T2						= RegisterParticle("fire_small_torch_03");
	
	//BROOM TORCH
	static const int BROOM_TORCH_T1					= RegisterParticle("fire_small_broom_torch_01");
	static const int BROOM_TORCH_T2					= RegisterParticle("fire_small_broom_torch_02");
	static const int BROOM_TORCH_T3					= RegisterParticle("fire_small_broom_torch_03");
	
	// ROADFLARE
	static const int ROADFLARE_BURNING_INIT			= RegisterParticle("fire_small_roadflare_red_04");
	static const int ROADFLARE_BURNING_MAIN			= RegisterParticle("fire_small_roadflare_red_01");
	static const int ROADFLARE_BURNING_ENDING		= RegisterParticle("fire_small_roadflare_red_02");
	static const int ROADFLARE_BURNING_SMOKE		= RegisterParticle("fire_small_roadflare_red_03");
	
	// FLARE PROJECTILE
	static const int FLAREPROJ_FIRE					= RegisterParticle("fire_small_roadflare_red_04");
	static const int FLAREPROJ_ACTIVATE				= RegisterParticle("fire_small_flare_yellow_01");
	static const int FLAREPROJ_ACTIVATE_RED			= RegisterParticle("fire_small_flare_red_01");
	static const int FLAREPROJ_ACTIVATE_GREEN		= RegisterParticle("fire_small_flare_green_01");
	static const int FLAREPROJ_ACTIVATE_BLUE		= RegisterParticle("fire_small_flare_blue_01");
	
	// DIGGING
	static const int DIGGING_STASH					= RegisterParticle("digging_ground");
	
	// SMOKE GRENADES
	//! RDG2
	static const int GRENADE_RDG2_BLACK_START		= RegisterParticle("smoke_RDG2_black_01");
	static const int GRENADE_RDG2_BLACK_LOOP		= RegisterParticle("smoke_RDG2_black_02");
	static const int GRENADE_RDG2_BLACK_END			= RegisterParticle("smoke_RDG2_black_03");
	static const int GRENADE_RDG2_WHITE_START		= RegisterParticle("smoke_RDG2_white_01");
	static const int GRENADE_RDG2_WHITE_LOOP		= RegisterParticle("smoke_RDG2_white_02");
	static const int GRENADE_RDG2_WHITE_END			= RegisterParticle("smoke_RDG2_white_03");
	//! M18
	static const int GRENADE_M18_GREEN_START		= RegisterParticle("smoke_M18_green_01");
	static const int GRENADE_M18_GREEN_LOOP			= RegisterParticle("smoke_M18_green_02");
	static const int GRENADE_M18_GREEN_END			= RegisterParticle("smoke_M18_green_03");
	static const int GRENADE_M18_PURPLE_START		= RegisterParticle("smoke_M18_purple_01");
	static const int GRENADE_M18_PURPLE_LOOP		= RegisterParticle("smoke_M18_purple_02");
	static const int GRENADE_M18_PURPLE_END			= RegisterParticle("smoke_M18_purple_03");
	static const int GRENADE_M18_RED_START			= RegisterParticle("smoke_M18_red_01");
	static const int GRENADE_M18_RED_LOOP			= RegisterParticle("smoke_M18_red_02");
	static const int GRENADE_M18_RED_END			= RegisterParticle("smoke_M18_red_03");
	static const int GRENADE_M18_WHITE_START		= RegisterParticle("smoke_M18_white_01");
	static const int GRENADE_M18_WHITE_LOOP			= RegisterParticle("smoke_M18_white_02");
	static const int GRENADE_M18_WHITE_END			= RegisterParticle("smoke_M18_white_03");
	static const int GRENADE_M18_YELLOW_START		= RegisterParticle("smoke_M18_yellow_01");
	static const int GRENADE_M18_YELLOW_LOOP		= RegisterParticle("smoke_M18_yellow_02");
	static const int GRENADE_M18_YELLOW_END			= RegisterParticle("smoke_M18_yellow_03");
	static const int GRENADE_M18_BLACK_START		= RegisterParticle("smoke_M18_black_01");
	static const int GRENADE_M18_BLACK_LOOP			= RegisterParticle("smoke_M18_black_02");
	static const int GRENADE_M18_BLACK_END			= RegisterParticle("smoke_M18_black_03");

	//! FLASH GRENADE
	//! M84
	static const int GRENADE_M84					= RegisterParticle("explosion_M84_01");
	
	// FRAGMENTATION GRENADES
	static const int RGD5							= RegisterParticle("explosion_RGD5_01");
	static const int M67							= RegisterParticle("explosion_M67_01");
	
	// GRENADE EXPLOSION BY SURFACE
	static const int EXPLOSION_GRENADE_SNOW			= RegisterParticle("explosion_grenade_snow");
	static const int EXPLOSION_GRENADE_ICE			= RegisterParticle("explosion_grenade_ice");
	
	// ELECTRICITY	        
	static const int POWER_GENERATOR_SMOKE			= RegisterParticle("smoke_small_generator_01");
	static const int BARBED_WIRE_SPARKS				= RegisterParticle("electro_shortc2");
	static const int LEVER_SPARKS					= RegisterParticle("electro_sparks");
	static const int EASTER_EGG_ACTIVATE			= RegisterParticle("easter_egg_activate");

	// PLAYER
	static const int BLEEDING_SOURCE				= RegisterParticle("blood_bleeding_01");
	static const int BLEEDING_SOURCE_LIGHT			= RegisterParticle("blood_bleeding_02");
	static const int BLOOD_SURFACE_DROPS			= RegisterParticle("blood_surface_drops");
	static const int BLOOD_SURFACE_CHUNKS			= RegisterParticle("blood_surface_chunks");
	static const int VOMIT							= RegisterParticle("character_vomit_01");
	static const int BREATH_VAPOUR_LIGHT			= RegisterParticle("breath_vapour_light");
	static const int BREATH_VAPOUR_MEDIUM			= RegisterParticle("breath_vapour_medium");
	static const int BREATH_VAPOUR_HEAVY			= RegisterParticle("breath_vapour_heavy");
	static const int VOMIT_CHUNKS					= RegisterParticle("character_vomit_puddle");
	
	// GUNS
	static const int GUN_MUZZLE_FLASH_SVD_STAR		= RegisterParticle("weapon_shot_Flame_3D_4star");
	static const int GUN_SOLO_MUZZLE_FLASH			= RegisterParticle("weapon_shot_Flame_3D");
	static const int GUN_FNX						= RegisterParticle("weapon_shot_fnx_01");
	static const int GUN_FNX_SUPPRESSED				= RegisterParticle("weapon_shot_fnx_02");
	static const int GUN_PARTICLE_TEST				= RegisterParticle("weapon_shot_fnx_01");
	static const int GUN_PARTICLE_CASING			= RegisterParticle("weapon_shot_chamber_smoke");
	static const int GUN_PARTICLE_CASING_RAISE		= RegisterParticle("weapon_shot_chamber_smoke_raise");
	static const int GUN_CZ75						= RegisterParticle("weapon_shot_cz75_01");
	static const int GUN_AKM						= RegisterParticle("weapon_shot_akm_01");
	static const int GUN_AKM_SUPPRESSED				= RegisterParticle("weapon_shot_akm_02");
	static const int GUN_IZH18						= RegisterParticle("weapon_shot_izh18_01");
	static const int GUN_IZH18_SUPPRESSED			= RegisterParticle("weapon_shot_izh18_02");
	static const int GUN_MP5K						= RegisterParticle("weapon_shot_mp5k_01");
	static const int GUN_MP5K_2						= RegisterParticle("weapon_shot_mp5k_02_boris");
	static const int GUN_MP5K_SUPPRESSED			= RegisterParticle("weapon_shot_mp5k_02");
	static const int GUN_MP5K_COMPENSATOR			= RegisterParticle("weapon_shot_mp5k_02");
	static const int GUN_UMP45						= RegisterParticle("weapon_shot_ump45_01");
	static const int GUN_M4A1						= RegisterParticle("weapon_shot_m4a1_01");
	static const int GUN_MP133						= RegisterParticle("weapon_shot_mp133_01");
	static const int GUN_PELLETS					= RegisterParticle("weapon_shot_pellets");
	static const int GUN_MOSIN9130					= RegisterParticle("weapon_shot_mosin9130_01");
	static const int GUN_MOSIN_COMPENSATOR			= RegisterParticle("weapon_shot_mosin_compensator_01");
	static const int GUN_CZ527						= RegisterParticle("weapon_shot_cz527_01");
	static const int GUN_SKS						= RegisterParticle("weapon_shot_sks_01");
	static const int GUN_WINCHESTER70				= RegisterParticle("weapon_shot_winch70_01");
	static const int GUN_VSS						= RegisterParticle("weapon_shot_vss_01");
	static const int GUN_AK74						= RegisterParticle("weapon_shot_ak74_01");
	static const int GUN_AK101						= RegisterParticle("weapon_shot_ak101_01");
	
	static const int GUN_MAGNUM						= RegisterParticle("weapon_shot_magnum_01");
	
	static const int GUN_CZ61						= RegisterParticle("weapon_shot_cz61_01");
	static const int GUN_LONG_WINDED_SMOKE			= RegisterParticle("weapon_shot_winded_smoke");
	static const int GUN_LONG_WINDED_SMOKE_SMALL	= RegisterParticle("weapon_shot_winded_smoke_small");
	static const int SMOKING_BARREL					= RegisterParticle("smoking_barrel");
	static const int SMOKING_BARREL_SMALL			= RegisterParticle("smoking_barrel_small");
	static const int SMOKING_BARREL_HEAVY			= RegisterParticle("smoking_barrel_heavy");
	static const int SMOKING_BARREL_STEAM			= RegisterParticle("smoking_barrel_steam");
	static const int SMOKING_BARREL_STEAM_SMALL		= RegisterParticle("smoking_barrel_steam_small");
	static const int SMARKS_CHAMBER					= RegisterParticle("weapon_shot_chamber_spark");
	
	// BULLET & MELEE IMPACTS
	static const int IMPACT_TEST					= RegisterParticle("impacts/bullet_impact_placeholder");
	static const int IMPACT_DISTANT_DUST			= RegisterParticle("impacts/distant_dust");
	static const int IMPACT_TEST_RICOCHET			= RegisterParticle("impacts/bullet_riochet_placeholder");
	static const int IMPACT_TEST2					= RegisterParticle("_test_orientation_02");
	static const int IMPACT_TEST_ENTER_DEBUG		= RegisterParticle("impacts/_test_impact_enter_debug");
	static const int IMPACT_TEST_RICOCHET_DEBUG		= RegisterParticle("impacts/_test_impact_ricochet_debug");
	static const int IMPACT_TEST_EXIT_DEBUG			= RegisterParticle("impacts/_test_impact_exit_debug");
	static const int IMPACT_TEST_NO_MATERIAL_ERROR	= RegisterParticle("_test_no_material");
	static const int IMPACT_WOOD_ENTER				= RegisterParticle("impacts/hit_wood_ent_01");
	static const int IMPACT_WOOD_RICOCHET			= RegisterParticle("impacts/hit_wood_ric_01");
	static const int IMPACT_WOOD_EXIT				= RegisterParticle("impacts/hit_wood_ext_01");
	static const int IMPACT_CONCRETE_ENTER			= RegisterParticle("impacts/hit_concrete_ent_01");
	static const int IMPACT_CONCRETE_RICOCHET		= RegisterParticle("impacts/hit_concrete_ric_01");
	static const int IMPACT_CONCRETE_EXIT			= RegisterParticle("impacts/hit_concrete_ext_01");
	static const int IMPACT_FOLIAGE_ENTER			= RegisterParticle("impacts/hit_foliage_ent_01");
	static const int IMPACT_FOLIAGE_RICOCHET		= RegisterParticle("impacts/hit_foliage_ric_01");
	static const int IMPACT_FOLIAGE_EXIT			= RegisterParticle("impacts/hit_foliage_ext_01");
	static const int IMPACT_FOLIAGE_GREEN_ENTER		= RegisterParticle("impacts/hit_foliage_green_ent_01");
	static const int IMPACT_FOLIAGE_GREEN_RICOCHET	= RegisterParticle("impacts/hit_foliage_green_ric_01");
	static const int IMPACT_FOLIAGE_GREEN_EXIT		= RegisterParticle("impacts/hit_foliage_green_ext_01");
	static const int IMPACT_FOLIAGE_CONIFER_ENTER	= RegisterParticle("impacts/hit_foliage_conifer_ent_01");
	static const int IMPACT_FOLIAGE_CONIFER_RICOCHET= RegisterParticle("impacts/hit_foliage_conifer_ric_01");
	static const int IMPACT_FOLIAGE_CONIFER_EXIT	= RegisterParticle("impacts/hit_foliage_conifer_ext_01");
	static const int IMPACT_GRASS_ENTER				= RegisterParticle("impacts/hit_grass_ent_01");
	static const int IMPACT_GRASS_RICOCHET			= RegisterParticle("impacts/hit_grass_ric_01");
	static const int IMPACT_DIRT_ENTER				= RegisterParticle("impacts/hit_dirt_ent_01");
	static const int IMPACT_DIRT_RICOCHET			= RegisterParticle("impacts/hit_dirt_ric_01");
	static const int IMPACT_DIRT_EXIT				= RegisterParticle("impacts/hit_dirt_ext_01");
	static const int IMPACT_RUBBER_ENTER			= RegisterParticle("impacts/hit_rubber_ent_01");
	static const int IMPACT_RUBBER_RICOCHET			= RegisterParticle("impacts/hit_rubber_ric_01");
	static const int IMPACT_RUBBER_EXIT				= RegisterParticle("impacts/hit_rubber_ext_01");
	static const int IMPACT_GRAVEL_ENTER			= RegisterParticle("impacts/hit_gravel_ent_01");
	static const int IMPACT_GRAVEL_RICOCHET			= RegisterParticle("impacts/hit_gravel_ric_01");
	static const int IMPACT_GRAVEL_EXIT				= RegisterParticle("impacts/hit_gravel_ext_01");
	static const int IMPACT_PLASTER_ENTER			= RegisterParticle("impacts/hit_plaster_ent_01");
	static const int IMPACT_PLASTER_RICOCHET		= RegisterParticle("impacts/hit_plaster_ric_01");
	static const int IMPACT_PLASTER_EXIT			= RegisterParticle("impacts/hit_plaster_ext_01");
	static const int IMPACT_METAL_ENTER				= RegisterParticle("impacts/hit_metal_ent_01");
	static const int IMPACT_METAL_RICOCHET			= RegisterParticle("impacts/hit_metal_ric_01");
	static const int IMPACT_METAL_EXIT				= RegisterParticle("impacts/hit_metal_ext_01");
	static const int IMPACT_MEAT_ENTER				= RegisterParticle("impacts/hit_meat_ent_01");
	static const int IMPACT_MEAT_RICOCHET			= RegisterParticle("impacts/hit_meat_ric_01");
	static const int IMPACT_MEAT_EXIT				= RegisterParticle("impacts/hit_meat_ext_01");
	static const int IMPACT_MEATBONES_ENTER			= RegisterParticle("impacts/hit_meatbones_ent_01");
	static const int IMPACT_MEATBONES_RICOCHET		= RegisterParticle("impacts/hit_meatbones_ent_01");
	static const int IMPACT_MEATBONES_EXIT			= RegisterParticle("impacts/hit_meatbones_ext_01");
	static const int IMPACT_GLASS_ENTER				= RegisterParticle("impacts/hit_glass_ent_01");
	static const int IMPACT_GLASS_RICOCHET			= RegisterParticle("impacts/hit_glass_ric_01");
	static const int IMPACT_GLASS_EXIT				= RegisterParticle("impacts/hit_glass_ext_01");
	static const int IMPACT_WATER_SMALL_ENTER		= RegisterParticle("impacts/hit_water_ent_01");
	static const int IMPACT_WATER_MEDIUM_ENTER		= RegisterParticle("impacts/hit_water_ent_02");
	static const int IMPACT_WATER_LARGE_ENTER		= RegisterParticle("impacts/hit_water_ent_03");
	static const int IMPACT_TEXTILE_ENTER			= RegisterParticle("impacts/hit_textile_ent_01");
	static const int IMPACT_TEXTILE_RICOCHET		= RegisterParticle("impacts/hit_textile_ric_01");
	static const int IMPACT_TEXTILE_EXIT			= RegisterParticle("impacts/hit_textile_ext_01");
	static const int IMPACT_SAND_ENTER				= RegisterParticle("impacts/hit_sand_ent_01");
	static const int IMPACT_SAND_RICOCHET			= RegisterParticle("impacts/hit_sand_ric_01");
	static const int IMPACT_SAND_EXIT				= RegisterParticle("impacts/hit_sand_ext_01");
	static const int IMPACT_PLASTIC_ENTER			= RegisterParticle("impacts/hit_plastic_ent_01");
	static const int IMPACT_PLASTIC_RICOCHET		= RegisterParticle("impacts/hit_plastic_ric_01");
	static const int IMPACT_PLASTIC_EXIT			= RegisterParticle("impacts/hit_plastic_ext_01");
	static const int IMPACT_SNOW_ENTER				= RegisterParticle("impacts/hit_snow_ent_01");
	static const int IMPACT_SNOW_RICOCHET			= RegisterParticle("impacts/hit_snow_ric_01");
	static const int IMPACT_SNOW_EXIT				= RegisterParticle("impacts/hit_snow_ext_01");
	static const int IMPACT_ICE_ENTER				= RegisterParticle("impacts/hit_ice_ent_01");
	static const int IMPACT_ICE_RICOCHET			= RegisterParticle("impacts/hit_ice_ric_01");
	static const int IMPACT_ICE_EXIT				= RegisterParticle("impacts/hit_ice_ext_01");
	
	// EXPLOSIONS
	static const int EXPLOSION_LANDMINE				= RegisterParticle("explosion_landmine_01");
	static const int EXPLOSION_TEST					= RegisterParticle("explosion_placeholder");
	static const int EXPLOSION_GOAT					= RegisterParticle("explosion_goat");
	
	// ENVIRO EFX
	static const int SMOKING_HELI_WRECK				= RegisterParticle("smoke_heli_wreck_01");
	static const int AURORA_SANTA_WRECK				= RegisterParticle("smoke_santa_wreck");
	static const int SMOKE_GENERIC_WRECK			= RegisterParticle("smoke_generic_wreck");
	static const int SMOKING_CAR_ENGINE				= RegisterParticle("menu_engine_fire");
	static const int EVAPORATION					= RegisterParticle("menu_evaporation");
	
	// VEHICLES
	static const int HATCHBACK_COOLANT_OVERHEATING	= RegisterParticle("Hatchback_coolant_overheating");
	static const int HATCHBACK_COOLANT_OVERHEATED	= RegisterParticle("Hatchback_coolant_overheated");
	static const int HATCHBACK_ENGINE_OVERHEATING	= RegisterParticle("Hatchback_engine_failing");
	static const int HATCHBACK_ENGINE_OVERHEATED	= RegisterParticle("Hatchback_engine_failure");
	static const int HATCHBACK_EXHAUST_SMOKE		= RegisterParticle("Hatchback_exhaust");
	static const int BOAT_WATER_FRONT				= RegisterParticle("vehicles/boat/boat_water_front");
	static const int BOAT_WATER_BACK				= RegisterParticle("vehicles/boat/boat_water_back");
	static const int BOAT_WATER_SIDE				= RegisterParticle("vehicles/boat/boat_water_side");
	
	// CORPSE DECAY
	static const int ENV_SWARMING_FLIES 			= RegisterParticle("env_fly_swarm_01");
	
	// BONFIRE 
	static const int BONFIRE_FIRE 					= RegisterParticle("fire_bonfire");
	static const int BONFIRE_SMOKE		 			= RegisterParticle("smoke_bonfire");
	static const int TIREPILE_FIRE 					= RegisterParticle("fire_tirepile");
	static const int SPOOKY_MIST		 			= RegisterParticle("spooky_mist");
	
	static const int VOMIT_BLOOD					= RegisterParticle("character_vomitBlood_01");

	// CONTAMINATED AREAS
	static const int CONTAMINATED_AREA_GAS_TINY		= RegisterParticle("contaminated_area_gas_around_tiny");
	static const int CONTAMINATED_AREA_GAS_AROUND	= RegisterParticle("contaminated_area_gas_around");
	static const int CONTAMINATED_AREA_GAS_BIGASS	= RegisterParticle("contaminated_area_gas_bigass");
	static const int CONTAMINATED_AREA_GAS_GROUND	= RegisterParticle("contaminated_area_gas_ground");
	static const int CONTAMINATED_AREA_GAS_SHELL	= RegisterParticle("contaminated_area_gas_shell");
	static const int CONTAMINATED_AREA_GAS_DEBUG	= RegisterParticle("contaminated_area_gas_bigass_debug");
	
	//Fireworks
	static const int FIREWORKS_SHOT					= RegisterParticle("fireworks_small_01");
	static const int FIREWORKS_EXPLOSION_RED		= RegisterParticle("fireworks_large_01_Red");
	static const int FIREWORKS_EXPLOSION_GREEN		= RegisterParticle("fireworks_large_01_Green");
	static const int FIREWORKS_EXPLOSION_BLUE 		= RegisterParticle("fireworks_large_01_Blue");
	static const int FIREWORKS_EXPLOSION_YELLOW		= RegisterParticle("fireworks_large_01_Yellow");
	static const int FIREWORKS_EXPLOSION_PINK		= RegisterParticle("fireworks_large_01_Pink");
	
	static const int FIREWORKS_FUSE					= RegisterParticle("fireworks_small_04");
	static const int FIREWORKS_AFTERBURN_START		= RegisterParticle("fireworks_small_02");
	static const int FIREWORKS_AFTERBURN_END		= RegisterParticle("fireworks_small_03");
	
	//Fireworks anniversary
	static const int FIREWORKS_EXPLOSION_THANKS1	= RegisterParticle("fireworks_ThankYou_anim");
	static const int FIREWORKS_EXPLOSION_THANKS2	= RegisterParticle("fireworks_For10_anim");
	static const int FIREWORKS_EXPLOSION_THANKS3	= RegisterParticle("fireworks_Amazing_anim");
	static const int FIREWORKS_EXPLOSION_THANKS4	= RegisterParticle("fireworks_Years_anim");
	static const int FIREWORKS_EXPLOSION_THANKS5	= RegisterParticle("fireworks_Dayz_anim");
	
	
	//pox grenade
	static const int GRENADE_CHEM_BREAK				= RegisterParticle("contaminated_area_gas_grenade");
	//Claymore
	static const int CLAYMORE_EXPLOSION				= RegisterParticle("explosion_claymore_01");
	static const int PLASTIC_EXPLOSION				= RegisterParticle("explosion_plastic_01");
	
	// Water jet/spilling
	static const int WATER_JET						= RegisterParticle("water_jet");
	static const int WATER_JET_WEAK					= RegisterParticle("water_jet_weak");
	static const int WATER_SPILLING					= RegisterParticle("water_spilling");
	
	// Drowning bubbles
	static const int DROWNING_BUBBLES				= RegisterParticle("breath_bubbles");
	
	//! Cupid's bolt
	static const int BOLT_CUPID_TAIL				= RegisterParticle("cupid_bolt");
	static const int BOLT_CUPID_HIT					= RegisterParticle("cupid_hit");
	
	// VOLCANIC
	static const int HOTPSRING_WATERVAPOR			= RegisterParticle("hotspring_watervapor");
	static const int GEYSER_NORMAL					= RegisterParticle("geyser_normal");
	static const int GEYSER_STRONG					= RegisterParticle("geyser_strong");
	static const int GEYSER_SPLASH					= RegisterParticle("geyser_strong_splash");
	static const int GEYSER_BUBBLES					= RegisterParticle("geyser_bubbles");
	static const int VOLCANO						= RegisterParticle("volcano_smoke");
	
	// FISHING
	static const int FISHING_SIGNAL_SPLASH			= RegisterParticle("fishing_signal_splash");
	
	// STEPS
	static const int STEP_SNOW						= RegisterParticle("step_snow");
	
	// STEPS
	static const int VEHICLE_WHEEL_SNOW				= RegisterParticle("vehicle_wheel_snow");//
	static const int VEHICLE_WHEEL_GRAVEL			= RegisterParticle("vehicle_wheel_gravel");//
	static const int VEHICLE_WHEEL_ASPHALT			= RegisterParticle("vehicle_wheel_asphalt");//
	
	//TREE FALLING PARTICLES
	static const int TREE_FALLING_SNOW				= RegisterParticle("tree_falling_snow");//
	static const int TREE_SOFT_FALLING_SNOW			= RegisterParticle("tree_soft_falling_snow");//
	static const int TREE_SOFT_LARGE_FALLING_SNOW	= RegisterParticle("tree_soft_large_falling_snow");//
	static const int TREE_SMALL_FALLING_SNOW		= RegisterParticle("tree_small_falling_snow");//
	static const int TREE_FALLING_NEEDLE			= RegisterParticle("tree_falling_needle");//
	static const int TREE_FALLING_LEAF				= RegisterParticle("tree_falling_leaf");//
	static const int BUSH_FALLING_SNOW				= RegisterParticle("bush_falling_snow");//
	//TREE PASSING ParticleSource
	static const int TREE_PASSING_SNOW				= RegisterParticle("tree_passing_snow");//
	static const int BUSH_PASSING_SNOW				= RegisterParticle("bush_passing_snow");// same as bush_falling_snow
	
	
	static int RegisterParticle(string file_name)
	{
		return RegisterParticle(GetPathToParticles(), file_name);
	}

	//! Splits the full path into name of particle and it's directory path, then registers the particle with the name and returns its ID
	//! Called by C++
	static int RegisterParticleByFullPath(string fullPath)
	{
		//! Silently fail on retail, game already takes too long to boot, lets not make it longer
#ifdef DIAG_DEVELOPER
		if (fullPath.Replace("\\", "/") > 0)
		{
			ErrorEx(string.Format("Using wrong path delimiter for particle registering! Use '/' instead of '\\'. fullPath=%1", fullPath), ErrorExSeverity.WARNING);
		}
#endif

		int lastIndex = fullPath.LastIndexOf("/");
		if (lastIndex < 0)
		{
			//! TODO(kumarjac): bake in this error
#ifdef WAITING_FOR_PBOS_TO_BE_UPDATED
			ErrorEx(string.Format("No root path found! fullPath=%1", fullPath), ErrorExSeverity.ERROR);
			return ParticleList.INVALID;
#else
			return RegisterParticleByFullPath(GetPathToParticles() + fullPath);
#endif
		}
		
		// 'graphics/particles/vehicle_wheel_snow' becomes 'graphics/particles/' and 'vehicle_wheel_snow'
		
		string rootPath = fullPath.Substring(0, lastIndex + 1);
		string fileName = fullPath.Substring(lastIndex + 1, fullPath.Length() - (lastIndex + 1));

		return RegisterParticle(rootPath, fileName);
	}
	
	//! Registers a particle and returns its ID
	static int RegisterParticle(string root_path, string file_name)
	{
		if (!m_ParticlePaths)
			m_ParticlePaths = new map<int, string>;
		
		if (!m_ParticleNames)
			m_ParticleNames = new map<string, int>;
	
		string path = string.Format("%1%2", root_path, file_name);
		string fullPath = string.Format("%1.ptc", path);
		
		if ( !FileExist(fullPath) )
		{
			string devMsgSuffix;
			#ifdef DEVELOPER
			devMsgSuffix = " Then rebuild 'scripts' and 'graphics' PBOs.";
			#endif
			ErrorEx(string.Format("Particle file not found! <%1> Correct path to this particle in script file ParticleList.c!%2",
				fullPath, devMsgSuffix), ErrorExSeverity.WARNING);
			//return ParticleList.INVALID;
		}

		int existingNameId;
		if (m_ParticleNames.Find(file_name, existingNameId))
		{
			int existingPathId;
			if (m_ParticlePaths.GetKeyByValueChecked(path, existingPathId))
			{
				if (existingNameId == existingPathId)
				{				
					return existingNameId; // We have already registered this exact file
				}
				else
				{
					ErrorEx(string.Format("ParticleNames and ParticlePaths array are containing conflicting data. ID %1 vs ID %2", existingNameId, existingPathId));
				}
			}
			else
			{
				ErrorEx(string.Format("Duplicate particle filename: %1; GetParticleIDByName will only work with the first path if there are two different paths.", file_name), ErrorExSeverity.WARNING);
			}
		}
		else
		{
			m_ParticleNames.Insert(file_name, m_lastID + 1);
		}
		
		++m_lastID;
		m_ParticlePaths.Insert(m_lastID, path);
		return m_lastID;
	}
	
	static int GetRegisteredParticlesCount()
	{
		return m_lastID;
	}
	
	//! Purely checks for an invalid number, does NOT mean it is actually registered
	static bool IsValidId(int id)
	{
		return id != NONE && id != INVALID;
	}
	
	//! Returns particle's full path (without .ptc suffix) based on its ID
	static string GetParticlePath(int particle_id)
	{
		string path;		
		if (!m_ParticlePaths.Find(particle_id, path))	
			ErrorEx(string.Format("No particle registered with id: %1", particle_id), ErrorExSeverity.WARNING);
		return path;
	}
	
	//! Returns particle's full path (with .ptc suffix) based on its ID
	static string GetParticleFullPath(int particle_id)
	{
		return string.Format("%1.ptc", GetParticlePath(particle_id));
	}
	
	//! Returns particle's ID based on the path (without .ptc suffix)
	static int GetParticleID(string particle_file)
	{
		int id = m_ParticlePaths.GetKeyByValue(particle_file);
		if (!IsValidId(id)) // valid id starts from 1, 0 is invalid
			ErrorEx(string.Format("No particle registered with path: %1", particle_file), ErrorExSeverity.WARNING);		
		return id;
	}
	
	//! Returns particle's ID based on the filename (without .ptc suffix)
	static int GetParticleIDByName(string name)
	{
		int id = 0;
		if (!m_ParticleNames.Find(name, id))
			ErrorEx(string.Format("No particle registered with name: %1", name), ErrorExSeverity.WARNING);		
		return id;
	}
	
	//! Returns base path to all particles
	static string GetPathToParticles()
	{
		return "graphics/particles/";
	}
	
	//! Preloads all particles
	static void PreloadParticles()
	{
		if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() ) // client side
		{
			int count = m_ParticlePaths.Count();
			
			for (int i = 0; i < count; ++i)
			{
				vobject vobj = GetObject( string.Format("%1.ptc", m_ParticlePaths[i]) );
				ReleaseObject(vobj);
			}
		}
	}
}