-
세컨드라이프 스크립트 자동 업그레이드(펌)웹프로그래밍/LSL(세컨드라이프) 2009. 1. 27. 17:18반응형
※ 출처 - http://cafe.naver.com/godgan 곳간커뮤니티카페
아쉽게도 스크립트에 아직 익숙하지 않으신 분은 스크립트 기초내용을 좀 더 공부하고 다시 보세요^^
세컨드라이프에서는 스크립트를 자동으로 업그레이드해주는 기능이 있답니다.
사용자가 제품을 사간 다음에 변경된 내용에 대해서 스크립트만 변경이 된 경우 이 방법을 쓸수가 있는데요^^
한번 보도록 할까요?
1) 클라이언트(제품) 핀번호 설정
※ 클라이언트라는 말이 생소한 분은 예시로 인터넷으로 곳간 카페에 접속할때
카페를 볼수 있는 일반컴퓨터가 클라이언트이고, 서버라는 용어도 있는데
서버는 이렇게 카페가 나오도록 해주는 대형컴퓨터가 따로 있어요. 그렇게 이해해주시면 되요^^
결론은 서버(엄마) = 클라이언트(자녀들) 이런식? ㅎㅎ
자동업그레이드에서 클라이언트는 손님이 이미 사간 제품을 의미해요.
자동업그레이드를 위해서 클라이언트(제품)에는 핀 번호 설정이 필요합니다.
이 핀번호는
llSetRemoteScriptAccessPin(pin_number);
명령어로 정해줄수 있답니다.
☆ 핀번호설정을 하는 이유는 이게 없을 경우 악의를 가진 의도적인 개발자가 내가 쓰는 물건에 들어있는 스크립트를 멋대로 업데이트해버릴수가 있다는 점이 주의할 내용일까요^^ 다행히도 핀번호 설정을 하지 않으면 자동업데이트가 안된답니다.
2) 업그레이드 서버
업그레이드 서버는 여기서는 제품 업데이트 센터? 머 그런식으로 ^^
서버는 클라이언트에 들어있는 스크립트의 내용을 업그레이드할수 있도록 클라이언트에 들어있는 스크립트와 동일한 이름의 스크립트가 들어있어야 하고(실행중을 안함으로 로 하면 되니), 사용자가 서버나 클라이언트를 터치하면 그 순간 자동으로 업그레이드가 될수가 있어야겠지요^^
클라이언트의 스크립트를 업그레이드 하는 명령은 다음과 같답니다.
llRemoteLoadScriptPin( id , scriptname, pin_number, TRUE, 0);
여기서 id는 클라이언트 프림의 키, scriptname 은 업그레이드할 스크립트명칭인데 서버에 들어있어야 해요^^
pin_number 이게 클라이언트와 동일해야 됩니당.
그 다음 TRUE 는 스크립트를 업그레이드하고 실행중으로 설정할지, 비실행중으로 설정할지인데 당연히 실행중으로 해야하니 TRUE~
맨뒤의 0은 start_param, 즉 스타트 파라미터인데 테스트는 못해보았지만, on_rez 이벤트에 넘겨주는 파라미터가 아닐까 싶어요^^
3) 샘플소스
그러면 샘플 소스를 한번 보도록 할까요~
이 제품 업그레이드 소스는 서버 근처에서 제품을 클릭하면 스크립트만 자동으로 업그레이드가 되요~
핀번호는 꼭 남이 모르도록 바꿔서 사용하세요~
< 업데이트 클라이언트 스크립트 소스 >
integer pin_number=10010; // 클라이언트에서는 업그레이드 핀번호
integer channel_upgrade_server=10010; // 서버채널
integer channel_upgrade_client=10011; // 클라이언트 채널 3가지를 설정하여야 함. 핀번호는 채널과 겹쳐도 됨
//===========================================================================================================
float ver=0; // 버전(서버에서 받아서 자동으로 업그레이드됨)
default
{
state_entry(){
llSetRemoteScriptAccessPin(pin_number);
llListen(channel_upgrade_client,"",NULL_KEY,"");
llSay(channel_upgrade_server,"chkver");
}
on_rez(integer num){
llResetScript();
}
touch_start( integer num_detected )
{
llSay(channel_upgrade_server,"chkver");
}
listen( integer channel, string name, key id, string message )
{
list tmp;
string cmd;
float newver;
key toclient;
if(channel==channel_upgrade_client){
tmp=llCSV2List(message);
cmd=llList2String(tmp,0);
toclient=(key)llList2String(tmp,2);
if(llGetKey() == toclient){
if(cmd=="echover"){
newver=llList2Float(tmp,1);
if(ver<newver){
llSay(channel_upgrade_server,"upgrade");
llOwnerSay("upgrade ver " + (string)newver );
ver=newver;
}
}
}
}
}
}< 업데이트 서버 스크립트 소스 >
float ver=1.0; // 서버에서는 스크립트 버전과
integer pin_number=10010; // 업그레이드 핀번호
integer channel_upgrade_server=10010; // 서버채널
integer channel_upgrade_client=10011; // 클라이언트 채널 4가지를 설정하여야 함. 핀번호는 채널과 겹쳐도 됨
string scriptname="업그레이드할 스크립트명";//===========================================================================================================
default
{
state_entry(){
llListen(channel_upgrade_server,"",NULL_KEY,"");
}
on_rez(integer num){
llResetScript();
}
listen( integer channel, string name, key id, string message )
{
list tmp;
string cmd;
float newver;
llOwnerSay(message);
if(channel==channel_upgrade_server){
tmp=llCSV2List(message);
cmd=llList2String(tmp,0);
if(cmd=="chkver"){
llSay(channel_upgrade_client,"echover," + (string)ver + "," + (string)id);
return;
}
if(cmd=="upgrade"){
llRemoteLoadScriptPin( id , scriptname, pin_number, TRUE, 0);
return;
}
}
}
반응형'웹프로그래밍 > LSL(세컨드라이프)' 카테고리의 다른 글
파티클 스크립트(펌) (0) 2010.02.07 파티클 소스 (0) 2009.02.25 자동 스크립트 생성 (0) 2008.07.21 내장 애니메이션 확인하기 (0) 2008.06.25 세컨드라이프 내장 애니메이션 목록 (0) 2008.06.25