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 ScoutGrenade(float req)
\r
103 if(req == WR_GRENADE1)
\r
105 if(W_ThrowGrenade(W_ConcussionGrenade))
\r
106 self.grenade_time = time + cvar("g_balance_grenade_concussion_refire");
\r
108 else if(req == WR_GRENADE2)
\r
111 self.grenade_time = time + 2;
\r
116 void ScoutPreThink()
\r
118 if(self.special_time != 0 && self.special_time < time)
\r
120 // the timer has run out
\r
122 // shield was active, go into recharge mode
\r
123 if(self.special_active)
\r
125 self.special_active = 0;
\r
126 self.special_time = time + cvar("g_balance_shield_recharge_time");
\r
130 self.special_time = 0; // finished recharging; ready to activate again
\r
135 void ScoutPostThink()
\r
139 void BecomeScout(float portion)
\r
141 self.max_health = cvar("g_balance_class_scout_health") * portion;
\r
143 self.max_armor = cvar("g_balance_class_scout_armor") * portion;
\r
145 self.mass = cvar("g_balance_class_scout_mass");
\r
147 SetPlayerSpeed(self);
\r
149 self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;
\r
150 self.switchweapon = WEP2;
\r
151 self.ammo_shells = floor(20 * portion);
\r
152 self.ammo_nails = floor(150 * portion);
\r
153 self.ammo_rockets = floor(0 * portion);
\r
154 self.ammo_cells = floor(0 * portion);
\r
155 self.playerclass = 1; // TF P.C.
\r