r4304 - in trunk/data/qcsrc: client common server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Sep 3 03:51:30 EDT 2008


Author: div0
Date: 2008-09-03 03:51:13 -0400 (Wed, 03 Sep 2008)
New Revision: 4304

Modified:
   trunk/data/qcsrc/client/Main.qc
   trunk/data/qcsrc/client/View.qc
   trunk/data/qcsrc/common/util.qc
   trunk/data/qcsrc/common/util.qh
   trunk/data/qcsrc/server/cl_weapons.qc
   trunk/data/qcsrc/server/cl_weaponsystem.qc
   trunk/data/qcsrc/server/portals.qc
   trunk/data/qcsrc/server/t_items.qc
   trunk/data/qcsrc/server/t_teleporters.qc
   trunk/data/qcsrc/server/w_porto.qc
   trunk/data/qcsrc/server/w_uzi.qc
Log:
some weapon system fixes; allow infinite portals to work by anticipating the collision


Modified: trunk/data/qcsrc/client/Main.qc
===================================================================
--- trunk/data/qcsrc/client/Main.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/client/Main.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -187,6 +187,7 @@
 	self.nextthink = time + 0.2;
 }
 
+void Porto_Init();
 void PostInit(void)
 {
 	print(strcat("PostInit\n    maxclients = ", ftos(maxclients), "\n"));
@@ -197,6 +198,8 @@
 	playerchecker.think = Playerchecker_Think;
 	playerchecker.nextthink = time + 0.2;
 
+	Porto_Init();
+
 	postinit = true;
 }
 

Modified: trunk/data/qcsrc/client/View.qc
===================================================================
--- trunk/data/qcsrc/client/View.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/client/View.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -1,5 +1,46 @@
-//include "main.qh"
+entity porto;
+void Porto_Draw()
+{
+	vector v0, v1, v2, dir, ang;
 
+	if(activeweapon != WEP_PORTO)
+		return;
+
+	dir = view_forward;
+	v0 = view_origin;
+	traceline(v0, v0 + 65536 * dir, TRUE, world);
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+		return;
+	v1 = trace_endpos;
+
+	dir = dir - 2 * (dir * trace_plane_normal) * trace_plane_normal; // mirror dir at trace_plane_normal
+
+	ang = vectoangles(trace_plane_normal, dir);
+	ang_x = -ang_x;
+	makevectors(ang);
+	if(!CheckWireframeBox(v1 - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 16 * v_forward))
+		return;
+
+	traceline(v1, v1 + 65536 * dir, TRUE, world);
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+		return;
+	v2 = trace_endpos;
+
+	ang = vectoangles(trace_plane_normal, -1 * dir);
+	ang_x = -ang_x;
+	makevectors(ang);
+	if(!CheckWireframeBox(v2 - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 16 * v_forward))
+		return;
+
+	Draw_CylindricLine(v1, v2, 4, "", 1, 0, '1 0 0', 0.5, DRAWFLAG_NORMAL);
+}
+void Porto_Init()
+{
+	porto = spawn();
+	porto.classname = "porto";
+	porto.draw = Porto_Draw;
+}
+
 float drawtime;
 
 float tan(float x)

Modified: trunk/data/qcsrc/common/util.qc
===================================================================
--- trunk/data/qcsrc/common/util.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/common/util.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -615,3 +615,21 @@
 	}
 }
 
+#ifndef MENUQC
+float CheckWireframeBox(vector v0, vector dvx, vector dvy, vector dvz)
+{
+	traceline(v0, v0 + dvx, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0, v0 + dvy, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0, v0 + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx, v0 + dvx + dvy, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx, v0 + dvx + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy, v0 + dvy + dvx, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy, v0 + dvy + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvz, v0 + dvz + dvx, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvz, v0 + dvz + dvy, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx + dvy, v0 + dvx + dvy + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx + dvz, v0 + dvx + dvy + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy + dvz, v0 + dvx + dvy + dvz, TRUE, world); if(trace_fraction < 1) return 0;
+	return 1;
+}
+#endif

