1 void() healgun_ready_01;
\r
2 void() healgun_fire1_01;
\r
3 void() healgun_deselect_01;
\r
4 void() healgun_select_01;
\r
7 float is_ally (entity targ, entity attacker);
\r
10 float() healgun_check =
\r
15 void(float req) w_healgun =
\r
19 else if (req == WR_FIRE1 || req == WR_FIRE2)
\r
20 weapon_prepareattack(healgun_check, healgun_check, healgun_fire1_01, cvar("g_balance_healgun_refire"));
\r
21 else if (req == WR_RAISE)
\r
22 healgun_select_01();
\r
23 else if (req == WR_UPDATECOUNTS)
\r
24 self.currentammo = self.ammo_nails;
\r
25 else if (req == WR_DROP)
\r
26 healgun_deselect_01();
\r
27 else if (req == WR_SETUP)
\r
28 weapon_setup(WEP_HEALGUN, "w_uzi.zym", IT_NAILS);
\r
29 else if (req == WR_CHECKAMMO)
\r
30 weapon_hasammo = healgun_check();
\r
33 void W_Healgun_Attack (void)
\r
36 float selfdrain, targheal, newhp;
\r
37 sound (self, CHAN_WEAPON, "weapons/healgun_fire.wav", 1, ATTN_NORM);
\r
38 org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 15);
\r
40 // this attack_finished just enforces a cooldown at the end of a burst
\r
41 self.attack_finished = time + cvar("g_balance_healgun_refire2");
\r
43 traceline(org, org + v_forward * cvar("g_balance_healgun_range"), FALSE, self);
\r
44 // fixme: need a better visual effect
\r
45 // instead, every .5 or 1 seconds send a transluscent glob toward ally or away from enemy (depending on heal/drain)
\r
46 // It can use the biorifle glob model I made for now, until someone makes a better one.
\r
47 te_beam(self, org, trace_endpos);
\r
50 if(trace_ent.classname != "player" && trace_ent.classname != "body")
\r
52 if(is_ally(trace_ent, self)) {
\r
54 if(floor(self.health) <= cvar("g_balance_healgun_selfhp_min"))
\r
55 return; // can't drain anymore
\r
56 if(ceil(trace_ent.health) >= self.max_health*cvar("g_balance_healgun_targhp_maxratio"))
\r
57 return; // already fully healed
\r
59 targheal = cvar("g_balance_healgun_targheal"); // how much to heal
\r
60 selfdrain = cvar("g_balance_healgun_selfdrain"); // how much it costs to heal them
\r
64 // can drain enemy's health even if your health won't increase
\r
65 //if(self.health >= self.health * cvar("g_balance_healgun_selfhp_maxratio"))
\r
66 // return; // already fully healed
\r
68 targheal = 0 - cvar("g_balance_healgun_targdrain"); // how much to drain from targ
\r
69 selfdrain = 0 - cvar("g_balance_healgun_selfheal"); // how much to heal self
\r
72 // take health from user, or heal if stealing
\r
73 newhp = bound(cvar("g_balance_healgun_selfhp_min"),
\r
74 self.health - selfdrain,
\r
75 self.max_health * cvar("g_balance_healgun_selfhp_maxratio"));
\r
77 self.health = newhp;
\r
80 // heal or damage the target
\r
82 trace_ent.health + targheal,
\r
83 cvar("g_balance_healgun_targhp_maxratio"));
\r
85 if(newhp < trace_ent.health)
\r
86 Damage (trace_ent, self, self, trace_ent.health - newhp, WEP_HEALGUN, trace_endpos, '0 0 0');
\r
88 trace_ent.health = newhp;
\r
93 void() healgun_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, healgun_ready_01); self.weaponentity.state = WS_READY;};
\r
94 void() healgun_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};
\r
95 void() healgun_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};
\r
96 void() healgun_fire1_02 =
\r
100 weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack);
\r
101 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02);
\r
104 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_ready_01);
\r
106 void() healgun_fire1_01 =
\r
108 weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack);
\r
109 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02);
\r