r106 - trunk/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Mar 8 08:09:24 EST 2008


Author: vermeulen
Date: 2008-03-08 08:09:23 -0500 (Sat, 08 Mar 2008)
New Revision: 106

Modified:
   trunk/progsqc/actor.qc
   trunk/progsqc/damage.qc
   trunk/progsqc/dpextensions.qc
   trunk/progsqc/inventory.qc
   trunk/progsqc/mapentities.qc
Log:
Updated dpextensions
kill trigger
added remove gun when ammo empty option
Added trail to firing options
Added Nex explosion

Modified: trunk/progsqc/actor.qc
===================================================================
--- trunk/progsqc/actor.qc	2008-03-08 09:50:15 UTC (rev 105)
+++ trunk/progsqc/actor.qc	2008-03-08 13:09:23 UTC (rev 106)
@@ -524,6 +524,10 @@
 	else
 	{
 	   Inventory_ModifyItem(self, self.weaponitem, 0, 0 - mintofire);
+	   if (((self.currentammo + iteminfo_ammoinventory) < mintofire) && (iteminfo_removewhennoammo))
+	   {
+			Inventory_ModifyItem(self, self.weaponitem, 0 - 1, 0);
+	   }
 	}
 	   
 	weapon_recoil(recoil);

Modified: trunk/progsqc/damage.qc
===================================================================
--- trunk/progsqc/damage.qc	2008-03-08 09:50:15 UTC (rev 105)
+++ trunk/progsqc/damage.qc	2008-03-08 13:09:23 UTC (rev 106)
@@ -163,6 +163,7 @@
 float FIREFLAG_JETPACK = 16;
 float FIREFLAG_SHIELD = 32;
 float FIREFLAG_INVIS = 64;
+float FIREFLAG_TRAIL1 = 128;
 
 float EXPLFLAG_EXPLODE = 1;
 float EXPLFLAG_EXPLODELARGE = 2;
@@ -170,6 +171,7 @@
 float EXPLFLAG_PLASMA = 8;
 float EXPLFLAG_ASSAULTRAIL = 16;
 float EXPLFLAG_ELECTRICITY = 32;
+float EXPLFLAG_NEX = 64;
 
 .float weaponsound_cycle; // templeofnoise: added for minigun routing sound, guess i'll use it for other sound specs also.
 
@@ -237,6 +239,11 @@
 		
 		remove(self);
 	}
+	else if (self.explflag & EXPLFLAG_NEX)
+	{
+		pointparticles(particleeffectnum("nex_explode"), self.origin, '0 0 0', 1);
+		remove(self);
+	}
 	else if (self.explflag & EXPLFLAG_EXPLODE)
 	{
 		te_explosion(self.origin);
@@ -267,7 +274,8 @@
 	}
 	else if (self.explflag & EXPLFLAG_ASSAULTRAIL)
 	{
-		te_gunshotquad(self.origin);
+		pointparticles(particleeffectnum("machinegun_impact"), self.origin, '0 0 0', 1);
+		//te_gunshotquad(self.origin);
 		remove(self);
 	}
 	else // metal projectile of some sort (bullet, shrapnel, railgun bolt, etc)
@@ -536,9 +544,14 @@
 	    self.hook = newmis;
 		newmis.state = 0;
 	}
-	
-	if (FIREFLAGs & FIREFLAG_MUZZLEFLASH)
-		te_smallflash(shotorg);
+
+	// for the trails
+	traceline_hitcorpse (self, shotorg, self.origin + self.view_ofs + v_forward * 5000, FALSE, self);
+
+	if (FIREFLAGs & FIREFLAG_TRAIL1)
+		trailparticles(world, particleeffectnum("nex_beam"), shotorg, trace_endpos);
+	//if (FIREFLAGs & FIREFLAG_MUZZLEFLASH)
+	//	pointparticles(particleeffectnum("muzzleflash"), shotorg, '0 0 0', 1);
 	if (PROJFLAGs & PROJFLAG_ROCKET)
 		newmis.movetype = MOVETYPE_BOUNCEMISSILE;
 	if (PROJFLAGs & PROJFLAG_GLOW)

Modified: trunk/progsqc/dpextensions.qc
===================================================================
--- trunk/progsqc/dpextensions.qc	2008-03-08 09:50:15 UTC (rev 105)
+++ trunk/progsqc/dpextensions.qc	2008-03-08 13:09:23 UTC (rev 106)
@@ -1,7 +1,10 @@
 
 //DarkPlaces supported extension list, draft version 1.04
 
-//definitions that id Software left out
+//things that don't have extensions yet:
+.float disableclientprediction;
+
+//definitions that id Software left out:
 //these are passed as the 'nomonsters' parameter to traceline/tracebox (yes really this was supported in all quake engines, nomonsters is misnamed)
 float MOVE_NORMAL = 0; // same as FALSE
 float MOVE_NOMONSTERS = 1; // same as TRUE
@@ -13,7 +16,7 @@
 float(string s) checkextension = #99;
 //description:
 //check if (cvar("pr_checkextension")) before calling this, this is the only
-//guarenteed extension to be present in the extension system, it allows you
+//guaranteed extension to be present in the extension system, it allows you
 //to check if an extension is available, by name, to check for an extension
 //use code like this:
 //// (it is recommended this code be placed in worldspawn or a worldspawn called function somewhere)
@@ -22,11 +25,18 @@
 //	ext_setcolor = TRUE;
 //from then on you can check ext_setcolor to know if that extension is available
 
+//BX_WAL_SUPPORT
+//idea: id Software
+//darkplaces implementation: LordHavoc
+//description:
+//indicates the engine supports .wal textures for filenames in the textures/ directory
+//(note: DarkPlaces has supported this since 2001 or 2002, but did not advertise it as an extension, then I noticed Betwix was advertising it and added the extension accordingly)
+
 //DP_BUTTONCHAT
 //idea: Vermeulen
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.float buttonchat;
+.float buttonchat;
 //description:
 //true if the player is currently chatting (in messagemode, menus or console)
 
@@ -34,22 +44,13 @@
 //idea: id Software
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.float buttonuse;
+.float buttonuse;
 //client console commands:
 //+use
 //-use
 //description:
 //made +use and -use commands work, they now control the .buttonuse field (.button1 was used by many mods for other purposes).
 
-// LordHavoc: HIGHLY experimental, do not implement this in other engines
-//DP_CGAME
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
-//SVC definitions:
-float svc_cgame = 50; // [short] length [bytes] data
-//description:
-//contains network messages to client gamecode.
-
 //DP_CL_LOADSKY
 //idea: Nehahra, LordHavoc
 //darkplaces implementation: LordHavoc
@@ -104,6 +105,14 @@
 //description:
 //entity emits blue light (used for quad)
 
+//DP_EF_DOUBLESIDED
+//idea: LordHavoc
+//darkplaces implementation: [515] and LordHavoc
+//effects bit:
+float EF_DOUBLESIDED = 32768;
+//description:
+//render entity as double sided (backfaces are visible, I.E. you see the 'interior' of the model, rather than just the front), can be occasionally useful on transparent stuff.
+
 //DP_EF_FLAME
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -136,6 +145,20 @@
 //description:
 //prevents server from sending entity to client (forced invisible, even if it would have been a light source or other such things)
 
+//DP_EF_NOGUNBOB
+//idea: Chris Page, Dresk
+//darkplaces implementation: LordHAvoc
+//effects bit:
+float   EF_NOGUNBOB     = 256;
+//description:
+//this has different meanings depending on the entity it is used on:
+//player entity - prevents gun bobbing on player.viewmodel
+//viewmodelforclient entity - prevents gun bobbing on an entity attached to the player's view
+//other entities - no effect
+//uses:
+//disabling gun bobbing on a diving mask or other model used as a .viewmodel.
+//disabling gun bobbing on view-relative models meant to be part of the heads up display.  (note: if fov is changed these entities may be off-screen, or too near the center of the screen, so use fov 90 in this case)
+
 //DP_EF_NOSHADOW
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -197,7 +220,7 @@
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //fields:
-//.entity exteriormodeltoclient;
+.entity exteriormodeltoclient;
 //description:
 //the entity is visible to all clients with one exception: if the specified client is using first person view (not using chase_active) the entity will not be shown.  Also if tag attachments are supported any entities attached to the player entity will not be drawn in first person.
 
@@ -205,9 +228,9 @@
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.float glow_color;
+.float glow_color;
 .float glow_size;
-//.float glow_trail;
+.float glow_trail;
 //description:
 //customizable glowing light effect on the entity, glow_color is a paletted (8bit) color in the range 0-255 (note: 0 and 254 are white), glow_size is 0 or higher (up to the engine what limit to cap it to, darkplaces imposes a 1020 limit), if glow_trail is true it will leave a trail of particles of the same color as the light.
 
@@ -235,6 +258,29 @@
 //description:
 //this is a very special capability, attachs the entity to the view of the client specified, origin and angles become relative to the view of that client, all effects can be used (multiple skins on a weapon model etc)...  the entity is not visible to any other client.
 
+//DP_GECKO_SUPPORT
+//idea: Res2k, BlackHC
+//darkplaces implementation: Res2k, BlackHC
+//constant definitions:
+float GECKO_BUTTON_DOWN         = 0;
+float GECKO_BUTTON_UP           = 1;
+// either use down and up or just press but not all of them!
+float GECKO_BUTTON_PRESS        = 2;
+// use this for mouse events if needed?
+float GECKO_BUTTON_DOUBLECLICK  = 3;
+//builtin definitions:
+float(string name) gecko_create( string name ) = #487;
+void(string name) gecko_destroy( string name ) = #488;
+void(string name) gecko_navigate( string name, string URI ) = #489;
+float(string name) gecko_keyevent( string name, float key, float eventtype ) = #490;
+void gecko_mousemove( string name, float x, float y ) = #491;
+void gecko_resize( string name, float w, float h ) = #492;
+vector gecko_get_texture_extent( string name ) = #493;
+//engine-called QC prototypes:
+//string(string name, string query) Qecko_Query;
+//description:
+//provides an interface to the offscreengecko library and allows for internet browsing in games
+
 //DP_GFX_EXTERNALTEXTURES
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -263,7 +309,7 @@
 type 11 (RLE compressed 8bit greyscale)
 attribute bit 0x20 (Origin At Top Left, top to bottom, left to right)
 
-image formats guarenteed to be supported: tga, pcx, lmp
+image formats guaranteed to be supported: tga, pcx, lmp
 image formats that are optional: png, jpg
 
 mdl/spr/spr32 examples:
@@ -293,6 +339,18 @@
 game/gfx/conchars.tga
 */
 
+//DP_GFX_EXTERNALTEXTURES_PERMAPTEXTURES
+//idea: Fuh?
+//darkplaces implementation: LordHavoc
+//description:
+//Q1BSP and HLBSP map loading loads external textures found in textures/<mapname>/ as well as textures/.
+//Where mapname is the bsp filename minus the extension (typically .bsp) and minus maps/ if it is in maps/ (any other path is not removed)
+//example:
+//maps/e1m1.bsp uses textures in the directory textures/e1m1/ and falls back to textures/
+//maps/b_batt0.bsp uses textures in the directory textures/b_batt0.bsp and falls back to textures/
+//as a more extreme example:
+//progs/something/blah.bsp uses textures in the directory textures/progs/something/blah/ and falls back to textures/
+
 //DP_GFX_FOG
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -379,9 +437,19 @@
 .float button5;
 .float button6;
 .float button7;
-//.float button8;
+.float button8;
 //description:
 //set to the state of the +button3, +button4, +button5, +button6, +button7, and +button8 buttons from the client, this does not involve protocol changes (the extra 6 button bits were simply not used).
+//the exact mapping of protocol button bits on the server is:
+//self.button0 = (bits & 1) != 0;
+///* button1 is skipped because mods abuse it as a variable, and accordingly it has no bit */
+//self.button2 = (bits & 2) != 0;
+//self.button3 = (bits & 4) != 0;
+//self.button4 = (bits & 8) != 0;
+//self.button5 = (bits & 16) != 0;
+//self.button6 = (bits & 32) != 0;
+//self.button7 = (bits & 64) != 0;
+//self.button8 = (bits & 128) != 0;
 
 //DP_LITSPRITES
 //idea: LordHavoc
@@ -429,12 +497,29 @@
 //hole.view_ofs = hole.origin - bmodel.origin; // relative origin
 //hole.v_angle = hole.angles - bmodel.angles; // relative angles
 
+//DP_QC_ASINACOSATANATAN2TAN
+//idea: Urre
+//darkplaces implementation: LordHavoc
+//constant definitions:
+float DEG2RAD = 0.0174532925199432957692369076848861271344287188854172545609719144;
+float RAD2DEG = 57.2957795130823208767981548141051703324054724665643215491602438612;
+float PI      = 3.1415926535897932384626433832795028841971693993751058209749445923;
+//builtin definitions:
+float(float s) asin = #471; // returns angle in radians for a given sin() value, the result is in the range -PI*0.5 to PI*0.5
+float(float c) acos = #472; // returns angle in radians for a given cos() value, the result is in the range 0 to PI
+float(float t) atan = #473; // returns angle in radians for a given tan() value, the result is in the range -PI*0.5 to PI*0.5
+float(float c, float s) atan2 = #474; // returns angle in radians for a given cos() and sin() value pair, the result is in the range -PI to PI (this is identical to vectoyaw except it returns radians rather than degrees)
+float(float a) tan = #475; // returns tangent value (which is simply sin(a)/cos(a)) for the given angle in radians, the result is in the range -infinity to +infinity
+//description:
+//useful math functions for analyzing vectors, note that these all use angles in radians (just like the cos/sin functions) not degrees unlike makevectors/vectoyaw/vectoangles, so be sure to do the appropriate conversions (multiply by DEG2RAD or RAD2DEG as needed).
+//note: atan2 can take unnormalized vectors (just like vectoyaw), and the function was included only for completeness (more often you want vectoyaw or vectoangles), atan2(v_x,v_y) * RAD2DEG gives the same result as vectoyaw(v)
+
 //DP_QC_CHANGEPITCH
 //idea: id Software
 //darkplaces implementation: id Software
 //field definitions:
 .float idealpitch;
-//.float pitch_speed;
+.float pitch_speed;
 //builtin definitions:
 void(entity ent) changepitch = #63;
 //description:
@@ -448,11 +533,19 @@
 //description:
 //copies all data in the entity to another entity.
 
+//DP_QC_CVAR_DEFSTRING
+//idea: id Software (Doom3), LordHavoc
+//darkplaces implementation: LordHavoc
+//builtin definitions:
+string(string s) cvar_defstring = #482;
+//description:
+//returns the default value of a cvar, as a tempstring.
+
 //DP_QC_CVAR_STRING
 //idea: VorteX
 //DarkPlaces implementation: VorteX, LordHavoc
 //builtin definitions:
-string(string s, ...) cvar_string = #448;
+string(string s) cvar_string = #448;
 //description:
 //returns the value of a cvar, as a tempstring.
 
@@ -541,6 +634,23 @@
 //description:
 //functions to query surface information.
 
+//DP_QC_GETSURFACEPOINTATTRIBUTE
+//idea: BlackHC
+//darkplaces implementation: BlackHC
+// constants
+float SPA_POSITION = 0;
+float SPA_S_AXIS = 1;
+float SPA_T_AXIS = 2;
+float SPA_R_AXIS = 3; // same as SPA_NORMAL
+float SPA_TEXCOORDS0 = 4;
+float SPA_LIGHTMAP0_TEXCOORDS = 5;
+float SPA_LIGHTMAP0_COLOR = 6;
+//builtin definitions:
+vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
+
+//description:
+//function to query extended information about a point on a certain surface
+
 //DP_QC_GETTAGINFO
 //idea: VorteX, LordHavoc (somebody else?)
 //DarkPlaces implementation: VorteX
@@ -579,7 +689,16 @@
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //description:
-//this extension makes all builtins returning tempstrings (ftos for example) cycle through a pool of multiple tempstrings (at least 16), allowing multiple ftos results to be gathered before putting them to use, normal quake only had 1 tempstring, causing many headaches.  Note that for longer term storage (or compatibility on engines having FRIK_FILE but not this extension) the FRIK_FILE extension's strzone/strunzone builtins provide similar functionality (slower though).
+//this extension makes all builtins returning tempstrings (ftos for example)
+//cycle through a pool of multiple tempstrings (at least 16), allowing
+//multiple ftos results to be gathered before putting them to use, normal
+//quake only had 1 tempstring, causing many headaches.
+//
+//Note that for longer term storage (or compatibility on engines having
+//FRIK_FILE but not this extension) the FRIK_FILE extension's
+//strzone/strunzone builtins provide similar functionality (slower though).
+//
+//NOTE: this extension is superseded by DP_QC_UNLIMITEDTEMPSTRINGS
 
 //DP_QC_RANDOMVEC
 //idea: LordHavoc
@@ -600,6 +719,56 @@
 //description:
 //useful math functions, sine of val, cosine of val, square root of val, and raise a to power b, respectively.
 
