亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? character.cpp

?? 奇跡世界 部分源代碼奇跡世界 部分源代碼奇跡世界 部分源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Character.cpp: implementation of the Character class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Character.h"
#include "FieldServer.h"
#include <3DEngine/3DTerrain/PathExplorer.h>
#include <3DEngine/3DTerrain/3DTerrain.h>
#include <3DEngine/3DTerrain/WorldBase.h>
#include <PublicMath.h>
#include "SinTable.h"
#include "FieldInfo.h"
#include "Field.h"
#include "AITypes.h"
#include "NPC.h"
#include "SummonedNPCs.h"
#include "Party.h"
#include "PartyManager.h"
#include "PartyState.h"
#include "Map.h"
#include "StatusManager.h"
#include "AbilityStatus.h"
#include "SkillInfoParser.h"
#include "SummonManager.h"
#include "SkillList.h"
#include "CharacterFormula.h"
#include <Global.h>
#include "float.h"
#include "AIParamParser.h"
#include "EtcStatus.h"
#include "StatusManager.h"
#include "RecoverStatus.h"
#include "Summoned.h"
#include "MoveStateControl.h"


class AIMessageSender
{
public :
	AIMessageSender(AI_MSG *pMsg, WORD wSize)
		: m_pMsg(pMsg), m_wSize(wSize)
	{
		ASSERT( pMsg != NULL );
		ASSERT( wSize > 0 );
	}

	BOOL		operator () ( Object* pObject )
	{
		Character* pCharacter = dynamic_cast<Character*>(pObject);
		ASSERT( pCharacter != NULL );

		pCharacter->SendAIMessage( m_pMsg, m_wSize );

		return TRUE;
	}

private :
	AI_MSG*		m_pMsg;
	WORD		m_wSize;
};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


Character::Character() : 
m_pWorld(NULL)
{
	SetObjectType( CHARACTER_OBJECT );
	// 辨茫扁 按眉 積己
	m_pPathExplorer = (CPathExplorer*)g_pGameServer->m_fnContactTerrain( CT_NEW_PATH_EXPLORER, 0);
	m_pStatusManager = new StatusManager( this );
	m_pSkillList = new SkillList;
	m_pMoveStateControl = new MoveStateControl;
}

Character::~Character()
{
	g_pGameServer->m_fnContactTerrain( CT_DELETE_PATH_EXPLORER, m_pPathExplorer );

	SAFE_DELETE( m_pSkillList );
	SAFE_DELETE( m_pStatusManager );
	SAFE_DELETE( m_pMoveStateControl );
}

BOOL Character::Init()
{
	ZeroMemory(m_iEnemySlot, sizeof(int)*MAX_ENEMYSLOT_NUM);

	m_PartyState.Init();

	// 膠懦包訪
	m_iShieldHP = 0;
	m_iShieldMP = 0;
	m_fShieldAbsorbRatio = 0;
	m_sFightingEnergyCount = 0;

	// 葷噶 版氰摹 頰秦
	m_dwDeadExp = 0;

	m_dwSummonerKey = 0;

	SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0 );

	return Object::Init();	
}

VOID Character::Release()
{
	m_Observers.RemoveAll();
	Object::Release();

	m_pSkillList->Release();
	m_pStatusManager->Release();
}

VOID Character::Update( DWORD dwDeltaTick )
{
	Object::Update( dwDeltaTick );
	
	DWORD curTick = GetTickCount();
	m_pStatusManager->Update( curTick );
	m_pSkillList->Update();
}
VOID Character::AddSkill( Skill * pSkill )
{
	m_pSkillList->Add( pSkill );
}
VOID Character::SetField(Field* pField)
{
	Object::SetField( pField );

	if( NULL == pField )
		m_pWorld = NULL;
	else
		m_pWorld = pField->GetFieldInfo()->GetWorldBase();
}


VOID Character::SetPos( WzVector* pwzVec )
{
	if( m_pWorld )
	{
		GetField()->SetActiveRoom();
		m_pWorld->PathExp_Reset( m_pPathExplorer, *pwzVec );	///< 恐 器牢磐肺 逞扁瘤 臼絆 藹闌 逞扁瘤??
	}
}

VOID Character::GetPos( WzVector * pWzVecOut ) const
{
	*pWzVecOut = m_pPathExplorer->GetPos();
}

WzVector Character::GetRandomPosInAround( INT iDist )
{
	WzVector pos = m_pPathExplorer->GetPos();
	RandomRangeVector( &pos, iDist );
	GetField()->SetActiveRoom();
	if( -1 == GetWorldBase()->x_pPathFinder->GetTileToStand( pos ) )
		return *m_pPathExplorer->GetPosPtr();
	return pos;
}

// 辨茫扁 版肺 汲瀝
BOOL Character::SetPath( WzVector *pwvCur, WzVector *pwvDest, int *pTileRoute, int iNumTileRoute )
{
	// 泅犁 諒釬啊 蠟瓤茄瘤 眉農
	if( !_finite(pwvCur->x) || !_finite(pwvCur->y) || !_finite(pwvCur->z) )
	{
		SUNLOG( eCRITICAL_LOG,  "[Character::SetPath] CurPos is Invalid! x[%f] y[%f] z[%f]", pwvCur->x, pwvCur->y, pwvCur->z );
		return FALSE;
	}

	// 格利瘤 諒釬啊 蠟瓤茄瘤 眉農
	if( !_finite(pwvDest->x) || !_finite(pwvDest->y) || !_finite(pwvDest->z) )
	{
		SUNLOG( eCRITICAL_LOG,  "[Character::SetPath] DestPos is Invalid! x[%f] y[%f] z[%f]", pwvDest->x, pwvDest->y, pwvDest->z );
		return FALSE;
	}

	SetPos( pwvCur );

	if ( iNumTileRoute <= 0 || !pTileRoute || !pwvDest || !m_pPathExplorer )
	{
		SUNLOG( eCRITICAL_LOG,  "[Character::SetPath] PathExp_SetPath 惑狼 頗扼固磐 撈惑 " );
		return FALSE;
	}

	for( int i = 0; i < iNumTileRoute; ++i )
	{
		if( pTileRoute[i] < 0 )
		{
			SUNLOG( eCRITICAL_LOG,  "[Character::SetPath] : iTile of pTileRoute < 0 " );
			return FALSE;
		}
	}

	GetField()->SetActiveRoom();
	if( !m_pWorld->PathExp_SetPath( m_pPathExplorer, pwvDest, pTileRoute, iNumTileRoute ) )
	{
		return FALSE;
	}

	return TRUE;
}

// 辨茫扁 薦青
BOOL Character::PathProgress( float fMove)
{
	Field *pField = GetField();
	if( !pField )
	{
		SUNLOG( eCRITICAL_LOG, "[PathProgress] Field is NULL" );
		return FALSE;
	}

	pField->SetActiveRoom();
	BOOL bRet = m_pWorld->PathExp_Progress( m_pPathExplorer, fMove );
	
	return bRet;	//fMove = 芭府 = 矯埃 * 加檔
}

VOID Character::StopMoving()
{
	m_pPathExplorer->Stop();
}

BOOL Character::IsMoving()
{
	return m_pPathExplorer->IsMoving();
}

/*
BOOL Character::CheckMapVersion(DWORD dwCheckSum)	// C/S 甘滾傈撈 老摹竅綽瘤 八葷
{
	if( m_pWorld->GetCheckSum() != dwCheckSum )
	{
		return FALSE;
	}
	else
	{
		if( 0 == dwCheckSum)
		{
			// 0牢 版快綽 備滾傈 甘!!
			return FALSE;
		}
		return TRUE;
	}
}
*/

DWORD Character::IncreaseHP( DWORD dwIncreament )
{
	DWORD hp = min( GetMaxHP(), int(GetHP() + dwIncreament) );
	SetHP( hp );

	m_pStatusManager->ChangeHP();

	return dwIncreament;
}

DWORD Character::DecreaseHP( DWORD dwDecrement )
{
	DWORD curHP = GetHP();

	if (curHP == 0)
	{
		return 0;
	}

	// 蔣靛俊 狼秦 規絹登綽 HP 薦摹甫 備茄促.
	ApplyMagicShield( dwDecrement );

	if( curHP <= dwDecrement )	// 巢籃 HP焊促 歹 腹撈 臨絹甸擱 磷綽芭促~
	{
		// 公利惑怕撈擱 磷瘤 臼綽促.
		if( IsStatus(eCHAR_STATE_ETC_UNDEAD) )
		{
			return 0;
		}
		else
		{
			SetHP( 0 );
			OnDead();
		}
	}
	else
	{
		DWORD hp = curHP - dwDecrement;
		SetHP( hp );
	}

	m_pStatusManager->ChangeHP();

	return dwDecrement;
}

DWORD Character::IncreaseMP( DWORD dwIncreament )
{
	DWORD mp = min( GetMaxMP(), int(GetMP() + dwIncreament) );
	SetMP( mp );

	return dwIncreament;
}

DWORD Character::DecreaseMP( DWORD dwDecrement )
{
	DWORD curMP = GetMP();
	if (curMP <= dwDecrement)
	{
		SetMP( 0 );		
	}
	else
	{
		DWORD mp = curMP - dwDecrement;
		SetMP( mp );
	}

	return dwDecrement;
}

VOID Character::ApplyMagicShield( DWORD &dwDecreaseHP )
{
	if( !m_iShieldMP || !m_iShieldHP )		return;

	// MP啊 何練竅擱 蔣靛啊 利儈 救等促.
	if( (int)GetMP() < m_iShieldMP )		return;

	int iShieldDecrement = min( (int)( dwDecreaseHP * m_fShieldAbsorbRatio ), m_iShieldHP );
	dwDecreaseHP = dwDecreaseHP > (DWORD)iShieldDecrement ? ( dwDecreaseHP - iShieldDecrement ) : 0;

	// 蔣靛HP甫 臨撈絆 MP甫 皚家矯挪促.
	m_iShieldHP = max( 0, m_iShieldHP - iShieldDecrement );
	SetMP( GetMP() - m_iShieldMP );

	// 蔣靛HP啊 0撈 登擱 概流蔣靛 惑怕甫 秦力茄促.
	if( m_iShieldHP )	return;

	m_pStatusManager->Remove( eCHAR_STATE_MAGIC_SHIELD );
}

int Character::AllocEnemySlot(WzVector *pwvEnemyPos, WzVector &wvResultPos, float fAreaRadius)
{
	// pwzVec甫 扁霖欄肺 啊厘 辟立茄 InitSlot甫 備秦霖促.
	WzVector vCurPos = m_pPathExplorer->GetPos();
	WzVector diffVec = *pwvEnemyPos - vCurPos;
	int CurAngle = Math_GetAngleFromVector2(&diffVec);
	int UnitAngle = 360 / MAX_ENEMYSLOT_NUM;
	int InitSlot = (int)(CurAngle / UnitAngle);
	int MidAngle = (int)(UnitAngle * (InitSlot + 0.5f));

	// InitSlot闌 扁霖欄肺 啊厘 厚絹樂綽 Position闌 且寸秦霖促.
	int MinEnemy = m_iEnemySlot[InitSlot];
	int MinSlot, NextSlot, PrevSlot;
	MinSlot = NextSlot = PrevSlot = InitSlot;

	for(int i = 0; i < MAX_ENEMYSLOT_NUM/4; i++)
	{
		if(CurAngle > MidAngle)
		{
			if(++NextSlot >= MAX_ENEMYSLOT_NUM)	NextSlot -= MAX_ENEMYSLOT_NUM;
			if(--PrevSlot < 0)					PrevSlot += MAX_ENEMYSLOT_NUM;
		}
		else
		{
			if(--NextSlot < 0)					NextSlot += MAX_ENEMYSLOT_NUM;
			if(++PrevSlot >= MAX_ENEMYSLOT_NUM)	PrevSlot -= MAX_ENEMYSLOT_NUM;
		}

		if(MinEnemy > m_iEnemySlot[NextSlot])	
		{
			MinSlot = NextSlot;
			MinEnemy = m_iEnemySlot[MinSlot];
		}
		if(MinEnemy > m_iEnemySlot[PrevSlot])	
		{
			MinSlot = PrevSlot;
			MinEnemy = m_iEnemySlot[MinSlot];
		}
	}

	// 葷儈竅霸 瞪 MinSlot狼 m_iEnemySlot甫 竅唱 疵妨霖促.
	++m_iEnemySlot[MinSlot];

	// 彌輛利欄肺 Enemy(閣膠磐)啊 卵酒具且 諒釬甫 悸潑秦霖促.
	WzVector vRelativePos;
	SetVector(&vRelativePos, FCOS(UnitAngle*MinSlot), FSIN(UnitAngle*MinSlot), 0);
	wvResultPos = vCurPos + vRelativePos*fAreaRadius;

	WzVector diffEnemyVec = wvResultPos - *pwvEnemyPos;
	float fMoveLength2 = Math_Vector2DLength2( &diffEnemyVec );
	if( fMoveLength2 < fAreaRadius * 0.2f * fAreaRadius * 0.2f )
		wvResultPos = vCurPos;

	return MinSlot;
}

VOID Character::FreeEnemySlot(int iSlot)
{
	if(iSlot == -1)		return;

	if(m_iEnemySlot[iSlot] <= 0)	
		return;

	--m_iEnemySlot[iSlot];
}


VOID						
Character::AddObserver(Character* pCharacter)				
{ 
	m_Observers.Add(pCharacter); 
}

VOID						
Character::RemoveObserver(DWORD dwObjKey)		
{ 
	m_Observers.Remove(dwObjKey); 
}

VOID
Character::SendToObservers( AI_MSG *pMsg, WORD wSize )
{
	AIMessageSender op( pMsg, wSize );

	m_Observers.Foreach( op );


	/*
	//////////////////////////////////////////////////////////////////////////	
	if( GetObjectType() == PLAYER_OBJECT &&	pMsg->dwMsgID == AI_MSG_ID_LEAVE_FIELD )
	{
		FILE *fp = fopen( "ObserverListOnLeaveField.txt", "at" );

		fprintf( fp, "Player(%d) ", GetObjectKey() );
		M_OBJECT_LIST_ITR it;
		for( it = m_Observers.begin(); it != m_Observers.end(); ++it )
		{			
			fprintf( fp, "%d ", it->first );			
		}
		fprintf( fp, "" );

		fclose( fp );
	}
	//////////////////////////////////////////////////////////////////////////
	*/
}

VOID Character::OnEnterField(Field* pField, WzVector* pwzVec)
{
	GetStatusManager()->SetCondition( eCHAR_CONDITION_STANDUP );

	Object::OnEnterField(pField, pwzVec);
}

VOID Character::OnLeaveField()
{
	ASSERT( GetObjectKey() != 0 );

	// 磊腳闌 器竊茄 牢立冀磐狼 NPC甸俊霸 pObject啊 鞘靛甫 棟車瀾闌 舅妨霖促.
	AI_MSG_LEAVE_FIELD AILeaveMsg;
	AILeaveMsg.dwObjectKey = GetObjectKey();
	SendToObservers( &AILeaveMsg, sizeof(AI_MSG_LEAVE_FIELD) );

	// 家券瀝焊俊輯 嘩霖促.
	SummonManager::Instance()->LeaveSummonNPCs( this );

	Object::OnLeaveField();
}