Modified: trunk/data/qcsrc/common/util.qh
===================================================================
--- trunk/data/qcsrc/common/util.qh	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/common/util.qh	2008-09-03 07:51:13 UTC (rev 4304)
@@ -65,3 +65,7 @@
 void compressShortVector_init();
 vector decompressShortVector(float data);
 float compressShortVector(vector vec);
+
+#ifndef MENUQC
+float CheckWireframeBox(vector v0, vector dvx, vector dvy, vector dvz);
+#endif

Modified: trunk/data/qcsrc/server/cl_weapons.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weapons.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/cl_weapons.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -3,10 +3,7 @@
 {
 	if (self.weapon != imp)
 	if (client_hasweapon(self, imp, TRUE, TRUE))
-	{
-		self.cnt = self.weapon ? self.weapon : self.switchweapon;
-		self.switchweapon = imp;
-	}
+		W_SwitchWeapon_Force(self, imp);
 };
 
 float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float complain)
@@ -157,7 +154,7 @@
 // toss current weapon
 void W_ThrowWeapon(vector velo, vector delta, float doreduce)
 {
-	local float w, ammo, wb;
+	local float w, ammo, wb, wa;
 	local entity wep, e;
 	local .float ammofield;
 
@@ -187,29 +184,45 @@
 	wep.velocity = velo; // e.velocity * 0.5 + v_forward * 750;
 	SUB_SetFade(wep, time + 20, 1);
 
-	ammofield = Item_CounterField(W_AmmoItemCode(w));
-	wb = W_WeaponBit(w);
-	if(!(e.weapons & wb))
+	wa = W_AmmoItemCode(w);
+	if(wa == IT_SUPERWEAPON || wa == 0)
 	{
-		remove(wep);
-		goto leave;
+		wb = W_WeaponBit(w);
+		if(!(e.weapons & wb))
+		{
+			remove(wep);
+			goto leave;
+		}
+		Item_SpawnByWeaponCode(w);
+		if(startitem_failed)
+			goto leave;
+		if(e.weapons & wb)
+			if(e.health >= 1)
+				sprint(e, strcat("You dropped the ^2", wep.netname, "\n"));
 	}
-	Item_SpawnByWeaponCode(w);
-	if(startitem_failed)
+	else
 	{
-		goto leave;
+		ammofield = Item_CounterField(wa);
+		wb = W_WeaponBit(w);
+		if(!(e.weapons & wb))
+		{
+			remove(wep);
+			goto leave;
+		}
+		Item_SpawnByWeaponCode(w);
+		if(startitem_failed)
+			goto leave;
+		if(doreduce)
+		{
+			ammo = min(e.ammofield, wep.ammofield);
+			wep.ammofield = ammo;
+			e.ammofield -= ammo;
+		}
+		if(e.weapons & wb)
+			if(e.health >= 1)
+				sprint(e, strcat("You dropped the ^2", wep.netname, " with ", ftos(wep.ammofield), " ammo", "\n"));
 	}
-	if(doreduce)
-	{
-		ammo = min(e.ammofield, wep.ammofield);
-		wep.ammofield = ammo;
-		e.ammofield -= ammo;
-	}
 
-	if(e.weapons & wb)
-		if(e.health >= 1)
-			sprint(e, strcat("You dropped the ^2", wep.netname, " with ", ftos(wep.ammofield), " ammo", "\n"));
-
 	wep.owner = e;
 	setorigin(wep, wep.origin);
 	wep.nextthink = time + 0.5;
@@ -217,10 +230,8 @@
 	wep.classname = "droppedweapon";
 	wep.flags = wep.flags | FL_TOSSED;
 	e.weapons = e.weapons - (e.weapons & wb);
-	e.switchweapon = w_getbestweapon(e);
 	wep.colormap = e.colormap;
-	if (e.switchweapon != e.weapon)
-		e.cnt = e.weapon;
+	W_SwitchWeapon_Force(e, w_getbestweapon(e));
 
 :leave
 	self = e;
@@ -274,6 +285,9 @@
 		}
 	}
 
+	float wb;
+	wb = W_WeaponBit(self.weapon);
+
 	// call the think code which may fire the weapon
 	// and do so multiple times to resolve framerate dependency issues if the
 	// server framerate is very low and the weapon fire rate very high
@@ -282,7 +296,13 @@
 	while (c < 5)
 	{
 		c = c + 1;
-		weapon_action(self.weapon, WR_THINK);
+		if(wb && self.weapons & wb == 0)
+		{
+			W_SwitchWeapon_Force(self, w_getbestweapon(self));
+			wb = 0;
+		}
+		if(wb)
+			weapon_action(self.weapon, WR_THINK);
 		if (time + frametime * 0.5 >= self.weapon_nextthink)
 			self.weapon_think();
 	}
@@ -415,14 +435,14 @@
 void RegisterWeapons()
 {
 	// %weaponaddpoint
-	register_weapon(WEP_LASER,            w_laser,     0,          "laser",   "laser",           "Laser");
-	register_weapon(WEP_SHOTGUN,          w_shotgun,   IT_SHELLS,  "shotgun", "shotgun",         "Shotgun");
-	register_weapon(WEP_UZI,              w_uzi,       IT_NAILS,   "uzi",     "uzi",             "Machine Gun");
-	register_weapon(WEP_GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS, "gl",      "grenadelauncher", "Mortar");
-	register_weapon(WEP_ELECTRO,          w_electro,   IT_CELLS,   "electro", "electro",         "Electro");
-	register_weapon(WEP_CRYLINK,          w_crylink,   IT_CELLS,   "crylink", "crylink",         "Crylink");
-	register_weapon(WEP_NEX,              w_nex,       IT_CELLS,   "nex",     "nex",             "Nex");
-	register_weapon(WEP_HAGAR,            w_hagar,     IT_ROCKETS, "hagar",   "hagar",           "Hagar");
-	register_weapon(WEP_ROCKET_LAUNCHER,  w_rlauncher, IT_ROCKETS, "rl",      "rocketlauncher",  "Rocket Launcher");
-	register_weapon(WEP_PORTO,            w_porto,     IT_CELLS,   "porto" ,  "porto",           "Port-O-Launch");
+	register_weapon(WEP_LASER,            w_laser,     0,              "laser",   "laser",           "Laser");
+	register_weapon(WEP_SHOTGUN,          w_shotgun,   IT_SHELLS,      "shotgun", "shotgun",         "Shotgun");
+	register_weapon(WEP_UZI,              w_uzi,       IT_NAILS,       "uzi",     "uzi",             "Machine Gun");
+	register_weapon(WEP_GRENADE_LAUNCHER, w_glauncher, IT_ROCKETS,     "gl",      "grenadelauncher", "Mortar");
+	register_weapon(WEP_ELECTRO,          w_electro,   IT_CELLS,       "electro", "electro",         "Electro");
+	register_weapon(WEP_CRYLINK,          w_crylink,   IT_CELLS,       "crylink", "crylink",         "Crylink");
+	register_weapon(WEP_NEX,              w_nex,       IT_CELLS,       "nex",     "nex",             "Nex");
+	register_weapon(WEP_HAGAR,            w_hagar,     IT_ROCKETS,     "hagar",   "hagar",           "Hagar");
+	register_weapon(WEP_ROCKET_LAUNCHER,  w_rlauncher, IT_ROCKETS,     "rl",      "rocketlauncher",  "Rocket Launcher");
+	register_weapon(WEP_PORTO,            w_porto,     IT_SUPERWEAPON, "porto" ,  "porto",           "Port-O-Launch");
 }

Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -7,6 +7,12 @@
 ===========================================================================
 */
 
+void W_SwitchWeapon_Force(entity e, float w)
+{
+	e.cnt = e.weapon ? e.weapon : e.switchweapon;
+	e.switchweapon = w;
+}
+
 .float antilag_debug;
 
 // VorteX: static frame globals
@@ -410,9 +416,7 @@
 	
 	if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
 	{
-		self.switchweapon = w_getbestweapon(self);
-		if (self.switchweapon != self.weapon)
-			self.cnt = self.weapon;
+		W_SwitchWeapon_Force(self, w_getbestweapon(self));
 		return FALSE;
 	}
 

Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/portals.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -101,7 +101,7 @@
 	fixedmakevectors(teleporter.enemy.mangle);
 	safe = teleporter.enemy.portal_safe_origin; // a valid player origin
 	step = to + ((safe - to) * v_forward) * v_forward;
-	tracebox(safe, PL_MIN, PL_MAX, step, MOVE_WORLDONLY, player);
+	tracebox(safe, PL_MIN, PL_MAX, step, MOVE_NOMONSTERS, player);
 	if(trace_startsolid)
 	{
 		bprint("'safe' teleport location is not safe!\n");
@@ -109,7 +109,7 @@
 		return;
 	}
 	safe = trace_endpos;
-	tracebox(safe, PL_MIN, PL_MAX, to, MOVE_WORLDONLY, player);
+	tracebox(safe, PL_MIN, PL_MAX, to, MOVE_NOMONSTERS, player);
 	if(trace_startsolid)
 		error("trace_endpos in solid!");
 	to = trace_endpos;
@@ -124,11 +124,11 @@
 		ang = Portal_Transform_Multiply(transform, player.mangle);
 	}
 
-	print("previous velocity: ", vtos(player.velocity), "\n");
-	print("previous origin: ", vtos(player.origin), "\n");
-	TeleportPlayer(teleporter, player, to, ang, Portal_Transform_Apply(transform, player.velocity));
-	print("new velocity: ", vtos(player.velocity), "\n");
-	print("new origin: ", vtos(player.origin), "\n");
+	TeleportPlayer(teleporter, player, to, ang, Portal_Transform_Apply(transform, player.velocity), teleporter.enemy.absmin, teleporter.enemy.absmax);
+
+	// reset fade counter
+	teleporter.portal_wants_to_vanish = 0;
+	teleporter.fade_time = time + 10;
 }
 
 float Portal_FindSafeOrigin(entity portal)
@@ -152,7 +152,11 @@
 	if(other.classname == "porto")
 		return;
 	if(time < self.portal_activatetime)
-		return;
+		if(other == self.owner)
+		{
+			self.portal_activatetime = time + 0.1;
+			return;
+		}
 	fixedmakevectors(self.mangle);
 	if((other.origin - self.origin) * v_forward < 0)
 		return;
@@ -163,10 +167,6 @@
 		return;
 	}
 	Portal_TeleportPlayer(self, other);
-
-	// reset fade counter
-	self.portal_wants_to_vanish = 0;
-	self.nextthink = time + 60;
 }
 
 void Portal_MakeBrokenPortal(entity portal)
@@ -208,14 +208,45 @@
 	destination.enemy = teleporter;
 	Portal_MakeInPortal(teleporter);
 	Portal_MakeOutPortal(destination);
-	teleporter.nextthink = time + 60;
-	destination.nextthink = time + 60;
+	teleporter.fade_time = time + 10;
+	destination.fade_time = time + 10;
 	teleporter.portal_wants_to_vanish = 0;
 	destination.portal_wants_to_vanish = 0;
 }
 
-void Portal_Vanish()
+void Portal_Think()
 {
+	entity e, o;
+	float m;
+
+	if(self.solid == SOLID_TRIGGER)
+	{
+		m = self.modelindex;
+		o = self.owner;
+		self.solid = SOLID_BBOX;
+		self.owner = world;
+		self.modelindex = 0;
+		FOR_EACH_PLAYER(e)
+		{
+			if(time < self.portal_activatetime)
+				if(e == o)
+					continue;
+			// if e would hit the portal in a frame...
+			// already teleport him
+			tracebox(e.origin, e.mins, e.maxs, e.origin + e.velocity * 3 * frametime, MOVE_NORMAL, e);
+			if(trace_ent == self)
+				Portal_TeleportPlayer(self, e);
+		}
+		self.solid = SOLID_TRIGGER;
+		self.owner = o;
+		self.modelindex = m;
+	}
+
+	self.nextthink = time;
+
+	if(time < self.fade_time)
+		return;
+
 	self.portal_wants_to_vanish = 1;
 
 	if(self.enemy)
@@ -237,31 +268,14 @@
 	self = portal;
 	if(self.enemy)
 		self.enemy.portal_wants_to_vanish = 1;
-	Portal_Vanish();
+	Portal_Think();
 	self = oldself;
 }
 
-float CheckWireframeBox(vector v0, vector dvx, vector dvy, vector dvz)
-{
-	traceline(v0, v0 + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0, v0 + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0, v0 + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvx, v0 + dvx + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvx, v0 + dvx + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvy, v0 + dvy + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvy, v0 + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvz, v0 + dvz + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvz, v0 + dvz + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvx + dvy, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvx + dvz, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	traceline(v0 + dvy + dvz, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
-	return 1;
-}
-
 entity Portal_Spawn(entity own, vector org, vector ang)
 {
 	fixedmakevectors(ang);
-	if(!CheckWireframeBox(org - 64 * v_right - 64 * v_up, 128 * v_right, 128 * v_up, 32 * v_forward))
+	if(!CheckWireframeBox(org - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 16 * v_forward))
 		return world;
 
 	entity portal;
@@ -272,8 +286,9 @@
 	portal.mangle = ang;
 	ang_x = -ang_x;
 	portal.angles = ang;
-	portal.think = Portal_Vanish;
-	portal.nextthink = time + 60;
+	portal.think = Portal_Think;
+	portal.nextthink = time;
+	portal.fade_time = time + 10;
 	portal.portal_activatetime = time + 0.1;
 	setmodel(portal, "models/portal.md3");
 
@@ -283,13 +298,16 @@
 		return world;
 	}
 
-	setsize(portal, '-64 -64 -64', '64 64 64');
+	setsize(portal, '-48 -48 -48', '48 48 48');
 
 	return portal;
 }
 
 float Portal_SpawnInPortalAtTrace(entity own, vector dir, float portal_id_val)
 {
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+		return 0;
+
 	if(trace_ent.classname == "player")
 	{
 		print("hit a player, adjusting...\n");
@@ -315,8 +333,6 @@
 		own.portal_out = world;
 	}
 		
-	print("Plane normal: ", vtos(trace_plane_normal), "\n");
-	print("Portal angles: ", vtos(vectoangles(trace_plane_normal)), "\n");
 	own.portal_in = Portal_Spawn(own, trace_endpos + trace_plane_normal, fixedvectoangles2(trace_plane_normal, dir));
 	if(!own.portal_in)
 		return 0;
@@ -330,6 +346,9 @@
 
 float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float portal_id_val)
 {
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+		return 0;
+
 	if(trace_ent.classname == "player")
 	{
 		print("hit a player, adjusting...\n");
@@ -350,15 +369,12 @@
 		own.portal_out = world;
 	}
 		
-	print("Plane normal: ", vtos(trace_plane_normal), "\n");
-	print("Portal angles: ", vtos(vectoangles(trace_plane_normal)), "\n");
 	own.portal_out = Portal_Spawn(own, trace_endpos + trace_plane_normal, fixedvectoangles2(trace_plane_normal, -1 * dir));
 	if(!own.portal_out)
 		return 0;
 	own.portal_out.portal_id = portal_id_val;
 
 	Portal_Connect(own.portal_in, own.portal_out);
-	print("Portal transform: ", vtos(own.portal_in.portal_transform), "\n");
 
 	return 1;
 }

Modified: trunk/data/qcsrc/server/t_items.qc
===================================================================
--- trunk/data/qcsrc/server/t_items.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/t_items.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -226,9 +226,7 @@
 	self = other;
 
 	if (_switchweapon)
-		self.switchweapon = w_getbestweapon(self);
-	if (self.switchweapon != self.weapon)
-		self.cnt = self.weapon;
+		W_SwitchWeapon_Force(self, w_getbestweapon(self));
 
 	self = oldself;
 
@@ -548,7 +546,7 @@
 	var .float ammofield;
 	e = get_weaponinfo(wpn);
 
-	if(e.items)
+	if(e.items && e.items != IT_SUPERWEAPON)
 	{
 		ammofield = Item_CounterField(e.items);
 		if(!self.ammofield)

Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/t_teleporters.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -1,5 +1,5 @@
 .entity pusher;
-void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
+void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax)
 {
 	entity head;
 	entity oldself;
@@ -29,6 +29,12 @@
 			float deathradius;
 			deathmin = player.absmin;
 			deathmax = player.absmax;
+			if(deathmin_x > telefragmin_x) deathmin_x = telefragmin_x;
+			if(deathmin_y > telefragmin_y) deathmin_y = telefragmin_y;
+			if(deathmin_z > telefragmin_z) deathmin_z = telefragmin_z;
+			if(deathmax_x < telefragmax_x) deathmax_x = telefragmax_x;
+			if(deathmax_y < telefragmax_y) deathmax_y = telefragmax_y;
+			if(deathmax_z < telefragmax_z) deathmax_z = telefragmax_z;
 			deathradius = max(vlen(deathmin), vlen(deathmax));
 			for(head = findradius(player.origin, deathradius); head; head = head.chain)
 				if(head != player)
@@ -89,7 +95,7 @@
 	EXACTTRIGGER_TOUCH;
 
 	makevectors(self.enemy.mangle);
-	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity));
+	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0');
 
 	if(self.enemy.target)
 	{

Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/w_porto.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -7,16 +7,19 @@
 
 void W_Porto_Touch1 (void)
 {
-	print(vtos(trace_plane_normal), "\n");
 	if(self.porto_grenade_id == 0)
 	{
 		self.porto_grenade_id = time;
 		if(!Portal_SpawnInPortalAtTrace(self.owner, self.velocity, self.porto_grenade_id))
+		{
+			self.porto_grenade_id = 0;
 			remove(self);
+		}
 	}
 	else
 	{
 		Portal_SpawnOutPortalAtTrace(self.owner, self.velocity, self.porto_grenade_id);
+		self.porto_grenade_id = 0;
 		remove(self);
 	}
 }
@@ -26,7 +29,7 @@
 	local entity gren;
 
 	if (cvar("g_use_ammunition"))
-		self.ammo_cells = self.ammo_cells - cvar("g_balance_porto_primary_ammo");
+		self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
 	W_SetupShot (self, '0 0 0', FALSE, 4, "weapons/grenade_fire.wav");
 
 	//pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
@@ -92,10 +95,6 @@
 	}
 	else if (req == WR_SETUP)
 		weapon_setup(WEP_PORTO);
-	else if (req == WR_CHECKAMMO1)
-		return self.ammo_cells >= cvar("g_balance_porto_primary_ammo");
-	else if (req == WR_CHECKAMMO2)
-		return FALSE;
 	else if (req == WR_SUICIDEMESSAGE)
 		w_deathtypestring = "did the impossible";
 	else if (req == WR_KILLMESSAGE)

Modified: trunk/data/qcsrc/server/w_uzi.qc
===================================================================
--- trunk/data/qcsrc/server/w_uzi.qc	2008-09-02 21:22:16 UTC (rev 4303)
+++ trunk/data/qcsrc/server/w_uzi.qc	2008-09-03 07:51:13 UTC (rev 4304)
@@ -85,9 +85,7 @@
 	{
 		if (!weapon_action(self.weapon, WR_CHECKAMMO2))
 		{
-			self.switchweapon = w_getbestweapon(self);
-			if (self.switchweapon != self.weapon)
-				self.cnt = self.weapon;
+			W_SwitchWeapon_Force(self, w_getbestweapon(self));
 			w_ready();
 			return;
 		}




More information about the nexuiz-commits mailing list