Beiträge von Hagi

    Ganz einfach. Du "sprengst" den Index eines Arrays.


    Wenn du ein Array anlegst, hat es immer eine genaue Anzahl an Indizes.


    Beispiel


    new array[4];


    Dieses Array hat 5 Zellen, wenn man so will: array[0].....array[4].


    Du greifst jedoch bei OnQueryFinish auf den Index 5 zu, wobei der maximale Index nur 4 beträgt. Du bist demnach "out of bounds" : "ausserhalb der Grenze" deines Arrays.


    Hau mal den Code aus OnQueryFinish, insebesondere Zeile 7791, raus. Dann schauen wir mal woran es liegt.

    Was für einen ID 0 Bug? Beschreib mal genauer. Meinst du dass bei manchen Methoden nur ID 0 bearbeitet wird?

    Du nimmst dir ne globale Variable, vornehmlich das SA:MP eigene Speichersystem (SetPVarInt()) und erhöhst dort immer die Variable beim falschen login.


    Wenn du es z.B. über Dialoge machst:


    //Bei OnDialogResponse


    if(passwortabfrage_richtig)
    {
    // login
    }
    else
    {
    SetPVarInt(playerid,"badlogin",GetPVarInt(playerid,"badlogin")++);
    if(GetPVarInt(playerid,"badlogin") >= 3) // beim/nach dem dritten fehlerhaften login
    {
    Kick(playerid);
    }
    else
    {
    // LoginDialog wird erneut aufgerufen
    }
    }

    Tread zwar schon erledigt, das hier möchte ich dennoch gerne anmerken:


    Tatächlich kann man das so kurz machen. Das Problem daran ist nur, dass man so von der Fahrzeugmitte ausgeht und das Marker rechts von der Fahrzeugmitte erscheint und nicht von der Beifahrertür (bzw. Beifahrersitz).


    Wenn ich jetzt aber mal meinen Code für die Position des Beifahrersitzes nehme:


    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehicleid,x,y,z);
    new Float:angle;
    GetVehicleZAngle(vehicleid,angle);
    new Float:offx,Float:offy,Float:offz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    offx = offx*-1;
    offy = offy*1;
    new Float:xg = x+offx;
    new Float:yg = y+offy;
    new Float:zg = z+offz;
    angle = angle+90.0;


    und diese Werte in deinen Code einsetze:


    xg += (2.5 * floatsin(-angle, degrees));
    yg += (2.5 * floatcos(-angle, degrees));


    SetPlayerCheckpoint(playerid, xg, yg, z, 3.5);


    Dann wird der Marker in Abhängigkeit vom Beifahrersitz erstellt. Zumindest in der Theorie.
    Das Problem ist nur, dass ich für den OffSet des Fahrersitzes nach:


    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    folgende Werte im Test erhalten habe:

    Code
    0.540000:-0.239999


    Wenn man das mal in ein Koordinatensystem einträgt ergeben die OffSetWerte von der Fahrzeugmitte gesehen jedoch den Beifahrersitz, warum auch immer. Demnach kann man sich das mit den Vektoren zur Berechnung des Beifahrersitzes an dieser Stelle schenken und direkt mit den offset Werten rechnen.



    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehicleid,x,y,z);
    new Float:offx,Float:offy,Float:offz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    new Float:angle;
    GetVehicleZAngle(vehicleid,angle);
    angle = angle+90.0+180.0;


    offx = x+offx;
    offy = y+offy;


    offx += (2.5 * floatsin(-angle, degrees));
    offy += (2.5 * floatcos(-angle, degrees));


    SetPlayerCheckpoint(playerid, offx,offy,z, 3.5);


    Habs getestet und es funktioniert. Dar Marker wird in Abhängigkeit vom Sitz erstellt.

    Also man könnte das ggf. folgendermaßen machen:


    Als Aufpunkt nehmen wir die x,y,z des Fahrzeugs.


    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehicleid,x,y,z);


    Dann benötigen wir die Angle des Fahrzeugs:


    new Float:angle;
    GetVehicleZAngle(vehicleid,angle);


    Jetzt benötigen wir noch die offSet Position des Fahrersitzes. Einfacher währe direkt der Beifahrersitz, das gibts als Parameter aber leider nicht.:


    new Float:offx,Float:offy,Float:offz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);


    Wir müssen jetzt , da wir von Achssymetrischen Fahrzeugen und von der Fahrzeugmitte als Referenz ausgehen, den Richtungsvektor noch um 90° drehen. Wir lassen hierbei mal z außer acht, da der Beifahrersitz sich auf gleicher Höhe wie der Fahrersitz befinden sollte. Unser Multiplikatiosnvektor heißst (-1/1).


    offx = offx*-1;
    offy = offy*1;
    offz = offz; // kann man auch wegllassen


    Beispiel. Unser offSet Vektor beträgt (-6/8 ) von der Fahrzeugmitte. Damit würde der Vektor auf einer 2d Ebene nach oben Links deuten. Wir wollen aber dass er nach oben rechts (Beifahrersitz) deutet:


    (-6/8 ) * (-1/1) = (6/8 ) -> Also oben rechts.


    So jetzt brauchen wir die Geradengleicheung nach: Aufpunkt + x*Richtungsvektor. x ist in diesem Falle 1, da wir genau den Beifahrersitz erreichen wollen. Bei x>1 würden wir praktisch über den rechten Front-Blinker schauen.


    new Float:xg = x+offx;
    new Float:yg = y+offy;
    new Float:zg = z+offz;


    Das sind jetzt die Koordinaten des Beifahrersitzes auf der realen Map (also von der tatächlichen Position abhängig.
    Diese Koordinate kann als neuer Aufpunkt gesehen werden, an den wir jetzt nur noch den Richtungsvektor zur Beifahrertür anhängen müssen.


    Diesen erhalten wir über die FacingAngle, also die Drehung des Autos.


    Gehen wir als Anfang von einem Vektor aus, der nach Norden schaut: (0/1). Die Z-Ebene kann hier wieder vernachlässigt werden.
    Diesen Vektor drehen wir jetzt um die entsprechende Gradzahl des Autos plus 90 Grad. Schaut das Auto also nach Norden (0°) wollen wir den Vektor um 90° (also nach rechts schauend) drehen.


    angle = angle+90.0;
    Angle beschreibt jetzt die zu vollziehende Rotation.
    Des Weiteren benötigen wir noch die Drehmatrix für unseren eben erstellten Vektor nach Norden.


    Diese sieht folgendermaßen aus:


    x' = [cos(angle) -sin (angle)]*x
    y' = [sin (angle) cos(angle) ]*y


    x' und y' sind beschreiben den neuen Vektor. Angle und x/y kennen wir bereits und können einfach eingesetzt werden.


    x' = [cos(angle) -sin (angle)]*0
    y' = [sin (angle) cos(angle) ]*1


    Leiten wir daraus nun ein LGS ab, erhalten wir folgende Berechnungen:


    x' = cos(angle)*0 + (-sin(angle)*1)
    y' = sin(angle)*0 + cos(angle)*1


    Adaptieren wir das in Pawn, sieht der Code folgendermaßen aus:


    new Float:x1 = floatcos(angle)*0+((-1*floatsin(angle))*1);
    new Float:y1 = floatsin(angle)*0+floatcos(angle)*1;


    Jetzt müssen wir nun noch unsere Gradengleichung aufstellen und wie sind fertig (auch mit den Nerven :D )


    Aufpunkt+Richtungsvektor*l


    (xg/yg)+l*(x1/y1);
    =>
    xg+l*x1
    yg+l*y1


    Jetzt erhalten wir den Punkt für den Marker, wenn wir einfach l einsetzen. Das kommt ganz darauf an wie breit das Auto ist, man kann aber testhalber einfach mal 2 einsetzen.


    new Float:markerx = xg+2*x1;
    new Float:markery = yg+2*y1;
    new Float:markerz = zg; // ist jetzt die Höhe des Fahrersitzes.




    Ich hoffe, dass das funktioniert, hab mir das mit der Drehmatrix auch grad erst angeschaut. Aber testen kann man es ja auf alle Fälle mal.


    edit:


    Ich hab das mal getestet und es funktioniert noch nicht ganz. Aber ich versuch das mal zu fixen. Der Marker wird auf jeden Fall beim Auto erstellt und verändert sich mit der Rotation des Fahrzeugs. Nur halt noch nicht hunderpro korrekt.

    Du müsstest in einem gewissen Zeitabstand (vllt ne halbe Sekunde?) die Geschwindigkeit eines jeden Polizeiautos abrufen und das ggf. (bei zu hoher Geschwindigkeit) wieder auf einen niedrigeren Wert setzen. Wie schon gesagt benötigst du dafür die Methoden:


    SetVehicleVelocity
    und
    GetVehicleVelocity


    edit:


    Daraus resultieren kann natürlich, dass sich das Fahrzeug manchmal nicht mehr flüssig lenken lässt. (Ich verweise hier mal auf ein Tempomatsystem zum halten der Geschwindigkeit eines bekannten Trucker SA:MP Servers)

    Und wenn schon, der Treadersteller hat nicht selber geschrieben, dass das Problem gelöst war. Ich gehe demnach davon aus, dass er es mit dem ersetzten des Zeichens versuchen wollte und deswegen das Thema als erledigt markiert hat, dann aber (im edit) gepostet hat, dass dies auch nicht funktioniert und vergessen hat das Thema wieder "dreizuschalten" (wenn das überhaupt möglich ist)


    Daher mein Post bezüglich des Fehlers, welcher darlegen sollte, dass das Problem ggf. durch einen anderen Fehler hervorgerufen wird, den es zu finden gilt.

    Also ich bin mir mittlerweile gar nicht mehr so sicher, dass das ß der Übeltäter sein soll, da ich ein paar Test gemacht habe und der Server nicht abgeschmiert ist, sondern ordentliche Ergebnisse ausgeworfen hat.


    main()
    {
    print("\n----------------------------------");
    print(" Chartest");
    print("----------------------------------\n");
    new charstring[128];
    format(charstring,sizeof(charstring),"Enthaelt ß");
    printf("%d",strcmp(charstring,"anotherstring with ß",true));
    printf("%d",strcmp(charstring,"Enthaelt ß",true));
    CallLocalFunction("OnDialogResponse","dddds",0,0,0,-1,"string with ß");
    }


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == 0)
    {
    printf("Dialogtest: %s für %d",inputtext,strcmp(inputtext,"string with ß",true));
    }
    return 1;
    }


    Log:

    Achso, das wusste ich nicht, ging auch aus dem ersten Post nicht so genau hervor, naja.


    Es kann schon sein, dass das ß den Server crasht, da dieses Zeichen Landesspezifisch ist und somit crahes hervor rufen kann.


    Idee zum Umgehen: Man könnte ja den String bereinigen (ß durch ss oder so ersetzen) und diese Strings vergleichen. Für den Output kann man dann ja immer noch den Ursprungs-String verwenden.

    Du benötigst zwei Teleports (SetPlayerPos() ggf. SetPlayerFacingAngle()) einen für drin und einen für draußen.
    Außerdem benötigst du ein auslösendes Ereignis (Position des Spielers oder Tastendruck o.ä) um den Spieler von draußen nach drinnen oder von drinnen nach draußen zu teleportieren.


    Und vergiss SetPlayerInterior nicht wenns nötig ist.

    Also mit einem 0815 RL/RP Server wird man meiner Meinung nicht weit kommen, wenn man nicht schon eine Community mitbringt oder das Script einfach mega geil ist.
    Ich weiß ehrlich gesagt nicht, ob ein Dorf RP/RL Script innovativ genug ist um die breite Masse darauf aufmerksam zu machen.
    Aber versuchen kann man es sicher, auch wenn ich glaube, dass es sehr schwer werden wird sich zu etablieren.

    Gefällt mir, da doch immer wieder Hashes und Verschlüsselungen durcheinander geworfen werden.
    Du erwähnst ja Salts zum "sichereren" Hashen. Du könntest deshalb, auch wenns nicht so wichtig ist, auch noch auf die Pepper und deren Unterschied zu Salts eingehen.
    Aber ansonsten ist das Turorial verständlich und sauber geschrieben.


    edit: lol ich seh grad, dass der Tread schon alt ist. Da hat Hami wohl was ausgegraben :D Naja, schaden tut es sicher nicht.

    Ich hätte eigentlich drauf wetten können, dass die Farbe kein String ist und das es dir eigentlich Warnings hätte aufwerfen müssen.
    Ansonsten scheint alles richtig. Hast du mal die IDs der Gangzone geloggt, ob die auch ordnungsgemäß erstellt werden(d.h. eine ID zurück gegeben wird)?