View Issue Details

IDProjectCategoryView StatusLast Update
0006309The Dark ModDef / Setuppublic15.01.2026 00:32
Reporterwellingtoncrab Assigned Tostgatilov  
PrioritynormalSeveritynormalReproducibilityalways
Status feedbackResolutionopen 
PlatformPCOSWindowsOS Version11
Product VersionTDM 2.11 
Target VersionTDM 2.14Fixed in VersionTDM 2.14 
Summary0006309: Func_Smoke does not correctly loop particles with multiple stages with differing lifespans
DescriptionFunc_smoke does not work with multi stage particles unless they all have the same value as their “time” parameter.

It will wait for the last quad to be drawn on the longest particle stage before it starts the other stages.

You can see this in this video below. To the left is a func_smoke and to the right is the same multi stage particle on an emitter.

https://cdn.discordapp.com/attachments/834415653166907402/1135286393996849325/Darkmod_2023.07.30_-_11.58.50.03.mp4
Steps To ReproduceSimply run any multistage particle on a func_smoke such as the one attached to this bug report
TagsNo tags attached.
Attached Files
welli_torch_move_smoke.prt (3,123 bytes)   
welli_torch_move_smoke
{

	{
		count				14
		material			textures/particles/barrelpoof
		time				1.500
		cycles				0.000
		bunching			1.000
		distribution		rect 2.000 2.000 2.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "3.000"  to "13.000"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				1.500
		fadeOut				0.700
		fadeIndex				0.000
		color 				0.500 0.500 0.500 0.400
		fadeColor 			0.270 0.270 0.270 0.000
		offset 				0.000 0.000 1.000
		gravity 			world -15.000
	}
	
	{
		count 				10
		material 			textures/darkmod/sfx/overcast2
		time 				10
		cycles 				0.000
		timeOffset 			0.000
		bunching 			0.950
		distribution 		rect 12.000 12.000 0.000
		direction 			cone 90.000
		orientation 		view
		speed 				"0.000"
		size 				"10.000" to "40.000"
		aspect 				"1.000"
		rotation 			"1.000" to "0.500"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.430
		fadeOut 			0.430
		fadeIndex 			0.000
		color 				1.000 1.000 1.000 0.400
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 6.000
		gravity 			world -2.000
	}
	
	{
		count 				10
		material 			textures/darkmod/sfx/overcast
		time 				4.000
		cycles 				0.000
		timeOffset 			0.000
		bunching 			0.950
		distribution 		rect 12.000 12.000 0.000
		direction 			cone 90.000
		orientation 		view
		customPath 			helix 0.000 0.000 0.000 0.000 0.000
		speed 				"0.000"
		size 				"5.000" to "25.000"
		aspect 				"1.000"
		rotation 			"0.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.500
		fadeOut 			0.390
		fadeIndex 			0.000
		color 				0.961 0.639 0.278 0.900
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 6.000
		gravity 			world -2.000
	}
		{
		count 				3
		material 			textures/sfx/flamesparks
		time 				2.000
		cycles 				0.000
		timeOffset 			0.000
		bunching 			1.000
		distribution 		cylinder 100.000 32.000 0.000 0.000
		direction 			outward 0.500
		orientation 		view
		customPath 			helix 8.000 8.000 8.000 6.000 3.000
		speed 				"0.000"
		size 				"0.800" to "0.300"
		aspect 				"1.000"
		rotation 			"0.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.200
		fadeOut 			0.400
		fadeIndex 			0.000
		color 				0.847 0.467 0.047 0.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 12.000
		gravity 			-14.000
	}
	{
		count 				5
		material 			textures/sfx/flamesparks
		time 				2.500
		cycles 				0.000
		timeOffset 			0.000
		bunching 			1.000
		distribution 		cylinder 100.000 32.000 0.000 0.000
		direction 			outward 0.500
		orientation 		view
		customPath 			helix 9.000 9.000 8.000 6.000 3.000
		speed 				"0.000"
		size 				"0.800" to "0.300"
		aspect 				"1.000"
		rotation 			"0.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.200
		fadeOut 			0.400
		fadeIndex 			0.000
		color 				0.847 0.467 0.047 0.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 12.000
		gravity 			-12.000
	}

}
welli_torch_move_smoke.prt (3,123 bytes)   

Activities

wellingtoncrab

wellingtoncrab

30.07.2023 19:43

developer   ~0016043

Uploaded test map "UPINSMOKE.MAP"
UPINSMOKE.map (4,890 bytes)   
Version 2
// entity 0
{
"classname" "worldspawn"
// primitive 0
{
brushDef3
{
( 0 0 1 -448 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 384 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
// primitive 1
{
brushDef3
{
( 0 0 1 -384 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 1 0 -256 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 0 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
// primitive 2
{
brushDef3
{
( 0 0 1 -384 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 -256 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 0 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
// primitive 3
{
brushDef3
{
( 0 1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 -64 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 1 0 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
// primitive 4
{
brushDef3
{
( 0 0 1 -384 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 0 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 -256 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 1 0 192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
// primitive 5
{
brushDef3
{
( 0 0 1 -384 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 0 -1 0 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 0 -1 0 -192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( -1 0 0 -256 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
( 1 0 0 192 ) ( ( 0.015625 0 0 ) ( 0 0.00390625 0 ) ) "textures/darkmod/stone/brick/even_greyish01_trim" 0 0 0
}
}
}
// entity 1
{
"classname" "info_player_start"
"name" "info_player_start_1"
"angle" "90.000000"
"origin" "0 -128 0"
}
// entity 2
{
"classname" "light"
"name" "light_1"
"origin" "0 0 256"
"light_center" "0 0 0"
"light_radius" "320 320 320"
}
// entity 3
{
"classname" "func_smoke"
"name" "func_smoke_1"
"origin" "-64 64 64"
"smoke" "welli_torch_move_smoke.prt"
}
// entity 4
{
"classname" "func_emitter"
"name" "func_emitter_1"
"origin" "64 64 64"
"cycleTrigger" "0"
"model" "welli_torch_move_smoke.prt"
}
UPINSMOKE.map (4,890 bytes)   
stgatilov

stgatilov

10.01.2026 18:31

administrator   ~0017108

Recall that there are three types of particles: particle model/entity, particle deform, and smoke.

As far as I see, smoke has completely different looping logic.
It ignores completely the looping code of the particle declarations.
Each particle stage runs only one period.
When all the particles are generated, the smoke particle gen reports to the calling code that it is done.

However, idFuncSmoke has some repeat logic.
When it receives the "the whole particle effect is over", it simply resets the timer and starts everything from scratch.
I think it does it unconditionally if it was initially enabled, and it does not repeat if it was initially disabled (when "start_off" = "1").

I suppose ID used it primarily for one-time particle effects, but then added idFuncSmoke on top of it with some repeat logic.
If I somehow unblock it to behave like particle models, the major question is: How can one decide when it is over?
It would be too easy to trigger infinitely looping particle effect, which would stay in place forever...
stgatilov

stgatilov

10.01.2026 18:39

administrator   ~0017109

By the way, aside from idFuncSmoke, there are many other places which use the same smoke spawning code:
  spawning particles from animation
  bleeding effect on hit
  smoke_gib on a moveable
  dropping item into liquid model
  smoking traces from projectiles

Particle declarations suppors making a particle stage non-repeating by setting "cycles" to "1".
However, I suppose all the particle decls which are used in the context of smoke now don't do that, they are declared as looping and rely on the idea of "only play once" logic inherent in smoke generation.
So I doubt I can just fix the default behavior...
stgatilov

stgatilov

10.01.2026 23:00

administrator   ~0017110

Okay, here are some more inconsistencies in smoke implementation.

Let's suppose decl has values: particleLife = 4000, deadTime = 5000, bunching = 0.5.
For a normal particle system it means:
   [0 .. 2000 ms] --- particles spawn
   [4000 ms .. 6000 ms] --- particles die
   [9000 ms] --- new cycle starts
For a smoke particle it means:
   [0 .. 4500 ms] --- particles spawn
   (...I'll just skip dying time here...)
   [9000 ms] --- new cycle starts
The normal particle system spawns particles in (bunching * particleLife), but the smoke system spawns in (bunching * fullCycleDuration)

Aside from that, the smoke particle system does not work properly with uncapped FPS.
This piece of code counts how many particles we need to spawn since the last frame:
    nowCount = static_cast<int>(floor( ( (float)deltaMsec / finalParticleTime ) * stage->totalParticles ));
    if ( nowCount >= stage->totalParticles )
        nowCount = stage->totalParticles-1;
    prevCount = static_cast<int>(floor( ((float)( deltaMsec - USERCMD_MSEC ) / finalParticleTime) * stage->totalParticles ));
    if ( prevCount < -1 )
        prevCount = -1;
    ....
    // add all the required particles
    for ( prevCount++ ; prevCount <= nowCount ; prevCount++ ) {
It assumes that the last frame happened exactly USERCMD_MSEC ms earlier, which is only true to the old-style fixed game tic mode.
stgatilov

stgatilov

11.01.2026 19:30

administrator   ~0017111

Here are the changes:
  r11081 Added natvis rule for a linked list inside activeSmokeStage_t.
  r11082 A little bit of refactoring of particles/smokes.
  r11083 Added new implementation of smoke particle gen, which can properly support "cycles" from particle decl.

There are two consequences:

1) There is new implementation of smoke particle generation (under cvar g_newSmokeParticles = 1).
It fixes the uncapped FPS issue described above, and also changes spawn time from (bunching * fullCycleDuration) to (bunching * particleLife).
In other words, the new implementation system works like the particles spawned by the other ways, EXCEPT for cycling!
These are in fact visually breaking changes, which are enabled by default.

2) There is new spawnarg "use_cycles", which you can set to "1" on idFuncSmoke.
If you do this, then the looping settings of the particle stages are respected.
If "cycles" = 0 in .prt, then the smoke repeats forever. If "cycles" = 1, then it plays just once (that's what you should use for single-time effects).
Of course, this spawnarg only helps for the new implementation.
Amadeus

Amadeus

12.01.2026 16:37

developer   ~0017113

Hmm, I can't get this to work with AI carrying func_smoke torches. Maybe I'm missing something or am doing something incorrectly. Or maybe there is even something incorrect in my map file or custom defs. I'm assuming "use_cycles" defaults to "0"?

If I load up Eye on the Prize and set g_newSmokeParticles = 1 and then fly over to the torch-carrying guard at 458.76 -167.08 347.36 5.3 -166.9 0.0 and kill him, the torch that falls on the ground doesn't extinguish properly.

I did build a new exe on rev 11083.

If I set "use_cycles" to "1" then that does indeed work correctly in that it doesn't loop forever (not ideal for torches though, lol)
stgatilov

stgatilov

13.01.2026 00:23

administrator   ~0017117

Yes, "use_cycles" is "0" by default, and it should work more or less as the old system.
I tried to kill that guard without modifying any assets, and the dropped torch goes off after a bit of time, regardless of g_newSmokeParticles value.
So the good new is that the new and the old code work the same way, right?

Now if you modify the assets and set "use_cycles" to "1", then the new system should respect the looping settings from .prt file.
I looked into the .prt file, and I see "cycles" "0" there, which means "loop infinitely".
Of course, it you kill the idFuncSmoke entity, it should stop emitting more particles.
But if I'm understand correctly, the entity is not killed.
What is the trigger for it to stop emitting then?
Amadeus

Amadeus

13.01.2026 03:51

developer   ~0017118

"What is the trigger for it to stop emitting then? "

well, torches do have the "extinguish_on_drop" "1" spawnarg, and this is what is supposed to kill the flame after a brief delay (like 2-3 seconds, I believe). But yeah, I'm just not sure how to get these flames to properly extinguish.
stgatilov

stgatilov

13.01.2026 18:17

administrator   ~0017121

Last edited: 13.01.2026 18:20

I looked more closely.
As far as I see, the only difference in the idFuncSmoke between "on" and "off" is whether it is hidden or not.
The method idFuncSmoke::Think checks for fl.hidden, and emitting particles is skipped if entity is hidden.
I did not change this, it is the same with both systems, regardless of use_cycles spawnarg.

I also booted the test map with one idFuncSmoke that has use_cycles = 1 and cycles = 0 (i.e. infinitely looping particle effect, which now looks exactly the same as idFuncEmitter).
Then I tried to kill the idFuncSmoke using console command. The fire ended shortly afterwards.
This confirms that if idFuncSmoke gets inactive, the particle effect ends soon since no new particles are emitted (even when .prt says the effect should be infinite).
As far as I see in the code, hiding should function similarly to killing, make the smoke entity inactive.

So could you please explain what exactly you modified in the mission?
If I'm not mistaken, the smoke entity is somehow dynamically generated, not sure how to configure its spawnargs.
Amadeus

Amadeus

13.01.2026 19:22

developer   ~0017122

hmm, it's not exactly heavily modified. But each AI in the map has varying "diff_1_nospawn "1" "diff_2_nospawn" "1", etc. spawnargs. Since these func_smokes are def_attached to two of the ais in the map, could this be what's "hiding" them? For reference, the names of the ai carrying the func_smoke torches are "Jurgen" and "Jurgen2"

I've attached the def file and particle files for the func_smoke torches. To my knowledge, this is all that I have modified
torch_smoke.def (2,092 bytes)   
// This is a series of func_smokes and alterations to torches and fireplace fires

torch_smoke_1
{
	"inherit"					"func_smoke"

	"editor_displayFolder"			"Smokes"

	"editor_model smoke"		"func_smoke particle"
	"smoke"	"torch_with_sparks_smoke.prt"

}

torch_smoke_2
{
	"inherit"					"func_smoke"

	"editor_displayFolder"			"Smokes"

	"editor_model smoke"		"func_smoke particle"
	"smoke"	"smoke_for_torch.prt"

}

torch_smoke_3

{
	"inherit"					"func_smoke"

	"editor_displayFolder"			"Smokes"

	"editor_model smoke"		"func_smoke particle"
	"smoke"	"sparks_for_torch.prt"

}

light_torchflame_small_sparks
{

	"inherit"	            "light_extinguishable"

	"mins"		            "-6 -6 -6"
	"maxs"		            "6 6 24"

        "editor_displayFolder"		"Lights/Light Sources/Torch Flames"
	"editor_usage"	        "A small, dimmer torch flame.  Light pulses but is static.  For moving light, add 'inherit' 'light_extinguishable_moving' to entity.  "

		"model_lit"				"torchflame_sparks_1.prt"
	"model_extinguished"	"volta_smoke_torchout.prt"

	"snd_lit"				"element_fire_torch"
	"snd_extinguished"		"machine_steam01"

	"falloff"               "0"
	"texture" 				"lights/biground_torchflicker"

	"_color"                "0.9 0.6 0.40"
	"light_radius"			"210 210 210"        //larger than other similar flames to be consistent with older maps


}

light_fireflames_2
{

		"inherit"				"light_extinguishable_moving"
	"mins"					"-9 -18 0"
	"maxs"					"9 18 32"
	"editor_usage"			"Extinguishable fire flames for use in a large fireplace.  Rectangular shape to fit fireplace logs."
	"editor_displayFolder"		"Lights/Light Sources/Fireplace Flames"

	"model_lit"				"furnace_flame_1.prt"
	"model_extinguished"	"volta_smoke_torchout.prt"
	"snd_lit"				"element_fire_bonfire"
	"snd_extinguished"		"machine_steam01"
	"falloff"				"0"
	"texture"			"lights/fire_fireplace"
	"_color"                "0.90 0.56 0.27"
	"light_center"			"0 0 4"   //to keep light from being buried in the logs
	"light_radius"			"260 260 220"


}
torch_smoke.def (2,092 bytes)   
torch_with_sparks_smoke.prt (7,869 bytes)   
particle torch_nosmoke
{

		{
		count				5
		material			arcturus_fire
		animationFrames 	4
		time				1.000
		cycles				0.000
		bunching			0.900
		distribution		cylinder 1.000 1.000 0.000 0.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "2.000"  to "4.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				0.650
		fadeOut				0.650
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 1.000
		offset 				0.000 0.000 -2.000
		gravity 			world -10.000
	}
	
		{
		count				28
		material			textures/particles/pfirebig2_sort10
		time				0.350
		cycles				0.000
		bunching			1.000
		distribution		cylinder 2.000 2.000 0.000 0.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "0.000"  to "2.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				0.000
		fadeOut				1.000
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 -4.000
		gravity 			world -17.000
	}

}

particle sparks_for_torch
{
	{
		count 				5
		material 			textures/sfx/flamesparks2
		animationFrames 	1
		time 				1.500
		cycles 				0.000
		timeOffset 			0.100
		bunching 			0.800
		distribution 		sphere 10.000 10.000 10.000 0.000
		direction 			cone 37.900
		orientation 		view
		speed 				"45.000" to "10.000"
		size 				"1.000" to "0.100"
		aspect 				"1.000"
		rotation 			"50.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.200
		fadeOut 			0.200
		fadeIndex 			0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 -5.000
		gravity 			world -17.200
	}

}

particle smoke_for_torch
{

{
		count				14
		material			textures/particles/barrelpoof
		time				1.500
		cycles				0.000
		bunching			1.000
		distribution		rect 2.000 2.000 2.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "3.000"  to "13.000"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				1.500
		fadeOut				0.700
		fadeIndex				0.000
		color 				0.500 0.500 0.500 0.400
		fadeColor 			0.270 0.270 0.270 0.000
		offset 				0.000 0.000 1.000
		gravity 			world -15.000
	}




}

particle torchflame_sparks_1
{
	{
		count				12
		material			textures/particles/barrelpoof
		time				1.000
		cycles				0.000
		bunching			1.000
		distribution		rect 2.000 2.000 5.000
		direction			cone "0.000" 
		orientation			view
		speed				 "17.000"  to "4.000"
		size				 "5.500"  to "13.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				1.500
		fadeOut				0.850
		fadeIndex				0.000
		color 				0.500 0.500 0.500 0.400
		fadeColor 			0.270 0.270 0.270 0.000
		offset 				0.000 0.000 6.000
		gravity 			world -3.000
	}
	{
		count				5
		material			arcturus_fire
		animationFrames 	4
		time				1.000
		cycles				0.000
		bunching			0.900
		distribution		cylinder 1.000 1.000 0.000 0.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "2.000"  to "4.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				0.650
		fadeOut				0.650
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 1.000
		offset 				0.000 0.000 -2.000
		gravity 			world -10.000
	}
	{
		count				4
		material			textures/sfx/vp3
		time				2.150
		cycles				0.000
		bunching			0.950
		distribution		rect 1.000 1.000 0.000 
		direction			cone "90.000" 
		orientation			view 
		customPath helix 0.000 0.000 0.000 0.000 0.000 
		speed				 "0.000" 
		size				 "2.500"  to "13.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				1.000
		fadeOut				0.000
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 4.000
		gravity 			world -6.000
	}
	{
		count				28
		material			textures/particles/pfirebig2_sort10
		time				0.350
		cycles				0.000
		bunching			1.000
		distribution		cylinder 2.000 2.000 0.000 0.000 
		direction			cone "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "0.000"  to "2.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				0.000
		fadeOut				1.000
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 -4.000
		gravity 			world -17.000
	}
	
	{
		count 				8
		material 			textures/darkmod/volta/sfx/fire_part2
		animationFrames 	1
		time 				1.500
		cycles 				0.000
		timeOffset 			0.100
		bunching 			0.800
		distribution 		sphere 10.000 10.000 10.000 0.000
		direction 			cone 37.900
		orientation 		view
		speed 				"45.000" to "10.000"
		size 				"1.000" to "0.100"
		aspect 				"1.000"
		rotation 			"50.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.200
		fadeOut 			0.200
		fadeIndex 			0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 -5.000
		gravity 			world -17.200
	}

}

particle furnace_flame_1
{


	{
		count 				9
		material 			textures/darkmod/volta/sfx/fire_body1
		time 				0.500
		cycles 				0.000
		timeOffset 			0.000
		bunching 			1.000
		distribution 		cylinder 4.100 4.200 3.000 0.000
		direction 			cone 23.400
		orientation 		aimed 0.000 0.400
		speed 				"35.000" to "17.500"
		size 				"3.500" to "1.500"
		aspect 				"4.000" to "1.000"
		rotation 			"2.000" to "68.500"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.330
		fadeOut 			0.260
		fadeIndex 			0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.900 0.800 0.200 0.100
		offset 				0.000 0.000 -2.000
		gravity 			-45.200
	}
	{
		count 				22
		material 			textures/darkmod/volta/sfx/fire_body2
		time 				0.500
		cycles 				0.000
		timeOffset 			0.000
		bunching 			1.000
		distribution 		sphere 7.000 7.000 0.000 0.000
		direction 			cone 8.200
		orientation 		view
		speed 				"8.000" to "7.000"
		size 				"5.000" to "1.000"
		aspect 				"1.000"
		angle 				2.500
		rotation 			"0.000"
		randomDistribution 	1
		boundsExpansion 	0.000
		fadeIn 				0.000
		fadeOut 			0.400
		fadeIndex 			0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			1.000 1.000 1.000 0.000
		offset 				0.000 0.000 -8.000
		gravity 			-35.000
	}
	{
		count				8
		material			textures/sfx/vp3
		time				2.150
		cycles				0.000
		bunching			0.950
		distribution		rect 10.000 10.000 0.000 
		direction			cone "90.000" 
		orientation			view 
		customPath helix 0.000 0.000 0.000 0.000 0.000 
		speed				 "0.000" 
		size				 "2.500"  to "13.500"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				1.000
		fadeOut				0.000
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 0.000
		offset 				0.000 0.000 5.000
		gravity 			world -6.000
	}
	{
		count				20
		material			textures/particles/pfirebig2_sort10
		animationFrames 	1
		time				0.550
		cycles				0.000
		bunching			1.000
		distribution		cylinder 6.000 7.000 0.000 0.000
		direction			outward "0.000" 
		orientation			view 
		speed				 "0.000" 
		size				 "1.000"  to "2.000"
		aspect				 "1.000" 
		randomDistribution				1
		boundsExpansion				0.000
		fadeIn				0.550
		fadeOut				0.000
		fadeIndex				0.000
		color 				1.000 1.000 1.000 1.000
		fadeColor 			0.000 0.000 0.000 1.000
		offset 				0.000 0.000 -3.000
		gravity 			world -20.000
	}


}
torch_with_sparks_smoke.prt (7,869 bytes)   
stgatilov

stgatilov

14.01.2026 09:36

administrator   ~0017124

I don't see the proper definitions here.

Ok, I went into volta_lights.def and added the following spawnargs on volta_torchflame_mobile_large:
    "name_attach" "smoke2"
    "name_attach2" "smoke3"
    "set use_cycles on smoke2" "1"
    "set use_cycles on smoke3" "1"
As far as I understand, this is the way to set spawnarg on an attachment without def.
And I'm not sure "torch_smoke_2.prt" attachment has its own def, I suppose it is some kind of implicitly made func_smoke.

After these modifications I see in debugger that Jurgen's idFuncSmoke gets the spawnarg.
And If i kill him, the torch flames go off as usual.
Amadeus

Amadeus

15.01.2026 00:32

developer   ~0017127

Last edited: 15.01.2026 00:32

So I think there is just something bugged about my setup in that FM, sorry about that. I did make a test map with a few func_smokes and those did extinguish normally, so that's good! Now I guess I just have to fix Eye on the Prize

Issue History

Date Modified Username Field Change
30.07.2023 19:30 wellingtoncrab New Issue
30.07.2023 19:30 wellingtoncrab File Added: welli_torch_move_smoke.prt
30.07.2023 19:43 wellingtoncrab Note Added: 0016043
30.07.2023 19:43 wellingtoncrab File Added: UPINSMOKE.map
10.01.2026 18:31 stgatilov Note Added: 0017108
10.01.2026 18:39 stgatilov Note Added: 0017109
10.01.2026 23:00 stgatilov Note Added: 0017110
11.01.2026 19:30 stgatilov Note Added: 0017111
11.01.2026 19:30 stgatilov Assigned To => stgatilov
11.01.2026 19:30 stgatilov Status new => feedback
11.01.2026 19:30 stgatilov Fixed in Version => TDM 2.14
11.01.2026 19:30 stgatilov Target Version => TDM 2.14
12.01.2026 16:37 Amadeus Note Added: 0017113
13.01.2026 00:23 stgatilov Note Added: 0017117
13.01.2026 03:51 Amadeus Note Added: 0017118
13.01.2026 18:17 stgatilov Note Added: 0017121
13.01.2026 18:18 stgatilov Note Edited: 0017121
13.01.2026 18:20 stgatilov Note Edited: 0017121
13.01.2026 19:22 Amadeus Note Added: 0017122
13.01.2026 19:22 Amadeus File Added: torch_smoke.def
13.01.2026 19:22 Amadeus File Added: torch_with_sparks_smoke.prt
14.01.2026 09:36 stgatilov Note Added: 0017124
15.01.2026 00:32 Amadeus Note Added: 0017127
15.01.2026 00:32 Amadeus Note Edited: 0017127