• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

random Item Giver alle 24 Std auf klick

Jojo1905 Guardian

Aktiver Nutzer
huhu,

das Script mit dem random Giver hab ich schon hinbekommen
aber wie ändere ich das das jemand alle 24 Std nur einmal klicken kann,
ich denk das das mit listen möglich ist aber kenn mich noch nicht aus,

bin für jede hilfe dankbar

gruß jojo
 
Wenn du verhindern willst, dass Avatar "a" mehrmals klicken kann in einer definierten Zeitspanne, dann musst du eine Liste erstellen mit zeitstempel und den immer nach einer gewissen Zeit vergleichen. Also Avatar klickt, kommt auf die Liste mit dem Zitstempel+Zeitspanne, wo er nicht klicken können soll. Klickt er nochmal, kuckt das script, ob er drauf ist auf der Liste. Ist er drauf, kommt nix. Und dann alle x Minuten einen vergleich der liste mit der Zeit machen und alle runterschmeissen, die grösser deiner 24 h sind.

Hinweise zu listen: http://wiki.secondlife.com/wiki/Category:LSL_List
Listenabschnitte löschen: http://wiki.secondlife.com/wiki/LlDeleteSubList
für die Zeit:
http://wiki.secondlife.com/wiki/LlGetTime
http://wiki.secondlife.com/wiki/LlGetUnixTime
 
Zuletzt bearbeitet:
Zeit vergleichen muss gar nicht sein. Es reicht auch ne Liste mit Zählern, die z.B. jede Minute um 1 erhöht wird. Bei 1440 wirds wieder auf 0 gesetzt und derjenige darf wieder.
 
na mit der Zeit is das im moment garnicht so wichtig,
ich bekomm das mit der liste nicht hin das jeder Ava nur einmal klicken kann

Code:
list click_list;

integer NameOnList( string name )
{
    integer len = llGetListLength( click_list );
    integer i;
    for( i = 0; i < len; i++ )
    {
        if( llList2String(click_list, i) == name )
        {
            return TRUE;
        }
    }
    return FALSE;
}
 
Kombiniere es mit einem Greeter der alle 24 Stunden die Liste loescht.
Anstatt den Zaehler im Sensor verwendest halt die Funktion im Touch.

LG
Dae
 
mach doch einfach:

Code:
list click_list;

default
{
    touch_start(integer touched)
    {
         key touchkey = llDetectedKey(0);
         if(llListFindList (click_list, [touchkey]) == -1)
         {
              llOwnerSay("Hallo bist jetzt auch auf der Liste");
         }
         else
         {
              llOwnerSay("Hallo du bist schon auf der Liste");
         }
    }
}
 
Zuletzt bearbeitet:
Ich hätts ungefähr so gemacht:
Code:
list Ava_Keys;
list Ava_Time;
integer Minutes = 1;

default
{
	state_entry()
	{
		llSetTimerEvent(Minutes * 60);
	}
	touch_start(integer total_number)
	{
		string id = (string)llDetectedKey(0);
		if(llListFindList(Ava_Keys, [id]) != -1) return;
		Ava_Keys += [id];
		Ava_Time += [0];
	}
	timer()
	{
		integer i;
		integer x;
		integer len = llGetListLength(Ava_Keys);
		for(i = len - 1; i >= 0; i--)
		{
			x = llList2Integer(Ava_Time, i) + 1;
			if(x >= 1440)
			{
				Ava_Keys = llDeleteSubList(Ava_Keys, i, i);
				Ava_Time = llDeleteSubList(Ava_Time, i, i);
			} else Ava_Time = llListReplaceList(Ava_Time, [x], i, i);
		}
	}
}
 
Im Prinzip machst du aber nix anderes mit dem Counter als eine Art Zeitvergleich. Und du musst "ständig" die Liste erneuern während des Vergleichs. Da nehme ich lieber die Unixzeit+ die gewünschte Zeitspanne und vergleiche die mal eben dann mit der aktuellen Unixzeit. Und dann lösche ich die, die drüber sind. Spart das erneute schreiben in die Liste.
 
So ihr lieben sorry das ich mich nicht schon früher gemeldet hab
aber nun mal meinen lösungsansatz:

Code:
integer reset_list=86400;//reset list nach einem Tag (in sekunden)
list klick;

default
{
		touch_start(integer total_number)
			{
				key id = llDetectedKey(0);
				if(llListFindList(klick,[id])==-1)
				{
					klick+=[id];
					llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,(integer)llFrand(llGetInventoryNumber(INVENTORY_OBJECT))));
					llSay(0,"Herzlichen Glückwunsch [COLOR="#FF0000"]"NAME"[/COLOR] zu deinem Gewinn");
				}
					if(llGetTime()>=reset_list)
				{
					llResetScript();
				}
			}
}

hätte aber noch fragen dazu.....
wie kann ich den der klickt auslesen aus der Liste und in die Nachricht "NAME" einbringen?
und wo zum teufel muss ich reinschreiben das jemand zum 2. mal versucht was zu bekommen und ihm auf die Finger klopf :p

danke für eure hilfe bisher

jojo
 
