Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ampel.lsl
#1
Ampel A und Ampel B werden gesteuert.
Für eine normale Kreuzung benötigt man von beiden 2 Stück.
Erstellt für jede Ampel 5 Prims und nennt sie:
Für Ampel A:
CarRotA
CarGelbA
CarGruenA

FussRotA
FussGruenA

Das Gleiche halt für Ampel B.
Dazu ein Prim für das Ampel.lsl Skript.

Ihr könnt auf den Prims eine Ampellicht Textur drauf machen und diese in eure bestehenden Ampeln einbauen.
Die Ampel schaltet realistisch aber ohne Blinken der Fussgängerlichtes.

Die Ampel kann mit einem Klick in den Außer-Betrieb-Modus versetzt werden,
wobei dann alle gelben Lampen blinken.

   

PHP-Code:
integer rotDauer   10// Dauer der roten Phase
integer gruenDauer 10// Dauer der grünen Phase
integer gelbDauer  3;  // Dauer der gelben Phase

vector COLOR_RED    = <1.0000.0000.000>;
vector COLOR_YELLOW = <1.0000.8630.000>;
vector COLOR_GREEN  = <0.0001.0000.0>;

// Linknummern für die Objekte
integer CarRotA 6integer CarGelbA 5integer CarGruenA 4;
integer FussRotA 3integer FussGruenA 2;
integer CarRotB 7integer CarGelbB 8integer CarGruenB 9;
integer FussRotB 10integer FussGruenB 11;

// Variablen für die Phasen und den Modus
integer currentPhase 0;
integer isOutOfService FALSE// Flag für Außer-Betrieb-Modus
integer isYellowBlinking FALSE// Flag für den Blinkzustand

// Funktionen für Lichtsteuerung
hell(integer linkNum) {
    
llSetLinkPrimitiveParams(linkNum, [PRIM_FULLBRIGHTALL_SIDESTRUEPRIM_POINT_LIGHTTRUEZERO_VECTOR1.010.00.6]);
}
dunkel(integer linkNum) {
    
llSetLinkPrimitiveParams(linkNum, [PRIM_FULLBRIGHTALL_SIDESFALSEPRIM_POINT_LIGHTFALSEZERO_VECTOR0.010.00.0]);
}

// Setzt die Ampel für Fahrzeuge A
setAutoAmpelA(integer my_state) {
    if (
my_state == 0) { 
        
llSetLinkPrimitiveParams(CarRotA, [PRIM_COLORALL_SIDESCOLOR_RED]);
        
hell(CarRotA); dunkel(CarGelbA); dunkel(CarGruenA);
    } else if (
my_state == 1) { 
        
llSetLinkPrimitiveParams(CarGelbA, [PRIM_COLORALL_SIDESCOLOR_YELLOW]);
        
hell(CarGelbA); dunkel(CarRotA); dunkel(CarGruenA);
    } else if (
my_state == 2) { 
        
llSetLinkPrimitiveParams(CarGruenA, [PRIM_COLORALL_SIDESCOLOR_GREEN]);
        
hell(CarGruenA); dunkel(CarRotA); dunkel(CarGelbA);
    }
}

// Setzt die Ampel für Fahrzeuge B
setAutoAmpelB(integer my_state) {
    if (
my_state == 0) { 
        
llSetLinkPrimitiveParams(CarRotB, [PRIM_COLORALL_SIDESCOLOR_RED]);
        
hell(CarRotB); dunkel(CarGelbB); dunkel(CarGruenB);
    } else if (
my_state == 1) { 
        
llSetLinkPrimitiveParams(CarGelbB, [PRIM_COLORALL_SIDESCOLOR_YELLOW]);
        
hell(CarGelbB); dunkel(CarRotB); dunkel(CarGruenB);
    } else if (
my_state == 2) { 
        
llSetLinkPrimitiveParams(CarGruenB, [PRIM_COLORALL_SIDESCOLOR_GREEN]);
        
hell(CarGruenB); dunkel(CarRotB); dunkel(CarGelbB);
    }
}

