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

201 lines
5.3 KiB
C++

#pragma once
#include "DnWeapon.h"
class CDnDamageBase
{
public:
enum DamageObjectTypeEnum {
Unknown = 0,
Actor,
Prop,
};
enum DistanceTypeEnum
{
Melee = 0,
Range,
};
#ifdef _GAMESERVER
struct SHitParam {
std::string szActionName;
LOCAL_TIME RemainTime;
float fDamage;
float fDurability;
float fStiffProb;
EtVector3 vVelocity;
EtVector3 vResistance;
DnActorHandle hHitter;
DnWeaponHandle hWeapon;
bool bFirstHit;
EtVector3 vPosition;
EtVector3 vViewVec;
std::vector<int> vBoneIndex;
int nDamageType;
CDnWeapon::HitTypeEnum HitType;
int nSkillSuperAmmorIndex;
int nSkillSuperAmmorDamage;
int nSuperAmmorDelay;
CDnState::ElementEnum HasElement;
int iElementAttack;
char cAttackType;
bool bSuccessNormalDamage;
DistanceTypeEnum DistanceType;
bool bIgnoreCanHit;
bool bIgnoreParring;
bool bFromProjectileSkill; // #23818 스킬로 발사된 발사체의 hit 시그널로 비롯된 hitparam 인지 구분. 공격 아이템에 접두어 스킬이 붙어있을 경우 "평타 공격시" 라는 조건이 붙으므로..
// 발사체로 쏜 것은 발사체의 객체에 발사체를 쏜 시점의 shooter 의 state 를 복사해서 갖고 있다가
// 데미지 계산할 때 그걸로 계산한다.
bool bFromProjectile;
// 일반 히트 시에는 -1 디폴트 값으로써, 건드릴 필요가 없으나
// Projectile 에서 생성하여 넣어줌. IsHittable 함수에서 EndSignalTime 을
// 구분하기 전에 UniqueID 가 같은지 우선 체크해서 다르면 무시한다.
int iUniqueID;
INT64 nCalcDamage; //OnTargetHit시에 맞는 액터의 데미지를 알기 위해 저장.
int nHitLimitCount; //Hit수 제한
#if defined( PRE_ADD_LOTUSGOLEM )
bool bIgnoreShowDamage;
#endif // #if defined( PRE_ADD_LOTUSGOLEM )
#ifdef PRE_ADD_MONSTER_CATCH
bool bReleaseCatchActor;
#endif // #ifdef PRE_ADD_MONSTER_CATCH
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
bool bStageLimit;
#endif
int nWeightValueLimit; // 아카데믹 포스아웃 용 [2011/07/04 semozz]
bool bBreakSuperAmmor; // 브레이킹 포인트(슈퍼아머브레이크)에 의해 크리티컬이 발동시 활성화.(크리티컬 저항 계산이 안되도록하기 위해)
SHitParam()
: vVelocity( 0.f, 0.f, 0.f )
, vResistance( 0.f, 0.f, 0.f )
, vPosition( 0.f, 0.f, 0.f )
, vViewVec( 0.f, 0.f, 0.f )
, iUniqueID( -1 )
{
fDamage = 0.f;
fDurability = 0.f;
fStiffProb = 0.f;
RemainTime = 0;
hWeapon.Identity();
bFirstHit = true;
vBoneIndex.clear();
HitType = CDnWeapon::HitTypeEnum::Normal;
nDamageType = 0;
nSkillSuperAmmorIndex = -1;
nSkillSuperAmmorDamage = 0;
HasElement = CDnState::ElementEnum_Amount;
iElementAttack = 0;
cAttackType = 0;
bSuccessNormalDamage = true;
nSuperAmmorDelay = 0;
DistanceType = DistanceTypeEnum::Melee;
//nProjectileAttackMin = 0;
//nProjectileAttackMax = 0;
bFromProjectile = false;
bIgnoreParring = false;
bIgnoreCanHit = false;
bFromProjectileSkill = false;
nCalcDamage = 0;
nHitLimitCount = 0;
#if defined( PRE_ADD_LOTUSGOLEM )
bIgnoreShowDamage = false;
#endif // #if defined( PRE_ADD_LOTUSGOLEM )
#ifdef PRE_ADD_MONSTER_CATCH
bReleaseCatchActor = false;
#endif // #ifdef PRE_ADD_MONSTER_CATCH
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
bStageLimit = false;
#endif
nWeightValueLimit = 0;
bBreakSuperAmmor = false;
}
};
#else
struct SHitParam {
std::string szActionName;
DnWeaponHandle hWeapon;
INT64 nDamage;
CDnWeapon::HitTypeEnum HitType;
EtVector3 vPosition;
EtVector3 vVelocity;
EtVector3 vResistance;
EtVector3 vViewVec;
float fStiffDelta;
float fDownDelta;
bool bFirstHit;
bool bSuccessNormalDamage;
bool bRecvOnDamage;
INT64 nCurrentHP;
DistanceTypeEnum DistanceType;
int nHitLimitCount;
CDnState::ElementEnum HasElement;
#if defined( PRE_ADD_LOTUSGOLEM )
bool bIgnoreShowDamage;
#endif // #if defined( PRE_ADD_LOTUSGOLEM )
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
bool bStageLimit;
#endif
#ifdef PRE_FIX_77172
bool bKeepJumpMovement;
#endif // PRE_FIX_77172
// #32722 클라이언트에서 스킬 사용한다는 패킷이 도착하기 전에 서버에서 피격될 경우 클라이언트만 스킬 액션이 캔슬되는 것 수정.
int iCanceledSkillIDInServer;
SHitParam()
: vVelocity( 0.f, 0.f, 0.f )
, vResistance( 0.f, 0.f, 0.f )
, vPosition( 0.f, 0.f, 0.f )
, vViewVec( 0.f, 0.f, 0.f )
{
nDamage = 0;
HitType = CDnWeapon::Normal;
fStiffDelta = 0.f;
fDownDelta = 0.f;
bFirstHit = false;
bSuccessNormalDamage = true;
bRecvOnDamage = true;
DistanceType = Melee;
nCurrentHP = 0;
nHitLimitCount = 0;
HasElement = CDnState::ElementEnum_Amount;
#if defined( PRE_ADD_LOTUSGOLEM )
bIgnoreShowDamage = false;
#endif // #if defined( PRE_ADD_LOTUSGOLEM )
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
bStageLimit = false;
#endif
#ifdef PRE_FIX_77172
bKeepJumpMovement = false;
#endif // PRE_FIX_77172
iCanceledSkillIDInServer = 0;
}
};
#endif
CDnDamageBase() { m_DamageObjectType = Unknown; }
CDnDamageBase( DamageObjectTypeEnum Type ) { m_DamageObjectType = Type; }
virtual ~CDnDamageBase() {}
protected:
DamageObjectTypeEnum m_DamageObjectType;
public:
DamageObjectTypeEnum GetDamageObjectType() { return m_DamageObjectType; }
void SetDamageObjectType( DamageObjectTypeEnum Type ) { m_DamageObjectType = Type; }
virtual void OnDamage( CDnDamageBase *pHitter, SHitParam &HitParam ) {}
virtual DWORD GetDamageObjectUniqueID() { return -1; }
virtual DnActorHandle GetActorHandle( void ) = 0;
virtual void OnSetPartsHP( DnActorHandle hActor, const int iPartsTableID, const int iCurHP , const int iHitterID){}
};