MRMJ-1: Messenger & Skills fixes
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user