普通に利用されてるアップデートシステムはRezのときメールでチェックするようなのが多いと思います。llEmailのページに出てるサンプルみたいなスクリプトですね。
ただ、サーバーをテイクしたり手違いとかで持ち物に返却になってしまうと、サーバーのUUIDキーが無効になって既にお客様の手に渡った製品からは二度と利用できなくなるので、私は採用しようって気になりませんでしたが^^;
でも今回は同じようにメールを使ったシステムで、製品バージョンが1.5.4みたいなフォーマットに対応したものを何となく書いてテストしたので載せますね。
アップデートサーバーです。設置して運用開始したら絶対にテイクしないでくださいw
// アップデートサーバー
list product=[ // "製品名","version",
"Drink vendor","1.10",
"Skybox","1.0.2",
"Open car","1.0.15",
NULL_KEY];
default
{
state_entry()
{ // 10秒毎のタイマー
llSetTimerEvent(10);
}
timer()
{ // メールチェック
llGetNextEmail("","");
}
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner()) { // オーナーがタッチしたら
integer i;
integer j=llGetListLength(product)-1;
string item;
// コンテンツ内チェック
for (i=0; i < j; i+=2) {
item=llList2String(product,i);
if (llGetInventoryType(item) == INVENTORY_NONE) llOwnerSay(item+" - not found.");
}
// サーバーのキー
llOwnerSay("Server key: "+(string)llGetKey());
}
}
email(string time, string address, string subject, string message, integer num_left)
{
list l=llParseString2List(subject,[",","."],[]); // subjectを分割してリストに格納
key id=llList2Key(l,0); // お客様のキー
string item=llList2String(l,1); // 製品名
integer i=llListFindList(product,[item]); // 製品リストチェック
if (~i) { // リストにあったらバージョンチェック
list ver=llParseString2List(llList2String(product,i+1),["."],[]);
integer j=llGetListLength(ver);
for (i=0; i < j; i++) if (llList2Integer(ver,i) > llList2Integer(l,i+2)) i=j+1;
if (i > j) { // 新バージョンが出てたら
if (llGetInventoryType(item) != INVENTORY_NONE) {
llInstantMessage(id,"New version "+item+" available."); // おニューがあるです!
llGiveInventory(id,item); // 送付
}
}
}
if (num_left) llGetNextEmail("",""); // 次のメールチェック
}
}
タッチするとコンテンツ内のチェック(リストの製品が入ってないとき表示)とサーバーのキーを表示します。サーバーキーはクライアントスクリプトに記入して製品に組み込んでください。
そして、製品がバージョンアップしたときは、コンテンツの製品を新しいものに入れ替えて、リストの製品のバージョンを変更してからタッチで一応チェックします。
レンタルやプライベートアイランドだと地主の都合でいつ無くなるかも知れないので、メインランドの自分名義の土地に置くのが一番いいでしょうね。
クライアントです。
// アップデートクライアント
key server="サーバーUUIDキー"; // アップデートサーバーのキーを記入
string name="Drink vendor"; // 製品名
string ver="1.10"; // バージョン
default
{
on_rez(integer start_param)
{ // 持ち物から出したら
string addr=(string)server+"@lsl.secondlife.com"; // サーバーのメールアドレス
llEmail(addr,(string)llGetOwner()+","+name+","+ver,""); // メール送信
}
}
クライアントスクリプトはアップデート対象製品(もちろんコピー可、譲渡不可)に組み込みますが、llEmailは20秒もスクリプトが止まるので、他のスクリプトがある場合はマージせずに別のスクリプトにして入れたほうががいいですね。スクリプトのパーミッションは修正不可、コピー可、譲渡不可にしてください。