5 #include "playerdemo.qh"
9 .float playerdemo_mode;
10 .float playerdemo_starttime;
11 .float playerdemo_time;
12 const float PLAYERDEMO_MODE_OFF = 0;
13 const float PLAYERDEMO_MODE_READING = 1;
14 const float PLAYERDEMO_MODE_WRITING = 2;
15 void playerdemo_init(entity this)
17 this.playerdemo_mode = PLAYERDEMO_MODE_OFF;
19 void playerdemo_shutdown()
21 if(self.playerdemo_mode != PLAYERDEMO_MODE_OFF)
23 LOG_INFO("playerdemo: ", self.netname, " closed\n");
24 fclose(self.playerdemo_fh);
26 self.playerdemo_mode = 0;
28 void playerdemo_open_read(string f)
30 playerdemo_shutdown();
31 self.playerdemo_mode = PLAYERDEMO_MODE_READING;
32 self.playerdemo_fh = fopen(f, FILE_READ);
33 self.playerdemo_starttime = time - 1;
34 self.playerdemo_time = stof(fgets(self.playerdemo_fh));
35 self.playerdemo_time += self.playerdemo_starttime;
36 self.movetype = MOVETYPE_NONE;
37 LOG_INFO("playerdemo: ", self.netname, " reading from ", f, "\n");
39 void playerdemo_open_write(string f)
41 playerdemo_shutdown();
42 self.playerdemo_mode = PLAYERDEMO_MODE_WRITING;
43 self.playerdemo_fh = fopen(f, FILE_WRITE);
44 self.playerdemo_starttime = time - 1;
45 LOG_INFO("playerdemo: ", self.netname, " writing to ", f, "\n");
46 LOG_INFO("WARNING: playerdemo file format is incomplete and not stable yet. DO NOT RELY ON IT!\n");
48 #define PLAYERDEMO_FIELD(func,t,f) func##t(f,#f);
49 #define PLAYERDEMO_FIELDS(func) \
50 PLAYERDEMO_FIELD(func,originvector,origin) \
51 PLAYERDEMO_FIELD(func,vector,angles) \
52 PLAYERDEMO_FIELD(func,sizevector,mins) \
53 PLAYERDEMO_FIELD(func,sizevector,maxs) \
54 PLAYERDEMO_FIELD(func,vector,v_angle) \
55 PLAYERDEMO_FIELD(func,modelstring,model) \
56 PLAYERDEMO_FIELD(func,string,playermodel) \
57 PLAYERDEMO_FIELD(func,float,skin) \
58 PLAYERDEMO_FIELD(func,string,playerskin) \
59 PLAYERDEMO_FIELD(func,float,frame) \
60 PLAYERDEMO_FIELD(func,float,effects) \
61 /* PLAYERDEMO_FIELD(func,float,switchweapon) */ \
62 PLAYERDEMO_FIELD(func,float,BUTTON_ATCK) \
63 PLAYERDEMO_FIELD(func,float,BUTTON_ATCK2) \
64 PLAYERDEMO_FIELD(func,float,BUTTON_CROUCH) \
65 PLAYERDEMO_FIELD(func,float,BUTTON_HOOK) \
66 PLAYERDEMO_FIELD(func,float,BUTTON_USE) \
67 PLAYERDEMO_FIELD(func,float,flags) \
70 void playerdemo_write_originvector(.vector f, string name)
72 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
74 void playerdemo_write_sizevector(.vector f, string name)
76 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
78 void playerdemo_write_vector(.vector f, string name)
80 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
82 void playerdemo_write_string(.string f, string name)
84 fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
86 void playerdemo_write_modelstring(.string f, string name)
88 fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
90 void playerdemo_write_float(.float f, string name)
92 fputs(self.playerdemo_fh, strcat(ftos(self.(f)), "\n"));
94 void playerdemo_write()
96 if(self.playerdemo_mode != PLAYERDEMO_MODE_WRITING)
98 fputs(self.playerdemo_fh, strcat(ftos(time - self.playerdemo_starttime), "\n"));
99 PLAYERDEMO_FIELDS(playerdemo_write_)
101 void playerdemo_read_originvector(.vector f, string name)
103 setorigin(self, stov(fgets(self.playerdemo_fh)));
105 void playerdemo_read_sizevector(.vector f, string name)
107 self.(f) = stov(fgets(self.playerdemo_fh));
108 setsize(self, self.mins, self.maxs);
110 void playerdemo_read_vector(.vector f, string name)
112 self.(f) = stov(fgets(self.playerdemo_fh));
114 void playerdemo_read_string(.string f, string name)
116 string s = fgets(self.playerdemo_fh);
123 self.(f) = strzone(s);
126 void playerdemo_read_modelstring(.string f, string name)
128 string s = fgets(self.playerdemo_fh);
132 void playerdemo_read_float(.float f, string name)
134 self.(f) = stof(fgets(self.playerdemo_fh));
136 float playerdemo_read(entity this)
138 if(this.playerdemo_mode != PLAYERDEMO_MODE_READING)
140 if(this.playerdemo_time < 0)
144 while(time >= this.playerdemo_time)
146 PLAYERDEMO_FIELDS(playerdemo_read_)
148 time = this.playerdemo_time;
149 WITH(entity, self, this, PlayerPreThink());
150 // not running physics though... this is just so we can run weapon stuff
151 WITH(entity, self, this, PlayerPostThink());
153 this.playerdemo_time = stof(fgets(this.playerdemo_fh));
154 if(this.playerdemo_time == 0)
156 this.playerdemo_time = -1;
159 this.playerdemo_time += this.playerdemo_starttime;
161 this.velocity = '0 0 0';