1 void SpecialShieldThink()
\r
3 if(!self.owner.special_active || self.owner.health <= 0)
\r
9 self.nextthink = time;
\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
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
19 self.enemy.alpha = self.alpha;
\r
20 self.enemy.effects = self.effects;
\r
23 void ActivateSpecialShield(float emergency_shield)
\r
27 if(self.special_time > time)
\r
29 return; // currently active or recharging
\r
32 sprint(self, "<==Shield activated!==>\n");
\r
34 self.special_active = 1;
\r
35 if(emergency_shield)
\r
36 self.special_time = time + cvar("g_balance_shield_emergency_duration");
\r
38 self.special_time = time + cvar("g_balance_shield_duration");
\r
42 e.think = SpecialShieldThink;
\r
49 e.colormod = e.colormod * (1/255) * 1.2;
\r
51 e.effects = EF_ADDITIVE;
\r
53 e.movetype = MOVETYPE_NONE;
\r
54 e.solid = SOLID_NOT;
\r
56 org = 0.5*(self.absmin + self.absmax) - self.origin;
\r
58 setmodel(e, "models/misc/shield_s.mdl");
\r
59 setorigin(e, org + '0 0 16');//0.5*(self.absmin + self.absmax));
\r
61 setattachment(e, self, "");
\r
66 e.enemy.colormod = e.colormod;
\r
67 setmodel(e.enemy, e.model);
\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
73 //setattachment(e.enemy, e, "");
\r
74 //setorigin(e.enemy, e.origin);//0.5*(self.absmin + self.absmax));
\r
77 float SpecialShieldProtect(float damage)
\r
79 // check for emergency activate
\r
80 if(!self.special_active && self.special_time < time) // shield is off but ready
\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
86 if(!self.special_active || self.special_time < time) // shield is off
\r
87 return damage; // don't alter damage
\r
90 damage = damage - damage * (cvar("g_balance_shield_protection") / 100);
\r
98 ActivateSpecialShield(FALSE);
\r
101 void () FireJetFlame =
\r
103 local entity missile;
\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
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
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
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
138 missile.angles = vectoangles (missile.velocity);
\r
141 void ScoutGrenade(float req)
\r
143 if(req == WR_GRENADE1)
\r
145 if (self.ammo_rockets < JETJUMP_NEEDROCKETS)
\r
147 sprint(self, "You need more rockets to power the JetPack\n");
\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
157 else if(req == WR_GRENADE2)
\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
166 void ScoutPreThink()
\r
168 if(self.special_time != 0 && self.special_time < time)
\r
170 // the timer has run out
\r
172 // shield was active, go into recharge mode
\r
173 if(self.special_active)
\r
175 self.special_active = 0;
\r
176 self.special_time = time + cvar("g_balance_shield_recharge_time");
\r
180 self.special_time = 0; // finished recharging; ready to activate again
\r
185 void ScoutPostThink()
\r
189 void BecomeScout(float portion)
\r
191 self.max_health = cvar("g_balance_class_scout_health") * portion;
\r
193 self.max_armor = cvar("g_balance_class_scout_armor") * portion;
\r
195 self.mass = cvar("g_balance_class_scout_mass");
\r
197 SetPlayerSpeed(self);
\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