// Setzt Fußgängerampeln A und B
setFussgaengerAmpelA(integer my_state) {
    if (
my_state == 0) { 
        
llSetLinkPrimitiveParams(FussRotA, [PRIM_COLORALL_SIDESCOLOR_RED]);
        
hell(FussRotA); dunkel(FussGruenA);
    } else if (
my_state == 1) { 
        
llSetLinkPrimitiveParams(FussGruenA, [PRIM_COLORALL_SIDESCOLOR_GREEN]);
        
hell(FussGruenA); dunkel(FussRotA);
    }
}
setFussgaengerAmpelB(integer my_state) {
    if (
my_state == 0) { 
        
llSetLinkPrimitiveParams(FussRotB, [PRIM_COLORALL_SIDESCOLOR_RED]);
        
hell(FussRotB); dunkel(FussGruenB);
    } else if (
my_state == 1) { 
        
llSetLinkPrimitiveParams(FussGruenB, [PRIM_COLORALL_SIDESCOLOR_GREEN]);
        
hell(FussGruenB); dunkel(FussRotB);
    }
}

// Funktion für das Blinken der gelben Lichter
blinkGelb() {
    if (
isYellowBlinking) {
        
dunkel(CarGelbA); dunkel(CarGelbB);
    } else {
        
llSetLinkPrimitiveParams(CarGelbA, [PRIM_COLORALL_SIDESCOLOR_YELLOW]);
        
llSetLinkPrimitiveParams(CarGelbB, [PRIM_COLORALL_SIDESCOLOR_YELLOW]);
        
hell(CarGelbA); hell(CarGelbB);
    }
    
isYellowBlinking = !isYellowBlinking;
}

// Ausschalten aller Lichter
turnOffAll() {
    
dunkel(CarRotA); dunkel(CarGelbA); dunkel(CarGruenA);
    
dunkel(FussRotA); dunkel(FussGruenA);
    
dunkel(CarRotB); dunkel(CarGelbB); dunkel(CarGruenB);
    
dunkel(FussRotB); dunkel(FussGruenB);
}

// Umschalten zwischen Normal- und Außer-Betrieb-Modus
toggleOutOfService() {
    if (
isOutOfService) {
        
isOutOfService FALSE;
        
llSetTimerEvent(gruenDauer); // Timer für Normalbetrieb
        
currentPhase 0// Startphase
    
} else {
        
isOutOfService TRUE;
        
isYellowBlinking FALSE// Blinken zurücksetzen
        
turnOffAll();
        
llSetTimerEvent(1); // Blinktakt für Gelb im Außer-Betrieb-Modus
    
}
}

// Phasenlogik mit erweiterten Bedingungen
default
{
    
state_entry() {
        
// Initialisiere die Ampeln im Normalbetrieb
        
setAutoAmpelA(0); setFussgaengerAmpelA(1);
        
setAutoAmpelB(2); setFussgaengerAmpelB(0);
        
llSetTimerEvent(gruenDauer);
    }
    
    
touch_start(integer total_number) {
        
toggleOutOfService(); // Wechsel zwischen Normal- und Außer-Betrieb-Modus
    
}
        
    
timer() {
        if (
isOutOfService) {
            
blinkGelb(); // Gelbe Lichter blinken lassen
        
} else {
            
// Normalbetrieb Phasenwechsel
            
if (currentPhase == 0) {
                
setAutoAmpelA(0); setFussgaengerAmpelA(1);
                
setAutoAmpelB(2); setFussgaengerAmpelB(0);
                
llSetTimerEvent(gruenDauer);
                
currentPhase 1;
            } else if (
currentPhase == 1) {
                
setAutoAmpelA(1); setFussgaengerAmpelA(0);
                
setAutoAmpelB(0); setFussgaengerAmpelB(0);
                
llSetTimerEvent(gelbDauer);
                
currentPhase 2;
            } else if (
currentPhase == 2) {
                
setAutoAmpelA(2); setFussgaengerAmpelA(0);
                
setAutoAmpelB(0); setFussgaengerAmpelB(1);
                
llSetTimerEvent(gruenDauer);
                
currentPhase 3;
            } else if (
currentPhase == 3) {
                
setAutoAmpelA(0); setAutoAmpelB(1);
                
setFussgaengerAmpelA(0); setFussgaengerAmpelB(0);
                
llSetTimerEvent(gelbDauer);
                
currentPhase 0;
            }
        }
    }


   
Für die Fußgängerampel könnt ihr noch ein schwarzes Männchen darauf machen.
Alles geschrieben ohne zu gendern Smile Ich steige auf eine Leiter:in Wink
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



[-] The following 1 user says Thank You to Manfred Aabye for this post:
  • Dorena Verne
Zitieren


Nachrichten in diesem Thema
Ampel.lsl - von Manfred Aabye - 14.11.2024, 17:27
RE: Ampel.lsl - von Manfred Aabye - 14.11.2024, 19:03
RE: Ampel.lsl - von Manfred Aabye - 14.11.2024, 20:36

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste