Files
Sun1602/Server/Common/RegenParser.h
T
2022-10-26 12:25:11 +08:00

86 lines
2.4 KiB
C++

#pragma once
#include <SolarHashTable.h>
#include <Singleton.h>
#include <ProgramCommon/wzdatatype.h>
#include "ServerCommonDef.h"
#include <SolarFileReader.h>
#define MAX_REGEN_DESC_LEN 32
#define MAX_GROUP_NUM 3
#define MAX_REGEN_MONSTER_KIND 7
struct REGEN_INFO
{
DWORD dwNum; // 번호
MAPCODE MapCode; // 맵코드
DWORD dwFieldIndex; // 필드 인덱스
DWORD dwLocationID; // 영역 ID
WORD wMonsterType; // 몬스터 타입
BOOL bAllRegen; // 모두 리젠
BYTE byMoveAttitude; // 이동 성향(패트롤, 스폰 정지형, 완전 정지형...)
DWORD dwRegenTime; // 리젠 시간
float fRegenRate; // 리젠 확률
WORD wGroupID[MAX_GROUP_NUM]; // 그룹 ID
DWORD dwMonCode[MAX_REGEN_MONSTER_KIND]; // 몬스터 코드
DWORD dwMaxNum[MAX_REGEN_MONSTER_KIND]; // 최대 몬스터수
BOOL bPosType; // 위치 출력 형식 : 0=바운드박스방식, 1=x,y,z 방식
WzVector pvPos; // 위치
BYTE bDistance; // 거리
BYTE bPattern; // 리젠 패턴
char szDesc[MAX_REGEN_DESC_LEN+1]; // 설명
};
//DWORD64 키가 불필요
typedef STLX_HASH_MAP<DWORD, REGEN_INFO*> REGENINFO_HASH;
typedef REGENINFO_HASH::iterator REGENINFO_HASH_ITR;
class RegenParser : public util::Singleton<RegenParser>, public IParser
{
public:
RegenParser();
~RegenParser();
VOID Init( DWORD dwPoolSize );
VOID Release();
VOID Reload();
inline REGENINFO_HASH_ITR BeginRegen() { return m_RegenHashTable.begin(); }
inline REGENINFO_HASH_ITR EndRegen() { return m_RegenHashTable.end(); }
template<typename _FN, typename _OBJ>
VOID ForeachRegen( _FN _func, _OBJ& _left )
{ for_each( m_RegenHashTable.begin(), m_RegenHashTable.end(), bind1st(mem_fun(_func), _left) ); }
VOID Unload();
virtual BOOL LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload );
BOOL _LoadPos( BOOL bReload );
BOOL _LoadRegen( BOOL bReload );
private:
BOOL CheckValidity( REGEN_INFO* pRegenInfo );
REGENINFO_HASH m_RegenHashTable;
TCHAR m_pszFileName[MAX_PATH];
//////////////////////////////////////////////////////////////////////////
// UNUSED_SECTION
public:
BOOL AddMonster(REGEN_INFO* pInfo, DWORD dwID);
BOOL DelMonster(REGEN_INFO* pInfo, DWORD dwID);
INT GetHashSize() { return (INT)m_RegenHashTable.size(); };
//////////////////////////////////////////////////////////////////////////
};