⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objectstatemanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// ObjectStateManager.cpp: implementation of the CObjectStateManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ObjectStateManager.h"
#include "ObjectManager.h"
#include "ObjectActionManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CObjectStateManager);
CObjectStateManager::CObjectStateManager()
{

}

CObjectStateManager::~CObjectStateManager()
{

}

void CObjectStateManager::InitObjectState(CObject* pObject) 
{
	BYTE State = pObject->m_BaseObjectInfo.ObjectState;
	if(State == eObjectState_Die)
	{
		if(pObject->GetObjectKind() & eObjectKind_Monster)
			pObject->GetEngineObject()->ChangeMotion(eMonsterMotion_Died);
		else if(pObject->GetObjectKind() & eObjectKind_Player)
			pObject->GetEngineObject()->ChangeMotion(eMotion_Died_Normal);

		//KES : 040726 ÇÇÅ·¾ÈµÇµµ·Ï Ãß°¡
		pObject->GetEngineObject()->DisablePick();
		return;
	}
	pObject->OnStartObjectState(State);
	pObject->SetState(State);
}

BOOL CObjectStateManager::StartObjectState(CObject* pObject,BYTE State) 
{
	switch(pObject->GetState())
	{		
	case eObjectState_Die:
		{
			// Áװųª °ÔÀÓÀ» ³¡³»´Â°Ç ¾ðÁ¦³ª °¡´ÉÇÏ´Ù.
			if( State != eObjectState_Exit )
			{
				char buf[256];
				sprintf(buf, "StartObjectState(NowState : %d, ChangeState : %d)", pObject->GetState(), State);
//				ASSERTMSG(0, buf);
			}
		}
		return FALSE;

	case eObjectState_Move:
		{
			EndObjectState(pObject,pObject->GetState());
		}
		break;
	case eObjectState_Tactic:
		if(State == eObjectState_Tactic)
			break;

	case eObjectState_Ungijosik:
	case eObjectState_Exchange:
	case eObjectState_StreetStall_Owner:
	case eObjectState_StreetStall_Guest:
	case eObjectState_Deal:
	case eObjectState_TiedUp:
		{ 
			// Áװųª °ÔÀÓÀ» ³¡³»´Â°Ç ¾ðÁ¦³ª °¡´ÉÇÏ´Ù.
			if( State != eObjectState_Die &&
				State != eObjectState_Exit &&
				pObject->GetID() == HERO->GetID())
			{
				char buf[256];
				sprintf(buf, "StartObjectState(NowState : %d, ChangeState : %d)", pObject->GetState(), State);
//				ASSERTMSG(0, buf);
			}
		}
		break;
	case eObjectState_Society:
		{
			//¼­±âÀ϶§¸¸ µû·Î ó¸®ÇÒ °ÍÀÌ ÇÊ¿äÇÏ´Ù.
			if( pObject->EndSocietyAct() == FALSE )
				return FALSE;
			else
				EndObjectState( pObject, pObject->GetState() );
		}
		break;
	default:
		break;
	}

	//ÀÓ½Ã
	if(pObject->GetState() == eObjectState_Ungijosik)
		pObject->OnEndObjectState(eObjectState_Ungijosik);

//	if( pObject->GetState() == eObjectState_Die )
//		return;

	pObject->OnStartObjectState(State);
	pObject->SetState(State);

	return TRUE;
}


void CObjectStateManager::EndObjectState(CObject* pObject,BYTE State,DWORD EndStateCount)
{
	if(pObject->GetState() != State) 
	{
		if( pObject->GetState() == eObjectState_Die )		//KESÃß°¡
		{
			return;	//Á×¾úÀ»¶§ noneÀ¸·Î ¹Ù²Ù´Â°ÍÀº ¿ë³³ÇÏÁö ¸øÇÑ´Ù!
		}

		if((pObject->GetState() == eObjectState_None) && (State == eObjectState_Ungijosik))
		{
		}
		else
		{
			char str[256];
			sprintf(str,"EndState Assert Cur:%d EndState:%d",pObject->GetState(),State);
			
//			ASSERTMSG(0,str);
		}
	}

	if(EndStateCount == 0)	// Áö±Ý Áï½Ã ³¡³½´Ù
	{
		pObject->SetState(eObjectState_None);
		pObject->OnEndObjectState(State);		//setstate()ÇϱâÀü¿¡ È£ÃâÇØ¾ßÇÑ´Ù.
	}
	else
	{
		pObject->m_ObjectState.State_End_Time = gCurTime + EndStateCount;
		pObject->m_ObjectState.bEndState = TRUE;
	}
}

void CObjectStateManager::StateProcess(CObject* pObject)
{
	if(pObject->m_ObjectState.bEndState)
	{
		if(pObject->m_ObjectState.State_End_Time < gCurTime)
		{
			EndObjectState(pObject,pObject->m_BaseObjectInfo.ObjectState);
		}
		else
		{
			// ³¡³»±â µ¿ÀÛÀ¸·Î Àüȯ
			DWORD RemainTime = pObject->m_ObjectState.State_End_Time - gCurTime;
			if(RemainTime <= pObject->m_ObjectState.State_End_MotionTime)
			{
				pObject->m_ObjectState.State_End_MotionTime = 0;
				if(pObject->m_ObjectState.State_End_Motion != -1)
					pObject->ChangeMotion(pObject->m_ObjectState.State_End_Motion,FALSE);
			}
		}
	}
}

BYTE CObjectStateManager::GetObjectState(CObject* pObject)
{
	ASSERT(pObject);
	return pObject->GetState();
}

BOOL CObjectStateManager::IsEndStateSetted(CObject* pObject)
{
	return pObject->m_ObjectState.bEndState;
}
/*
BOOL CObjectStateManager::CheckObjectState(CPlayer* pPlayer, BYTE State)
{
	BYTE CurState = pPlayer->GetState();

	switch(State)
	{
	case eObjectState_Ungijosik:
	case eObjectState_Exchange:
	case eObjectState_StreetStall_Owner:
		{
			if( CurState != eObjectState_None ) 
				return FALSE;
		}
		break;
	case eObjectState_SkillStart:
	case eObjectState_SkillSyn:
	case eObjectState_SkillBinding:
	case eObjectState_SkillUsing:
	case eObjectState_SkillDelay:
	case eObjectState_Deal:
	case eObjectState_StreetStall_Guest:
	case eObjectState_Tactic:
		{
			if( CurState != eObjectState_None &&
				CurState != eObjectState_Move ) 
				return FALSE;
		}
		break;
	default:
		return FALSE;
	}

	return TRUE;
}
*/

#define NOT_AVAILABLESTATE(a)		{	if(pObject->GetState() == (a))	return FALSE;	}
#define AVAILABLESTATE(a)			{	if(pObject->GetState() == (a))	return TRUE;	}

BOOL CObjectStateManager::CheckAvailableState(CObject* pObject,eCHECKAVAILABLESTATE cas)
{
	if( pObject->GetState() == eObjectState_Die )
	{
		//Á×Àº »óÅ¿¡¼­´Â ÀåÂøÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù.
		return FALSE;
	}

	ySWITCH(cas)
		yCASE(eCAS_EQUIPITEM)
			NOT_AVAILABLESTATE(eObjectState_SkillStart)
			NOT_AVAILABLESTATE(eObjectState_SkillSyn)
			NOT_AVAILABLESTATE(eObjectState_SkillBinding)
			NOT_AVAILABLESTATE(eObjectState_SkillUsing)
			NOT_AVAILABLESTATE(eObjectState_SkillDelay)
			return TRUE;
	yENDSWITCH

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -