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

📄 appearancemanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// AppearanceManager.cpp: implementation of the CAppearanceManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AppearanceManager.h"

#include "Player.h"
#include "Monster.h"
#include "BossMonster.h"
#include "Npc.h"
#include "ItemGround.h"
#include "TacticObject.h"

#include ".\Engine\EngineObject.h"
#include ".\Engine\EngineEffect.h"
#include "ObjectStateManager.h"

#include "ObjectManager.h"
#include "GameResourceManager.h"
#include "ItemManager.h"
#include "PeaceWarModeManager.h"
#include "MotionManager.h"
#include "CharMakeManager.h"
#include "MainGame.h"
#include "MHMap.h"

#ifdef _GMTOOL_
#include "MHCamera.h"
#endif


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CAppearanceManager)

CAppearanceManager::CAppearanceManager()
{

}

CAppearanceManager::~CAppearanceManager()
{

}

void CAppearanceManager::Init()
{
	GAMERESRCMNGR->LoadModFileList(GAMERESRCMNGR->m_ModFileList);
	GAMERESRCMNGR->LoadHairModFileList(GAMERESRCMNGR->m_HairModList);
	GAMERESRCMNGR->LoadFaceModFileList(GAMERESRCMNGR->m_FaceModList);
}

void CAppearanceManager::Release()
{
}

void CAppearanceManager::InitAppearanceToEffect(CObject* pObject,CEngineEffect* pEffect)
{
	if(pObject->GetObjectKind() == eObjectKind_Player)
	{
		CPlayer* pPlayer = (CPlayer*)pObject;
		SetCharacterAppearanceToEffect(pPlayer,pEffect);
	}
	else if(pObject->GetObjectKind() == eObjectKind_Monster)
	{
		ASSERT(0);	
	}
	else if(pObject->GetObjectKind() == eObjectKind_Npc)
	{
		ASSERT(0);	
	}
}

BOOL CAppearanceManager::SetCharacterAppearanceToEngineObject(CPlayer* pPlayer,CEngineObject* pEngineObject)
{
	BYTE gender = pPlayer->m_CharacterInfo.Gender;
	ASSERT(gender < 2);
	if( gender >= 2 ) gender = 0;

	BYTE hair = pPlayer->m_CharacterInfo.HairType;
	BYTE face = pPlayer->m_CharacterInfo.FaceType;
	WORD *WearedItemIdx = pPlayer->m_CharacterInfo.WearedItemIdx;
	MOD_LIST* pHairList = &GAMERESRCMNGR->m_HairModList[gender];
	MOD_LIST* pFaceList = &GAMERESRCMNGR->m_FaceModList[gender];
	MOD_LIST* pModList = &GAMERESRCMNGR->m_ModFileList[gender];

	pEngineObject->Init(pModList->BaseObjectFile,pPlayer,eEngineObjectType_Character);

	ASSERT(pHairList->MaxModFile > hair);
	if( pHairList->MaxModFile <= hair )		hair = 0;

	//////////////////////////////////////////////////////////////////////////
	// 龋冠 烙矫 // 魂鸥葛磊
	if( WearedItemIdx[eWearedItem_Hat] == 53001 || WearedItemIdx[eWearedItem_Hat] == 53002 ||
		WearedItemIdx[eWearedItem_Hat] == 53003 || WearedItemIdx[eWearedItem_Hat] == 53006 ||
		WearedItemIdx[eWearedItem_Hat] == 53009 || WearedItemIdx[eWearedItem_Hat] == 53012 || 
		WearedItemIdx[eWearedItem_Hat] == 53015 )
	{
	}
	else
	//////////////////////////////////////////////////////////////////////////
	pEngineObject->ChangePart(eAppearPart_Hair,pHairList->ModFile[hair]);
	BOOL rt;	
	pEngineObject->ChangePart(eAppearPart_Face,"NULL.MOD");

	int PartType,PartModelNum;
	for(int n=0;n<eWearedItem_Max;++n)
	{
		if(WearedItemIdx[n])
		{
			ITEM_INFO* pInfo = ITEMMGR->GetItemInfo(WearedItemIdx[n]);
			if(!pInfo)
				continue;
			PartType = pInfo->Part3DType;
			PartModelNum = pInfo->Part3DModelNum;

			if(PartType == -1)
				continue;

			// 咯磊绰 赣府甫 官操瘤 臼绊 赣府俊 嘿牢促.
			if(gender == 1 && PartType == 0)
			{
				PartType = 6;
			}			
		
			if(PartType == 7)// 7锅篮 巢磊电 咯磊电 赣府甫 官槽促. (龋冠赣府)
			{
				if(gender == 0)
					pEngineObject->ChangePart(eAppearPart_Hair,"NULLHAIR_M.MOD");
				else
					pEngineObject->ChangePart(eAppearPart_Hair,"NULLHAIR_W.MOD");
					
				PartType = 6;
			}

			if(PartType == 6)	// 赣府鹅
			{
				CEngineObject* pHairBand = new CEngineObject;
				pHairBand->Init(pModList->ModFile[PartModelNum],NULL,eEngineObjectType_Weapon);
				
				rt = pEngineObject->AttachDress(pHairBand,"Bip01 Head");				
			}
			else if(PartType != 5) // 恐 救官操唱 ??	// 公扁扼辑 救官槽促 坷官(yh)
				pEngineObject->ChangePart(
							//倔奔(扁粮 2锅 Part)捞 CHX俊辑 狐瘤绰 官恩俊 茄沫究 动败脸促.
							//PartType>2 ? PartType : PartType - 1
							PartType
							,pModList->ModFile[PartModelNum]);

		}
	}
	
	CEngineObject* pFace = new CEngineObject;

	ASSERT( pFaceList->MaxModFile > face );
	if( pFaceList->MaxModFile <= face )		face = 0;
	pFace->Init(pFaceList->ModFile[face],NULL,eEngineObjectType_Weapon);
	rt = pEngineObject->AttachDress(pFace,"Bip01 Head");


	//////////////////////////////////////////////////////////////////////////
	//YH2DO
	if(pPlayer->GetState() != eObjectState_Ungijosik && pPlayer->GetState() != eObjectState_StreetStall_Owner)
		ShowWeapon(pPlayer,pEngineObject);
	if( PEACEWARMGR->IsPeaceMode(pPlayer) )
	if( pPlayer->GetWeaponEquipType() == WP_GWUN ||
		pPlayer->GetWeaponEquipType() == WP_AMGI )
		HideWeapon(pPlayer,pEngineObject);
	//////////////////////////////////////////////////////////////////////////
	
	//胶纳老
	VECTOR3 scale;
	
	if( pPlayer->m_CharacterInfo.Width > 1.1 ) pPlayer->m_CharacterInfo.Width = 1.1;
	else if( pPlayer->m_CharacterInfo.Width < 0.9 ) pPlayer->m_CharacterInfo.Width = 0.9;

	if( pPlayer->m_CharacterInfo.Height > 1.1 ) pPlayer->m_CharacterInfo.Height = 1.1;
	else if( pPlayer->m_CharacterInfo.Height < 0.9 ) pPlayer->m_CharacterInfo.Height = 0.9;
		
	SetVector3(&scale,
		pPlayer->m_CharacterInfo.Width,
		pPlayer->m_CharacterInfo.Height,
		pPlayer->m_CharacterInfo.Width);

	pEngineObject->SetScale(&scale);
		
	pEngineObject->ApplyHeightField(TRUE);
	pPlayer->SetPosition(&pPlayer->m_MoveInfo.CurPosition);
	pPlayer->SetAngle(pPlayer->m_RotateInfo.Angle.ToRad());
	
	if(pPlayer->GetID() == HEROID)
	{
		pPlayer->GetEngineObject()->DisablePick();
	}
/*	
	// 儡惑 抛胶飘 内靛
	CEngineObject* pKGEffect = new CEngineObject;
	pKGEffect->Init("jansang.MOD",NULL,eEngineObjectType_Effect);
	pKGEffect->Attach(pEngineObject,"Bip01 Head");	
	pKGEffect->InitializeIllusionEffect(20,NULL);
	pKGEffect->BeginIllusionEffect();
*/

	return TRUE;
}


void CAppearanceManager::ShowWeapon(CPlayer* pPlayer)
{
	SetCharacterAppearanceToEngineObject(pPlayer,&pPlayer->m_EngineObject);
	ShowWeapon(pPlayer,pPlayer->GetEngineObject());
	
	if(pPlayer->GetCharacterTotalInfo()->bVisible == FALSE)	
	{
#ifdef _GMTOOL_
		if( MAINGAME->GetUserLevel() <= eUSERLEVEL_GM && CAMERA->GetCameraMode() != eCM_EyeView )
			pPlayer->GetEngineObject()->SetAlpha( 0.3f );
		else
#endif
			pPlayer->GetEngineObject()->Hide();
	}

	OBJECTMGR->ApplyShadowOption(pPlayer);
}
void CAppearanceManager::HideWeapon(CPlayer* pPlayer)
{
	SetCharacterAppearanceToEngineObject(pPlayer,&pPlayer->m_EngineObject);
	HideWeapon(pPlayer,pPlayer->GetEngineObject());
	
	if(pPlayer->GetCharacterTotalInfo()->bVisible == FALSE)	
	{
#ifdef _GMTOOL_
		if( MAINGAME->GetUserLevel() <= eUSERLEVEL_GM && CAMERA->GetCameraMode() != eCM_EyeView )
			pPlayer->GetEngineObject()->SetAlpha( 0.3f );
		else
#endif
			pPlayer->GetEngineObject()->Hide();
	}

	OBJECTMGR->ApplyShadowOption(pPlayer);
}

void CAppearanceManager::SetCharacterAppearance(CPlayer* pPlayer)
{
	SetCharacterAppearanceToEngineObject(pPlayer,&pPlayer->m_EngineObject);

	if(pPlayer->GetState() == eObjectState_None)
		OBJECTSTATEMGR->EndObjectState(pPlayer,eObjectState_None);
	if( pPlayer->GetState() == eObjectState_Move &&
		pPlayer->m_MoveInfo.KyungGongIdx == 0)
		pPlayer->SetState(eObjectState_Move);

	if(pPlayer->GetCharacterTotalInfo()->bVisible == FALSE)	
	{
#ifdef _GMTOOL_
		if( MAINGAME->GetUserLevel() <= eUSERLEVEL_GM && CAMERA->GetCameraMode() != eCM_EyeView )
			pPlayer->GetEngineObject()->SetAlpha( 0.3f );
		else
#endif
			pPlayer->GetEngineObject()->Hide();
	}
	
	OBJECTMGR->ApplyShadowOption(pPlayer);
}

void CAppearanceManager::SetBossMonsterAppearance(CBossMonster* pMonster)
{
	pMonster->m_EngineObject.Release();
	
	WORD mkind = pMonster->GetMonsterKind();
	BASE_MONSTER_LIST* pList = GAMERESRCMNGR->GetMonsterListInfo(mkind);
	
	pMonster->m_EngineObject.Init(pList->ChxName, pMonster, eEngineObjectType_Monster);
	pMonster->m_EngineObject.ApplyHeightField(TRUE);
	
	//////////////////////////////////////////////////////////////////////////
	// 阁胶磐 农扁 利侩
	VECTOR3 Scale;
	// taiyo test
	Scale.x = Scale.y = Scale.z = pList->Scale;
	pMonster->m_EngineObject.SetScale(&Scale);
}

void CAppearanceManager::SetMonsterAppearance(CMonster* pMonster)
{
	pMonster->m_EngineObject.Release();
	
	WORD mkind = pMonster->GetMonsterKind();
	BASE_MONSTER_LIST* pList = GAMERESRCMNGR->GetMonsterListInfo(mkind);
	pMonster->m_EngineObject.Init(pList->ChxName,pMonster,eEngineObjectType_Monster);
	pMonster->m_EngineObject.ApplyHeightField(TRUE);


	/////////////////////////////////////////////////////////////////////////
	// taiyo 
	// 葛记 沥焊 肺靛
	/*
	char chtName[255];
//	char tmp[255]; 
	int lens = strlen(pMonsterChxName) - 4;
	strncpy( chtName, pMonsterChxName, lens );
	chtName[lens] = 0;
	#ifdef _FILE_BIN_
		strcat(chtName, ".bin");
	#else
		strcat(chtName, ".cht");
	#endif
	MOTIONMGR->LoadMotionInfo(pMonster, chtName);	
	*/
	MOTIONMGR->SetMotionInfo(pMonster, pList->MotionID);

	//////////////////////////////////////////////////////////////////////////
	// 阁胶磐 农扁 利侩
	VECTOR3 Scale;
	// taiyo test
	Scale.x = Scale.y = Scale.z = pList->Scale;
	pMonster->m_EngineObject.SetScale(&Scale);
}
void CAppearanceManager::SetNpcAppearance(CNpc* pNpc)
{
	pNpc->m_EngineObject.Release();
		
	WORD nkind = pNpc->GetNpcKind();
	NPC_LIST* pList = GAMERESRCMNGR->GetNpcInfo(nkind);
	int ChxNum = pList->ModelNum;
	char* pNpcChxName = GAMERESRCMNGR->GetNpcChxName(ChxNum);
	
	pNpc->m_EngineObject.Init(pNpcChxName,pNpc,eEngineObjectType_Npc);
	pNpc->SetPosition(&pNpc->m_MoveInfo.CurPosition);
	pNpc->m_EngineObject.ApplyHeightField(TRUE);
	pNpc->SetAngle(pNpc->m_RotateInfo.Angle.ToRad());
	
	pNpc->m_EngineObject.ChangeMotion(1);

	pNpc->m_EngineObject.RandMotionFrame();
	
	if( pNpc->GetNpcJob() == 0 )
		pNpc->m_EngineObject.DisablePick();
}

void CAppearanceManager::SetCharacterAppearanceToEffect(CPlayer* pPlayer,CEngineEffect* pRtEffect)
{
	SetCharacterAppearanceToEngineObject(pPlayer,pRtEffect);
}

void CAppearanceManager::InitAppearance(CObject* pObject)
{
	if(pObject->GetObjectKind() == eObjectKind_Player)
	{
		SetCharacterAppearance((CPlayer*)pObject);
	}
	else if(pObject->GetObjectKind() == eObjectKind_Monster)
	{
		SetMonsterAppearance((CMonster*)pObject);
	}
	else if(pObject->GetObjectKind() == eObjectKind_Npc)
	{
		SetNpcAppearance((CNpc*)pObject);
	}
	else if(pObject->GetObjectKind() == eObjectKind_Tactic)
	{
	}
	else if(pObject->GetObjectKind() == eObjectKind_BossMonster)
	{
		SetBossMonsterAppearance((CBossMonster*)pObject);
	}
}

void CAppearanceManager::SetScalebyGuageBar(DWORD PlayerID)
{
	CObject* pPlayer;	
	pPlayer = OBJECTMGR->GetObject(PlayerID);
	if(pPlayer == NULL)
	{
		ASSERT(0);
		return;
	}
	ASSERT(pPlayer->GetObjectKind() == eObjectKind_Player);

	((CPlayer*)pPlayer)->m_CharacterInfo.Width = CHARMAKEMGR->GetCharacterMakeInfo()->Width;
	((CPlayer*)pPlayer)->m_CharacterInfo.Height = CHARMAKEMGR->GetCharacterMakeInfo()->Height;
}

void CAppearanceManager::AddCharacterPartChange(DWORD PlayerID)
{
	m_PtrList.AddHead((void*)PlayerID);
}

void CAppearanceManager::ProcessAppearance()
{
	DWORD PlayerID;
	CObject* pPlayer;
	while(PlayerID = (DWORD)m_PtrList.RemoveTail())
	{
		pPlayer = OBJECTMGR->GetObject(PlayerID);
		if(pPlayer == NULL)
			continue;
		ASSERT(pPlayer->GetObjectKind() == eObjectKind_Player);		
		SetCharacterAppearance((CPlayer*)pPlayer);
	}
}


void CAppearanceManager::ShowWeapon(CPlayer* pPlayer,CEngineObject* pEngineObject)
{
	WORD WeaponIdx = pPlayer->GetWearedItemIdx(eWearedItem_Weapon);
	if(WeaponIdx == 0)
		return;
	
	BYTE gender = pPlayer->m_CharacterInfo.Gender;

	ASSERT(gender < 2);
	MOD_LIST* pModList = &GAMERESRCMNGR->m_ModFileList[gender];

	HideWeapon(pPlayer,pEngineObject);
	
	int PartType,PartModelNum;
	{	// 公扁 Attach 贸府
		if(WeaponIdx)
		{
			PartType = ITEMMGR->GetItemInfo(WeaponIdx)->Part3DType;
			PartModelNum = ITEMMGR->GetItemInfo(WeaponIdx)->Part3DModelNum;
			if( PartType != -1 &&
				PartType != 3 )
			{
				WORD EquipType = pPlayer->GetWeaponEquipType();
				CEngineObject* pWeapon1 = new CEngineObject;
				
				if(EquipType == WP_AMGI)
				{			
					char temp[256],*pSrc;
					pSrc = pModList->ModFile[PartModelNum];
					for(DWORD n=0;n<strlen(pSrc);++n)
					{
						if(pSrc[n] == '.')
						{
							temp[n] = '_';
							temp[n+1] = 'R';
							strcpy(&temp[n+2],&pSrc[n]);
							break;
						}
						else
							temp[n] = pSrc[n];
					}		
					pWeapon1->Init(temp,NULL,eEngineObjectType_Weapon);
				
					BOOL rt = pEngineObject->AttachWeapon(pWeapon1,"Bip01 R Forearm");

					pSrc = pModList->ModFile[PartModelNum];
					for(n=0;n<strlen(pSrc);++n)
					{
						if(pSrc[n] == '.')
						{
							temp[n] = '_';
							temp[n+1] = 'L';
							strcpy(&temp[n+2],&pSrc[n]);
							break;
						}
						else
							temp[n] = pSrc[n];
					}
					CEngineObject* pWeapon2 = new CEngineObject;	
					pWeapon2->Init(temp,NULL,eEngineObjectType_Weapon);
					rt = pEngineObject->AttachWeapon(pWeapon2,"Bip01 L Forearm");
					return;
				}

				pWeapon1->Init(pModList->ModFile[PartModelNum],NULL,eEngineObjectType_Weapon);
				
				if(EquipType == WP_GUNG)
					pEngineObject->AttachWeapon(pWeapon1,WEAPON_ATTACH_BONENAME_L);
				else
					pEngineObject->AttachWeapon(pWeapon1,WEAPON_ATTACH_BONENAME_R);

				// 阂漠 test
//				pWeapon1 = new CEngineObject;
//				pWeapon1->Init("eff_ex_missile1.chx",NULL,eEngineObjectType_Effect);
//				pEngineObject->AttachWeapon(pWeapon1,WEAPON_ATTACH_BONENAME_R);
				//
				
				if( pPlayer->GetWeaponEquipType() == WP_GWUN )
				{
					CEngineObject* pWeapon2 = new CEngineObject;
					char temp[256],*pSrc;
					pSrc = pModList->ModFile[PartModelNum];
					for(DWORD n=0;n<strlen(pSrc);++n)
					{
						if(pSrc[n] == '.')
						{
							temp[n] = '_';
							temp[n+1] = 'L';
							strcpy(&temp[n+2],&pSrc[n]);
							break;
						}
						else
							temp[n] = pSrc[n];
					}
					pWeapon2->Init(temp,NULL,eEngineObjectType_Weapon);
					pEngineObject->AttachWeapon(pWeapon2,WEAPON_ATTACH_BONENAME_L);
				}
			}
		}
	}
}


void CAppearanceManager::HideWeapon(CPlayer* pPlayer,CEngineObject* pEngineObject)
{
	pEngineObject->RemoveAllAttachedWeapon();
}

⌨️ 快捷键说明

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