sup?
CNadeTracer.h:
CNadeTracer.cpp:
Before entity iteration:
In entity iteration:
After entity iteration:
Screenshot (with iMaxLength set to 500):
onClick="if (this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display != '')
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = '';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = 'none';
this.value = 'Hide Spoiler!';
}
else
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = 'none';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = '';
this.value = 'Show Spoiler!';
}" />
CNadeTracer.h:
Code:
#ifndef _CNADETRACER_H
#define _CNADETRACER_H
#include "SourceEngine.h"
#include "CRenderer.h"
#include <vector>
#include <chrono>
class CTimer
{
private:
__int64 initialTS, currentTS;
float secsPerCount;
public:
CTimer()
{
__int64 countsPerSec = initialTS = currentTS = 0;
QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
if (countsPerSec == 0)
secsPerCount = 1.0f;
else
secsPerCount = 1.0f / (float)countsPerSec;
}
void init()
{
QueryPerformanceCounter((LARGE_INTEGER*)&initialTS);
}
float diff()
{
QueryPerformanceCounter((LARGE_INTEGER*)¤tTS);
return ((float)currentTS - (float)initialTS)*secsPerCount;
}
};
class CTraceObj
{
public:
CTraceObj(source_engine::CBaseEntity*, D3DCOLOR, int);
source_engine::CBaseEntity* m_pNade;
void* m_pNetworkable;
void Update();
void Draw(Renderer*, source_engine::Math*);
private:
int m_iMaxLength;
CTimer m_tDeadlock;
std::vector<Vec3> m_vecTrace;
D3DCOLOR m_colorTrace;
};
class CNadeTracer
{
private:
Renderer* m_pRenderer;
source_engine::Math* m_pMath;
std::vector<CTraceObj*> vecTraceObjects;
public:
CNadeTracer(Renderer*, source_engine::Math*);
bool AddTracer(source_engine::CBaseEntity*, D3DCOLOR, int);
void Draw();
void Clear();
};
#endifCode:
#include "CNadeTracer.h"
CNadeTracer::CNadeTracer(Renderer* pRenderer, source_engine::Math* pMath)
{
m_pRenderer = pRenderer;
m_pMath = pMath;
}
bool CNadeTracer::AddTracer(source_engine::CBaseEntity* pNade, D3DCOLOR colorTrace, int iMaxLength)
{
for (auto pObj : vecTraceObjects)
{
if (pNade == pObj->m_pNade)
return false;
}
vecTraceObjects.push_back(new CTraceObj(pNade, colorTrace, iMaxLength));
return true;
}
void CNadeTracer::Draw()
{
for (auto pObj = vecTraceObjects.begin(); pObj != vecTraceObjects.end(); pObj++)
{
CTraceObj* pTraceObj = *pObj;
__try
{
if ((*(void**)(pTraceObj->m_pNade + 8)) != pTraceObj->m_pNetworkable)
vecTraceObjects.erase(pObj);
}
__except (1)
{
vecTraceObjects.erase(pObj);
}
pTraceObj->Update();
pTraceObj->Draw(m_pRenderer, m_pMath);
}
}
void CNadeTracer::Clear()
{
vecTraceObjects.clear();
}
CTraceObj::CTraceObj(source_engine::CBaseEntity* pNade, D3DCOLOR colorTrace, int iMaxLength)
{
m_pNade = pNade;
m_colorTrace = colorTrace;
m_iMaxLength = iMaxLength;
m_pNetworkable = *(void**)(pNade + 8);
m_tDeadlock.init();
}
void CTraceObj::Update()
{
if (m_tDeadlock.diff() >= 0.025f ) //50 ms
{
m_vecTrace.push_back(m_pNade->GetOrigin());
if (m_vecTrace.size() > m_iMaxLength)
m_vecTrace.erase(m_vecTrace.begin());
m_tDeadlock.init();
}
}
void CTraceObj::Draw(Renderer* pRenderer, source_engine::Math* pMath)
{
Vec3 vLastScreenPos;
bool bInit = false;
for (auto vecPos : m_vecTrace)
{
Vec3 vScreenPos = pMath->WorldToScreen(vecPos);
if (vScreenPos.z > 0.001f && bInit)
pRenderer->DrawLine(vLastScreenPos.x, vLastScreenPos.y, vScreenPos.x, vScreenPos.y, m_colorTrace);
vLastScreenPos = vScreenPos;
bInit = true;
}
}Code:
bool bGrenadePresent = false;Code:
if (sClassname.find("GrenadeProjectile") != std::string::npos) //grenades
{
pNadeTracer->AddTracer(pBaseEntity, 0xFFFF0000, 50);
pNadeTracer->Draw();
bGrenadePresent = true;
}Code:
if ( !bGrenadePresent )
pNadeTracer->Clear();onClick="if (this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display != '')
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = '';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = 'none';
this.value = 'Hide Spoiler!';
}
else
{
this.parentNode.parentNode.getElementsByTagName('div')['show_spoil'].style.display = 'none';
this.parentNode.parentNode.getElementsByTagName('div')['hide_spoil'].style.display = '';
this.value = 'Show Spoiler!';
}" />

Aucun commentaire:
Enregistrer un commentaire