From 9409a6ddeff6d2fb8b077c0cb11e0e392f6eb401 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 21 Nov 2009 14:30:36 +0000 Subject: [PATCH] playerdemos - recording actions of a player and playing them back using bots, to fake multiplayer demos. Still incomplete, and only works correctly with cl_movement 0 (otherwise you get minor changes on playback). Cvars and commands for this have not really been made yet, and will come later. git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8301 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_client.qc | 6 +++++ data/qcsrc/server/cl_physics.qc | 42 +++++++++++++++++--------------- data/qcsrc/server/gamecommand.qc | 32 ++++++++++++++++++++++++ data/qcsrc/server/progs.src | 4 +++ 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 7c324f10b..02a8ea7ec 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -1324,6 +1324,8 @@ void ClientConnect (void) ClientData_Attach(); bot_clientconnect(); + + playerdemo_init(); race_PreSpawnObserver(); @@ -1514,6 +1516,8 @@ void ClientDisconnect (void) self.hitplotfh = -1; } + playerdemo_shutdown(); + bot_clientdisconnect(); if(self.entcs) @@ -3003,4 +3007,6 @@ void PlayerPostThink (void) if(self.waypointsprite_attachedforcarrier) WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, cvar("g_balance_armor_blockpercent"))); + + playerdemo_write(); } diff --git a/data/qcsrc/server/cl_physics.qc b/data/qcsrc/server/cl_physics.qc index 565077765..f0a9bcaf2 100644 --- a/data/qcsrc/server/cl_physics.qc +++ b/data/qcsrc/server/cl_physics.qc @@ -680,9 +680,31 @@ void SV_PlayerPhysics() } self.shtest_accumulator += frametime; + if (self.punchangle != '0 0 0') + { + f = vlen(self.punchangle) - 10 * frametime; + if (f > 0) + self.punchangle = normalize(self.punchangle) * f; + else + self.punchangle = '0 0 0'; + } + + if (self.punchvector != '0 0 0') + { + f = vlen(self.punchvector) - 30 * frametime; + if (f > 0) + self.punchvector = normalize(self.punchvector) * f; + else + self.punchvector = '0 0 0'; + } + if (clienttype(self) == CLIENTTYPE_BOT) + { + if(playerdemo_read()) + return; bot_think(); - + } + self.items &~= IT_USING_JETPACK; if(self.classname == "player") @@ -715,24 +737,6 @@ void SV_PlayerPhysics() if (self.movetype == MOVETYPE_NONE) return; - if (self.punchangle != '0 0 0') - { - f = vlen(self.punchangle) - 10 * frametime; - if (f > 0) - self.punchangle = normalize(self.punchangle) * f; - else - self.punchangle = '0 0 0'; - } - - if (self.punchvector != '0 0 0') - { - f = vlen(self.punchvector) - 30 * frametime; - if (f > 0) - self.punchvector = normalize(self.punchvector) * f; - else - self.punchvector = '0 0 0'; - } - maxspd_mod = 1; if(g_runematch) diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index 19cb6b748..3b5591b7c 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -1050,6 +1050,38 @@ void GameCommand(string command) return; } + if(argv(0) == "playerdemo") + { + if(argv(1) == "load") + { + entno = stof(argv(2)); + if((entno < 1) | (entno > maxclients)) { + print("Player ", argv(2), " doesn't exist\n"); + return; + } + client = edict_num(entno); + if(clienttype(client) != CLIENTTYPE_BOT) { + print("Player ", client.netname, " is not a bot\n"); + return; + } + self = client; + playerdemo_open_read(argv(3)); + return; + } + else if(argv(1) == "write") + { + entno = stof(argv(2)); + if((entno < 1) | (entno > maxclients)) { + print("Player ", argv(2), " doesn't exist\n"); + return; + } + client = edict_num(entno); + self = client; + playerdemo_open_write(argv(3)); + return; + } + } + print("Invalid command. For a list of supported commands, try sv_cmd help.\n"); } diff --git a/data/qcsrc/server/progs.src b/data/qcsrc/server/progs.src index 3c636a907..4c1a32e70 100644 --- a/data/qcsrc/server/progs.src +++ b/data/qcsrc/server/progs.src @@ -41,6 +41,8 @@ antilag.qh vote.qh +playerdemo.qh + scores_rules.qc miscfunctions.qc @@ -170,3 +172,5 @@ monsters/monster_zombie.qc csqcprojectile.qc ../common/mathlib.qc + +playerdemo.qc -- 2.39.2