#include "StdAfx.h" #include "displayobject.h" #include "PlayerSceneNode.h" #include "GameResourceManager.h" #include "ObjectNameCard.h" #include "ItemManager.h" cDisplayObject::cDisplayObject() { mStandIdx = 0; mMapNum = 0; mSetName = false; mDeleteWaitTime = LONG_MAX; mDeleteLock = false; } cDisplayObject::~cDisplayObject() { } bool cDisplayObject::Create( sPlayerInfo* pBaseInfo, sPlayerWearInfo* pWearInfo, sPlayerWeaponInfo* pWeaponInfo, sPlayerExrInfo* pExrInfo, NiPoint3 sPos, NiMatrix3 sRot, float fScale ) { ::memcpy( &mPlayerInfo, pBaseInfo, sizeof(sPlayerInfo) ); ::memcpy( &mPlayerWearInfo, pWearInfo, sizeof(sPlayerWearInfo) ); ::memcpy( &mPlayerWeaponInfo, pWeaponInfo, sizeof(sPlayerWeaponInfo) ); ::memset( &mPlayerExrInfo, 0, sizeof(sPlayerExrInfo) ); const char* strFile = GAMERESOURCEMAN->GetModelFileName( (mPlayerInfo.Race * eGENDER_MAX) + mPlayerInfo.Gender ); cPlayerSceneNodeParam param; param.mpObject = this; param.mDisplayObj = true; param.mPathName = strFile; param.mTranslate = sPos; param.mRotate = sRot; param.mScale = fScale; param.mCreateNameCard = mSetName; param.mUseShadow = false; mpObjectSceneNode = CreateSceneNode( ¶m ); if( mpObjectSceneNode == 0 ) { assert(0); return false; } mpObjectSceneNode->ShowNameGauge( false ); /// head Á¤º¸ ¼ÂÆÃ ChangeBaseHair( mPlayerInfo.HeadInfo[eHEAD_HAIR], mPlayerInfo.HeadInfo[eHEAD_HAIRCOLOR] ); SetBaseFace(); if( mPlayerInfo.HeadInfo[eHEAD_FACE_STATIC] != 0 ) ChangeFaceTexture( mPlayerInfo.HeadInfo[eHEAD_FACE_STATIC], true ); else ChangeFaceTexture( mPlayerInfo.HeadInfo[eHEAD_FACE], true ); /// ÄÚ½ºÆ¬ ¿ì¼± for( unsigned int ui=eWEAR_BODY1; uiGetItemDefine( mPlayerWearInfo.CostumeIdx[ui] ); if( p && p->GetSubType() == ITEM_WEAR_COS_ONEPIECE ) break; } } } /// eWEAR_HAT if( mPlayerWearInfo.CostumeIdx[eWEAR_HAT] == 0 ) { if( mPlayerWearInfo.WearIdx[eWEAR_HAT] != 0 ) EquipWearItem( mPlayerWearInfo.WearIdx[eWEAR_HAT] ); } else { EquipWearItem( mPlayerWearInfo.CostumeIdx[eWEAR_HAT] ); } /// Âø¿ë ¾ÆÀÌÅÛ ¼³Á¤ /// ÃʱâÈ­ ±¸¹®À̹ǷΠÁ÷Á¢ Á¦¾îÇÑ´Ù.. EquipWeaponItem( &mPlayerWeaponInfo ); for( unsigned char i=eCOSTUME_HEAD; iGetNameCard(); if( card ) { TCHAR buf[50]; ::_stprintf_s(buf, _T("Lv %d"), mPlayerInfo.Level ); card->SetGuildName( buf ); } return true; } bool cDisplayObject::ReCreate( sPlayerInfo* pBaseInfo, sPlayerWearInfo* pWearInfo, sPlayerWeaponInfo* pWeaponInfo, NiPoint3 sPos, NiMatrix3 sRot, float fScale ) { RemoveObjectSceneNode(); for( unsigned int i = 0; i < eHAND_ALL; i++ ) { mWeaponObjectIndex[i] = UINT_MAX; } ::memcpy( &mPlayerInfo, pBaseInfo, sizeof(sPlayerInfo) ); ::memcpy( &mPlayerWearInfo, pWearInfo, sizeof(sPlayerWearInfo) ); ::memcpy( &mPlayerWeaponInfo, pWeaponInfo, sizeof(sPlayerWeaponInfo) ); ::memset( &mPlayerExrInfo, 0, sizeof(sPlayerExrInfo) ); const char* strFile = GAMERESOURCEMAN->GetModelFileName( (mPlayerInfo.Race * eGENDER_MAX) + mPlayerInfo.Gender ); cPlayerSceneNodeParam param; param.mpObject = this; param.mDisplayObj = true; param.mPathName = strFile; param.mTranslate = sPos; param.mRotate = sRot; param.mScale = fScale; param.mCreateNameCard = false; param.mUseShadow = false; mpObjectSceneNode = CreateSceneNode( ¶m ); if( mpObjectSceneNode == 0 ) { assert(0); return false; } mpObjectSceneNode->ShowNameGauge( false ); /// head Á¤º¸ ¼ÂÆÃ ChangeBaseHair( mPlayerInfo.HeadInfo[eHEAD_HAIR], mPlayerInfo.HeadInfo[eHEAD_HAIRCOLOR] ); SetBaseFace(); if( mPlayerInfo.HeadInfo[eHEAD_FACE_STATIC] != 0 ) ChangeFaceTexture( mPlayerInfo.HeadInfo[eHEAD_FACE_STATIC], true ); else ChangeFaceTexture( mPlayerInfo.HeadInfo[eHEAD_FACE], true ); /// ÄÚ½ºÆ¬ ¿ì¼± for( unsigned int ui=eWEAR_BODY1; uiGetItemDefine( mPlayerWearInfo.CostumeIdx[ui] ); if( p && p->GetSubType() == ITEM_WEAR_COS_ONEPIECE ) break; } } } /// eWEAR_HAT if( mPlayerWearInfo.CostumeIdx[eWEAR_HAT] == 0 ) { if( mPlayerWearInfo.WearIdx[eWEAR_HAT] != 0 ) EquipWearItem( mPlayerWearInfo.WearIdx[eWEAR_HAT] ); } else { EquipWearItem( mPlayerWearInfo.CostumeIdx[eWEAR_HAT] ); } /// Âø¿ë ¾ÆÀÌÅÛ ¼³Á¤ /// ÃʱâÈ­ ±¸¹®À̹ǷΠÁ÷Á¢ Á¦¾îÇÑ´Ù.. EquipWeaponItem( &mPlayerWeaponInfo ); for( unsigned char i=eCOSTUME_HEAD; iGetGameText( 74 ), d ); else if( h != 0 ) str.Format( GAMERESOURCEMAN->GetGameText( 70 ), h ); else if( m != 0 ) str.Format( GAMERESOURCEMAN->GetGameText( 71 ), m ); else str.Format( GAMERESOURCEMAN->GetGameText( 72 ), s ); // Ãâ·Â °»½Å cPlayerNameCard* card = (cPlayerNameCard*)mpObjectSceneNode->GetNameCard(); if( card ) { TCHAR buf[128]={0,}; ::_stprintf_s(buf, _T("%s%s"), GAMERESOURCEMAN->GetGameText(34), (LPCTSTR)str.Cstr() ); card->SetDeleteWaitWord( buf, COLOR_RED ); } } } void cDisplayObject::SetDeleteWaitTime( long time ) { mDeleteWaitTime = time; // Ŭ¸®¾î if( mDeleteWaitTime == LONG_MAX ) { cPlayerNameCard* card = (cPlayerNameCard*)mpObjectSceneNode->GetNameCard(); if( card ) card->SetDeleteWaitWord( _T("") ); } } const NiPoint3& cDisplayObject::GetCenterPos() { return mpObjectSceneNode->GetObjectCenter(); } void cDisplayObject::UpdateDisplayForm( sPlayerInfo* pBaseInfo, sPlayerWearInfo* pWearInfo, sPlayerWeaponInfo* pWeaponInfo ) { assert(pBaseInfo); assert(pWearInfo); assert(pWeaponInfo); /// update head info ChangeBaseHair( pBaseInfo->HeadInfo[eHEAD_HAIR], pBaseInfo->HeadInfo[eHEAD_HAIRCOLOR] ); ChangeFaceTexture( pBaseInfo->HeadInfo[eHEAD_FACE], true ); mPlayerInfo.HeadInfo[eHEAD_FACE] = pBaseInfo->HeadInfo[eHEAD_FACE]; /// ÄÚ½ºÆ¬ ¿ì¼± for( unsigned int ui=eWEAR_BODY1; uiCostumeIdx[ui] == 0 ) { if( pWearInfo->WearIdx[ui] == 0 ) ChangeBaseWear( ePART_BODY1 + ui ); else EquipWearItem( pWearInfo->WearIdx[ui] ); } else { EquipWearItem( pWearInfo->CostumeIdx[ui] ); /// ¿øÇǽºÀÎ °æ¿ì ¹èÁ¦.. if( ui == eWEAR_BODY1 ) { cItemDefine* p = ITEMMAN->GetItemDefine( pWearInfo->CostumeIdx[ui] ); if( p && p->GetSubType() == ITEM_WEAR_COS_ONEPIECE ) break; } } } /// eWEAR_HAT if( pWearInfo->CostumeIdx[eWEAR_HAT] == 0 ) { if( pWearInfo->WearIdx[eWEAR_HAT] != 0 ) EquipWearItem( pWearInfo->WearIdx[eWEAR_HAT] ); } else { EquipWearItem( pWearInfo->CostumeIdx[eWEAR_HAT] ); } /// Âø¿ë ¾ÆÀÌÅÛ ¼³Á¤ /// ÃʱâÈ­ ±¸¹®À̹ǷΠÁ÷Á¢ Á¦¾îÇÑ´Ù.. EquipWeaponItem( pWeaponInfo ); for( unsigned char i=eCOSTUME_HEAD; iCostumeAccIdx[i] ); } void cDisplayObject::Rotate( float angle ) { if( mpObjectSceneNode == 0 ) return; NiMatrix3 rot; rot.MakeZRotation( angle ); rot = rot * mpObjectSceneNode->GetRotate(); mpObjectSceneNode->SetRotate( rot ); } void cDisplayObject::SetRot( NiMatrix3 mat ) { assert(mpObjectSceneNode); mpObjectSceneNode->SetRotate( mat ); } void cDisplayObject::ClearEffect() { // assert(mpObjectSceneNode); // mpObjectSceneNode->ClearEffect(); }