⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charmakemanager.cpp

📁 墨香最新私服
💻 CPP
字号:
#include "stdafx.h"
#include "Hero.h"
#include "CharMakeManager.h"
#include "GameResourceManager.h"
#include "CharMake.h"
#include "windowidenum.h"
#include "cComboBoxEx.h"
#include "ObjectManager.h"
#include "MoveManager.h"
#include "HelperManager.h"
#include "CharMakeDialog.h"
#include "interface/cGuageBar.h"


GLOBALTON(cCharMakeManager)
cCharMakeManager::cCharMakeManager()
{
	m_bInit = FALSE;
}

cCharMakeManager::~cCharMakeManager()
{
}

void cCharMakeManager::Init()
{
	m_pNewPlayer = NULL;
	memset(&m_CharMakeInfo, 0, sizeof(CHARACTERMAKEINFO));

	LoadUserSelectOption(); // ³»¿ëÀ» Àоî¿Â´Ù.
	SetUserSelectOption();	// ³»¿ëÀ» ¼ÂÆÃÇÑ´Ù.

	m_fAngle = 70;
	m_fOldX = 0.0f;

	m_bInit = TRUE;
	
	m_pHeight = (cGuageBar*)CHARMAKE->GetCharMakeDialog()->GetWindowForID(CMID_Height);
	m_pWidth = (cGuageBar*)CHARMAKE->GetCharMakeDialog()->GetWindowForID(CMID_Width);
}

void cCharMakeManager::Release()
{
	for(int i=0;i<CE_MAX;++i)
	{
		if( !m_UserSelectOption[i].IsEmpty() )
		{
			PTRLISTSEARCHSTART(m_UserSelectOption[i],CM_OPTION*,Value)
				delete Value;
			PTRLISTSEARCHEND

			m_UserSelectOption[i].RemoveAll();
		}
	}
}

void cCharMakeManager::ComboBoxResetAll()
{
	// ¼ºº°,Áö¿ªÀº ¸®¼ÂÇÏÁö ¾Ê´Â´Ù.
	cComboBoxEx* pCombo = NULL;

	for(int i=0;i<CE_MAX;++i)
	{
		if( !m_UserSelectOption[i].IsEmpty() && i != CE_SEX  && i != CE_AREA)
		{
			PTRLISTPOS pos = m_UserSelectOption[i].GetHeadPosition();
			CM_OPTION* Value = (CM_OPTION*)m_UserSelectOption[i].GetAt(pos);
			pCombo = (cComboBoxEx*)Value->pDescCombo;
			pCombo->SelectComboText(0);
		}
	}
}

void cCharMakeManager::LoadUserSelectOption()
{
	int idx = 0;
	int num = 0;
	char ComboId[64];

	CMHFile file;
#ifdef _FILE_BIN_
	if(!file.Init(PATH_UOPTION, "rb")) return;
#else
	if(!file.Init(PATH_UOPTION, "rt")) return;
#endif

	while(1)
	{
		if( idx >= CE_MAX || file.IsEOF()) break;

		num = file.GetInt(); // ¼±Åà ¿É¼ÇÀÇ °¹¼ö
		strcpy(ComboId, file.GetString());

		for( int i=0;i<num;++i)
		{
			CM_OPTION*	option = new CM_OPTION;
			strcpy(option->strName, file.GetString());
			option->dwData = file.GetDword();
			option->dwHelperData = file.GetDword();
			option->pDescCombo = CHARMAKE->GetCharMakeDialog()->GetWindowForID( IDSEARCH(ComboId) );

			m_UserSelectOption[idx].AddTail(option);
		}

		++idx;
	}
}

