Beiträge von Jeffry

    Sorry, ich bin erst jetzt dazu gekommen mir dein Anliegen anzuschauen.

    Undzwar möchte ich ein Dynamisches Helpsystem schreiben, jedoch sitze ich momentan auf dem Schlauch.

    Ich verstehe nicht ganz, was du damit überhaupt bezwecken willst. Dynamisch ist es, wie oben schon gesagt, nicht.


    So wie es für mich aussieht willst du eine Liste erstellen, die die Befehle in Kategorieren sortiert enthält.
    Daher die Frage: Sollen diese Befehl immer nur Text anzeigen? Wenn ja, dann ließe sich da etwas wirklich dynamisches erstellen. Prinzipiell auch wenn die Befehle andere Dinge tun sollen, aber das macht es weitaus komplizierter.

    Sorry, ich bin erst jetzt dazu gekommen dir zu antworten.



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

    Nein, das würde gar nicht funktionieren, da sich der Wert ja niemals ändert.



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

    Das ist mir auch unklar.
    Kannst du bitte nochmal den aktuellen Code posten? Ich nehme an du hast bestimmt seit gestern etwas geändert.

    Das Laden scheint zu funktionieren.
    Danach stürzt der Server ab, warum kann ich dir nicht sagen, da:
    [16:37:31] [debug] Server crashed due to an unknown error


    Dazu kann man leider nichts sagen, außer, dass es anscheinend vom MySQL Plugin kommt.
    Was du eventuell versuchen kannst ist, den MySQL Code auf das R5 umzuschreiben.
    Hier der Download dazu: MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)


    Die Funktionen sind bei dem Plugin nur geringfügig anders, daher hält sich der Aufwand in Grenzen.

    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))

    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.

    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.

    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;

    Welche MySQL Version nutzt du denn?
    Nutzt du MySQL auf einem eigenen Server, oder auf einem Host mit SA-MP Control Panel und damit verbundenem MySQL User?


    Ich kann dir eigentlich nur empfehlen, die neuste Version zu nutzen.
    Dazu kann ich dich an dieses Tutorial verweisen, das kannst du Schritt für Schritt durchführen, dann klappt das mit der MySQL Verbindung auch:
    [jTuT] MySQL R39-3 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

    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!");
    }

    Super! :)

    Eine letzte Frage hätte ich noch und zwar das geteilt durch gilt nur für vorne wenn ich z.B. den Kofferraum berechnen will muss ich mal nehmen?

    Nein, dafür musst du -(Y/2) nehmen, da es auch die Hälfte der Fahrzeuglänge ist, nur eben nach hinten.


    Oder alternativ:
    stock GetPosHinterVeh(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
    {
    new Float:a;
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    x += (-dist * floatsin(-a, degrees));
    y += (-dist * floatcos(-a, degrees));
    return true;
    }


    Dann mit Y/2 als dist.

    Stimmt, die Länge ist Y.
    GetPosVorVeh(id, X/2, X, Y, Z);
    zu:
    GetPosVorVeh(id, Y/2, X, Y, Z);


    Dann dürfte es klappen.



    EDIT:
    Mir ist noch etwas aufgefallen, bei der Funktion:
    Dort muss die Model ID rein, nicht die Vehicle ID, also damit den Befehl so:
    if(strcmp(cmd, "/test", true) == 0)
    {
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)
    {
    new Float:X, Float:Y, Float:Z;
    GetVehicleModelInfo(GetVehicleModel(id), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); //Model ID hier
    GetPosVorVeh(id, Y/2, X, Y, Z);
    if(IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))
    {
    SendClientMessage(playerid, COLOR_WHITE, "Motorhaube");
    return 1;
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht in der Nähe eines Fahrzeuges.");
    return 1;
    }

    Dort wo du bei GetPosVorVeh 50 stehen hast muss Y/2 rein.
    Beachte aber, dass der Wert von Y den GetVehicleModelInfo zurück gibt von GetPosVorVeh überschrieben wird.
    Das GetPosVorVeh muss übrigens nicht in einem if-Statement stehen, das gibt immer true zurück.



    Ändere aber:
    if(GetClosestVehicleID(playerid, 500))
    zu:
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)



    Sprich:
    if(strcmp(cmd, "/test", true) == 0)
    {
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)
    {
    new Float:X, Float:Y, Float:Z;
    GetVehicleModelInfo(GetVehicleModel(id), VEHICLE_MODEL_INFO_SIZE, X, Y, Z);
    GetPosVorVeh(id, Y/2, X, Y, Z);
    if(IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))
    {
    SendClientMessage(playerid, COLOR_WHITE, "Motorhaube");
    return 1;
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht in der Nähe eines Fahrzeuges.");
    return 1;
    }

    Mit dieser Funktion kannst du das nächste Fahrzeug zum Spieler herausfinden:
    stock GetClosestVehicleID(playerid, Float:dist = 10000.0) //©Jeffry
    {
    new Float:tmp, Float:x, Float:y, Float:z, id = INVALID_VEHICLE_ID;
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    if(GetVehiclePos(i, x, y, z))
    {
    tmp = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(tmp <= dist)
    {
    dist = tmp;
    id = i;
    }
    }
    }
    return id;
    }


    Die ID kannst du dann nehmen, und die Größe des Fahrzeugs mit GetVehicleModelInfo berechnen.
    Die Größe nimmst du dann geteilt durch 2 als dist in dieser Funktion:
    stock GetPosVorVeh(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
    {
    new Float:a;
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    x += (dist * floatsin(-a, degrees));
    y += (dist * floatcos(-a, degrees));
    return true;
    }


    Dann kannst du mit dem Rückgabewert von x, y, z ein IsPlayerInRangeOfPoint machen, mit dem Range 1 oder 2, je nach dem wie viel Abstand du erlauben willst.

    Mache es so:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    new string[128], Float:pos[3];
    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
    Spieler[playerid][pTot] = 1;
    Spieler[playerid][pTotUnix] = 120;
    Spieler[playerid][pTotX] = pos[0];
    Spieler[playerid][pTotY] = pos[1];
    Spieler[playerid][pTotZ] = pos[2];
    Spieler[playerid][pTotWorld] = GetPlayerVirtualWorld(playerid);
    CreateToten(playerid);
    SetMoney(playerid,Spieler[playerid][pMoney]+100);
    Spieler[playerid][pSpawned] = false;
    Spieler[playerid][pDuty] = false;
    if(pCurrentCall[playerid] != -1)
    {
    if(IsPlayerConnected(pCurrentCall[playerid]) && Spieler[pCurrentCall[playerid]][pLoggedIn])
    {
    SendClientMessage(pCurrentCall[playerid], COLOR_GREY, "** Die Verbindung wurde unterbrochen ...");
    pPhoning[pCurrentCall[playerid]] = 0;
    pPayGuthaben[playerid] = 0;
    pPayGuthaben[pCurrentCall[playerid]] = 0;
    pCurrentCall[pCurrentCall[playerid]] = -1;
    pCurrentCall[playerid] = -1;
    pPhoning[playerid] = 0;
    }
    }
    pPhoning[playerid] = 0;
    pPayGuthaben[playerid] = 0;
    pPayGuthaben[pCurrentCall[playerid]] = 0;
    pCurrentCall[playerid] = -1;
    if(Spieler[playerid][pJailed] == 1)
    {
    Spieler[playerid][pTot] = 0;
    Spieler[playerid][pTotUnix] = 0;
    return 1;
    }
    Spieler[playerid][pDeaths] ++;
    new ort[36];
    GetPlayer2DZone(playerid, ort, 36);
    format(string, sizeof(string), "* %s ist in %s gestorben. Zum Orten tippe /revivefind %d!", GetName(playerid), ort, playerid);
    SendFraktionMessage(3, COLOR_YELLOW, string);
    if(killerid != INVALID_PLAYER_ID)
    {
    Spieler[killerid][pKills] ++;
    if(Spieler[killerid][pFraktion] == 1)
    {
    if(Spieler[playerid][pWanteds] > 0)
    {
    Spieler[playerid][pTot] = 0;
    Spieler[playerid][pTotX] = 0.0;
    Spieler[playerid][pTotY] = 0.0;
    Spieler[playerid][pTotZ] = 0.0;
    Spieler[playerid][pTotUnix] = 0;
    Spieler[playerid][pTotWorld] = 0;
    GameTextForPlayer(killerid, "~w~Gesuchten ~g~verhaftet", 3000, 6);
    if(Spieler[killerid][pFraktion] == 1)format(string, sizeof(string), "HQ: Officer %s hat %s verhaftet, erschossen, over.", GetName(killerid), GetName(playerid));
    SendFraktionMessage(1, COLOR_COP_MELDUNG, string);
    Spieler[playerid][pJailed] = 1;
    Spieler[playerid][pJailTime] = 240*Spieler[playerid][pWanteds];
    Spieler[playerid][pWanteds] = 0;
    UpdateWantedTD(playerid);
    Spieler[playerid][pDeaths] ++;
    Spieler[playerid][pJailVisits] ++;
    }
    }
    }
    return 1;
    }

    Poste bitte mal deine isPlayerInFrakt Funktion, oder einen Befehl/Code in dem man die Variable sieht, in der der Fraktionswert pro Spieler gespeichert ist.