--- /dev/null
+string W_Apply_Weaponreplace(string in)
+{
+ float n = tokenize_console(in);
+ string out = "", s, replacement;
+ float i, j;
+ entity e;
+ for(i = 0; i < n; ++i)
+ {
+ replacement = "";
+ s = argv(i);
+
+ for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+ {
+ e = get_weaponinfo(j);
+ if(e.netname == s)
+ {
+ replacement = e.weaponreplace;
+ }
+ }
+
+ if(replacement == "")
+ out = strcat(out, " ", s);
+ else if(replacement != "0")
+ out = strcat(out, " ", replacement);
+ }
+ return substring(out, 1, -1);
+}
+
+void weapon_defaultspawnfunc(float wpn)
+{
+ entity e;
+ float t;
+ string s;
+ entity oldself;
+ float i, j;
+ float f;
+
+ if(self.classname != "droppedweapon" && self.classname != "replacedweapon")
+ {
+ e = get_weaponinfo(wpn);
+
+ if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED)
+ {
+ objerror("Attempted to spawn a mutator-blocked weapon rejected");
+ startitem_failed = TRUE;
+ return;
+ }
+
+ s = W_Apply_Weaponreplace(e.netname);
+ ret_string = s;
+ other = e;
+ MUTATOR_CALLHOOK(SetWeaponreplace);
+ s = ret_string;
+ if(s == "")
+ {
+ remove(self);
+ startitem_failed = TRUE;
+ return;
+ }
+ t = tokenize_console(s);
+ if(t >= 2)
+ {
+ self.team = --internalteam;
+ oldself = self;
+ for(i = 1; i < t; ++i)
+ {
+ s = argv(i);
+ for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+ {
+ e = get_weaponinfo(j);
+ if(e.netname == s)
+ {
+ self = spawn();
+ copyentity(oldself, self);
+ self.classname = "replacedweapon";
+ weapon_defaultspawnfunc(j);
+ break;
+ }
+ }
+ if(j > WEP_LAST)
+ {
+ print("The weapon replace list for ", oldself.classname, " contains an unknown weapon ", s, ". Skipped.\n");
+ }
+ }
+ self = oldself;
+ }
+ if(t >= 1) // always the case!
+ {
+ s = argv(0);
+ wpn = 0;
+ for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+ {
+ e = get_weaponinfo(j);
+ if(e.netname == s)
+ {
+ wpn = j;
+ break;
+ }
+ }
+ if(j > WEP_LAST)
+ {
+ print("The weapon replace list for ", self.classname, " contains an unknown weapon ", s, ". Skipped.\n");
+ }
+ }
+ if(wpn == 0)
+ {
+ remove(self);
+ startitem_failed = TRUE;
+ return;
+ }
+ }
+
+ e = get_weaponinfo(wpn);
+
+ if(!self.respawntime)
+ {
+ if(e.weapons & WEPSET_SUPERWEAPONS)
+ {
+ self.respawntime = g_pickup_respawntime_superweapon;
+ self.respawntimejitter = g_pickup_respawntimejitter_superweapon;
+ }
+ else
+ {
+ self.respawntime = g_pickup_respawntime_weapon;
+ self.respawntimejitter = g_pickup_respawntimejitter_weapon;
+ }
+ }
+
+ if(e.weapons & WEPSET_SUPERWEAPONS)
+ if(!self.superweapons_finished)
+ self.superweapons_finished = autocvar_g_balance_superweapons_time;
+
+ // if we don't already have ammo, give us some ammo
+ if(!self.(e.ammo_field))
+ {
+ switch(e.ammo_field)
+ {
+ case ammo_shells: self.ammo_shells = cvar("g_pickup_shells_weapon"); break;
+ case ammo_nails: self.ammo_nails = cvar("g_pickup_nails_weapon"); break;
+ case ammo_rockets: self.ammo_rockets = cvar("g_pickup_rockets_weapon"); break;
+ case ammo_cells: self.ammo_cells = cvar("g_pickup_cells_weapon"); break;
+ case ammo_plasma: self.ammo_plasma = cvar("g_pickup_plasma_weapon"); break;
+ case ammo_fuel: self.ammo_fuel = cvar("g_pickup_fuel_weapon"); break;
+ }
+ }
+
+ #if 0 // WEAPONTODO
+ if(e.items)
+ {
+ for(i = 0, j = 1; i < 24; ++i, j *= 2)
+ {
+ if(e.items & j)
+ {
+ ammotype = Item_CounterField(j);
+ if(!self.ammotype)
+ self.ammotype = cvar(strcat("g_pickup_", Item_CounterFieldName(j), "_weapon"));
+ }
+ }
+ }
+ #endif
+
+ // pickup anyway
+ if(g_pickup_weapons_anyway)
+ self.pickup_anyway = TRUE;
+
+ f = FL_WEAPON;
+
+ // no weapon-stay on superweapons
+ if(e.weapons & WEPSET_SUPERWEAPONS)
+ f |= FL_NO_WEAPON_STAY;
+
+ // weapon stay isn't supported for teamed weapons
+ if(self.team)
+ f |= FL_NO_WEAPON_STAY;
+
+ StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue);
+ #if 0 // WEAPONTODO
+ if (self.modelindex) // don't precache if self was removed
+ WEP_ACTION(e.weapon, WR_INIT);
+ #endif
+}