Code:
#include "../../SDK.h"
D3DXVECTOR3 ModelInstance::GetEyeLevel()
{
D3DXVECTOR3 vPos, vDims;
VEC_INIT(vPos);
if (!this) return vPos;
I::g_pPhysicsLT->GetObjectDims(this, &vDims);
I::g_pLTClient->GetObjectPos(this, &vPos);
vPos.y += vDims.y / 2.0f;
// vPos.y -= m_fEyeLevelOffset;
vPos.y -= 1;
return vPos;
}
bool ModelInstance::IsVisible_CastRay()
{
if (!this)
return false;
D3DXVECTOR3 vOurPos, vTheirPos;
D3DXVECTOR3 vPos = E::Visuals->GetMyObject()->GetEyeLevel();
// [ GET LOCAL WORLD POSITION ]
I::g_pLTClient->GetObjectPos(E::Visuals->GetMyObject(), &vOurPos);
// [ GET ENEMY WORLD POSITION ]
I::g_pLTClient->GetObjectPos(this, &vTheirPos);
D3DXVECTOR3 vDir;
VEC_SUB(vDir, vTheirPos, vOurPos);
IntersectQuery IQuery;
IntersectInfo IInfo;
memset(&IQuery, 0, sizeof(IQuery));
memset(&IInfo, 0, sizeof(IInfo));
//VEC_COPY(IQuery.m_From, vOurPos);
VEC_COPY(IQuery.m_From, vPos);
VEC_COPY(IQuery.m_Direction, vDir);
IQuery.m_Flags = INTERSECT_OBJECTS;
IQuery.m_FilterFn = NULL;
if (I::g_pLTBase->CastRay(&IQuery, &IInfo))
{
// BUGBUG: If the object is partially occluded it might fail this test!
if (IInfo.m_hObject == this)
{
return TRUE;
}
}
return FALSE;
}
bool ModelInstance::IsVisible()
{
if (!this)
return false;
D3DXVECTOR3 MyPos, EnemyPos;
// [ GET LOCAL WORLD POSITION ]
I::g_pLTClient->GetObjectPos(E::Visuals->GetMyObject(), &MyPos);
// [ GET ENEMY WORLD POSITION ]
I::g_pLTClient->GetObjectPos(this, &EnemyPos);
IntersectQuery IQuery;
IntersectInfo IInfo;
memset(&IQuery, 0, sizeof(IQuery));
memset(&IInfo, 0, sizeof(IInfo));
VEC_COPY(IQuery.m_From, MyPos);
VEC_COPY(IQuery.m_To, EnemyPos);
//IQuery.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;
//IQuery.m_FilterFn = TransparentObjectFilterFn;
bool bVisible = !((bool(__cdecl *)(IntersectQuery *, IntersectInfo *))
NetVar::DT_CLTBase::DT_CLTBase_Address::m_IntersectSegment)(&IQuery, &IInfo);
if ((!bVisible) &&
(IInfo.m_hObject == this))
{
bVisible = true;
}
return bVisible;
}
LTRect ModelInstance::GetBox()
{
LTRect rect;
rect.x = 0;
rect.y = 0;
rect.w = 0;
rect.h = 0;
// Get bounding box
//D3DXVECTOR3 min = this->GetcObject()->GetOrigin();
//D3DXVECTOR3 max = this->GetcObject()->GetBoxMax();
//D3DXVECTOR3 min = this->GetCharacFX()->Object()->GetOrigin();
//D3DXVECTOR3 max = this->GetCharacFX()->Object()->GetBoxMax();
D3DXVECTOR3 min = D3DXVECTOR3(0, 0, 0);
D3DXVECTOR3 max = D3DXVECTOR3(0, 0, 0);
if (!this) return rect;
if (I::g_pLTClient->GetObjectBoxMin(this, &min) != LT_OK)
return rect;
if (I::g_pLTClient->GetObjectBoxMax(this, &max) != LT_OK)
return rect;
// Points of a 3d bounding box
D3DXVECTOR3 points[] =
{
D3DXVECTOR3(min.x, min.y, min.z),
D3DXVECTOR3(min.x, max.y, min.z),
D3DXVECTOR3(max.x, max.y, min.z),
D3DXVECTOR3(max.x, min.y, min.z),
D3DXVECTOR3(max.x, max.y, max.z),
D3DXVECTOR3(min.x, max.y, max.z),
D3DXVECTOR3(min.x, min.y, max.z),
D3DXVECTOR3(max.x, min.y, max.z)
};
/*
.6-------5 blb = 0
.' | .' | brb = 1
7---+--4' | 0 = min frb = 2
| | | | 4 = max flb = 3
y | ,0---+---1 frt = 4
|.' | .' z brt = 5
3------2 blt = 6
x flt = 7
blt------brt blt = back-left-top
.' | .'| brt = back-right-top
flt---+--frt | brb = back-right-bottom
| | | | blb = back-left-bottom
y | blb---+--brb flt = front-left-top
|.' | .' z frt = front-right-top
flb------frb frb = front-right-bottom
x flb = front-left-bottom
*/
// Variables
D3DXVECTOR3 flb, brt, blb, frt, frb, brb, blt, flt;
// Get screen positions
if (D::WTS(points[3], &flb) &&
D::WTS(points[5], &brt) &&
D::WTS(points[0], &blb) &&
D::WTS(points[4], &frt) &&
D::WTS(points[2], &frb) &&
D::WTS(points[1], &brb) &&
D::WTS(points[6], &blt) &&
D::WTS(points[7], &flt))
{
// Put them in an array (maybe start them off in one later for speed?)
D3DXVECTOR3 arr[] = { flb, brt, blb, frt, frb, brb, blt, flt };
// Init this shit
float left = flb.x;
float top = flb.y;
float right = flb.x;
float bottom = flb.y;
// Find the bounding corners for our box
for (int i = 1; i < 8; i++)
{
if (left > arr[i].x)
left = arr[i].x;
if (bottom < arr[i].y)
bottom = arr[i].y;
if (right < arr[i].x)
right = arr[i].x;
if (top > arr[i].y)
top = arr[i].y;
}
// Width / height
rect.x = left;
rect.y = top;
rect.w = right - left;
rect.h = bottom - top;
rect.centerX = rect.x + (rect.w / 2);
rect.centerY = rect.y + (rect.h / 2);
return rect;
}
return rect;
}
unsigned int ModelInstance::UnknownFn()
{
unsigned int result; // eax
unsigned int BoneID; // [esp+Ch] [ebp-8h]
unsigned int TotalBones; // [esp+10h] [ebp-4h]
CModel* Model = (CModel*)this->GetModel();
if (!Model) return result;
TotalBones = Model->GetModelNodeCount();
CBones_20A4* CBones = (CBones_20A4*)this->GetBones_20A4();
if (!CBones) return result;
for (BoneID = 0; ; ++BoneID)
{
result = BoneID;
if (BoneID >= TotalBones)
break;
//*(BYTE *)(*(DWORD *)(CBones->GetBaseAddress() + 3 * BoneID + 1)) = 0;
//*(BYTE *)(*(DWORD *)(CBones->GetBaseAddress() + 3 * BoneID + 2)) = 0;
//*(BYTE *)(*(DWORD *)this->GetBones_20A4()->GetBaseAddress() + 3 * BoneID + 1) = 0;
//*(BYTE *)(*(DWORD *)this->GetBones_20A4()->GetBaseAddress() + 3 * BoneID + 2) = 0;
}
return result;
}
void ModelInstance::SetCurrAnim(unsigned __int8 TrackerID, unsigned int AnimID)
{
if (!this) return;
CAnimation* Animation = (CAnimation*)this->GetAnimation();
if (!Animation) return;
CModelAnimation* ModelAnimation = (CModelAnimation*)Animation->GetModelAnimation(TrackerID);
if (!ModelAnimation) return;
if (ModelAnimation->SetCurrAnimFn(AnimID, 1))
{
//this->UnknownFn();
//ModelAnimation->off_0070() = 1;
}
}
void ModelInstance::SetAnimRate(unsigned __int8 TrackerID, float fRate)
{
if (!this) return;
CAnimation* Animation = (CAnimation*)this->GetAnimation();
if (!Animation) return;
CModelAnimation* ModelAnimation = (CModelAnimation*)Animation->GetModelAnimation(TrackerID);
if (!ModelAnimation) return;
ModelAnimation->SetAnimRateFn(fRate);
ModelAnimation->off_0070() = 1;
}
float ModelInstance::GetAnimRate(unsigned __int8 TrackerID)
{
if (!this) return 0.0f;
CAnimation* Animation = (CAnimation*)this->GetAnimation();
if (!Animation) return 0.0f;
CModelAnimation* ModelAnimation = (CModelAnimation*)Animation->GetModelAnimation(TrackerID);
if (!ModelAnimation) return 0.0f;
return ModelAnimation->GetAnimRateFn();
}
void ModelInstance::SetPosition(D3DXVECTOR3 NewPosition)
{
if (!this) return;
//if (this->CheckForTeleport())
{
typedef float*(__thiscall* SetPositionFn)(float *, float *);
reinterpret_cast<SetPositionFn>(NetVar::DT_Misc_Virtual::m_SetPositionFn)((float*)this, NewPosition);
//this->CheckForTeleport() = 0;
}
/*
if ( *(_DWORD *)(ModelIntance + 0x20C) )
SetPosition(ModelIntance, ModelIntance + 0xE0, 1);
*(_DWORD *)(ModelIntance + 0x20C) = 0;
*/
}
__int32 ModelInstance::GetNumNodes()
{
unsigned int numnodes = 0;
if (!this) return numnodes;
I::g_pModelLT->GetNumNodes(this, numnodes);
return numnodes;
}
void ModelInstance::SetObjectFlags(const ObjFlagType flagType, uint32 dwFlags, uint32 dwMask)
{
if (!this) return;
I::Engine->GetICLTCommonClient()->GetLTCommon()->SetObjectFlags(this, flagType, dwFlags, dwMask);
}
void ModelInstance::SetRespawnInvulnerability()
{
if (!this) return;
//https://******.com/jsj2008/lithtech/blob/0eab18289bed72879eddb648d3311075b108cf46/NOLF2/ObjectDLL/ObjectShared/PlayerObj.cpp
// ----------------------------------------------------------------------- //
//
// ROUTINE: CPlayerObj::SetRespawnInvulnerability
//
// PURPOSE: Become invulnerable during respawn for a period of time.
//
// ----------------------------------------------------------------------- //
//I::g_pCommonLT->SetObjectFlags(this, OFT_User, USRFLG_PLAYER_ALPHACYCLE, USRFLG_PLAYER_ALPHACYCLE);
//I::g_pCommonLT->SetObjectFlags(this, OFT_Player, 2, 2);
//I::Engine->GetICLTCommonClient()->SetObjectFlags(this, OFT_Player, 2, 2);
//(*(void(__stdcall **)(DWORD, signed int, signed int, signed int))(0x5F40F0))(// SetObjectFlags
// (DWORD)this,
// 4, // ObjFlagType
// 2, // dwFlags
// 2);
/*
(*(void (__stdcall **)(_DWORD, signed int, signed int, signed int))(MEMORY[0] + 0x48))(// SetObjectFlags
*(_DWORD *)(v1 + 0xD58),
4, // ObjFlagType
2, // dwFlags
2);
*/
}
void ModelInstance::SetObjectEnableRefraction(char a2)
{
if (!this) return;
I::g_pCommonLT->SetObjectEnableRefraction(this, a2);
}