Files
Leviathan/Client/Game/game/DB/SPetDB.cpp
T
2026-06-01 12:46:52 +02:00

129 lines
2.7 KiB
C++

#include "stdafx.h"
#include "SPetDB.h"
#include <windows.h>
#include <tchar.h>
#include <kfile/KStream.h>
#include <kfile/KFileManager.h>
#include "KTypes.h"
#include "SkillBaseFile.h"
#include "SDebug_Util.h"
K3DVector SPetInfoEx::getFaceCutCameraPosition() const
{
return K3DVector( m_Pet->camera_x, m_Pet->camera_y, m_Pet->camera_z );
}
K3DVector SPetInfoEx::getTargetFxPosition() const
{
return K3DVector( m_Pet->target_x, m_Pet->target_y, m_Pet->target_z );
}
SPetDB* SPetDB::m_pThis = NULL;
SPetDB::SPetDB()
{
_init();
}
SPetDB::~SPetDB()
{
_destroy();
}
void SPetDB::_init()
{
_load();
#ifdef _DEBUG
m_DummyPet.debug_name = "dummy pet";
#endif
}
void SPetDB::_destroy()
{
_PET_INFO_CLIENT* PetInfo = 0;
bool Found = m_PetHash.get_first_value( PetInfo );
while( Found )
{
SAFE_DELETE( PetInfo );
Found = m_PetHash.get_next_value( PetInfo );
}
m_PetHash.clear();
}
void SPetDB::_load()
{
_destroy();
KStream* Stream = KFileManager::Instance().CreateStreamFromResource( "db_pet.rdb" );
if( !Stream )
return;
int PetCount = 0;
GAME_DB DBHeader;
Stream->Read( &DBHeader, sizeof( DBHeader ) );
for( int i = 0; i < DBHeader.nCount; ++i )
{
_PET_INFO_CLIENT* PetInfo = new _PET_INFO_CLIENT;
Stream->Read( PetInfo, sizeof( _PET_INFO_FILE ) );
PetInfo->uid_client = PetInfo->uid;
PetInfo->uid = XFastRandom();
_PET_INFO_CLIENT* FoundPetInfo = 0;
if( m_PetHash.lookup( PetInfo->uid_client, FoundPetInfo ) == false )
{
++PetCount;
m_PetHash.add( PetInfo->uid_client, PetInfo );
}
else
{
#ifdef _DEV
char szBuffer[256] = { NULL, };
_stprintf_s( szBuffer, _countof(szBuffer), _T( "[Pet DB] 아이디가 중복되었습니다 [%u]"), PetInfo->uid_client );
assert( NULL );
MessageBox( HWND_DESKTOP, szBuffer, "Pet DB", MB_OK | MB_ICONERROR );
#endif
delete PetInfo;
}
}
_oprint( "[Pet DB] Pet 정보 로딩 개수 : [%d]\n", PetCount );
KFileManager::Instance().DeleteStream( Stream );
// prepare a dummy pet
m_DummyPet.name_id = 0;
m_DummyPet.cage_id = 0;
m_DummyPet.attribute_flag = 0;
m_DummyPet.size = 1.0f;
m_DummyPet.scale = 1.0f;
m_DummyPet.target_fx_size = 7.0f;
m_DummyPet.walk_type = 4; // 4족 소형
m_DummyPet.slant_type = 1; // 기울임
m_DummyPet.texture_group = -1;
m_DummyPet.camera_x = -5;
m_DummyPet.camera_y = -21;
m_DummyPet.camera_z = 14;
m_DummyPet.target_x = -0.308f;
m_DummyPet.target_y = -0.063f;
m_DummyPet.target_z = -14.865f;
::sprintf( m_DummyPet.model, "%s", "beast_panthera_lv1" );
m_DummyPet.motion_file_id = 131;
}
SPetDB& GetPetDB()
{
if( NULL == SPetDB::m_pThis )
SPetDB::m_pThis = new SPetDB;
return *SPetDB::m_pThis;
// static SPetDB PetDB;
// return PetDB;
}