ベンダー本体は1プリムで作ります。プリムの面番号1の面が斜めになるようにして、その面に操作パネルのテクスチャ(左右に矢印があるようなの)を作って貼り付けてください。
// 均一価格アニメーションベンダー
integer price=10; // 価格
string anim; // 現在のアニメーション記憶用
string tmp; // 一時記憶用
integer number; // アニメーション数
integer cur=0; // 選択されたアニメのポインタ用
set_item()
{
tmp=anim; // ポーズ中のアニメ
anim=llGetInventoryName(INVENTORY_ANIMATION,cur); // 新しく選択されたアニメ
// フローティングテキスト表示
if (anim) llSetText(anim+"\n("+(string)(cur+1)+"/"+(string)number+")",<1,1,1>,1.0);
else llSetText("",<1,1,1>,1.0);
if (llAvatarOnSitTarget()) { // 誰か座ってたら
if (tmp) llStopAnimation(tmp); // ポーズ中のアニメ停止
if (anim) llStartAnimation(anim); // 新しいアニメ再生
}
}
init()
{
llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]); // 支払い不可に
number=llGetInventoryNumber(INVENTORY_ANIMATION); // コンテンツ内のアニメの数
cur=0; // ポインタを初期化
set_item(); // set_itemへ
if (number) llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]); // アニメが入ってたら支払い金額を設定
}
default
{
state_entry()
{
llSitTarget(<0,0,1.0>,llEuler2Rot(<0,0,-90>*DEG_TO_RAD)); // 座る位置、角度
init();
}
changed(integer change)
{
if (change & CHANGED_LINK)
{ // リンクが変化
key id=llAvatarOnSitTarget(); // 座ってるアバターのキー
if (id) llRequestPermissions(id,PERMISSION_TRIGGER_ANIMATION); // アニメーション実行リクエスト
}
else if (change & CHANGED_INVENTORY) {
init(); // コンテンツ内が変わったらinitへ
}
}
touch_start(integer total_number)
{
key id=llDetectedKey(0); // タッチしたアバターのキー
if (id) {
integer i=llDetectedTouchFace(0); // タッチした面番号チェック
if (i == -1) llWhisper(0,"Sorry, your viewer not support."); // 古いビューワーはお断りしまーす
else if (i == 1) { // 面番号1
vector v=llDetectedTouchUV(0); // タッチされた位置
if (v.x > 0.5) { // 中央よりも右だったら「→」
cur++;
if (cur >= number) cur=0;
}
else { // そうでないときは「←」
cur--;
if (cur < 0) cur=number-1;
}
set_item(); // set_itemへ
}
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{ // アニメ実行が許可されたら
llStopAnimation("sit"); // デフォルトsit停止
if (anim) llStartAnimation(anim); // 現在のアニメ実行
}
}
money(key id, integer amount)
{ // 支払いがあったら
if (amount == price)
{
llGiveInventory(id,anim); // 現在のアニメを渡す
llInstantMessage(id,"Thank you for your purchase."); // ありがとぉおおお^^
}
}
}
簡略化してるのでどのアニメーションが売れたか通知する部分はありません^^;
価格は特に表示するようにしてないので、ベンダーの名前や説明に付け加えるとかしてくださいね。
操作パネルのテクスチャ作成が面倒だったら
llSetTexture("2f3d3767-0c2e-b646-2ae7-c7c1a4946a46",1);
これをstate_entry内に入れてもらったら写真と同じのが表示されます。。。手抜きなパネルですけどw
2011年8月23日追記: 不正な金額の支払いが起きる心配がないとは言っても、たぶんllSetPayPriceに縛られず任意の金額を支払えるような改造ビューワーを作ることも不可能じゃないと思うので、一応支払われた金額が一致したときだけ商品(アニメ)を渡すようにしてます。
0 件のコメント:
コメントを投稿