Creator · LSL · OSSL

Scrivi script che vivono nel mondo

Su ZoneNations la logica gira sul simulatore, non sul tuo PC. Un oggetto scriptato resta acceso anche quando nessuno lo guarda: porte, giochi, venditori, teleporter, scene interattive. Questa guida ti porta dal primo touch al deploy professionale — con esempi pronti da copiare.
Simulatore server-side
Standard LSL
Estensioni OpenSim
Script persistenti

Workflow

Dal codice all'oggetto inworld

Quattro passi. Nessuna magia: apri l'editor, scrivi, compila, rezza. Se il compilatore segnala errori, correggi prima di andare live — eviti oggetti “Scripted” che non rispondono.

1 · Crea l'oggetto

In Firestorm: Build → un cubo o prim. Tasto destro → Edit → scheda Content. Qui vive lo script.

2 · Nuovo script

Content → New Script. Si apre l'editor LSL integrato. Cancella il template default e incolla un esempio da questa pagina.

3 · Compila

Save + Compile (Ctrl+S). “Script saved and compiled” = ok. Errori di sintassi? Il simulatore ti indica riga e motivo.

4 · Testa inworld

Tocca l'oggetto, cammina nel sensor, prova permessi e dialog. Sandbox o tua land: testa prima del deploy pubblico.

Fondamentali

Come pensa uno script LSL

Uno script è un programma event-driven: non gira in loop infinito, reagisce a eventi (touch, timer, collision, listen, sensor). Ogni oggetto ha al massimo uno script che gestisce tutti gli eventi in un unico blocco default { } o in più stati (state nome { }).
Stati (states)
Usa state idle, state running, state off per macchine a stati finiti. llSetState("running") cambia contesto. Utile per giochi, venditori, sequenze.
Eventi essenziali
state_entry() all'avvio e dopo reset · touch_start() al clic · listen() per chat/canali · sensor()/no_sensor() per prossimità · timer() con llSetTimerEvent() · changed() se l'oggetto si sposta o cambia inventario.
Permessi
Animazioni, controllo avatar e pagamenti richiedono llRequestPermissions(). Senza permesso, l'evento run_time_permissions non autorizza l'azione.
Mono vs LSO
ZoneNations usa il runtime Mono (compilato) per script moderni: più veloce e adatto a HTTP, JSON, liste grandi. Evita stack-heap collision: non concatenare stringhe in loop infiniti.

Architettura ZoneNations

Server-authoritative

Il viewer mostra la scena; il simulatore decide fisica, permessi ed esito degli script. Firestorm, web e WebXR vedono lo stesso oggetto scriptato perché lo stato vive nella regione. Non fidarti del client per anti-cheat o economia: valida sempre lato server.

OSSL: estensioni OpenSim

Funzioni os* e llHTTP* avanzate dipendono dalla regione. Reference completa sul sito ZoneNations — teleport, NPC, debug, differenze LSL/OSSL.

Esempi copiabili

Sei script pronti per iniziare

Copia nel tuo oggetto, compila, tocca. Modifica messaggi, canali e raggi. Ogni blocco è autocontenuto — niente dipendenze esterne.
LSL
Saluto al tocco
// Esempio 1 — Saluto al tocco
// Metti lo script in un oggetto rezzato nel mondo (non indossato).
default
{
    touch_start(integer total_number)
    {
        llSay(0, "Ciao! Sono uno script su ZoneNations.");
    }
}
LSL
Sensor prossimità
// Esempio 3 — Sensor: saluta chi entra nel raggio
default
{
    state_entry()
    {
        llSensorRepeat("", NULL_KEY, AGENT, 8.0, PI, 3.0);
    }
    sensor(integer detected)
    {
        integer i;
        for (i = 0; i < detected; ++i)
            llRegionSayTo(llDetectedKey(i), 0, "Benvenuto in questo spazio.");
    }
    no_sensor() {}
}
LSL
HTTP request (Mono)
// Esempio 6 — HTTP verso API esterna (Mono consigliato)
string URL = "https://example.com/api/ping";

default
{
    touch_start(integer n)
    {
        llHTTPRequest(URL, [HTTP_METHOD, "GET"], "");
    }
    http_response(key id, integer status, list meta, string body)
    {
        llOwnerSay("HTTP " + (string)status + ": " + llGetSubString(body, 0, 120));
    }
}
LSL
Menu dialog
// Esempio 2 — Menu dialog
integer CHANNEL = -98765;

