More turns

-Flying Vehicle
-Proximinity Mine
This commit is contained in:
marauder2k7 2021-09-20 14:17:10 +01:00
parent 704eb27600
commit 30b57c0f95
4 changed files with 50 additions and 46 deletions

View file

@ -74,16 +74,16 @@ IMPLEMENT_CALLBACK( ProximityMineData, onExplode, void, ( ProximityMine* obj, Po
ProximityMineData::ProximityMineData() ProximityMineData::ProximityMineData()
: armingDelay( 0 ), : armingDelay( 0 ),
armingSequence( -1 ), armingSequence( -1 ),
armingSound( NULL ),
triggerRadius( 5.0f ), triggerRadius( 5.0f ),
triggerSpeed( 1.0f ), triggerSpeed( 1.0f ),
autoTriggerDelay( 0 ), autoTriggerDelay( 0 ),
triggerOnOwner( false ), triggerOnOwner( false ),
triggerDelay( 0 ), triggerDelay( 0 ),
triggerSequence( -1 ), triggerSequence( -1 ),
triggerSound( NULL ),
explosionOffset( 0.05f ) explosionOffset( 0.05f )
{ {
INIT_SOUNDASSET(ArmSound);
INIT_SOUNDASSET(TriggerSound);
} }
void ProximityMineData::initPersistFields() void ProximityMineData::initPersistFields()
@ -91,9 +91,9 @@ void ProximityMineData::initPersistFields()
addGroup( "Arming" ); addGroup( "Arming" );
addField( "armingDelay", TypeF32, Offset(armingDelay, ProximityMineData), addField( "armingDelay", TypeF32, Offset(armingDelay, ProximityMineData),
"Delay (in seconds) from when the mine is placed to when it becomes active." ); "Delay (in seconds) from when the mine is placed to when it becomes active." );
addField( "armingSound", TypeSFXTrackName, Offset(armingSound, ProximityMineData),
"Sound to play when the mine is armed (starts at the same time as " INITPERSISTFIELD_SOUNDASSET(ArmSound, ProximityMineData, "Arming sound for this proximity mine.");
"the <i>armed</i> sequence if defined)." );
endGroup( "Arming" ); endGroup( "Arming" );
addGroup( "Triggering" ); addGroup( "Triggering" );
@ -111,9 +111,9 @@ void ProximityMineData::initPersistFields()
"Speed above which moving objects within the trigger radius will trigger the mine" ); "Speed above which moving objects within the trigger radius will trigger the mine" );
addField( "triggerDelay", TypeF32, Offset(triggerDelay, ProximityMineData), addField( "triggerDelay", TypeF32, Offset(triggerDelay, ProximityMineData),
"Delay (in seconds) from when the mine is triggered until it explodes." ); "Delay (in seconds) from when the mine is triggered until it explodes." );
addField( "triggerSound", TypeSFXTrackName, Offset(triggerSound, ProximityMineData),
"Sound to play when the mine is triggered (starts at the same time as " INITPERSISTFIELD_SOUNDASSET(TriggerSound, ProximityMineData, "Arming sound for this proximity mine.");
"the <i>triggered</i> sequence if defined)." );
endGroup( "Triggering" ); endGroup( "Triggering" );
addGroup( "Explosion" ); addGroup( "Explosion" );
@ -135,12 +135,10 @@ bool ProximityMineData::preload( bool server, String& errorStr )
if ( !server ) if ( !server )
{ {
// Resolve sounds if( !getArmSound() )
String sfxErrorStr; Con::errorf( ConsoleLogEntry::General, "ProximityMineData::preload: Invalid arming sound." );
if( !sfxResolve( &armingSound, sfxErrorStr ) ) if( !getTriggerSound() )
Con::errorf( ConsoleLogEntry::General, "ProximityMineData::preload: Invalid packet: %s", sfxErrorStr.c_str() ); Con::errorf( ConsoleLogEntry::General, "ProximityMineData::preload: Invalid trigger sound." );
if( !sfxResolve( &triggerSound, sfxErrorStr ) )
Con::errorf( ConsoleLogEntry::General, "ProximityMineData::preload: Invalid packet: %s", sfxErrorStr.c_str() );
} }
if ( mShape ) if ( mShape )
@ -158,14 +156,14 @@ void ProximityMineData::packData( BitStream* stream )
Parent::packData( stream ); Parent::packData( stream );
stream->write( armingDelay ); stream->write( armingDelay );
sfxWrite( stream, armingSound ); PACKDATA_SOUNDASSET(ArmSound);
stream->write( autoTriggerDelay ); stream->write( autoTriggerDelay );
stream->writeFlag( triggerOnOwner ); stream->writeFlag( triggerOnOwner );
stream->write( triggerRadius ); stream->write( triggerRadius );
stream->write( triggerSpeed ); stream->write( triggerSpeed );
stream->write( triggerDelay ); stream->write( triggerDelay );
sfxWrite( stream, triggerSound ); PACKDATA_SOUNDASSET(TriggerSound);
} }
void ProximityMineData::unpackData( BitStream* stream ) void ProximityMineData::unpackData( BitStream* stream )
@ -173,14 +171,14 @@ void ProximityMineData::unpackData( BitStream* stream )
Parent::unpackData(stream); Parent::unpackData(stream);
stream->read( &armingDelay ); stream->read( &armingDelay );
sfxRead( stream, &armingSound ); UNPACKDATA_SOUNDASSET(ArmSound);
stream->read( &autoTriggerDelay ); stream->read( &autoTriggerDelay );
triggerOnOwner = stream->readFlag(); triggerOnOwner = stream->readFlag();
stream->read( &triggerRadius ); stream->read( &triggerRadius );
stream->read( &triggerSpeed ); stream->read( &triggerSpeed );
stream->read( &triggerDelay ); stream->read( &triggerDelay );
sfxRead( stream, &triggerSound ); UNPACKDATA_SOUNDASSET(TriggerSound);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -428,8 +426,8 @@ void ProximityMine::processTick( const Move* move )
mAnimThread = mShapeInstance->addThread(); mAnimThread = mShapeInstance->addThread();
mShapeInstance->setSequence( mAnimThread, mDataBlock->armingSequence, 0.0f ); mShapeInstance->setSequence( mAnimThread, mDataBlock->armingSequence, 0.0f );
} }
if ( mDataBlock->armingSound ) if ( mDataBlock->getArmSound() )
SFX->playOnce( mDataBlock->armingSound, &getRenderTransform() ); SFX->playOnce( mDataBlock->getArmSoundAsset()->getSfxProfile(), &getRenderTransform() );
} }
break; break;
@ -469,8 +467,8 @@ void ProximityMine::processTick( const Move* move )
mAnimThread = mShapeInstance->addThread(); mAnimThread = mShapeInstance->addThread();
mShapeInstance->setSequence( mAnimThread, mDataBlock->triggerSequence, 0.0f ); mShapeInstance->setSequence( mAnimThread, mDataBlock->triggerSequence, 0.0f );
} }
if ( mDataBlock->triggerSound ) if ( mDataBlock->getTriggerSound() )
SFX->playOnce( mDataBlock->triggerSound, &getRenderTransform() ); SFX->playOnce( mDataBlock->getTriggerSoundAsset()->getSfxProfile(), &getRenderTransform() );
if ( isServerObject() ) if ( isServerObject() )
mDataBlock->onTriggered_callback( this, sql.mList[0] ); mDataBlock->onTriggered_callback( this, sql.mList[0] );

View file

@ -27,6 +27,8 @@
#include "T3D/item.h" #include "T3D/item.h"
#endif #endif
#include "T3D/assets/SoundAsset.h"
class ExplosionData; class ExplosionData;
class SFXTrack; class SFXTrack;
class ProximityMine; class ProximityMine;
@ -43,7 +45,8 @@ struct ProximityMineData: public ItemData
public: public:
F32 armingDelay; F32 armingDelay;
S32 armingSequence; S32 armingSequence;
SFXTrack* armingSound; DECLARE_SOUNDASSET(ProximityMineData, ArmSound);
DECLARE_SOUNDASSET_SETGET(ProximityMineData, ArmSound);
F32 autoTriggerDelay; F32 autoTriggerDelay;
bool triggerOnOwner; bool triggerOnOwner;
@ -51,7 +54,8 @@ public:
F32 triggerSpeed; F32 triggerSpeed;
F32 triggerDelay; F32 triggerDelay;
S32 triggerSequence; S32 triggerSequence;
SFXTrack* triggerSound; DECLARE_SOUNDASSET(ProximityMineData, TriggerSound);
DECLARE_SOUNDASSET_SETGET(ProximityMineData, TriggerSound);
F32 explosionOffset; F32 explosionOffset;

View file

@ -116,7 +116,7 @@ FlyingVehicleData::FlyingVehicleData()
jetEmitter[j] = 0; jetEmitter[j] = 0;
for (S32 i = 0; i < MaxSounds; i++) for (S32 i = 0; i < MaxSounds; i++)
sound[i] = 0; INIT_SOUNDASSET_ARRAY(FlyingSounds, i);
vertThrustMultiple = 1.0; vertThrustMultiple = 1.0;
} }
@ -131,8 +131,10 @@ bool FlyingVehicleData::preload(bool server, String &errorStr)
// Resolve objects transmitted from server // Resolve objects transmitted from server
if (!server) { if (!server) {
for (S32 i = 0; i < MaxSounds; i++) for (S32 i = 0; i < MaxSounds; i++)
if (sound[i]) if (mFlyingSounds[i])
Sim::findObject(SimObjectId((uintptr_t)sound[i]),sound[i]); {
_setFlyingSounds(getFlyingSounds(i), i);
}
for (S32 j = 0; j < MaxJetEmitters; j++) for (S32 j = 0; j < MaxJetEmitters; j++)
if (jetEmitter[j]) if (jetEmitter[j])
@ -163,10 +165,8 @@ bool FlyingVehicleData::preload(bool server, String &errorStr)
void FlyingVehicleData::initPersistFields() void FlyingVehicleData::initPersistFields()
{ {
addField( "jetSound", TYPEID< SFXProfile >(), Offset(sound[JetSound], FlyingVehicleData),
"Looping sound to play while the vehicle is jetting." ); INITPERSISTFIELD_SOUNDASSET_ARRAY(FlyingSounds, Sounds::MaxSounds, FlyingVehicleData, "Sounds for flying vehicle");
addField( "engineSound", TYPEID< SFXProfile >(), Offset(sound[EngineSound], FlyingVehicleData),
"Looping engine sound." );
addField( "maneuveringForce", TypeF32, Offset(maneuveringForce, FlyingVehicleData), addField( "maneuveringForce", TypeF32, Offset(maneuveringForce, FlyingVehicleData),
"@brief Maximum X and Y (horizontal plane) maneuvering force.\n\n" "@brief Maximum X and Y (horizontal plane) maneuvering force.\n\n"
@ -240,11 +240,7 @@ void FlyingVehicleData::packData(BitStream* stream)
for (S32 i = 0; i < MaxSounds; i++) for (S32 i = 0; i < MaxSounds; i++)
{ {
if (stream->writeFlag(sound[i])) PACKDATA_SOUNDASSET_ARRAY(FlyingSounds, i);
{
SimObjectId writtenId = mPacked ? SimObjectId((uintptr_t)sound[i]) : sound[i]->getId();
stream->writeRangedU32(writtenId, DataBlockObjectIdFirst, DataBlockObjectIdLast);
}
} }
for (S32 j = 0; j < MaxJetEmitters; j++) for (S32 j = 0; j < MaxJetEmitters; j++)
@ -277,11 +273,9 @@ void FlyingVehicleData::unpackData(BitStream* stream)
{ {
Parent::unpackData(stream); Parent::unpackData(stream);
for (S32 i = 0; i < MaxSounds; i++) { for (S32 i = 0; i < MaxSounds; i++)
sound[i] = NULL; {
if (stream->readFlag()) UNPACKDATA_SOUNDASSET_ARRAY(FlyingSounds, i);
sound[i] = (SFXProfile*)(uintptr_t)stream->readRangedU32(DataBlockObjectIdFirst,
DataBlockObjectIdLast);
} }
for (S32 j = 0; j < MaxJetEmitters; j++) { for (S32 j = 0; j < MaxJetEmitters; j++) {
@ -374,11 +368,11 @@ bool FlyingVehicle::onNewDataBlock(GameBaseData* dptr, bool reload)
SFX_DELETE( mJetSound ); SFX_DELETE( mJetSound );
SFX_DELETE( mEngineSound ); SFX_DELETE( mEngineSound );
if ( mDataBlock->sound[FlyingVehicleData::EngineSound] ) if ( mDataBlock->getFlyingSounds(FlyingVehicleData::EngineSound) )
mEngineSound = SFX->createSource( mDataBlock->sound[FlyingVehicleData::EngineSound], &getTransform() ); mEngineSound = SFX->createSource( mDataBlock->getFlyingSoundProfile(FlyingVehicleData::EngineSound), &getTransform() );
if ( mDataBlock->sound[FlyingVehicleData::JetSound] ) if ( mDataBlock->getFlyingSounds(FlyingVehicleData::JetSound))
mJetSound = SFX->createSource( mDataBlock->sound[FlyingVehicleData::JetSound], &getTransform() ); mJetSound = SFX->createSource( mDataBlock->getFlyingSoundProfile(FlyingVehicleData::JetSound), &getTransform() );
} }
// Jet Sequences // Jet Sequences

View file

@ -45,7 +45,15 @@ struct FlyingVehicleData: public VehicleData {
EngineSound, EngineSound,
MaxSounds, MaxSounds,
}; };
SFXProfile* sound[MaxSounds]; DECLARE_SOUNDASSET_ARRAY(FlyingVehicleData, FlyingSounds, Sounds::MaxSounds);
DECLARE_SOUNDASSET_ARRAY_SETGET(FlyingVehicleData, FlyingSounds);
SFXProfile* getFlyingSoundProfile(U32 id)
{
if (mFlyingSoundsAsset[id] != NULL)
return mFlyingSoundsAsset[id]->getSfxProfile();
else
return NULL;
}
enum Jets { enum Jets {
// These enums index into a static name list. // These enums index into a static name list.