From 11ef2f578072dc70719eeb5aad7bbac8a7116c8c Mon Sep 17 00:00:00 2001 From: Mind Rapist Date: Sat, 27 Dec 2025 10:17:04 +0200 Subject: [PATCH 1/2] Fixed PK mode bugs, fixed logout cancellation from using skills --- src/game/char_battle.cpp | 8 ++++++ src/game/char_skill.cpp | 40 ++++++-------------------- src/game/pvp.cpp | 62 +++++++++++----------------------------- 3 files changed, 33 insertions(+), 77 deletions(-) diff --git a/src/game/char_battle.cpp b/src/game/char_battle.cpp index dba506d..8161ddb 100644 --- a/src/game/char_battle.cpp +++ b/src/game/char_battle.cpp @@ -1659,6 +1659,14 @@ void CHARACTER::EnterCombat() if (!IsPosition(POS_FIGHTING)) SetPosition(POS_FIGHTING); + // MR-3: Cancel logout on use skill + if (IsCmdCountdownActive()) + { + ChatPacket(CHAT_TYPE_INFO, LC_TEXT("전투가 시작 되어 취소 되었습니다.")); + CancelCmdCountdown(); + } + // MR-3: -- END OF -- Cancel logout on use skill + SetNextStatePulse(1); } // tw1x1: end diff --git a/src/game/char_skill.cpp b/src/game/char_skill.cpp index 2617237..67ed1cb 100644 --- a/src/game/char_skill.cpp +++ b/src/game/char_skill.cpp @@ -2525,14 +2525,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste ComputeSkill(dwVnum, pkVictim); RemoveAffect(dwVnum); - // MR-3: Cancel logout on use skill - if (m_pkTimedEvent) - { - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다.")); - event_cancel(&m_pkTimedEvent); - } - // MR-3: -- END OF -- Cancel logout on use skill - return true; } } @@ -2551,14 +2543,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste // Toggle 할 때는 SP를 쓰지 않음 (SelfOnly로 구분) if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum)) { - // MR-3: Cancel logout on use skill - if (m_pkTimedEvent) - { - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다.")); - event_cancel(&m_pkTimedEvent); - } - // MR-3: -- END OF -- Cancel logout on use skill - return true; } @@ -2657,6 +2641,14 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste } } + // MR-3: Cancel logout on use skill + if (IsPC() && m_pkTimedEvent) + { + ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다.")); + event_cancel(&m_pkTimedEvent); + } + // MR-3: -- END OF -- Cancel logout on use skill + if (dwVnum == SKILL_CHAIN) { ResetChainLightningIndex(); @@ -2670,14 +2662,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste // prevent POS_FIGHTING from expiring when skills deal 0 damage (miss, block, imun, etc.) UpdateLastCombatTime(); EnterCombat(); - - // MR-3: Cancel logout on use skill - if (pkVictim->m_pkTimedEvent) - { - pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다.")); - event_cancel(&pkVictim->m_pkTimedEvent); - } - // MR-3: -- END OF -- Cancel logout on use skill } // tw1x1: end @@ -2692,14 +2676,6 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste m_dwLastSkillTime = get_dword_time(); - // MR-3: Cancel logout on use skill - if (m_pkTimedEvent) - { - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("취소 되었습니다.")); - event_cancel(&m_pkTimedEvent); - } - // MR-3: -- END OF -- Cancel logout on use skill - return true; } diff --git a/src/game/pvp.cpp b/src/game/pvp.cpp index 40cf933..f41051d 100644 --- a/src/game/pvp.cpp +++ b/src/game/pvp.cpp @@ -464,80 +464,52 @@ bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim) { if (g_protectNormalPlayer) { - // 범법자는 평화모드인 착한사람을 공격할 수 없다. - if (PK_MODE_PEACE == pkVictim->GetPKMode()) - return false; + // 범법자는 평화모드인 착한사람을 공격할 수 없다. + if (PK_MODE_PEACE == pkVictim->GetPKMode()) + return false; } } - + // MR-4: Fix PK mode logic switch (pkChr->GetPKMode()) { case PK_MODE_PEACE: case PK_MODE_REVENGE: - // Cannot attack same guild - if (pkVictim->GetGuild() && pkVictim->GetGuild() == pkChr->GetGuild()) - break; - - if (pkChr->GetPKMode() == PK_MODE_REVENGE) { - //if (!g_iUseLocale) - if (1) - { - if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0) - { - pkChr->SetKillerMode(true); - return true; - } - else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() < 0) - return true; - } - else - { - if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) - break; - else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() >= 0) - break; - - beKillerMode = true; - } + if ( + (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild())) && + pkChr->GetPKMode() == PK_MODE_REVENGE && pkVictim->GetAlignment() < 0 + ) + return true; } break; case PK_MODE_GUILD: - // Same implementation from PK_MODE_FREE except for attacking same guild - if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild())) { - if (1) - //if (!g_iUseLocale) + // Same implementation from PK_MODE_FREE except for attacking same guild + if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild())) { - if (pkVictim->GetAlignment() >= 0) - pkChr->SetKillerMode(true); - else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) + // Only set killer mode if victim is not already attackable + if (!pkVictim->IsKillerMode()) pkChr->SetKillerMode(true); return true; } - else - beKillerMode = true; } break; case PK_MODE_FREE: - //if (!g_iUseLocale) - if (1) { - if (pkVictim->GetAlignment() >= 0) - pkChr->SetKillerMode(true); - else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0) + // Same as GUILD, but allows attacking same guild members + // Only set killer mode if victim is not already attackable + if (!pkVictim->IsKillerMode()) pkChr->SetKillerMode(true); return true; } - else - beKillerMode = true; break; } + // MR-4: -- END OF -- Fix PK mode logic } CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); From 3b712002a9e6a7535a7b2d48238e10dc3a8cbedc Mon Sep 17 00:00:00 2001 From: Mind Rapist Date: Sat, 27 Dec 2025 10:23:45 +0200 Subject: [PATCH 2/2] Fixed PK mode bugs, fixed logout cancellation from using skills --- src/game/char_battle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/char_battle.cpp b/src/game/char_battle.cpp index 8161ddb..9dfbaef 100644 --- a/src/game/char_battle.cpp +++ b/src/game/char_battle.cpp @@ -1660,10 +1660,10 @@ void CHARACTER::EnterCombat() SetPosition(POS_FIGHTING); // MR-3: Cancel logout on use skill - if (IsCmdCountdownActive()) + if (m_pkTimedEvent) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("전투가 시작 되어 취소 되었습니다.")); - CancelCmdCountdown(); + event_cancel(&m_pkTimedEvent); } // MR-3: -- END OF -- Cancel logout on use skill