default
{
    touch_start(integer n)
    {
        key who = llDetectedKey(0);
        llListen(CHANNEL, "", who, "");
        llDialog(who, "Scegli un'azione:", ["Info", "Teleport", "Chiudi"], CHANNEL);
    }
    listen(integer channel, string name, key id, string msg)
    {
        if (msg == "Chiudi") return;
        if (msg == "Info")
            llRegionSayTo(id, 0, "Script dialog su ZoneNations.");
        if (msg == "Teleport")
            llRegionSayTo(id, 0, "Configura qui la tua destinazione.");
    }
}
LSL
Animazione con permesso
// Esempio 4 — Animazione su richiesta (permesso richiesto)
string ANIM = "sit";

default
{
    touch_start(integer n)
    {
        key av = llDetectedKey(0);
        llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION);
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
            llStartAnimation(ANIM);
    }
}
OSSL
OSSL debug
// Esempio 5 — OSSL (OpenSimulator): nota sul terreno
// Funziona solo se la regione abilita OSSL. Verifica con il proprietario.
default
{
    touch_start(integer n)
    {
        key av = llDetectedKey(0);
        osNoticeDebug("Tocco da " + llKey2Name(av));
        llRegionSayTo(av, 0, "OSSL attivo su questa regione.");
    }
}

Pattern professionali

Best practice da creator esperti

Canali listen univoci

Usa canali negativi casuali (es. -1 - (integer)llFrand(999999)) per evitare collisioni con altri script in regione.

Mai busy-loop

Niente while(true) senza llSleep. Usa llSetTimerEvent per tick regolari. Risparmi memoria e lag sim.

llResetScript con cura

Resetta solo quando serve. state_entry() riparte da zero: reimposta listener e sensor.

Inventario e permessi oggetto

Copy/Modify/Transfer influenzano vendita e regalo. Script in oggetto NoModify non è editabile dal compratore.

Lag e llSleep

llSleep minimum ~0.02s. Batch di operazioni: raggruppa llSay in un messaggio invece di dieci in un frame.

Debug in produzione

llOwnerSay per log privati. osNoticeDebug solo in regioni che lo permettono. Rimuovi log verbosi prima del rilascio.

Strumenti

Dove scrivere e testare

Editor LSL integrato nel viewer: sintassi, salva, compila. Ideale per iterare inworld. Scarica da ZoneNations Download, configura la grid, entra con il tuo avatar creator.
Lo script non parte
Controlla “Running” in Content. Verifica errori compile. Oggetto rezzato inworld? Script in oggetto attachato usa eventi diversi. Prova llResetScript o re-rez.
“Script error” o stack-heap
Memoria esaurita: riduci liste, evita concatenazioni in loop. Passa a Mono. Spezza script in due oggetti collegati via llMessageLinked.
Il dialog non compare
Canale listen registrato prima del dialog. Avatar troppo lontano (>20m)? Canale in conflitto? Usa llGetOwner() per test da soli.
OSSL “function not found”
La regione non abilita quella OSSL. Usa fallback LSL o chiedi abilitazione al gestore regione / supporto ZoneNations.
Posso vendere oggetti scriptati?
Sì, rispetta permessi e ToS. Marketplace ZoneNations e venditori inworld. Non includere password o URL privati nel sorgente NoModify.
Dove chiedo aiuto?
Community creator, eventi builder, ticket supporto. Includi messaggio compilatore, snapshot Content, regione e cosa ti aspettavi.

Reference sul sito

Documentazione LSL e OSSL

Niente link esterni: eventi, funzioni, estensioni OpenSim e differenze grid restano qui su ZoneNations.

Documentazione LSL

Tipi, sintassi, catalogo eventi, funzioni ll* per categoria, costanti e note Mono.

Documentazione OSSL

Estensioni os*, teleport, NPC, HTTP, sicurezza e differenze rispetto a LSL puro.

Prossimo passo

Accendi la tua prima scena interattiva

Un cubo, un touch, un messaggio in chat: è così che iniziano giochi, porte e mondi interi. Entra, compila, rezza — poi mostra alla community cosa hai acceso.