X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fdeathtypes.qh;h=48a269b1a3937271f6e4b10c297d20adac78f629;hb=6781e6a622320df88fe4ae04a337227967e8729f;hp=4a9fa0f2bccda865d1ded70ea089aa8d85bfdacc;hpb=f9fa6dd335236b46b5ea43747868c4da207c08dc;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/deathtypes.qh b/qcsrc/common/deathtypes.qh index 4a9fa0f2bc..48a269b1a3 100644 --- a/qcsrc/common/deathtypes.qh +++ b/qcsrc/common/deathtypes.qh @@ -1,12 +1,66 @@ -// Deathtypes (weapon deathtypes are the IT_* constants below) -// NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too. +// ================================ +// Deathtypes, reworked by Samual +// ================================ + +#define DEATHTYPES \ + DEATHTYPE(DEATH_AUTOTEAMCHANGE, DEATH_SELF_AUTOTEAMCHANGE, NO_MSG, DEATH_SPECIAL_START) \ + DEATHTYPE(DEATH_CAMP, DEATH_SELF_CAMP, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_CHEAT, DEATH_SELF_CHEAT, DEATH_MURDER_CHEAT, NORMAL_POS) \ + DEATHTYPE(DEATH_CUSTOM, DEATH_SELF_CUSTOM, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_DROWN, DEATH_SELF_DROWN, DEATH_MURDER_DROWN, NORMAL_POS) \ + DEATHTYPE(DEATH_FALL, DEATH_SELF_FALL, DEATH_MURDER_FALL, NORMAL_POS) \ + DEATHTYPE(DEATH_FIRE, DEATH_SELF_FIRE, DEATH_MURDER_FIRE, NORMAL_POS) \ + DEATHTYPE(DEATH_GENERIC, DEATH_SELF_GENERIC, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_HURTTRIGGER, DEATH_SELF_VOID, DEATH_MURDER_VOID, NORMAL_POS) \ + DEATHTYPE(DEATH_KILL, DEATH_SELF_SUICIDE, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_LAVA, DEATH_SELF_LAVA, DEATH_MURDER_LAVA, NORMAL_POS) \ + DEATHTYPE(DEATH_MIRRORDAMAGE, DEATH_SELF_BETRAYAL, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_NADE, DEATH_SELF_NADE, DEATH_MURDER_NADE, NORMAL_POS) \ + DEATHTYPE(DEATH_NOAMMO, DEATH_SELF_NOAMMO, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_ROT, DEATH_SELF_ROT, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_SHOOTING_STAR, DEATH_SELF_SHOOTING_STAR, DEATH_MURDER_SHOOTING_STAR, NORMAL_POS) \ + DEATHTYPE(DEATH_SLIME, DEATH_SELF_SLIME, DEATH_MURDER_SLIME, NORMAL_POS) \ + DEATHTYPE(DEATH_SWAMP, DEATH_SELF_SWAMP, DEATH_MURDER_SWAMP, NORMAL_POS) \ + DEATHTYPE(DEATH_TEAMCHANGE, DEATH_SELF_TEAMCHANGE, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TELEFRAG, NO_MSG, DEATH_MURDER_TELEFRAG, NORMAL_POS) \ + DEATHTYPE(DEATH_TOUCHEXPLODE, DEATH_SELF_TOUCHEXPLODE, DEATH_MURDER_TOUCHEXPLODE, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET, DEATH_SELF_TURRET, NO_MSG, DEATH_TURRET_FIRST) \ + DEATHTYPE(DEATH_TURRET_EWHEEL, DEATH_SELF_TURRET_EWHEEL, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_FLAC, DEATH_SELF_TURRET_FLAC, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_HELLION, DEATH_SELF_TURRET_HELLION, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_HK, DEATH_SELF_TURRET_HK, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_MACHINEGUN, DEATH_SELF_TURRET_MACHINEGUN, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_MLRS, DEATH_SELF_TURRET_MLRS, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_PHASER, DEATH_SELF_TURRET_PHASER, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_PLASMA, DEATH_SELF_TURRET_PLASMA, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_TESLA, DEATH_SELF_TURRET_TESLA, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_WALK_GUN, DEATH_SELF_TURRET_WALK_GUN, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_WALK_MEELE, DEATH_SELF_TURRET_WALK_MEELE, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_TURRET_WALK_ROCKET, DEATH_SELF_TURRET_WALK_ROCKET, NO_MSG, DEATH_TURRET_LAST) \ + DEATHTYPE(DEATH_VH_BUMB_DEATH, DEATH_SELF_VH_BUMB_DEATH, DEATH_MURDER_VH_BUMB_DEATH, DEATH_VHFIRST) \ + DEATHTYPE(DEATH_VH_BUMB_GUN, NO_MSG, DEATH_MURDER_VH_BUMB_GUN, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_CRUSH, DEATH_SELF_VH_CRUSH, DEATH_MURDER_VH_CRUSH, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_RAPT_BOMB, DEATH_SELF_VH_RAPT_BOMB, DEATH_MURDER_VH_RAPT_BOMB, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_RAPT_CANNON, NO_MSG, DEATH_MURDER_VH_RAPT_CANNON, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_RAPT_DEATH, DEATH_SELF_VH_RAPT_DEATH, DEATH_MURDER_VH_RAPT_DEATH, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_RAPT_FRAGMENT, DEATH_SELF_VH_RAPT_BOMB, DEATH_MURDER_VH_RAPT_BOMB, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_SPID_DEATH, DEATH_SELF_VH_SPID_DEATH, DEATH_MURDER_VH_SPID_DEATH, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_SPID_MINIGUN, NO_MSG, DEATH_MURDER_VH_SPID_MINIGUN, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_SPID_ROCKET, DEATH_SELF_VH_SPID_ROCKET, DEATH_MURDER_VH_SPID_ROCKET, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_WAKI_DEATH, DEATH_SELF_VH_WAKI_DEATH, DEATH_MURDER_VH_WAKI_DEATH, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_WAKI_GUN, NO_MSG, DEATH_MURDER_VH_WAKI_GUN, NORMAL_POS) \ + DEATHTYPE(DEATH_VH_WAKI_ROCKET, DEATH_SELF_VH_WAKI_ROCKET, DEATH_MURDER_VH_WAKI_ROCKET, DEATH_VHLAST) \ + DEATHTYPE(DEATH_WEAPON, NO_MSG, NO_MSG, NORMAL_POS) + #define DT_FIRST 10000 -#define DT_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION +#define DT_MAX 128 // limit of recursive functions with ACCUMULATE_FUNCTION float DT_COUNT; -#define DT_MATCH(a,b) if(min(DT_MAX, a) == b) +entity deathtypes[DT_MAX]; +.entity death_msgself; +.entity death_msgmurder; -#define DEATHTYPE(name,msg_info,msg_center,position) \ +#define DEATHTYPE(name,msg_death,msg_death_by,position) \ float name; \ float position; \ void RegisterDeathtype_##name() \ @@ -14,159 +68,46 @@ float DT_COUNT; SET_FIRST_OR_LAST(position, DT_FIRST, DT_COUNT) \ SET_FIELD_COUNT(name, DT_FIRST, DT_COUNT) \ CHECK_MAX_COUNT(name, DT_MAX, DT_COUNT, "deathtypes") \ + \ + entity deathent = spawn(); \ + deathtypes[(name - DT_FIRST)] = deathent; \ + deathent.classname = "deathtype"; \ + deathent.nent_name = #name; \ + #if (msg_death != NO_MSG) \ + deathent.death_msgself = msg_multi_notifs[msg_death - 1]; \ + #endif \ + #if (msg_death_by != NO_MSG) \ + deathent.death_msgmurder = msg_multi_notifs[msg_death_by - 1]; \ + #endif \ } \ ACCUMULATE_FUNCTION(RegisterDeathtypes, RegisterDeathtype_##name) -#define DEATHTYPES \ - DEATHTYPE(DEATH_FALL, FALSE, FALSE, DEATH_SPECIAL_START) \ - DEATHTYPE(DEATH_TELEFRAG, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_DROWN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_HURTTRIGGER, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_LAVA, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_SLIME, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_KILL, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_NOAMMO, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_SWAMP, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TEAMCHANGE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_AUTOTEAMCHANGE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_CAMP, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_SHOOTING_STAR, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_ROT, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_MIRRORDAMAGE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TOUCHEXPLODE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_CHEAT, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_FIRE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_VHCRUSH, FALSE, FALSE, DEATH_VHFIRST) \ - DEATHTYPE(DEATH_SBMINIGUN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_SBROCKET, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_SBBLOWUP, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_WAKIGUN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_WAKIROCKET, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_WAKIBLOWUP, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_RAPTOR_CANNON, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_RAPTOR_BOMB, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_RAPTOR_BOMB_SPLIT, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_RAPTOR_DEATH, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_BUMB_GUN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_BUMB_RAY, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_BUMB_RAY_HEAL, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_BUMB_DEATH, FALSE, FALSE, DEATH_VHLAST) \ - DEATHTYPE(DEATH_TURRET, FALSE, FALSE, DEATH_TURRET_FIRST) \ - DEATHTYPE(DEATH_TURRET_EWHEEL, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_FLAC, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_MACHINEGUN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_WALKER_GUN, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_WALKER_MEELE, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_WALKER_ROCKET, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_HELLION, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_HK, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_MLRS, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_PLASMA, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_PHASER, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_TURRET_TESLA, FALSE, FALSE, DEATH_TURRET_LAST) \ - DEATHTYPE(DEATH_GENERIC, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_WEAPON, FALSE, FALSE, NORMAL_POS) \ - DEATHTYPE(DEATH_CUSTOM, FALSE, FALSE, NORMAL_POS) \ - #undef DEATHTYPE - DEATHTYPES - -#define DEATH_ISSPECIAL(t) ((t) >= DEATH_SPECIAL_START) -#define DEATH_ISVEHICLE(t) ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST) -#define DEATH_ISTURRET(t) ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST) -#define DEATH_WEAPONOFWEAPONDEATH(t) ((t) & DEATH_WEAPONMASK) -#define DEATH_ISWEAPON(t,w) (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w)) -#define DEATH_WEAPONOF(t) (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t)) -#define WEP_VALID(w) ((w) >= WEP_FIRST && (w) <= WEP_LAST) +#undef DEATHTYPE + +#define DEATH_ISSPECIAL(t) ((t) >= DEATH_SPECIAL_START) +#define DEATH_ISVEHICLE(t) ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST) +#define DEATH_ISTURRET(t) ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST) +#define DEATH_WEAPONOFWEAPONDEATH(t) ((t) & DEATH_WEAPONMASK) +#define DEATH_ISWEAPON(t,w) (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w)) +#define DEATH_WEAPONOF(t) (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t)) +#define WEP_VALID(w) ((w) >= WEP_FIRST && (w) <= WEP_LAST) + +string Deathtype_Name(float deathtype) +{ + if(DEATH_ISSPECIAL(deathtype)) + { + entity deathent = deathtypes[(deathtype - DT_FIRST)]; + if not(deathent) { backtrace("Deathtype_Name: Could not find deathtype entity!\n"); return ""; } + return deathent.nent_name; + } + else { return ftos(deathtype); } +} float DEATH_WEAPONMASK = 0xFF; float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths float HITTYPE_SECONDARY = 0x100; float HITTYPE_SPLASH = 0x200; // automatically set by RadiusDamage float HITTYPE_BOUNCE = 0x400; -float HITTYPE_HEADSHOT = 0x800; // automatically set by Damage (if headshotbonus is set) +float HITTYPE_RESERVED2 = 0x800; float HITTYPE_RESERVED = 0x1000; // unused yet - -// macros to access these - -// CSQC centerprint/notify message types -float MSG_SUICIDE = 0; -float MSG_KILL = 1; -float MSG_SPREE = 2; -float MSG_KILL_ACTION = 3; -float MSG_KILL_ACTION_SPREE = 4; -float MSG_INFO = 5; -float MSG_KA = 6; -float MSG_RACE = 10; - -float KILL_TEAM_RED = 12001; -float KILL_TEAM_BLUE = 12002; -float KILL_TEAM_SPREE = 12003; -float KILL_FIRST_BLOOD = 12004; -float KILL_FIRST_VICTIM = 12005; -float KILL_TYPEFRAG = 12006; -float KILL_TYPEFRAGGED = 12007; -float KILL_FRAG = 12008; -float KILL_FRAGGED = 12009; -float KILL_SPREE = 12010; -float KILL_END_SPREE = 12011; -float KILL_SPREE_3 = 12012; -float KILL_SPREE_5 = 12013; -float KILL_SPREE_10 = 12014; -float KILL_SPREE_15 = 12015; -float KILL_SPREE_20 = 12016; -float KILL_SPREE_25 = 12017; -float KILL_SPREE_30 = 12018; - - - -// this shit has got to go -float INFO_GOTFLAG = 13001; -float INFO_PICKUPFLAG = 13002; -float INFO_LOSTFLAG = 13003; -float INFO_RETURNFLAG = 13004; -float INFO_CAPTUREFLAG = 13005; - -float KA_PICKUPBALL = 14001; -float KA_DROPBALL = 14002; - -float RACE_SERVER_RECORD = 15001; -float RACE_NEW_TIME = 15002; -float RACE_NEW_RANK = 15003; -float RACE_FAIL = 15004; - - /*print("Obituary_Notification(): ", ftos(deathtype), ".\n"); - switch(deathtype) - { - // suicide - case DEATH_AUTOTEAMCHANGE: - case DEATH_CAMP: - case DEATH_NOAMMO: - case DEATH_ROT: - case DEATH_TEAMCHANGE: - - case KILL_TEAM_SUICIDE_RED: - case KILL_TEAM_SUICIDE_BLUE: - - // murder - case KILL_TEAM_FRAG_RED: - case KILL_TEAM_FRAG_BLUE: - - case KILL_FIRST_BLOOD: - case KILL_FIRST_VICTIM: - - case KILL_FRAG: - case KILL_TYPEFRAG: - case KILL_FRAGGED: - case KILL_TYPEFRAGGED: - - // accident - case WATCH_STEP: - - case DEATH_QUIET: break; - - // ideally we should have ALL deathtypes listed here - default: - backtrace(strcat("Unhandled deathtype: ", ftos(deathtype), ". Please notify Samual!\n")); - break; - }*/