Finished CRadar, a bit of CExplosion

This commit is contained in:
Sergeanur 2020-03-12 18:26:47 +02:00
parent 3e78600420
commit e57ad65d05
6 changed files with 398 additions and 228 deletions

View File

@ -63,7 +63,6 @@ CMotionBlurStreaks
CObject
CPacManPickups
CPedPath
CRadar
CRecordDataForChase
CRoadBlocks
CRubbish

View File

@ -1,31 +0,0 @@
#include "common.h"
#include "patcher.h"
#include "Explosion.h"
WRAPPER void CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32) { EAXJMP(0x5591C0); }
WRAPPER void CExplosion::RemoveAllExplosionsInArea(CVector, float) { EAXJMP(0x55AD40); }
WRAPPER bool CExplosion::TestForExplosionInArea(eExplosionType, float, float, float, float, float, float) { EAXJMP(0x55AC80); }
WRAPPER
int8 CExplosion::GetExplosionActiveCounter(uint8 id)
{
EAXJMP(0x559140);
}
WRAPPER
CVector *CExplosion::GetExplosionPosition(uint8 id)
{
EAXJMP(0x5591A0);
}
WRAPPER
uint8 CExplosion::GetExplosionType(uint8 id)
{
EAXJMP(0x559180);
}
WRAPPER
void CExplosion::ResetExplosionActiveCounter(uint8 id)
{
EAXJMP(0x559160);
}

View File

@ -14,55 +14,56 @@
#include "TxdStore.h"
#include "World.h"
#include "Streaming.h"
#include "SpecialFX.h"
float &CRadar::m_radarRange = *(float*)0x8E281C;
CBlip (&CRadar::ms_RadarTrace)[NUMRADARBLIPS] = *(CBlip(*)[NUMRADARBLIPS]) * (uintptr*)0x6ED5E0;
CVector2D &vec2DRadarOrigin = *(CVector2D*)0x6299B8;
int *gRadarTxdIds = (int*)0x6299C0;
int32 gRadarTxdIds[64];// = (int*)0x6299C0;
CSprite2d *CRadar::AsukaSprite = (CSprite2d*)0x8F1A40;
CSprite2d *CRadar::BombSprite = (CSprite2d*)0x8F5FB4;
CSprite2d *CRadar::CatSprite = (CSprite2d*)0x885B24;
CSprite2d *CRadar::CentreSprite = (CSprite2d*)0x8F6268;
CSprite2d *CRadar::CopcarSprite = (CSprite2d*)0x8F1A2C;
CSprite2d *CRadar::DonSprite = (CSprite2d*)0x8F2BE0;
CSprite2d *CRadar::EightSprite = (CSprite2d*)0x8F2BCC;
CSprite2d *CRadar::ElSprite = (CSprite2d*)0x8F1B80;
CSprite2d *CRadar::IceSprite = (CSprite2d*)0x9415FC;
CSprite2d *CRadar::JoeySprite = (CSprite2d*)0x8F2C00;
CSprite2d *CRadar::KenjiSprite = (CSprite2d*)0x8F2C68;
CSprite2d *CRadar::LizSprite = (CSprite2d*)0x8F5830;
CSprite2d *CRadar::LuigiSprite = (CSprite2d*)0x8F1A3C;
CSprite2d *CRadar::NorthSprite = (CSprite2d*)0x8F6274;
CSprite2d *CRadar::RaySprite = (CSprite2d*)0x8E2A7C;
CSprite2d *CRadar::SalSprite = (CSprite2d*)0x8F29EC;
CSprite2d *CRadar::SaveSprite = (CSprite2d*)0x8F5F74;
CSprite2d *CRadar::SpraySprite = (CSprite2d*)0x94307C;
CSprite2d *CRadar::TonySprite = (CSprite2d*)0x885B58;
CSprite2d *CRadar::WeaponSprite = (CSprite2d*)0x941534;
CSprite2d CRadar::AsukaSprite;// = *(CSprite2d*)0x8F1A40;
CSprite2d CRadar::BombSprite;// = (CSprite2d*)0x8F5FB4;
CSprite2d CRadar::CatSprite;// = (CSprite2d*)0x885B24;
CSprite2d CRadar::CentreSprite;// = (CSprite2d*)0x8F6268;
CSprite2d CRadar::CopcarSprite;// = (CSprite2d*)0x8F1A2C;
CSprite2d CRadar::DonSprite;// = (CSprite2d*)0x8F2BE0;
CSprite2d CRadar::EightSprite;// = (CSprite2d*)0x8F2BCC;
CSprite2d CRadar::ElSprite;// = (CSprite2d*)0x8F1B80;
CSprite2d CRadar::IceSprite;// = (CSprite2d*)0x9415FC;
CSprite2d CRadar::JoeySprite;// = (CSprite2d*)0x8F2C00;
CSprite2d CRadar::KenjiSprite;// = (CSprite2d*)0x8F2C68;
CSprite2d CRadar::LizSprite;// = (CSprite2d*)0x8F5830;
CSprite2d CRadar::LuigiSprite;// = (CSprite2d*)0x8F1A3C;
CSprite2d CRadar::NorthSprite;// = (CSprite2d*)0x8F6274;
CSprite2d CRadar::RaySprite;// = (CSprite2d*)0x8E2A7C;
CSprite2d CRadar::SalSprite;// = (CSprite2d*)0x8F29EC;
CSprite2d CRadar::SaveSprite;// = (CSprite2d*)0x8F5F74;
CSprite2d CRadar::SpraySprite;// = (CSprite2d*)0x94307C;
CSprite2d CRadar::TonySprite;// = (CSprite2d*)0x885B58;
CSprite2d CRadar::WeaponSprite;// = (CSprite2d*)0x941534;
CSprite2d *CRadar::RadarSprites[RADAR_SPRITE_COUNT] = {
nil,
AsukaSprite,
BombSprite,
CatSprite,
CentreSprite,
CopcarSprite,
DonSprite,
EightSprite,
ElSprite,
IceSprite,
JoeySprite,
KenjiSprite,
LizSprite,
LuigiSprite,
NorthSprite,
RaySprite,
SalSprite,
SaveSprite,
SpraySprite,
TonySprite,
WeaponSprite
&AsukaSprite,
&BombSprite,
&CatSprite,
&CentreSprite,
&CopcarSprite,
&DonSprite,
&EightSprite,
&ElSprite,
&IceSprite,
&JoeySprite,
&KenjiSprite,
&LizSprite,
&LuigiSprite,
&NorthSprite,
&RaySprite,
&SalSprite,
&SaveSprite,
&SpraySprite,
&TonySprite,
&WeaponSprite
};
#define RADAR_NUM_TILES (8)
@ -89,48 +90,63 @@ uint8 CRadar::CalculateBlipAlpha(float dist)
}
#endif
#if 1
#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 1
#if 0
WRAPPER void CRadar::ChangeBlipColour(int32, int32) { EAXJMP(0x4A5770); }
#else
void CRadar::ChangeBlipColour(int32 i, int32)
void CRadar::ChangeBlipColour(int32 i, int32 color)
{
int index = GetActualBlipArrayIndex(i);
if (index != -1)
ms_RadarTrace[index].m_nColor = color;
}
#endif
#if 1
#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 1
#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 1
#if 0
WRAPPER void CRadar::ClearBlip(int32) { EAXJMP(0x4A5720); }
#else
void CRadar::ClearBlip(int32 i)
{
int index = GetActualBlipArrayIndex(i);
if (index != -1) {
SetRadarMarkerState(index, false);
ms_RadarTrace[index].m_bInUse = false;
ms_RadarTrace[index].m_eBlipType = BLIP_NONE;
ms_RadarTrace[index].m_eBlipDisplay = BLIP_DISPLAY_NEITHER;
ms_RadarTrace[index].m_IconID = RADAR_SPRITE_NONE;
}
}
#endif
@ -247,12 +263,59 @@ bool CRadar::DisplayThisBlip(int32 counter)
}
}
#if 1
#if 0
WRAPPER void CRadar::Draw3dMarkers() { EAXJMP(0x4A4C70); }
#else
void CRadar::Draw3dMarkers()
{
{
for (int i = 0; i < NUMRADARBLIPS; i++) {
if (ms_RadarTrace[i].m_bInUse) {
switch (ms_RadarTrace[i].m_eBlipType) {
case BLIP_CAR:
{
CEntity *entity = CPools::GetVehiclePool()->GetAt(ms_RadarTrace[i].m_nEntityHandle);
if (ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY) {
CVector pos = entity->GetPosition();
pos.z += 1.2f * CModelInfo::GetModelInfo(entity->GetModelIndex())->GetColModel()->boundingBox.max.z + 2.5f;
C3dMarkers::PlaceMarker(i | (ms_RadarTrace[i].m_BlipIndex << 16), 1, pos, 2.5f, 0, 128, 255, 255, 1024, 0.2f, 5);
}
break;
}
case BLIP_CHAR:
{
CEntity *entity = CPools::GetPedPool()->GetAt(ms_RadarTrace[i].m_nEntityHandle);
if (entity != nil) {
if (((CPed*)entity)->InVehicle())
entity = ((CPed * )entity)->m_pMyVehicle;
}
if (ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY) {
CVector pos = entity->GetPosition();
pos.z += 3.0f;
C3dMarkers::PlaceMarker(i | (ms_RadarTrace[i].m_BlipIndex << 16), 1, pos, 1.5f, 0, 128, 255, 255, 1024, 0.2f, 5);
}
break;
}
case BLIP_OBJECT:
{
CEntity *entity = CPools::GetObjectPool()->GetAt(ms_RadarTrace[i].m_nEntityHandle);
if (ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY) {
CVector pos = entity->GetPosition();
pos.z += CModelInfo::GetModelInfo(entity->GetModelIndex())->GetColModel()->boundingBox.max.z + 1.0f + 1.0f;
C3dMarkers::PlaceMarker(i | (ms_RadarTrace[i].m_BlipIndex << 16), 1, pos, 1.0f, 0, 128, 255, 255, 1024, 0.2f, 5);
}
break;
}
case BLIP_COORD:
break;
case BLIP_CONTACT_POINT:
if (!CTheScripts::IsPlayerOnAMission()) {
if (ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY)
C3dMarkers::PlaceMarkerSet(i | (ms_RadarTrace[i].m_BlipIndex << 16), 4, ms_RadarTrace[i].m_vecPos, 2.0f, 0, 128, 255, 128, 2048, 0.2f, 0);
}
break;
}
}
}
}
#endif
@ -284,7 +347,7 @@ void CRadar::DrawBlips()
else
angle = FindPlayerHeading() - (PI + TheCamera.GetForward().Heading());
DrawRotatingRadarSprite(CentreSprite, out.x, out.y, angle, 255);
DrawRotatingRadarSprite(&CentreSprite, out.x, out.y, angle, 255);
CVector2D vec2d;
vec2d.x = vec2DRadarOrigin.x;
@ -311,9 +374,10 @@ void CRadar::DrawBlips()
blipEntity = CPools::GetVehiclePool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
break;
case BLIP_CHAR:
blipEntity = CPools::GetPedPool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
if (blipEntity && ((CPed*)blipEntity)->InVehicle()) {
blipEntity = ((CPed*)blipEntity)->m_pMyVehicle;
blipEntity = CPools::GetPedPool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
if (blipEntity != nil) {
if (((CPed*)blipEntity)->InVehicle())
blipEntity = ((CPed*)blipEntity)->m_pMyVehicle;
}
break;
case BLIP_OBJECT:
@ -414,9 +478,10 @@ void CRadar::DrawBlips()
blipEntity = CPools::GetVehiclePool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
break;
case BLIP_CHAR:
blipEntity = CPools::GetPedPool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
if (blipEntity && ((CPed*)blipEntity)->InVehicle()) {
blipEntity = ((CPed*)blipEntity)->m_pMyVehicle;
blipEntity = CPools::GetPedPool()->GetAt(ms_RadarTrace[blipId].m_nEntityHandle);
if (blipEntity != nil) {
if (((CPed*)blipEntity)->InVehicle())
blipEntity = ((CPed*)blipEntity)->m_pMyVehicle;
}
break;
case BLIP_OBJECT:
@ -729,12 +794,16 @@ int32 CRadar::GetActualBlipArrayIndex(int32 i)
}
#endif
#if 1
#if 0
WRAPPER int32 CRadar::GetNewUniqueBlipIndex(int32) { EAXJMP(0x4A4180); }
#else
int32 CRadar::GetNewUniqueBlipIndex(int32 i)
{
return int32();
{
if (ms_RadarTrace[i].m_BlipIndex >= UINT16_MAX - 1)
ms_RadarTrace[i].m_BlipIndex = 1;
else
ms_RadarTrace[i].m_BlipIndex++;
return i | (ms_RadarTrace[i].m_BlipIndex << 16);
}
#endif
@ -796,68 +865,14 @@ uint32 CRadar::GetRadarTraceColour(uint32 color, bool bright)
#endif
const char* gRadarTexNames[] = {
"radar00",
"radar01",
"radar02",
"radar03",
"radar04",
"radar05",
"radar06",
"radar07",
"radar08",
"radar09",
"radar10",
"radar11",
"radar12",
"radar13",
"radar14",
"radar15",
"radar16",
"radar17",
"radar18",
"radar19",
"radar20",
"radar21",
"radar22",
"radar23",
"radar24",
"radar25",
"radar26",
"radar27",
"radar28",
"radar29",
"radar30",
"radar31",
"radar32",
"radar33",
"radar34",
"radar35",
"radar36",
"radar37",
"radar38",
"radar39",
"radar40",
"radar41",
"radar42",
"radar43",
"radar44",
"radar45",
"radar46",
"radar47",
"radar48",
"radar49",
"radar50",
"radar51",
"radar52",
"radar53",
"radar54",
"radar55",
"radar56",
"radar57",
"radar58",
"radar59",
"radar60",
"radar61",
"radar00", "radar01", "radar02", "radar03", "radar04", "radar05", "radar06", "radar07",
"radar08", "radar09", "radar10", "radar11", "radar12", "radar13", "radar14", "radar15",
"radar16", "radar17", "radar18", "radar19", "radar20", "radar21", "radar22", "radar23",
"radar24", "radar25", "radar26", "radar27", "radar28", "radar29", "radar30", "radar31",
"radar32", "radar33", "radar34", "radar35", "radar36", "radar37", "radar38", "radar39",
"radar40", "radar41", "radar42", "radar43", "radar44", "radar45", "radar46", "radar47",
"radar48", "radar49", "radar50", "radar51", "radar52", "radar53", "radar54", "radar55",
"radar56", "radar57", "radar58", "radar59", "radar60", "radar61", "radar62", "radar63",
};
#if 0
@ -898,43 +913,75 @@ float CRadar::LimitRadarPoint(CVector2D &point)
}
#endif
#if 1
#if 0
WRAPPER void CRadar::LoadAllRadarBlips(int32) { EAXJMP(0x4A6F30); }
#else
void CRadar::LoadAllRadarBlips(int32)
{
}
#endif
#if 1
WRAPPER void CRadar::LoadTextures() { EAXJMP(0x4A4030); }
#else
void CRadar::LoadTextures()
{
}
#endif
#if 1
WRAPPER void CRadar::RemoveRadarSections() { EAXJMP(0x4A60E0); }
#else
void CRadar::RemoveRadarSections()
void CRadar::LoadAllRadarBlips(uint8 *buf, uint32 size)
{
Initialise();
INITSAVEBUF
CheckSaveHeader(buf, 'R', 'D', 'R', '\0', size - SAVE_HEADER_SIZE);
for (int i = 0; i < NUMRADARBLIPS; i++)
ms_RadarTrace[i] = ReadSaveBuf<CBlip>(buf);
VALIDATESAVEBUF(size);
}
#endif
#if 0
WRAPPER void CRadar::RemoveMapSection(int32, int32) { EAXJMP(0x00); }
WRAPPER void CRadar::LoadTextures() { EAXJMP(0x4A4030); }
#else
void CRadar::RemoveMapSection(int32 x, int32 y)
void
CRadar::LoadTextures()
{
CTxdStore::PushCurrentTxd();
CTxdStore::SetCurrentTxd(CTxdStore::FindTxdSlot("hud"));
AsukaSprite.SetTexture("radar_asuka");
BombSprite.SetTexture("radar_bomb");
CatSprite.SetTexture("radar_cat");
CentreSprite.SetTexture("radar_centre");
CopcarSprite.SetTexture("radar_copcar");
DonSprite.SetTexture("radar_don");
EightSprite.SetTexture("radar_eight");
ElSprite.SetTexture("radar_el");
IceSprite.SetTexture("radar_ice");
JoeySprite.SetTexture("radar_joey");
KenjiSprite.SetTexture("radar_kenji");
LizSprite.SetTexture("radar_liz");
LuigiSprite.SetTexture("radar_luigi");
NorthSprite.SetTexture("radar_north");
RaySprite.SetTexture("radar_ray");
SalSprite.SetTexture("radar_sal");
SaveSprite.SetTexture("radar_save");
SpraySprite.SetTexture("radar_spray");
TonySprite.SetTexture("radar_tony");
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
@ -945,12 +992,19 @@ void CRadar::RequestMapSection(int32 x, int32 y)
}
#endif
#if 1
#if 0
WRAPPER void CRadar::SaveAllRadarBlips(int32) { EAXJMP(0x4A6E30); }
#else
void CRadar::SaveAllRadarBlips(int32)
void CRadar::SaveAllRadarBlips(uint8 *buf, uint32 *size)
{
*size = SAVE_HEADER_SIZE + sizeof(ms_RadarTrace);
INITSAVEBUF
WriteSaveHeader(buf, 'R', 'D', 'R', '\0', *size - SAVE_HEADER_SIZE);
for (int i = 0; i < NUMRADARBLIPS; i++)
WriteSaveBuf(buf, ms_RadarTrace[i]);
VALIDATESAVEBUF(*size);
}
#endif
@ -1010,7 +1064,7 @@ int CRadar::SetEntityBlip(eBlipType type, int32 handle, int32 color, eBlipDispla
ms_RadarTrace[nextBlip].m_wScale = 1;
ms_RadarTrace[nextBlip].m_eBlipDisplay = display;
ms_RadarTrace[nextBlip].m_IconID = RADAR_SPRITE_NONE;
return CRadar::GetNewUniqueBlipIndex(nextBlip);
return GetNewUniqueBlipIndex(nextBlip);
}
#endif
@ -1102,21 +1156,41 @@ void CRadar::ShowRadarTraceWithHeight(float x, float y, uint32 size, uint8 red,
}
}
#if 1
#if 0
WRAPPER void CRadar::Shutdown() { EAXJMP(0x4A3F60); }
#else
void CRadar::Shutdown()
{
AsukaSprite.Delete();
BombSprite.Delete();
CatSprite.Delete();
CentreSprite.Delete();
CopcarSprite.Delete();
DonSprite.Delete();
EightSprite.Delete();
ElSprite.Delete();
IceSprite.Delete();
JoeySprite.Delete();
KenjiSprite.Delete();
LizSprite.Delete();
LuigiSprite.Delete();
NorthSprite.Delete();
RaySprite.Delete();
SalSprite.Delete();
SaveSprite.Delete();
SpraySprite.Delete();
TonySprite.Delete();
WeaponSprite.Delete();
RemoveRadarSections();
}
#endif
#if 1
#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
@ -1359,14 +1433,14 @@ int CRadar::LineRadarBoxCollision(CVector2D &out, const CVector2D &p1, const CVe
#endif
STARTPATCHES
// InjectHook(0x4A3EF0, CRadar::Initialise, PATCH_JUMP);
// InjectHook(0x4A3F60, CRadar::Shutdown, PATCH_JUMP);
// InjectHook(0x4A4030, CRadar::LoadTextures, PATCH_JUMP);
// InjectHook(0x4A4180, CRadar::GetNewUniqueBlipIndex, PATCH_JUMP);
InjectHook(0x4A3EF0, CRadar::Initialise, PATCH_JUMP);
InjectHook(0x4A3F60, CRadar::Shutdown, PATCH_JUMP);
InjectHook(0x4A4030, CRadar::LoadTextures, PATCH_JUMP);
InjectHook(0x4A4180, CRadar::GetNewUniqueBlipIndex, PATCH_JUMP);
InjectHook(0x4A41C0, CRadar::GetActualBlipArrayIndex, PATCH_JUMP);
InjectHook(0x4A4200, CRadar::DrawMap, PATCH_JUMP);
InjectHook(0x4A42F0, CRadar::DrawBlips, PATCH_JUMP);
// InjectHook(0x4A4C70, CRadar::Draw3dMarkers, PATCH_JUMP);
InjectHook(0x4A4C70, CRadar::Draw3dMarkers, PATCH_JUMP);
InjectHook(0x4A4F30, CRadar::LimitRadarPoint, PATCH_JUMP);
InjectHook(0x4A4F90, CRadar::CalculateBlipAlpha, PATCH_JUMP);
InjectHook(0x4A5040, CRadar::TransformRadarPointToScreenSpace, PATCH_JUMP);
@ -1376,11 +1450,11 @@ STARTPATCHES
InjectHook(0x4A5590, CRadar::SetCoordBlip, PATCH_JUMP);
InjectHook(0x4A5640, CRadar::SetEntityBlip, PATCH_JUMP);
InjectHook(0x4A56C0, CRadar::ClearBlipForEntity, PATCH_JUMP);
// InjectHook(0x4A5720, CRadar::ClearBlip, PATCH_JUMP);
// InjectHook(0x4A5770, CRadar::ChangeBlipColour, PATCH_JUMP);
// InjectHook(0x4A57A0, CRadar::ChangeBlipBrightness, PATCH_JUMP);
// InjectHook(0x4A57E0, CRadar::ChangeBlipScale, PATCH_JUMP);
// InjectHook(0x4A5810, CRadar::ChangeBlipDisplay, PATCH_JUMP);
InjectHook(0x4A5720, CRadar::ClearBlip, PATCH_JUMP);
InjectHook(0x4A5770, CRadar::ChangeBlipColour, PATCH_JUMP);
InjectHook(0x4A57A0, CRadar::ChangeBlipBrightness, PATCH_JUMP);
InjectHook(0x4A57E0, CRadar::ChangeBlipScale, PATCH_JUMP);
InjectHook(0x4A5810, CRadar::ChangeBlipDisplay, PATCH_JUMP);
InjectHook(0x4A5840, CRadar::SetBlipSprite, PATCH_JUMP);
InjectHook(0x4A5870, CRadar::ShowRadarTrace, PATCH_JUMP);
InjectHook(0x4A59C0, CRadar::ShowRadarMarker, PATCH_JUMP);
@ -1388,15 +1462,15 @@ STARTPATCHES
InjectHook(0x4A5C60, CRadar::SetRadarMarkerState, PATCH_JUMP);
InjectHook(0x4A5D10, CRadar::DrawRotatingRadarSprite, PATCH_JUMP);
InjectHook(0x4A5EF0, CRadar::DrawRadarSprite, PATCH_JUMP);
// InjectHook(0x4A60E0, CRadar::RemoveRadarSections, PATCH_JUMP);
// InjectHook(0x4A6100, CRadar::StreamRadarSections, PATCH_JUMP);
InjectHook(0x4A60E0, CRadar::RemoveRadarSections, PATCH_JUMP);
InjectHook(0x4A6100, (void (*)(int32, int32))&CRadar::StreamRadarSections, PATCH_JUMP);
InjectHook(0x4A64A0, CRadar::ClipRadarPoly, PATCH_JUMP);
InjectHook(0x4A67E0, CRadar::DrawRadarSection, PATCH_JUMP);
InjectHook(0x4A69C0, CRadar::DrawRadarMask, PATCH_JUMP);
// InjectHook(0x4A6B60, CRadar::StreamRadarSections, PATCH_JUMP);
InjectHook(0x4A6B60, (void (*)(const CVector&))&CRadar::StreamRadarSections, PATCH_JUMP);
InjectHook(0x4A6C20, CRadar::DrawRadarMap, PATCH_JUMP);
// InjectHook(0x4A6E30, CRadar::SaveAllRadarBlips, PATCH_JUMP);
// InjectHook(0x4A6F30, CRadar::LoadAllRadarBlips, PATCH_JUMP);
InjectHook(0x4A6E30, CRadar::SaveAllRadarBlips, PATCH_JUMP);
InjectHook(0x4A6F30, CRadar::LoadAllRadarBlips, PATCH_JUMP);
InjectHook(0x4A61C0, CRadar::GetTextureCorners, PATCH_JUMP);
InjectHook(0x4A6160, CRadar::IsPointInsideRadar, PATCH_JUMP);

View File

@ -59,7 +59,7 @@ struct CBlip
int32 m_nEntityHandle;
CVector2D m_vec2DPos;
CVector m_vecPos;
int16 m_BlipIndex;
uint16 m_BlipIndex;
bool m_bDim;
bool m_bInUse;
float m_Radius;
@ -80,26 +80,26 @@ class CRadar
public:
static float &m_radarRange;
static CBlip (&ms_RadarTrace)[NUMRADARBLIPS];
static CSprite2d *AsukaSprite;
static CSprite2d *BombSprite;
static CSprite2d *CatSprite;
static CSprite2d *CentreSprite;
static CSprite2d *CopcarSprite;
static CSprite2d *DonSprite;
static CSprite2d *EightSprite;
static CSprite2d *ElSprite;
static CSprite2d *IceSprite;
static CSprite2d *JoeySprite;
static CSprite2d *KenjiSprite;
static CSprite2d *LizSprite;
static CSprite2d *LuigiSprite;
static CSprite2d *NorthSprite;
static CSprite2d *RaySprite;
static CSprite2d *SalSprite;
static CSprite2d *SaveSprite;
static CSprite2d *SpraySprite;
static CSprite2d *TonySprite;
static CSprite2d *WeaponSprite;
static CSprite2d AsukaSprite;
static CSprite2d BombSprite;
static CSprite2d CatSprite;
static CSprite2d CentreSprite;
static CSprite2d CopcarSprite;
static CSprite2d DonSprite;
static CSprite2d EightSprite;
static CSprite2d ElSprite;
static CSprite2d IceSprite;
static CSprite2d JoeySprite;
static CSprite2d KenjiSprite;
static CSprite2d LizSprite;
static CSprite2d LuigiSprite;
static CSprite2d NorthSprite;
static CSprite2d RaySprite;
static CSprite2d SalSprite;
static CSprite2d SaveSprite;
static CSprite2d SpraySprite;
static CSprite2d TonySprite;
static CSprite2d WeaponSprite;
static CSprite2d *RadarSprites[21];
public:
@ -125,12 +125,11 @@ public:
static uint32 GetRadarTraceColour(uint32 color, bool bright);
static void Initialise();
static float LimitRadarPoint(CVector2D &point);
static void LoadAllRadarBlips(int32);
static void LoadAllRadarBlips(uint8 *buf, uint32 size);
static void LoadTextures();
static void RemoveRadarSections();
static void RemoveMapSection(int32 x, int32 y);
static void RequestMapSection(int32 x, int32 y);
static void SaveAllRadarBlips(int32);
static void SaveAllRadarBlips(uint8*, uint32*);
static void SetBlipSprite(int32 i, int32 icon);
static int32 SetCoordBlip(eBlipType type, CVector pos, int32, eBlipDisplay);
static int32 SetEntityBlip(eBlipType type, int32, int32, eBlipDisplay);

111
src/weapons/Explosion.cpp Normal file
View File

@ -0,0 +1,111 @@
#include "common.h"
#include "patcher.h"
#include "DMAudio.h"
#include "Explosion.h"
CExplosion(&gaExplosion)[48] = *(CExplosion(*)[48])*(uintptr*)0x64E208;
WRAPPER void CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32) { EAXJMP(0x5591C0); }
//WRAPPER void CExplosion::RemoveAllExplosionsInArea(CVector, float) { EAXJMP(0x55AD40); }
//WRAPPER bool CExplosion::TestForExplosionInArea(eExplosionType, float, float, float, float, float, float) { EAXJMP(0x55AC80); }
int AudioHandle = AEHANDLE_NONE;
void
CExplosion::Initialise()
{
debug("Initialising CExplosion...\n");
for (int i = 0; i < ARRAY_SIZE(gaExplosion); i++) {
gaExplosion[i].m_ExplosionType = EXPLOSION_GRENADE;
gaExplosion[i].m_vecPosition.x = 0.0f;
gaExplosion[i].m_vecPosition.y = 0.0f;
gaExplosion[i].m_vecPosition.z = 0.0f;
gaExplosion[i].m_fRadius = 1.0f;
gaExplosion[i].m_fPropagationRate = 0.0f;
gaExplosion[i].field_38 = 0;
gaExplosion[i].m_pCreatorEntity = nil;
gaExplosion[i].m_pVictimEntity = nil;
gaExplosion[i].m_fStopTime = 0.0f;
gaExplosion[i].m_bActive = false;
gaExplosion[i].m_nStartTime = 0;
gaExplosion[i].field_34 = 0;
}
AudioHandle = DMAudio.CreateEntity(AUDIOTYPE_EXPLOSION, (void*)1);
if (AudioHandle >= 0)
DMAudio.SetEntityStatus(AudioHandle, 1);
debug("CExplosion ready\n");
}
void CExplosion::Shutdown()
{
debug("Shutting down CExplosion...\n");
if (AudioHandle >= 0) {
DMAudio.DestroyEntity(AudioHandle);
AudioHandle = AEHANDLE_NONE;
}
debug("CExplosion shut down\n");
}
void
CExplosion::RemoveAllExplosionsInArea(CVector pos, float radius)
{
for (int i = 0; i < ARRAY_SIZE(gaExplosion); i++) {
if (gaExplosion[i].m_bActive) {
if ((pos - gaExplosion[i].m_vecPosition).MagnitudeSqr() < SQR(radius))
gaExplosion[i].m_bActive = false;
}
}
}
int8
CExplosion::GetExplosionActiveCounter(uint8 id)
{
return gaExplosion[id].m_bActiveCounter;
}
CVector *
CExplosion::GetExplosionPosition(uint8 id)
{
return &gaExplosion[id].m_vecPosition;
}
uint8
CExplosion::GetExplosionType(uint8 id)
{
return gaExplosion[id].m_ExplosionType;
}
void
CExplosion::ResetExplosionActiveCounter(uint8 id)
{
gaExplosion[id].m_bActiveCounter = 0;
}
bool
CExplosion::TestForExplosionInArea(eExplosionType a1, float x1, float x2, float y1, float y2, float z1, float z2)
{
for (int i = 0; i < ARRAY_SIZE(gaExplosion); i++) {
if (gaExplosion[i].m_bActive) {
if (a1 == gaExplosion[i].m_ExplosionType) {
if (gaExplosion[i].m_vecPosition.x >= x1 && gaExplosion[i].m_vecPosition.x <= x2) {
if (gaExplosion[i].m_vecPosition.y >= y1 && gaExplosion[i].m_vecPosition.y <= y2) {
if (gaExplosion[i].m_vecPosition.z >= z1 && gaExplosion[i].m_vecPosition.z <= z2)
return true;
}
}
}
}
}
return false;
}
STARTPATCHES
InjectHook(0x559030, &CExplosion::Initialise, PATCH_JUMP);
InjectHook(0x559100, &CExplosion::Shutdown, PATCH_JUMP);
InjectHook(0x55AD40, &CExplosion::RemoveAllExplosionsInArea, PATCH_JUMP);
InjectHook(0x559140, &CExplosion::GetExplosionActiveCounter, PATCH_JUMP);
InjectHook(0x5591A0, &CExplosion::GetExplosionPosition, PATCH_JUMP);
InjectHook(0x559180, &CExplosion::GetExplosionType, PATCH_JUMP);
InjectHook(0x559160, &CExplosion::ResetExplosionActiveCounter, PATCH_JUMP);
InjectHook(0x55AC80, &CExplosion::TestForExplosionInArea, PATCH_JUMP);
ENDPATCHES

View File

@ -19,7 +19,23 @@ enum eExplosionType
class CExplosion
{
eExplosionType m_ExplosionType;
CVector m_vecPosition;
float m_fRadius;
float m_fPropagationRate;
CEntity *m_pCreatorEntity;
CEntity *m_pVictimEntity;
float m_fStopTime;
bool m_bActive;
int8 m_bActiveCounter;
int32 m_nStartTime;
uint32 m_nParticlesExpireTime;
float m_fPower;
int32 field_34;
int32 field_38;
public:
static void Initialise();
static void Shutdown();
static void AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type,
const CVector &pos, uint32);
@ -30,3 +46,5 @@ public:
static void RemoveAllExplosionsInArea(CVector, float);
static bool TestForExplosionInArea(eExplosionType, float, float, float, float, float, float);
};
extern CExplosion (&gaExplosion)[48];