Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
|
||||
#ifndef _CMONSTER_H_
|
||||
#define _CMONSTER_H_
|
||||
|
||||
#include <Creature/Character/Character.h>
|
||||
#include <Creature/Monster/FSM/FSM.h>
|
||||
|
||||
#include <Map/FieldMap/Cell.h>
|
||||
#include <Skill/Spell/SpellKind.h>
|
||||
#include <GameEvent/GameEventMgr.h>
|
||||
#include <Community/Party/Party.h>
|
||||
|
||||
#include "MonsterMgr.h"
|
||||
|
||||
|
||||
const unsigned long LongRange = 45; // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѿư<D1BE><C6B0><EFBFBD> <20>Ÿ<EFBFBD>.
|
||||
const unsigned long OutsideSearchRange = 10; // <20><><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD><EFBFBD><EFBFBD> <20>þ<EFBFBD>
|
||||
const unsigned long ReturnRange = 20; // <20><><EFBFBD><EFBFBD>
|
||||
const unsigned long MoveRange = 15; // <20><><EFBFBD><EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>̵<EFBFBD><CCB5>Ÿ<EFBFBD>.
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CStatue;
|
||||
|
||||
class CMonster : public CAggresiveCreature
|
||||
{
|
||||
public:
|
||||
|
||||
enum MovingPattern { AREA = 0, FIXED, ROUTE, NONAREA };
|
||||
|
||||
enum _Const
|
||||
{
|
||||
MONSTER_SEARCH_RANGE = 8,
|
||||
BOSS_SEARCH_RANGE = 15,
|
||||
NAMED_SEARCH_RANGE = 15,
|
||||
CHIEF_SEARCH_RANGE = 15,
|
||||
MAGE_SEARCH_RANGE = 18,
|
||||
ACOLYTE_SEARCH_RANGE = 18,
|
||||
GUARD_SEARCH_RANGE = 15,
|
||||
|
||||
GOLD_INC_LEVEL_LIMIT = 20,
|
||||
|
||||
RUN_ANI_LIMIT_MAX = 3,
|
||||
RUN_ANI_LIMIT_MIN = 1,
|
||||
|
||||
RATE_MOVING_AND_PLAYER = 10,
|
||||
|
||||
MAX_MONSTER_UID = 0xFFFF - 0x8000 - 0x4000,
|
||||
|
||||
MONSTER_PARTY_BIT = 0x80000000
|
||||
};
|
||||
|
||||
struct MonsterCreateInfo; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü
|
||||
typedef MonsterCreateInfo *LPMonsterCreateInfo;
|
||||
|
||||
CMonster();
|
||||
CMonster(MonsterCreateInfo& MonsterCreate, bool bAdminCmdSummon = false);
|
||||
virtual ~CMonster();
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool InitMonster(Position& Pos, bool bDead = false);
|
||||
|
||||
virtual bool GetMotion(unsigned long MotionID, MotionInfo& Motion); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ൿ <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool CheckPartyTarget(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> Ÿ<><C5B8><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4>?
|
||||
virtual void SearchPlayer(void); // <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20>˻<EFBFBD>
|
||||
|
||||
bool IsOverlap(void); // <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><>ġ<EFBFBD>°<EFBFBD> <20>˻<EFBFBD>
|
||||
|
||||
bool Process(void); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ൿ ó<><C3B3> - <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> UpdateBehaviorȣ<72><C8A3>
|
||||
|
||||
void UpdateBehavior(unsigned long dwTick); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ൿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
|
||||
virtual void NormalBehavior(unsigned long dwTick); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
virtual void AttackBehavior(unsigned long dwTick); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
virtual void ReturnBehavior(unsigned long dwTick); // <20><>ȯ <20><><EFBFBD><EFBFBD>
|
||||
virtual void EscapeBehavior(void); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
virtual void DeadBehavior(unsigned long dwTick); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
// Action <20><><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
void AttackAction();
|
||||
void WalkAttackAction(float fVelocity=0.1f);
|
||||
void RunAction(float fDistance, float fDstX, float fDstZ);
|
||||
bool IsReturn();
|
||||
|
||||
inline Position CalculateCoor(void); // <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ <20><><EFBFBD><EFBFBD>
|
||||
|
||||
virtual const int CalculateFixLevelGap(CAggresiveCreature *pDefender);
|
||||
|
||||
virtual bool Attack(AtType attackType, unsigned char cDefenderNum,
|
||||
CAggresiveCreature** ppDefenders, unsigned char* cDefenderJudges, unsigned short* wDefenderMPHeal);
|
||||
|
||||
inline virtual void Attacked(void); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool MultiAttack(void); // Ÿ<><C5B8><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> Attack<63>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3>)
|
||||
void CancelTarget(bool bSaveThreat = false); // Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
virtual bool Dead(CAggresiveCreature* pOffencer); // <20><EFBFBD><D7BE><EFBFBD> <20><> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD>
|
||||
virtual EnemyCheck::EnemyType IsEnemy(CCreature* lpTarget, unsigned char* cResult = NULL);
|
||||
|
||||
virtual void Respawn(unsigned long dwTick);
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
|
||||
void SetPID(unsigned long dwPID) { m_dwPID = dwPID; }
|
||||
unsigned long GetPID(void) { return m_dwPID; }
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>
|
||||
|
||||
virtual LONG SendMove(unsigned short nAniNum);
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// <20><>Ÿ <20>Լ<EFBFBD>
|
||||
|
||||
virtual Item::CItem* SellToCharacter(CCharacter *lpCustomer, unsigned short wKindItem, TakeType takeType,
|
||||
Item::CItem* lpRequestItem, unsigned long &dwPrice, unsigned short wCouponID, unsigned short &usError) { return NULL; }
|
||||
|
||||
bool HasSkill(void); // <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
|
||||
int GetUseSkillNum(void); // <20><EFBFBD><EEB0A1><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>?
|
||||
|
||||
inline unsigned char GetOptionBaseNum(Item::EquipType::OptionType eType);
|
||||
|
||||
unsigned long GetDropRate(unsigned char nIndex);
|
||||
unsigned long GetAwardItem(int nIndex) { return m_MonsterInfo.m_aryAwardItem[nIndex]; }
|
||||
|
||||
inline CStatue* DowncastToStatue(void);
|
||||
|
||||
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸù<CFB7>ȣ <20><><EFBFBD><EFBFBD>
|
||||
int GetSerialNumber(void) { return ((m_dwCID - Creature::MONSTER_BIT) >> 16); }
|
||||
unsigned short GetKID(void) { return static_cast<unsigned short>(m_MonsterInfo.m_dwKID); }
|
||||
|
||||
unsigned char GetPattern(void) { return m_MonsterInfo.m_cSkillPattern; }
|
||||
int GetCurrentState(void) { return m_nCurrentState; }
|
||||
short GetAttackRange(void) { return m_MonsterInfo.m_wAttackRange; }
|
||||
|
||||
bool IsDeadSummonMonster(void);
|
||||
virtual void SetGuard(bool bGuard) { return; }
|
||||
|
||||
virtual unsigned short ApplyDamage(AtType attackType, CAggresiveCreature* pOffencer, unsigned char &cOffencerJudge,
|
||||
unsigned char &cDefenserJudge, unsigned short& wOffencerMPHeal, unsigned short& wDefenserMPHeal, unsigned short &wError);
|
||||
|
||||
virtual void GuardMe(CAggresiveCreature* lpTarget, unsigned short wThreat) { return; }
|
||||
virtual void AttackCmd(CAggresiveCreature* lpTarget, unsigned short wThreat) { return; }
|
||||
|
||||
virtual bool IsPeaceMode(void) { return false; }
|
||||
virtual bool IsRideArms(void) const { return false; }
|
||||
virtual unsigned char GetNation() const { return m_MonsterInfo.m_cNation; }
|
||||
|
||||
virtual unsigned char GetRealmPoint() { return 0; }
|
||||
|
||||
static void LogMonsterMoveCount(void);
|
||||
|
||||
Broadcast2nd::CSerializeMonsterData& GetSerializeData() { return m_SerializeMonsterData; }
|
||||
|
||||
protected:
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
enum _Timing
|
||||
{
|
||||
FPS = 30
|
||||
};
|
||||
|
||||
MonsterInfo m_MonsterInfo;
|
||||
Position m_OriginalPosition; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><>ġ
|
||||
unsigned long m_dwLastBehaviorTick; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ൿ<EFBFBD><E0B5BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tick
|
||||
|
||||
Broadcast2nd::CSerializeMonsterData m_SerializeMonsterData;
|
||||
|
||||
CAggresiveCreature* m_lpTarget; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>
|
||||
|
||||
long m_lCurrentFrame; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Frame<6D><65> <20><>Ÿ<EFBFBD><C5B8>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
int m_nNormalMovingDelay; // <20>븻 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> Ÿ<>̹<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
int m_nLeaveMovingNum; // <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><>
|
||||
int m_nMovingPattern; // <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>, <20>ٹ<EFBFBD><D9B9><EFBFBD>, <20><>Ʈ, <20><EFBFBD>)
|
||||
int m_nCurrentState; // <20><><EFBFBD><EFBFBD> State
|
||||
|
||||
unsigned short m_wSearchRange; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>þ<EFBFBD>
|
||||
unsigned short m_wDefaultSearchRange; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⺻ <20>þ<EFBFBD>
|
||||
|
||||
bool m_bLongRangeAttacked; // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>? (<28><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>þ߸<C3BE> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> ã<><C3A3>)
|
||||
bool m_bScout; // <20><>ī<EFBFBD><C4AB><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
|
||||
bool m_bAttacking; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ΰ<EFBFBD>?
|
||||
|
||||
unsigned short m_wRespawnArea; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
bool m_bAvoid; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ΰ<EFBFBD>? (<28><><EFBFBD>ϱ<EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
bool m_bAdminCmdSummon; // Admin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
|
||||
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD> PID
|
||||
unsigned long m_dwPID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD>̵<EFBFBD>
|
||||
|
||||
static LONG ms_NormalBehaviorSendCount;
|
||||
static LONG ms_AttackBehaviorSendCount;
|
||||
static LONG ms_ReturnBehaviorSendCount;
|
||||
static LONG ms_EscapeBehaviorSendCount;
|
||||
static LONG ms_DeadBehaviorSendCount;
|
||||
};
|
||||
|
||||
|
||||
struct CMonster::MonsterCreateInfo
|
||||
{
|
||||
Position m_Pos;
|
||||
|
||||
unsigned long m_dwCID;
|
||||
unsigned long m_dwPID;
|
||||
|
||||
int m_nKID;
|
||||
int m_nMovingPattern;
|
||||
|
||||
bool m_bScout;
|
||||
unsigned short m_wRespawnArea;
|
||||
|
||||
MonsterCreateInfo()
|
||||
: m_dwCID(0), m_nKID(0), m_dwPID(0), m_bScout(false), m_nMovingPattern(0), m_wRespawnArea(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Position CMonster::CalculateCoor(void)
|
||||
{
|
||||
float fVel = (true == GetEnchantInfo().GetFlag(Skill::SpellID::Slow)) ?
|
||||
m_MotionInfo.m_fVelocity / 4 : m_MotionInfo.m_fVelocity;
|
||||
|
||||
return Position(m_CurrentPos.m_fPointX + fVel * cosf(m_MotionInfo.m_fDirection),
|
||||
m_CurrentPos.m_fPointY, m_CurrentPos.m_fPointZ + fVel * sinf(m_MotionInfo.m_fDirection));
|
||||
}
|
||||
|
||||
void CMonster::Attacked(void)
|
||||
{
|
||||
m_bLongRangeAttacked = true;
|
||||
if (m_nCurrentState == STATE_ID_NORMAL || m_nCurrentState == STATE_ID_RETURN)
|
||||
{
|
||||
m_lCurrentFrame = 0;
|
||||
}
|
||||
|
||||
m_nCurrentState = CFSM::GetInstance().StateTransition(m_nCurrentState, INPUT_ID_ATTACKED_PLAYER);
|
||||
}
|
||||
|
||||
unsigned char CMonster::GetOptionBaseNum(Item::EquipType::OptionType eType)
|
||||
{
|
||||
switch (eType)
|
||||
{
|
||||
case Item::EquipType::STANDARD_OPTION: return m_MonsterInfo.m_cStandardBaseNum;
|
||||
case Item::EquipType::OVER_OPTION: return m_MonsterInfo.m_cOverBaseNum;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
CStatue* CMonster::DowncastToStatue(void)
|
||||
{
|
||||
if (0 != this &&
|
||||
MonsterInfo::MIN_STATUE_KID <= m_MonsterInfo.m_dwKID &&
|
||||
MonsterInfo::MAX_STATUE_KID >= m_MonsterInfo.m_dwKID)
|
||||
{
|
||||
return reinterpret_cast<CStatue *>(this);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user