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; }
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 ); } }
/** @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(); }