void cCharMakeManager::SetUserSelectOption()
{
	cComboBoxEx* pCombo = NULL;
	OPTIONITEM * pItem = NULL;

	for(int i=0;i<CE_MAX;++i)
	{
		if( !m_UserSelectOption[i].IsEmpty() )
		{
			DWORD MaxOption = 0;
			PTRLISTSEARCHSTART(m_UserSelectOption[i],CM_OPTION*,Value)
				pCombo = (cComboBoxEx*)Value->pDescCombo;

				pItem = new OPTIONITEM;
				pItem->wComboType = i;
				strcpy(pItem->string, Value->strName);
				pItem->dwData = Value->dwData;
				if( Value->dwHelperData != 0 )
					pItem->nExtData = Value->dwHelperData;
				pCombo->AddItem(pItem);
				++MaxOption;
			PTRLISTSEARCHEND

			if(pItem->wComboType == CE_AREA)
			{
				//WORD randarea = rand()%MaxOption;
				WORD randarea = MaxOption-1;	//µ·È²(³·)À» ±âº»°ªÀ¸·Î ¹Ù²Û´Ù.
				pCombo->SelectComboText(randarea);
				ReplaceCharMakeInfo(i, randarea);
			}
			else
			{
				pCombo->SelectComboText(0);
				ReplaceCharMakeInfo(i, 0);
			}
		}
	}

//	for(int i=0;i<CE_MAX;++i)
//		ReplaceCharMakeInfo(i, 0);

	m_CharMakeInfo.Height = 1;
	m_CharMakeInfo.Width = 1;
}


BOOL cCharMakeManager::ReplaceCharMakeInfo(int idx, WORD wValue )
{
	PTRLISTPOS pos = m_UserSelectOption[idx].FindIndex( wValue );
	if( !pos ) return FALSE;

	CM_OPTION* option = (CM_OPTION*)m_UserSelectOption[idx].GetAt(pos);
	if( !option ) return FALSE;

	DWORD value = option->dwData;

	switch(idx)
	{
		/*
	case CE_JOB: 
		{
			if( m_CharMakeInfo.JobType == value ) return FALSE;

			m_CharMakeInfo.JobType = (BYTE)value;

			if( HELPERMGR->IsCompleteInit() )
				HELPERMGR->ChangeSpeechDlg( option->dwHelperData );

			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->Job = (BYTE)value;
		}
		break;
		*/
	case CE_SEX:
		{
			if( m_CharMakeInfo.SexType == value ) return FALSE;

			m_CharMakeInfo.SexType = (BYTE)value;
			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->Gender = (BYTE)value;

			for(int i=0; i<CE_MAX;++i)
			{
				if(i != CE_SEX && i != CE_AREA)
					ReplaceCharMakeInfo(i, 0);
			}

			ComboBoxResetAll();
			CHARMAKE->GetCharMakeDialog()->ChangeComboStatus((unsigned short)value);

//			CreateNewCharacter(); // ¼ºº°ÀÌ ¹Ù²î¸é »õ·Î »ý¼ºÇÑ´Ù.

			if( m_pNewPlayer ) //Á¸ÀçÇϸé Á¦°Å ÇÑ´Ù.
			{
				OBJECTMGR->AddGarbageObject( (CObject*)m_pNewPlayer );
				m_pNewPlayer = NULL;
			}
		}
		return FALSE; // »õ·Î »ý¼ºÇÒ °æ¿ì´Â AddCharacterPartChange ¸¦ ÇÏÁö ¾Ê´Â´Ù.
	case CE_MHAIR: 
	case CE_WMHAIR:
		{
			if( m_CharMakeInfo.HairType == value ) return FALSE;

			m_CharMakeInfo.HairType = (BYTE)value;
			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->HairType = (BYTE)value;
			return TRUE;
		}
		break;
	case CE_MFACE: 
	case CE_WMFACE: 
		{
			if( m_CharMakeInfo.FaceType == value ) return FALSE;

			m_CharMakeInfo.FaceType = (BYTE)value;
			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->FaceType = (BYTE)value;

			return TRUE;
		}
		break;
	case CE_WEAR: 
		{
			if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress] == value ) return FALSE;

			m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress] = (WORD)value;
			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Dress] = (WORD)value;

			return TRUE;
		}
		break;
	case CE_BOOT: 
		{
			if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes] == value ) return FALSE;

			m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes] = (WORD)value;
			if( m_pNewPlayer )
				m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Shoes] = (WORD)value;

			return TRUE;
		}
		break;
	case CE_WEAPON: 
		{
			if( m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon] == value ) return FALSE;

			m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon] = (WORD)value;

