forked from metin2/client
607 lines
16 KiB
C++
607 lines
16 KiB
C++
|
#include "StdAfx.h"
|
|||
|
#include "../EffectLib/EffectManager.h"
|
|||
|
|
|||
|
#include "ActorInstance.h"
|
|||
|
#include "ItemData.h"
|
|||
|
#include "ItemManager.h"
|
|||
|
#include "RaceData.h"
|
|||
|
#include "WeaponTrace.h"
|
|||
|
|
|||
|
BOOL USE_WEAPON_SPECULAR = TRUE;
|
|||
|
|
|||
|
BOOL USE_VIETNAM_CONVERT_WEAPON_VNUM = FALSE;
|
|||
|
|
|||
|
DWORD Vietnam_ConvertWeaponVnum(DWORD vnum)
|
|||
|
{
|
|||
|
DWORD base = vnum / 10 * 10;
|
|||
|
DWORD rest = vnum % 10;
|
|||
|
switch (base)
|
|||
|
{
|
|||
|
case 10:base = 5000;break;
|
|||
|
case 20:base = 5010;break;
|
|||
|
case 30:base = 5020;break;
|
|||
|
case 40:base = 5030;break;
|
|||
|
case 50:base = 5030;break;
|
|||
|
case 60:base = 5040;break;
|
|||
|
case 70:base = 5040;break;
|
|||
|
case 80:base = 5050;break;
|
|||
|
case 90:base = 5050;break;
|
|||
|
case 100:base = 5060;break;
|
|||
|
case 110:base = 5060;break;
|
|||
|
case 120:base = 5070;break;
|
|||
|
case 130:base = 5070;break;
|
|||
|
case 140:base = 5080;break;
|
|||
|
case 150:base = 5080;break;
|
|||
|
case 160:base = 5090;break;
|
|||
|
case 170:base = 5090;break;
|
|||
|
case 180:base = 5100;break;
|
|||
|
case 190:base = 5100;break;
|
|||
|
case 200:base = 5110;break;
|
|||
|
case 210:base = 5110;break;
|
|||
|
case 220:base = 5120;break;
|
|||
|
case 230:base = 5120;break;
|
|||
|
case 240:base = 5130;break;
|
|||
|
case 250:base = 5130;break;
|
|||
|
case 260:base = 5140;break;
|
|||
|
case 270:base = 5140;break;
|
|||
|
case 280:base = 5150;break;
|
|||
|
case 290:base = 5150;break;
|
|||
|
case 1000:base = 5000;break;
|
|||
|
case 1010:base = 5010;break;
|
|||
|
case 1020:base = 5020;break;
|
|||
|
case 1030:base = 5030;break;
|
|||
|
case 1040:base = 5040;break;
|
|||
|
case 1050:base = 5050;break;
|
|||
|
case 1060:base = 5060;break;
|
|||
|
case 1070:base = 5070;break;
|
|||
|
case 1080:base = 5080;break;
|
|||
|
case 1090:base = 5090;break;
|
|||
|
case 1100:base = 5100;break;
|
|||
|
case 1110:base = 5110;break;
|
|||
|
case 1120:base = 5120;break;
|
|||
|
case 1130:base = 5130;break;
|
|||
|
case 1140:base = 5140;break;
|
|||
|
case 1150:base = 5150;break;
|
|||
|
case 1160:base = 5150;break;
|
|||
|
case 1170:base = 5150;break;
|
|||
|
case 3000:base = 5000;break;
|
|||
|
case 3010:base = 5010;break;
|
|||
|
case 3020:base = 5020;break;
|
|||
|
case 3030:base = 5030;break;
|
|||
|
case 3040:base = 5040;break;
|
|||
|
case 3050:base = 5050;break;
|
|||
|
case 3060:base = 5060;break;
|
|||
|
case 3070:base = 5070;break;
|
|||
|
case 3080:base = 5080;break;
|
|||
|
case 3090:base = 5090;break;
|
|||
|
case 3100:base = 5100;break;
|
|||
|
case 3110:base = 5100;break;
|
|||
|
case 3120:base = 5110;break;
|
|||
|
case 3130:base = 5110;break;
|
|||
|
case 3140:base = 5120;break;
|
|||
|
case 3150:base = 5120;break;
|
|||
|
case 3160:base = 5130;break;
|
|||
|
case 3170:base = 5130;break;
|
|||
|
case 3180:base = 5140;break;
|
|||
|
case 3190:base = 5140;break;
|
|||
|
case 3200:base = 5150;break;
|
|||
|
case 3210:base = 5150;break;
|
|||
|
}
|
|||
|
return base + rest;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DWORD CActorInstance::AttachSmokeEffect(DWORD eSmoke)
|
|||
|
{
|
|||
|
if (!m_pkCurRaceData)
|
|||
|
return 0;
|
|||
|
|
|||
|
DWORD dwSmokeEffectID=m_pkCurRaceData->GetSmokeEffectID(eSmoke);
|
|||
|
|
|||
|
return AttachEffectByID(0, m_pkCurRaceData->GetSmokeBone().c_str(), dwSmokeEffectID);
|
|||
|
}
|
|||
|
|
|||
|
bool CActorInstance::__IsLeftHandWeapon(DWORD type)
|
|||
|
{
|
|||
|
if (CItemData::WEAPON_DAGGER == type || (CItemData::WEAPON_FAN == type && __IsMountingHorse()))
|
|||
|
return true;
|
|||
|
else if (CItemData::WEAPON_BOW == type)
|
|||
|
return true;
|
|||
|
else
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
bool CActorInstance::__IsRightHandWeapon(DWORD type)
|
|||
|
{
|
|||
|
if (CItemData::WEAPON_DAGGER == type || (CItemData::WEAPON_FAN == type && __IsMountingHorse()))
|
|||
|
return true;
|
|||
|
else if (CItemData::WEAPON_BOW == type)
|
|||
|
return false;
|
|||
|
else
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
bool CActorInstance::__IsWeaponTrace(DWORD weaponType)
|
|||
|
{
|
|||
|
switch(weaponType)
|
|||
|
{
|
|||
|
case CItemData::WEAPON_BELL:
|
|||
|
case CItemData::WEAPON_FAN:
|
|||
|
case CItemData::WEAPON_BOW:
|
|||
|
return false;
|
|||
|
default:
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::AttachWeapon(DWORD dwItemIndex,DWORD dwParentPartIndex, DWORD dwPartIndex)
|
|||
|
{
|
|||
|
if (dwPartIndex>=CRaceData::PART_MAX_NUM)
|
|||
|
return;
|
|||
|
|
|||
|
m_adwPartItemID[dwPartIndex]=dwItemIndex;
|
|||
|
|
|||
|
if (USE_VIETNAM_CONVERT_WEAPON_VNUM)
|
|||
|
dwItemIndex = Vietnam_ConvertWeaponVnum(dwItemIndex);
|
|||
|
|
|||
|
CItemData * pItemData;
|
|||
|
if (!CItemManager::Instance().GetItemDataPointer(dwItemIndex, &pItemData))
|
|||
|
{
|
|||
|
RegisterModelThing(dwPartIndex, NULL);
|
|||
|
SetModelInstance(dwPartIndex, dwPartIndex, 0);
|
|||
|
|
|||
|
RegisterModelThing(CRaceData::PART_WEAPON_LEFT, NULL);
|
|||
|
SetModelInstance(CRaceData::PART_WEAPON_LEFT, CRaceData::PART_WEAPON_LEFT, 0);
|
|||
|
|
|||
|
RefreshActorInstance();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
__DestroyWeaponTrace();
|
|||
|
//<2F><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>(<28>ڰ<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD>) <20><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
if (__IsRightHandWeapon(pItemData->GetWeaponType()))
|
|||
|
AttachWeapon(dwParentPartIndex, CRaceData::PART_WEAPON, pItemData);
|
|||
|
if (__IsLeftHandWeapon(pItemData->GetWeaponType()))
|
|||
|
AttachWeapon(dwParentPartIndex, CRaceData::PART_WEAPON_LEFT, pItemData);
|
|||
|
}
|
|||
|
|
|||
|
BOOL CActorInstance::GetAttachingBoneName(DWORD dwPartIndex, const char ** c_pszBoneName)
|
|||
|
{
|
|||
|
return m_pkCurRaceData->GetAttachingBoneName(dwPartIndex, c_pszBoneName);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CActorInstance::AttachWeapon(DWORD dwParentPartIndex, DWORD dwPartIndex, CItemData * pItemData)
|
|||
|
{
|
|||
|
// assert(m_pkCurRaceData);
|
|||
|
if (!pItemData)
|
|||
|
return;
|
|||
|
|
|||
|
const char * szBoneName;
|
|||
|
if (!GetAttachingBoneName(dwPartIndex, &szBoneName))
|
|||
|
return;
|
|||
|
|
|||
|
// NOTE : (<28>̵<EFBFBD><CCB5><EFBFBD>ó<EFBFBD><C3B3>)<29>ܵ<EFBFBD><DCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
|
|||
|
if (CRaceData::PART_WEAPON_LEFT == dwPartIndex)
|
|||
|
{
|
|||
|
RegisterModelThing(dwPartIndex, pItemData->GetSubModelThing());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
RegisterModelThing(dwPartIndex, pItemData->GetModelThing());
|
|||
|
}
|
|||
|
|
|||
|
for (DWORD i = 0; i < pItemData->GetLODModelThingCount(); ++i)
|
|||
|
{
|
|||
|
CGraphicThing * pThing;
|
|||
|
|
|||
|
if (!pItemData->GetLODModelThingPointer(i, &pThing))
|
|||
|
continue;
|
|||
|
|
|||
|
RegisterLODThing(dwPartIndex, pThing);
|
|||
|
}
|
|||
|
|
|||
|
SetModelInstance(dwPartIndex, dwPartIndex, 0);
|
|||
|
AttachModelInstance(dwParentPartIndex, szBoneName, dwPartIndex);
|
|||
|
|
|||
|
// 20041208.myevan.<2E><><EFBFBD>⽺<EFBFBD><E2BDBA>ŧ<EFBFBD><C5A7>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SetShape<70><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.)
|
|||
|
if (USE_WEAPON_SPECULAR)
|
|||
|
{
|
|||
|
SMaterialData kMaterialData;
|
|||
|
kMaterialData.pImage = NULL;
|
|||
|
kMaterialData.isSpecularEnable = TRUE;
|
|||
|
kMaterialData.fSpecularPower = pItemData->GetSpecularPowerf();
|
|||
|
kMaterialData.bSphereMapIndex = 1;
|
|||
|
SetMaterialData(dwPartIndex, NULL, kMaterialData);
|
|||
|
}
|
|||
|
|
|||
|
// Weapon Trace
|
|||
|
if (__IsWeaponTrace(pItemData->GetWeaponType()))
|
|||
|
{
|
|||
|
CWeaponTrace * pWeaponTrace = CWeaponTrace::New();
|
|||
|
pWeaponTrace->SetWeaponInstance(this, dwPartIndex, szBoneName);
|
|||
|
m_WeaponTraceVector.push_back(pWeaponTrace);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::DettachEffect(DWORD dwEID)
|
|||
|
{
|
|||
|
std::list<TAttachingEffect>::iterator i = m_AttachingEffectList.begin();
|
|||
|
|
|||
|
while (i != m_AttachingEffectList.end())
|
|||
|
{
|
|||
|
TAttachingEffect & rkAttEft = (*i);
|
|||
|
|
|||
|
if (rkAttEft.dwEffectIndex == dwEID)
|
|||
|
{
|
|||
|
i = m_AttachingEffectList.erase(i);
|
|||
|
CEffectManager::Instance().DestroyEffectInstance(dwEID);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
++i;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DWORD CActorInstance::AttachEffectByName(DWORD dwParentPartIndex, const char * c_pszBoneName, const char * c_pszEffectName)
|
|||
|
{
|
|||
|
std::string str;
|
|||
|
DWORD dwCRC;
|
|||
|
StringPath(c_pszEffectName, str);
|
|||
|
dwCRC = GetCaseCRC32(str.c_str(), str.length());
|
|||
|
|
|||
|
return AttachEffectByID(dwParentPartIndex, c_pszBoneName, dwCRC);
|
|||
|
}
|
|||
|
|
|||
|
DWORD CActorInstance::AttachEffectByID(DWORD dwParentPartIndex, const char * c_pszBoneName, DWORD dwEffectID, const D3DXVECTOR3 * c_pv3Position)
|
|||
|
{
|
|||
|
TAttachingEffect ae;
|
|||
|
ae.iLifeType = EFFECT_LIFE_INFINITE;
|
|||
|
ae.dwEndTime = 0;
|
|||
|
ae.dwModelIndex = dwParentPartIndex;
|
|||
|
ae.dwEffectIndex = CEffectManager::Instance().GetEmptyIndex();
|
|||
|
ae.isAttaching = TRUE;
|
|||
|
if (c_pv3Position)
|
|||
|
{
|
|||
|
D3DXMatrixTranslation(&ae.matTranslation, c_pv3Position->x, c_pv3Position->y, c_pv3Position->z);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
D3DXMatrixIdentity(&ae.matTranslation);
|
|||
|
}
|
|||
|
CEffectManager& rkEftMgr=CEffectManager::Instance();
|
|||
|
rkEftMgr.CreateEffectInstance(ae.dwEffectIndex, dwEffectID);
|
|||
|
|
|||
|
if (c_pszBoneName)
|
|||
|
{
|
|||
|
int iBoneIndex;
|
|||
|
|
|||
|
if (!FindBoneIndex(dwParentPartIndex,c_pszBoneName, &iBoneIndex))
|
|||
|
{
|
|||
|
ae.iBoneIndex = -1;
|
|||
|
//Tracef("Cannot get Bone Index\n");
|
|||
|
//assert(false && "Cannot get Bone Index");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ae.iBoneIndex = iBoneIndex;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ae.iBoneIndex = -1;
|
|||
|
}
|
|||
|
|
|||
|
m_AttachingEffectList.push_back(ae);
|
|||
|
|
|||
|
return ae.dwEffectIndex;
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::RefreshActorInstance()
|
|||
|
{
|
|||
|
if (!m_pkCurRaceData)
|
|||
|
{
|
|||
|
TraceError("void CActorInstance::RefreshActorInstance() - m_pkCurRaceData=NULL");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// This is Temporary place before making the weapon detection system
|
|||
|
// Setup Collison Detection Data
|
|||
|
m_BodyPointInstanceList.clear();
|
|||
|
//m_AttackingPointInstanceList.clear();
|
|||
|
m_DefendingPointInstanceList.clear();
|
|||
|
|
|||
|
// Base
|
|||
|
for (DWORD i = 0; i < m_pkCurRaceData->GetAttachingDataCount(); ++i)
|
|||
|
{
|
|||
|
const NRaceData::TAttachingData * c_pAttachingData;
|
|||
|
|
|||
|
if (!m_pkCurRaceData->GetAttachingDataPointer(i, &c_pAttachingData))
|
|||
|
continue;
|
|||
|
|
|||
|
switch (c_pAttachingData->dwType)
|
|||
|
{
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA:
|
|||
|
{
|
|||
|
const NRaceData::TCollisionData * c_pCollisionData = c_pAttachingData->pCollisionData;
|
|||
|
|
|||
|
TCollisionPointInstance PointInstance;
|
|||
|
if (NRaceData::COLLISION_TYPE_ATTACKING == c_pCollisionData->iCollisionType)
|
|||
|
continue;
|
|||
|
|
|||
|
if (!CreateCollisionInstancePiece(CRaceData::PART_MAIN, c_pAttachingData, &PointInstance))
|
|||
|
continue;
|
|||
|
|
|||
|
switch (c_pCollisionData->iCollisionType)
|
|||
|
{
|
|||
|
case NRaceData::COLLISION_TYPE_ATTACKING:
|
|||
|
//m_AttackingPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
case NRaceData::COLLISION_TYPE_DEFENDING:
|
|||
|
m_DefendingPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
case NRaceData::COLLISION_TYPE_BODY:
|
|||
|
m_BodyPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_EFFECT:
|
|||
|
// if (!m_bEffectInitialized)
|
|||
|
// {
|
|||
|
// DWORD dwCRC;
|
|||
|
// StringPath(c_pAttachingData->pEffectData->strFileName);
|
|||
|
// dwCRC = GetCaseCRC32(c_pAttachingData->pEffectData->strFileName.c_str(),c_pAttachingData->pEffectData->strFileName.length());
|
|||
|
//
|
|||
|
// TAttachingEffect ae;
|
|||
|
// ae.iLifeType = EFFECT_LIFE_INFINITE;
|
|||
|
// ae.dwEndTime = 0;
|
|||
|
// ae.dwModelIndex = 0;
|
|||
|
// ae.dwEffectIndex = CEffectManager::Instance().GetEmptyIndex();
|
|||
|
// ae.isAttaching = TRUE;
|
|||
|
// CEffectManager::Instance().CreateEffectInstance(ae.dwEffectIndex, dwCRC);
|
|||
|
//
|
|||
|
// if (c_pAttachingData->isAttaching)
|
|||
|
// {
|
|||
|
// int iBoneIndex;
|
|||
|
// if (!FindBoneIndex(0,c_pAttachingData->strAttachingBoneName.c_str(), &iBoneIndex))
|
|||
|
// {
|
|||
|
// Tracef("Cannot get Bone Index\n");
|
|||
|
// assert(false/*Cannot get Bone Index*/);
|
|||
|
// }
|
|||
|
//
|
|||
|
// ae.iBoneIndex = iBoneIndex;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// ae.iBoneIndex = -1;
|
|||
|
// }
|
|||
|
//
|
|||
|
// m_AttachingEffectList.push_back(ae);
|
|||
|
// }
|
|||
|
|
|||
|
if (c_pAttachingData->isAttaching)
|
|||
|
{
|
|||
|
AttachEffectByName(0, c_pAttachingData->strAttachingBoneName.c_str(), c_pAttachingData->pEffectData->strFileName.c_str());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
AttachEffectByName(0, 0, c_pAttachingData->pEffectData->strFileName.c_str());
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_OBJECT:
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
assert(false/*NOT_IMPLEMENTED*/);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (DWORD j = 0; j < CRaceData::PART_MAX_NUM; ++j)
|
|||
|
{
|
|||
|
if (0 == m_adwPartItemID[j])
|
|||
|
continue;
|
|||
|
|
|||
|
CItemData * pItemData;
|
|||
|
if (!CItemManager::Instance().GetItemDataPointer(m_adwPartItemID[j], &pItemData))
|
|||
|
return;
|
|||
|
|
|||
|
for (DWORD k = 0; k < pItemData->GetAttachingDataCount(); ++k)
|
|||
|
{
|
|||
|
const NRaceData::TAttachingData * c_pAttachingData;
|
|||
|
|
|||
|
if (!pItemData->GetAttachingDataPointer(k, &c_pAttachingData))
|
|||
|
continue;
|
|||
|
|
|||
|
switch(c_pAttachingData->dwType)
|
|||
|
{
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA:
|
|||
|
{
|
|||
|
const NRaceData::TCollisionData * c_pCollisionData = c_pAttachingData->pCollisionData;
|
|||
|
|
|||
|
// FIXME : ù<><C3B9>° <20><><EFBFBD>ڴ<EFBFBD> Part<72><74> <20><>ȣ<EFBFBD><C8A3>.
|
|||
|
// Base<73><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<>ΰ<EFBFBD>? - [levites]
|
|||
|
TCollisionPointInstance PointInstance;
|
|||
|
if (NRaceData::COLLISION_TYPE_ATTACKING == c_pCollisionData->iCollisionType)
|
|||
|
continue;
|
|||
|
if (!CreateCollisionInstancePiece(j, c_pAttachingData, &PointInstance))
|
|||
|
continue;
|
|||
|
|
|||
|
switch (c_pCollisionData->iCollisionType)
|
|||
|
{
|
|||
|
case NRaceData::COLLISION_TYPE_ATTACKING:
|
|||
|
//m_AttackingPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
case NRaceData::COLLISION_TYPE_DEFENDING:
|
|||
|
m_DefendingPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
case NRaceData::COLLISION_TYPE_BODY:
|
|||
|
m_BodyPointInstanceList.push_back(PointInstance);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_EFFECT:
|
|||
|
if (!m_bEffectInitialized)
|
|||
|
{
|
|||
|
DWORD dwCRC;
|
|||
|
StringPath(c_pAttachingData->pEffectData->strFileName);
|
|||
|
dwCRC = GetCaseCRC32(c_pAttachingData->pEffectData->strFileName.c_str(),c_pAttachingData->pEffectData->strFileName.length());
|
|||
|
|
|||
|
TAttachingEffect ae;
|
|||
|
ae.iLifeType = EFFECT_LIFE_INFINITE;
|
|||
|
ae.dwEndTime = 0;
|
|||
|
ae.dwModelIndex = j;
|
|||
|
ae.dwEffectIndex = CEffectManager::Instance().GetEmptyIndex();
|
|||
|
ae.isAttaching = TRUE;
|
|||
|
CEffectManager::Instance().CreateEffectInstance(ae.dwEffectIndex, dwCRC);
|
|||
|
|
|||
|
int iBoneIndex;
|
|||
|
if (!FindBoneIndex(j,c_pAttachingData->strAttachingBoneName.c_str(), &iBoneIndex))
|
|||
|
{
|
|||
|
Tracef("Cannot get Bone Index\n");
|
|||
|
assert(false/*Cannot get Bone Index*/);
|
|||
|
}
|
|||
|
Tracef("Creating %p %d %d\n", this, j,k);
|
|||
|
|
|||
|
ae.iBoneIndex = iBoneIndex;
|
|||
|
|
|||
|
m_AttachingEffectList.push_back(ae);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case NRaceData::ATTACHING_DATA_TYPE_OBJECT:
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
assert(false/*NOT_IMPLEMENTED*/);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
m_bEffectInitialized = true;
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::SetWeaponTraceTexture(const char * szTextureName)
|
|||
|
{
|
|||
|
std::vector<CWeaponTrace*>::iterator it;
|
|||
|
for (it = m_WeaponTraceVector.begin(); it != m_WeaponTraceVector.end(); ++it)
|
|||
|
{
|
|||
|
(*it)->SetTexture(szTextureName);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::UseTextureWeaponTrace()
|
|||
|
{
|
|||
|
for_each(
|
|||
|
m_WeaponTraceVector.begin(),
|
|||
|
m_WeaponTraceVector.end(),
|
|||
|
std::void_mem_fun(&CWeaponTrace::UseTexture)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::UseAlphaWeaponTrace()
|
|||
|
{
|
|||
|
for_each(
|
|||
|
m_WeaponTraceVector.begin(),
|
|||
|
m_WeaponTraceVector.end(),
|
|||
|
std::void_mem_fun(&CWeaponTrace::UseAlpha)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::UpdateAttachingInstances()
|
|||
|
{
|
|||
|
CEffectManager& rkEftMgr=CEffectManager::Instance();
|
|||
|
|
|||
|
std::list<TAttachingEffect>::iterator it;
|
|||
|
DWORD dwCurrentTime = CTimer::Instance().GetCurrentMillisecond();
|
|||
|
for (it = m_AttachingEffectList.begin(); it!= m_AttachingEffectList.end();)
|
|||
|
{
|
|||
|
if (EFFECT_LIFE_WITH_MOTION == it->iLifeType)
|
|||
|
{
|
|||
|
++it;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if ((EFFECT_LIFE_NORMAL == it->iLifeType && it->dwEndTime < dwCurrentTime) ||
|
|||
|
!rkEftMgr.IsAliveEffect(it->dwEffectIndex))
|
|||
|
{
|
|||
|
rkEftMgr.DestroyEffectInstance(it->dwEffectIndex);
|
|||
|
it = m_AttachingEffectList.erase(it);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (it->isAttaching)
|
|||
|
{
|
|||
|
rkEftMgr.SelectEffectInstance(it->dwEffectIndex);
|
|||
|
|
|||
|
if (it->iBoneIndex == -1)
|
|||
|
{
|
|||
|
D3DXMATRIX matTransform;
|
|||
|
matTransform = it->matTranslation;
|
|||
|
matTransform *= m_worldMatrix;
|
|||
|
rkEftMgr.SetEffectInstanceGlobalMatrix(matTransform);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
D3DXMATRIX * pBoneMat;
|
|||
|
if (GetBoneMatrix(it->dwModelIndex, it->iBoneIndex, &pBoneMat))
|
|||
|
{
|
|||
|
D3DXMATRIX matTransform;
|
|||
|
matTransform = *pBoneMat;
|
|||
|
matTransform *= it->matTranslation;
|
|||
|
matTransform *= m_worldMatrix;
|
|||
|
rkEftMgr.SetEffectInstanceGlobalMatrix(matTransform);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//TraceError("GetBoneMatrix(modelIndex(%d), boneIndex(%d)).NOT_FOUND_BONE",
|
|||
|
// it->dwModelIndex, it->iBoneIndex);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
++it;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::ShowAllAttachingEffect()
|
|||
|
{
|
|||
|
std::list<TAttachingEffect>::iterator it;
|
|||
|
for(it = m_AttachingEffectList.begin(); it!= m_AttachingEffectList.end();++it)
|
|||
|
{
|
|||
|
CEffectManager::Instance().SelectEffectInstance(it->dwEffectIndex);
|
|||
|
CEffectManager::Instance().ShowEffect();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::HideAllAttachingEffect()
|
|||
|
{
|
|||
|
std::list<TAttachingEffect>::iterator it;
|
|||
|
for(it = m_AttachingEffectList.begin(); it!= m_AttachingEffectList.end();++it)
|
|||
|
{
|
|||
|
CEffectManager::Instance().SelectEffectInstance(it->dwEffectIndex);
|
|||
|
CEffectManager::Instance().HideEffect();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CActorInstance::__ClearAttachingEffect()
|
|||
|
{
|
|||
|
m_bEffectInitialized = false;
|
|||
|
|
|||
|
std::list<TAttachingEffect>::iterator it;
|
|||
|
for(it = m_AttachingEffectList.begin(); it!= m_AttachingEffectList.end();++it)
|
|||
|
{
|
|||
|
CEffectManager::Instance().DestroyEffectInstance(it->dwEffectIndex);
|
|||
|
}
|
|||
|
m_AttachingEffectList.clear();
|
|||
|
}
|