]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/playermodel.qc
Bot waypoints: save symmetry settings into waypoint files on waypoint save and load...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / playermodel.qc
1 #include "playermodel.qh"
2
3 entity makeXonoticPlayerModelSelector()
4 {
5         entity me;
6         me = NEW(XonoticPlayerModelSelector);
7         me.configureXonoticPlayerModelSelector(me);
8         return me;
9 }
10
11 const float BUFMODELS_TITLE = 0;
12 const float BUFMODELS_IMAGE = 1;
13 const float BUFMODELS_MODEL = 2;
14 const float BUFMODELS_SKIN = 3;
15 const float BUFMODELS_DESC = 4;
16 const float BUFMODELS_COUNT = 5;
17
18 #define XONVOTE186 1 // (nyov) removal of model text description
19
20 void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
21 {
22         me.configureXonoticImage(me, string_null, -1);
23 }
24
25 void XonoticPlayerModelSelector_loadModels(entity me)
26 {
27         int i;
28         string fn;
29
30         float glob = search_begin(language_filename(get_model_datafilename(string_null, -1, "txt")), true, true);
31         if (glob < 0)
32                 return;
33
34         float sortbuf = buf_create();
35         for(i = 0; i < search_getsize(glob); ++i)
36         {
37                 // select model #i!
38                 fn = search_getfilename(glob, i);
39                 if(!get_model_parameters(fn, -1))
40                         continue;
41                 if(get_model_parameters_hidden)
42                         continue;
43                 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
44         }
45         search_end(glob);
46         buf_sort(sortbuf, 128, 0);
47         me.numModels = buf_getsize(sortbuf);
48         me.bufModels = buf_create();
49         for(i = 0; i < me.numModels; ++i)
50         {
51                 fn = substring(bufstr_get(sortbuf, i), 128, -1);
52                 if(!get_model_parameters(fn, -1))
53                         error("But it JUST worked!");
54                 if(get_model_parameters_hidden)
55                         continue;
56                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_TITLE, get_model_parameters_name);
57                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_IMAGE, strcat("/", substring(get_model_datafilename(get_model_parameters_modelname, get_model_parameters_modelskin, "tga"), 0, -5)));
58                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
59                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
60                 get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
61 #if XONVOTE186
62                 if(get_model_parameters_sex)
63                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s", get_model_parameters_sex));
64 #else
65                 if(get_model_parameters_description)
66                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s\n", get_model_parameters_description));
67                 if(get_model_parameters_sex)
68                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nSex: %s", get_model_parameters_sex));
69                 if(get_model_parameters_weight)
70                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nWeight: %g kg", get_model_parameters_weight));
71                 if(get_model_parameters_age)
72                         get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nAge: %g", get_model_parameters_age));
73 #endif
74                 while(substring(get_model_parameters_desc, -1, 1) == "\n")
75                         get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
76                 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
77         }
78         buf_del(sortbuf);
79         get_model_parameters(string_null, 0);
80         me.loadCvars(me); // this will select the initial model, depending on the current cvars
81         me.go(me, 0); // this will set the vars for the selected model
82 }
83
84 void XonoticPlayerModelSelector_destroy(entity me)
85 {
86         if(me.bufModels >= 0)
87         {
88                 buf_del(me.bufModels);
89                 me.bufModels = -1;
90         }
91 }
92
93 void XonoticPlayerModelSelector_loadCvars(entity me)
94 {
95         string skin, modelname;
96         float i;
97
98         skin = cvar_string("_cl_playerskin");
99         modelname = cvar_string("_cl_playermodel");
100
101         for(i = 0; i < me.numModels; ++i)
102         {
103                 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == modelname)
104                 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == skin)
105                         break;
106         }
107         if(i >= me.numModels) // fail
108                 i = 0;
109         me.idxModels = i;
110 }
111
112 void XonoticPlayerModelSelector_go(entity me, float d)
113 {
114         me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
115
116         if(me.currentModel)
117                 strunzone(me.currentModel);
118         if(me.currentModelTitle)
119                 strunzone(me.currentModelTitle);
120         if(me.currentModelImage)
121                 strunzone(me.currentModelImage);
122         if(me.currentModelDescription)
123                 strunzone(me.currentModelDescription);
124
125         // select model #i!
126         me.currentModelTitle = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
127         me.currentModelImage = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
128         me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
129         me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
130         me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
131
132         // fix the image
133         if(draw_PictureSize(me.currentModelImage) == '0 0 0')
134                 me.src = "nopreview_player";
135         else
136                 me.src = me.currentModelImage;
137         me.updateAspect(me);
138 }
139
140 void PlayerModelSelector_Next_Click(entity btn, entity me)
141 {
142         if (me.numModels <= 0)
143                 return;
144         me.go(me, +1);
145         me.saveCvars(me);
146 }
147
148 void PlayerModelSelector_Prev_Click(entity btn, entity me)
149 {
150         if (me.numModels <= 0)
151                 return;
152         me.go(me, -1);
153         me.saveCvars(me);
154 }
155
156 void XonoticPlayerModelSelector_saveCvars(entity me)
157 {
158         // we can't immediately apply here because of flood control
159         cvar_set("_cl_playermodel", me.currentModel);
160         cvar_set("_cl_playerskin", ftos(me.currentSkin));
161 }
162
163 void XonoticPlayerModelSelector_draw(entity me)
164 {
165         float i, n;
166         vector o;
167
168         if (me.numModels <= 0)
169         {
170                 draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, SKINCOLOR_TEXT, 0.6, false);
171                 return;
172         }
173
174         SUPER(XonoticPlayerModelSelector).draw(me);
175         // draw text on the image, handle \n in the description
176
177         draw_beginBoldFont();
178
179 #if XONVOTE186 // (nyov) lower name display looks better when there is no description text
180         draw_CenterText('0.5 0.8 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
181 #else
182         draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
183 #endif
184
185         draw_endBoldFont();
186
187         o = '0.5 1 0' - eY * me.realFontSize.y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
188         for(i = 0; i < n; ++i)
189         {
190                 draw_CenterText(o, argv(i), me.realFontSize, SKINCOLOR_TEXT, 1, false);
191                 o += eY * me.realFontSize.y;
192         }
193 }
194
195 void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
196 {
197         SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
198         me.realFontSize_y = me.fontSize / absSize.y;
199         me.realFontSize_x = me.fontSize / absSize.x;
200 }
201
202 void XonoticPlayerModelSelector_showNotify(entity me)
203 {
204         // Reinitialize self.
205         me.destroy(me);
206         me.loadModels(me);
207 }