ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세컨드라이프 스크립트 자동 업그레이드(펌)
    웹프로그래밍/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

    댓글

Designed by Tistory.