r4349 - in trunk/data: qcsrc/server scripts
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Sep 5 03:58:31 EDT 2008
Author: div0
Date: 2008-09-05 03:58:20 -0400 (Fri, 05 Sep 2008)
New Revision: 4349
Modified:
trunk/data/qcsrc/server/race.qc
trunk/data/qcsrc/server/t_items.qc
trunk/data/scripts/entities.def
Log:
add missing functions
Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc 2008-09-05 07:30:23 UTC (rev 4348)
+++ trunk/data/qcsrc/server/race.qc 2008-09-05 07:58:20 UTC (rev 4349)
@@ -320,13 +320,25 @@
*/
Portal_ClearAll(other);
+ /*
+ * Trigger targets
+ */
+ if(self.spawnflags & 2)
+ {
+ activator = other;
+ SUB_UseTargets();
+ }
+
if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint)
{
/*
* Trigger targets
*/
- activator = other;
- SUB_UseTargets();
+ if not(self.spawnflags & 2)
+ {
+ activator = other;
+ SUB_UseTargets();
+ }
other.race_checkpoint = race_NextCheckpoint(self.race_checkpoint);
Modified: trunk/data/qcsrc/server/t_items.qc
===================================================================
--- trunk/data/qcsrc/server/t_items.qc 2008-09-05 07:30:23 UTC (rev 4348)
+++ trunk/data/qcsrc/server/t_items.qc 2008-09-05 07:58:20 UTC (rev 4349)
@@ -882,8 +882,70 @@
self.use = func_wall_use;
}
+float trigger_item_func_set(float a, float b)
+{
+ return b;
+}
+
+float trigger_item_func_min(float a, float b)
+{
+ return min(a, b);
+}
+
+float trigger_item_func_max(float a, float b)
+{
+ return min(a, b);
+}
+
+float trigger_item_func_and(float a, float b)
+{
+ return a & b;
+}
+
+float trigger_item_func_or(float a, float b)
+{
+ return a | b;
+}
+
+float trigger_item_func_andnot(float a, float b)
+{
+ return a - (a & b);
+}
+
+void trigger_item_change(float binary, .float field, float(float a, float b) func, string sound_increase, string sound_decrease)
+{
+ float n, d;
+ n = func(activator.field, self.field);
+
+ if(binary)
+ {
+ d = n & activator.field;
+ if(d != n) // bits added?
+ d = +1;
+ else if(d != activator.field) // bits removed?
+ d = -1;
+ else
+ d = 0;
+ }
+ else
+ d = n - activator.field;
+
+ if(d < 0)
+ {
+ if(sound_decrease != "")
+ sound (activator, CHAN_AUTO, sound_decrease, VOL_BASE, ATTN_NORM);
+ }
+ else if(d > 0)
+ {
+ if(sound_increase != "")
+ sound (activator, CHAN_AUTO, sound_increase, VOL_BASE, ATTN_NORM);
+ }
+ activator.field = n;
+}
+
void trigger_items_use (void)
{
+ float h0, a0;
if(activator.classname != "player")
return;
if(activator.deadflag != DEAD_NO)
@@ -896,99 +958,71 @@
if (activator.switchweapon == w_getbestweapon(activator))
_switchweapon = TRUE;
+ a0 = activator.armorvalue;
+ h0 = activator.health;
+
if(self.spawnflags == 0) // SET
{
- activator.ammo_shells = self.ammo_shells;
- activator.ammo_nails = self.ammo_nails;
- activator.ammo_rockets = self.ammo_rockets;
- activator.ammo_cells = self.ammo_cells;
- activator.health = self.health;
- activator.armorvalue = self.armorvalue;
- activator.weapons = self.weapons;
- activator.items = self.items;
-
- if(self.weapons)
- sound (activator, CHAN_AUTO, "weapons/weaponpickup.wav", VOL_BASE, ATTN_NORM);
- if(self.items)
- sound (activator, CHAN_AUTO, "misc/itempickup.wav", VOL_BASE, ATTN_NORM);
- if(self.health)
- sound (activator, CHAN_AUTO, "misc/megahealth.wav", VOL_BASE, ATTN_NORM);
- if(self.armorvalue)
- sound (activator, CHAN_AUTO, "misc/armor25.wav", VOL_BASE, ATTN_NORM);
- if(self.items & IT_STRENGTH)
- {
- sound (activator, CHAN_AUTO, "misc/powerup.wav", VOL_BASE, ATTN_NORM);
- activator.strength_finished = max(activator.strength_finished, time + self.strength_finished);
- }
- if(self.items & IT_INVINCIBLE)
- {
- sound (activator, CHAN_AUTO, "misc/powerup_shield.wav", VOL_BASE, ATTN_NORM);
- activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished);
- }
+ trigger_item_change(0, ammo_shells, trigger_item_func_set, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_nails, trigger_item_func_set, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_rockets, trigger_item_func_set, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_cells, trigger_item_func_set, "misc/itempickup.wav", "");
+ trigger_item_change(0, health, trigger_item_func_set, "misc/megahealth.wav", "");
+ trigger_item_change(0, armorvalue, trigger_item_func_set, "misc/armor25.wav", "");
+ trigger_item_change(1, items, trigger_item_func_set, "misc/powerup.wav", "");
+ trigger_item_change(1, weapons, trigger_item_func_set, "weapons/weaponpickup.wav", "");
}
else if(self.spawnflags == 1) // AND/MIN
{
- activator.ammo_shells = min(activator.ammo_shells, self.ammo_shells);
- activator.ammo_nails = min(activator.ammo_nails, self.ammo_nails);
- activator.ammo_rockets = min(activator.ammo_rockets, self.ammo_rockets);
- activator.ammo_cells = min(activator.ammo_cells, self.ammo_cells);
- activator.health = min(activator.health, self.health);
- activator.armorvalue = min(activator.armorvalue, self.armorvalue);
- activator.weapons = activator.weapons & self.weapons;
- activator.items = activator.items & self.items;
-
- if not(self.items & IT_STRENGTH)
- activator.strength_finished = 0;
- if not(self.items & IT_INVINCIBLE)
- activator.invincible_finished = 0;
+ trigger_item_change(0, ammo_shells, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_nails, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_rockets, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_cells, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, health, trigger_item_func_min, "misc/megahealth.wav", "");
+ trigger_item_change(0, armorvalue, trigger_item_func_min, "misc/armor25.wav", "");
+ trigger_item_change(1, items, trigger_item_func_and, "misc/powerup.wav", "");
+ trigger_item_change(1, weapons, trigger_item_func_and, "weapons/weaponpickup.wav", "");
}
else if(self.spawnflags == 2) // OR/MAX
{
- activator.ammo_shells = max(activator.ammo_shells, self.ammo_shells);
- activator.ammo_nails = max(activator.ammo_nails, self.ammo_nails);
- activator.ammo_rockets = max(activator.ammo_rockets, self.ammo_rockets);
- activator.ammo_cells = max(activator.ammo_cells, self.ammo_cells);
- activator.health = max(activator.health, self.health);
- activator.armorvalue = max(activator.armorvalue, self.armorvalue);
- activator.weapons |= self.weapons;
- activator.items |= self.items;
-
- if(self.weapons)
- sound (activator, CHAN_AUTO, "weapons/weaponpickup.wav", VOL_BASE, ATTN_NORM);
- if(self.items)
- sound (activator, CHAN_AUTO, "misc/itempickup.wav", VOL_BASE, ATTN_NORM);
- if(self.health)
- sound (activator, CHAN_AUTO, "misc/megahealth.wav", VOL_BASE, ATTN_NORM);
- if(self.armorvalue)
- sound (activator, CHAN_AUTO, "misc/armor25.wav", VOL_BASE, ATTN_NORM);
- if(self.items & IT_STRENGTH)
- {
- sound (activator, CHAN_AUTO, "misc/powerup.wav", VOL_BASE, ATTN_NORM);
- activator.strength_finished = max(activator.strength_finished, time + self.strength_finished);
- }
- if(self.items & IT_INVINCIBLE)
- {
- sound (activator, CHAN_AUTO, "misc/powerup_shield.wav", VOL_BASE, ATTN_NORM);
- activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished);
- }
+ trigger_item_change(0, ammo_shells, trigger_item_func_max, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_nails, trigger_item_func_max, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_rockets, trigger_item_func_max, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_cells, trigger_item_func_max, "misc/itempickup.wav", "");
+ trigger_item_change(0, health, trigger_item_func_max, "misc/megahealth.wav", "");
+ trigger_item_change(0, armorvalue, trigger_item_func_max, "misc/armor25.wav", "");
+ trigger_item_change(1, items, trigger_item_func_or, "misc/powerup.wav", "");
+ trigger_item_change(1, weapons, trigger_item_func_or, "weapons/weaponpickup.wav", "");
}
else if(self.spawnflags == 4) // ANDNOT/MIN
{
- activator.ammo_shells = min(activator.ammo_shells, self.ammo_shells);
- activator.ammo_nails = min(activator.ammo_nails, self.ammo_nails);
- activator.ammo_rockets = min(activator.ammo_rockets, self.ammo_rockets);
- activator.ammo_cells = min(activator.ammo_cells, self.ammo_cells);
- activator.health = min(activator.health, self.health);
- activator.armorvalue = min(activator.armorvalue, self.armorvalue);
- activator.weapons -= activator.weapons & self.weapons;
- activator.items -= activator.items & self.items;
-
- if(self.items & IT_STRENGTH)
- activator.strength_finished = 0;
- if(self.items & IT_INVINCIBLE)
- activator.invincible_finished = 0;
+ trigger_item_change(0, ammo_shells, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_nails, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_rockets, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, ammo_cells, trigger_item_func_min, "misc/itempickup.wav", "");
+ trigger_item_change(0, health, trigger_item_func_min, "misc/megahealth.wav", "");
+ trigger_item_change(0, armorvalue, trigger_item_func_min, "misc/armor25.wav", "");
+ trigger_item_change(1, items, trigger_item_func_andnot, "misc/powerup.wav", "");
+ trigger_item_change(1, weapons, trigger_item_func_andnot, "weapons/weaponpickup.wav", "");
}
+ if((self.items & activator.items) & IT_STRENGTH)
+ activator.strength_finished = max(activator.strength_finished, time + self.strength_finished);
+ if((self.items & activator.items) & IT_INVINCIBLE)
+ activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished);
+ if not(activator.items & IT_STRENGTH)
+ activator.strength_finished = 0;
+ if not(activator.items & IT_INVINCIBLE)
+ activator.invincible_finished = 0;
+
+ if(activator.health > h0)
+ activator.pauserothealth_finished = max(activator.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
+ else if(activator.health < h0)
+ activator.pauseregen_finished = max(activator.pauseregen_finished, time + cvar("g_balance_pause_health_regen"));
+
+ if(activator.armorvalue > a0)
+ activator.pauserotarmor_finished = max(activator.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
+
if not(activator.weapons & W_WeaponBit(activator.switchweapon))
_switchweapon = TRUE;
if(_switchweapon)
Modified: trunk/data/scripts/entities.def
===================================================================
--- trunk/data/scripts/entities.def 2008-09-05 07:30:23 UTC (rev 4348)
+++ trunk/data/scripts/entities.def 2008-09-05 07:58:20 UTC (rev 4349)
@@ -916,7 +916,7 @@
_celshader: Sets the cel shader used for this geometry. Note: omit the "textures/" prefix.
*/
-/*QUAKED trigger_race_checkpoint (0 1 0) ? NOTOUCH - CRUSH
+/*QUAKED trigger_race_checkpoint (0 1 0) ? NOTOUCH STRICTTRIGGER CRUSH
A checkpoint, for the race game mode. Be sure to make them quite long, so they actually catch a player reliably!
-------- KEYS --------
cnt: Number of the checkpoint. 0 for finish line, and at least two other checkpoints have to exist. They MUST be touched in sequential order!
@@ -925,6 +925,7 @@
target: when the checkpoint is passed, these entities are triggered. Useful for forcing items in certain areas using trigger_items
-------- SPAWNFLAGS --------
NOTOUCH: the checkpoint will not become active when touched, it HAS to be targeted
+STRICTTRIGGER: only trigger the targets when the checkpoint actually was reached in a valid way (that is, not when going back)
CRUSH: the checkpoint kills when used at the wrong time
*/
More information about the nexuiz-commits
mailing list