HoS_PRC8/_mod/_module/nss/lair_clean_hb.nss
Jaysyn904 04165202c0 Initial upload
Initial upload
2024-11-25 19:36:07 -05:00

286 lines
11 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// Lair Cleaner HB
// By Deva Bryson Winblood.
////////////////////////////////////////////////////////////////////////////////
#include "antistuck_h"
int fnIsManaObject(object oItem)
{ // return true if mana crystal
int nRet=FALSE;
string sRes=GetResRef(oItem);
if (sRes=="mana_crystal_5"||sRes=="mana_crystal_2"||sRes=="mana_crystal_1") nRet=TRUE;
return nRet;
} // fnIsManaObject()
int fnIsSoulObject(object oItem)
{ // return true if is soul token
int nRet=FALSE;
string sRes=GetResRef(oItem);
if (sRes=="soultoken") nRet=TRUE;
return nRet;
} // fnIsSoulObject()
void fnDestroyContainer(object oContainer,object oStorage,object oTaxes,object oLead);
///////////////////////////////////////////////////////////////////// MAIN
void main()
{
object oMe=OBJECT_SELF;
string sID=GetLocalString(oMe,"sTeamID");
int nState=GetLocalInt(oMe,"nState");
object oDest=GetLocalObject(oMe,"oDest");
object oTarg=GetLocalObject(oMe,"oTarg");
object oWP;
object oManaVault=GetNearestObjectByTag(sID+"_VAULT",oMe,1);
object oSouls=GetNearestObjectByTag("StrangeApparatus",oMe,1);
object oStorage=GetNearestObjectByTag(sID+"_STORAGE",oMe,1);
object oItem;
object oOb;
object oChest=GetNearestObjectByTag(sID+"_CHEST",oMe,1);
int nType;
int nN;
float fDist;
int nSC=GetLocalInt(oMe,"nStuckCount");
float fLDist=GetLocalFloat(oMe,"fLDist");
object oLead=GetLocalObject(GetModule(),"oTeamLead"+sID);
if (GetIsInCombat(oMe)==FALSE&&IsInConversation(oMe)==FALSE&&GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,1,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN)==OBJECT_INVALID)
{ // safe to act
switch(nState)
{ // cleaner state
case 0: { // look for things to clean
oTarg=OBJECT_INVALID;
oDest=OBJECT_INVALID;
nN=1;
oItem=GetNearestObject(OBJECT_TYPE_ITEM,oMe,nN);
while(oItem!=OBJECT_INVALID&&oTarg==OBJECT_INVALID)
{ // find item target
if (GetPlotFlag(oItem)==FALSE&&GetTag(oItem)!="rts_it_report")
{ // not plot
if (fnIsManaObject(oItem)==FALSE)
{ // not mana crystal
oTarg=oItem;
} // not mana crystal
else if (fnIsManaObject(oItem)==TRUE)
{ // is mana crystal
oWP=oManaVault;
fDist=GetDistanceBetween(oWP,oItem);
if (fDist>8.0)
{ // far away get it
oTarg=oItem;
} // far away get it
} // is mana crystal
} // not plot
nN++;
oItem=GetNearestObject(OBJECT_TYPE_ITEM,oMe,nN);
} // find item target
if (oTarg==OBJECT_INVALID)
{ // look for non-plot containers
nN=1;
//AssignCommand(oMe,SpeakString("*bodies?*"));
oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nN);
while(oOb!=OBJECT_INVALID&&oTarg==OBJECT_INVALID)
{ // look for container
//AssignCommand(oMe,SpeakString("*Looking at '"+GetName(oOb)+"'*"));
if (oOb!=oChest&&oOb!=oStorage)
{ // not plot
//AssignCommand(oMe,SpeakString("** storage or tax chest **"));
if (GetHasInventory(oOb)==TRUE)
{ // has inventory
//AssignCommand(oMe,SpeakString("*bodies to remove*"));
oTarg=oOb;
} // has inventory
} // not plot
nN++;
oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nN);
} // look for container
} // look for non-plot containers
if (oTarg==OBJECT_INVALID)
{ // no target was found - wander
//AssignCommand(oMe,SpeakString("*wandering*"));
SetLocalInt(oMe,"nState",3);
} // bo target was found - wander
else
{
SetLocalObject(oMe,"oTarg",oTarg);
SetLocalObject(oMe,"oDest",oTarg);
SetLocalInt(oMe,"nState",1);
}
break;
} // look for things to clean
case 1: { // move to destination
fDist=GetDistanceBetween(oMe,oDest);
if (GetArea(oMe)==GetArea(oDest)&&fDist<1.5)
{ // arrived
SetLocalInt(oMe,"nState",2);
} // arrived
else
{ // move
ASActionMoveToObject(oDest,TRUE,1.0);
} // move
break;
} // move to destination
case 2: { // care for item to clean
nType=GetObjectType(oTarg);
if (nType==OBJECT_TYPE_PLACEABLE)
{ // container
AssignCommand(oMe,SpeakString("*container*"));
oOb=oTarg;
AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
/*oTarg=GetFirstItemInInventory(oOb);
while(oTarg!=OBJECT_INVALID)
{ // inventory
if (fnIsManaObject(oTarg)==TRUE)
{ // teleport to mana vault
//AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
oItem=CopyObject(oTarg,GetLocation(oManaVault));
DelayCommand(2.0,DestroyObject(oTarg));
// SetLocalInt(oMe,"nState",0);
} // teleport to mana vault
else if (fnIsSoulObject(oTarg)==TRUE)
{ // store in soul receptacle
//AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
oItem=CopyObject(oTarg,GetLocation(oMe),OBJECT_INVALID);
DelayCommand(2.0,DestroyObject(oTarg));
SetLocalObject(oMe,"oDest",oSouls);
SetLocalInt(oMe,"nState",5);
} // store in soul receptacle
else
{ // convert
//AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
nN=GetGoldPieceValue(oTarg);
nN=nN/5;
if(nN<1&&GetGoldPieceValue(oTarg)>0) nN=1;
if (nN>0&&nN<100)
{ // place gold in chest
DelayCommand(2.0,DestroyObject(oTarg));
oItem=CreateItemOnObject("nw_it_gold001",oChest,nN);
} // place gold in chest
else if (nN>99)
{ // place in storage
oItem=CreateItemOnObject(GetResRef(oTarg),oStorage,GetItemStackSize(oTarg));
DelayCommand(2.0,DestroyObject(oTarg));
} // place in storage
else
{
DelayCommand(2.0,DestroyObject(oTarg));
}
} // convert
oTarg=GetNextItemInInventory(oOb);
} // inventory
DelayCommand(8.0,DestroyObject(oOb));*/
fnDestroyContainer(oOb,oStorage,oChest,oLead);
SetLocalInt(oMe,"nState",0);
} // container
else if (nType==OBJECT_TYPE_ITEM)
{ // item
AssignCommand(oMe,SpeakString("*"+GetName(oTarg)+"*"));
if (fnIsManaObject(oTarg)==TRUE)
{ // teleport to mana vault
AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
oItem=CopyObject(oTarg,GetLocation(oManaVault));
DestroyObject(oTarg);
SetLocalInt(oMe,"nState",0);
} // teleport to mana vault
else if (fnIsSoulObject(oTarg)==TRUE)
{ // store in soul receptacle
AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
oItem=CopyObject(oTarg,GetLocation(oMe),oMe);
DestroyObject(oTarg);
SetLocalObject(oMe,"oDest",oSouls);
SetLocalInt(oMe,"nState",5);
} // store in soul receptacle
else
{ // convert
AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,4.5));
nN=GetGoldPieceValue(oTarg);
nN=nN/5;
if(nN<1&&GetGoldPieceValue(oTarg)>0) nN=1;
if (nN>0&&nN<100)
{ // place gold in chest
DestroyObject(oTarg);
oItem=CreateItemOnObject("nw_it_gold001",oChest,nN);
SendMessageToPC(oLead,GetName(oMe)+" has placed "+IntToString(nN)+" gold in your "+GetName(oChest)+".");
} // place gold in chest
else if (nN>99)
{ // place in storage
oItem=CreateItemOnObject(GetResRef(oTarg),oStorage,GetItemStackSize(oTarg));
DestroyObject(oTarg);
} // place in storage
else
{
DestroyObject(oTarg);
}
SetLocalInt(oMe,"nState",0);
} // convert
} // item
else
{ // error
AssignCommand(oMe,SpeakString("*huh?*"));
SetLocalInt(oMe,"nState",3); // wander
} // error
break;
} // care for item to clean
case 3: { // pick wander destination
nN=d20();
oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,nN);
if (oOb==OBJECT_INVALID) oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,d12());
if (oOb==OBJECT_INVALID) oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,d8());
if (oOb==OBJECT_INVALID) oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,d6());
if (oOb==OBJECT_INVALID) oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,d4());
if (oOb==OBJECT_INVALID) oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oMe,1);
SetLocalObject(oMe,"oDest",oOb);
SetLocalInt(oMe,"nState",4);
break;
} // pick wander destination
case 4: { // move to wander destination
fDist=GetDistanceBetween(oMe,oDest);
if (GetArea(oMe)==GetArea(oDest)&&fDist<1.5)
{ // arrived
SetLocalInt(oMe,"nState",0);
} // arrived
else
{ // move
ASActionMoveToObject(oDest,TRUE,1.0);
} // move
break;
} // move to wander destination
case 5: { // deliver item
fDist=GetDistanceBetween(oMe,oDest);
if (GetArea(oMe)==GetArea(oDest)&&fDist<1.5)
{ // arrived
SetLocalInt(oMe,"nState",0);
} // arrived
else
{ // move
ASActionMoveToObject(oDest,TRUE,1.0);
} // move
break;
} // deliver item
} // cleaner state
} // safe to act
}//////////////////////////////////////////////////////////////////// MAIN
void fnDestroyContainer(object oContainer,object oStorage,object oTaxes,object oLead)
{ // empty items
object oItem=GetFirstItemInInventory(oContainer);
int nVal;
object oNew;
while(oItem!=OBJECT_INVALID)
{
DelayCommand(0.2,DestroyObject(oItem));
nVal=GetGoldPieceValue(oItem);
if (GetPlotFlag(oItem)==TRUE||nVal>99)
{ // place item in chest
oNew=CreateItemOnObject(GetResRef(oItem),oStorage,GetItemStackSize(oItem));
} // place item in chest
else
{ // convert to gold
nVal=nVal/5;
if (nVal<1) nVal=1;
oNew=CreateItemOnObject("nw_it_gold001",oTaxes,nVal);
SendMessageToPC(oLead,GetName(OBJECT_SELF)+" has placed "+IntToString(nVal)+" in your "+GetName(oTaxes)+".");
} // convert to gold
oItem=GetNextItemInInventory(oContainer);
}
DelayCommand(0.3,DestroyObject(oContainer));
} // fnDestroyContainer()