From 2ab37e6c5b9742c6561cebd084822ea70f7dfb49 Mon Sep 17 00:00:00 2001
From: Rudolf Polzer <divverent@alientrap.org>
Date: Sat, 1 Oct 2011 16:39:57 +0200
Subject: [PATCH] rewrite the use key system to always rely on the impulse for
 impulse actions, and use the button state for stuff that needs to know
 whether the button is held

---
 defaultXonotic.cfg                |  4 +++-
 qcsrc/server/bot/bot.qc           |  2 +-
 qcsrc/server/bot/scripting.qc     | 22 +++++++++++-----------
 qcsrc/server/cl_client.qc         | 10 +++++-----
 qcsrc/server/cl_physics.qc        |  4 ++--
 qcsrc/server/defs.qh              |  3 ++-
 qcsrc/server/g_world.qc           |  2 +-
 qcsrc/server/playerdemo.qc        |  2 +-
 qcsrc/server/vehicles/vehicles.qc |  2 +-
 9 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg
index a0d50e3e7..a290a0b4f 100644
--- a/defaultXonotic.cfg
+++ b/defaultXonotic.cfg
@@ -53,6 +53,8 @@ alias asay_drop "say_team (%l) dropped %w ; impulse 17"
 alias +hook +button6
 alias -hook -button6
 alias use "impulse 21"
+alias +usekey "use; +button10"
+alias -usekey "-button10"
 alias ready "cmd ready"
 alias lockteams "sv_cmd lockteams"
 alias unlockteams "sv_cmd unlockteams"
@@ -1039,7 +1041,7 @@ bind r reload
 bind BACKSPACE dropweapon
 bind g dropweapon
 // TODO change this to "use" once we can
-bind f +use
+bind f +usekey
 
 // misc
 bind e +hook
diff --git a/qcsrc/server/bot/bot.qc b/qcsrc/server/bot/bot.qc
index 351625bb5..0693dc913 100644
--- a/qcsrc/server/bot/bot.qc
+++ b/qcsrc/server/bot/bot.qc
@@ -79,7 +79,7 @@ void bot_think()
 	self.BUTTON_INFO = 0;
 	self.button8 = 0;
 	self.BUTTON_CHAT = 0;