+//DP_QC_STRFTIME
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//builtin definitions:
+string(float uselocaltime, string format, ...) strftime = #478;
+//description:
+//provides the ability to get the local (in your timezone) or world (Universal Coordinated Time) time as a string using the formatting of your choice:
+//example: "%Y-%m-%d %H:%M:%S"   (result looks like: 2007-02-08 01:03:15)
+//note: "%F %T" gives the same result as "%Y-%m-%d %H:%M:%S" (ISO 8601 date format and 24-hour time)
+//for more format codes please do a web search for strftime 3 and you should find the man(3) pages for this standard C function.
+//
+//practical uses:
+//changing day/night cycle (shops closing, monsters going on the prowl) in an RPG, for this you probably want to use s = strftime(TRUE, "%H");hour = ftos(s);
+//printing current date/time for competitive multiplayer games, such as the beginning/end of each round in real world time.
+//activating eastereggs in singleplayer games on certain dates.
+//
+//note: some codes such as %x and %X use your locale settings and thus may not make sense to international users, it is not advisable to use these as the server and clients may be in different countries.
+//note: if you display local time to a player, it would be a good idea to note whether it is local time using a string like "%F %T (local)", and otherwise use "%F %T (UTC)".
+//note: be aware that if the game is saved and reloaded a week later the date and time will be different, so if activating eastereggs in a singleplayer game or something you may want to only check when a level is loaded and then keep the same easteregg state throughout the level so that the easteregg does not deactivate when reloading from a savegame (also be aware that precaches should not depend on such date/time code because reloading a savegame often scrambles the precaches if so!).
+//note: this function can return a NULL string (you can check for it with if (!s)) if the localtime/gmtime functions returned NULL in the engine code, such as if those functions don't work on this platform (consoles perhaps?), so be aware that this may return nothing.
+
+//DP_QC_STRINGCOLORFUNCTIONS
+//idea: Dresk
+//darkplaces implementation: Dresk
+//builtin definitions:
+float(string s) strlennocol = #476; // returns how many characters are in a string, minus color codes
+string(string s) strdecolorize = #477; // returns a string minus the color codes of the string provided
+//description:
+//provides additional functionality to strings by supporting functions that isolate and identify strings with color codes
+
+//DP_QC_STRING_CASE_FUNCTIONS
+//idea: Dresk
+//darkplaces implementation: LordHavoc / Dresk
+//builtin definitions:
+string(string s) strtolower = #480; // returns the passed in string in pure lowercase form
+string(string s) strtoupper = #481; // returns the passed in string in pure uppercase form
+//description:
+//provides simple string uppercase and lowercase functions
+
+//DP_QC_TOKENIZEBYSEPARATOR
+//idea: Electro, SavageX, LordHavoc
+//darkplaces implementation: LordHavoc
+//builtin definitions:
+float(string s, string separator1, ...) tokenizebyseparator = #479;
+//description:
+//this function returns tokens separated by any of the supplied separator strings, example:
+//numnumbers = tokenizebyseparator("10.2.3.4", ".");
+//returns 4 and the tokens are "10" "2" "3" "4"
+//possibly useful for parsing IPv4 addresses (such as "1.2.3.4") and IPv6 addresses (such as "[1234:5678:9abc:def0:1234:5678:9abc:def0]:26000")
+
 //DP_QC_TRACEBOX
 //idea: id Software
 //darkplaces implementation: id Software
@@ -632,6 +801,40 @@
 //description:
 //allows traces to hit only world (ignoring all entities, unlike MOVE_NOMONSTERS which hits all bmodels), use as the nomonsters parameter to trace functions
 
+//DP_QC_UNLIMITEDTEMPSTRINGS
+//idea: div0
+//darkplaces implementation: LordHavoc
+//description:
+//this extension alters Quake behavior such that instead of reusing a single
+//tempstring (or multiple) there are an unlimited number of tempstrings, which
+//are removed only when a QC function invoked by the engine returns,
+//eliminating almost all imaginable concerns with string handling in QuakeC.
+//
+//in short:
+//you can now use and abuse tempstrings as much as you like, you still have to
+//use strzone (FRIK_FILE) for permanent storage however.
+//
+//
+//
+//implementation notes for other engine coders:
+//these tempstrings are expected to be stored in a contiguous buffer in memory
+//which may be fixed size or controlled by a cvar, or automatically grown on
+//demand (in the case of DarkPlaces).
+//
+//this concept is similar to quake's Zone system, however these are all freed
+//when the QC interpreter returns.
+//
+//this is basically a poor man's garbage collection system for strings.
+
+//DP_QC_VECTOANGLES_WITH_ROLL
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//builtin definitions:
+vector(vector forward, vector up) vectoangles2 = #51; // same number as vectoangles
+//description:
+//variant of vectoangles that takes an up vector to calculate roll angle (also uses this to calculate yaw correctly if the forward is straight up or straight down)
+//note: just like normal vectoangles you need to negate the pitch of the returned angles if you want to feed them to makevectors or assign to self.v_angle
+
 //DP_QC_VECTORVECTORS
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -767,6 +970,7 @@
 //DP_SV_CLIENTCOLORS
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
+//field definitions:
 .float clientcolors; // colors of the client (format: pants + shirt * 16)
 //description:
 //allows qc to read and modify the client colors associated with a client entity (not particularly useful on other entities), and automatically sends out any appropriate network updates if changed
@@ -774,13 +978,31 @@
 //DP_SV_CLIENTNAME
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
+//description:
 //allows qc to modify the client's .netname, and automatically sends out any appropriate network updates if changed
 
+//DP_SV_CUSTOMIZEENTITYFORCLIENT
+//idea: LordHavoc
+//darkplaces implementation: [515] and LordHavoc
+//field definitions:
+.float() customizeentityforclient; // self = this entity, other = client entity
+//description:
+//allows qc to modify an entity before it is sent to each client, the function returns TRUE if it should send, FALSE if it should not, and is fully capable of editing the entity's fields, this allows cloaked players to appear less transparent to their teammates, navigation markers to only show to their team, etc
+//tips on writing customize functions:
+//it is a good idea to return FALSE early in the function if possible to reduce cpu usage, because this function may be called many thousands of times per frame if there are many customized entities on a 64+ player server.
+//you are free to change anything in self, but please do not change any other entities (the results may be very inconsistent).
+//example ideas for use of this extension:
+//making icons over teammates' heads which are only visible to teammates.  for exasmple: float() playericon_customizeentityforclient = {return self.owner.team == other.team;};
+//making cloaked players more visible to their teammates than their enemies.  for example: float() player_customizeentityforclient = {if (self.items & IT_CLOAKING) {if (self.team == other.team) self.alpha = 0.6;else self.alpha = 0.1;} return TRUE;};
+//making explosion models that face the viewer (does not work well with chase_active).  for example: float() explosion_customizeentityforclient = {self.angles = vectoangles(other.origin + other.view_ofs - self.origin);self.angles_x = 0 - self.angles_x;};
+//implementation notes:
+//entity customization is done before per-client culling (visibility for instance) because the entity may be doing setorigin to display itself in different locations on different clients, may be altering its .modelindex, .effects and other fields important to culling, so customized entities increase cpu usage (non-customized entities can use all the early culling they want however, as they are not changing on a per client basis).
+
 //DP_SV_DRAWONLYTOCLIENT
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.entity drawonlytoclient;
+.entity drawonlytoclient;
 //description:
 //the entity is only visible to the specified client.
 
@@ -803,11 +1025,76 @@
 //description:
 //clientside playback of simple custom sprite effects (explosion sprites, etc).
 
+//DP_SV_ENTITYCONTENTSTRANSITION
+//idea: Dresk
+//darkplaces implementation: Dresk
+//field definitions:
+.void(float nOriginalContents, float nNewContents) contentstransition;
+//description:
+//This field function, when provided, is triggered on an entity when the contents (ie. liquid / water / etc) is changed.
+//The first parameter provides the entities original contents, prior to the transition.  The second parameter provides the new contents.
+//NOTE: If this field function is provided on an entity, the standard watersplash sound IS SUPPRESSED to allow for authors to create their own transition sounds.
+
+//DP_SV_POINTSOUND
+//idea: Dresk
+//darkplaces implementation: Dresk
+//builtin definitions:
+void(vector origin, string sample, float volume, float attenuation) pointsound = #483;
+//description:
+//Similar to the standard QC sound function, this function takes an origin instead of an entity and omits the channel parameter.
+// This allows sounds to be played at arbitrary origins without spawning entities.
+
+//DP_SV_ONENTITYNOSPAWNFUNCTION
+//idea: Dresk
+//darkplaces implementation: Dresk
+//engine-called QC prototypes:
+//void() SV_OnEntityNoSpawnFunction;
+//description:
+// This function is called whenever an entity on the server has no spawn function, and therefore has no defined QC behavior.
+// You may as such dictate the behavior as to what happens to the entity.
+// To mimic the engine's default behavior, simply call remove(self).
+
+//DP_SV_MODELFLAGS_AS_EFFECTS
+//idea: LordHavoc, Dresk
+//darkplaces implementation: LordHavoc
+//field definitions:
+.float modelflags;
+//constant definitions:
+float EF_NOMODELFLAGS = 8388608; // ignore any effects in a model file and substitute your own
+float MF_ROCKET  =   1; // leave a trail
+float MF_GRENADE =   2; // leave a trail
+float MF_GIB     =   4; // leave a trail
+float MF_ROTATE  =   8; // rotate (bonus items)
+float MF_TRACER  =  16; // green split trail
+float MF_ZOMGIB  =  32; // small blood trail
+float MF_TRACER2 =  64; // orange split trail
+float MF_TRACER3 = 128; // purple trail
+//description:
+//this extension allows model flags to be specified on entities so you can add a rocket trail and glow to any entity, etc.
+//setting any of these will override the flags the model already has, to disable the model's flags without supplying any of your own you must use EF_NOMODELFLAGS.
+//
+//silly example modification #1 to W_FireRocket in weapons.qc:
+//missile.effects = EF_NOMODELFLAGS; // rocket without a glow/fire trail
+//silly example modification #2 to W_FireRocket in weapons.qc:
+//missile.modelflags = MF_GIB; // leave a blood trail instead of glow/fire trail
+//
+//note: you can not combine multiple kinds of trail, only one of them will be active, you can combine MF_ROTATE and the other MF_ flags however, and using EF_NOMODELFLAGS along with these does no harm.
+//
+//note to engine coders: they are internally encoded in the protocol as extra EF_ flags (shift the values left 24 bits and send them in the protocol that way), so no protocol change was required (however 32bit effects is a protocol extension itself), within the engine they are referred to as EF_ for the 24bit shifted values.
+
+//DP_SV_NETADDRESS
+//idea: Dresk
+//darkplaces implementation: Dresk
+//field definitions:
+.string netaddress;
+//description:
+// provides the netaddress of the associated entity (ie. 127.0.0.1) and "null/botclient" if the netconnection of the entity is invalid
+
 //DP_SV_NODRAWTOCLIENT
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.entity nodrawtoclient;
+.entity nodrawtoclient;
 //description:
 //the entity is not visible to the specified client.
 
@@ -815,10 +1102,22 @@
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
 //field definitions:
-//.float ping;
+.float ping;
 //description:
 //continuously updated field indicating client's ping (based on average of last 16 packet time differences).
 
+//DP_SV_POINTPARTICLES
+//idea: Spike
+//darkplaces implementation: LordHavoc
+//function definitions:
+float(string effectname) particleeffectnum = #335; // same as in CSQC
+void(entity ent, float effectnum, vector start, vector end) trailparticles = #336; // same as in CSQC
+void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC
+//description:
+//provides the ability to spawn non-standard particle effects, typically these are defined in a particle effect information file such as effectinfo.txt in darkplaces.
+//this is a port of particle effect features from clientside QC (EXT_CSQC) to server QC, as these effects are potentially useful to all games even if they do not make use of EXT_CSQC.
+//warning: server must have same order of effects in effectinfo.txt as client does or the numbers would not match up, except for standard quake effects which are always the same numbers.
+
 //DP_SV_PUNCHVECTOR
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -839,6 +1138,13 @@
 //description:
 //.movement vector contains the movement input from the player, allowing QC to do as it wishs with the input, and SV_PlayerPhysics will completely replace the player physics if present (works for all MOVETYPE's), see darkplaces mod source for example of this function (in playermovement.qc, adds HalfLife ladders support, as well as acceleration/deceleration while airborn (rather than the quake sudden-stop while airborn), and simplifies the physics a bit)
 
+//DP_SV_PRINT
+//idea: id Software (QuakeWorld Server)
+//darkplaces implementation: Black, LordHavoc
+void(string s, ...) print = #339; // same number as in EXT_CSQC
+//description:
+//this is identical to dprint except that it always prints regardless of the developer cvar.
+
 //DP_SV_PRECACHEANYTIME
 //idea: id Software (Quake2)
 //darkplaces implementation: LordHavoc
@@ -874,12 +1180,13 @@
 //range is 0 to infinite, recommended values to try are 0.1 (very slow, 10% speed), 1 (normal speed), 5 (500% speed).
 
 //DP_SV_WRITEUNTERMINATEDSTRING
-//idea: shadowalker
+//idea: FrikaC
 //darkplaces implementation: Sajt
 //builtin definitions:
 void(float to, string s) WriteUnterminatedString = #456;
 //description:
 //like WriteString, but does not write a terminating 0 after the string. This means you can include things like a player's netname in the middle of a string sent over the network. Just be sure to end it up with either a call to WriteString (which includes the trailing 0) or WriteByte(0) to terminate it yourself.
+//A historical note: this extension was suggested by FrikaC years ago, more recently Shadowalker has been badmouthing LordHavoc and Spike for stealing 'his' extension writestring2 which does exactly the same thing but uses a different builtin number and name and extension string, this argument hinges on the idea that it was his idea in the first place, which is incorrect as FrikaC first suggested it and used a rough equivilant of it in his FrikBot mod years ago involving WriteByte calls on each character.
 
 //DP_TE_BLOOD
 //idea: LordHavoc
@@ -1087,6 +1394,56 @@
 //description:
 //to make life easier on mod coders.
 
+//DP_TRACE_HITCONTENTSMASK_SURFACEINFO
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//globals:
+.float dphitcontentsmask; // if non-zero on the entity passed to traceline/tracebox/tracetoss this will override the normal collidable contents rules and instead hit these contents values (for example AI can use tracelines that hit DONOTENTER if it wants to, by simply changing this field on the entity passed to traceline), this affects normal movement as well as trace calls
+float trace_dpstartcontents; // DPCONTENTS_ value at start position of trace
+float trace_dphitcontents; // DPCONTENTS_ value of impacted surface (not contents at impact point, just contents of the surface that was hit)
+float trace_dphitq3surfaceflags; // Q3SURFACEFLAG_ value of impacted surface
+string trace_dphittexturename; // texture name of impacted surface
+//constants:
+float DPCONTENTS_SOLID = 1; // hit a bmodel, not a bounding box
+float DPCONTENTS_WATER = 2;
+float DPCONTENTS_SLIME = 4;
+float DPCONTENTS_LAVA = 8;
+float DPCONTENTS_SKY = 16;
+float DPCONTENTS_BODY = 32; // hit a bounding box, not a bmodel
+float DPCONTENTS_CORPSE = 64; // hit a SOLID_CORPSE entity
+float DPCONTENTS_NODROP = 128; // an area where backpacks should not spawn
+float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement
+float DPCONTENTS_MONSTERCLIP = 512; // blocks monster movement
+float DPCONTENTS_DONOTENTER = 1024; // AI hint brush
+float DPCONTENTS_LIQUIDSMASK = 14; // WATER | SLIME | LAVA
+float Q3SURFACEFLAG_NODAMAGE = 1;
+float Q3SURFACEFLAG_SLICK = 2; // low friction surface
+float Q3SURFACEFLAG_SKY = 4; // sky surface (also has NOIMPACT and NOMARKS set)
+float Q3SURFACEFLAG_LADDER = 8; // climbable surface
+float Q3SURFACEFLAG_NOIMPACT = 16; // projectiles should remove themselves on impact (this is set on sky)
+float Q3SURFACEFLAG_NOMARKS = 32; // projectiles should not leave marks, such as decals (this is set on sky)
+float Q3SURFACEFLAG_FLESH = 64; // projectiles should do a fleshy effect (blood?) on impact
+//float Q3SURFACEFLAG_NODRAW = 128; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_HINT = 256; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_SKIP = 512; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_NOLIGHTMAP = 1024; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_POINTLIGHT = 2048; // compiler hint (not important to qc)
+float Q3SURFACEFLAG_METALSTEPS = 4096; // walking on this surface should make metal step sounds
+float Q3SURFACEFLAG_NOSTEPS = 8192; // walking on this surface should not make footstep sounds
+//float Q3SURFACEFLAG_NONSOLID = 16384; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_LIGHTFILTER = 32768; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_ALPHASHADOW = 65536; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_NODLIGHT = 131072; // compiler hint (not important to qc)
+//float Q3SURFACEFLAG_DUST = 262144; // translucent 'light beam' effect (not important to qc)
+//description:
+//adds additional information after a traceline/tracebox/tracetoss call.
+//also (very important) sets trace_* globals before calling .touch functions,
+//this allows them to inspect the nature of the collision (for example
+//determining if a projectile hit sky), clears trace_* variables for the other
+//object in a touch event (that is to say, a projectile moving will see the
+//trace results in its .touch function, but the player it hit will see very
+//little information in the trace_ variables as it was not moving at the time)
+
 //DP_VIEWZOOM
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -1095,6 +1452,15 @@
 //description:
 //scales fov and sensitivity of player, valid range is 0 to 1 (intended for sniper rifle zooming, and such)
 
