10 Commits

19 changed files with 277 additions and 271 deletions

View File

@ -1,4 +1,4 @@
FROM ubuntu:latest as build FROM ubuntu:22.04 as build
WORKDIR /app WORKDIR /app
# Update the system and install various dependencies # Update the system and install various dependencies
@ -21,7 +21,7 @@ RUN mkdir build/
RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake .. RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake ..
RUN cd build && make -j $(nproc) RUN cd build && make -j $(nproc)
FROM ubuntu:latest as app FROM ubuntu:22.04 as app
WORKDIR /app WORKDIR /app
RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean

View File

@ -89,6 +89,7 @@ This is a very serious security risk and one of the reasons this project is stil
### Gameplay ### Gameplay
- Fixed invisibility bug on login/respawn/teleport etc. - Fixed invisibility bug on login/respawn/teleport etc.
- Fixed player level not updating [(thread)](https://metin2.dev/topic/30612-official-level-update-fix-reversed/)
### Exploits ### Exploits
- See the warning above :( - See the warning above :(

View File

@ -133,26 +133,26 @@ enum EAffectBits
AFF_FISH_MIND, AFF_FISH_MIND,
AFF_JEONGWIHON, // <20><><EFBFBD><EFBFBD>ȥ AFF_WAR_BODY_BERSERK, // <20><><EFBFBD><EFBFBD>ȥ
AFF_GEOMGYEONG, // <20>˰<EFBFBD> AFF_WAR_BODY_AURA, // <20>˰<EFBFBD>
AFF_CHEONGEUN, // õ<><C3B5><EFBFBD><EFBFBD> AFF_WAR_MENTAL_STRONG_BODY, // õ<><C3B5><EFBFBD><EFBFBD>
AFF_GYEONGGONG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_NINJA_ARCHERY_FEATHER_WALK, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFF_EUNHYUNG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_NINJA_BLADEFIGHT_STEALTH, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFF_GWIGUM, // <20>Ͱ<EFBFBD> AFF_SURA_WEAPONRY_ENCHANTED_BLADE, // <20>Ͱ<EFBFBD>
AFF_TERROR, // <20><><EFBFBD><EFBFBD> AFF_SURA_WEAPONRY_FEAR, // <20><><EFBFBD><EFBFBD>
AFF_JUMAGAP, // <20>ָ<EFBFBD><D6B8><EFBFBD> AFF_SURA_WEAPONRY_ENCHANTED_ARMOUR, // <20>ָ<EFBFBD><D6B8><EFBFBD>
AFF_HOSIN, // ȣ<><C8A3> AFF_SHAMAN_DRAGON_BLESSING, // ȣ<><C8A3>
AFF_BOHO, // <20><>ȣ AFF_SHAMAN_DRAGON_REFLECT, // <20><>ȣ
AFF_KWAESOK, // <20><><EFBFBD><EFBFBD> AFF_SHAMAN_HEALING_SWIFTNESS, // <20><><EFBFBD><EFBFBD>
AFF_MANASHIELD, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_SURA_BLACKMAGIC_DARK_PROTECTION, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFF_MUYEONG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> affect AFF_SURA_BLACKMAGIC_FLAME_SPIRIT, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> affect
AFF_REVIVE_INVISIBLE, // <20><>Ȱ<EFBFBD><C8B0> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20><><EFBFBD><EFBFBD> AFF_REVIVE_INVISIBLE, // <20><>Ȱ<EFBFBD><C8B0> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20><><EFBFBD><EFBFBD>
AFF_FIRE, // <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_FIRE, // <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFF_GICHEON, // <20><>õ<EFBFBD><C3B5><EFBFBD><EFBFBD> AFF_SHAMAN_DRAGON_DRAGONS_AID, // <20><>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>
AFF_JEUNGRYEOK, // <20><><EFBFBD>¼<EFBFBD> AFF_SHAMAN_HEALING_ATTACK, // <20><><EFBFBD>¼<EFBFBD>
AFF_TANHWAN_DASH, // źȯ<C5BA>ݿ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ AFF_WAR_BODY_DASH, // źȯ<C5BA>ݿ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
AFF_PABEOP, // <20>Ĺ<EFBFBD><C4B9><EFBFBD> AFF_SURA_WEAPONRY_DISPEL, // <20>Ĺ<EFBFBD><C4B9><EFBFBD>
AFF_CHEONGEUN_WITH_FALL, // õ<><C3B5><EFBFBD><EFBFBD> AFF_WAR_MENTAL_STRONG_BODY_WITH_FALL, // õ<><C3B5><EFBFBD><EFBFBD>
AFF_POLYMORPH, AFF_POLYMORPH,
AFF_WAR_FLAG1, AFF_WAR_FLAG1,
AFF_WAR_FLAG2, AFF_WAR_FLAG2,

View File

@ -815,6 +815,11 @@ CLand * CManager::FindLandByGuild(DWORD GID)
bool CManager::LoadObject(TObject * pTable, bool isBoot) // from DB bool CManager::LoadObject(TObject * pTable, bool isBoot) // from DB
{ {
// Skip loading if the target map is not available on this core
// Source: https://metin2.dev/topic/23614-solving-a-very-old-problem-what-most-people-ignore/#comment-163073
if (!map_allow_find(pTable->lMapIndex))
return false;
CLand * pkLand = FindLand(pTable->dwLandID); CLand * pkLand = FindLand(pTable->dwLandID);
if (!pkLand) if (!pkLand)

View File

@ -159,7 +159,7 @@ void CHARACTER::Initialize()
m_pkChrTarget = NULL; m_pkChrTarget = NULL;
m_pkMuyeongEvent = NULL; m_pkFlameSpiritEvent = NULL;
m_pkWarpNPCEvent = NULL; m_pkWarpNPCEvent = NULL;
m_pkDeadEvent = NULL; m_pkDeadEvent = NULL;
@ -490,7 +490,7 @@ void CHARACTER::Destroy()
m_set_pkChrSpawnedBy.clear(); m_set_pkChrSpawnedBy.clear();
StopMuyeongEvent(); StopFlameSpiritEvent();
event_cancel(&m_pkWarpNPCEvent); event_cancel(&m_pkWarpNPCEvent);
event_cancel(&m_pkRecoveryEvent); event_cancel(&m_pkRecoveryEvent);
event_cancel(&m_pkDeadEvent); event_cancel(&m_pkDeadEvent);
@ -3432,7 +3432,7 @@ void CHARACTER::PointChange(BYTE type, int amount, bool bAmount, bool bBroadcast
case POINT_KILL_HP_RECOVERY: // 75 case POINT_KILL_HP_RECOVERY: // 75
case POINT_HIT_HP_RECOVERY: case POINT_HIT_HP_RECOVERY:
case POINT_HIT_SP_RECOVERY: case POINT_HIT_SP_RECOVERY:
case POINT_MANASHIELD: case POINT_DARK_PROTECTION:
case POINT_ATT_BONUS: case POINT_ATT_BONUS:
case POINT_DEF_BONUS: case POINT_DEF_BONUS:
case POINT_SKILL_DAMAGE_BONUS: case POINT_SKILL_DAMAGE_BONUS:
@ -4804,14 +4804,14 @@ void CHARACTER::OnMove(bool bIsAttack)
if (IsAffectFlag(AFF_REVIVE_INVISIBLE)) if (IsAffectFlag(AFF_REVIVE_INVISIBLE))
RemoveAffect(AFFECT_REVIVE_INVISIBLE); RemoveAffect(AFFECT_REVIVE_INVISIBLE);
if (IsAffectFlag(AFF_EUNHYUNG)) if (IsAffectFlag(AFF_NINJA_BLADEFIGHT_STEALTH))
{ {
RemoveAffect(SKILL_EUNHYUNG); RemoveAffect(SKILL_NINJA_BLADEFIGHT_STEALTH);
SetAffectedEunhyung(); SetAffectedStealth();
} }
else else
{ {
ClearAffectedEunhyung(); ClearAffectedStealth();
} }
/*if (IsAffectFlag(AFF_JEONSIN)) /*if (IsAffectFlag(AFF_JEONSIN))
@ -5851,7 +5851,7 @@ void CHARACTER::ResetPoint(int iLv)
{ {
BYTE bJob = GetJob(); BYTE bJob = GetJob();
PointChange(POINT_LEVEL, iLv - GetLevel()); PointChange(POINT_LEVEL, iLv - GetLevel(), false, true);
SetRealPoint(POINT_ST, JobInitialPoints[bJob].st); SetRealPoint(POINT_ST, JobInitialPoints[bJob].st);
SetPoint(POINT_ST, GetRealPoint(POINT_ST)); SetPoint(POINT_ST, GetRealPoint(POINT_ST));

View File

@ -75,7 +75,7 @@ enum
FLY_FIREWORK_CHRISTMAS, FLY_FIREWORK_CHRISTMAS,
FLY_CHAIN_LIGHTNING, FLY_CHAIN_LIGHTNING,
FLY_HP_SMALL, FLY_HP_SMALL,
FLY_SKILL_MUYEONG, FLY_SKILL_FLAME_SPIRIT,
}; };
enum EDamageType enum EDamageType
@ -225,7 +225,7 @@ enum EPointTypes
POINT_HIT_HP_RECOVERY, // 100 POINT_HIT_HP_RECOVERY, // 100
POINT_HIT_SP_RECOVERY, // 101 POINT_HIT_SP_RECOVERY, // 101
POINT_MANASHIELD, // 102 <20><><EFBFBD>ż<EFBFBD>ȣ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> POINT_DARK_PROTECTION, // 102 <20><><EFBFBD>ż<EFBFBD>ȣ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD>
POINT_PARTY_BUFFER_BONUS, // 103 POINT_PARTY_BUFFER_BONUS, // 103
POINT_PARTY_SKILL_MASTER_BONUS, // 104 POINT_PARTY_SKILL_MASTER_BONUS, // 104
@ -1414,15 +1414,15 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD m_adwMobSkillCooltime[MOB_SKILL_MAX_NUM]; DWORD m_adwMobSkillCooltime[MOB_SKILL_MAX_NUM];
// END_OF_MOB_SKILL // END_OF_MOB_SKILL
// for SKILL_MUYEONG // for SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT
public: public:
void StartMuyeongEvent(); void StartFlameSpiritEvent();
void StopMuyeongEvent(); void StopFlameSpiritEvent();
private: private:
LPEVENT m_pkMuyeongEvent; LPEVENT m_pkFlameSpiritEvent;
// for SKILL_CHAIN lighting // for SKILL_SHAMAN_HEALING_LIGHTNING_CLAW lighting
public: public:
int GetChainLightningIndex() const { return m_iChainLightingIndex; } int GetChainLightningIndex() const { return m_iChainLightingIndex; }
void IncChainLightningIndex() { ++m_iChainLightingIndex; } void IncChainLightningIndex() { ++m_iChainLightingIndex; }
@ -1435,14 +1435,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
int m_iChainLightingIndex; int m_iChainLightingIndex;
CHARACTER_SET m_setExceptChainLighting; CHARACTER_SET m_setExceptChainLighting;
// for SKILL_EUNHYUNG // for SKILL_NINJA_BLADEFIGHT_STEALTH
public: public:
void SetAffectedEunhyung(); void SetAffectedStealth();
void ClearAffectedEunhyung() { m_dwAffectedEunhyungLevel = 0; } void ClearAffectedStealth() { m_dwAffectedStealthLevel = 0; }
bool GetAffectedEunhyung() const { return m_dwAffectedEunhyungLevel; } bool GetAffectedStealth() const { return m_dwAffectedStealthLevel; }
private: private:
DWORD m_dwAffectedEunhyungLevel; DWORD m_dwAffectedStealthLevel;
// //
// Skill levels // Skill levels

View File

@ -471,7 +471,7 @@ void CHARACTER::LoadAffect(DWORD dwCount, TPacketAffectElement * pElements)
for (DWORD i = 0; i < dwCount; ++i, ++pElements) for (DWORD i = 0; i < dwCount; ++i, ++pElements)
{ {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>. // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>.
if (pElements->dwType == SKILL_MUYEONG) if (pElements->dwType == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
continue; continue;
if (AFFECT_AUTO_HP_RECOVERY == pElements->dwType || AFFECT_AUTO_SP_RECOVERY == pElements->dwType) if (AFFECT_AUTO_HP_RECOVERY == pElements->dwType || AFFECT_AUTO_SP_RECOVERY == pElements->dwType)
@ -657,12 +657,12 @@ void CHARACTER::ComputeAffect(CAffect * pkAff, bool bAdd)
else else
PointChange(pkAff->bApplyOn, -pkAff->lApplyValue); PointChange(pkAff->bApplyOn, -pkAff->lApplyValue);
if (pkAff->dwType == SKILL_MUYEONG) if (pkAff->dwType == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
{ {
if (bAdd) if (bAdd)
StartMuyeongEvent(); StartFlameSpiritEvent();
else else
StopMuyeongEvent(); StopFlameSpiritEvent();
} }
} }
@ -745,20 +745,20 @@ void CHARACTER::RemoveGoodAffect()
RemoveAffect(AFFECT_CON); RemoveAffect(AFFECT_CON);
RemoveAffect(AFFECT_CHINA_FIREWORK); RemoveAffect(AFFECT_CHINA_FIREWORK);
RemoveAffect(SKILL_JEONGWI); RemoveAffect(SKILL_WAR_BODY_BERSERK);
RemoveAffect(SKILL_GEOMKYUNG); RemoveAffect(SKILL_WAR_BODY_AURA);
RemoveAffect(SKILL_CHUNKEON); RemoveAffect(SKILL_WAR_MENTAL_STRONG_BODY);
RemoveAffect(SKILL_EUNHYUNG); RemoveAffect(SKILL_NINJA_BLADEFIGHT_STEALTH);
RemoveAffect(SKILL_GYEONGGONG); RemoveAffect(SKILL_NINJA_ARCHERY_FEATHER_WALK);
RemoveAffect(SKILL_GWIGEOM); RemoveAffect(SKILL_SURA_WEAPONRY_ENCHANTED_BLADE);
RemoveAffect(SKILL_TERROR); RemoveAffect(SKILL_SURA_WEAPONRY_FEAR);
RemoveAffect(SKILL_JUMAGAP); RemoveAffect(SKILL_SURA_WEAPONRY_ENCHANTED_ARMOUR);
RemoveAffect(SKILL_MANASHILED); RemoveAffect(SKILL_SURA_BLACKMAGIC_DARK_PROTECTION);
RemoveAffect(SKILL_HOSIN); RemoveAffect(SKILL_SHAMAN_DRAGON_BLESSING);
RemoveAffect(SKILL_REFLECT); RemoveAffect(SKILL_SHAMAN_DRAGON_REFLECT);
RemoveAffect(SKILL_KWAESOK); RemoveAffect(SKILL_SHAMAN_HEALING_SWIFTNESS);
RemoveAffect(SKILL_JEUNGRYEOK); RemoveAffect(SKILL_SHAMAN_HEALING_ATTACK);
RemoveAffect(SKILL_GICHEON); RemoveAffect(SKILL_SHAMAN_DRAGON_DRAGONS_STRENGTH);
} }
bool CHARACTER::IsGoodAffect(BYTE bAffectType) const bool CHARACTER::IsGoodAffect(BYTE bAffectType) const
@ -773,20 +773,20 @@ bool CHARACTER::IsGoodAffect(BYTE bAffectType) const
case (AFFECT_CON): case (AFFECT_CON):
case (AFFECT_CHINA_FIREWORK): case (AFFECT_CHINA_FIREWORK):
case (SKILL_JEONGWI): case (SKILL_WAR_BODY_BERSERK):
case (SKILL_GEOMKYUNG): case (SKILL_WAR_BODY_AURA):
case (SKILL_CHUNKEON): case (SKILL_WAR_MENTAL_STRONG_BODY):
case (SKILL_EUNHYUNG): case (SKILL_NINJA_BLADEFIGHT_STEALTH):
case (SKILL_GYEONGGONG): case (SKILL_NINJA_ARCHERY_FEATHER_WALK):
case (SKILL_GWIGEOM): case (SKILL_SURA_WEAPONRY_ENCHANTED_BLADE):
case (SKILL_TERROR): case (SKILL_SURA_WEAPONRY_FEAR):
case (SKILL_JUMAGAP): case (SKILL_SURA_WEAPONRY_ENCHANTED_ARMOUR):
case (SKILL_MANASHILED): case (SKILL_SURA_BLACKMAGIC_DARK_PROTECTION):
case (SKILL_HOSIN): case (SKILL_SHAMAN_DRAGON_BLESSING):
case (SKILL_REFLECT): case (SKILL_SHAMAN_DRAGON_REFLECT):
case (SKILL_KWAESOK): case (SKILL_SHAMAN_HEALING_SWIFTNESS):
case (SKILL_JEUNGRYEOK): case (SKILL_SHAMAN_HEALING_ATTACK):
case (SKILL_GICHEON): case (SKILL_SHAMAN_DRAGON_DRAGONS_STRENGTH):
return true; return true;
} }
return false; return false;
@ -806,7 +806,7 @@ void CHARACTER::RemoveBadAffect()
RemoveAffect(AFFECT_SLOW); RemoveAffect(AFFECT_SLOW);
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD> // <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>
RemoveAffect(SKILL_TUSOK); RemoveAffect(SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE);
// <20><><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD>
//RemoveAffect(SKILL_CURSE); //RemoveAffect(SKILL_CURSE);

View File

@ -1659,9 +1659,9 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
// <20><>Ÿ<EFBFBD><C5B8> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> // <20><>Ÿ<EFBFBD><C5B8> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
if (type != DAMAGE_TYPE_NORMAL && type != DAMAGE_TYPE_NORMAL_RANGE) if (type != DAMAGE_TYPE_NORMAL && type != DAMAGE_TYPE_NORMAL_RANGE)
{ {
if (IsAffectFlag(AFF_TERROR)) if (IsAffectFlag(AFF_SURA_WEAPONRY_FEAR))
{ {
int pct = GetSkillPower(SKILL_TERROR) / 400; int pct = GetSkillPower(SKILL_SURA_WEAPONRY_FEAR) / 400;
if (Random::get(1, 100) <= pct) if (Random::get(1, 100) <= pct)
return false; return false;
@ -1722,9 +1722,9 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
dam *= 2; dam *= 2;
EffectPacket(SE_CRITICAL); EffectPacket(SE_CRITICAL);
if (IsAffectFlag(AFF_MANASHIELD)) if (IsAffectFlag(AFF_SURA_BLACKMAGIC_DARK_PROTECTION))
{ {
RemoveAffect(AFF_MANASHIELD); RemoveAffect(AFF_SURA_BLACKMAGIC_DARK_PROTECTION);
} }
} }
} }
@ -1772,9 +1772,9 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100;
if (IsAffectFlag(AFF_MANASHIELD)) if (IsAffectFlag(AFF_SURA_BLACKMAGIC_DARK_PROTECTION))
{ {
RemoveAffect(AFF_MANASHIELD); RemoveAffect(AFF_SURA_BLACKMAGIC_DARK_PROTECTION);
} }
} }
} }
@ -1816,13 +1816,13 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
} }
} }
if (IsAffectFlag(AFF_JEONGWIHON)) if (IsAffectFlag(AFF_WAR_BODY_BERSERK))
dam = (int) (dam * (100 + GetSkillPower(SKILL_JEONGWI) * 25 / 100) / 100); dam = (int) (dam * (100 + GetSkillPower(SKILL_WAR_BODY_BERSERK) * 25 / 100) / 100);
if (IsAffectFlag(AFF_TERROR)) if (IsAffectFlag(AFF_SURA_WEAPONRY_FEAR))
dam = (int) (dam * (95 - GetSkillPower(SKILL_TERROR) / 5) / 100); dam = (int) (dam * (95 - GetSkillPower(SKILL_SURA_WEAPONRY_FEAR) / 5) / 100);
if (IsAffectFlag(AFF_HOSIN)) if (IsAffectFlag(AFF_SHAMAN_DRAGON_BLESSING))
dam = dam * (100 - GetPoint(POINT_RESIST_NORMAL_DAMAGE)) / 100; dam = dam * (100 - GetPoint(POINT_RESIST_NORMAL_DAMAGE)) / 100;
// //
@ -2022,11 +2022,11 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
// //
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ż<EFBFBD>ȣ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ż<EFBFBD>ȣ)
// //
if (IsAffectFlag(AFF_MANASHIELD)) if (IsAffectFlag(AFF_SURA_BLACKMAGIC_DARK_PROTECTION))
{ {
// POINT_MANASHIELD <20><> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // POINT_DARK_PROTECTION <20><> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int iDamageSPPart = dam / 3; int iDamageSPPart = dam / 3;
int iDamageToSP = iDamageSPPart * GetPoint(POINT_MANASHIELD) / 100; int iDamageToSP = iDamageSPPart * GetPoint(POINT_DARK_PROTECTION) / 100;
int iSP = GetSP(); int iSP = GetSP();
// SP<53><50> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // SP<53><50> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
@ -2039,7 +2039,7 @@ bool CHARACTER::Damage(LPCHARACTER pAttacker, int dam, EDamageType type) // retu
{ {
// <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20>ǰ<EFBFBD> <20><> <20><EFBFBD><EFBFA9><EFBFBD><EFBFBD>?? // <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20>ǰ<EFBFBD> <20><> <20><EFBFBD><EFBFA9><EFBFBD><EFBFBD>??
PointChange(POINT_SP, -GetSP()); PointChange(POINT_SP, -GetSP());
dam -= iSP * 100 / std::max(GetPoint(POINT_MANASHIELD), 1); dam -= iSP * 100 / std::max(GetPoint(POINT_DARK_PROTECTION), 1);
} }
} }
@ -2845,7 +2845,7 @@ class CFuncShoot
return; return;
m_me->m_SkillUseInfo[m_bType].SetMainTargetVID(dwTargetVID); m_me->m_SkillUseInfo[m_bType].SetMainTargetVID(dwTargetVID);
/*if (m_bType == SKILL_BIPABU || m_bType == SKILL_KWANKYEOK) /*if (m_bType == SKILL_SHAMAN_DRAGON_FLYING_TALISMAN || m_bType == SKILL_NINJA_ARCHERY_ARROW_SHOWER)
m_me->m_SkillUseInfo[m_bType].ResetHitCount();*/ m_me->m_SkillUseInfo[m_bType].ResetHitCount();*/
} }
@ -2941,9 +2941,9 @@ class CFuncShoot
} }
break; break;
case SKILL_YEONSA: // <20><><EFBFBD><EFBFBD> case SKILL_NINJA_ARCHERY_REPETITIVE_SHOT: // <20><><EFBFBD><EFBFBD>
{ {
//int iUseArrow = 2 + (m_me->GetSkillPower(SKILL_YEONSA) *6/100); //int iUseArrow = 2 + (m_me->GetSkillPower(SKILL_NINJA_ARCHERY_REPETITIVE_SHOT) *6/100);
int iUseArrow = 1; int iUseArrow = 1;
// <20><>Ż<EFBFBD><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4><C2B0><EFBFBD> // <20><>Ż<EFBFBD><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4><C2B0><EFBFBD>
@ -2970,7 +2970,7 @@ class CFuncShoot
break; break;
case SKILL_KWANKYEOK: case SKILL_NINJA_ARCHERY_ARROW_SHOWER:
{ {
int iUseArrow = 1; int iUseArrow = 1;
@ -2989,7 +2989,7 @@ class CFuncShoot
} }
break; break;
case SKILL_GIGUNG: case SKILL_NINJA_ARCHERY_POISON_ARROW:
{ {
int iUseArrow = 1; int iUseArrow = 1;
if (iUseArrow == m_me->GetArrowAndBow(&pkBow, &pkArrow, iUseArrow)) if (iUseArrow == m_me->GetArrowAndBow(&pkBow, &pkArrow, iUseArrow))
@ -3000,14 +3000,14 @@ class CFuncShoot
if (pkVictim->CanBeginFight()) if (pkVictim->CanBeginFight())
pkVictim->BeginFight(m_me); pkVictim->BeginFight(m_me);
SPDLOG_DEBUG("{} gigung {}", m_me->GetName(), pkVictim->GetName()); SPDLOG_DEBUG("{} poison arrow {}", m_me->GetName(), pkVictim->GetName());
m_me->ComputeSkill(m_bType, pkVictim); m_me->ComputeSkill(m_bType, pkVictim);
m_me->UseArrow(pkArrow, iUseArrow); m_me->UseArrow(pkArrow, iUseArrow);
} }
} }
break; break;
case SKILL_HWAJO: case SKILL_NINJA_ARCHERY_FIRE_ARROW:
{ {
int iUseArrow = 1; int iUseArrow = 1;
if (iUseArrow == m_me->GetArrowAndBow(&pkBow, &pkArrow, iUseArrow)) if (iUseArrow == m_me->GetArrowAndBow(&pkBow, &pkArrow, iUseArrow))
@ -3018,7 +3018,7 @@ class CFuncShoot
if (pkVictim->CanBeginFight()) if (pkVictim->CanBeginFight())
pkVictim->BeginFight(m_me); pkVictim->BeginFight(m_me);
SPDLOG_DEBUG("{} hwajo {}", m_me->GetName(), pkVictim->GetName()); SPDLOG_DEBUG("{} fire arrow {}", m_me->GetName(), pkVictim->GetName());
m_me->ComputeSkill(m_bType, pkVictim); m_me->ComputeSkill(m_bType, pkVictim);
m_me->UseArrow(pkArrow, iUseArrow); m_me->UseArrow(pkArrow, iUseArrow);
} }
@ -3045,15 +3045,15 @@ class CFuncShoot
break; break;
case SKILL_MARYUNG: case SKILL_SURA_BLACKMAGIC_DARK_STRIKE:
//case SKILL_GUMHWAN: //case SKILL_GUMHWAN:
case SKILL_TUSOK: case SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE:
case SKILL_BIPABU: case SKILL_SHAMAN_DRAGON_FLYING_TALISMAN:
case SKILL_NOEJEON: case SKILL_SHAMAN_HEALING_LIGHTNING_THROW:
case SKILL_GEOMPUNG: case SKILL_WAR_MENTAL_SWORD_STRIKE:
case SKILL_SANGONG: case SKILL_NINJA_BLADEFIGHT_POISONOUS_CLOUD:
case SKILL_MAHWAN: case SKILL_SURA_BLACKMAGIC_DARK_ORB:
case SKILL_PABEOB: case SKILL_SURA_WEAPONRY_DISPEL:
//case SKILL_CURSE: //case SKILL_CURSE:
{ {
m_me->OnMove(true); m_me->OnMove(true);
@ -3067,7 +3067,7 @@ class CFuncShoot
} }
break; break;
case SKILL_CHAIN: case SKILL_SHAMAN_HEALING_LIGHTNING_CLAW:
{ {
m_me->OnMove(true); m_me->OnMove(true);
pkVictim->OnMove(); pkVictim->OnMove();
@ -3082,7 +3082,7 @@ class CFuncShoot
} }
break; break;
case SKILL_YONGBI: case SKILL_SHAMAN_DRAGON_SHOOTING_DRAGON:
{ {
m_me->OnMove(true); m_me->OnMove(true);
} }
@ -3186,7 +3186,7 @@ LPCHARACTER CHARACTER::GetNearestVictim(LPCHARACTER pkChr)
if (!pAttacker) if (!pAttacker)
continue; continue;
if (pAttacker->IsAffectFlag(AFF_EUNHYUNG) || if (pAttacker->IsAffectFlag(AFF_NINJA_BLADEFIGHT_STEALTH) ||
pAttacker->IsAffectFlag(AFF_INVISIBILITY) || pAttacker->IsAffectFlag(AFF_INVISIBILITY) ||
pAttacker->IsAffectFlag(AFF_REVIVE_INVISIBLE)) pAttacker->IsAffectFlag(AFF_REVIVE_INVISIBLE))
continue; continue;

View File

@ -477,11 +477,11 @@ void CHARACTER::SetWear(BYTE bCell, LPITEM item)
if (!item && bCell == WEAR_WEAPON) if (!item && bCell == WEAR_WEAPON)
{ {
// <20>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>־<EFBFBD> <20>Ѵ<EFBFBD>. // <20>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>־<EFBFBD> <20>Ѵ<EFBFBD>.
if (IsAffectFlag(AFF_GWIGUM)) if (IsAffectFlag(AFF_SURA_WEAPONRY_ENCHANTED_BLADE))
RemoveAffect(SKILL_GWIGEOM); RemoveAffect(SKILL_SURA_WEAPONRY_ENCHANTED_BLADE);
if (IsAffectFlag(AFF_GEOMGYEONG)) if (IsAffectFlag(AFF_WAR_BODY_AURA))
RemoveAffect(SKILL_GEOMKYUNG); RemoveAffect(SKILL_WAR_BODY_AURA);
} }
} }
@ -7277,7 +7277,7 @@ void CHARACTER::AutoRecoveryItemProcess(const EAffectTypes type)
return; return;
{ {
const DWORD stunSkills[] = { SKILL_TANHWAN, SKILL_GEOMPUNG, SKILL_BYEURAK, SKILL_GIGUNG }; const DWORD stunSkills[] = { SKILL_WAR_BODY_DASH, SKILL_WAR_MENTAL_SWORD_STRIKE, SKILL_SHAMAN_HEALING_SUMMON_LIGHTNING, SKILL_NINJA_ARCHERY_POISON_ARROW };
for (size_t i=0 ; i < sizeof(stunSkills)/sizeof(DWORD) ; ++i) for (size_t i=0 ; i < sizeof(stunSkills)/sizeof(DWORD) ; ++i)
{ {

View File

@ -68,7 +68,7 @@ bool TSkillUseInfo::HitOnce(DWORD dwVnum)
SPDLOG_DEBUG("__HitOnce NextUse {} current {} count {} scount {}", dwNextSkillUsableTime, get_dword_time(), iHitCount, iSplashCount); SPDLOG_DEBUG("__HitOnce NextUse {} current {} count {} scount {}", dwNextSkillUsableTime, get_dword_time(), iHitCount, iSplashCount);
if (dwNextSkillUsableTime && dwNextSkillUsableTime<get_dword_time() && dwVnum != SKILL_MUYEONG && dwVnum != SKILL_HORSE_WILDATTACK) if (dwNextSkillUsableTime && dwNextSkillUsableTime<get_dword_time() && dwVnum != SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT && dwVnum != SKILL_HORSE_WILDATTACK)
{ {
SPDLOG_DEBUG("__HitOnce can't hit"); SPDLOG_DEBUG("__HitOnce can't hit");
@ -124,12 +124,12 @@ bool TSkillUseInfo::UseSkill(bool isGrandMaster, DWORD vid, DWORD dwCooltime, in
int CHARACTER::GetChainLightningMaxCount() const int CHARACTER::GetChainLightningMaxCount() const
{ {
return aiChainLightningCountBySkillLevel[std::min<int>(SKILL_MAX_LEVEL, GetSkillLevel(SKILL_CHAIN))]; return aiChainLightningCountBySkillLevel[std::min<int>(SKILL_MAX_LEVEL, GetSkillLevel(SKILL_SHAMAN_HEALING_LIGHTNING_CLAW))];
} }
void CHARACTER::SetAffectedEunhyung() void CHARACTER::SetAffectedStealth()
{ {
m_dwAffectedEunhyungLevel = GetSkillPower(SKILL_EUNHYUNG); m_dwAffectedStealthLevel = GetSkillPower(SKILL_NINJA_BLADEFIGHT_STEALTH);
} }
void CHARACTER::SetSkillGroup(BYTE bSkillGroup) void CHARACTER::SetSkillGroup(BYTE bSkillGroup)
@ -223,13 +223,13 @@ bool CHARACTER::IsLearnableSkill(DWORD dwSkillVnum) const
if (6 == pkSkill->dwType) if (6 == pkSkill->dwType)
{ {
if (SKILL_7_A_ANTI_TANHWAN <= dwSkillVnum && dwSkillVnum <= SKILL_7_D_ANTI_YONGBI) if (SKILL_7_A_ANTI_WAR_BODY_DASH <= dwSkillVnum && dwSkillVnum <= SKILL_7_D_ANTI_SHAMAN_DRAGON_SHOOTING_DRAGON)
{ {
for (int i=0 ; i < 4 ; i++) for (int i=0 ; i < 4 ; i++)
{ {
if (unsigned(SKILL_7_A_ANTI_TANHWAN + i) != dwSkillVnum) if (unsigned(SKILL_7_A_ANTI_WAR_BODY_DASH + i) != dwSkillVnum)
{ {
if (0 != GetSkillLevel(SKILL_7_A_ANTI_TANHWAN + i)) if (0 != GetSkillLevel(SKILL_7_A_ANTI_WAR_BODY_DASH + i))
{ {
return false; return false;
} }
@ -239,13 +239,13 @@ bool CHARACTER::IsLearnableSkill(DWORD dwSkillVnum) const
return true; return true;
} }
if (SKILL_8_A_ANTI_GIGONGCHAM <= dwSkillVnum && dwSkillVnum <= SKILL_8_D_ANTI_BYEURAK) if (SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE <= dwSkillVnum && dwSkillVnum <= SKILL_8_D_ANTI_SHAMAN_HEALING_SUMMON_LIGHTNING)
{ {
for (int i=0 ; i < 4 ; i++) for (int i=0 ; i < 4 ; i++)
{ {
if (unsigned(SKILL_8_A_ANTI_GIGONGCHAM + i) != dwSkillVnum) if (unsigned(SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE + i) != dwSkillVnum)
{ {
if (0 != GetSkillLevel(SKILL_8_A_ANTI_GIGONGCHAM + i)) if (0 != GetSkillLevel(SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE + i))
return false; return false;
} }
} }
@ -698,7 +698,7 @@ void CHARACTER::SkillLevelUp(DWORD dwVnum, BYTE bMethod)
return; return;
} }
if (SKILL_7_A_ANTI_TANHWAN <= dwVnum && dwVnum <= SKILL_8_D_ANTI_BYEURAK) if (SKILL_7_A_ANTI_WAR_BODY_DASH <= dwVnum && dwVnum <= SKILL_8_D_ANTI_SHAMAN_HEALING_SUMMON_LIGHTNING)
{ {
if (0 == GetSkillLevel(dwVnum)) if (0 == GetSkillLevel(dwVnum))
return; return;
@ -1017,7 +1017,7 @@ EVENTFUNC(ChainLightningEvent)
if (pkTarget) if (pkTarget)
{ {
pkChrVictim->CreateFly(FLY_CHAIN_LIGHTNING, pkTarget); pkChrVictim->CreateFly(FLY_CHAIN_LIGHTNING, pkTarget);
pkChr->ComputeSkill(SKILL_CHAIN, pkTarget); pkChr->ComputeSkill(SKILL_SHAMAN_HEALING_LIGHTNING_CLAW, pkTarget);
pkChr->AddChainLightningExcept(pkTarget); pkChr->AddChainLightningExcept(pkTarget);
} }
else else
@ -1092,7 +1092,7 @@ struct FuncSplashDamage
if (m_pkChr->IsPC()) if (m_pkChr->IsPC())
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (!(m_pkSk->dwVnum >= GUILD_SKILL_START && m_pkSk->dwVnum <= GUILD_SKILL_END)) if (!(m_pkSk->dwVnum >= GUILD_SKILL_START && m_pkSk->dwVnum <= GUILD_SKILL_END))
if (!m_bDisableCooltime && m_pInfo && !m_pInfo->HitOnce(m_pkSk->dwVnum) && m_pkSk->dwVnum != SKILL_MUYEONG) if (!m_bDisableCooltime && m_pInfo && !m_pInfo->HitOnce(m_pkSk->dwVnum) && m_pkSk->dwVnum != SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
{ {
SPDLOG_TRACE("check guild skill {}", m_pkChr->GetName()); SPDLOG_TRACE("check guild skill {}", m_pkChr->GetName());
return; return;
@ -1159,10 +1159,10 @@ struct FuncSplashDamage
m_pkSk->SetPointVar("chain", m_pkChr->GetChainLightningIndex()); m_pkSk->SetPointVar("chain", m_pkChr->GetChainLightningIndex());
m_pkChr->IncChainLightningIndex(); m_pkChr->IncChainLightningIndex();
bool bUnderEunhyung = m_pkChr->GetAffectedEunhyung() > 0; // <20>̰<EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD>?? bool bUnderStealth = m_pkChr->GetAffectedStealth() > 0; // <20>̰<EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD>??
m_pkSk->SetPointVar("ek", m_pkChr->GetAffectedEunhyung()*1./100); m_pkSk->SetPointVar("ek", m_pkChr->GetAffectedStealth()*1./100);
//m_pkChr->ClearAffectedEunhyung(); //m_pkChr->ClearAffectedStealth();
SetPolyVarForAttack(m_pkChr, m_pkSk, m_pkWeapon); SetPolyVarForAttack(m_pkChr, m_pkSk, m_pkWeapon);
int iAmount = 0; int iAmount = 0;
@ -1183,7 +1183,7 @@ struct FuncSplashDamage
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
iAmount = -iAmount; iAmount = -iAmount;
if (m_pkSk->dwVnum == SKILL_AMSEOP) if (m_pkSk->dwVnum == SKILL_NINJA_BLADEFIGHT_AMBUSH)
{ {
float fDelta = GetDegreeDelta(m_pkChr->GetRotation(), pkChrVictim->GetRotation()); float fDelta = GetDegreeDelta(m_pkChr->GetRotation(), pkChrVictim->GetRotation());
float adjust; float adjust;
@ -1192,7 +1192,7 @@ struct FuncSplashDamage
{ {
adjust = 1.5f; adjust = 1.5f;
if (bUnderEunhyung) if (bUnderStealth)
adjust += 0.5f; adjust += 0.5f;
if (m_pkChr->GetWear(WEAR_WEAPON) && m_pkChr->GetWear(WEAR_WEAPON)->GetSubType() == WEAPON_DAGGER) if (m_pkChr->GetWear(WEAR_WEAPON) && m_pkChr->GetWear(WEAR_WEAPON)->GetSubType() == WEAPON_DAGGER)
@ -1210,7 +1210,7 @@ struct FuncSplashDamage
if ( !LC_IsYMIR() ) if ( !LC_IsYMIR() )
{ {
if (bUnderEunhyung) if (bUnderStealth)
adjust += 0.5f; adjust += 0.5f;
if (m_pkChr->GetWear(WEAR_WEAPON) && m_pkChr->GetWear(WEAR_WEAPON)->GetSubType() == WEAPON_DAGGER) if (m_pkChr->GetWear(WEAR_WEAPON) && m_pkChr->GetWear(WEAR_WEAPON)->GetSubType() == WEAPON_DAGGER)
@ -1220,7 +1220,7 @@ struct FuncSplashDamage
iAmount = (int) (iAmount * adjust); iAmount = (int) (iAmount * adjust);
} }
else if (m_pkSk->dwVnum == SKILL_GUNGSIN) else if (m_pkSk->dwVnum == SKILL_NINJA_BLADEFIGHT_FAST_ATTACK)
{ {
float adjust = 1.0; float adjust = 1.0;
@ -1346,7 +1346,7 @@ struct FuncSplashDamage
if (pkChrVictim->CanBeginFight()) if (pkChrVictim->CanBeginFight())
pkChrVictim->BeginFight(m_pkChr); pkChrVictim->BeginFight(m_pkChr);
if (m_pkSk->dwVnum == SKILL_CHAIN) if (m_pkSk->dwVnum == SKILL_SHAMAN_HEALING_LIGHTNING_CLAW)
SPDLOG_DEBUG("{} CHAIN INDEX {} DAM {} DT {}", m_pkChr->GetName(), m_pkChr->GetChainLightningIndex() - 1, iDam, (int) dt); SPDLOG_DEBUG("{} CHAIN INDEX {} DAM {} DT {}", m_pkChr->GetName(), m_pkChr->GetChainLightningIndex() - 1, iDam, (int) dt);
{ {
@ -1354,14 +1354,14 @@ struct FuncSplashDamage
switch (m_pkSk->dwVnum) switch (m_pkSk->dwVnum)
{ {
case SKILL_TANHWAN: AntiSkillID = SKILL_7_A_ANTI_TANHWAN; break; case SKILL_WAR_BODY_DASH: AntiSkillID = SKILL_7_A_ANTI_WAR_BODY_DASH; break;
case SKILL_AMSEOP: AntiSkillID = SKILL_7_B_ANTI_AMSEOP; break; case SKILL_NINJA_BLADEFIGHT_AMBUSH: AntiSkillID = SKILL_7_B_ANTI_NINJA_BLADEFIGHT_AMBUSH; break;
case SKILL_SWAERYUNG: AntiSkillID = SKILL_7_C_ANTI_SWAERYUNG; break; case SKILL_SURA_WEAPONRY_FINGER_STRIKE: AntiSkillID = SKILL_7_C_ANTI_SURA_WEAPONRY_FINGER_STRIKE; break;
case SKILL_YONGBI: AntiSkillID = SKILL_7_D_ANTI_YONGBI; break; case SKILL_SHAMAN_DRAGON_SHOOTING_DRAGON: AntiSkillID = SKILL_7_D_ANTI_SHAMAN_DRAGON_SHOOTING_DRAGON; break;
case SKILL_GIGONGCHAM: AntiSkillID = SKILL_8_A_ANTI_GIGONGCHAM; break; case SKILL_WAR_MENTAL_SPIRIT_STRIKE: AntiSkillID = SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE; break;
case SKILL_YEONSA: AntiSkillID = SKILL_8_B_ANTI_YEONSA; break; case SKILL_NINJA_ARCHERY_REPETITIVE_SHOT: AntiSkillID = SKILL_8_B_ANTI_NINJA_ARCHERY_REPETITIVE_SHOT; break;
case SKILL_MAHWAN: AntiSkillID = SKILL_8_C_ANTI_MAHWAN; break; case SKILL_SURA_BLACKMAGIC_DARK_ORB: AntiSkillID = SKILL_8_C_ANTI_SURA_BLACKMAGIC_DARK_ORB; break;
case SKILL_BYEURAK: AntiSkillID = SKILL_8_D_ANTI_BYEURAK; break; case SKILL_SHAMAN_HEALING_SUMMON_LIGHTNING: AntiSkillID = SKILL_8_D_ANTI_SHAMAN_HEALING_SUMMON_LIGHTNING; break;
} }
if (0 != AntiSkillID) if (0 != AntiSkillID)
@ -1400,7 +1400,7 @@ struct FuncSplashDamage
if (Random::get(1, 100) <= iAmount2) if (Random::get(1, 100) <= iAmount2)
{ {
pkChrVictim->RemoveGoodAffect(); pkChrVictim->RemoveGoodAffect();
pkChrVictim->AddAffect(m_pkSk->dwVnum, POINT_NONE, 0, AFF_PABEOP, iDur2, 0, true); pkChrVictim->AddAffect(m_pkSk->dwVnum, POINT_NONE, 0, AFF_SURA_WEAPONRY_DISPEL, iDur2, 0, true);
} }
} }
@ -1505,7 +1505,7 @@ struct FuncSplashDamage
m_pkChr->PointChange(POINT_SP, iDam * iPct / 100); m_pkChr->PointChange(POINT_SP, iDam * iPct / 100);
} }
if (m_pkSk->dwVnum == SKILL_CHAIN && m_pkChr->GetChainLightningIndex() < m_pkChr->GetChainLightningMaxCount()) if (m_pkSk->dwVnum == SKILL_SHAMAN_HEALING_LIGHTNING_CLAW && m_pkChr->GetChainLightningIndex() < m_pkChr->GetChainLightningMaxCount())
{ {
chain_lightning_event_info* info = AllocEventInfo<chain_lightning_event_info>(); chain_lightning_event_info* info = AllocEventInfo<chain_lightning_event_info>();
@ -1563,11 +1563,11 @@ struct FuncSplashAffect
if (DISTANCE_APPROX(m_x - pkChr->GetX(), m_y - pkChr->GetY()) < m_iDist) if (DISTANCE_APPROX(m_x - pkChr->GetX(), m_y - pkChr->GetY()) < m_iDist)
{ {
SPDLOG_TRACE("FuncSplashAffect step 2 : name:{} vnum:{} iDur:{}", pkChr->GetName(), m_dwVnum, m_iDuration); SPDLOG_TRACE("FuncSplashAffect step 2 : name:{} vnum:{} iDur:{}", pkChr->GetName(), m_dwVnum, m_iDuration);
if (m_dwVnum == SKILL_TUSOK) if (m_dwVnum == SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE)
if (pkChr->CanBeginFight()) if (pkChr->CanBeginFight())
pkChr->BeginFight(m_pkChrAttacker); pkChr->BeginFight(m_pkChrAttacker);
if (pkChr->IsPC() && m_dwVnum == SKILL_TUSOK) if (pkChr->IsPC() && m_dwVnum == SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE)
pkChr->AddAffect(m_dwVnum, m_bPointOn, m_iAmount, m_dwAffectFlag, m_iDuration/3, m_iSPCost, m_bOverride); pkChr->AddAffect(m_dwVnum, m_bPointOn, m_iAmount, m_dwAffectFlag, m_iDuration/3, m_iSPCost, m_bOverride);
else else
pkChr->AddAffect(m_dwVnum, m_bPointOn, m_iAmount, m_dwAffectFlag, m_iDuration, m_iSPCost, m_bOverride); pkChr->AddAffect(m_dwVnum, m_bPointOn, m_iAmount, m_dwAffectFlag, m_iDuration, m_iSPCost, m_bOverride);
@ -1795,7 +1795,7 @@ int CHARACTER::ComputeSkillAtPosition(DWORD dwVnum, const PIXEL_POSITION& posTar
if (IsPC()) if (IsPC())
if (!(dwVnum >= GUILD_SKILL_START && dwVnum <= GUILD_SKILL_END)) // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. if (!(dwVnum >= GUILD_SKILL_START && dwVnum <= GUILD_SKILL_END)) // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG) if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
{ {
return BATTLE_NONE; return BATTLE_NONE;
} }
@ -1999,7 +1999,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
} }
} }
if (pkVictim->IsAffectFlag(AFF_PABEOP) && pkVictim->IsGoodAffect(dwVnum)) if (pkVictim->IsAffectFlag(AFF_SURA_WEAPONRY_DISPEL) && pkVictim->IsGoodAffect(dwVnum))
{ {
return BATTLE_NONE; return BATTLE_NONE;
} }
@ -2108,7 +2108,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
// END_OF_REMOVE_BAD_AFFECT_BUG_FIX // END_OF_REMOVE_BAD_AFFECT_BUG_FIX
if (IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK | SKILL_FLAG_USE_MELEE_DAMAGE | SKILL_FLAG_USE_MAGIC_DAMAGE) && if (IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK | SKILL_FLAG_USE_MELEE_DAMAGE | SKILL_FLAG_USE_MAGIC_DAMAGE) &&
!(pkSk->dwVnum == SKILL_MUYEONG && pkVictim == this) && !(pkSk->IsChargeSkill() && pkVictim == this)) !(pkSk->dwVnum == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT && pkVictim == this) && !(pkSk->IsChargeSkill() && pkVictim == this))
{ {
bool bAdded = false; bool bAdded = false;
@ -2136,7 +2136,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
if (IsPC()) if (IsPC())
if (!(dwVnum >= GUILD_SKILL_START && dwVnum <= GUILD_SKILL_END)) // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. if (!(dwVnum >= GUILD_SKILL_START && dwVnum <= GUILD_SKILL_END)) // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG) if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
{ {
return BATTLE_NONE; return BATTLE_NONE;
} }
@ -2222,7 +2222,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
} }
else else
{ {
if (dwVnum == SKILL_MUYEONG) if (dwVnum == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT)
{ {
pkSk->kDurationPoly.SetVar("k", k/*bSkillLevel*/); pkSk->kDurationPoly.SetVar("k", k/*bSkillLevel*/);
pkSk->kDurationSPCostPoly.SetVar("k", k/*bSkillLevel*/); pkSk->kDurationSPCostPoly.SetVar("k", k/*bSkillLevel*/);
@ -2233,7 +2233,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
if (pkVictim == this) if (pkVictim == this)
AddAffect(dwVnum, AddAffect(dwVnum,
POINT_NONE, 0, POINT_NONE, 0,
AFF_MUYEONG, AFF_SURA_BLACKMAGIC_FLAME_SPIRIT,
iDur, iDur,
(int) pkSk->kDurationSPCostPoly.Eval(), (int) pkSk->kDurationSPCostPoly.Eval(),
true); true);
@ -2280,13 +2280,13 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
//if (g_iUseLocale) //if (g_iUseLocale)
if ( !LC_IsYMIR() ) if ( !LC_IsYMIR() )
{ {
if ((pkSk->dwVnum == SKILL_CHUNKEON && GetUsedSkillMasterType(pkSk->dwVnum) < SKILL_GRAND_MASTER)) if ((pkSk->dwVnum == SKILL_WAR_MENTAL_STRONG_BODY && GetUsedSkillMasterType(pkSk->dwVnum) < SKILL_GRAND_MASTER))
affact_flag = AFF_CHEONGEUN_WITH_FALL; affact_flag = AFF_WAR_MENTAL_STRONG_BODY_WITH_FALL;
} }
else else
{ {
if ((pkSk->dwVnum == SKILL_CHUNKEON && GetUsedSkillMasterType(pkSk->dwVnum) < SKILL_MASTER)) if ((pkSk->dwVnum == SKILL_WAR_MENTAL_STRONG_BODY && GetUsedSkillMasterType(pkSk->dwVnum) < SKILL_MASTER))
affact_flag = AFF_CHEONGEUN_WITH_FALL; affact_flag = AFF_WAR_MENTAL_STRONG_BODY_WITH_FALL;
} }
// END_OF_ADD_GRANDMASTER_SKILL // END_OF_ADD_GRANDMASTER_SKILL
@ -2336,7 +2336,7 @@ int CHARACTER::ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel
iDur2 += GetPoint(POINT_PARTY_BUFFER_BONUS); iDur2 += GetPoint(POINT_PARTY_BUFFER_BONUS);
if (pkSk->IsChargeSkill()) if (pkSk->IsChargeSkill())
pkVictim->AddAffect(pkSk->dwVnum, pkSk->bPointOn2, iAmount2, AFF_TANHWAN_DASH, iDur2, 0, false); pkVictim->AddAffect(pkSk->dwVnum, pkSk->bPointOn2, iAmount2, AFF_WAR_BODY_DASH, iDur2, 0, false);
else else
pkVictim->AddAffect(pkSk->dwVnum, pkSk->bPointOn2, iAmount2, pkSk->dwAffectFlag2, iDur2, 0, false); pkVictim->AddAffect(pkSk->dwVnum, pkSk->bPointOn2, iAmount2, pkSk->dwAffectFlag2, iDur2, 0, false);
} }
@ -2462,12 +2462,12 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
if (pkSk->IsChargeSkill()) if (pkSk->IsChargeSkill())
{ {
if (IsAffectFlag(AFF_TANHWAN_DASH) || pkVictim && pkVictim != this) if (IsAffectFlag(AFF_WAR_BODY_DASH) || pkVictim && pkVictim != this)
{ {
if (!pkVictim) if (!pkVictim)
return false; return false;
if (!IsAffectFlag(AFF_TANHWAN_DASH)) if (!IsAffectFlag(AFF_WAR_BODY_DASH))
{ {
if (!UseSkill(dwVnum, this)) if (!UseSkill(dwVnum, this))
return false; return false;
@ -2493,7 +2493,7 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
} }
// Toggle <20><> <20><><EFBFBD><EFBFBD> SP<53><50> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (SelfOnly<6C><79> <20><><EFBFBD><EFBFBD>) // Toggle <20><> <20><><EFBFBD><EFBFBD> SP<53><50> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (SelfOnly<6C><79> <20><><EFBFBD><EFBFBD>)
if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum)) if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum))
{ {
return true; return true;
} }
@ -2515,7 +2515,7 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
DWORD dwCur = get_dword_time(); DWORD dwCur = get_dword_time();
if (dwVnum == SKILL_TERROR && m_SkillUseInfo[dwVnum].bUsed && m_SkillUseInfo[dwVnum].dwNextSkillUsableTime > dwCur ) if (dwVnum == SKILL_SURA_WEAPONRY_FEAR && m_SkillUseInfo[dwVnum].bUsed && m_SkillUseInfo[dwVnum].dwNextSkillUsableTime > dwCur )
{ {
SPDLOG_DEBUG(" SKILL_TERROR's Cooltime is not delta over {}", m_SkillUseInfo[dwVnum].dwNextSkillUsableTime - dwCur ); SPDLOG_DEBUG(" SKILL_TERROR's Cooltime is not delta over {}", m_SkillUseInfo[dwVnum].dwNextSkillUsableTime - dwCur );
return false; return false;
@ -2568,7 +2568,7 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY)) if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
pkVictim = this; pkVictim = this;
if (pkSk->dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill() && !IsAffectFlag(AFF_TANHWAN_DASH) && !pkVictim) if (pkSk->dwVnum == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT || pkSk->IsChargeSkill() && !IsAffectFlag(AFF_WAR_BODY_DASH) && !pkVictim)
{ {
// ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> Affect<63><74> <20><><EFBFBD>δ<EFBFBD>. // ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> Affect<63><74> <20><><EFBFBD>δ<EFBFBD>.
pkVictim = this; pkVictim = this;
@ -2593,7 +2593,7 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
} }
} }
if (dwVnum == SKILL_CHAIN) if (dwVnum == SKILL_SHAMAN_HEALING_LIGHTNING_CLAW)
{ {
ResetChainLightningIndex(); ResetChainLightningIndex();
AddChainLightningExcept(pkVictim); AddChainLightningExcept(pkVictim);
@ -2604,9 +2604,9 @@ bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaste
ComputeSkill(dwVnum, this); ComputeSkill(dwVnum, this);
else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK)) else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
ComputeSkill(dwVnum, pkVictim); ComputeSkill(dwVnum, pkVictim);
else if (dwVnum == SKILL_BYEURAK) else if (dwVnum == SKILL_SHAMAN_HEALING_SUMMON_LIGHTNING)
ComputeSkill(dwVnum, pkVictim); ComputeSkill(dwVnum, pkVictim);
else if (dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill()) else if (dwVnum == SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT || pkSk->IsChargeSkill())
ComputeSkill(dwVnum, pkVictim); ComputeSkill(dwVnum, pkVictim);
m_dwLastSkillTime = get_dword_time(); m_dwLastSkillTime = get_dword_time();
@ -2702,9 +2702,9 @@ EVENTFUNC(skill_muyoung_event)
return 0; return 0;
} }
if (!ch->IsAffectFlag(AFF_MUYEONG)) if (!ch->IsAffectFlag(AFF_SURA_BLACKMAGIC_FLAME_SPIRIT))
{ {
ch->StopMuyeongEvent(); ch->StopFlameSpiritEvent();
return 0; return 0;
} }
@ -2716,28 +2716,28 @@ EVENTFUNC(skill_muyoung_event)
// 2. Shoot! // 2. Shoot!
if (f.GetVictim()) if (f.GetVictim())
{ {
ch->CreateFly(FLY_SKILL_MUYEONG, f.GetVictim()); ch->CreateFly(FLY_SKILL_FLAME_SPIRIT, f.GetVictim());
ch->ComputeSkill(SKILL_MUYEONG, f.GetVictim()); ch->ComputeSkill(SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT, f.GetVictim());
} }
} }
return PASSES_PER_SEC(3); return PASSES_PER_SEC(3);
} }
void CHARACTER::StartMuyeongEvent() void CHARACTER::StartFlameSpiritEvent()
{ {
if (m_pkMuyeongEvent) if (m_pkFlameSpiritEvent)
return; return;
char_event_info* info = AllocEventInfo<char_event_info>(); char_event_info* info = AllocEventInfo<char_event_info>();
info->ch = this; info->ch = this;
m_pkMuyeongEvent = event_create(skill_muyoung_event, info, PASSES_PER_SEC(1)); m_pkFlameSpiritEvent = event_create(skill_muyoung_event, info, PASSES_PER_SEC(1));
} }
void CHARACTER::StopMuyeongEvent() void CHARACTER::StopFlameSpiritEvent()
{ {
event_cancel(&m_pkMuyeongEvent); event_cancel(&m_pkFlameSpiritEvent);
} }
void CHARACTER::SkillLearnWaitMoreTimeMessage(DWORD ms) void CHARACTER::SkillLearnWaitMoreTimeMessage(DWORD ms)
@ -3522,10 +3522,10 @@ bool CHARACTER::CheckSkillHitCount(const BYTE SkillID, const VID TargetVID)
switch (SkillID) switch (SkillID)
{ {
case SKILL_YONGKWON: case SKILL_SURA_WEAPONRY_DRAGON_SWIRL:
case SKILL_HWAYEOMPOK: case SKILL_SURA_BLACKMAGIC_FLAME_STRIKE:
case SKILL_DAEJINGAK: case SKILL_WAR_MENTAL_STUMP:
case SKILL_PAERYONG: case SKILL_SHAMAN_DRAGON_DRAGONS_ROAR:
SPDLOG_WARN("SkillHack: cannot use attack packet for skill({})", SkillID); SPDLOG_WARN("SkillHack: cannot use attack packet for skill({})", SkillID);
return false; return false;
} }
@ -3538,8 +3538,8 @@ bool CHARACTER::CheckSkillHitCount(const BYTE SkillID, const VID TargetVID)
switch (SkillID) switch (SkillID)
{ {
case SKILL_SAMYEON: case SKILL_WAR_BODY_THREE_WAY_CUT:
case SKILL_CHARYUN: case SKILL_NINJA_BLADEFIGHT_ROLLING_DAGGER:
MaxAttackCountPerTarget = 3; MaxAttackCountPerTarget = 3;
break; break;
@ -3547,7 +3547,7 @@ bool CHARACTER::CheckSkillHitCount(const BYTE SkillID, const VID TargetVID)
MaxAttackCountPerTarget = 5; MaxAttackCountPerTarget = 5;
break; break;
case SKILL_YEONSA: case SKILL_NINJA_ARCHERY_REPETITIVE_SHOT:
MaxAttackCountPerTarget = 7; MaxAttackCountPerTarget = 7;
break; break;

View File

@ -197,7 +197,7 @@ namespace
if (pkChr->IsDead()) if (pkChr->IsDead())
return; return;
if (pkChr->IsAffectFlag(AFF_EUNHYUNG) || if (pkChr->IsAffectFlag(AFF_NINJA_BLADEFIGHT_STEALTH) ||
pkChr->IsAffectFlag(AFF_INVISIBILITY) || pkChr->IsAffectFlag(AFF_INVISIBILITY) ||
pkChr->IsAffectFlag(AFF_REVIVE_INVISIBLE)) pkChr->IsAffectFlag(AFF_REVIVE_INVISIBLE))
return; return;

View File

@ -848,15 +848,15 @@ ACMD(do_skillup)
case SKILL_HORSE_ESCAPE: case SKILL_HORSE_ESCAPE:
case SKILL_HORSE_WILDATTACK_RANGE: case SKILL_HORSE_WILDATTACK_RANGE:
case SKILL_7_A_ANTI_TANHWAN: case SKILL_7_A_ANTI_WAR_BODY_DASH:
case SKILL_7_B_ANTI_AMSEOP: case SKILL_7_B_ANTI_NINJA_BLADEFIGHT_AMBUSH:
case SKILL_7_C_ANTI_SWAERYUNG: case SKILL_7_C_ANTI_SURA_WEAPONRY_FINGER_STRIKE:
case SKILL_7_D_ANTI_YONGBI: case SKILL_7_D_ANTI_SHAMAN_DRAGON_SHOOTING_DRAGON:
case SKILL_8_A_ANTI_GIGONGCHAM: case SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE:
case SKILL_8_B_ANTI_YEONSA: case SKILL_8_B_ANTI_NINJA_ARCHERY_REPETITIVE_SHOT:
case SKILL_8_C_ANTI_MAHWAN: case SKILL_8_C_ANTI_SURA_BLACKMAGIC_DARK_ORB:
case SKILL_8_D_ANTI_BYEURAK: case SKILL_8_D_ANTI_SHAMAN_HEALING_SUMMON_LIGHTNING:
case SKILL_ADD_HP: case SKILL_ADD_HP:
case SKILL_RESIST_PENETRATE: case SKILL_RESIST_PENETRATE:

View File

@ -1273,8 +1273,8 @@ void CGuild::UseSkill(DWORD dwVnum, LPCHARACTER ch, DWORD pid)
if (ch->IsAffectFlag(AFF_REVIVE_INVISIBLE)) if (ch->IsAffectFlag(AFF_REVIVE_INVISIBLE))
ch->RemoveAffect(AFFECT_REVIVE_INVISIBLE); ch->RemoveAffect(AFFECT_REVIVE_INVISIBLE);
if (ch->IsAffectFlag(AFF_EUNHYUNG)) if (ch->IsAffectFlag(AFF_NINJA_BLADEFIGHT_STEALTH))
ch->RemoveAffect(SKILL_EUNHYUNG); ch->RemoveAffect(SKILL_NINJA_BLADEFIGHT_STEALTH);
double k =1.0*m_data.abySkill[dwRealVnum]/pkSk->bMaxLevel; double k =1.0*m_data.abySkill[dwRealVnum]/pkSk->bMaxLevel;
pkSk->kSPCostPoly.SetVar("k", k); pkSk->kSPCostPoly.SetVar("k", k);

View File

@ -615,10 +615,10 @@ void CGuild::EndWar(DWORD dwOppGID)
LPCHARACTER ch = *it; LPCHARACTER ch = *it;
ch->RemoveAffect(GUILD_SKILL_BLOOD); ch->RemoveAffect(GUILD_SKILL_BLOOD);
ch->RemoveAffect(GUILD_SKILL_BLESS); ch->RemoveAffect(GUILD_SKILL_BLESS);
ch->RemoveAffect(GUILD_SKILL_SEONGHWI); ch->RemoveAffect(GUILD_SKILL_ARMOUR);
ch->RemoveAffect(GUILD_SKILL_ACCEL); ch->RemoveAffect(GUILD_SKILL_ACCEL);
ch->RemoveAffect(GUILD_SKILL_BUNNO); ch->RemoveAffect(GUILD_SKILL_RAGE);
ch->RemoveAffect(GUILD_SKILL_JUMUN); ch->RemoveAffect(GUILD_SKILL_CAST);
ch->RemoveBadAffect(); ch->RemoveBadAffect();
} }

View File

@ -1704,19 +1704,19 @@ void CInputMain::Attack(LPCHARACTER ch, const BYTE header, const char* data)
switch (type->type) switch (type->type)
{ {
case SKILL_GEOMPUNG: case SKILL_WAR_MENTAL_SWORD_STRIKE:
case SKILL_SANGONG: case SKILL_NINJA_BLADEFIGHT_POISONOUS_CLOUD:
case SKILL_YEONSA: case SKILL_NINJA_ARCHERY_REPETITIVE_SHOT:
case SKILL_KWANKYEOK: case SKILL_NINJA_ARCHERY_ARROW_SHOWER:
case SKILL_HWAJO: case SKILL_NINJA_ARCHERY_FIRE_ARROW:
case SKILL_GIGUNG: case SKILL_NINJA_ARCHERY_POISON_ARROW:
case SKILL_PABEOB: case SKILL_SURA_WEAPONRY_DISPEL:
case SKILL_MARYUNG: case SKILL_SURA_BLACKMAGIC_DARK_STRIKE:
case SKILL_TUSOK: case SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE:
case SKILL_MAHWAN: case SKILL_SURA_BLACKMAGIC_DARK_ORB:
case SKILL_BIPABU: case SKILL_SHAMAN_DRAGON_FLYING_TALISMAN:
case SKILL_NOEJEON: case SKILL_SHAMAN_HEALING_LIGHTNING_THROW:
case SKILL_CHAIN: case SKILL_SHAMAN_HEALING_LIGHTNING_CLAW:
case SKILL_HORSE_WILDATTACK_RANGE: case SKILL_HORSE_WILDATTACK_RANGE:
if (HEADER_CG_SHOOT != type->header) if (HEADER_CG_SHOOT != type->header)
{ {

View File

@ -862,7 +862,7 @@ namespace quest
ch->PointChange(POINT_SUB_SKILL, newLevel < 10 ? 0 : newLevel - std::max(ch->GetLevel(), 9)); ch->PointChange(POINT_SUB_SKILL, newLevel < 10 ? 0 : newLevel - std::max(ch->GetLevel(), 9));
ch->PointChange(POINT_STAT, ((std::clamp(newLevel, 1, 90) - ch->GetLevel()) * 3) + ch->GetPoint(POINT_LEVEL_STEP)); ch->PointChange(POINT_STAT, ((std::clamp(newLevel, 1, 90) - ch->GetLevel()) * 3) + ch->GetPoint(POINT_LEVEL_STEP));
//<2F><><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD>
ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel()); ch->PointChange(POINT_LEVEL, newLevel - ch->GetLevel(), false, true);
//HP, SP //HP, SP
ch->SetRandomHP((newLevel - 1) * Random::get(JobInitialPoints[ch->GetJob()].hp_per_lv_begin, JobInitialPoints[ch->GetJob()].hp_per_lv_end)); ch->SetRandomHP((newLevel - 1) * Random::get(JobInitialPoints[ch->GetJob()].hp_per_lv_begin, JobInitialPoints[ch->GetJob()].hp_per_lv_end));
ch->SetRandomSP((newLevel - 1) * Random::get(JobInitialPoints[ch->GetJob()].sp_per_lv_begin, JobInitialPoints[ch->GetJob()].sp_per_lv_end)); ch->SetRandomSP((newLevel - 1) * Random::get(JobInitialPoints[ch->GetJob()].sp_per_lv_begin, JobInitialPoints[ch->GetJob()].sp_per_lv_end));

View File

@ -72,7 +72,7 @@ struct SPointOnType
{ "HIT_HP_RECOVER", POINT_HIT_HP_RECOVERY }, { "HIT_HP_RECOVER", POINT_HIT_HP_RECOVERY },
{ "HIT_SP_RECOVER", POINT_HIT_SP_RECOVERY }, { "HIT_SP_RECOVER", POINT_HIT_SP_RECOVERY },
{ "CRITICAL", POINT_CRITICAL_PCT }, { "CRITICAL", POINT_CRITICAL_PCT },
{ "MANASHIELD", POINT_MANASHIELD }, { "MANASHIELD", POINT_DARK_PROTECTION },
{ "SKILL_DAMAGE_BONUS", POINT_SKILL_DAMAGE_BONUS }, { "SKILL_DAMAGE_BONUS", POINT_SKILL_DAMAGE_BONUS },
{ "NORMAL_HIT_DAMAGE_BONUS", POINT_NORMAL_HIT_DAMAGE_BONUS }, { "NORMAL_HIT_DAMAGE_BONUS", POINT_NORMAL_HIT_DAMAGE_BONUS },
{ "\n", POINT_NONE }, { "\n", POINT_NONE },

View File

@ -46,93 +46,93 @@ enum ESkillIndexes
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>
// A // A
SKILL_SAMYEON = 1, // <20><EFBFBD><EFBFAC>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) SKILL_WAR_BODY_THREE_WAY_CUT = 1, // <20><EFBFBD><EFBFAC>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
SKILL_PALBANG, // <20>ȹ<EFBFBD>dz<EFBFBD><C7B3> SKILL_WAR_BODY_SWORD_SPIN, // <20>ȹ<EFBFBD>dz<EFBFBD><C7B3>
// S // S
SKILL_JEONGWI, // <20><><EFBFBD><EFBFBD>ȥ SKILL_WAR_BODY_BERSERK, // <20><><EFBFBD><EFBFBD>ȥ
SKILL_GEOMKYUNG, // <20>˰<EFBFBD> SKILL_WAR_BODY_AURA, // <20>˰<EFBFBD>
SKILL_TANHWAN, // źȯ<C5BA><C8AF> SKILL_WAR_BODY_DASH, // źȯ<C5BA><C8AF>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>
// A // A
SKILL_GIGONGCHAM = 16, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_WAR_MENTAL_SPIRIT_STRIKE = 16, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_GYOKSAN, // <20>ݻ<EFBFBD>Ÿ<EFBFBD><C5B8> SKILL_WAR_MENTAL_BASH, // <20>ݻ<EFBFBD>Ÿ<EFBFBD><C5B8>
SKILL_DAEJINGAK, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_WAR_MENTAL_STUMP, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// S // S
SKILL_CHUNKEON, // õ<><C3B5><EFBFBD><EFBFBD> SKILL_WAR_MENTAL_STRONG_BODY, // õ<><C3B5><EFBFBD><EFBFBD>
SKILL_GEOMPUNG, // <20><>dz SKILL_WAR_MENTAL_SWORD_STRIKE, // <20><>dz
// <20>ڰ<EFBFBD> <20>ϻ<EFBFBD> <20> // <20>ڰ<EFBFBD> <20>ϻ<EFBFBD> <20>
// A // A
SKILL_AMSEOP = 31, // <20>Ͻ<EFBFBD> SKILL_NINJA_BLADEFIGHT_AMBUSH = 31, // <20>Ͻ<EFBFBD>
SKILL_GUNGSIN, // <20>ý<EFBFBD>ź<EFBFBD><C5BA> SKILL_NINJA_BLADEFIGHT_FAST_ATTACK, // <20>ý<EFBFBD>ź<EFBFBD><C5BA>
SKILL_CHARYUN, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_NINJA_BLADEFIGHT_ROLLING_DAGGER, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// S // S
SKILL_EUNHYUNG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_NINJA_BLADEFIGHT_STEALTH, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_SANGONG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_NINJA_BLADEFIGHT_POISONOUS_CLOUD, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>ڰ<EFBFBD> <20>ü<EFBFBD> <20> // <20>ڰ<EFBFBD> <20>ü<EFBFBD> <20>
// A // A
SKILL_YEONSA = 46, // <20><><EFBFBD><EFBFBD> SKILL_NINJA_ARCHERY_REPETITIVE_SHOT = 46, // <20><><EFBFBD><EFBFBD>
SKILL_KWANKYEOK, // <20><><EFBFBD>ݼ<EFBFBD> SKILL_NINJA_ARCHERY_ARROW_SHOWER, // <20><><EFBFBD>ݼ<EFBFBD>
SKILL_HWAJO, // ȭ<><C8AD><EFBFBD><EFBFBD> SKILL_NINJA_ARCHERY_FIRE_ARROW, // ȭ<><C8AD><EFBFBD><EFBFBD>
// S // S
SKILL_GYEONGGONG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_NINJA_ARCHERY_FEATHER_WALK, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_GIGUNG, // <20><><EFBFBD><EFBFBD> SKILL_NINJA_ARCHERY_POISON_ARROW, // <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><> // <20><><EFBFBD><EFBFBD> <20><>
// A // A
SKILL_SWAERYUNG = 61, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SURA_WEAPONRY_FINGER_STRIKE = 61, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_YONGKWON, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SURA_WEAPONRY_DRAGON_SWIRL, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// S // S
SKILL_GWIGEOM, // <20>Ͱ<EFBFBD> SKILL_SURA_WEAPONRY_ENCHANTED_BLADE, // <20>Ͱ<EFBFBD>
SKILL_TERROR, // <20><><EFBFBD><EFBFBD> SKILL_SURA_WEAPONRY_FEAR, // <20><><EFBFBD><EFBFBD>
SKILL_JUMAGAP, // <20>ָ<EFBFBD><D6B8><EFBFBD> SKILL_SURA_WEAPONRY_ENCHANTED_ARMOUR, // <20>ָ<EFBFBD><D6B8><EFBFBD>
SKILL_PABEOB, // <20>Ĺ<EFBFBD><C4B9><EFBFBD> SKILL_SURA_WEAPONRY_DISPEL, // <20>Ĺ<EFBFBD><C4B9><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// A // A
SKILL_MARYUNG = 76, // <20><><EFBFBD><EFBFBD> SKILL_SURA_BLACKMAGIC_DARK_STRIKE = 76, // <20><><EFBFBD><EFBFBD>
SKILL_HWAYEOMPOK, // ȭ<><C8AD><EFBFBD><EFBFBD> SKILL_SURA_BLACKMAGIC_FLAME_STRIKE, // ȭ<><C8AD><EFBFBD><EFBFBD>
SKILL_MUYEONG, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SURA_BLACKMAGIC_FLAME_SPIRIT, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// S // S
SKILL_MANASHILED, // <20><><EFBFBD>ż<EFBFBD>ȣ SKILL_SURA_BLACKMAGIC_DARK_PROTECTION, // <20><><EFBFBD>ż<EFBFBD>ȣ
SKILL_TUSOK, // <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD> SKILL_SURA_BLACKMAGIC_SPIRIT_STRIKE, // <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>
SKILL_MAHWAN, // <20><>ȯ<EFBFBD><C8AF> SKILL_SURA_BLACKMAGIC_DARK_ORB, // <20><>ȯ<EFBFBD><C8AF>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// A // A
SKILL_BIPABU = 91, SKILL_SHAMAN_DRAGON_FLYING_TALISMAN = 91,
SKILL_YONGBI, // <20><><EFBFBD>񱤻<EFBFBD><F1B1A4BB><EFBFBD> SKILL_SHAMAN_DRAGON_SHOOTING_DRAGON, // <20><><EFBFBD>񱤻<EFBFBD><F1B1A4BB><EFBFBD>
SKILL_PAERYONG, // <20>з泪<D0B7>ѹ<EFBFBD> SKILL_SHAMAN_DRAGON_DRAGONS_ROAR, // <20>з泪<D0B7>ѹ<EFBFBD>
// S // S
//SKILL_BUDONG, // <20>ε<EFBFBD><CEB5>ں<EFBFBD> //SKILL_BUDONG, // <20>ε<EFBFBD><CEB5>ں<EFBFBD>
SKILL_HOSIN, // ȣ<><C8A3> SKILL_SHAMAN_DRAGON_BLESSING, // ȣ<><C8A3>
SKILL_REFLECT, // <20><>ȣ SKILL_SHAMAN_DRAGON_REFLECT, // <20><>ȣ
SKILL_GICHEON, // <20><>õ<EFBFBD><C3B5><EFBFBD><EFBFBD> SKILL_SHAMAN_DRAGON_DRAGONS_STRENGTH, // <20><>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// A // A
SKILL_NOEJEON = 106, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SHAMAN_HEALING_LIGHTNING_THROW = 106, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_BYEURAK, // <20><><EFBFBD><EFBFBD> SKILL_SHAMAN_HEALING_SUMMON_LIGHTNING, // <20><><EFBFBD><EFBFBD>
SKILL_CHAIN, // ü<>ζ<EFBFBD><CEB6><EFBFBD>Ʈ<EFBFBD><C6AE> SKILL_SHAMAN_HEALING_LIGHTNING_CLAW, // ü<>ζ<EFBFBD><CEB6><EFBFBD>Ʈ<EFBFBD><C6AE>
// S // S
SKILL_JEONGEOP, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SHAMAN_HEALING_CURE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SKILL_KWAESOK, // <20>̵<EFBFBD><CCB5>ӵ<EFBFBD><D3B5><EFBFBD> SKILL_SHAMAN_HEALING_SWIFTNESS, // <20>̵<EFBFBD><CCB5>ӵ<EFBFBD><D3B5><EFBFBD>
SKILL_JEUNGRYEOK, // <20><><EFBFBD>¼<EFBFBD> SKILL_SHAMAN_HEALING_ATTACK, // <20><><EFBFBD>¼<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų // <20><><EFBFBD><EFBFBD> <20><>ų
// 7 // 7
SKILL_7_A_ANTI_TANHWAN = 112, SKILL_7_A_ANTI_WAR_BODY_DASH = 112,
SKILL_7_B_ANTI_AMSEOP, SKILL_7_B_ANTI_NINJA_BLADEFIGHT_AMBUSH,
SKILL_7_C_ANTI_SWAERYUNG, SKILL_7_C_ANTI_SURA_WEAPONRY_FINGER_STRIKE,
SKILL_7_D_ANTI_YONGBI, SKILL_7_D_ANTI_SHAMAN_DRAGON_SHOOTING_DRAGON,
// 8 // 8
SKILL_8_A_ANTI_GIGONGCHAM, SKILL_8_A_ANTI_WAR_MENTAL_SPIRIT_STRIKE,
SKILL_8_B_ANTI_YEONSA, SKILL_8_B_ANTI_NINJA_ARCHERY_REPETITIVE_SHOT,
SKILL_8_C_ANTI_MAHWAN, SKILL_8_C_ANTI_SURA_BLACKMAGIC_DARK_ORB,
SKILL_8_D_ANTI_BYEURAK, SKILL_8_D_ANTI_SHAMAN_HEALING_SUMMON_LIGHTNING,
// <20><><EFBFBD><EFBFBD> <20><>ų // <20><><EFBFBD><EFBFBD> <20><>ų
@ -157,13 +157,13 @@ enum ESkillIndexes
SKILL_RESIST_PENETRATE = 142, // ö<><C3B6> SKILL_RESIST_PENETRATE = 142, // ö<><C3B6>
GUILD_SKILL_START = 151, GUILD_SKILL_START = 151,
GUILD_SKILL_EYE = 151, GUILD_SKILL_EYE = 151, // Dragon's Eye (unused?)
GUILD_SKILL_BLOOD = 152, GUILD_SKILL_BLOOD = 152, // Blood of Dragon God
GUILD_SKILL_BLESS = 153, GUILD_SKILL_BLESS = 153, // Benediction of Dragon God
GUILD_SKILL_SEONGHWI = 154, GUILD_SKILL_ARMOUR = 154, // Holy Armour
GUILD_SKILL_ACCEL = 155, GUILD_SKILL_ACCEL = 155, // Acceleration
GUILD_SKILL_BUNNO = 156, GUILD_SKILL_RAGE = 156, // Rage of Dragon God
GUILD_SKILL_JUMUN = 157, GUILD_SKILL_CAST = 157, // Casting Aid
GUILD_SKILL_TELEPORT = 158, GUILD_SKILL_TELEPORT = 158,
GUILD_SKILL_DOOR = 159, GUILD_SKILL_DOOR = 159,
GUILD_SKILL_END = 162, GUILD_SKILL_END = 162,
@ -215,7 +215,7 @@ class CSkillProto
bool IsChargeSkill() bool IsChargeSkill()
{ {
return dwVnum == SKILL_TANHWAN || dwVnum == SKILL_HORSE_CHARGE; return dwVnum == SKILL_WAR_BODY_DASH || dwVnum == SKILL_HORSE_CHARGE;
} }
// 3<><33> <20><><EFBFBD><EFBFBD> // 3<><33> <20><><EFBFBD><EFBFBD>

View File

@ -95,12 +95,12 @@ class FuncFindMobVictim
if (pkChr->IsDead()) if (pkChr->IsDead())
return false; return false;
if (pkChr->IsAffectFlag(AFF_EUNHYUNG) || if (pkChr->IsAffectFlag(AFF_NINJA_BLADEFIGHT_STEALTH) ||
pkChr->IsAffectFlag(AFF_INVISIBILITY) || pkChr->IsAffectFlag(AFF_INVISIBILITY) ||
pkChr->IsAffectFlag(AFF_REVIVE_INVISIBLE)) pkChr->IsAffectFlag(AFF_REVIVE_INVISIBLE))
return false; return false;
if (pkChr->IsAffectFlag(AFF_TERROR) && m_pkChr->IsImmune(IMMUNE_TERROR) == false ) // <20><><EFBFBD><EFBFBD> ó<><C3B3> if (pkChr->IsAffectFlag(AFF_SURA_WEAPONRY_FEAR) && m_pkChr->IsImmune(IMMUNE_TERROR) == false ) // <20><><EFBFBD><EFBFBD> ó<><C3B3>
{ {
if ( pkChr->GetLevel() >= m_pkChr->GetLevel() ) if ( pkChr->GetLevel() >= m_pkChr->GetLevel() )
return false; return false;