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