+//EXT_BITSHIFT
+//idea: Spike
+//darkplaces implementation: [515]
+//builtin definitions:
+float(float number, float quantity) bitshift = #218;
+//description:
+//multiplies number by a power of 2 corresponding to quantity (0 = *1, 1 = *2, 2 = *4, 3 = *8, -1 = /2, -2 = /4x, etc), and rounds down (due to integer math) like other bit operations do (& and | and the like).
+//note: it is faster to use multiply if you are shifting by a constant, avoiding the quakec function call cost, however that does not do a floor for you.
+
 //FRIK_FILE
 //idea: FrikaC
 //darkplaces implementation: LordHavoc
@@ -1103,12 +1469,12 @@
 float(string filename, float mode) fopen = #110; // opens a file inside quake/gamedir/data/ (mode is FILE_READ, FILE_APPEND, or FILE_WRITE), returns fhandle >= 0 if successful, or fhandle < 0 if unable to open file for any reason
 void(float fhandle) fclose = #111; // closes a file
 string(float fhandle) fgets = #112; // reads a line of text from the file and returns as a tempstring
-void(float fhandle, string s) fputs = #113; // writes a line of text to the end of the file
+void(float fhandle, string s, ...) fputs = #113; // writes a line of text to the end of the file
 float(string s) strlen = #114; // returns how many characters are in a string
-string(string s1, string s2, ...) strcat = #115; // concatenates two strings (for example "abc", "def" would return "abcdef") and returns as a tempstring
+string(string s1, string s2, ...) strcat = #115; // concatenates two or more strings (for example "abc", "def" would return "abcdef") and returns as a tempstring
 string(string s, float start, float length) substring = #116; // returns a section of a string as a tempstring
 vector(string s) stov = #117; // returns vector value from a string
-string(string s) strzone = #118; // makes a copy of a string into the string zone and returns it, this is often used to keep around a tempstring for longer periods of time (tempstrings are replaced often)
+string(string s, ...) strzone = #118; // makes a copy of a string into the string zone and returns it, this is often used to keep around a tempstring for longer periods of time (tempstrings are replaced often)
 void(string s) strunzone = #119; // removes a copy of a string from the string zone (you can not use that string again or it may crash!!!)
 //constants:
 float FILE_READ = 0;
@@ -1118,6 +1484,9 @@
 //pr_zone_min_strings : default 64 (64k), min 64 (64k), max 8192 (8mb)
 //description:
 //provides text file access functions and string manipulation functions, note that you may want to set pr_zone_min_strings in the worldspawn function if 64k is not enough string zone space.
+//
+//NOTE: strzone functionality is partially superseded by
+//DP_QC_UNLIMITEDTEMPSTRINGS when longterm storage is not needed
 
 //KRIMZON_SV_PARSECLIENTCOMMAND
 //idea: KrimZon
@@ -1152,8 +1521,8 @@
 //playermodel <name> - FIXME: EXAMPLE NEEDED
 //playerskin <name> - FIXME: EXAMPLE NEEDED
 //field definitions:
-//.string playermodel; // name of player model sent by client
-//.string playerskin; // name of player skin sent by client
+.string playermodel; // name of player model sent by client
+.string playerskin; // name of player skin sent by client
 //description:
 //these client properties are used by Nexuiz.
 
@@ -1169,9 +1538,9 @@
 //effects bit:
 float EF_SELECTABLE = 16384; // allows cursor to highlight entity (brighten)
 //field definitions:
-//.float cursor_active; // true if cl_prydoncursor mode is on
-//.vector cursor_screen; // screen position of cursor as -1 to +1 in _x and _y (_z unused)
-//.vector cursor_trace_start; // position of camera
+.float cursor_active; // true if cl_prydoncursor mode is on
+.vector cursor_screen; // screen position of cursor as -1 to +1 in _x and _y (_z unused)
+.vector cursor_trace_start; // position of camera
 .vector cursor_trace_endpos; // position of cursor in world (as traced from camera)
 .entity cursor_trace_ent; // entity the cursor is pointing at (server forces this to world if the entity is currently free at time of receipt)
 //cvar definitions:
@@ -1187,9 +1556,9 @@
 //idea: Tenebrae
 //darkplaces implementation: LordHavoc
 //fields:
-//.float light_lev; // radius (does not affect brightness), typical value 350
-//.vector color; // color (does not affect radius), typical value '1 1 1' (bright white), can be up to '255 255 255' (nuclear blast)
-//.float style; // light style (like normal light entities, flickering torches or switchable, etc)
+.float light_lev; // radius (does not affect brightness), typical value 350
+.vector color; // color (does not affect radius), typical value '1 1 1' (bright white), can be up to '255 255 255' (nuclear blast)
+.float style; // light style (like normal light entities, flickering torches or switchable, etc)
 .float pflags; // flags (see PFLAGS_ constants)
 .vector angles; // orientation of the light
 .float skin; // cubemap filter number, can be 1-255 (0 is assumed to be none, and tenebrae only allows 16-255), this selects a projective light filter, a value of 1 loads cubemaps/1posx.tga and cubemaps/1negx.tga and posy, negy, posz, and negz, similar to skybox but some sides need to be rotated or flipped
@@ -1213,3 +1582,78 @@
 //description:
 //sv_jumpstep allows stepping up onto stairs while airborn, sv_stepheight controls how high a single step can be.
 
