-const float PROJECTILE_NADE = 71;
-const float PROJECTILE_NADE_BURN = 72;
-const float PROJECTILE_NADE_NAPALM = 73;
-const float PROJECTILE_NADE_NAPALM_BURN = 74;
-const float PROJECTILE_NAPALM_FOUNTAIN = 75;
-const float PROJECTILE_NADE_ICE = 76;
-const float PROJECTILE_NADE_ICE_BURN = 77;
-const float PROJECTILE_NADE_TRANSLOCATE = 78;
-const float PROJECTILE_NADE_SPAWN = 79;
-const float PROJECTILE_NADE_HEAL = 80;
-const float PROJECTILE_NADE_HEAL_BURN = 81;
-const float PROJECTILE_NADE_MONSTER = 82;
-const float PROJECTILE_NADE_MONSTER_BURN = 83;
-
-const float NADE_TYPE_NORMAL = 1;
-const float NADE_TYPE_NAPALM = 2;
-const float NADE_TYPE_ICE = 3;
-const float NADE_TYPE_TRANSLOCATE = 4;
-const float NADE_TYPE_SPAWN = 5;
-const float NADE_TYPE_HEAL = 6;
-const float NADE_TYPE_MONSTER = 7;
-
-const float NADE_TYPE_LAST = 7; // a check to prevent using higher values & crashing
-
-vector Nade_Color(float nadeid)
-{
- switch(nadeid)
- {
- case NADE_TYPE_NORMAL: return '1 1 1';
- case NADE_TYPE_NAPALM: return '2 0.5 0';
- case NADE_TYPE_ICE: return '0 0.5 2';
- case NADE_TYPE_TRANSLOCATE: return '1 0.0625 1';
- case NADE_TYPE_SPAWN: return '1 0.9 0.06';
- case NADE_TYPE_HEAL: return '1 0 0';
- case NADE_TYPE_MONSTER: return '1 0.5 0';
- }
-
- return '0 0 0';
+const int PROJECTILE_NADE = 71;
+const int PROJECTILE_NADE_BURN = 72;
+const int PROJECTILE_NADE_NAPALM = 73;
+const int PROJECTILE_NADE_NAPALM_BURN = 74;
+const int PROJECTILE_NAPALM_FOUNTAIN = 75;
+const int PROJECTILE_NADE_ICE = 76;
+const int PROJECTILE_NADE_ICE_BURN = 77;
+const int PROJECTILE_NADE_TRANSLOCATE = 78;
+const int PROJECTILE_NADE_SPAWN = 79;
+const int PROJECTILE_NADE_HEAL = 80;
+const int PROJECTILE_NADE_HEAL_BURN = 81;
+const int PROJECTILE_NADE_MONSTER = 82;
+const int PROJECTILE_NADE_MONSTER_BURN = 83;
+
+void RegisterNades();
+const int NADES_MAX = 8;
+entity NADES[NADES_MAX], NADES_first, NADES_last;
+int NADES_COUNT;
+#define REGISTER_NADE(id) REGISTER(RegisterNades, NADE_TYPE, NADES, NADES_COUNT, id, m_id, NEW(Nade))
+REGISTER_REGISTRY(RegisterNades)
+
+CLASS(Nade, Object)
+ ATTRIB(Nade, m_id, int, 0)
+ ATTRIB(Nade, m_color, vector, '0 0 0')
+ ATTRIB(Nade, m_name, string, _("Grenade"))
+ ATTRIB(Nade, m_icon, string, "nade_normal")
+ ATTRIBARRAY(Nade, m_projectile, int, 2)
+ ATTRIBARRAY(Nade, m_trail, string, 2)
+ METHOD(Nade, display, void(entity this, void(string name, string icon) returns)) {
+ returns(this.m_name, sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.m_icon));
+ }
+ENDCLASS(Nade)
+
+REGISTER_NADE(NULL);
+
+#define NADE_PROJECTILE(i, projectile, trail) do { \
+ this.m_projectile[i] = projectile; \
+ this.m_trail[i] = trail; \
+} while (0)
+
+REGISTER_NADE(NORMAL) {
+ this.m_color = '1 1 1';
+ NADE_PROJECTILE(0, PROJECTILE_NADE, string_null);
+ NADE_PROJECTILE(1, PROJECTILE_NADE_BURN, string_null);