Merge pull request #346 from Sergeanur/Radar2

Finished CRadar, a bit of CExplosion
This commit is contained in:
erorcun 2020-03-17 20:47:12 +03:00 committed by GitHub
commit 31d16d395e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 1606 additions and 1436 deletions

View File

@ -63,7 +63,6 @@ CMotionBlurStreaks
CObject CObject
CPacManPickups CPacManPickups
CPedPath CPedPath
CRadar
CRecordDataForChase CRecordDataForChase
CRoadBlocks CRoadBlocks
CRubbish 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);
}

File diff suppressed because it is too large Load Diff

View File

@ -59,7 +59,7 @@ struct CBlip
int32 m_nEntityHandle; int32 m_nEntityHandle;
CVector2D m_vec2DPos; CVector2D m_vec2DPos;
CVector m_vecPos; CVector m_vecPos;
int16 m_BlipIndex; uint16 m_BlipIndex;
bool m_bDim; bool m_bDim;
bool m_bInUse; bool m_bInUse;
float m_Radius; float m_Radius;
@ -80,26 +80,26 @@ class CRadar
public: public:
static float &m_radarRange; static float &m_radarRange;
static CBlip (&ms_RadarTrace)[NUMRADARBLIPS]; static CBlip (&ms_RadarTrace)[NUMRADARBLIPS];
static CSprite2d *AsukaSprite; static CSprite2d AsukaSprite;
static CSprite2d *BombSprite; static CSprite2d BombSprite;
static CSprite2d *CatSprite; static CSprite2d CatSprite;
static CSprite2d *CentreSprite; static CSprite2d CentreSprite;
static CSprite2d *CopcarSprite; static CSprite2d CopcarSprite;
static CSprite2d *DonSprite; static CSprite2d DonSprite;
static CSprite2d *EightSprite; static CSprite2d EightSprite;
static CSprite2d *ElSprite; static CSprite2d ElSprite;
static CSprite2d *IceSprite; static CSprite2d IceSprite;
static CSprite2d *JoeySprite; static CSprite2d JoeySprite;
static CSprite2d *KenjiSprite; static CSprite2d KenjiSprite;
static CSprite2d *LizSprite; static CSprite2d LizSprite;
static CSprite2d *LuigiSprite; static CSprite2d LuigiSprite;
static CSprite2d *NorthSprite; static CSprite2d NorthSprite;
static CSprite2d *RaySprite; static CSprite2d RaySprite;
static CSprite2d *SalSprite; static CSprite2d SalSprite;
static CSprite2d *SaveSprite; static CSprite2d SaveSprite;
static CSprite2d *SpraySprite; static CSprite2d SpraySprite;
static CSprite2d *TonySprite; static CSprite2d TonySprite;
static CSprite2d *WeaponSprite; static CSprite2d WeaponSprite;
static CSprite2d *RadarSprites[21]; static CSprite2d *RadarSprites[21];
public: public:
@ -125,12 +125,11 @@ public:
static uint32 GetRadarTraceColour(uint32 color, bool bright); static uint32 GetRadarTraceColour(uint32 color, bool bright);
static void Initialise(); static void Initialise();
static float LimitRadarPoint(CVector2D &point); static float LimitRadarPoint(CVector2D &point);
static void LoadAllRadarBlips(int32); static void LoadAllRadarBlips(uint8 *buf, uint32 size);
static void LoadTextures(); static void LoadTextures();
static void RemoveRadarSections(); static void RemoveRadarSections();
static void RemoveMapSection(int32 x, int32 y);
static void RequestMapSection(int32 x, int32 y); static void RequestMapSection(int32 x, int32 y);
static void SaveAllRadarBlips(uint8 *buf, uint32 *size); static void SaveAllRadarBlips(uint8*, uint32*);
static void SetBlipSprite(int32 i, int32 icon); static void SetBlipSprite(int32 i, int32 icon);
static int32 SetCoordBlip(eBlipType type, CVector pos, int32, eBlipDisplay); static int32 SetCoordBlip(eBlipType type, CVector pos, int32, eBlipDisplay);
static int32 SetEntityBlip(eBlipType type, int32, 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 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: public:
static void Initialise();
static void Shutdown();
static void AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, static void AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type,
const CVector &pos, uint32); const CVector &pos, uint32);
@ -30,3 +46,5 @@ public:
static void RemoveAllExplosionsInArea(CVector, float); static void RemoveAllExplosionsInArea(CVector, float);
static bool TestForExplosionInArea(eExplosionType, float, float, float, float, float, float); static bool TestForExplosionInArea(eExplosionType, float, float, float, float, float, float);
}; };
extern CExplosion (&gaExplosion)[48];