+//FTE_STRINGS
+//idea: many
+//darkplaces implementation: KrimZon
+//description:
+//various string manipulation functions
+float(string str, string sub, float startpos) strstrofs = #221;
+float(string str, float ofs) str2chr = #222;
+string(float c, ...) chr2str = #223;
+string(float ccase, float calpha, float cnum, string s, ...) strconv = #224;
+string(float chars, string s, ...) strpad = #225;
+string(string info, string key, string value, ...) infoadd = #226;
+string(string info, string key) infoget = #227;
+float(string s1, string s2, float len) strncmp = #228;
+float(string s1, string s2) strcasecmp = #229;
+float(string s1, string s2, float len) strncasecmp = #230;
+
+//DP_CON_BESTWEAPON
+//idea: many
+//darkplaces implementation: div0
+//description:
+//allows QC to register weapon properties for use by the bestweapon command, for mods that change required ammo count or type for the weapons
+//it is done using console commands sent via stuffcmd:
+//  register_bestweapon quake
+//  register_bestweapon clear
+//  register_bestweapon <shortname> <impulse> <itemcode> <activeweaponcode> <ammostat> <ammomin>
+//for example, this is what Quake uses:
+//  register_bestweapon 1 1 4096 4096 6 0 // STAT_SHELLS is 6
+//  register_bestweapon 2 2    1    1 6 1
+//  register_bestweapon 3 3    2    2 6 1
+//  register_bestweapon 4 4    4    4 7 1 // STAT_NAILS is 7
+//  register_bestweapon 5 5    8    8 7 1
+//  register_bestweapon 6 6   16   16 8 1 // STAT_ROCKETS is 8
+//  register_bestweapon 7 7   32   32 8 1
+//  register_bestweapon 8 8   64   64 9 1 // STAT_CELLS is 9
+//after each map client initialization, this is reset back to Quake settings. So you should send these data in ClientConnect.
+//also, this extension introduces a new "cycleweapon" command to the user.
+
+//DP_QC_STRINGBUFFERS
+//idea: ??
+//darkplaces implementation: LordHavoc
+//functions to manage string buffer objects - that is, arbitrary length string arrays that are handled by the engine
+float() buf_create = #460;
+void(float bufhandle) buf_del = #461;
+float(float bufhandle) buf_getsize = #462;
+void(float bufhandle_from, float bufhandle_to) buf_copy = #463;
+void(float bufhandle, float sortpower, float backward) buf_sort = #464;
+string(float bufhandle, string glue) buf_implode = #465;
+string(float bufhandle, float string_index) bufstr_get = #466;
+void(float bufhandle, float string_index, string str) bufstr_set = #467;
+float(float bufhandle, string str, float order) bufstr_add = #468;
+void(float bufhandle, float string_index) bufstr_free = #469;
+
+//DP_QC_STRREPLACE
+//idea: Sajt
+//darkplaces implementation: Sajt
+//builtin definitions:
+string(string search, string replace, string subject) strreplace = #484;
+string(string search, string replace, string subject) strireplace = #485;
+//description:
+//strreplace replaces all occurrences of 'search' with 'replace' in the string 'subject', and returns the result as a tempstring.
+//strireplace does the same but uses case-insensitive matching of the 'search' term
+//
+//DP_QC_CRC16
+//idea: div0
+//darkplaces implementation: div0
+//Some hash function to build hash tables with. This has to be be the CRC-16-CCITT that is also required for the QuakeWorld download protocol.
+//When caseinsensitive is set, the CRC is calculated of the lower cased string.
+float(float caseinsensitive, string s, ...) crc16 = #494;
+
+//DP_SV_SHUTDOWN
+//idea: div0
+//darkplaces implementation: div0
+//A function that gets called just before progs exit. To save persistent data from.
+//It is not called on a crash or error.
+//void SV_Shutdown();

Modified: trunk/progsqc/inventory.qc
===================================================================
--- trunk/progsqc/inventory.qc	2008-03-08 09:50:15 UTC (rev 105)
+++ trunk/progsqc/inventory.qc	2008-03-08 13:09:23 UTC (rev 106)
@@ -66,6 +66,7 @@
 string iteminfo_pickupmodel;
 vector iteminfo_viewmodeloffset;
 string iteminfo_name;
+float iteminfo_removewhennoammo;
 float iteminfo_itemtype;
 float iteminfo_quantitymax;
 float iteminfo_rechargerate;
@@ -172,6 +173,7 @@
 	iteminfo_viewmodeloffset = '0 0 0';
 	iteminfo_name = "unknown";
 	iteminfo_pickupsound = "";
+	iteminfo_removewhennoammo = 0;
 	iteminfo_quantitymax = 0;
 	iteminfo_rechargerate = 0;
 	iteminfo_ammomax = 0;
@@ -273,6 +275,8 @@
 		iteminfo_weapon_viewmodel = cvar_string(wname,"_viewmodel");
 		iteminfo_pickupmodel = cvar_string(wname,"_pickupmodel");
 		iteminfo_viewmodeloffset = stov(cvar_string(wname,"_viewmodeloffset"));
+
+		iteminfo_removewhennoammo = cvar(wname,"_removewhennoammo");
 		
 		iteminfo_rechargerate = cvar(wname,"_rechargerate");
 

Modified: trunk/progsqc/mapentities.qc
===================================================================
--- trunk/progsqc/mapentities.qc	2008-03-08 09:50:15 UTC (rev 105)
+++ trunk/progsqc/mapentities.qc	2008-03-08 13:09:23 UTC (rev 106)
@@ -49,8 +49,23 @@
 	self.touch = func_ladder_touch;
 };
 
+.float triggerhurttime;
+void() hurt_touch =
+{
+	if (other.triggerhurttime < time)
+	{
+		other.triggerhurttime = time + 1;
+		T_Damage (other, self, self, 0, 1000, other.origin, '0 0 0');
+	}
 
+	return;
+};
 
+void() trigger_hurt =
+{
+	InitTrigger ();
+	self.touch = hurt_touch;
+};
 
 void Teleport_Touch (void)
 {




More information about the zymotic-commits mailing list