]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/csqcmodel_hooks.qc
Merge branch 'master' into divVerent/csqcmodel
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / csqcmodel_hooks.qc
1 .vector glowmod;
2 .float lodmodelindex0;
3 .float lodmodelindex1;
4 .float lodmodelindex2;
5
6 .entity tag_entity;
7 .float tag_index;
8
9 void CSQCModel_Hook_PreDraw(float isplayer)
10 {
11         // auto glowmod from colormap
12         if(isplayer)
13         {
14                 if(self.colormap > 0)
15                         self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? (self.colormap & 0xFF) : stof(getplayerkeyvalue(self.colormap - 1, "colors"))), TRUE) * 2;
16                 else
17                         self.glowmod = '1 1 1';
18
19                 if(self.modelindex && self.model != "null")
20                 {
21                         if(autocvar_cl_playerdetailreduction <= 0)
22                         {
23                                 if(autocvar_cl_playerdetailreduction <= -2)
24                                         self.modelindex = self.lodmodelindex2;
25                                 else if(autocvar_cl_playerdetailreduction <= -1)
26                                         self.modelindex = self.lodmodelindex1;
27                                 else
28                                         self.modelindex = self.lodmodelindex0;
29                         }
30                         else
31                         {
32                                 float distance = vlen(self.origin - other.origin);
33                                 float f = (distance + 100.0) * autocvar_cl_playerdetailreduction;
34                                 f *= 1.0 / bound(0.01, view_quality, 1);
35                                 if(f > autocvar_cl_loddistance2)
36                                         self.modelindex = self.lodmodelindex2;
37                                 else if(f > autocvar_cl_loddistance1)
38                                         self.modelindex = self.lodmodelindex1;
39                                 else
40                                         self.modelindex = self.lodmodelindex0;
41                         }
42                 }
43         }
44
45         if(!isplayer)
46         {
47                 if(self.tag_entity && wasfreed(self.tag_entity))
48                         self.tag_entity = world;
49
50                 if(self.tag_networkentity)
51                 {
52                         // we are ATTACHED!
53                         if(self.tag_entity.entnum == self.tag_networkentity)
54                         {
55                                 // already good
56                                 self.drawmask = MASK_NORMAL;
57                         }
58                         else
59                         {
60                                 // to something NEW NEW NEW NEW!
61                                 self.tag_entity = findfloat(world, entnum, self.tag_networkentity);
62                                 if(self.tag_entity)
63                                 {
64                                         // the best part is: IT EXISTS
65                                         self.drawmask = MASK_NORMAL;
66
67                                         if(substring(self.model, 0, 17) == "models/weapons/v_")
68                                                 if(substring(self.tag_entity.model, 0, 17) == "models/weapons/h_")
69                                                 {
70                                                         self.tag_index = gettagindex(self.tag_entity, "weapon");
71                                                         if(!self.tag_index)
72                                                                 self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
73                                                         if(!self.tag_index)
74                                                         {
75                                                                 // we need to prevent this from 'appening
76                                                                 self.tag_entity = world;
77                                                                 self.drawmask = 0;
78                                                                 dprint("h_ model lacks weapon attachment, but v_ model is attached to it\n");
79                                                         }
80                                                 }
81
82                                         if(substring(self.model, 0, 17) == "models/weapons/v_")
83                                                 if(substring(self.tag_entity.model, 0, 14) == "models/player/")
84                                                 {
85                                                         self.tag_index = gettagindex(self.tag_entity, "tag_weapon");
86                                                         if(!self.tag_index)
87                                                                 self.tag_index = gettagindex(self.tag_entity, "bip01 r hand");
88                                                 }
89
90                                         if(substring(self.tag_entity.model, 0, 17) == "models/weapons/v_")
91                                         {
92                                                 self.tag_index = gettagindex(self.tag_entity, "shot");
93                                                 if(!self.tag_index)
94                                                         self.tag_index = gettagindex(self.tag_entity, "tag_shot");
95                                         }
96                                 }
97                                 else
98                                 {
99                                         // damn, see you next frame
100                                         self.drawmask = 0;
101                                 }
102                         }
103                 }
104                 else
105                 {
106                         // no brain no pain
107                         self.drawmask = MASK_NORMAL;
108                 }
109         }
110 }
111
112 string forceplayermodels_model;
113 float forceplayermodels_modelindex;
114 float forceplayermodels_skin;
115 float forceplayermodels_attempted;
116 .string forceplayermodels_savemodel;
117 .float forceplayermodels_savemodelindex;
118 .float forceplayermodels_saveskin;
119 void CSQCModel_Hook_PreUpdate(float isplayer, float islocalplayer)
120 {
121         if(isplayer)
122         {
123                 // revert to values from server
124                 self.model = self.forceplayermodels_savemodel;
125                 self.modelindex = self.forceplayermodels_savemodelindex;
126                 self.skin = self.forceplayermodels_saveskin;
127         }
128 }
129
130 void CSQCModel_Hook_PostUpdate(float isplayer, float islocalplayer)
131 {
132         if(isplayer)
133         {
134                 // save values set by server
135                 self.forceplayermodels_savemodel = self.model;
136                 self.forceplayermodels_savemodelindex = self.modelindex;
137                 self.forceplayermodels_saveskin = self.skin;
138
139                 if(self.modelindex && self.model != "null")
140                 {
141                         if(islocalplayer)
142                         {
143                                 // trust server's idea of "own player model"
144                                 forceplayermodels_model = self.model;
145                                 forceplayermodels_modelindex = self.modelindex;
146                                 forceplayermodels_skin = self.skin;
147                                 forceplayermodels_attempted = 1;
148                         }
149
150                         if(!forceplayermodels_attempted)
151                         {
152                                 // only if this failed, find it out on our own
153                                 entity e;
154                                 e = spawn();
155                                 setmodel(e, autocvar__cl_playermodel); // this is harmless, see below
156                                 forceplayermodels_model = e.model;
157                                 forceplayermodels_modelindex = e.modelindex;
158                                 forceplayermodels_skin = autocvar__cl_playerskin;
159                                 forceplayermodels_attempted = 1;
160                                 remove(e);
161                         }
162
163                         if(autocvar_cl_forceplayermodels && forceplayermodels_modelindex)
164                         {
165                                 self.model = forceplayermodels_model;
166                                 self.modelindex = forceplayermodels_modelindex;
167                                 self.skin = forceplayermodels_skin;
168                         }
169
170                         // LOD model loading
171                         if(self.lodmodelindex0 != self.modelindex)
172                         {
173                                 string modelname = self.model;
174                                 string s;
175
176                                 if(!fexists(modelname))
177                                 {
178                                         print(sprintf(_("Trying to use non existing model %s. "), modelname));
179                                         modelname = cvar_defstring("_cl_playermodel");
180                                         print(sprintf(_("Reverted to %s."), modelname));
181                                 }
182
183                                 // set modelindex
184                                 self.lodmodelindex0 = self.modelindex;
185                                 self.lodmodelindex1 = self.modelindex;
186                                 self.lodmodelindex2 = self.modelindex;
187
188                                 // FIXME: this only supports 3-letter extensions
189                                 s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4));
190                                 if(fexists(s))
191                                 {
192                                         precache_model(s);
193                                         setmodel(self, s);
194                                         if(self.modelindex)
195                                                 self.lodmodelindex1 = self.modelindex;
196                                 }
197
198                                 s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4));
199                                 if(fexists(s))
200                                 {
201                                         precache_model(s);
202                                         setmodel(self, s);
203                                         if(self.modelindex)
204                                                 self.lodmodelindex2 = self.modelindex;
205                                 }
206
207                                 setmodel(self, modelname); // make everything normal again
208                         }
209                 }
210         }
211 }