-	self.BUTTON_USE = 0;
+	self.BUTTON_USELEGACY = 0;
 
 	if (time < game_starttime)
 	{
diff --git a/qcsrc/server/bot/scripting.qc b/qcsrc/server/bot/scripting.qc
index 63151cac1..fe6212e1f 100644
--- a/qcsrc/server/bot/scripting.qc
+++ b/qcsrc/server/bot/scripting.qc
@@ -889,7 +889,7 @@ float bot_presskeys()
 	self.BUTTON_CROUCH = FALSE;
 	self.BUTTON_ATCK = FALSE;
 	self.BUTTON_ATCK2 = FALSE;
-	self.BUTTON_USE = FALSE;
+	self.BUTTON_USELEGACY = FALSE;
 	self.BUTTON_HOOK = FALSE;
 	self.BUTTON_CHAT = FALSE;
 
@@ -919,7 +919,7 @@ float bot_presskeys()
 		self.BUTTON_ATCK2 = TRUE;
 
 	if(self.bot_cmd_keys & BOT_CMD_KEY_USE)
-		self.BUTTON_USE = TRUE;
+		self.BUTTON_USELEGACY = TRUE;
 
 	if(self.bot_cmd_keys & BOT_CMD_KEY_HOOK)
 		self.BUTTON_HOOK = TRUE;
@@ -1047,15 +1047,15 @@ float bot_cmd_releasekey()
 
 float bot_cmd_pause()
 {
-	self.button1        = 0;
-	self.button8        = 0;
-	self.BUTTON_USE     = 0;
-	self.BUTTON_ATCK    = 0;
-	self.BUTTON_JUMP    = 0;
-	self.BUTTON_HOOK    = 0;
-	self.BUTTON_CHAT    = 0;
-	self.BUTTON_ATCK2   = 0;
-	self.BUTTON_CROUCH  = 0;
+	self.button1          = 0;
+	self.button8          = 0;
+	self.BUTTON_USELEGACY = 0;
+	self.BUTTON_ATCK      = 0;
+	self.BUTTON_JUMP      = 0;
+	self.BUTTON_HOOK      = 0;
+	self.BUTTON_CHAT      = 0;
+	self.BUTTON_ATCK2     = 0;
+	self.BUTTON_CROUCH    = 0;
 
 	self.movement = '0 0 0';
 	self.bot_cmd_keys = BOT_CMD_KEY_NONE;
diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc
index bddb59332..b1a2ef050 100644
--- a/qcsrc/server/cl_client.qc
+++ b/qcsrc/server/cl_client.qc
@@ -2327,7 +2327,7 @@ void SpectateCopy(entity spectatee) {
 	self.dmg_save = spectatee.dmg_save;
 	self.dmg_inflictor = spectatee.dmg_inflictor;
 	self.angles = spectatee.v_angle;
-	if(!self.BUTTON_USE)
+	if(!(self.BUTTON_USELEGACY || self.BUTTON_USEPRESSED))
 		self.fixangle = TRUE;
 	setorigin(self, spectatee.origin);
 	setsize(self, spectatee.mins, spectatee.maxs);
@@ -2605,7 +2605,7 @@ void ObserverThink()
 				self.classname = "spectator";
 			}
 		} else {
-			prefered_movetype = ((!self.BUTTON_USE ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP);
+			prefered_movetype = ((!(self.BUTTON_USELEGACY || self.BUTTON_USEPRESSED) ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP);
 			if (self.movetype != prefered_movetype)
 				self.movetype = prefered_movetype;
 		}
@@ -2774,9 +2774,9 @@ void PlayerPreThink (void)
 
 	MUTATOR_CALLHOOK(PlayerPreThink);
 
-	if(self.BUTTON_USE && !self.usekeypressed)
+	if(self.BUTTON_USELEGACY && !self.usekeypressed)
 		PlayerUseKey();
-	self.usekeypressed = self.BUTTON_USE;
+	self.usekeypressed = self.BUTTON_USELEGACY;
 
 	PrintWelcomeMessage();
 
@@ -2860,7 +2860,7 @@ void PlayerPreThink (void)
 			{
 				if(frametime)
 					player_anim();
-				button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USE);
+				button_pressed = (self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USELEGACY || self.BUTTON_USEPRESSED);
 				force_respawn = (g_lms || g_ca || g_cts || autocvar_g_forced_respawn);
 				if (self.deadflag == DEAD_DYING)
 				{
diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc
index b7e8bc226..f629297cc 100644
--- a/qcsrc/server/cl_physics.qc
+++ b/qcsrc/server/cl_physics.qc
@@ -752,7 +752,7 @@ void SV_PlayerPhysics()
 
 	anticheat_physics();
 
-	buttons = self.BUTTON_ATCK + 2 * self.BUTTON_JUMP + 4 * self.BUTTON_ATCK2 + 8 * self.BUTTON_ZOOM + 16 * self.BUTTON_CROUCH + 32 * self.BUTTON_HOOK + 64 * self.BUTTON_USE + 128 * (self.movement_x < 0) + 256 * (self.movement_x > 0) + 512 * (self.movement_y < 0) + 1024 * (self.movement_y > 0);
+	buttons = self.BUTTON_ATCK + 2 * self.BUTTON_JUMP + 4 * self.BUTTON_ATCK2 + 8 * self.BUTTON_ZOOM + 16 * self.BUTTON_CROUCH + 32 * self.BUTTON_HOOK + 64 * (self.BUTTON_USELEGACY || self.BUTTON_USEPRESSED) + 128 * (self.movement_x < 0) + 256 * (self.movement_x > 0) + 512 * (self.movement_y < 0) + 1024 * (self.movement_y > 0);
 
 	if(!buttons)
 		c = "x";
@@ -799,7 +799,7 @@ void SV_PlayerPhysics()
 	{
 		// slight annoyance for nick change scripts
 		self.movement = -1 * self.movement;
-		self.BUTTON_ATCK = self.BUTTON_JUMP = self.BUTTON_ATCK2 = self.BUTTON_ZOOM = self.BUTTON_CROUCH = self.BUTTON_HOOK = self.BUTTON_USE = 0;
+		self.BUTTON_ATCK = self.BUTTON_JUMP = self.BUTTON_ATCK2 = self.BUTTON_ZOOM = self.BUTTON_CROUCH = self.BUTTON_HOOK = self.BUTTON_USELEGACY = self.BUTTON_USEPRESSED = 0;
 
 		if(self.nickspamcount >= autocvar_g_nick_flood_penalty_red) // if you are persistent and the slight annoyance above does not stop you, I'll show you!
 		{
diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh
index bc05d1b04..a71df8f2e 100644
--- a/qcsrc/server/defs.qh
+++ b/qcsrc/server/defs.qh
@@ -10,9 +10,10 @@ float require_spawnfunc_prefix; // if this float exists, only functions with spa
 #define BUTTON_HOOK       button6
 #define BUTTON_INFO       button7
 #define BUTTON_CHAT       buttonchat
-#define BUTTON_USE        buttonuse
+#define BUTTON_USELEGACY  buttonuse
 #define BUTTON_DRAG       button8
 #define BUTTON_ZOOMSCRIPT button9
+#define BUTTON_USEPRESSED button10
 
 // Globals
 
diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc
index 09daa245a..a5e3a080c 100644
--- a/qcsrc/server/g_world.qc
+++ b/qcsrc/server/g_world.qc
@@ -1356,7 +1356,7 @@ void IntermissionThink()
 		return;
 
 	if(!mapvote_initialized)
-		if (time < intermission_exittime + 10 && !self.BUTTON_ATCK && !self.BUTTON_JUMP && !self.BUTTON_ATCK2 && !self.BUTTON_HOOK && !self.BUTTON_USE)
+		if (time < intermission_exittime + 10 || !(self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_ATCK2 || self.BUTTON_HOOK || self.BUTTON_USELEGACY || self.BUTTON_USEPRESSED))
 			return;
 
 	MapVote_Start();
diff --git a/qcsrc/server/playerdemo.qc b/qcsrc/server/playerdemo.qc
index 631c10dcb..e334de72e 100644
--- a/qcsrc/server/playerdemo.qc
+++ b/qcsrc/server/playerdemo.qc
@@ -49,6 +49,7 @@ void playerdemo_open_write(string f)
 	PLAYERDEMO_FIELD(func,string,playermodel) \
 	PLAYERDEMO_FIELD(func,float,skin) \
 	PLAYERDEMO_FIELD(func,string,playerskin) \
+	PLAYERDEMO_FIELD(func,float,impulse) \
 	PLAYERDEMO_FIELD(func,float,frame) \
 	PLAYERDEMO_FIELD(func,float,effects) \
 	PLAYERDEMO_FIELD(func,float,switchweapon) \
@@ -56,7 +57,6 @@ void playerdemo_open_write(string f)
 	PLAYERDEMO_FIELD(func,float,BUTTON_ATCK2) \
 	PLAYERDEMO_FIELD(func,float,BUTTON_CROUCH) \
 	PLAYERDEMO_FIELD(func,float,BUTTON_HOOK) \
-	PLAYERDEMO_FIELD(func,float,BUTTON_USE) \
 	PLAYERDEMO_FIELD(func,float,flags) \
 	// end of list
 
diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc
index 6006dcf92..dd59ebb98 100644
--- a/qcsrc/server/vehicles/vehicles.qc
+++ b/qcsrc/server/vehicles/vehicles.qc
@@ -606,7 +606,7 @@ void vehicles_exit(float eject)
         self.owner.event_damage   = PlayerDamage;
         self.owner.hud            = HUD_NORMAL;
         self.owner.switchweapon   = self.switchweapon;
-        //self.owner.BUTTON_USE     = 0;
+        //self.owner.BUTTON_USELEGACY     = 0;
     }
 
     if(self.deadflag == DEAD_NO)
-- 
2.39.5