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

401 lines
13 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <toolkit/XBossWorker.h>
#include "KTypes.h"
#include "SGameAniType.h"
extern const char* c_szNoticeURL ;
extern const char* c_szOldNoticeURL;
extern const DWORD c_dwNoticeMaxSize;
extern const char *pLOGIN_STATE[];
extern const KColor c_colorLobbyFog;
extern const float c_fLobbyFogNear;
extern const float c_fLobbyFogFar;
extern const float c_fAvatarRotateValue;
extern const float c_fAvatarRotateDeltaPerFrame;
extern const char* c_szDefaultAniName ;
extern const char* c_szBGCommonAniName ;
extern const char* c_szBGAsuraAniName ;
extern const char* c_szBGDevaAniName ;
extern const char* c_szSelectStartAniName ;
extern const char* c_szSelectLoopAniName ;
extern const char* c_szSelectEndAniName ;
extern const char* c_szUnselectStartAniName ;
extern const char* c_szUnselectLoopAniName ;
extern const char* c_szUnselectEndAniName ;
extern const char* c_szAvatarEffectStartAniName;
extern const char* c_szAvatarEffectLoopAniName ;
extern const char* c_szAvatarEffectLoop2AniName;
extern const char* c_szAvatarEffectEndAniName ;
extern const char* c_szClanCardStartAniName ;
extern const char* c_szClanCardLoopAniName ;
extern const char* c_szClanCardEndAniName ;
extern struct USER_INFO g_UserInfo;
enum _LOGIN_STATE
{
GAMELOGIN_UNINITIALIZED = 0, ///< 최초 시작
//GAMELOGIN_PREPARE_LOGIN, //로그인 준비
GAMELOGIN_INTRO, ///< 인트로
GAMELOGIN_LOGIN, ///< 로그인 가능
GAMELOGIN_LOGIN_OFF, ///< 로그인 시도 및 결과 대기
GAMELOGIN_PREPARE_SERVERSELECT, ///< 책 넘기기
GAMELOGIN_SERVERSELECT, ///< 서버 선택 대기
GAMELOGIN_SERVERSELECT_ON, ///< 서버 선택 가능
GAMELOGIN_GAMESERVER_LOGIN, ///< 게임 서버에 로긴하기
GAMELOGIN_PREPARE_CHARSELECT, ///< 캐릭터 선택 준비
GAMELOGIN_CHARSELECT_WAIT_TIME, ///< 캐릭터 선택 화면이 나오긴 했으나 잠시 엔터메세지를 받지 않는 쉬는 시간의 화면
GAMELOGIN_BACK_CHARSELECT_TO_GAME, ///< 게임상에서 캐릭선택 로비로 가는 씬으로 서버로 부터 캐릭터 리스르를 받는 대기 화면
GAMELOGIN_CHARSELECT, ///< 캐릭터 선택 가능
// GAMELOGIN_WAITING_CHAREFFECT_FINISH, //
GAMELOGIN_CREATECHAR_RACE_SELECT, // Character Race Selection Screen for Creation
GAMELOGIN_CREATECHAR_RACE_SELECT_BACK, ///< 생성할 캐릭터 종족 선택화면에서 로비로 돌아가기
GAMELOGIN_CREATECHAR_RACE_MOVIE, // Race-specific video on the character creation race selection screen
GAMELOGIN_CREATECHAR_CUSTOMIZING, // Character Customization
GAMELOGIN_CREATECHAR_SUCCESS, // Character creation successful
GAMELOGIN_CREDITS, ///< 크레딧 화면 // sonador 10.5.1 크레딧 화면 구현
GAMELOGIN_CREDITS2, ///< 크레딧 화면 // sonador 10.5.1 크레딧 화면 구현
GAMELOGIN_CREDITS3, /// 2011.12.14 - prodongi
GAMELOGIN_CREDITS4, //gmpbigsun
GAMELOGIN_CREDITSEPIC6PROLOGUE,
GAMELOGIN_BACKTO_CHARSELECT, ///< 캐릭터 선택으로 돌아가기
GAMELOGIN_BACKTO_LOGOUT, ///< 로그아웃 처리.
// GAMELOGIN_PREPARE_CREATECHAR, //캐릭터 만들기 준비
// GAMELOGIN_CREATECHAR, //캐릭터 만들기
// GAMELOGIN_CREATECHAR_SECOND, //캐릭터 만들기 2단계
// GAMELOGIN_DBLCLICK_LOGIN, //더블클릭 로그인
GAMELOGIN_DEVELOPERS_LOGIN, ///< 개발자 로그인
GAMELOGIN_INIT_VALUE, ///< 초기화 값
};
int GetValidNum( int nNum, int nMaxNum );
class SAvatarSelector;
class KSeqModel;
class KSeqAvatarEx;
class SAvatarSelector
{
public:
SAvatarSelector();
virtual ~SAvatarSelector();
K3DMatrix& GetTransform();
void SetTransform( const K3DMatrix& rPos );
static void BeginAvatarLoadingThread();
static void EndAvatarLoadingThread();
bool IsPlaying();
void PendLoading();
bool IsPendLoading() { return m_bIsThreadPending; }
bool Init();
int GetLevel() const { return m_nLevel; }
int GetJobLevel() const { return m_nJobLevel; }
int GetJobID() const { return m_nJobID; }
const char* GetName() const { return m_strName.c_str(); }
int GetRace() const { return m_nRace; }
int GetSex() const { return m_nSex; }
int GetHairIndex() const { return m_nHairIndex; }
int GetFaceIndex() const { return m_nFaceIndex; }
int GetBodyIndex() const { return m_nBodyIndex; }
int GetHandIndex() const { return m_nHandIndex; }
int GetFootIndex() const { return m_nFootIndex; }
int GetDecoIndex() const { return m_nDecoIndex; }
int GetNudeCode( int nIndex ) { assert( nIndex >=0 && nIndex < 5 ); return m_NudeCode[nIndex]; }
void SetNudeCode( int nIndex, ItemBase::ItemCode code ) { assert( nIndex >=0 && nIndex < 5 ); m_NudeCode[nIndex] = code; }
int GetWearCode( int nIndex ) { assert( nIndex >=0 && nIndex < ItemBase::MAX_ITEM_WEAR ); return m_WearCode[nIndex]; }
int GetWearLevel( int nIndex ) { assert( nIndex >=0 && nIndex < ItemBase::MAX_ITEM_WEAR ); return m_nItemLevel[nIndex]; }
void SetWearIndex( int nIndex, ItemBase::ItemCode code, int nItemLevel, ItemBase::ItemCode appearanceCode = 0)
{
assert( nIndex >=0 && nIndex < ItemBase::MAX_ITEM_WEAR );
m_WearCode[nIndex] = (appearanceCode)? appearanceCode : code; // 2012.7.26 Use the transformation code as the item code if a marine transformation code is present
m_nItemLevel[nIndex] = nItemLevel;
}
void SetName( const char* szName ) { m_strName = szName; }
void SetDisplayInfo( int nLevel, int nJobLevel, int nJobID )
{
m_nLevel = nLevel;
m_nJobLevel = nJobLevel;
m_nJobID = nJobID;
}
void SetRace( int nRace )
{
m_nRace = nRace;
}
void SetScale( float Scale ) { m_fScale = Scale; }
void SetSex( int nSex )
{
assert( 0 != nSex );
m_nSex = nSex;
}
// Set hairstyles index
void SetHairIndex( int nHairIndex );
// Set face model index
void SetFaceIndex( int nFaceIndex );
void SetBodyIndex( int nBodyIndex );
void SetHandIndex( int nHandIndex );
void SetFootIndex( int nFootIndex );
// Set face deco index (tatoos)
void SetDecoIndex( int m_nDecoIndex );
int GetHairColorIndex() { return m_nHairColorIndex; }
void SetHairColorIndex(int nIndex);
int GetHairColorRGB() { return m_dwHairColor; }
void SetHairColorRGB(DWORD NewColor) { _oprint("[SetHairColorRGB execution; color is: %u\n", NewColor); m_dwHairColor = NewColor; };
void RefreshAvatar( bool bAniRefresh = true );
void Ani_Default();
void Ani_Attack(int nPlayType = 1);/*KSeqForm::SEQTYPE_LOOP*/
void Ani_Walk();
void Ani_Idle();
bool IsDefaultAni();
void SetMoveInfo( const K3DVector &tpos );
void Render( KViewportObject* viewport, DWORD flag=0 );
bool Process( DWORD dwTime );
bool IsCollision( const K3DVertex& rVertex1, const K3DVertex& rVertex2 ) const;
void ReSet();
const bool IsPosBack() { return m_bIsPosBack; }
void SetPosBack( bool bPosBack ) { m_bIsPosBack = bPosBack; }
void SetRotate( bool bRotate, const K3DVector &dpos, const K3DVector &tpos, bool bTime = false, bool bFlag = false );
// fValue - initialization rotation point;
void AvatarRotate( float fValue, bool bAdd, bool bInit=false );
const bool IsFront() { return m_bIsFront; }
void ReSetFront() { m_bIsFront = false; };
void SetSelectAvatar() { m_bSelectAvatar = true; };
void* AvatarPerform( int nAniIndex, int nMeshIndex, KID id, KArg& msg );
void SetSkinColorized( const DWORD& color, const int& nMode, const DWORD& hairColor );
void RefreshSkinColorized();
unsigned long GetSkinColorized();
private:
static unsigned int __stdcall avatar_loader( void* pArg );
static volatile bool s_bStopThread;
volatile bool m_bIsThreadLoading;
volatile bool m_bIsThreadPending;
void StartThreadLoading() { m_bIsThreadLoading = true; }
void EndThreadLoading() { m_bIsThreadLoading = false; }
void addToLoadingList();
void removeFromLoadingList();
void doLoading();
void PlayAnimation( const char* pAniKey, int nPlayType = SEQTYPE_LOOP );
enum
{
PROC_00, // IDLE
PROC_01, // MOVE
PROC_02, // COMPLETE
};
class KSeqAvatarEx* m_pAvatar;
bool m_bRefresh;
std::string m_AniKey_Def;
std::string m_AniKey_Act;
std::string m_AniKey_Walk;
std::string m_AniKey_Idle;
int m_nLevel;
int m_nJobLevel;
int m_nJobID;
std::string m_strName;
int m_nRace;
int m_nSex;
int m_nHairIndex;
int m_nFaceIndex;
int m_nBodyIndex;
int m_nHandIndex;
int m_nFootIndex;
int m_nDecoIndex;
DWORD m_dwSkinColor;
DWORD m_dwHairColor; // RGB hair color
int m_nHairColorIndex; // Hair color index (from based hairs)
bool m_bSelectAvatar;
ItemBase::ItemCode m_NudeCode[5];
ItemBase::ItemCode m_WearCode[ItemBase::MAX_ITEM_WEAR];
int m_nItemLevel[ItemBase::MAX_ITEM_WEAR];
DWORD m_dwTime;
float m_fTargetRoll;
float m_fPresentRoll;
DWORD m_dwPrevTime;
bool m_bUseRot;
bool m_bUseProc;
K3DVector m_vTarPos;
K3DVector m_vCurPos;
float m_fScale;
bool m_bIsPosBack;
bool m_bRotate; // Final rotation
float m_fSecondRoll;
bool m_bIsFront;
short m_nStep;
public:
unsigned int getHideEquipInfo() const { return m_hideEquipInfo; }
void setHideEquipInfo(unsigned int flag) { m_hideEquipInfo = flag; }
bool isHideEquipInfo(unsigned int flag) { return (m_hideEquipInfo & flag) == 0 ? false : true; }
private:
unsigned int m_hideEquipInfo;
};
struct LOBBY_AVATAR
{
enum LOBBYAVATAR_EFFECTSTATE
{
EFFECTSTATE_NONE,
EFFECTSTATE_UNSELECT_START,
EFFECTSTATE_UNSELECT_LOOP,
EFFECTSTATE_UNSELECT_END,
EFFECTSTATE_SELECT_START,
EFFECTSTATE_SELECT_LOOP,
EFFECTSTATE_SELECT_END,
};
SAvatarSelector* pAvatar;
KSeqModel* pEffect;
KSeqModel* pEffect2;
LOBBYAVATAR_EFFECTSTATE EffectState;
LOBBYAVATAR_EFFECTSTATE EffectState2;
LOBBY_AVATAR();
virtual ~LOBBY_AVATAR();
void PlayEffect( int nIndex, DWORD dwTime, LOBBYAVATAR_EFFECTSTATE state );
};
class CLobbyNoticeReceiver : public XBossWorker::XWorker
{
public:
CLobbyNoticeReceiver( const char* szURL, DWORD dwBufSize )
: m_bFinished( false ), m_strURL( szURL ), m_dwBufSize( dwBufSize ), m_pBuffer( new char[dwBufSize + 1] ) { }
virtual ~CLobbyNoticeReceiver() { delete [] m_pBuffer; }
bool IsFinished() const { return m_bFinished; }
const std::string& GetNotice() const { return m_strNotice; }
bool onProcess( int nThreadNum );
void onEnd( bool bIsCancel ) { }
private:
volatile bool m_bFinished;
std::string m_strURL;
std::string m_strNotice;
DWORD m_dwBufSize;
char* m_pBuffer;
};
//공용 함수
class SGame;
void CreateNewAvatar( SGame * pGame, const char* szName, SAvatarSelector* pNewAvatar );
void LoginAccount( SGame * pGame, const char* szAccount, __int64 & one_time_key );
void DeleteAvatar( SGame * pGame, const char* szName, const char* szSecurityNo );
void CharacterLogin( SGame * pGame, const char* szName, int nRace );
/// 보안 프로그램용
struct USER_INFO
{
private:
std::string m_strAccount; ///< 계정 이름
std::string m_strSelServerName; ///< 선택된 서버 이름
std::string m_strClassName; ///< 클래스 이름
long m_nLevel; ///< 레벨
bool m_bIsAdultServer;
bool m_isMonkeyTail; /// 2010.11.10 @계정인지 아닌지, @계정만 카메라 유저모드를 할 수 있게 하기 위해서 - prodongi
int m_user_no; // 유럽 db 통합 account id 중복 버그 방지위해 크루샵에서 사용할 고유값
public:
/// 2010.11.10 - prodongi
//void SetAccountName( const char* strAccountName ) { m_strAccount = strAccountName; }
void SetAccountName( const char* strAccountName )
{
m_strAccount = strAccountName;
/// 개발자 모드에서는 @계정이 아니더라도 권한을 줘야 된다.
#ifdef _DEV
m_isMonkeyTail = true;
#else
m_isMonkeyTail = (strAccountName[0] == '@') ? true : false;
#endif
}
void SetSelServerName( const char* strSelServerName ) { m_strSelServerName = strSelServerName; }
void SetClassName( const char* strClassName ) { m_strClassName = strClassName; }
void SetLevel( long nLevel ) { m_nLevel = nLevel; }
void SetAdultServer( bool bIsAdult ) { m_bIsAdultServer = bIsAdult; }
void SetUserNo(const int user_no)
{
m_user_no = user_no;
}
public:
const char* GetAccountName() { return m_strAccount.c_str(); }
const char* GetSelServerName() { return m_strSelServerName.c_str(); }
const char* GetClassName() { return m_strClassName.c_str(); }
long GetLevel() { return m_nLevel; }
bool IsAdultServer() { return m_bIsAdultServer; }
bool isMonkeyTail() const { return m_isMonkeyTail; } /// 2010.11.10 - prodongiF
const int GetUserNo() const
{
return m_user_no;
}
public:
USER_INFO() : m_strAccount(""), m_strSelServerName(""), m_strClassName(""), m_nLevel(0), m_bIsAdultServer( false ), m_isMonkeyTail(false), m_user_no(0) /// 2010.11.10 - prodongi
{}
~USER_INFO() {}
};