bool GTAfunc_ProcessLineOfSight ( CVector *vecStart, CVector *vecEnd, CColPoint **colCollision, CEntitySAInterface **CollisionEntity, bool bCheckBuildings, bool bCheckVehicles, bool bCheckPeds, bool bCheckObjects, bool bCheckDummies, bool bSeeThroughStuff, bool bIgnoreSomeObjectsForCamera, bool bShootThroughStuff ) { DWORD dwPadding[100]; // stops the function missbehaving and overwriting the return address dwPadding[0] = 0; // prevent the warning and eventual compiler optimizations from removing it CColPointSA *pColPointSA = new CColPointSA(); CColPointSAInterface *pColPointSAInterface = pColPointSA->GetInterface(); //DWORD targetEntity; CEntitySAInterface *targetEntity = NULL; bool bReturn = false; DWORD dwFunc = FUNC_ProcessLineOfSight; __asm { push bShootThroughStuff push bIgnoreSomeObjectsForCamera push bSeeThroughStuff push bCheckDummies push bCheckObjects push bCheckPeds push bCheckVehicles push bCheckBuildings lea eax, targetEntity push eax push pColPointSAInterface push vecEnd push vecStart call dwFunc mov bReturn, al add esp, 0x30 } // hacky method to point to CEntitySA instead of the above *CollisionEntity = targetEntity; if ( colCollision ) *colCollision = pColPointSA; else pColPointSA->Destroy(); return bReturn; }
bool CWorldSA::ProcessLineOfSight(const CVector * vecStart, const CVector * vecEnd, CColPoint ** colCollision, CEntity ** CollisionEntity, const SLineOfSightFlags flags, SLineOfSightBuildingResult* pBuildingResult ) { DEBUG_TRACE("VOID CWorldSA::ProcessLineOfSight(CVector * vecStart, CVector * vecEnd, CColPoint * colCollision, CEntity * CollisionEntity)"); DWORD dwPadding[100]; // stops the function missbehaving and overwriting the return address dwPadding [0] = 0; // prevent the warning and eventual compiler optimizations from removing it CColPointSA * pColPointSA = new CColPointSA(); CColPointSAInterface * pColPointSAInterface = pColPointSA->GetInterface(); //DWORD targetEntity; CEntitySAInterface * targetEntity = NULL; bool bReturn = false; DWORD dwFunc = FUNC_ProcessLineOfSight; // bool bCheckBuildings = true, bool bCheckVehicles = true, bool bCheckPeds = true, // bool bCheckObjects = true, bool bCheckDummies = true, bool bSeeThroughStuff = false, // bool bIgnoreSomeObjectsForCamera = false, bool bShootThroughStuff = false MemPutFast < BYTE > ( VAR_CWorld_bIncludeCarTires, flags.bCheckCarTires ); _asm { push flags.bShootThroughStuff push flags.bIgnoreSomeObjectsForCamera push flags.bSeeThroughStuff push flags.bCheckDummies push flags.bCheckObjects push flags.bCheckPeds push flags.bCheckVehicles push flags.bCheckBuildings lea eax, targetEntity push eax push pColPointSAInterface push vecEnd push vecStart call dwFunc mov bReturn, al add esp, 0x30 } MemPutFast < BYTE > ( VAR_CWorld_bIncludeCarTires, 0 ); // Building info needed? if ( pBuildingResult ) { CPoolsSA * pPools = ((CPoolsSA *)pGame->GetPools()); if ( pPools ) { if ( targetEntity && targetEntity->nType == ENTITY_TYPE_BUILDING ) { pBuildingResult->bValid = true; pBuildingResult->usModelID = targetEntity->m_nModelIndex; if ( targetEntity->m_pLod ) pBuildingResult->usLODModelID = targetEntity->m_pLod->m_nModelIndex; else pBuildingResult->usLODModelID = 0; pBuildingResult->pInterface = targetEntity; pBuildingResult->vecPosition = targetEntity->Placeable.m_transform.m_translate; if ( targetEntity->Placeable.matrix ) { CVector& vecRotation = pBuildingResult->vecRotation; ConvertMatrixToEulerAngles ( *targetEntity->Placeable.matrix, vecRotation.fX, vecRotation.fY, vecRotation.fZ ); vecRotation = -vecRotation; } } if ( targetEntity && targetEntity->nType == ENTITY_TYPE_OBJECT ) { pBuildingResult->bValid = true; pBuildingResult->usModelID = targetEntity->m_nModelIndex; if ( targetEntity->m_pLod ) pBuildingResult->usLODModelID = targetEntity->m_pLod->m_nModelIndex; else pBuildingResult->usLODModelID = 0; pBuildingResult->pInterface = targetEntity; } } } if ( CollisionEntity ) { CPoolsSA * pPools = ((CPoolsSA *)pGame->GetPools()); if(pPools) { if(targetEntity) { switch (targetEntity->nType) { case ENTITY_TYPE_PED: *CollisionEntity = pPools->GetPed((DWORD *)targetEntity); break; case ENTITY_TYPE_OBJECT: *CollisionEntity = pPools->GetObject((DWORD *)targetEntity); break; case ENTITY_TYPE_VEHICLE: *CollisionEntity = pPools->GetVehicle((DWORD *)targetEntity); break; } /*CEntitySA * entity = new CEntitySA(); entity->SetInterface((CEntitySAInterface *)targetEntity); eEntityType EntityType = entity->GetEntityType(); delete entity; switch(EntityType) { case ENTITY_TYPE_PED: case ENTITY_TYPE_OBJECT: *CollisionEntity = pPools->GetPed((DWORD *)targetEntity); if ( *CollisionEntity ) break; *CollisionEntity = pPools->GetObject((CObjectSAInterface *)targetEntity); break; case ENTITY_TYPE_VEHICLE: *CollisionEntity = pPools->GetVehicle((CVehicleSAInterface *)targetEntity); break; }*/ } } } if ( colCollision ) *colCollision = pColPointSA; else pColPointSA->Destroy (); return bReturn; }