[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
  • Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fehler gefunden ().
  • So mein Rundensystem konnte ich bereits beheben :D
    Nun bleibt noch das Problem: Ich brauche eine Funktion um zu checken welches Team das einzig uebrig gebliebene ist.
    Um zu schauen wieviele aktive Teams es gibt habe ich eine Funktion GetActiveTeamCount(), welche die Anzahl der aktuell exisitierenden Teams returned.
    Die Teams haben IDs 1-6.
    Weiterhin soll die Funktion die ID des letzten verbleibenden Teames returnen (Abgefragt das nur noch ein Team exisitert wird durch eine if Bedingungen mit GetActiveTeamCount == 1))


    Hat da jemand eine Idee wie ich das realisiere? Bisher habe ich den Ansatz mit der rekursiven Funktion, jedoch ist der maximal wartungsunfreundlich, und ich kann nach fast 2 Jahren die FUnktion nicht mehr genau nachvollziehen.



    Weiterhin eine abgewandelte Funktion, welche beim Start prueft, ob mindetens 1 Spieler in mindestens 2 Teams ist, und wenn nicht, die IDs der jeweiligen Teams ausgibt wo ein Spieler fehlt.
    Da ist ja die Schwierigkeit dass ich nicht 2 IDs auf einmal returnen kann.


    //edit: Ersteres habe ich bereits hinbekommen.



    Jedoch habe ich da noch irgendas drinnen was den Compiler crasht.

    4 Mal editiert, zuletzt von Sub Royal ()

  • Hey,


    Habe mal eine kurze frage...



    Wen ich eine Neue Werbung auf das Objekt mache verschwindet das Object einfach aber warum?
    Wen ich den Server Neustarte ist es da mit den akuellen tex :o


  • DestroyObject(WerbungObjekt[4]);
    DestroyObject(WerbungObjekt[8]);
    WerbungObjekt[4] = CreateObject(4988, 0, 0, -1000, 0 ,0, 0, 100);
    WerbungObjekt[8] = CreateObject(4988, 0, 0, -1000, 0, 0, 0, 100);


    Du löschst das jeweilige Werbeobjekt und erstellst es an Position 0.0, 0.0, -1000.0 neu, das erklärt das "Verschwinden", kann mir nicht vorstellen dass diese Position beabsichtigt ist.

  • @Sub Royal Anstatt so viel redundanten Code zu haben, würde ich einfach *_TEAM_COLOR_TAG in ein Array schmeißen und per remainingTeamID auf den jeweiligen Index zu greifen. Dann hast du deutlich weniger Zeilen, sparst dir das mit den Markos und das hinzufügen / entfernen weiterer Teams (im Allgemeinen die Wartbarkeit) erleichtert sich deutlich.

  • @Sub Royal Anstatt so viel redundanten Code zu haben, würde ich einfach *_TEAM_COLOR_TAG in ein Array schmeißen und per remainingTeamID auf den jeweiligen Index zu greifen. Dann hast du deutlich weniger Zeilen, sparst dir das mit den Markos und das hinzufügen / entfernen weiterer Teams (im Allgemeinen die Wartbarkeit) erleichtert sich deutlice

    Danke dir schonmal dafuer. So werde ich definitiv viele hundert Zeilen an Code einsparen.
    Wie ist es jedoch am effizientesten die Strings in den Arrays zu speichern? Genau da scheiter ich gerade heh. Sowas habe ich nie zuvor probiert.


    Habe folgendes 2D Array dazu erstellt, wie packe ich am besten die Strings dort rein, und wie rufe ich diese ab? (Strings sind die TEAM_COLOR_TAG Werte) Bspw. per strcpy?


    TEAMSIZE ist maximal 6, je nachdem wieviele Teams ich eingestellt habe.

    C
    new TeamColorTags[TEAMSIZE][];
  • Du kannst das so schreiben:



    Weiß nicht, was du mit der value als Parameter vor hast.


    Es ist besser vor der Schleife einmal den String zu formatieren, ansonsten wird er bei jedem durchlauf formatiert, das ist ja ineffizient.


    TeamsAlive(true) gibt hoffentlich 0 als ersten Index zurück :)

    ast2ufdyxkb1.png


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

  • Alles klar, werde ich mal probieren!
    Nun ein anderes kleines Problem.
    Habe 2 gloable Variablen welche ich nicht mehr nutze, welche nirgendwo gebraucht werden, und deshalb warnings bringen.
    Wenn ich diese streiche schmiert jedoch der Compiler immer ab, wie geht man da bei der Fehlersuche am besten vor?
    Weil die werden letztendlich nur einmalig im Script genutzt, undzwar da wo ich die definiere.

  • Danke dir, der Fehler ist weg. Jedoch muss ich mal den Gamemode komplett auf den Kopf stellen, denn jegliche Aenderungen an den forwards und Variablen, egal ob hinzufuegen oder entfernen fuehrt zu einem crashen des Compilers :D


    //edit: Sehe gerade, wenn ich #include <YSI\y_ini> von meinem Mode streiche kackt der Compiler ab, ohne das zu streichen geht er ohne Fehler durch heh.
    Die einzige Funktion die ich zu nutzen scheine ist strcpy.


    //edit2: Habe gerade mal eine andere strcpy Funktion direkt im Script implementiert, aber auch dann schmiert der Compiler ab. Wird vielleicht irgendwas aus den YSI Bibliotheken genutzt was ich nicht weiss?

    Einmal editiert, zuletzt von Sub Royal ()

  • //edit2: Habe gerade mal eine andere strcpy Funktion direkt im Script implementiert, aber auch dann schmiert der Compiler ab. Wird vielleicht irgendwas aus den YSI Bibliotheken genutzt was ich nicht weiss?

    Check dein Skript evtl mal auf Klammerfehler.


    Ansonsten kann es gut sein, dass ysi Probleme macht, bin mir grad gar nicht sicher, ob du dafür inzwischen schon den Zeex Compiler verwenden musst...

    ast2ufdyxkb1.png


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

  • Moin!


    Ich hätt jetzt ne Lösung wie ich das mache mit den mehreren Verwalter Rängen.


    Verwalter1
    Verwalter2
    Verwalter3
    Verwalter4


    Als Spalten in der DB



    /makeadmin SpielerID Verwalter 1 - 4 Rang 1 -7


    Wie kann ich das machen das ich den Rang in einer der 4 Veralter Spalten setze und wenn zb in der ersten Spalte er den Rang 4 schon hat dass ich diesen in keienr anderen vergeben kann?

  • Danke euch!
    Habe nun noch eine kleine Sache.
    Habe hier den Teil dank @Kaliber, mit welchem ich jetzt mein Scoreboard machen kann.
    Aber wie packe ich das ganze vernuenftig in den Dialog?


    Ich will dort nur die Spieler angeben die ich auch drin habe, also wenn ich bspw. nur 2 Spieler habe, soll in dem String kein 3rd place etc sein.
    Dementsprechend faellt ja auch abhaengig von der Spieleranzahl die Anzahl an Arrayeintraegen niedriger aus die ich in Format reinpacke.


    Versteht man das was ich vor habe?
    Ist das eventuell zu aufwaendig umzusetzen?


    Eine Idee waere fuer jeden Platz einen eigenen String zu machen, und dann in nem Switch case zu schauen wieviele Spieler tatsaechlich drin sind, und dementsprechend fuer jeden Fall eine eigene Format Linie.


    Einmal editiert, zuletzt von Sub Royal ()

  • Wie kann ich das machen das ich den Rang in einer der 4 Veralter Spalten setze und wenn zb in der ersten Spalte er den Rang 4 schon hat dass ich diesen in keienr anderen vergeben kann?

    z.B. so:




    Ist das eventuell zu aufwaendig umzusetzen?

    Kannst es so machen:



    ast2ufdyxkb1.png


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

  • Danke!


    Mein /makeverwalter sieht aktuell so aus.



    ocmd:makeverwalter(playerid, params[])
    {
    //if(SD[playerid][pEingeloggt] == 0)return SCM(playerid, GRAU, "Du bist nicht eingeloggt!");
    new pID, verwid, string[128];
    if(!iPAA(playerid,5))
    {
    if(sscanf(params, "ui", pID, verwid))return makeadmin;
    //if(adminid < 2)return SCM(playerid, GRAU, "Du kannst nur ab Rang 2 vergeben.");
    if(IPN(pID))return 1;
    //if(IsPlayerNPC(pID))return 1;
    //if(!Eingeloggt[pID])return SCM(playerid, GRAU, "Dieser Spieler ist nicht eingeloggt!");
    //if(SD[pID][pIntro] < 1)return SCM(playerid, GRAU, "Der Spieler ist noch im Tutorial.");
    if(verwid == 0){
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter] = verwid;
    format(string, sizeof(string), "Du hast %s %s aus dem Teamposten %s entlassen", string,SD[pID][pName], string);
    SCM(playerid, BLAU, string);
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter] = verwid;
    format(string, sizeof(string), "%s %s hat dir den Rang %s entzogenn!", string,SD[playerid][pName],GVRN(pID));
    SCM(pID, BLAU, string);
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter] = verwid;
    format(string, sizeof(string), "AdmCMD: %s %s hat %s %s den Rang %s entzogen!", string,SD[playerid][pName],string, SD[pID][pName],GVRN(pID));
    SAM(BLAU, string);
    SD[pID][pVerwalter] = 0;
    SUS(pID);
    return 1;
    }
    if(verwid < 1 || verwid > 7)return adminrangnichtexistent;
    format(string,sizeof(string), GVRN(pID));
    SD[pID][pVerwalter] = verwid;
    format(string, sizeof(string), "Du hast %s %s den Teamrang %s gegeben", string,SD[pID][pName], GVRN(pID));
    SCM(playerid, BLAU, string);
    format(string, sizeof(string), "%s %s hat dir den Teamrang %s gegeben",GVRN(playerid),SD[playerid][pName],GVRN(pID));
    SCM(pID, BLAU, string);
    format(string,sizeof(string), GVRN(pID));
    SD[pID][pVerwalter] = verwid;
    format(string, sizeof(string), "AdmCMD: %s %s hat %s %s zum %s ernannt.",string, SD[playerid][pName],string, SD[pID][pName], GVRN(pID));
    SAM(BLAU,string);
    SUS(pID);
    return 1;
    }
    else {SCM(playerid, GRAU, "Du hast nicht genügend Rechte für diesen Befehl.");}
    return 1;
    }


    Wo müsste ich da deinen letzten Code einsetzen? Brauch ich da nicht irgendwo pVerwalter1 - pVerwalter4?