[nexuiz-commits] r8572 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Jan 25 12:14:10 EST 2010


Author: div0
Date: 2010-01-25 12:13:58 -0500 (Mon, 25 Jan 2010)
New Revision: 8572

Modified:
   trunk/data/qcsrc/server/cheats.qc
   trunk/data/qcsrc/server/t_items.qc
Log:
better sound handling in "give";
log attempted cheats if sv_cheats is 0
don't log ineffective cheats as invalid clientcommand

Modified: trunk/data/qcsrc/server/cheats.qc
===================================================================
--- trunk/data/qcsrc/server/cheats.qc	2010-01-25 17:13:32 UTC (rev 8571)
+++ trunk/data/qcsrc/server/cheats.qc	2010-01-25 17:13:58 UTC (rev 8572)
@@ -65,12 +65,22 @@
 	if(sv_cheats && autocvar_sv_cheats)
 		return 1;
 
+	// if we get here, player is not allowed to cheat. Log it.
+	if(i)
+		bprint(sprintf("Player %s^7 tried to use cheat 'impulse %d'\n", self.netname, i));
+	else if(argc)
+		bprint(sprintf("Player %s^7 tried to use cheat '%s'\n", self.netname, argv(0)));
+	else if(fr)
+		bprint(sprintf("Player %s^7 tried to use cheat frame %d\n", self.netname, fr));
+	else
+		bprint(sprintf("Player %s^7 tried to use an unknown cheat\n", self.netname));
+
 	return 0;
 }
 
 #define BEGIN_CHEAT_FUNCTION() \
-	float cheating; \
-	cheating = 0
+	float cheating, attempting; \
+	cheating = 0; attempting = 0
 #define DID_CHEAT() \
 	++cheating
 #define ADD_CHEATS(e,n) \
@@ -78,19 +88,22 @@
 	e.cheatcount += n
 #define END_CHEAT_FUNCTION() \
 	ADD_CHEATS(self,cheating); \
