コード例 #1
0
DWORD CManager::PumpHandler(DWORD size, void *data, 
		IHashString *name, IHashString *compType, MSGFUNCTION msgFunction)
{
	DWORD retVal;

	// default to not handled
	retVal = MSG_NOT_HANDLED;
	if ((m_bPumpEnabled) && (name != NULL))
	{
		if (compType == NULL)
		{
			// find name in obj list
			MAPGROUPLISTS *pGroupList = GetGroupList();
			MAPGROUPLISTS::iterator mglIter;
			for (mglIter = pGroupList->begin(); mglIter != pGroupList->end(); ++mglIter)
			{
				IDTOOBJECTMAP *ntom = mglIter->second;
				IDTOOBJECTMAP::iterator objIter;
				objIter = ntom->find(name->GetUniqueID());
				if (objIter != ntom->end())
				{
					IObject * destObject;
					destObject = objIter->second;
					//send the message to the child object
					retVal = (destObject->*msgFunction)(size, data);
					if (retVal != MSG_NOT_HANDLED)
					{
						break;
					}
				}
			}
		}
		else
		{
			// find name in obj list
			MAPGROUPLISTS *pGroupList = GetGroupList();
			MAPGROUPLISTS::iterator mglIter = pGroupList->find( compType->GetUniqueID() );
			if (mglIter != pGroupList->end())
			{
				IDTOOBJECTMAP *ntom = mglIter->second;
				IDTOOBJECTMAP::iterator objIter;
				objIter = ntom->find(name->GetUniqueID());
				if (objIter != ntom->end())
				{
					IObject * destObject;
					destObject = objIter->second;
					//send the message to the child object
					retVal = (destObject->*msgFunction)(size, data);
				}
			}
		}
	}
	return retVal;
}
コード例 #2
0
void CManager::UpdateProfiler( void )
{
	MAPGROUPLISTS *pGroupLists = GetGroupList();
	if (pGroupLists)
	{
		unsigned int iObjectCount = 0;
		MAPGROUPLISTS::iterator itrMaps = pGroupLists->begin();
		while (itrMaps != pGroupLists->end())
		{
			IDTOOBJECTMAP *pObjectMap = itrMaps->second;
			iObjectCount += (unsigned int)pObjectMap->size();
//			IDTOOBJECTMAP::iterator itrObjects = pObjectMap->begin();
//			while (itrObjects != pObjectMap->end())
//			{
//			}
			itrMaps++;
		}

		StdString szName = GetComponentType()->GetString();
		CHashString hszName(szName);
		CHashString hszType(_T("Object Counts"));
		PERFORMANCEPROFILERUPDATE msg;
		msg.name = &hszName;
		msg.time = (float)iObjectCount;
		msg.displayType = NAME_NUMBER;
		msg.type = &hszType;
		static DWORD msgHash_UpdatePerformanceProfiler = CHashString(_T("UpdatePerformanceProfiler")).GetUniqueID();
		EngineGetToolBox()->SendMessage(msgHash_UpdatePerformanceProfiler, sizeof(msg), &msg );
	}
}
コード例 #3
0
ファイル: XSkillUser.cpp プロジェクト: xahgo/tama
/**
 @brief 시전대상(혹은 시전좌표)를 기준으로 발동대상(혹은 발동좌표)을 얻는다.
 this는 시전자
*/
int XSkillUser::GetInvokeTarget( XVector<XSkillReceiver*> *_plistOutInvokeTarget,		// 결과를 이곳에 받습니다
																 XE::VEC2* pOutIvkTarget,		// 발동대상이 좌표형일경우 좌표가 담긴다.
																 const XSkillDat *pDat,
																 int level,
																 xtInvokeTarget typeIvkTarget,	// 발동대상
																 const EFFECT *pEffect,				// 효과.		
																 XSkillReceiver *pCastTarget,		// 시전대상
																 const XE::VEC2& vCastTarget )			// 시전대상이 좌표형일때
{
	// 좌표에 값이 있으면 타겟은 널이어야 한다.,
	XBREAK( vCastTarget.IsNotZero() && pCastTarget != nullptr );
	XBREAK( pCastTarget == nullptr && vCastTarget.IsZero() );
	// virtual. typeIvkTarget을 하위클래스에서 가공하기 위한 땜빵.
	typeIvkTarget = pCastTarget->OnGetInvokeTarget( pDat, pEffect, typeIvkTarget );
	//
	auto& aryTempInvokes = *_plistOutInvokeTarget;
	xtFriendshipFilt filtIvkFriendship = pEffect->invokefiltFriendship;
	if( filtIvkFriendship == xfNONESHIP )
		filtIvkFriendship = pEffect->castfiltFriendship;
	XBREAK( filtIvkFriendship == xfNONESHIP );
	//
	switch( typeIvkTarget ) {
	// 시전대상
	case xIVT_CAST_TARGET:
#pragma message("==========================피격자라는 발동대상이 필요하나?")
	case xIVT_ATTACKED_TARGET:	// 피격자. 이때는 pCastingTarget이 피격자가 된다.
#pragma message("==========================IsInvokeAble 이거 꼭 필요함?")
		if( pCastTarget ) {
			if( IsInvokeAble( pDat, pCastTarget, pEffect ) )
				aryTempInvokes.push_back( pCastTarget );
		} else {
			*pOutIvkTarget = vCastTarget;
		}
		break;
	case xIVT_CAST_TARGET_RADIUS:
	case xIVT_CAST_TARGET_SURROUND:
#pragma message("==========================피격자라는 발동대상이 필요하나?")
	case xIVT_ATTACKED_TARGET_RADIUS:
	case xIVT_ATTACKED_TARGET_SURROUND: {
	// 여기에 case를 추가시킨다면 아래 if에도 추가할것.
		XSkillUser *pCaster = this;
// 		XSkillReceiver *pInvoker = pCastTarget;
// 		if( pInvoker == nullptr || pInvoker->GetCamp() == 0/*xSIDE_NONE*/ )
// 			pInvoker = pCaster->GetThisRecv();
// 		XBREAK( pInvoker == nullptr );
		BIT bitSideSearchFilt = GetFilterSideInvoke( pCaster,
																								 pCastTarget,
																								 pEffect->invokeTarget,
																								 filtIvkFriendship );

		int numApply = pEffect->invokeNumApply;	// 0이면 제한없음.
		if( typeIvkTarget == xIVT_CAST_TARGET_RADIUS 
				|| typeIvkTarget == xIVT_ATTACKED_TARGET_RADIUS ) {
			if( pCastTarget ) {
				aryTempInvokes.Add( pCastTarget );
				if( numApply > 1 )
					--numApply;			// 시전대상은 포함시켰으므로 적용수가 있었다면 하나 빼준다. 적용수가 1이면 그냥 추가한마리로 처리함.
			}
		}
		// 발동자를 중심으로(발동자를 포함하거나/제외하거나) 반경내 sideSearchFilt에 해당하는
		// side편 대로 검색하여 invokeNumApply개의 리스트를 요청한다
		float size = pEffect->GetInvokeSize( level );
		if( size == 0 ) {
			size = pEffect->castSize.w;
		}
		size = pCaster->OnInvokeTargetSize( pDat, pEffect, level, pCastTarget, size );
		GetListObjsRadius( &aryTempInvokes,
											 pDat,
											 pEffect,
											 pCastTarget,		// 원의 중심이 되는 타겟
											 vCastTarget,			// 원의 중심 좌표
											 size,
											 bitSideSearchFilt,
											 numApply,
											 FALSE );
	} break;
	case xIVT_CAST_TARGET_PARTY:		// 시전대상파티
	case xIVT_ATTACKED_TARGET_PARTY: // 피격자파티
		if( XASSERT(pCastTarget) ) {
			// 기준타겟으로부터 그룹내 오브젝트들을 의뢰한다.
			pCastTarget->GetGroupList( &aryTempInvokes,
																 pDat,
																 pEffect );
		}
		break;
	case xIVT_CURR_TARGET: {
		// 현재 공격대상을 얻는다.(시전대상과 관계없이 현재 타겟을 얻는다)
		auto pCurrTarget = GetCurrTarget();  // virtual
		if( pCurrTarget && IsInvokeAble( pDat, pCurrTarget, pEffect ) )
			aryTempInvokes.push_back( pCurrTarget );
	} break;
	// 현재타겟좌표
	case xIVT_CURR_TARGET_POS: {
		auto pCurrTarget = GetCurrTarget();  // virtual
		if( pCurrTarget ) {
			*pOutIvkTarget = pCurrTarget->GetvPosFromSkill();
		}
	} break;
	// 타격자
	case xIVT_ATTACKER: {
		auto pAttacker = pCastTarget->GetpAttacker();
		if( pAttacker && IsInvokeAble( pDat, pAttacker, pEffect ) )
			aryTempInvokes.push_back( const_cast<XSkillReceiver*>( pAttacker ) );
	} break;
 	case xIVT_RANDOM_PARTY: {
		xtGroup typeGroup;
		if( filtIvkFriendship & xfALLY )
			typeGroup = xGT_RANDOM_PARTY_FRIENDLY;
		else
		if( filtIvkFriendship & xfHOSTILE )
			typeGroup = xGT_RANDOM_PARTY_ENEMY;
		auto pRecv = GetThisRecv();
		pRecv->GetGroupList( &aryTempInvokes,
												 pDat,
												 pEffect,
												 typeGroup );
 	} break;
	// 모두
	case xIVT_ALL: {
		xtGroup typeGroup;
		if( filtIvkFriendship & xfALLY )
			typeGroup = xGT_FRIENDLY_ALL;
		else
		if( filtIvkFriendship & xfHOSTILE )
			typeGroup = xGT_ENEMY_ALL;
		auto pRecv = GetThisRecv();
		pRecv->GetGroupList( &aryTempInvokes,
												 pDat,
												 pEffect,
												 typeGroup );

	} break;
	default:
		XBREAKF(1, "잘못된 발동파라메터:%d", typeIvkTarget );
		break;
	} // switch
	//
	if( aryTempInvokes.size() > 0 ) {
		// 현재 사용되는곳이 없는듯.
//		CustomInvokeFilter( _plistOutInvokeTarget, aryTempInvoker, pEffect );
		(*_plistOutInvokeTarget) = aryTempInvokes;
	}
	return _plistOutInvokeTarget->size();
}