Beiträge von D4rkZ3r0x


    stock LoadAccount(playerid) {
    new Spielerdatei[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.ini",name);
    SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level"));
    GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
    SetPVarInt(playerid,"Adminlevel",dini_Int(Spielerdatei,"Adminlevel"));


    // -> Du musst hier den Skin von deiner Datei auslesen und nicht von den PVars, weil die setzt du ja hier erst
    SetPVarInt(playerid,"Skin",GetPVarInt(playerid,"Skin"));
    // Also anstatt der obrigen Zeile machst du folgendes:
    SetPVarInt(playerid, "Skin", dini_Int(Spielerdatei, "Skin"));


    // Dann wird noch der Skin gesetzt mit:
    SetPlayerSkin(playerid, GetPVarInt(playerid, "Skin")); // Hier kannst du GetPVarInt nutzen, weil du darüber die Spielervariable mit SetPVarInt schon gesetzt hast




    dini_IntSet(Spielerdatei,"Premium",GetPVarInt(playerid,"Premium"));
    SetPVarInt(playerid,"Fraktion",dini_Int(Spielerdatei,"Fraktion"));
    SetPVarInt(playerid,"Baned",dini_Int(Spielerdatei,"Baned"));
    if(GetPVarInt(playerid,"Baned")==1) {
    SendClientMessage(playerid,Rot,"Du bist vom Server gebannt.");
    Kick(playerid);
    }
    SetPVarInt(playerid,"loggedin",1);
    return 1;
    }


    Ich hoffe ich konnte helfen.
    - D4rk

    Items wird immer nur neu formatiert und am Ende einmalig übernommen.
    Probiere es mal wie folgt:



    new String[1024];
    if(mode == 1) {
    for(new i = 0; i<num_rows; i++) {
    new tempId = cache_get_field_content_int(i, "Id", Database);
    for(new x = 0; x<MAX_VEHICLES; x++) {
    if(VehicleInfo[x][vId] == tempId) {
    PlayerInfo[playerid][pCarselection][i] = x;
    format(string, sizeof(string), "%s\n%s (Id: %i)", VehicleNames[VehicleInfo[x][vModelId] - 400], VehicleInfo[x][vId]);
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_PV_1, DIALOG_STYLE_LIST, "{FFFFFF}Fahrzeuge", String, "Schließen", "Zurück");
    return 1;
    }

    Ich meinte, was genau der Fehler ist. Aber ich glaube du meinst, dass der OpferName nicht richtig angezeigt wird, schätze ich.
    Denn der wird nur in der Auftragssender-PVar gespeichert und du versuchst ihn in der Auftragsannehmer-PVar auszulesen.
    Also am besten global speichern, ich bevorzuge Enums.



    enum e_auftrag {
    bool:aktiv,
    name_sender[MAX_PLAYER_NAME],
    name_killer[MAX_PLAYER_NAME],
    name_angenommen[MAX_PLAYER_NAME],
    kopfgeld
    };
    new auftrag_data[MAX_AUFTRAG][e_auftrag];


    Wenn jemand einen Auftrag erstellt:

    for(new i; i<MAX_AUFTRAG; i++) {
    if(!auftrag_data[i][aktiv]) { // Prüfen, ob der i-te Auftrag noch nicht aktiv ist
    auftrag_data[i][aktiv] = true; // Ihn aktiv setzen
    auftrag_data[i][kopfgeld] = kopfgeld; // Kopfgeld setzen

    new tempStr[MAX_PLAYER_NAME];
    GetPlayerName(playerid, auftrag_data[i][name_sender], MAX_PLAYER_NAME);
    // Wenn man in das Input-Feld die ID eintippen soll:
    // Am besten irgendwo davor prüfen, ich mache es jetz hier um es nicht noch zu verkomplitzieren:
    if(strval(inputtext) == INVALID_PLAYER_ID) {
    auftrag_data[i][aktiv] = false;
    SendClientMessage(playerid, 0xFFFFFFFF, "FALSCHE ID");
    }
    GetPlayerName(strval(inputtext), auftrag_data[i][name_killer], MAX_PLAYER_NAME];
    return;
    }
    }
    // Wenn hier angekommen, sind alle Aufträge belegt}


    // Wenn jemand einen Auftrag annimmt:

    if(!strlen(auftrag_data[listitem][name_angenommen])) { // Kümmert sich bereits jemand um den Auftrag?
    GetPlayerName(playerid, auftrag_data[listitem][name_angenommen], MAX_PLAYER_NAME);


    // Beispiel einer Anzeige:
    new tempStr[64];
    format(tempStr, sizeof(tempStr), "Töte %s, du kriegst %d Kopfgeld!", auftrag_data[listitem][name_killer], auftrag_data[listitem][kopfgeld]);
    SendClientMessage(playerid, 0xFFFFFFFF, tempStr);
    }

    Hallo Community,


    ich hoffe, dass sich jemand mit der Materie MySQL auskennt und mir bei folgendem Problem helfen kann.
    Ich habe die Version R39-3 und bei mir wartet mysql_close(db); nicht, bis meine letzte mysql_tquery()
    erfolgreich abgeschlossen wurde.


    Ich weiß, dass es mal einen Parameter bool:wait in mysql_close gab in einer vergangenen Version, allerdings wurde der entfernt.
    Anscheinend wartet mysql_close jetzt automatisch darauf, dem ist bei mir aber nicht so.


    Zum Test habe ich mysql_close mal auskommentiert und siehe da, jetzt werden die Queries (die sich übrigens im OnGameModeExit-Callback befinden),
    abgeschlossen. Allerdings finde ich diese Lösung etwas unelegant und auf nicht-threaded Queries möchte ich auch nicht umsteigen, ganz zu schweigen von einer anderen mysql-Version.


    Hier noch der Code:

    public OnGameModeExit() {
    for(new i; i<sizeof(interior_data); i++) {
    new query[512];

    new
    Float:x = interior_data[i][interior_pos_int][0],
    Float:y = interior_data[i][interior_pos_int][1],
    Float:z = interior_data[i][interior_pos_int][2],
    Float:r = interior_data[i][interior_pos_int][3],

    intid = interior_data[i][interior_intid_int],
    locked = interior_data[i][interior_locked],
    construction = interior_data[i][interior_construction],
    accepted = interior_data[i][interior_accepted],
    index = interior_data[i][interior_id]
    ;

    // Ich zwischenspeichere die ganzen Werte, weil sonst die Formatierungszeile zu lang werden würde


    if(x == 0 && y == 0 && z == 0) break;

    mysql_format(db, query, sizeof(query), "UPDATE `interiors` SET `pos_int_x`='%f', `pos_int_y`='%f', `pos_int_z`='%f', `pos_int_r`='%f', `intid_int`='%i', `locked`='%i', `construction`='%i', `accepted`='%i', `label`='%s' WHERE `id`='%i'", x, y, z, r, intid, locked, construction, accepted, interior_data[i][interior_label], index);
    mysql_tquery(db, query);
    }
    //mysql_close(db);
    }

    new gLastCar[MAX_VEHICLES]; // Ein Array wird angelegt mit der Größe von den maximal erlaubten Fahrzeugen
    gLastCar[playerid] = 0; // Hier wird dem Index playerid (also dem Wert an der Stelle, der playerid entspricht), den Wert 0 zugewiesen, den du später auch ausgibst



    Aus dem Kontext erschließe ich, dass du nun das letzte Auto zwischenspeichern willst,
    um es dem Spieler ausgeben zu können. Dazu solltest du die maximale Array-Größe auf MAX_PLAYERS stellen.



    new gLastCar[MAX_PLAYERS];



    Außerdem solltest du gLastCar[playerid] nicht den Wert 0 zuweisen, da du dich sonst auch nicht wundern solltest,
    wenn dieser später ausgegeben wird.



    Also wenn der Spieler aussteigt solltest du die Fahrzeug-id speichern.
    Das machst du unter dem OnPlayerExitVehicle-Callback.



    public OnPlayerExitVehicle(playerid, vehicleid) {
    gLastCar[playerid] = vehicleid; // Setze das gLastCar mit dem Index (von) playerid auf vehicleid.
    }



    Nun sollte der Command problemlos den richtigen Wert ausgeben.

    Wie machst du was genau mit dem Opfername?
    Also ich sehe nur dass du ihn dort ausliest aus einer Spielervariable und ihn dann mit der Funktion SendeFraktions anscheinend ausgibst.

    Am besten am Anfang ein Array für alle Gangs anlegen,
    und dann nach dem Benutzen eines Befehls den Wert für den Index der jeweiligen Gang auf positiv setzen.
    Per Timer dann noch diesen für die jeweilige Gang zurücksetzen nach einer Stunde.



    #define MAX_GANGS 5 // Hier die Anzahl der Gangs in deinem Script
    new bool:gangwarRestricted[MAX_GANGS]; // Hier wird dann ein Array des Typs boolean definiert.


    cmd:invade(playerid, param[][], params) {
    new gang_id; // gang_id ist die Gang des Spielers
    if(gangwarRestricted[gang_id]) // Wenn es noch gesperrt wird, verhindern dass der Befehl ausgeführt werden darf
    return;
    // [[Hier dann der eigentliche Invade-Befehl ]] //
    gangwarRestricted[gang_id] = true; // Hier setzen wir den Wert des Arrays mit dem Index der Gang auf true, damit die Abfrage oben das nächste mal scheitert
    SetTimerEx("timer_gangwar", 1000*60*60, false, "i", gang_id); // Hier der Timer, der den Wert dann wieder zurücksetzt
    }


    forward timer_gangwar(gang_id);
    public timer_gangwar(gang_id) {
    gangwarRestricted[gang_id] = false;
    }


    Mit freundlichem Gruß,
    der D4rk

    Ups, ich habe auch noch 2 Fehler entdeckt :)
    Du benutzt anscheinend ocmd, dann anstatt dem cmd:hitman ein ocmd:hitman,
    und den Integer contracts kannst du entfernen, er wird nicht gebraucht.

    contractArray ist das Array wo die Aufträge gespeichert sind.
    Falls du noch keines definiert hast würde ich das am Besten irgendwo am Anfang vom Script machen.


    Und wenn ein Benutzer dann einen Auftrag erstellt fügst du es dem Array hinzu.

    #define MAX_CONTRACTS 5 // Maximale Anzahl an Aufträgen
    new contractArray[MAX_CONTRACTS][64]; // Hier wird dann das Array initialisiert (2-dimensional, da du einen String speichern willst)


    ocmd:hitman(playerid, params[]) {
    // Hier das sscanf-Zeug mit dem ich leider nicht mehr so vertraut bin da ich meinen eigenen Prozess gescriptet habe
    for(new i; i<MAX_CONTRACTS; i++) { // MAX_CONTRACTS durchlaufen
    if(!strlen(contractArray[i])) { // Prüfen ob der i-te Auftrag bereits belegt ist (ob der string eine länge hat)
    format(contractArray, sizeof(contractArray), "Auftrag %i", i); // Hier formatierst du dann den Auftrag mit der aktuellen Auftragsnummer oder halt irgendwie anders ^^
    break; // Wenn der Auftrag erstellt wurde können wir aufhören, die MAX_CONTRACTS durchzugehen
    }
    }
    }


    Du kannst das Array eventuell auch noch weiter dimensionieren wenn du noch weitere Sachen wie zum Beispiel Auftraggeber o.a. speichern möchtest.
    Ich hoffe damit kommst du einigermaßen zurecht :P

    Hallo,
    witzig, das gerade das Problem hier angesprochen wird, denn ich bin während des Scriptens auf ein ähnliches gestoßen.
    Allerdings habe ich es bei mir etwas dynamischer gestaltet, sodass die leeren Aufträge etc. nicht angezeigt wird, außer wenn diese erstellt wurden.


    Nichts desto trotz, hier mein Lösungsansatz:

    ocmd:hcomputer(playerid, params[]) {
    new string[128];
    for(new i; i<sizeof(contractArray); i++) {
    strcat(string, contractArray[i]); // Füge dem String den Inhalt von contractArray[i] hinzu
    strcat(string, "\n"); // Füge den String \n (Umbruch) hinzu
    }
    ShowPlayerDialog(playerid, DIALOG_HCOMPUTER, DIALOG_STYLE_LIST, "Hitware v0.1", string, "Okay", "Herunterfahren"); // Dann benutzt zu den String, um ihn als Liste im Dialog anzuzeigen
    }


    Mit freundlichem Gruß,
    der lange nicht aktive D4rk :)

    for(new i=0;i<sizeof(PolizeiAutos);i++) {if(GetPlayerVehicleID(playerid) == PolizeiAutos[i] && IsPlayerInRangeOfPoint(playerid,2,256.4681,69.5180,1003.6406)) {
    // code} else {SendClientMessage(playerid,Rot,"Du musst an der Su stehen oder in einem Streifenwagen sitzen!");}}


    Sollte funktionieren :)


    MfG
    D4rk