📄 friendfinder.h
字号:
#pragma once
#include "Character.h"
// 拳老捞抚 官层具 茄促. -_-;
//--------------------------------------------------------------------------------------------------------------
//
// CharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 漂沥 惑怕狼 某腐磐甫 茫绰促.
class CharacterFinder
{
public :
CharacterFinder()
{
Init();
}
VOID Init()
{
m_pOwner = NULL;
m_SkillCode = SKILLCODE_INVALID;
m_pTargetCharacter = NULL;
m_Value = 0;
}
virtual VOID SetOwner( Character* pOwner ) { m_pOwner = pOwner; }
VOID SetSkillCode(CODETYPE skillCode) { m_SkillCode = skillCode; }
VOID SetValue( DWORD value ) { m_Value = value; }
// 搬苞
Character* GetTargetCharacter() { return m_pTargetCharacter; }
virtual bool operator () (Object* pObject) = 0;
protected :
Character* m_pOwner;
CODETYPE m_SkillCode;
Character* m_pTargetCharacter;
DWORD m_Value; // TODO: 捞芭绰 SkillCode俊辑 佬绢客具 且淀.
};
//--------------------------------------------------------------------------------------------------------------
//
// WeakestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 啊厘 眉仿捞 利篮 某腐磐 茫扁
class WeakestCharacterFinder : public CharacterFinder
{
public :
virtual bool operator () (Object* pObject)
{
ASSERT( pObject != NULL );
ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );
Character* pCharacter = dynamic_cast<Character*>(pObject);
ASSERT( pCharacter != NULL );
DWORD dwMaxHP = max( 1, pCharacter->GetMaxHP() );
DWORD RemainPercent = pCharacter->GetHP() * 100 / dwMaxHP;
DWORD TargetRemainPercent = 100;
if( m_pTargetCharacter )
{
DWORD dwMaxHP = max( 1, m_pTargetCharacter->GetMaxHP() );
TargetRemainPercent = m_pTargetCharacter->GetHP() * 100 / dwMaxHP;
}
if ( pCharacter->IsAlive()
&& ( m_pTargetCharacter==NULL || RemainPercent < TargetRemainPercent ) )
{
m_pTargetCharacter = pCharacter;
}
// not found --> continue
return false;
}
};
//--------------------------------------------------------------------------------------------------------------
//
// DoBuffCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 滚橇甫 吧绢临父茄 某腐磐 茫扁
class DoBuffCharacterFinder : public CharacterFinder
{
public :
virtual bool operator () (Object* pObject)
{
ASSERT( pObject != NULL );
ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );
Character* pCharacter = dynamic_cast<Character*>(pObject);
ASSERT( pCharacter != NULL );
if (m_pTargetCharacter==NULL
&& pCharacter->IsAlive())// && !m_pTargetCharacter->HasBuff(m_SkillCode) )
{
m_pTargetCharacter = pCharacter;
return true;
}
// not found --> continue
return false;
}
};
//--------------------------------------------------------------------------------------------------------------
//
// DeadCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 磷篮 某腐磐 茫扁
class DeadCharacterFinder : public CharacterFinder
{
public :
bool operator () (Object* pObject)
{
ASSERT( pObject != NULL );
ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );
Character* pCharacter = dynamic_cast<Character*>(pObject);
ASSERT( pCharacter != NULL );
if (m_pOwner != pCharacter
&& !pCharacter->IsAlive())
{
m_pTargetCharacter = pCharacter;
// found! --> break
return true;
}
// not found --> continue
return false;
}
};
//--------------------------------------------------------------------------------------------------------------
//
// NearestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
class NearestCharacterFinder : public CharacterFinder
{
public :
NearestCharacterFinder() : m_eTargetType(SKILL_TARGET_NONE)
{
}
bool operator () (Object* pObject)
{
Character* pTarget = dynamic_cast<Character*>(pObject);
if( !pTarget ) return false;
float fDist = pTarget->GetDist( m_AttackerPos );
if( m_pOwner == pTarget ) return false;
if( pTarget->IsDead() ) return false;
if( fDist >= m_AttackerSight ) return false;
if( m_pTargetCharacter!=NULL && fDist >= m_TargetDist ) return false;
if( !m_pOwner->IsCoincidentWithTargetType( pTarget, m_eTargetType ) ) return false;
m_pTargetCharacter = pTarget;
m_TargetDist = fDist;
return false;
}
virtual VOID SetOwner( Character* pAttacker )
{
CharacterFinder::SetOwner(pAttacker);
ASSERT( pAttacker != NULL );
pAttacker->GetPos( &m_AttackerPos );
m_AttackerSight = pAttacker->GetSightRange();
}
virtual VOID SetTargetType( eSKILL_TARGET_TYPE eType )
{
m_eTargetType = eType;
}
private :
float m_AttackerSight;
WzVector m_AttackerPos;
float m_TargetDist;
eSKILL_TARGET_TYPE m_eTargetType; // 茫酒具且 鸥百 鸥涝
};
//--------------------------------------------------------------------------------------------------------------
//
// NearestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
class SameObjectKeyFinder : public CharacterFinder
{
public :
SameObjectKeyFinder()
{
}
bool operator () (Object* pObject)
{
Character* pCharacter = dynamic_cast<Character*>(pObject);
ASSERT( pCharacter != NULL );
if (pObject->GetObjectKey() == m_Value)
{
m_pTargetCharacter = pCharacter;
return true;
}
// not found --> continue
return false;
}
};
//--------------------------------------------------------------------------------------------------------------
//
// SelfCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 唱甫 茫绰促.
class SelfCharacterFinder : public CharacterFinder
{
public :
SelfCharacterFinder()
{
}
bool operator () (Object* pObject)
{
ASSERT(m_pOwner != NULL);
m_pTargetCharacter = m_pOwner;
return true;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -