6 #include "../client/sys-pre.qh"
7 #include "../dpdefs/csprogsdefs.qc"
8 #include "../client/sys-post.qh"
9 #include "../client/Defs.qc"
10 #include "../dpdefs/keycodes.qc"
11 #include "constants.qh"
13 #include "../warpzonelib/anglestransform.qh"
14 #include "../warpzonelib/mathlib.qh"
15 #include "../warpzonelib/common.qh"
16 #include "../warpzonelib/client.qh"
17 #include "playerstats.qh"
23 #include "counting.qh"
24 #include "weapons/weapons.qh"
26 #include "command/markup.qh"
27 #include "command/rpn.qh"
28 #include "command/generic.qh"
29 #include "command/shared_defs.qh"
31 #include "animdecide.qh"
32 #include "../client/command/cl_cmd.qh"
33 #include "monsters/monsters.qh"
34 #include "../client/autocvars.qh"
35 #include "notifications.qh"
38 #include "util-pre.qh"
39 #include "../server/sys-pre.qh"
40 #include "../dpdefs/progsdefs.qc"
41 #include "../dpdefs/dpextensions.qc"
42 #include "../server/sys-post.qh"
43 #include "../warpzonelib/anglestransform.qh"
44 #include "../warpzonelib/mathlib.qh"
45 #include "../warpzonelib/common.qh"
46 #include "../warpzonelib/util_server.qh"
47 #include "../warpzonelib/server.qh"
48 #include "constants.qh"
55 #include "counting.qh"
57 #include "command/markup.qh"
58 #include "command/rpn.qh"
59 #include "command/generic.qh"
60 #include "command/shared_defs.qh"
61 #include "net_notice.qh"
62 #include "animdecide.qh"
63 #include "monsters/monsters.qh"
64 #include "monsters/sv_monsters.qh"
65 #include "monsters/spawn.qh"
66 #include "weapons/config.qh"
67 #include "weapons/weapons.qh"
68 #include "../server/weapons/accuracy.qh"
69 #include "../server/weapons/common.qh"
70 #include "../server/weapons/csqcprojectile.qh"
71 #include "../server/weapons/hitplot.qh"
72 #include "../server/weapons/selection.qh"
73 #include "../server/weapons/spawning.qh"
74 #include "../server/weapons/throwing.qh"
75 #include "../server/weapons/tracing.qh"
76 #include "../server/weapons/weaponstats.qh"
77 #include "../server/weapons/weaponsystem.qh"
78 #include "../server/t_items.qh"
79 #include "../server/autocvars.qh"
80 #include "../server/constants.qh"
81 #include "../server/defs.qh"
82 #include "notifications.qh"
85 // ================================
86 // Deathtypes, reworked by Samual
87 // ================================
89 int DEATH_SPECIAL_START;
91 int DEATH_MONSTER_FIRST;
92 int DEATH_MONSTER_LAST;
93 int DEATH_TURRET_FIRST;
94 int DEATH_TURRET_LAST;
99 DEATHTYPE(DEATH_AUTOTEAMCHANGE, DEATH_SELF_AUTOTEAMCHANGE, NO_MSG, DEATH_SPECIAL_START) \
100 DEATHTYPE(DEATH_BUFF_VENGEANCE, NO_MSG, DEATH_MURDER_VENGEANCE, NORMAL_POS) \
101 DEATHTYPE(DEATH_CAMP, DEATH_SELF_CAMP, NO_MSG, NORMAL_POS) \
102 DEATHTYPE(DEATH_CHEAT, DEATH_SELF_CHEAT, DEATH_MURDER_CHEAT, NORMAL_POS) \
103 DEATHTYPE(DEATH_CUSTOM, DEATH_SELF_CUSTOM, NO_MSG, NORMAL_POS) \
104 DEATHTYPE(DEATH_DROWN, DEATH_SELF_DROWN, DEATH_MURDER_DROWN, NORMAL_POS) \
105 DEATHTYPE(DEATH_FALL, DEATH_SELF_FALL, DEATH_MURDER_FALL, NORMAL_POS) \
106 DEATHTYPE(DEATH_FIRE, DEATH_SELF_FIRE, DEATH_MURDER_FIRE, NORMAL_POS) \
107 DEATHTYPE(DEATH_GENERIC, DEATH_SELF_GENERIC, NO_MSG, NORMAL_POS) \
108 DEATHTYPE(DEATH_HURTTRIGGER, DEATH_SELF_VOID, DEATH_MURDER_VOID, NORMAL_POS) \
109 DEATHTYPE(DEATH_KILL, DEATH_SELF_SUICIDE, NO_MSG, NORMAL_POS) \
110 DEATHTYPE(DEATH_LAVA, DEATH_SELF_LAVA, DEATH_MURDER_LAVA, NORMAL_POS) \
111 DEATHTYPE(DEATH_MIRRORDAMAGE, DEATH_SELF_BETRAYAL, NO_MSG, NORMAL_POS) \
112 DEATHTYPE(DEATH_MONSTER_MAGE, DEATH_SELF_MON_MAGE, DEATH_MURDER_MONSTER, DEATH_MONSTER_FIRST) \
113 DEATHTYPE(DEATH_MONSTER_SHAMBLER_CLAW, DEATH_SELF_MON_SHAMBLER_CLAW, DEATH_MURDER_MONSTER, NORMAL_POS) \
114 DEATHTYPE(DEATH_MONSTER_SHAMBLER_SMASH, DEATH_SELF_MON_SHAMBLER_SMASH, DEATH_MURDER_MONSTER, NORMAL_POS) \
115 DEATHTYPE(DEATH_MONSTER_SHAMBLER_ZAP, DEATH_SELF_MON_SHAMBLER_ZAP, DEATH_MURDER_MONSTER, NORMAL_POS) \
116 DEATHTYPE(DEATH_MONSTER_SPIDER, DEATH_SELF_MON_SPIDER, DEATH_MURDER_MONSTER, NORMAL_POS) \
117 DEATHTYPE(DEATH_MONSTER_WYVERN, DEATH_SELF_MON_WYVERN, DEATH_MURDER_MONSTER, NORMAL_POS) \
118 DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP, DEATH_SELF_MON_ZOMBIE_JUMP, DEATH_MURDER_MONSTER, NORMAL_POS) \
119 DEATHTYPE(DEATH_MONSTER_ZOMBIE_MELEE, DEATH_SELF_MON_ZOMBIE_MELEE, DEATH_MURDER_MONSTER, DEATH_MONSTER_LAST) \
120 DEATHTYPE(DEATH_NADE, DEATH_SELF_NADE, DEATH_MURDER_NADE, NORMAL_POS) \
121 DEATHTYPE(DEATH_NADE_NAPALM, DEATH_SELF_NADE_NAPALM, DEATH_MURDER_NADE_NAPALM, NORMAL_POS) \
122 DEATHTYPE(DEATH_NADE_ICE, DEATH_SELF_NADE_ICE, DEATH_MURDER_NADE_ICE, NORMAL_POS) \
123 DEATHTYPE(DEATH_NADE_ICE_FREEZE, DEATH_SELF_NADE_ICE_FREEZE, DEATH_MURDER_NADE_ICE_FREEZE, NORMAL_POS) \
124 DEATHTYPE(DEATH_NADE_HEAL, DEATH_SELF_NADE_HEAL, DEATH_MURDER_NADE_HEAL, NORMAL_POS) \
125 DEATHTYPE(DEATH_NOAMMO, DEATH_SELF_NOAMMO, NO_MSG, NORMAL_POS) \
126 DEATHTYPE(DEATH_ROT, DEATH_SELF_ROT, NO_MSG, NORMAL_POS) \
127 DEATHTYPE(DEATH_SHOOTING_STAR, DEATH_SELF_SHOOTING_STAR, DEATH_MURDER_SHOOTING_STAR, NORMAL_POS) \
128 DEATHTYPE(DEATH_SLIME, DEATH_SELF_SLIME, DEATH_MURDER_SLIME, NORMAL_POS) \
129 DEATHTYPE(DEATH_SWAMP, DEATH_SELF_SWAMP, DEATH_MURDER_SWAMP, NORMAL_POS) \
130 DEATHTYPE(DEATH_TEAMCHANGE, DEATH_SELF_TEAMCHANGE, NO_MSG, NORMAL_POS) \
131 DEATHTYPE(DEATH_TELEFRAG, NO_MSG, DEATH_MURDER_TELEFRAG, NORMAL_POS) \
132 DEATHTYPE(DEATH_TOUCHEXPLODE, DEATH_SELF_TOUCHEXPLODE, DEATH_MURDER_TOUCHEXPLODE, NORMAL_POS) \
133 DEATHTYPE(DEATH_TURRET, DEATH_SELF_TURRET, NO_MSG, DEATH_TURRET_FIRST) \
134 DEATHTYPE(DEATH_TURRET_EWHEEL, DEATH_SELF_TURRET_EWHEEL, NO_MSG, NORMAL_POS) \
135 DEATHTYPE(DEATH_TURRET_FLAC, DEATH_SELF_TURRET_FLAC, NO_MSG, NORMAL_POS) \
136 DEATHTYPE(DEATH_TURRET_HELLION, DEATH_SELF_TURRET_HELLION, NO_MSG, NORMAL_POS) \
137 DEATHTYPE(DEATH_TURRET_HK, DEATH_SELF_TURRET_HK, NO_MSG, NORMAL_POS) \
138 DEATHTYPE(DEATH_TURRET_MACHINEGUN, DEATH_SELF_TURRET_MACHINEGUN, NO_MSG, NORMAL_POS) \
139 DEATHTYPE(DEATH_TURRET_MLRS, DEATH_SELF_TURRET_MLRS, NO_MSG, NORMAL_POS) \
140 DEATHTYPE(DEATH_TURRET_PHASER, DEATH_SELF_TURRET_PHASER, NO_MSG, NORMAL_POS) \
141 DEATHTYPE(DEATH_TURRET_PLASMA, DEATH_SELF_TURRET_PLASMA, NO_MSG, NORMAL_POS) \
142 DEATHTYPE(DEATH_TURRET_TESLA, DEATH_SELF_TURRET_TESLA, NO_MSG, NORMAL_POS) \
143 DEATHTYPE(DEATH_TURRET_WALK_GUN, DEATH_SELF_TURRET_WALK_GUN, NO_MSG, NORMAL_POS) \
144 DEATHTYPE(DEATH_TURRET_WALK_MEELE, DEATH_SELF_TURRET_WALK_MEELE, NO_MSG, NORMAL_POS) \
145 DEATHTYPE(DEATH_TURRET_WALK_ROCKET, DEATH_SELF_TURRET_WALK_ROCKET, NO_MSG, DEATH_TURRET_LAST) \
146 DEATHTYPE(DEATH_VH_BUMB_DEATH, DEATH_SELF_VH_BUMB_DEATH, DEATH_MURDER_VH_BUMB_DEATH, DEATH_VHFIRST) \
147 DEATHTYPE(DEATH_VH_BUMB_GUN, NO_MSG, DEATH_MURDER_VH_BUMB_GUN, NORMAL_POS) \
148 DEATHTYPE(DEATH_VH_CRUSH, DEATH_SELF_VH_CRUSH, DEATH_MURDER_VH_CRUSH, NORMAL_POS) \
149 DEATHTYPE(DEATH_VH_RAPT_BOMB, DEATH_SELF_VH_RAPT_BOMB, DEATH_MURDER_VH_RAPT_BOMB, NORMAL_POS) \
150 DEATHTYPE(DEATH_VH_RAPT_CANNON, NO_MSG, DEATH_MURDER_VH_RAPT_CANNON, NORMAL_POS) \
151 DEATHTYPE(DEATH_VH_RAPT_DEATH, DEATH_SELF_VH_RAPT_DEATH, DEATH_MURDER_VH_RAPT_DEATH, NORMAL_POS) \
152 DEATHTYPE(DEATH_VH_RAPT_FRAGMENT, DEATH_SELF_VH_RAPT_BOMB, DEATH_MURDER_VH_RAPT_BOMB, NORMAL_POS) \
153 DEATHTYPE(DEATH_VH_SPID_DEATH, DEATH_SELF_VH_SPID_DEATH, DEATH_MURDER_VH_SPID_DEATH, NORMAL_POS) \
154 DEATHTYPE(DEATH_VH_SPID_MINIGUN, NO_MSG, DEATH_MURDER_VH_SPID_MINIGUN, NORMAL_POS) \
155 DEATHTYPE(DEATH_VH_SPID_ROCKET, DEATH_SELF_VH_SPID_ROCKET, DEATH_MURDER_VH_SPID_ROCKET, NORMAL_POS) \
156 DEATHTYPE(DEATH_VH_WAKI_DEATH, DEATH_SELF_VH_WAKI_DEATH, DEATH_MURDER_VH_WAKI_DEATH, NORMAL_POS) \
157 DEATHTYPE(DEATH_VH_WAKI_GUN, NO_MSG, DEATH_MURDER_VH_WAKI_GUN, NORMAL_POS) \
158 DEATHTYPE(DEATH_VH_WAKI_ROCKET, DEATH_SELF_VH_WAKI_ROCKET, DEATH_MURDER_VH_WAKI_ROCKET, DEATH_VHLAST) \
159 DEATHTYPE(DEATH_WEAPON, NO_MSG, NO_MSG, NORMAL_POS)
161 #define DT_FIRST 10000
162 #define DT_MAX 128 // limit of recursive functions with ACCUMULATE_FUNCTION
165 entity deathtypes[DT_MAX];
166 .entity death_msgself;
167 .entity death_msgmurder;
169 #define DEATHTYPE(name,msg_death,msg_death_by,position) \
171 void RegisterDeathtype_##name() \
173 SET_FIRST_OR_LAST(position, DT_FIRST, DT_COUNT) \
174 SET_FIELD_COUNT(name, DT_FIRST, DT_COUNT) \
175 CHECK_MAX_COUNT(name, DT_MAX, DT_COUNT, "deathtypes") \
177 entity deathent = spawn(); \
178 deathtypes[(name - DT_FIRST)] = deathent; \
179 deathent.classname = "deathtype"; \
180 deathent.nent_name = #name; \
181 if (msg_death != NO_MSG) \
182 deathent.death_msgself = msg_multi_notifs[msg_death - 1]; \
183 if (msg_death_by != NO_MSG) \
184 deathent.death_msgmurder = msg_multi_notifs[msg_death_by - 1]; \
186 ACCUMULATE_FUNCTION(RegisterDeathtypes, RegisterDeathtype_##name);
191 #define DEATH_ISSPECIAL(t) ((t) >= DEATH_SPECIAL_START)
192 #define DEATH_ISVEHICLE(t) ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
193 #define DEATH_ISTURRET(t) ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST)
194 #define DEATH_ISMONSTER(t) ((t) >= DEATH_MONSTER_FIRST && (t) <= DEATH_MONSTER_LAST)
195 #define DEATH_WEAPONOFWEAPONDEATH(t) ((t) & DEATH_WEAPONMASK)
196 #define DEATH_ISWEAPON(t,w) (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
197 #define DEATH_WEAPONOF(t) (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
198 #define WEP_VALID(w) ((w) >= WEP_FIRST && (w) <= WEP_LAST)
200 string Deathtype_Name(float deathtype)
202 if(DEATH_ISSPECIAL(deathtype))
204 entity deathent = deathtypes[(deathtype - DT_FIRST)];
205 if (!deathent) { backtrace("Deathtype_Name: Could not find deathtype entity!\n"); return ""; }
206 return deathent.nent_name;
208 else { return ftos(deathtype); }
211 const int DEATH_WEAPONMASK = 0xFF;
212 const int DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
213 const int HITTYPE_SECONDARY = 0x100;
214 const int HITTYPE_SPLASH = 0x200; // automatically set by RadiusDamage
215 const int HITTYPE_BOUNCE = 0x400;
216 const int HITTYPE_RESERVED2 = 0x800;
217 const int HITTYPE_RESERVED = 0x1000; // unused yet