1 #ifndef DEATHTYPES_ALL_H
2 #define DEATHTYPES_ALL_H
4 #include "../notifications.qh"
6 REGISTRY(Deathtypes, BITS(8))
7 #define Deathtypes_from(i) _Deathtypes_from(i, NULL)
8 REGISTER_REGISTRY(Deathtypes)
9 REGISTRY_CHECK(Deathtypes)
11 .entity death_msgself;
12 .entity death_msgmurder;
13 .string death_msgextra;
15 int dt_identity(int i) { return i; }
17 #define REGISTER_DEATHTYPE(id, msg_death, msg_death_by, extra) \
18 REGISTER(Deathtypes, DEATH, id, m_id, new_pure(deathtype)) { \
19 this.m_id += DT_FIRST; \
20 this.nent_name = #id; \
21 this.death_msgextra = extra; \
22 if (msg_death != NO_MSG) this.death_msgself = msg_multi_notifs[dt_identity(msg_death - 1)]; \
23 if (msg_death_by != NO_MSG) this.death_msgmurder = msg_multi_notifs[dt_identity(msg_death_by - 1)]; \
26 const int DEATH_WEAPONMASK = BITS(8);
27 const int HITTYPE_SECONDARY = BITS(1) << 8;
28 /** automatically set by RadiusDamage */
29 const int HITTYPE_SPLASH = BITS(1) << 9;
30 const int HITTYPE_BOUNCE = BITS(1) << 10;
32 const int HITTYPE_RESERVED = BITS(1) << 11;
33 const int HITTYPE_RESERVED2 = BITS(1) << 12;
34 const int DEATH_HITTYPEMASK = HITTYPE_SECONDARY | HITTYPE_SPLASH | HITTYPE_BOUNCE | HITTYPE_RESERVED | HITTYPE_RESERVED2;
35 // normal deaths begin
36 const int DT_FIRST = BIT(13);
38 #define DEATH_ISSPECIAL(t) (t >= DT_FIRST)
39 #define DEATH_IS(t, dt) (DEATH_ISSPECIAL(t) && (Deathtypes_from(t - DT_FIRST)) == dt)
40 #define DEATH_ENT(t) (DEATH_ISSPECIAL(t) ? (Deathtypes_from(t - DT_FIRST)) : NULL)
41 #define DEATH_ISVEHICLE(t) (DEATH_ISSPECIAL(t) && (Deathtypes_from(t - DT_FIRST)).death_msgextra == "vehicle")
42 #define DEATH_ISTURRET(t) (DEATH_ISSPECIAL(t) && (Deathtypes_from(t - DT_FIRST)).death_msgextra == "turret")
43 #define DEATH_ISMONSTER(t) (DEATH_ISSPECIAL(t) && (Deathtypes_from(t - DT_FIRST)).death_msgextra == "monster")
44 #define DEATH_WEAPONOF(t) (DEATH_ISSPECIAL(t) ? WEP_Null : Weapons_from((t) & DEATH_WEAPONMASK))
45 #define DEATH_ISWEAPON(t, w) (DEATH_WEAPONOF(t) == (w))
47 string Deathtype_Name(int deathtype);