-	return cheating
+	return attempting
+#define IS_CHEAT(i,argc,fr) \
+	++attempting; \
+	if(!CheatsAllowed(i,argc,fr)) \
+		break
 
 float CheatImpulse(float i)
 {
 	BEGIN_CHEAT_FUNCTION();
-	if not(CheatsAllowed(i, 0, 0))
-		return 0;
 	switch(i)
 	{
 		entity e, e2;
 		vector org;
 
 		case CHIMPULSE_SPEEDRUN_INIT: // deploy personal waypoint
+			// shared with regular waypoint init, so this is not a cheat by itself
 			if(!self.personal)
 			{
 				self.personal = spawn();
@@ -117,6 +130,7 @@
 			self.personal.teleport_time = time;
 			break; // this part itself doesn't cheat, so let's not count this
 		case CHIMPULSE_CLONE_MOVING:
+			IS_CHEAT(i, 0, 0);
 			makevectors (self.v_angle);
 			self.velocity = self.velocity + v_forward * 300;
 			CopyBody(1);
@@ -125,14 +139,17 @@
 			DID_CHEAT();
 			break;
 		case CHIMPULSE_CLONE_STANDING:
+			IS_CHEAT(i, 0, 0);
 			CopyBody(0);
 			self.lip += 1;
 			DID_CHEAT();
 			break;
 		case CHIMPULSE_GIVE_ALL:
+			IS_CHEAT(i, 0, 0);
 			CheatCommand(tokenize_console("give all"));
 			break; // already counted as cheat
 		case CHIMPULSE_SPEEDRUN:
+			IS_CHEAT(i, 0, 0);
 			if(self.personal)
 			{
 				self.speedrunning = TRUE;
@@ -198,6 +215,7 @@
 				sprint(self, "No waypoint set, cheater (use g_waypointsprite_personal to set one)\n");
 			break;
 		case CHIMPULSE_TELEPORT:
+			IS_CHEAT(i, 0, 0);
 			if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((sv_cheats >= 2) ? 100000 : 100), 1024, 256))
 			{
 				self.angles_x = -self.angles_x;
@@ -209,6 +227,7 @@
 			sprint(self, "Emergency teleport could not find a good location, forget it!\n");
 			break;
 		case CHIMPULSE_R00T:
+			IS_CHEAT(i, 0, 0);
 			FOR_EACH_PLAYER(e)
 			{
 				if( e.playermodel == "models/player/jeandarc.zym"
@@ -251,8 +270,6 @@
 float CheatCommand(float argc)
 {
 	BEGIN_CHEAT_FUNCTION();
-	if not(CheatsAllowed(0, argc, 0))
-		return 0;
 	string cmd;
 	cmd = argv(0);
 	switch(cmd)
@@ -263,6 +280,7 @@
 		entity oldself;
 
 		case "pointparticles":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 5)
 			{
 				// arguments:
@@ -282,6 +300,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd pointparticles effectname position(0..1) velocityvector multiplier\n");
 			break;
 		case "trailparticles":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 2)
 			{
 				// arguments:
@@ -296,6 +315,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd trailparticles effectname\n");
 			break;
 		case "make":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 3)
 			{
 				// arguments:
@@ -344,6 +364,7 @@
 				sprint(self, "Usage: sv_cheats 1; restart; cmd make models/... 0/1/2\n");
 			break;
 		case "penalty":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 3)
 			{
 				race_ImposePenaltyTime(self, stof(argv(1)), argv(2));
@@ -353,6 +374,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd penalty 5.0 AHAHAHAHAHAHAH))\n");
 			break;
 		case "dragbox_spawn":
+			IS_CHEAT(0, argc, 0);
 			e = spawn();
 			e.classname = "dragbox_box";
 			e.think = DragBox_Think;
@@ -403,6 +425,7 @@
 			DID_CHEAT();
 			break;
 		case "dragpoint_spawn":
+			IS_CHEAT(0, argc, 0);
 			e = spawn();
 			e.classname = "dragpoint";
 			e.think = DragBox_Think;
@@ -436,6 +459,7 @@
 			DID_CHEAT();
 			break;
 		case "drag_remove":
+			IS_CHEAT(0, argc, 0);
 			RandomSelection_Init();
 			for(e = world; (e = find(e, classname, "dragbox_box")); )
 				RandomSelection_Add(e, 0, string_null, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - self.cursor_trace_endpos));
@@ -454,6 +478,7 @@
 			DID_CHEAT();
 			break;
 		case "drag_setcnt":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 2)
 			{
 				RandomSelection_Init();
@@ -474,6 +499,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd dragbox_setcnt cnt\n");
 			break;
 		case "drag_save":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 2)
 			{
 				f = fopen(argv(1), FILE_WRITE);
@@ -493,6 +519,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd dragbox_save filename\n");
 			break;
 		case "drag_saveraceent":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 2)
 			{
 				f = fopen(argv(1), FILE_WRITE);
@@ -561,6 +588,7 @@
 			sprint(self, "Usage: sv_cheats 1; restart; cmd dragbox_save filename\n");
 			break;
 		case "drag_clear":
+			IS_CHEAT(0, argc, 0);
 			for(e = world; (e = find(e, classname, "dragbox_box")); )
 				remove(e);
 			for(e = world; (e = find(e, classname, "dragbox_corner_1")); )
@@ -574,6 +602,7 @@
 			DID_CHEAT();
 			break;
 		case "warp":
+			IS_CHEAT(0, argc, 0);
 			if(argc == 2) if(cvar("g_campaign"))
 			{
 				CampaignLevelWarp(stof(argv(1)));
@@ -581,6 +610,7 @@
 			}
 			break;
 		case "god":
+			IS_CHEAT(0, argc, 0);
 			BITXOR_ASSIGN(self.flags, FL_GODMODE);
 			if(self.flags & FL_GODMODE)
 			{
@@ -591,6 +621,7 @@
 				sprint(self, "godmode OFF\n");
 			break;
 		case "notarget":
+			IS_CHEAT(0, argc, 0);
 			BITXOR_ASSIGN(self.flags, FL_NOTARGET);
 			if(self.flags & FL_NOTARGET)
 			{
@@ -601,6 +632,7 @@
 				sprint(self, "notarget OFF\n");
 			break;
 		case "noclip":
+			IS_CHEAT(0, argc, 0);
 			if(self.movetype != MOVETYPE_NOCLIP)
 			{
 				self.movetype = MOVETYPE_NOCLIP;
@@ -614,6 +646,7 @@
 			}
 			break;
 		case "fly":
+			IS_CHEAT(0, argc, 0);
 			if(self.movetype != MOVETYPE_FLY)
 			{
 				self.movetype = MOVETYPE_FLY;
@@ -627,6 +660,7 @@
 			}
 			break;
 		case "give":
+			IS_CHEAT(0, argc, 0);
 			if(GiveItems(self, 1, argc))
 				DID_CHEAT();
 			break;
@@ -652,20 +686,6 @@
 {
 	BEGIN_CHEAT_FUNCTION();
 
-	if(CheatsAllowed(0, 0, CHRAME_DRAG))
-		if(Drag_CanDrag(self))
-			if(self.BUTTON_DRAG)
-				if(!self.dragentity)
-					if(self.cursor_trace_ent)
-						if(Drag_IsDraggable(self.cursor_trace_ent))
-						{
-							if(self.cursor_trace_ent.draggedby)
-								Drag_Finish(self.cursor_trace_ent.draggedby);
-							if(self.cursor_trace_ent.tag_entity)
-								detach_sameorigin(self.cursor_trace_ent);
-							Drag_Begin(self, self.cursor_trace_ent, self.cursor_trace_endpos);
-							DID_CHEAT();
-						}
 	if(Drag_IsDragging(self))
 	{
 		if(self.BUTTON_DRAG)
@@ -697,6 +717,25 @@
 			Drag_Finish(self);
 		}
 	}
+	else
+	{
+		if(Drag_CanDrag(self))
+			if(self.BUTTON_DRAG)
+				if(self.cursor_trace_ent)
+					if(Drag_IsDraggable(self.cursor_trace_ent))
+						switch(0)
+						{
+							default:
+								IS_CHEAT(0, 0, CHRAME_DRAG);
+								if(self.cursor_trace_ent.draggedby)
+									Drag_Finish(self.cursor_trace_ent.draggedby);
+								if(self.cursor_trace_ent.tag_entity)
+									detach_sameorigin(self.cursor_trace_ent);
+								Drag_Begin(self, self.cursor_trace_ent, self.cursor_trace_endpos);
+								DID_CHEAT();
+								break;
+						}
+	}
 
 	END_CHEAT_FUNCTION();
 }

Modified: trunk/data/qcsrc/server/t_items.qc
===================================================================
--- trunk/data/qcsrc/server/t_items.qc	2010-01-25 17:13:32 UTC (rev 8571)
+++ trunk/data/qcsrc/server/t_items.qc	2010-01-25 17:13:58 UTC (rev 8572)
@@ -1519,22 +1519,8 @@
 #define OP_PLUS 3
 #define OP_MINUS 4
 
-void GiveSound(entity e, float v0, float v1, string snd_incr, string snd_decr)
+float GiveBit(entity e, .float fld, float bit, float op, float val)
 {
-	if(v0 > v1)
-	{
-		if(snd_decr != "")
-			sound (e, CHAN_AUTO, snd_decr, VOL_BASE, ATTN_NORM);
-	}
-	else if(v0 < v1)
-	{
-		if(snd_incr != "")
-			sound (e, CHAN_AUTO, snd_incr, VOL_BASE, ATTN_NORM);
-	}
-}
-
-float GiveBit(entity e, .float fld, float bit, float op, float val, string snd_incr, string snd_decr)
-{
 	float v0, v1;
 	v0 = (e.fld & bit);
 	switch(op)
@@ -1560,11 +1546,10 @@
 			break;
 	}
 	v1 = (e.fld & bit);
-	GiveSound(e, v0, v1, snd_incr, snd_decr);
 	return (v0 != v1);
 }
 
-float GiveValue(entity e, .float fld, float op, float val, string snd_incr, string snd_decr)
+float GiveValue(entity e, .float fld, float op, float val)
 {
 	float v0, v1;
 	v0 = e.fld;
@@ -1587,23 +1572,36 @@
 			break;
 	}
 	v1 = e.fld;
-	GiveSound(e, v0, v1, snd_incr, snd_decr);
 	return (v0 != v1);
 }
 
-float GiveValueRot(entity e, .float fld, .float rotfield, float rottime, .float regenfield, float regentime, float op, float val, string snd_incr, string snd_decr)
+void GiveSound(entity e, float v0, float v1, string snd_incr, string snd_decr)
 {
-	float v0, v1;
-	v0 = e.fld;
-	GiveValue(e, fld, op, val, snd_incr, snd_decr);
-	v1 = e.fld;
+	if(v0 > v1)
+	{
+		if(snd_decr != "")
+			sound (e, CHAN_AUTO, snd_decr, VOL_BASE, ATTN_NORM);
+	}
+	else if(v0 < v1)
+	{
+		if(snd_incr != "")
+			sound (e, CHAN_AUTO, snd_incr, VOL_BASE, ATTN_NORM);
+	}
+}
+
+void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .float regenfield, float regentime)
+{
 	if(v0 < v1)
 		e.rotfield = max(e.rotfield, time + rottime);
 	else if(v0 > v1)
 		e.regenfield = max(e.regenfield, time + regentime);
-	return (v0 != v1);
 }
 
+#define PREGIVE(e,f) float save_##f; save_##f = (e).f
+#define POSTGIVE_BIT(e,f,b,snd_incr,snd_decr) GiveSound((e), save_##f & (b), (e).f & (b), snd_incr, snd_decr)
+#define POSTGIVE_VALUE(e,f,snd_incr,snd_decr) GiveSound((e), save_##f, (e).f, snd_incr, snd_decr)
+#define POSTGIVE_VALUE_ROT(e,f,rotfield,rottime,regenfield,regentime,snd_incr,snd_decr) GiveRot((e), save_##f, (e).f, rotfield, rottime, regenfield, regentime); GiveSound((e), save_##f, (e).f, snd_incr, snd_decr)
+
 float GiveItems(entity e, float beginarg, float endarg)
 {
 	float got, i, j, val, op;
@@ -1621,10 +1619,20 @@
 		if (activator.switchweapon == w_getbestweapon(activator))
 			_switchweapon = TRUE;
 
-	if(activator.strength_finished <= time)
-		activator.strength_finished = time;
-	if(activator.invincible_finished <= time)
-		activator.invincible_finished = time;
+	activator.strength_finished = max(0, activator.strength_finished - time);
+	activator.invincible_finished = max(0, activator.invincible_finished - time);
+	
+	PREGIVE(e, items);
+	PREGIVE(e, weapons);
+	PREGIVE(e, strength_finished);
+	PREGIVE(e, invincible_finished);
+	PREGIVE(e, ammo_nails);
+	PREGIVE(e, ammo_cells);
+	PREGIVE(e, ammo_shells);
+	PREGIVE(e, ammo_rockets);
+	PREGIVE(e, ammo_fuel);
+	PREGIVE(e, armorvalue);
+	PREGIVE(e, health);
 
 	for(i = beginarg; i < endarg; ++i)
 	{
@@ -1654,79 +1662,70 @@
 				op = OP_MINUS;
 				continue;
 			case "ALL":
-				got += GiveBit(e, items, IT_FUEL_REGEN, op, val, "misc/itempickup.wav", string_null);
-				got += GiveValue(e, strength_finished, op, time + val, "misc/powerup.wav", "misc/poweroff.wav");
-				got += GiveValue(e, invincible_finished, op, time + val, "misc/powerup_shield.wav", "misc/poweroff.wav");
-				got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val, "misc/powerup.wav", "misc/poweroff.wav");
+				got += GiveBit(e, items, IT_FUEL_REGEN, op, val);
+				got += GiveValue(e, strength_finished, op, time + val);
+				got += GiveValue(e, invincible_finished, op, time + val);
+				got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
 			case "all":
-				got += GiveBit(e, items, IT_JETPACK, op, val, "misc/powerup.wav", "misc/poweroff.wav");
-				got += GiveValue(e, ammo_cells, op, val, "misc/itempickup.wav", string_null);
-				got += GiveValue(e, ammo_shells, op, val, "misc/itempickup.wav", string_null);
-				got += GiveValue(e, ammo_nails, op, val, "misc/itempickup.wav", string_null);
-				got += GiveValue(e, ammo_rockets, op, val, "misc/itempickup.wav", string_null);
-				got += GiveValueRot(e, health, pauserothealth_finished, cvar("g_balance_pause_health_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), op, val, "misc/megahealth.wav", string_null);
-				got += GiveValueRot(e, armorvalue, pauserotarmor_finished, cvar("g_balance_pause_armor_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), op, val, "misc/armor25.wav", string_null);
-				got += GiveValueRot(e, ammo_fuel, pauserotfuel_finished, cvar("g_balance_pause_fuel_rot"), pauseregen_finished, cvar("g_balance_pause_fuel_regen"), op, val, "misc/itempickup.wav", string_null);
+				got += GiveBit(e, items, IT_JETPACK, op, val);
+				got += GiveValue(e, health, op, val);
+				got += GiveValue(e, armorvalue, op, val);
+			case "allweapons":
 				for(j = WEP_FIRST; j <= WEP_LAST; ++j)
 				{
 					wi = get_weaponinfo(j);
 					if(wi.weapons)
-					{
-						if(e.weapons & wi.weapons)
-						{
-							got += GiveBit(e, weapons, wi.weapons, op, val, "weapons/weaponpickup.wav", "");
-						}
-						else
-						{
-							got += GiveBit(e, weapons, wi.weapons, op, val, "weapons/weaponpickup.wav", "");
-							if(e.weapons & wi.weapons)
-								weapon_action(wi.weapon, WR_PRECACHE);
-						}
-					}
+						got += GiveBit(e, weapons, wi.weapons, op, val);
 				}
+			case "allammo":
+				got += GiveValue(e, ammo_cells, op, val);
+				got += GiveValue(e, ammo_shells, op, val);
+				got += GiveValue(e, ammo_nails, op, val);
+				got += GiveValue(e, ammo_rockets, op, val);
+				got += GiveValue(e, ammo_fuel, op, val);
 				break;
 			case "unlimited_ammo":
-				got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val, "misc/powerup.wav", "misc/poweroff.wav");
+				got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
 				break;
 			case "unlimited_weapon_ammo":
-				got += GiveBit(e, items, IT_UNLIMITED_WEAPON_AMMO, op, val, "misc/powerup.wav", "misc/poweroff.wav");
+				got += GiveBit(e, items, IT_UNLIMITED_WEAPON_AMMO, op, val);
 				break;
 			case "unlimited_superweapons":
-				got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val, "misc/powerup.wav", "misc/poweroff.wav");
+				got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val);
 				break;
 			case "jetpack":
-				got += GiveBit(e, items, IT_JETPACK, op, val, "misc/itempickup.wav", string_null);
+				got += GiveBit(e, items, IT_JETPACK, op, val);
 				break;
 			case "fuel_regen":
-				got += GiveBit(e, items, IT_FUEL_REGEN, op, val, "misc/itempickup.wav", string_null);
+				got += GiveBit(e, items, IT_FUEL_REGEN, op, val);
 				break;
 			case "strength":
-				got += GiveValue(e, strength_finished, op, time + val, "misc/powerup.wav", "misc/poweroff.wav");
+				got += GiveValue(e, strength_finished, op, time + val);
 				break;
 			case "invincible":
-				got += GiveValue(e, invincible_finished, op, time + val, "misc/powerup_shield.wav", "misc/poweroff.wav");
+				got += GiveValue(e, invincible_finished, op, time + val);
 				break;
 			case "cells":
-				got += GiveValue(e, ammo_cells, op, val, "misc/itempickup.wav", string_null);
+				got += GiveValue(e, ammo_cells, op, val);
 				break;
 			case "shells":
-				got += GiveValue(e, ammo_shells, op, val, "misc/itempickup.wav", string_null);
+				got += GiveValue(e, ammo_shells, op, val);
 				break;
 			case "nails":
 			case "bullets":
-				got += GiveValue(e, ammo_nails, op, val, "misc/itempickup.wav", string_null);
+				got += GiveValue(e, ammo_nails, op, val);
 				break;
 			case "rockets":
-				got += GiveValue(e, ammo_rockets, op, val, "misc/itempickup.wav", string_null);
+				got += GiveValue(e, ammo_rockets, op, val);
 				break;
 			case "health":
-				got += GiveValueRot(e, health, pauserothealth_finished, cvar("g_balance_pause_health_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), op, val, "misc/megahealth.wav", string_null);
+				got += GiveValue(e, health, op, val);
 				break;
 			case "armor":
-				got += GiveValueRot(e, armorvalue, pauserotarmor_finished, cvar("g_balance_pause_armor_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), op, val, "misc/armor25.wav", string_null);
+				got += GiveValue(e, armorvalue, op, val);
 				break;
 			case "fuel":
-				got += GiveValueRot(e, ammo_fuel, pauserotfuel_finished, cvar("g_balance_pause_fuel_rot"), pauseregen_finished, cvar("g_balance_pause_fuel_regen"), op, val, "misc/itempickup.wav", string_null);
+				got += GiveValue(e, ammo_fuel, op, val);
 				break;
 			default:
 				for(j = WEP_FIRST; j <= WEP_LAST; ++j)
@@ -1734,16 +1733,7 @@
 					wi = get_weaponinfo(j);
 					if(cmd == wi.netname)
 					{
-						if(e.weapons & wi.weapons)
-						{
-							got += GiveBit(e, weapons, wi.weapons, op, val, "weapons/weaponpickup.wav", "");
-						}
-						else
-						{
-							got += GiveBit(e, weapons, wi.weapons, op, val, "weapons/weaponpickup.wav", "");
-							if(e.weapons & wi.weapons)
-								weapon_action(wi.weapon, WR_PRECACHE);
-						}
+						got += GiveBit(e, weapons, wi.weapons, op, val);
 						break;
 					}
 				}
@@ -1755,10 +1745,39 @@
 		op = OP_SET;
 	}
 
-	if(activator.strength_finished <= time)
+	POSTGIVE_BIT(e, items, IT_FUEL_REGEN, "misc/itempickup.wav", string_null);
+	POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, "misc/powerup.wav", "misc/poweroff.wav");
+	POSTGIVE_BIT(e, items, IT_UNLIMITED_WEAPON_AMMO, "misc/powerup.wav", "misc/poweroff.wav");
+	POSTGIVE_BIT(e, items, IT_JETPACK, "misc/itempickup.wav", string_null);
+	for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+	{
+		wi = get_weaponinfo(j);
+		if(wi.weapons)
+		{
+			POSTGIVE_BIT(e, weapons, wi.weapons, "weapons/weaponpickup.wav", string_null);
+			if not(save_weapons & wi.weapons)
+				if(e.weapons & wi.weapons)
+					weapon_action(wi.weapon, WR_PRECACHE);
+		}
+	}
+	POSTGIVE_VALUE(e, strength_finished, "misc/powerup.wav", "misc/poweroff.wav");
+	POSTGIVE_VALUE(e, invincible_finished, "misc/powerup_shield.wav", "misc/poweroff.wav");
+	POSTGIVE_VALUE(e, ammo_nails, "misc/itempickup.wav", string_null);
+	POSTGIVE_VALUE(e, ammo_cells, "misc/itempickup.wav", string_null);
+	POSTGIVE_VALUE(e, ammo_shells, "misc/itempickup.wav", string_null);
+	POSTGIVE_VALUE(e, ammo_rockets, "misc/itempickup.wav", string_null);
+	POSTGIVE_VALUE_ROT(e, ammo_fuel, pauserotfuel_finished, cvar("g_balance_pause_fuel_rot"), pauseregen_finished, cvar("g_balance_pause_fuel_regen"), "misc/itempickup.wav", string_null);
+	POSTGIVE_VALUE_ROT(e, armorvalue, pauserotarmor_finished, cvar("g_balance_pause_armor_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), "misc/armor25.wav", string_null);
+	POSTGIVE_VALUE_ROT(e, health, pauserothealth_finished, cvar("g_balance_pause_health_rot"), pauseregen_finished, cvar("g_balance_pause_health_regen"), "misc/megahealth.wav", string_null);
+
+	if(activator.strength_finished <= 0)
 		activator.strength_finished = 0;
-	if(activator.invincible_finished <= time)
+	else
+		activator.strength_finished += time;
+	if(activator.invincible_finished <= 0)
 		activator.invincible_finished = 0;
+	else
+		activator.invincible_finished += time;
 
 	if not(activator.weapons & W_WeaponBit(activator.switchweapon))
 		_switchweapon = TRUE;



More information about the nexuiz-commits mailing list