
オーナーはタッチ長押しでメニューが出ますので、日本時間はタイムゾーンをGMT+9:00に設定してくださいね^^
あと、ボディ形状も2タイプ変えられるようにしてみました。6プリムでボディの部分はスカルプになってます。
お値段はL$100です。Teasers店、SL-Shopping.net-Mall店に置いてた旧機種と入れ替えました。いかがでしょうか^^
// 売り上げ分配ベンダー
key av="00000000-0000-0000-0000-000000000000"; // 分配するアバターのキー
float percent=5; // 分配率(%)
integer price;
list items;
init()
{
items=[]; // アイテムリスト初期化
string str;
integer i;
integer j=llGetInventoryNumber(INVENTORY_ALL); // コンテンツ内のアイテム数
for (i=0; i < j; i++) { // アイテムをチェック
str=llGetInventoryName(INVENTORY_ALL,i); // アイテム名取得
if (llGetInventoryType(str) == INVENTORY_NOTECARD && llGetSubString(str,0,1) == "L$") { // 名前がL$○○になってるノートのとき
price=(integer)llGetSubString(str,2,-1); // ノート名から価格を設定
}
else if (str != llGetScriptName()) items+=[str]; // その他は、このスクリプト以外をリストアップ
}
if (llGetPermissions() & PERMISSION_DEBIT) llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
}
default
{
state_entry()
{
llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]); // 支払い不可に設定
llSetClickAction(CLICK_ACTION_TOUCH); // クリックでタッチに設定
init(); // initでコンテンツ内チェック
if (av != "") llOwnerSay("Split money with secondlife:///app/agent/"+(string)av+"/about ?"); // 分配するアバターのプロフ
}
on_rez(integer start_param)
{ // 持ち物から出したときリセット
llResetScript();
}
changed(integer change)
{ // コンテンツ内が変化したらinitへ
if (change & CHANGED_INVENTORY) init();
}
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner()) { // オーナーがタッチしたとき口座引落し許可のリクエスト
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_DEBIT)
{ // 口座引落し許可されたら
llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]); // 支払いダイアログに金額を設定
llSetClickAction(CLICK_ACTION_PAY); // クリックで支払いに設定
}
}
money(key id, integer amount)
{ // 売れたら
if (amount == price) { // 金額のチェック
llGiveInventoryList(id,llGetObjectName(),items); // リストのアイテムを渡す
llInstantMessage(id,"Thank you for your purchase.");
integer i=(integer)(amount*percent/100); // 分配額を計算
if (i > 0) llGiveMoney(av,i); // 分配額が0でなければ送金
}
else { // 金額が一致しないとき
llGiveMoney(id,amount); // 返金
llWhisper(0,"Error - illegal amount."); // エラー
}
}
}
// メッセージを記録
list msglist; // 記録用リスト
key user=NULL_KEY; // 使用チェック用
integer time=120; // 制限時間
integer listen_handle;
integer max=10; // 最大記録数
string cmd="msg";
string get_time()
{
integer t=(integer)llGetWallclock(); // 太平洋時間
integer h=t/3600; // 時
integer m=(t%3600)/60; // 分
string hh=(string)h; // 時を文字に変換
if (h < 10) hh="0"+hh; // 時が1桁だったら0を付ける
string mm=(string)m;
if (m < 10) mm="0"+mm;
return hh+":"+mm; // hh:mm でリターン
}
default
{
touch_start(integer total_number)
{
key id=llDetectedKey(0); // タッチしたアバターのキー
if (user == NULL_KEY) { // 使用中でないとき
user=id; // userにキーを設定
llSay(0,"Say '"+cmd+"' to read messages, or say message to save your message. (timeout "+(string)time+" seconds)");
listen_handle=llListen(0,"",id,""); // リッスン開始
llSetTimerEvent(time); // タイマー始動
}
}
timer()
{ // 時間切れになったときの処理
llSetTimerEvent(0); // タイマー停止
llListenRemove(listen_handle); // リッスン中止
user=NULL_KEY; // userにヌルキーを設定
llSay(0,"Timeup! Touch and say again."); // 時間切れです
}
listen(integer channel, string name, key id, string msg)
{
llSetTimerEvent(0); // タイマー停止
llListenRemove(listen_handle); // リッスン中止
user=NULL_KEY; // userにヌルキー
if (msg == cmd) { // 読み出し
integer i;
integer j=llGetListLength(msglist); // リストの長さ
llSay(0,"--- Max "+(string)max+" saved message(s). ---");
for (i=0; i < j; i+=2) {
llSay(0,llList2String(msglist,i)); // 時間、名前
llSay(0,llList2String(msglist,i+1)); // メッセージ
}
llSay(0,"----------------------------------------");
}
else { // 記録
msglist+=["["+get_time()+"] "+name+": ",msg]; // リストに時間と名前、メッセージを登録
integer i=llGetListLength(msglist); // リストの長さ
if (i > max*2) { // リストが最大記録数×2を超えたら
msglist=llDeleteSubList(msglist,0,i-1-max*2); // 古いほうから消す
}
llSay(0,"Saved your message.");
}
}
}