Beiträge von Jeffry

    if(dini_Int(file,ip) != GetPlayerIp(player1,tmp3,100))
    zu:
    format(ip, sizeof(ip), dini_Get(file, "ip"));
    GetPlayerIp(player1,tmp3,sizeof(tmp3));
    if(strcmp(ip, tmp3))
    {
    //IP stimmt nicht.
    }


    Warum strcmp? Weil die IP ein String ist.

    Ich bin mir ziemlich sicher, dass du eine Haus ID hast, woher sonst weißt du an welche Position du den Spieler setzen sollst, außer über eine ID? Die ID wird wahrscheinlich der Index des Array sein (i?).
    Poste ansonsten mal den Befehl mit dem du ein privates Haus betrittst.


    Zu deinem Beispiel: Nein, das klappt so nicht.

    Wenn jedes private Haus seine eigene Welt haben soll, dann kannst du beim Betreten des Hauses einfach
    SetPlayerVirtualWorld(playerid, hausID+1000);
    machen, dann gehst du auf jeden Fall sicher, dass sich in der Welt niemand befindet, solange du sonst keine Welten zwischen 1000 und 1500 (mit der Annahme, dass du 500 Häuser hast) verwendest.

    Das mit dem Timer ist relativ leicht.
    Ich gehe einfach mal davon aus, dass man den Timer nur einmal starten kann, global gesehen, sprich wenn Spieler A ihn startet, dann kann ihn Spieler B nicht auch starten.


    Global unter den Includes:
    new countTimer = -1;


    Im Befehl, dort wo der Timer gestartet werden soll:
    if(countTimer != -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Countdown ist bereits an.");
    if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit ein.");
    new time = strval(params);
    if(time < 1 || time > 60) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit zwischen 1 und 60 ein.");
    countTimer = SetTimerEx("CountDownObjekte", 1000, true, "dd", playerid, time);


    Und das Timer-Callback:
    forward CountDownObjekte(playerid, count);
    public CountDownObjekte(playerid, count)
    {
    count--;
    if(count <= 0)
    {
    KillTimer(countTimer);
    countTimer = -1;
    //Hier die Objekte erstellen
    }
    new str[16];
    format(str, sizeof(str), "Countdown: %d", count);
    //TextDrawSetString? / SendClientMessage?
    return 1;
    }

    Du darfst beim SetObjectMaterial nicht mehr tmpobjid verwenden, sondern musst gObj[0] bzw. gObj[1] verwenden, da steht ja jetzt die Objekt ID drin.
    Und die SendClientMessage darf nicht innerhalb der Schleife stehen, entweder davor oder danach.

    CMD:deletetest(playerid,params[])
    {
    for(new i=0; i<sizeof(gObj); i++) DestroyObject(gObj[i]);
    }


    Bzw, besser ist es so:
    CMD:deletetest(playerid,params[])
    {
    for(new i=0; i<sizeof(gObj); i++)
    {
    if(gObj[i] != -1) DestroyObject(gObj[i]);
    gObj[i] = -1;
    }
    }
    Und bei der Deklaration:
    new gObj[2] = {-1,...};


    Das verhindert Fehler.

    new tmpobjid;
    Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.


    new gObj[2];
    Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen.

    Schau mal:


    Unter den Includes:
    new PlayerText:tachoText[MAX_PLAYERS];


    OnPlayerConnect:
    tachoText[playerid] = CreatePlayerTextDraw(playerid, 320.0, 240.0, "Tacho");
    //Hier noch Farbe etc...


    Und im Timer:
    PlayerTextDrawSetString(i, tachoText[i], string);
    PlayerTextDrawShow(i, tachoText[i]);


    Bei OnPlayerDisconnect löschst du das Textdraw wieder:
    PlayerTextDrawDestroy(i, tachoText[i]);