3 void() nex_deselect_01;
9 if (cvar("g_minstagib"))
11 if (self.ammo_cells >= 1)
14 if (self.ammo_cells >= cvar("g_balance_nex_ammo"))
20 void nex_selfkill (void)
22 if (!cvar("g_minstagib") || gameover)
25 if (self.ammo_cells <= 0)
29 centerprint(self, "you're dead now...\n");
30 Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
31 stuffcmd(self, "play2 announcer/robotic/terminated.ogg\n");
33 if (self.health == 10)
35 centerprint(self, "^11^7 second left to find some ammo\n");
36 Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
37 stuffcmd(self, "play2 announcer/robotic/1.ogg\n");
39 if (self.health == 20)
41 centerprint(self, "^12^7 seconds left to find some ammo\n");
42 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
43 stuffcmd(self, "play2 announcer/robotic/2.ogg\n");
45 if (self.health == 30)
47 centerprint(self, "^13^7 seconds left to find some ammo\n");
48 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
49 stuffcmd(self, "play2 announcer/robotic/3.ogg\n");
51 if (self.health == 40)
53 centerprint(self, "^14^7 seconds left to find some ammo\n");
54 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
55 stuffcmd(self, "play2 announcer/robotic/4.ogg\n");
57 if (self.health == 50)
59 centerprint(self, "^15^7 seconds left to find some ammo\n");
60 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
61 stuffcmd(self, "play2 announcer/robotic/5.ogg\n");
63 if (self.health == 60)
65 centerprint(self, "^36^7 seconds left to find some ammo\n");
66 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
67 stuffcmd(self, "play2 announcer/robotic/6.ogg\n");
69 if (self.health == 70)
71 centerprint(self, "^37^7 seconds left to find some ammo\n");
72 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
73 stuffcmd(self, "play2 announcer/robotic/7.ogg\n");
75 if (self.health == 80)
77 centerprint(self, "^38^7 seconds left to find some ammo\n");
78 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
79 stuffcmd(self, "play2 announcer/robotic/8.ogg\n");
81 if (self.health == 90)
83 centerprint(self, "^39^7 seconds left to find some ammo\n");
84 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
85 stuffcmd(self, "play2 announcer/robotic/9.ogg\n");
87 if (self.health == 100)
89 weapon_prepareattack(nex_check, nex_check, nex_fire1_01, 1.0);
90 centerprint(self, "get some ammo or\nyou'll be dead in ^310^7 seconds...");
91 Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
92 stuffcmd(self, "play2 announcer/robotic/10.ogg\n");
96 self.think = nex_selfkill;
97 self.nextthink = time + 1;
101 void(float req) w_nex =
105 else if (req == WR_FIRE1)
106 weapon_prepareattack(nex_check, nex_check, nex_fire1_01, cvar("g_balance_nex_refire"));
107 else if (req == WR_RAISE)
109 else if (req == WR_UPDATECOUNTS)
110 self.currentammo = self.ammo_cells;
111 else if (req == WR_DROP)
113 else if (req == WR_SETUP)
114 weapon_setup(WEP_NEX, "w_nex.zym", IT_CELLS);
115 else if (req == WR_CHECKAMMO)
116 weapon_hasammo = nex_check();
120 void W_Nex_Attack (void)
122 local vector org, org2;
125 local vector trueaim;
126 trueaim = W_TrueAim();
128 sound (self, CHAN_WEAPON, "weapons/nexfire.ogg", 1, ATTN_NORM);
129 if (self.items & IT_STRENGTH && !cvar("g_minstagib"))
130 sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM);
132 self.punchangle_x = -5;
134 org = self.origin + self.view_ofs + v_forward * 5 + v_right * 14 + v_up * -7;
135 traceline_hitcorpse(self, org, trueaim + normalize(trueaim - org) * 4096, TRUE, self);
136 trueaim = trace_endpos;
138 // assure that nexdamage is high enough in minstagib
139 if (cvar("g_minstagib"))
140 FireRailgunBullet (org, trueaim, 1000, IT_NEX);
142 FireRailgunBullet (org, trueaim, cvar("g_balance_nex_damage"), IT_NEX);
144 // trace as if shot started inside gun
145 traceline_hitcorpse (self,org, trueaim, TRUE, self);
146 // show as if shot started outside of gun
147 org = self.origin + self.view_ofs + v_forward * 35 + v_right * 14 + v_up * -8;
148 org2 = self.origin + self.view_ofs + v_forward * 52 + v_right * 14 + v_up * -8;
150 te_smallflash (org2);
152 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
153 WriteByte (MSG_BROADCAST, 76);
154 WriteCoord (MSG_BROADCAST, org_x);
155 WriteCoord (MSG_BROADCAST, org_y);
156 WriteCoord (MSG_BROADCAST, org_z);
157 WriteCoord (MSG_BROADCAST, trace_endpos_x);
158 WriteCoord (MSG_BROADCAST, trace_endpos_y);
159 WriteCoord (MSG_BROADCAST, trace_endpos_z);
160 WriteCoord (MSG_BROADCAST, 0);
161 WriteCoord (MSG_BROADCAST, 0);
162 WriteCoord (MSG_BROADCAST, 0);
163 // flash and burn the wall
164 te_plasmaburn (trace_endpos);
166 // flame effect at impact
167 dir = trace_plane_normal * 100;
168 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
169 WriteByte (MSG_BROADCAST, TE_FLAMEJET);
170 WriteCoord (MSG_BROADCAST, trace_endpos_x);
171 WriteCoord (MSG_BROADCAST, trace_endpos_y);
172 WriteCoord (MSG_BROADCAST, trace_endpos_z);
173 WriteCoord (MSG_BROADCAST, dir_x);
174 WriteCoord (MSG_BROADCAST, dir_y);
175 WriteCoord (MSG_BROADCAST, dir_z);
176 WriteByte (MSG_BROADCAST, 255);
179 PointSound (trace_endpos, "weapons/neximpact.ogg", 1, ATTN_NORM);
181 if (cvar("g_use_ammunition") && !cvar("g_instagib"))
183 if (cvar("g_minstagib"))
184 self.ammo_cells = self.ammo_cells - 1;
186 self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo");
190 org = self.origin + self.view_ofs + v_forward * 33 + v_right * 14 + v_up * -7;
191 setorigin (flash, org);
192 setmodel (flash, "models/nexflash.md3");
193 flash.velocity = v_forward * 20;
194 flash.angles = vectoangles (flash.velocity);
195 SUB_SetFade (flash, time, 0.4);
196 flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
200 void() nex_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, nex_ready_01); self.weaponentity.state = WS_READY;};
201 void() nex_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); nex_selfkill();};
202 void() nex_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};
203 void() nex_fire1_01 =
205 weapon_doattack(nex_check, nex_check, W_Nex_Attack);
206 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_animtime"), nex_ready_01);