1 MUTATOR_HOOKFUNCTION(ok_PlayerDamage_Calculate)
3 if(!IS_PLAYER(frag_target) || frag_target == frag_attacker)
6 if not (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
10 if(frag_target.health >= 1 && !frag_target.freezetag_frozen)
11 Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_SECONDARY);
14 //frag_attacker = frag_target;
19 MUTATOR_HOOKFUNCTION(ok_BuildMutatorsString)
21 ret_string = strcat(ret_string, ":OK");
25 MUTATOR_HOOKFUNCTION(ok_BuildMutatorsPrettyString)
27 ret_string = strcat(ret_string, ", Overkill");
33 if(IS_PLAYER(other) && other.deadflag == DEAD_NO && !other.freezetag_frozen)
40 MUTATOR_HOOKFUNCTION(ok_PlayerDies)
42 entity oldself = self;
43 float gpi = autocvar_g_pickup_items;
45 self.ok_lastwep = self.weapon;
46 self.ok_deathloc = self.origin;
47 cvar_set("g_pickup_items", "1");
50 spawnfunc_item_armor_small();
51 self.movetype = MOVETYPE_TOSS;
53 setorigin(self, frag_target.origin + '0 0 32');
54 self.velocity = '0 0 200' + normalize(frag_attacker.origin - self.origin) * 500;
55 self.touch = ok_Item_Touch;
56 SUB_SetFade(self, time + 5, 1);
58 cvar_set("g_pickup_items", ftos(gpi));
63 MUTATOR_HOOKFUNCTION(ok_ForbidThrowCurrentWeapon)
68 MUTATOR_HOOKFUNCTION(ok_PlayerPreThink)
70 if(intermission_running || gameover)
73 if(self.deadflag != DEAD_NO || !IS_PLAYER(self))
76 if(self.freezetag_frozen)
80 if(self.jump_interval <= time)
82 self.jump_interval = time + autocvar_g_balance_laser_primary_refire * W_WeaponRateFactor();
83 makevectors(self.v_angle);
84 float w = self.weapon;
85 self.weapon = WEP_LASER;
90 self.BUTTON_ATCK2 = 0;
94 MUTATOR_HOOKFUNCTION(ok_PlayerSpawn)
96 if(autocvar_g_overkill_spawnsystem_delay_death)
97 self.ok_spawnsys_timer = time + autocvar_g_overkill_spawnsystem_delay_death;
99 if(teamplay == 0 || autocvar_g_overkill_spawnsystem == 0)
102 entity team_mate, best_mate = world;
103 vector best_spot = '0 0 0';
104 float pc = 0., best_dist = 0., dist = 0.;
105 FOR_EACH_PLAYER(team_mate)
107 if((autocvar_g_overkill_spawnsystem_check_health != 0 && team_mate.health >= 100) || autocvar_g_overkill_spawnsystem_check_health == 0)
108 if(team_mate.deadflag == DEAD_NO)
109 if(team_mate.ok_spawnsys_timer < time)
110 if(team_mate.team == self.team && (g_ctf || g_tdm || g_keyhunt))
111 if(team_mate != self)
113 tracebox(team_mate.origin, PL_MIN, PL_MAX, team_mate.origin - '0 0 100', MOVE_WORLDONLY, team_mate);
114 if(trace_fraction != 1.0)
115 if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
117 pc = pointcontents(trace_endpos + '0 0 1');
118 if(pc == CONTENT_EMPTY)
120 if(vlen(team_mate.velocity) > 5)
121 fixedmakevectors(vectoangles(team_mate.velocity));
123 fixedmakevectors(team_mate.angles);
125 for(pc = 0; pc != 5; ++pc) // test 5 diffrent spots close to mate
130 tracebox(team_mate.origin , PL_MIN, PL_MAX, team_mate.origin + v_right * 128, MOVE_NORMAL, team_mate);
133 tracebox(team_mate.origin , PL_MIN, PL_MAX,team_mate.origin - v_right * 128 , MOVE_NORMAL, team_mate);
136 tracebox(team_mate.origin , PL_MIN, PL_MAX, team_mate.origin + v_right * 64 - v_forward * 64, MOVE_NORMAL, team_mate);
139 tracebox(team_mate.origin , PL_MIN, PL_MAX, team_mate.origin - v_right * 64 - v_forward * 64, MOVE_NORMAL, team_mate);
142 tracebox(team_mate.origin , PL_MIN, PL_MAX, team_mate.origin - v_forward * 128, MOVE_NORMAL, team_mate);
146 if(trace_fraction == 1.0)
148 traceline(trace_endpos + '0 0 4', trace_endpos - '0 0 100', MOVE_NORMAL, team_mate);
149 if(trace_fraction != 1.0)
151 if(autocvar_g_overkill_spawnsystem_close2death)
153 dist = vlen(trace_endpos - self.ok_deathloc);
154 if(dist < best_dist || best_dist == 0)
157 best_spot = trace_endpos;
158 best_mate = team_mate;
163 setorigin(self, trace_endpos);
164 self.angles = team_mate.angles;
165 team_mate.ok_spawnsys_timer = time + autocvar_g_overkill_spawnsystem_delay;
176 if(autocvar_g_overkill_spawnsystem_close2death)
179 setorigin(self, best_spot);
180 self.angles = best_mate.angles;
181 best_mate.ok_spawnsys_timer = time + autocvar_g_overkill_spawnsystem_delay;
189 float gpi = autocvar_g_pickup_items;
190 cvar_set("g_pickup_items", "1");
191 self.classname = "weapon_hmg";
192 //self.weapons = WEP_HMG;
193 //self.flags |= FL_POWERUP;
194 self.respawntime = autocvar_g_overkill_superguns_respawn_time;
195 setmodel(self, "models/weapons/g_ok_hmg.md3");
196 spawnfunc_weapon_hmg();
198 cvar_set("g_pickup_items", ftos(gpi));
203 float gpi = autocvar_g_pickup_items;
204 cvar_set("g_pickup_items", "1");
205 self.classname = "weapon_rpc";
206 self.respawntime = autocvar_g_overkill_superguns_respawn_time;
207 //self.weapons = WEP_RPC;
208 //self.flags |= FL_POWERUP;
209 setmodel(self, "models/weapons/g_ok_rl.md3");
210 spawnfunc_weapon_rpc();
211 cvar_set("g_pickup_items", ftos(gpi));
214 void start_mh_anyway()
216 cvar_set("g_pickup_items", "1");
217 self.classname = "item_health_mega";
218 spawnfunc_item_health_mega();
219 cvar_set("g_pickup_items", "0");
222 void start_ma_anyway()
224 cvar_set("g_pickup_items", "1");
225 self.classname = "item_armor_large";
226 spawnfunc_item_armor_large();
227 cvar_set("g_pickup_items", "0");
230 MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn)
232 if(autocvar_g_powerups != 0)
233 if(autocvar_g_overkill_powerups_replace)
234 if(self.classname == "item_strength")
236 entity wep = spawn();
237 setorigin(wep, self.origin);
238 wep.think = start_hmg;
239 wep.nextthink = time + 0.1;
243 if(autocvar_g_powerups != 0)
244 if(autocvar_g_overkill_powerups_replace)
245 if(self.classname == "item_invincible")
247 entity wep = spawn();
248 setorigin(wep, self.origin);
249 wep.think = start_rpc;
250 wep.nextthink = time + 0.1;
257 MUTATOR_HOOKFUNCTION(ok_ItemRemove)
261 case IT_HEALTH: return !(autocvar_g_overkill_100h_anyway);
262 case IT_ARMOR: return !(autocvar_g_overkill_100a_anyway);
268 MUTATOR_HOOKFUNCTION(ok_SetModname)
270 modname = "Overkill";
274 MUTATOR_HOOKFUNCTION(ok_StartItems)
276 start_items |= IT_UNLIMITED_WEAPON_AMMO;
277 start_weapons = (WEPSET_UZI | WEPSET_NEX | WEPSET_SHOTGUN);
279 start_ammo_nails = start_ammo_cells = start_ammo_shells = start_ammo_rockets =
280 warmup_start_ammo_nails = warmup_start_ammo_cells = warmup_start_ammo_shells = warmup_start_ammo_rockets = autocvar_g_overkill_ammo_start;
287 precache_all_playermodels("models/ok_player/*.dpm");
289 precache_model("models/weapons/h_ok_rl.iqm");
290 precache_model("models/weapons/v_ok_rl.md3");
291 precache_model("models/weapons/g_ok_rl.md3");
292 precache_model("models/weapons/ok_rocket.md3");
294 precache_model("models/weapons/h_ok_mg.iqm");
295 precache_model("models/weapons/v_ok_mg.md3");
296 precache_model("models/weapons/g_ok_mg.md3");
298 precache_model("models/weapons/h_ok_hmg.iqm");
299 precache_model("models/weapons/v_ok_hmg.md3");
300 precache_model("models/weapons/g_ok_hmg.md3");
302 precache_model("models/weapons/h_ok_shotgun.iqm");
303 precache_model("models/weapons/v_ok_shotgun.md3");
304 precache_model("models/weapons/g_ok_shotgun.md3");
306 precache_model("models/weapons/h_ok_sniper.iqm");
307 precache_model("models/weapons/v_ok_sniper.md3");
308 precache_model("models/weapons/g_ok_sniper.md3");
312 w_shotgun(WR_PRECACHE);
313 w_laser(WR_PRECACHE);
315 (get_weaponinfo(WEP_RPC)).spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
316 (get_weaponinfo(WEP_HMG)).spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
318 (get_weaponinfo(WEP_SHOTGUN)).mdl = "ok_shotgun";
319 (get_weaponinfo(WEP_UZI)).mdl = "ok_mg";
320 (get_weaponinfo(WEP_NEX)).mdl = "ok_sniper";
323 float fh = fopen("overkill.cfg", FILE_READ);
326 while((s = fgets(fh)))
329 if not(argv(0) == "" || argv(1) == "//" || argv(1) == "")
330 cvar_settemp(argv(0), argv(1));
335 dprint("^1Mutator Overkill: WARNING! overkill.cfg NOT found, things will be strange!\n");
338 MUTATOR_DEFINITION(mutator_overkill)
340 MUTATOR_HOOK(ForbidThrowCurrentWeapon, ok_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
341 MUTATOR_HOOK(BuildMutatorsString, ok_BuildMutatorsString, CBC_ORDER_ANY);
342 MUTATOR_HOOK(BuildMutatorsPrettyString, ok_BuildMutatorsPrettyString, CBC_ORDER_ANY);
343 MUTATOR_HOOK(PlayerPreThink, ok_PlayerPreThink, CBC_ORDER_LAST);
344 MUTATOR_HOOK(PlayerSpawn, ok_PlayerSpawn, CBC_ORDER_LAST);
345 MUTATOR_HOOK(PlayerDamage_Calculate, ok_PlayerDamage_Calculate, CBC_ORDER_LAST);
346 MUTATOR_HOOK(PlayerDies, ok_PlayerDies, CBC_ORDER_ANY);
347 MUTATOR_HOOK(OnEntityPreSpawn, ok_OnEntityPreSpawn, CBC_ORDER_ANY);
348 MUTATOR_HOOK(SetModname, ok_SetModname, CBC_ORDER_ANY);
349 MUTATOR_HOOK(FilterItem, ok_ItemRemove, CBC_ORDER_ANY);
350 MUTATOR_HOOK(SetStartItems, ok_StartItems, CBC_ORDER_ANY);
359 (get_weaponinfo(WEP_RPC)).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
360 (get_weaponinfo(WEP_HMG)).spawnflags |= WEP_FLAG_MUTATORBLOCKED;