80 lines
3.1 KiB
Plaintext
80 lines
3.1 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: DMFI - OnPlayerChat event handler
|
|
//:: dmfi_onplychat
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Event handler for the module-level OnPlayerChat event. Manages scripter-added
|
|
event scripts.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Merle, with help from mykael22000 and tsunami282
|
|
//:: Created On: 2007.12.12
|
|
//:://////////////////////////////////////////////
|
|
//:: 2007.12.27 tsunami282 - implemented hooking tree
|
|
|
|
#include "dmfi_plychat_inc"
|
|
|
|
const string DMFI_PLAYERCHAT_SCRIPTNAME = "dmfi_plychat_exe";
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
void main()
|
|
{
|
|
int nVolume = GetPCChatVolume();
|
|
object oShouter = GetPCChatSpeaker();
|
|
|
|
int bInvoke;
|
|
string sChatHandlerScript;
|
|
int maskChannels;
|
|
// int bListenAll;
|
|
object oRunner;
|
|
int bAutoRemove;
|
|
int bDirtyList = FALSE;
|
|
int iHook;
|
|
object oMod = GetModule();
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat - process hooks");
|
|
int nHooks = GetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME);
|
|
for (iHook = nHooks; iHook > 0; iHook--) // reverse-order execution, last hook gets first dibs
|
|
{
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat -- process hook #" + IntToString(iHook));
|
|
maskChannels = GetLocalArrayInt(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, iHook);
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat -- channel heard=" + IntToString(nVolume) + ", soughtmask=" + IntToString(maskChannels));
|
|
if (((1 << nVolume) & maskChannels) != 0) // right channel
|
|
{
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- channel matched");
|
|
|
|
bInvoke = FALSE;
|
|
if (GetLocalArrayInt(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, iHook) != FALSE)
|
|
{
|
|
bInvoke = TRUE;
|
|
}
|
|
else
|
|
{
|
|
object oDesiredSpeaker = GetLocalArrayObject(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, iHook);
|
|
if (oShouter == oDesiredSpeaker) bInvoke = TRUE;
|
|
}
|
|
if (bInvoke) // right speaker
|
|
{
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- speaker matched");
|
|
sChatHandlerScript = GetLocalArrayString(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, iHook);
|
|
oRunner = GetLocalArrayObject(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, iHook);
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- executing script '" + sChatHandlerScript + "' on object '" + GetName(oRunner) +"'");
|
|
ExecuteScript(sChatHandlerScript, oRunner);
|
|
bAutoRemove = GetLocalArrayInt(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, iHook);
|
|
if (bAutoRemove)
|
|
{
|
|
// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- scheduling autoremove");
|
|
bDirtyList = TRUE;
|
|
SetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bDirtyList) DMFI_ChatHookRemove(0);
|
|
|
|
// always execute the DMFI parser
|
|
ExecuteScript(DMFI_PLAYERCHAT_SCRIPTNAME, OBJECT_SELF);
|
|
|
|
}
|
|
|