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>
416 lines
12 KiB
C++
416 lines
12 KiB
C++
// Creature.h: interface for the CCreature class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_CREATURE_H__0C16A3E3_6308_4E72_AFF8_1CFE85324B6D__INCLUDED_)
|
|
#define AFX_CREATURE_H__0C16A3E3_6308_4E72_AFF8_1CFE85324B6D__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "Z3DGeneralChrModel.h"
|
|
#include "List.h"
|
|
#include "SceneManager.h"
|
|
|
|
using namespace std;
|
|
|
|
|
|
const unsigned long CA_WAIT = 0;
|
|
const unsigned long CA_RUN = 1;
|
|
const unsigned long CA_ATTACK = 2;
|
|
const unsigned long CA_MOVEATTACK = 3;
|
|
const unsigned long CA_WALKBACK = 4;
|
|
const unsigned long CA_WALKLEFT = 5;
|
|
const unsigned long CA_WALKRIGHT = 6;
|
|
const unsigned long CA_BASH = 7;
|
|
const unsigned long CA_WALK = 8;
|
|
const unsigned long CA_FALLDOWN = 9;
|
|
const unsigned long CA_REST = 10;
|
|
const unsigned long CA_SITDOWN = 11;
|
|
const unsigned long CA_STANDUP = 12;
|
|
const unsigned long CA_ATTACKADVANCE = 13;
|
|
const unsigned long CA_ATTACKLEFT = 14;
|
|
const unsigned long CA_ATTACKRIGHT = 15;
|
|
const unsigned long CA_ATTACKRETREAT = 16;
|
|
const unsigned long CA_ATTACK2 = 17;
|
|
const unsigned long CA_ATTACK3 = 18;
|
|
const unsigned long CA_ATTACK4 = 19;
|
|
const unsigned long CA_RESPAWN = 20;
|
|
const unsigned long CA_JUMP = 21;
|
|
const unsigned long CA_LEFTDASH = 22;
|
|
const unsigned long CA_RIGHTDASH = 23;
|
|
const unsigned long CA_CASTING = 24;
|
|
const unsigned long CA_FIRE1 = 25;
|
|
const unsigned long CA_FIRE2 = 26;
|
|
const unsigned long CA_COMBINATIONBLOW = 27;
|
|
const unsigned long CA_BACKSTAB = 28;
|
|
const unsigned long CA_AIMEDSHOT2 = 29;
|
|
const unsigned long CA_ATTACK5 = 30;
|
|
const unsigned long CA_ATTACK6 = 31;
|
|
const unsigned long CA_BACKDASH = 32;
|
|
const unsigned long CA_AIMEDSHOT1 = 33;
|
|
const unsigned long CA_JUMPATTACK = 34;
|
|
const unsigned long CA_JUMPATTACK2 = 35;
|
|
const unsigned long CA_FRONTDASH = 36;
|
|
const unsigned long CA_LAND = 37;
|
|
const unsigned long CA_FORWARDJUMP = 38;
|
|
const unsigned long CA_BACKJUMP = 40;
|
|
const unsigned long CA_SHOT = 41;
|
|
const unsigned long CA_JUMPSHOT = 42;
|
|
const unsigned long CA_OVERBASH1 = 43;
|
|
const unsigned long CA_OVERBASH2 = 44;
|
|
const unsigned long CA_OVERBASH3 = 45;
|
|
const unsigned long CA_OVERBASH4 = 46;
|
|
const unsigned long CA_OVERBASH5 = 47;
|
|
const unsigned long CA_POWERDRAIN = 48;
|
|
const unsigned long CA_TURNPUNCH1 = 49;
|
|
const unsigned long CA_TURNPUNCH2 = 50;
|
|
const unsigned long CA_TURNPUNCH3 = 51;
|
|
const unsigned long CA_JUMPATTACK3 = 52;
|
|
const unsigned long CA_AIMEDSHOT3 = 53;
|
|
const unsigned long CA_STUN = 54;
|
|
const unsigned long CA_ROUNDSWING = 55;
|
|
const unsigned long CA_SWIM = 100;
|
|
|
|
const float RUN_INTERVAL = 255.0f;
|
|
|
|
const long PACKET_LIFETIME = 10000;
|
|
|
|
typedef struct ChrActionNode
|
|
{
|
|
unsigned long m_dwLowerChrAction;
|
|
unsigned long m_dwUpperChrAction;
|
|
float m_fDirection;
|
|
vector3 m_vecNextPosition;
|
|
float m_fVec;
|
|
unsigned short m_wAniNum;
|
|
unsigned short m_wAniNumCount;
|
|
unsigned long m_dwFrame;
|
|
} ChrActionNode;
|
|
|
|
typedef struct stDamage
|
|
{
|
|
short sLifeTime;
|
|
long lValue;
|
|
unsigned short wMode;
|
|
float fScale;
|
|
} stDamage;
|
|
|
|
class CCreature
|
|
{
|
|
public:
|
|
int GetChrTitle( int nClass, int nMerits );
|
|
void SetChantEffect(unsigned long dwChant, BOOL bToggle, BOOL bSelf);
|
|
void SetChantEffect(unsigned long dwChant, BOOL bSelf);
|
|
BOOL GetSkillMotion(void);
|
|
class CCreatureArrow {
|
|
public:
|
|
CEffScript *m_ArrowEsf;
|
|
char m_PivotName[256];
|
|
CCreatureArrow() {
|
|
m_ArrowEsf = NULL;
|
|
memset(m_PivotName,0,sizeof(char) * 256);
|
|
}
|
|
~CCreatureArrow() {
|
|
if(m_ArrowEsf != NULL) {
|
|
if(!CSceneManager::m_EffectManager.CheckNullScript(m_ArrowEsf)) {
|
|
CSceneManager::m_EffectManager.DeleteEndScript(m_ArrowEsf);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
class CCreatureEffect { //creature 몸에 붙는 effect class
|
|
public:
|
|
CEffScript *m_Effect; // esf
|
|
bool m_bPivotRot;
|
|
int m_PivotIndex;
|
|
char m_PivotName[50];
|
|
char m_EffName[50];
|
|
bool m_EffValue;
|
|
unsigned long m_EffId;
|
|
|
|
D3DXVECTOR3 m_EffPos;
|
|
|
|
CCreatureEffect() {
|
|
m_Effect = NULL;
|
|
m_bPivotRot = false;
|
|
m_PivotIndex= -1;
|
|
memset(m_PivotName,0,sizeof(char) * 50);
|
|
memset(m_EffName,0,sizeof(char) * 50);
|
|
m_EffValue = false;
|
|
m_EffPos.x = m_EffPos.y = m_EffPos.z = 0.0f;
|
|
m_EffId = 0;
|
|
|
|
}
|
|
~CCreatureEffect() {
|
|
if(m_Effect != NULL) {
|
|
|
|
if(!CSceneManager::m_EffectManager.CheckNullScript(m_Effect)) {
|
|
m_Effect->SetAllLoopOff();
|
|
m_Effect->SetVisibility(false);
|
|
//CSceneManager::m_EffectManager.DeleteEndScript(m_Effect);
|
|
m_Effect = NULL;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
class CWeaponEffect { //Weapon에 붙는 effect
|
|
|
|
public:
|
|
int m_nWeaponEffectNum; //effect의 갯수
|
|
int m_nWeaponPosNum; //effect의 갯수중에 현 effect 노드의 위치
|
|
|
|
char m_strEffect[50];
|
|
CEffScript *m_pEffect;
|
|
|
|
CWeaponEffect()
|
|
{
|
|
m_nWeaponEffectNum = 0;
|
|
m_nWeaponPosNum = 0;
|
|
|
|
memset(m_strEffect,sizeof(int),50);
|
|
m_pEffect = NULL;
|
|
}
|
|
~CWeaponEffect()
|
|
{
|
|
if(m_pEffect != NULL) {
|
|
if(!CSceneManager::m_EffectManager.CheckNullScript(m_pEffect)) {
|
|
//CSceneManager::m_EffectManager.DeleteEndScript(m_pEffect);
|
|
m_pEffect->SetAllLoopOff();
|
|
m_pEffect->SetVisibility(false);
|
|
|
|
m_pEffect = NULL;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
class CWeaponLine { // Weapon Line Setting Class
|
|
public:
|
|
LPDIRECT3DTEXTURE8 m_lpLineTexture; // Texture
|
|
int m_iColor[3]; // Color
|
|
int m_iBlend; // Blend Mode
|
|
|
|
CWeaponLine() {
|
|
m_lpLineTexture = NULL;
|
|
m_iColor[0] = m_iColor[1] = m_iColor[2] = 255;
|
|
m_iBlend = 0;
|
|
}
|
|
~CWeaponLine() {
|
|
if(m_lpLineTexture != NULL) {
|
|
m_lpLineTexture->Release();
|
|
m_lpLineTexture = NULL;
|
|
}
|
|
|
|
}
|
|
};
|
|
BOOL Casting(unsigned long dwUpperAni = 0xFFFFFFFF, unsigned long dwLowerAni = 0xFFFFFFFF);
|
|
void CancelSkill(void);
|
|
void InitWeapon(unsigned long dwEquip);
|
|
DWORD m_dwLastUpdateActionTimer;
|
|
/* char m_strWeaponType[256];
|
|
static void LoadMotionSheet(char *strFilename);
|
|
static char m_strWeaponMotionSheet[MAX_WEAPONTABLE][256];
|
|
static char m_strWeapon[MAX_WEAPONTABLE][256];*/
|
|
float m_fScale;
|
|
void EndSkill(char *strMotion);
|
|
void BeginCast(char *strMotion);
|
|
BOOL Dash(int nDir);
|
|
BOOL Jump();
|
|
void SkillAttack(unsigned long dwUpperAni, unsigned int dwLowerAni);
|
|
void SetShape(char strShape[15][256]);
|
|
void Respawn(void);
|
|
void InitChrAction(void);
|
|
BOOL IsCancelAction(unsigned long dwPart);
|
|
void SetMotionString(unsigned long *dwAction, char *strAction);
|
|
void SetMotionString(unsigned long dwAction, char *strAction);
|
|
BOOL Attack(unsigned long dwUpperAni = 0xFFFFFFFF, unsigned long dwLowerAni = 0xFFFFFFFF);
|
|
void Dead(void);
|
|
void Wait(void);
|
|
BOOL SetAction(char *strUpperAction, char *strLowerAction);
|
|
BOOL SetAction(unsigned long dwUpperAni, unsigned long dwLowerAni);
|
|
void CrouchAndStandup(void);
|
|
void WalkBack(void);
|
|
void WalkRight(void);
|
|
void WalkLeft(void);
|
|
void Run(float fRunFactor);
|
|
CZ3DGeneralChrModel *m_lpChrModel;
|
|
char m_strGCMDSName[MAX_PATH];
|
|
char m_strFaceType[MAX_PATH];
|
|
char m_strHairStyle[MAX_PATH];
|
|
unsigned short m_wShape[15];
|
|
char m_strShape[15][256]; // 나중에 제거할 변수
|
|
|
|
unsigned char m_cSex;
|
|
unsigned char m_cNation;
|
|
unsigned char m_cLevel;
|
|
unsigned short m_wClass;
|
|
unsigned long m_dwPartyID;
|
|
unsigned long m_dwWeaponPos;
|
|
short m_sDamage;
|
|
long m_sCurrHP;
|
|
long m_sCurrMP;
|
|
unsigned short m_wMaxHP;
|
|
unsigned short m_wMaxMP;
|
|
float m_fDeadTimer;
|
|
unsigned long m_dwAttackCombo;
|
|
unsigned long m_dwSkillComboCount;
|
|
BOOL m_bSkillCombo;
|
|
vector3 m_vecPos;
|
|
float m_fDirection;
|
|
unsigned long m_dwChrID;
|
|
float m_fSelfChrLens;
|
|
int m_ChrNodeID;
|
|
float m_fRunFactor;
|
|
char m_strName[MAX_PATH];
|
|
BOOL m_bSitMode;
|
|
BOOL m_bUsed;
|
|
BOOL m_bFlying;
|
|
BOOL m_bFlyFirstCheck;
|
|
BOOL m_bStillCasting;
|
|
BOOL m_bNoneComboAttackMode;
|
|
BOOL m_bFirstPositionSend;
|
|
vector3 m_vecJumpAttackVector;
|
|
unsigned long m_dwChant;
|
|
char m_strStreetStallName[32];
|
|
bool m_bPeaceMode;
|
|
|
|
unsigned long m_dwSpendTime[6];
|
|
|
|
ChrActionNode m_ChrAction;
|
|
|
|
float m_fFixAngle;
|
|
|
|
List<ChrActionNode> m_lstActionData;
|
|
List<stDamage> m_lstDamageNumber;
|
|
char m_strChatMessage[MAX_PATH];
|
|
float m_fChatTimer;
|
|
|
|
BOOL m_bCharDead;
|
|
|
|
BOOL m_bUpperAble;
|
|
BOOL m_bLowerAble;
|
|
unsigned long m_dwLowerChrAction;
|
|
unsigned long m_dwUpperChrAction;
|
|
BOOL m_bUpperAnimating;
|
|
BOOL m_bLowerAnimating;
|
|
|
|
//arrow
|
|
vector<CCreatureArrow *> m_Arrow;
|
|
bool m_bArrowExist;
|
|
//body effect
|
|
vector<CCreatureEffect *> m_BodyEffect;
|
|
bool m_bBodyEffect;
|
|
//Weapon effect
|
|
vector<CWeaponEffect *> m_WeaponEffect;
|
|
bool m_bWeaponEffect;
|
|
|
|
// slide character 관련
|
|
CEffScript::CEffExt6 m_SlideValue;
|
|
bool m_bSlide;
|
|
|
|
CWeaponLine *m_pWeaponLine;
|
|
bool m_bWeaponLine;
|
|
|
|
DWORD m_dwTargetId; // Target Id (몬스터 이팩트 관련 처리)
|
|
|
|
|
|
void SetSlideValue(CEffScript::CEffExt6 );
|
|
void PlaySlide();
|
|
void RenderSlide(float bx,float by,float bz,float nx,float ny,float nz,float unitsize);
|
|
//
|
|
CCreature();
|
|
virtual ~CCreature();
|
|
|
|
void ArrowUpdate();
|
|
void ArrowUpdate(int );
|
|
void AddArrow(char *pivot_name,D3DXQUATERNION rot,int div = 0);
|
|
void DeleteArrow(int );
|
|
// WeaponLine
|
|
void SetWeaponLine(LPDIRECT3DTEXTURE8 lpTexture,int iColor[3],int iBlend);
|
|
void DeleteWeaponLine();
|
|
void WeaponLineUpdate();
|
|
|
|
///////////body effect///////////
|
|
// 캐릭 pos 에 effect 붙일경우
|
|
void AddBodyEffect(char *esfname,unsigned long effid = 0,bool mine = true,bool bVisibility = true);
|
|
// pivot 중에 렌덤 하게 num 갯수 만큼 effect 붙임 (num 값이 -1이면 전 pivot 에 다 붙임)
|
|
void AddBodyEffect(char *file = NULL,bool rot = false,unsigned long effid = 0,int num = -1);
|
|
// pivot 하나에 effect 붙임
|
|
void AddBodyEffect(char *file = NULL,char *pivot = NULL,bool rot = false,unsigned long effid = 0);
|
|
void AddBodyEffect(char *file = NULL,int pivotindex = -1,bool rot = false,unsigned long effid = 0);
|
|
//현재 body effect list안에 이 이팩트가 존재 하는지 검사
|
|
bool CheckInBodyEffect(char *file);
|
|
|
|
void RenderSnap(float bx,float by,float bz,float nx,float ny,float nz,float unitsize,char *effname);
|
|
|
|
|
|
void DeleteBodyEffect(); // 전 effect delete
|
|
void DeleteBodyEffect(char *pivot); // 한 pivot에 붙은 effect delete
|
|
void DeleteBodyEffectName(char *effectname); //effect script 이름에 따라 delete
|
|
void DeleteBodyEffect(unsigned long id); //effect id로 delete
|
|
|
|
void BodyEffectUpdate(int index);
|
|
void BodyEffectUpdate();
|
|
void SetEffect(); // monster 관련 GCMDS에서 effect 불러 붙이는 코드
|
|
|
|
//////////Weapon Effect////////
|
|
|
|
void AddWeaponEffect(char *esfname,int effectnum);
|
|
|
|
void DeleteWeaponEffect(); //전 weapon effect delete
|
|
void DeleteWeaponEffect(char *esfname,int iEffNum); //esfname을 가지는 effect delete
|
|
|
|
void WeaponEffectUpdate();
|
|
|
|
////////////////////////////////
|
|
// Visibility 관련 //
|
|
////////////////////////////////
|
|
void SetEffectVisibility(bool vis);
|
|
|
|
|
|
void SetPosition(float fPosX, float fPosY, float fPosZ)
|
|
{
|
|
m_vecPos.x = fPosX; m_vecPos.y = fPosY; m_vecPos.z = fPosZ;
|
|
if(m_lpChrModel)
|
|
m_lpChrModel->SetPosition(m_vecPos.x, m_vecPos.y, m_vecPos.z);
|
|
}
|
|
void SetPosition(vector3 &vecPos)
|
|
{
|
|
m_vecPos = vecPos;
|
|
if(m_lpChrModel)
|
|
m_lpChrModel->SetPosition(m_vecPos.x, m_vecPos.y, m_vecPos.z);
|
|
}
|
|
vector3 *GetPosition(void)
|
|
{
|
|
if(m_lpChrModel)
|
|
m_lpChrModel->GetPosition(m_vecPos);
|
|
return &m_vecPos;
|
|
}
|
|
void SetDirection(float fDirection)
|
|
{
|
|
m_fDirection=fDirection;
|
|
if(m_lpChrModel)
|
|
m_lpChrModel->SetDirection(fDirection);
|
|
}
|
|
float GetDirection(void)
|
|
{
|
|
if(m_lpChrModel)
|
|
m_fDirection=m_lpChrModel->GetDirection();
|
|
return m_fDirection;
|
|
}
|
|
void SetAlphaLevel(float fAlphaFactor) { m_lpChrModel->SetAlphaLevel(fAlphaFactor); }
|
|
BOOL GetChantFlag(unsigned long dwChantKind)
|
|
{
|
|
if(0 < dwChantKind && dwChantKind < 33)
|
|
{
|
|
if(m_dwChant & (0x00000001 << (dwChantKind - 1))) return TRUE; else return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
};
|
|
|
|
#endif // !defined(AFX_CREATURE_H__0C16A3E3_6308_4E72_AFF8_1CFE85324B6D__INCLUDED_)
|