DamageStatus

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
  • Guten Abend Breadfish-Community,


    im Sammalbeitrag der Scripting Base hatte ich nachgefragt wie das Callback heißt um den Fahrzeugschaden abzurufen.
    @Jeffry schrieb mir das der Callback GetVehicleDamageStatus heißt.


    Ich versuche per Befehl aufzubauen das ich per Dialogfenster die Angaben ansehen kann.
    Vermutlich habe ich wieder einen kleinen Denkfehler...



    Im Wiki stand als Beispiel:


    Code
    new panels, doors, lights, tires;
    GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
    printf("Vehicle Status : [Panels] : %d - [Doors] : %d - [Lights] : %d - [Tires] : %d",panels,doors,lights,tires);


    Was ich nicht verstehe ist, wenn das Fahrzeug keinen Schaden hat wird überall 0 ausgeschrieben und in der Konsole geprintet.
    Sobald ein beliebiges Fahrzeug schaden hat wird das nicht aktualisiert.
    Ich vermute das es ein Denkfehler ist...
    ( Kenne dieses Callback noch nicht, ich entschuldige mich falls ich da was falsch aufgerufen habe... )


    Bitte um Hilfe.
    Vielen Dank im vorraus :)

  • @Whice., dank dir, stimmt hab ModelID und VehicleID vertauscht :D .


    Klappt jetzt einwandfrei vielen Dank :)
    Eine kleine Frage hätte ich diesbezüglich und zwar wenn das Fahrzeug einen Schaden hat wird da Float werde ausgegeben?
    Weil wenn ich Interger als Platzhalter habe bekomme ich einige Zahlen ausgeschrieben ^^

    • Offizieller Beitrag

    The second bit stores whether the door is damaged(1) or not(0) (If you want a damaged door to turn normal you have to remove and re-attach it undamaged)

    Das heißt du brauchst den 2 bzw 3 bit



    Also wie auch in dem Beispiel:


    00000001 00000010 00000011 00000100

    Wäre im 2 bit "00000010" die tür beschädigt, also kannst du das für die rechte und linke (2 & 3) Bit abfragen

  • Nutze den Code aus dem Beispiel (https://wiki.sa-mp.com/wiki/DoorStates)


    enum Door
    {
    DOOR_HOOD,
    DOOR_TRUNK,
    DOOR_DRIVER,
    DOOR_PASSENGER
    }

    enum DoorState(<<= 1)
    {
    IS_OPENED = 1,
    IS_DAMAGED,
    IS_REMOVED
    }

    stock GetDoorState(doorStates, Door:door, DoorState:doorState)
    return (doorStates >>> (8 * door)) & doorState;


    new panels, doors, lights, tires;
    GetVehicleDamageStatus(vehicleid,panels,doors,lights,tires);


    // simple
    if(GetDoorState(doors, DOOR_DRIVER, IS_DAMAGED)) //<= das ist was du benötigst
    {
    SendClientMessage(playerid, -1, "The driver door of your vehicle is damaged!");
    }


    // or even combined
    if(GetDoorState(doors, DOOR_HOOD, IS_OPENED | IS_DAMAGED))
    {
    SendClientMessage(playerid, -1, "The hood of your vehicle is both opened and damaged!");
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Fehlendes Komma im Beispielcode.

  • Nutze den Code aus dem Beispiel (https://wiki.sa-mp.com/wiki/DoorStates)


    enum Door{ DOOR_HOOD, DOOR_TRUNK, DOOR_DRIVER DOOR_PASSENGER} enum DoorState(<<= 1){ IS_OPENED = 1, IS_DAMAGED, IS_REMOVED} stock GetDoorState(doorStates, Door:door, DoorState:doorState) return (doorStates >>> (8 * door)) & doorState;


    new panels, doors, lights, tires;GetVehicleDamageStatus(vehicleid,panels,doors,lights,tires); // simpleif(GetDoorState(doors, DOOR_DRIVER, IS_DAMAGED)) //<= das ist was du benötigst{ SendClientMessage(playerid, -1, "The driver door of your vehicle is damaged!");}// or even combinedif(GetDoorState(doors, DOOR_HOOD, IS_OPENED | IS_DAMAGED)){ SendClientMessage(playerid, -1, "The hood of your vehicle is both opened and damaged!");}

    bezüglich habe ich eine Frage und zwar ich habe den Stock nicht unter dem Enum gesetzt und beim compilen habe ich folgenden Warning erhalten:
    warning 213: tag mismatch


    Zeile:

    Code
    return (doorStates >>> (8 * door)) & doorState;


    Muss dieser Stock sofort unter dem Enum?

  • Habe es bei mir ausprobiert, ich bekomme die Warnung ebenfalls. Ich kann nicht verstehen, wie sowas im Wiki stehen kann und darf.
    Zudem gibt das enum "Door" auch Errors aus, da ein Komma fehlt, nach dem dritten Eintrag. Ich habe das in meinem Post ausgebessert.


    Versuche den Stock mal so:
    stock GetDoorState(doorStates, Door:door, DoorState:doorState)
    return (doorStates >>> (8 * _:door)) & _:doorState;

  • @Jeffry:


    Jetzt habe ich auch keine Warnings erhalten jedoch wenn ich im Fahrzeug bin und jetzt den Befehl eingebe um im Dialogfenster es auszugeben wird nichts ausgeschrieben...


    Folgender Code:


    Code
    new panels, doors, lights, tires;
    GetVehicleDamageStatus(GetPlayerVehicleID(playerid),panels,doors,lights,tires);
    new tuerinfo[100], str1[145];
    if(GetDoorState(doors, DOOR_DRIVER, IS_DAMAGED))  
    {
          tuerinfo = "Fahrertür";
    }
    format(str1, sizeof(str1), "{FFFFFF}Fahrzeugname:\t%s\nPanels:\t%d\nTüren:\t%s\nScheinwerfer:\t%s\nReifen:\t%d", VehicleName[GetVehicleModel(GetPlayerVehicleID(playerid))-400], panels, tuerinfo, lights, tires);
    ShowPlayerDialog(playerid, DIALOG_VEHINFO, DIALOG_STYLE_MSGBOX, "Schaden", str1, "Schließen", "");


    Was hast du eigentlich beim Stock verändert?

  • Ist deine Fahrertür auch beschädigt?
    Versuche es eventuell auch mal so, zum Test:
    if(GetDoorState(16909060, DOOR_DRIVER, IS_DAMAGED))


    Bei mir wird dann ausgegeben, dass die Türe beschädigt ist. Das ist das Beispiel aus dem Wiki.


    Falls das geht, lass dir den Wert von "doors" in einem print ausgeben, oder direkt im Dialog, mit %d.

  • Ich habe das aus dem Beispiel genommen.
    Die Zahl kannst du mit dem in Windows mitgelieferten Rechner von Binär zu Dezimal umwandeln. Allerdings bringt dir das ja nichts, der Code soll das ja machen.
    Lass dir daher mal den Wert, den "doors" bei dir hat, ausgeben. Den kannst du dann als Binärwert umwandeln (Rechner) und dann prüfen, ob das richtige Bit eine 1 hat, oder nicht. Poste die Zahl gegebenenfalls hier.

  • Ich habe das aus dem Beispiel genommen.
    Die Zahl kannst du mit dem in Windows mitgelieferten Rechner von Binär zu Dezimal umwandeln. Allerdings bringt dir das ja nichts, der Code soll das ja machen.
    Lass dir daher mal den Wert, den "doors" bei dir hat, ausgeben. Den kannst du dann als Binärwert umwandeln (Rechner) und dann prüfen, ob das richtige Bit eine 1 hat, oder nicht. Poste die Zahl gegebenenfalls hier.


    Gut ich versuchs mal...
    Also was ich jetzt herausfinden möchte ist die Beifahrertür...


    Geprintet wird: 67108864
    im Rechner auf Binär umgerechnet: ‭0100 0000 0000 0000 0000 0000 0000‬
    Soweit kann ich folgen und muss ich hier was umrechnen?


    Das ist dann doch nur für dieses spiezielle Fahrzeug oder?

  • Wenn du die Beifahrer Türe herausfinden willst, dann musst du DOOR_PASSENGER anstatt DOOR_DRIVER nutzen.
    Versuche es damit mal, bei GetDoorState.
    "doors" kann dann wieder als erster Parameter stehen.


    if(GetDoorState(doors, DOOR_PASSENGER, IS_DAMAGED))

  • @Jeffry, ich weiß nicht warum aber wenn ich die eben geschriebene Funktion einbaue passiert garnichts, in der Konsole wird aber doors geprintet...
    Wenn ich dann

    Code
    if(GetDoorState(doors, DOOR_PASSENGER, IS_DAMAGED))


    zu


    Code
    else if(GetDoorState(67108864, DOOR_PASSENGER, IS_DAMAGED))


    schreibe funktioniert das...
    Bedeutet das jetzt das das in dem Fall nur für den Tow Truck funktionieren würde und für andere Fahrzeuge nicht?


    Wie gesagt ich check nicht warum wenn ich statt die Zahlenfolge einfach doors eintrage warum dann nichts passiert...