DragonNest/GameCommon/DnProbInvincibleAtBlow.h
2024-12-19 09:48:26 +08:00

87 lines
2.6 KiB
C++

#pragma once
#include "dnblow.h"
// 특정 스킬을 정해진 확률만큼 회피하는 상태효과.
// 특정 스킬의 hit 시그널들에서 데미지와 상태효과가 들어가지 않도록 한다.
class CDnProbInvincibleAtBlow : public CDnBlow,
public TBoostMemoryPool< CDnProbInvincibleAtBlow >
{
protected:
public:
CDnProbInvincibleAtBlow( DnActorHandle hActor, const char* szValue );
virtual ~CDnProbInvincibleAtBlow(void);
private:
#ifdef _GAMESERVER
struct S_INVINCIBLE_INFO
{
int iMonsterID;
map<int, float> mapSkillInfos;
S_INVINCIBLE_INFO( void ) : iMonsterID( 0 ) {};
};
struct S_SKILL_INFO
{
DnSkillHandle hTargetSkill;
bool bTargetSkillUsedProjectile;
S_SKILL_INFO( void ) : bTargetSkillUsedProjectile( false ) {};
};
std::map<int, S_INVINCIBLE_INFO> m_mapInvincibleAt;
map<int, float>* m_pNowMapSelectedSkillInfos;
// 매 프로세스마다 end 된 상태인지 체크.
//DnSkillHandle m_hTargetSkill;
bool m_bNowSelectedSkillUsedProjectile;
list<S_SKILL_INFO> m_listTargetSkills;
map<int, bool> m_mapTargetSkillUsedProjectile;
deque<DnSkillHandle> m_dqProbInvincibleFailedSkills;
#endif // #ifdef _GAMESERVER
public:
virtual void OnBegin( LOCAL_TIME LocalTime, float fDelta );
virtual void Process( LOCAL_TIME LocalTime, float fDelta );
virtual void OnEnd( LOCAL_TIME LocalTime, float fDelta );
void AddInvincibleAt(const char* szValue);
#ifdef _GAMESERVER
private:
void CheckAllTargetSkillState( void );
void CheckTargetSkillStateAndDoEnd( DnSkillHandle hTargetSkill );
void GatherEndTargetState( /*IN OUT*/ vector<DnSkillHandle>& vlhEndedTargetSkill );
void CheckProbFailedSkillState( void );
bool IsSkillFinished( DnSkillHandle hSkill );
bool IsProbFailedSkillObject( DnSkillHandle hSkill );
public:
//nSkillID에 대한 무적 설정이 되어 있는지 확인
bool IsInvincibleAt( DnSkillHandle hTargetSkill );
bool IsBeginInvincible( int iSkillID );
S_SKILL_INFO* FindInvincibleTargetSkill( int iSkillID );
void BeginInvincibleAt( DnSkillHandle hTargetSkill );
void EndInvincibleAt( DnSkillHandle hTargetSkill );
// 특정 스킬의 데미지라면 데미지를 0으로 만들고,
virtual float OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam );
// 특정 스킬에 대한 무적이 진행중이면 상태효과 들어가지 않도록.
bool CanAddThisSkillsStateBlow( int iSkillID );
// 그로 인한 상태효과도 들어가지 않도록 처리..
#else
void OnSuccess( void );
#endif // _GAMESERVER
//#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
//public:
// static void AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue);
// static void RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue);
//#endif // PRE_ADD_PREFIX_SYSTE_RENEW
};