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{
5 entity me;
7 me.configureXonoticImage(me, string_null, -1);
8 return me;
9}
10
11const float BUFMODELS_TITLE = 0;
12const float BUFMODELS_IMAGE = 1;
13const float BUFMODELS_MODEL = 2;
14const float BUFMODELS_SKIN = 3;
15const float BUFMODELS_DESC = 4;
16const float BUFMODELS_COUNT = 5;
17
18#define XONVOTE186 1 // (nyov) removal of model text description
19
21{
22 int i;
23 string fn;
24
25 float glob = search_begin(get_model_datafilename(string_null, -1, "txt"), true, true);
26 if (glob < 0)
27 return;
28
29 float sortbuf = buf_create();
30 for(i = 0; i < search_getsize(glob); ++i)
31 {
32 // select model #i!
33 fn = search_getfilename(glob, i);
34 if(!get_model_parameters(fn, -1))
35 continue;
37 continue;
38 bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
39 }
40 search_end(glob);
41 buf_sort(sortbuf, 128, 0);
42 me.numModels = buf_getsize(sortbuf);
43 me.bufModels = buf_create();
44 for(i = 0; i < me.numModels; ++i)
45 {
46 fn = substring(bufstr_get(sortbuf, i), 128, -1);
47 if(!get_model_parameters(fn, -1))
48 error("But it JUST worked!");
50 continue;
56#if XONVOTE186
59#else
68#endif
69 while(substring(get_model_parameters_desc, -1, 1) == "\n")
71 bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
72 }
73 buf_del(sortbuf);
75 me.loadCvars(me); // this will select the initial model, depending on the current cvars
76 me.go(me, 0); // this will set the vars for the selected model
77}
78
80{
81 if(me.bufModels >= 0)
82 {
83 buf_del(me.bufModels);
84 me.bufModels = -1;
85 }
86}
87
89{
90 string skin, modelname;
91 float i;
92
93 skin = cvar_string("_cl_playerskin");
94 modelname = cvar_string("_cl_playermodel");
95
96 for(i = 0; i < me.numModels; ++i)
97 {
98 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == modelname)
99 if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == skin)
100 break;
101 }
102 if(i >= me.numModels) // fail
103 i = 0;
104 me.idxModels = i;
105}
106
108{
109 me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
110
111 // select model #i!
112 strcpy(me.currentModelTitle, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
113 strcpy(me.currentModelImage, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
114 me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
115 strcpy(me.currentModel, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
116 strcpy(me.currentModelDescription, bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
117
118 // fix the image
119 if(draw_PictureSize(me.currentModelImage) == '0 0 0')
120 me.src = "nopreview_player";
121 else
122 me.src = me.currentModelImage;
123 me.updateAspect(me);
124}
125
127{
128 if (me.numModels <= 0)
129 return;
130 me.go(me, +1);
131 me.saveCvars(me);
132}
133
135{
136 if (me.numModels <= 0)
137 return;
138 me.go(me, -1);
139 me.saveCvars(me);
140}
141
143{
144 // we can't immediately apply here because of flood control
145 cvar_set("_cl_playermodel", me.currentModel);
146 cvar_set("_cl_playerskin", ftos(me.currentSkin));
147}
148
150{
151 float i, n;
152 vector o;
153
154 if (me.numModels <= 0)
155 {
156 draw_CenterText('0.5 0.5 0', _("<no model found>"), me.realFontSize, SKINCOLOR_TEXT, 0.6, false);
157 return;
158 }
159
161 // draw text on the image, handle \n in the description
162
164
165#if XONVOTE186 // (nyov) lower name display looks better when there is no description text
166 draw_CenterText('0.5 0.8 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
167#else
168 draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, false);
169#endif
170
172
173 o = '0.5 1 0' - eY * me.realFontSize.y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
174 for(i = 0; i < n; ++i)
175 {
176 draw_CenterText(o, argv(i), me.realFontSize, SKINCOLOR_TEXT, 1, false);
177 o += eY * me.realFontSize.y;
178 }
179}
180
181void XonoticPlayerModelSelector_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
182{
183 SUPER(XonoticPlayerModelSelector).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
184 me.realFontSize_y = me.fontSize / absSize.y;
185 me.realFontSize_x = me.fontSize / absSize.x;
186}
187
189{
190 // Reinitialize self.
191 me.destroy(me);
192 me.loadModels(me);
193}
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:1381
float get_model_parameters(string m, float sk)
Definition util.qc:1394
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