Initial upload. PRC8 has been added. Module compiles, PRC's default AI & treasure scripts have been integrated. Started work on top hak for SLA / Ability / Scripting modifications.
1202 lines
49 KiB
Plaintext
1202 lines
49 KiB
Plaintext
#include "prc_inc_racial"
|
|
|
|
// void main (){}
|
|
// VOICE CONFIGURATION - NEW IN 1.07 and UP
|
|
|
|
// Set this to 0 if you want to DISABLE listening by NPCs for performance reasons.
|
|
// See readme for additional information regarding possible issues and effects.
|
|
const int DMFI_LISTENING_GLOBAL = 1;
|
|
|
|
|
|
// NOTE: OMW_COLORS is an invisible object that must be present in your module.
|
|
// It has high ascii characters in the name and is used to get the color codes.
|
|
// This was ripped wholeheartedly by an example posted by Richterm on the bioboards.
|
|
|
|
string DST_COLOR_TAGS = GetName(GetObjectByTag("dem_color_text"));
|
|
string DST_COLOR_WHITE = GetSubString(DST_COLOR_TAGS, 0, 6);
|
|
string DST_COLOR_YELLOW = GetSubString(DST_COLOR_TAGS, 6, 6);
|
|
string DST_COLOR_MAGENTA = GetSubString(DST_COLOR_TAGS, 12, 6);
|
|
string DST_COLOR_CYAN = GetSubString(DST_COLOR_TAGS, 18, 6);
|
|
string DST_COLOR_RED = GetSubString(DST_COLOR_TAGS, 24, 6);
|
|
string DST_COLOR_GREEN = GetSubString(DST_COLOR_TAGS, 30, 6);
|
|
string DST_COLOR_BLUE = GetSubString(DST_COLOR_TAGS, 36, 6);
|
|
|
|
// Colors for each type of roll. Change the colors if you like.
|
|
string DMFI_ROLL_COLOR = DST_COLOR_CYAN;
|
|
string DST_COLOR_NORMAL = DST_COLOR_WHITE;
|
|
|
|
int DMW_START_CUSTOM_TOKEN = 8000;
|
|
|
|
//Retrieve targetting information
|
|
object oMySpeaker = GetLastSpeaker();
|
|
object oMyTarget = GetLocalObject(oMySpeaker, "dmfi_univ_target");
|
|
location lMyLoc = GetLocalLocation(oMySpeaker, "dmfi_univ_location");
|
|
|
|
// checks if a nearby object is destroyable
|
|
int dmwand_isnearbydestroyable();
|
|
// Check if the target can be created with CreateObject
|
|
int dmwand_istargetcreateable();
|
|
//Check if target is a destroyable object
|
|
int dmwand_istargetdestroyable();
|
|
// checks if the wand was NOT clicked on an object
|
|
int dmwand_istargetinvalid();
|
|
// check if the target has an inventory
|
|
int dmwand_istargetinventory();
|
|
//Check if the target is not the wand's user
|
|
int dmwand_istargetnotme();
|
|
//Check if target is an NPC or monster
|
|
int dmwand_istargetnpc();
|
|
//Check if the target is a PC
|
|
int dmwand_istargetpc();
|
|
//Check if the target is a PC and not me
|
|
int dmwand_istargetpcnme();
|
|
// Check if the target is a PC or NPC
|
|
// uses the CON score currently
|
|
int dmwand_istargetpcornpc();
|
|
//Check if the target is a PC or an npc and not me
|
|
int dmwand_istargetpcornpcnme();
|
|
// Check if target is a placeable
|
|
int dmwand_istargetplaceable();
|
|
//bulds the conversion
|
|
int dmwand_BuildConversationDialog(int nCurrent, int nChoice, string sConversation, string sParams);
|
|
int dmw_conv_ListPlayers(int nCurrent, int nChoice, string sParams = "");
|
|
int dmw_conv_Start(int nCurrent, int nChoice, string sParams = "");
|
|
void dmwand_BuildConversation(string sConversation, string sParams);
|
|
void dmwand_StartConversation();
|
|
|
|
// DMFI Color Text function. It returns a colored string.
|
|
// sText is the string that will be colored and sColor is the color
|
|
// options: yellow, magenta, cyan, red, green, blue - truncated at first letter
|
|
// Ex: sMsg = ColorText(sMsg, "y"); //Add the include file - yields yellow colored msg.
|
|
string ColorText(string sText, string sColor);
|
|
string ColorText(string sText, string sColor)
|
|
{
|
|
string sApply = DST_COLOR_NORMAL;
|
|
string sTest = GetStringLowerCase(GetStringLeft(sColor, 1));
|
|
if (sTest=="y") sApply = DST_COLOR_YELLOW;
|
|
else if (sTest == "m") sApply = DST_COLOR_MAGENTA;
|
|
else if (sTest == "c") sApply = DST_COLOR_CYAN;
|
|
else if (sTest == "r") sApply = DST_COLOR_RED;
|
|
else if (sTest == "g") sApply = DST_COLOR_GREEN;
|
|
else if (sTest == "b") sApply = DST_COLOR_BLUE;
|
|
|
|
string sFinal = sApply + sText + DST_COLOR_NORMAL;
|
|
return sFinal;
|
|
}
|
|
|
|
|
|
int dmwand_isnearbydestroyable()
|
|
{
|
|
object oMyTest = GetFirstObjectInShape(SHAPE_CUBE, 0.6, lMyLoc, FALSE, OBJECT_TYPE_ALL);
|
|
int nTargetType = GetObjectType(oMyTest);
|
|
return (GetIsObjectValid(oMyTest) && (! GetIsPC(oMyTest)) && ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE)));
|
|
}
|
|
|
|
int dmwand_istargetcreateable()
|
|
{
|
|
if(! GetIsObjectValid(oMyTarget)) { return FALSE; }
|
|
|
|
int nTargetType = GetObjectType(oMyTarget);
|
|
return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE));
|
|
}
|
|
|
|
int dmwand_istargetdestroyable()
|
|
{
|
|
if(! GetIsObjectValid(oMyTarget)) { return FALSE; }
|
|
|
|
int nTargetType = GetObjectType(oMyTarget);
|
|
if(! GetIsPC(oMyTarget))
|
|
{
|
|
return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE));
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
int dmwand_istargetinvalid()
|
|
{
|
|
return !GetIsObjectValid(oMyTarget);
|
|
}
|
|
|
|
int dmwand_istargetinventory()
|
|
{
|
|
return (GetIsObjectValid(oMyTarget) && GetHasInventory(oMyTarget));
|
|
}
|
|
|
|
int dmwand_istargetnotme()
|
|
{
|
|
return (GetIsObjectValid(oMyTarget) && (oMySpeaker != oMyTarget));
|
|
}
|
|
|
|
int dmwand_istargetpc()
|
|
{
|
|
return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget));
|
|
}
|
|
|
|
int dmwand_istargetpcnme()
|
|
{
|
|
return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget) && (oMySpeaker != oMyTarget));
|
|
}
|
|
|
|
int dmwand_istargetpcornpc()
|
|
{
|
|
return (GetIsObjectValid(oMyTarget) && GetAbilityScore(oMyTarget, ABILITY_CONSTITUTION));
|
|
}
|
|
|
|
int dmwand_istargetnpc()
|
|
{
|
|
return (dmwand_istargetpcornpc() && (!GetIsPC(oMyTarget)));
|
|
}
|
|
|
|
int dmwand_istargetpcornpcnme()
|
|
{
|
|
return (dmwand_istargetpcornpc() && (oMySpeaker != oMyTarget));
|
|
}
|
|
|
|
int dmwand_istargetplaceable()
|
|
{
|
|
if(! GetIsObjectValid(oMyTarget)) { return FALSE; }
|
|
|
|
int nTargetType = GetObjectType(oMyTarget);
|
|
return (nTargetType == OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
|
|
int dmw_conv_Start(int nCurrent, int nChoice, string sParams = "")
|
|
{
|
|
string sText = "";
|
|
string sCall = "";
|
|
string sCallParams = "";
|
|
|
|
switch(nCurrent)
|
|
{
|
|
case 0:
|
|
nCurrent = 0;
|
|
sText = "Hello there, DM. What can I do for you?";
|
|
sCall = "";
|
|
sCallParams = "";
|
|
break;
|
|
|
|
case 1:
|
|
nCurrent = 1;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Penguin this player.";
|
|
sCall = "func_Toad";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
case 2:
|
|
nCurrent = 2;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Unpenguin this player.";
|
|
sCall = "func_Untoad";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
case 3:
|
|
nCurrent = 3;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Boot this player.";
|
|
sCall = "func_KickPC";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
case 4:
|
|
nCurrent = 4;
|
|
if(dmwand_istargetinvalid())
|
|
{
|
|
sText = "List all players...";
|
|
sCall = "conv_ListPlayers";
|
|
sCallParams = "func_PlayerListConv";
|
|
break;
|
|
}
|
|
|
|
case 5:
|
|
nCurrent = 5;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Jump this player to my location.";
|
|
sCall = "func_JumpPlayerHere";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
case 6:
|
|
nCurrent = 6;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Jump me to this player's location.";
|
|
sCall = "func_JumpToPlayer";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
case 7:
|
|
nCurrent = 7;
|
|
if(dmwand_istargetpcnme())
|
|
{
|
|
sText = "Jump this player's party to my location.";
|
|
sCall = "func_JumpPartyHere";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
default:
|
|
nCurrent = 0;
|
|
sText = "";
|
|
sCall = "";
|
|
sCallParams = "";
|
|
break;
|
|
}
|
|
|
|
SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), sText);
|
|
SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), sCall);
|
|
SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), sCallParams);
|
|
|
|
return nCurrent;
|
|
}
|
|
|
|
void DMFI_untoad(object oTarget, object oUser)
|
|
{
|
|
if (GetLocalInt(oTarget, "toaded")==1)
|
|
{
|
|
effect eMyEffect = GetFirstEffect(oTarget);
|
|
while(GetIsEffectValid(eMyEffect))
|
|
{
|
|
if(GetEffectType(eMyEffect) == EFFECT_TYPE_POLYMORPH || GetEffectType(eMyEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
|
|
RemoveEffect(oTarget, eMyEffect);
|
|
|
|
eMyEffect = GetNextEffect(oTarget);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FloatingTextStringOnCreature("Dude, he is no toad!", oUser);
|
|
}
|
|
}
|
|
|
|
void DMFI_toad(object oTarget, object oUser)
|
|
{
|
|
//This function now toggles the toad status hahnsoo: DMFI 1.08
|
|
if (GetLocalInt(oTarget, "toaded") == 1)
|
|
{
|
|
effect eMyEffect = GetFirstEffect(oTarget);
|
|
while(GetIsEffectValid(eMyEffect))
|
|
{
|
|
if(GetEffectType(eMyEffect) == EFFECT_TYPE_POLYMORPH || GetEffectType(eMyEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE)
|
|
RemoveEffect(oTarget, eMyEffect);
|
|
|
|
eMyEffect = GetNextEffect(oTarget);
|
|
}
|
|
FloatingTextStringOnCreature("Removed Penguin status from " + GetName(oTarget), oUser, FALSE);
|
|
SetLocalInt(oTarget, "toaded", 0);
|
|
}
|
|
else
|
|
{
|
|
effect ePenguin = EffectPolymorph(POLYMORPH_TYPE_PENGUIN);
|
|
effect eParalyze = EffectCutsceneParalyze();
|
|
AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePenguin, oTarget));
|
|
AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParalyze, oTarget));
|
|
SetLocalInt(oTarget, "toaded", 1);
|
|
FloatingTextStringOnCreature("Added Penguin status to " + GetName(oTarget), oUser, FALSE);
|
|
}
|
|
}
|
|
|
|
void DMFI_jail(object oOther, object oUser)
|
|
{
|
|
if (GetIsObjectValid(oOther) && !GetIsDM(oOther) && oOther != oUser)
|
|
{
|
|
object oJail = GetObjectByTag("dmfi_jail");
|
|
if (!GetIsObjectValid(oJail))
|
|
oJail = GetObjectByTag("dmfi_jail_default");
|
|
AssignCommand(oOther, ClearAllActions());
|
|
AssignCommand(oOther, JumpToObject(oJail));
|
|
SendMessageToPC(oUser, GetName(oOther) + " (" + GetPCPublicCDKey(oOther) + ")/IP: " + GetPCIPAddress(oOther) + " - has been sent to Jail.");
|
|
}
|
|
}
|
|
|
|
void dmwand_KickPC(object oTarget, object oUser)
|
|
{
|
|
// Create a lightning strike, thunder, scorch mark, and random small
|
|
// lightnings at target's location
|
|
location lMyLoc = GetLocation (oTarget);
|
|
AssignCommand( oUser, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lMyLoc));
|
|
AssignCommand ( oUser, PlaySound ("as_wt_thundercl3"));
|
|
object oScorch = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_weathmark", lMyLoc, FALSE);
|
|
object oTargetArea = GetArea(oUser);
|
|
int nXPos, nYPos, nCount;
|
|
for(nCount = 0; nCount < 5; nCount++)
|
|
{
|
|
nXPos = Random(10) - 5;
|
|
nYPos = Random(10) - 5;
|
|
|
|
vector vNewVector = GetPositionFromLocation(lMyLoc);
|
|
vNewVector.x += nXPos;
|
|
vNewVector.y += nYPos;
|
|
|
|
location lNewLoc = Location(oTargetArea, vNewVector, 0.0);
|
|
AssignCommand( oUser, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_S), lNewLoc));
|
|
}
|
|
DelayCommand ( 20.0, DestroyObject ( oScorch));
|
|
|
|
SendMessageToAllDMs (GetName(oTarget) + " was booted from the game. PC CD KEY: " + GetPCPublicCDKey(oTarget) + " PC IP ADDRESS: " + GetPCIPAddress(oTarget));
|
|
PrintString(GetName(oTarget) + " was booted from the game. PC CD KEY: " + GetPCPublicCDKey(oTarget) + " PC IP ADDRESS: " + GetPCIPAddress(oTarget));
|
|
|
|
// Kick the target out of the game
|
|
BootPC(oTarget);
|
|
}
|
|
|
|
void dmwand_JumpPlayerHere()
|
|
{
|
|
location lJumpLoc = GetLocation(oMySpeaker);
|
|
AssignCommand(oMyTarget, ClearAllActions());
|
|
AssignCommand(oMyTarget, ActionJumpToLocation(lJumpLoc));
|
|
}
|
|
|
|
//Added by hahnsoo, jumps a party to the DM
|
|
void dmwand_JumpPartyHere()
|
|
{
|
|
location lJumpLoc = GetLocation(oMySpeaker);
|
|
object oParty = GetFirstFactionMember(oMyTarget);
|
|
while (GetIsObjectValid(oParty))
|
|
{
|
|
AssignCommand(oParty, ClearAllActions());
|
|
AssignCommand(oParty, ActionJumpToLocation(lJumpLoc));
|
|
oParty = GetNextFactionMember(oMyTarget);
|
|
}
|
|
}
|
|
|
|
void dmwand_JumpToPlayer()
|
|
{
|
|
location lJumpLoc = GetLocation(oMyTarget);
|
|
AssignCommand(oMySpeaker, ActionJumpToLocation(lJumpLoc));
|
|
}
|
|
|
|
void dmwand_PlayerListConv(string sParams)
|
|
{
|
|
int nPlayer = StringToInt(sParams);
|
|
int nCache;
|
|
int nCount;
|
|
|
|
object oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nPlayer));
|
|
oMyTarget = oPlayer;
|
|
SetLocalObject(oMySpeaker, "dmfi_univ_target", oMyTarget);
|
|
|
|
//Go back to the first conversation level
|
|
dmwand_BuildConversation("Start", "");
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: File: dmw_conv_inc
|
|
//::
|
|
//:: Conversation functions for the DM's Helper
|
|
//:://////////////////////////////////////////////
|
|
|
|
int dmwand_BuildConversationDialog(int nCurrent, int nChoice, string sConversation, string sParams)
|
|
{
|
|
|
|
if(TestStringAgainstPattern(sConversation, "ListPlayers"))
|
|
{
|
|
return dmw_conv_ListPlayers(nCurrent, nChoice, sParams);
|
|
}
|
|
|
|
if(TestStringAgainstPattern(sConversation, "Start"))
|
|
{
|
|
return dmw_conv_Start(nCurrent, nChoice, sParams);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void dmwand_BuildConversation(string sConversation, string sParams)
|
|
{
|
|
int nLast;
|
|
int nTemp;
|
|
int nChoice = 1;
|
|
int nCurrent = 1;
|
|
int nMatch;
|
|
|
|
if(TestStringAgainstPattern(sParams, "prev"))
|
|
{
|
|
//Get the number choice to start with
|
|
nCurrent = GetLocalInt(oMySpeaker, "dmw_dialogprev");
|
|
|
|
//Since we're going to the previous page, there will be a next
|
|
SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->");
|
|
SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation);
|
|
SetLocalString(oMySpeaker, "dmw_params9", "next");
|
|
SetLocalInt(oMySpeaker, "dmw_dialognext", nCurrent);
|
|
|
|
nChoice = 8;
|
|
for(;nChoice >= 0; nChoice--)
|
|
{
|
|
int nTemp1 = nCurrent;
|
|
int nTemp2 = nCurrent;
|
|
nMatch = nTemp2;
|
|
while((nCurrent == nMatch) && (nTemp2 > 0))
|
|
{
|
|
nTemp2--;
|
|
nMatch = dmwand_BuildConversationDialog(nTemp2, nChoice, sConversation, sParams);
|
|
}
|
|
|
|
if(nTemp2 <= 0)
|
|
{
|
|
//we went back too far for some reason, so make this choice blank
|
|
SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), "");
|
|
SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), "");
|
|
SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), "");
|
|
}
|
|
nLast = nTemp;
|
|
nTemp = nTemp1;
|
|
nTemp1 = nMatch;
|
|
nCurrent = nMatch;
|
|
}
|
|
|
|
if(nMatch > 0)
|
|
{
|
|
SetLocalString(oMySpeaker, "dmw_dialog1", "<- previous");
|
|
SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation);
|
|
SetLocalString(oMySpeaker, "dmw_params1", "prev");
|
|
SetLocalInt(oMySpeaker, "dmw_dialogprev", nLast);
|
|
}
|
|
|
|
//fill the NPC's dialog spot
|
|
//(saved for last because the build process tromps on it)
|
|
dmwand_BuildConversationDialog(0, 0, sConversation, sParams);
|
|
}
|
|
else
|
|
{
|
|
//fill the NPC's dialog spot
|
|
dmwand_BuildConversationDialog(0, 0, sConversation, sParams);
|
|
|
|
//No parameters specified, start at the top of the conversation
|
|
if(sParams == "")
|
|
{
|
|
nChoice = 1;
|
|
nCurrent = 1;
|
|
}
|
|
|
|
//A "next->" choice was selected
|
|
if(TestStringAgainstPattern(sParams, "next"))
|
|
{
|
|
//get the number choice to start with
|
|
nCurrent = GetLocalInt(oMySpeaker, "dmw_dialognext");
|
|
|
|
//set this as the number for the "previous" choice to use
|
|
SetLocalInt(oMySpeaker, "dmw_dialogprev", nCurrent);
|
|
|
|
//Set the first dialog choice to be "previous"
|
|
nChoice = 2;
|
|
SetLocalString(oMySpeaker, "dmw_dialog1", "<- Previous");
|
|
SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation);
|
|
SetLocalString(oMySpeaker, "dmw_params1", "prev");
|
|
}
|
|
|
|
//Loop through to build the dialog list
|
|
for(;nChoice <= 10; nChoice++)
|
|
{
|
|
nMatch = dmwand_BuildConversationDialog(nCurrent, nChoice, sConversation, sParams);
|
|
//nLast will be the value of the choice before the last one
|
|
nLast = nTemp;
|
|
nTemp = nMatch;
|
|
if(nMatch > 0) { nCurrent = nMatch; }
|
|
if(nMatch == 0) { nLast = 0; }
|
|
nCurrent++;
|
|
}
|
|
|
|
//If there were enough choices to fill 10 spots, make spot 9 a "next"
|
|
if(nLast > 0)
|
|
{
|
|
SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->");
|
|
SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation);
|
|
SetLocalString(oMySpeaker, "dmw_params9", "next");
|
|
SetLocalInt(oMySpeaker, "dmw_dialognext", nLast);
|
|
}
|
|
}
|
|
}
|
|
|
|
int dmw_conv_ListPlayers(int nCurrent, int nChoice, string sParams = "")
|
|
{
|
|
string sText = "";
|
|
string sCall = "";
|
|
string sCallParams = "";
|
|
object oPlayer;
|
|
int nCache;
|
|
|
|
if((! TestStringAgainstPattern(sParams, "next")) && (! TestStringAgainstPattern(sParams, "prev")))
|
|
{
|
|
//This is the first time running this function, so cache the objects
|
|
// of all players... we don't want our list swapping itself around every
|
|
// time you change a page
|
|
SetLocalString(oMySpeaker, "dmw_playerfunc", sParams);
|
|
int nCount = 1;
|
|
oPlayer = GetFirstPC();
|
|
while(GetIsObjectValid(oPlayer))
|
|
{
|
|
SetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCount), oPlayer);
|
|
oPlayer = GetNextPC();
|
|
nCount++;
|
|
}
|
|
nCount--;
|
|
SetLocalInt(oMySpeaker, "dmw_playercache", nCount);
|
|
}
|
|
|
|
string sFunc = GetLocalString(oMySpeaker, "dmw_playerfunc");
|
|
nCache = GetLocalInt(oMySpeaker, "dmw_playercache");
|
|
|
|
switch(nCurrent)
|
|
{
|
|
case 0:
|
|
nCurrent = 0;
|
|
sText = "Who would you like to work on?";
|
|
sCall = "";
|
|
sCallParams = "";
|
|
break;
|
|
default:
|
|
//Find the next player in the cache who is valid
|
|
oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCurrent));
|
|
while((! GetIsObjectValid(oPlayer)) && (nCurrent <= nCache))
|
|
{
|
|
nCurrent++;
|
|
oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCurrent));
|
|
}
|
|
|
|
if(nCurrent > nCache)
|
|
{
|
|
//We've run out of cache, any other spots in this list should be
|
|
//skipped
|
|
nCurrent = 0;
|
|
sText = "";
|
|
sCall = "";
|
|
sCallParams = "";
|
|
}
|
|
else
|
|
{
|
|
//We found a player, set up the list entry
|
|
sText = GetName(oPlayer) + " (" + GetPCPlayerName(oPlayer) + ")";
|
|
sCall = sFunc;
|
|
sCallParams = IntToString(nCurrent);
|
|
}
|
|
break;
|
|
}
|
|
|
|
SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), sText);
|
|
SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), sCall);
|
|
SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), sCallParams);
|
|
|
|
return nCurrent;
|
|
}
|
|
|
|
void dmwand_DoDialogChoice(int nChoice)
|
|
{
|
|
string sCallFunction = GetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice));
|
|
string sCallParams = GetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice));
|
|
string sNav = "";
|
|
|
|
string sStart = GetStringLeft(sCallFunction, 5);
|
|
int nLen = GetStringLength(sCallFunction) - 5;
|
|
string sCall = GetSubString(sCallFunction, 5, nLen);
|
|
|
|
if(TestStringAgainstPattern("conv_", sStart))
|
|
{
|
|
dmwand_BuildConversation(sCall, sCallParams);
|
|
}
|
|
else
|
|
{
|
|
|
|
if(TestStringAgainstPattern("PlayerListConv", sCall))
|
|
{
|
|
dmwand_PlayerListConv(sCallParams);
|
|
return;
|
|
}
|
|
|
|
if(TestStringAgainstPattern("Toad", sCall))
|
|
{
|
|
DMFI_toad(oMyTarget, oMySpeaker);
|
|
return;
|
|
}
|
|
if(TestStringAgainstPattern("Untoad", sCall))
|
|
{
|
|
DMFI_untoad(oMyTarget, oMySpeaker);
|
|
return;
|
|
}
|
|
if(TestStringAgainstPattern("KickPC", sCall))
|
|
{
|
|
dmwand_KickPC(oMyTarget, oMySpeaker);
|
|
return;
|
|
}
|
|
|
|
if(TestStringAgainstPattern("JumpPlayerHere", sCall))
|
|
{
|
|
dmwand_JumpPlayerHere();
|
|
return;
|
|
}
|
|
if(TestStringAgainstPattern("JumpToPlayer", sCall))
|
|
{
|
|
dmwand_JumpToPlayer();
|
|
return;
|
|
}
|
|
if(TestStringAgainstPattern("JumpPartyHere", sCall))
|
|
{
|
|
dmwand_JumpPartyHere();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Smoking Function by Jason Robinson
|
|
location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight)
|
|
{
|
|
float fDistance = -fDist;
|
|
object oTarget = (oPC);
|
|
object oArea = GetArea(oTarget);
|
|
vector vPosition = GetPosition(oTarget);
|
|
vPosition.z += fHeight;
|
|
float fOrientation = GetFacing(oTarget);
|
|
vector vNewPos = AngleToVector(fOrientation);
|
|
float vZ = vPosition.z;
|
|
float vX = vPosition.x - fDistance * vNewPos.x;
|
|
float vY = vPosition.y - fDistance * vNewPos.y;
|
|
fOrientation = GetFacing(oTarget);
|
|
vX = vPosition.x - fDistance * vNewPos.x;
|
|
vY = vPosition.y - fDistance * vNewPos.y;
|
|
vNewPos = AngleToVector(fOrientation);
|
|
vZ = vPosition.z;
|
|
vNewPos = Vector(vX, vY, vZ);
|
|
return Location(oArea, vNewPos, fOrientation);
|
|
}
|
|
|
|
//Smoking Function by Jason Robinson
|
|
void SmokePipe(object oActivator)
|
|
{
|
|
string sEmote1 = "*puffs on a pipe*";
|
|
string sEmote2 = "*inhales from a pipe*";
|
|
string sEmote3 = "*pulls a mouthful of smoke from a pipe*";
|
|
float fHeight = 1.7;
|
|
float fDistance = 0.1;
|
|
// Set height based on race and gender
|
|
if (GetGender(oActivator) == GENDER_MALE)
|
|
{
|
|
switch (MyPRCGetRacialType(oActivator))
|
|
{
|
|
case RACIAL_TYPE_HUMAN:
|
|
case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break;
|
|
case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break;
|
|
case RACIAL_TYPE_GNOME:
|
|
case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break;
|
|
case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break;
|
|
case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// FEMALES
|
|
switch (MyPRCGetRacialType(oActivator))
|
|
{
|
|
case RACIAL_TYPE_HUMAN:
|
|
case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break;
|
|
case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break;
|
|
case RACIAL_TYPE_GNOME:
|
|
case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break;
|
|
case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break;
|
|
case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break;
|
|
}
|
|
}
|
|
location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight);
|
|
// emotes
|
|
switch (d3())
|
|
{
|
|
case 1: AssignCommand(oActivator, ActionSpeakString(sEmote1)); break;
|
|
case 2: AssignCommand(oActivator, ActionSpeakString(sEmote2)); break;
|
|
case 3: AssignCommand(oActivator, ActionSpeakString(sEmote3));break;
|
|
}
|
|
// glow red
|
|
AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.15)));
|
|
// wait a moment
|
|
AssignCommand(oActivator, ActionWait(3.0));
|
|
// puff of smoke above and in front of head
|
|
AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead)));
|
|
// if female, turn head to left
|
|
if ((GetGender(oActivator) == GENDER_FEMALE) && (MyPRCGetRacialType(oActivator) != RACIAL_TYPE_DWARF))
|
|
AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0));
|
|
}
|
|
|
|
void EmoteDance(object oPC)
|
|
{
|
|
object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
AssignCommand(oPC,ActionUnequipItem(oRightHand));
|
|
AssignCommand(oPC,ActionUnequipItem(oLeftHand));
|
|
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0));
|
|
AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC)));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_FORCEFUL,1.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0));
|
|
AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC)));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0));
|
|
AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC)));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0));
|
|
AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0));
|
|
|
|
AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oLeftHand,INVENTORY_SLOT_LEFTHAND)));
|
|
AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oRightHand,INVENTORY_SLOT_RIGHTHAND)));
|
|
}
|
|
|
|
void SitInNearestChair(object oPC)
|
|
{
|
|
object oSit,oRightHand,oLeftHand,oChair,oCouch,oBenchPew,oStool;
|
|
float fDistSit;int nth;
|
|
// get the closest chair, couch bench or stool
|
|
nth = 1;oChair = GetNearestObjectByTag("Chair", oPC,nth);
|
|
while(oChair != OBJECT_INVALID && GetSittingCreature(oChair) != OBJECT_INVALID)
|
|
{nth++;oChair = GetNearestObjectByTag("Chair", oPC,nth);}
|
|
|
|
nth = 1;oCouch = GetNearestObjectByTag("Couch", oPC,nth);
|
|
while(oCouch != OBJECT_INVALID && GetSittingCreature(oCouch) != OBJECT_INVALID)
|
|
{nth++;oChair = GetNearestObjectByTag("Couch", oPC,nth);}
|
|
|
|
nth = 1;oBenchPew = GetNearestObjectByTag("BenchPew", oPC,nth);
|
|
while(oBenchPew != OBJECT_INVALID && GetSittingCreature(oBenchPew) != OBJECT_INVALID)
|
|
{nth++;oChair = GetNearestObjectByTag("BenchPew", oPC,nth);}
|
|
/* 1.27 bug
|
|
nth = 1;oStool = GetNearestObjectByTag("Stool", oPC,nth);
|
|
while(oStool != OBJECT_INVALID && GetSittingCreature(oStool) != OBJECT_INVALID)
|
|
{nth++;oStool = GetNearestObjectByTag("Stool", oPC,nth);}
|
|
*/
|
|
// get the distance between the user and each object (-1.0 is the result if no
|
|
// object is found
|
|
float fDistanceChair = GetDistanceToObject(oChair);
|
|
float fDistanceBench = GetDistanceToObject(oBenchPew);
|
|
float fDistanceCouch = GetDistanceToObject(oCouch);
|
|
float fDistanceStool = GetDistanceToObject(oStool);
|
|
|
|
// if any of the objects are invalid (not there), change the return value
|
|
// to a high number so the distance math can work
|
|
if (fDistanceChair == -1.0)
|
|
{fDistanceChair =1000.0;}
|
|
|
|
if (fDistanceBench == -1.0)
|
|
{fDistanceBench = 1000.0;}
|
|
|
|
if (fDistanceCouch == -1.0)
|
|
{fDistanceCouch = 1000.0;}
|
|
|
|
if (fDistanceStool == -1.0)
|
|
{fDistanceStool = 1000.0;}
|
|
|
|
// find out which object is closest to the PC
|
|
if (fDistanceChair<fDistanceBench && fDistanceChair<fDistanceCouch && fDistanceChair<fDistanceStool)
|
|
{oSit=oChair;fDistSit=fDistanceChair;}
|
|
else if (fDistanceBench<fDistanceChair && fDistanceBench<fDistanceCouch && fDistanceBench<fDistanceStool)
|
|
{oSit=oBenchPew;fDistSit=fDistanceBench;}
|
|
else if (fDistanceCouch<fDistanceChair && fDistanceCouch<fDistanceBench && fDistanceCouch<fDistanceStool)
|
|
{oSit=oCouch;fDistSit=fDistanceCouch;}
|
|
else
|
|
//if (fDistanceStool<fDistanceChair && fDistanceStool<fDistanceBench && fDistanceStool<fDistanceCouch)
|
|
{oSit=oStool;fDistSit=fDistanceStool;}
|
|
|
|
if(oSit != OBJECT_INVALID && fDistSit < 12.0)
|
|
{
|
|
// if no one is sitting in the object the PC is closest to, have him sit in it
|
|
if (GetSittingCreature(oSit) == OBJECT_INVALID)
|
|
{
|
|
oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
AssignCommand(oPC,ActionMoveToObject(oSit,FALSE,2.0)); //:: Presumably this will be fixed in a patch so that Plares will not run to chair
|
|
ActionUnequipItem(oRightHand); //:: Added to resolve clipping issues when seated
|
|
ActionUnequipItem(oLeftHand); //:: Added to resolve clipping issues when seated
|
|
ActionDoCommand(AssignCommand(oPC,ActionSit(oSit)));
|
|
|
|
}
|
|
else
|
|
{SendMessageToPC(oPC,"The nearest chair is already taken ");}
|
|
}
|
|
else
|
|
{SendMessageToPC(oPC,"There are no chairs nearby");}
|
|
}
|
|
|
|
|
|
string dmwand_Alignment(object oEntity)
|
|
{
|
|
string sReturnString;
|
|
|
|
switch (GetAlignmentLawChaos(oEntity))
|
|
{
|
|
case ALIGNMENT_LAWFUL: sReturnString = "Lawful "; break;
|
|
case ALIGNMENT_NEUTRAL: sReturnString = "Neutral "; break;
|
|
case ALIGNMENT_CHAOTIC: sReturnString = "Chaotic "; break;
|
|
}
|
|
|
|
switch (GetAlignmentGoodEvil(oEntity))
|
|
{
|
|
case ALIGNMENT_GOOD: sReturnString = sReturnString + "Good"; break;
|
|
case ALIGNMENT_NEUTRAL: sReturnString = sReturnString + "Neutral"; break;
|
|
case ALIGNMENT_EVIL: sReturnString = sReturnString + "Evil"; break;
|
|
}
|
|
|
|
if (sReturnString == "Neutral Neutral"){sReturnString = "True Neutral";}
|
|
|
|
return sReturnString;
|
|
}
|
|
|
|
string dmwand_ClassLevel(object oEntity)
|
|
{
|
|
string sReturnString;
|
|
string sClass;
|
|
string sClassOne;
|
|
string sClassTwo;
|
|
string sClassThree;
|
|
int nLevelOne;
|
|
int nLevelTwo;
|
|
int nLevelThree;
|
|
int iIndex;
|
|
|
|
// Loop through all three classes and pull out info
|
|
for(iIndex == 1;iIndex < 4;iIndex++)
|
|
{
|
|
switch (GetClassByPosition(iIndex,oEntity))
|
|
{
|
|
case CLASS_TYPE_ABERRATION: sClass ="Aberration";break;
|
|
case CLASS_TYPE_ANIMAL: sClass ="Animal"; break;
|
|
case CLASS_TYPE_ARCANE_ARCHER: sClass ="Arcane Archer";break;
|
|
case CLASS_TYPE_ASSASSIN: sClass ="Assassin"; break;
|
|
case CLASS_TYPE_BARBARIAN: sClass ="Barbarian";break;
|
|
case CLASS_TYPE_BARD: sClass ="Bard"; break;
|
|
case CLASS_TYPE_BEAST: sClass ="Beast"; break;
|
|
case CLASS_TYPE_BLACKGUARD: sClass ="Blackguard"; break;
|
|
case CLASS_TYPE_CLERIC: sClass ="Cleric"; break;
|
|
case CLASS_TYPE_COMMONER: sClass ="Commoner";break;
|
|
case CLASS_TYPE_CONSTRUCT: sClass ="Construct"; break;
|
|
case CLASS_TYPE_DIVINECHAMPION: sClass ="Divine Champion"; break;
|
|
case CLASS_TYPE_DRAGON: sClass ="Dragon"; break;
|
|
case CLASS_TYPE_DRAGONDISCIPLE: sClass ="Dragon Disciple"; break;
|
|
case CLASS_TYPE_DRUID: sClass ="Druid";break;
|
|
case CLASS_TYPE_DWARVENDEFENDER: sClass ="Dwarven Defender"; break;
|
|
case CLASS_TYPE_ELEMENTAL: sClass ="Elemental"; break;
|
|
case CLASS_TYPE_FEY: sClass ="Fey";break;
|
|
case CLASS_TYPE_FIGHTER: sClass ="Fighter"; break;
|
|
case CLASS_TYPE_GIANT: sClass ="Giant"; break;
|
|
case CLASS_TYPE_HARPER: sClass ="Harper"; break;
|
|
case CLASS_TYPE_HUMANOID: sClass ="Humanoid"; break;
|
|
case CLASS_TYPE_INVALID: sClass ="";break;
|
|
case CLASS_TYPE_MAGICAL_BEAST: sClass ="Magical Beast"; break;
|
|
case CLASS_TYPE_MONK: sClass ="Monk"; break;
|
|
case CLASS_TYPE_OUTSIDER: sClass ="Outsider"; break;
|
|
case CLASS_TYPE_MONSTROUS: sClass ="Monstrous"; break;
|
|
case CLASS_TYPE_PALADIN: sClass ="Paladin";break;
|
|
case CLASS_TYPE_PALEMASTER: sClass ="Palemaster"; break;
|
|
case CLASS_TYPE_PURPLE_DRAGON_KNIGHT: sClass="Purple Dragon Knight"; break;
|
|
case CLASS_TYPE_RANGER: sClass ="Ranger";break;
|
|
case CLASS_TYPE_ROGUE: sClass ="Rogue";break;
|
|
case CLASS_TYPE_SHADOWDANCER: sClass ="Shadowdancer"; break;
|
|
case CLASS_TYPE_SHAPECHANGER: sClass ="Shapechanger";break;
|
|
case CLASS_TYPE_SHIFTER: sClass ="Shifter"; break;
|
|
case CLASS_TYPE_SORCERER: sClass ="Sorcerer";break;
|
|
case CLASS_TYPE_UNDEAD: sClass ="Undead";break;
|
|
case CLASS_TYPE_VERMIN: sClass ="Vermin"; break;
|
|
case CLASS_TYPE_WEAPON_MASTER: sClass ="Weapon Master"; break;
|
|
case CLASS_TYPE_WIZARD: sClass ="Wizard"; break;
|
|
}
|
|
|
|
// Now depending on which iteration we just went through
|
|
// assign it to the proper class
|
|
switch (iIndex)
|
|
{
|
|
case 1: sClassOne = sClass; break;
|
|
case 2: sClassTwo = sClass; break;
|
|
case 3: sClassThree = sClass; break;
|
|
}
|
|
};
|
|
|
|
// Now get all three class levels. Wil be 0 if does class pos
|
|
//does not exists
|
|
nLevelOne = GetLevelByPosition(1,oEntity);
|
|
nLevelTwo = GetLevelByPosition(2,oEntity);
|
|
nLevelThree = GetLevelByPosition(3,oEntity);
|
|
|
|
//Start building return string
|
|
sReturnString = sClassOne + "(" + IntToString(nLevelOne) + ")" ;
|
|
|
|
//If second class exists append to return string
|
|
if(nLevelTwo > 0)
|
|
{
|
|
sReturnString =sReturnString + "/" + sClassTwo + "(" + IntToString(nLevelTwo) + ")";
|
|
}
|
|
|
|
//If third class exists append to return string
|
|
if(nLevelThree > 0)
|
|
{
|
|
sReturnString =sReturnString + "/" + sClassThree + "(" + IntToString(nLevelThree) + ")";
|
|
}
|
|
|
|
return sReturnString;
|
|
}
|
|
|
|
string dmwand_Gender(object oEntity)
|
|
{
|
|
switch (GetGender(oEntity))
|
|
{
|
|
case GENDER_MALE: return "Male"; break;
|
|
case GENDER_FEMALE: return "Female"; break;
|
|
case GENDER_BOTH: return "Both"; break;
|
|
case GENDER_NONE: return "None"; break;
|
|
case GENDER_OTHER: return "Other"; break;
|
|
}
|
|
|
|
return "Weirdo";
|
|
}
|
|
|
|
string dmwand_ItemInfo(object oItem, int iInt)
|
|
{
|
|
string sReturnString = "";
|
|
string sBaseType = "";
|
|
string sStacked = "";
|
|
string sIdentified = "";
|
|
string sGPValue = "";
|
|
string sACValue = "";
|
|
string sProperties = "";
|
|
|
|
switch(GetBaseItemType(oItem))
|
|
{
|
|
case BASE_ITEM_AMULET: sBaseType ="Amulet";break;
|
|
case BASE_ITEM_ARMOR: sBaseType ="Armor";break;
|
|
case BASE_ITEM_ARROW: sBaseType ="Arrow";break;
|
|
case BASE_ITEM_BASTARDSWORD: sBaseType ="Bastard Sword";break;
|
|
case BASE_ITEM_BATTLEAXE: sBaseType ="Battle Axe";break;
|
|
case BASE_ITEM_BELT: sBaseType ="Belt";break;
|
|
case BASE_ITEM_BLANK_POTION : sBaseType ="Blank Potion";break;
|
|
case BASE_ITEM_BLANK_SCROLL : sBaseType ="Blank Scroll";break;
|
|
case BASE_ITEM_BLANK_WAND : sBaseType ="Blank Wand";break;
|
|
case BASE_ITEM_BOLT : sBaseType ="Bolt";break;
|
|
case BASE_ITEM_BOOK: sBaseType ="Book";break;
|
|
case BASE_ITEM_BOOTS: sBaseType ="Boots";break;
|
|
case BASE_ITEM_BRACER: sBaseType ="Bracer";break;
|
|
case BASE_ITEM_BULLET: sBaseType ="Bullet";break;
|
|
case BASE_ITEM_CBLUDGWEAPON: sBaseType ="Bludgeoning Weap.";break;
|
|
case BASE_ITEM_CLOAK: sBaseType ="Cloak";break;
|
|
case BASE_ITEM_CLUB: sBaseType ="Club";break;
|
|
case BASE_ITEM_CPIERCWEAPON: sBaseType ="Pierceing Weap.";break;
|
|
case BASE_ITEM_CREATUREITEM: sBaseType ="Creature Item";break;
|
|
case BASE_ITEM_CSLASHWEAPON: sBaseType ="Slash Weap.";break;
|
|
case BASE_ITEM_CSLSHPRCWEAP: sBaseType ="Slash/Pierce Weap.";break;
|
|
case BASE_ITEM_DAGGER: sBaseType ="Dagger";break;
|
|
case BASE_ITEM_DART: sBaseType ="Dart";break;
|
|
case BASE_ITEM_DIREMACE: sBaseType ="Mace";break;
|
|
case BASE_ITEM_DOUBLEAXE: sBaseType ="Double Axe";break;
|
|
case BASE_ITEM_DWARVENWARAXE : sBaseType ="Dwarven War Axe";break;
|
|
case BASE_ITEM_ENCHANTED_POTION : sBaseType ="Enchanted Potion";break;
|
|
case BASE_ITEM_ENCHANTED_SCROLL : sBaseType ="Enchanted Scroll";break;
|
|
case BASE_ITEM_ENCHANTED_WAND : sBaseType ="Enchanted Wand";break;
|
|
case BASE_ITEM_GEM: sBaseType ="Gem";break;
|
|
case BASE_ITEM_GLOVES: sBaseType ="Gloves";break;
|
|
case BASE_ITEM_GOLD: sBaseType ="Gold";break;
|
|
case BASE_ITEM_GREATAXE: sBaseType ="Great Axe";break;
|
|
case BASE_ITEM_GREATSWORD: sBaseType ="Great Sword";break;
|
|
case BASE_ITEM_GRENADE : sBaseType ="Grenade";break;
|
|
case BASE_ITEM_HALBERD: sBaseType ="Halberd";break;
|
|
case BASE_ITEM_HANDAXE: sBaseType ="Hand Axe";break;
|
|
case BASE_ITEM_HEALERSKIT: sBaseType ="Healers Kit";break;
|
|
case BASE_ITEM_HEAVYCROSSBOW: sBaseType ="Heavy Xbow";break;
|
|
case BASE_ITEM_HEAVYFLAIL: sBaseType ="Heavy Flail";break;
|
|
case BASE_ITEM_HELMET: sBaseType ="Helmet";break;
|
|
case BASE_ITEM_INVALID: sBaseType ="";break;
|
|
case BASE_ITEM_KAMA: sBaseType ="Kama";break;
|
|
case BASE_ITEM_KATANA: sBaseType ="Katana";break;
|
|
case BASE_ITEM_KEY: sBaseType ="Key";break;
|
|
case BASE_ITEM_KUKRI: sBaseType ="Kukri";break;
|
|
case BASE_ITEM_LARGEBOX: sBaseType ="Large Box";break;
|
|
case BASE_ITEM_LARGESHIELD: sBaseType ="Large Shield";break;
|
|
case BASE_ITEM_LIGHTCROSSBOW: sBaseType ="Light Xbow";break;
|
|
case BASE_ITEM_LIGHTFLAIL: sBaseType ="Light Flail";break;
|
|
case BASE_ITEM_LIGHTHAMMER: sBaseType ="Light Hammer";break;
|
|
case BASE_ITEM_LIGHTMACE: sBaseType ="Light Mace";break;
|
|
case BASE_ITEM_LONGBOW: sBaseType ="Long Bow";break;
|
|
case BASE_ITEM_LONGSWORD: sBaseType ="Long Sword";break;
|
|
case BASE_ITEM_MAGICROD: sBaseType ="Magic Rod";break;
|
|
case BASE_ITEM_MAGICSTAFF: sBaseType ="Magic Staff";break;
|
|
case BASE_ITEM_MAGICWAND: sBaseType ="Magic Wand";break;
|
|
case BASE_ITEM_MISCLARGE: sBaseType ="Misc. Large";break;
|
|
case BASE_ITEM_MISCMEDIUM: sBaseType ="Misc. Medium";break;
|
|
case BASE_ITEM_MISCSMALL: sBaseType ="Misc. Small";break;
|
|
case BASE_ITEM_MISCTALL: sBaseType ="Misc. Small";break;
|
|
case BASE_ITEM_MISCTHIN: sBaseType ="Misc. Thin";break;
|
|
case BASE_ITEM_MISCWIDE: sBaseType ="Misc. Wide";break;
|
|
case BASE_ITEM_MORNINGSTAR: sBaseType ="Morningstar";break;
|
|
case BASE_ITEM_POTIONS: sBaseType ="Potion";break;
|
|
case BASE_ITEM_QUARTERSTAFF: sBaseType ="Quarterstaff";break;
|
|
case BASE_ITEM_RAPIER: sBaseType ="Rapier";break;
|
|
case BASE_ITEM_RING: sBaseType ="Ring";break;
|
|
case BASE_ITEM_SCIMITAR: sBaseType ="Scimitar";break;
|
|
case BASE_ITEM_SCROLL: sBaseType ="Scroll";break;
|
|
case BASE_ITEM_SCYTHE: sBaseType ="Scythe";break;
|
|
case BASE_ITEM_SHORTBOW: sBaseType ="Shortbow";break;
|
|
case BASE_ITEM_SHORTSPEAR: sBaseType ="Short Spear";break;
|
|
case BASE_ITEM_SHORTSWORD: sBaseType ="Short Sword";break;
|
|
case BASE_ITEM_SHURIKEN: sBaseType ="Shuriken";break;
|
|
case BASE_ITEM_SICKLE: sBaseType ="Sickle";break;
|
|
case BASE_ITEM_SLING: sBaseType ="Sling";break;
|
|
case BASE_ITEM_SMALLSHIELD: sBaseType ="Small Shield";break;
|
|
case BASE_ITEM_SPELLSCROLL: sBaseType ="Spell Scroll";break;
|
|
case BASE_ITEM_THIEVESTOOLS: sBaseType ="Thieves Tools";break;
|
|
case BASE_ITEM_THROWINGAXE: sBaseType ="Throwing Axe";break;
|
|
case BASE_ITEM_TORCH: sBaseType ="Torch";break;
|
|
case BASE_ITEM_TOWERSHIELD: sBaseType ="Tower Shield";break;
|
|
case BASE_ITEM_TRAPKIT: sBaseType ="Trap Kit";break;
|
|
case BASE_ITEM_TRIDENT: sBaseType ="Trident";break;
|
|
case BASE_ITEM_TWOBLADEDSWORD: sBaseType ="2 Bladed Sword";break;
|
|
case BASE_ITEM_WARHAMMER: sBaseType ="Warhammer";break;
|
|
case BASE_ITEM_WHIP : sBaseType ="Whip";break;
|
|
}
|
|
|
|
sReturnString = sStacked + GetName(oItem) + " (" + sBaseType + ")";
|
|
return sReturnString;
|
|
}
|
|
|
|
string dmwand_Inventory(object oEntity)
|
|
{
|
|
|
|
string sBaseType;
|
|
string sReturnString;
|
|
|
|
sReturnString = sReturnString + "\nEquipped:\n";
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_ARMS, oMyTarget))){ sReturnString = sReturnString + "Arms: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_ARMS, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BELT, oMyTarget))){ sReturnString = sReturnString + "Belt: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BELT, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BOOTS, oMyTarget))){ sReturnString = sReturnString + "Boots: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BOOTS, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CHEST, oMyTarget))){ sReturnString = sReturnString + "Chest: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CHEST, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CLOAK, oMyTarget))){ sReturnString = sReturnString + "Cloak: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CLOAK, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_HEAD, oMyTarget))){ sReturnString = sReturnString + "Head: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_HEAD, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oMyTarget))){ sReturnString = sReturnString + "Left Hand: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oMyTarget))){ sReturnString = sReturnString + "Left Ring: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_NECK, oMyTarget))){ sReturnString = sReturnString + "Neck: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_NECK, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oMyTarget))){ sReturnString = sReturnString + "Right Hand: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oMyTarget))){ sReturnString = sReturnString + "Right Ring: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_ARROWS, oMyTarget))){ sReturnString = sReturnString + "Arrows: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_ARROWS, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BOLTS, oMyTarget))){ sReturnString = sReturnString + "Bolts: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BOLTS, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BULLETS, oMyTarget))){ sReturnString = sReturnString + "Bullets: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BULLETS, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oMyTarget))){ sReturnString = sReturnString + "Creature Armor: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMyTarget))){ sReturnString = sReturnString + "Creature Bite: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMyTarget))){ sReturnString = sReturnString + "Creature Left: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMyTarget),0) + "\n"; }
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMyTarget))){ sReturnString = sReturnString + "Creature Right: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMyTarget),0) + "\n"; }
|
|
|
|
object oItem = GetFirstItemInInventory(oEntity);
|
|
|
|
while(oItem != OBJECT_INVALID)
|
|
{
|
|
sReturnString = sReturnString + "\n" + dmwand_ItemInfo(oItem, 0);
|
|
oItem = GetNextItemInInventory(oEntity);
|
|
};
|
|
|
|
return sReturnString;
|
|
}
|
|
|
|
string dmwand_Race(object oEntity)
|
|
{
|
|
switch (MyPRCGetRacialType(oEntity))
|
|
{
|
|
case RACIAL_TYPE_ABERRATION: return "Aberration"; break;
|
|
case RACIAL_TYPE_ALL: return "All"; break;
|
|
case RACIAL_TYPE_ANIMAL: return "Animal"; break;
|
|
case RACIAL_TYPE_BEAST: return "Beast"; break;
|
|
case RACIAL_TYPE_CONSTRUCT: return "Construct"; break;
|
|
case RACIAL_TYPE_DRAGON: return "Dragon"; break;
|
|
case RACIAL_TYPE_DWARF: return "Dwarf"; break;
|
|
case RACIAL_TYPE_ELEMENTAL: return "Elemental"; break;
|
|
case RACIAL_TYPE_ELF: return "Elf"; break;
|
|
case RACIAL_TYPE_FEY: return "Fey"; break;
|
|
case RACIAL_TYPE_GIANT: return "Giant"; break;
|
|
case RACIAL_TYPE_GNOME: return "Gnome"; break;
|
|
case RACIAL_TYPE_HALFELF: return "Half Elf"; break;
|
|
case RACIAL_TYPE_HALFLING: return "Halfling"; break;
|
|
case RACIAL_TYPE_HALFORC: return "Half Orc"; break;
|
|
case RACIAL_TYPE_HUMAN: return "Human"; break;
|
|
case RACIAL_TYPE_HUMANOID_GOBLINOID: return "Goblinoid"; break;
|
|
case RACIAL_TYPE_HUMANOID_MONSTROUS: return "Monstrous"; break;
|
|
case RACIAL_TYPE_HUMANOID_ORC: return "Orc"; break;
|
|
case RACIAL_TYPE_HUMANOID_REPTILIAN: return "Reptillian"; break;
|
|
case RACIAL_TYPE_MAGICAL_BEAST: return "Magical Beast"; break;
|
|
case RACIAL_TYPE_OOZE: return "Ooze"; break;
|
|
case RACIAL_TYPE_OUTSIDER: return "Outsider"; break;
|
|
case RACIAL_TYPE_SHAPECHANGER: return "Shapechanger"; break;
|
|
case RACIAL_TYPE_UNDEAD: return "Undead"; break;
|
|
case RACIAL_TYPE_VERMIN: return "Vermin"; break;
|
|
}
|
|
|
|
return "Unknown";
|
|
}
|
|
int DMFI_GetNetWorth(object oTarget)
|
|
{
|
|
int n;
|
|
object oItem = GetFirstItemInInventory(oTarget);
|
|
while(GetIsObjectValid(oItem))
|
|
{
|
|
n= n + GetGoldPieceValue(oItem);
|
|
oItem = GetNextItemInInventory(oTarget);
|
|
}
|
|
|
|
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_ARMS, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_ARROWS, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BELT, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BOLTS, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BOOTS, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BULLETS, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CLOAK, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_HEAD, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_NECK, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget));
|
|
n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oTarget));
|
|
return n;
|
|
}
|
|
|
|
void DMFI_report(object oTarget, object oUser)
|
|
{
|
|
string sSTR = IntToString(GetAbilityScore(oMyTarget,ABILITY_STRENGTH));
|
|
string sINT = IntToString(GetAbilityScore(oMyTarget,ABILITY_INTELLIGENCE));
|
|
string sDEX = IntToString(GetAbilityScore(oMyTarget,ABILITY_DEXTERITY));
|
|
string sWIS = IntToString(GetAbilityScore(oMyTarget,ABILITY_WISDOM));
|
|
string sCON = IntToString(GetAbilityScore(oMyTarget,ABILITY_CONSTITUTION));
|
|
string sCHA = IntToString(GetAbilityScore(oMyTarget,ABILITY_CHARISMA));
|
|
string sReport = "\n-------------------------------------------" +
|
|
"\nReported: " + IntToString(GetTimeHour()) + ":" + IntToString(GetTimeMinute()) +
|
|
"\nPlayer Name: " + GetPCPlayerName(oMyTarget) +
|
|
"\nPublic CDKey: " + GetPCPublicCDKey(oMyTarget) +
|
|
"\nChar Name: " + GetName(oMyTarget) +
|
|
"\n-------------------------------------------" +
|
|
"\nRace: " + dmwand_Race(oMyTarget) +
|
|
"\nClass: " + dmwand_ClassLevel(oMyTarget) +
|
|
"\nXP: " + IntToString(GetXP(oMyTarget)) +
|
|
"\nGender: " + dmwand_Gender(oMyTarget) +
|
|
"\nAlign: " + dmwand_Alignment(oMyTarget) +
|
|
"\nDeity: " + GetDeity(oMyTarget) +
|
|
"\n" +
|
|
"\nSTR: " + sSTR +
|
|
"\nINT: " + sINT +
|
|
"\nWIS: " + sWIS +
|
|
"\nDEX: " + sDEX +
|
|
"\nCON: " + sCON +
|
|
"\nCHA: " + sCHA +
|
|
"\n" +
|
|
"\nHP: " + IntToString(GetCurrentHitPoints(oMyTarget)) +
|
|
" of " + IntToString(GetMaxHitPoints(oMyTarget)) +
|
|
"\nAC: " + IntToString(GetAC(oMyTarget)) +
|
|
"\nGold: " + IntToString(GetGold(oMyTarget)) +
|
|
"\nNet Worth: " + IntToString(DMFI_GetNetWorth(oMyTarget) + GetGold(oMyTarget)) +
|
|
"\nInventory:\n " + dmwand_Inventory(oMyTarget) +
|
|
"\n-------------------------------------------";
|
|
|
|
SendMessageToPC(oUser, sReport);
|
|
SendMessageToAllDMs(sReport);
|
|
}
|