Matrixsystem für Busse

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
  • Hallo Leute,


    ich möchte gerne ein Matrixsystem für meine Linienbusse erstellen und da möchte ich gerne nachfragen, wie ich mehrere Matrixanzeigen den Bussen zuordnen kann? Ich möchte zum einen, dass ich die Matrix als Spieler ändern kann, als auch automatisch. Das heißt, beispielsweise wenn die Linie beendet ist, das die Matrix automatisch auf "Betriebsfahrt" springt.


    Würde mich über eine paar Codeschnipsel freuen, da die Anleitung im SAMP Wiki nicht wirklich ausfschlussreich ist. Das ist der Code den ich mir versucht habe zusammen zu basteln:

    bus01 = SetVehicleNumberPlate(AddStaticVehicleEx(431,1059.2396,-1614.5643,13.7857,89.9090,42,7,-1),"BUS 001");
    matrix_bus01 = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 1);
    Attach3DTextLabelToVehicle(matrix_bus01, bus01, 0.0, 0.0, 2.0);


    [...]


    ocmd:matrix(playerid,params[])
    {
    new matrixID, matrixtext, string[128];
    if(sscanf(params,"s[128]",matrixID,string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    //GetPlayerVehicleID(playerid);
    format(string,sizeof(string),"%s", matrixtext);
    Update3DTextLabelText(matrixID, 0xFFFFFFFF, matrixtext);
    return 1;
    }


    Fehlermeldung:
    [hide]
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(247) : warning 213: tag mismatch
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(248) : warning 213: tag mismatch
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(796) : warning 213: tag mismatch
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    3 Warnings.[/hide]

  • Oh mein Fehler, das ist noch vom Testen übrig geblieben. Natürlich sollte der Befehl die ID der Matrix von dem Fahrzeug, in dem der Spieler sich befindet selbst identifizieren. Da der Spieler in der Regel die Matrix ID garnicht weiß.

  • new bus01;
    new Text3D:matrix_bus01;


    public OnGameModeInit()
    {
    bus01 = SetVehicleNumberPlate(AddStaticVehicleEx(431,1059.2396,-1614.5643,13.7857,89.9090,42,7,-1),"BUS 001");
    matrix_bus01 = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 1);
    Attach3DTextLabelToVehicle(matrix_bus01, bus01, 0.0, 0.0, 2.0);
    }


    Habe den Fehler gefunden, hatte das "Text3D:" am anfang vergessen. Der Bus hat aber bisher immer noch keine Matrixanzeige.

    • Offizieller Beitrag

    Versuch es mal so:
    new bus01;
    new Text3D:matrix_bus01;


    public OnGameModeInit()
    {
    bus01 = CreateVehicle(431,1059.2396,-1614.5643,13.7857,89.9090,42,7,-1);
    SetVehicleNumberPlate(bus01, "BUS 001");
    matrix_bus01 = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 1);
    Attach3DTextLabelToVehicle(matrix_bus01, bus01, 0.0, 0.0, 2.0);
    }

  • String formatieren?
    Wo liegt das Problem, du möchtest manuell den Namen des Labels im Spiel ändern, hab ich das richtig verstanden?


    //Edit


    if(sscanf(params,"s",matrixtext))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    format(string,sizeof(string),"%s", matrixtext);
    Update3DTextLabelText(matrix_bus01, 0xFFFFFFFF, string);


    //Edit555

    KleineHilfe 2.0

    2 Mal editiert, zuletzt von YaBroo ()

  • GhostRider:


    Danke für die Hilfe, das habe ich schon verstanden und ist soweit auch kein Problem. Mein Problem liegt grade darin, dass das Script die Matrix ID automatisch ausliest, da ja mehrere Busse mit Matrix ausgestattet sind und nur die Matrix des Spielerbusses ausgetauscht werden soll.

    • Offizieller Beitrag

    Schau mal, so ist es besser, dann kannst du auch abfragen welche ID du änderst.
    new bus01; // Das bleibt
    new Text3D:matrix_bus[MAX_VEHICLES]; // Das änderst du


    public OnGameModeInit()
    {
    bus01 = CreateVehicle(431,1059.2396,-1614.5643,13.7857,89.9090,42,7,-1); // Bleibt
    SetVehicleNumberPlate(bus01, "BUS 001"); // Ebenso bleibt
    matrix_bus[bus01] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 1); // Hier setzt du die neue Variable ein
    Attach3DTextLabelToVehicle(matrix_bus[bus01], bus01, 0.0, 0.0, 2.0); // Hier setzt du die neue Variable ein
    }


    Update3DTextLabelText(matrix_bus[GetPlayerVehicleID(playerid)], GELB, "TExt"); // Und so kannst du abfragen welchen Bus bzw Label es ändern muss

  • Ich habe die neue Variable nun eingefügt und folgenden Befehl erstellt:


    ocmd:matrix(playerid,params[])
    {
    new matrixtext, matrix_bus, string[128];
    if(sscanf(params,"s",matrixtext))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    format(string,sizeof(string),"%s", matrixtext);
    Update3DTextLabelText(matrix_bus[GetPlayerVehicleID(playerid)], GELB, matrixtext); <<< Fehlehafte Zeile #815
    return 1;
    }


    Nun schmeißt er mir folgende Fehlermeldung raus:
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(815) : error 028: invalid subscript (not an array or too many subscripts): "matrix_bus"
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(815) : error 001: expected token: ";", but found "]"
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(815) : error 029: invalid expression, assumed zero
    C:\Users\marco\Downloads\samp03x_svr_R1-2_win32\gamemodes\gnampf.pwn(815) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.

  • So vielen Dank für eure Hilfe, das System funktioniert nun fast einwandfrei. Das enzige Problemchen, dass noch besteht ist, dass der erste Bus (im Script, nicht die ID) keine Matrixanzeige hat, alle anderen schon. Fehler gibt es beim Compilen keine.


    //--- BUSSYSTEM ---//


    new bus01, bus02, bus03, bus04, bus05, bus06;
    new Text3D:matrix_bus[MAX_VEHICLES];


    //--- LS BUSBAHNHOF --//


    bus01 = CreateVehicle(431,1059.2396,-1614.5643,13.7857,89.9190,42,7,-1);
    SetVehicleNumberPlate(bus01, "BUS 001");
    matrix_bus[bus01] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus01], bus01, 0.0, 5.6, 2.1);



    bus02 = CreateVehicle(431,1073.6803,-1614.6606,13.7627,88.6285,42,7,-1);
    SetVehicleNumberPlate(bus02, "BUS 002");
    matrix_bus[bus02] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus02], bus02, 0.0, 5.6, 2.1);

    bus03 = CreateVehicle(431,1087.7848,-1614.5278,13.7498,87.9257,42,7,-1);
    SetVehicleNumberPlate(bus03, "BUS 003");
    matrix_bus[bus03] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus03], bus03, 0.0, 5.6, 2.1);

    bus04 = CreateVehicle(431,1102.0215,-1614.5664,13.7515,89.7817,42,7,-1);
    SetVehicleNumberPlate(bus04, "BUS 004");
    matrix_bus[bus04] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus04], bus04, 0.0, 5.6, 2.1);

    bus05 = CreateVehicle(431,1117.3390,-1614.5463,13.7353,89.5024,42,7,-1);
    SetVehicleNumberPlate(bus05, "BUS 005");
    matrix_bus[bus05] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus05], bus05, 0.0, 5.6, 2.1);

    bus06 = CreateVehicle(431,1132.9104,-1614.5719,13.9049,89.3289,42,7,-1);
    SetVehicleNumberPlate(bus06, "BUS 006");
    matrix_bus[06] = Create3DTextLabel("BETRIEBSFAHRT", GELB, 0.0, 0.0, 0.0, 50.0, 0, 0);
    Attach3DTextLabelToVehicle(matrix_bus[bus06], bus06, 0.0, 5.6, 2.1);


    ocmd:matrix(playerid,params[])
    {
    new string[128];
    if(sscanf(params,"s[128]",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    format(string,sizeof(string),"%s", string);
    Update3DTextLabelText(matrix_bus[GetPlayerVehicleID(playerid)], GELB, string);
    return 1;
    }

    • Offizieller Beitrag

    Ich habe gerade bemerkt:
    ocmd:matrix(playerid,params[])
    {
    new string[128];
    if(sscanf(params,"s[128]",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    format(string,sizeof(string),"%s", string);
    Update3DTextLabelText(matrix_bus[GetPlayerVehicleID(playerid)], GELB, string);
    return 1;
    }
    bei if(sscanf(params,"s[128]",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    hast du wieder s[128] stehen,
    mach es so: if(sscanf(params,"s",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");

  • Wenn ich beim zweiten die 128 entferne, dann erscheint in der Blackbox beim Wechseln des Textes die Meldung "sscanf warning: string without a length are deprecated... ". Ich habe nur mal ein wenig rumprobiert und rausgefunden, dass wenn ich mehr Busse mit Matrixanzeigen erstelle, dass nicht alle angezeigt werden. Nach dem fünften Bus ist Schluss. In einem anderem Forum habe ich gelesen, dass man den 3D Text erst erscheinen/erstellen lassen soll, wenn der Spieler in der Nähe ist. Da müsste man mir nochmal bei helfen.


    Habe nun herausgefunden, dass die 3DTextLabels existieren und zwar findet man die fehlenden am absoluten Nullpunkt der Map. Gibt es vielleicht eine andere Möglichkeit diese an die Busse zu heften, als mit "attachtoobject" ?

    Einmal editiert, zuletzt von Gnampf ()

  • Ich habe gerade bemerkt:


    bei if(sscanf(params,"s[128]",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");
    hast du wieder s[128] stehen,
    mach es so: if(sscanf(params,"s",string))return SendClientMessage(playerid,GRAU,"Benutzung: /matrix [MATRIXTEXT]");


    Das mit "[128]" ist bei sscanf2 erforderlich .. also der neueren Version

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