]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/nades/nades.qh
Merge branch 'bones_was_here/monsterstuff' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / nades / nades.qh
1 #pragma once
2
3 #include <common/teams.qh>
4
5 #ifdef SVQC
6 bool autocvar_g_nades;
7 bool autocvar_g_nades_override_dropweapon = true;
8 vector autocvar_g_nades_throw_offset;
9 bool autocvar_g_nades_onspawn;
10 int autocvar_g_nades_spawn_count;
11 float autocvar_g_nades_spawn_health_respawn;
12 float autocvar_g_nades_spawn_destroy_damage = 25;
13 bool autocvar_g_nades_client_select;
14 bool autocvar_g_nades_pickup = true;
15 float autocvar_g_nades_pickup_time = 2;
16 float autocvar_g_nades_nade_lifetime;
17 float autocvar_g_nades_nade_minforce;
18 float autocvar_g_nades_nade_maxforce;
19 float autocvar_g_nades_nade_health;
20 float autocvar_g_nades_nade_refire;
21 float autocvar_g_nades_nade_damage;
22 float autocvar_g_nades_nade_edgedamage;
23 float autocvar_g_nades_nade_radius;
24 float autocvar_g_nades_nade_force;
25 int autocvar_g_nades_nade_newton_style;
26 bool autocvar_g_nades_napalm;
27 int autocvar_g_nades_napalm_ball_count;
28 float autocvar_g_nades_napalm_ball_spread;
29 float autocvar_g_nades_napalm_ball_damage;
30 float autocvar_g_nades_napalm_ball_damageforcescale;
31 float autocvar_g_nades_napalm_ball_lifetime;
32 float autocvar_g_nades_napalm_ball_radius;
33 bool autocvar_g_nades_napalm_blast;
34 float autocvar_g_nades_napalm_fountain_lifetime;
35 float autocvar_g_nades_napalm_fountain_delay;
36 float autocvar_g_nades_napalm_fountain_radius;
37 float autocvar_g_nades_napalm_fountain_damage;
38 float autocvar_g_nades_napalm_fountain_edgedamage;
39 float autocvar_g_nades_napalm_burntime;
40 bool autocvar_g_nades_napalm_selfdamage;
41 int autocvar_g_nades_nade_type;
42 int autocvar_g_nades_bonus_type;
43 bool autocvar_g_nades_bonus;
44 bool autocvar_g_nades_bonus_onstrength;
45 bool autocvar_g_nades_bonus_client_select;
46 bool autocvar_g_nades_bonus_only;
47 int autocvar_g_nades_bonus_max;
48 int autocvar_g_nades_bonus_score_max;
49 int autocvar_g_nades_bonus_score_time;
50 int autocvar_g_nades_bonus_score_time_flagcarrier;
51 int autocvar_g_nades_bonus_score_minor;
52 int autocvar_g_nades_bonus_score_low;
53 int autocvar_g_nades_bonus_score_high;
54 int autocvar_g_nades_bonus_score_medium;
55 int autocvar_g_nades_bonus_score_spree;
56 bool autocvar_g_nades_ice = true;
57 float autocvar_g_nades_ice_freeze_time;
58 float autocvar_g_nades_ice_health;
59 bool autocvar_g_nades_ice_explode;
60 bool autocvar_g_nades_ice_teamcheck;
61 bool autocvar_g_nades_translocate = true;
62 float autocvar_g_nades_translocate_destroy_damage = 25;
63 bool autocvar_g_nades_spawn = true;
64 bool autocvar_g_nades_heal = true;
65 float autocvar_g_nades_heal_time;
66 float autocvar_g_nades_heal_rate;
67 float autocvar_g_nades_heal_friend;
68 float autocvar_g_nades_heal_foe;
69 bool autocvar_g_nades_entrap;
70 float autocvar_g_nades_entrap_strength = 0.01;
71 float autocvar_g_nades_entrap_speed = 0.5;
72 float autocvar_g_nades_entrap_radius = 500;
73 float autocvar_g_nades_entrap_time = 10;
74 bool autocvar_g_nades_veil;
75 float autocvar_g_nades_veil_time = 8;
76 float autocvar_g_nades_veil_radius = 300;
77 bool autocvar_g_nades_ammo;
78 float autocvar_g_nades_ammo_time;
79 float autocvar_g_nades_ammo_rate;
80 float autocvar_g_nades_ammo_friend;
81 float autocvar_g_nades_ammo_foe;
82 bool autocvar_g_nades_darkness;
83 bool autocvar_g_nades_darkness_explode;
84 bool autocvar_g_nades_darkness_teamcheck;
85 float autocvar_g_nades_darkness_time;
86 bool autocvar_g_nades_pokenade;
87 string autocvar_g_nades_pokenade_monster_type;
88 float autocvar_g_nades_pokenade_monster_lifetime;
89 #endif
90
91 // use slots 70-100
92 const int PROJECTILE_NADE = 71;
93 const int PROJECTILE_NADE_BURN = 72;
94 const int PROJECTILE_NADE_NAPALM = 73;
95 const int PROJECTILE_NADE_NAPALM_BURN = 74;
96 const int PROJECTILE_NAPALM_FOUNTAIN = 75;
97 const int PROJECTILE_NADE_ICE = 76;
98 const int PROJECTILE_NADE_ICE_BURN = 77;
99 const int PROJECTILE_NADE_TRANSLOCATE = 78;
100 const int PROJECTILE_NADE_SPAWN = 79;
101 const int PROJECTILE_NADE_HEAL = 80;
102 const int PROJECTILE_NADE_HEAL_BURN = 81;
103 const int PROJECTILE_NADE_MONSTER = 82;
104 const int PROJECTILE_NADE_MONSTER_BURN = 83;
105 const int PROJECTILE_NADE_ENTRAP = 84;
106 const int PROJECTILE_NADE_ENTRAP_BURN = 85;
107 const int PROJECTILE_NADE_VEIL = 86;
108 const int PROJECTILE_NADE_VEIL_BURN = 87;
109 const int PROJECTILE_NADE_AMMO = 88;
110 const int PROJECTILE_NADE_AMMO_BURN = 89;
111 const int PROJECTILE_NADE_DARKNESS = 90;
112 const int PROJECTILE_NADE_DARKNESS_BURN = 91;
113
114 REGISTRY(Nades, BITS(4))
115 REGISTER_REGISTRY(Nades)
116 REGISTRY_CHECK(Nades)
117
118 #define REGISTER_NADE(id) REGISTER(Nades, NADE_TYPE, id, m_id, NEW(Nade))
119
120 CLASS(Nade, Object)
121     ATTRIB(Nade, m_id, int, 0);
122     ATTRIB(Nade, m_color, vector, '0 0 0');
123     ATTRIB(Nade, m_name, string, _("Grenade"));
124     ATTRIB(Nade, m_icon, string, "nade_normal");
125     ATTRIB(Nade, m_alpha, float, 1);
126     ATTRIBARRAY(Nade, m_projectile, int, 2);
127     ATTRIBARRAY(Nade, m_trail, entity, 2);
128     METHOD(Nade, display, void(entity this, void(string name, string icon) returns)) {
129         returns(this.m_name, sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.m_icon));
130     }
131 ENDCLASS(Nade)
132
133 REGISTER_NADE(Null);
134 REGISTRY_DEFINE_GET(Nades, NADE_TYPE_Null)
135
136 Nade Nade_FromProjectile(int proj)
137 {
138     FOREACH(Nades, true, {
139         if (it.m_projectile[0] == proj || it.m_projectile[1] == proj) return it;
140     });
141     return NADE_TYPE_Null;
142 }
143
144 #ifdef GAMEQC
145 #include "effects.inc"
146 #endif
147
148 #include "nades.inc"
149
150 .float orb_lifetime;
151 .float orb_radius;
152
153 #ifdef GAMEQC
154 REPLICATE_INIT(int, cvar_cl_nade_type);
155 REPLICATE_INIT(string, cvar_cl_pokenade_type);
156 #endif
157
158 #ifdef SVQC
159
160 .entity nade;
161 .entity fake_nade;
162 .float nade_refire;
163 .float nade_special_time;
164 .string pokenade_type;
165 .entity nade_damage_target;
166 .float cvar_cl_nade_type;
167 .string cvar_cl_pokenade_type;
168 .float toss_time;
169 .float nade_show_particles;
170 .float nade_veil_time;
171 .float nade_veil_prevalpha;
172 .float nade_entrap_time;
173 .float nade_ammo_time;
174 .float nade_darkness_time;
175
176 bool orb_send(entity this, entity to, int sf);
177
178 // Remove nades that are being thrown
179 void nades_Clear(entity player);
180
181 // Give a bonus grenade to a player
182 void nades_GiveBonus(entity player, float score);
183
184 /**
185  * called to adjust nade damage and force on hit
186  */
187 #define EV_Nade_Damage(i, o) \
188     /** nade */   i(entity, MUTATOR_ARGV_0_entity) \
189         /** weapon */ i(entity, MUTATOR_ARGV_1_entity) \
190     /** force */  i(vector, MUTATOR_ARGV_2_vector) \
191     /**/          o(vector, MUTATOR_ARGV_2_vector) \
192         /** damage */ i(float,  MUTATOR_ARGV_3_float) \
193     /**/          o(float,  MUTATOR_ARGV_3_float) \
194     /**/
195 MUTATOR_HOOKABLE(Nade_Damage, EV_Nade_Damage);
196
197 #endif
198
199 #ifdef CSQC
200 bool Projectile_isnade(int proj); // TODO: remove
201
202 void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time); // TODO: mutator
203 #endif