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