From 07f965d4eb367e171388574e3e4e45f6851d5b40 Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 29 Dec 2021 22:25:04 -0800 Subject: [PATCH 1/4] Check to sting player before removing one ring --- src/k_collide.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 96fe30182..9c722e548 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -537,24 +537,24 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if (t1Condition == true) { - P_PlayerRingBurst(t2->player, 1); - if (t2->player->rings <= 0) { P_DamageMobj(t2, t1, t1, 1, DMG_STING); stung = true; } + + P_PlayerRingBurst(t2->player, 1); } if (t2Condition == true) { - P_PlayerRingBurst(t1->player, 1); - if (t1->player->rings <= 0) { P_DamageMobj(t1, t2, t2, 1, DMG_STING); stung = true; } + + P_PlayerRingBurst(t1->player, 1); } return stung; From 5498f9d02d5e99661f5b50707491715a0c7c5e1f Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 29 Dec 2021 22:58:21 -0800 Subject: [PATCH 2/4] Let objects receive damage while in hitlag --- src/p_inter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 4dafa91c2..4f2b76221 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1838,8 +1838,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!(target->flags & MF_SHOOTABLE)) return false; // shouldn't happen... +#if 0 if (!(damagetype & DMG_DEATHMASK) && target->hitlag > 0) return false; +#endif } if (target->flags2 & MF2_SKULLFLY) @@ -1922,7 +1924,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (combo == false) { - if (player->flashing > 0) + if (player->mo->hitlag == 0 && player->flashing > 0) { // Post-hit invincibility K_DoInstashield(player); From cab1af54980493323e94a54bfea3dbcbcd8d1623 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 4 Jan 2022 00:23:12 -0500 Subject: [PATCH 3/4] Don't do hitlag combo with items with threshold Prevents instakill ballhog --- src/k_collide.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/k_collide.c b/src/k_collide.c index 9c722e548..5d072c0eb 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -17,6 +17,9 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) boolean damageitem = false; boolean sprung = false; + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; @@ -108,6 +111,9 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) { boolean damageitem = false; + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; @@ -186,6 +192,9 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) { + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + // Push fakes out of other item boxes if (t2->type == MT_RANDOMITEM || t2->type == MT_EGGMANITEM) { @@ -258,6 +267,9 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) boolean K_MineCollide(mobj_t *t1, mobj_t *t2) { + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; @@ -331,6 +343,9 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2) boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) { + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; @@ -398,6 +413,9 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) { + if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0)) + return true; + if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; From 50eb3eeda2d70a05732bff8ba0e81ebfb5491167 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 4 Jan 2022 00:39:01 -0500 Subject: [PATCH 4/4] Don't use damage hitlag effects on a person when they "win" a ring sting exchange Only applies to ring sting collision (no other types of damage touching), only applies to the person not getting stung. The person who is getting stung & sting trades are unaffected. --- src/k_collide.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 5d072c0eb..9b0463bfc 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -483,7 +483,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) { boolean t1Condition = false; boolean t2Condition = false; - boolean stung = false; + boolean stungT1 = false; + boolean stungT2 = false; // Grow damage t1Condition = (t1->scale > t2->scale + (mapobjectscale/8)); @@ -558,7 +559,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if (t2->player->rings <= 0) { P_DamageMobj(t2, t1, t1, 1, DMG_STING); - stung = true; + stungT2 = true; } P_PlayerRingBurst(t2->player, 1); @@ -569,11 +570,21 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if (t1->player->rings <= 0) { P_DamageMobj(t1, t2, t2, 1, DMG_STING); - stung = true; + stungT1 = true; } P_PlayerRingBurst(t1->player, 1); } - return stung; + // No damage hitlag for stinging. + if (stungT1 == true && stungT2 == false) + { + t2->eflags &= ~MFE_DAMAGEHITLAG; + } + else if (stungT2 == true && stungT1 == false) + { + t1->eflags &= ~MFE_DAMAGEHITLAG; + } + + return (stungT1 || stungT2); }