Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
playermodel.qc
Go to the documentation of this file.
1#include "playermodel.qh"
2
4{
6 me.configureXonoticImage(me, string_null, -1);
7 return me;
8}
9
10const float BUFMODELS_TITLE = 0;
11const float BUFMODELS_IMAGE = 1;
12const float BUFMODELS_MODEL = 2;
13const float BUFMODELS_SKIN = 3;
14const float BUFMODELS_DESC = 4;
15const float BUFMODELS_COUNT = 5;
16
17#define XONVOTE186 1 // (nyov) removal of model text description
18
20{
21 int i;
22 string fn;
23
24 float glob = search_begin(get_model_datafilename(string_null, -1, "txt"), true, true);
25 if (glob < 0)
26 return;
27
28 float sortbuf = buf_create();
29 for(i = 0; i < search_getsize(glob); ++i)
30 {
31 // select model #i!
32 fn = search_getfilename(glob, i);
33 if(!get_model_parameters(fn, -1))
34 continue;
36 continue;
37 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
38 }
39 search_end(glob);
40 buf_sort(sortbuf, 128, 0);
41 me.numModels = buf_getsize(sortbuf);
42 me.bufModels = buf_create();
43 for(i = 0; i < me.numModels; ++i)
44 {
45 fn = substring(bufstr_get(sortbuf, i), 128, -1);
46 if(!get_model_parameters(fn, -1))
47 error("But it JUST worked!");
49 continue;
55#if XONVOTE186
58#else
67#endif
68 while(substring(get_model_parameters_desc, -1, 1) == "\n")
70 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
71 }
72 buf_del(sortbuf);
74 me.loadCvars(me); // this will select the initial model, depending on the current cvars
75 me.go(me, 0); // this will set the vars for the selected model
76}
77
79{
80 if(me.bufModels >= 0)
81 {
82 buf_del(me.bufModels);
83 me.bufModels = -1;
84 }
85}
86
88{
89 string skin, modelname;
90 float i;
91
92 skin = cvar_string("_cl_playerskin");
93 modelname = cvar_string("_cl_playermodel");
94
95 for(i = 0; i < me.numModels; ++i)
96 {
97 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == modelname)
98 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == skin)
99 break;
100 }
101 if(i >= me.numModels) // fail
102 i = 0;
103 me.idxModels = i;
104}
105
107{
108 me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
109
110 // select model #i!
111 strcpy(me.currentModelTitle, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
112 strcpy(me.currentModelImage, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
113 me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
114 strcpy(me.currentModel, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
115 strcpy(me.currentModelDescription, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
116
117 // fix the image
118 if(draw_PictureSize(me.currentModelImage) == '0 0 0')
119 me.src = "nopreview_player";
120 else
121 me.src = me.currentModelImage;
122 me.updateAspect(me);
123}
124
126{
127 if (me.numModels <= 0)
128 return;
129 me.go(me, +1);
130 me.saveCvars(me);
131}
132
134{
135 if (me.numModels <= 0)
136 return;
137 me.go(me, -1);
138 me.saveCvars(me);
139}
140
142{
143 // we can't immediately apply here because of flood control
144 cvar_set("_cl_playermodel", me.currentModel);
145 cvar_set("_cl_playerskin", ftos(me.currentSkin));
146}
147
149{
150 float i, n;
151 vector o;
152
153 if (me.numModels <= 0)
154 {
155 draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, SKINCOLOR_TEXT, 0.6, false);
156 return;
157 }
158
160 // draw text on the image, handle \n in the description
161
163
164#if XONVOTE186 // (nyov) lower name display looks better when there is no description text
165 draw_CenterText('0.5 0.8 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
166#else
167 draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
168#endif
169
171
172 o = '0.5 1 0' - eY * me.realFontSize.y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
173 for(i = 0; i < n; ++i)
174 {
175 draw_CenterText(o, argv(i), me.realFontSize, SKINCOLOR_TEXT, 1, false);
176 o += eY * me.realFontSize.y;
177 }
178}
179
180void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
181{
182 SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
183 me.realFontSize_y = me.fontSize / absSize.y;
184 me.realFontSize_x = me.fontSize / absSize.x;
185}
186
188{
189 // Reinitialize self.
190 me.destroy(me);
191 me.loadModels(me);
192}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define draw_beginBoldFont()
Definition draw.qh:4
#define draw_endBoldFont()
Definition draw.qh:5
string get_model_datafilename(string m, float sk, string fil)
Definition util.qc:1479
float get_model_parameters(string m, float sk)
Definition util.qc:1492
float get_model_parameters_weight
Definition util.qh:182
string get_model_parameters_sex
Definition util.qh:181
float get_model_parameters_modelskin
Definition util.qh:178
string get_model_parameters_name
Definition util.qh:179
string get_model_parameters_description
Definition util.qh:185
bool get_model_parameters_hidden
Definition util.qh:184
string get_model_parameters_modelname
Definition util.qh:177
float get_model_parameters_age
Definition util.qh:183
string get_model_parameters_desc
Definition util.qh:192
float skin
#define tokenizebyseparator
#define buf_create
vector draw_PictureSize(string pic)
Definition draw.qc:80
void draw_CenterText(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
Definition draw.qc:298
float mod(float val, float m)
void cvar_set(string name, string value)
float stof(string val,...)
string substring(string s, float start, float length)
string search_getfilename(float handle, float num)
const string cvar_string(string name)
float search_getsize(float handle)
float search_begin(string pattern, float caseinsensitive, float quiet)
string ftos(float f)
string argv(float n)
void search_end(float handle)
string string_null
Definition nil.qh:9
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define NEW(cname,...)
Definition oo.qh:117
#define SUPER(cname)
Definition oo.qh:231
entity makeXonoticPlayerModelSelector()
Definition playermodel.qc:3
void PlayerModelSelector_Next_Click(entity btn, entity me)
const float BUFMODELS_DESC
void XonoticPlayerModelSelector_destroy(entity me)
const float BUFMODELS_COUNT
const float BUFMODELS_TITLE
void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
const float BUFMODELS_IMAGE
void XonoticPlayerModelSelector_go(entity me, float d)
void XonoticPlayerModelSelector_loadCvars(entity me)
void XonoticPlayerModelSelector_loadModels(entity me)
void XonoticPlayerModelSelector_saveCvars(entity me)
void XonoticPlayerModelSelector_draw(entity me)
const float BUFMODELS_SKIN
const float BUFMODELS_MODEL
void PlayerModelSelector_Prev_Click(entity btn, entity me)
void XonoticPlayerModelSelector_showNotify(entity me)
#define error
Definition pre.qh:6
vector
Definition self.qh:92
#define strcpy(this, s)
Definition string.qh:52
const vector eY
Definition vector.qh:45