[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
  • hi leute mein sscanf lädt nicht :(((((((((((((((((((((((((((((((((((((((((((
    im server log steht auch nur dass es nicht geladen wurde mehr nicht

  • Hey Leute, da Wiki zurzeit Down ist frage ich hier nach:


    Ich habe eine schöne Map für mein guten Freund Slice erstellt, nun möchte ich folgendes machen:


    Ich habe eine normale Map mit ungefähr 100 Objekten worin sich aber 2 Objekte befinden die per Befehl auftauchen sollen, genau da wo ich sie hingemappt habe.


    Der Code der Türen sieht so aus:



    tmpobjid = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    tmpobjid = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);


    Welche Callbacks benötige ich, welche Functions etc?


    Ich möchte das man die Objekte erstellen kann (auf den Koordinaten oben angegeben) und ebenfalls wieder löschen kann.



    Würde mich über eine schnelle Antwort freuen, ich würde es ja selber versuchen aber kann nicht viel ohne Wiki anfangen..



    Edit1: Habs ohne Wiki geschafft ein Befehl zu erstellen um die Objekte zu erstellen. Wie lösche ich sie wieder?



    CMD:edoor(playerid,params[])
    {
    new tmpobjid;


    tmpobjid = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    tmpobjid = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);


    SendClientMessage(playerid,0xFF0055FF,"Rooms blocked");
    return 1;
    }


    Mit freundlichen Grüßen
    JustMe.77 8)

    Einmal editiert, zuletzt von JustMe.77 ()

  • Hey Leute, da Wiki zurzeit Down ist frage ich hier nach:


    Das Wiki ist nicht down. 8|


    Du benötigst MoveObject und einen Befehl. Gegebenenfalls CreateObject und DestroyObject.


    Zum Edit:
    Anstatt es in eine temporäre Variable zu speichern, setze unter den Includes:
    new gObj[2];


    Und dann beim Command:
    gObj[0] = CreateObject(...
    gObj[1] = CreateObject(...


    Dann kannst du sie mit DestroyObject(gObj[i]); wieder entfernen, wobei das i für 0 und 1 steht.

  • new tmpobjid;
    Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.


    new gObj[2];
    Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen.

  • new tmpobjid;
    Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.


    new gObj[2];
    Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen.


    Alles klar, danke :)


    Nur habe ich ein kleines Problem:



    CMD:deletetest(playerid,params[])
    {
    DestroyObject(gObj[i]);
    }




    C:\Users\Dave\Desktop\OX-Event.pwn(264) : error 017: undefined symbol "i"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.


    Kannst du mir auch sagen wie ich das in einem Befehl mache, möchte nicht 2 verschiedene haben...


    Mit freundlichen Grüßen
    JustMe.77 8)

  • CMD:deletetest(playerid,params[])
    {
    for(new i=0; i<sizeof(gObj); i++) DestroyObject(gObj[i]);
    }


    Bzw, besser ist es so:
    CMD:deletetest(playerid,params[])
    {
    for(new i=0; i<sizeof(gObj); i++)
    {
    if(gObj[i] != -1) DestroyObject(gObj[i]);
    gObj[i] = -1;
    }
    }
    Und bei der Deklaration:
    new gObj[2] = {-1,...};


    Das verhindert Fehler.

  • Jeffry:


    Keine Errors, denke mal es funktioniert ich teste es gleich aus.


    Aber kannst du mir noch sagen wie ich das in nur einem Befehl einbaue? Also das sich das z.B mit /edoor erstellt, wenn man es nochmal eingibt löschen sich die Tore..


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Jeffry:


    Viel besser nur habe ich 2 kleine Probleme:


    1) Texturen werden nicht angezeigt, nur das Objekt selbst.
    2) Beim löschen der Türen wird SendClientMessage 2 mal ausgeführt, ich weiß nicht warum.



    CMD:edoor(playerid,params[])
    {
    static bool:status;
    if(!status)
    {
    new tmpobjid;


    gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial(tmpobjid, 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(tmpobjid, "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);


    SendClientMessage(playerid,0xFF0055FF,"Rooms locked");
    }
    else
    {
    for(new i=0; i<sizeof(gObj); i++)
    {
    if(gObj[i] != -1) DestroyObject(gObj[i]);
    gObj[i] = -1;
    SendClientMessage(playerid,0xFF0055FF,"Rooms unlocked");
    }
    }
    status = !status;
    return 1;
    }



    Also zu dem Text, gebe ich einmal /edoor ein, erstellt sich das Objekt, Rooms locked erscheint. Lösche ich die Objekte, kommt 2 mal Rooms unlocked..


    Mit freundlichen Grüßen
    JustMe.77 8)

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


    Ich danke dir vielmals, funktioniet bis jetzt sehr gut :).


    In Planung habe ich noch einige Änderungen, die wären unter anderem:


    - Ein Befehl womit ich ein Countdown starte, z.B ein Countdown der von 60 runterzählt bis auf 0.
    (Im Befehl kann man eine beliebige Zahl eingeben in Sekunden.) Das soll dieser Countdown sein der auf dem Bildschirm erscheint also kein Text und ebenfalls dieser Sound der abgespielt wird. (Kenne die ID nicht).


    - Nachdem der Countdown abgelaufen ist, erstellen sich diese 2 Türen.



    Kannst du mir da behilflich sein? Hat Zeit bis morgen weil ich jetzt nicht mehr am PC bin.


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Das mit dem Timer ist relativ leicht.
    Ich gehe einfach mal davon aus, dass man den Timer nur einmal starten kann, global gesehen, sprich wenn Spieler A ihn startet, dann kann ihn Spieler B nicht auch starten.


    Global unter den Includes:
    new countTimer = -1;


    Im Befehl, dort wo der Timer gestartet werden soll:
    if(countTimer != -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Countdown ist bereits an.");
    if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit ein.");
    new time = strval(params);
    if(time < 1 || time > 60) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit zwischen 1 und 60 ein.");
    countTimer = SetTimerEx("CountDownObjekte", 1000, true, "dd", playerid, time);


    Und das Timer-Callback:
    forward CountDownObjekte(playerid, count);
    public CountDownObjekte(playerid, count)
    {
    count--;
    if(count <= 0)
    {
    KillTimer(countTimer);
    countTimer = -1;
    //Hier die Objekte erstellen
    }
    new str[16];
    format(str, sizeof(str), "Countdown: %d", count);
    //TextDrawSetString? / SendClientMessage?
    return 1;
    }

  • Jeffry:


    So jetzt habe ich wieder Zeit, danke erstmal.


    Bei //TextDrawSetString? / SendClientMessage? möchte ich den Countdown als TextdrawSetString ausgeben, was sind die Parameter die dahinter gehören?


    Habe bei Wiki das gefunden TextDrawSetString(himessage, newtext); .


    Doch das muss ich anpassen zu meinem Code, was setze ich statt himmessage und newtext ein?


    Mit freundlichen Grüßen
    JustMe.77 8)