2 #include "calculations.qc"
6 // WEAPON PLUGIN SYSTEM
7 entity weapon_info[WEP_MAXCOUNT];
8 entity dummy_weapon_info;
11 # error Kein Weltraum links auf dem Gerät
14 WepSet WepSet_FromWeapon(float a) {
22 return '0 0 1' * power2of(a);
25 return '0 1 0' * power2of(a);
28 return '1 0 0' * power2of(a);
33 addstat(STAT_WEAPONS, AS_INT, weapons_x);
35 addstat(STAT_WEAPONS2, AS_INT, weapons_y);
37 addstat(STAT_WEAPONS3, AS_INT, weapons_z);
41 void WriteWepSet(float dst, WepSet w)
45 #elif WEP_MAXCOUNT > 24
48 WriteInt24_t(dst, w_x);
53 WepSet WepSet_GetFromStat()
56 w_x = getstati(STAT_WEAPONS);
58 w_y = getstati(STAT_WEAPONS2);
60 w_z = getstati(STAT_WEAPONS3);
69 #elif WEP_MAXCOUNT > 24
72 return ReadInt24_t() * '1 0 0';
84 float pickupbasevalue,
94 weapon_info[id - 1] = e = spawn();
95 e.classname = "weapon_info";
99 e.ammo_field = ammotype;
101 e.spawnflags = weapontype;
102 e.bot_pickupbasevalue = pickupbasevalue;
104 e.wpmodel = strzone(strcat("wpn-", ftos(id)));
106 e.model = strzone(strcat("models/weapons/g_", modelname, ".md3"));
107 e.w_simplemdl = strzone(simplemdl); // simpleitems weapon model/image
108 e.w_crosshair = strzone(car(crosshair));
109 string s = cdr(crosshair);
110 e.w_crosshair_size = ((s != "") ? stof(s) : 1); // so that we can scale the crosshair from code (for compat)
111 e.model2 = strzone(wepimg);
119 float w_null(float dummy)
123 void register_weapons_done()
125 dummy_weapon_info = spawn();
126 dummy_weapon_info.classname = "weapon_info";
127 dummy_weapon_info.weapon = 0; // you can recognize dummies by this
128 dummy_weapon_info.weapons = '0 0 0';
129 dummy_weapon_info.netname = "";
130 dummy_weapon_info.message = "AOL CD Thrower";
131 dummy_weapon_info.weapon_func = w_null;
132 dummy_weapon_info.wpmodel = "";
133 dummy_weapon_info.mdl = "";
134 dummy_weapon_info.model = "";
135 dummy_weapon_info.spawnflags = 0;
136 dummy_weapon_info.impulse = -1;
137 dummy_weapon_info.bot_pickupbasevalue = 0;
138 dummy_weapon_info.ammo_field = ammo_none;
140 dummy_weapon_info.w_crosshair = "gfx/crosshair1";
141 dummy_weapon_info.w_crosshair_size = 1;
142 dummy_weapon_info.model2 = "";
145 weaponorder_byid = "";
146 for(i = WEP_MAXCOUNT; i >= 1; --i)
148 weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i));
149 weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1));
151 entity get_weaponinfo(int id)
154 if(id < WEP_FIRST || id > WEP_LAST)
155 return dummy_weapon_info;
156 w = weapon_info[id - 1];
159 return dummy_weapon_info;
161 string W_FixWeaponOrder(string order, float complete)
163 return fixPriorityList(order, WEP_FIRST, WEP_LAST, 230 - WEP_FIRST, complete);
165 string W_NameWeaponOrder_MapFunc(string s)
168 if(s == "0" || stof(s))
170 wi = get_weaponinfo(stof(s));
171 if(wi != dummy_weapon_info)
177 string W_UndeprecateName(string s)
181 case "nex" : return "vortex";
182 case "rocketlauncher" : return "devastator";
183 case "laser" : return "blaster";
184 case "minstanex" : return "vaporizer";
185 case "grenadelauncher": return "mortar";
186 case "uzi" : return "machinegun";
190 string W_NameWeaponOrder(string order)
192 return mapPriorityList(order, W_NameWeaponOrder_MapFunc);
194 string W_NumberWeaponOrder_MapFunc(string s)
197 if(s == "0" || stof(s))
199 s = W_UndeprecateName(s);
200 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
201 if(s == get_weaponinfo(i).netname)
205 string W_NumberWeaponOrder(string order)
207 return mapPriorityList(order, W_NumberWeaponOrder_MapFunc);
210 float W_FixWeaponOrder_BuildImpulseList_buf[WEP_MAXCOUNT];
211 string W_FixWeaponOrder_BuildImpulseList_order;
212 void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass)
215 h = W_FixWeaponOrder_BuildImpulseList_buf[i];
216 W_FixWeaponOrder_BuildImpulseList_buf[i] = W_FixWeaponOrder_BuildImpulseList_buf[j];
217 W_FixWeaponOrder_BuildImpulseList_buf[j] = h;
219 float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass)
223 e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]);
224 e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]);
225 d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10;
227 return -d; // high impulse first!
229 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0)
231 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0)
232 ; // low char index first!
234 string W_FixWeaponOrder_BuildImpulseList(string o)
237 W_FixWeaponOrder_BuildImpulseList_order = o;
238 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
239 W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i;
240 heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, world);
242 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
243 o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST]));
244 W_FixWeaponOrder_BuildImpulseList_order = string_null;
245 return substring(o, 1, -1);
248 string W_FixWeaponOrder_AllowIncomplete(string order)
250 return W_FixWeaponOrder(order, 0);
253 string W_FixWeaponOrder_ForceComplete(string order)
256 order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority"));
257 return W_FixWeaponOrder(order, 1);
260 void W_RandomWeapons(entity e, float n)
265 remaining = e.weapons;
267 for(i = 0; i < n; ++i)
269 RandomSelection_Init();
270 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
271 if(remaining & WepSet_FromWeapon(j))
272 RandomSelection_Add(world, j, string_null, 1, 1);
273 result |= WepSet_FromWeapon(RandomSelection_chosen_float);
274 remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float);
279 string GetAmmoPicture(.float ammotype)
283 case ammo_shells: return "ammo_shells";
284 case ammo_nails: return "ammo_bullets";
285 case ammo_rockets: return "ammo_rockets";
286 case ammo_cells: return "ammo_cells";
287 case ammo_plasma: return "ammo_cells";
288 case ammo_fuel: return "ammo_fuel";
289 default: return ""; // wtf, no ammo type?
294 .float GetAmmoFieldFromNum(float i)
298 case 0: return ammo_shells;
299 case 1: return ammo_nails;
300 case 2: return ammo_rockets;
301 case 3: return ammo_cells;
302 case 4: return ammo_plasma;
303 case 5: return ammo_fuel;
304 default: return ammo_none;
308 float GetAmmoStat(.float ammotype)
312 case ammo_shells: return STAT_SHELLS;
313 case ammo_nails: return STAT_NAILS;
314 case ammo_rockets: return STAT_ROCKETS;
315 case ammo_cells: return STAT_CELLS;
316 case ammo_plasma: return STAT_PLASMA;
317 case ammo_fuel: return STAT_FUEL;