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 .float healgun_bulletcounter;
\r
34 void W_Healgun_Attack (void)
\r
37 float selfdrain, targheal, newhp;
\r
38 sound (self, CHAN_WEAPON, "weapons/healgun_fire.wav", 1, ATTN_NORM);
\r
39 org = self.origin + self.view_ofs + (v_right * 6) - (v_up * 8) + (v_forward * 15);
\r
41 // this attack_finished just enforces a cooldown at the end of a burst
\r
42 self.attack_finished = time + cvar("g_balance_healgun_refire2");
\r
44 traceline(org, org + v_forward * cvar("g_balance_healgun_range"), FALSE, self);
\r
45 // fixme: need a better visual effect
\r
46 // instead, every .5 or 1 seconds send a transluscent glob toward ally or away from enemy (depending on heal/drain)
\r
47 // It can use the biorifle glob model I made for now, until someone makes a better one.
\r
48 te_beam(self, org, trace_endpos);
\r
51 if(trace_ent.classname != "player" && trace_ent.classname != "body")
\r
53 if(is_ally(trace_ent, self)) {
\r
55 if(floor(self.health) <= cvar("g_balance_healgun_selfhp_min"))
\r
56 return; // can't drain anymore
\r
57 if(ceil(trace_ent.health) >= self.max_health*cvar("g_balance_healgun_targhp_maxratio"))
\r
58 return; // already fully healed
\r
60 targheal = cvar("g_balance_healgun_targheal"); // how much to heal
\r
61 selfdrain = cvar("g_balance_healgun_selfdrain"); // how much it costs to heal them
\r
65 // can drain enemy's health even if your health won't increase
\r
66 //if(self.health >= self.health * cvar("g_balance_healgun_selfhp_maxratio"))
\r
67 // return; // already fully healed
\r
69 targheal = 0 - cvar("g_balance_healgun_targdrain"); // how much to drain from targ
\r
70 selfdrain = 0 - cvar("g_balance_healgun_selfheal"); // how much to heal self
\r
73 // take health from user, or heal if stealing
\r
74 newhp = bound(cvar("g_balance_healgun_selfhp_min"),
\r
75 self.health - selfdrain,
\r
76 self.max_health * cvar("g_balance_healgun_selfhp_maxratio"));
\r
78 self.health = newhp;
\r
81 // heal or damage the target
\r
83 trace_ent.health + targheal,
\r
84 cvar("g_balance_healgun_targhp_maxratio"));
\r
86 if(newhp < trace_ent.health)
\r
87 Damage (trace_ent, self, self, trace_ent.health - newhp, WEP_HEALGUN, trace_endpos, '0 0 0');
\r
89 trace_ent.health = newhp;
\r
94 void() healgun_ready_01 = {weapon_thinkf(WFRAME_IDLE, 0.1, healgun_ready_01); self.weaponentity.state = WS_READY;};
\r
95 void() healgun_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};
\r
96 void() healgun_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};
\r
97 void() healgun_fire1_02 =
\r
101 weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack);
\r
102 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02);
\r
105 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_ready_01);
\r
107 void() healgun_fire1_01 =
\r
109 weapon_doattack(healgun_check, healgun_check, W_Healgun_Attack);
\r
110 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_fire1_02);
\r