Beiträge von Jeffry

    Ja, da hast du die Variablen durcheinander gebracht, und mit dem falschen Index auf die Fraktions-Fahrzeuge zugegriffen.


    Schreibe das enum so:
    enum frakvehInfo{
    db_id,
    fid,
    frank,
    Float:fPosX,
    Float:fPosY,
    Float:fPosZ,
    Float:fPosA,
    fmodel,
    fcolor1,
    fcolor2,
    e_vehID
    };
    new fvInfo[MAX_FRAKVEH][frakvehInfo];


    Die Funktion sieht dann so aus:
    stock CreateFrakVehicle(frakid, model, color1, color2, Float:posX, Float:posY, Float:posZ, Float:posA)
    {
    for(new i=0; i<MAX_FRAKVEH; i++)
    {
    if(fvInfo[i][e_vehID] == 0)
    {
    new vehid = CreateVehicle(model, posX, posY, posZ, posA, color1, color2, -1);
    fvInfo[i][e_vehID]=vehid;
    vInfo[vehid][besitzer]=-1;
    vInfo[vehid][fveh] = 1;
    vInfo[vehid][vehicleTank] = 100;
    vInfo[vehid][carkey1] = -1;
    vInfo[vehid][carkey2] = -1;
    fvInfo[i][fPosX] = posX;
    fvInfo[i][fPosY] = posY;
    fvInfo[i][fPosZ] = posZ;
    fvInfo[i][fPosA] = posA;
    fvInfo[i][fcolor1] = color1;
    fvInfo[i][fcolor2] = color2;
    fvInfo[i][fmodel] = model;
    fvInfo[i][fid] = frakid;
    vInfo[vehid][vdamage] = 1000.0;
    fvInfo[i][frank] = 1;
    new query[256];
    format(query, sizeof(query), "INSERT INTO fcars (fid, frank, fmodel, fcolor1, fcolor2, fvehicleTank, fPosX, fPosY, fPosZ, fPosA, fvdamage) VALUES ('%i', '%i', '%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f', '%f')", frakid, 1, model, color1, color2, 100, posX, posY, posZ, posA, 1000.0);
    mysql_function_query(dbhandle,query,true,"OnFrakVehicleCreate","i",i);
    new string[128];
    format(string, sizeof(string), ""cBlue"%s [%i]", fInfo[frakid][fshort], fvInfo[i][db_id]);
    SetVehicleNumberPlate(vehid, string);
    return vehid;
    }
    }
    return -1;
    }


    Und das Callback sieht dann so aus:
    public OnFrakVehicleCreate(idx)
    {
    fvInfo[idx][db_id] = cache_insert_id(dbhandle); //Hier sollte die db_id gesetzt werden, das ganze funktioniert nur leider nicht.
    return 1;
    }


    Dann dürfte es klappen.

    ChristianW:
    Das wird dir Tag Mismatches geben, da du zum einen einen Float returnst ohne es im Kopf angegeben zu haben und zum anderen der Variable min (Integer) den 4. Index von Pos (Float) zuweist.

    Außerdem bekommst du die Distanz zum nächsten Stein, und nicht den nächsten Stein zurück. Das bringt relativ wenig. ;)
    Zudem musst du GetDynamicObjectPos verwenden, da er den Streamer verwendet.


    Cr1me: Es sei anzumerken, dass du "stein[44]" natürlich global unter den Includes deklarieren musst, aber ich denke das weißt du.

    Verwende diese Funktion:
    stock GetNearestStone(playerid, Float:dist)
    {
    new Float:x, Float:y, Float:z, Float:smallest = 9999999.9, id = -1, Float:tmp;
    for(new i=0; i<sizeof(stein); i++)
    {
    GetDynamicObjectPos(stein[i], x, y, z);
    tmp = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(tmp <= dist && tmp < smallest)
    {
    smallest = tmp;
    id = i;
    }
    }
    return id;
    }


    Dann siehst es so aus:
    new vehicleid = GetPlayerVehicleID(playerid);
    new id = GetNearestStone(playerid, 10.0); //Nächster Stein im Umkreis von 10 Meter
    if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht in der Nähe eines Steins!");
    AttachDynamicObjectToVehicle(stein[id], vehicleid, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0);

    Also, du kannst es folgendermaßen machen, indem du die gefahrene Distanz berechnest, jede Sekunde.


    Kopf:
    //________Taxi_________//
    new player_preis[MAX_PLAYERS];
    new player_taxi[MAX_PLAYERS];
    new Float:player_distance[MAX_PLAYERS];
    new Float:player_pos[MAX_PLAYERS][3];
    new pay_taxi[MAX_PLAYERS];
    new payed[MAX_PLAYERS];
    new oldpayed[MAX_PLAYERS];
    forward check_taxi(playerid,fahrerid,kosten);


    OnPlayerStateChange
    //_______Taxi System________//
    new frak = GetVehicleFrak(GetPlayerVehicleID(playerid));
    if(newstate == PLAYER_STATE_DRIVER && SpielerInfo[playerid][pTeam] == 4)
    {
    if(frak == 4)
    {
    player_taxi[playerid]=GetPlayerVehicleID(playerid);
    }
    }
    else if(newstate == PLAYER_STATE_PASSENGER)
    {
    if(frak == 4)
    {
    for(new t=0;t<MAX_PLAYERS;t++)
    {
    if(t != playerid)
    {
    if(GetPlayerVehicleID(playerid) == player_taxi[t])
    {
    GetPlayerPos(playerid, player_pos[playerid][0], player_pos[playerid][1], player_pos[playerid][2]);
    pay_taxi[playerid]=SetTimerEx("check_taxi",1000,1,"dd",playerid,t);
    return 1;
    }
    }
    }
    }
    }
    if(oldstate == PLAYER_STATE_PASSENGER || oldstate == PLAYER_STATE_DRIVER )
    {
    player_taxi[playerid]=0;
    payed[playerid]=0;
    oldpayed[playerid]=0;
    player_distance[playerid] = 0.0;
    return KillTimer(pay_taxi[playerid]);
    }


    Command:
    ocmd:fahren(playerid,params[])
    {
    if(SpielerInfo[playerid][pTeam] != 4 && SpielerInfo[playerid][pDuty] != 4) return SendClientMessage(playerid, error, "Du bist kein Taxifahrer oder nicht im Dienst!");
    new preis,say[80];
    if(sscanf(params, "d",preis)) return SendClientMessage(playerid, info,"Benutze: /fahren [PREIS]");
    else if(preis > 200 || preis < 1) return SendClientMessage(playerid, warn, "Preis muss zwischen 1$ und 200$ liegen!");
    else if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, error, "Du musst in einem Auto sitzen!");
    player_preis[playerid]=preis;
    format(say,sizeof say,"%s ist nun mit dem Taxi unterwegs |Preis: %d$|",SpielerName(playerid),player_preis[playerid]);
    SendClientMessageToAll(taxi,say);
    return 1;
    }


    Public:
    public check_taxi(playerid,fahrerid)
    {
    new say[50], kosten, Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);

    //Hier wird die zurückgelegte Distanz berechnet
    new Float:dist = floatsqroot(((player_pos[playerid][0]-x)*(player_pos[playerid][0]-x))+((player_pos[playerid][1]-y)*(player_pos[playerid][1]-y))+((player_pos[playerid][2]-z)*(player_pos[playerid][2]-z)));
    player_distance[playerid]+=dist;

    //Neue Position speichern
    player_pos[playerid][0] = x;
    player_pos[playerid][1] = y;
    player_pos[playerid][2] = z;

    //Und hier berechnen wir den Gesamtpreis der zu zahlen ist.
    //Falls das geteilt durch 100.0 nicht passt, erhöhe oder verkleinere es.
    //Pro Kilometer wird der player_preis drauf gerechnet, Grundpreis ist ebenfalls der player_preis.
    payed[playerid] = floatround(player_distance[playerid]/100.0) * player_preis[fahrerid] + player_preis[fahrerid];

    //Hier das Geld abziehen, wenn sich der zu zahlende Betrag ändert.
    if(payed[playerid] > oldpayed[playerid])
    {
    kosten = payed[playerid] - oldpayed[playerid];
    oldpayed[playerid] = payed[playerid];
    GivePlayerMoney(playerid,-kosten);
    GivePlayerMoney(fahrerid,kosten);
    }
    format(say,sizeof say,"~r~Kosten: ~w~%d $",payed[playerid]);
    GameTextForPlayer(playerid, say, 2000, 4);
    format(say,sizeof say,"~g~Gehalt: ~w~%d $",payed[playerid]);
    GameTextForPlayer(fahrerid, say, 2000, 4);
    return 1;
    }


    Ich hoffe, das hilft dir soweit.



    PS: Eigentlich heißt es ja "paid" und nicht "payed". ;)

    Das was mir auffällt ist, dass du einmal vInfo verwendest und einmal fvInfo. Bei deiner Funktion für die Fraktions-Fahrzeuge bringst du beide Varianten durcheinander.
    Außerdem greifst du beides mal mit der vehicleid auf den Index zu.


    Wie hast du denn vInfo und fvInfo deklariert?

    Was ist denn der Pawncode, ich weiss nicht was Pawn da benutzt


    Um diese Nachricht ging es:
    format(string, sizeof(string), "{FFFFFF}Willkommen bei {FFAA00}German Platin Reallife {FF0000}%s ID %d\n {FFFFFF}Um auf dem Server Spielen zu können {FFFFFF}benötigst du einen Account mit deinen Daten.\nGib dazu im nächsten Dialog ein passwort ein.", login,playerid);


    Also genau die 6 Zeichen die in der Box in der Mitte bei http://www.colorpicker.com/ stehen. ;)


    Für SendClientMessage schreibt man einfach 0xXXXXXXFF, wobei der grüne Teile die 6 Zeichen aus der Box sind.


    Siehe auch:
    http://wiki.sa-mp.com/wiki/Colour_Embedding

    Ein sehr schönes Tutorial. Meine Frage wäre jetzt, ob man mit einem ähnlichen Grundaufbau auch die Löhne einstellen könnte. Heißt die Löhne sind in einer Datenbank definiert, und man kann sie mit einem Befehl beliebig ändern, und es wird


    Danke.
    Ja, im Grundprinzip (Laden/Speichern) ist das genau gleich.


    Wie man von Jeffry kennt das reinste Copy & Paste 8)


    Danke dir. ;)



    Information:
    In den nächsten Tagen werde ich einige Änderungen am Tutorial vornehmen um es dynamischer zu gestalten.

    format(string, sizeof(string), "{FFFFFF}Willkommen bei {FFAA00}German Platin Reallife {FF0000}%s ID %d\n {FFFFFF}Um auf dem Server Spielen zu können {FFFFFF}benötigst du einen Account mit deinen Daten.\nGib dazu im nächsten Dialog ein passwort ein.", login,playerid);


    Du musst das 0x und den Alpha Channel weg lassen.

    @BlackAce:
    Da hast du Recht. ;)


    Einer der Gründe steht sogar gleich an erster Stelle in dem Plugin-Thread:

    Zitat

    Only 0.3z R4 supported, cross platform, both 500 & 1000 player version.


    Das macht einen Server extrem abhängig. Wem das egal ist für den ist das in Ordnung. Ich rate davon ab.