]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/playerdemo.qc
Merge branch 'master' into TimePath/notifications
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / playerdemo.qc
1 #if defined(CSQC)
2 #elif defined(MENUQC)
3 #elif defined(SVQC)
4     #include "defs.qh"
5     #include "playerdemo.qh"
6 #endif
7
8 .float playerdemo_fh;
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)
16 {
17         this.playerdemo_mode = PLAYERDEMO_MODE_OFF;
18 }
19 void playerdemo_shutdown()
20 {SELFPARAM();
21         if(self.playerdemo_mode != PLAYERDEMO_MODE_OFF)
22         {
23                 LOG_INFO("playerdemo: ", self.netname, " closed\n");
24                 fclose(self.playerdemo_fh);
25         }
26         self.playerdemo_mode = 0;
27 }
28 void playerdemo_open_read(string f)
29 {SELFPARAM();
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");
38 }
39 void playerdemo_open_write(string f)
40 {SELFPARAM();
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");
47 }
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,button0) /* TODO: PHYS_INPUT_BUTTON_ATCK */ \
63         PLAYERDEMO_FIELD(func,float,button3) /* TODO: PHYS_INPUT_BUTTON_ATCK2 */ \
64         PLAYERDEMO_FIELD(func,float,button5) /* TODO: PHYS_INPUT_BUTTON_CROUCH */ \
65         PLAYERDEMO_FIELD(func,float,button6) /* TODO: PHYS_INPUT_BUTTON_HOOK */ \
66         PLAYERDEMO_FIELD(func,float,buttonuse) /* TODO: PHYS_INPUT_BUTTON_USE */ \
67         PLAYERDEMO_FIELD(func,float,flags) \
68         // end of list
69
70 void playerdemo_write_originvector(.vector f, string name)
71 {SELFPARAM();
72         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
73 }
74 void playerdemo_write_sizevector(.vector f, string name)
75 {SELFPARAM();
76         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
77 }
78 void playerdemo_write_vector(.vector f, string name)
79 {SELFPARAM();
80         fputs(self.playerdemo_fh, strcat(vtos(self.(f)), "\n"));
81 }
82 void playerdemo_write_string(.string f, string name)
83 {SELFPARAM();
84         fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
85 }
86 void playerdemo_write_modelstring(.string f, string name)
87 {SELFPARAM();
88         fputs(self.playerdemo_fh, strcat(self.(f), "\n"));
89 }
90 void playerdemo_write_float(.float f, string name)
91 {SELFPARAM();
92         fputs(self.playerdemo_fh, strcat(ftos(self.(f)), "\n"));
93 }
94 void playerdemo_write()
95 {SELFPARAM();
96         if(self.playerdemo_mode != PLAYERDEMO_MODE_WRITING)
97                 return;
98         fputs(self.playerdemo_fh, strcat(ftos(time - self.playerdemo_starttime), "\n"));
99         PLAYERDEMO_FIELDS(playerdemo_write_)
100 }
101 void playerdemo_read_originvector(.vector f, string name)
102 {SELFPARAM();
103         setorigin(self, stov(fgets(self.playerdemo_fh)));
104 }
105 void playerdemo_read_sizevector(.vector f, string name)
106 {SELFPARAM();
107         self.(f) = stov(fgets(self.playerdemo_fh));
108         setsize(self, self.mins, self.maxs);
109 }
110 void playerdemo_read_vector(.vector f, string name)
111 {SELFPARAM();
112         self.(f) = stov(fgets(self.playerdemo_fh));
113 }
114 void playerdemo_read_string(.string f, string name)
115 {SELFPARAM();
116         string s = fgets(self.playerdemo_fh);
117         if (s != self.(f))
118         {
119                 /*
120                 if(self.f)
121                         strunzone(self.f);
122                 */
123                 self.(f) = strzone(s);
124         }
125 }
126 void playerdemo_read_modelstring(.string f, string name)
127 {SELFPARAM();
128         string s = fgets(self.playerdemo_fh);
129         if (s != self.(f))
130                 _setmodel(self, s);
131 }
132 void playerdemo_read_float(.float f, string name)
133 {SELFPARAM();
134         self.(f) = stof(fgets(self.playerdemo_fh));
135 }
136 float playerdemo_read(entity this)
137 {
138         if(this.playerdemo_mode != PLAYERDEMO_MODE_READING)
139                 return 0;
140         if(this.playerdemo_time < 0)
141                 return 1;
142         float t;
143         t = time;
144         while(time >= this.playerdemo_time)
145         {
146                 PLAYERDEMO_FIELDS(playerdemo_read_)
147                 {
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());
152                 }
153                 this.playerdemo_time = stof(fgets(this.playerdemo_fh));
154                 if(this.playerdemo_time == 0)
155                 {
156                         this.playerdemo_time = -1;
157                         return 1;
158                 }
159                 this.playerdemo_time += this.playerdemo_starttime;
160         }
161         this.velocity = '0 0 0';
162         time = t;
163         return 1;
164 }