]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/w_laser.c
More changes by Vortex (bots, weapon system)
[divverent/nexuiz.git] / qcsrc / gamec / w_laser.c
1 void() laser_ready_01;
2 void() laser_fire1_01;
3 void() laser_fire2_01;
4 void() laser_fire3_01;
5 void() laser_deselect_01;
6 void() laser_select_01;
7
8 float() laser_check = {return TRUE;};
9
10 void(float req) w_laser =
11 {
12         if (req == WR_IDLE)
13                 laser_ready_01();
14         else if (req == WR_FIRE1)
15                 weapon_prepareattack(laser_check, laser_check, laser_fire1_01, 0.4);
16         else if (req == WR_FIRE2)
17                 weapon_prepareattack(laser_check, laser_check, laser_fire2_01, 0.3);
18         else if (req == WR_FIRE3)
19                 weapon_prepareattack(laser_check, laser_check, laser_fire3_01, 0.3);
20         else if (req == WR_RAISE)
21                 laser_select_01();
22         else if (req == WR_UPDATECOUNTS)
23                 self.currentammo = 1;
24         else if (req == WR_DROP)
25                 laser_deselect_01();
26         else if (req == WR_SETUP)
27                 weapon_setup(WEP_LASER, "w_laser.zym", 0);
28         else if (req == WR_CHECKAMMO)
29                 weapon_hasammo = laser_check();
30 };               
31
32 void W_Laser_Touch (void)
33 {
34         vector  dir;
35
36         if (other == self.owner)
37                 return;
38         else if (pointcontents (self.origin) == CONTENT_SKY)
39         {
40                 remove (self);
41                 return;
42         }
43
44         dir = normalize (self.owner.origin - self.origin);
45
46         /*
47         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
48         WriteByte (MSG_BROADCAST, TE_FLAMEJET);
49         WriteCoord (MSG_BROADCAST, self.origin_x);
50         WriteCoord (MSG_BROADCAST, self.origin_y);
51         WriteCoord (MSG_BROADCAST, self.origin_z);
52         WriteCoord (MSG_BROADCAST, 0);          // SeienAbunae: groan... Useless clutter
53         WriteCoord (MSG_BROADCAST, 0);
54         WriteCoord (MSG_BROADCAST, 0);
55         WriteByte (MSG_BROADCAST, 155); */
56
57         
58
59         self.event_damage = SUB_Null;
60         RadiusDamage (self, self.owner, 15, 20, 50, world, 200, IT_LASER);
61         sound (self, CHAN_IMPACT, "weapons/laserimpact.wav", 1, ATTN_NORM);
62
63         remove (self);
64 }
65
66 void W_Laser_Attack (void)
67 {
68         weapon_shotdir(18, 5, -12);
69         // self.origin + self.view_ofs + v_forward * 18 + v_right * 5 + v_up * -12);
70         sound (self, CHAN_WEAPON, "weapons/crylink.wav", 1, ATTN_NORM);
71         //org = self.origin + self.view_ofs + v_forward * 10 + v_right * 5 + v_up * -14;        
72         FireLaser (self.shotorg, self.origin + self.shotdir*4096, 25, IT_LASER);
73         te_spark(trace_endpos, self.shotdir, 55);
74         self.attack_finished = time + 0.400;
75 }
76
77 void W_Laser_Attack2 (void)
78 {
79         entity  missile;
80
81         makevectors(self.v_angle);
82
83         sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", 1, ATTN_NORM);
84
85         missile = spawn ();
86         missile.owner = self;
87         missile.classname = "spike";
88
89         missile.movetype = MOVETYPE_FLY;
90         missile.solid = SOLID_BBOX;
91
92         setmodel (missile, "models/laser.mdl");
93         setsize (missile, '0 0 0', '0 0 0');
94         setorigin (missile, self.origin + self.view_ofs + v_forward * 18 + v_right * 5 + v_up * -12);
95
96         missile.velocity = v_forward * 1000;
97         missile.velocity = missile.velocity + v_right * ( crandom() * 45 );
98         missile.velocity = missile.velocity + v_up * ( crandom() * 25 );
99         missile.angles = vectoangles (missile.velocity);
100         missile.glow_color = 250; // 244, 250
101         missile.glow_size = 30;
102         missile.touch = W_Laser_Touch;
103         missile.think = SUB_Remove;
104         missile.nextthink = time + 9;
105
106         missile.effects = missile.effects | EF_ADDITIVE;
107
108         self.punchangle_x = random () - 0.5;
109         self.punchangle_y = random () - 0.5;
110         self.punchangle_z = random () - 0.5;
111
112         self.attack_finished = time + 0.3;
113 }
114
115 // weapon frames 
116
117 void()  laser_ready_01 =        {weapon_thinkf(WFRAME_IDLE, 0.1, laser_ready_01); self.weaponentity.state = WS_READY;};
118 void()  laser_select_01 =       {weapon_thinkf(-1, 0.3, w_ready); weapon_boblayer1(16, '0 0 0');};
119 void()  laser_deselect_01 =     {weapon_thinkf(-1, 0.3, w_clear); weapon_boblayer1(16, '0 20 -40');};
120 void()  laser_fire1_01 =        
121 {
122         weapon_doattack(laser_check, laser_check, W_Laser_Attack);
123         weapon_thinkf(WFRAME_FIRE1, 0.3, laser_ready_01);
124 };
125 void()  laser_fire2_01 =        
126 {
127         weapon_doattack(laser_check, laser_check, W_Laser_Attack2);
128         weapon_thinkf(WFRAME_FIRE1, 0.2, laser_ready_01);
129 };
130 void()  laser_fire3_01 =        
131 {
132         weapon_doattack(laser_check, laser_check, W_Laser_Attack2);
133         weapon_thinkf(WFRAME_FIRE1, 0.2, laser_ready_01);
134 };
135