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

135 lines
4.2 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// Slave HB
// By Deva Bryson Winblood. 12/28/2003
////////////////////////////////////////////////////////////////////////////////
#include "antistuck_h"
void fnMine(object oMineable)
{ // PURPOSE: Handle the mining of the object
object oMe=OBJECT_SELF;
string sID=GetLocalString(oMe,"sTeamID");
int nP=d100();
object oItem;
int nAmt=GetLocalInt(oMineable,"nResAmt");
string sRes=GetResRef(oMineable);
AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ActionAttack(oMineable,TRUE));
AssignCommand(oMineable,PlaySound("as_cv_minepick1"));
if (sRes=="resgold")
{ // gold
if (nP<25)
{ // gold mined
CreateItemOnObject("gold_nugget",oMe,1);
nAmt=nAmt-1;
SetLocalInt(oMineable,"nResAmt",nAmt);
if (nAmt<1) DestroyObject(oMineable);
} // gold mined
} // gold
else if (sRes=="resadm")
{ // adamantine
if (nP<6)
{ // adamantine mined
CreateItemOnObject("bar_admant",oMe,1);
nAmt=nAmt-1;
SetLocalInt(oMineable,"nResAmt",nAmt);
if (nAmt<1) DestroyObject(oMineable);
} // adamantine mined
} // adamantine
else if (sRes=="resiron")
{ // iron
if (nP<10)
{ // iron mined
CreateItemOnObject("bar_iron",oMe,1);
nAmt=nAmt-1;
SetLocalInt(oMineable,"nResAmt",nAmt);
if (nAmt<1) DestroyObject(oMineable);
} // iron mined
} // iron
else if (sRes=="mithral")
{ // mithral
if (nP<3)
{ // mithral mined
CreateItemOnObject("bar_mith",oMe,1);
nAmt=nAmt-1;
SetLocalInt(oMineable,"nResAmt",nAmt);
if (nAmt<1) DestroyObject(oMineable);
} // mithral mined
} // mithral
} // fnMine()
void main()
{
object oMe=OBJECT_SELF;
object oMaster=GetLocalObject(oMe,"oMaster");
object oOb;
int nMode=GetLocalInt(oMe,"nMode");
object oMod=GetModule();
float fDist;
int nC=1;
string sRes;
object oMineable=OBJECT_INVALID;
int nDisableNonEssential=GetLocalInt(oMod,"nDisableNonEssential");
if (nDisableNonEssential==TRUE) DestroyObject(oMe);
else
{ // not disabled
SetAILevel(oMe,AI_LEVEL_NORMAL);
if (GetIsInCombat(oMe)==FALSE&&IsInConversation(oMe)==FALSE)
{ // not talking or fighting
switch(nMode)
{ // main ai switch for slaves
case 0: { // follow master
if (GetArea(oMe)==GetArea(oMaster))
{ // same area follow
fDist=GetDistanceBetween(oMe,oMaster);
if (fDist>14.0)
{ // run
if (GetCurrentAction(oMe)==ACTION_MOVETOPOINT) AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ASActionMoveToObject(oMaster,TRUE,7.0));
} // run
else if (fDist>7.0)
{ // walk
if (GetCurrentAction(oMe)==ACTION_MOVETOPOINT) AssignCommand(oMe,ClearAllActions());
AssignCommand(oMe,ASActionMoveToObject(oMaster,FALSE,7.0));
} // walk
} // same area follow
else
{ // master in different area
AssignCommand(oMe,ASActionMoveToObject(oMaster,TRUE,7.0));
} // master in different area
break;
} // follow master
case 1: { // stand where you are
break;
} // stand where you are
case 2: { // mine
oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nC);
fDist=GetDistanceBetween(oOb,oMe);
while(oOb!=OBJECT_INVALID&&oMineable==OBJECT_INVALID&&fDist<10.0)
{ // look for mineable object
sRes=GetResRef(oOb);
if (sRes=="resgold"||sRes=="resadm"||sRes=="resiron"||sRes=="resmith") oMineable=oOb;
nC++;
oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nC);
fDist=GetDistanceBetween(oOb,oMe);
} // look for mineable object
if (oMineable!=OBJECT_INVALID)
{ // something to mine
fDist=GetDistanceBetween(oMineable,oMe);
if (fDist>2.0)
{ // move to object
AssignCommand(oMe,ASActionMoveToObject(oMineable,FALSE,1.0));
} // move to object
else
{ // use object
AssignCommand(oMe,fnMine(oMineable));
} // use object
} // something to mine
break;
} // mine
} // main ai switch for slaves
} // not talking or fighting
} // not disabled
}