1 #include "playerdemo.qh"
6 #include "playerdemo.qh"
10 .float playerdemo_mode;
11 .float playerdemo_starttime;
12 .float playerdemo_time;
13 const float PLAYERDEMO_MODE_OFF = 0;
14 const float PLAYERDEMO_MODE_READING = 1;
15 const float PLAYERDEMO_MODE_WRITING = 2;
16 void playerdemo_init(entity this)
18 this.playerdemo_mode = PLAYERDEMO_MODE_OFF;
20 void playerdemo_shutdown()
22 if(self.playerdemo_mode != PLAYERDEMO_MODE_OFF)
24 LOG_INFO("playerdemo: ", self.netname, " closed\n");
25 fclose(self.playerdemo_fh);
27 self.playerdemo_mode = 0;
29 void playerdemo_open_read(string f)
31 playerdemo_shutdown();
32 self.playerdemo_mode = PLAYERDEMO_MODE_READING;
33 self.playerdemo_fh = fopen(f, FILE_READ);
34 self.playerdemo_starttime = time - 1;
35 self.playerdemo_time = stof(fgets(self.playerdemo_fh));
36 self.playerdemo_time += self.playerdemo_starttime;
37 self.movetype = MOVETYPE_NONE;
38 LOG_INFO("playerdemo: ", self.netname, " reading from ", f, "\n");
40 void playerdemo_open_write(string f)
42 playerdemo_shutdown();
43 self.playerdemo_mode = PLAYERDEMO_MODE_WRITING;
44 self.playerdemo_fh = fopen(f, FILE_WRITE);
45 self.playerdemo_starttime = time - 1;
46 LOG_INFO("playerdemo: ", self.netname, " writing to ", f, "\n");
47 LOG_INFO("WARNING: playerdemo file format is incomplete and not stable yet. DO NOT RELY ON IT!\n");
49 #define PLAYERDEMO_FIELD(func,t,f) func##t(f,#f);
50 #define PLAYERDEMO_FIELDS(func) \
51 PLAYERDEMO_FIELD(func,originvector,origin) \
52 PLAYERDEMO_FIELD(func,vector,angles) \
53 PLAYERDEMO_FIELD(func,sizevector,mins) \
54 PLAYERDEMO_FIELD(func,sizevector,maxs) \
55 PLAYERDEMO_FIELD(func,vector,v_angle) \
56 PLAYERDEMO_FIELD(func,modelstring,model) \
57 PLAYERDEMO_FIELD(func,string,playermodel) \
58 PLAYERDEMO_FIELD(func,float,skin) \
59 PLAYERDEMO_FIELD(func,string,playerskin) \
60 PLAYERDEMO_FIELD(func,float,frame) \
61 PLAYERDEMO_FIELD(func,float,effects) \
62 /* PLAYERDEMO_FIELD(func,float,switchweapon) */ \
63 PLAYERDEMO_FIELD(func,float,button0) /* TODO: PHYS_INPUT_BUTTON_ATCK */ \
64 PLAYERDEMO_FIELD(func,float,button3) /* TODO: PHYS_INPUT_BUTTON_ATCK2 */ \
65 PLAYERDEMO_FIELD(func,float,button5) /* TODO: PHYS_INPUT_BUTTON_CROUCH */ \
66 PLAYERDEMO_FIELD(func,float,button6) /* TODO: PHYS_INPUT_BUTTON_HOOK */ \
67 PLAYERDEMO_FIELD(func,float,buttonuse) /* TODO: PHYS_INPUT_BUTTON_USE */ \
68 PLAYERDEMO_FIELD(func,float,flags) \
71 void playerdemo_write_originvector(.vector f, string name)
73 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
75 void playerdemo_write_sizevector(.vector f, string name)
77 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
79 void playerdemo_write_vector(.vector f, string name)
81 fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
83 void playerdemo_write_string(.string f, string name)
85 fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
87 void playerdemo_write_modelstring(.string f, string name)
89 fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
91 void playerdemo_write_float(.float f, string name)
93 fputs(self.playerdemo_fh, strcat(ftos(self.(f)), "\n"));
95 void playerdemo_write()
97 if(this.playerdemo_mode != PLAYERDEMO_MODE_WRITING)
99 fputs(this.playerdemo_fh, strcat(ftos(time - this.playerdemo_starttime), "\n"));
100 PLAYERDEMO_FIELDS(playerdemo_write_)
102 void playerdemo_read_originvector(.vector f, string name)
104 setorigin(self, stov(fgets(self.playerdemo_fh)));
106 void playerdemo_read_sizevector(.vector f, string name)
108 self.(f) = stov(fgets(self.playerdemo_fh));
109 setsize(self, self.mins, self.maxs);
111 void playerdemo_read_vector(.vector f, string name)
113 self.(f) = stov(fgets(self.playerdemo_fh));
115 void playerdemo_read_string(.string f, string name)
117 string s = fgets(self.playerdemo_fh);
124 self.(f) = strzone(s);
127 void playerdemo_read_modelstring(.string f, string name)
129 string s = fgets(self.playerdemo_fh);
133 void playerdemo_read_float(.float f, string name)
135 self.(f) = stof(fgets(self.playerdemo_fh));
137 float playerdemo_read(entity this)
139 if(this.playerdemo_mode != PLAYERDEMO_MODE_READING)
141 if(this.playerdemo_time < 0)
145 while(time >= this.playerdemo_time)
147 PLAYERDEMO_FIELDS(playerdemo_read_)
149 time = this.playerdemo_time;
150 WITHSELF(this, PlayerPreThink());
151 // not running physics though... this is just so we can run weapon stuff
152 WITHSELF(this, PlayerPostThink());
154 this.playerdemo_time = stof(fgets(this.playerdemo_fh));
155 if(this.playerdemo_time == 0)
157 this.playerdemo_time = -1;
160 this.playerdemo_time += this.playerdemo_starttime;
162 this.velocity = '0 0 0';