]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/w_healgun.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / w_healgun.c
1 void() healgun_ready_01;\r
2 void() healgun_fire1_01;\r
3 void() healgun_deselect_01;\r
4 void() healgun_select_01;\r
5 \r
6 \r
7 float is_ally (entity targ, entity attacker);\r
8 \r
9 \r
10 float() healgun_check =\r
11 {\r
12         return TRUE;\r
13 };\r
14 \r
15 void(float req) w_healgun =\r
16 {\r
17         if (req == WR_IDLE)\r
18                 healgun_ready_01();\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
31 };\r
32 \r
33 void W_Healgun_Attack (void)\r
34 {\r
35         local vector org;\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
39 \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
42 \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
48 \r
49 \r
50         if(trace_ent.classname != "player" && trace_ent.classname != "body")\r
51                 return;\r
52         if(is_ally(trace_ent, self)) {\r
53                 // heal, drain 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
58 \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
61         }\r
62         else {\r
63                 // drain, heal self\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
67 \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
70         }\r
71 \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
76 \r
77         self.health = newhp;\r
78 \r
79 \r
80         // heal or damage the target\r
81         newhp = bound(5,\r
82                                         trace_ent.health + targheal,\r
83                                         cvar("g_balance_healgun_targhp_maxratio"));\r
84 \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
87         else\r
88                 trace_ent.health = newhp;\r
89 \r
90 }\r
91 // weapon frames\r
92 \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
97 {\r
98         if (self.button0)\r
99         {\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
102         }\r
103         else\r
104                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_ready_01);\r
105 };\r
106 void()  healgun_fire1_01 =\r
107 {\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
110 };\r
111 \r