From 813ecc977fffff28c936d95efad3489aa5ff80d4 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 5 Sep 2008 13:01:26 +0000 Subject: [PATCH] more portal race fixes git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4353 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/View.qc | 2 +- data/qcsrc/server/g_triggers.qc | 22 +++++++++++++++-- data/qcsrc/server/portals.qc | 6 +++-- data/qcsrc/server/t_items.qc | 42 ++++++++++++++++++++++++++------- data/qcsrc/server/w_porto.qc | 13 +++++----- data/scripts/entities.def | 8 ++++++- data/weapons.cfg | 2 +- data/weaponsPro.cfg | 2 +- 8 files changed, 74 insertions(+), 23 deletions(-) diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index d24157dc2..1adbd1524 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -73,7 +73,7 @@ void Porto_Draw() p = polyline[idx-2]; q = polyline[idx-1]; if(idx == 2) - p = p - '0 0 16'; + p = p - view_up * 16; if(idx-1 >= portal1_idx) { Draw_CylindricLine(p, q, 4, "", 1, 0, '0 0 1', 0.5, DRAWFLAG_NORMAL); diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index e2194ea4c..8bf9cb101 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -469,16 +469,34 @@ float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end) } -void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);} +// TODO add a way to do looped sounds with sound(); then complete this entity +.float volume, atten; +void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);} void spawnfunc_target_speaker() { if(self.noise) precache_sound (self.noise); IFTARGETED + { + if(!self.atten) + self.atten = ATTN_NORM; + else if(self.atten < 0) + self.atten = 0; + if(!self.volume) + self.volume = 1; self.use = target_speaker_use; + } else - ambientsound (self.origin, self.noise, VOL_BASE, ATTN_STATIC); + { + if(!self.atten) + self.atten = ATTN_STATIC; + else if(self.atten < 0) + self.atten = 0; + if(!self.volume) + self.volume = 1; + ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten); + } }; diff --git a/data/qcsrc/server/portals.qc b/data/qcsrc/server/portals.qc index d1f051121..382273595 100644 --- a/data/qcsrc/server/portals.qc +++ b/data/qcsrc/server/portals.qc @@ -199,8 +199,8 @@ void Portal_Touch() } if(Portal_TeleportPlayer(self, other)) if(other.classname == "porto") - if(other.cnt == 0) - other.cnt = 1; + if(other.effects & EF_RED) + other.effects += EF_BLUE - EF_RED; } void Portal_MakeBrokenPortal(entity portal) @@ -497,6 +497,7 @@ float Portal_SpawnInPortalAtTrace(entity own, vector dir, float portal_id_val) portal.portal_id = portal_id_val; Portal_SetInPortal(own, portal); + sound(portal, CHAN_PROJECTILE, "misc/invshot.wav", VOL_BASE, ATTN_NORM); return 1; } @@ -528,6 +529,7 @@ float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float portal_id_val) portal.portal_id = portal_id_val; Portal_SetOutPortal(own, portal); + sound(portal, CHAN_PROJECTILE, "misc/invshot.wav", VOL_BASE, ATTN_NORM); return 1; } diff --git a/data/qcsrc/server/t_items.qc b/data/qcsrc/server/t_items.qc index 12d4d7244..af74bed36 100644 --- a/data/qcsrc/server/t_items.qc +++ b/data/qcsrc/server/t_items.qc @@ -887,17 +887,27 @@ void spawnfunc_func_wall (void) float trigger_item_func_set(float a, float b) { - return b; + if(b == 0) + return a; + else if(b < 0) + return 0; + else + return b; } float trigger_item_func_min(float a, float b) { - return min(a, b); + if(b == 0) + return a; + else if(b < 0) + return 0; + else + return min(a, b); } float trigger_item_func_max(float a, float b) { - return min(a, b); + return max(a, b); } float trigger_item_func_and(float a, float b) @@ -983,6 +993,11 @@ void trigger_items_use (void) 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", ""); + + if((self.items & activator.items) & IT_STRENGTH) + activator.strength_finished = time + self.strength_finished; + if((self.items & activator.items) & IT_INVINCIBLE) + activator.invincible_finished = time + self.invincible_finished; } else if(self.spawnflags == 1) // AND/MIN { @@ -994,6 +1009,11 @@ void trigger_items_use (void) 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", ""); + + if((self.items & activator.items) & IT_STRENGTH) + activator.strength_finished = min(activator.strength_finished, time + self.strength_finished); + if((self.items & activator.items) & IT_INVINCIBLE) + activator.invincible_finished = min(activator.invincible_finished, time + self.invincible_finished); } else if(self.spawnflags == 2) // OR/MAX { @@ -1005,6 +1025,11 @@ void trigger_items_use (void) 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", ""); + + 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); } else if(self.spawnflags == 4) // ANDNOT/MIN { @@ -1016,12 +1041,13 @@ void trigger_items_use (void) 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 = min(activator.strength_finished, time + self.strength_finished); + if((self.items & activator.items) & IT_INVINCIBLE) + activator.invincible_finished = min(activator.invincible_finished, time + self.invincible_finished); } - 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) @@ -1060,7 +1086,7 @@ void spawnfunc_trigger_items (void) { if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO; if(argv(i) == "strength") self.items |= IT_STRENGTH; - if(argv(i) == "shield") self.items |= IT_INVINCIBLE; + if(argv(i) == "invincible") self.items |= IT_INVINCIBLE; for(j = WEP_FIRST; j <= WEP_LAST; ++j) { e = get_weaponinfo(j); diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index afaa4c60e..c7eae4243 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -52,8 +52,6 @@ void W_Porto_Touch (void) { vector norm; norm = trace_plane_normal; - print(ftos(trace_dphitq3surfaceflags), "\n"); - print((trace_dphittexturename), "\n"); if(self.owner.playerid != self.playerid) { remove(self); @@ -62,20 +60,20 @@ void W_Porto_Touch (void) { // just reflect self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); - self.angles = vectoangles(self.velocity); + self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); } else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { W_Porto_Fail(0); } - else if(self.cnt == 0) + else if(self.effects & EF_RED) { - self.cnt = 1; + self.effects += EF_BLUE - EF_RED; if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id)) { trace_plane_normal = norm; self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); - self.angles = vectoangles(self.velocity); + self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); } else { @@ -115,7 +113,8 @@ void W_Porto_Attack (void) gren.bot_dodgerating = 200; gren.movetype = MOVETYPE_BOUNCEMISSILE; gren.solid = SOLID_BBOX; - gren.effects = EF_LOWPRECISION; + gren.effects = EF_LOWPRECISION | EF_RED; + gren.scale = 4; gren.modelflags = MF_GRENADE; setmodel(gren, "models/grenademodel.md3"); // precision set above setsize(gren, '0 0 0', '0 0 0'); diff --git a/data/scripts/entities.def b/data/scripts/entities.def index 8267fcb1a..2dc04e4eb 100644 --- a/data/scripts/entities.def +++ b/data/scripts/entities.def @@ -672,6 +672,8 @@ If not targeted, it loops the sound file as an ambient noise. -------- KEYS -------- noise: path/name of .wav/.ogg file to play targetname: the activating button or trigger points to this. +atten: distance attenuation of the sound (a value from 0.1 to 3.9), default is 0.5 if targeted, 3 otherwise; set to -1 for no attenuation (global sound) +volume: volume of the sound */ /*QUAKED trigger_counter (.5 .5 .5) ? NOMESSAGE @@ -1020,14 +1022,18 @@ model="models/weapons/g_porto.md3" /*QUAKED trigger_items (0 0 1) (-8 -8 -8) (8 8 8) AND OR ANDNOT Sets the items of any player who triggers this. +For the number fields, not specifying a value means not changing it. To clear armor, you need to explicitly set "armor" to "-1". -------- KEYS -------- -message: space separated list of items (either weapon short names (like in g_start_weapon_* cvars), or item short names "unlimited_ammo", "shield" and "strength" +netname: space separated list of items (either weapon short names (like in g_start_weapon_* cvars), or item short names "unlimited_ammo", "invincible" and "strength" +message: message to print ammo_shells: amount of shells ammo_nails: amount of bullets ammo_rockets: amount of rockets ammo_cells: amount of cells health: amount of health armorvalue: amount of armor +strength_finished: if "strength" is specified, the time in seconds for which the strength will hold +invincible_finished: if "invincible" is specified, the time in seconds for which the invincibility will hold -------- SPAWNFLAGS -------- AND: any items not listed will get removed, and none will get added OR: the player may keep items not listed diff --git a/data/weapons.cfg b/data/weapons.cfg index a9ee4e317..e08a5f0d5 100644 --- a/data/weapons.cfg +++ b/data/weapons.cfg @@ -217,6 +217,6 @@ set g_balance_rocketlauncher_laserguided_allow_steal 1 // TESTING: port-o-launch set g_balance_porto_primary_refire 1.5 -set g_balance_porto_primary_speed 700 +set g_balance_porto_primary_speed 2000 set g_balance_porto_primary_lifetime 30 set g_balance_porto_primary_ammo 25 diff --git a/data/weaponsPro.cfg b/data/weaponsPro.cfg index 60de8d60b..f77229cf8 100644 --- a/data/weaponsPro.cfg +++ b/data/weaponsPro.cfg @@ -217,6 +217,6 @@ set g_balance_rocketlauncher_laserguided_allow_steal 1 // TESTING: port-o-launch set g_balance_porto_primary_refire 1.5 -set g_balance_porto_primary_speed 700 +set g_balance_porto_primary_speed 2000 set g_balance_porto_primary_lifetime 30 set g_balance_porto_primary_ammo 25 -- 2.39.2