]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/w_nex.c
Stuff now shoots out of what appears to be the actual muzzles of the weapons. I modif...
[divverent/nexuiz.git] / data / qcsrc / server / 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 >= cvar("g_balance_nex_ammo"))
15                         return TRUE;
16         }
17         return FALSE;
18 };
19
20 void nex_selfkill (void)
21 {
22         if (!cvar("g_minstagib") || gameover)
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         self.punchangle_x = -5;
133
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;
137
138         // assure that nexdamage is high enough in minstagib
139         if (cvar("g_minstagib"))
140                 FireRailgunBullet (org, trueaim, 1000, IT_NEX);
141         else
142                 FireRailgunBullet (org, trueaim, cvar("g_balance_nex_damage"), IT_NEX);
143
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;
149         // muzzleflash light
150         te_smallflash (org2);
151         // beam effect
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);
165         /*
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);
177         */
178         // play a sound
179         PointSound (trace_endpos, "weapons/neximpact.ogg", 1, ATTN_NORM);
180
181         if (cvar("g_use_ammunition") && !cvar("g_instagib"))
182         {
183                 if (cvar("g_minstagib"))
184                         self.ammo_cells = self.ammo_cells - 1;
185                 else
186                         self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo");
187         }
188
189         flash = spawn ();
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;
197 }
198
199 // weapon frames
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 =
204 {
205         weapon_doattack(nex_check, nex_check, W_Nex_Attack);
206         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_nex_animtime"), nex_ready_01);
207 };
208