]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/w_electro.c
- Added TrueAim(tm)
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / w_electro.c
1 void() electro_ready_01;\r
2 void() electro_fire1_01;\r
3 void() electro_deselect_01;\r
4 void() electro_select_01;\r
5 \r
6 float() electro_check =\r
7 {\r
8         if (self.ammo_cells > 2)\r
9                 return TRUE;\r
10         return FALSE;\r
11 };\r
12 \r
13 void(float req) w_electro =\r
14 {\r
15         if (req == WR_IDLE)\r
16                 electro_ready_01();\r
17         else if (req == WR_FIRE1 || req == WR_FIRE2)\r
18                 weapon_prepareattack(electro_check, electro_check, electro_fire1_01, cvar("g_balance_electro_refire"));\r
19         else if (req == WR_RAISE)\r
20                 electro_select_01();\r
21         else if (req == WR_UPDATECOUNTS)\r
22 //              self.currentammo = floor(self.ammo_cells / 2);          //why divide by 2?\r
23                 self.currentammo = floor(self.ammo_cells);\r
24         else if (req == WR_DROP)\r
25                 electro_deselect_01();\r
26         else if (req == WR_SETUP)\r
27                 weapon_setup(WEP_ELECTRO, "w_electro.zym", IT_CELLS);\r
28         else if (req == WR_CHECKAMMO)\r
29                 weapon_hasammo = electro_check();\r
30 };\r
31 \r
32 void W_Plasma_Explode (void)\r
33 {\r
34         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);\r
35         WriteByte (MSG_BROADCAST, 79);\r
36         WriteCoord (MSG_BROADCAST, self.origin_x);\r
37         WriteCoord (MSG_BROADCAST, self.origin_y);\r
38         WriteCoord (MSG_BROADCAST, self.origin_z);\r
39         WriteCoord (MSG_BROADCAST, 0);          // SeienAbunae: groan... Useless clutter\r
40         WriteCoord (MSG_BROADCAST, 0);\r
41         WriteCoord (MSG_BROADCAST, 0);\r
42         WriteByte (MSG_BROADCAST, 155);\r
43 \r
44         self.event_damage = SUB_Null;\r
45         RadiusDamage (self, self.owner, cvar("g_balance_electro_damage"), cvar("g_balance_electro_edgedamage"), cvar("g_balance_electro_radius"), world, cvar("g_balance_electro_force"), WEP_ELECTRO);\r
46         sound (self, CHAN_BODY, "weapons/electro_impact.wav", 1, ATTN_NORM);\r
47 \r
48         remove (self);\r
49 }\r
50 \r
51 void W_Plasma_Touch (void)\r
52 {\r
53         if (other.classname == "player" || other.classname == "corpse")\r
54                 W_Plasma_Explode ();\r
55         else\r
56                 sound (self, CHAN_IMPACT, "weapons/grenade_bounce.wav", 1, ATTN_NORM);\r
57 }\r
58 \r
59 void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
60 {\r
61         self.health = self.health - damage;\r
62         if (self.health <= 0)\r
63                 W_Plasma_Explode ();\r
64 }\r
65 \r
66 void() W_Electro_Attack\r
67 {\r
68         local entity proj;\r
69         local vector org;\r
70         local float postion;\r
71 \r
72         local vector end;\r
73         local vector trueaim;\r
74         org = self.origin + self.view_ofs;\r
75         end = self.origin + self.view_ofs + v_forward * 4096;\r
76         traceline(org,end,TRUE,self);\r
77         trueaim = trace_endpos;\r
78 \r
79         postion = self.electrocount;\r
80         sound (self, CHAN_WEAPON, "weapons/electro_fire.wav", 1, ATTN_NORM);\r
81 \r
82         self.punchangle_x = -2;\r
83 \r
84         if (cvar("g_use_ammunition"))\r
85                 self.ammo_cells = self.ammo_cells - 2;\r
86 \r
87         if (self.electrocount == 0)\r
88         {\r
89                 self.electrocount = 1;\r
90                 org = self.origin + self.view_ofs + v_forward * 15 + v_right * 5 + v_up * -14;\r
91         }\r
92         else if (self.electrocount == 1)\r
93         {\r
94                 self.electrocount = 2;\r
95                 org = self.origin + self.view_ofs + v_forward * 15 + v_right * 10 + v_up * -12;\r
96         }\r
97         else\r
98         {\r
99                 self.electrocount = 0;\r
100                 org = self.origin + self.view_ofs + v_forward * 15 + v_right * 15 + v_up * -14;\r
101         }\r
102 \r
103         proj = spawn ();\r
104         proj.classname = "plasma";\r
105         proj.owner = self;\r
106         proj.effects = EF_BRIGHTFIELD | EF_ADDITIVE;\r
107         proj.think = W_Plasma_Explode;\r
108         proj.nextthink = time + 2;\r
109         proj.solid = SOLID_BBOX;\r
110         setorigin(proj, org);\r
111 \r
112         if (self.button3)\r
113         {\r
114                 proj.movetype = MOVETYPE_BOUNCE;\r
115                 proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_ballspeed") + v_up * cvar("g_balance_electro_ballspeed_up");\r
116                 proj.touch = W_Plasma_Touch;\r
117                 setmodel(proj, "models/ebomb.mdl");\r
118                 setsize(proj, '-6 -6 -3', '6 6 3');\r
119                 proj.takedamage = DAMAGE_YES;\r
120                 proj.damageforcescale = 4;\r
121                 proj.health = 5;\r
122                 proj.event_damage = W_Plasma_Damage;\r
123         }\r
124         else\r
125         {\r
126                 proj.movetype = MOVETYPE_FLY;\r
127                 proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_speed");\r
128                 proj.angles = vectoangles(proj.velocity);\r
129                 proj.touch = W_Plasma_Explode;\r
130                 setmodel(proj, "models/elaser.mdl");\r
131                 setsize(proj, '0 0 0', '0 0 0');\r
132         }\r
133         sound (proj, CHAN_BODY, "weapons/electro_fly.wav", 1, ATTN_NORM);\r
134 }\r
135 \r
136 // weapon frames\r
137 \r
138 void()  electro_ready_01 =      {weapon_thinkf(WFRAME_IDLE, 0.1, electro_ready_01); self.weaponentity.state = WS_READY;};\r
139 void()  electro_select_01 =     {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};\r
140 void()  electro_deselect_01 =   {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};\r
141 void()  electro_fire1_01 =\r
142 {\r
143         weapon_doattack(electro_check, electro_check, W_Electro_Attack);\r
144         weapon_thinkf(WFRAME_FIRE1, 0.3, electro_ready_01);\r
145 };\r
146 \r