Beiträge von Jeffry

    Kann ich eig neben den Marker Kordinaten nicht einfach bsInfo benutzen? mit den Interior Kordinaten?


    Nein, da der Index von dem Burger Shot Marker aus bdInfo aller Wahrscheinlichkeit nicht mit dem Index von bsInfo übereinstimmt (das sind ja 5 und 15 Indizies). Außer du hast die Burger Shots in der Datenbank direkt als erstes in die Tabelle eingetragen (Zeile 1 bis 5), dann würde es funktionieren.

    Das Problem ist hier ganz einfach zu erklären, das wird auch sicher nicht nur beim Login vorkommen, sondern auch irgendwann während dem normalen spielen.
    Warum?


    Das liegt an der Latenz zwischen Server und Client.


    Wenn SetPlayerMoney und GetPlayerMoney ziemlich zeitgleich aufgerufen werden (das kann ja bei einem Timer durchaus vorkommen, dass er zeitgleich (fast) mit dem Login ausgeführt wird), dann kann es dazu führen, dass ein falscher Wert zurückgegeben wird, je nach dem ob du Geld abgezogen oder hinzugefügt hast ein zu großer oder zu kleiner Wert. Das ist je nach Latenz zwischen Server und Client unterschiedlich. Außerdem kann es vorkommen, dass eine Spieler nicht mehr synchronisiert wird, dann wird das Geld bei ihm nicht mehr aktualisiert, das hat denselben Effekt, wie wenn ich mit einem Variablen-Hack hin gehe, und die Geld-Variable einfriere, jedoch ist es ein simples Verbindungsproblem, das zig tausend mal vorkommt. Gut, das nur am Rande.


    Wie kannst du verhindern, dass das Problem mit der Latenz zu Fehlern führt?
    Du zählst eine Spielervariable hoch, wenn das Geld nicht stimmt. Wenn die Spielervariable auf 3 ist (zum Beispiel du hast einen 1-Sekunden-Timer), dann wäre das Geld 3 Sekunden lang falsch (so groß ist kaum eine Latenz), dann hat der Spieler das Geld mit unfairen Mitteln bekommen. Wenn es nach dem zweiten mal zum Beispiel wieder übereinstimmt, dann lag es an der Latenz, und du setzt die Spielervariable einfach wieder auf 0.


    Generell würde ich auch nicht prüfen, ob der Spieler zu wenig Geld hat, weil es ja relativ egal ist, wenn der Spieler sich Geld weg-hackt, aber das bleibt dir überlassen.

    Ahja, ok. Das bringt aber nicht wirklich etwas, da wir keine Verbindung hinbekommen, zwischen dem Marker (bdInfo) und der Position wo er hinteleportiert werden soll (bsInfo), da die Verbindung (zum Beispiel über einen Fremdschlüssel) nicht vorhanden ist.
    Am sinnvollsten wäre es, wenn du die Positionen zu denen er teleportiert werden soll hier einträgst:
    new bdInfo[MAX_SHOP][buildingsEnum] = {
    {"Bürger Shot Nord",1559,1199.2811,-918.6648,43.1191}, // BSE1 //Die Kordinaten sagen aus wo der Marker steht.
    {"Bürger Shot West",1559,810.9824,-1616.2720,13.5469}, // BSE2
    {"Bürger Shot Nord",1559,1872.7986,2071.6619,11.0625}, // BSE3
    {"Bürger Shot Nord-West",1559,2472.3940,2034.2115,11.0625}, // BSE4
    {"Bürger Shot West",1559,2169.9138,2795.8726,10.8203} // BSE5
    };


    Ansonsten müsstest du dem bsInfo noch einen Stat burgerID mitgeben, und da trägst du dann in der Datenbank zu der jeweiligen Position passend die ID (Zeile) von dem Marker (bdInfo) ein, der den Spieler dort hin teleportiert.


    Welche Variante du machst bleibt dir überlassen, musst mir dann nur sagen welche du nimmst, und die das neue enum/Array aussieht.

    Warum den einen Einlogg und Register System habe ich doch schon. Es geht mir lediglich darum zu speichern, wer Leader ist und ob die Fraktion offen oder geschlossen ist.


    Kannst du so schreiben:
    public FraktionsSave(fraktionsid)
    {
    new Fraktionsdatei[64];
    format(Fraktionsdatei,sizeof(Fraktionsdatei),"/Fraktionen/%s.txt",FraktionsNamen(fraktionsid));
    if(!dini_Exists(Fraktionsdatei)) dini_Create(Fraktionsdatei);
    dini_IntSet(Fraktionsdatei, "frakGeschlossen", frakGeschlossen[frakid]);
    return 1;
    }

    Naja, das ist ja dann genau das Problem. Du hast keine Daten, sprich:
    if(!IsPlayerInRangeOfPoint(playerid,2,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]))continue;
    bsInfo ist ja leer, sprich immer 0.0000.


    => Das heißt, egal wie rum ich es drehe, entweder wirst du zum 0-Punkt teleportiert, oder es wird abgefragt ob du am 0-Punkt bist.


    Du brauchst ja beide Daten, sprich beide Positionen, einmal die Position vom Marker (die hast du ja anscheinend), aber die Position im Burger Shot fehlt.

    Sorry, hatte gestern keine Zeit mehr.
    Allerdings fehlen da noch immer die Daten. Schau mal, bei dem bdInfo hast du die Daten auch gepostet, genau diese fehlen bei dem bsInfo. Oder hast du da gar keine? Das würde auch erklären warum der Befehl immer 0 ausgibt.

    *edit* Manchmal erscheinen die Objekte jetzt sogar, aber leider nur manchmal. Es scheint kein offensichtliches Muster zu geben, nachdem die Objekte spawnen oder nicht.


    Das sieht mir dann aber nicht nach einem Problem am Code direkt aus, sondern eher ein allgemeines Problem oder einen Fehler an einer anderen Stelle.


    Hast du mal versucht, die Objekte in einem Filterscript zu laden, den du als ersten Filterscript lädst? Geht es dann?

    Sorry, habe komplett übersehen, dass du da zwei verschiedene Variablen hast. Schreibe es so, das verhindert auch gleich Fehler:
    [pwn]if(strcmp("/carkey", cmd, true) == 0)
    {
    CarKey[playerid] += 1;
    if(CarKey[playerid] >= 3)
    {
    CarKey[playerid] = 0;
    }
    PlayerCarkey[playerid] = CarKey[playerid];
    if(Carlist[playerid][CarKey[playerid]][Typ] != -1)
    {
    new index = -1;
    for(new i=0; i<sizeof(Kaufliste); i++)
    {
    if(Kaufliste[i][Modelid] == Carlist[playerid][CarKey[playerid]][Typ])
    {
    index = i;
    break;
    }
    }
    if(index == -1) format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel !",CarKey[playerid]+1);
    else format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel, für deinen %s !", CarKey[playerid]+1, Kaufliste[index][Name]);
    }
    else
    {
    format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel !",CarKey[playerid]+1);
    }
    SendClientMessage(playerid,COLOR_YELLOW,string);
    return 1;
    }[/pwn]

    Schreibe einen Code niemals wie du ihn nicht verstehst. Diese Methode mit den gepackten Variablen macht es für Anfänger nur unnötig kompliziert und führt nur zu Fehlern. Die Einsparungen an Ressourcen sind so gering, da lohnt sich er Aufwand nicht, wenn man es in Relation zu den Fehlern sieht, wie man hier wunderschön sieht.


    Schreibe es so:
    #define MAX_FRAKS 15


    new bool:frakGeschlossen[MAX_FRAKS];


    //Dann wenn der Spieler sich eingeloggt hat
    new id = SpielerInfo[playerid][Fraktion];
    if(frakGeschlossen[id] && id != 0)
    {
    //Hier ist die Fraktion geschlossen.
    SpielerInfo[playerid][Fraktion] = 0;
    SpawnPlayer(playerid);
    }


    //In deinem FrakClose command:
    frakGeschlossen[frakid] = true;


    //In deinem FrakOpen command:
    frakGeschlossen[frakid] = false;

    if(strcmp("/carkey", cmd, true) == 0)
    {
    CarKey[playerid] += 1;
    if(CarKey[playerid] >= 3)
    {
    CarKey[playerid] = 0;
    }
    if(Carlist[playerid][CarKey[playerid]][Typ] != -1)
    {
    new index = -1;
    for(new i=0; i<sizeof(Kaufliste); i++)
    {
    if(Kaufliste[i][Modelid] == Carlist[playerid][CarKey[playerid]][Typ])
    {
    index = i;
    break;
    }
    }
    if(index == -1) format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel !",CarKey[playerid]+1);
    else format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel, für deinen %s !", CarKey[playerid]+1, Kaufliste[index][Name]);
    }
    else
    {
    format(string, sizeof(string), "Du nimmst deinen %dten Auto-Schlüssel !",CarKey[playerid]+1);
    }
    SendClientMessage(playerid,COLOR_YELLOW,string);
    return 1;
    }


    Ggf. musst du deinen Kaufen-Befehl dann anpassen.

    Schade, dass es hier keinen Facepalm Smiley gibt für die Antwort von Kaliber...




    Mal davon ausgegangen, dass du die 1 als erstes erstellst:


    if(smallx[2] < bigx[1] && smallx[2] > smallx[1] && bigy[2] > smally[1]) bigy[2] = smally[1];
    if(bigx[2] > smallx[1] && bigx[2] < bigx[1] && bigy[2] > smally[1]) bigy[2] = smally[1];


    if(smallx[2] < bigx[1] && smallx[2] > smallx[1] && smally[2] < bigy[1]) smally[2] = bigy[1];
    if(bigx[2] > smallx[1] && bigx[2] < bigx[1] && smally[2] < bigy[1]) smally[2] = bigy[1];


    if(smallx[2] < smallx[1] && bigx[2] > bigx[1] && bigy[2] > smally[1]) bigy[2] = smally[1];
    if(smallx[2] < smallx[1] && bigx[2] > bigx[1] && smally[2] < bigy[1]) smally[2] = bigy[1];


    if(smally[2] < smally[1] && bigy[2] > bigy[1] && bigx[2] > smallx[1]) bigx[2] = smallx[1];
    if(smally[2] < smally[1] && bigy[2] > bigy[1] && smallx[2] < bigx[1]) smallx[2] = bigx[1];;


    smally = Linie unten
    bigy = Linie oben
    smallx = Linie links
    bigx = Linie rechts



    Prinzipiell würde es dann entweder den unteren Teil der 2. Zone oder den oberen Teil der 2. Zone weg machen, wenn es überlappt, bzw. einen Teil links oder rechts, wenn es hochkant komplett überlappen sollte.


    Am besten du zeichnest dir mal alle Varianten der Überlappung auf und denkst es nochmal durch, ob die 8 Varianten alles beinhalten.
    Man müsste vielleicht noch abfragen, ob die gesamte Zone in der anderen Zone ist, und dann keine Erstellung möglich ist.

    Ich habe dir die Fehler ausgebessert, schau es dir mal an:
    ocmd:buydrugs(playerid,params[])
    {
    if(sInfo[playerid][beruf]!=3) return SendClientMessage(playerid, COLOR_RED, "Du bist kein Drogendealer!");
    if(!IsPlayerInRangeOfPoint(playerid, 5, -1105.9961,-1636.1152,76.3672) && !IsPlayerInRangeOfPoint(playerid, 5, -1467.4751,483.6167,1.2418)) return SendClientMessage(playerid, COLOR_RED, "Du bist nicht an einem der get Points. Benutze /gps");
    new item[32], amount;
    if(sscanf(params,"sd",item, amount)) return SendClientMessage(playerid,COLOR_RED,"/buydrugs [weed/chemicals] [Menge]");
    if(amount > sInfo[playerid][drogenskill] / 5) return SendClientMessage(playerid,COLOR_RED,"So viel darfst du nicht kaufen");
    if(!strcmp(item, "weed"))
    {
    //Weed geben, Anzahl ist "chemicals".
    }
    else if(!strcmp(item, "weed"))
    {
    //Chemicals geben, Anzahl ist "amount".
    }
    else return SendClientMessage(playerid,COLOR_RED,"/buydrugs [weed/chemicals] [Menge]");
    return 1;
    }


    Falls du das sscanf-Plugin verwendest:

    Spoiler anzeigen
    if(sscanf(params,"sd",item, amount))
    zu:
    if(sscanf(params,"s[32]d",item, amount))