libsecondlifeサンプル - 所持金照会

march

2007年12月05日 12:15


Self.RequestBalance() と Self.OnBalanceUpdated を使って、
アバターの所持金を調べることができます。

以下のページがとても参考になります。
このページが無ければ私もlibsecondlifeをさわる気になりませんでした。ありがとうございます。
SecondLifeのボットを5分で書く方法 - TokuLog 改め だまってコードを書けよハゲ
http://d.hatena.ne.jp/tokuhirom/20070921/1190371544



では所持金照会のサンプルです。

#libsecondlifeのロード
import clr
clr.AddReferenceToFile("libsecondlife.dll")
import libsecondlife
import time

#ログイン情報の設定
firstName = 'abcd' #苗字
lastName = 'efgh' #名前
passWord = 'ejkl' #パスワード

#イベント待ち合わせ用クラスの定義
class EventTracker:
def __init__(self):
self.data=False
def Clear(self):
self.data=False
def Set(self):
self.data=True
def Wait(self):
while not self.data:
time.sleep(0.1)

#所持金要求イベント処理用ハンドラの定義
def BalanceHandler(balance):
global event
print 'balance=', balance
event.Set()

#初期設定、
event = EventTracker()
client = libsecondlife.SecondLife()
#client.Self.OnBalanceUpdated += libsecondlife.MainAvatar.BalanceCallback(BalanceHandler) #ver0.2.0
client.Self.OnBalanceUpdated += libsecondlife.AgentManager.BalanceCallback(BalanceHandler) #ver0.3.0

#接続
client.Network.Login(firstName, lastName, passWord, '', '')

#実際の処理(残高照会)
event.Clear()
client.Self.RequestBalance()
event.Wait()

#切断
client.Network.Logout()



クライアントによる所持金照会の要求と、サーバによる応答は非同期です。
ポイントは以下の2つです。

(1)イベントハンドラ(コールバック関数)
41行目で、所持金照会の要求をサーバに投げています。
実際の処理は、所持金照会の要求に応答があったときに呼び出されるイベントハンドラで行います。
24行目でそのハンドラの定義を行い、34行目でハンドラを登録して、使えるようにします


(2)イベントの待ち合わせ
イベントの発生を待ち合わせるため、EventTrackerクラスをグローバル変数として使用します。
具体的には、
31行目でeventという名で(グローバル変数として)実体化し、
BalanceHandler関数内でも26行目でglobal命令文を使ってeventをグローバル変数として扱っています。
待ち合わせの流れは、
40行目のevent.Clear()でフラグを下げてから要求を出し、42行目でevent.Wait()でフラグが上がるのを待ちます。
イベントが発生すると、25行目のBalanceHandler関数が呼ばれ、
その関数の最後(28行目)でフラグを上げます。



間違いの指摘や不明点の質問を歓迎します。
libsecondlife