//////////////////////////////////////////////////////////////////////////////// // 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 }