分配機能付きチップジャーのLSL
2011年09月17日
分配機能のあるチップジャーを作った。
チップが入ったら、あらかじめ登録したメンバーで平等に山分けするの。
下のスクリプトを適当なobjectに入れてtouchすると動きます。
山分けの流れは、
チップジャーのオーナーが一度チップを全額貰って、
オーナーの財布からスタッフに山分け分を送金する。
山分け対象となるスタッフの細かい仕様は以下の通り
・チップを貰ったとき、チップジャーの近くにいるスタッフ(出勤中のスタッフ)が分配対象
・今近くにいないスタッフでも、過去1時間以内に近くにいたスタッフは分配対象
・周りにスタッフが誰もいないときにチップジャーにお金が入ると、過去に一度でも出勤したスタッフ全員で分配
・端数(たとえばL$5のチップを2人のスタッフで分けると1L$余る)は、リストの上に書いた人がその端数を貰う
・出勤60秒以内は山分け対象にならない場合がある(センサーが60秒間隔なので)
↓タイトルをダブルクリックすると、全部選択できます。コピーして使ってください。
チップが入ったら、あらかじめ登録したメンバーで平等に山分けするの。
下のスクリプトを適当な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:37│Comments(6)
│スクリプト
Comments
こんにちは~
チップジャーにタッチするのは貰う全員がタッチしないといけないのですか?
チップジャーにタッチするのは貰う全員がタッチしないといけないのですか?
Posted by ちょぱ at 2011年09月20日 14:49
こんにちは。
タッチするのはチップジャーの持ち主だけで良いです。
スクリプトを修正したり、チップジャーを取ってrezしなおした時は、持ち主がタッチしなおしてください。
タッチするのはチップジャーの持ち主だけで良いです。
スクリプトを修正したり、チップジャーを取ってrezしなおした時は、持ち主がタッチしなおしてください。
Posted by uten at 2011年09月21日 00:47
こんにちわ
コピーしてスクリプトを保存する際にスクリプトエラーが出て使えないのですが
修正して貰えないでしょうか?
コピーしてスクリプトを保存する際にスクリプトエラーが出て使えないのですが
修正して貰えないでしょうか?
Posted by ユーザー at 2013年08月30日 22:41
緑色の部分を全部コピーしてください
Posted by uten at 2013年09月04日 23:27
2点、仕様変更しました
・名前の大文字小文字の区別が難しいので、
すべてスタッフ名は小文字で入力するように仕様を変えました
・支払時のクリックペイのダイアログの金額を設定できるようにしました。
・名前の大文字小文字の区別が難しいので、
すべてスタッフ名は小文字で入力するように仕様を変えました
・支払時のクリックペイのダイアログの金額を設定できるようにしました。
Posted by uten at 2013年09月04日 23:28
以下の仕様を追加しました
・チップの合計金額をフローティングテキストに表示できるようにした
・貰ったチップの金額をSayできるようにした
・チップの合計金額をフローティングテキストに表示できるようにした
・貰ったチップの金額をSayできるようにした
Posted by uten at 2013年09月14日 21:44