#pragma once
#include "../Misc/CUserCmd.hpp"
#define MULTIPLAYER_BACKUP 150
class bf_write;
class bf_read;
class CInput
{
public:
char pad0[0xC];
bool m_fTrackIRAvailable;
bool m_fMouseInitialized;
bool m_fMouseActive;
char pad1[0x9A];
bool m_fCameraInThirdPerson;
char pad2[0x2];
Vector m_vecCameraOffset;
char pad3[0x38];
CUserCmd* m_pCommands;
CVerifiedUserCmd* m_pVerifiedCommands;
inline CUserCmd* GetUserCmd(int sequence_number);
inline CUserCmd* GetUserCmd(int nSlot, int sequence_number);
inline CVerifiedUserCmd* GetVerifiedCmd(int sequence_number);
};
CUserCmd* CInput::GetUserCmd(int sequence_number)
{
using OriginalFn = CUserCmd * (__thiscall*)(void*, int, int);
return CallVFunction<OriginalFn>(this, 8)(this, 0, sequence_number);
}
CUserCmd* CInput::GetUserCmd(int nSlot, int sequence_number)
{
typedef CUserCmd* (__thiscall* GetUserCmd_t)(void*, int, int);
return CallVFunction<GetUserCmd_t>(this, 8)(this, nSlot, sequence_number);
}
CVerifiedUserCmd* CInput::GetVerifiedCmd(int sequence_number)
{
auto verifiedCommands = *(CVerifiedUserCmd**)(reinterpret_cast<uint32_t>(this) + 0xF4);
return &verifiedCommands[sequence_number % MULTIPLAYER_BACKUP];
}