Damage status Pannels und Lights

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • ich erkenne gerade, dass man damit das auto mehr beeinflussen lkann als mit den params und als gescheiter rl server sollen diese sachen auch gespeichert werden. So z.b. muss man ein Auto nicht mehr aufbrechen wenn die tür eh schon offen steht.


    und bei den Panels, ich hab keine ahnung was das überhaupt ist und was das steuert, die lichter dass kann man sich noch denken :D.
    ya wie gesagt ich weis netmal was panels sind also interessiert es mich was ich damit steuern kann.

  • da ich letztens mich selber damit befasst habe, hier paar codeschnippsel von mir, sind momentan hauptsächlich für die reifen:
    stock DezimalToBinary(number)
    {
    new bool:check=false;
    new str[9];
    while(!check)
    {
    new num=number%2;
    number=floatround(number/2,floatround_floor);
    format(str,sizeof(str),"%d%s",num,str);
    if(number==0)
    {
    check=true;
    }
    }
    return strval(str);
    }


    stock CountTires(str[])
    {
    new i, count;
    while(i <= strlen(str))
    {
    if(str[i]=='0'){
    count++;
    }
    i++;
    }
    return count;
    }


    stock AddTire(str[],tires)
    {
    if(tires>=1)
    {
    for(new i=0;i<tires;i++)
    {
    new x=strlen(str)-1;
    while(x >= 0)
    {
    if(str[x]=='1'){
    str[x]='0';
    break;
    }
    x--;
    }
    }
    return BinaryToDezimal(str);
    }
    return -1;
    }


    stock RemoveTire(str[],tires)
    {
    if(tires>=1)
    {
    for(new i=0;i<tires;i++)
    {
    new x=strlen(str)-1;
    while(x >= 0)
    {
    if(str[x]=='0'){
    str[x]='1';
    break;
    }
    x--;
    }
    }
    return BinaryToDezimal(str);
    }
    return -1;
    }


    stock BinaryToDezimal(str[])
    {
    new count;


    new i=strlen(str)-1;
    new num=1;
    for(;i>=0;i--)
    {
    if(str[i]=='1')
    {
    count+=num;
    }
    num=num*2;
    }


    return count;
    }


    kann man aber auch für andere sachen benutzten.


    Nun, du könntest mit den Panels bei Flugzeugen die Tragflächen ausfallen lassen und und und.
    Oder wenn jemand gegen die Wandfährt und sein fahrzeug hat keinen stossdämpfer mehr, so bekommt das Fahrzeug mehr schaden.

  • Danke Sniper für die Funktionen kann ich alles nachvollziehen und was mit anfangen speziell mit der von/zu Convertierung.
    Also nun hab ich hier doch noch ein Problem bei den Fahrer und Beifahrertüren.


    Wenn ich den 1. Bit setze, (0001)so gehen die Türen auf, RICHTIG.
    Wenn ich den 2. Bit setze so gehen die Türen kaputt (0010) RICHTIG
    Wenn ich eine 3 Scheibe Binär: 0011 Sollten die Türen Kaputt und offen seit. Stattdessen sind sie einfach nur ofen und wie neu.
    Hab ich ein fehler in den Bytes. Die türen betreffen den 3 und 4. Byte


    {00000011 00000011} 00000000 00000000
    ^beide Türen
    1 Bit im Byte: Zustand = 1; Tür = auf;
    2. Bit im Byte: Zustand = 1; Tür = Kaputt;
    Beides zusammen sollte Offen und Kaput ergeben. Es ergibt nur offen.
    Die gesagte Zahl ist eine: 50528256

    Einmal editiert, zuletzt von carlos1710 ()

  • Hm, sollte eigendlich gehen, setzt du die doors direkt mit 50528256 oder benutzt du funktionen von mir?
    Wenn du die funktionen nutzt, setze mal die 50528256 automatisch


    edit:
    BTW: Habe herausgefunden, dass Panels mindestens 4 Bytes nutzt.
    Ein Fast vollständig zerstörtes Fahrzeug hat die Paneldaten:
    305988659
    was folgendem in Binär entspricht:
    00010010 00111101 00000100 00110011


    Ich denke, ich werde mir selber mal ne Doku für die Panels bauen :)

  • Ich habe nun beide Türen zerstört und dafür gesagt, dass sie offen sind. trotzdem ist der statur beider türen 0010 die Zahl: 33685504
    Motorhaube das selbe Problem, laut bit 0011 Offen und Kaputt. Ingame aber nur Offen.
    Türen kaputt nicht offen (0010) funktioniert.

    Einmal editiert, zuletzt von carlos1710 ()

  • musst du die vl. erst updaten auf kauput und dann mit einem kleinen timer updaten auf kauptt und offen? Hört sich für mich nach nen samp fehler an.

  • Wiso updaten auf Kaputt und offen meinst du das macht ein Unterschied wenn ich nun 0010 schreib und ne kurze zeit später ne 0011 rein schreib ?
    Wenn es ein Samp fehler ist wird das sicherlich in späteren Versionen gefixt, dann mach ich erstmal nichts.
    EDIT: Sniper, dein Algotithmus hat ein Bug. Er sagt mir war das die 3 eine 11 ist was stimmt aber die 33685507 ist keine 0010 0000 0010 0000 0000 0000 0001
    ^der muss wegen der 7 am Ende muss der Bit 1 sein.



    DezimalToBinary(number)
    {
    new bool:check=false;
    new str[64];//habe den string vergrößtert, bei dir gingen zahlen größer als 9 bit nicht mehr.
    while(!check)
    {
    new num=number%2;
    printf("%d num",num);
    number=floatround(number/2,floatround_floor);
    format(str,sizeof(str),"%d%s",num,str);
    if(number==0)
    {
    check=true;
    }
    }
    return strval(str);
    }
    Ich suche gerade den fehler doch versage ein bisschen.
    Nur als Bemerkung.

    Einmal editiert, zuletzt von carlos1710 ()


  • muss ich mal testen, kann aber etwas dauern.


    edit:
    habe es jetzt soweit gefixxt, stehe nun aber vor dem Problem, dass ein Intager keine so Große Zahl ausgeben kann, muss ich wohl leider mit dem übergeben eines Strings arbeiten...


    edit:
    So habs nun mit übergeben eines strings gemacht:
    stock DezimalToBinary(number,str[],len)
    {
    new bool:check=false;
    while(!check)
    {
    new num=number%2;
    format(str,len,"%d%s",num,str);
    number=number/2;
    if(number==0)
    {
    check=true;
    }
    }
    while(strval(str)<len)
    {
    format(str,len,"0%s",str);
    }
    return strval(str);
    }


    hier ein nutzungsbeispiel:


    new str[32];
    DezimalToBinary(33685507,str,32);
    printf("%d - %s - %d",33685507,str,BinaryToDezimal(str));

  • stock DezimalToBinary(number,str[],len)
    wiso machst du mit strval(str) aus dem string ein intger und returnst ihn wenn ein Intger für den Zahlenbereich eh zu klein ist und gibt es eine Möglichkeit den Intger unsignet zu machen?


    und warum setzt du an den anfang der zahl eine 0
    format(str,len,"0%s",str);


    //EDIT:
    Es funktioniert immernoch nicht.
    1. Stimmt die Zahl nicht
    2. Sobald der string größer wird als 50 --> 51 hängt sich die Funktion auf.

    2 Mal editiert, zuletzt von carlos1710 ()

  • ich setzte sowviele 0len am ende bis die länge des strings erreicht ist.
    Aus folgedem Grund.


    Ich nehme mal das beispiel Räder.
    Gehen wir davon aus das vordere rechte und das hintere rechte sind Platt (State 3):
    Denn gibt mir der Code Binär 11 zurück.
    Wenn ich jetzt jedoch wissen will in welchem Zustand das 3. Rad ist so sofählt mir eine Zahl, auch wenn diese eine 0 ist.
    Mit dieser Methode gehe ich sicher, dass ich wenn ich 4 Bits haben will, auch 4 Bits herausbekomme.
    Bei deinen sachen (door) wären es 32 Bits (4Bytes*8Bits).


    Zitat

    wiso machst du mit strval(str) aus dem string ein intger und returnst ihn wenn ein Intger für den Zahlenbereich eh zu klein ist und gibt es eine Möglichkeit den Intger unsignet zu machen?


    Ist im endeffekt noch nen überbleibsel aus dem Alten System, und kann für kleinere Zahlen genutzt werden
    edit: unsignet, ka ob das geht. nur wäre auch da iwann das Limit erreicht.


    zudem kannst du bei einem String ganz leicht einzelne Bits abfragen:


    if(Tires[1]=='0') etc.


    edit:

    Zitat

    1. Stimmt die Zahl nicht


    welche zahl hast du benutzt zum testen?
    Was hast du rausbekommen?

    Zitat

    2. Sobald der string größer wird als 50 --> 51 hängt sich die Funktion auf.


    Hm, wofür brauchst du mehr als 50? bisher weiss ich nur von 32 Bits in Sa:Mp Funktionen?
    Kann ich aber genr emal überprüfen.

  • so jetzt aber, die 0len waren nen problem, zudem hatte ich nen kleinen hirnaussetzer...


    stock DezimalToBinary(number,str[],len)
    {
    new bool:check=false;
    while(!check)
    {
    new num=number%2;
    format(str,len,"%d%s",num,str);
    number=number/2;
    if(number==0)
    {
    check=true;
    }
    }
    while(strlen(str)+1<len)
    {
    format(str,len,"0%s",str);
    }
    return strval(str);
    }


    hier ein nutzungsbeispiel:


    new str[33];//string muss immer ein bit größer sein, als bits rauskommen können für \0
    DezimalToBinary(33685507,str,33);
    printf("%d - %s - %d",33685507,str,BinaryToDezimal(str));

  • Is working
    Ich habe nun bei meinem Auto Fahrer und Beifahrertür aufgerissen nur wiso wird das nicht geloggt:


    Code:

    GetVehicleDamageStatus(car[i],Vehicle[i][Panels],Vehicle[i][Doors],Vehicle[i][Lights],Vehicle[i][Tires]);
    new str[33];
    printf("%d Panels %d Doors %d Lights %d Tires",Vehicle[i][Panels],Vehicle[i][Doors],Vehicle[i][Lights],Vehicle[i][Tires]);
    DezimalToBinary(Vehicle[i][Doors],str,33);
    printf("%d doors2 %d engine2",Vehicle[i][Doors],Vehicle[i][Engine]);
    printf("Zahl:%s c1:%c c2:%c c3:%c c4:%c",str,str[11],str[13],str[15]);


    ServerLog:

    Code
    [22:35:35] 0 Panels 0 Doors 4 Lights 0 Tires
    [22:35:35] 0 doors2 1 engine2
    [22:35:35] Zahl:0000000000000000000000000000000 c1:0 c2:0 c3:0 c4:r


    //push

    2 Mal editiert, zuletzt von carlos1710 ()


  • wo genau rufst du den code auf?
    Ich habe keine Ahnung ob es geloggt wird wenn ein spieler öffnet/Schliesst.
    Sorry für die späte antwort, dachte das wär erledigt.

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