1 void spawnfunc_item_minst_cells (void)
3 if not(g_minstagib) { remove(self); return; }
4 if not(self.ammo_cells)
5 self.ammo_cells = autocvar_g_minstagib_ammo_drop;
7 StartItem ("models/items/a_cells.md3",
8 "misc/itempickup.wav", 45, 0,
9 "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100);
12 .float minstagib_nextthink;
13 .float minstagib_needammo;
14 void minstagib_stop_countdown(entity e)
16 if (!e.minstagib_needammo)
18 Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_MINSTA_FINDAMMO);
19 e.minstagib_needammo = FALSE;
21 void minstagib_ammocheck(void)
23 if (time < self.minstagib_nextthink)
26 if (self.deadflag || gameover)
27 minstagib_stop_countdown(self);
28 else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
29 minstagib_stop_countdown(self);
32 self.minstagib_needammo = TRUE;
35 Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
36 AnnounceTo(self, "terminated");
38 else if (self.health == 10)
40 Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
41 AnnounceTo(self, "1");
43 else if (self.health == 20)
45 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
46 AnnounceTo(self, "2");
48 else if (self.health == 30)
50 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
51 AnnounceTo(self, "3");
53 else if (self.health == 40)
55 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
56 AnnounceTo(self, "4");
58 else if (self.health == 50)
60 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
61 AnnounceTo(self, "5");
63 else if (self.health == 60)
65 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
66 AnnounceTo(self, "6");
68 else if (self.health == 70)
70 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
71 AnnounceTo(self, "7");
73 else if (self.health == 80)
75 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
76 AnnounceTo(self, "8");
78 else if (self.health == 90)
80 Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO);
81 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
82 AnnounceTo(self, "9");
84 else if (self.health == 100)
86 Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO_FIRST);
87 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
88 if not(self.flags & FL_GODMODE)
89 AnnounceTo(self, "10");
92 self.minstagib_nextthink = time + 1;
95 MUTATOR_HOOKFUNCTION(minstagib_BotShouldAttack)
97 if(checkentity.items & IT_STRENGTH)
103 MUTATOR_HOOKFUNCTION(minstagib_MakePlayerObserver)
105 minstagib_stop_countdown(self);
109 MUTATOR_HOOKFUNCTION(minstagib_PlayerSpawn)
111 self.effects |= EF_FULLBRIGHT;
115 MUTATOR_HOOKFUNCTION(minstagib_PlayerPreThink)
117 minstagib_ammocheck();
121 MUTATOR_HOOKFUNCTION(minstagib_PlayerPowerups)
123 if not(self.effects & EF_FULLBRIGHT)
124 self.effects |= EF_FULLBRIGHT;
126 if (self.items & IT_STRENGTH)
128 play_countdown(self.strength_finished, "misc/poweroff.wav");
129 if (time > self.strength_finished)
131 self.alpha = default_player_alpha;
132 self.exteriorweaponentity.alpha = default_weapon_alpha;
133 self.items &~= IT_STRENGTH;
134 Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY);
139 if (time < self.strength_finished)
141 self.alpha = g_minstagib_invis_alpha;
142 self.exteriorweaponentity.alpha = g_minstagib_invis_alpha;
143 self.items |= IT_STRENGTH;
144 Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname);
145 Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY);
149 if (self.items & IT_INVINCIBLE)
151 play_countdown(self.invincible_finished, "misc/poweroff.wav");
152 if (time > self.invincible_finished)
154 self.items &~= IT_INVINCIBLE;
155 Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED);
160 if (time < self.invincible_finished)
162 self.items |= IT_INVINCIBLE;
163 Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname);
164 Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED);
170 MUTATOR_HOOKFUNCTION(minstagib_PlayerPhysics)
172 if(self.items & IT_INVINCIBLE)
173 self.stat_sv_maxspeed = self.stat_sv_maxspeed * autocvar_g_minstagib_speed_highspeed;
178 MUTATOR_HOOKFUNCTION(minstagib_SplitHealthArmor)
181 //damage_take = frag_damage; // frag_damage isn't even set here?!
186 MUTATOR_HOOKFUNCTION(minstagib_ForbidThrowing)
194 MUTATOR_HOOKFUNCTION(minstagib_PlayStrengthSound)
196 // You shall not play!
200 MUTATOR_HOOKFUNCTION(minstagib_PlayerDamage)
202 if(autocvar_g_friendlyfire == 0 && !IsDifferentTeam(frag_target, frag_attacker) && IS_PLAYER(frag_target))
205 if(IS_PLAYER(frag_target))
207 if ((frag_deathtype == DEATH_FALL) ||
208 (frag_deathtype == DEATH_DROWN) ||
209 (frag_deathtype == DEATH_SLIME) ||
210 (frag_deathtype == DEATH_LAVA))
215 if (frag_target.armorvalue && (frag_deathtype == WEP_MINSTANEX) && frag_damage)
217 frag_target.armorvalue -= 1;
218 Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_target.armorvalue);
220 frag_target.hitsound += 1;
221 frag_attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
223 if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
226 frag_mirrordamage = 0;
227 if (frag_target != frag_attacker)
229 if ((frag_target.health >= 1) && IS_PLAYER(frag_target))
230 Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_SECONDARY);
231 frag_force = '0 0 0';
232 // keep mirrorfrag_force
233 frag_attacker = frag_target;
238 if(frag_mirrordamage > 0)
240 // just lose extra LIVES, don't kill the player for mirror damage
241 if(frag_attacker.armorvalue > 0)
243 frag_attacker.armorvalue = frag_attacker.armorvalue - 1;
244 Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_attacker.armorvalue);
245 frag_attacker.hitsound += 1;
247 frag_mirrordamage = 0;
250 if(frag_target.items & IT_STRENGTH)
256 MUTATOR_HOOKFUNCTION(minstagib_SetStartItems)
258 start_ammo_cells = cvar("g_minstagib_ammo_start");
260 g_pinata = 0; // incompatible
261 g_weapon_stay = 0; // incompatible
262 g_bloodloss = 0; // incompatible
264 start_armorvalue = 0;
265 WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
266 g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
267 start_items |= IT_UNLIMITED_SUPERWEAPONS;
269 if (g_minstagib_invis_alpha <= 0)
270 g_minstagib_invis_alpha = -1;
275 MUTATOR_HOOKFUNCTION(minstagib_FilterItem)
277 if(self.classname == "item_cells")
278 return TRUE; // no normal cells?
280 if(self.weapon == WEP_MINSTANEX && self.classname == "droppedweapon")
282 self.ammo_cells = autocvar_g_minstagib_ammo_drop;
286 if(self.weapon == WEP_ROCKET_LAUNCHER || self.weapon == WEP_NEX)
289 setorigin(e, self.origin);
293 spawnfunc_item_minst_cells();
298 if(self.flags & FL_POWERUP)
301 if(self.ammo_cells > autocvar_g_minstagib_ammo_drop && self.classname != "item_minst_cells")
302 self.ammo_cells = autocvar_g_minstagib_ammo_drop;
304 if(self.ammo_cells && !self.weapon)
310 MUTATOR_HOOKFUNCTION(minstagib_ItemCountdown)
314 case IT_STRENGTH: item_name = "item-invis"; item_color = '0 0 1'; break;
315 case IT_NAILS: item_name = "item-extralife"; item_color = '1 0 0'; break;
316 case IT_INVINCIBLE: item_name = "item-speed"; item_color = '1 0 1'; break;
321 MUTATOR_HOOKFUNCTION(minstagib_GiveItem)
323 if(giveitem.ammo_cells)
325 // play some cool sounds ;)
326 if (clienttype(giveplayer) == CLIENTTYPE_REAL)
328 if(giveplayer.health <= 5)
329 AnnounceTo(giveplayer, "lastsecond");
330 else if(giveplayer.health < 50)
331 AnnounceTo(giveplayer, "narrowly");
334 if(giveplayer.health < 100)
335 giveplayer.health = 100;
337 player_pickedup = TRUE;
343 MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsString)
345 ret_string = strcat(ret_string, ":MinstaGib");
349 MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsPrettyString)
351 ret_string = strcat(ret_string, ", MinstaGib");
355 MUTATOR_DEFINITION(mutator_minstagib)
357 MUTATOR_HOOK(BotShouldAttack, minstagib_BotShouldAttack, CBC_ORDER_ANY);
358 MUTATOR_HOOK(PlayerPhysics, minstagib_PlayerPhysics, CBC_ORDER_ANY);
359 MUTATOR_HOOK(PlayerSpawn, minstagib_PlayerSpawn, CBC_ORDER_ANY);
360 MUTATOR_HOOK(PlayerDamage_Calculate, minstagib_PlayerDamage, CBC_ORDER_ANY);
361 MUTATOR_HOOK(PlayStrengthSound, minstagib_PlayStrengthSound, CBC_ORDER_ANY);
362 MUTATOR_HOOK(MakePlayerObserver, minstagib_MakePlayerObserver, CBC_ORDER_ANY);
363 MUTATOR_HOOK(SetStartItems, minstagib_SetStartItems, CBC_ORDER_ANY);
364 MUTATOR_HOOK(Item_GiveTo, minstagib_GiveItem, CBC_ORDER_ANY);
365 MUTATOR_HOOK(FilterItem, minstagib_FilterItem, CBC_ORDER_ANY);
366 MUTATOR_HOOK(Item_RespawnCountdown, minstagib_ItemCountdown, CBC_ORDER_ANY);
367 MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, minstagib_SplitHealthArmor, CBC_ORDER_ANY);
368 MUTATOR_HOOK(PlayerPowerups, minstagib_PlayerPowerups, CBC_ORDER_ANY);
369 MUTATOR_HOOK(ForbidThrowCurrentWeapon, minstagib_ForbidThrowing, CBC_ORDER_ANY);
370 MUTATOR_HOOK(PlayerPreThink, minstagib_PlayerPreThink, CBC_ORDER_ANY);
371 MUTATOR_HOOK(BuildMutatorsString, minstagib_BuildMutatorsString, CBC_ORDER_ANY);
372 MUTATOR_HOOK(BuildMutatorsPrettyString, minstagib_BuildMutatorsPrettyString, CBC_ORDER_ANY);