From 136cb20cb6e2ef6470c12da2ed59e2adeb53b0fa Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sun, 18 May 2025 15:57:59 -0400 Subject: [PATCH 1/3] Whip collects items --- src/k_collide.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 4abe3f269..37cfa616e 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1059,11 +1059,13 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) shield->extravalue1 = 1; } - if (P_DamageMobj(victim, shield, attacker, 1, DMG_NORMAL)) + if (!K_TryPickMeUp(attackerPlayer->mo, victim)) { - K_AddHitLag(attacker, attackerHitlag, false); - shield->hitlag = attacker->hitlag; + P_DamageMobj(victim, shield, attacker, 1, DMG_NORMAL); } + + K_AddHitLag(attacker, attackerHitlag, false); + shield->hitlag = attacker->hitlag; } return false; } From cdc49d755b5ec443678fe761be604dbf4079e223 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sun, 18 May 2025 16:21:56 -0400 Subject: [PATCH 2/3] Update K_TryPickMeUp with allowHostile boolean --- src/k_collide.cpp | 12 ++++++------ src/k_kart.c | 4 ++-- src/k_kart.h | 2 +- src/objects/orbinaut.c | 2 +- src/p_inter.c | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 37cfa616e..28e544d8b 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -75,7 +75,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) if (t1->type == MT_BALLHOGBOOM && t2->type == MT_BALLHOGBOOM) return true; // Ballhogs don't collide with eachother - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (t2->player) @@ -178,7 +178,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) if (t1->health <= 0 || t2->health <= 0) return true; - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (!P_CanPickupItem(t2->player, PICKUP_EGGBOX)) @@ -434,7 +434,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2) if (t1->health <= 0 || t2->health <= 0) return true; - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (t2->player) @@ -544,7 +544,7 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2) if (t2->player && (t2->player->hyudorotimer || t2->player->justbumped)) return true; - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (draggeddroptarget && P_MobjWasRemoved(draggeddroptarget)) @@ -1059,7 +1059,7 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) shield->extravalue1 = 1; } - if (!K_TryPickMeUp(attackerPlayer->mo, victim)) + if (!K_TryPickMeUp(attackerPlayer->mo, victim, true)) { P_DamageMobj(victim, shield, attacker, 1, DMG_NORMAL); } @@ -1076,7 +1076,7 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2) if (((t1->target == t2) || (!(t2->flags & (MF_ENEMY|MF_BOSS)) && (t1->target == t2->target))) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0))) return true; - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (t2->player) diff --git a/src/k_kart.c b/src/k_kart.c index d50b4c31a..856ea65d4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -15908,7 +15908,7 @@ static boolean K_PickUp(player_t *player, mobj_t *picked) } // ACHTUNG this destroys items when returning true, make sure to bail out -boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2) +boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2, boolean allowHostile) { if (!m1 || P_MobjWasRemoved(m1)) return false; @@ -15943,7 +15943,7 @@ boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2) if (inflictor->target->player && G_SameTeam(inflictor->target->player, victim->player)) allied = true; - if (!allied) + if (!allied && !allowHostile) return false; // CONS_Printf("target check passed\n"); diff --git a/src/k_kart.h b/src/k_kart.h index 762ab997a..721b5763f 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -327,7 +327,7 @@ void K_BotHitPenalty(player_t *player); boolean K_IsPickMeUpItem(mobjtype_t type); -boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2); +boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2, boolean allowHostile); fixed_t K_TeamComebackMultiplier(player_t *player); diff --git a/src/objects/orbinaut.c b/src/objects/orbinaut.c index 501bc0e2d..9767f49f1 100644 --- a/src/objects/orbinaut.c +++ b/src/objects/orbinaut.c @@ -190,7 +190,7 @@ boolean Obj_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) return true; } - if (K_TryPickMeUp(t1, t2)) + if (K_TryPickMeUp(t1, t2, false)) return true; if (t1->type == MT_GARDENTOP) diff --git a/src/p_inter.c b/src/p_inter.c index ff2b90ed1..c7b370f04 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -667,7 +667,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (!player->mo || player->spectator) return; - if (K_TryPickMeUp(special, toucher)) + if (K_TryPickMeUp(special, toucher, false)) return; // attach to player! From b9f80f902b176a8aa6117b15198f60fa339a6dea Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 9 Nov 2024 20:44:40 -0600 Subject: [PATCH 3/3] Allow drop target to be picked up by whipping and a bit of cleanup --- src/k_collide.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 28e544d8b..77cf778c8 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1042,7 +1042,14 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) } else if (victim->type == MT_DROPTARGET || victim->type == MT_DROPTARGET_SHIELD) { - K_DropTargetCollide(victim, shield); + if (K_TryPickMeUp(attacker, victim, true)) + { + shield->hitlag = attacker->hitlag; // players hitlag is handled in K_TryPickMeUp, and we need to set for the shield too + } + else + { + K_DropTargetCollide(victim, shield); + } return true; } else @@ -1059,13 +1066,16 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) shield->extravalue1 = 1; } - if (!K_TryPickMeUp(attackerPlayer->mo, victim, true)) + if (K_TryPickMeUp(attacker, victim, true)) + { + shield->hitlag = attacker->hitlag; // players hitlag is handled in K_TryPickMeUp, and we need to set for the shield too + } + else { P_DamageMobj(victim, shield, attacker, 1, DMG_NORMAL); + K_AddHitLag(attacker, attackerHitlag, false); + shield->hitlag = attacker->hitlag; } - - K_AddHitLag(attacker, attackerHitlag, false); - shield->hitlag = attacker->hitlag; } return false; }