7 #include "../../client/defs.qh"
8 #include "../constants.qh"
10 #include "../../lib/warpzone/anglestransform.qh"
11 #include "../../lib/warpzone/common.qh"
12 #include "../../lib/warpzone/client.qh"
14 #include "../../client/autocvars.qh"
15 #include "../deathtypes/all.qh"
16 #include "../../lib/csqcmodel/interpolate.qh"
17 #include "../movetypes/movetypes.qh"
18 #include "../../client/main.qh"
19 #include "../../lib/csqcmodel/cl_model.qh"
22 #include "../../lib/warpzone/anglestransform.qh"
23 #include "../../lib/warpzone/common.qh"
24 #include "../../lib/warpzone/util_server.qh"
25 #include "../../lib/warpzone/server.qh"
26 #include "../constants.qh"
27 #include "../stats.qh"
28 #include "../teams.qh"
30 #include "../monsters/all.qh"
32 #include "../../server/weapons/csqcprojectile.qh"
33 #include "../../server/weapons/tracing.qh"
34 #include "../../server/t_items.qh"
35 #include "../../server/autocvars.qh"
36 #include "../../server/constants.qh"
37 #include "../../server/defs.qh"
38 #include "../notifications.qh"
39 #include "../deathtypes/all.qh"
40 #include "../../server/mutators/all.qh"
41 #include "../mapinfo.qh"
42 #include "../../server/command/common.qh"
43 #include "../../lib/csqcmodel/sv_model.qh"
44 #include "../../server/portals.qh"
45 #include "../../server/g_hook.qh"
48 #include "calculations.qc"
50 #define IMPLEMENTATION
54 // WEAPON PLUGIN SYSTEM
56 WepSet _WepSet_FromWeapon(int a) {
64 return '0 0 1' * power2of(a);
66 return '0 1 0' * power2of(a);
68 return '1 0 0' * power2of(a);
71 void WriteWepSet(float dst, WepSet w)
75 else if (Weapons_MAX > 24)
78 WriteInt24_t(dst, w.x);
82 WepSet WepSet_GetFromStat()
86 WepSet WepSet_GetFromStat_InMap()
88 return STAT(WEAPONSINMAP);
96 return ReadInt24_t() * '1 0 0';
100 string W_FixWeaponOrder(string order, float complete)
102 return fixPriorityList(order, WEP_FIRST, WEP_LAST, WEP_IMPULSE_BEGIN - WEP_FIRST, complete);
104 string W_NameWeaponOrder_MapFunc(string s)
107 if(s == "0" || stof(s))
109 wi = get_weaponinfo(stof(s));
116 string W_UndeprecateName(string s)
120 case "nex" : return "vortex";
121 case "rocketlauncher" : return "devastator";
122 case "laser" : return "blaster";
123 case "minstanex" : return "vaporizer";
124 case "grenadelauncher": return "mortar";
125 case "uzi" : return "machinegun";
129 string W_NameWeaponOrder(string order)
131 return mapPriorityList(order, W_NameWeaponOrder_MapFunc);
133 string W_NumberWeaponOrder_MapFunc(string s)
136 if(s == "0" || stof(s))
138 s = W_UndeprecateName(s);
139 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
140 if(s == get_weaponinfo(i).netname)
144 string W_NumberWeaponOrder(string order)
146 return mapPriorityList(order, W_NumberWeaponOrder_MapFunc);
149 float W_FixWeaponOrder_BuildImpulseList_buf[Weapons_MAX];
150 string W_FixWeaponOrder_BuildImpulseList_order;
151 void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass)
154 h = W_FixWeaponOrder_BuildImpulseList_buf[i];
155 W_FixWeaponOrder_BuildImpulseList_buf[i] = W_FixWeaponOrder_BuildImpulseList_buf[j];
156 W_FixWeaponOrder_BuildImpulseList_buf[j] = h;
158 float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass)
162 e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]);
163 e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]);
164 d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10;
166 return -d; // high impulse first!
168 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0)
170 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0)
171 ; // low char index first!
173 string W_FixWeaponOrder_BuildImpulseList(string o)
176 W_FixWeaponOrder_BuildImpulseList_order = o;
177 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
178 W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i;
179 heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, world);
181 for(i = WEP_FIRST; i <= WEP_LAST; ++i)
182 o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST]));
183 W_FixWeaponOrder_BuildImpulseList_order = string_null;
184 return substring(o, 1, -1);
187 string W_FixWeaponOrder_AllowIncomplete(string order)
189 return W_FixWeaponOrder(order, 0);
192 string W_FixWeaponOrder_ForceComplete(string order)
195 order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority"));
196 return W_FixWeaponOrder(order, 1);
199 void W_RandomWeapons(entity e, float n)
204 remaining = e.weapons;
206 for(i = 0; i < n; ++i)
208 RandomSelection_Init();
209 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
210 if(remaining & WepSet_FromWeapon(j))
211 RandomSelection_Add(world, j, string_null, 1, 1);
212 result |= WepSet_FromWeapon(RandomSelection_chosen_float);
213 remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float);
218 string GetAmmoPicture(.int ammotype)
222 case ammo_shells: return ITEM_Shells.m_icon;
223 case ammo_nails: return ITEM_Bullets.m_icon;
224 case ammo_rockets: return ITEM_Rockets.m_icon;
225 case ammo_cells: return ITEM_Cells.m_icon;
226 case ammo_plasma: return ITEM_Plasma.m_icon;
227 case ammo_fuel: return ITEM_JetpackFuel.m_icon;
228 default: return ""; // wtf, no ammo type?
233 .int GetAmmoFieldFromNum(int i)
237 case 0: return ammo_shells;
238 case 1: return ammo_nails;
239 case 2: return ammo_rockets;
240 case 3: return ammo_cells;
241 case 4: return ammo_plasma;
242 case 5: return ammo_fuel;
243 default: return ammo_none;
247 int GetAmmoStat(.int ammotype)
251 case ammo_shells: return STAT_SHELLS;
252 case ammo_nails: return STAT_NAILS;
253 case ammo_rockets: return STAT_ROCKETS;
254 case ammo_cells: return STAT_CELLS;
255 case ammo_plasma: return STAT_PLASMA.m_id;
256 case ammo_fuel: return STAT_FUEL.m_id;
262 string W_Sound(string w_snd)
264 string output = strcat("weapons/", w_snd);
266 MUTATOR_CALLHOOK(WeaponSound, w_snd, output);
267 return weapon_sound_output;
273 string W_Model(string w_mdl)
275 string output = strcat("models/weapons/", w_mdl);
277 MUTATOR_CALLHOOK(WeaponModel, w_mdl, output);
278 return weapon_model_output;