MRMJ-1: Messenger & Skills fixes

This commit is contained in:
Mind Rapist
2025-12-14 05:17:16 +02:00
parent da619922cb
commit 0f79d890ba
53 changed files with 1387 additions and 231 deletions

View File

@@ -148,6 +148,10 @@ void CHARACTER::SetSkillGroup(BYTE bSkillGroup)
p.skill_group = m_points.skill_group;
GetDesc()->Packet(&p, sizeof(TPacketGCChangeSkillGroup));
#ifdef FIX_REFRESH_SKILL_COOLDOWN
SkillLevelPacket();
PointsPacket();
#endif
}
int CHARACTER::ComputeCooltime(int time)
@@ -178,6 +182,14 @@ void CHARACTER::SetSkillLevel(DWORD dwVnum, BYTE bLev)
return;
}
#ifdef FIX_REFRESH_SKILL_COOLDOWN
if (dwVnum == SKILL_COMBO && (bLev == 0 || m_pSkillLevels[dwVnum].bLevel == 0) && m_bComboIndex > 0)
{
m_bComboIndex = 0;
ChatPacket(CHAT_TYPE_COMMAND, "combo %d", 0);
}
#endif
m_pSkillLevels[dwVnum].bLevel = MIN(40, bLev);
if (bLev >= 40)
@@ -187,7 +199,14 @@ void CHARACTER::SetSkillLevel(DWORD dwVnum, BYTE bLev)
else if (bLev >= 20)
m_pSkillLevels[dwVnum].bMasterType = SKILL_MASTER;
else
{
#ifdef FIX_REFRESH_SKILL_COOLDOWN
if (bLev == 0)
ResetOneSkillCoolTime(dwVnum);
#endif
m_pSkillLevels[dwVnum].bMasterType = SKILL_NORMAL;
}
}
bool CHARACTER::IsLearnableSkill(DWORD dwSkillVnum) const
@@ -432,7 +451,11 @@ bool CHARACTER::LearnSkillByBook(DWORD dwSkillVnum, BYTE bProb)
{
need_exp = 20000;
if ( GetExp() < need_exp )
#ifdef FIX_BOOK_READING_FOR_MAX_LEVEL
if (GetExp() < need_exp && GetLevel() < gPlayerMaxLevel)
#else
if (GetExp() < need_exp)
#endif
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("경험치가 부족하여 책을 읽을 수 없습니다."));
return false;
@@ -888,10 +911,23 @@ void CHARACTER::ResetSkill()
m_pSkillLevels[pair.first] = pair.second;
}
#ifdef FIX_REFRESH_SKILL_COOLDOWN
ResetSkillCoolTimes();
#endif
ComputePoints();
SkillLevelPacket();
}
#ifdef FIX_REFRESH_SKILL_COOLDOWN
void CHARACTER::ResetSkillCoolTimes()
{
for (std::map<int, TSkillUseInfo>::iterator it = m_SkillUseInfo.begin(); it != m_SkillUseInfo.end(); ++it)
ResetOneSkillCoolTime(it->first);
}
#endif
void CHARACTER::ComputePassiveSkill(DWORD dwVnum)
{
if (g_bSkillDisable)
@@ -1960,11 +1996,23 @@ int CHARACTER::ComputeSkillAtPosition(DWORD dwVnum, const PIXEL_POSITION& posTar
// bSkillLevel로 계산한다.
int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel)
{
CSkillProto* pkSk = CSkillManager::instance().Get(dwVnum);
const bool bCanUseHorseSkill = CanUseHorseSkill();
// 말을 타고있지만 스킬은 사용할 수 없는 상태라면 return
if (false == bCanUseHorseSkill && true == IsRiding())
#ifdef FIX_REFRESH_SKILL_COOLDOWN
{
const bool bToggleSkill = pkSk && IS_SET(pkSk->dwFlag, SKILL_FLAG_TOGGLE);
const bool bToggleActive = bToggleSkill ? (dwVnum == SKILL_COMBO ? m_bComboIndex != 0 : FindAffect(dwVnum) != nullptr) : false;
// Allow only deactivation of already-active toggles (combo or other) while riding
if (!bToggleActive)
return BATTLE_NONE;
}
#else
return BATTLE_NONE;
#endif
if (IsPolymorphed())
return BATTLE_NONE;
@@ -1972,12 +2020,17 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
if (g_bSkillDisable)
return BATTLE_NONE;
CSkillProto* pkSk = CSkillManager::instance().Get(dwVnum);
if (!pkSk)
return BATTLE_NONE;
#ifdef FIX_REFRESH_SKILL_COOLDOWN
const bool bIsToggleSkill = IS_SET(pkSk->dwFlag, SKILL_FLAG_TOGGLE);
const bool bToggleActive = bIsToggleSkill ? (dwVnum == SKILL_COMBO ? m_bComboIndex != 0 : FindAffect(dwVnum) != nullptr) : false;
if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE && !(bIsToggleSkill && bToggleActive))
#else
if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE)
#endif
return BATTLE_NONE;
if (!bCanUseHorseSkill && pkSk->dwType == SKILL_TYPE_HORSE)
@@ -2452,17 +2505,37 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
return true;
}
CSkillProto* pkSk = CSkillManager::instance().Get(dwVnum);
// 말을 타고있지만 스킬은 사용할 수 없는 상태라면 return false
if (false == bCanUseHorseSkill && true == IsRiding())
return false;
#ifdef FIX_REFRESH_SKILL_COOLDOWN
{
const bool bToggleSkill = pkSk && IS_SET(pkSk->dwFlag, SKILL_FLAG_TOGGLE);
const bool bToggleActive = bToggleSkill ? (dwVnum == SKILL_COMBO ? m_bComboIndex != 0 : FindAffect(dwVnum) != nullptr) : false;
CSkillProto * pkSk = CSkillManager::instance().Get(dwVnum);
// Allow only deactivation of already-active toggles (combo or other) while riding
if (!bToggleActive)
return false;
}
#else
return false;
#endif
// CSkillProto * pkSk = CSkillManager::instance().Get(dwVnum);
sys_log(0, "%s: USE_SKILL: %d pkVictim %p", GetName(), dwVnum, get_pointer(pkVictim));
if (!pkSk)
return false;
#ifdef FIX_REFRESH_SKILL_COOLDOWN
const bool bIsToggleSkill = IS_SET(pkSk->dwFlag, SKILL_FLAG_TOGGLE);
const bool bToggleActive = bIsToggleSkill ? (dwVnum == SKILL_COMBO ? m_bComboIndex != 0 : FindAffect(dwVnum) != nullptr) : false;
if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE && !(bIsToggleSkill && bToggleActive))
#else
if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE)
#endif
return BATTLE_NONE;
if (!bCanUseHorseSkill && pkSk->dwType == SKILL_TYPE_HORSE)
@@ -3459,6 +3532,10 @@ bool CHARACTER::ResetOneSkill(DWORD dwVnum)
m_pSkillLevels[dwVnum].bMasterType = 0;
m_pSkillLevels[dwVnum].tNextRead = 0;
#ifdef FIX_REFRESH_SKILL_COOLDOWN
ResetOneSkillCoolTime(dwVnum);
#endif
if (level > 17)
level = 17;
@@ -3472,6 +3549,36 @@ bool CHARACTER::ResetOneSkill(DWORD dwVnum)
return true;
}
#ifdef FIX_REFRESH_SKILL_COOLDOWN
void CHARACTER::ResetOneSkillCoolTime(DWORD dwVnum)
{
if (dwVnum >= SKILL_MAX_NUM)
return;
if (!GetSkillGroup() || m_SkillUseInfo.empty())
{
// still try to disable toggle state even when no cooldown info exists
CSkillProto* pkSkNoInfo = CSkillManager::instance().Get(dwVnum);
if (pkSkNoInfo && IS_SET(pkSkNoInfo->dwFlag, SKILL_FLAG_TOGGLE))
RemoveAffect(pkSkNoInfo->dwVnum);
return;
}
std::map<int, TSkillUseInfo>::iterator it = m_SkillUseInfo.find(dwVnum);
if (it != m_SkillUseInfo.end())
it->second.dwNextSkillUsableTime = 0;
// If the skill is togglable, ensure it is turned off.
CSkillProto* pkSk = CSkillManager::instance().Get(dwVnum);
if (pkSk && IS_SET(pkSk->dwFlag, SKILL_FLAG_TOGGLE))
RemoveAffect(pkSk->dwVnum);
}
#endif
bool CHARACTER::CanUseSkill(DWORD dwSkillVnum) const
{
if (0 == dwSkillVnum) return false;