Added DMFI
Added DMFI. Set Diamond Golem appearance size to large. Full compile. Updated release archive.
This commit is contained in:
142
_module/nss/dmfi_plychat_inc.nss
Normal file
142
_module/nss/dmfi_plychat_inc.nss
Normal file
@@ -0,0 +1,142 @@
|
||||
|
||||
// DMFI OnPlayerChat routines :: event hooking functions
|
||||
//
|
||||
// history
|
||||
// 2008.03.23 tsunami282 - created.
|
||||
//
|
||||
|
||||
#include "dmfi_arrays_inc"
|
||||
|
||||
const string DMFI_CHATHOOK_HANDLE_ARRAYNAME = "DMFI_CHATHOOK_HANDLE";
|
||||
const string DMFI_CHATHOOK_SCRIPT_ARRAYNAME = "DMFI_CHATHOOK_SCRIPT";
|
||||
const string DMFI_CHATHOOK_RUNNER_ARRAYNAME = "DMFI_CHATHOOK_RUNNER";
|
||||
const string DMFI_CHATHOOK_CHANNELS_ARRAYNAME = "DMFI_CHATHOOK_CHANNELS";
|
||||
const string DMFI_CHATHOOK_LISTENALL_ARRAYNAME = "DMFI_CHATHOOK_LISTENALL";
|
||||
const string DMFI_CHATHOOK_SPEAKER_ARRAYNAME = "DMFI_CHATHOOK_SPEAKER";
|
||||
const string DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME = "DMFI_CHATHOOK_AUTOREMOVE";
|
||||
const string DMFI_CHATHOOK_PREVHANDLE_VARNAME = "DMFI_CHATHOOK_PREVHANDLE";
|
||||
|
||||
int DMFI_CHANNELMASK_TALK = (1 << TALKVOLUME_TALK);
|
||||
int DMFI_CHANNELMASK_WHISPER = (1 << TALKVOLUME_WHISPER);
|
||||
int DMFI_CHANNELMASK_SHOUT = (1 << TALKVOLUME_SHOUT);
|
||||
// * this channel not hookable ** int DMFI_CHANNELMASK_SILENT_TALK = (1 << TALKVOLUME_SILENT_TALK);
|
||||
int DMFI_CHANNELMASK_DM = (1 << TALKVOLUME_SILENT_SHOUT);
|
||||
int DMFI_CHANNELMASK_PARTY = (1 << TALKVOLUME_PARTY);
|
||||
// * this channel not hookable ** int DMFI_CHANNELMASK_TELL = (1 << TALKVOLUME_TELL);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
void dmfi__init_chathook_data()
|
||||
{
|
||||
object oMod = GetModule();
|
||||
|
||||
if (!GetLocalArrayInitialized(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME))
|
||||
{
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, 0);
|
||||
InitializeLocalArray(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME);
|
||||
SetLocalArrayLowerBound(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, 1);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, 0);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
//! Adds a callback function to the OnPlayerChat list.
|
||||
//!
|
||||
//! \param sChatHandlerScript name of script to invoke on receiving input
|
||||
//! \param oScriptRunner object to execute the sChatHandlerScript on
|
||||
//! \param maskChannels mask of channels to listen on (defaults to all channels)
|
||||
//! \param bListenAll TRUE to listen to all PC speakers everywhere
|
||||
//! \param oSpeaker if bListenAll is FALSE, creature to listen to (others will be ignored)
|
||||
//! \param bAutoRemove - automatically unhook this chathook after first use
|
||||
//! \return hook handle (needed to remove the hook later); 0 means failed to add the hook
|
||||
int DMFI_ChatHookAdd(string sChatHandlerScript, object oScriptRunner = OBJECT_SELF,
|
||||
int maskChannels = -1, int bListenAll = TRUE, object oSpeaker = OBJECT_INVALID,
|
||||
int bAutoRemove = FALSE)
|
||||
{
|
||||
dmfi__init_chathook_data();
|
||||
|
||||
object oMod = GetModule();
|
||||
|
||||
int iHook = GetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME);
|
||||
iHook++;
|
||||
int hdlHook = GetLocalInt(oMod, DMFI_CHATHOOK_PREVHANDLE_VARNAME);
|
||||
hdlHook++;
|
||||
if (hdlHook < 1) hdlHook = 1; // reserving 0 and negatives
|
||||
// SendMessageToPC(GetFirstPC(), "chathookadd - adding hook #" + IntToString(iHook));
|
||||
SetLocalInt(oMod, DMFI_CHATHOOK_PREVHANDLE_VARNAME, hdlHook);
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook, hdlHook);
|
||||
SetLocalArrayString(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, iHook, sChatHandlerScript);
|
||||
SetLocalArrayObject(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, iHook, oScriptRunner);
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, iHook, maskChannels);
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, iHook, bListenAll);
|
||||
SetLocalArrayObject(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, iHook, oSpeaker);
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, iHook, bAutoRemove);
|
||||
|
||||
return hdlHook;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
//! removes a callback function from the OnPlayerChat list.
|
||||
//! \param hdlHookIn handle of hook to remove (0 for clean up orphans)
|
||||
//! \return TRUE if requested hook found and removed
|
||||
int DMFI_ChatHookRemove(int hdlHookIn)
|
||||
{
|
||||
int bRemoved = FALSE;
|
||||
int hdlHook;
|
||||
int iHook, iHook2;
|
||||
object oMod = GetModule();
|
||||
int nHooks = GetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME);
|
||||
for (iHook = 1; iHook <= nHooks; iHook++)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
hdlHook = GetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook);
|
||||
if (hdlHook != 0 && hdlHook != hdlHookIn) break;
|
||||
|
||||
// kill this one
|
||||
for (iHook2 = iHook; iHook2 < nHooks; iHook2++)
|
||||
{
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook2, GetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayString(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, iHook2, GetLocalArrayString(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayObject(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, iHook2, GetLocalArrayObject(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, iHook2, GetLocalArrayInt(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, iHook2, GetLocalArrayInt(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayObject(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, iHook2, GetLocalArrayObject(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, iHook2+1));
|
||||
SetLocalArrayInt(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, iHook2, GetLocalArrayInt(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, iHook2+1));
|
||||
}
|
||||
bRemoved = TRUE;
|
||||
nHooks--;
|
||||
if (nHooks < iHook) break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bRemoved)
|
||||
{
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, nHooks);
|
||||
SetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, nHooks);
|
||||
}
|
||||
|
||||
return bRemoved;
|
||||
}
|
||||
|
Reference in New Issue
Block a user