//			if( HELPERMGR->IsCompleteInit() )
			if( m_bInit )
				HELPERMGR->ChangeSpeechDlg( option->dwHelperData, FALSE );

			if( m_pNewPlayer )
			{
				m_pNewPlayer->GetCharacterTotalInfo()->WearedItemIdx[eWearedItem_Weapon] = (WORD)value;

				m_pNewPlayer->ChangeMotion(eMotion_Battle_Gum_Standard + wValue, 1);
				m_pNewPlayer->ChangeBaseMotion(eMotion_Battle_Gum_Standard + wValue);	
			}

			return TRUE;
		}
		break;
	case CE_AREA: 
		{
			m_CharMakeInfo.StartArea = (BYTE)value;
		}
		break;
	}

	return FALSE;
}

void cCharMakeManager::CreateNewCharacter()
{
	VECTOR3 pos;

	m_fAngle = 0;

	pos.x = 24483;
	pos.y = 5910;
	pos.z = 8230;

	BASEOBJECT_INFO sBaseInfo;
	CHARACTER_TOTALINFO sTotalInfo;

	memset(&sBaseInfo, 0, sizeof(BASEOBJECT_INFO));
	memset(&sTotalInfo, 0, sizeof(CHARACTER_TOTALINFO));

	sBaseInfo.dwObjectID = 1;
	strcpy( sBaseInfo.ObjectName, "NewCharacter" );
	sBaseInfo.ObjectState = 1;

//	sTotalInfo.Job = m_CharMakeInfo.JobType;
	sTotalInfo.HairType = m_CharMakeInfo.HairType;
	sTotalInfo.FaceType = m_CharMakeInfo.FaceType;
	sTotalInfo.Gender = m_CharMakeInfo.SexType;
	sTotalInfo.WearedItemIdx[eWearedItem_Dress] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Dress];
	sTotalInfo.WearedItemIdx[eWearedItem_Shoes] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Shoes];
	sTotalInfo.WearedItemIdx[eWearedItem_Weapon] = m_CharMakeInfo.WearedItemIdx[eWearedItem_Weapon];
	sTotalInfo.Height = m_CharMakeInfo.Height;
	sTotalInfo.Width = m_CharMakeInfo.Width;
	sTotalInfo.bVisible = TRUE;

	m_pNewPlayer = OBJECTMGR->AddPlayer(&sBaseInfo,NULL,&sTotalInfo);
	m_pNewPlayer->GetEngineObject()->ApplyHeightField(FALSE);
	m_pNewPlayer->SetOverInfoOption(0);
	
//	m_pNewPlayer->SetPosition(&pos);
//	m_pNewPlayer->SetAngle(m_fAngle);	// ¹æÇâ µ¹¸®±â
	MOVEMGR->SetPosition( m_pNewPlayer, &pos );
	MOVEMGR->SetAngle( m_pNewPlayer, m_fAngle, 0 );
	
	m_pNewPlayer->ChangeMotion(eMotion_Battle_Gum_Standard	,1);
	m_pNewPlayer->ChangeBaseMotion(eMotion_Battle_Gum_Standard);	
}

void cCharMakeManager::NewCharacterRotate( int x )
{
	if( !m_pNewPlayer ) return;

	m_fAngle -= x*CHARROTATE_RATE*30;

	
	if( m_fAngle >= 360 )
		m_fAngle = 0;

//	m_pNewPlayer->SetAngle( m_fAngle );
	MOVEMGR->SetAngle( m_pNewPlayer, m_fAngle, 0 );
}


void cCharMakeManager::ApplyScale()
{
	m_CharMakeInfo.Height = 0.9 + m_pHeight->GetCurRate()*0.2;
	m_CharMakeInfo.Width = 0.9 + m_pWidth->GetCurRate()*0.2;
	//½ºÄÉÀÏ
	VECTOR3 scale;
	SetVector3(&scale,
		m_CharMakeInfo.Width,
		m_CharMakeInfo.Height,
		m_CharMakeInfo.Width);
	m_pNewPlayer->GetEngineObject()->SetScale(&scale);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -