]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/playerdemo.qc
Merge branch 'master' into Mario/vehicles
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / playerdemo.qc
1 #if defined(CSQC)
2 #elif defined(MENUQC)
3 #elif defined(SVQC)
4         #include "../dpdefs/progsdefs.qh"
5     #include "../dpdefs/dpextensions.qh"
6     #include "defs.qh"
7     #include "playerdemo.qh"
8 #endif
9
10 .float playerdemo_fh;
11 .float playerdemo_mode;
12 .float playerdemo_starttime;
13 .float playerdemo_time;
14 const float PLAYERDEMO_MODE_OFF = 0;
15 const float PLAYERDEMO_MODE_READING = 1;
16 const float PLAYERDEMO_MODE_WRITING = 2;
17 void playerdemo_init()
18 {
19         self.playerdemo_mode = PLAYERDEMO_MODE_OFF;
20 }
21 void playerdemo_shutdown()
22 {
23         if(self.playerdemo_mode != PLAYERDEMO_MODE_OFF)
24         {
25                 print("playerdemo: ", self.netname, " closed\n");
26                 fclose(self.playerdemo_fh);
27         }
28         self.playerdemo_mode = 0;
29 }
30 void playerdemo_open_read(string f)
31 {
32         playerdemo_shutdown();
33         self.playerdemo_mode = PLAYERDEMO_MODE_READING;
34         self.playerdemo_fh = fopen(f, FILE_READ);
35         self.playerdemo_starttime = time - 1;
36         self.playerdemo_time = stof(fgets(self.playerdemo_fh));
37         self.playerdemo_time += self.playerdemo_starttime;
38         self.movetype = MOVETYPE_NONE;
39         print("playerdemo: ", self.netname, " reading from ", f, "\n");
40 }
41 void playerdemo_open_write(string f)
42 {
43         playerdemo_shutdown();
44         self.playerdemo_mode = PLAYERDEMO_MODE_WRITING;
45         self.playerdemo_fh = fopen(f, FILE_WRITE);
46         self.playerdemo_starttime = time - 1;
47         print("playerdemo: ", self.netname, " writing to ", f, "\n");
48         print("WARNING: playerdemo file format is incomplete and not stable yet. DO NOT RELY ON IT!\n");
49 }
50 #define PLAYERDEMO_FIELD(func,t,f) func##t(f,#f);
51 #define PLAYERDEMO_FIELDS(func) \
52         PLAYERDEMO_FIELD(func,originvector,origin) \
53         PLAYERDEMO_FIELD(func,vector,angles) \
54         PLAYERDEMO_FIELD(func,sizevector,mins) \
55         PLAYERDEMO_FIELD(func,sizevector,maxs) \
56         PLAYERDEMO_FIELD(func,vector,v_angle) \
57         PLAYERDEMO_FIELD(func,modelstring,model) \
58         PLAYERDEMO_FIELD(func,string,playermodel) \
59         PLAYERDEMO_FIELD(func,float,skin) \
60         PLAYERDEMO_FIELD(func,string,playerskin) \
61         PLAYERDEMO_FIELD(func,float,frame) \
62         PLAYERDEMO_FIELD(func,float,effects) \
63         PLAYERDEMO_FIELD(func,float,switchweapon) \
64         PLAYERDEMO_FIELD(func,float,BUTTON_ATCK) \
65         PLAYERDEMO_FIELD(func,float,BUTTON_ATCK2) \
66         PLAYERDEMO_FIELD(func,float,BUTTON_CROUCH) \
67         PLAYERDEMO_FIELD(func,float,BUTTON_HOOK) \
68         PLAYERDEMO_FIELD(func,float,BUTTON_USE) \
69         PLAYERDEMO_FIELD(func,float,flags) \
70         // end of list
71
72 void playerdemo_write_originvector(.vector f, string name)
73 {
74         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
75 }
76 void playerdemo_write_sizevector(.vector f, string name)
77 {
78         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
79 }
80 void playerdemo_write_vector(.vector f, string name)
81 {
82         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
83 }
84 void playerdemo_write_string(.string f, string name)
85 {
86         fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
87 }
88 void playerdemo_write_modelstring(.string f, string name)
89 {
90         fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
91 }
92 void playerdemo_write_float(.float f, string name)
93 {
94         fputs(self.playerdemo_fh, strcat(ftos(self.(f)), "\n"));
95 }
96 void playerdemo_write()
97 {
98         if(self.playerdemo_mode != PLAYERDEMO_MODE_WRITING)
99                 return;
100         fputs(self.playerdemo_fh, strcat(ftos(time - self.playerdemo_starttime), "\n"));
101         PLAYERDEMO_FIELDS(playerdemo_write_)
102 }
103 void playerdemo_read_originvector(.vector f, string name)
104 {
105         setorigin(self, stov(fgets(self.playerdemo_fh)));
106 }
107 void playerdemo_read_sizevector(.vector f, string name)
108 {
109         self.(f) = stov(fgets(self.playerdemo_fh));
110         setsize(self, self.mins, self.maxs);
111 }
112 void playerdemo_read_vector(.vector f, string name)
113 {
114         self.(f) = stov(fgets(self.playerdemo_fh));
115 }
116 void playerdemo_read_string(.string f, string name)
117 {
118         string s = fgets(self.playerdemo_fh);
119         if (s != self.(f))
120         {
121                 /*
122                 if(self.f)
123                         strunzone(self.f);
124                 */
125                 self.(f) = strzone(s);
126         }
127 }
128 void playerdemo_read_modelstring(.string f, string name)
129 {
130         string s = fgets(self.playerdemo_fh);
131         if (s != self.(f))
132                 setmodel(self, s);
133 }
134 void playerdemo_read_float(.float f, string name)
135 {
136         self.(f) = stof(fgets(self.playerdemo_fh));
137 }
138 float playerdemo_read()
139 {
140         if(self.playerdemo_mode != PLAYERDEMO_MODE_READING)
141                 return 0;
142         if(self.playerdemo_time < 0)
143                 return 1;
144         float t;
145         t = time;
146         while(time >= self.playerdemo_time)
147         {
148                 PLAYERDEMO_FIELDS(playerdemo_read_)
149                 {
150                         time = self.playerdemo_time;
151                         PlayerPreThink();
152                         // not running physics though... this is just so we can run weapon stuff
153                         PlayerPostThink();
154                 }
155                 self.playerdemo_time = stof(fgets(self.playerdemo_fh));
156                 if(self.playerdemo_time == 0)
157                 {
158                         self.playerdemo_time = -1;
159                         return 1;
160                 }
161                 self.playerdemo_time += self.playerdemo_starttime;
162         }
163         self.velocity = '0 0 0';
164         time = t;
165         return 1;
166 }