Credits to me and Sudden Attack source.
If you ever use please credit it would be very nice.
Code:
377338D0 aka IL***ient
377338D0 + 0x21C = CreateObject(IL***ient *pClientDE)
377338D0 + 0x230 = SetObjectColor(HOBJECT obj, DWORD Red, DWORD Green, DWORD Blue, DWORD Alpha)
377338D0 + 0x64 = IntersectSegment(ClientIntersectQuery from, ClientIntersectQuery to) Not 100% About the parms on this one.
377338D0 + 0xFC = RegisterConsoleProgram(const char *pName, ConsoleProgramFn fn)
377338D0 + 0x158 = GetD3DDevice
377338D0 + 0x308 = GetEngineHook See Below
void LoadString(int messageCode, char *outBuf, int outBufLen)
{
void* pModule;
g_pL***ient->GetEngineHook("cres_hinstance",&pModule);
HMODULE hModule = (HINSTANCE)pModule;
*outBuf = '\0';
if (hModule)
{
uint32 nBytes = LoadString(hModule, messageCode, (char*)outBuf, outBufLen);
}
}
3742C8A0 = DoProjectile( LTVector const &vPath, LTVector const &vFirePos )
DoVector
Code:
3742C650 = DoVector( LTVector const &vPath, LTVector const &vFirePos, LTVector *pObjectImpactPos, HOBJECT *pObjectImpact )
void CClientWeapon::DoVector( LTVector const &vPath, LTVector const &vFirePos, LTVector *pObjectImpactPos, HOBJECT *pObjectImpact )
{
ASSERT( 0 != m_hObject );
ASSERT( 0 != m_pWeapon );
LTVector vEndPos;
IntersectInfo iInfo;
IntersectQuery qInfo;
qInfo.m_Flags = INTERSECT_OBJECTS | INTERSECT_HPOLY | IGNORE_NONSOLID;
// compute the vector end points
LTVector vTemp;
VEC_MULSCALAR( vTemp, vPath, m_pWeapon->nRange );
VEC_ADD( vEndPos, vFirePos, vTemp );
// filter information
CW_VOFF_Params cParams(this, vFirePos, vEndPos);
qInfo.m_FilterFn = ClientWeapon_VectorObjFilterFn;
qInfo.m_pUserData = &cParams;
qInfo.m_PolyFilterFn = ClientWeapon_PolyFilterFn;
// vector end points
qInfo.m_From = vFirePos;
qInfo.m_To = vEndPos;
LTBOOL bDone = LTFALSE;
int nCount = 0;
//----------------------------------------------------------------
uint32 dwId;
g_pL***ient->GetLocalClientID(&dwId);
while(!bDone && nCount < 4)
{
//qInfo.m_From = qInfo.m_From;
//qInfo.m_To = qInfo.m_To;
// ±¤˝Ä
InitFireDetectionValue();
if ( g_pL***ient->IntersectSegment( &qInfo, &iInfo ) )
//if( g_pL***ient->IntersectSegmen***ient(&qInfo, &iInfo) )
{
if( HandleVectorImpact( (uint8)dwId, 0, vPath, &qInfo, &iInfo, pObjectImpactPos, pObjectImpact ) )
{
bDone = LTTRUE;
}
}
else
{
// hit nothing, pretend we hit the sky
LTVector vUp;
vUp.Init( 0.0f, 1.0f, 0.0f );
AddImpact( (uint8)dwId, LTNULL, vEndPos, vUp, vPath, ST_SKY );
bDone = LTTRUE;
}
nCount++;
}
}
CHitBox::Init
Code:
374B8690 = CHitBox::Init( HOBJECT hModel, const LTVector &vDims, const LTVector &vOffset )
bool CHitBox::Init( HOBJECT hModel, const LTVector &vDims, const LTVector &vOffset )
{
if( hModel == INVALID_HOBJECT )
return false;
if( !s_ShowClientHitBox.IsInitted() )
{
s_ShowClientHitBox.Init( g_pL***ient, "ShowClientHitBox", LTNULL, 0.0f );
}
m_hModel = hModel;
m_vDims = vDims;
m_vOffset = vOffset;
// Create the hitbox at the propper offset from the models position...
LTVector vModelPos;
g_pL***ient->GetObjectPos( m_hModel, &vModelPos );
LTRotation rModelRot;
g_pL***ient->GetObjectRotation( m_hModel, &rModelRot );
LTMatrix mMat;
rModelRo*****nvertToMatrix( mMat );
// Get rid of our object if it already exists...
if( m_hObject != INVALID_HOBJECT )
{
g_pL***ient->RemoveObject( m_hObject );
m_hObject = INVALID_HOBJECT;
}
ObjectCreateStruct ocs;
ocs.m_ObjectType = OT_NORMAL;
ocs.m_Flags = FLAG_RAYHIT;
ocs.m_Pos = vModelPos + (mMat * m_vOffset);
m_hObject = g_pL***ient->CreateObject( &ocs );
if( m_hObject == INVALID_HOBJECT )
{
return false;
}
g_pPhysicsLT->SetObjectDims( m_hObject, &m_vDims, 0 );
g_pCommonLT->SetObjectFlags( m_hObject, OFT_User, USRFLG_HITBOX | USRFLG_CHARACTER, USRFLG_HITBOX | USRFLG_CHARACTER );
return true;
}
CreateBoundingBox
Code:
void CHitBox::CreateBoundingBox()
{
if( (m_hObject == INVALID_HOBJECT) ||
(m_hBoundingBox != INVALID_HOBJECT ))
return;
ObjectCreateStruct ocs;
g_pL***ient->GetObjectPos( m_hObject, &ocs.m_Pos );
ocs.m_ObjectType = OT_MODEL;
ocs.m_Flags = FLAG_VISIBLE | FLAG_NOLIGHT | FLAG_GOTHRUWORLD;
ocs.m_Flags2 = FLAG2_FORCETRANSLUCENT;
ocs.m_Scale = m_vDims * 2.0f;
LTStrCpy( ocs.m_Filename, "MODELS\\sphere.ltb", ARRAY_LEN( ocs.m_Filename ));
m_hBoundingBox = g_pL***ient->CreateObject( &ocs );
if( m_hBoundingBox == INVALID_HOBJECT )
return;
g_pL***ient->SetObjectColor( m_hBoundingBox, HB_COLOR_R, HB_COLOR_G, HB_COLOR_B, HB_COLOR_A);
}
ClientFire
Code:
3742D360 = ClientFire(LTVector const &vPath, LTVector const &vFirePos, LTVector *pObjectImpactPos, HOBJECT *pObjectImpact)
void CClientWeapon::ClientFire( LTVector const &vPath, LTVector const &vFirePos, LTVector *pObjectImpactPos, HOBJECT *pObjectImpact )
{
// Always process gadget firing...
if ( m_pAmmo->eType == GADGET )
{
DoGadget( vPath, vFirePos );
return;
}
switch ( m_pAmmo->eType )
{
case PROJECTILE:
{
DoProjectile( vPath, vFirePos );
}
break;
case VECTOR:
{
m_vFirePos = vFirePos;
DoVector( vPath, vFirePos, pObjectImpactPos, pObjectImpact );
}
break;
default:
{
g_pL***ient->CPrint( "ERROR in CClientWeapon::ClientFire(). Invalid Ammo Type!" );
}
break;
}
}