Merged redundant hak files. Moved hak scripts into module. Updated gitignore. Full Compile. Added release folder & archive.
539 lines
22 KiB
Plaintext
539 lines
22 KiB
Plaintext
/////////////////////////////////////////////////////////////////////////
|
|
// NPC ACTIVITIES 5.0 - ACTION LIBRARY
|
|
// Version: 1.0
|
|
// Library name: NA
|
|
// Also used with NPC ACTIVITIES 6.0 but, did not require modification
|
|
//=======================================================================
|
|
// Author: Deva Bryson Winblood
|
|
// Date : 02/20/2003
|
|
//=======================================================================
|
|
// This libraru handles actions that do not neatly fall under another
|
|
// library category but, are useful to the development of a module.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
#include "npcactlibtoolh"
|
|
const int DEBUG_LIB =FALSE;
|
|
// #Parm1 FUNCTION PARAMETERS
|
|
//------------------------------------------------------------------------
|
|
// 1 Use Placeable by Tag Placeable Tag
|
|
// 2 Check for open weapons Handle Method / Prison Tag
|
|
// 3 Check for Decency Handle Method / Prison Tag
|
|
// 4 No Animals Allowed Handle Method / Prison Tag
|
|
// 5 If possess item talk to Item Tag / conversation file
|
|
// 6 Equip specific item Item Tag / Slot # per documentation
|
|
|
|
///////////////////////////////// PROTOTYPES //////////////////////////////
|
|
void LIB1UseByTag(string sTag);
|
|
void LIB2NoWeapons(string sMethod, string sPrison,int nEND=FALSE);
|
|
void LIB3Decency(string sMethod, string sPrison,int nEND=FALSE);
|
|
void LIB4NoAnimals(string sMethod, string sPrison,int nEND=FALSE);
|
|
void LIB5ItemTriggerTalk(string sItem,string sConversation);
|
|
void LIB6EquipItem(string sItem,string sSlot);
|
|
|
|
//=============================================[ M A I N ]=================
|
|
void main()
|
|
{
|
|
string sParmIn=GetLocalString(OBJECT_SELF,"sLIBParm");
|
|
DeleteLocalString(OBJECT_SELF,"sLIBParm");
|
|
fnTokenizeParameters(sParmIn);
|
|
int nArgC=GetLocalInt(OBJECT_SELF,"nArgc");
|
|
string sParm;
|
|
int nFuncNum; // function number
|
|
string sParm1;
|
|
string sParm2;
|
|
string sParm3;
|
|
object oPC=GetFirstPC();
|
|
if (DEBUG_LIB) SendMessageToPC(oPC,"[=====NA LIB CALLED=====] ARGS:"+IntToString(nArgC));
|
|
if (nArgC>0)
|
|
{ // Arguments were passed
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE); // no interference
|
|
sParm=GetLocalString(OBJECT_SELF,"sArgv1");
|
|
nFuncNum=StringToInt(sParm);
|
|
if (nArgC>1) sParm1=GetLocalString(OBJECT_SELF,"sArgv2");
|
|
if (nArgC>2) sParm2=GetLocalString(OBJECT_SELF,"sArgv3");
|
|
if (nArgC>3) sParm3=GetLocalString(OBJECT_SELF,"sArgv4");
|
|
if (DEBUG_LIB) SendMessageToPC(oPC,"[Arguments 1:"+sParm+" 2:"+sParm1+" 3:"+sParm2+" 4:"+sParm3+"]");
|
|
switch(nFuncNum)
|
|
{ // Choose library function to call
|
|
case 1: { // Use Placeable by Tag
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",2);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," USE PLACEABLE");
|
|
LIB1UseByTag(sParm1);
|
|
break;
|
|
} // Use Placeable by Tag
|
|
case 2: { // Check for open weapons
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",2);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," CHECK FOR WEAPONS");
|
|
LIB2NoWeapons(sParm1,sParm2);
|
|
break;
|
|
} // Check for open weapons
|
|
case 3: { // Check for Decency
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",2);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," CHECK FOR DECENCY");
|
|
LIB3Decency(sParm1,sParm2);
|
|
break;
|
|
} // Check for Decency
|
|
case 4: { // No Animals allowed
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",2);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," NO ANIMALS ALLOWED");
|
|
LIB4NoAnimals(sParm1,sParm2);
|
|
break;
|
|
} // No Animals allowed
|
|
case 5: { // Possess item talk to
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",2);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," ITEM TRIGGER TALK");
|
|
LIB5ItemTriggerTalk(sParm1,sParm2);
|
|
break;
|
|
} // Possess item talk to
|
|
case 6: { // Equip specific item
|
|
SetLocalInt(OBJECT_SELF,"nGNBMaxHB",1);
|
|
if (DEBUG_LIB) SendMessageToPC(oPC," EQUIP SPECIFIC ITEM");
|
|
LIB6EquipItem(sParm1,sParm2);
|
|
break;
|
|
} // Equip specific item
|
|
default: { SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE); break; }
|
|
} // Choose library function to call
|
|
} // Arguments were passed
|
|
fnFreeParms();
|
|
}
|
|
//==================================================[ M A I N ]===============
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// LIBRARY SUPPORT FUNCTIONS
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
int fnWeaponProperties(object oItem)
|
|
{ // return TRUE if item is a weapon
|
|
int nRet=FALSE;
|
|
int nType=GetBaseItemType(oItem);
|
|
switch(nType)
|
|
{ // weapons
|
|
case BASE_ITEM_BASTARDSWORD:
|
|
case BASE_ITEM_BATTLEAXE:
|
|
case BASE_ITEM_CLUB:
|
|
case BASE_ITEM_DAGGER:
|
|
case BASE_ITEM_DART:
|
|
case BASE_ITEM_DIREMACE:
|
|
case BASE_ITEM_DOUBLEAXE:
|
|
case BASE_ITEM_GREATAXE:
|
|
case BASE_ITEM_GREATSWORD:
|
|
case BASE_ITEM_HALBERD:
|
|
case BASE_ITEM_HANDAXE:
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
case BASE_ITEM_HEAVYFLAIL:
|
|
case BASE_ITEM_KAMA:
|
|
case BASE_ITEM_KATANA:
|
|
case BASE_ITEM_KUKRI:
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
case BASE_ITEM_LIGHTFLAIL:
|
|
case BASE_ITEM_LIGHTHAMMER:
|
|
case BASE_ITEM_LIGHTMACE:
|
|
case BASE_ITEM_LONGBOW:
|
|
case BASE_ITEM_LONGSWORD:
|
|
case BASE_ITEM_MORNINGSTAR:
|
|
case BASE_ITEM_QUARTERSTAFF:
|
|
case BASE_ITEM_RAPIER:
|
|
case BASE_ITEM_SCIMITAR:
|
|
case BASE_ITEM_SCYTHE:
|
|
case BASE_ITEM_SHORTBOW:
|
|
case BASE_ITEM_SHORTSPEAR:
|
|
case BASE_ITEM_SHORTSWORD:
|
|
case BASE_ITEM_SHURIKEN:
|
|
case BASE_ITEM_SICKLE:
|
|
case BASE_ITEM_SLING:
|
|
case BASE_ITEM_THROWINGAXE:
|
|
case BASE_ITEM_TWOBLADEDSWORD:
|
|
case BASE_ITEM_WARHAMMER: { nRet=TRUE; break; }
|
|
} // weapons
|
|
return nRet;
|
|
} // fnWeaponProperties()
|
|
|
|
int fnHasWeapon(object oTest)
|
|
{ // Test to see if this person is wielding a weapon
|
|
int nRet=FALSE;
|
|
object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTest);
|
|
if (fnWeaponProperties(oItem)) nRet=TRUE;
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oTest);
|
|
if (fnWeaponProperties(oItem)) nRet=TRUE;
|
|
return nRet;
|
|
} // fnHasWeapon()
|
|
|
|
void fnHandleLaw(string sMethod,string sPrison,object oTarget)
|
|
{ // Justice needs to be served
|
|
int nMethod=StringToInt(sMethod);
|
|
object oDest=GetWaypointByTag(sPrison);
|
|
effect eKnockdown=EffectKnockdown();
|
|
int nC=1;
|
|
object oFriend;
|
|
switch (nMethod)
|
|
{ // justice switch
|
|
case 0: { // empty threats
|
|
break;
|
|
} // empty threats
|
|
case 1: { // attack and kill
|
|
SetIsTemporaryEnemy(oTarget,OBJECT_SELF,TRUE,60.0);
|
|
SetIsTemporaryEnemy(OBJECT_SELF,oTarget,TRUE,60.0);
|
|
ActionAttack(oTarget);
|
|
break;
|
|
} // attack and kill
|
|
case 2: { // transport to jail
|
|
ActionForceMoveToObject(oTarget,TRUE,2.0,6.0);
|
|
ActionDoCommand(AssignCommand(oTarget,ClearAllActions()));
|
|
ActionDoCommand(AssignCommand(oTarget,JumpToObject(oDest)));
|
|
ActionDoCommand(DelayCommand(1.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eKnockdown,oTarget,3.0)));
|
|
break;
|
|
} // transport to jail
|
|
case 3: { // attack and kill - call for help
|
|
ActionSpeakString("ALERT!!! ALERT!!!",TALKVOLUME_SHOUT);
|
|
SetIsTemporaryEnemy(oTarget,OBJECT_SELF,TRUE,60.0);
|
|
SetIsTemporaryEnemy(OBJECT_SELF,oTarget,TRUE,60.0);
|
|
ActionAttack(oTarget);
|
|
oFriend=GetNearestObjectByTag(GetTag(OBJECT_SELF),oTarget,nC);
|
|
while (oFriend!=OBJECT_INVALID)
|
|
{
|
|
ActionSpeakString("I'm on the way!",TALKVOLUME_SHOUT);
|
|
SetIsTemporaryEnemy(oTarget,oFriend,TRUE,60.0);
|
|
SetIsTemporaryEnemy(oFriend,oTarget,TRUE,60.0);
|
|
SetLocalInt(oFriend,"nGNBDisabled",TRUE);
|
|
DelayCommand(120.0,SetLocalInt(oFriend,"nGNBDisabled",FALSE));
|
|
AssignCommand(oFriend,ActionForceMoveToObject(oTarget,TRUE,10.0));
|
|
AssignCommand(oFriend,ActionAttack(oTarget));
|
|
nC++;
|
|
oFriend=GetNearestObjectByTag(GetTag(OBJECT_SELF),oTarget,nC);
|
|
}
|
|
break;
|
|
} // attack and kill - call for help
|
|
} // justice switch
|
|
} // fnHandleLaw()
|
|
|
|
|
|
int fnHasBeasts(object oT)
|
|
{ // does target have beasts within 15 meters of speaker?
|
|
int nRet=FALSE;
|
|
object oBeast=GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oT);
|
|
float fDist=GetDistanceToObject(oBeast);
|
|
if (oBeast!=OBJECT_INVALID&&fDist!=-1.0&&fDist<15.1) nRet=TRUE;
|
|
else
|
|
{ // familiar
|
|
oBeast=GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oT);
|
|
fDist=GetDistanceToObject(oBeast);
|
|
if (oBeast!=OBJECT_INVALID&&fDist!=-1.0&&fDist<15.1) nRet=TRUE;
|
|
else
|
|
{ // summoned
|
|
oBeast=GetAssociate(ASSOCIATE_TYPE_SUMMONED,oT);
|
|
fDist=GetDistanceToObject(oBeast);
|
|
if (oBeast!=OBJECT_INVALID&&fDist!=-1.0&&fDist<15.1) nRet=TRUE;
|
|
} // summoned
|
|
} // familiar
|
|
return nRet;
|
|
} // fnHasBeasts()
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
// LIBRARY F U N C T I O N S
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
void LIB1UseByTag(string sTag)
|
|
{ // Use object by tag
|
|
DelayCommand(30.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
object oUse=GetNearestObjectByTag(sTag);
|
|
if (oUse!=OBJECT_INVALID&&GetDistanceBetween(OBJECT_SELF,oUse)<10.0)
|
|
{ // !OI
|
|
ActionMoveToObject(oUse);
|
|
ActionDoCommand(SetFacingPoint(GetPosition(oUse)));
|
|
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,3.0);
|
|
ActionInteractObject(oUse);
|
|
} // !OI
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
} // LIB1UseByTag()
|
|
|
|
|
|
void LIB2NoWeapons(string sMethod,string sPrison,int nEnd=FALSE)
|
|
{ // Check for weapons
|
|
//DelayCommand(10.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
int nL2WC=GetLocalInt(OBJECT_SELF,"nL2WC");
|
|
object oL2WARNED=GetLocalObject(OBJECT_SELF,"oL2WARNED");
|
|
object oPC;
|
|
int nC=1;
|
|
int nENDM=nEnd;
|
|
//DelayCommand(120.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
//SendMessageToPC(GetFirstPC(),"[WC]"+GetName(OBJECT_SELF)+" nL2WC:"+IntToString(nL2WC)+" WARNED:"+GetName(oL2WARNED));
|
|
if (oL2WARNED!=OBJECT_INVALID&&nL2WC>0)
|
|
{ // already warned someone
|
|
if (fnHasWeapon(oL2WARNED)&&!GetIsDead(oL2WARNED)&&GetDistanceBetween(OBJECT_SELF,oL2WARNED)!=0.0&&GetDistanceBetween(OBJECT_SELF,oL2WARNED)<30.0)
|
|
{ // still wielding
|
|
nL2WC++;
|
|
SetLocalInt(OBJECT_SELF,"nL2WC",nL2WC);
|
|
switch (nL2WC)
|
|
{
|
|
case 2: { // second warning
|
|
ActionSpeakString("You MUST put your weapons away now!!");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB2NoWeapons(sMethod,sPrison));
|
|
break;
|
|
} // second warning
|
|
case 3: { // third warning
|
|
ActionSpeakString("This is your LAST warning. Put your weapons away!");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB2NoWeapons(sMethod,sPrison));
|
|
break;
|
|
} // third warning
|
|
default: { // 4 or more
|
|
ActionSpeakString("You will be forced to put your weapons away NOW!",TALKVOLUME_SHOUT);
|
|
fnHandleLaw(sMethod,sPrison,oL2WARNED);
|
|
DeleteLocalInt(OBJECT_SELF,"nL2WC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL2WARNED");
|
|
if (sMethod=="0"||sMethod=="2") nENDM=TRUE;
|
|
break;
|
|
} // 4 or more
|
|
}
|
|
} // still wielding
|
|
else
|
|
{ // he has put it away
|
|
ActionSpeakString("Thank you for putting your weapons away.");
|
|
DeleteLocalInt(OBJECT_SELF,"nL2WC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL2WARNED");
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE);
|
|
nENDM=TRUE;
|
|
} // he has put it away
|
|
} // already warned someone
|
|
else
|
|
{ // search for others possibly needing warning
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
while(oPC!=OBJECT_INVALID&&oL2WARNED==OBJECT_INVALID)
|
|
{ // look for those packing weapons
|
|
if (fnHasWeapon(oPC))
|
|
{ // found someone
|
|
ActionDoCommand(SetFacingPoint(GetPosition(oPC)));
|
|
ActionSpeakString("Your weapons must be put away while in this area.");
|
|
ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE,1.0,5.0);
|
|
SetLocalObject(OBJECT_SELF,"oL2WARNED",oPC);
|
|
SetLocalInt(OBJECT_SELF,"nL2WC",1);
|
|
oL2WARNED=oPC;
|
|
DelayCommand(6.0,LIB2NoWeapons(sMethod,sPrison));
|
|
} // found someone
|
|
else
|
|
nENDM=TRUE;
|
|
nC++;
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
} // look for those packing weapons
|
|
} // search for others possibly needing warning
|
|
if (GetLocalObject(OBJECT_SELF,"oL2WARNED")==OBJECT_INVALID) nENDM=TRUE;
|
|
if (nENDM)
|
|
{
|
|
//SendMessageToPC(GetFirstPC(),"[WEP]"+GetName(OBJECT_SELF));
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
DelayCommand(60.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
}
|
|
} // LIB2NoWeapons()
|
|
|
|
|
|
void LIB3Decency(string sMethod, string sPrison,int nEnd=FALSE)
|
|
{ // Check to make sure wearing clothes
|
|
int nL3DC=GetLocalInt(OBJECT_SELF,"nL3DC");
|
|
object oL3WARNED=GetLocalObject(OBJECT_SELF,"oL3WARNED");
|
|
object oPC;
|
|
int nC=1;
|
|
int nENDM=nEnd;
|
|
//DelayCommand(120.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
//SendMessageToPC(GetFirstPC(),"[DC]"+GetName(OBJECT_SELF)+" nL3DC:"+IntToString(nL3DC)+" WARNED:"+GetName(oL3WARNED));
|
|
if (oL3WARNED!=OBJECT_INVALID&&nL3DC>0)
|
|
{ // already warning someone
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
if (GetItemInSlot(INVENTORY_SLOT_CHEST,oL3WARNED)==OBJECT_INVALID&&!GetIsDead(oL3WARNED)&&GetDistanceBetween(OBJECT_SELF,oL3WARNED)!=0.0&&GetDistanceBetween(OBJECT_SELF,oL3WARNED)<30.0)
|
|
{ // still wielding
|
|
nL3DC++;
|
|
SetLocalInt(OBJECT_SELF,"nL3DC",nL3DC);
|
|
switch (nL3DC)
|
|
{
|
|
case 2: { // second warning
|
|
ActionSpeakString("You MUST put some clothes on or leave this area immediately.");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB3Decency(sMethod,sPrison));
|
|
break;
|
|
} // second warning
|
|
case 3: { // third warning
|
|
ActionSpeakString("This is your LAST warning. Put some clothing on!");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB3Decency(sMethod,sPrison));
|
|
break;
|
|
} // third warning
|
|
default: { // 4 or more
|
|
ActionSpeakString("You will be forced to comply with our deceny regulations!",TALKVOLUME_SHOUT);
|
|
fnHandleLaw(sMethod,sPrison,oL3WARNED);
|
|
DeleteLocalInt(OBJECT_SELF,"nL3DC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL3WARNED");
|
|
if (sMethod=="2"||sMethod=="0") nENDM=TRUE;
|
|
break;
|
|
} // 4 or more
|
|
}
|
|
} // still wielding
|
|
else
|
|
{ // he has put it away
|
|
ActionSpeakString("Thank you. You are much more suitable looking with clothing on.");
|
|
DeleteLocalInt(OBJECT_SELF,"nL3DC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL3WARNED");
|
|
nENDM=TRUE;
|
|
} // he has put it away
|
|
} // already warning someone
|
|
else
|
|
{ // Look for someone else
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
while(oPC!=OBJECT_INVALID&&oL3WARNED==OBJECT_INVALID)
|
|
{ // look for those wearing no clothes
|
|
if (GetItemInSlot(INVENTORY_SLOT_CHEST,oPC)==OBJECT_INVALID)
|
|
{ // found someone
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
ActionDoCommand(SetFacingPoint(GetPosition(oPC)));
|
|
ActionSpeakString("Excuse me, you must have clothing to be in this area.");
|
|
ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE,1.0,5.0);
|
|
SetLocalObject(OBJECT_SELF,"oL3WARNED",oPC);
|
|
SetLocalInt(OBJECT_SELF,"nL3DC",1);
|
|
oL3WARNED=oPC;
|
|
DelayCommand(6.0,LIB3Decency(sMethod,sPrison));
|
|
} // found someone
|
|
else
|
|
nENDM=TRUE;
|
|
nC++;
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
} // look for those packing weapons
|
|
} // Look for someone else
|
|
if (GetLocalObject(OBJECT_SELF,"oL3WARNED")==OBJECT_INVALID) nENDM=TRUE;
|
|
if (nENDM)
|
|
{
|
|
//SendMessageToPC(GetFirstPC(),"[DEC]"+GetName(OBJECT_SELF));
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
DelayCommand(60.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
}
|
|
} // LIB3Decency()
|
|
|
|
void LIB4NoAnimals(string sMethod, string sPrison,int nEnd=FALSE)
|
|
{ // Check to make sure no animal companions, familiars, etc.
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
int nL4WC=GetLocalInt(OBJECT_SELF,"nL4WC");
|
|
object oL4WARNED=GetLocalObject(OBJECT_SELF,"oL4WARNED");
|
|
object oPC;
|
|
int nC=1;
|
|
int nENDM=nEnd;
|
|
//DelayCommand(120.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
//SendMessageToPC(GetFirstPC(),"[WC]"+GetName(OBJECT_SELF)+" nL2WC:"+IntToString(nL2WC)+" WARNED:"+GetName(oL2WARNED));
|
|
if (oL4WARNED!=OBJECT_INVALID&&nL4WC>0)
|
|
{ // already warned someone
|
|
if (fnHasBeasts(oL4WARNED)&&!GetIsDead(oL4WARNED)&&GetDistanceBetween(OBJECT_SELF,oL4WARNED)!=0.0&&GetDistanceBetween(OBJECT_SELF,oL4WARNED)<30.0)
|
|
{ // still wielding
|
|
nL4WC++;
|
|
SetLocalInt(OBJECT_SELF,"nL4WC",nL4WC);
|
|
switch (nL4WC)
|
|
{
|
|
case 2: { // second warning
|
|
ActionSpeakString("You MUST send your beasts away now!!");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB4NoAnimals(sMethod,sPrison));
|
|
break;
|
|
} // second warning
|
|
case 3: { // third warning
|
|
ActionSpeakString("This is your LAST warning. Send your beasts away!!");
|
|
ActionWait(5.0);
|
|
DelayCommand(6.0,LIB4NoAnimals(sMethod,sPrison));
|
|
break;
|
|
} // third warning
|
|
default: { // 4 or more
|
|
ActionSpeakString("You will be forced to part with your beasts now!!!",TALKVOLUME_SHOUT);
|
|
fnHandleLaw(sMethod,sPrison,oL4WARNED);
|
|
DeleteLocalInt(OBJECT_SELF,"nL4WC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL4WARNED");
|
|
if (sMethod=="0"||sMethod=="2") nENDM=TRUE;
|
|
break;
|
|
} // 4 or more
|
|
}
|
|
} // still wielding
|
|
else
|
|
{ // he has put it away
|
|
ActionSpeakString("Thank you for sending your beasts away.");
|
|
DeleteLocalInt(OBJECT_SELF,"nL4WC");
|
|
DeleteLocalObject(OBJECT_SELF,"oL4WARNED");
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE);
|
|
nENDM=TRUE;
|
|
} // he has put it away
|
|
} // already warned someone
|
|
else
|
|
{ // search for others possibly needing warning
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
while(oPC!=OBJECT_INVALID&&oL4WARNED==OBJECT_INVALID)
|
|
{ // look for those packing weapons
|
|
if (fnHasBeasts(oPC))
|
|
{ // found someone
|
|
ActionDoCommand(SetFacingPoint(GetPosition(oPC)));
|
|
ActionSpeakString("Animal companions, familiars, and summoned creatures are not permitted here. Please send them away.");
|
|
ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE,1.0,5.0);
|
|
SetLocalObject(OBJECT_SELF,"oL4WARNED",oPC);
|
|
SetLocalInt(OBJECT_SELF,"nL4WC",1);
|
|
oL4WARNED=oPC;
|
|
DelayCommand(6.0,LIB4NoAnimals(sMethod,sPrison));
|
|
} // found someone
|
|
else
|
|
nENDM=TRUE;
|
|
nC++;
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,nC,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
} // look for those packing weapons
|
|
} // search for others possibly needing warning
|
|
if (GetLocalObject(OBJECT_SELF,"oL4WARNED")==OBJECT_INVALID) nENDM=TRUE;
|
|
if (nENDM)
|
|
{
|
|
//SendMessageToPC(GetFirstPC(),"[WEP]"+GetName(OBJECT_SELF));
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
DelayCommand(60.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
}
|
|
} // LIB4NoAnimals()
|
|
|
|
|
|
void LIB5ItemTriggerTalk(string sItem, string sConversation)
|
|
{ // If perceived PC possesses the item approach and speak
|
|
object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,1,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
int nC=1;
|
|
while(!IsInConversation(OBJECT_SELF)&&oPC!=OBJECT_INVALID)
|
|
{ // pcs
|
|
if (!IsInConversation(oPC)&&GetItemPossessedBy(oPC,sItem)!=OBJECT_INVALID)
|
|
{ // speak to them
|
|
oPC=OBJECT_INVALID; // done
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
ActionMoveToObject(oPC,TRUE,2.0);
|
|
ActionStartConversation(oPC,sConversation);
|
|
} // speak to them
|
|
else
|
|
{ // keep looking
|
|
nC++;
|
|
oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,1,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE);
|
|
} // keep looking
|
|
} // pcs
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
DelayCommand(20.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
} // LIB5ItemTriggerTalk()
|
|
|
|
|
|
void LIB6EquipItem(string sItem,string sSlot)
|
|
{ // equip specific item in Inventory slot #
|
|
object oItem=GetItemPossessedBy(OBJECT_SELF,sItem);
|
|
int nSlot=StringToInt(sSlot);
|
|
if (oItem!=OBJECT_INVALID)
|
|
{ // has the item
|
|
SetLocalInt(OBJECT_SELF,"nGNBDisabled",TRUE);
|
|
if (nSlot==0) nSlot=INVENTORY_SLOT_HEAD;
|
|
else if (nSlot==1) nSlot=INVENTORY_SLOT_RIGHTHAND;
|
|
else if (nSlot==2) nSlot=INVENTORY_SLOT_LEFTHAND;
|
|
else if (nSlot==3) nSlot=INVENTORY_SLOT_BELT;
|
|
else if (nSlot==4) nSlot=INVENTORY_SLOT_CHEST;
|
|
else if (nSlot==5) nSlot=INVENTORY_SLOT_BOOTS;
|
|
else if (nSlot==6) nSlot=INVENTORY_SLOT_RIGHTRING;
|
|
else if (nSlot==7) nSlot=INVENTORY_SLOT_LEFTRING;
|
|
else if (nSlot==8) nSlot=INVENTORY_SLOT_NECK;
|
|
else if (nSlot==9) nSlot=INVENTORY_SLOT_CLOAK;
|
|
else if (nSlot==10)nSlot=INVENTORY_SLOT_ARROWS;
|
|
else if (nSlot==11)nSlot=INVENTORY_SLOT_BOLTS;
|
|
else if (nSlot==12)nSlot=INVENTORY_SLOT_BULLETS;
|
|
ActionEquipItem(oItem,nSlot);
|
|
} // has the item
|
|
ActionDoCommand(SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
DelayCommand(4.0,SetLocalInt(OBJECT_SELF,"nGNBDisabled",FALSE));
|
|
} // LIB6EquipItem()
|