[nexuiz-commits] r6515 - in trunk/data: qcsrc/client qcsrc/common qcsrc/server scripts

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Apr 17 03:44:23 EDT 2009


Author: div0
Date: 2009-04-17 03:44:02 -0400 (Fri, 17 Apr 2009)
New Revision: 6515

Modified:
   trunk/data/qcsrc/client/Main.qc
   trunk/data/qcsrc/client/interpolate.qc
   trunk/data/qcsrc/client/particles.qc
   trunk/data/qcsrc/client/progs.src
   trunk/data/qcsrc/common/constants.qh
   trunk/data/qcsrc/server/g_subs.qc
   trunk/data/qcsrc/server/g_triggers.qc
   trunk/data/scripts/entities.def
Log:
func_clientweall, func_clientillusionary (with BGM script control)


Modified: trunk/data/qcsrc/client/Main.qc
===================================================================
--- trunk/data/qcsrc/client/Main.qc	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/client/Main.qc	2009-04-17 07:44:02 UTC (rev 6515)
@@ -775,6 +775,7 @@
 		case ENT_CLIENT_MAPVOTE: Ent_MapVote(); break;
 		case ENT_CLIENT_CLIENTDATA: Ent_ClientData(); break;
 		case ENT_CLIENT_RANDOMSEED: Ent_RandomSeed(); break;
+		case ENT_CLIENT_WALL: Ent_Wall(); break;
 		default:
 			error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
 			break;

Modified: trunk/data/qcsrc/client/interpolate.qc
===================================================================
--- trunk/data/qcsrc/client/interpolate.qc	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/client/interpolate.qc	2009-04-17 07:44:02 UTC (rev 6515)
@@ -2,7 +2,7 @@
 .vector iorigin1, iorigin2;
 .vector ivelocity1, ivelocity2;
 .vector iforward1, iforward2;
-.vector iright1, iright2;
+.vector iup1, iup2;
 .float itime1, itime2;
 void InterpolateOrigin_Note()
 {
@@ -25,9 +25,9 @@
 	{
 		fixedmakevectors(self.angles);
 		self.iforward1 = self.iforward2;
-		self.iright1 = self.iright2;
+		self.iup1 = self.iup2;
 		self.iforward2 = v_forward;
-		self.iright2 = v_right;
+		self.iup2 = v_up;
 	}
 
 	if(self.iflags & IFLAG_VELOCITY)
@@ -59,7 +59,7 @@
 }
 void InterpolateOrigin_Do()
 {
-	vector forward, right;
+	vector forward, up;
 	if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
 	{
 		float f;
@@ -68,8 +68,8 @@
 		if(self.iflags & IFLAG_ANGLES)
 		{
 			forward = (1 - f) * self.iforward1 + f * self.iforward2;
-			right = (1 - f) * self.iright1 + f * self.iright2;
-			self.angles = fixedvectoangles2(forward, right);
+			up = (1 - f) * self.iup1 + f * self.iup2;
+			self.angles = fixedvectoangles2(forward, up);
 		}
 		if(self.iflags & IFLAG_VELOCITY)
 			self.velocity = (1 - f) * self.ivelocity1 + f * self.ivelocity2;
@@ -79,7 +79,7 @@
 {
 	self.origin = self.iorigin2;
 	if(self.iflags & IFLAG_ANGLES)
-		self.angles = fixedvectoangles2(self.iforward2, self.iright2);
+		self.angles = fixedvectoangles2(self.iforward2, self.iup2);
 	if(self.iflags & IFLAG_VELOCITY)
 		self.velocity = self.ivelocity2;
 }

Modified: trunk/data/qcsrc/client/particles.qc
===================================================================
--- trunk/data/qcsrc/client/particles.qc	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/client/particles.qc	2009-04-17 07:44:02 UTC (rev 6515)
@@ -48,107 +48,7 @@
 .float volume;
 .float absolute; // 1 = count per second is absolute, 2 = only spawn at toggle
 .vector movedir; // trace direction
-.string bgmscript;
-.float bgmscriptdecay;
 
-float pointparticles_scriptbuf;
-float pointparticles_scriptbufsize;
-float pointparticles_scriptbufloaded;
-void PointparticlesScript_Init()
-{
-	string s;
-	float fh;
-	pointparticles_scriptbuf = pointparticles_scriptbufsize = 0;
-	pointparticles_scriptbufloaded = 1;
-	s = strcat("maps/", mi_shortname, ".bgs");
-	fh = fopen(s, FILE_READ);
-	if(fh < 0)
-		return;
-	pointparticles_scriptbuf = buf_create();
-	while((s = fgets(fh)))
-	{
-		bufstr_set(pointparticles_scriptbuf, pointparticles_scriptbufsize, s);
-		++pointparticles_scriptbufsize;
-	}
-	fclose(fh);
-}
-
-.float scriptline;
-.float scriptline0;
-.float scriptvelocity;
-.float scripttime;
-.float scriptstate;
-.float just_toggled;
-void PointparticlesScript_InitEntity(entity e)
-{
-	if(e.bgmscript != "")
-	{
-		if(!pointparticles_scriptbufloaded)
-			PointparticlesScript_Init();
-
-		string mychar;
-		float i;
-
-		e.scriptline0 = -1;
-		for(i = 0; i < pointparticles_scriptbufsize; ++i)
-		{
-			tokenize_sane(bufstr_get(pointparticles_scriptbuf, i));
-			if(argv(0) == e.bgmscript)
-				break;
-		}
-		e.scriptline = e.scriptline0 = i;
-		if(i >= pointparticles_scriptbufsize)
-		{
-			print("func_pointparticles: script does not define ", mychar, "\n");
-			e.bgmscript = "";
-		}
-	}
-}
-
-float PointparticlesScript(entity e)
-{
-	float t;
-
-	if(e.bgmscript == "")
-		return 1;
-	
-	if(cvar("bgmvolume") <= 0)
-		return -1;
-
-	e.just_toggled = FALSE;
-
-	t = gettime(GETTIME_CDTRACK);
-
-	tokenize_sane(bufstr_get(pointparticles_scriptbuf, e.scriptline));
-	if(t < e.scripttime)
-	{
-		e.scriptline = e.scriptline0;
-		e.scripttime = 0;
-		tokenize_sane(bufstr_get(pointparticles_scriptbuf, e.scriptline));
-	}
-
-	if(argv(0) != e.bgmscript)
-	{
-		// end of script, will revert to beginning later
-	}
-	else if(t >= stof(argv(1)))
-	{
-		// time code reached!
-		e.scriptvelocity = stof(argv(2));
-		if(e.scriptvelocity > 0)
-			e.just_toggled = e.scriptstate = TRUE;
-		else
-			e.just_toggled = e.scriptstate = FALSE;
-		e.scriptline += 1;
-		e.scripttime = stof(argv(1));
-	}
-
-	if(e.scriptstate)
-		return pow(0.5, (t - e.scripttime) * e.bgmscriptdecay) * e.scriptvelocity;
-	else
-		return 0;
-}
-
 void Draw_PointParticles()
 {
 	float n, i, fail;
@@ -157,7 +57,7 @@
 	vector o;
 	o = self.origin;
 	sz = self.maxs - self.mins;
-	n = PointparticlesScript(self);
+	n = BGMScript(self);
 	if(self.absolute == 2)
 	{
 		if(n >= 0)
@@ -297,8 +197,13 @@
 		}
 		self.bgmscript = strzone(ReadString());
 		if(self.bgmscript != "")
-			self.bgmscriptdecay = ReadByte() / 255.0;
-		PointparticlesScript_InitEntity(self);
+		{
+			self.bgmscriptattack = ReadByte() / 64.0;
+			self.bgmscriptdecay = ReadByte() / 64.0;
+			self.bgmscriptsustain = ReadByte() / 255.0;
+			self.bgmscriptrelease = ReadByte() / 64.0;
+		}
+		BGMScript_InitEntity(self);
 	}
 
 	if(f & 2)

Modified: trunk/data/qcsrc/client/progs.src
===================================================================
--- trunk/data/qcsrc/client/progs.src	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/client/progs.src	2009-04-17 07:44:02 UTC (rev 6515)
@@ -15,6 +15,7 @@
 waypointsprites.qh
 movetypes.qh
 prandom.qh
+bgmscript.qh
 
 main.qh
 
@@ -35,6 +36,7 @@
 damage.qc
 casings.qc
 effects.qc
+wall.qc
 
 Main.qc
 View.qc
@@ -43,6 +45,7 @@
 waypointsprites.qc
 movetypes.qc
 prandom.qc
+bgmscript.qc
 
 ../common/util.qc
 ../common/gamecommand.qc

Modified: trunk/data/qcsrc/common/constants.qh
===================================================================
--- trunk/data/qcsrc/common/constants.qh	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/common/constants.qh	2009-04-17 07:44:02 UTC (rev 6515)
@@ -76,6 +76,7 @@
 const float ENT_CLIENT_MAPVOTE = 17;
 const float ENT_CLIENT_CLIENTDATA = 18;
 const float ENT_CLIENT_RANDOMSEED = 19;
+const float ENT_CLIENT_WALL = 20;
 
 const float SPRITERULE_DEFAULT = 0;
 const float SPRITERULE_TEAMPLAY = 1;

Modified: trunk/data/qcsrc/server/g_subs.qc
===================================================================
--- trunk/data/qcsrc/server/g_subs.qc	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/server/g_subs.qc	2009-04-17 07:44:02 UTC (rev 6515)
@@ -669,6 +669,20 @@
 		setsize(self, self.mins, self.maxs);
 }
 
+void SetBrushEntityModelNoLOD()
+{
+ 	if(self.model != "")
+ 	{
+ 		precache_model(self.model);
+ 		setmodel(self, self.model); // no precision needed
+ 	}
+	setorigin(self, self.origin);
+	if(self.scale)
+		setsize(self, self.mins * self.scale, self.maxs * self.scale);
+	else
+		setsize(self, self.mins, self.maxs);
+}
+
 /*
 ================
 InitTrigger

Modified: trunk/data/qcsrc/server/g_triggers.qc
===================================================================
--- trunk/data/qcsrc/server/g_triggers.qc	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/qcsrc/server/g_triggers.qc	2009-04-17 07:44:02 UTC (rev 6515)
@@ -555,7 +555,10 @@
 }
 
 .string bgmscript;
+.float bgmscriptattack;
 .float bgmscriptdecay;
+.float bgmscriptsustain;
+.float bgmscriptrelease;
 float pointparticles_SendEntity(entity to, float fl)
 {
 	WriteByte(MSG_ENTITY, ENT_CLIENT_POINTPARTICLES);
@@ -629,7 +632,12 @@
 		}
 		WriteString(MSG_ENTITY, self.bgmscript);
 		if(self.bgmscript != "")
-			WriteByte(MSG_ENTITY, floor(self.bgmscriptdecay * 255));
+		{
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptattack * 64));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptdecay * 64));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptsustain * 255));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptrelease * 64));
+		}
 	}
 	return 1;
 }
@@ -664,6 +672,11 @@
 		setmodel(self, self.model);
 	if(self.noise != "")
 		precache_sound (self.noise);
+	
+	if(!self.bgmscriptsustain)
+		self.bgmscriptsustain = 1;
+	else if(self.bgmscriptsustain < 0)
+		self.bgmscriptsustain = 0;
 
 	if(!self.atten)
 		self.atten = ATTN_NORM;
@@ -698,6 +711,116 @@
 	self.nextthink = time;
 }
 
+float func_clientwall_send (entity to, float sf)
+{
+	sf = sf & 0x0F;
+	if(self.angles != '0 0 0')
+		sf |= 0x10;
+	if(self.solid && (self.mins != '0 0 0' || self.maxs != '0 0 0'))
+		sf |= 0x20;
+	if(self.colormap != 0)
+		sf |= 0x40;
+	
+	WriteByte(MSG_ENTITY, ENT_CLIENT_WALL);
+	WriteByte(MSG_ENTITY, sf);
+
+	if(sf & 1)
+	{
+		if(sf & 0x40)
+			WriteShort(MSG_ENTITY, self.colormap);
+	}
+
+	if(sf & 2)
+	{
+		WriteCoord(MSG_ENTITY, self.origin_x);
+		WriteCoord(MSG_ENTITY, self.origin_y);
+		WriteCoord(MSG_ENTITY, self.origin_z);
+	}
+
+	if(sf & 4)
+	{
+		if(sf & 0x10)
+		{
+			WriteAngle(MSG_ENTITY, self.angles_x);
+			WriteAngle(MSG_ENTITY, self.angles_y);
+			WriteAngle(MSG_ENTITY, self.angles_z);
+		}
+	}
+
+	if(sf & 8)
+	{
+		WriteShort(MSG_ENTITY, self.modelindex);
+		WriteByte(MSG_ENTITY, self.solid);
+		WriteByte(MSG_ENTITY, floor(self.scale * 16));
+		if(sf & 0x20)
+		{
+			WriteCoord(MSG_ENTITY, self.mins_x);
+			WriteCoord(MSG_ENTITY, self.mins_y);
+			WriteCoord(MSG_ENTITY, self.mins_z);
+			WriteCoord(MSG_ENTITY, self.maxs_x);
+			WriteCoord(MSG_ENTITY, self.maxs_y);
+			WriteCoord(MSG_ENTITY, self.maxs_z);
+		}
+		WriteString(MSG_ENTITY, self.bgmscript);
+		if(self.bgmscript != "")
+		{
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptattack * 64));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptdecay * 64));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptsustain * 255));
+			WriteByte(MSG_ENTITY, floor(self.bgmscriptrelease * 64));
+			WriteCoord(MSG_ENTITY, self.movedir_x);
+			WriteCoord(MSG_ENTITY, self.movedir_y);
+			WriteCoord(MSG_ENTITY, self.movedir_z);
+			WriteByte(MSG_ENTITY, floor(self.lip * 255));
+		}
+	}
+
+	return TRUE;
+}
+
+void func_clientwall_use (void)
+{
+	if(teams_matter)
+	{
+		if(activator.team)
+			self.colormap = (activator.team - 1) * 0x11;
+		else
+			self.colormap = 0x00;
+	}
+	else
+		self.colormap = floor(random() * 256);
+	self.colormap |= 1024; // RENDER_COLORMAPPED
+	self.SendFlags |= 1;
+}
+
+void spawnfunc_func_clientillusionary()
+{
+	SetBrushEntityModelNoLOD(); // LOD can't be done the CEFC way
+	self.use = func_clientwall_use;
+
+	if(!self.bgmscriptsustain)
+		self.bgmscriptsustain = 1;
+	else if(self.bgmscriptsustain < 0)
+		self.bgmscriptsustain = 0;
+
+	Net_LinkEntity(self, TRUE, 0, func_clientwall_send);
+}
+
+void spawnfunc_func_clientwall()
+{
+	SetBrushEntityModelNoLOD(); // LOD can't be done the CEFC way
+	if(!self.solid)
+		self.solid = SOLID_BSP;
+	self.use = func_clientwall_use;
+
+	if(!self.bgmscriptsustain)
+		self.bgmscriptsustain = 1;
+	else if(self.bgmscriptsustain < 0)
+		self.bgmscriptsustain = 0;
+
+	Net_LinkEntity(self, TRUE, 0, func_clientwall_send);
+}
+
 void spawnfunc_func_sparks()
 {
 	// self.cnt is the amount of sparks that one burst will spawn

Modified: trunk/data/scripts/entities.def
===================================================================
--- trunk/data/scripts/entities.def	2009-04-17 05:47:53 UTC (rev 6514)
+++ trunk/data/scripts/entities.def	2009-04-17 07:44:02 UTC (rev 6515)
@@ -658,7 +658,7 @@
 */
 
 /*QUAKED func_illusionary (0 .5 .8) ? 
-NOTE: THIS ENTITY IS BROKEN REGARDING CLIENT AND PROJECTILE PREDICTION. DO NOT USE IT. USE NONSOLID SHADERS INSTEAD.
+NOTE: THIS ENTITY IS BROKEN REGARDING CLIENT AND PROJECTILE PREDICTION. DO NOT USE IT. USE NONSOLID SHADERS OR FUNC_CLIENTILLUSIONARY INSTEAD.
 A non-solid brush entity. Use func_wall if you want it solid.
 The keys below actually apply to most brush entities as they are engine features; however, they are described here as they aren't overridden by game code in misc_models. Its q3map2 keys below will work on any brush entity!
 -------- KEYS --------
@@ -690,7 +690,7 @@
 */
 
 /*QUAKED func_wall (0 .5 .8) ? 
-A solid brush entity. Use func_illusionary if you want it solid.
+A solid brush entity. Use func_clientillusionary if you want it non-solid.
 The keys below actually apply to most brush entities as they are engine features; however, they are described here as they aren't overridden by game code in misc_models. Its q3map2 keys below will work on any brush entity!
 -------- KEYS --------
 movetype: way in which it moves: one of 0 = NONE, 1 = ANGLENOCLIP, 2 = ANGLECLIP, 3 = WALK, 4 = STEP, 5 = FLY, 6 = TOSS, 7 = PUSH, 8 = NOCLIP, 9 = FLYMISSILE, 10 = BOUNCE, 11 = BOUNCEMISSILE
@@ -721,6 +721,62 @@
 _celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
 */
 
+/*QUAKED func_clientillusionary (0 .5 .8) ? 
+A client-side non-solid brush entity. Use func_wall if you want it solid.
+-------- KEYS --------
+scale: scale factor of the model (range: 0.0625 to 15.9375)
+colormap: 1024 + 16 * pantscolor + shirtcolor
+angles: initial looking direction
+targetname: when invoking it by a button etc., it changes the color to the initiator of the action (e.g. the one pressing a button). In Onslaught, this can be used to color control points for team who owns them. In other game types, this can be used as a fun feature. Works only with _shirt and _pants textures.
+bgmscript: emitter class from the BGM script
+bgmscriptattack: attack time of the effect strength (0 to 3.9)
+bgmscriptdecay: decay time of the effect strength (0 to 3.9)
+bgmscriptsustain: sustain level of the effect strength (0.1 to 1, set to -1 to disable sustain)
+bgmscriptrelease: release time of the effect strength (0 to 3.9)
+originjitter: a vector describing a random offset this entity will be moved on initial spawn. This corresponds to the "origin" field. Works on any non-q3map2-only entity.
+anglesjitter: a vector in the order "pitch yaw roll" describing a random angles change on this entity on initial spawn. The value 180 180 180 makes the angles entirely random and uniformly distributed (among euler angles). This corresponds to the "angles" field. Works on any non-q3map2-only entity.
+anglejitter: a float describing a random yaw angle change on this entity on initial spawn. The value 180 makes the yaw angle entirely random (maybe good for items). This corresponds to the "angle" field. Works on any non-q3map2-only entity.
+gametypefilter: either a + sign and a comma separated list of game types or the aliases "teams" and "noteams" to ONLY show the entity in the listed game types, or a - sign and a comma separated list of game types or the aliases "teams" and "noteams" to NOT show the entity in the listed game types. The syntax is the same as in sbar_columns_set strings. Works on any non-q3map2-only entity.
+-------- Q3MAP2 KEYS --------
+_castshadows: Allows per-entity control over shadow casting. Defaults to 0 on entities, 1 on world. 0 = no shadow casting. 1 = cast shadows on world. > 1 = cast shadows on entities with _rs (or _receiveshadows) with the corresponding value, AND world. Negative values imply same, but DO NOT cast shadows on world.
+_receiveshadows: Allows per-entity control over shadow reception. Defaults to 1 on everything (world shadows). 0 = receives NO shadows. > 1 = receive shadows only from corresponding keyed entities (see above) and world. < 1 = receive shadows ONLY from corresponding keyed entities.
+_clone: copies brushes from entity with identical _clonename. Still needs a single brush that will get replaced.
+_clonename: template name so one can clone from it
+min: override automatically found minimum coordinate bounds
+max: override automatically found maximum coordinate bounds
+targetname: if targeted by a misc_model, its brushes get inserted into this
+_celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
+*/
+
+/*QUAKED func_clientwall (0 .5 .8) ? 
+NOTE: THIS ENTITY IS IN MOST USE CASES BROKEN REGARDING CLIENT AND PROJECTILE PREDICTION. DO NOT USE IT. USE FUNC_WALL INSTEAD.
+A client-side solid brush entity. Use func_clientillusionary if you want it non-solid.
+-------- KEYS --------
+solid: solidity: one of 1 = TRIGGER, 2 = BBOX, 3 = SLIDEBOX, 4 = BSP, 5 = CORPSE (default: 4, any other value causes prediction problems and should not be used until further notice)
+scale: scale factor of the model (range: 0.0625 to 15.9375)
+colormap: 1024 + 16 * pantscolor + shirtcolor
+angles: initial looking direction
+targetname: when invoking it by a button etc., it changes the color to the initiator of the action (e.g. the one pressing a button). In Onslaught, this can be used to color control points for team who owns them. In other game types, this can be used as a fun feature. Works only with _shirt and _pants textures.
+bgmscript: emitter class from the BGM script
+bgmscriptattack: attack time of the effect strength (0 to 3.9)
+bgmscriptdecay: decay time of the effect strength (0 to 3.9)
+bgmscriptsustain: sustain level of the effect strength (0.1 to 1, set to -1 to disable sustain)
+bgmscriptrelease: release time of the effect strength (0 to 3.9)
+originjitter: a vector describing a random offset this entity will be moved on initial spawn. This corresponds to the "origin" field. Works on any non-q3map2-only entity.
+anglesjitter: a vector in the order "pitch yaw roll" describing a random angles change on this entity on initial spawn. The value 180 180 180 makes the angles entirely random and uniformly distributed (among euler angles). This corresponds to the "angles" field. Works on any non-q3map2-only entity.
+anglejitter: a float describing a random yaw angle change on this entity on initial spawn. The value 180 makes the yaw angle entirely random (maybe good for items). This corresponds to the "angle" field. Works on any non-q3map2-only entity.
+gametypefilter: either a + sign and a comma separated list of game types or the aliases "teams" and "noteams" to ONLY show the entity in the listed game types, or a - sign and a comma separated list of game types or the aliases "teams" and "noteams" to NOT show the entity in the listed game types. The syntax is the same as in sbar_columns_set strings. Works on any non-q3map2-only entity.
+-------- Q3MAP2 KEYS --------
+_castshadows: Allows per-entity control over shadow casting. Defaults to 0 on entities, 1 on world. 0 = no shadow casting. 1 = cast shadows on world. > 1 = cast shadows on entities with _rs (or _receiveshadows) with the corresponding value, AND world. Negative values imply same, but DO NOT cast shadows on world.
+_receiveshadows: Allows per-entity control over shadow reception. Defaults to 1 on everything (world shadows). 0 = receives NO shadows. > 1 = receive shadows only from corresponding keyed entities (see above) and world. < 1 = receive shadows ONLY from corresponding keyed entities.
+_clone: copies brushes from entity with identical _clonename. Still needs a single brush that will get replaced.
+_clonename: template name so one can clone from it
+min: override automatically found minimum coordinate bounds
+max: override automatically found maximum coordinate bounds
+targetname: if targeted by a misc_model, its brushes get inserted into this
+_celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
+*/
+
 /*QUAKED misc_teleporter_dest (1 .5 .25) (-16 -16 -24) (16 16 45) 
 Teleport destination location point for trigger_teleport entities. Do not let it touch the floor, but place it slightly higher (like, 16 units above) for better flow when jumping through it.
 -------- KEYS --------
@@ -1147,7 +1203,10 @@
 volume: volume of the sound
 targetname: name to target this (then its state is toggled)
 bgmscript: emitter class from the BGM script
-bgmscriptdecay: half-life of the effect strength
+bgmscriptattack: attack time of the effect strength (0 to 3.9)
+bgmscriptdecay: decay time of the effect strength (0 to 3.9)
+bgmscriptsustain: sustain level of the effect strength (0.1 to 1, set to -1 to disable sustain)
+bgmscriptrelease: release time of the effect strength (0 to 3.9)
 -------- SPAWNFLAGS --------
 START_ON: when targeted, the particle emitter will start switched on
 IMPULSE: only send the full amount of impulse particles when the entity is triggered



More information about the nexuiz-commits mailing list