2008年10月12日
ソース(1):【日本語対応メッセージボード v05】
>【日本語対応メッセージボード Japanese-MessageBoard v05】
のソースです。
このオブジェクトは1つの親と複数の子の2種類から構成されています。
親プリムでユーザとのやりとりを行い、
子プリムで文字を表示しています。
仕様メモ:
・チャンネルは、いくつかの中から選択する。
たまたま重なったら移動する。という程度の自由度。
・メニューの説明文字列は日本語のみ、ボタンは英語のみ。
・タッチしてリッスンチャンネルを開けた後に、チャンネル番号を変えた場合は、
もう一度タッチしてリッスンチャンネルを開けなければメッセージを変更できない。これは仕様。
・グループモードの場合、オーナーであっても別グループがActiveの場合は、
タッチ等ができない。これは仕様。
【工夫】
・書き換え中は透明にして、書き換えを見せない(デバッグ中以外は)
・リセット時のデフォルト文字列は、途中に空白に見えるひらがな・カタカナを入れて
ロード時間をかせぐ
「-・-・-・-・-・-・-・-・-・-・」
-・- - - - - - - - - 」
U+002D 「-」
U+30FB (UTF-8:E3 83 BB) 「・」本当の中点 (ひらがな・カタカナ)
U+FF00 (UTF-8:EF BC 80) マッピング無し (全角英数字・半角カタカナ)
U+25AA (UTF-8:E2 96 AA) 「BLACK SMALL SQUARE」 ◆記号や●記号
U+26BF (UTF-8:E2 9A BF) マッピング無し ★記号や♪記号
urlEscapedString2List 関数は、
listenで受け取った文字列を、1文字ずつのリストにします。
RFC 2279 (3629 ではなく)を見ながら勉強がてら書いたものですが、
他のスクリプトにも転用できるんじゃないかと思います。
一部のデバッグ用スクリプトも残してありますので、参考までに。
以下は親プリムのスクリプトです。
ライセンスは
Creative Commons Attribution-Share Alike 3.0 Unported License
http://creativecommons.org/licenses/by/3.0/
です。
のソースです。
このオブジェクトは1つの親と複数の子の2種類から構成されています。
親プリムでユーザとのやりとりを行い、
子プリムで文字を表示しています。
仕様メモ:
・チャンネルは、いくつかの中から選択する。
たまたま重なったら移動する。という程度の自由度。
・メニューの説明文字列は日本語のみ、ボタンは英語のみ。
・タッチしてリッスンチャンネルを開けた後に、チャンネル番号を変えた場合は、
もう一度タッチしてリッスンチャンネルを開けなければメッセージを変更できない。これは仕様。
・グループモードの場合、オーナーであっても別グループがActiveの場合は、
タッチ等ができない。これは仕様。
【工夫】
・書き換え中は透明にして、書き換えを見せない(デバッグ中以外は)
・リセット時のデフォルト文字列は、途中に空白に見えるひらがな・カタカナを入れて
ロード時間をかせぐ
「-・-・-・-・-・-・-・-・-・-・」
-・- - - - - - - - - 」
U+002D 「-」
U+30FB (UTF-8:E3 83 BB) 「・」本当の中点 (ひらがな・カタカナ)
U+FF00 (UTF-8:EF BC 80) マッピング無し (全角英数字・半角カタカナ)
U+25AA (UTF-8:E2 96 AA) 「BLACK SMALL SQUARE」 ◆記号や●記号
U+26BF (UTF-8:E2 9A BF) マッピング無し ★記号や♪記号
urlEscapedString2List 関数は、
listenで受け取った文字列を、1文字ずつのリストにします。
RFC 2279 (3629 ではなく)を見ながら勉強がてら書いたものですが、
他のスクリプトにも転用できるんじゃないかと思います。
一部のデバッグ用スクリプトも残してありますので、参考までに。
以下は親プリムのスクリプトです。
ライセンスは
Creative Commons Attribution-Share Alike 3.0 Unported License
http://creativecommons.org/licenses/by/3.0/
です。
//v4: add dialog.
//v5:change dialog.
//initial message.
//"irasshaimase."
string INITIAL_MESSAGE = "-%E3%83%BB-%E3%83%BB-%E3%83%BB-%E3%83%BB-%EF%BC%80-%E3%83%BB-%E2%96%AA-%E3%83%BB-%E3%83%BB-%E2%9A%BF";
//
integer channelGather = 7;
integer CHANNEL_DIALOG = 42521; // dialog channel
integer LHandleGather;
integer LHandleDialog;
float LISTEN_GATHER_TIMEOUT = 90.0; //gather channel timeout(sec.)
//for dialog
string B_PRINT_MODE = "USER";
string B_CHANGE_MODE_ALL = "ALL";
string B_CHANGE_MODE_GROUP = "GROUP";
string B_CHANGE_MODE_OWNER = "OWNER";
//
//string B_CHANGE_CHANNEL = "CHANGE_CHANNNE";
string B_MODIFY_MESSAGE = "MESSAGE";
//
string B_PRINT_COLOR = "COLOR";
string B_CHANGE_COLOR_RED = "RED";
string B_CHANGE_COLOR_GREEN = "GREEN";
string B_CHANGE_COLOR_BLUE = "BLUE";
string B_CHANGE_COLOR_YELLOW = "YELLOW"; //kiiro
string B_CHANGE_COLOR_MAGENTA = "MAGENTA"; //murasaki
string B_CHANGE_COLOR_CYAN = "CYAN"; //mizuiro
string B_CHANGE_COLOR_WHITE = "WHITE";
string B_CHANGE_COLOR_BLACK = "BLACK";
//
string B_PRINT_CHANNEL = "CHANNEL";
string B_CHANGE_CHANNEL_7 = "7";
string B_CHANGE_CHANNEL_10 = "10";
string B_CHANGE_CHANNEL_17 = "17";
//
string B_HELP = "HELP";
string B_RESET = "RESET";
string B_DEBUG_INFO = "DEBUG_INFO";
string B_CLOSE = "CLOSE";
//string B_PRINT_NOTIFY_WRITE = "NOTIFY_WRITE";
//string B_CHANGE_NOTIFY_WRITE_TRUE = "NOTIFY_WRITE_TRUE";
//string B_CHANGE_NOTIFY_WRITE_FALSE = "NOTIFY_WRITE_FALSE";
//
integer MODE_ALL = 1;
integer MODE_GROUP = 2;
integer MODE_OWNER = 3;
integer isPublicMode = TRUE;
integer modifyMode = MODE_ALL;
//integer isNotifyWrite = FALSE;
//for DEBUG
integer startTime;
integer isDebugMode = FALSE;
//
//misc functions.
//
//--------
//see http : // wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation
//--------
//Function: ord
//Returns the index of an ASCII character
integer ord(string chr)
{
string ASCII = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
if(llStringLength(chr) != 1) return -1;
if(chr == " ") return 32;
return llSubStringIndex(ASCII, chr);
}
integer atoi(string str)
{
integer i;
string chr;
integer num = 0;
//Define character string [0-F] for use in building the num.
string characters = "0123456789ABCDEF";
str = llToUpper(str);
//not care overflow!
for(i = 0; i < llStringLength(str); i++)
{
chr = llGetSubString(str, i, i);
num = num * 16 + llSubStringIndex(characters, chr);
}
//llOwnerSay("atoi(" + str + ")=" + (string)num);
return num;
}
//
//unicode process functions.
//
list urlEscapedString2List(string escapedStr)
{
integer i;
string chr;
list resultList = [];
integer len;
integer num1;
integer num2;
integer num3;
integer num4;
len = llStringLength(escapedStr);
i = 0;
while( i < len)
{
chr = llGetSubString(escapedStr, i, i);
if(chr != "%")
{
resultList = resultList + ord(chr); // not atoi
i = i + 1; //process 1 charactor.
}
else
{
// get first escaped num.
num1 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
// get octet type.
if((num1 & 0x80) == 0) //0xxxxxxx -> 1 octet.(ex. %20, etc..)
{ //0000 0000 to 0000 007F(U+0000 to U+007F)
resultList = resultList + num1;
}
else if((num1 & 0x20) == 0) //110xxxxx 10xxxxxx -> 2 octet.
{ //00000080 to 000007FF
num2 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
resultList = resultList +
(integer)(((num1 & 0x1F)<<6) +
(num2 & 0x3F) );
}
else if((num1 & 0x10) == 0) //1110xxxx 10xxxxxx 10xxxxxx -> 3 octet.
{ //0000 0800 to 0000 FFFF
num2 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
num3 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
resultList = resultList +
(integer)(((num1 & 0x0F)<<12) +
((num2 & 0x3F)<<6 ) +
(num3 & 0x3F) );
}
else if((num1 & 0x08) == 0) //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx -> 4 octet.
{ //0001 0000 to 0010 FFFF
num2 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
num3 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
num4 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +
atoi(llGetSubString(escapedStr, i+2, i+2));
i = i + 3; //process 3 charactor.
resultList = resultList +
(integer)(((num1 & 0x07)<<18) +
((num2 & 0x3F)<<12) +
((num3 & 0x3F)<<6 ) +
(num4 & 0x3F) );
}
else
{
debugOwnerSay("invalid.[" + (string)i + "]");
}
}
}
return resultList;
}
//
//color change functions.
//@see messagBoard-chile-v05.lsl function "inPrimPos2face".
//
setChildColor(vector color)
{
llSetLinkColor(LINK_ALL_CHILDREN, color, 3); //left-left
llSetLinkColor(LINK_ALL_CHILDREN, color, 7); //left-center
llSetLinkColor(LINK_ALL_CHILDREN, color, 4); //center
llSetLinkColor(LINK_ALL_CHILDREN, color, 6); //right-center
llSetLinkColor(LINK_ALL_CHILDREN, color, 1); //right-right
}
//
//utility functions.
//
debugOwnerSay(string message)
{
if(isDebugMode == TRUE)
{
llOwnerSay(message);
}
}
userSay(integer mode, string message)
{
if((mode == MODE_ALL) || (mode == MODE_GROUP))
{
llSay(0, message);
}
else
{
llOwnerSay(message);
}
}
integer isModifiable(key userId, integer mode)
{
//for debug.
debugOwnerSay("function isModifiable:");
debugOwnerSay("userId=" + (string)userId);
debugOwnerSay("owner=" + (string)llGetOwner());
debugOwnerSay("mode=" + (string)mode);
//check permission
integer isModifiableFlag = FALSE;
if(mode == MODE_ALL)
{
isModifiableFlag = TRUE;
//debugOwnerSay("modify OK. because MODE_ALL.");
}
else if(mode == MODE_GROUP)
{
if(llSameGroup(userId) == TRUE)
{
isModifiableFlag = TRUE;
//debugOwnerSay("modify OK. because belongs same group.");
}
//else
//{
// debugOwnerSay("modify NG. because group not same.");
//}
}
else if(mode == MODE_OWNER)
{
if(userId == llGetOwner())
{
isModifiableFlag = TRUE;
//debugOwnerSay("modify OK. because owner.");
}
//else
//{
// debugOwnerSay("modify NG. because not owner.");
//}
}
return isModifiableFlag;
}
//
//initial function.
//
init()
{
llOwnerSay("---init " + llGetObjectName() + " with " + llGetScriptName() + "---");
//gather lisner.
if(LHandleGather != 0)
{
llListenRemove(LHandleGather);
}
channelGather = 7;
LHandleGather = llListen(channelGather, "", "", "");
llListenControl(LHandleGather, TRUE);
llSetText("", <1.0, 1.0, 1.0>, 1.0);
//DIALOG lisner.
if(LHandleDialog != 0)
{
llListenRemove(LHandleDialog);
}
LHandleDialog = llListen(CHANNEL_DIALOG, "", "", "");
llListenControl(LHandleDialog, FALSE);
// initialize startTime.
startTime = llGetUnixTime();
// set default message.
list initialMessgeList;
integer i;
initialMessgeList = urlEscapedString2List(INITIAL_MESSAGE);
//debugOwnerSay(llList2CSV(initialMessgeList));
for(i = 0; i < llGetListLength(initialMessgeList); i++)
{
llMessageLinked(LINK_ALL_CHILDREN, llList2Integer(initialMessgeList, i), (string)i, NULL_KEY);
}
setChildColor(<1.0, 1.0, 1.0>);
modifyMode = MODE_ALL;
}
//
//main function.
//
default
{
on_rez(integer start_param)
{
init();
}
state_entry()
{
init();
}
touch_start(integer total_number)
{
//check permission
integer isModifiableFlag;
isModifiableFlag = isModifiable(llDetectedKey(0), modifyMode);
//put menu.
if(isModifiableFlag == TRUE)
{
string msg_body;
msg_body = "\n" + llUnescapeURL("%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82"); //mein menu- desu.
msg_body = msg_body + "\n" + llUnescapeURL("%E6%93%8D%E4%BD%9C%E3%82%92%E9%81%B8%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82"); //sousa wo erande kudasai.
llDialog(llDetectedKey(0), msg_body, [B_PRINT_CHANNEL, B_RESET, B_HELP, B_MODIFY_MESSAGE, B_PRINT_MODE, B_PRINT_COLOR], CHANNEL_DIALOG);
llListenControl(LHandleDialog, TRUE); //start listen dialog.
}
else
{
string msg_body;
if(modifyMode == MODE_ALL)
{
msg_body = msg_body + "ALL";
}
else if(modifyMode == MODE_GROUP)
{
msg_body = msg_body + "GROUP";
}
else
{
msg_body = msg_body + "OWNER";
}
llSay(0, "now " + msg_body + " mode.");
llSay(0, llKey2Name(llDetectedKey(0)) + ", you can not change this message board.");
}
}
listen(integer channel, string name, key avatorId, string message)
{
if(channel == channelGather)
{
//check permission
integer isModifiableFlag;
isModifiableFlag = isModifiable(avatorId, modifyMode);
// change charactor.
if(isModifiableFlag == TRUE)
{
integer i;
//chop escaped string each charactor.
list list1;
message = message + " ."; //with 32 blank and dot.
list1 = urlEscapedString2List(llEscapeURL(message));
debugOwnerSay(llList2CSV(list1));
//send charactor code(UTF-16) by 1 charactor to childlen.
for(i = 0; i < llGetListLength(list1); i++)
{
llMessageLinked(LINK_ALL_CHILDREN, llList2Integer(list1, i), (string)i, NULL_KEY);
}
//llSetText(message, <1.0, 1.0, 1.0>, 1.0);
//close Listen handler for gather for gather
llListenControl(LHandleGather, FALSE);
//disable lisnten timeout
llSetTimerEvent(0.0);
}
else
{
debugOwnerSay("channel is open. but [" + llKey2Name(avatorId) + "] cannot change this message_board.");
}
}
else if(channel == CHANNEL_DIALOG)
{
// process DIALOG.
if(isModifiable(avatorId, modifyMode) == TRUE)
{
debugOwnerSay("message=" + message);
if (message == B_RESET)
{
//initialize.
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
init();
}
//
//HELP MESSAGE put
//
else if(message == B_HELP)
{
userSay(modifyMode, "HELP: " + llGetObjectName());
//userSay(modifyMode, "say message to channel " + (string)channelGather + " what you want print .");
userSay(modifyMode, llUnescapeURL("%e8%a1%a8%e7%a4%ba%e3%81%97%e3%81%9f%e3%81%84%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e3%83%81%e3%83%a3%e3%83%b3%e3%83%8d%e3%83%ab") //hyoujisitai messeji wo
+ " " +(string)channelGather + " "
+ llUnescapeURL("%E3%81%A7%E7%99%BA%E8%A8%80%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82")); //de hatugen site kudasai.
//userSay(modifyMode, "example: " + "/" + (string)channelGather + " " + "hello! ");
userSay(modifyMode, llUnescapeURL("%e4%be%8b") + ": " + "/" + (string)channelGather + " "
+ llUnescapeURL("%e6%9c%ac%e6%97%a5%e3%81%af%e7%89%b9%e5%a3%b2%e6%97%a5%e3%81%a7%e3%81%99%ef%bc%81"));
//llDialog(llGetOwner(), "show help at CHAT HISTORY", ["OK"], CHANNEL_DIALOG);
//throw notecard to avator.
string goods;
goods = llGetInventoryName(INVENTORY_NOTECARD, 0);
llGiveInventory(avatorId, goods);
}
//
//MESSAGE modify request
//
else if(message == B_MODIFY_MESSAGE)
{
string msg_body;
msg_body = "\n" + llUnescapeURL("%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB"); //tyanneru
msg_body = msg_body + " " + (string)channelGather + " ";
msg_body = msg_body + llUnescapeURL("%E3%81%A7%E7%99%BA%E8%A8%80%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82"); //de hatugen site kudasai
msg_body = msg_body + "\n";
msg_body = msg_body + llUnescapeURL("%E7%99%BA%E8%A8%80%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%8C%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82"); //hatugen sita naiyou ga message bo-do ni hyouji saremasu.
//msg_body = "say message to channel " + (string)channelGather + " what you want print .";
llDialog(avatorId, msg_body, [B_CLOSE], CHANNEL_DIALOG);
//open Listen handler for gather
llListenControl(LHandleGather, TRUE);
//set lisnten timeout
llSetTimerEvent(LISTEN_GATHER_TIMEOUT);
}
//
//MODIFY_MODE change
//
else if(message == B_PRINT_MODE)
{
//print mode to DIALOG.
string msg_body;
//msg_body = "everyone can change message if turn ON\n";
msg_body = llUnescapeURL("%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%A4%89%E6%9B%B4%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%92%E9%81%B8%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82"); //message henkuo kanouna yu-za no shurui wo erande kudasai.
msg_body = msg_body + llUnescapeURL("ALL%e3%81%ab%e3%81%99%e3%82%8b%e3%81%a8%e8%aa%b0%e3%81%a7%e3%82%82%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e5%a4%89%e6%9b%b4%e5%8f%af%e8%83%bd%e3%81%ab%e3%81%aa%e3%82%8a%e3%81%be%e3%81%99%e3%80%82") + "\n";
msg_body = msg_body + llUnescapeURL("%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AF"); //genzai no mo-do ha
if(modifyMode == MODE_ALL)
{
msg_body = msg_body + " ALL ";
}
else if(modifyMode == MODE_GROUP)
{
msg_body = msg_body + " GROUP ";
}
else
{
msg_body = msg_body + " OWNER ";
}
msg_body = msg_body + llUnescapeURL("%E3%81%A7%E3%81%99%E3%80%82") + "\n"; //desu.
llDialog(avatorId, msg_body, [B_CHANGE_MODE_ALL, B_CHANGE_MODE_GROUP, B_CHANGE_MODE_OWNER], CHANNEL_DIALOG);
llListenControl(LHandleDialog, TRUE); //start listen dialog.
}
else if(message == B_CHANGE_MODE_ALL)
{
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
modifyMode = MODE_ALL;
string msg_body;
//msg_body = "\nchange public mode to PUBLIC\n";
msg_body = "\n" + "ALL " + llUnescapeURL("%e3%81%ab%e8%a8%ad%e5%ae%9a%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%e3%80%82") + "\n";
msg_body = msg_body + llUnescapeURL("%e8%aa%b0%e3%81%a7%e3%82%82%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e5%a4%89%e6%9b%b4%e5%8f%af%e8%83%bd%e3%81%a7%e3%81%99%e3%80%82");
//llOwnerSay(msg_body);
llDialog(avatorId, msg_body, [B_CLOSE], CHANNEL_DIALOG);
}
else if(message == B_CHANGE_MODE_GROUP)
{
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
modifyMode = MODE_GROUP;
string msg_body;
//msg_body = "\nchange public mode to GROUP\n";
msg_body = "\n" + "GROUP " + llUnescapeURL("%e3%81%ab%e8%a8%ad%e5%ae%9a%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%e3%80%82") + "\n";
msg_body = msg_body + llUnescapeURL("GRUOP %E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%A0%E3%81%91%E3%81%8C%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%A4%89%E6%9B%B4%E5%8F%AF%E8%83%BD%20%E3%81%A7%E3%81%99%E3%80%82");
//llOwnerSay(msg_body);
llDialog(avatorId, msg_body, [B_CLOSE], CHANNEL_DIALOG);
}
else if(message == B_CHANGE_MODE_OWNER)
{
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
modifyMode = MODE_OWNER;
string msg_body;
//msg_body = "\nchange public mode to OWNER\n";
msg_body = "\n" + "OWNER " + llUnescapeURL("%e3%81%ab%e8%a8%ad%e5%ae%9a%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%e3%80%82") + "\n";
msg_body = msg_body + llUnescapeURL("%e3%82%aa%e3%83%bc%e3%83%8a%e3%83%bc%e3%81%a0%e3%81%91%e3%81%8c%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e5%a4%89%e6%9b%b4%e5%8f%af%e8%83%bd%e3%81%a7%e3%81%99%e3%80%82");
//llOwnerSay(msg_body);
llDialog(avatorId, msg_body, [B_CLOSE], CHANNEL_DIALOG);
}
//
//COLOR change
//
else if(message == B_PRINT_COLOR)
{
//print color to DIALOG.
string msg_body;
list colorList = [B_CHANGE_COLOR_YELLOW, B_CHANGE_COLOR_MAGENTA, B_CHANGE_COLOR_CYAN, B_CHANGE_COLOR_RED, B_CHANGE_COLOR_GREEN, B_CHANGE_COLOR_BLUE, B_CHANGE_COLOR_WHITE, B_CHANGE_COLOR_BLACK];
//msg_body = "you can change charactor color.\n choice below:";
msg_body = "\n" + llUnescapeURL("%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%87%E5%AD%97%E3%81%AE%E8%89%B2%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82");
msg_body = msg_body + "\n" + llUnescapeURL("%E8%89%B2%E3%82%92%E9%81%B8%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82");
llDialog(avatorId, msg_body, colorList, CHANNEL_DIALOG);
}
else if((message == B_CHANGE_COLOR_WHITE)
|| (message == B_CHANGE_COLOR_BLACK)
|| (message == B_CHANGE_COLOR_RED)
|| (message == B_CHANGE_COLOR_GREEN)
|| (message == B_CHANGE_COLOR_BLUE)
|| (message == B_CHANGE_COLOR_YELLOW)
|| (message == B_CHANGE_COLOR_MAGENTA)
|| (message == B_CHANGE_COLOR_CYAN) )
{
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
vector color;
//
if(message == B_CHANGE_COLOR_WHITE ){ color = <1.0, 1.0, 1.0>; }
else if(message == B_CHANGE_COLOR_BLACK ){ color = <0.0, 0.0, 0.0>; }
else if(message == B_CHANGE_COLOR_RED ){ color = <1.0, 0.0, 0.0>; }
else if(message == B_CHANGE_COLOR_GREEN ){ color = <0.0, 1.0, 0.0>; }
else if(message == B_CHANGE_COLOR_BLUE ){ color = <0.0, 0.0, 1.0>; }
else if(message == B_CHANGE_COLOR_YELLOW ){ color = <1.0, 1.0, 0.0>; }
else if(message == B_CHANGE_COLOR_MAGENTA){ color = <1.0, 0.0, 1.0>; }
else if(message == B_CHANGE_COLOR_CYAN ){ color = <0.0, 1.0, 1.0>; }
else { color = <1.0, 1.0, 1.0>; }
//
setChildColor(color);
string msg_body;
msg_body = "\n" + llUnescapeURL("%E8%89%B2%E3%82%92%20") + message; //irowo
msg_body = msg_body + llUnescapeURL("%20%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82"); //ni settei simasita.
llDialog(avatorId, msg_body, [B_PRINT_COLOR], CHANNEL_DIALOG);
llListenControl(LHandleDialog, TRUE); //start listen dialog.
}
//
//CHANNEL change
//
else if(message == B_PRINT_CHANNEL)
{
//print channel to DIALOG.
string msg_body;
//msg_body = "channel is " + (string)channelGather + ".";
//msg_body = msg_body + "\n" + "SELECT channel.";
msg_body = "\n" + llUnescapeURL("%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E7%95%AA%E5%8F%B7%E3%81%AF"); //genzai no tyannneru ha
msg_body = msg_body + " " + (string)channelGather + " " + llUnescapeURL("%E3%81%A7%E3%81%99%E3%80%82"); //desu.
msg_body = msg_body + "\n" + llUnescapeURL("%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E7%95%AA%E5%8F%B7%E3%82%92%E9%81%B8%E3%82%93%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82"); //channneru wo erande kudasai .
llDialog(avatorId, msg_body, [B_CHANGE_CHANNEL_7, B_CHANGE_CHANNEL_10, B_CHANGE_CHANNEL_17], CHANNEL_DIALOG);
llListenControl(LHandleDialog, TRUE); //start listen dialog.
}
else if((message == B_CHANGE_CHANNEL_7) || (message == B_CHANGE_CHANNEL_10) || (message == B_CHANGE_CHANNEL_17))
{
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
//remove old gather channel.
llListenControl(LHandleGather, FALSE);
llListenRemove(LHandleGather);
//open new gather channel.
channelGather = (integer)message;
LHandleGather = llListen(channelGather, "", "", "");
llListenControl(LHandleGather, FALSE); //close channel while not get request.
string msg_body;
msg_body = "\n" + llUnescapeURL("%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E7%95%AA%E5%8F%B7%E3%82%92"); //tyanneru bangou wo
msg_body = msg_body + " " + (string)channelGather + " ";
msg_body = msg_body + llUnescapeURL("%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82"); //ni settei simasita.
//llOwnerSay(msg_body);
llDialog(avatorId, msg_body, [B_CLOSE], CHANNEL_DIALOG);
}
//
//DEBUG INFO for OWNER
//
else if(message == B_DEBUG_INFO) //say "DEBUG" to ChANNEL_DIALOG when dialog print on screen by owner.
{
//print debug infomation.
userSay(modifyMode, "---debug infomation start---");
userSay(modifyMode, "now = " + (string)llGetUnixTime() + " unixtime.");
userSay(modifyMode, "reset time at " + (string)startTime + " unixtime.");
userSay(modifyMode, "listen channel = " + (string)channelGather);
userSay(modifyMode, "dialog channel = " + (string)CHANNEL_DIALOG);
if(modifyMode == MODE_ALL)
{
userSay(modifyMode, "modifyMode == ALL");
}
else if(modifyMode == MODE_GROUP)
{
userSay(modifyMode, "modifyMode == GROUP");
}
else
{
userSay(modifyMode, "modifyMode == OWNER");
}
userSay(modifyMode, "UUID_A =" + (string)llGetOwner()); //Owner UUID.
userSay(modifyMode, "UUID_B =" + (string)llGetKey()); //Object UUID.
userSay(modifyMode, "freeMemory =" + (string)llGetFreeMemory());
userSay(modifyMode, "---debug infomation end ---");
}
//
//CLOSE_BUTTON
//
else if(message == B_CLOSE)
{
//only close channel.
llListenControl(LHandleDialog, FALSE); //pause listen dialog.
}
}
else //someone say in DIALOG channel who have no permission.
{
llOwnerSay("DIALOG channel " + (string)CHANNEL_DIALOG + " access by " + llKey2Name(avatorId));
}
}
//else
//{
// llOwnerSay("other channel");
//}
}
timer()
{
//close Listen handler for gather
llListenControl(LHandleGather, FALSE);
userSay(modifyMode, "timeout. message channel closed.");
//disable lisnten timeout
llSetTimerEvent(0.0);
}
}
ソース(2):【日本語対応メッセージボード v05】
説明書:【日本語対応メッセージボード v05】
別プリムにあるスクリプト間で定数を素直に共有できないか?
1.17でllGetNotecardLineで日本語取出せず
メモリ管理には謎がある
複数スクリプト
説明書:【日本語対応メッセージボード v05】
別プリムにあるスクリプト間で定数を素直に共有できないか?
1.17でllGetNotecardLineで日本語取出せず
メモリ管理には謎がある
複数スクリプト
Posted by march at 23:48│Comments(0)
│LSL