mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-16 14:18:58 +00:00
commit
30b3f34d91
6 changed files with 120 additions and 56 deletions
|
@ -485,7 +485,7 @@ CPickups::RemovePickUp(int32 pickupIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
int32
|
int32
|
||||||
CPickups::GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quantity)
|
CPickups::GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quantity, uint32 rate, bool highPriority, wchar* pText)
|
||||||
{
|
{
|
||||||
bool bFreeFound = false;
|
bool bFreeFound = false;
|
||||||
int32 slot = 0;
|
int32 slot = 0;
|
||||||
|
|
|
@ -77,7 +77,7 @@ public:
|
||||||
static void DoMoneyEffects(CEntity *ent);
|
static void DoMoneyEffects(CEntity *ent);
|
||||||
static void DoMineEffects(CEntity *ent);
|
static void DoMineEffects(CEntity *ent);
|
||||||
static void DoPickUpEffects(CEntity *ent);
|
static void DoPickUpEffects(CEntity *ent);
|
||||||
static int32 GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quantity);
|
static int32 GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quantity, uint32 rate = 0, bool highPriority = false, wchar* pText = nil);
|
||||||
static int32 GenerateNewOne_WeaponType(CVector pos, eWeaponType weaponType, uint8 type, uint32 quantity);
|
static int32 GenerateNewOne_WeaponType(CVector pos, eWeaponType weaponType, uint8 type, uint32 quantity);
|
||||||
static void RemovePickUp(int32 pickupIndex);
|
static void RemovePickUp(int32 pickupIndex);
|
||||||
static void RemoveAllFloatingPickups();
|
static void RemoveAllFloatingPickups();
|
||||||
|
|
|
@ -9945,7 +9945,31 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||||
case COMMAND_LOAD_AND_LAUNCH_MISSION_EXCLUSIVE:
|
case COMMAND_LOAD_AND_LAUNCH_MISSION_EXCLUSIVE:
|
||||||
case COMMAND_IS_MISSION_AUDIO_PLAYING:
|
case COMMAND_IS_MISSION_AUDIO_PLAYING:
|
||||||
case COMMAND_CREATE_LOCKED_PROPERTY_PICKUP:
|
case COMMAND_CREATE_LOCKED_PROPERTY_PICKUP:
|
||||||
|
{
|
||||||
|
CollectParameters(&m_nIp, 3);
|
||||||
|
CVector pos = *(CVector*)&ScriptParams[0];
|
||||||
|
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||||
|
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET;
|
||||||
|
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||||
|
// TODO(MIAMI) - add text
|
||||||
|
CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
|
||||||
|
ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY, PICKUP_PROPERTY_LOCKED, 0, 0, false, text);
|
||||||
|
StoreParameters(&m_nIp, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case COMMAND_CREATE_FORSALE_PROPERTY_PICKUP:
|
case COMMAND_CREATE_FORSALE_PROPERTY_PICKUP:
|
||||||
|
{
|
||||||
|
CollectParameters(&m_nIp, 4);
|
||||||
|
CVector pos = *(CVector*)&ScriptParams[0];
|
||||||
|
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||||
|
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET;
|
||||||
|
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||||
|
// TODO(MIAMI) - add text
|
||||||
|
CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
|
||||||
|
ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY_FORSALE, PICKUP_PROPERTY_FORSALE, ScriptParams[3], 0, false, text);
|
||||||
|
StoreParameters(&m_nIp, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case COMMAND_FREEZE_CAR_POSITION:
|
case COMMAND_FREEZE_CAR_POSITION:
|
||||||
case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CHAR:
|
case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CHAR:
|
||||||
case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CAR:
|
case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CAR:
|
||||||
|
@ -10034,6 +10058,18 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||||
case COMMAND_DOES_VEHICLE_EXIST:
|
case COMMAND_DOES_VEHICLE_EXIST:
|
||||||
case COMMAND_ADD_SHORT_RANGE_BLIP_FOR_CONTACT_POINT:
|
case COMMAND_ADD_SHORT_RANGE_BLIP_FOR_CONTACT_POINT:
|
||||||
case COMMAND_ADD_SHORT_RANGE_SPRITE_BLIP_FOR_CONTACT_POINT:
|
case COMMAND_ADD_SHORT_RANGE_SPRITE_BLIP_FOR_CONTACT_POINT:
|
||||||
|
{
|
||||||
|
CollectParameters(&m_nIp, 4);
|
||||||
|
CVector pos = *(CVector*)&ScriptParams[0];
|
||||||
|
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||||
|
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
||||||
|
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
|
||||||
|
int id = CRadar::SetShortRangeCoordBlip(BLIP_COORD, pos, 2, BLIP_DISPLAY_BOTH);
|
||||||
|
CRadar::SetBlipSprite(id, ScriptParams[3]);
|
||||||
|
ScriptParams[0] = id;
|
||||||
|
StoreParameters(&m_nIp, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case COMMAND_IS_CHAR_STUCK:
|
case COMMAND_IS_CHAR_STUCK:
|
||||||
case COMMAND_SET_ALL_TAXIS_HAVE_NITRO:
|
case COMMAND_SET_ALL_TAXIS_HAVE_NITRO:
|
||||||
case COMMAND_SET_CHAR_STOP_SHOOT_DONT_SEEK_ENTITY:
|
case COMMAND_SET_CHAR_STOP_SHOOT_DONT_SEEK_ENTITY:
|
||||||
|
|
|
@ -158,7 +158,9 @@
|
||||||
X("subplatform_n", MI_SUBPLATFORM_COMN, 0x5F5BB8) \
|
X("subplatform_n", MI_SUBPLATFORM_COMN, 0x5F5BB8) \
|
||||||
X("Otherside_subway", MI_SUBPLATFORM_SUB, 0x5F5BBC) \
|
X("Otherside_subway", MI_SUBPLATFORM_SUB, 0x5F5BBC) \
|
||||||
X("subplatform_sub", MI_SUBPLATFORM_SUB2, 0x5F5BC0) \
|
X("subplatform_sub", MI_SUBPLATFORM_SUB2, 0x5F5BC0) \
|
||||||
X("files", MI_FILES, 0x5F5BC4)
|
X("files", MI_FILES, 0x5F5BC4) \
|
||||||
|
X("property_locked", MI_PICKUP_PROPERTY, 0x0) \
|
||||||
|
X("property_fsale", MI_PICKUP_PROPERTY_FORSALE, 0x0)
|
||||||
|
|
||||||
#define X(name, var, addr) extern int16 var;
|
#define X(name, var, addr) extern int16 var;
|
||||||
MODELINDICES
|
MODELINDICES
|
||||||
|
|
|
@ -12,7 +12,9 @@
|
||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
|
#include "VisibilityPlugins.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
#include "Zones.h"
|
||||||
|
|
||||||
uint8 CTheCarGenerators::ProcessCounter;
|
uint8 CTheCarGenerators::ProcessCounter;
|
||||||
uint32 CTheCarGenerators::NumOfCarGenerators;
|
uint32 CTheCarGenerators::NumOfCarGenerators;
|
||||||
|
@ -38,21 +40,43 @@ uint32 CCarGenerator::CalcNextGen()
|
||||||
return CTimer::GetTimeInMilliseconds() + 4;
|
return CTimer::GetTimeInMilliseconds() + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO(MIAMI): check for more changes - so far only -1 mi is accounted for
|
||||||
void CCarGenerator::DoInternalProcessing()
|
void CCarGenerator::DoInternalProcessing()
|
||||||
{
|
{
|
||||||
if (CheckForBlockage()) {
|
int mi;
|
||||||
m_nTimer += 4;
|
|
||||||
if (m_nUsesRemaining == 0)
|
|
||||||
--CTheCarGenerators::CurrentActiveCount;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (CCarCtrl::NumParkedCars >= 10)
|
if (CCarCtrl::NumParkedCars >= 10)
|
||||||
return;
|
return;
|
||||||
CStreaming::RequestModel(m_nModelIndex, STREAMFLAGS_DEPENDENCY);
|
if (m_nModelIndex >= 0) {
|
||||||
if (!CStreaming::HasModelLoaded(m_nModelIndex))
|
if (CheckForBlockage(m_nModelIndex)) {
|
||||||
|
m_nTimer += 4;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mi = m_nModelIndex;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mi = -m_nModelIndex;
|
||||||
|
if (m_nModelIndex == -1 || !CStreaming::HasModelLoaded(mi)) {
|
||||||
|
CZoneInfo pZone;
|
||||||
|
CTheZones::GetZoneInfoForTimeOfDay(&FindPlayerCoors(), &pZone);
|
||||||
|
mi = CCarCtrl::ChooseCarModel(CCarCtrl::ChooseCarRating(&pZone));
|
||||||
|
if (mi < 0)
|
||||||
|
return;
|
||||||
|
m_nModelIndex = -mi;
|
||||||
|
m_nColor1 = -1;
|
||||||
|
m_nColor2 = -1;
|
||||||
|
}
|
||||||
|
if (CheckForBlockage(mi)) {
|
||||||
|
m_nTimer += 4;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CStreaming::RequestModel(mi, STREAMFLAGS_DEPENDENCY);
|
||||||
|
if (!CStreaming::HasModelLoaded(mi))
|
||||||
return;
|
return;
|
||||||
if (CModelInfo::IsBoatModel(m_nModelIndex)){
|
CVehicle* pVehicle;
|
||||||
CBoat* pBoat = new CBoat(m_nModelIndex, PARKED_VEHICLE);
|
if (CModelInfo::IsBoatModel(mi)){
|
||||||
|
CBoat* pBoat = new CBoat(mi, PARKED_VEHICLE);
|
||||||
|
pVehicle = pBoat;
|
||||||
pBoat->bIsStatic = false;
|
pBoat->bIsStatic = false;
|
||||||
pBoat->bEngineOn = false;
|
pBoat->bEngineOn = false;
|
||||||
CVector pos = m_vecPos;
|
CVector pos = m_vecPos;
|
||||||
|
@ -63,17 +87,7 @@ void CCarGenerator::DoInternalProcessing()
|
||||||
pBoat->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle));
|
pBoat->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle));
|
||||||
pBoat->SetStatus(STATUS_ABANDONED);
|
pBoat->SetStatus(STATUS_ABANDONED);
|
||||||
pBoat->m_nDoorLock = CARLOCK_UNLOCKED;
|
pBoat->m_nDoorLock = CARLOCK_UNLOCKED;
|
||||||
CWorld::Add(pBoat);
|
}else{ // TODO(MIAMI): bikes
|
||||||
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nAlarm)
|
|
||||||
pBoat->m_nAlarmState = -1;
|
|
||||||
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nDoorlock)
|
|
||||||
pBoat->m_nDoorLock = CARLOCK_LOCKED;
|
|
||||||
if (m_nColor1 != -1 && m_nColor2){
|
|
||||||
pBoat->m_currentColour1 = m_nColor1;
|
|
||||||
pBoat->m_currentColour2 = m_nColor2;
|
|
||||||
}
|
|
||||||
m_nVehicleHandle = CPools::GetVehiclePool()->GetIndex(pBoat);
|
|
||||||
}else{
|
|
||||||
bool groundFound = false;
|
bool groundFound = false;
|
||||||
CVector pos = m_vecPos;
|
CVector pos = m_vecPos;
|
||||||
if (pos.z > -100.0f){
|
if (pos.z > -100.0f){
|
||||||
|
@ -88,28 +102,35 @@ void CCarGenerator::DoInternalProcessing()
|
||||||
}
|
}
|
||||||
if (!groundFound) {
|
if (!groundFound) {
|
||||||
debug("CCarGenerator::DoInternalProcessing - can't find ground z for new car x = %f y = %f \n", m_vecPos.x, m_vecPos.y);
|
debug("CCarGenerator::DoInternalProcessing - can't find ground z for new car x = %f y = %f \n", m_vecPos.x, m_vecPos.y);
|
||||||
}else{
|
return;
|
||||||
CAutomobile* pCar = new CAutomobile(m_nModelIndex, PARKED_VEHICLE);
|
|
||||||
pCar->bIsStatic = false;
|
|
||||||
pCar->bEngineOn = false;
|
|
||||||
pos.z += pCar->GetDistanceFromCentreOfMassToBaseOfModel();
|
|
||||||
pCar->SetPosition(pos);
|
|
||||||
pCar->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle));
|
|
||||||
pCar->SetStatus(STATUS_ABANDONED);
|
|
||||||
pCar->bLightsOn = false;
|
|
||||||
pCar->m_nDoorLock = CARLOCK_UNLOCKED;
|
|
||||||
CWorld::Add(pCar);
|
|
||||||
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nAlarm)
|
|
||||||
pCar->m_nAlarmState = -1;
|
|
||||||
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nDoorlock)
|
|
||||||
pCar->m_nDoorLock = CARLOCK_LOCKED;
|
|
||||||
if (m_nColor1 != -1 && m_nColor2) {
|
|
||||||
pCar->m_currentColour1 = m_nColor1;
|
|
||||||
pCar->m_currentColour2 = m_nColor2;
|
|
||||||
}
|
|
||||||
m_nVehicleHandle = CPools::GetVehiclePool()->GetIndex(pCar);
|
|
||||||
}
|
}
|
||||||
|
CAutomobile* pCar = new CAutomobile(mi, PARKED_VEHICLE);
|
||||||
|
pVehicle = pCar;
|
||||||
|
pCar->bIsStatic = false;
|
||||||
|
pCar->bEngineOn = false;
|
||||||
|
pos.z += pCar->GetDistanceFromCentreOfMassToBaseOfModel();
|
||||||
|
pCar->SetPosition(pos);
|
||||||
|
pCar->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle));
|
||||||
|
pCar->SetStatus(STATUS_ABANDONED);
|
||||||
|
pCar->bLightsOn = false;
|
||||||
|
pCar->m_nDoorLock = CARLOCK_UNLOCKED;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
CWorld::Add(pVehicle);
|
||||||
|
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nAlarm)
|
||||||
|
pVehicle->m_nAlarmState = -1;
|
||||||
|
if (CGeneral::GetRandomNumberInRange(0, 100) < m_nDoorlock)
|
||||||
|
pVehicle->m_nDoorLock = CARLOCK_LOCKED;
|
||||||
|
if (m_nColor1 != -1 && m_nColor2 != -1) {
|
||||||
|
pVehicle->m_currentColour1 = m_nColor1;
|
||||||
|
pVehicle->m_currentColour2 = m_nColor2;
|
||||||
|
}
|
||||||
|
else if (m_nModelIndex < -1) {
|
||||||
|
m_nColor1 = pVehicle->m_currentColour1;
|
||||||
|
m_nColor2 = pVehicle->m_currentColour2;
|
||||||
|
}
|
||||||
|
CVisibilityPlugins::SetClumpAlpha(pVehicle->GetClump(), 0);
|
||||||
|
m_nVehicleHandle = CPools::GetVehiclePool()->GetIndex(pVehicle);
|
||||||
if (m_nUsesRemaining < -1) /* I don't think this is a correct comparasion */
|
if (m_nUsesRemaining < -1) /* I don't think this is a correct comparasion */
|
||||||
--m_nUsesRemaining;
|
--m_nUsesRemaining;
|
||||||
m_nTimer = CalcNextGen();
|
m_nTimer = CalcNextGen();
|
||||||
|
@ -155,25 +176,33 @@ void CCarGenerator::Setup(float x, float y, float z, float angle, int32 mi, int1
|
||||||
m_nTimer = CTimer::GetTimeInMilliseconds() + 1;
|
m_nTimer = CTimer::GetTimeInMilliseconds() + 1;
|
||||||
m_nUsesRemaining = 0;
|
m_nUsesRemaining = 0;
|
||||||
m_bIsBlocking = false;
|
m_bIsBlocking = false;
|
||||||
m_vecInf = CModelInfo::GetModelInfo(m_nModelIndex)->GetColModel()->boundingBox.min;
|
|
||||||
m_vecSup = CModelInfo::GetModelInfo(m_nModelIndex)->GetColModel()->boundingBox.max;
|
|
||||||
m_fSize = Max(m_vecInf.Magnitude(), m_vecSup.Magnitude());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCarGenerator::CheckForBlockage()
|
bool CCarGenerator::CheckForBlockage(int32 mi)
|
||||||
{
|
{
|
||||||
int16 entities;
|
int16 entities;
|
||||||
CWorld::FindObjectsKindaColliding(CVector(m_vecPos), m_fSize, 1, &entities, 2, nil, false, true, true, false, false);
|
CEntity* pEntities[8];
|
||||||
return entities > 0;
|
CColModel* pColModel = CModelInfo::GetModelInfo(mi)->GetColModel();
|
||||||
|
CWorld::FindObjectsKindaColliding(CVector(m_vecPos), pColModel->boundingSphere.radius, 1, &entities, 8, pEntities, false, true, true, false, false);
|
||||||
|
for (int i = 0; i < entities; i++) {
|
||||||
|
if (m_vecPos.z + pColModel->boundingBox.min.z < pEntities[i]->GetPosition().z + pEntities[i]->GetColModel()->boundingBox.max.z + 1.0f &&
|
||||||
|
m_vecPos.z + pColModel->boundingBox.max.z < pEntities[i]->GetPosition().z + pEntities[i]->GetColModel()->boundingBox.min.z - 1.0f) {
|
||||||
|
m_bIsBlocking = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCarGenerator::CheckIfWithinRangeOfAnyPlayer()
|
bool CCarGenerator::CheckIfWithinRangeOfAnyPlayer()
|
||||||
{
|
{
|
||||||
CVector2D direction = FindPlayerCentreOfWorld(CWorld::PlayerInFocus) - m_vecPos;
|
CVector2D direction = FindPlayerCentreOfWorld(CWorld::PlayerInFocus) - m_vecPos;
|
||||||
float distance = direction.Magnitude();
|
float distance = direction.Magnitude();
|
||||||
float farclip = 120.0f * TheCamera.GenerationDistMultiplier;
|
float farclip = 110.0f * TheCamera.GenerationDistMultiplier;
|
||||||
float nearclip = farclip - 20.0f;
|
float nearclip = farclip - 20.0f;
|
||||||
if (distance >= farclip){
|
bool canBeRemoved = (m_nModelIndex > 0 && CModelInfo::IsBoatModel(m_nModelIndex) && 165.0f * TheCamera.GenerationDistMultiplier > distance &&
|
||||||
|
TheCamera.IsPointVisible(m_vecPos, &TheCamera.GetCameraMatrix())); // TODO(MIAMI) COcclision::IsPositionOccluded(m_vecPos, 0.0f)
|
||||||
|
if (distance >= farclip || canBeRemoved){
|
||||||
if (m_bIsBlocking)
|
if (m_bIsBlocking)
|
||||||
m_bIsBlocking = false;
|
m_bIsBlocking = false;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -22,9 +22,6 @@ class CCarGenerator
|
||||||
int32 m_nVehicleHandle;
|
int32 m_nVehicleHandle;
|
||||||
uint16 m_nUsesRemaining;
|
uint16 m_nUsesRemaining;
|
||||||
bool m_bIsBlocking;
|
bool m_bIsBlocking;
|
||||||
CVector m_vecInf;
|
|
||||||
CVector m_vecSup;
|
|
||||||
float m_fSize;
|
|
||||||
public:
|
public:
|
||||||
void SwitchOff();
|
void SwitchOff();
|
||||||
void SwitchOn();
|
void SwitchOn();
|
||||||
|
@ -32,7 +29,7 @@ public:
|
||||||
void DoInternalProcessing();
|
void DoInternalProcessing();
|
||||||
void Process();
|
void Process();
|
||||||
void Setup(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay);
|
void Setup(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay);
|
||||||
bool CheckForBlockage();
|
bool CheckForBlockage(int32 mi);
|
||||||
bool CheckIfWithinRangeOfAnyPlayer();
|
bool CheckIfWithinRangeOfAnyPlayer();
|
||||||
void SetUsesRemaining(uint16 uses) { m_nUsesRemaining = uses; }
|
void SetUsesRemaining(uint16 uses) { m_nUsesRemaining = uses; }
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue