4 CLASS(XonoticPlayerModelSelector, XonoticImage)
5 METHOD(XonoticPlayerModelSelector, configureXonoticPlayerModelSelector, void(entity));
6 METHOD(XonoticPlayerModelSelector, loadCvars, void(entity));
7 METHOD(XonoticPlayerModelSelector, saveCvars, void(entity));
8 METHOD(XonoticPlayerModelSelector, draw, void(entity));
9 METHOD(XonoticPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector));
10 METHOD(XonoticPlayerModelSelector, showNotify, void(entity));
11 ATTRIB(XonoticPlayerModelSelector, currentModel, string, string_null)
12 ATTRIB(XonoticPlayerModelSelector, currentSkin, float, 0)
13 ATTRIB(XonoticPlayerModelSelector, currentModelImage, string, string_null)
14 ATTRIB(XonoticPlayerModelSelector, currentModelTitle, string, string_null)
15 ATTRIB(XonoticPlayerModelSelector, currentModelDescription, string, string_null)
16 METHOD(XonoticPlayerModelSelector, go, void(entity, float));
17 METHOD(XonoticPlayerModelSelector, destroy, void(entity));
18 ATTRIB(XonoticPlayerModelSelector, origin, vector, '0 0 0')
19 ATTRIB(XonoticPlayerModelSelector, size, vector, '0 0 0')
20 ATTRIB(XonoticPlayerModelSelector, realFontSize, vector, '0 0 0')
21 ATTRIB(XonoticPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
22 ATTRIB(XonoticPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
23 ATTRIB(XonoticPlayerModelSelector, bufModels, float, -1)
24 ATTRIB(XonoticPlayerModelSelector, numModels, float, -1)
25 ATTRIB(XonoticPlayerModelSelector, idxModels, float, -1)
26 ENDCLASS(XonoticPlayerModelSelector)
27 entity makeXonoticPlayerModelSelector();
28 void PlayerModelSelector_Next_Click(entity btn, entity me);
29 void PlayerModelSelector_Prev_Click(entity btn, entity me);
33 entity makeXonoticPlayerModelSelector()
36 me = NEW(XonoticPlayerModelSelector);
37 me.configureXonoticPlayerModelSelector(me);
41 const float BUFMODELS_TITLE = 0;
42 const float BUFMODELS_IMAGE = 1;
43 const float BUFMODELS_MODEL = 2;
44 const float BUFMODELS_SKIN = 3;
45 const float BUFMODELS_DESC = 4;
46 const float BUFMODELS_COUNT = 5;
48 #define XONVOTE186 1 // (nyov) removal of model text description
50 void XonoticPlayerModelSelector_configureXonoticPlayerModelSelector(entity me)
52 float sortbuf, glob, i;
55 glob = search_begin(language_filename(get_model_datafilename(string_null, -1, "txt")), true, true);
59 me.configureXonoticImage(me, string_null, -1);
61 sortbuf = buf_create();
62 for(i = 0; i < search_getsize(glob); ++i)
65 fn = search_getfilename(glob, i);
66 if(!get_model_parameters(fn, -1))
68 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
71 buf_sort(sortbuf, 128, 0);
72 me.numModels = buf_getsize(sortbuf);
73 me.bufModels = buf_create();
74 for(i = 0; i < me.numModels; ++i)
76 fn = substring(bufstr_get(sortbuf, i), 128, -1);
77 if(!get_model_parameters(fn, -1))
78 error("But it JUST worked!");
79 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_TITLE, get_model_parameters_name);
80 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)));
81 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
82 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
83 get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
85 if(get_model_parameters_sex)
86 get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s", get_model_parameters_sex));
88 if(get_model_parameters_description)
89 get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\n%s\n", get_model_parameters_description));
90 if(get_model_parameters_sex)
91 get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nSex: %s", get_model_parameters_sex));
92 if(get_model_parameters_weight)
93 get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nWeight: %g kg", get_model_parameters_weight));
94 if(get_model_parameters_age)
95 get_model_parameters_desc = strcat(get_model_parameters_desc, sprintf("\nAge: %g", get_model_parameters_age));
97 while(substring(get_model_parameters_desc, -1, 1) == "\n")
98 get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
99 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
102 get_model_parameters(string_null, 0);
103 me.loadCvars(me); // this will select the initial model, depending on the current cvars
104 me.go(me, 0); // this will set the vars for the selected model
106 void XonoticPlayerModelSelector_destroy(entity me)
108 buf_del(me.bufModels);
112 void XonoticPlayerModelSelector_loadCvars(entity me)
114 string skin, modelname;
117 skin = cvar_string("_cl_playerskin");
118 modelname = cvar_string("_cl_playermodel");
120 for(i = 0; i < me.numModels; ++i)
122 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == modelname)
123 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == skin)
126 if(i >= me.numModels) // fail
131 void XonoticPlayerModelSelector_go(entity me, float d)
133 me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
136 strunzone(me.currentModel);
137 if(me.currentModelTitle)
138 strunzone(me.currentModelTitle);
139 if(me.currentModelImage)
140 strunzone(me.currentModelImage);
141 if(me.currentModelDescription)
142 strunzone(me.currentModelDescription);
145 me.currentModelTitle = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
146 me.currentModelImage = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
147 me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
148 me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
149 me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
152 if(draw_PictureSize(me.currentModelImage) == '0 0 0')
153 me.src = "nopreview_player";
155 me.src = me.currentModelImage;
159 void PlayerModelSelector_Next_Click(entity btn, entity me)
161 if (me.numModels <= 0)
167 void PlayerModelSelector_Prev_Click(entity btn, entity me)
169 if (me.numModels <= 0)
175 void XonoticPlayerModelSelector_saveCvars(entity me)
177 // we can't immediately apply here because of flood control
178 cvar_set("_cl_playermodel", me.currentModel);
179 cvar_set("_cl_playerskin", ftos(me.currentSkin));
182 void XonoticPlayerModelSelector_draw(entity me)
187 if (me.numModels <= 0)
189 draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, SKINCOLOR_TEXT, 0.6, false);
193 SUPER(XonoticPlayerModelSelector).draw(me);
194 // draw text on the image, handle \n in the description
196 draw_beginBoldFont();
198 #if XONVOTE186 // (nyov) lower name display looks better when there is no description text
199 draw_CenterText('0.5 0.8 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
201 draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
206 o = '0.5 1 0' - eY * me.realFontSize.y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
207 for(i = 0; i < n; ++i)
209 draw_CenterText(o, argv(i), me.realFontSize, SKINCOLOR_TEXT, 1, false);
210 o += eY * me.realFontSize.y;
214 void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
216 SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
217 me.realFontSize_y = me.fontSize / absSize.y;
218 me.realFontSize_x = me.fontSize / absSize.x;
221 void XonoticPlayerModelSelector_showNotify(entity me)
223 me.configureXonoticPlayerModelSelector(me);