Mal auf die schnelle:
Code:
integer reset_list=86400;//reset list nach einem Tag (in sekunden)
list klick;

default
{
		touch_start(integer total_number)
			{
				key id = llDetectedKey(0);
				string name = llDetectedName(0);
				if(llListFindList(klick,[id])==-1)
				{
					klick+=[id];
					llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,(integer)llFrand(llGetInventoryNumber(INVENTORY_OBJECT))));
					llSay(0,"Herzlichen Glückwunsch " + name + " zu deinem Gewinn");
				} else llSay(0, name + ", du hattest heute schon.");
					if(llGetTime()>=reset_list)
				{
					llResetScript();
				}
			}
}
 
danke dir rebekka
werd ich doch schnell mal ausprobieren, meld mich dann nochmal
also doch mit else, war doch sowas im hinterkopf :wink:

jojo
 
Hmmm....

bekomm in Zeile 16 , 24 nen Syntax error nun

Code:
integer reset_list=86400;//reset list nach einem Tag (in sekunden)
list klick;

default
{
        touch_start(integer total_number)
            {
                key id = llDetectedKey(0);
                string name = llDetectedName(0);
                if(llListFindList(klick,[id])==-1)
                {
                    klick+=[id];
                    llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,(integer)llFrand(llGetInventoryNumber(INVENTORY_OBJECT))));
                    llSay(0,"Herzlichen Glückwunsch " + name + " zu deinem Gewinn");
                }
                {
                        else llSay(0,schade " + name + " ,du hattest heute deinen Gewinn schon abgeholt\n versuch es doch Morgen nocheinmal!,");
                        if(llGetTime()>=reset_list)
                }
                {
                    llResetScript();
                }
            }
}

hab ich was falsch gemacht?

jojo
 
nene, sortier mal die Klammern richtig, dann faellts dir auf.

Nachtrag:
Ich kann nur immer wieder betonen, gewoehnt euch ne ordentliche Schreibweise an.
Wenn man die Klammern nicht richtig sieht, weil se dahinter oder am Anfang eines Befehls stehen, wundert es mich nicht das man sehr lange nach fehlern suchen muss.

LG
Dae
 
Zuletzt bearbeitet:
Man kann schon die Klammern direkt hinter einen Befehl schreiben, man muss es nur immer gleich machen.
Wichtiger ist IMHO auf die korrekte Einrückung zu achten und beim Schreiben den Code nicht zu sehr zu zerstückeln. Und logisch zusammenhängende Blöcke zusammenzufassen. Zusätzlich kann man noch Schließende Klammern mit einem Comment kennzeichnen, dann sieht man sofort, was wozu gehört, auch wenn man ein Script mit mehreren hundert Zeilen hat.

Code:
integer reset_list=86400;//reset list nach einem Tag (in sekunden)
list klick;

default{
    touch_start(integer total_number){
        key id = llDetectedKey(0);
        string name = llDetectedName(0);
        
        if(llListFindList(klick,[id])==-1){
            klick+=[id];
            llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,(integer)llFrand(llGetInventoryNumber(INVENTORY_OBJECT))));
            llSay(0,"Herzlichen Glückwunsch " + name + " zu deinem Gewinn");
        }
        else{
            llSay(0,"schade " + name + ", du hattest heute deinen Gewinn schon abgeholt\n versuch es doch Morgen noch einmal!,");
        }
        
        if(llGetTime()>=reset_list){
            llResetScript();
        }
    }//touch_start Event

}//default State
 
...man muss es nur immer gleich machen.
Das wuerde ich noch dick und fett in rot unterstreichen.

Wenn man sich kein immer gleich bleibendes Schema aneignet, kommt man ganz schnell ins straucheln.
Bei Scripten die unterschiedliche Styles aufweisen kann man schon dran riechen, das sie aus mehreren Freebie-Scripten zusammen gewuerfelt sind.
Sowas macht auch keinen Spass zu lesen oder gar fehler zu suchen.

LG
Dae
 
ihr habt ja recht,
ich sollte mir ne ordentliche formatierung angewöhnen

so ist es besser und dann hab ich den Fehler auch gefunden:

Code:
integer reset_list=86400;//reset list nach einem Tag (in sekunden)
list klick;

default
{
	touch_start(integer total_number)
	{
       	    key id = llDetectedKey(0);
       	    string name = llDetectedName(0);
        
		if(llListFindList(klick,[id])==-1)
		{
       	 	   klick+=[id];
           	   llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,(integer)llFrand(llGetInventoryNumber(INVENTORY_OBJECT))));
           	   llSay(0,"Herzlichen Glückwunsch " + name + " zu deinem Gewinn");
       	        }
		else
		{
           	   llSay(0,"schade " + name + ", du hattest heute deinen Gewinn schon abgeholt\nversuch es doch Morgen noch einmal!,");
       	        }
        
		if(llGetTime()>=reset_list)
		{
           	   llResetScript();
       	        }
       }
}

danke euch alle recht herzlich

Jojo
 
BTW, ich würde nicht mehr llDetectedName verwenden, sondern llGetUsername und dazu ggf llGetDisplayName. Damit verhindert man das unschöne Resident.
 

Users who are viewing this thread

Zurück
Oben Unten