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

287 lines
8.5 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "ProjectileManagerEx.h"
#include "resourcemanager.h"
#include "Application.h"
#include "Hero.h"
#include "GameFunc.h"
#include "ObjectManager.h"
#include "SkillInfoParser.h"
#include "ProjectileInfoParser.h"
cProjectileManager g_ProjectileManagerEx;
cProjectileManager::cProjectileManager()
{
m_LastKey = 1;
m_hTrailTexture = INVALID_HANDLE_VALUE;
}
void cProjectileManager::Clear()
{
stdext::hash_map<DWORD, cProjectileBase*>::iterator it;
for( it = m_ProjectileMap.begin() ; it != m_ProjectileMap.end() ; ++it )
{
cProjectileBase* pProjectile = it->second;
pProjectile->Destroy();
delete pProjectile;
}
m_ProjectileMap.clear();
m_LastKey = 1;
}
BOOL cProjectileManager::DeleteProjectile( DWORD dwProjectileKey )
{
stdext::hash_map<DWORD, cProjectileBase*>::iterator it;
for( it = m_ProjectileMap.begin() ; it != m_ProjectileMap.end() ; ++it )
{
cProjectileBase* pProjectile = it->second;
if( pProjectile->GetKey() == dwProjectileKey )
{
m_ProjectileMap.erase(it);
pProjectile->Destroy();
delete pProjectile;
return TRUE;
}
}
return FALSE;
}
cProjectileBase* cProjectileManager::GetProjectile(DWORD dwKey)
{
stdext::hash_map<DWORD, cProjectileBase*>::iterator it = m_ProjectileMap.find( dwKey );
if (it == m_ProjectileMap.end())
{
return NULL;
}
else
{
return it->second;
}
}
void cProjectileManager::Process(DWORD dwTick)
{
stdext::hash_map<DWORD, cProjectileBase*>::iterator it = m_ProjectileMap.begin();
stdext::hash_map<DWORD, cProjectileBase*>::iterator delete_it;
while( it != m_ProjectileMap.end() )
{
cProjectileBase* pProjectile = it->second;
BOOL iskill = pProjectile->Process(dwTick);
if( iskill == TRUE )
{
delete_it = it;
++it;
m_ProjectileMap.erase(delete_it);
pProjectile->Destroy();
delete pProjectile;
}
else
{
++it;
}
}
}
void cProjectileManager::Render()
{
ENUM_CULL_FACE eCullFaceMode;
eCullFaceMode = g_pSunRenderer->GetCullFaceMode();
ENUM_ALPHABLEND eAlphablendMode = g_pSunRenderer->GetAlphaBlendMode();
g_pSunRenderer->SetAlphaBlendMode( AB_ALPHA, FALSE );
WzColor oldcolor = g_pSunRenderer->GetDiffuseColor();
g_pSunRenderer->SetCullFaceMode( CF_DRAW_ALL );
stdext::hash_map<DWORD, cProjectileBase*>::iterator it = m_ProjectileMap.begin();
while( it != m_ProjectileMap.end() )
{
cProjectileBase* pProjectile = it->second;
pProjectile->Render();
++it;
}
g_pSunRenderer->SetCullFaceMode( eCullFaceMode );
g_pSunRenderer->SetColor(oldcolor);
g_pSunRenderer->SetAlphaBlendMode( eAlphablendMode, FALSE );
}
void cProjectileManager::Init()
{
m_hTrailTexture = g_pSunRenderer->x_pManagerTexture->LoadTexture( "Data\\Arrow\\Alpha_Gradient.TGA" ,TLS_ORIGINAL_SIZE | TLS_NO_MULTITHREAD);
}
void cProjectileManager::Destroy()
{
if (m_hTrailTexture != INVALID_HANDLE_VALUE)
{
g_pSunRenderer->x_pManagerTexture->DestroyTexture( m_hTrailTexture );
m_hTrailTexture = INVALID_HANDLE_VALUE;
}
Clear();
}
HANDLE cProjectileManager::GetTrailTexture()
{
return m_hTrailTexture;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cProjectileManager::InsertProjectile(cProjectileBase* pProjectile)
{
DWORD dwProjectileKey = m_LastKey++;
pProjectile->SetKey( dwProjectileKey );
m_ProjectileMap.insert( std::pair<DWORD, cProjectileBase*>( dwProjectileKey, pProjectile ) );
}
cProjectileBase* cProjectileManager::CreateEffect( DWORD TargetID, WzID EffectID, DWORD LifeTime, const cTargetPosition& Position )
{
cProjectileChaseTarget* pProjectile = new cProjectileChaseTarget();
pProjectile->SetLifeTime( LifeTime );
pProjectile->SetPositionData( Position );
pProjectile->CreateEffect( EffectID, TargetID, TargetID );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileBase* cProjectileManager::CreatePortalForHero()
{
WzVector vPos = g_pHero->GetVisiblePos();
vPos += g_pHero->GetDirection() * 3.0f;
vPos = GameFunc::FindStandPosition( g_pHero->GetVisiblePos(), vPos);
vPos.z += 1.0f;
cTargetPosition Position;
Position.SetPosition( vPos );
cProjectilePortal* pProjectile = new cProjectilePortal();
pProjectile->SetLifeTime( 100000 );
pProjectile->SetTargetPosition( vPos );
pProjectile->CreateEffect( StrToWzID("O027"), g_pHero->GetObjectKey(), g_pHero->GetObjectKey() );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileBase* cProjectileManager::CreateQuestPortal( const WzVector& PortalPosition, DWORD OwenerKey, DWORD LifeTime, PORTALKEY PortalKey, MAPCODE MapCode )
{
WzVector p = PortalPosition;
if( Player* pPlayer = (Player*)g_ObjectManager.GetObject( OwenerKey ) )
{
p = pPlayer->GetVisiblePos();
p += pPlayer->GetDirection() * 1.5f;
p = GameFunc::FindStandPosition( pPlayer->GetVisiblePos(), p );
}
cProjectileQuestPortal* pProjectile = new cProjectileQuestPortal( OwenerKey, PortalKey, MapCode );
pProjectile->SetLifeTime( LifeTime );
pProjectile->SetTargetPosition( p );
pProjectile->CreateEffect( StrToWzID("A665"), OwenerKey, OwenerKey );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileBase* cProjectileManager::CreateFieldEffect( const WzVector& Position, WzID EffectID, DWORD LifeTime )
{
cProjectileChaseTarget* pProjectile = new cProjectileChaseTarget();
pProjectile->SetTargetPosition( Position );
pProjectile->SetLifeTime( LifeTime );
pProjectile->CreateEffect( EffectID, 0, 0 );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileBase* cProjectileManager::CreateFieldEffect( const WzVector& Position, WzID EffectID, DWORD LifeTime, WzID EndEffectID, DWORD DamageTime, DWORD ActiveDelay )
{
cProjectileChaseTarget* pProjectile = new cProjectileChaseTarget();
pProjectile->SetTargetPosition( Position );
pProjectile->SetLifeTime( LifeTime );
pProjectile->SetHitData( 0, 0, EndEffectID, FALSE, DamageTime, FALSE );
pProjectile->CreateEffect( EffectID, 0, 0 );
pProjectile->SetActiveDelayTime( ActiveDelay );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileBase* cProjectileManager::CreateMoveEffect( const WzVector& StartPosition, const WzVector& TargetPosition, WzID EffectID, DWORD LifeTime, DWORD AttackObjectKey, DWORD AttackSerial )
{
cProjectileUnit* pProjectile = new cProjectileUnit();
pProjectile->SetLifeTime( LifeTime );
pProjectile->SetArrowStartPosition( StartPosition );
pProjectile->SetArrowTargetPosition( TargetPosition );
pProjectile->CreateEffect( EffectID, 0, 0 );
pProjectile->SetHitData( AttackObjectKey, AttackSerial, 0, FALSE, 0, TRUE );
InsertProjectile( pProjectile );
return pProjectile;
}
cProjectileUnit* cProjectileManager::CreateSkillFlyingObject( Character* pCharacter, Character* pTarget, SkillScriptInfo* pSkillInfo )
{
if( pCharacter == NULL || pTarget == NULL || pSkillInfo == NULL )
return NULL;
//발사체코드 얻기
BASE_ProjectileInfo* pProjectileInfo = ProjectileInfoParser::Instance()->GetProjectileInfo(pSkillInfo->m_dwFlyingObjectCode);
if( pProjectileInfo == NULL )
return NULL;
float fSkillRange = ((float)pSkillInfo->m_wSkillRange / 10.0f);
float fRate = VectorLength(&(pTarget->GetVisiblePos() - pCharacter->GetVisiblePos()))/fSkillRange;
DWORD MoveTime = min(1200,max(200,(DWORD)(333.f*fRate/pProjectileInfo->m_fSpeed)));
cProjectileUnit* pProjectile = new cProjectileUnit();
pProjectile->SetArrowStartPosition( pCharacter->GetWeaponBonePos(0) );
pProjectile->SetArrowTargetObjectKey( pTarget->GetObjectKey(), TRUE );
pProjectile->SetLifeTime( MoveTime ); // 일단 대충
pProjectile->SetHitData( pCharacter->GetObjectKey(), pCharacter->GetCurrentAttackSerial(), pProjectileInfo->m_wzidHitEffectID.id, FALSE, 0, FALSE );
pProjectile->CreateEffect( pProjectileInfo->m_wzidFlyingEffectID.id, pCharacter->GetObjectKey(), pTarget->GetObjectKey() );
pProjectile->SetUnitCode( (eProjectile_SRC)pProjectileInfo->m_dwImageID );
if( pProjectileInfo->m_bMakeTrail == TRUE )
{
pProjectile->CreateTrail( m_hTrailTexture, 0.03f, 0.8f, 100, 150, 255 );
}
InsertProjectile( pProjectile );
return pProjectile;
}