Beiträge von Mann im Mond

    Da fragst du doch auch schon: Admin level habe 0 schimer


    Erstell eine Variable und weis der den Wert zu des Adminlevels.
    // ganz oben
    new
    Admin[MAX_PLAYERS];


    // OnPlayerConect
    Admin[playerid] = 0;


    // /makeadmin


    //Eine überprüfung der Eingabe hinter /makeadmin:
    Admin[EingabeSpieler] = EingabeAdminLevel; // mach das mit Hilfe von z.B. strtok oder sscanf


    // in deinen Admin Befehlen eine Überprüfung


    if(Admin[playerid] < BenötigtesAdminLevel)
    {
    // Spieler hat keine Berechtigung
    return 1;
    }


    Oder anstatt das Auto zu verschieben, was wie ich mir vorstellen kann in engen Gassen Probleme machen kann, einfach den Spieler über dem Auto spawnen lassen.
    SetPlayerPos(playerid, x, y, z+2);

    Ehm damit ändert man aber kein Wert in einer Datei, wie er es oben wollte. Damit änderst du die Variable einer "playerid" (das ist kein bestimmter Spieler, sondern einfach der, der drauf kommt).
    Wenn du einen Wert in einer Datei ändern willst, musst du die Datei öffnen, den entsprechenden Wert ändern und die Datei wieder schliessen. Das machst du gleich, wie dus auch beim Login eines Spielers machst. Da überprüfst du auch, ob die Datei des Spielers existiert und lest alle Werte aus...

    Ja natürlich das geht auch mit Hilfe von strtok und strval


    new
    string[128],
    idx;
    string = strtok(cmdtext, idx);
    if(strcmp(string,"dm",true) == 0)
    {
    new
    number;
    string = strtok(cmdtext, idx);
    if(string[0] == 0)
    {
    // 1. Parameter ("Wüste") fehlt
    return 1;
    }
    string = strtok(cmdtext, idx);
    if(string[0] == 0)
    {
    // 2. Parameter (Zahl) fehlt
    return 1;
    }
    number = strval(string);
    // ... Zum überprüfen dann einfach ...
    if(strcmp(string,"wüste",true) == 0)
    {
    if(number == 1)
    {
    // Spieler hat /dm Wüste 1 eingeben
    }
    }
    }


    // strtok


    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }


    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }

    Du solltest einen globale Variable erstellen, um die Zeit hochzuzählen. SetPlayerPos solltest du nicht innerhalb der Schleife machen, da es ja ausreicht EINMALIG die Position zu setzen, nicht jede Sekunde erneut.
    Bsp.: Dein Tutorial startet beim Befehl /tutorial. Dann setze bei diesen Befehl die Position/Angle usw. und die Variable pTutorial auf 1. Das gleiche geht auch, wenn dus beim Login willst oder bei jedem Spawn...
    // Ganz oben
    new
    pTutorial[MAX_PLAYERS];

    // OnPlayerConnect


    pTutorial[playerid] = 0;

    // In deinen Sekundentimer

    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(pTutorial[i] > 0)
    {
    switch(pTutorial[playerid])
    {
    case 5:
    {
    //Nachricht nach 5 Sekunden
    }
    case 20:
    {
    //Nachricht nach 20 Sekunden
    }
    case 40:
    {
    //Ende nach 40 Sekunden
    pTutorial[i] = 0;
    }
    }
    }
    }
    }


    // zum Starten vom Tutorial


    // Hier dann deine SetPlayerPos usw.
    pTutorial[playerid] = 1;


    // zum Beenden vom Tutorial


    pTutorial[playerid] = 0;

    Dazu müsstest du überprüfen (beim Connect) ob ein Eintragt in der Datenbank existiert. Am besten suchst du nach dem Namen in der Datenbank und gibts dann die Mysql ID aus.
    Das kannst du mit Hilfe von

    SQL
    SELECT [...]  FROM [...] WHERE [...] LIMIT 1

    herausfinden. Oder da du den Mysql Teil von Moderntopia hast, kannst auch da schaun wies die gemacht haben.


    EDIT: Such im Moderntopiascipt nach "gPlayerAccount" und "MySQLCheckAccount" und füge das bei dir hinzu. Die Überprüng von "gPlayerAccount" bei /login nicht vergessen, dann sollte alles gehen

    Kann zwar nur Lags verindern, aber schont auf jeden Fall die CPU, besonders in Verbindung mit sscanf.
    Ich habe beides ausprobiert und konnte damit nur Positives merken, was Lags und CPU Belastung angeht. Außerdem ist es in Verbindung mit sscanf auf jeden Fall einfacher in der Erweiterung, sowie Erstellung.
    Das wird jeder merken, der damit arbeitet... Für mich auf jeden Fall die bessere und schnellere Alternative zum ressourcenziehenden strtok.


    EDIT: Zurück zu der Frage: Was ist an einem Banksystem so schwer wenn man schon Erfahrung mit dem Scripten hat? Speicher in deinem .ini File oder deine Datenbank (ich weiß nciht was oder ob du überhaupt schon Werte speicherst) einfach Variablen für den Spieler und setze die entsprechend bei /deposit und /withdraw. Wie du Daten speicherst, findest du in diesem Forum mehr als genug...


    // Sagen wir du arbeitest mit PlayerInfo[playerid][pBank] für den Kontostand deines Spielers
    dcmd_deposit(playerid,params[])
    {
    new
    string[50],
    amount;
    if(sscanf(params,"d",amount))
    {
    // Falsche Eingabe
    }
    else if(amount < 0 || amount > GetPlayerMoney(playerid))
    {
    // Falsche Geldmenge, zu groß oder zu klein
    }
    else
    {
    GivePlayerMoney(playerid,-amount);
    PlayerInfo[playerid][pBank] += amount;
    format(string,sizeof(string),"Du hast $%d auf dein Bankkonto eingezahlt",amount);
    SendClientMessage(playerid,FARBE,string);
    }
    return 1;
    }


    dcmd_withdraw(playerid,params[])
    {
    new
    string[50],
    amount;
    if(sscanf(params,"d",amount))
    {
    // Falsche Eingabe
    }
    else if(amount < 0 || amount > PlayerInfo[playerid][pBank])
    {
    // Falsche Geldmenge, zu groß oder zu klein
    }
    else
    {
    GivePlayerMoney(playerid,amount);
    PlayerInfo[playerid][pBank] -= amount;
    format(string,sizeof(string),"Du hast $%d von deinem Bankkonto abgehoben",amount);
    SendClientMessage(playerid,FARBE,string);
    }
    return 1;
    }


    sscanf findest du hier

    // Oben
    new
    pickup,
    bool:ArenaActiv;


    // OnGameModeInit()
    pickup = CreatePickup(model,type,Float:X,Float:Y,Float:Z);


    // OnPlayerPickUpPickup(playerid, pickupid)
    if(pickupid == pickup)
    {
    if(ArenaActiv)
    {
    // Code zum sttarte die Arena
    }
    else
    {
    // Arena nicht aktiv
    }
    }


    // Aktivieren der Arena
    ArenaActiv = true;


    // Deaktivieren der Arena
    ArenaActiv = false;

    new
    weapon,
    ammo;
    for(new slot = 0; slot < 15; slot++)
    {
    GetPlayerWeaponData(playerid, slot, weapon, ammo);
    if(weapon > 0 && weapon < 47 && ammo > 0)
    {
    // Er hat mindestens eine Waffe (Waffenid = "weapon", Munition = "ammo")
    }
    }
    Du brauchst doch keine Array, um herauszufinden, ob er eine Waffe trägt. Da reicht ein einfacher Integer