Beiträge von Jeffry

    Jetzt posted ihr schon zu zweit und lasst trotzdem die Problembeschreibung weg. :S
    Was genau ist denn das Problem? Bitte genau beschreiben. Mit "die spawnen nicht" fange ich relativ wenig an. Wann spawnt was nicht?

    Was machst du denn da?


    Du brauchst das "id" und das "i" nicht durch Werte ersetzen.
    Lasse das einfach so stehen, wie ich es dir gegeben habe. ;)
    Das sind Variablen, die bekommen ihren Wert direkt von CreateObject zugewiesen.


    Versuch es nochmal, und poste gegebenenfalls nochmal den Code, falls du wieder Errors hast.



    EDIT:
    [RSA]MaiexHD: Brauchst dich nicht zu entschuldigen, dafür sind wir ja hier. :good:

    Ok, das war was ich wissen wollte.


    Du brauchst zuerst ein Array, in dem du die erstellten Objekt IDs speicherst.
    Oben im Filterscript:
    new bool:ObjectCreatedInFS[MAX_OBJECTS];


    Dies ist zu Anfang in jedem Index ([INDEX]) auf false (=0), nicht erstellt.



    Beim Erstellen der Objekte machst du dann:
    ObjectCreatedInFS[CreateObject(8947, 288.40039, -1193.5996, 78.4, 0, 359.608, 42.605)] = true;


    oder:
    id = CreateObject(8947, 288.40039, -1193.5996, 78.4, 0, 359.608, 42.605); ObjectCreatedInFS[id] = true;


    Wie du willst.
    Bei letzterer Methode musst du noch "new id;" unter den Includes einfügen.



    Und bei OnFilterScriptExit löschen wir die Objekte, die im Filterscript erstellt worden sind:
    for(new i=0; i<MAX_OBJECTS; i++)
    {
    if(ObjectCreatedInFS[i] == true)
    {
    DestroyObject(i);
    ObjectCreatedInFS[i] = false;
    }
    }



    Ich hoffe das hilft dir.
    Bei Fragen kannst du gerne nachfragen.

    Ok.
    Eine Frage bevor ich dir das erkläre/mache: Hast du alle Objekte in diesem Filterscript, und willst du auch alle Objekte entfernen wenn du den Filterscript beendest?


    Je nach dem kann ich dir dann erklären wie du es machen musst.

    Was genau hast du vor?


    So?
    Object[1755] = CreateObject(8947, 288.40039, -1193.5996, 78.4, 0, 359.608, 42.605)


    Wie hast du denn "Object" deklariert, und wie verwendest du es noch im Code? Bzw, was willst du genau damit machen? Alle Objekte speichern, damit du sie löschen kannst?

    Weil du "rollerpoint" nirgends verwendest.
    Du hast nur:
    new rollerpoint;
    und
    rollerpoint = CreatePickup(1239,1,604.7900,-1489.4922,14.9479,0);


    Das macht die Variable sinnlos, daher die Warnung. Du kannst sie genauso gut weglassen, das würde nichts ändern.


    => Entweder verwenden, oder weg machen.


    Verwenden wäre zum Beispiel eine if-Verknüpfung oder zum Beispiel in DestroyPickup.

    Du musst den Befehl vorher aussplitten, damit du mit den Parametern nicht blockiert wirst.
    Dann sieht das ganze so aus, wenn ich dein Vorhaben richtig gedeutet habe.
    new cmd[20], idx;
    cmd = strtok(cmdtext, idx);
    if(strcmp(cmd, "/dienst", true)==0)
    {
        new string[145];
        if(Spieler[playerid][Beruf] == 3)
        {
            if(Dienst[playerid] > 0)
            {
                Dienst[playerid] = 0;
                format(string, sizeof(string), "* Du bist nun außer Dienst und hast $%d verdient.", TransportMoney[playerid]);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
                GivePlayerMoney(playerid, TransportMoney[playerid]);
                TransportValue[playerid] = 0;
                TransportMoney[playerid] = 0;
                SetPlayerColor(playerid,COLOR_WHITE);
                return 1;
            }
            if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 420 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 438)
            {
                if(GetPlayerState(playerid) == 2)
                {
                    new tmp[20];
                    tmp = strtok(cmdtext, idx);
                    if(!strlen(tmp))
                    {
                        SendClientMessage(playerid, COLOR_WHITE, "NUTZUNG: /dienst [Fahrpreis]");
                        return 1;
                    }
                    new moneys = strval(tmp);
                    if(moneys < 1 || moneys > 500)
                    {
                        SendClientMessage(playerid, COLOR_RED, "Preis muss zwischen 1 und 500 Dollar liegen!");
                        return 1;
                    }
                    Dienst[playerid] = 1;
                    TransportValue[playerid] = moneys;
                    new sendername[MAX_PLAYER_NAME];
                    GetPlayerName(playerid,sendername,sizeof(sendername));
                    format(string, sizeof(string), "Taxifahrer %s ist im Dienst, Preis: $%d.", sendername, TransportValue[playerid]);
                    SendClientMessage(playerid,COLOR_YELLOW,"Du bist nun im Dienst!");
                    GlobChat(COLOR_YELLOW,string);
                    SetPlayerColor(playerid,COLOR_YELLOW);
                    return 1;
                }
            }
            SendClientMessage(playerid,COLOR_RED,"Du musst in einem Taxi sitzen!");
            return 1;
        }
        SendClientMessage(playerid,COLOR_RED,"Du bist kein Taxifahrer!");
        return 1;
    }

    Nein, du musst nur diesen define ändern, wenn du einen Skin hinzufügen willst. Du kannst es auch gleich auf 100 setzen, aber dann braucht es halt ein paar Bytes mehr Arbeitsspeicher.


    #define MAX_SKINS 10


    Und wenn du eine neue Fraktion willst, den anderen define erhöhen, und einfach wie zuvor eine Zeile dazu machen im Array mit den Skins.

    Kannst du mir vielleicht zeigen wie mein Vorhaben mit einem dynamischen System lösbar wäre?


    #define MAX_FACTIONS 4
    #define MAX_SKINS 10


    new skinChangeTEXT[MAX_FACTIONS][MAX_SKINS*4 + 1] = {
    {"188 0"}, //ZiviSkins
    {"265 266 267 280 281 282 283 284 288"}, //CopSkins
    {"171 172 187 194 240"}, //FahrschulSkins
    {"272 273 292 298"} //LosZetasSkins
    };


    new skinChange[MAX_FACTIONS][MAX_SKINS];
    new sizeSkinChange[MAX_FACTIONS];


    public OnFilterScriptInit() //Oder eben OnGameModeInit
    {
    for(new fID = 0; fID < MAX_FACTIONS; fID++)
    {
    new tmp[20], idx, i;
    tmp = strtok(skinChangeTEXT[fID], idx);
    while(strlen(tmp))
    {
    skinChange[fID][i] = strval(tmp);
    i++;
    sizeSkinChange[fID]++;
    tmp = "";
    tmp = strtok(skinChangeTEXT[fID], idx);
    }
    }
    return 1;
    }


    Ganz unten in dem GM/FS:
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }




    Und in deinem Menü Code schreibst du anstatt:
    strlen(skinChange[fID])
    das:
    sizeSkinChange[fID]


    Falls du Fragen dazu hast, oder es nicht klappt, sag einfach Bescheid.

    Willkommen auf Breadfish!


    OnPlayerCommandText muss ganz am Ende 0 zurückgeben:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/auf", cmdtext, true, 10) == 0)
    {
    if(IsPlayerInRangeOfPoint(playerid,10.0,-2759.39, 80.01, 6.06))
    {
    MoveObject(tor,-2759.39, 80.01, 2.72, 4);
    SendClientMessage(playerid,Rot,"Das Tor schließt in 5 Sekunden.");
    SetTimer("close", 5000,0);
    return 1;
    }
    else
    {
    return SendClientMessage(playerid,Rot,"Du bist nicht in der Nähe!");
    }
    }
    return 0;
    }

    Ja dann ist es wesentlich einfacher, wenn du nur die Farbe des vorhandenen Icons ändern willst.


    Entweder du nutzt SetPlayerColor, sprich du setzt dem Spieler seine Farbe auf Gelb, oder du nutzt SetPlayerMarkerForPlayer, damit kannst du dann zum Beispiel die Farbe beibehalten und nur die Anzeigefarbe im Radar ändern. Mit einer Schleife kannst du es dann für alle Spieler ändern.


    Schau mal ob du damit klar kommst, falls nicht poste den Code den du bis dahin hast, dann können wir dir helfen.

    DJ Deagle: Das was du da machst funktioniert aber aus zwei Gründen auch nicht. Erstens müsste man im Funktionskopf die XYZ Werte als "Float" deklarieren, und zweitens startest du einen Timer, der immer wieder an dieselbe Position das MapIcon setzt.


    Unter die Includes:
    new gTaxiTimer[MAX_PLAYERS] = {-1,...};
    Im Befehl:
    if(gTaxiTimer[playerid] != -1) KillTimer(gTaxiTimer[playerid]);
    gTaxiTimer[playerid] = SetTimerEx("SetTaxiIcon", 100, true, "d", playerid);
    Beim Beenden:
    if(gTaxiTimer[playerid] != -1) KillTimer(gTaxiTimer[playerid]);
    gTaxiTimer[playerid] = -1;
    Unten im Gamemode:
    forward SetTaxiIcon(playerid);
    public SetTaxiIcon(playerid)
    {
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        for(new i=0; i<MAX_PLAYERS; i++) if(IsPlayerConnected(i)) SetPlayerMapIcon(i, 56, x, y, z, 55, MAPICON_GLOBAL);
        return 1;
    }
    Allerdings ist zu beachten, dass hier immer nur das Mapicon mit der Server-ID 56 gesetzt wird. Das bedeutet, wenn du zwei Spieler im Taxi-Modus hast klappt das nicht mehr, dann wird nur das Taxi von der höheren ID angezeigt. Da musst du entscheiden, ob du nur ein Taxi hast, oder ob du einen Betrag X an Mapicons reservierst, und diese dann anzeigst. Oder du nutzt den Streamer, damit geht es möglicherweise besser.

    Sorry, ich hab dir Müll erzählt. Mit dem jetzt geposteten ganzen Code bin ich erst dahinter gekommen, was du eigentlich genau machen willst. Ich bin komplett auf dem Schlauch gestanden. :wacko:



    Also, folgendes Prinzip:
    Das Array speichert alle Werte untereinander:

    Code
    188
    0
    265
    266
    ...


    Sprich, du kannst auf verschiedene Art und Weisen auf die Werte zugreifen, so komme ich zum Beispiel über [0][3] auf die 266, obwohl die gar nicht in Zeile 0 steht. Das liegt daran, dass das Array die Zeilen nicht interessiert.



    Was du machen kannst ist:
    new skinChange[4][9] = {
    {188,0,-1,-1,-1,-1,-1,-1,-1}, //ZiviSkins
    {265,266,267,280,281,282,283,284,288}, //CopSkins
    {171,172,187,194,240,-1,-1,-1,-1}, //FahrschulSkins
    {272,273,292,298,-1,-1,-1,-1,-1} //LosZetasSkins
    };


    Und dann abfragen, ob die "pos" im nächsten Index -1 ist, falls ja, bist du am Ende dieser Zeile, falls nein, kannst du das nächste Item anzeigen. Oder falls deine "pos" sizeof(skinChange[]) (= 9) ist, bist du auch am Ende. Wichtig ist eben, dass alle Zeilen gleich lang sind.


    Aber bei unterschiedlich Langen "Zeilen" (wir stellen uns das nur als Zeilen vor) in Arrays kannst du die jeweilige Länge nicht direkt abfragen.



    Eine weitere Möglichkeit wäre, die Zahlen in einem String zu speichern, den dann zu splitten und darüber auszulesen, dann würde es theoretisch klappen, das ganze dynamisch aufzubauen.
    Wenn du willst kann ich dir da morgen ein Beispiel dazu machen, bzw. wenn du die erste Methode nimmst, auch dazu.






    EDIT: The.Boonze: Werde ich heute Abend machen, wenn ich Feierabend habe.