From 4c6b7a37549e10e785972d7f6a49b3ed0cc8d44a Mon Sep 17 00:00:00 2001 From: Gladie Date: Mon, 6 Oct 2025 21:44:15 +0200 Subject: [PATCH 1/3] Update CCharNPCPet.cpp fix pets not sticking to target after casting spell --- src/game/chars/CCharNPCPet.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/chars/CCharNPCPet.cpp b/src/game/chars/CCharNPCPet.cpp index b7a8a626b..a01482ee2 100644 --- a/src/game/chars/CCharNPCPet.cpp +++ b/src/game/chars/CCharNPCPet.cpp @@ -445,6 +445,7 @@ bool CChar::NPC_OnHearPetCmdTarg( int iCmd, CChar *pSrc, CObjBase *pObj, const C if ( !pCharTarg || pCharTarg == pSrc || pCharTarg == this ) break; fSuccess = pCharTarg->OnAttackedBy(pSrc, true); // we know who told them to do this. + pSrc->OnHarmedBy(pCharTarg); if ( fSuccess ) fSuccess = Fight_Attack(pCharTarg, true); break; From ed666c99ed718df446f0679965f2f038a7e5c75c Mon Sep 17 00:00:00 2001 From: Gladie Date: Mon, 6 Oct 2025 22:19:25 +0200 Subject: [PATCH 2/3] Update CCharNPCPet.cpp add check to not abuse player attacks --- src/game/chars/CCharNPCPet.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/chars/CCharNPCPet.cpp b/src/game/chars/CCharNPCPet.cpp index a01482ee2..f49f14dd3 100644 --- a/src/game/chars/CCharNPCPet.cpp +++ b/src/game/chars/CCharNPCPet.cpp @@ -445,7 +445,8 @@ bool CChar::NPC_OnHearPetCmdTarg( int iCmd, CChar *pSrc, CObjBase *pObj, const C if ( !pCharTarg || pCharTarg == pSrc || pCharTarg == this ) break; fSuccess = pCharTarg->OnAttackedBy(pSrc, true); // we know who told them to do this. - pSrc->OnHarmedBy(pCharTarg); + if (!pCharTarg->IsPlayer()) + pSrc->OnHarmedBy(pCharTarg); if ( fSuccess ) fSuccess = Fight_Attack(pCharTarg, true); break; From 7aa474809916e18c5c658f57cfa5ea978f678cf4 Mon Sep 17 00:00:00 2001 From: Gladie Date: Tue, 7 Oct 2025 20:31:53 +0200 Subject: [PATCH 3/3] Fix char fighting all kill better solution --- src/game/chars/CCharNPCAct.cpp | 9 +++++++++ src/game/chars/CCharNPCPet.cpp | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/game/chars/CCharNPCAct.cpp b/src/game/chars/CCharNPCAct.cpp index e133177ea..52cfd6fda 100644 --- a/src/game/chars/CCharNPCAct.cpp +++ b/src/game/chars/CCharNPCAct.cpp @@ -1302,6 +1302,15 @@ void CChar::NPC_Act_Guard() if ( Fight_Attack( pChar->m_Fight_Targ_UID.CharFind() )) return; } + else if (m_Fight_Targ_UID.IsValidUID()) + { + CChar *pEnemy = m_Fight_Targ_UID.CharFind(); + if (pEnemy && !pEnemy->IsStatFlag(STATF_DEAD | STATF_INVUL)) + { + Fight_Attack(pEnemy); + return; + } + } } // Target is out of range or doesn't need protecting, so just follow for now diff --git a/src/game/chars/CCharNPCPet.cpp b/src/game/chars/CCharNPCPet.cpp index f49f14dd3..b7a8a626b 100644 --- a/src/game/chars/CCharNPCPet.cpp +++ b/src/game/chars/CCharNPCPet.cpp @@ -445,8 +445,6 @@ bool CChar::NPC_OnHearPetCmdTarg( int iCmd, CChar *pSrc, CObjBase *pObj, const C if ( !pCharTarg || pCharTarg == pSrc || pCharTarg == this ) break; fSuccess = pCharTarg->OnAttackedBy(pSrc, true); // we know who told them to do this. - if (!pCharTarg->IsPlayer()) - pSrc->OnHarmedBy(pCharTarg); if ( fSuccess ) fSuccess = Fight_Attack(pCharTarg, true); break;