r4350 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Sep 5 04:26:06 EDT 2008
Author: div0
Date: 2008-09-05 04:25:50 -0400 (Fri, 05 Sep 2008)
New Revision: 4350
Modified:
trunk/data/qcsrc/server/cl_weapons.qc
trunk/data/qcsrc/server/race.qc
trunk/data/qcsrc/server/t_items.qc
trunk/data/qcsrc/server/w_porto.qc
Log:
more behaviour fixes for race+portals
Modified: trunk/data/qcsrc/server/cl_weapons.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weapons.qc 2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/cl_weapons.qc 2008-09-05 08:25:50 UTC (rev 4350)
@@ -179,7 +179,7 @@
setorigin(wep, org);
wep.classname = "droppedweapon";
wep.velocity = velo;
- wep.owner = own;
+ wep.owner = wep.enemy = own;
wep.classname = "droppedweapon";
wep.flags = wep.flags | FL_TOSSED;
wep.colormap = own.colormap;
Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc 2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/race.qc 2008-09-05 08:25:50 UTC (rev 4350)
@@ -301,6 +301,9 @@
void checkpoint_touch()
{
+ string oldmsg;
+ entity oldself;
+
EXACTTRIGGER_TOUCH;
if(other.classname == "porto")
@@ -308,10 +311,22 @@
// do not allow portalling through checkpoints
trace_plane_normal = normalize(-1 * other.velocity);
self = other;
- W_Porto_Fail();
+ W_Porto_Fail(0);
return;
}
+ /*
+ * Trigger targets
+ */
+ if not(self.spawnflags & 2)
+ {
+ activator = other;
+ oldmsg = self.message;
+ self.message = "";
+ SUB_UseTargets();
+ self.message = oldmsg;
+ }
+
if(other.classname != "player")
return;
@@ -319,14 +334,12 @@
* Remove unauthorized equipment
*/
Portal_ClearAll(other);
-
- /*
- * Trigger targets
- */
- if(self.spawnflags & 2)
+ if(other.porto_current)
{
- activator = other;
- SUB_UseTargets();
+ oldself = self;
+ self = other.porto_current;
+ W_Porto_Fail(1);
+ self = other;
}
if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint)
@@ -334,10 +347,13 @@
/*
* Trigger targets
*/
- if not(self.spawnflags & 2)
+ if(self.spawnflags & 2)
{
activator = other;
+ oldmsg = self.message;
+ self.message = "";
SUB_UseTargets();
+ self.message = oldmsg;
}
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:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/t_items.qc 2008-09-05 08:25:50 UTC (rev 4350)
@@ -123,6 +123,9 @@
if (player.switchweapon == w_getbestweapon(player))
_switchweapon = TRUE;
+ if not(player.weapons & W_WeaponBit(player.switchweapon))
+ _switchweapon = TRUE;
+
if (item.ammo_shells)
if (player.ammo_shells < g_pickup_shells_max)
{
@@ -912,6 +915,7 @@
return a - (a & b);
}
+float trigger_item_changed;
void trigger_item_change(float binary, .float field, float(float a, float b) func, string sound_increase, string sound_decrease)
{
float n, d;
@@ -934,11 +938,13 @@
{
if(sound_decrease != "")
sound (activator, CHAN_AUTO, sound_decrease, VOL_BASE, ATTN_NORM);
+ trigger_item_changed = 1;
}
else if(d > 0)
{
if(sound_increase != "")
sound (activator, CHAN_AUTO, sound_increase, VOL_BASE, ATTN_NORM);
+ trigger_item_changed = 1;
}
activator.field = n;
}
@@ -952,6 +958,11 @@
return;
EXACTTRIGGER_TOUCH;
+ entity e;
+ for(e = world; (e = find(e, classname, "droppedweapon")); )
+ if(e.enemy == activator)
+ remove(e);
+
float _switchweapon;
_switchweapon = FALSE;
if (activator.autoswitch)
@@ -960,6 +971,7 @@
a0 = activator.armorvalue;
h0 = activator.health;
+ trigger_item_changed = 0;
if(self.spawnflags == 0) // SET
{
@@ -1027,6 +1039,9 @@
_switchweapon = TRUE;
if(_switchweapon)
W_SwitchWeapon_Force(activator, w_getbestweapon(activator));
+
+ if(trigger_item_changed)
+ centerprint(activator, self.message);
}
void spawnfunc_trigger_items (void)
@@ -1040,7 +1055,7 @@
if(!self.invincible_finished)
self.invincible_finished = cvar("g_balance_powerup_invincible_time");
- n = tokenize(self.message);
+ n = tokenize(self.netname);
for(i = 0; i < n; ++i)
{
if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO;
Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc 2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/w_porto.qc 2008-09-05 08:25:50 UTC (rev 4350)
@@ -1,40 +1,41 @@
.float portal_id;
+.entity porto_current;
.vector porto_v_angle; // holds "held" view angles
.float porto_v_angle_held;
.vector right_vector;
void W_Porto_Success (void)
{
- self.owner.portal_id = 0;
+ self.owner.porto_current = world;
remove(self);
}
float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo);
-void W_Porto_Fail (void)
+void W_Porto_Fail (float failhard)
{
- centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
-
// no portals here!
Portal_ClearWithID(self.owner, self.portal_id);
+ self.owner.porto_current = world;
- self.owner.portal_id = 0;
- // TODO maybe instead throw the portal gun there?
- // self.owner.weapons = self.owner.weapons | WEPBIT_PORTO;
- setsize (self, '-16 -16 0', '16 16 32');
- setorigin(self, self.origin + trace_plane_normal);
- if(move_out_of_solid(self))
+ if(!failhard)
{
- self.flags = FL_ITEM;
- self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
- tracetoss(self, self);
- if(vlen(trace_endpos - self.owner.origin) > 128)
- self.velocity = '0 0 0';
- W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
+ centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+ setsize (self, '-16 -16 0', '16 16 32');
+ setorigin(self, self.origin + trace_plane_normal);
+ if(move_out_of_solid(self))
+ {
+ self.flags = FL_ITEM;
+ self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
+ tracetoss(self, self);
+ if(vlen(trace_endpos - self.owner.origin) > 128)
+ self.velocity = '0 0 0';
+ W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
+ }
+ else
+ {
+ W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, '0 0 0');
+ }
}
- else
- {
- W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, '0 0 0');
- }
remove(self);
}
@@ -44,13 +45,15 @@
if(self.owner.playerid != self.playerid)
remove(self);
else
- W_Porto_Fail();
+ W_Porto_Fail(0);
}
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);
@@ -59,10 +62,11 @@
{
// just reflect
self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
+ self.angles = vectoangles(self.velocity);
}
else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
{
- W_Porto_Fail();
+ W_Porto_Fail(0);
}
else if(self.cnt == 0)
{
@@ -76,7 +80,7 @@
else
{
trace_plane_normal = norm;
- W_Porto_Fail();
+ W_Porto_Fail(0);
}
}
else
@@ -88,7 +92,7 @@
else
{
trace_plane_normal = norm;
- W_Porto_Fail();
+ W_Porto_Fail(0);
}
}
@@ -126,7 +130,8 @@
gren.angles = vectoangles (gren.velocity);
gren.flags = FL_PROJECTILE;
- self.portal_id = gren.portal_id = time;
+ gren.portal_id = time;
+ self.porto_current = gren;
gren.playerid = self.playerid;
fixedmakevectors(vectoangles(gren.velocity));
gren.right_vector = v_right;
@@ -195,7 +200,7 @@
makevectors(self.porto_v_angle); // override the previously set angles
if (self.BUTTON_ATCK)
- if (!self.portal_id)
+ if (!self.porto_current)
if (weapon_prepareattack(0, cvar("g_balance_porto_primary_refire")))
{
W_Porto_Attack();
More information about the nexuiz-commits
mailing list