]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/gamec/w_nex.c
add g_navnodeedit
[divverent/nexuiz.git] / data / qcsrc / gamec / w_nex.c
1 void() nex_ready_01;
2 void() nex_fire1_01;
3 void() nex_deselect_01;
4 void() nex_select_01;
5 void() nex_selfkill;
6
7 float() nex_check =
8 {
9         if (cvar("g_minstagib"))
10         {
11                 if (self.ammo_cells >= 1)
12                         return TRUE;
13         } else {
14                 if (self.ammo_cells >= 5)
15                         return TRUE;
16         }
17         return FALSE;
18 };
19
20 void nex_selfkill (void)
21 {
22         if (!cvar("g_minstagib"))
23                 return;
24
25         if (self.ammo_cells <= 0)
26         {
27                 if (self.health == 5)
28                 {
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");
32                 }
33                 if (self.health == 10)
34                 {
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");
38                 }
39                 if (self.health == 20)
40                 {
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");
44                 }
45                 if (self.health == 30)
46                 {
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");
50                 }
51                 if (self.health == 40)
52                 {
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");
56                 }
57                 if (self.health == 50)
58                 {
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");
62                 }
63                 if (self.health == 60)
64                 {
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");
68                 }
69                 if (self.health == 70)
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");
74                 }
75                 if (self.health == 80)
76                 {
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");
80                 }
81                 if (self.health == 90)
82                 {
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");
86                 }
87                 if (self.health == 100)
88                 {
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");
93                 }
94                 
95         }
96         self.think = nex_selfkill;
97         self.nextthink = time + 1;
98         
99 }
100
101 void(float req) w_nex =
102 {
103         if (req == WR_IDLE)
104                 nex_ready_01();
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)
108                 nex_select_01();
109         else if (req == WR_UPDATECOUNTS)
110                 self.currentammo = self.ammo_cells;
111         else if (req == WR_DROP)
112                 nex_deselect_01();
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();
117 };
118
119
120 void W_Nex_Attack (void)
121 {
122         local vector org, org2;
123         local entity flash;
124
125         local vector trueaim;
126         trueaim = W_TrueAim();
127         
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);
131         }
132         
133         self.punchangle_x = -5;
134         
135         org = self.origin + self.view_ofs + v_forward * 5 + v_right * 14 + v_up * -7;
136
137         // assure that nexdamage is high enough in minstagib
138         if (cvar("g_minstagib"))
139                 FireRailgunBullet (org, trueaim, 200, IT_NEX);
140         else
141                 FireRailgunBullet (org, trueaim, cvar("g_balance_nex_damage"), IT_NEX);
142
143         // trace as if shot started inside gun
144         traceline (org, trueaim, TRUE, self);
145         // show as if shot started outside of gun
146         org = self.origin + self.view_ofs + v_forward * 35 + v_right * 14 + v_up * -8;
147         org2 = self.origin + self.view_ofs + v_forward * 52 + v_right * 14 + v_up * -8;
148         // muzzleflash light
149         te_smallflash (org2);
150         // beam effect
151         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
152         WriteByte (MSG_BROADCAST, 76);
153         WriteCoord (MSG_BROADCAST, org_x);
154         WriteCoord (MSG_BROADCAST, org_y);
155         WriteCoord (MSG_BROADCAST, org_z);
156         WriteCoord (MSG_BROADCAST, trace_endpos_x);
157         WriteCoord (MSG_BROADCAST, trace_endpos_y);
158         WriteCoord (MSG_BROADCAST, trace_endpos_z);
159         WriteCoord (MSG_BROADCAST, 0);
160         WriteCoord (MSG_BROADCAST, 0);
161         WriteCoord (MSG_BROADCAST, 0);
162         // flash and burn the wall
163         te_plasmaburn (trace_endpos);
164         /*
165         // flame effect at impact
166         dir = trace_plane_normal * 100;
167         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
168         WriteByte (MSG_BROADCAST, TE_FLAMEJET);
169         WriteCoord (MSG_BROADCAST, trace_endpos_x);
170         WriteCoord (MSG_BROADCAST, trace_endpos_y);
171         WriteCoord (MSG_BROADCAST, trace_endpos_z);
172         WriteCoord (MSG_BROADCAST, dir_x);
173         WriteCoord (MSG_BROADCAST, dir_y);
174         WriteCoord (MSG_BROADCAST, dir_z);
175         WriteByte (MSG_BROADCAST, 255);
176         */
177         // play a sound
178         PointSound (trace_endpos, "weapons/neximpact.ogg", 1, ATTN_NORM);
179
180         if (cvar("g_use_ammunition") && !cvar("g_instagib"))
181         {
182                 if (cvar("g_minstagib"))
183                         self.ammo_cells = self.ammo_cells - 1;
184                 else
185                         self.ammo_cells = self.ammo_cells - 5;
186         }
187
188         flash = spawn ();
189         org = self.origin + self.view_ofs + v_forward * 33 + v_right * 14 + v_up * -7;
190         setorigin (flash, org);
191         setmodel (flash, "models/nexflash.md3");
192         flash.velocity = v_forward * 20;
193         flash.angles = vectoangles (flash.velocity);
194         SUB_SetFade (flash, time, 0.4);
195         flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
196 }
197
198 // weapon frames
199 void()  nex_ready_01 =  {weapon_thinkf(WFRAME_IDLE, 0.1, nex_ready_01); self.weaponentity.state = WS_READY;};
200 void()  nex_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); nex_selfkill();};
201 void()  nex_deselect_01 =       {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};
202 void()  nex_fire1_01 =
203 {
204         weapon_doattack(nex_check, nex_check, W_Nex_Attack);
205         weapon_thinkf(WFRAME_FIRE1, 0.3, nex_ready_01);
206 };
207