Files
Sun1602/Client/GameClient/ProjectileProcess.cpp
T
2022-10-26 12:25:11 +08:00

3366 lines
92 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "ProjectileProcess.h"
//#include "ObjectManager.h"
//#include "Camera.h"
//#include "GlobalFunc.h"
//#include "GameFunc.h"
//#include "Hero.h"
//#include "HeroData.h"
//#include "GameFramework.h"
//#include "LoadScene.h"
//#include "Map.h"
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileEx::cProjectileEx()
//{
// m_TraceType = nProjectile::TRACE_TYPE_NONE;
//}
//
//void cProjectileEx::UpdateTargetPosition()
//{
// nProjectile::eTraceType type = GetTraceType();
//
// if( type == nProjectile::TRACE_TYPE_NONE )
// {
// return;
// }
//
// if( GetTargetObjectKey() == 0 || GetTargetObjectKey() == INVALID_OBJECT_KEY )
// {
// return;
// }
//
// if( Character* pTarget = (Character*)g_ObjectManager.GetObject(m_Param.dwTargetID) )
// {
// if( type == nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION )
// {
// SetTargetPosition( pTarget->GetArrowTargetPos() );
// }
// else if( type == nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION_ONCE )
// {
// SetTargetPosition( pTarget->GetArrowTargetPos() );
// SetTargetObjectKey( INVALID_OBJECT_KEY );
// }
// else if( type == nProjectile::TRACE_TYPE_TARGET_VISIBLE_POSITION )
// {
// SetTargetPosition( pTarget->GetVisiblePos() );
// }
// else if( type == nProjectile::TRACE_TYPE_TARGET_VISIBLE_POSITION_ONCE )
// {
// SetTargetPosition( pTarget->GetVisiblePos() );
// SetTargetObjectKey( INVALID_OBJECT_KEY );
// }
// else if( type == nProjectile::TRACE_TYPE_TARGET_TOP_POSITION )
// {
// WzVector p = pTarget->GetVisiblePos();
// p.z += pTarget->GetHeight();
// SetTargetPosition( p );
// }
// else if( type == nProjectile::TRACE_TYPE_TARGET_TOP_POSITION_ONCE )
// {
// WzVector p = pTarget->GetVisiblePos();
// p.z += pTarget->GetHeight();
// SetTargetPosition( p );
// SetTargetObjectKey( INVALID_OBJECT_KEY );
// }
// }
//}
//
//void cProjectileEx::UpdateProjectilePosition()
//{
// // calc position, rate
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// m_Param.fSpeed = max(1.0f,m_Param.fSpeed);
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
//
// SetProjectilePosition( m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate) );
//
// if(m_Param.bNotMove)
// {
// SetProjectilePosition( m_Param.vStartPos );
// }
//
// SetRate( fRate, fEndRate, fTrailRate );
//
//
// // cacl rotate
// WzVector vDest = GetTargetPosition() - GetStartPosition();
// WzVector vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// WzVector Rotate;
// Rotate.x = -atan2(vDest.z,fLength);
// Rotate.y = 0;
// Rotate.z = Math_GetAngleFromVector(&vDest);
// SetProjectileRotate( Rotate );
//
//
//
//
// //WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// //vCurPos = vCurPos2 = m_Param.vStartPos;
// //vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// //VectorNormalize(&vDest,&vDest);
// //WzVector vDirection;
//
// //VectorCrossProduct(&vDirection,&vDest,&vDir);
// //VectorNormalize(&vDirection,&vDirection);
//
// //WzVector CamPos = pCameraInfo->m_wvFrom;
// //WzVector BeamSrc = m_Param.vStartPos;
// //WzVector BeamDst = m_Param.vTargetPos;
//
// //WzVector vBeamDir = BeamDst - BeamSrc;
// //VectorNormalize(&vBeamDir,&vBeamDir);
// //WzVector vBeamToCam = CamPos - BeamSrc;
// //VectorNormalize(&vBeamToCam,&vBeamToCam);
// //WzVector vBeamUp;
// //vBeamUp.x = 0.0f;
// //vBeamUp.y = 0.0f;
// //vBeamUp.z = 1.0f;
//
// //WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// //float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// //if (vCurrDir.x < 0)
// // fAngle = fAngle;
// //else if (vCurrDir.x > 0)
// // fAngle = -fAngle;
// //else
// // fAngle = 0;
//
// //WzMatrix matrix;
//
// //VectorNormalize(&vCurrDir,&vCurrDir);
// //MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// //vTemp.x = 0.0f;
// //vTemp.y = 0.0f;
// //vTemp.z = 1.0f;
//
// //float fHeight = m_Param.fHeight * fTrailRate;
//
// //vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// //vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// //vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// //vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// //vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// //vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// //vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// //vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
//}
//
//
//void cProjectileEx::ProcessMeshProjectile()
//{
// if( m_pMesh == NULL )
// return;
//
// St_Camera* pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = GetStartPosition();
// vDestPos = vDestPos2 = GetTargetPosition();
//
// WzVector t = vDestPos - vCurPos;
//
// VectorNormalize(&t,&t);
//
// WzVector vDirection;
// VectorCrossProduct( &vDirection, &t, &pCameraInfo->m_wvDir);
// VectorNormalize( &vDirection, &vDirection );
//
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// float fHeight = m_Param.fHeight * GetTailRate();
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
//
// vNewPos = vCurPos * (1.0f - GetRate()) + vDestPos * (GetRate());
// vNewPos2 = vCurPos2 * (1.0f - GetRate()) + vDestPos2 * (GetRate());
//
// vNewEndPos = vCurPos * (1.0f - GetEndRate()) + vDestPos * (GetEndRate());
// vNewEndPos2 = vCurPos2 * (1.0f - GetEndRate()) + vDestPos2 * (GetEndRate());
//
//
// WzVector vArrowDir = vDestPos - vCurPos;
//
// VectorNormalize(&vArrowDir,&vArrowDir);
//
// WzVector vTrailOffset = vArrowDir * -0.3f;
//
//
// // 매쉬 좌표에 대입
// m_pMesh->m_pVertices[0] = vTrailOffset + vNewEndPos;
// m_pMesh->m_pVertices[1] = vTrailOffset + vNewPos;
// m_pMesh->m_pVertices[2] = vTrailOffset + vNewEndPos2;
// m_pMesh->m_pVertices[3] = vTrailOffset + vNewPos;
// m_pMesh->m_pVertices[4] = vTrailOffset + vNewPos2;
// m_pMesh->m_pVertices[5] = vTrailOffset + vNewEndPos2;
//}
//
//void cProjectileEx::ProcessUnitProjectile()
//{
// if( m_pUnitDraw )
// {
// m_pUnitDraw->SetPosition( GetProjectilePosition(), FALSE );
// m_pUnitDraw->SetRotation( GetProjectileRotate(), TRUE );
// }
//}
//
//void cProjectileEx::ProcessEffectProjectile()
//{
// if( m_hEffect == INVALID_HANDLE_VALUE )
// return;
//
// if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect) )
// {
// WzVector vRot = GetProjectileRotate();
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.y = 1.0f;
//
// if( m_Param.vScale != c_ZeroVector)
// {
// vScale = m_Param.vScale;
// }
//
// if( m_Param.vDir != c_ZeroVector)
// {
// vRot = m_Param.vDir;
// }
//
// pBody->SetResultMatrix( GetProjectilePosition(), vRot, vScale );
//
// if( m_Param.bFadeOut )
// {
// DWORD alphaTime = m_Param.dwLifeTime / 2;
// if( alphaTime == 0 )
// alphaTime = 1;
//
// DWORD startAlphaTime = m_Param.dwLifeTime-alphaTime;
//
// if( m_dwDelay >= startAlphaTime )
// {
// WzColor color = pBody->GetColor();
//
// float fRate = (float)(m_dwDelay - startAlphaTime) / (float) alphaTime;
//
// float alphaRate = 1.0f - fRate;
//
// float fAlpha = Alpha_WzColor(color);
//
// if( alphaRate < 0.0f)
// {
// alphaRate = 0.0f;
// }
//
// if( alphaRate > 1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// color = WzColor_RGBA(Red_WzColor(color),Green_WzColor(color),Blue_WzColor(color),Alpha);
// pBody->SetColor(color);
// }
// }
// }
//}
//
//void cProjectileEx::ProcessHit()
//{
// // 히트는 중간 또는 마지막에 1회만 처리된다.
//
// if( ProcessDamageGroup() == TRUE )
// {
// if (m_Param.bCameraShake )
// {
// g_Camera.SetVibeType( Camera::VIBE_TYPE_VERTICAL );
// g_Camera.StartVibration( 50, 0.07f );
//
// m_Param.bCameraShake = FALSE;
// }
//
// if( m_Param.EndeffectID )
// {
// HANDLE hEffect = GlobalFunc::CreateEffectBeUpToOption( m_Param.EndeffectID, GetProjectilePosition(), m_Param.dwOwner, m_Param.dwTargetID );//!loop 이펙트 쓰지 말것
//
// if( CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(hEffect) )
// {
// pBody->SetResultMatrix( GetProjectilePosition(), GetProjectilePosition(), c_UnitVector);
// }
//
// m_Param.EndeffectID = 0;
// }
//
// m_Param.dwDamageTime = 0;
// }
//}
//
//
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileArrow::cProjectileArrow()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION );
//}
//
//BOOL cProjectileArrow::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// if(m_pMesh)
// {
// m_pMesh->m_pVertices[0] = vNewEndPos;
// m_pMesh->m_pVertices[1] = vNewPos;
// m_pMesh->m_pVertices[2] = vNewEndPos2;
// m_pMesh->m_pVertices[3] = vNewPos;
// m_pMesh->m_pVertices[4] = vNewPos2;
// m_pMesh->m_pVertices[5] = vNewEndPos2;
//
// WzVector vArrowDir = vDestPos - vCurPos;
//
// VectorNormalize(&vArrowDir,&vArrowDir);
//
// WzVector vTrailOffset = vArrowDir * -0.3f;
//
// for (int a = 0; a < 6; a++)
// {
// m_pMesh->m_pVertices[a] = m_pMesh->m_pVertices[a] + vTrailOffset;
//
// }
// }
//
// if (m_pUnitDraw)
// {
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(fArrowAngleX,0,fArrowAngleZ);
// }
//
// m_dwDelay += dwTick;
//
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
//
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
//
//
// WzVector vScale;
//
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
//
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// }
// }
//
// m_bUpdated = TRUE;
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// if (fRate >= 1.0f)
// {
// if(m_Param.EndeffectID)
// {
// HANDLE hHandle = GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
// if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(hHandle) )
// {
// WzVector vRot;
//
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
//
//
// WzVector vScale;
//
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// }
// }
//
// // 다중타겟일경우 다음타겟으로 넘어가고
// if (m_bMultiTarget)
// {
// ProcessDamage(m_pdwMultiTargetID[m_iCurTargetIndex]);
// m_iCurTargetIndex++;
// // 모든 타겟을 다 지나쳤다 삭제
// if (m_iCurTargetIndex >= m_iTargetNum)
// {
// return TRUE;
// }
// // 화살딜레이를 0으로 초기화해준다 다시
// else
// {
// DWORD dwNextTargetID = m_pdwMultiTargetID[m_iCurTargetIndex];
// Character *pTarget = (Character *)g_ObjectManager.GetObject(dwNextTargetID);
// m_dwDelay = 0;
// m_Param.vStartPos = m_Param.vTargetPos;
// if(pTarget)
// {
// m_Param.vTargetPos = pTarget->GetVisiblePos();
// m_Param.vTargetPos.z +=(pTarget->GetArrowTargetHeight());
// }
// }
// }
// // 단일 타겟일경우 발사체를 삭제.
// else
// {
// ProcessDamage();
// return TRUE;
// }
// }
// return FALSE;
//
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileSonyVine::cProjectileSonyVine()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION );
//}
//
//BOOL cProjectileSonyVine::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// if (m_pUnitDraw)
// {
// float fLoopCheck;
// fLoopCheck = 0.0f;
// WzEvent Event;
// ZeroMemory(&Event,sizeof(Event));
//
// g_pSunRenderer->ProgressUnitFrame(m_pUnitDraw, ( float )dwTick, &Event, &fLoopCheck );
//
// m_pUnitDraw->SetPosition(vArrowPos);
//
// m_pUnitDraw->SetRotation(0.0f,0.0f,m_fAngleZ);
//
// //유닛에 딸린 이펙트 처리
// if (Event.m_iNumEffect > 0)
// {
// for (int a = 0; a < Event.m_iNumEffect; a++)
// {
// int iIndex = Event.m_Effect[a].m_iEffectType;
//
// assert(iIndex >= 0 && iIndex < MAX_OBJECT_EFFECT);
//
// if (iIndex < 0)
// {
// iIndex = 0;
// }
// else if (iIndex >= MAX_OBJECT_EFFECT)
// {
// iIndex = MAX_OBJECT_EFFECT - 1;
// }
//
// if (Event.m_Effect[a].m_byEffectFlag & EFF_DESTROY)
// {
// DestroyObjectEffect(iIndex);
// }
// else
// {
// DestroyObjectEffect(iIndex);
//
// int boneindex = Event.m_Effect[a].m_iEffectBoneIndex;
// WzVector vPos;
// GameFunc::GetBonePos(m_pUnitDraw,boneindex,&vPos);
//
// m_EffectParam[iIndex].hEffect = GlobalFunc::CreateEffectBeUpToOption(Event.m_Effect[a].m_wiEffectWzID,vPos,m_Param.dwOwner,m_Param.dwTargetID);
// m_EffectParam[iIndex].iBoneIndex = boneindex;
// }
// }
//
// }
// }
//
// m_dwDelay += dwTick;
//
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
//
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
//
//
// WzVector vScale;
//
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
//
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// }
// }
//
// m_bUpdated = TRUE;
//
// Object* pObj = g_ObjectManager.GetObject( m_Param.dwTargetID );
//
// if(pObj && pObj->IsKindOfObject(CHARACTER_OBJECT))
// {
// Character *pChr=(Character *)pObj;
// if(!pChr->CannotMove())
// {
// DWORD alphaTime=m_Param.dwLifeTime/4;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay<startAlphaTime)
// {
// if(!m_Param.SONYVINE.bDeBuff)
// {
// m_Param.SONYVINE.bDeBuff=TRUE;
// DWORD alphaTime=m_dwDelay/4;
// if(!alphaTime)
// alphaTime=1000;
//
// m_Param.dwLifeTime=m_Param.dwMoveTime=m_dwDelay+alphaTime;
//
// }
//
// }
// }
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
//
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/4;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// m_wzColor = WzColor_RGBA(255,255,255,Alpha);
// }
// }
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// return TRUE;
// }
// return FALSE;
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectilePoisonThorn::cProjectilePoisonThorn()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_VISIBLE_POSITION_ONCE );
//}
//
//BOOL cProjectilePoisonThorn::OnProcessProjectile( DWORD dwTick )
//{
// UpdateTargetPosition();
//
// ASSERT(m_Param.dwMoveTime);
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
//
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
//
// if (m_pUnitDraw)
// {
// float fLoopCheck;
// fLoopCheck = 0.0f;
// WzEvent Event;
// ZeroMemory(&Event,sizeof(Event));
//
// g_pSunRenderer->ProgressUnitFrame(m_pUnitDraw, ( float )dwTick, &Event, &fLoopCheck );
//
// m_pUnitDraw->SetPosition(m_Param.vStartPos);
// m_pUnitDraw->SetRotation(fArrowAngleX,0.0f,fArrowAngleZ);
//
//
// //유닛에 딸린 이펙트 처리
// if (Event.m_iNumEffect > 0)
// {
// for (int a = 0; a < Event.m_iNumEffect; a++)
// {
// int iIndex = Event.m_Effect[a].m_iEffectType;
//
// ASSERT(iIndex >= 0 && iIndex < MAX_OBJECT_EFFECT);
//
// if (iIndex < 0)
// {
// iIndex = 0;
// }
// else if (iIndex >= MAX_OBJECT_EFFECT)
// {
// iIndex = MAX_OBJECT_EFFECT - 1;
// }
//
// if (Event.m_Effect[a].m_byEffectFlag & EFF_DESTROY)
// {
// DestroyObjectEffect(iIndex);
// }
// else
// {
// DestroyObjectEffect(iIndex);
//
// int boneindex = Event.m_Effect[a].m_iEffectBoneIndex;
// WzVector vPos;
// GameFunc::GetBonePos(m_pUnitDraw,boneindex,&vPos);
//
//
// m_EffectParam[iIndex].hEffect = GlobalFunc::CreateEffectBeUpToOption(Event.m_Effect[a].m_wiEffectWzID,vPos,m_Param.dwOwner,m_Param.dwTargetID);
// m_EffectParam[iIndex].iBoneIndex = boneindex;
// }
// }
//
// }
// }
//
// m_dwDelay += dwTick;
//
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
//
// WzVector vRot;
//
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
//
//
// WzVector vScale;
//
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
//
// pBody->SetResultMatrix(m_Param.vStartPos,vRot,vScale);
// }
// }
//
// m_bUpdated = TRUE;
//
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/4;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// m_wzColor = WzColor_RGBA(255,255,255,Alpha);
//
// }
// }
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// return TRUE;
// }
//
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectilePoisonRain::cProjectilePoisonRain()
//{
// SetTraceType( nProjectile::TRACE_TYPE_NONE );
//}
//
//BOOL cProjectilePoisonRain::OnProcessProjectile( DWORD dwTick )
//{
// UpdateTargetPosition();
//
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f&&m_Param.POISON_RAIN.bAniChange)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(40,0.03f);
// }
//
// m_Param.POISON_RAIN.bAniChange=FALSE;
// SetAni((m_Param.POISON_RAIN.aniIDEnd));
// ProcessDamageGroup();
// }
//
// if (m_pUnitDraw)
// {
// float fLoopCheck;
// fLoopCheck = 0.0f;
// WzEvent Event;
// ZeroMemory(&Event,sizeof(Event));
//
// g_pSunRenderer->ProgressUnitFrame(m_pUnitDraw, ( float )dwTick, &Event, &fLoopCheck );
//
// m_pUnitDraw->SetPosition(vArrowPos);
//
//
// //유닛에 딸린 이펙트 처리
// if (Event.m_iNumEffect > 0)
// {
// for (int a = 0; a < Event.m_iNumEffect; a++)
// {
// int iIndex = Event.m_Effect[a].m_iEffectType;
//
// assert(iIndex >= 0 && iIndex < MAX_OBJECT_EFFECT);
//
// if (iIndex < 0)
// {
// iIndex = 0;
// }
// else if (iIndex >= MAX_OBJECT_EFFECT)
// {
// iIndex = MAX_OBJECT_EFFECT - 1;
// }
//
// if (Event.m_Effect[a].m_byEffectFlag & EFF_DESTROY)
// {
// DestroyObjectEffect(iIndex);
// }
// else
// {
// DestroyObjectEffect(iIndex);
//
// int boneindex = Event.m_Effect[a].m_iEffectBoneIndex;
// WzVector vPos=vArrowPos;
// GameFunc::GetBonePos(m_pUnitDraw,boneindex,&vPos);
//
//
// m_EffectParam[iIndex].hEffect= GlobalFunc::CreateEffectBeUpToOption(Event.m_Effect[a].m_wiEffectWzID,vPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
// m_EffectParam[iIndex].iBoneIndex = boneindex;
// }
// }
// }
// }
//
// m_dwDelay += dwTick;
//
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
//
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
//
//
// WzVector vScale;
//
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
//
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// }
// }
//
// m_bUpdated = TRUE;
//
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/4;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// m_wzColor = WzColor_RGBA(255,255,255,Alpha);
// }
// }
//
// if (fRate >= 1.0f)
// {
// return TRUE;
// }
//
// return FALSE;
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileAttachmentWeapon::cProjectileAttachmentWeapon()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION );
//}
//
//BOOL cProjectileAttachmentWeapon::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
//
// if (m_pUnitDraw)
// {
// m_fAngleZ+=(WZ_PI/170.0f* dwTick);
//
// // 뉘어 돌리기
// ClampAngle(&m_fAngleZ);
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(0.0f,WZ_PI / 2.0f,m_fAngleZ);
// m_pUnitDraw->SetScale(1.2f,1.2f,1.2f);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/2;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// WzColor color=pBody->GetColor();
//
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
//
// float fAlpha=Alpha_WzColor(color);
//
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// color = WzColor_RGBA(Red_WzColor(color),Green_WzColor(color),Blue_WzColor(color),Alpha);
// pBody->SetColor(color);
//
// }
// }
//
//
// }
// }
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// ProcessDamageGroup();
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime)
// {
//
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime = 0;
// }
// }
// }
//
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// if(m_Param.EndeffectID)
// {
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
// m_Param.EndeffectID=0;
// }
// return TRUE;
// }
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//// 베지어 곡선을 그리는 발사체
//cProjectileBezier::cProjectileBezier()
//{
//
//}
//
//BOOL cProjectileBezier::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// //베지어 기저식
// vArrowPos = m_Param.vStartPos *((1.0f - fRate)*(1.0f - fRate)*(1.0f - fRate)) +
// m_Param.BEZIER.vPos0*fRate*3*((1.0f - fRate)*(1.0f - fRate))+
// m_Param.BEZIER.vPos1*3*fRate*fRate*(1.0f - fRate)+
// +m_Param.vTargetPos * (fRate*fRate*fRate);
//
// float fNextRate=fRate+0.1f;
// min(fNextRate,1.0f);
//
// WzVector vNextArrowPos= m_Param.vStartPos *((1.0f - fNextRate)*(1.0f - fNextRate)*(1.0f - fNextRate)) +
// m_Param.BEZIER.vPos0*fNextRate*3*((1.0f - fNextRate)*(1.0f - fNextRate))+
// m_Param.BEZIER.vPos1*3*fNextRate*fNextRate*(1.0f - fNextRate)+
// +m_Param.vTargetPos * (fNextRate*fNextRate*fNextRate);
//
// vDest = vNextArrowPos - vArrowPos;//이전 위치에서 현재 위치로 계산하자.
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength); //최종 목적지가 아닌 현재 목적지로 꺽자
// fArrowAngleZ = Math_GetAngleFromVector(&vDest); //최종 목적지가 아닌 현재 목적지로 꺽자
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// if(m_pMesh)
// {
// m_pMesh->m_pVertices[0] = vNewEndPos;
// m_pMesh->m_pVertices[1] = vNewPos;
// m_pMesh->m_pVertices[2] = vNewEndPos2;
// m_pMesh->m_pVertices[3] = vNewPos;
// m_pMesh->m_pVertices[4] = vNewPos2;
// m_pMesh->m_pVertices[5] = vNewEndPos2;
//
// WzVector vArrowDir = vDestPos - vCurPos;
//
// VectorNormalize(&vArrowDir,&vArrowDir);
//
// WzVector vTrailOffset = vArrowDir * -0.3f;
//
// for (int a = 0; a < 6; a++)
// {
// m_pMesh->m_pVertices[a] = m_pMesh->m_pVertices[a] + vTrailOffset;
// }
// }
//
// if (m_pUnitDraw)
// {
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(fArrowAngleX,0,fArrowAngleZ);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/2;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// WzColor color=pBody->GetColor();
//
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
//
// float fAlpha=Alpha_WzColor(color);
//
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// color = WzColor_RGBA(Red_WzColor(color),Green_WzColor(color),Blue_WzColor(color),Alpha);
// pBody->SetColor(color);
// }
// }
// }
// }
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// ProcessDamageGroup();
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime)
// {
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime = 0;
// }
// }
// }
//
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// if(m_Param.EndeffectID)
// {
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
// m_Param.EndeffectID=0;
// }
// return TRUE;
// }
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileTroch::cProjectileTroch()
//{
//
//}
//
//BOOL cProjectileTroch::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera* pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// //베지어 기저식
// vArrowPos = m_Param.vStartPos *((1.0f - fRate)*(1.0f - fRate)*(1.0f - fRate)) +
// m_Param.BEZIER.vPos0*fRate*3*((1.0f - fRate)*(1.0f - fRate))+
// m_Param.BEZIER.vPos1*3*fRate*fRate*(1.0f - fRate)+
// +m_Param.vTargetPos * (fRate*fRate*fRate);
//
// float fNextRate=fRate+0.1f;
// min(fNextRate,1.0f);
//
// WzVector vNextArrowPos= m_Param.vStartPos *((1.0f - fNextRate)*(1.0f - fNextRate)*(1.0f - fNextRate)) +
// m_Param.BEZIER.vPos0*fNextRate*3*((1.0f - fNextRate)*(1.0f - fNextRate))+
// m_Param.BEZIER.vPos1*3*fNextRate*fNextRate*(1.0f - fNextRate)+
// +m_Param.vTargetPos * (fNextRate*fNextRate*fNextRate);
//
// vDest = vNextArrowPos - vArrowPos;//이전 위치에서 현재 위치로 계산하자.
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength); //최종 목적지가 아닌 현재 목적지로 꺽자
// fArrowAngleZ = Math_GetAngleFromVector(&vDest); //최종 목적지가 아닌 현재 목적지로 꺽자
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// if(m_pMesh)
// {
// m_pMesh->m_pVertices[0] = vNewEndPos;
// m_pMesh->m_pVertices[1] = vNewPos;
// m_pMesh->m_pVertices[2] = vNewEndPos2;
// m_pMesh->m_pVertices[3] = vNewPos;
// m_pMesh->m_pVertices[4] = vNewPos2;
// m_pMesh->m_pVertices[5] = vNewEndPos2;
//
// WzVector vArrowDir = vDestPos - vCurPos;
//
// VectorNormalize(&vArrowDir,&vArrowDir);
//
// WzVector vTrailOffset = vArrowDir * -0.3f;
//
// for (int a = 0; a < 6; a++)
// {
// m_pMesh->m_pVertices[a] = m_pMesh->m_pVertices[a] + vTrailOffset;
// }
// }
//
// if (m_pUnitDraw)
// {
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(fArrowAngleX,0,fArrowAngleZ);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/2;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// WzColor color=pBody->GetColor();
//
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
//
// float fAlpha=Alpha_WzColor(color);
//
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// color = WzColor_RGBA(Red_WzColor(color),Green_WzColor(color),Blue_WzColor(color),Alpha);
// pBody->SetColor(color);
// }
// }
// }
// }
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// ProcessDamageGroup();
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime)
// {
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime = 0;
// }
// }
// }
//
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// if(m_Param.EndeffectID)
// {
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
// m_Param.EndeffectID=0;
// }
//
// if( g_pHero->GetObjectKey() == m_Param.dwOwner )
// {
// GlobalFunc::NET_SEND_CG_ITEM_USE_SKILL_ACTION_SYN(eITEMTYPE_TORCH, vArrowPos);
// m_Param.dwOwner =0;
//
// // 횃불 지속 이펙트 나오기 전에 4방향으로 타는 이펙트 연출
// float fperRotAngle = 1.57f;
// for( int i = 0; i < 4 ; i++ )
// {
// WzMatrix wmRot;
// MatrixIdentity(&wmRot);
// MatrixRotationZ(&wmRot, fperRotAngle * (float) i);
//
// WzVector wvTransform;
// WzVector wvOffset;
// wvOffset.x = 2.0f;
// wvOffset.y = 2.0f;
// wvOffset.z = 0.0f;
// VectorTransformCoord(&wvTransform, &wvOffset,&wmRot);
//
// WzVector wvEffectPos;
// wvEffectPos.x = wvTransform.x + vArrowPos.x;
// wvEffectPos.y = wvTransform.y + vArrowPos.y;
// wvEffectPos.z = wvTransform.z + vArrowPos.z;
//
// WzVector wvRot;
// wvRot.x = 0.0f;
// wvRot.y = 0.0f;
// wvRot.z = fperRotAngle * (float) i;
//
// WzVector wvScale;
// wvScale.x = 1.0f;
// wvScale.y = 1.0f;
// wvScale.z = 1.0f;
// GlobalFunc::CreateEffectBeUpToOption(StrToWzID("E310"), wvEffectPos,wvScale,wvRot);
// }
//
// GlobalFunc::CreateEffectBeUpToOption(StrToWzID("E310"), vArrowPos);
//
//
// }
// return TRUE;
// }
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectilePoisonDagger::cProjectilePoisonDagger()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_ARROW_POSITION );
//}
//
//BOOL cProjectilePoisonDagger::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// assert(m_Param.dwMoveTime);
//
// UpdateTargetPosition();
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// WzVector vPos0,vPos1,vPos2;
//
// if(m_Param.POISON_DAGGER.bReturn)
// {
// vPos0=m_Param.vTargetPos;
// vPos1=m_Param.POISON_DAGGER.vCtrl1;
// vPos2=m_Param.vStartPos;
// }
// else
// {
// vPos0=m_Param.vStartPos;
// vPos1=m_Param.POISON_DAGGER.vCtrl0;
// vPos2=m_Param.vTargetPos;
// }
//
// float u_1=fRate;
// float u_2=fRate*fRate;
// float u_3=u_2*u_1;
//
// //조절점 1개인 베지어 기저식
// float mu = fRate;
// vArrowPos= (vPos0 * (1 - mu) * (1 - mu) + vPos1* (1 - mu) * mu*2 + vPos2 * mu * mu);
//
// float fNextRate=fRate+0.1f;
// min(fNextRate,1.0f);
//
// u_1=fNextRate;
// u_2=fNextRate*fNextRate;
// u_3=fNextRate*u_1;
//
// mu = fNextRate;
// WzVector vNextArrowPos= (vPos0 * (1 - mu) * (1 - mu) + vPos1* (1 - mu) * mu*2 + vPos2 * mu * mu);
//
// vDest = vNextArrowPos - vArrowPos;//이전 위치에서 현재 위치로 계산하자.
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength); //최종 목적지가 아닌 현재 목적지로 꺽자
// fArrowAngleZ = Math_GetAngleFromVector(&vDest); //최종 목적지가 아닌 현재 목적지로 꺽자
//
// if(m_pUnitDraw)
// {
// m_fAngleZ+=(WZ_PI/180.0f*dwTick);
// ClampAngle(&m_fAngleZ);
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(0.0f,0.0f,m_fAngleZ);
// m_pUnitDraw->SetScale(1.5f,1.5f,1.5f);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// SetVector(&vRot,fArrowAngleX,0.0f,fArrowAngleZ);
//
// WzVector vScale;
// SetVector(&vScale,1.0f,1.0f,1.0f);
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
// }
// }
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if(!m_Param.POISON_DAGGER.bReturn)
// {
// //행위주체가 주인공일때는 흔들어준다.
// if (m_Param.dwOwner == g_pHero->GetObjectKey())
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(100,0.07f);
// }
// //!loop 이펙트 쓰지 말것
// GlobalFunc::CreateEffectBeUpToOption(StrToWzID("K849"),vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);
// ProcessDamageGroup();
// m_Param.POISON_DAGGER.bReturn = TRUE;
// m_Param.dwMoveTime = m_Param.POISON_DAGGER.dwSecondTime;
//
// m_dwDelay = 0;
// fRate = 0.0f;
// return FALSE;
//
// }
//
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime && m_Param.POISON_DAGGER.bReturn)
// {
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime = 0;
// }
// }
// }
//
//
// if (fRate >= 1.0f && m_Param.POISON_DAGGER.bReturn)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// if(m_Param.EndeffectID)
// {
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
// m_Param.EndeffectID=0;
// }
// return TRUE;
// }
// return FALSE;
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileAirBlow::cProjectileAirBlow()
//{
// SetTraceType( nProjectile::TRACE_TYPE_TARGET_TOP_POSITION );
//}
//
//BOOL cProjectileAirBlow::OnProcessProjectile( DWORD dwTick )
//{
// UpdateTargetPosition();
//
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
//
// if(m_pMesh)
// {
// m_pMesh->m_pVertices[0] = vNewEndPos;
// m_pMesh->m_pVertices[1] = vNewPos;
// m_pMesh->m_pVertices[2] = vNewEndPos2;
// m_pMesh->m_pVertices[3] = vNewPos;
// m_pMesh->m_pVertices[4] = vNewPos2;
// m_pMesh->m_pVertices[5] = vNewEndPos2;
//
//
//
// WzVector vArrowDir = vDestPos - vCurPos;
//
// VectorNormalize(&vArrowDir,&vArrowDir);
//
// WzVector vTrailOffset = vArrowDir * -0.3f;
//
// for (int a = 0; a < 6; a++)
// {
// m_pMesh->m_pVertices[a] = m_pMesh->m_pVertices[a] + vTrailOffset;
//
// }
// }
//
// if (m_pUnitDraw)
// {
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(fArrowAngleX,0,fArrowAngleZ);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = fArrowAngleX;
// vRot.y = 0.0f;
// vRot.z = fArrowAngleZ;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
//
// if(m_Param.bFadeOut)
// {
// DWORD alphaTime=m_Param.dwLifeTime/2;
// if(!alphaTime)
// alphaTime=1;
//
// DWORD startAlphaTime=m_Param.dwLifeTime-alphaTime;
//
// if(m_dwDelay>=startAlphaTime)
// {
// WzColor color=pBody->GetColor();
//
// float fRate = (float)(m_dwDelay-startAlphaTime) / (float) alphaTime;
//
// float alphaRate=1.0f-fRate;
//
// if(alphaRate<0.0f)
// {
// alphaRate=0.0f;
// }
//
// if(alphaRate>1.0f)
// {
// alphaRate=1.0f;
// }
//
// BYTE Alpha = (BYTE)(255 * alphaRate);
// color = WzColor_RGBA(Red_WzColor(color),Green_WzColor(color),Blue_WzColor(color),Alpha);
// }
// }
//
//
// }
// }
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// ProcessDamageGroup();
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime)
// {
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime=0;
// }
// }
// }
//
//
// Character* pTarget = (Character*)g_ObjectManager.GetObject( m_Param.dwTargetID );
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// if(m_Param.EndeffectID)
// {
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,vArrowPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
// m_Param.EndeffectID=0;
// }
//
// if(pTarget&&(pTarget->GetCurState()==STATE::AIR||pTarget->GetCurState()==STATE::GETUP))
// {
// pTarget->ToAirInfo(&m_Param.AIR_BLOW.TOAIR);
// }
//
// return TRUE;
// }
// return FALSE;
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileQuestPortal::cProjectileQuestPortal()
//{
//
//}
//
//BOOL cProjectileQuestPortal::OnProcessProjectile( DWORD dwTick )
//{
// //자신과 포탈과의 위치를 체크
// if(!g_pHero)
// return TRUE;
//
// //포탈과의 거리체크
// WzVector vDistance = g_pHero->GetVisiblePos()-m_Param.vStartPos;
// float fDistance = VectorLength(&vDistance);
//
// //거리가 0.8미터 이내일경우
// if (fDistance <= 0.8f)
// {
// //Client->Server: (퀘스트or미션)포탈에 진입하겠다는SYN
// MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN SendPacket;
// //포탈종류
// SendPacket.syncType = MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN::eSYNC_TEMP_PORTAL;
// //포탈키값
// SendPacket.portalKey = m_Param.QUEST_POTAL.portalKey;
// //맵코드
// SendPacket.mapEnterancePortalIndex = m_Param.QUEST_POTAL.enterableMapCode;
//
//#ifdef _LTJ_HERO_INFO_BUGFIX
// // no operation
//#else
// //주인공정보저장
// BattleScene::SaveHero(g_pHero);
//#endif
// GlobalFunc::SendPacket( CI_GAMESERVERIDX, (BYTE *)&SendPacket, sizeof(SendPacket));
// return TRUE;
//
// }
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vScale;
// SetVector(&vScale,1.0f,1.0f,1.0f);
// pBody->SetResultMatrix(m_Param.vStartPos,m_Param.vDir,vScale);
// }
// }
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileVitalSuction::cProjectileVitalSuction()
//{
//
//}
//
//BOOL cProjectileVitalSuction::OnProcessProjectile( DWORD dwTick )
//{
// // 몬스터의 시체에서 구슬이 떠오른후 플레이어에게 흡수되는 연출을 위한 발사체
//
// Character* pObj = (Character*)g_ObjectManager.GetObject(m_Param.dwTargetID);
// if(!pObj)
// return FALSE;
//
// WzVector vLen = pObj->GetArrowTargetPos() - m_Param.VITAL_SUCTION.vPos; // 목표와의 상대적 벡터
// float fLen = VectorLength(&vLen);
//
// m_dwDelay += dwTick;
//
// WzVector wvTemp;
// if(2000 > m_dwDelay)
// {
// WzVector wvUp;
// SetVector(&wvUp, 0.f, 0.f, 1.f);
// wvTemp = wvUp * (dwTick*m_Param.fSpeed);
//
// m_Param.VITAL_SUCTION.vPos = m_Param.VITAL_SUCTION.vPos + wvTemp;
// }
// else
// {
// WzVector axis; // 회전축
// VectorCrossProduct( &axis, &m_Param.vDir, &vLen );
//
// // 회전각 : 적당한 크기의 상수 각을 잡아 돌려준다.
// float theta = 0.002f * (float)dwTick;
//
// // 회전변환용 행렬 생성
// WzMatrix matRotAxis;
// MatrixRotation( &matRotAxis, &axis, theta );
//
// if(10.f < fLen)
// {
// WzVector vTemp = m_Param.vDir;
// VectorTransformCoord(&m_Param.vDir, &vTemp, &matRotAxis);
// }
// else
// {
// VectorNormalize(&m_Param.vDir, &vLen);
// }
//
// wvTemp = m_Param.vDir * (dwTick*m_Param.fSpeed);
// WzVector wvLenCheck = m_Param.VITAL_SUCTION.vPos + wvTemp;
// WzVector wvLen1, wvLen2;
// wvLen1 = wvLenCheck - m_Param.VITAL_SUCTION.vPos;
// wvLen2 = pObj->GetArrowTargetPos() - m_Param.VITAL_SUCTION.vPos;
// float fLen1 = VectorLength(&wvLen1);
// float fLen2 = VectorLength(&wvLen2);
// if(fLen1 > fLen2)
// m_Param.VITAL_SUCTION.vPos = pObj->GetArrowTargetPos();
// else
// m_Param.VITAL_SUCTION.vPos = m_Param.VITAL_SUCTION.vPos + wvTemp;
// }
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = 0.f;
// vRot.y = 0.f;
// vRot.z = 0.f;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
// pBody->SetResultMatrix(m_Param.VITAL_SUCTION.vPos, vRot, vScale);
// }
// }
//
// //////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////
//
// m_bUpdated = TRUE;
//
// // 발사체가 적에게 닿았으면
// vLen = pObj->GetArrowTargetPos() - m_Param.VITAL_SUCTION.vPos; // 목표와의 상대적 벡터
// fLen = VectorLength(&vLen);
// if((fLen <= 0.5f || m_dwDelay > m_Param.dwLifeTime) && (2000 < m_dwDelay))
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// if(m_Param.EndeffectID)
// {
//
// GlobalFunc::CreateEffectBeUpToOption(m_Param.EndeffectID,m_Param.VITAL_SUCTION.vPos,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
// m_Param.EndeffectID=0;
// }
//
// ProcessDamageGroup();
//
// return TRUE;
// }
//
// return FALSE;
//}
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileHPMPSuction::cProjectileHPMPSuction()
//{
//}
//
//BOOL cProjectileHPMPSuction::OnProcessProjectile( DWORD dwTick )
//{
// m_dwDelay += dwTick;
//
// //////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////
// Character* pPlayer = (Player*)g_ObjectManager.GetObject(m_Param.dwTargetID);
// Character* pMonster = (Character*)g_ObjectManager.GetObject(m_Param.dwOwner);
// if(NULL == pPlayer || NULL == pMonster)
// return TRUE;
//
// WzVector vLen = pPlayer->GetBonePos(14) - pMonster->GetArrowTargetPos(); // 목표와의 상대적 벡터
// float fLen = VectorLength(&vLen);
// WzVector vDir; VectorNormalize(&vDir, &vLen);
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
//#ifdef _YJ_SHADOW_SKILL_S00013
// pBody->SetAllElementTargetPos(pPlayer->GetBonePos(14));
//#endif //_YJ_SHADOW_SKILL_S00013
//
// if(m_dwDelay > (m_Param.dwLifeTime - 1000))
// {
// pBody->FadeOut();
// }
//
// //////////////////////////////////////////////////////////////////////////
//
// float fTemp = pPlayer->GetBonePos(14).z - pMonster->GetArrowTargetPos().z;
// WzVector vRot;
// vRot.x = atan2(fLen, fTemp);
// vRot.z = Math_GetAngleFromVector(&vDir);
// vRot.y = 0.f;//0.0f;
//
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// pBody->SetResultMatrix(pMonster->GetArrowTargetPos(), vRot, vScale);
// //////////////////////////////////////////////////////////////////////////
// }
// }
//
// //////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////
//
// m_bUpdated = TRUE;
//
// if(30.f < fLen)
// return TRUE;
//
// STATE::TYPE st = pPlayer->GetCurState();
// if(STATE::IDLE == st ||
// STATE::KEYBOARDMOVE == st ||
// STATE::JUMP == st ||
// STATE::DEATH == st ||
// STATE::DOWN == st ||
// STATE::GETUP == st ||
// STATE::SIT == st ||
// STATE::EMOTICON == st ||
// STATE::MOVE == st ||
// STATE::KEYBOARDJUMP == st)
// {
// return TRUE;
// }
//
// if( m_dwDelay > m_Param.dwLifeTime)
// {
// return TRUE;
// }
//
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileSwordWave::cProjectileSwordWave()
//{
//}
//
//BOOL cProjectileSwordWave::OnProcessProjectile( DWORD dwTick )
//{
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
// if (m_pUnitDraw)
// {
// m_pUnitDraw->SetPosition(vArrowPos,FALSE);
// m_pUnitDraw->SetRotation(fArrowAngleX,0,fArrowAngleZ);
// }
//
// m_dwDelay += dwTick;
//
// if (m_hEffect != INVALID_HANDLE_VALUE)
// {
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// WzVector vRot;
// vRot.x = 0;
// vRot.y = 0.0f;
// vRot.z = 0;
// WzVector vScale;
// vScale.x = 1.0f;
// vScale.y = 1.0f;
// vScale.z = 1.0f;
//
//
// if(m_Param.vScale != c_ZeroVector)
// {
// vScale=m_Param.vScale;
// }
//
// pBody->SetResultMatrix(vArrowPos,vRot,vScale);
// }
// }
//
// m_bUpdated = TRUE;
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
//
// return TRUE;
// }
// return FALSE;
//}
//
//
//////////////////////////////////////////////////////////////////////////////////////////
//cProjectileSwordTrail::cProjectileSwordTrail()
//{
//}
//
//BOOL cProjectileSwordTrail::OnProcessProjectile( DWORD dwTick )
//{
// m_dwDelay += dwTick;
//
// St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
//
// WzVector vTo = pCameraInfo->m_wvTo;
// WzVector vRight = pCameraInfo->m_wvRight;
// WzVector vDown = -pCameraInfo->m_wvUp;
// WzVector vDir = pCameraInfo->m_wvDir;
//
// assert(m_Param.dwMoveTime);
//
// float fRate;
//
// if(m_Param.dwMoveTime)
// fRate= (float)m_dwDelay / (float) m_Param.dwMoveTime;
// else
// fRate=0.0f;
//
// float fTrailRate = 1.0f - fRate;
// float fEndRate;
//
// fRate *= m_Param.fSpeed;
// fEndRate = fRate - m_Param.fTrailLength;
//
// if (fRate >= 1.0f)
// {
// fRate = 1.0f;
// }
//
// if (fEndRate <= 0.0f)
// {
// fEndRate = 0.0f;
// }
//
// if (fEndRate >= 1.0f)
// {
// fEndRate = 1.0f;
// }
//
// WzVector vArrowPos;
// WzVector vDest,vTemp;
// float fArrowAngleZ,fArrowAngleX;
//
// vDest = m_Param.vTargetPos - m_Param.vStartPos;
// vTemp = vDest;
// vTemp.z = 0.0f;
//
// float fLength;
//
// if (vTemp.x == 0.0f && vTemp.y == 0.0f)
// {
// fLength = 0.0f;
// }
// else
// {
// fLength = VectorLength(&vTemp);
// }
//
// fArrowAngleX = -atan2(vDest.z,fLength);
// fArrowAngleZ = Math_GetAngleFromVector(&vDest);
// vArrowPos = m_Param.vStartPos * (1.0f - fRate) + m_Param.vTargetPos * (fRate);
//
// WzVector vCurPos,vCurPos2,vDestPos,vDestPos2,vNewPos,vNewPos2,vNewEndPos,vNewEndPos2;
// vCurPos = vCurPos2 = m_Param.vStartPos;
// vDestPos = vDestPos2 = m_Param.vTargetPos;
//
// VectorNormalize(&vDest,&vDest);
// WzVector vDirection;
//
// VectorCrossProduct(&vDirection,&vDest,&vDir);
// VectorNormalize(&vDirection,&vDirection);
//
// WzVector CamPos = pCameraInfo->m_wvFrom;
// WzVector BeamSrc = m_Param.vStartPos;
// WzVector BeamDst = m_Param.vTargetPos;
//
// WzVector vBeamDir = BeamDst - BeamSrc;
// VectorNormalize(&vBeamDir,&vBeamDir);
// WzVector vBeamToCam = CamPos - BeamSrc;
// VectorNormalize(&vBeamToCam,&vBeamToCam);
// WzVector vBeamUp;
// vBeamUp.x = 0.0f;
// vBeamUp.y = 0.0f;
// vBeamUp.z = 1.0f;
//
// WzVector vCurrDir = vBeamToCam - vBeamDir;
//
// float fAngle = acos(VectorDotProduct(&vBeamUp,&vCurrDir));
//
// if (vCurrDir.x < 0)
// fAngle = fAngle;
// else if (vCurrDir.x > 0)
// fAngle = -fAngle;
// else
// fAngle = 0;
//
// WzMatrix matrix;
//
// VectorNormalize(&vCurrDir,&vCurrDir);
// MatrixRotation(&matrix,&vCurrDir,fAngle);
//
// vTemp.x = 0.0f;
// vTemp.y = 0.0f;
// vTemp.z = 1.0f;
//
// float fHeight = m_Param.fHeight * fTrailRate;
//
// vCurPos = vCurPos + vDirection * (fHeight / 2.0f);
// vCurPos2 = vCurPos2 - vDirection * (fHeight / 2.0f);
//
// vDestPos = vDestPos + vDirection * (fHeight / 2.0f);
// vDestPos2 = vDestPos2 - vDirection * (fHeight / 2.0f);
//
// vNewPos = vCurPos * (1.0f - fRate) + vDestPos * (fRate);
// vNewPos2 = vCurPos2 * (1.0f - fRate) + vDestPos2 * (fRate);
//
// vNewEndPos = vCurPos * (1.0f - fEndRate) + vDestPos * (fEndRate);
// vNewEndPos2 = vCurPos2 * (1.0f - fEndRate) + vDestPos2 * (fEndRate);
//
//
//
//
// m_bUpdated = TRUE;
//
// CEffectBody *pBody = g_pEffectManager->GetEffectPtrHandle(m_hEffect);
// if(pBody)
// {
// CEElementFlatChain* pFChain = pBody->GetFlatChainPtr();
// if( pFChain )
// {
//
// m_Param.SWORD_TRAIL.vEndPos =vArrowPos;
// m_Param.SWORD_TRAIL.vStartPos =m_Param.SWORD_TRAIL.vEndPos;
// m_Param.SWORD_TRAIL.vStartPos+=m_Param.SWORD_TRAIL.vAdditionalStartPos;
// m_Param.SWORD_TRAIL.vEndPos+=m_Param.SWORD_TRAIL.vAdditionalEndPos;
//
//
// WzVector dir=m_Param.SWORD_TRAIL.vDir;
// //Todo:컨버트 함수 만들자 귀찮다.
// vector3 dir2;
// dir2.x=dir.x;
// dir2.y=dir.z;
// dir2.z=dir.y;
// dir2.norm(); //z축
//
// vector3 up;
// up.set(0.0f,1.0f,0.0f);//y축
//
// vector3 temp=up*dir2;//x축
// WzVector inc;
// inc.x=temp.x;
// inc.y=temp.z;
// inc.z=temp.y;
//
//
// m_Param.SWORD_TRAIL.vEndPos +=inc;
// m_Param.SWORD_TRAIL.vStartPos-=inc;
//
// pFChain->SetPosition(m_Param.SWORD_TRAIL.vStartPos,m_Param.SWORD_TRAIL.vEndPos);
// }
//
// }
//
//
// if (m_Param.SWORD_TRAIL.dwTrailEffectDelay > 0)
// {
// if (m_dwDelay >= m_dwTrailEffectCount * m_Param.SWORD_TRAIL.dwTrailEffectDelay)
// {
// WzVector vResult;
//
// g_pMap->GetTerrainHeight(&vArrowPos,&vResult);
//
//
//
// GlobalFunc::CreateEffectBeUpToOption(StrToWzID("A030"),vResult,m_Param.dwOwner,m_Param.dwTargetID);//!loop 이펙트 쓰지 말것
//
//
// m_dwTrailEffectCount++;
// }
// }
//
// // 발사체가 적에게 닿았으면
// if(fRate >= 1.0f)
// {
// if (m_Param.bCameraShake)
// {
// m_Param.bCameraShake=FALSE;
// g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
// g_Camera.StartVibration(50,0.07f);
// }
//
// ProcessDamageGroup();
// }
//
// // 라이프 타임이 있을 경우엔 대체 한다.
// if(m_Param.dwLifeTime)
// {
// fRate = (float)m_dwDelay / (float) m_Param.dwLifeTime;
// }
//
// //데미지 시간이 있을경우는 바로 데미지 처리
// if(m_Param.dwDamageTime)
// {
// if(m_dwDelay>m_Param.dwDamageTime)
// {
//
// //데미지가 처리 되었으면
// if(ProcessDamageGroup())
// {
// m_Param.dwDamageTime=0;
// }
// }
// }
//
// if (fRate >= 1.0f)
// {
// // 데미지 처리를 한다.
// ProcessDamageGroup();
// return TRUE;
// }
//
//
// return FALSE;
//}