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

124 lines
5.2 KiB
Plaintext

// uber_hb for the mages that guard the uber items
#include "NW_I0_GENERIC"
#include "antistuck_h"
void fnRest()
{
SetLocalInt(OBJECT_SELF,"nRest",TRUE);
DelayCommand(HoursToSeconds(8),fnRest());
} // rest
void main()
{
object oMe=OBJECT_SELF;
object oItem=GetLocalObject(oMe,"oItem");
object oTarget=GetItemPossessor(oItem);
object oArea;
string sTag;
float fDist=GetDistanceBetween(oMe,oItem);
int nRest=GetLocalInt(oMe,"nRest");
int nFirstTime=GetLocalInt(oMe,"nFirstTime");
effect eVFX=EffectVisualEffect(VFX_FNF_IMPLOSION);
object oWP;
int nR;
if (oItem==OBJECT_INVALID) DelayCommand(2.0,DestroyObject(oMe));
if (nFirstTime!=TRUE)
{
DelayCommand(HoursToSeconds(8),fnRest());
SetLocalInt(oMe,"nFirstTime",TRUE);
}
if (GetIsInCombat(oMe)==FALSE)
{ // not fighting
if (nRest==TRUE&&oTarget==OBJECT_INVALID&&GetArea(oMe)==GetArea(oItem)&&fDist<20.0)
{ // okay to rest maybe
oTarget=GetNearestCreature(CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,oMe,1,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
if (oTarget==OBJECT_INVALID)
{ // okay to rest
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ActionRest());
DeleteLocalInt(oMe,"nRest");
} // okay to rest
} // okay to rest maybe
else if (oTarget!=OBJECT_INVALID)
{ // someone has the item
oArea=GetArea(oTarget);
sTag=GetTag(oArea);
fDist=GetDistanceBetween(oMe,oTarget);
if (sTag=="ThePlaneofInBetween")
{ // target died... get item back
sTag=GetResRef(oItem);
DestroyObject(oItem);
oItem=CreateObject(OBJECT_TYPE_ITEM,sTag,GetLocation(oMe));
SetLocalObject(oMe,"oItem",oItem);
} // target died... get item back
else if (GetArea(oMe)!=GetArea(oTarget))
{ // target is in another area - teleport
oWP=GetNearestObject(OBJECT_TYPE_WAYPOINT,oTarget,d4());
if (oWP==OBJECT_INVALID) oWP=GetNearestObject(OBJECT_TYPE_WAYPOINT,oTarget,1);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oMe));
if (oWP!=OBJECT_INVALID)
{ // teleport to nearby waypoint
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oWP));
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,JumpToObject(oWP));
} // teleport to nearby waypoint
else
{ // teleport to player
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oTarget));
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,JumpToLocation(GetLocation(oTarget)));
} // teleport to player
} // target is in another area - teleport
else if (fDist>10.0&&GetObjectSeen(oTarget)==FALSE&&GetObjectHeard(oTarget)==FALSE)
{ // not seen or heard and more than 10 meters away
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ASActionMoveToObject(oItem,TRUE,1.0));
} // not seen or heard and more than 10 meters away
else
{ // engage them in combat
DetermineCombatRound();
} // engage them in combat
} // someone has the item
else if (GetArea(oMe)!=GetArea(oItem))
{ // item is in another area
oWP=GetNearestObject(OBJECT_TYPE_WAYPOINT,oItem,d4());
if (oWP==OBJECT_INVALID) oWP=GetNearestObject(OBJECT_TYPE_WAYPOINT,oItem,1);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oMe));
if (oWP!=OBJECT_INVALID)
{ // teleport to nearby waypoint
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oWP));
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,JumpToObject(oWP));
} // teleport to nearby waypoint
else
{ // teleport to item
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVFX,GetLocation(oItem));
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,JumpToLocation(GetLocation(oItem)));
} // teleport to item
} // item is in another area
else if (fDist>4.9)
{ // not close to item
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ASActionMoveToObject(oItem,TRUE,1.0));
} // not close to item
else
{ // ambient animations
if (GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,oMe,1)!=OBJECT_INVALID)
{ // player present - animate
nR=d4();
if (nR==1) AssignCommand(oMe,ActionRandomWalk());
else if (nR==2) AssignCommand(oMe,ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK,1.0,6.0));
else if (nR==3) AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0,6.0));
else if (nR==4) AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR,1.0,6.0));
} // player present - animate
} // ambient animations
} // not fighting
if ((GetArea(oItem)==GetArea(oMe)||fDist>30.0)&&oTarget==OBJECT_INVALID)
{ // stop fighting and go back to the item
AssignCommand(oMe,ClearAllActions(TRUE));
AssignCommand(oMe,ASActionMoveToObject(oItem,TRUE,1.0));
} // stop fighting and go back to the item
}