Adding EmitSoundEntry() for engines >= portal 2
This commit is contained in:
parent
cddae6f456
commit
ee0575bbb0
@ -1130,6 +1130,147 @@ static cell_t EmitSound(IPluginContext *pContext, const cell_t *params)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t EmitSoundEntry(IPluginContext *pContext, const cell_t *params)
|
||||||
|
{
|
||||||
|
#if SOURCE_ENGINE < SE_PORTAL2
|
||||||
|
return pContext->ThrowNativeError("EmitSoundEntry is not available in this game.");
|
||||||
|
#else
|
||||||
|
cell_t *addr, *cl_array;
|
||||||
|
CellRecipientFilter crf;
|
||||||
|
unsigned int numClients;
|
||||||
|
int client;
|
||||||
|
IGamePlayer *pPlayer = NULL;
|
||||||
|
|
||||||
|
pContext->LocalToPhysAddr(params[1], &cl_array);
|
||||||
|
numClients = params[2];
|
||||||
|
|
||||||
|
/* Client validation */
|
||||||
|
for (unsigned int i = 0; i < numClients; i++)
|
||||||
|
{
|
||||||
|
client = cl_array[i];
|
||||||
|
pPlayer = playerhelpers->GetGamePlayer(client);
|
||||||
|
|
||||||
|
if (!pPlayer)
|
||||||
|
{
|
||||||
|
return pContext->ThrowNativeError("Client index %d is invalid", client);
|
||||||
|
}
|
||||||
|
else if (!pPlayer->IsInGame()) {
|
||||||
|
return pContext->ThrowNativeError("Client %d is not connected", client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crf.Initialize(cl_array, numClients);
|
||||||
|
|
||||||
|
char *soundEntry;
|
||||||
|
pContext->LocalToString(params[3], &soundEntry);
|
||||||
|
|
||||||
|
char *sample;
|
||||||
|
pContext->LocalToString(params[4], &sample);
|
||||||
|
|
||||||
|
// By default, we want the hash to equal maxint
|
||||||
|
unsigned int soundEntryHash = -1;
|
||||||
|
|
||||||
|
// We only generate a hash if the sample is not the same as the sound entry and the sound entry is not empty.
|
||||||
|
if (strcmp(soundEntry, sample) != 0 && strcmp(soundEntry, "") != 0)
|
||||||
|
soundEntryHash = GenerateSoundEntryHash(soundEntry);
|
||||||
|
|
||||||
|
int entity = SoundReferenceToIndex(params[5]);
|
||||||
|
int channel = params[6];
|
||||||
|
int level = params[7];
|
||||||
|
int seed = params[8];
|
||||||
|
int flags = params[9];
|
||||||
|
float vol = sp_ctof(params[10]);
|
||||||
|
int pitch = params[11];
|
||||||
|
int speakerentity = params[12];
|
||||||
|
|
||||||
|
Vector *pOrigin = NULL, origin;
|
||||||
|
Vector *pDir = NULL, dir;
|
||||||
|
|
||||||
|
pContext->LocalToPhysAddr(params[13], &addr);
|
||||||
|
if (addr != pContext->GetNullRef(SP_NULL_VECTOR))
|
||||||
|
{
|
||||||
|
pOrigin = &origin;
|
||||||
|
origin.x = sp_ctof(addr[0]);
|
||||||
|
origin.y = sp_ctof(addr[1]);
|
||||||
|
origin.z = sp_ctof(addr[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
pContext->LocalToPhysAddr(params[14], &addr);
|
||||||
|
if (addr != pContext->GetNullRef(SP_NULL_VECTOR))
|
||||||
|
{
|
||||||
|
pDir = &dir;
|
||||||
|
dir.x = sp_ctof(addr[0]);
|
||||||
|
dir.y = sp_ctof(addr[1]);
|
||||||
|
dir.z = sp_ctof(addr[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool updatePos = params[15] ? true : false;
|
||||||
|
float soundtime = sp_ctof(params[16]);
|
||||||
|
|
||||||
|
CUtlVector<Vector> *pOrigVec = NULL;
|
||||||
|
CUtlVector<Vector> origvec;
|
||||||
|
if (params[0] > 16)
|
||||||
|
{
|
||||||
|
pOrigVec = &origvec;
|
||||||
|
for (cell_t i = 17; i <= params[0]; i++)
|
||||||
|
{
|
||||||
|
Vector vec;
|
||||||
|
pContext->LocalToPhysAddr(params[i], &addr);
|
||||||
|
vec.x = sp_ctof(addr[0]);
|
||||||
|
vec.y = sp_ctof(addr[1]);
|
||||||
|
vec.z = sp_ctof(addr[2]);
|
||||||
|
origvec.AddToTail(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we're going to a "local player" and this is a dedicated server,
|
||||||
|
* intelligently redirect each sound.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (entity == -2 && engine->IsDedicatedServer())
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < numClients; i++)
|
||||||
|
{
|
||||||
|
cell_t player[1];
|
||||||
|
player[0] = cl_array[i];
|
||||||
|
crf.Reset();
|
||||||
|
crf.Initialize(player, 1);
|
||||||
|
|
||||||
|
if (g_InSoundHook)
|
||||||
|
{
|
||||||
|
SH_CALL(enginesoundPatch,
|
||||||
|
static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float,
|
||||||
|
soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>
|
||||||
|
(&IEngineSound::EmitSound))(crf, player[0], channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed,
|
||||||
|
flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
engsound->EmitSound(crf, player[0], channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed,
|
||||||
|
flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (g_InSoundHook)
|
||||||
|
{
|
||||||
|
SH_CALL(enginesoundPatch,
|
||||||
|
static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float,
|
||||||
|
soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>
|
||||||
|
(&IEngineSound::EmitSound))(crf, entity, channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level,
|
||||||
|
seed, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
engsound->EmitSound(crf, entity, channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed,
|
||||||
|
flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static cell_t EmitSentence(IPluginContext *pContext, const cell_t *params)
|
static cell_t EmitSentence(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
cell_t *addr;
|
cell_t *addr;
|
||||||
@ -1346,6 +1487,7 @@ sp_nativeinfo_t g_SoundNatives[] =
|
|||||||
{"EmitAmbientSound", EmitAmbientSound},
|
{"EmitAmbientSound", EmitAmbientSound},
|
||||||
{"EmitSentence", EmitSentence},
|
{"EmitSentence", EmitSentence},
|
||||||
{"EmitSound", EmitSound},
|
{"EmitSound", EmitSound},
|
||||||
|
{"EmitSoundEntry", EmitSoundEntry},
|
||||||
{"FadeClientVolume", FadeClientVolume},
|
{"FadeClientVolume", FadeClientVolume},
|
||||||
{"GetSoundDuration", GetSoundDuration},
|
{"GetSoundDuration", GetSoundDuration},
|
||||||
{"PrefetchSound", PrefetchSound},
|
{"PrefetchSound", PrefetchSound},
|
||||||
|
@ -221,6 +221,48 @@ native EmitSound(const clients[],
|
|||||||
Float:soundtime = 0.0,
|
Float:soundtime = 0.0,
|
||||||
any:...);
|
any:...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emits a sound or game sound to a list of clients using the latest version of the engine sound interface.
|
||||||
|
* This native is only available in engines that are greater than or equal to Portal 2.
|
||||||
|
*
|
||||||
|
* @param clients Array of client indexes.
|
||||||
|
* @param numClients Number of clients in the array.
|
||||||
|
* @param soundEntry Sound entry name.
|
||||||
|
* @param sample Sound file name relative to the "sounds" folder.
|
||||||
|
* @param entity Entity to emit from.
|
||||||
|
* @param channel Channel to emit with.
|
||||||
|
* @param level Sound level.
|
||||||
|
* @param seed Sound seed.
|
||||||
|
* @param flags Sound flags.
|
||||||
|
* @param volume Sound volume.
|
||||||
|
* @param pitch Sound pitch.
|
||||||
|
* @param speakerentity Unknown.
|
||||||
|
* @param origin Sound origin.
|
||||||
|
* @param dir Sound direction.
|
||||||
|
* @param updatePos Unknown (updates positions?)
|
||||||
|
* @param soundtime Alternate time to play sound for.
|
||||||
|
* @param ... Optional list of Float[3] arrays to specify additional origins.
|
||||||
|
* @noreturn
|
||||||
|
* @error Invalid client index.
|
||||||
|
*/
|
||||||
|
native EmitSoundEntry(const clients[],
|
||||||
|
numClients,
|
||||||
|
const String:soundEntry[],
|
||||||
|
const String:sample[],
|
||||||
|
entity = SOUND_FROM_PLAYER,
|
||||||
|
channel = SNDCHAN_AUTO,
|
||||||
|
level = SNDLEVEL_NORMAL,
|
||||||
|
seed = 0,
|
||||||
|
flags = SND_NOFLAGS,
|
||||||
|
Float:volume = SNDVOL_NORMAL,
|
||||||
|
pitch = SNDPITCH_NORMAL,
|
||||||
|
speakerentity = -1,
|
||||||
|
const Float:origin[3] = NULL_VECTOR,
|
||||||
|
const Float:dir[3] = NULL_VECTOR,
|
||||||
|
bool:updatePos = true,
|
||||||
|
Float:soundtime = 0.0,
|
||||||
|
any:...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emits a sentence to a list of clients.
|
* Emits a sentence to a list of clients.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user