2 CLASS(XonoticPlayerModelSelector) EXTENDS(XonoticImage)
3 METHOD(XonoticPlayerModelSelector, configureXonoticPlayerModelSelector, void(entity))
4 METHOD(XonoticPlayerModelSelector, loadCvars, void(entity))
5 METHOD(XonoticPlayerModelSelector, saveCvars, void(entity))
6 METHOD(XonoticPlayerModelSelector, draw, void(entity))
7 METHOD(XonoticPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector))
8 ATTRIB(XonoticPlayerModelSelector, currentModel, string, string_null)
9 ATTRIB(XonoticPlayerModelSelector, currentSkin, float, 0)
10 ATTRIB(XonoticPlayerModelSelector, currentModelImage, string, string_null)
11 ATTRIB(XonoticPlayerModelSelector, currentModelTitle, string, string_null)
12 ATTRIB(XonoticPlayerModelSelector, currentModelDescription, string, string_null)
13 METHOD(XonoticPlayerModelSelector, go, void(entity, float))
14 METHOD(XonoticPlayerModelSelector, destroy, void(entity))
15 ATTRIB(XonoticPlayerModelSelector, origin, vector, '0 0 0')
16 ATTRIB(XonoticPlayerModelSelector, size, vector, '0 0 0')
17 ATTRIB(XonoticPlayerModelSelector, realFontSize, vector, '0 0 0')
18 ATTRIB(XonoticPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
19 ATTRIB(XonoticPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
20 ATTRIB(XonoticPlayerModelSelector, bufModels, float, -1)
21 ATTRIB(XonoticPlayerModelSelector, numModels, float, -1)
22 ATTRIB(XonoticPlayerModelSelector, idxModels, float, -1)
23 ENDCLASS(XonoticPlayerModelSelector)
24 entity makeXonoticPlayerModelSelector();
25 void PlayerModelSelector_Next_Click(entity btn, entity me);
26 void PlayerModelSelector_Prev_Click(entity btn, entity me);
30 entity makeXonoticPlayerModelSelector()
33 me = spawnXonoticPlayerModelSelector();
34 me.configureXonoticPlayerModelSelector(me);
38 #define BUFMODELS_TITLE 0
39 #define BUFMODELS_IMAGE 1
40 #define BUFMODELS_MODEL 2
41 #define BUFMODELS_SKIN 3
42 #define BUFMODELS_DESC 4
43 #define BUFMODELS_COUNT 5
45 void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
47 float sortbuf, glob, i;
50 glob = search_begin(get_model_datafilename(string_null, -1, "txt"), TRUE, TRUE);
54 me.configureXonoticImage(me, string_null, -1);
56 sortbuf = buf_create();
57 for(i = 0; i < search_getsize(glob); ++i)
60 fn = search_getfilename(glob, i);
61 if(!get_model_parameters(fn, -1))
63 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
66 buf_sort(sortbuf, 128, 0);
67 me.numModels = buf_getsize(sortbuf);
68 me.bufModels = buf_create();
69 for(i = 0; i < me.numModels; ++i)
71 fn = substring(bufstr_get(sortbuf, i), 128, -1);
72 if(!get_model_parameters(fn, -1))
73 error("But it JUST worked!");
74 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_TITLE, get_model_parameters_name);
75 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)));
76 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
77 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
78 get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
79 if(get_model_parameters_sex)
80 get_model_parameters_desc = strcat(get_model_parameters_desc, "\nSex: ", get_model_parameters_sex);
81 if(get_model_parameters_weight)
82 get_model_parameters_desc = strcat(get_model_parameters_desc, "\nWeight: ", ftos(get_model_parameters_weight), " kg");
83 if(get_model_parameters_age)
84 get_model_parameters_desc = strcat(get_model_parameters_desc, "\nAge: ", ftos(get_model_parameters_age));
85 while(substring(get_model_parameters_desc, -1, 1) == "\n")
86 get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
87 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
90 get_model_parameters(string_null, 0);
93 void XonoticPlayerModelSelector_destroy(entity me)
95 buf_del(me.bufModels);
99 void XonoticPlayerModelSelector_loadCvars(entity me)
103 strunzone(me.currentModel);
104 me.currentSkin = cvar("_cl_playerskin");
105 me.currentModel = strzone(cvar_string("_cl_playermodel"));
106 for(i = 0; i < me.numModels; ++i)
108 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == me.currentModel)
109 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == ftos(me.currentSkin))
112 if(i >= me.numModels) // fail
115 me.go(me, 0); // this will set the other vars for currentSkin and currentModel
118 void XonoticPlayerModelSelector_go(entity me, float d)
120 if (me.numModels <= 0)
122 me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
125 strunzone(me.currentModel);
126 if(me.currentModelTitle)
127 strunzone(me.currentModelTitle);
128 if(me.currentModelImage)
129 strunzone(me.currentModelImage);
130 if(me.currentModelDescription)
131 strunzone(me.currentModelDescription);
134 me.currentModelTitle = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
135 me.currentModelImage = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
136 me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
137 me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
138 me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
141 me.src = me.currentModelImage;
145 void PlayerModelSelector_Next_Click(entity btn, entity me)
147 if (me.numModels <= 0)
153 void PlayerModelSelector_Prev_Click(entity btn, entity me)
155 if (me.numModels <= 0)
161 void XonoticPlayerModelSelector_saveCvars(entity me)
163 // we can't immediately apply here because of flood control
164 cvar_set("_cl_playermodel", me.currentModel);
165 cvar_set("_cl_playerskin", ftos(me.currentSkin));
168 void XonoticPlayerModelSelector_draw(entity me)
173 if (me.numModels <= 0)
175 draw_CenterText('0.5 0.5 0', "<no model found>", me.realFontSize, '1 1 1', 0.6, FALSE);
179 SUPER(XonoticPlayerModelSelector).draw(me);
180 // draw text on the image, handle \n in the description
181 draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, FALSE);
183 o = '0.5 1 0' - eY * me.realFontSize_y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
184 for(i = 0; i < n; ++i)
186 draw_CenterText(o, argv(i), me.realFontSize, '1 1 1', 1, FALSE);
187 o += eY * me.realFontSize_y;
191 void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
193 SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
194 me.realFontSize_y = me.fontSize / absSize_y;
195 me.realFontSize_x = me.fontSize / absSize_x;