mirror of
https://github.com/halpz/re3.git
synced 2025-07-07 17:58:52 +00:00
Merge branch 'master' into master
This commit is contained in:
208
src/core/Cam.cpp
208
src/core/Cam.cpp
@ -28,6 +28,7 @@ const float DefaultFOV = 70.0f; // beta: 80.0f
|
||||
|
||||
bool PrintDebugCode = false;
|
||||
int16 &DebugCamMode = *(int16*)0x95CCF2;
|
||||
bool bFreeCam = false;
|
||||
|
||||
void
|
||||
CCam::Init(void)
|
||||
@ -138,6 +139,11 @@ CCam::Process(void)
|
||||
if(CCamera::m_bUseMouse3rdPerson)
|
||||
Process_FollowPedWithMouse(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
else
|
||||
#ifdef FREE_CAM
|
||||
if(bFreeCam)
|
||||
Process_FollowPed_Rotation(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
else
|
||||
#endif
|
||||
Process_FollowPed(CameraTarget, TargetOrientation, SpeedVar, TargetSpeedVar);
|
||||
break;
|
||||
// case MODE_AIMING:
|
||||
@ -4369,7 +4375,209 @@ CCam::Process_FollowPed_WithBinding(const CVector &CameraTarget, float TargetOri
|
||||
GetVectorsReadyForRW();
|
||||
}
|
||||
|
||||
#ifdef FREE_CAM
|
||||
void
|
||||
CCam::Process_FollowPed_Rotation(const CVector &CameraTarget, float TargetOrientation, float, float)
|
||||
{
|
||||
FOV = DefaultFOV;
|
||||
|
||||
const float MinDist = 2.0f;
|
||||
const float MaxDist = 2.0f + TheCamera.m_fPedZoomValueSmooth;
|
||||
const float BaseOffset = 0.75f; // base height of camera above target
|
||||
|
||||
CVector TargetCoors = CameraTarget;
|
||||
|
||||
TargetCoors.z += m_fSyphonModeTargetZOffSet;
|
||||
TargetCoors = DoAverageOnVector(TargetCoors);
|
||||
TargetCoors.z += BaseOffset; // add offset so alpha evens out to 0
|
||||
// TargetCoors.z += m_fRoadOffSet;
|
||||
|
||||
CVector Dist = Source - TargetCoors;
|
||||
CVector ToCam;
|
||||
|
||||
bool Shooting = false;
|
||||
if(((CPed*)CamTargetEntity)->GetWeapon()->m_eWeaponType != WEAPONTYPE_UNARMED)
|
||||
if(CPad::GetPad(0)->GetWeapon())
|
||||
Shooting = true;
|
||||
if(((CPed*)CamTargetEntity)->GetWeapon()->m_eWeaponType == WEAPONTYPE_DETONATOR ||
|
||||
((CPed*)CamTargetEntity)->GetWeapon()->m_eWeaponType == WEAPONTYPE_BASEBALLBAT)
|
||||
Shooting = false;
|
||||
|
||||
|
||||
if(ResetStatics){
|
||||
// Coming out of top down here probably
|
||||
// so keep Beta, reset alpha and calculate vectors
|
||||
Beta = CGeneral::GetATanOfXY(Dist.x, Dist.y);
|
||||
Alpha = 0.0f;
|
||||
|
||||
Dist = MaxDist*CVector(Cos(Alpha) * Cos(Beta), Cos(Alpha) * Sin(Beta), Sin(Alpha));
|
||||
Source = TargetCoors + Dist;
|
||||
|
||||
ResetStatics = false;
|
||||
}
|
||||
|
||||
// Drag the camera along at the look-down offset
|
||||
float CamDist = Dist.Magnitude();
|
||||
if(CamDist == 0.0f)
|
||||
Dist = CVector(1.0f, 1.0f, 0.0f);
|
||||
else if(CamDist < MinDist)
|
||||
Dist *= MinDist/CamDist;
|
||||
else if(CamDist > MaxDist)
|
||||
Dist *= MaxDist/CamDist;
|
||||
CamDist = Dist.Magnitude();
|
||||
|
||||
// Beta = 0 is looking east, HALFPI is north, &c.
|
||||
// Alpha positive is looking up
|
||||
float GroundDist = Dist.Magnitude2D();
|
||||
Beta = CGeneral::GetATanOfXY(-Dist.x, -Dist.y);
|
||||
Alpha = CGeneral::GetATanOfXY(GroundDist, -Dist.z);
|
||||
while(Beta >= PI) Beta -= 2.0f*PI;
|
||||
while(Beta < -PI) Beta += 2.0f*PI;
|
||||
while(Alpha >= PI) Alpha -= 2.0f*PI;
|
||||
while(Alpha < -PI) Alpha += 2.0f*PI;
|
||||
|
||||
// Look around
|
||||
bool UseMouse = false;
|
||||
float MouseX = CPad::GetPad(0)->GetMouseX();
|
||||
float MouseY = CPad::GetPad(0)->GetMouseY();
|
||||
float LookLeftRight, LookUpDown;
|
||||
if((MouseX != 0.0f || MouseY != 0.0f) && !CPad::GetPad(0)->ArePlayerControlsDisabled()){
|
||||
UseMouse = true;
|
||||
LookLeftRight = -2.5f*MouseX;
|
||||
LookUpDown = 4.0f*MouseY;
|
||||
}else{
|
||||
LookLeftRight = -CPad::GetPad(0)->LookAroundLeftRight();
|
||||
LookUpDown = CPad::GetPad(0)->LookAroundUpDown();
|
||||
}
|
||||
float AlphaOffset, BetaOffset;
|
||||
if(UseMouse){
|
||||
BetaOffset = LookLeftRight * TheCamera.m_fMouseAccelHorzntl * FOV/80.0f;
|
||||
AlphaOffset = LookUpDown * TheCamera.m_fMouseAccelVertical * FOV/80.0f;
|
||||
}else{
|
||||
BetaOffset = LookLeftRight * fStickSens * (0.5f/10.0f) * FOV/80.0f * CTimer::GetTimeStep();
|
||||
AlphaOffset = LookUpDown * fStickSens * (0.3f/10.0f) * FOV/80.0f * CTimer::GetTimeStep();
|
||||
}
|
||||
|
||||
// Stop centering once stick has been touched
|
||||
if(BetaOffset)
|
||||
Rotating = false;
|
||||
|
||||
Beta += BetaOffset;
|
||||
Alpha += AlphaOffset;
|
||||
while(Beta >= PI) Beta -= 2.0f*PI;
|
||||
while(Beta < -PI) Beta += 2.0f*PI;
|
||||
if(Alpha > DEGTORAD(45.0f)) Alpha = DEGTORAD(45.0f);
|
||||
if(Alpha < -DEGTORAD(89.5f)) Alpha = -DEGTORAD(89.5f);
|
||||
|
||||
|
||||
float BetaDiff = TargetOrientation+PI - Beta;
|
||||
while(BetaDiff >= PI) BetaDiff -= 2.0f*PI;
|
||||
while(BetaDiff < -PI) BetaDiff += 2.0f*PI;
|
||||
float TargetAlpha = Alpha;
|
||||
// 12deg to account for our little height offset. we're not working on the true alpha here
|
||||
const float AlphaLimitUp = DEGTORAD(15.0f) + DEGTORAD(12.0f);
|
||||
const float AlphaLimitDown = -DEGTORAD(15.0f) + DEGTORAD(12.0f);
|
||||
if(Abs(BetaDiff) < DEGTORAD(25.0f) && ((CPed*)CamTargetEntity)->GetMoveSpeed().Magnitude2D() > 0.01f){
|
||||
// Limit alpha when player is walking towards camera
|
||||
if(TargetAlpha > AlphaLimitUp) TargetAlpha = AlphaLimitUp;
|
||||
if(TargetAlpha < AlphaLimitDown) TargetAlpha = AlphaLimitDown;
|
||||
}
|
||||
|
||||
WellBufferMe(TargetAlpha, &Alpha, &AlphaSpeed, 0.2f, 0.1f, true);
|
||||
|
||||
if(CPad::GetPad(0)->ForceCameraBehindPlayer() || Shooting){
|
||||
m_fTargetBeta = TargetOrientation;
|
||||
Rotating = true;
|
||||
}
|
||||
|
||||
if(Rotating){
|
||||
WellBufferMe(m_fTargetBeta, &Beta, &BetaSpeed, 0.1f, 0.06f, true);
|
||||
float DeltaBeta = m_fTargetBeta - Beta;
|
||||
while(DeltaBeta >= PI) DeltaBeta -= 2*PI;
|
||||
while(DeltaBeta < -PI) DeltaBeta += 2*PI;
|
||||
if(Abs(DeltaBeta) < 0.06f)
|
||||
Rotating = false;
|
||||
}
|
||||
|
||||
|
||||
Front = CVector(Cos(Alpha) * Cos(Beta), Cos(Alpha) * Sin(Beta), Sin(Alpha));
|
||||
Source = TargetCoors - Front*CamDist;
|
||||
TargetCoors.z -= BaseOffset; // now get back to the real target coors again
|
||||
|
||||
m_cvecTargetCoorsForFudgeInter = TargetCoors;
|
||||
|
||||
|
||||
Front = TargetCoors - Source;
|
||||
Front.Normalise();
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Handle collisions - taken from FollowPedWithMouse
|
||||
*/
|
||||
|
||||
CEntity *entity;
|
||||
CColPoint colPoint;
|
||||
// Clip Source and fix near clip
|
||||
CWorld::pIgnoreEntity = CamTargetEntity;
|
||||
entity = nil;
|
||||
if(CWorld::ProcessLineOfSight(TargetCoors, Source, colPoint, entity, true, true, true, true, false, false, true)){
|
||||
float PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||
float ColCamDist = CamDist - PedColDist;
|
||||
if(entity->IsPed() && ColCamDist > 1.0f){
|
||||
// Ped in the way but not clipping through
|
||||
if(CWorld::ProcessLineOfSight(colPoint.point, Source, colPoint, entity, true, true, true, true, false, false, true)){
|
||||
PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||
Source = colPoint.point;
|
||||
if(PedColDist < 0.9f + 0.3f)
|
||||
RwCameraSetNearClipPlane(Scene.camera, max(PedColDist-0.3f, 0.05f));
|
||||
}else{
|
||||
RwCameraSetNearClipPlane(Scene.camera, min(ColCamDist-0.35f, 0.9f));
|
||||
}
|
||||
}else{
|
||||
Source = colPoint.point;
|
||||
if(PedColDist < 0.9f + 0.3f)
|
||||
RwCameraSetNearClipPlane(Scene.camera, max(PedColDist-0.3f, 0.05f));
|
||||
}
|
||||
}
|
||||
CWorld::pIgnoreEntity = nil;
|
||||
|
||||
float ViewPlaneHeight = Tan(DEGTORAD(FOV) / 2.0f);
|
||||
float ViewPlaneWidth = ViewPlaneHeight * CDraw::FindAspectRatio() * fTweakFOV;
|
||||
float Near = RwCameraGetNearClipPlane(Scene.camera);
|
||||
float radius = ViewPlaneWidth*Near;
|
||||
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, false);
|
||||
int i = 0;
|
||||
while(entity){
|
||||
CVector CamToCol = gaTempSphereColPoints[0].point - Source;
|
||||
float frontDist = DotProduct(CamToCol, Front);
|
||||
float dist = (CamToCol - Front*frontDist).Magnitude() / ViewPlaneWidth;
|
||||
|
||||
// Try to decrease near clip
|
||||
dist = max(min(Near, dist), 0.1f);
|
||||
if(dist < Near)
|
||||
RwCameraSetNearClipPlane(Scene.camera, dist);
|
||||
|
||||
// Move forward a bit
|
||||
if(dist == 0.1f)
|
||||
Source += (TargetCoors - Source)*0.3f;
|
||||
|
||||
// Keep testing
|
||||
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, false);
|
||||
|
||||
i++;
|
||||
if(i > 5)
|
||||
entity = nil;
|
||||
}
|
||||
|
||||
GetVectorsReadyForRW();
|
||||
}
|
||||
#endif
|
||||
|
||||
STARTPATCHES
|
||||
#ifdef FREE_CAM
|
||||
Nop(0x468E7B, 0x468E90-0x468E7B); // disable first person
|
||||
#endif
|
||||
InjectHook(0x456F40, WellBufferMe, PATCH_JUMP);
|
||||
InjectHook(0x458410, &CCam::Init, PATCH_JUMP);
|
||||
InjectHook(0x4582F0, &CCam::GetVectorsReadyForRW, PATCH_JUMP);
|
||||
|
@ -221,6 +221,9 @@ struct CCam
|
||||
// CCam::Process_Blood_On_The_Tracks
|
||||
// CCam::Process_Cam_Running_Side_Train
|
||||
// CCam::Process_Cam_On_Train_Roof
|
||||
|
||||
// custom stuff
|
||||
void Process_FollowPed_Rotation(const CVector &CameraTarget, float TargetOrientation, float, float);
|
||||
};
|
||||
static_assert(sizeof(CCam) == 0x1A4, "CCam: wrong size");
|
||||
static_assert(offsetof(CCam, Alpha) == 0xA8, "CCam: error");
|
||||
|
@ -113,7 +113,7 @@ CFire::ProcessFire(void)
|
||||
CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.0125f, 0.1f) * m_fStrength),
|
||||
0, m_fStrength, 0, 0, 0, 0);
|
||||
|
||||
rand(); rand(); rand(); /* unsure why these three rands are called */
|
||||
CGeneral::GetRandomNumber(); CGeneral::GetRandomNumber(); CGeneral::GetRandomNumber(); /* unsure why these three rands are called */
|
||||
|
||||
CParticle::AddParticle(PARTICLE_CARFLAME_SMOKE, firePos,
|
||||
CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0);
|
||||
@ -129,8 +129,10 @@ CFire::ProcessFire(void)
|
||||
|
||||
if (!m_pEntity) {
|
||||
CShadows::StoreStaticShadow((uint32)this, SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &lightpos,
|
||||
7.0f, 0.0f, 0.0f, -7.0f, 0, nRandNumber / 2, nRandNumber / 2,
|
||||
0, 10.0f, 1.0f, 40.0f, 0, 0.0f);
|
||||
7.0f, 0.0f, 0.0f, -7.0f,
|
||||
255, // this is 0 on PC which results in no shadow
|
||||
nRandNumber / 2, nRandNumber / 2, 0,
|
||||
10.0f, 1.0f, 40.0f, 0, 0.0f);
|
||||
}
|
||||
fGreen = nRandNumber / 128;
|
||||
fRed = nRandNumber / 128;
|
||||
|
@ -1694,9 +1694,6 @@ int CMenuManager::GetStartOptionsCntrlConfigScreens()
|
||||
}
|
||||
#endif
|
||||
|
||||
#if DONT_USE_SUSPICIOUS_FUNCS
|
||||
WRAPPER void CMenuManager::InitialiseChangedLanguageSettings() { EAXJMP(0x47A4D0); }
|
||||
#else
|
||||
void CMenuManager::InitialiseChangedLanguageSettings()
|
||||
{
|
||||
if (m_bFrontEnd_ReloadObrTxtGxt) {
|
||||
@ -1719,7 +1716,6 @@ void CMenuManager::InitialiseChangedLanguageSettings()
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void CMenuManager::LoadAllTextures()
|
||||
{
|
||||
|
@ -1,22 +1,22 @@
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "main.h"
|
||||
#include "PlayerSkin.h"
|
||||
#include "TxdStore.h"
|
||||
#include "rtbmp.h"
|
||||
#include "ClumpModelInfo.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
#include "World.h"
|
||||
#include "PlayerInfo.h"
|
||||
#include "CdStream.h"
|
||||
#include "FileMgr.h"
|
||||
#include "Directory.h"
|
||||
#include "RwHelper.h"
|
||||
#include "Timer.h"
|
||||
#include "Lights.h"
|
||||
|
||||
int CPlayerSkin::m_txdSlot;
|
||||
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "main.h"
|
||||
#include "PlayerSkin.h"
|
||||
#include "TxdStore.h"
|
||||
#include "rtbmp.h"
|
||||
#include "ClumpModelInfo.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
#include "World.h"
|
||||
#include "PlayerInfo.h"
|
||||
#include "CdStream.h"
|
||||
#include "FileMgr.h"
|
||||
#include "Directory.h"
|
||||
#include "RwHelper.h"
|
||||
#include "Timer.h"
|
||||
#include "Lights.h"
|
||||
|
||||
int CPlayerSkin::m_txdSlot;
|
||||
|
||||
void
|
||||
FindPlayerDff(uint32 &offset, uint32 &size)
|
||||
{
|
||||
@ -32,8 +32,8 @@ FindPlayerDff(uint32 &offset, uint32 &size)
|
||||
|
||||
offset = info.offset;
|
||||
size = info.size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
LoadPlayerDff(void)
|
||||
{
|
||||
@ -65,22 +65,22 @@ LoadPlayerDff(void)
|
||||
|
||||
if (streamWasAdded)
|
||||
CdStreamRemoveImages();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerSkin::Initialise(void)
|
||||
{
|
||||
m_txdSlot = CTxdStore::AddTxdSlot("skin");
|
||||
CTxdStore::Create(m_txdSlot);
|
||||
CTxdStore::AddRef(m_txdSlot);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerSkin::Shutdown(void)
|
||||
{
|
||||
CTxdStore::RemoveTxdSlot(m_txdSlot);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RwTexture *
|
||||
CPlayerSkin::GetSkinTexture(const char *texName)
|
||||
{
|
||||
@ -112,8 +112,8 @@ CPlayerSkin::GetSkinTexture(const char *texName)
|
||||
RwImageDestroy(image);
|
||||
}
|
||||
return tex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
CPlayerSkin::BeginFrontendSkinEdit(void)
|
||||
{
|
||||
@ -163,11 +163,11 @@ CPlayerSkin::RenderFrontendSkinEdit(void)
|
||||
RpClumpRender(gpPlayerClump);
|
||||
}
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x59B9B0, &CPlayerSkin::Initialise, PATCH_JUMP);
|
||||
InjectHook(0x59B9E0, &CPlayerSkin::Shutdown, PATCH_JUMP);
|
||||
InjectHook(0x59B9F0, &CPlayerSkin::GetSkinTexture, PATCH_JUMP);
|
||||
InjectHook(0x59BC70, &CPlayerSkin::BeginFrontendSkinEdit, PATCH_JUMP);
|
||||
InjectHook(0x59BCB0, &CPlayerSkin::EndFrontendSkinEdit, PATCH_JUMP);
|
||||
InjectHook(0x59BCE0, &CPlayerSkin::RenderFrontendSkinEdit, PATCH_JUMP);
|
||||
STARTPATCHES
|
||||
InjectHook(0x59B9B0, &CPlayerSkin::Initialise, PATCH_JUMP);
|
||||
InjectHook(0x59B9E0, &CPlayerSkin::Shutdown, PATCH_JUMP);
|
||||
InjectHook(0x59B9F0, &CPlayerSkin::GetSkinTexture, PATCH_JUMP);
|
||||
InjectHook(0x59BC70, &CPlayerSkin::BeginFrontendSkinEdit, PATCH_JUMP);
|
||||
InjectHook(0x59BCB0, &CPlayerSkin::EndFrontendSkinEdit, PATCH_JUMP);
|
||||
InjectHook(0x59BCE0, &CPlayerSkin::RenderFrontendSkinEdit, PATCH_JUMP);
|
||||
ENDPATCHES
|
@ -75,9 +75,6 @@ static_assert(RADAR_TILE_SIZE == (WORLD_SIZE_Y / RADAR_NUM_TILES), "CRadar: not
|
||||
#define RADAR_MIN_SPEED (0.3f)
|
||||
#define RADAR_MAX_SPEED (0.9f)
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::CalculateBlipAlpha(float) { EAXJMP(0x4A4F90); }
|
||||
#else
|
||||
uint8 CRadar::CalculateBlipAlpha(float dist)
|
||||
{
|
||||
if (dist <= 1.0f)
|
||||
@ -88,55 +85,35 @@ uint8 CRadar::CalculateBlipAlpha(float dist)
|
||||
|
||||
return 128;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ChangeBlipBrightness(int32, int32) { EAXJMP(0x4A57A0); }
|
||||
#else
|
||||
void CRadar::ChangeBlipBrightness(int32 i, int32 bright)
|
||||
{
|
||||
int index = GetActualBlipArrayIndex(i);
|
||||
if (index != -1)
|
||||
ms_RadarTrace[index].m_bDim = bright != 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ChangeBlipColour(int32, int32) { EAXJMP(0x4A5770); }
|
||||
#else
|
||||
void CRadar::ChangeBlipColour(int32 i, int32 color)
|
||||
{
|
||||
int index = GetActualBlipArrayIndex(i);
|
||||
if (index != -1)
|
||||
ms_RadarTrace[index].m_nColor = color;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ChangeBlipDisplay(int32, eBlipDisplay) { EAXJMP(0x4A5810); }
|
||||
#else
|
||||
void CRadar::ChangeBlipDisplay(int32 i, eBlipDisplay display)
|
||||
{
|
||||
int index = GetActualBlipArrayIndex(i);
|
||||
if (index != -1)
|
||||
ms_RadarTrace[index].m_eBlipDisplay = display;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ChangeBlipScale(int32, int32) { EAXJMP(0x4A57E0); }
|
||||
#else
|
||||
void CRadar::ChangeBlipScale(int32 i, int32 scale)
|
||||
{
|
||||
int index = GetActualBlipArrayIndex(i);
|
||||
if (index != -1)
|
||||
ms_RadarTrace[index].m_wScale = scale;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ClearBlip(int32) { EAXJMP(0x4A5720); }
|
||||
#else
|
||||
void CRadar::ClearBlip(int32 i)
|
||||
{
|
||||
int index = GetActualBlipArrayIndex(i);
|
||||
@ -148,11 +125,7 @@ void CRadar::ClearBlip(int32 i)
|
||||
ms_RadarTrace[index].m_IconID = RADAR_SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ClearBlipForEntity(eBlipType, int32) { EAXJMP(0x4A56C0); }
|
||||
#else
|
||||
void CRadar::ClearBlipForEntity(eBlipType type, int32 id)
|
||||
{
|
||||
for (int i = 0; i < NUMRADARBLIPS; i++) {
|
||||
@ -165,11 +138,7 @@ void CRadar::ClearBlipForEntity(eBlipType type, int32 id)
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER int CRadar::ClipRadarPoly(CVector2D *poly, const CVector2D *in) { EAXJMP(0x4A64A0); }
|
||||
#else
|
||||
// Why not a proper clipping algorithm?
|
||||
int CRadar::ClipRadarPoly(CVector2D *poly, const CVector2D *rect)
|
||||
{
|
||||
@ -249,7 +218,6 @@ int CRadar::ClipRadarPoly(CVector2D *poly, const CVector2D *rect)
|
||||
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CRadar::DisplayThisBlip(int32 counter)
|
||||
{
|
||||
@ -263,9 +231,6 @@ bool CRadar::DisplayThisBlip(int32 counter)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::Draw3dMarkers() { EAXJMP(0x4A4C70); }
|
||||
#else
|
||||
void CRadar::Draw3dMarkers()
|
||||
{
|
||||
for (int i = 0; i < NUMRADARBLIPS; i++) {
|
||||
@ -317,12 +282,7 @@ void CRadar::Draw3dMarkers()
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawBlips() { EAXJMP(0x4A42F0); }
|
||||
#else
|
||||
void CRadar::DrawBlips()
|
||||
{
|
||||
if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) {
|
||||
@ -580,12 +540,7 @@ void CRadar::DrawBlips()
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawMap () { EAXJMP(0x4A4200); }
|
||||
#else
|
||||
void CRadar::DrawMap()
|
||||
{
|
||||
if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) {
|
||||
@ -605,11 +560,7 @@ void CRadar::DrawMap()
|
||||
DrawRadarMap();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawRadarMap() { EAXJMP(0x4A6C20); }
|
||||
#else
|
||||
void CRadar::DrawRadarMap()
|
||||
{
|
||||
// Game calculates an unused CRect here
|
||||
@ -642,11 +593,7 @@ void CRadar::DrawRadarMap()
|
||||
DrawRadarSection(x, y + 1);
|
||||
DrawRadarSection(x + 1, y + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawRadarMask() { EAXJMP(0x4A69C0); }
|
||||
#else
|
||||
void CRadar::DrawRadarMask()
|
||||
{
|
||||
CVector2D corners[4] = {
|
||||
@ -690,11 +637,7 @@ void CRadar::DrawRadarMask()
|
||||
|
||||
RwD3D8SetRenderState(rwRENDERSTATESTENCILFUNCTION, rwSTENCILFUNCTIONGREATER);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawRadarSection(int32, int32) { EAXJMP(0x4A67E0); }
|
||||
#else
|
||||
void CRadar::DrawRadarSection(int32 x, int32 y)
|
||||
{
|
||||
int i;
|
||||
@ -738,20 +681,12 @@ void CRadar::DrawRadarSection(int32 x, int32 y)
|
||||
// if(numVertices > 2)
|
||||
RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::GetVertices(), numVertices);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawRadarSprite(uint16 sprite, float x, float y, uint8 alpha) { EAXJMP(0x4A5EF0); }
|
||||
#else
|
||||
void CRadar::DrawRadarSprite(uint16 sprite, float x, float y, uint8 alpha)
|
||||
{
|
||||
RadarSprites[sprite]->Draw(CRect(x - SCREEN_SCALE_X(8.0f), y - SCREEN_SCALE_Y(8.0f), x + SCREEN_SCALE_X(8.0f), y + SCREEN_SCALE_Y(8.0f)), CRGBA(255, 255, 255, alpha));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int32 alpha) { EAXJMP(0x4A5D10); }
|
||||
#else
|
||||
void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int32 alpha)
|
||||
{
|
||||
CVector curPosn[4];
|
||||
@ -778,11 +713,7 @@ void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float
|
||||
|
||||
sprite->Draw(curPosn[2].x, curPosn[2].y, curPosn[3].x, curPosn[3].y, curPosn[0].x, curPosn[0].y, curPosn[1].x, curPosn[1].y, CRGBA(255, 255, 255, alpha));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER int32 CRadar::GetActualBlipArrayIndex(int32) { EAXJMP(0x4A41C0); }
|
||||
#else
|
||||
int32 CRadar::GetActualBlipArrayIndex(int32 i)
|
||||
{
|
||||
if (i == -1)
|
||||
@ -792,11 +723,7 @@ int32 CRadar::GetActualBlipArrayIndex(int32 i)
|
||||
else
|
||||
return (uint16)i;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER int32 CRadar::GetNewUniqueBlipIndex(int32) { EAXJMP(0x4A4180); }
|
||||
#else
|
||||
int32 CRadar::GetNewUniqueBlipIndex(int32 i)
|
||||
{
|
||||
if (ms_RadarTrace[i].m_BlipIndex >= UINT16_MAX - 1)
|
||||
@ -805,11 +732,7 @@ int32 CRadar::GetNewUniqueBlipIndex(int32 i)
|
||||
ms_RadarTrace[i].m_BlipIndex++;
|
||||
return i | (ms_RadarTrace[i].m_BlipIndex << 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER uint32 CRadar::GetRadarTraceColour(uint32 color, bool bright) { EAXJMP(0x4A5BB0); }
|
||||
#else
|
||||
uint32 CRadar::GetRadarTraceColour(uint32 color, bool bright)
|
||||
{
|
||||
int32 c;
|
||||
@ -862,7 +785,6 @@ uint32 CRadar::GetRadarTraceColour(uint32 color, bool bright)
|
||||
};
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
|
||||
const char* gRadarTexNames[] = {
|
||||
"radar00", "radar01", "radar02", "radar03", "radar04", "radar05", "radar06", "radar07",
|
||||
@ -875,9 +797,6 @@ const char* gRadarTexNames[] = {
|
||||
"radar56", "radar57", "radar58", "radar59", "radar60", "radar61", "radar62", "radar63",
|
||||
};
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::Initialise() { EAXJMP(0x4A3EF0); }
|
||||
#else
|
||||
void
|
||||
CRadar::Initialise()
|
||||
{
|
||||
@ -894,11 +813,7 @@ CRadar::Initialise()
|
||||
for (int i = 0; i < 64; i++)
|
||||
gRadarTxdIds[i] = CTxdStore::FindTxdSlot(gRadarTexNames[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER float CRadar::LimitRadarPoint(CVector2D &point) { EAXJMP(0x4A4F30); }
|
||||
#else
|
||||
float CRadar::LimitRadarPoint(CVector2D &point)
|
||||
{
|
||||
float dist, invdist;
|
||||
@ -911,11 +826,7 @@ float CRadar::LimitRadarPoint(CVector2D &point)
|
||||
}
|
||||
return dist;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::LoadAllRadarBlips(int32) { EAXJMP(0x4A6F30); }
|
||||
#else
|
||||
void CRadar::LoadAllRadarBlips(uint8 *buf, uint32 size)
|
||||
{
|
||||
Initialise();
|
||||
@ -927,11 +838,7 @@ INITSAVEBUF
|
||||
|
||||
VALIDATESAVEBUF(size);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::LoadTextures() { EAXJMP(0x4A4030); }
|
||||
#else
|
||||
void
|
||||
CRadar::LoadTextures()
|
||||
{
|
||||
@ -959,42 +866,26 @@ CRadar::LoadTextures()
|
||||
WeaponSprite.SetTexture("radar_weapon");
|
||||
CTxdStore::PopCurrentTxd();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void RemoveMapSection(int32, int32) { EAXJMP(0x00); }
|
||||
#else
|
||||
void RemoveMapSection(int32 x, int32 y)
|
||||
{
|
||||
if (x >= 0 && x <= 7 && y >= 0 && y <= 7)
|
||||
CStreaming::RemoveTxd(gRadarTxdIds[x + RADAR_NUM_TILES * y]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::RemoveRadarSections() { EAXJMP(0x4A60E0); }
|
||||
#else
|
||||
void CRadar::RemoveRadarSections()
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
for (int j = 0; j < 8; j++)
|
||||
RemoveMapSection(i, j);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::RequestMapSection(int32, int32) { EAXJMP(0x00); }
|
||||
#else
|
||||
void CRadar::RequestMapSection(int32 x, int32 y)
|
||||
{
|
||||
ClipRadarTileCoords(x, y);
|
||||
CStreaming::RequestTxd(gRadarTxdIds[x + RADAR_NUM_TILES * y], STREAMFLAGS_DONT_REMOVE | STREAMFLAGS_DEPENDENCY);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::SaveAllRadarBlips(uint8 *buf, uint32 *size) { EAXJMP(0x4A6E30); }
|
||||
#else
|
||||
void CRadar::SaveAllRadarBlips(uint8 *buf, uint32 *size)
|
||||
{
|
||||
*size = SAVE_HEADER_SIZE + sizeof(ms_RadarTrace);
|
||||
@ -1006,11 +897,7 @@ INITSAVEBUF
|
||||
|
||||
VALIDATESAVEBUF(*size);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::SetBlipSprite(int32, int32) { EAXJMP(0x4A5840); }
|
||||
#else
|
||||
void CRadar::SetBlipSprite(int32 i, int32 icon)
|
||||
{
|
||||
int index = CRadar::GetActualBlipArrayIndex(i);
|
||||
@ -1018,11 +905,7 @@ void CRadar::SetBlipSprite(int32 i, int32 icon)
|
||||
ms_RadarTrace[index].m_IconID = icon;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER int32 CRadar::SetCoordBlip(eBlipType, CVector, int32, eBlipDisplay display) { EAXJMP(0x4A5590); }
|
||||
#else
|
||||
int CRadar::SetCoordBlip(eBlipType type, CVector pos, int32 color, eBlipDisplay display)
|
||||
{
|
||||
int nextBlip;
|
||||
@ -1043,11 +926,7 @@ int CRadar::SetCoordBlip(eBlipType type, CVector pos, int32 color, eBlipDisplay
|
||||
ms_RadarTrace[nextBlip].m_IconID = RADAR_SPRITE_NONE;
|
||||
return CRadar::GetNewUniqueBlipIndex(nextBlip);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER int CRadar::SetEntityBlip(eBlipType type, int32, int32, eBlipDisplay) { EAXJMP(0x4A5640); }
|
||||
#else
|
||||
int CRadar::SetEntityBlip(eBlipType type, int32 handle, int32 color, eBlipDisplay display)
|
||||
{
|
||||
int nextBlip;
|
||||
@ -1066,11 +945,7 @@ int CRadar::SetEntityBlip(eBlipType type, int32 handle, int32 color, eBlipDispla
|
||||
ms_RadarTrace[nextBlip].m_IconID = RADAR_SPRITE_NONE;
|
||||
return GetNewUniqueBlipIndex(nextBlip);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::SetRadarMarkerState(int32, bool) { EAXJMP(0x4A5C60); }
|
||||
#else
|
||||
void CRadar::SetRadarMarkerState(int32 counter, bool flag)
|
||||
{
|
||||
CEntity *e;
|
||||
@ -1091,11 +966,7 @@ void CRadar::SetRadarMarkerState(int32 counter, bool flag)
|
||||
if (e)
|
||||
e->bHasBlip = flag;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) { EAXJMP(0x4A59C0); }
|
||||
#else
|
||||
void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) {
|
||||
float f1 = radius * 1.4f;
|
||||
float f2 = radius * 0.5f;
|
||||
@ -1117,11 +988,7 @@ void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) {
|
||||
p2 = pos - TheCamera.GetRight()*f2;
|
||||
CTheScripts::ScriptDebugLine3D(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, color, color);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ShowRadarTrace(float x, float y, uint32 size, uint8 red, uint8 green, uint8 blue, uint8 alpha) { EAXJMP(0x4A5870); }
|
||||
#else
|
||||
void CRadar::ShowRadarTrace(float x, float y, uint32 size, uint8 red, uint8 green, uint8 blue, uint8 alpha)
|
||||
{
|
||||
if (!CHud::m_Wants_To_Draw_Hud || TheCamera.m_WideScreenOn)
|
||||
@ -1130,7 +997,6 @@ void CRadar::ShowRadarTrace(float x, float y, uint32 size, uint8 red, uint8 gree
|
||||
CSprite2d::DrawRect(CRect(x - SCREEN_SCALE_X(size + 1.0f), y - SCREEN_SCALE_Y(size + 1.0f), SCREEN_SCALE_X(size + 1.0f) + x, SCREEN_SCALE_Y(size + 1.0f) + y), CRGBA(0, 0, 0, alpha));
|
||||
CSprite2d::DrawRect(CRect(x - SCREEN_SCALE_X(size), y - SCREEN_SCALE_Y(size), SCREEN_SCALE_X(size) + x, SCREEN_SCALE_Y(size) + y), CRGBA(red, green, blue, alpha));
|
||||
}
|
||||
#endif
|
||||
|
||||
void CRadar::ShowRadarTraceWithHeight(float x, float y, uint32 size, uint8 red, uint8 green, uint8 blue, uint8 alpha, uint8 mode)
|
||||
{
|
||||
@ -1156,9 +1022,6 @@ void CRadar::ShowRadarTraceWithHeight(float x, float y, uint32 size, uint8 red,
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::Shutdown() { EAXJMP(0x4A3F60); }
|
||||
#else
|
||||
void CRadar::Shutdown()
|
||||
{
|
||||
AsukaSprite.Delete();
|
||||
@ -1183,20 +1046,12 @@ void CRadar::Shutdown()
|
||||
WeaponSprite.Delete();
|
||||
RemoveRadarSections();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::StreamRadarSections(const CVector &posn) { EAXJMP(0x4A6B60); }
|
||||
#else
|
||||
void CRadar::StreamRadarSections(const CVector &posn)
|
||||
{
|
||||
StreamRadarSections(floorf((2000.0f + posn.x) / 500.0f), ceilf(7.0f - (2000.0f + posn.y) / 500.0f));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::StreamRadarSections(int32 x, int32 y) { EAXJMP(0x4A6100); }
|
||||
#else
|
||||
void CRadar::StreamRadarSections(int32 x, int32 y)
|
||||
{
|
||||
for (int i = 0; i < RADAR_NUM_TILES; ++i) {
|
||||
@ -1208,11 +1063,7 @@ void CRadar::StreamRadarSections(int32 x, int32 y)
|
||||
};
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::TransformRealWorldToTexCoordSpace(CVector2D &out, const CVector2D &in, int32 x, int32 y) { EAXJMP(0x4A5530); }
|
||||
#else
|
||||
void CRadar::TransformRealWorldToTexCoordSpace(CVector2D &out, const CVector2D &in, int32 x, int32 y)
|
||||
{
|
||||
out.x = in.x - (x * RADAR_TILE_SIZE + WORLD_MIN_X);
|
||||
@ -1220,11 +1071,7 @@ void CRadar::TransformRealWorldToTexCoordSpace(CVector2D &out, const CVector2D &
|
||||
out.x /= RADAR_TILE_SIZE;
|
||||
out.y /= RADAR_TILE_SIZE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::TransformRadarPointToRealWorldSpace(CVector2D &out, const CVector2D &in) { EAXJMP(0x4A5300); }
|
||||
#else
|
||||
void CRadar::TransformRadarPointToRealWorldSpace(CVector2D &out, const CVector2D &in)
|
||||
{
|
||||
float s, c;
|
||||
@ -1255,7 +1102,6 @@ void CRadar::TransformRadarPointToRealWorldSpace(CVector2D &out, const CVector2D
|
||||
|
||||
out = out * m_radarRange + vec2DRadarOrigin;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Radar space goes from -1.0 to 1.0 in x and y, top right is (1.0, 1.0)
|
||||
void CRadar::TransformRadarPointToScreenSpace(CVector2D &out, const CVector2D &in)
|
||||
@ -1265,9 +1111,6 @@ void CRadar::TransformRadarPointToScreenSpace(CVector2D &out, const CVector2D &i
|
||||
out.y = (1.0f - in.y)*0.5f*SCREEN_SCALE_Y(RADAR_HEIGHT) + SCREEN_SCALE_FROM_BOTTOM(RADAR_BOTTOM + RADAR_HEIGHT);
|
||||
}
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::TransformRealWorldPointToRadarSpace(CVector2D &out, const CVector2D &in) { EAXJMP(0x4A50D0); }
|
||||
#else
|
||||
void CRadar::TransformRealWorldPointToRadarSpace(CVector2D &out, const CVector2D &in)
|
||||
{
|
||||
float s, c;
|
||||
@ -1299,11 +1142,7 @@ void CRadar::TransformRealWorldPointToRadarSpace(CVector2D &out, const CVector2D
|
||||
out.x = s * y + c * x;
|
||||
out.y = c * y - s * x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::GetTextureCorners(int32 x, int32 y, CVector2D *out) { EAXJMP(0x4A61C0); };
|
||||
#else
|
||||
// Transform from section indices to world coordinates
|
||||
void CRadar::GetTextureCorners(int32 x, int32 y, CVector2D *out)
|
||||
{
|
||||
@ -1326,11 +1165,7 @@ void CRadar::GetTextureCorners(int32 x, int32 y, CVector2D *out)
|
||||
out[3].x = RADAR_TILE_SIZE * (x);
|
||||
out[3].y = RADAR_TILE_SIZE * (y);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
WRAPPER void CRadar::ClipRadarTileCoords(int32 &, int32 &) { EAXJMP(0x00); };
|
||||
#else
|
||||
void CRadar::ClipRadarTileCoords(int32 &x, int32 &y)
|
||||
{
|
||||
if (x < 0)
|
||||
@ -1342,24 +1177,16 @@ void CRadar::ClipRadarTileCoords(int32 &x, int32 &y)
|
||||
if (y > RADAR_NUM_TILES-1)
|
||||
y = RADAR_NUM_TILES-1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
WRAPPER bool CRadar::IsPointInsideRadar(const CVector2D &) { EAXJMP(0x4A6160); }
|
||||
#else
|
||||
bool CRadar::IsPointInsideRadar(const CVector2D &point)
|
||||
{
|
||||
if (point.x < -1.0f || point.x > 1.0f) return false;
|
||||
if (point.y < -1.0f || point.y > 1.0f) return false;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
// clip line p1,p2 against (-1.0, 1.0) in x and y, set out to clipped point closest to p1
|
||||
#if 0
|
||||
WRAPPER int CRadar::LineRadarBoxCollision(CVector2D &, const CVector2D &, const CVector2D &) { EAXJMP(0x4A6250); }
|
||||
#else
|
||||
int CRadar::LineRadarBoxCollision(CVector2D &out, const CVector2D &p1, const CVector2D &p2)
|
||||
{
|
||||
float d1, d2;
|
||||
@ -1430,7 +1257,6 @@ int CRadar::LineRadarBoxCollision(CVector2D &out, const CVector2D &p1, const CVe
|
||||
|
||||
return edge;
|
||||
}
|
||||
#endif
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x4A3EF0, CRadar::Initialise, PATCH_JUMP);
|
||||
|
@ -75,9 +75,6 @@ void CTimer::Shutdown(void)
|
||||
;
|
||||
}
|
||||
|
||||
#if 0
|
||||
WRAPPER void CTimer::Update(void) { EAXJMP(0x4ACF70); }
|
||||
#else
|
||||
void CTimer::Update(void)
|
||||
{
|
||||
m_snPreviousTimeInMilliseconds = m_snTimeInMilliseconds;
|
||||
@ -149,7 +146,6 @@ void CTimer::Update(void)
|
||||
|
||||
m_FrameCounter++;
|
||||
}
|
||||
#endif
|
||||
|
||||
void CTimer::Suspend(void)
|
||||
{
|
||||
|
@ -206,4 +206,6 @@ enum Config {
|
||||
// #define NEW_WALK_AROUND_ALGORITHM // to make walking around vehicles/objects less awkward
|
||||
#define CANCELLABLE_CAR_ENTER
|
||||
|
||||
// Camera
|
||||
#define IMPROVED_CAMERA // Better Debug cam, and maybe more in the future
|
||||
//#define FREE_CAM // Rotating cam
|
||||
|
@ -1,6 +1,11 @@
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
StaticPatcher *StaticPatcher::ms_head;
|
||||
|
||||
StaticPatcher::StaticPatcher(Patcher func)
|
||||
@ -20,3 +25,55 @@ StaticPatcher::Apply()
|
||||
}
|
||||
ms_head = nil;
|
||||
}
|
||||
|
||||
std::vector<uint32> usedAddresses;
|
||||
|
||||
static DWORD protect[2];
|
||||
static uint32 protect_address;
|
||||
static uint32 protect_size;
|
||||
|
||||
void
|
||||
Protect_internal(uint32 address, uint32 size)
|
||||
{
|
||||
protect_address = address;
|
||||
protect_size = size;
|
||||
VirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
}
|
||||
|
||||
void
|
||||
Unprotect_internal(void)
|
||||
{
|
||||
VirtualProtect((void*)protect_address, protect_size, protect[0], &protect[1]);
|
||||
}
|
||||
|
||||
void
|
||||
InjectHook_internal(uint32 address, uint32 hook, int type)
|
||||
{
|
||||
if(std::any_of(usedAddresses.begin(), usedAddresses.end(),
|
||||
[address](uint32 value) { return value == address; })) {
|
||||
debug("Used address %#06x twice when injecting hook\n", address);
|
||||
}
|
||||
|
||||
usedAddresses.push_back(address);
|
||||
|
||||
|
||||
switch(type){
|
||||
case PATCH_JUMP:
|
||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
*(uint8*)address = 0xE9;
|
||||
break;
|
||||
case PATCH_CALL:
|
||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
*(uint8*)address = 0xE8;
|
||||
break;
|
||||
default:
|
||||
VirtualProtect((void*)(address + 1), 4, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
*(ptrdiff_t*)(address + 1) = hook - address - 5;
|
||||
if(type == PATCH_NOTHING)
|
||||
VirtualProtect((void*)(address + 1), 4, protect[0], &protect[1]);
|
||||
else
|
||||
VirtualProtect((void*)address, 5, protect[0], &protect[1]);
|
||||
}
|
@ -117,16 +117,10 @@ Nop(AT address, unsigned int nCount)
|
||||
Unprotect_internal();
|
||||
}
|
||||
|
||||
template<typename AT, typename HT> inline void
|
||||
InjectHook(AT address, HT hook, unsigned int nType=PATCH_NOTHING)
|
||||
template <typename T> inline void
|
||||
InjectHook(uintptr_t address, T hook, unsigned int nType = PATCH_NOTHING)
|
||||
{
|
||||
uint32 uiHook;
|
||||
_asm
|
||||
{
|
||||
mov eax, hook
|
||||
mov uiHook, eax
|
||||
}
|
||||
InjectHook_internal((uint32)address, uiHook, nType);
|
||||
InjectHook_internal(address, reinterpret_cast<uintptr_t>((void *&)hook), nType);
|
||||
}
|
||||
|
||||
inline void ExtractCall(void *dst, uint32_t a)
|
||||
|
@ -22,62 +22,8 @@
|
||||
#include "Console.h"
|
||||
#include "Debug.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
std::vector<int32> usedAddresses;
|
||||
|
||||
static DWORD protect[2];
|
||||
static uint32 protect_address;
|
||||
static uint32 protect_size;
|
||||
|
||||
void
|
||||
Protect_internal(uint32 address, uint32 size)
|
||||
{
|
||||
protect_address = address;
|
||||
protect_size = size;
|
||||
VirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
}
|
||||
|
||||
void
|
||||
Unprotect_internal(void)
|
||||
{
|
||||
VirtualProtect((void*)protect_address, protect_size, protect[0], &protect[1]);
|
||||
}
|
||||
|
||||
void
|
||||
InjectHook_internal(uint32 address, uint32 hook, int type)
|
||||
{
|
||||
if(std::any_of(usedAddresses.begin(), usedAddresses.end(),
|
||||
[address](uint32 value) { return (int32)value == address; })) {
|
||||
debug("Used address %#06x twice when injecting hook\n", address);
|
||||
}
|
||||
|
||||
usedAddresses.push_back((int32)address);
|
||||
|
||||
|
||||
switch(type){
|
||||
case PATCH_JUMP:
|
||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
*(uint8*)address = 0xE9;
|
||||
break;
|
||||
case PATCH_CALL:
|
||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
*(uint8*)address = 0xE8;
|
||||
break;
|
||||
default:
|
||||
VirtualProtect((void*)((uint32)address + 1), 4, PAGE_EXECUTE_READWRITE, &protect[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
*(ptrdiff_t*)(address + 1) = hook - address - 5;
|
||||
if(type == PATCH_NOTHING)
|
||||
VirtualProtect((void*)(address + 1), 4, protect[0], &protect[1]);
|
||||
else
|
||||
VirtualProtect((void*)address, 5, protect[0], &protect[1]);
|
||||
}
|
||||
|
||||
void **rwengine = *(void***)0x5A10E1;
|
||||
|
||||
DebugMenuAPI gDebugMenuAPI;
|
||||
@ -426,6 +372,10 @@ DebugMenuPopulate(void)
|
||||
|
||||
extern bool PrintDebugCode;
|
||||
extern int16 &DebugCamMode;
|
||||
#ifdef FREE_CAM
|
||||
extern bool bFreeCam;
|
||||
DebugMenuAddVarBool8("Cam", "Free Cam", (int8*)&bFreeCam, nil);
|
||||
#endif
|
||||
DebugMenuAddVarBool8("Cam", "Print Debug Code", (int8*)&PrintDebugCode, nil);
|
||||
DebugMenuAddVar("Cam", "Cam Mode", &DebugCamMode, nil, 1, 0, CCam::MODE_EDITOR, nil);
|
||||
DebugMenuAddCmd("Cam", "Normal", []() { DebugCamMode = 0; });
|
||||
|
Reference in New Issue
Block a user