libSLでログイン

みかげ

2008年05月19日 11:24


シムのジオラマ作成で、libsecondlife使ってみたのですが、
ソースとか見ていたら、SLの操作いろいろとできそうです

libsecondlifeで作られたボットには、評判の悪そうなものも
あるようですが、使い方次第ですよね


How to create a basic libSL bot のページとか、参考にして
ちょっとだけ、使ってみたので、自分用にC#での使い方、メモしてみます

参考ページ
libsecondlife
marchのBLOG

作成環境
Ver.0.4.1.1


準備
・libsecondlifeは必要で、他にいろいろ書き始めるとパッケージとかも使います

using libsecondlife;
using libsecondlife.Packets;
// ログイン・ログアウトには、使わないけれど

セカンドライフのクラス
public static SecondLife client = new SecondLife();


ログイン

SLへ接続して、ログインします

if (client.Network.Login( 苗字 , 名前 , パスワード, アプリ名 [,場所], バージョン)){
}

・場所(ロケーション)は、省略可能です
string startLocation = NetworkManager.StartLocation( シム名, X, Y, Z );

・ベータグリッドに、接続する場合はURIを、変更します
LoginParams loginPram
= client.Network.DefaultLoginParams(苗字 , 名前 , パスワード, アプリ名,バージョン);

loginPram.URI = Settings.ADITI_LOGIN_SERVER;  // ベータグリッド
// loginPram.URI = Settings.AGNI_LOGIN_SERVER; // メイングリッド
loginPram.Start = 場所;

if (client.Network.Login( loginPram )){
}



ログアウト

終了時に、ログアウトしないと、再接続時に、しばらく待たされます

client.Network.Logout();



テレポート

接続中に、アバターを。指定シムにテレポートさせます

client.Self.Teleport("Japan 02", new LLVector3(128.0f, 128.0f, 50.0f));

テレポ後に、何かさせたい場合は、先ににコールバック関数を定義します
client.Self.OnTeleport += new AgentManager.TeleportCallback(Self_OnTeleport);

static void Self_OnTeleport(string message, AgentManager.TeleportStatus status, AgentManager.TeleportFlags flags){
 labelSimName.Text = client.Network.CurrentSim.Name; // シム名の取得
}


位置情報の取得

・アバターのいるシム名の取得
client.Network.CurrentSim.Name

・シム内のアバター数
client.Network.CurrentSim.AvatarPositions.Count

・位置座標(XYZ)
client.Self.SimPosition.X
client.Self.SimPosition.Y
client.Self.SimPosition.Z

client.Self.RelativePosition // これも使えそう

持ち物の取得

・所持金の取得 (クライアントのサンプルからとってきたけど、ちょっと長い)
System.Threading.AutoResetEvent waitBalance = new System.Threading.AutoResetEvent(false);
AgentManager.BalanceCallback del = delegate(int balance) { waitBalance.Set(); };
client.Self.OnBalanceUpdated += del;
client.Self.RequestBalance();
if (waitBalance.WaitOne(10000, false)){
labelMoney.Text = client.Self.Balance ;
}
client.Self.OnBalanceUpdated -= del;

・持ち物一覧(インベントリ)
client.Inventory.RequestFolderContents(client.Inventory.Store.RootFolder.UUID, client.Self.AgentID, true, true, InventorySortOrder.ByName);
SearchFolders[0] ="Clothing"; // 服フォルダを検索
LLUUID inventoryItems = client.Inventory.FindObjectByPath(client.Inventory.Store.RootFolder.UUID, client.Self.AgentID, SearchFolders[0], 1000);
List myObjects = client.Inventory.FolderContents(inventoryItems, client.Self.AgentID, true, true, InventorySortOrder.ByName, 1000);


※持ち物一覧の下のサンプル見つけたけれど、一部しかとれてない
void PrintFolder(InventoryFolder f, StringBuilder result, int indent) {
 foreach (InventoryBase i in Manager.FolderContents(f.UUID, client.Self.AgentID, true, true, InventorySortOrder.ByName, 3000)) {
result.AppendFormat("{0}{1} ({2})\n", new String(' ', indent * 2), i.Name, i.UUID);
if (i is InventoryFolder){
InventoryFolder folder = (InventoryFolder)i;
PrintFolder(folder, result, indent + 1);
}
}
}


もう少し、いろいろ、試してみないといけなさそう
libSL