alt=
ソラマメブログ > HOME > スクリプト

  

Posted by at

分配機能付きチップジャーのLSL

2011年09月17日

分配機能のあるチップジャーを作った。
チップが入ったら、あらかじめ登録したメンバーで平等に山分けするの。
下のスクリプトを適当なobjectに入れてtouchすると動きます。

山分けの流れは、
チップジャーのオーナーが一度チップを全額貰って、
オーナーの財布からスタッフに山分け分を送金する。


山分け対象となるスタッフの細かい仕様は以下の通り

・チップを貰ったとき、チップジャーの近くにいるスタッフ(出勤中のスタッフ)が分配対象
・今近くにいないスタッフでも、過去1時間以内に近くにいたスタッフは分配対象
・周りにスタッフが誰もいないときにチップジャーにお金が入ると、過去に一度でも出勤したスタッフ全員で分配
・端数(たとえばL$5のチップを2人のスタッフで分けると1L$余る)は、リストの上に書いた人がその端数を貰う
・出勤60秒以内は山分け対象にならない場合がある(センサーが60秒間隔なので)


↓タイトルをダブルクリックすると、全部選択できます。コピーして使ってください。

// 分配チップジャー
string VERSION=" ver2011.09.17-2013.09.14.005 by uten";
 
//================================================ 
// 設定項目 
//================================================ 
// 必須の設定項目
 
//スタッフの名前(すべて小文字でいれること)
list staff_names=[
"uten resident←スタッフの名前(小文字)にすること",
"名前1",
"名前2",
"名前3",
"名前4"
];
 
//-------------------------------------
// 以下は必要があれば編集
//-------------------------------------
// チップを払うときに表示されるダイアログの金額
list    PAY_QUICK_LIST=[10,20,30,40];

// ダイアログの入力欄に表示される金額のデフォルト値
integer PAY_DEFAULT_AMOUNT=10;
 
// チップを貰ったときのメッセージ(@Nは名前、@Aはチップ金額に置き換わります)
string  ARIGATO="@Nさん、L$@Aありがとうございます!";
 
//チップジャーの上に表示する文字(@Tは合計金額に置き換わります)
string  MEMO="Tipjar L$@T Donated so far";
 
 
float   SENSOR_RANGE=30;    // スタッフがいるか判定する距離[m]
float   SENSOR_INTERVAL=60; // スタッフがいるか確認する間隔[sec]
integer EXTENSION=3600; // スタッフが帰った後1時間(60*60sec)は分配対象
integer total_money=0;  //表示する最初の合計金額
//================================================ 
//設定項目終わり 
 
list    staff_keys;//スタッフのkey
integer staff_num;//スタッフの数
list    staff_times;//スタッフが最後に店にいた時刻
key owner_key;//オーナーのkey
integer time;//イベント受信時刻
 
 
// 適当な変数
integer i;
integer ii;
string  s;
key k;
integer len;
 
 
setText(){
string tmp;
tmp=tikan2(MEMO,"@T",(string)total_money);
llSetText(tmp, <1.0, 1.0, 0>, 1.0);
}
arigatou(string name,integer amount){
string tmp;
tmp=tikan2(ARIGATO,"@N",name);
tmp=tikan2(tmp,"@A",(string)amount);
llSay(0,tmp);
}
 
string tikan2(string src,string k,string v){
i=llSubStringIndex(src,k);
if(i>0){
ii=llStringLength(src);
src=llGetSubString(src,0,i-1)
+v
+llGetSubString(src,i+2,ii);
}else if(i==0){
ii=llStringLength(src);
src=v+llGetSubString(src,i+2,ii);
}
return src;
}
 
default{ 
state_entry(){ 
setText();
llSetPayPrice(PAY_DEFAULT_AMOUNT,PAY_QUICK_LIST);
staff_num = llGetListLength(staff_names);
}
touch_start(integer total_number){
time=llGetUnixTime(); 
owner_key=llGetOwner();
 
if(llDetectedKey(0)==owner_key){
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT); 
}
}
run_time_permissions (integer perm){ 
if(perm & PERMISSION_DEBIT){ 
state ready; 
}else{
llOwnerSay("お金を払う権限が無い!"); 
}
}
}
state ready{
 
state_entry(){ 
time=llGetUnixTime(); 
len=llGetListLength(staff_names); 
//初期化
staff_times=[];
staff_keys=[];
for(i=0;i<len;i++){
staff_times+=[0];
staff_keys+=[0];
}
llSensorRepeat("", "", AGENT_BY_USERNAME,SENSOR_RANGE, PI,1 );
llSleep(2);
llOwnerSay("Tip jar("+VERSION+") Start");
llSensorRepeat("", "", AGENT_BY_USERNAME,
SENSOR_RANGE, PI,SENSOR_INTERVAL );
 
}
 
//動作中に(takeされた後)rezされた場合は停止 
on_rez(integer i){ 
time=llGetUnixTime(); 
llOwnerSay("分配チップジャーは停止しています。タッチすると再開します。"); 
state default; 
}
 
sensor(integer num_detected){
time=llGetUnixTime(); 
for (i=0; i<num_detected; i++){
ii=llListFindList(staff_names, [llToLower(llDetectedName(i))]);
if(ii>=0){
k=llDetectedKey(i);
staff_times = llListReplaceList(staff_times, [time],ii,ii);
staff_keys = llListReplaceList(staff_keys , [k],ii,ii);
}
}
}
money(key id, integer amount){
time=llGetUnixTime(); 
list target; //分配する相手
string target_names="";
total_money+=amount;
 
string name=llKey2Name(id);
// ありがとうメッセージの指定があれば表示
if(ARIGATO){
arigatou(name,amount);
}
// フローティングメッセージの指定があれば更新
if(MEMO){
setText();
}
 
for (i=0; i<staff_num; i++){
ii=llList2Integer(staff_times,i);
if(time-ii<EXTENSION){
s=llList2String(staff_names,i);
k=llList2Key(staff_keys,i);
target+=[k];
target_names+="["+s+"]";
}
}
len=llGetListLength(target); 
if(!len){
// 分配する相手がいない場合は出勤したことのある人全員に分配
for (i=0; i<staff_num; i++){
ii=llList2Integer(staff_times,i);
if(ii){
s=llList2String(staff_names,i);
k=llList2Key(staff_keys,i);
target+=[k];
target_names+="["+s+"]";
}
}
len=llGetListLength(target); 
}
if(!len){
llOwnerSay("bug:まだ誰も出勤していないか、分配者リストに正しい名前がない");
return;
}
integer give=amount/len; //払う金額
 
// s=name+"さんのチップL$"+(string)amount+"をL$"+(string)give+
// "ずつスタッフ"+(string)len+"人("+target_names+")で分けました。";
// llOwnerSay(s);
 
for(i=0;i<len;i++){
if(i==0){
ii=give+(amount-give*len);//余った分
}else{
ii=give;
}
if(ii>0){
k=llList2Key(target,i); 
if(k!=NULL_KEY){ 
if(owner_key!=k){
llGiveMoney(k,ii);
}
}
}
}
}
}

  


Posted by uten at 19:37Comments(6)スクリプト