der Titel sagt es ja schon. Würde gerne die Reichweite der Cs Pets erhöhen im Bezug auf das Aufheben der Items...weiß grad nicht genau wo das definiert war.
Könnte es die AIPet.cpp sein?
// 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 , &CAIPet::StateInit )
ON_STATE( STATE_IDLE , &CAIPet::StateIdle )
ON_STATE( STATE_RAGE , &CAIPet::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:
estroy( 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 )
{
CMover* pMover = GetMover();
CMover* pOwner = prj.GetMover( m_idOwner );
CWorld* pWorld = GetWorld();
MoverProp *pProp = pMover->GetProp();
D3DXVECTOR3 vPos = pMover->GetPos();
CObj *pObj = nullptr;
int nRange = 0;
D3DXVECTOR3 vDist;
FLOAT fDistSq, fMinDist = 9999999.0f;
CObj *pMinObj = nullptr;
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)
{
pMinObj = pObj;
fMinDist = fDistSq;
}
}
}
}
}
}
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 ) )
{
pOwner->InactivateEatPet();
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, GetSkillId()) )
pPlayer->RemoveBuff( BUFF_SKILL, GetSkillId() );
}
#endif // __PET_0519
//
#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 , &CAIPet::StateInit )
ON_STATE( STATE_IDLE , &CAIPet::StateIdle )
ON_STATE( STATE_RAGE , &CAIPet::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:
{
// ¿©±â´Ù ÆÄ±«Äڵ带 ³ÖÀ»°Í.
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 )
{
CMover* pMover = GetMover();
CMover* pOwner = prj.GetMover( m_idOwner );
CWorld* pWorld = GetWorld();
MoverProp *pProp = pMover->GetProp();
D3DXVECTOR3 vPos = pMover->GetPos();
CObj *pObj = nullptr;
int nRange = 0;
D3DXVECTOR3 vDist;
FLOAT fDistSq, fMinDist = 9999999.0f;
CObj *pMinObj = nullptr;
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)
{
pMinObj = pObj;
fMinDist = fDistSq;
}
}
}
}
}
}
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 ) )
{
pOwner->InactivateEatPet();
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, GetSkillId()) )
pPlayer->RemoveBuff( BUFF_SKILL, GetSkillId() );
}
#endif // __PET_0519
Kann mir einer die Info geben?
mfg bloody2009