BOOL Character::OnDead()
{
	//m_Observers.RemoveAll();
	
	StopMoving();

	// 磷欄擱 葛電 Status甫 波拎具且鱉? --> 絆刮闌 秦焊磊. ;;

	// 磷欄擱 菩澄萍甫 利儈茄促.
	ApplyPenalty();

	return TRUE;
}

BOOL Character::OnResurrection( float fRecoverExp, float fRecoverHP, float fRecoverMP )
{
	if( IsAlive() )	return FALSE;

	// 頰秦夯 版氰摹 雀汗
	DWORD dwRecoverExp = (DWORD)( m_dwDeadExp * fRecoverExp );
	AddExp( dwRecoverExp );

	// HP, MP 雀汗
	DWORD dwRecoverHP = (DWORD)( GetMaxHP() * fRecoverHP );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色域天天综合网| 国产成人亚洲综合a∨婷婷图片| 日韩亚洲欧美成人一区| 17c精品麻豆一区二区免费| 91麻豆精品国产91久久久久久| 国产精品一二三在| 一区二区三区小说| 久久夜色精品国产欧美乱极品| 91免费视频网址| 亚洲美女视频在线观看| 久久久久久久久久久久久女国产乱| 99精品热视频| 免费观看日韩电影| 久久综合网色—综合色88| 在线看国产一区二区| 午夜国产不卡在线观看视频| 欧美国产精品一区| 91精品国产综合久久久久久久久久 | 欧美一区二区女人| 成人成人成人在线视频| 日韩高清不卡一区二区三区| 国产精品国产三级国产普通话三级 | 一区二区久久久| 久久久久国产精品麻豆| 欧美精选一区二区| av在线播放一区二区三区| 日本中文字幕一区二区有限公司| 亚洲欧洲韩国日本视频| 久久综合色一综合色88| 在线成人免费观看| 91福利小视频| 黄色日韩网站视频| 日韩成人av影视| 亚洲一区二区三区美女| 国产视频一区二区在线观看| 日韩欧美一区二区视频| 欧美日韩午夜在线| 色综合视频在线观看| 国产·精品毛片| 国产乱码精品一区二区三区av| 日韩综合一区二区| 中文字幕佐山爱一区二区免费| 日韩精品一区二区三区蜜臀 | 欧美v日韩v国产v| 在线视频国产一区| 日本精品一区二区三区四区的功能| 成人高清伦理免费影院在线观看| 国产高清精品久久久久| 国产精品影视天天线| 国产风韵犹存在线视精品| 精品一区二区三区免费播放| 麻豆国产一区二区| 天堂蜜桃91精品| 日韩精品成人一区二区三区| 国产盗摄一区二区| 国产九色精品成人porny | 成人综合婷婷国产精品久久蜜臀| 三级成人在线视频| 日韩专区欧美专区| 免费成人在线观看| 午夜视频在线观看一区二区| 日韩精品亚洲专区| 青青草伊人久久| 韩国一区二区在线观看| 一区二区三区在线观看网站| 日韩精品资源二区在线| 久久免费电影网| 中文字幕在线观看一区| 亚洲一区在线观看免费 | 亚洲国产三级在线| 免费高清视频精品| 国产不卡一区视频| 欧美三级中文字| 精品日韩在线观看| 亚洲人快播电影网| 亚洲香肠在线观看| 欧美日韩小视频| 99久久精品免费看国产免费软件| 国产精品色眯眯| 亚洲va天堂va国产va久| 国产中文一区二区三区| 色综合久久88色综合天天| 欧美一级淫片007| 精品日韩成人av| 视频在线观看91| 久久久99久久| 亚洲天堂免费在线观看视频| 五月激情丁香一区二区三区| 国产精品夜夜嗨| 欧美日韩视频第一区| 国产日韩欧美综合在线| 偷窥少妇高潮呻吟av久久免费| 国产精品一区二区你懂的| 欧美日韩在线直播| 欧美高清在线视频| 免费黄网站欧美| 在线精品视频一区二区三四| 久久麻豆一区二区| 日韩中文字幕亚洲一区二区va在线 | 国产精品一区二区三区99| 欧美日韩一区中文字幕| 国产精品短视频| 久久97超碰国产精品超碰| 欧美在线视频你懂得| 国产精品色呦呦| 国产综合成人久久大片91| 欧美精品视频www在线观看| 中文字幕亚洲综合久久菠萝蜜| 精东粉嫩av免费一区二区三区| 欧美伊人精品成人久久综合97| 亚洲成人自拍一区| 91日韩一区二区三区| 国产情人综合久久777777| 久久er99精品| 91.麻豆视频| 香蕉乱码成人久久天堂爱免费| 99re热视频这里只精品| 欧美激情一区三区| 韩国在线一区二区| 精品国产99国产精品| 日韩高清一区二区| 6080日韩午夜伦伦午夜伦| 亚洲一区在线免费观看| 91免费看`日韩一区二区| 国产精品免费看片| 大尺度一区二区| 亚洲国产精品99久久久久久久久 | 欧美一区二区三区精品| 亚洲图片有声小说| 欧美日韩黄色一区二区| 亚洲在线视频网站| 在线观看欧美黄色| 亚洲一区二区欧美激情| 色成年激情久久综合| 亚洲乱码中文字幕| 一本色道久久综合精品竹菊| 亚洲乱码精品一二三四区日韩在线| eeuss鲁一区二区三区| 1区2区3区精品视频| 91美女片黄在线观看| 不卡区在线中文字幕| 国产精品视频一区二区三区不卡| 国产成人综合视频| 中文欧美字幕免费| 一本高清dvd不卡在线观看| 亚洲美女在线国产| 欧美视频日韩视频在线观看| 亚洲成人1区2区| 91麻豆精品国产91久久久 | 午夜视频在线观看一区二区 | 欧美在线一区二区三区| 视频一区视频二区中文| 日韩一区二区麻豆国产| 久久99九九99精品| 国产午夜精品久久久久久免费视| 国产成人精品aa毛片| 综合久久一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 午夜婷婷国产麻豆精品| 精品国产一区二区三区久久影院 | 日韩精品国产欧美| 精品sm在线观看| kk眼镜猥琐国模调教系列一区二区| 亚洲色图一区二区三区| 在线观看免费一区| 蜜桃一区二区三区在线观看| 久久久一区二区三区捆绑**| 成人v精品蜜桃久久一区| 亚洲国产精品一区二区www在线| 91精品国产黑色紧身裤美女| 国产一区二区美女诱惑| 成人欧美一区二区三区黑人麻豆 | 久久久久久97三级| 日本电影欧美片| 美日韩黄色大片| 中文字幕一区二区三区四区| 免费成人你懂的| 日本丶国产丶欧美色综合| 另类综合日韩欧美亚洲| 国产精品久久久久久久久免费桃花 | 视频一区在线视频| 中文在线一区二区 | 中文字幕电影一区| 欧美日韩在线播放三区四区| 国产麻豆一精品一av一免费| 亚洲欧美另类在线| 日韩欧美电影一二三| 99国产精品视频免费观看| 秋霞午夜鲁丝一区二区老狼| 中文字幕第一区综合| 欧美欧美欧美欧美首页| 成人自拍视频在线观看| 三级亚洲高清视频| 亚洲视频在线观看三级| 欧美α欧美αv大片| 欧美视频精品在线观看| 不卡在线视频中文字幕| 美女视频免费一区| 一区二区三区四区不卡在线| 日日夜夜免费精品|