📄 gamezone.cpp
字号:
#include "StdAfx.h"
#include ".\gamezone.h"
#include ".\Map.h"
#include ".\MapAllocator.h"
#include ".\Field.h"
#include ".\Player.h"
#include "SummonManager.h"
#include "SummonedNPCs.h"
GameZone::GameZone(void):
m_pMap(NULL),
m_MapCode(0),
m_Key(0)
{
m_PlayerHash.Initialize( MAX_PARTYMEMBER_NUM*4 );
}
GameZone::~GameZone(void)
{
m_PlayerHash.RemoveAll();
}
VOID GameZone::Release()
{
ASSERT( m_pMap );
g_MapAllocator.FreeMap( m_pMap );
Player * pPlayer = NULL;
m_PlayerHash.SetFirst();
while( (pPlayer = m_PlayerHash.GetNext()) != NULL )
{
pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0 );
}
m_PlayerHash.RemoveAll();
}
VOID GameZone::Init( KEYTYPE Key, CODETYPE MapCode )
{
// 冯虐 悸泼
SetKey( Key );
SetMapCode( MapCode );
}
VOID GameZone::LoadMap( int iActiveFieldIndex )
{
// 甘 alloc
m_pMap = g_MapAllocator.AllocMap( GetMapCode(), iActiveFieldIndex ); //< 肋给等 备炼肺 牢茄 this passed -> 肺流篮 粮俊辑 贸府窍绰 巴捞...
ASSERT( m_pMap );
m_pMap->SetGameZone( this );
}
VOID GameZone::Update( DWORD dwDeltaTick )
{
ASSERT( m_pMap );
m_pMap->Update( dwDeltaTick );
}
VOID GameZone::Leave( Player * pPlayer )
{
DEBUG_CODE(
GameZone * pEnterZone = NULL;
CODETYPE EnterFieldCode = 0;
eZONE_STATE eRoomState = pPlayer->GetGameZone( pEnterZone, EnterFieldCode );
ASSERT( (eRoomState & ePRS_AT_ZONE) );
);
pPlayer->SaveStartLocation();
ASSERT( pPlayer->GetField() );
pPlayer->GetField()->LeaveField( pPlayer );
pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0 );
ASSERT( m_PlayerHash.GetData(pPlayer->GetObjectKey()) != NULL );
m_PlayerHash.Remove( pPlayer->GetObjectKey() );
}
VOID GameZone::Warp( Player * pPlayer, CODETYPE FieldCode, WzID AreaID )
{
GameZone * pEnterZone = NULL;
CODETYPE EnterFieldCode = 0;
eZONE_STATE eRoomState = pPlayer->GetGameZone( pEnterZone, EnterFieldCode );
ASSERT( (eRoomState & ePRS_AT_ZONE) );
if(pEnterZone) pEnterZone->Leave( pPlayer );
else
{
SUNLOG( eCRITICAL_LOG, "Warp()粮捞绝促.[%u][%u]", eRoomState, EnterFieldCode );
}
pPlayer->SetGameZone( ePRS_BEFORE_ENTER_ZONE, this, FieldCode, AreaID );
}
BOOL GameZone::Join( Player * pPlayer, CODETYPE FieldCode, WzID AreaID )
{
Field* pField = m_pMap->GetFieldx( FieldCode );
DEBUG_CODE( if( !pField ) { ASSERT( !"甸绢棵妨绰 镑俊 鞘靛啊 绝促" ); SUNLOG( eFULL_LOG, "[GameZone::Join] 甸绢棵妨绰 镑俊 鞘靛啊 绝促."); return FALSE; } );
WzVector wzVec;
if( AreaID == 0 )
{
wzVec = pPlayer->GetStartVector(pField);
//wzVec = pField->GetRandomStartingVector();
}
else
pField->GetAreaRandomVector(AreaID, wzVec);
if( FALSE == pField->EnterField( pPlayer, &wzVec ) )
{
SUNLOG( eCRITICAL_LOG, "[GameZone::Join] EnterField Error!!! ObjectKey[%d]", pPlayer->GetObjectKey());
SASSERT( NULL, "[坷幅]:EnterField坷幅!!" );
return FALSE;
}
ASSERT( m_PlayerHash.GetData(pPlayer->GetObjectKey()) == NULL );
m_PlayerHash.Add( pPlayer, pPlayer->GetObjectKey() );
return TRUE;
}
BOOL GameZone::CheckMapVersion( CODETYPE FieldCode, DWORD checksum )
{
return GetMap()->CheckMapVersion( FieldCode, checksum );
}
CODETYPE GameZone::GetEntryFieldCode()
{
ASSERT( m_pMap );
ASSERT( m_pMap->GetMapInfo() );
return m_pMap->GetMapInfo()->GetMapInfo()->FCode[0];
}
DWORD GameZone::GetEntryAreaID()
{
ASSERT( m_pMap );
ASSERT( m_pMap->GetMapInfo() );
return m_pMap->GetMapInfo()->GetMapInfo()->wStartAreaID;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -