Meine AiPet.cpp:
PHP Code:
// AIPet.cpp :
//
#include "stdafx.h"
#include "AIPet.h"
#include "lang.h"
#include "User.h"
#include "dpcoreclient.h"
extern CUserMng g_UserMng;
extern CDPCoreClient g_DPCoreClient;
enum
{
STATE_INIT = 1,
STATE_IDLE,
STATE_RAGE
};
BEGIN_AISTATE_MAP( CAIPet, CAIInterface )
ON_STATE( STATE_INIT , StateInit )
ON_STATE( STATE_IDLE , StateIdle )
ON_STATE( STATE_RAGE , StateRage )
END_AISTATE_MAP()
#define PETSTATE_IDLE 0
#define PETSTATE_TRACE 1
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __VM_0820
#ifndef __MEM_TRACE
#ifdef __VM_0819
MemPooler<CAIPet>* CAIPet::m_pPool = new MemPooler<CAIPet>( 128, "CAIPet" );
#else // __VM_0819
MemPooler<CAIPet>* CAIPet::m_pPool = new MemPooler<CAIPet>( 128 );
#endif // __VM_0819
#endif // __MEM_TRACE
#endif // __VM_0820
CAIPet::CAIPet()
{
Init();
}
CAIPet::CAIPet( CObj* pObj ) : CAIInterface( pObj )
{
Init();
}
CAIPet::~CAIPet()
{
Destroy();
}
void CAIPet::Init( void )
{
m_idOwner = NULL_ID;
m_bLootMove = FALSE;
m_idLootItem = NULL_ID;
m_nState = PETSTATE_IDLE;
#if __VER >= 12 // __PET_0519
m_dwSkillId = NULL_ID; //
m_idPetItem = NULL_ID; // ¸ÔÆê ¾ÆÀÌÅÛ
#endif // __PET_0519
}
void CAIPet::Destroy( void )
{
// ¿©±â´Ù Æı«Äڵ带 ³ÖÀ»°Í.
Init();
}
void CAIPet::InitAI()
{
PostAIMsg( AIMSG_SETSTATE, STATE_IDLE );
}
// vDstÂÊÀ¸·Î À̵¿.
void CAIPet::MoveToDst( D3DXVECTOR3 vDst )
{
CMover* pMover = GetMover();
CWorld* pWorld = GetWorld();
pMover->SetDestPos( vDst );
pMover->m_nCorr = -1;
g_UserMng.AddSetDestPos( pMover, vDst, 1 );
}
// idTargetÂÊÀ¸·Î À̵¿.
void CAIPet::MoveToDst( OBJID idTarget )
{
CMover* pMover = GetMover();
if( pMover->GetDestId() == idTarget )
return;
pMover->SetDestObj( idTarget ); // ¸ñÇ¥¸¦ Àç¼³Á¤ÇØÁØ´Ù.
g_UserMng.AddMoverSetDestObj( (CMover*)pMover, idTarget );
}
// ±ÙóÀÇ ¾ÆÀÌÅÛÀ» ÁýÀ¸·¯ °£´Ù.
BOOL CAIPet::SubItemLoot( void )
{
#define FILTER_ENABLE 1
#define FILTER_PENYA 2
#define FILTER_ARMOR 4
#define FILTER_JEWELS 8
#define FILTER_FOOD 16
#define FILTER_WEAPON 32
#define FILTER_POTION 64
#define FILTER_QUEST 128
#define FILTER_REFRESHER 256
if( ((CUser*)pOwner)->m_dwPetfilter & FILTER_ENABLE )
{
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_PENYA) && pItem->GetProp()->dwItemKind1 == IK1_GOLD )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_ARMOR) && pItem->GetProp()->dwItemKind1 == IK1_ARMOR )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_JEWELS) && pItem->GetProp()->dwItemKind2 == IK2_JEWELRY )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_FOOD) && pItem->GetProp()->dwItemKind2 == IK2_FOOD )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_WEAPON) && pItem->GetProp()->dwItemKind1 == IK1_WEAPON )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_POTION) && pItem->GetProp()->dwItemKind2 == IK2_POTION )
b1 = FALSE;
if( (((CUser*pOwner)->m_dwPetfilter & FILTER_QUEST) && pItem->GetProp()->dwItemKind2 == IK2_GEM )
b1 = FALSE;
if( (((CUser*)pOwner)->m_dwPetfilter & FILTER_REFRESHER) && pItem->GetProp()->dwItemKind2 == IK2_REFRESHER )
b1 = FALSE;
}
if( pOwner->IsLoot( pItem, TRUE ) && b1 )
CMover* pMover = GetMover();
CMover* pOwner = prj.GetMover( m_idOwner );
CWorld* pWorld = GetWorld();
MoverProp *pProp = pMover->GetProp();
D3DXVECTOR3 vPos = pMover->GetPos();
CObj *pObj = NULL;
int nRange = 0;
D3DXVECTOR3 vDist;
FLOAT fDistSq, fMinDist = 9999999.0f;
CObj *pMinObj = NULL;
vDist = pOwner->GetPos() - pMover->GetPos();
fDistSq = D3DXVec3LengthSq( &vDist );
if( fDistSq > 32.0f * 32.0f ) // ÁÖÀδ԰úÀÇ °Å¸®°¡ 32¹ÌÅÍ°¡ ³ÑÀ¸¸é ¾ÆÀÌÅÛ ¾ÈÁý´Â´Ù.
return FALSE;
if( pOwner && pOwner->IsFly() )
return FALSE;
// ±ÙóÀÇ ¾ÆÀÌÅÛÀ» °Ë»öÇÔ. - ÁÖÀδԲ¨¸¸ °Ë»öÇؾßÇÒµí...
FOR_LINKMAP( pWorld, vPos, pObj, nRange, CObj::linkDynamic, pMover->GetLayer() )
{
if( pObj->GetType() == OT_ITEM ) // ¾ÆÅÛ¸¸ °Ë»ö
{
CItem *pItem = (CItem *)pObj;
ItemProp* pItemProp = pItem->GetProp();
// ÀÌ°É µû·Î ³ÖÀºÀÌÀ¯´Â StateIdle ARRIVAL¿¡¼* DoLoot()ÇÏ°í ³*Á÷ÈÄ¿¡ ´Ù½Ã SubItemLoot()À» È£ÃâÇßÀ»¶§
// LootÇÑ ¾ÆÀÌÅÛÀÌ ¾ÆÁ÷ ¾ÈÁö¿öÁ®¼* ¿©±â¼* ¶Ç °Ë»öÀÌ µÇ´õ¶ó°í.. ±×·¡¼* Áߺ¹µÇ´Â ¾ÆÀÌÅÛÀº °Ë»ö ¾ÈµÇ°Ô °íÃĺôÙ.
// if( pItem->GetId() != m_idLootItem )
if( pItem->IsDelete() == FALSE )
{
if( pItemProp )
{
if( pOwner->IsLoot( pItem, TRUE ) ) // ·çÆõǴ¾ÆÀÌÅÛÀÎÁö °Ë»çÇÔ.
{
vDist = pObj->GetPos() - pMover->GetPos();
fDistSq = D3DXVec3LengthSq( &vDist ); // °Å¸® ±¸ÇÔ.
if( fDistSq < 15 * 15 && fDistSq < fMinDist ) // 10¹ÌÅÍ À̳»°í... °¡Àå °Å¸®°¡ °¡±î¿î ¾ÆÅÛÀ» ãÀ½.
pMinObj = pObj;
}
}
}
}
}
END_LINKMAP
if( pMinObj )
{
// Get object ID of the loot item
DWORD dwIdLootItem = ((CItem *)pMinObj)->GetId();
// Get the item obj
CCtrl *pCtrl = prj.GetCtrl( dwIdLootItem );
// if exists...
if( IsValidObj(pCtrl) )
{
MoveToDst( pMinObj->GetPos() ); // ¸ñÇ¥ÂÊÀ¸·Î À̵¿.
m_idLootItem = dwIdLootItem;
m_bLootMove = TRUE;
}
}
return m_bLootMove;
}
BOOL CAIPet::StateInit( const AIMSG & msg )
{
return TRUE;
}
BOOL CAIPet::MoveProcessIdle( const AIMSG & msg )
{
CMover *pMover = GetMover();
CMover *pOwner = prj.GetMover( m_idOwner );
CWorld *pWorld = GetWorld();
MoverProp *pProp = pMover->GetProp();
// µ¥¹ÌÁö »óÅ°ųª Á×¾úÀ» °æ¿ì À̵¿ ó¸® ¼öÇà ¾ÊÀ½
if( pMover->IsDie() || (pMover->m_pActMover->GetState() & OBJSTA_DMG_FLY_ALL) )
return FALSE;
if( NotOwnedPetInactivated() )
return FALSE;
if( m_bLootMove == FALSE ) // ·çÆÃÇÏ·¯ °¥¶© ¾Æ·¡ 󸮸¦ ÇÏ¸é ¾ÈµÇ±ßÁ¦...
{
// ÁÖÀδ԰úÀÇ °Å¸®°¡ ¸Ö¾îÁö¸é ÁÖÀδÔÂÊÀ¸·Î ´Þ·Á°£´Ù.
if( m_nState == PETSTATE_IDLE )
{
D3DXVECTOR3 vDist = pOwner->GetPos() - pMover->GetPos();
FLOAT fDistSq = D3DXVec3LengthSq( &vDist );
if( fDistSq > 1.0f * 1.0f )
{
MoveToDst( m_idOwner );
m_nState = PETSTATE_TRACE;
}
} else
if( m_nState == PETSTATE_TRACE )
{
if( pOwner->IsRangeObj( pMover, 0 ) == TRUE ) // ÁÖÀÎ´Ô °çÀ¸·Î ´Ù°¡°¬´Ù.
{
m_nState = PETSTATE_IDLE; // ´ë±â»óÅ·ΠÀüȯ
pMover->SendActMsg( OBJMSG_STOP ); // ¸ð¼Ç Á¤Áö
pMover->ClearDest(); // À̵¿¸ñÇ¥ Ŭ¸®¾î.
}
if( pMover->IsEmptyDest() ) // ¾Ë¼ö¾ø´Â ÀÌÀ¯·Î ÀÎÇØ À̵¿ÇÏÁö ¾Ê°í Á¦ÀÚ¸® ÀÖÀ¸¸é .
{
m_bLootMove = FALSE; // ÁýÀ¸·¯ °¡´ø°Å Ãë¼Ò.
m_idLootItem = NULL_ID;
m_nState = PETSTATE_IDLE;
}
}
}
// ¾ÆÀÌÅÛ ½ºÄµ/·çÆÃ
{
{
if( (pMover->GetCount() & 15) == 0 ) // °¡²û¾¿ ÁÖº¯À» ½ºÄµÇؼ*... ¼*¹ö´Ï±î 15°¡ 1ÃÊ
{
if( m_bLootMove == FALSE ) // ·çÆÃÇÏ·¯ °¡°í ÀÖÀ»¶§ ¶Ç üũÇÏ¸é ¾ÈŠ•
if( SubItemLoot() ) // ¾ÆÀÌÅÛÀ» ·çÆÃÇÔ.
m_nState = PETSTATE_IDLE; // ·çÆýÃÀÛÇßÀ¸¸é ´ë±â»óÅ·Π¹Ù²ã¾ßÇÔ.
}
}
if( m_bLootMove == TRUE )
{
CCtrl *pCtrl = prj.GetCtrl( m_idLootItem ); // ±×¾ÆÀÌÅÛÀÌ »ç¶óÁ³À»¼ö ÀÖÀ¸´Ï±î °Ë»çÇÔ.
if( IsInvalidObj(pCtrl) ) // ¾ÆÀÌÅÛ ÁýÀ¸·¯ À̵¿Áß¿¡ ¾ÆÅÛÀÌ ¾ø¾îÁö¸é
{
MoveToDst( pMover->GetPos() ); // Á¦ÀÚ¸®¿¡ ¼¶.
m_bLootMove = FALSE;
m_idLootItem = NULL_ID;
m_nState = PETSTATE_IDLE;
} else
{
if( pMover->IsEmptyDest() ) // ¾Ë¼ö¾ø´Â ÀÌÀ¯·Î ÀÎÇØ À̵¿ÇÏÁö ¾Ê°í Á¦ÀÚ¸® ÀÖÀ¸¸é .
{
m_bLootMove = FALSE; // ÁýÀ¸·¯ °¡´ø°Å Ãë¼Ò.
m_idLootItem = NULL_ID;
m_nState = PETSTATE_IDLE;
}
}
}
}
return TRUE;
}
BOOL CAIPet::StateIdle( const AIMSG & msg )
{
CMover* pMover = GetMover();
CWorld* pWorld = GetWorld();
BeginAIHandler( )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_INIT )
// SetStop( SEC( 0 ) );
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_INIT_TARGETCLEAR )
// m_dwIdTarget = NULL_ID;
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_PROCESS )
MoveProcessIdle( msg );
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_DAMAGE )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_DIE )
SendAIMsg( AIMSG_EXIT );
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_COLLISION )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_ARRIVAL )
{
if( m_bLootMove ) // ¾ÆÀÌÅÛ ·çÆøðµå¿´À½.
{
CMover *pOwner = prj.GetMover( m_idOwner );
if( IsValidObj(pOwner) )
{
BOOL bSuccess = FALSE;
CCtrl *pCtrl = prj.GetCtrl( m_idLootItem ); // ±×¾ÆÀÌÅÛÀÌ »ç¶óÁ³À»¼ö ÀÖÀ¸´Ï±î °Ë»çÇÔ.
if( IsValidObj(pCtrl) )
{
CItem *pItem = (CItem *)pCtrl;
D3DXVECTOR3 vDist = pCtrl->GetPos() - pMover->GetPos();
FLOAT fDistSq = D3DXVec3LengthSq( &vDist );
if( fDistSq < 5.0f * 5.0f ) // µµÂøÇؼ* °Å¸® °Ë»ç Çѹø´õ Çؼ*
{
if( pItem->IsDelete() )
return TRUE;
CItemElem* pItemElem = (CItemElem *)pItem->m_pItemBase;
ItemProp *pItemProp = pItem->GetProp();
// ÁÖÀÎÀÌ ¾ÆÀÌÅÛÀ» Áݴ°Ͱú °°Àº È¿°ú¸¦ ³¿.
bSuccess = pOwner->DoLoot( pItem );
}
}
if( bSuccess )
{
if( SubItemLoot() == FALSE ) // ¾ÆÀÌÅÛÁý°í ÁÖÀ§¸¦ Çѹø´õ ½ºÄµÇؼ* ¸ÔÀ»°Å ÀÖÀ¸¸é ´Ù½Ã°¡°í ¾øÀ¸¸é ÁÖÀο¡°Ô µ¹¾Æ°£´Ù.
{
m_bLootMove = FALSE; // this°¡ ¾ÆÀÌÅÛ Áý´ÂÁßÀ̶ó´Â°Å ÇØÁ¦.
m_idLootItem = NULL_ID;
}
} else
{
m_bLootMove = FALSE; // this°¡ ¾ÆÀÌÅÛ Áý´ÂÁßÀ̶ó´Â°Å ÇØÁ¦.
m_idLootItem = NULL_ID;
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_EXIT )
EndAIHandler( )
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CAIPet::MoveProcessRage( const AIMSG & msg )
{
CMover* pMover = GetMover();
CWorld* pWorld = GetWorld();
MoverProp *pProp = pMover->GetProp();
// µ¥¹ÌÁö »óÅ°ųª Á×¾úÀ» °æ¿ì À̵¿ ó¸® ¼öÇà ¾ÊÀ½
if( pMover->IsDie() || (pMover->m_pActMover->GetState() & OBJSTA_DMG_FLY_ALL) )
return FALSE;
return TRUE;
}
BOOL CAIPet::StateRage( const AIMSG & msg )
{
CMover* pMover = GetMover();
CWorld* pWorld = GetWorld();
if( IsInvalidObj(pMover) ) return FALSE;
BeginAIHandler( )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_INIT )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_INIT_TARGETCLEAR ) // Ÿ°ÙÀ» Ŭ¸®¾îÇÏ°í ´ë±â¸ðµå·Î µ¹¾Æ°¨.
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_PROCESS )
MoveProcessRage( msg );
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_DAMAGE )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_COLLISION )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_DIE )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_DSTDIE )
SendAIMsg( AIMSG_SETSTATE, STATE_IDLE );
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_BEGINMOVE )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_ARRIVAL )
///////////////////////////////////////////////////////////////////////////////////////////////////
OnMessage( AIMSG_EXIT )
// SendAIMsg( AIMSG_SETPROCESS, FALSE );
EndAIHandler( )
return TRUE;
}
BOOL CAIPet::NotOwnedPetInactivated( void )
{
CMover *pEatPet = GetMover();
CMover *pOwner = prj.GetMover( m_idOwner );
if( IsInvalidObj( pOwner ) )
{
pEatPet->Delete();
return TRUE;
}
/*#if __VER < 15 // __REACTIVATE_EATPET
if( pOwner->IsDie()
|| !pOwner->IsValidArea( pEatPet, 32 )
)
{
pOwner->InactivateEatPet();
return TRUE;
}
#else // __REACTIVATE_EATPET*/
if( pOwner->IsDie() )
{
pOwner->InactivateEatPet();
return TRUE;
}
else if( !pOwner->IsValidArea( pEatPet, 32 ) )
{
CItemElem* pItemElem = pOwner->GetVisPetItem();
pOwner->InactivateEatPet();
pOwner->ActivateEatPet(pItemElem);
return TRUE;
}
//#endif // __REACTIVATE_EATPET
return FALSE;
}
#if __VER >= 12 // __PET_0519
void CAIPet::SetItem( CMover* pPlayer, CItemElem* pItem )
{ // »ç¿ëÀÚ¿¡°Ô ¸ÔÆê °¢¼º È¿°ú Àû¿ë
m_idPetItem = pItem->m_dwObjId;
pPlayer->SetDestParamRandomOptExtension( pItem );
SetSkill( pPlayer, pItem->GetProp() ); // ÇöÀç »ç¿ë ¿¹ ¾øÀ½
// À±»óÀÌ ÀÌÀü ÀÛ¾÷ ºÎºÐÀ» ¸®ÆÑÅ丵Çϸé¼* ÀÌ°÷À¸·Î À̵¿ ½ÃÅ´
}
void CAIPet::SetSkill( CMover* pPlayer, ItemProp* Prop )
{ // ÇöÀç »ç¿ë ¿¹ ¾øÀ½
if( Prop->dwActiveSkill != NULL_ID )
{
SetSkillId( Prop->dwActiveSkill );
pPlayer->DoActiveSkill( Prop->dwActiveSkill, 1, pPlayer );
}
}
void CAIPet::ResetItem( void )
{ // ÁÖÀÎÀ¸·ÎºÎÅÍ ¸ÔÆê °¢¼º È¿°ú Á¦°Å
CMover* pPlayer = prj.GetMover( m_idOwner );
if( IsValidObj( pPlayer ) )
{
CItemElem* pItem = static_cast<CItemElem*>( pPlayer->GetItemId( m_idPetItem ) );
if( pItem && pItem->IsEatPet() )
{
pPlayer->ResetDestParamRandomOptExtension( pItem );
ResetSkill( pPlayer ); // »ç¿ë ¿¹ ¾øÀ½
}
}
m_idPetItem = NULL_ID;
}
void CAIPet::ResetSkill( CMover* pPlayer )
{ // »ç¿ë ¿¹ ¾øÀ½
if( GetSkillId() != NULL_ID && pPlayer->HasBuff( BUFF_SKILL, (WORD)( GetSkillId() ) ) )
pPlayer->RemoveBuff( BUFF_SKILL, (WORD)( GetSkillId() ) );
}
#endif // __PET_0519
Hier bekomme ich immer folgende errors:
PHP Code:
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(117): error C2065: 'pOwner' : undeclared identifier
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(117): error C2227: left of '->m_dwPetfilter' must point to class/struct/union
type is ''unknown-type''
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(119): error C2227: left of '->m_dwPetfilter' must point to class/struct/union
type is ''unknown-type''
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(119): error C2065: 'pItem' : undeclared identifier
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(119): error C3861: 'pOwner': identifier not found, even with argument-dependent lookup
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(120): error C2065: 'b1' : undeclared identifier
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(121): error C2227: left of '->m_dwPetfilter' must point to class/struct/union
type is ''unknown-type''
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(121): error C2227: left of '->GetPropA' must point to class/struct/union
type is ''unknown-type''
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(121): error C2227: left of '->dwItemKind1' must point to class/struct/union
F:\Sourcefiles\Source\_AIInterface\AIPet.cpp(121): error C3861: 'pOwner': identifier not found, even with argument-dependent lookup
Und so weiter .. <.<