| // Guard Dog script by Salina Magian void main()
{
float fDefaultGuardRadius = 18.f; // Default radius of guarded area
float fChickenRadius = 18.f; // Default radius of chickens chased
int HasCreatedArea = GetLocalInt(OBJECT_SELF, "nDoOnce");
int nBarkSound = GetLocalInt(OBJECT_SELF, "nBarkSound");
int nChickens = GetLocalInt(OBJECT_SELF, "nChickens");
float fGuardRadius = GetLocalFloat(OBJECT_SELF, "fGuardRadius");
float fPCDistance;
object oGuardArea;
object oGuardDog = OBJECT_SELF;
object oPC;
object oTargetPC;
object oChicken;
// Create a guarded area, generate bark sound, check Tag, search chickens
if (!HasCreatedArea)
{
location lGuardDog = GetLocation(oGuardDog);
string sSuffix;
oChicken = GetNearestObjectByTag("NW_CHICKEN");
CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lGuardDog);
if (GetStringLeft(GetTag(oGuardDog),9) == "GUARDDOG_")
{
sSuffix = GetSubString( GetTag(oGuardDog), 9, GetStringLength(
GetTag(oGuardDog)) - 9);
fGuardRadius = StringToFloat(sSuffix);
}
else fGuardRadius = fDefaultGuardRadius;
SetLocalInt(oGuardDog, "nDoOnce", 1);
SetLocalInt(oGuardDog, "nBarkSound", (d6(1) + 1));
SetLocalObject(oGuardDog, "oGuardArea", GetNearestObject(
OBJECT_TYPE_PLACEABLE ));
SetLocalFloat(oGuardDog, "fGuardRadius", fGuardRadius);
while(GetIsObjectValid(oChicken)
&&(GetDistanceBetween(oChicken, oGuardDog) < fChickenRadius))
{
nChickens++;
oChicken = GetNearestObjectByTag("NW_CHICKEN", oGuardDog, nChickens);
}
SetLocalInt(oGuardDog, "nChickens", nChickens - 1);
}
// Get the PC who's deepest in guarded area
oGuardArea = GetLocalObject(oGuardDog, "oGuardArea");
fPCDistance = 999.f;
oPC = GetFirstPC();
oTargetPC = OBJECT_INVALID;
while (GetIsObjectValid(oPC))
{
if ((GetDistanceBetween(oPC, oGuardArea) < fGuardRadius)
&&(GetDistanceBetween(oPC, oGuardArea) < fPCDistance))
{
oTargetPC = oPC;
fPCDistance = GetDistanceBetween(oPC, oGuardArea);
}
oPC = GetNextPC();
}
// Follows PC or returns to guarded area to chase chickens
if (GetIsObjectValid(oTargetPC))
{
ClearAllActions();
ActionMoveToObject(oTargetPC, TRUE);
ActionForceFollowObject(oTargetPC);
AssignCommand(oTargetPC, PlaySound("as_an_dogbark" +
IntToString(nBarkSound)));
}
else
{
ClearAllActions();
oChicken = GetNearestObjectByTag("NW_CHICKEN", oGuardArea,
Random(nChickens) + 1);
if ((nChickens > 0) && (GetDistanceBetween(oChicken, oGuardArea) <
fChickenRadius))
{
ActionForceFollowObject(oChicken);
AssignCommand(oChicken, ClearAllActions());
AssignCommand(oChicken, ActionMoveAwayFromObject(oGuardDog,0,10.f));
AssignCommand(oChicken, ActionMoveToObject(oGuardArea));
AssignCommand(oChicken, ActionRandomWalk());
int i;
for(i = 0; i < nChickens; i++)
{
oChicken = GetNearestObjectByTag("NW_CHICKEN", oGuardArea, i+1);
AssignCommand(oChicken, ActionMoveToObject(oGuardArea));
AssignCommand(oChicken, ActionRandomWalk());
}
}
else {ActionMoveToObject(oGuardArea); ActionRandomWalk();}
}
} |