Merge pull request #46 from MindRapist/mr-4

Fixed PK mode bugs, fixed logout cancellation from using skills
This commit is contained in:
rtw1x1
2025-12-27 08:25:29 +00:00
committed by GitHub
3 changed files with 33 additions and 77 deletions

View File

@@ -1659,6 +1659,14 @@ void CHARACTER::EnterCombat()
if (!IsPosition(POS_FIGHTING))
SetPosition(POS_FIGHTING);
// 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
SetNextStatePulse(1);
}
// tw1x1: end

View File

@@ -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;
}

View File

@@ -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());