]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/w_healgun.c
Added beta healgun, and is_ally() function.
[divverent/nexuiz.git] / 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 .float healgun_bulletcounter;\r
34 void W_Healgun_Attack (void)\r
35 {\r
36         local vector org;\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
40 \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
43 \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
49 \r
50 \r
51         if(trace_ent.classname != "player" && trace_ent.classname != "body")\r
52                 return;\r
53         if(is_ally(trace_ent, self)) {\r
54                 // heal, drain 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
59 \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
62         }\r
63         else {\r
64                 // drain, heal self\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
68 \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
71         }\r
72 \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
77 \r
78         self.health = newhp;\r
79 \r
80 \r
81         // heal or damage the target\r
82         newhp = bound(5,\r
83                                         trace_ent.health + targheal,\r
84                                         cvar("g_balance_healgun_targhp_maxratio"));\r
85 \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
88         else\r
89                 trace_ent.health = newhp;\r
90 \r
91 }\r
92 // weapon frames\r
93 \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
98 {\r
99         if (self.button0)\r
100         {\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
103         }\r
104         else\r
105                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_healgun_refire"), healgun_ready_01);\r
106 };\r
107 void()  healgun_fire1_01 =\r
108 {\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
111 };\r
112 \r