[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • GhostRider wegen den Textdraws nein es ist nicht das selbe.


    PlayerTextDraws sind wie es der Name schon sagt Spieler gebunden und TextDraws sind Global. D.h. wenn man viele Sachen hat die nur bestimmte Spieler sehen wie z.B. ein Speedo ist es ratsam PlayerTextDraws zu nutzen und bei Dingen wie eine Domain etc. ist es ratsam TextDraws zu nutzen.


    BOMBER einfach das Objekt destroyen und wieder ganz normal erstellen.


    DestroyObject(ObjName);
    ObjName = CreateObject(2993,-384.2000122,-4133.7001953,23.2999992,0.0000000,0.0000000,0.0000000);


    So habe ich das im Timer aufgerufen, aber der Timer wird nicht mal aufgerufen, demnach wird das Objekt nicht zerstört / erstellt. :wacko:



    forward Respawn(playerid);
    public Respawn(playerid)
    {
    //Hier steht das drinne...
    }


    SetTimer("Respawn",RESPAWNZEIT,false);


    Hier wirds aufgerufen, Respawnzeit = 15 Sek.


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Soll der Timer Spielergebunden sein? Wenn ja würde ich dir raten mit SetTimerEx zu arbeiten.


    Und btw, du zeigst nur wie du den Timer erstellst, aber nicht wo. :P xD


    Also ich kann mir mit der Funktion alleine nicht wirklich einen Einblick machen warum es nicht funktioniert.


    EDIT: Vorschlag


    OnPlayerSpawn(playerid)
    {
    SetTimerEx("Respawn",RESPAWNZEIT,0,"i",playerid);
    return 1;
    }


    forward Respawn(playerid);
    public Respawn(playerid)
    {
    //Dein Code
    return 1;
    }

  • Soll der Timer Spielergebunden sein? Wenn ja würde ich dir raten mit SetTimerEx zu arbeiten.


    Und btw, du zeigst nur wie du den Timer erstellst, aber nicht wo. :P xD


    Also ich kann mir mit der Funktion alleine nicht wirklich einen Einblick machen warum es nicht funktioniert.


    if(Var{playerid} > 0)
    {
    SendClientMessage(playerid, GRÜN, "Objekt wird abgegeben (15 Sekunden!)");
    SetTimer("Respawn",RESPAWNZEIT,false);
    }


    Bei dem /Abgeben Befehl, soll das Objekt sozusagen nach 15 Sek zerstört werden, und nach 30 Respawnt, nein der soll ja nicht Spieler gebunden sein, der soll das Objekt ja für alle respawnen.


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Gut jetzt habe ich in etwa verstanden was du meinst. dann solltest du erstens mit einer Schleife zum ablegen nutzen (Zerstören des Objektes).


    Zudem wie du es derzeitig hast wird es nur für eine playerid ausgeführt, also wäre auch hier eine Schleife angebracht um es für alle auszuführen.
    Jedoch kann ich mir immer noch nicht sehr viel vorstellen unter den 10 Zeilen die du jetzt insgesamt gepostet hast. Also ich verstehe was du machen willst, aber ich sehe derzeitig nicht warum es nicht funktioniert (der Timer nicht startet).


  • Damit ist aber im text noch das ! enthalten, also in der Nachricht


    Na eben nicht. strfind returned wenn es nicht vorhanden ist "-1". Wenn es vorhanden ist, returned er die Anzahl der zeichen vor dem gesuchtem!
    Sprich: wenn es am anfang stehen soll MUSS er "0" retunen, steht es aber mitten im Text, returned er einen höheren Wert.


    Das ist aber eh überflüssig weil mit text[0] ist es viel einfacher und besser. er muss dann aber dennoch "!" ausschneiden damit das nicht mitgesendet wird.

  • Gut jetzt habe ich in etwa verstanden was du meinst. dann solltest du erstens mit einer Schleife zum ablegen nutzen (Zerstören des Objektes).


    Zudem wie du es derzeitig hast wird es nur für eine playerid ausgeführt, also wäre auch hier eine Schleife angebracht um es für alle auszuführen.
    Jedoch kann ich mir immer noch nicht sehr viel vorstellen unter den 10 Zeilen die du jetzt insgesamt gepostet hast. Also ich verstehe was du machen willst, aber ich sehe derzeitig nicht warum es nicht funktioniert (der Timer nicht startet).



    forward Respawn(playerid);
    public Respawn(playerid)
    {
    if(var{playerid} == 1)return SendClientMessageToAll(ROT, "Objekt abgegeben!"), Obj+=1; //Bis hier kommt der Code noch...
    DestroyObject(ObjName); //Aber hier ist denn Sense :D
    ObjName = CreateObject(2993,-384.2000122,-4133.7001953,23.2999992,0.0000000,0.0000000,0.0000000);
    SendClientMessageToAll(GRÜN, "Das Objekt wurde respawnt!");
    return 1;
    }


    So, das sollte helfen?


    //Edit noch mal ausgebessert
    //Edit² Hat sich erledigt, habs nun in einen IF-Block gesetzt, anstatt mit Return (Funktioniert nun), danke an alle :love:


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

    Einmal editiert, zuletzt von BOMBER ()

  • Yup jetzt kann ich auch auf Fehlersuche gehen und würde auch gerne gleich einmal Anfangen.


    Erstens, sagtest du nicht, dass das Objekt etwas später wieder erstellt werden soll?
    Wenn ja solltest du hier mit einer simplen Variable arbeiten welche abfragt welchen Status es derzeitig hat und bei Status 0 den Timer erneut ausführt und die Variable +1 setzt.


    Dann würde ich es ungefähr so machen (alles zusammen).


    new obj, ObjName[MAX_PLAYERS],RespawnStatus;


    forward Respawn(playerid);
    public Respawn(playerid)
    {
    if(RespawnStatus==0)
    {
    if(var{playerid} == 1)return SendClientMessageToAll(ROT, "Objekt abgegeben!"), Obj+=1,RespawnStatus=1,DestroyObject(ObjName[playerid]);
    }
    else if(RespawnStatus == 1
    {
    ObjName[playerid]=CreateObject(2993,-384.2000122,-4133.7001953,23.2999992,0.0000000,0.0000000,0.0000000);
    SendClientMessageToAll(GRÜN, "Das Objekt wurde respawnt!");
    }
    return 1;
    }


    PS: Ist jetzt mehr oder weniger nur Pseudocode, jedoch würde ich dir raten für ObjName noch, da es ja an Spieler attached ist, die playerid zu returnen.

  • Na eben nicht. strfind returned wenn es nicht vorhanden ist "-1". Wenn es vorhanden ist, returned er die Anzahl der zeichen vor dem gesuchtem!
    Sprich: wenn es am anfang stehen soll MUSS er "0" retunen, steht es aber mitten im Text, returned er einen höheren Wert.


    Das ist aber eh überflüssig weil mit text[0] ist es viel einfacher und besser. er muss dann aber dennoch "!" ausschneiden damit das nicht mitgesendet wird.


    Das man wie ausschneidet? ^^


  • text[1] löscht das erste Zeichen, bzw sendet alles nach dem 0. , sprich ! , richtig?
    Denn nur das hätte ich gebraucht ;*
    Trotzdem danke an alle :*


  • Danke vielmals, aber hatte sich schon erledigt. :D


    Habe es oben auch editiert :P


    Naja aber noch ne kleine Frage, wenn der Spieler nicht in der Nähe vom Objekt ist... soll das Objekt sozusagen auch zerstört werden ( 5 Meter )


    if(VAR2 == 1 && !IsPlayerInRangeOfPoint(playerid, 5, X, Y, Z))
    {
    DestroyObject(ObjName);
    }


    X, Y, Z Habe ich mit GetPlayerPos ausgelesen...


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Wie erstell ich schnell eine Zufallsfunktion mit einer Chance von 50% zu 50%.


    Also es startet eine Funktion, und dann soll zufällig Event1 oder Event2 eintreten.


    - Tom


    switch(random(2)) {
    case 0: Start(Event1);
    case 1: Start(Event2);
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • switch(random(2)) {
    case 0: Start(Event1);
    case 1: Start(Event2);
    }


    mfg. :thumbup:


    Danke :)


    Kannst du mir noch verraten wie ich es mache das wenn ich zB 3 Zahlen habe 5000, 10000 und 15000 wie ich am Anfang einer Funktion eine der drei zufällig auswähle um zB. so den max. Betrag zu bestimmen den man in einer Bank stehlen kann?


    - Tom


    #fail verbessert (doppelzitat)

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen