client/GameLib/ActorInstanceMotionEvent.cpp

332 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "../EffectLib/EffectManager.h"
#include "../milesLib/SoundManager.h"
#include "ActorInstance.h"
#include "FlyingObjectManager.h"
#include "FlyingInstance.h"
#include "GameEventManager.h"
#include "FlyHandler.h"
void CActorInstance::MotionEventProcess()
{
if (!m_pkCurRaceMotionData)
return;
for (DWORD i = 0; i < m_pkCurRaceMotionData->GetMotionEventDataCount(); ++i)
{
const CRaceMotionData::TMotionEventData * c_pData;
if (!m_pkCurRaceMotionData->GetMotionEventDataPointer(i, &c_pData))
continue;
MotionEventProcess(m_kCurMotNode.dwcurFrame, i, c_pData);
}
}
void CActorInstance::SoundEventProcess(BOOL bCheckFrequency)
{
if (!m_pkCurRaceMotionData)
return;
CSoundManager& rkSndMgr=CSoundManager::Instance();
const NSound::TSoundInstanceVector* c_pkVct_kSndInst=m_pkCurRaceMotionData->GetSoundInstanceVectorPointer();
rkSndMgr.UpdateSoundInstance(m_x, m_y, m_z, m_kCurMotNode.dwcurFrame, c_pkVct_kSndInst, bCheckFrequency);
}
void CActorInstance::MotionEventProcess(DWORD dwcurFrame, int iIndex, const CRaceMotionData::TMotionEventData * c_pData)
{
if (c_pData->dwFrame != dwcurFrame)
return;
switch (c_pData->iType)
{
case CRaceMotionData::MOTION_EVENT_TYPE_EFFECT:
ProcessMotionEventEffectEvent(c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_EFFECT_TO_TARGET:
ProcessMotionEventEffectToTargetEvent(c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_SCREEN_WAVING:
CGameEventManager::Instance().ProcessEventScreenWaving(this, (const CRaceMotionData::TScreenWavingEventData *)c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_SPECIAL_ATTACKING:
ProcessMotionEventSpecialAttacking(iIndex, c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_SOUND:
ProcessMotionEventSound(c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_FLY:
ProcessMotionEventFly(c_pData);
break;
case CRaceMotionData::MOTION_EVENT_TYPE_CHARACTER_SHOW:
__ShowEvent();
break;
case CRaceMotionData::MOTION_EVENT_TYPE_CHARACTER_HIDE:
__HideEvent();
break;
case CRaceMotionData::MOTION_EVENT_TYPE_WARP:
#ifndef WORLD_EDITOR
ProcessMotionEventWarp(c_pData);
#endif
break;
}
}
void CActorInstance::__ShowEvent()
{
m_isHiding = FALSE;
RestoreRenderMode();
SetAlphaValue(1.0f);
}
void CActorInstance::__HideEvent()
{
m_isHiding = TRUE;
SetBlendRenderMode();
SetAlphaValue(0.0f);
}
BOOL CActorInstance::__IsHiding()
{
return m_isHiding;
}
void CActorInstance::ProcessMotionEventEffectEvent(const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_EFFECT != c_pData->iType)
return;
const CRaceMotionData::TMotionEffectEventData * c_pEffectData = (const CRaceMotionData::TMotionEffectEventData *)c_pData;
if (c_pEffectData->isIndependent)
{
int iIndex = CEffectManager::Instance().CreateEffect(c_pEffectData->dwEffectIndex, D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f));
D3DXMATRIX matLocalPosition;
D3DXMatrixTranslation(&matLocalPosition, c_pEffectData->v3EffectPosition.x, c_pEffectData->v3EffectPosition.y, c_pEffectData->v3EffectPosition.z);
D3DXMATRIX matWorld;
matWorld = matLocalPosition;
matWorld *= m_worldMatrix;
CEffectManager::Instance().SelectEffectInstance(iIndex);
CEffectManager::Instance().SetEffectInstanceGlobalMatrix(matWorld);
return;
}
if (c_pEffectData->isAttaching)
{
if (c_pEffectData->isFollowing)
{
AttachEffectByID(0,
c_pEffectData->strAttachingBoneName.c_str(),
c_pEffectData->dwEffectIndex,
&c_pEffectData->v3EffectPosition);
}
else
{
int iBoneIndex;
DWORD dwPartIndex = 0;
if (FindBoneIndex(dwPartIndex, c_pEffectData->strAttachingBoneName.c_str(), &iBoneIndex))
{
D3DXMATRIX * pBoneMat;
GetBoneMatrix(dwPartIndex, iBoneIndex, &pBoneMat);
D3DXMATRIX matLocalPosition;
D3DXMatrixTranslation(&matLocalPosition, c_pEffectData->v3EffectPosition.x, c_pEffectData->v3EffectPosition.y, c_pEffectData->v3EffectPosition.z);
/////////////////////////////////////////////////////////////////////
D3DXMATRIX matWorld;
matWorld = *pBoneMat;
matWorld *= matLocalPosition;
matWorld *= m_worldMatrix;
/////////////////////////////////////////////////////////////////////
int iIndex = CEffectManager::Instance().CreateEffect(c_pEffectData->dwEffectIndex,
c_pEffectData->v3EffectPosition,
D3DXVECTOR3(0.0f, 0.0f, 0.0f));
CEffectManager::Instance().SelectEffectInstance(iIndex);
CEffectManager::Instance().SetEffectInstanceGlobalMatrix(matWorld);
}
}
}
else
{
AttachEffectByID(0, NULL, c_pEffectData->dwEffectIndex, &c_pEffectData->v3EffectPosition);
}
}
void CActorInstance::ProcessMotionEventEffectToTargetEvent(const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_EFFECT_TO_TARGET != c_pData->iType)
return;
const CRaceMotionData::TMotionEffectToTargetEventData * c_pEffectToTargetData = (const CRaceMotionData::TMotionEffectToTargetEventData *)c_pData;
if (c_pEffectToTargetData->isFishingEffect)
{
CEffectManager& rkEftMgr=CEffectManager::Instance();
if (-1 != m_iFishingEffectID)
{
rkEftMgr.DeactiveEffectInstance(m_iFishingEffectID);
}
m_iFishingEffectID = rkEftMgr.CreateEffect(c_pEffectToTargetData->dwEffectIndex, m_v3FishingPosition, D3DXVECTOR3(0.0f, 0.0f, 0.0f));
}
else
{
if (!m_kFlyTarget.IsValidTarget())
return;
if (c_pEffectToTargetData->isFollowing && IsFlyTargetObject())
{
CActorInstance * pTargetInstance = (CActorInstance *)m_kFlyTarget.GetFlyTarget();
D3DXVECTOR3 v3Position( c_pEffectToTargetData->v3EffectPosition.x,
c_pEffectToTargetData->v3EffectPosition.y,
c_pEffectToTargetData->v3EffectPosition.z);
pTargetInstance->AttachEffectByID(0, NULL, c_pEffectToTargetData->dwEffectIndex, &v3Position);
}
else
{
const D3DXVECTOR3 & c_rv3FlyTarget = m_kFlyTarget.GetFlyTargetPosition();
D3DXVECTOR3 v3Position( c_rv3FlyTarget.x + c_pEffectToTargetData->v3EffectPosition.x,
c_rv3FlyTarget.y + c_pEffectToTargetData->v3EffectPosition.y,
c_rv3FlyTarget.z + c_pEffectToTargetData->v3EffectPosition.z);
CEffectManager::Instance().CreateEffect(c_pEffectToTargetData->dwEffectIndex, v3Position, D3DXVECTOR3(0.0f, 0.0f, 0.0f));
}
}
}
void CActorInstance::ProcessMotionEventSpecialAttacking(int iMotionEventIndex, const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_SPECIAL_ATTACKING != c_pData->iType)
return;
const CRaceMotionData::TMotionAttackingEventData * c_pAttackingData = (const CRaceMotionData::TMotionAttackingEventData *)c_pData;
float fRadian = D3DXToRadian(270.0f + 360.0f - GetRotation());
m_kSplashArea.isEnableHitProcess=c_pAttackingData->isEnableHitProcess;
m_kSplashArea.uSkill=m_kCurMotNode.uSkill;
m_kSplashArea.MotionKey = m_kCurMotNode.dwMotionKey;
m_kSplashArea.fDisappearingTime = GetLocalTime() + c_pAttackingData->fDurationTime;
m_kSplashArea.c_pAttackingEvent = c_pAttackingData;
m_kSplashArea.HittedInstanceMap.clear();
m_kSplashArea.SphereInstanceVector.clear();
m_kSplashArea.SphereInstanceVector.resize(c_pAttackingData->CollisionData.SphereDataVector.size());
for (DWORD i = 0; i < c_pAttackingData->CollisionData.SphereDataVector.size(); ++i)
{
const TSphereData & c_rSphereData = c_pAttackingData->CollisionData.SphereDataVector[i].GetAttribute();
CDynamicSphereInstance & rSphereInstance = m_kSplashArea.SphereInstanceVector[i];
rSphereInstance.fRadius = c_rSphereData.fRadius;
//rSphereInstance.v3Advance = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
rSphereInstance.v3Position.x = m_x + c_rSphereData.v3Position.x*sinf(fRadian) + c_rSphereData.v3Position.y*cosf(fRadian);
rSphereInstance.v3Position.y = m_y + c_rSphereData.v3Position.x*cosf(fRadian) - c_rSphereData.v3Position.y*sinf(fRadian);
rSphereInstance.v3Position.z = m_z + c_rSphereData.v3Position.z;
rSphereInstance.v3LastPosition = rSphereInstance.v3Position;
}
}
void CActorInstance::ProcessMotionEventSound(const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_SOUND != c_pData->iType)
return;
const CRaceMotionData::TMotionSoundEventData * c_pSoundData = (const CRaceMotionData::TMotionSoundEventData *)c_pData;
Tracenf("PLAY SOUND: %s", c_pSoundData->strSoundFileName.c_str());
CSoundManager::Instance().PlaySound3D(m_x, m_y, m_z, c_pSoundData->strSoundFileName.c_str());
}
void CActorInstance::ProcessMotionEventFly(const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_FLY != c_pData->iType)
return;
const CRaceMotionData::TMotionFlyEventData * c_pFlyData = (const CRaceMotionData::TMotionFlyEventData *)c_pData;
if (m_kFlyTarget.IsValidTarget())
{
CFlyingManager & rfm = CFlyingManager::Instance();
D3DXVECTOR3 v3Start(c_pFlyData->v3FlyPosition);
v3Start += m_v3Position;
if (c_pFlyData->isAttaching)
{
D3DXMATRIX * pBoneMat;
int iBoneIndex;
DWORD dwPartIndex = 0;
if (FindBoneIndex(dwPartIndex, c_pFlyData->strAttachingBoneName.c_str(), &iBoneIndex))
if (GetBoneMatrix(dwPartIndex,iBoneIndex,&pBoneMat))
{
v3Start.x += pBoneMat->_41;
v3Start.y += pBoneMat->_42;
v3Start.z += pBoneMat->_43;
}
}
CFlyingInstance * pInstance = rfm.CreateFlyingInstanceFlyTarget(c_pFlyData->dwFlyIndex,v3Start,m_kFlyTarget,true);
if (pInstance)
{
pInstance->SetEventHandler(m_pFlyEventHandler);
pInstance->SetOwner(this);
pInstance->SetSkillIndex(m_kCurMotNode.uSkill);
}
if (m_pFlyEventHandler)
{
m_pFlyEventHandler->OnShoot(m_kCurMotNode.uSkill);
}
}
else
{
//TraceError("ActorInstance::ProcessMotionEventFly No Target");
}
}
void CActorInstance::ProcessMotionEventWarp(const CRaceMotionData::TMotionEventData * c_pData)
{
if (CRaceMotionData::MOTION_EVENT_TYPE_WARP != c_pData->iType)
return;
// FIXME : TMotionWarpEventData<74><61> <20><> <20><><EFBFBD><EFBFBD> - [levites]
static const float sc_fDistanceFromTarget = 270.0f;
if (m_kFlyTarget.IsValidTarget())
{
D3DXVECTOR3 v3MainPosition(m_x, m_y, m_z);
const D3DXVECTOR3 & c_rv3TargetPosition = __GetFlyTargetPosition();
D3DXVECTOR3 v3Distance = c_rv3TargetPosition - v3MainPosition;
D3DXVec3Normalize(&v3Distance, &v3Distance);
TPixelPosition DestPixelPosition = c_rv3TargetPosition - (v3Distance * sc_fDistanceFromTarget);
// 2004.07.05.myevan.<2E>ý<EFBFBD>ź<EFBFBD><C5BA> <20>ʿ<EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ذ<EFBFBD>. <20><>ǥ<EFBFBD><C7A5>ġ<EFBFBD><C4A1> <20>̵<EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
IBackground& rkBG=GetBackground();
if (!rkBG.IsBlock(DestPixelPosition.x, -DestPixelPosition.y))
SetPixelPosition(DestPixelPosition);
LookAt(c_rv3TargetPosition.x, c_rv3TargetPosition.y);
__OnWarp();
}
else
{
//TraceError("ActorInstance::ProcessMotionEventFly No Target");
}
}