Files
2026-06-01 12:46:52 +02:00

160 lines
5.2 KiB
C++

#pragma once
#include <vector>
#include <toolkit/ILock.h>
#include <toolkit/XFlag.h>
#include "GameRule.h"
#include "GameContent.h"
#include "StructMonster.h"
#include "StructNPC.h"
struct StructRoamer : public ArObject, StructMonster::MonsterDeleteHandler, StructNPC::NPCDeadHandler
{
public:
enum ROAMING_TYPE
{
ROAMING_TYPE_ROUND = 0,
ROAMING_TYPE_GO_BACK = 1,
};
enum HATE_TYPE
{
HATE_TYPE_INDIVIDUAL = 1 << 0,
HATE_TYPE_SHARE_FIRST = 1 << 1,
HATE_TYPE_FULL_SHARE = 1 << 2,
};
enum ROAMING_CREATURE_TYPE
{
ROAMING_CREATURE_MONSTER = 0,
ROAMING_CREATURE_NPC = 1,
};
protected:
enum ROAMING_DIRECTION
{
ROAMING_DIRECTION_FORWARD = 0,
ROAMING_DIRECTION_BACKWARD = 1
};
enum ROAMING_STATUS
{
ROAMING_STATUS_IDLE = 0,
ROAMING_STATUS_ROAMING = 1,
ROAMING_STATUS_ROTATING = 2,
ROAMING_STATUS_PAUSED = 3,
};
struct ROAMING_CREATURE_INFO : public GameContent::ROAMING_CREATURE_RESPAWN_INFO
{
ROAMING_CREATURE_INFO( const ROAMING_CREATURE_TYPE eCreatureType, const int nCreatureID, const AR_TIME nRespawnInterval, const int nAngle, const AR_UNIT nDistance )
: GameContent::ROAMING_CREATURE_RESPAWN_INFO( eCreatureType, nCreatureID, nRespawnInterval, nAngle, nDistance )
, m_pCreature( NULL )
, m_nNextRespawnTime( 0 )
{}
ROAMING_CREATURE_INFO( const ROAMING_CREATURE_RESPAWN_INFO & info )
: ROAMING_CREATURE_RESPAWN_INFO( info )
, m_pCreature( NULL )
, m_nNextRespawnTime( 0 )
{}
StructCreature * m_pCreature;
AR_TIME m_nNextRespawnTime;
};
struct PENDING_HATE_SHARE_INFO
{
PENDING_HATE_SHARE_INFO( const AR_HANDLE hRequester, const AR_HANDLE hHateTarget, const int nHate )
: m_hRequester( hRequester )
, m_hHateTarget( hHateTarget )
, m_nHate( nHate )
{}
AR_HANDLE m_hRequester;
AR_HANDLE m_hHateTarget;
int m_nHate;
};
public:
StructRoamer( const int nID, const ROAMING_TYPE eRoamingType, const int nMoveSpeed, const HATE_TYPE eHateType, const AR_TIME nRespawnInterval, const int nAttributeFlag, const bool bIsRaidDungeonRoamer );
~StructRoamer();
virtual bool ProcDelete() { delete this; return true; }
virtual bool IsRoamer() const { return true; }
const int GetRoamingID() { return m_nID; }
void AddCreatureRespawnInfo( const GameContent::ROAMING_CREATURE_RESPAWN_INFO & info );
const size_t GetCreatureRespawnInfoCount() { return m_vRoamingCreatureRespawnInfo.size(); }
void AddRoamingPoint( const ArPosition & pos );
const size_t GetRoamingPointCount() { return m_vRoamingPoint.size(); }
void DeleteRespawnedCreature();
const bool Init();
const bool DeInit( const bool bForceToDeleteEverlastingRoamer );
const bool IsInitialized() { return GetPriority() == UPDATE_PRIORITY_HIGH; }
virtual void onProcess( int nThreadIdx );
virtual void onMonsterDelete( struct StructMonster * pMonster );
virtual void onNPCDead( struct StructNPC * pNPC );
virtual bool IsMovable();
const bool IsRaidDungeonRoamer() const { return m_bIsRaidDungeonRoamer; }
const bool IsPaused() { return m_eRoamingStatus == ROAMING_STATUS_PAUSED; }
void PauseRoaming();
const ArPosition GetCurrentRoamingTargetPosition();
const ArPosition GetNextRoamingTargetPosition();
void PendHateShare( const AR_HANDLE hRequester, const AR_HANDLE hHateTarget, const int nHate, const int eApplyHateType = HATE_TYPE_FULL_SHARE );
protected:
const bool isMovable();
void processWalk( AR_TIME t );
void processRoaming( AR_TIME t, const ArPosition & currentPos, const float & fFace );
void processHateSharing();
const size_t getNextRoamingTargetIndex() const;
void proceedRoamingTargetIndex();
static const ArPosition getCurrentRespawnObjectPosition( const ArPosition & currentPos, const float & fFace, const int & nAngle, const AR_UNIT & nDistance );
private:
const int m_nID;
const int m_nMoveSpeed;
ROAMING_TYPE m_eRoamingType;
HATE_TYPE m_eHateType;
AR_TIME m_nRespawnInterval; // 그룹 로밍 전체 리젠 처리 지연 시간(0일 경우 개별 리젠 처리 적용)
enum _ATTRIBUTE_FLAG_IDX
{
ATTRIBUTE_HEAL_HP_ON_COMEBACKHOME = 1, // 전투 종료 후 원위치로 돌아갔을 때 HP를 최대치로 회복시킬 것인지 여부
};
XFlag< int, 1 > m_AttributeFlag; // 특성 플래그
ROAMING_DIRECTION m_eCurrentRoamingDirection;
size_t m_nCurrentRoamingPointIndex;
ROAMING_STATUS m_eRoamingStatus;
const bool m_bIsRaidDungeonRoamer; // DeInit되어도 삭제되지 않아야 하는 로망 그룹 데이터 여부(레이드 던전 내부 등)
// 이하 3개의 멤버를 보호(m_CS -> 지역 락 순서여야 함)
XCriticalSection m_CS;
std::vector< ArPosition > m_vRoamingPoint;
std::vector< ROAMING_CREATURE_INFO > m_vRoamingCreatureRespawnInfo;
AR_TIME m_nNextRespawnProcTime;
int m_nLastRegenCount; // 그룹 단체 리젠일 경우 마지막 리젠 시간 카운팅하기 위한 변수
// m_vPendingHateInfo를 보호(지역 락 -> m_csHate 순서여야 함)
XCriticalSection m_csHate;
std::vector< PENDING_HATE_SHARE_INFO * > m_vPendingHateInfo;
};