3 /* WEP_##id */ MINSTANEX,
4 /* function */ w_minstanex,
5 /* ammotype */ IT_CELLS,
7 /* flags */ WEP_FLAG_RELOADABLE | WEP_FLAG_CANCLIMB | WEP_FLAG_SUPERWEAPON | WEP_TYPE_HITSCAN,
8 /* rating */ BOT_PICKUP_RATING_HIGH,
9 /* model */ "minstanex",
10 /* netname */ "minstanex",
11 /* fullname */ _("MinstaNex")
14 #define MINSTANEX_SETTINGS(w_cvar,w_prop) \
15 w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, ammo) \
16 w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, animtime) \
17 w_cvar(WEP_MINSTANEX, minstanex, MO_PRI, refire) \
18 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, ammo) \
19 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, animtime) \
20 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, damage) \
21 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, delay) \
22 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, edgedamage) \
23 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, force) \
24 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, lifetime) \
25 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, radius) \
26 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, refire) \
27 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, shotangle) \
28 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, speed) \
29 w_cvar(WEP_MINSTANEX, minstanex, MO_SEC, spread) \
30 w_prop(WEP_MINSTANEX, minstanex, float, reloading_ammo, reload_ammo) \
31 w_prop(WEP_MINSTANEX, minstanex, float, reloading_time, reload_time) \
32 w_prop(WEP_MINSTANEX, minstanex, float, switchdelay_raise, switchdelay_raise) \
33 w_prop(WEP_MINSTANEX, minstanex, float, switchdelay_drop, switchdelay_drop) \
34 w_prop(WEP_MINSTANEX, minstanex, string, weaponreplace, weaponreplace) \
35 w_prop(WEP_MINSTANEX, minstanex, float, weaponstart, weaponstart)
38 MINSTANEX_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
39 .float minstanex_lasthit;
44 void spawnfunc_weapon_minstanex (void) { weapon_defaultspawnfunc(WEP_MINSTANEX); }
46 void W_MinstaNex_Attack (void)
49 flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
51 W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CH_WEAPON_A, 10000);
55 FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, 10000, 800, 0, 0, 0, 0, WEP_MINSTANEX);
58 Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
59 if(damage_goodhits && self.minstanex_lasthit)
61 Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
62 damage_goodhits = 0; // only every second time
65 self.minstanex_lasthit = damage_goodhits;
67 pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
69 // teamcolor / hit beam effect
71 v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
74 case NUM_TEAM_1: // Red
76 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, v);
78 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, v);
80 case NUM_TEAM_2: // Blue
82 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, v);
84 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, v);
86 case NUM_TEAM_3: // Yellow
88 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, v);
90 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, v);
92 case NUM_TEAM_4: // Pink
94 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, v);
96 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, v);
100 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3_HIT"), w_shotorg, v);
102 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
106 W_DecreaseAmmo(ammo_cells, ((g_minstagib) ? 1 : WEP_CVAR_PRI(minstanex, ammo)), WEP_CVAR(minstanex, reload_ammo));
109 float w_minstanex(float req)
112 float minstanex_ammo;
114 // now multiple WR_s use this
115 minstanex_ammo = ((g_minstagib) ? 1 : WEP_CVAR_PRI(minstanex, ammo));
121 if(self.ammo_cells > 0)
122 self.BUTTON_ATCK = bot_aim(1000000, 0, 1, FALSE);
124 self.BUTTON_ATCK2 = bot_aim(WEP_CVAR_SEC(minstanex, speed), 0, WEP_CVAR_SEC(minstanex, lifetime), FALSE); // WEAPONTODO: replace with proper minstanex cvars
130 // if the laser uses load, we also consider its ammo for reloading
131 if(WEP_CVAR(minstanex, reload_ammo) && WEP_CVAR_SEC(minstanex, ammo) && self.clip_load < min(minstanex_ammo, WEP_CVAR_SEC(minstanex, ammo))) // forced reload
132 WEP_ACTION(self.weapon, WR_RELOAD);
133 else if(WEP_CVAR(minstanex, reload_ammo) && self.clip_load < minstanex_ammo) // forced reload
134 WEP_ACTION(self.weapon, WR_RELOAD);
135 else if (self.BUTTON_ATCK)
137 if (weapon_prepareattack(0, WEP_CVAR_PRI(minstanex, refire)))
139 W_MinstaNex_Attack();
140 weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(minstanex, animtime), w_ready);
143 else if (self.BUTTON_ATCK2)
145 if (self.jump_interval <= time)
146 if (weapon_prepareattack(1, -1))
148 // handle refire manually, so that primary and secondary can be fired without conflictions (important for minstagib)
149 self.jump_interval = time + WEP_CVAR_SEC(minstanex, refire) * W_WeaponRateFactor();
151 // decrease ammo for the laser?
152 if(WEP_CVAR_SEC(minstanex, ammo))
153 W_DecreaseAmmo(ammo_cells, WEP_CVAR_SEC(minstanex, ammo), WEP_CVAR(minstanex, reload_ammo));
155 // ugly minstagib hack to reuse the fire mode of the laser
158 self.weapon = WEP_BLASTER;
160 WEP_CVAR_SEC(minstanex, shotangle),
161 WEP_CVAR_SEC(minstanex, damage),
162 WEP_CVAR_SEC(minstanex, edgedamage),
163 WEP_CVAR_SEC(minstanex, radius),
164 WEP_CVAR_SEC(minstanex, force),
165 WEP_CVAR_SEC(minstanex, speed),
166 WEP_CVAR_SEC(minstanex, spread),
167 WEP_CVAR_SEC(minstanex, delay),
168 WEP_CVAR_SEC(minstanex, lifetime)
172 // now do normal refire
173 weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(minstanex, animtime), w_ready);
181 precache_model("models/nexflash.md3");
182 precache_model("models/weapons/g_minstanex.md3");
183 precache_model("models/weapons/v_minstanex.md3");
184 precache_model("models/weapons/h_minstanex.iqm");
185 precache_sound("weapons/minstanexfire.wav");
186 precache_sound("weapons/nexwhoosh1.wav");
187 precache_sound("weapons/nexwhoosh2.wav");
188 precache_sound("weapons/nexwhoosh3.wav");
189 //W_Blaster(WR_INIT); // Samual: Is this really the proper thing to do? Didn't we already run this previously?
190 MINSTANEX_SETTINGS(WEP_SKIPCVAR, WEP_SET_PROP)
195 self.current_ammo = ammo_cells;
196 self.minstanex_lasthit = 0;
201 ammo_amount = self.ammo_cells >= minstanex_ammo;
202 ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= minstanex_ammo;
207 if(!WEP_CVAR_SEC(minstanex, ammo))
209 ammo_amount = self.ammo_cells >= WEP_CVAR_SEC(minstanex, ammo);
210 ammo_amount += self.(weapon_load[WEP_MINSTANEX]) >= WEP_CVAR_SEC(minstanex, ammo);
215 MINSTANEX_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS)
220 self.minstanex_lasthit = 0;
226 if(WEP_CVAR_SEC(minstanex, ammo))
227 used_ammo = min(minstanex_ammo, WEP_CVAR_SEC(minstanex, ammo));
229 used_ammo = minstanex_ammo;
231 W_Reload(used_ammo, "weapons/reload.wav");
234 case WR_SUICIDEMESSAGE:
236 return WEAPON_THINKING_WITH_PORTALS;
240 return WEAPON_MINSTANEX_MURDER;
247 float w_minstanex(float req)
251 case WR_IMPACTEFFECT:
254 org2 = w_org + w_backoff * 6;
255 pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
257 sound(self, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
263 precache_sound("weapons/neximpact.wav");