Beiträge von Sub Royal

    //EDIT: Hat sich erledigt, habe eine effiziente Loesung gefunden
    Ich nutze nun fuer jede Teamvariable, egal ob Bett, Farbe etc. ein eigenes Array, damit geht das deutlich simpler.
    Die Array Variante klappt prima.



    So, habe folgende Frage.
    Habe aktuell ein Kommando mit welchem ich ein Bett eines gegnerischen Teams vernichten kann, d.h. dass die BettID != gPlayerTeamSelection[playerid] ist.
    Dabei checke ich, dass das Bett nicht das Bett des eigenen Teams ist, und das Bett nicht bereits zuvor vernichtet wurde.


    Dabei habe ich aktuell diesen fetten klumpen, und den wuerde ich gerne reduzieren.



    Da habe ich versucht das ganze nun zu reduzieren, indem ich fuer die Bedobjekte ein Array erstelle, und da habe ich mir dann eine Funktion gebaut IsPlayerInRangeOfBed.



    C
    BedArray[FIRST_TEAM]= CreateObject(1794,268.1000100,1881.5000000,-31.4000000,0.0000000,0.0000000,0.0000000); //object(low_bed_3) (1) // Team Grey
    BedArray[SECOND_TEAM]= CreateObject(1798,434.5000000,2546.8999000,15.2000000,0.0000000,0.0000000,268.0000000); //object(swank_bed_1) (1) // Team Blue
    BedArray[THIRD_TEAM]= CreateObject(1801,-773.5999800,2421.3000000,156.1000100,0.0000000,0.0000000,0.0000000); //object(swank_bed_4) (1) // Team Red





    Aber geht das effizienter? Sollte ich die BED_STATEs eventuell auch in ein Array packen? Wie sollte das dann aufgebaut sein das Array? Eventuell ein Monodimensionales Array, bspw. BedStates[TEAMSIZE]?



    Das ist mein jetziger Ansatz, gefaellt mir aber noch nicht ganz, und ist noch nicht komplett fertig, weil ich da wieder tausende BED_STATE Abfragen haben werde.

    Jedoch muesste ich dann ueber CountDown die bedteamid die Teamid an CountDown, und von CountDown an BlowUpThisBed schicken.


    Bei BlowUpThisBed wuerde ich die teamid des Bettes uebergeben, und so ca. 90 Zeilen sparen.


    @Kaliber
    Es funktioniert, jedoch musst du mir mal erklaeren was es mit diesem @, und dem Funktionsaufruf da mitten drin auf sich hat :D


    Habe das nun so abgewandelt


    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.


    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?

    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.

    @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][];

    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.

    Ich erkenne den Sinn mancher Funktionen wie z.B. GetActiveTeamCount nicht. Poste uns doch den Inhalt dieser Funktionen damit wir tiefer in die Zusammenhänge deines Systems blicken könnten. Ich hätte einige verbesserungsansätze aber erkenne noch nicht ganz die tiefe des Codes und könnte somit versehentlich dein Code breaken.

    Alles klar!
    Habe hier mal den Gamemode drin.


    https://pastebin.com/M3LwExEQ


    Habe halt probiert moeglichst viele teambezogene Funktionen zu entwickeln, um besser mit Teams hantieren zu koennen im Script.


    Und meine GetActiveTeamCount Funktion welche checken soll ob in einem Team ein Spieler ist.



    Moin.
    Ich will bei mir ein Rundensystem einfuegen. In meinem Gamemode gibt es 3 Teams, und wenn in mindestens 2 Teams mindestens 1 Spieler ist, soll ein Countdown starten.
    Wenn zwischendurch Spieler rausgehen soll dieser wieder resettet werden.
    Wenn der Countdown von 60 auf 0 runtergezaehlt hat sollen die Spieler gespawnt werden, und die Runde soll gestartet werden.


    Oder gibt es anderen Vorschlaege?
    Weiterhin soll jeder User der nachher joint, automatisch dem Team TEAM_SPECTATOR zugewiesen werden, und die Spieler spectaten.


    Wenn ein Spieler rausgeht, und bspw. nur noch 1 Team da ist, soll FinishedGame() aufgerufen werden.




    Ist das hier logisch umgesetzt? Und wann rufe ich am besten die Funktion StartGame() auf? Oder periodisch mit Timer?
    Das ist mein bisheriger Ansatz







    Hier die Funktion welche erkennt wenn eine Runde beendet ist.
    Der rekursive Aufruf hier sinvoll?
    Es funktioniert zwar so wie ich will, ist aber jedoch ziemlich wartungsunfreundlich.