iliveisl

Skrypty Porady: Konfiguracja przez notecard

9 komentarzy

Dawno temu, na blogu daleko, daleko ... cóż, to było dawno, ale może nie tak długo. A może to było dawno. Ten post został siedzi w kolejce przez kilka tygodni teraz i założę Ener jest zmęczony widząc go :).

Kontynuując na początku tematu z "Udostępnianie Mono bytecode" , następnie "Czy skrypt trzeba skarpety" , a następnie przez "Put opis obiektu do dobrego wykorzystania" , w tym poście, dowiemy się za pomocą notecards do konfigurowania opcji dla script.

Podsumowując temat ponownie, będąc w stanie skonfigurować skrypty do wielu celów ma przynajmniej dwie zalety.

  • Skrypty, które nie muszą być przygotowywane do niewielkich zmian parametrów wspierać udostępniania kodu bajtowego. Ten punkt prawdopodobnie odnosi się tylko do SL sama i nie OpenSim . W ostatnich miesiącach spędziłem sporo czasu w OpenSim i skrypty są obsługiwane różnie tam. Nie zupełnie rozumiem wszystko, co dzieje się z kompilacji skryptu i wykonania w OpenSim i zamiast przejścia na niedokładnych informacjach, że nie będzie starał się wyjaśnić moje jego zrozumienie. Ale myślę, że podejście OpenSim ma przewagę nawet jeśli udostępnianie kodu bajtowego nie jest prawdopodobne, jeden z nich.
  • Będąc w stanie skonfigurować pojedynczy skrypt, aby służyć wielu celom potencjalnie czyni skrypt łatwiejszy w utrzymaniu. Koncepcja ta ma uniwersalne zastosowanie w SL, OpenSim a nawet RL (co to jest??).


  • Notecard przetwarzanie w SL jest naprawdę bardzo proste. Wydarzenie zorientowany charakter LSL skryptów w połączeniu z asynchronicznym realizacji linii czytania notecard może być mylące na początku. Jednak po zrozumieniu, co się dzieje, większość ludzi sobie z tym całkiem dobrze. A kiedy budować jeden model, wystarczy skopiować je na okrągło.

    Więc dlaczego to robimy?

    Myślę, że za pomocą skarpetki lub metod opisu obiektu są łatwiejsze, ale mają swoje ograniczenia, jeśli chcesz obsługiwać wiele opcji konfiguracyjnych. Korzystanie notecards oferuje prawie nieograniczone możliwości konfiguracji.

    Chociaż nie jest bezwzględnym wymogiem, na ogół prawdopodobnie chcesz sprawdzić, czy notecard istnieje przed próbą go przeczytać. Możesz zdecydować się notecard wymagane lub opcjonalne, ale wciąż dobrze jest wiedzieć, czy jest czy nie.

    llGetInventoryType (notecard)

    LlGetInventoryType o zmiennej ciąg nazewnictwa notecard sposób można stwierdzić, czy istnieje notecard z oczekiwanym nazwy w wykazie obiektów. Zmienna służy do określenia nazwy notecard najprawdopodobniej muszą być zmienna globalna (zdefiniowane na początku skryptu poza jakąkolwiek podprogramów lub państw). To musi być globalny, tak więc jej wartość jest dostępna wewnątrz wydarzeń. Więcej o tym później. Funkcja faktycznie zwraca albo typ elementu o podanym imieniu lub INVENTORY_NONE flagi, jeśli nie ma obiektu o tej nazwie.

    Sidenote na moich zmiennych konwencji nazewnictwa. Zdobyłem to z niektórych sugestii LSL stylu gdzieś. Dla zmiennej, która traktuję jako stała, I wykorzystać wszystkie litery w notecard. Dla zmiennej że mam określony tak, że jest globalny, ale nie jest stałą, zaczynam zmienną z małym "G", a następnie przez wielką literą, która rozpoczyna opisową nazwę. Dla zmiennej, która nie jest globalne, ale tylko żyje wewnątrz podprogramu lub zdarzenia, zostawiam jak wszystkie małe.

    if (llGetInventoryType (notecard) == INVENTORY_NOTECARD)

    Zakładając notecard łańcuch zawiera żądaną nazwę notecard, to if będzie prawdziwe jeśli notecard istnieje.

    LlGetNotecardLine funkcja jest kolejną ważną funkcję.

    gQuery = llGetNotecardLine (notecard, Gline);

    W tym przykładzie notecard jest jeszcze znaków, który zawiera nazwę notecard. Gline zmienna jest rzeczywista linia notecard czytać i prawdopodobnie musi być zmienną globalną. Powinno to zawsze zaczyna jako zera i być zwiększane z każdym odczycie. Jeśli nie zwiększamy go, nadal będziecie czytać tę samą linię w kółko. Zmienna gQuery zwraca unikalny klucz, który może być użyty do identyfikacji, że dane są zwracane z funkcji. I tak, to prawdopodobnie trzeba być zmienną globalną.

    To gdzie LSL różni się od większości języków wysokiego poziomu może znasz. Można by normalnie oczekiwać dane będą dostępne do następnego sekwencyjnej instrukcji następującej llGetNotecardLine. Pamiętam, że wspomniane zdarzenie napędzane i asynchroniczne wcześniej? W LSL, dane są zwracane przez dataserver imprezy. LSL zwraca wiele rzeczy za pośrednictwem przypadku dataserver i dlatego musimy zapisać klucz od llGetNotecardLine jak w przykładzie, który używa zmiennej gQuery trzymać zwracany klucz powyżej.

    Głównym elementem jest tu nie napisać skrypt spodziewa się, że odczyt działo się po llGetNotecardLine funkcja jest wywoływana. W przeważającej części, reszta akcji odbędzie się w przypadku dataserver, dopóki nie są całkowicie wykonane przeczytaniu notecard. Dostarczane przykładem może służyć za wzór i demonstruje technikę używania, które pomogą Ci logicznie rozdzielić na przetwarzanie danych notecard z głównej funkcji skryptu.

    Teraz na imprezę dataserver. Pierwszą rzeczą, którą musisz zrobić, to sprawdzić, wywołane zdarzenie jest jeden, który daje linię notecard. Można to zrobić poprzez sprawdzenie, że klucz dostarczony do Ciebie w razie pasuje klucz zapisany z ostatniego llGetNotecardLine.

    Dataserver (klawisz query_id, string dane)

    Przy wejściu do dataserver, zmienna przekazana jako pierwszy parametr jest kluczem, który idzie ze zdarzeniem, a druga zmienna jest dane. W przypadku wystąpienia dataserver dla llGetNotecardLine, dane będą znaków, który zawiera linię notecard lub wskazanie, że nie ma więcej wierszy.

    if (query_id == gQuery)

    Kontynuując nasz przykład, jeśli oświadczenie będzie prawdziwe, jeśli to wydarzenie Dataserver idzie z ostatniego llGetNotecardLine.

    if (Dane == EOF)

    Musimy mieć sposób wiedzieć, że nie ma więcej notecard danych. Jeśli zmienna ciąg zawiera EOF wskaźnik (End of file), nie ma więcej danych. Więc w tym przykładzie, jeśli zdanie jest prawdziwe, jeśli nie ma więcej danych. Tak kod że idzie się z tym stwierdzeniem jest prawdziwe musi robić, co chcesz się stało po przeczytaniu wszystkich notecard. Czasami może to być trochę trudne, aby myśleć o jak jesteś w środku przypadku dataserver i co zamierzasz zrobić? Jeśli tylko coś proste do zrobienia być może po prostu wywołać podprogram lub nawet zawierać kod wbudowany następującego po if. Wspomniałem wcześniej, że przykładem zilustrować sposób logicznie odłączyć przetwarzania notecard z całej późniejszej działalności. I często to zrobić zmieniając państwa do nowego stanu.

    stwierdzić rozpocząć;

    W tym przykładzie, mogę przełączyć do stanu I wyobraźnią nazywają się rozpocząć. Rozpocznie się w "teraz zacznę na przetwarzanie moich danych". Ale stajemy się trochę do przodu i nie mamy przetwarzane dane jeszcze. Tak więc, jeśli czek na EOF nie jest prawda, my zajmiemy się jeszcze część, jeśli iw innych części, możemy analizować dane.

    Jeśli masz jakieś skomplikowane parsowania do roboty, to może być najczystszym aby umieścić go w podprogramie. W wielu przypadkach, które sprawiają, że skrypt łatwiejsze do odczytania i zrozumienia. W tym przypadku mamy tylko zamiar zrobić trochę parsowania więc nie będziemy wywołać podprogram, aby to zrobić.

    Analizowanie zestaw poleceń może być dość skomplikowane. W świecie rzeczywistym, istnieją dwie bardzo stare programy, które pochodzi od Uniksa, które mogą być wykorzystywane do tworzenia parserów dla skomplikowanego wprowadzania poleceń. Lex i YACC . Nazwa Lex pochodzi od "analizator leksykalny" i YACC oznacza "Yet Another Compiler Compiler". Lex i YACC są świetne narzędzia i oni lub ich pochodne są wykorzystywane do dziś. Ale pomijając fakt, że Lex i YACC wygenerowania kodu C i nie LSL, oni mogą być sposobem na ciężkie dla większości analizowanie wymagań potrzebnych do LSL. Tak, będziemy zbliżać parsowanie w nieco prostszy sposób.

    Nasz programista będzie bardzo proste.

    keyword = keyvalue;

    Pozwoli to na dużą elastyczność, ale wymaga bardzo prostą analizę.

    Zanim się poważny z analizowania, chcemy zrobić kilka rzeczy. Sprawdź, czy linia z notecard rzeczywiście zawiera jakieś dane i sprawdzić, czy to jest komentarz. W tym przykładzie używamy "#" na pierwszej pozycji na wskazany wiersz jest komentarz. I zawsze to zdolność do posiadania komentarze w notecard, ponieważ jest to dobry sposób na własny dokument składnię opcji, które chcesz wspierać.

    Sprawdź pustej linii.

    if (llStringTrim (dane, STRING_TRIM)! = "")

    Jeśli to stwierdzenie jest prawdziwe, linia nie jest pusta, a my nadal je przetwarzać. Kiedyś llStringTrim , aby usunąć wszelkie początkowe i końcowe spacje z linii w przypadku gdy posiada ona jedynie puste, w przeciwnym razie porównania z łańcuchem pustym nie będzie działać. Ponieważ użyliśmy llStringTrim funkcji wewnątrz warunkowy nie robiąc zlecenia, ciąg zostanie pozostawione bez zmian do dalszego przetwarzania.

    Sprawdź wiersz komentarza.

    if (llGetSubString (dane, 0, 0)! = "#")

    Jeśli to stwierdzenie jest prawdziwe, to linia nie zawiera wybrany znak komentarza na pierwszej pozycji i nadal. LlGetSubString przyjmuje trzy parametry. Ciąg do pracy, pozycji wyjściowej gdzie rozpocząć wydobywania znaków i pozycję końcową. Pozycje te są w stosunku do zera i "0, 0" oznacza wziąć 1st znak z łańcucha.

    Aby pomóc w podjęciu poza linię notecard z danymi na nim użyjemy llSubStringIndex szukać "=" i ";". w naszym Grammer llParseString2List to kolejna funkcja, która może być w łatwy sposób analizowania wiersza danych w lista słów lub ciągów. Ale w tym przykładzie będziemy trzymać się llSubStringIndex.

    i = llSubStringIndex (dane, "=");
    j = llSubStringIndex (dane, ";");

    Te dwie funkcje będzie szukał naszych dwóch separatorów i ustawić swoich zmiennych indeksowych, I oraz J do względnych miejscach w łańcuchu. Funkcja zwraca -1 jeśli nic nie zostało znalezione w łańcuchu.

    if (i == -1 | | j == -1)

    To czy oświadczenie potwierdzi, że znaleźliśmy obu naszych separatorów. Jeżeli jedna z tych zmiennych ma wartość -1, to piszemy się komunikat o błędzie i postępować, aby uzyskać kolejną kartę danych. Jeśli mamy znaleźć zarówno naszych separatorów, a następnie kontynuować analizowanie tej linii.

    keyword = llGetSubString (dane, 0, i - 1);

    Spowoduje to ustawienie zmiennej kluczowego do łańcucha znalezionego patrząc od początku linii do pierwszego "=", nie licząc "=". Pamiętam, że jest lokalizacja w ciąg "=". Jesteśmy po prostu robi prostą analizę tutaj, a nie bezpośrednio sprawdzanie każdej możliwej kogoś błąd może zrobić. Na przykład, kontrole te nie są bezpośrednio sprawdzić, "=" jest przed ";". Po prostu sprawdź, czy są one zarówno w łańcuchu i uzyskać podciąg na podstawie ich lokalizacji. Może to oznaczać, że mamy śmieci dla naszych zmiennych. Ale jeśli tak, to następujące kontrole zawiedzie tak.

    Czasami warto zrobić kilka rzeczy, aby programista trochę mniej rygorystyczne. Na przykład, zakładamy nie ma spacji na początku linii, a przed "=". Aby dopuszczać możliwość, że istnieją pewne przestrzenie i miejscach pozwolenia na pracę i tak, można włączyć funkcję na wyrzucenie zbędnych spacji przed i po kluczowym słowie. Ponadto, jeśli sprawa nie jest ważna, można tłumaczyć rzeczy małymi literami, a następnie kod wszystko przy założeniu, że jest małe.

    keyword = llStringTrim (llToLower (słowo kluczowe), STRING_TRIM);

    Spowoduje to spadek początkowe i końcowe spacje z kluczowych i przetłumaczyć ciąg na małe litery.

    keyvalue = llGetSubString (dane, i + 1, j - 1);

    Następnie należy ustawić zmienną keyValue, do fragmentu, który zaczyna się na pierwszej pozycji po "=", a kończy w pozycji przed ";".

    keyvalue = llStringTrim (keyvalue, STRING_TRIM);

    W tym przypadku, po prostu usunąć początkowe i końcowe spacje. Można także przetłumaczyć na małe litery, ale może się zdarzyć podczas zapisywania wartości, które chcesz zachować sprawę w określony sposób. Na przykład, jeśli podajemy tekst wiadomości do napisania, prawdopodobnie będzie chciał dostarczyć mieszaną wartość sprawy.

    Więc w tym momencie mamy zebrane słowo kluczowe w zmiennej słów kluczowych i wartości w zmiennej keyValue. Tak, jesteśmy gotowi, aby rozpocząć sprawdzanie i ustawianie opcji.

    Mamy początek if po tak wielu else if ponieważ musimy porównać wszystkie nasze pożądanych słów kluczowych. Dla każdego dopasowanego słowa kluczowego, wymagana funkcja jest wykonywana z odpowiednią wartością.

    gSeconds = (float) keyvalue;

    Nie będzie przejść przez każdy z nich porównuje ale będę wskazać jedną rzecz. Powyższy przykład jest, gdy bierzemy coś odczytać jako ciąg znaków i przekonwertować go na wartość zmiennoprzecinkową.

    Istnieje istotna kwestią zasługującą na uwagę odnośnie ciągów konwersji do innych typów. Jeśli wykonać jawne oddanych typu, takich jak (float) i łańcuch nie jest to ciąg liczbowy, LSL tylko spokojnie daje zero. I nie ma żadnych funkcji do sprawdzenia, jakiego rodzaju dane łańcuch składa się z. Tak więc, jeśli chciał potwierdzić, że ktoś wszedł ciąg cyfr, a nie ciąg znaków alfa, jesteś prawdopodobnie w lewo z budowy niechlujny funkcję, by sprawdzić, że treść napisu jest wszystkich cyfr lub cyfr i kropki. Ponieważ w większości tworzyć rzeczy dla siebie lub przyjaciół, po prostu niech to jeden iść i wziąć pod uwagę nie to warte wysiłku. Jeśli tworzysz coś do sprzedania, musisz wziąć pod uwagę, ile uważasz, że trzeba chronić swoich klientów od popełniania błędów.

    Jeśli spadnie przez if i wszystkie else if do else, to mieliśmy do czynienia słowo kluczowe / key para wartości, że nie wiem w jaki sposób przetwarzać.

    llOwnerSay ("notecard Konfiguracja zawiera nieznane słowo w wierszu" + (string) Gline + "\ n znaleźć słowo jest." + słowa kluczowe + "\ nCorrect błąd i reset.");

    Aby pomóc ktoś dokładnie określić ich błąd, że to dobry pomysł, aby dać im jak najwięcej informacji jak to możliwe. Przykład ten wypisze słowo kluczowe i wartość wraz z relatywnej linii w notecard. Pamiętaj, że linie notecard są w stosunku do zera. Jeśli to będzie pomylić kogoś, można dodać jeden do zmiennej linii notecard pomóc komuś na zewnątrz.

    Po całkowicie przetwarzania tej linii notecard, potrzebujemy nowego.

    + + Gline;
    gQuery = llGetNotecardLine (notecard, Gline);

    Funkcja llGetNotecard odczytuje numer linii można powiedzieć to. Więc najpierw musimy zwiększyć numer wiersza z + + Gline a następnie wywołać llGetNotecardLine funkcję. W naszym przykładzie, jesteśmy teraz na koniec imprezy dataserver i nie mają nic innego do roboty. Tak więc skrypt będzie poczekać do następnego wystąpienie zdarzenia, które prawdopodobnie będzie kolejna linia notecard. Jak wspomniano wcześniej, proces ten będzie powtarzany aż wskaźnik zwracania EOF, a my przejść do rozpoczęcia stanu.

    Jak wspomniano wcześniej, używam tego przełącznika państwa po zakończeniu przetwarzania notecard, jako sposób na czysty podzielić logikę pomiędzy czynienia z notecard oraz wszystko inne co się dzieje, że zależy od notecard. Nie jest wymagane do korzystania z różnych stanów.

    Trzy kluczowe słowa są przetwarzane w tym przykładzie. Są sekundy, debug i tekst. Kluczem sekund słowo jest używane tylko w celu wykazania konwersji danych numerycznych. Debug słowo kluczowe nie robi zbyt wiele, z wyjątkiem wydrukować kilka dodatkowych wiadomości, jeśli ustawiona na Tak. Słowo klucz tekst jest używany do ustawiania pływającego tekstu dla obiektu.

    Przykładowy skrypt zawiera również dwa zdarzenia, które ja zazwyczaj obejmuje w każdym skrypcie, który przetwarza notecards. Pierwszym z nich jest on_rez wydarzenie stosowane do wykrywania obiektów jest rezzed od inwentarza i zresetować skrypt Kiedy tak się dzieje. Drugim wydarzeniem jest zmienionych zdarzeń służy do wykrywania zmian zapasów. Zmienił zdarzenie jest zakodowane spowodować reset skryptu i ponownego przetwarzania notecard. Ma to na celu wsparcie rereading notecard jeśli zrobiłeś w nim zmian.

    A ponieważ istnieją dwa stany w tym przykładzie, zarówno on_rez i zmienił zdarzenia są kodowane w każdym państwie. To jest minusem posiadania wielu państw. Obsługi zdarzeń są skuteczne tylko w takim stanie są kodowane cala więc każde zdarzenie, które chcesz obsługiwać w każdym państwie ma być zakodowany we wszystkich stanach.

    Teraz przykładowy kod. Jak zwykle, przykład ten kod będzie działał zarówno w Second Life i OpenSim . Notecard przykład następujący kod.

    // Config Demo - Notecard // // Sample code to demonstrate using a notecard to set configuration // parameters. // // Micheil Merlin - 05/18/2010 string NOTECARD = "Config"; // Configuration notecard. key gQuery; // Notecard read key. integer gLine = 0; // Notecard line to read. integer gError = FALSE; // Error status. float gSeconds = 0.0; // Seconds value from notecard. integer gDebug = FALSE; // Debug flag from notecard. string gText = ""; // Hover text from notecard. default { state_entry() { llOwnerSay("Initializing..."); // Check to see if a notecard with teh specified name is in the // object inventory. if (llGetInventoryType(NOTECARD) == INVENTORY_NOTECARD) { // If the notecard exists, get the first line. Save the key // so we can use it in the dataserver event to identify that // the event is for this notecard read. gQuery = llGetNotecardLine(NOTECARD, gLine); } else { // If no notecard exists, just switch to the begin state. // There are no configuration parameters to change. state begin; } } // When object is rezzed, reset the script. on_rez(integer num) { llResetScript(); // Reset the script. } // Use the changed event to see if the inventory has changed. We can use // this to detect that the notecard has been changed and reset the script // so the notecard can be reprocessed. There is no way to determine what // in the inventory has changed without doing some sort of processing on the // inventory. So, the script will be reset regardless of what changed in the // inventory. changed(integer change) { // If inventory has changed, assume script reset is needed. Many other // things can trigger the change event but in this case, we are only // looking for changed inventory. if (change == CHANGED_INVENTORY) { llResetScript(); // Reset the script. } } // Dataserver event to process notecard data. dataserver(key query_id, string data) { integer i; // Temp index. integer j; // Temp index. string keyword; // Configuration keyword. string keyvalue; // Configuration value. // The dataserver event is used for many things. To make sure we process // the correct data, check that the key is from the last notecard read // request. In this sample code, the dataserver event should not be // triggered for any other purpose than to present the notecard data. // But it is still a good coding practice to check to make sure // the event is what you think it is. if (query_id == gQuery) { // If 'End of File' is returned, then there is no more data. Switch // to the begin state. if (data == EOF) { state begin; } // Process the notecard data. else { // Compress out blanks and make sure the notecard line is not empty. if ( llStringTrim(data, STRING_TRIM) != "" ) { // A notecard line with a '#' in the first position is taken to be a // comment and will not be further processed. if (llGetSubString(data, 0, 0) != "#") { // If line is not a comment, get keyword and value. // The format of the data we are looking for is... // keyward=keyvalue; i = llSubStringIndex(data, "="); // Look for keyword/keyvalue separator. j = llSubStringIndex(data, ";"); // Look for end of line marker. if (i == -1 || j == -1) { // Check for 'keyword=value;' syntax. llOwnerSay("Configuration notecard contains invalid syntax at list " + (string)gLine + ". Data line follows.\n" + data + "\nCorrect the error and reset."); gError = TRUE; // Set error condition. } else { // Extract the keyword and keyvalue strings. keyword = llGetSubString(data, 0, i - 1); // Translate keyword to lower case to reduce problems from typos and // also remove leading and trailing blanks. keyword = llStringTrim(llToLower(keyword), STRING_TRIM); keyvalue = llGetSubString(data, i + 1, j - 1); // Only remove leading and trailing blanks from keyvalue. Assume // the existing case is what is intended. There may be specific // uses of keyvalue where it still may be desireable to force // everything to one case. keyvalue = llStringTrim(keyvalue, STRING_TRIM); // Process keywords in config notecard. if (keyword == "seconds") // seconds keyword. { // We don't really have anything to do with the seconds value. // We are just demonstrating translating a string from // notecard to a float. gSeconds = (float)keyvalue; // Translate value to float and save. } else if (keyword == "debug") // debug keyword. { // Here is a case where we want to force a compare to lower case // as we are using keyvalue as on on/off switch. // Also, we assume that any other reply than yes means no. If you // really want to make sure someone doesn't just typo the yes and // it is taken as no, you'd want to check for yes or no and then // indicate an error if something else was encountered. if (llToLower(keyvalue) == "yes") { gDebug = TRUE; // Set debug flag. } } else if (keyword == "text") // text keyword. { gText = keyvalue; // Set text value. } else { llOwnerSay( "Configuration notecard contains unknown keyword at line " + (string)gLine + ".\n Keyword found is " + keyword + "\nCorrect the error and reset."); gError = TRUE; // Set error condition. } } } } // Request the next notecard line. ++gLine; gQuery = llGetNotecardLine(NOTECARD, gLine); } } } } state begin { // Initialization completed. state_entry() { // Make some use of the debug flag. Normally, you'd sprinkle this through your // script printing values where ever you wanted to check that things were as // expected. if (gDebug) { llOwnerSay("Debug mode is on."); llOwnerSay("Seconds=" + (string)gSeconds + "."); llOwnerSay("Value of text is " + gText + "."); } // Check to see if the error condidition was set during configuration. We // may not want to do anything else if a configuration error occurred. if (gError == FALSE) { llOwnerSay("Ready to run."); llSetText(gText, <1.0, 1.0, 1.0>, 1.0); // Set text as requested. } else { llOwnerSay("Not ready to run."); } } // Since events are specfiic to a state, we need to duplicate the on_rez event in this // state also. on_rez(integer num) { llResetScript(); // Reset script. } // Since events are specific to a state, we need to duplicate the changed event in this // state also. changed(integer change) { // If inventory has changed, assume script reset is needed. if (change == CHANGED_INVENTORY) { llResetScript(); // Reset script. } } // Use the touch event to report what is in the settings. touch_start(integer num) { string debugstr; // Text string for debug flag. if (gDebug) // Translate debug flag to yes or no. { debugstr="yes"; } else { debugstr="no"; } llOwnerSay("Debug=" + debugstr + "."); llOwnerSay("Seconds=" + (string)gSeconds + "."); llOwnerSay("Text=" + gText + "."); } } 



    Poniżej znajduje się tekst o notecard iść razem z tym przykładzie kodowania. Wklej ten tekst do notecard nazwie Config do pracy z tego przykładu.

     # Config notecard for Config Demo script. # debug may be set to yes or no. debug=yes; # This text will be used to set the floating text of the object. text=Config Demo; # Supply a numeric value for seconds. seconds=5; 
    Twitter Digg Reddit Stumbleupon Zachwycający Facebook Linkedin Plusone Tumblr Posterous Snailmail

    napisany przez Micheil Merlin

    07 czerwca 2010 o 8:33 pm

    pisał w sieci reakcji , w Second Life

    tagged with i , w

    9 komentarzy do "Scripting Porady: Konfiguracja przez notecard"

    subskrybuj komentarze z RSS lub Trackback do "Obsługa skryptów Porady: Konfiguracja przez notecard".

    1. niesamowite post! i tak naprawdę zrozumieć, co uczysz! dziękuję! =)

      uniwersalny skrypt lub wybór z kilku "przejdź do" uniwersalnych skryptów jest szybkim sposobem na rozwój zawodowy w-świecie

      i to fenomenalne, że przetestowany i pracował to tak, że działa zarówno w Second Life i OpenSim - to oznaka prawdziwego Scripter ekspertów! ładnie zrobione!

      Ener Hax

      07 czerwca 10 o 10:58 pm

    2. Pamiętasz, biorąc mnie przez czytelnika krok po kroku notecard około dwa lata temu? Że nadal plasuje się ze mną za najlepszego wyjaśnienia technicznego urządzenia, które kiedykolwiek miałem.

      Good job. :-)

      Nickola Martynow

      8 czerwca 10 w 6:37 pm

    3. Dzięki ENER r.

      I tak, Nikki, pamiętam. :) Staram się robić w ten sposób, ponieważ czytałem zbyt wielu technicznych "jak-tych", który miał wielkie ogromne braki informacji, które musiałem odkryć na własną rękę. Tak naprawdę nauczyć się go całkiem dobrze, kiedy tak się dzieje, ale to zajmuje tyle czasu.

      Micheil Merlin

      8 czerwca 10 w 5:23 pm

    4. Uważam notecard czytanie być przerażająco powolny, dlatego zwykle umieścić moje configs w super małych skryptów, które przechodzą config do głównego skryptu za pomocą wiadomości link. Chwilowe obciążenie konfiguracyjne są strasznie miły, nawet jeśli montaż jest nieco bardziej skomplikowana.

      Zima Seale

      10 czerwca 10 o 5:31 am

    5. Doskonały komentując w kodzie! Ten rodzaj komentarza sprawia, że ​​realistyczne, aby móc złamać otwarty kod lat w dół drogi i nadal wie co robi!

      Niezła robota.

      David Miller

      11 czerwca 10 o 12:28 am

    6. David
      Dzięki. Komentując tam był dość szczegółowy, aby pomagać w nauce. Nie jestem dość że gadatliwy z normalnych skryptów. Ale prawdopodobnie to komentarz więcej niż większość z dokładnie powodu państwa. Kiedy zacząłem życie dawno temu ... lol ... Dowiedziałem się, że trudno było zapamiętać, dlaczego to zrobiłem trochę mało szczególną cechę lat później, kiedy podniósł ją ponownie i komentarze pomóc. Poza tym chciałem kogoś o zrozumienie, gdyby mieli przyjść za mną i dokonać zmian.

      Micheil Merlin

      11 czerwca 10 w 4:41 pm

    7. Tak, zima Seale, czy korzystać z notecard skrypt taki, że zwykle nie dostać reset i już jest wszystko konfiguracja załadowany? Pod ręką od kiedy prosiłam bez czytania notecard ponownie? Widzę, jak to byłoby szybciej.

      Micheil Merlin

      11 czerwca 10 w 4:45 pm

    8. [...] Skrypty Porady: Konfiguracja przez notecard w iliveisl [...]

    9. [...] Zawiera kilka parametrów w tym identyfikatorów UUID lub kluczy z odległych obiektów. Ostatni post roku, skryptów Porady: Konfiguracja przez notecard, opisuje to, co masz zrobić, aby przetworzyć [...]

    Zostaw odpowiedź - dodaj swoje myśli

    można użyć tych tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime = ""> <em> ³ <q cite=""> <strike> <strong>