]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/weapons/spawning.qc
Merge branch 'master' into terencehill/tooltips_cleanup
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / weapons / spawning.qc
1 #include "spawning.qh"
2
3 #include "weaponsystem.qh"
4 #include "../mutators/mutators_include.qh"
5 #include "../t_items.qh"
6 #include "../../common/weapons/all.qh"
7
8 string W_Apply_Weaponreplace(string in)
9 {
10         float n = tokenize_console(in);
11         string out = "", s, replacement;
12         float i, j;
13         entity e;
14         for(i = 0; i < n; ++i)
15         {
16                 replacement = "";
17                 s = argv(i);
18
19                 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
20                 {
21                         e = get_weaponinfo(j);
22                         if(e.netname == s)
23                         {
24                                 replacement = e.weaponreplace;
25                         }
26                 }
27
28                 if(replacement == "")
29                         out = strcat(out, " ", s);
30                 else if(replacement != "0")
31                         out = strcat(out, " ", replacement);
32         }
33         return substring(out, 1, -1);
34 }
35
36 void weapon_defaultspawnfunc(float wpn)
37 {SELFPARAM();
38         entity e;
39         float t;
40         string s;
41         float i, j;
42         int f;
43
44         if(self.classname != "droppedweapon" && self.classname != "replacedweapon")
45         {
46                 e = get_weaponinfo(wpn);
47
48                 if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
49                 {
50                         objerror("Attempted to spawn a mutator-blocked weapon rejected");
51                         startitem_failed = true;
52                         return;
53                 }
54
55                 s = W_Apply_Weaponreplace(e.netname);
56                 MUTATOR_CALLHOOK(SetWeaponreplace, self, e, s);
57                 s = ret_string;
58                 if(s == "")
59                 {
60                         remove(self);
61                         startitem_failed = true;
62                         return;
63                 }
64                 t = tokenize_console(s);
65                 if(t >= 2)
66                 {
67                         self.team = --internalteam;
68                         for(i = 1; i < t; ++i)
69                         {
70                                 s = argv(i);
71                                 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
72                                 {
73                                         e = get_weaponinfo(j);
74                                         if(e.netname == s)
75                                         {
76                                                 setself(spawn());
77                                                 copyentity(this, self);
78                                                 self.classname = "replacedweapon";
79                                                 weapon_defaultspawnfunc(j);
80                                                 break;
81                                         }
82                                 }
83                                 if(j > WEP_LAST)
84                                 {
85                                         LOG_INFO("The weapon replace list for ", this.classname, " contains an unknown weapon ", s, ". Skipped.\n");
86                                 }
87                         }
88                         setself(this);
89                 }
90                 if(t >= 1) // always the case!
91                 {
92                         s = argv(0);
93                         wpn = 0;
94                         for(j = WEP_FIRST; j <= WEP_LAST; ++j)
95                         {
96                                 e = get_weaponinfo(j);
97                                 if(e.netname == s)
98                                 {
99                                         wpn = j;
100                                         break;
101                                 }
102                         }
103                         if(j > WEP_LAST)
104                         {
105                                 LOG_INFO("The weapon replace list for ", self.classname, " contains an unknown weapon ", s, ". Skipped.\n");
106                         }
107                 }
108                 if(wpn == 0)
109                 {
110                         remove(self);
111                         startitem_failed = true;
112                         return;
113                 }
114         }
115
116         e = get_weaponinfo(wpn);
117
118         if(!self.respawntime)
119         {
120                 if(e.weapons & WEPSET_SUPERWEAPONS)
121                 {
122                         self.respawntime = g_pickup_respawntime_superweapon;
123                         self.respawntimejitter = g_pickup_respawntimejitter_superweapon;
124                 }
125                 else
126                 {
127                         self.respawntime = g_pickup_respawntime_weapon;
128                         self.respawntimejitter = g_pickup_respawntimejitter_weapon;
129                 }
130         }
131
132         if(e.weapons & WEPSET_SUPERWEAPONS)
133                 if(!self.superweapons_finished)
134                         self.superweapons_finished = autocvar_g_balance_superweapons_time;
135
136         // if we don't already have ammo, give us some ammo
137         if(!self.(e.ammo_field))
138         {
139                 switch(e.ammo_field)
140                 {
141                         case ammo_shells:  self.ammo_shells  = cvar("g_pickup_shells_weapon");  break;
142                         case ammo_nails:   self.ammo_nails   = cvar("g_pickup_nails_weapon");   break;
143                         case ammo_rockets: self.ammo_rockets = cvar("g_pickup_rockets_weapon"); break;
144                         case ammo_cells:   self.ammo_cells   = cvar("g_pickup_cells_weapon");   break;
145                         case ammo_plasma:  self.ammo_plasma  = cvar("g_pickup_plasma_weapon");  break;
146                         case ammo_fuel:    self.ammo_fuel    = cvar("g_pickup_fuel_weapon");    break;
147                 }
148         }
149
150         #if 0 // WEAPONTODO
151         if(e.items)
152         {
153                 for(i = 0, j = 1; i < 24; ++i, j *= 2)
154                 {
155                         if(e.items & j)
156                         {
157                                 ammotype = Item_CounterField(j);
158                                 if(!self.ammotype)
159                                         self.ammotype = cvar(strcat("g_pickup_", Item_CounterFieldName(j), "_weapon"));
160                         }
161                 }
162         }
163         #endif
164
165         // pickup anyway
166         if(g_pickup_weapons_anyway)
167                 self.pickup_anyway = true;
168
169         f = FL_WEAPON;
170
171         // no weapon-stay on superweapons
172         if(e.weapons & WEPSET_SUPERWEAPONS)
173                 f |= FL_NO_WEAPON_STAY;
174
175         // weapon stay isn't supported for teamed weapons
176         if(self.team)
177                 f |= FL_NO_WEAPON_STAY;
178
179         StartItem(strzone(e.m_model.model_str()), string_null, self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue);
180         self.item_pickupsound_ent = SND_WEAPONPICKUP;
181         #if 0 // WEAPONTODO
182         if (self.modelindex) { // don't precache if self was removed
183                 Weapon w = get_weaponinfo(e.weapon);
184                 w.wr_init(w);
185         }
186         #endif
187 }