]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/scout.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / scout.c
1 void SpecialShieldThink()\r
2 {\r
3         if(!self.owner.special_active || self.owner.health <= 0)\r
4         {\r
5                 remove(self.enemy);\r
6                 remove(self);\r
7                 return;\r
8         }\r
9         self.nextthink = time;\r
10 \r
11         // let tag attachment handle this\r
12         //setorigin(self, 0.5*(self.owner.absmin + self.owner.absmax));\r
13         //self.velocity = self.owner.velocity;\r
14 \r
15         self.alpha = 0.3 + 0.3*((self.owner.special_time - time) / cvar("g_balance_shield_duration"));\r
16         if(self.alpha < 0.05)\r
17                 self.alpha = 0.05;\r
18 \r
19         self.enemy.alpha = self.alpha;\r
20         self.enemy.effects = self.effects;\r
21 };\r
22 \r
23 void ActivateSpecialShield(float emergency_shield)\r
24 {\r
25         vector org;\r
26         entity e;\r
27         if(self.special_time > time)\r
28         {\r
29                 return; // currently active or recharging\r
30         }\r
31 \r
32         sprint(self, "<==Shield activated!==>\n");\r
33 \r
34         self.special_active = 1;\r
35         if(emergency_shield)\r
36                 self.special_time = time + cvar("g_balance_shield_emergency_duration");\r
37         else\r
38                 self.special_time = time + cvar("g_balance_shield_duration");\r
39 \r
40         e = spawn();\r
41         e.owner = self;\r
42         e.think = SpecialShieldThink;\r
43         e.nextthink = time;\r
44         e.alpha = 1;\r
45 \r
46         e.colormod_x = 255;\r
47         e.colormod_y = 0;\r
48         e.colormod_z = 128;\r
49         e.colormod = e.colormod * (1/255) * 1.2;\r
50 \r
51         e.effects = EF_ADDITIVE;\r
52 \r
53         e.movetype = MOVETYPE_NONE;\r
54         e.solid = SOLID_NOT;\r
55 \r
56         org = 0.5*(self.absmin + self.absmax) - self.origin;\r
57 \r
58         setmodel(e, "models/misc/shield_s.mdl");\r
59         setorigin(e, org + '0 0 16');//0.5*(self.absmin + self.absmax));\r
60 \r
61         setattachment(e, self, "");\r
62 \r
63         e.enemy = spawn();\r
64         e.enemy.owner = e;\r
65         e.enemy.alpha = 1;\r
66         e.enemy.colormod = e.colormod;\r
67         setmodel(e.enemy, e.model);\r
68 \r
69         // use viewmodelforclient, since setattachment makes it invisible to the player\r
70         e.enemy.viewmodelforclient = self;\r
71         setorigin(e.enemy, e.origin);//'0 0 0');//0.5*(self.absmin + self.absmax));\r
72 \r
73         //setattachment(e.enemy, e, "");\r
74         //setorigin(e.enemy, e.origin);//0.5*(self.absmin + self.absmax));\r
75 }\r
76 \r
77 float SpecialShieldProtect(float damage)\r
78 {\r
79         // check for emergency activate\r
80         if(!self.special_active && self.special_time < time) // shield is off but ready\r
81         {\r
82                 if(damage > self.health - 5) // this attack will be lethal or dang-well close\r
83                         ActivateSpecialShield(TRUE); // emergency activate for less time, but save me\r
84         }\r
85 \r
86         if(!self.special_active || self.special_time < time) // shield is off\r
87                 return damage; // don't alter damage\r
88 \r
89 \r
90         damage = damage - damage * (cvar("g_balance_shield_protection") / 100);\r
91         if(damage < 0)\r
92                 damage = 0;\r
93         return damage;\r
94 }\r
95 \r
96 void ScoutSpecial()\r
97 {\r
98         ActivateSpecialShield(FALSE);\r
99 }\r
100 \r
101 void () FireJetFlame =\r
102 {\r
103         local entity missile;\r
104         local vector org;\r
105         local vector end;\r
106 \r
107         local vector trueaim;\r
108         org = self.origin + self.view_ofs;\r
109         end = self.origin + self.view_ofs + v_forward * 4096;\r
110         traceline(org,end,TRUE,self);\r
111         trueaim = trace_endpos;\r
112 \r
113         sound (self, CHAN_WEAPON, "weapons/flamer.wav", 1, ATTN_NORM);\r
114         self.ammo_nails = self.ammo_nails - 4;\r
115         org = self.origin + self.view_ofs/* + v_forward * 1 + v_right * 14 + v_up * -5*/;\r
116 \r
117         missile = spawn ();\r
118         missile.owner = self;\r
119         missile.classname = "flame";\r
120         missile.think = W_Flamer_Dissipate;\r
121         missile.nextthink = time + 0.01;\r
122         //missile.touch = W_Flamer_Touch;\r
123         missile.solid = SOLID_BBOX;\r
124         setorigin (missile, org);\r
125         setmodel (missile, "models/sprites/hagarexplosion.spr32");\r
126         setsize (missile, '0 0 0', '0 0 0');\r
127         missile.effects = EF_LOWPRECISION | EF_ADDITIVE;\r
128         missile.alpha = 0.7;//0.3;\r
129         missile.scale = 0.005;//0.015;//0.15;\r
130         missile.colormod = '1 1 1'; // set full colors, then reduce later\r
131         missile.frame = random() * 4 + 2;\r
132 \r
133         missile.movetype = MOVETYPE_BOUNCE;\r
134         missile.gravity = -0.07; // fall lightly up\r
135 //      missile.velocity = (v_forward + v_right * crandom() * 0.035 + v_up * crandom() * 0.015) * cvar("g_balance_flamer_speed");\r
136         missile.velocity = normalize(trueaim - org) * 600;\r
137 \r
138         missile.angles = vectoangles (missile.velocity);\r
139 };\r
140 \r
141 void ScoutGrenade(float req)\r
142 {\r
143         if(req == WR_GRENADE1)\r
144         {\r
145                 if (self.ammo_rockets < JETJUMP_NEEDROCKETS)\r
146                 {\r
147                         sprint(self, "You need more rockets to power the JetPack\n");\r
148                         return;\r
149                 }\r
150                 FireJetFlame();\r
151                 self.jump_pad = 1;\r
152                 self.ammo_rockets = self.ammo_rockets - JETJUMP_NEEDROCKETS;\r
153                 self.velocity = v_forward * 900 + '0 0 250' + v_up * 100;\r
154                 self.flags = self.flags - (self.flags & FL_ONGROUND);\r
155                 self.grenade_time = time + 2;\r
156         }\r
157         else if(req == WR_GRENADE2)\r
158         {\r
159                 if(W_ThrowGrenade(W_ConcussionGrenade))\r
160                         self.grenade_time = time + cvar("g_balance_grenade_concussion_refire");         \r
161 //              self.grenade_time = time + 2;\r
162         }\r
163 }\r
164 \r
165 \r
166 void ScoutPreThink()\r
167 {\r
168         if(self.special_time != 0 && self.special_time < time)\r
169         {\r
170                 // the timer has run out\r
171 \r
172                 // shield was active, go into recharge mode\r
173                 if(self.special_active)\r
174                 {\r
175                         self.special_active = 0;\r
176                         self.special_time = time + cvar("g_balance_shield_recharge_time");\r
177                 }\r
178                 else\r
179                 {\r
180                         self.special_time = 0; // finished recharging; ready to activate again\r
181                 }\r
182         }\r
183 }\r
184 \r
185 void ScoutPostThink()\r
186 {\r
187 }\r
188 \r
189 void BecomeScout(float portion)\r
190 {\r
191         self.max_health = cvar("g_balance_class_scout_health") * portion;\r
192 \r
193         self.max_armor = cvar("g_balance_class_scout_armor") * portion;\r
194 \r
195         self.mass = cvar("g_balance_class_scout_mass");\r
196 \r
197         SetPlayerSpeed(self);\r
198 \r
199         self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
200         self.switchweapon = WEP2;\r
201         self.ammo_shells = floor(20 * portion);\r
202         self.ammo_nails = floor(150 * portion);\r
203         self.ammo_rockets = floor(0 * portion);\r
204         self.ammo_cells = floor(0 * portion);\r
205         self.playerclass = TF_CLASS_SCOUT;              // TF P.C.\r
206         SetMaxAmmoFor (1);\r
207 }\r