91 lines
2.4 KiB
C#
91 lines
2.4 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text;
|
||
|
using libsecondlife;
|
||
|
using libsecondlife.Packets;
|
||
|
|
||
|
namespace libsecondlife.TestClient
|
||
|
{
|
||
|
public class FollowCommand: Command
|
||
|
{
|
||
|
public FollowCommand(TestClient testClient)
|
||
|
{
|
||
|
Name = "follow";
|
||
|
Description = "Follow another avatar. (usage: follow [FirstName LastName]) If no target is set then will follow master.";
|
||
|
}
|
||
|
|
||
|
public override string Execute(string[] args, LLUUID fromAgentID)
|
||
|
{
|
||
|
string target = String.Empty;
|
||
|
for (int ct = 0; ct < args.Length; ct++)
|
||
|
target = target + args[ct] + " ";
|
||
|
target = target.TrimEnd();
|
||
|
|
||
|
if (target.Length > 0)
|
||
|
{
|
||
|
if (Follow(target))
|
||
|
return "Following " + target;
|
||
|
else
|
||
|
return "Unable to follow " + target + ". Client may not be able to see that avatar.";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (Follow(Client.MasterKey))
|
||
|
return "Following " + Client.MasterKey;
|
||
|
else
|
||
|
return "No target specified and no master not found. usage: follow [FirstName LastName])";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const float DISTANCE_BUFFER = 3.0f;
|
||
|
Avatar followAvatar;
|
||
|
|
||
|
bool Follow(string name)
|
||
|
{
|
||
|
foreach (Avatar av in Client.AvatarList.Values)
|
||
|
{
|
||
|
if (av.Name == name)
|
||
|
{
|
||
|
followAvatar = av;
|
||
|
Active = true;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool Follow(LLUUID id)
|
||
|
{
|
||
|
foreach (Avatar av in Client.AvatarList.Values)
|
||
|
{
|
||
|
if (av.ID == id)
|
||
|
{
|
||
|
followAvatar = av;
|
||
|
Active = true;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public override void Think()
|
||
|
{
|
||
|
if (Helpers.VecDist(followAvatar.Position, Client.Self.Position) > DISTANCE_BUFFER)
|
||
|
{
|
||
|
//move toward target
|
||
|
LLVector3 avPos = followAvatar.Position;
|
||
|
Client.Self.AutoPilot((ulong)avPos.X + (ulong)Client.regionX, (ulong)avPos.Y + (ulong)Client.regionY, avPos.Z);
|
||
|
}
|
||
|
//else
|
||
|
//{
|
||
|
// //stop at current position
|
||
|
// LLVector3 myPos = client.Self.Position;
|
||
|
// client.Self.AutoPilot((ulong)myPos.x, (ulong)myPos.y, myPos.Z);
|
||
|
//}
|
||
|
|
||
|
base.Think();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|