Beiträge von Simon

    Kurze Frage:


    Ist es sinnvoller Cheats in OnPlayerUpdate oder in timern zu überprüfen? Wenn ja wieso und welche sollte man auf jedenfall, bzw auf jedenfall nicht wo überprüfen.


    Gut waren paar mehr fragen aber bitte um Antwort :)


    Liebe Grüße
    Simon


    PS: kenne mich mit OnplayerUpdate etwa 1% aus :D

    du machst es dir schwerer als es ist:


    new Cheatwarn[MAX_PLAYERS];
    public OnPlayerUpdate(playerid)
    {
    new string[128],Geld=GetPlayerMoney(playerid);
    if(Geld>SpielerInfo[playerid][pGeld])
    {
    if(Cheatwarn[playerid]<= 2)
    {
    SendClientMessage(playerid,ROT,"Du stehst in verdacht auf MoneyHack!");
    SendClientMessage(playerid,GELB,"Es kann auch sein das durch ein Laag ein fehler auftrat!");
    Cheatwarn[playerid]++;
    }
    else
    {
    format(string,sizeof(string),"AdmCmd: %s wurde wegen MoneyHack gebannt",SpielerName(playerid));
    SendClientMessageToAll(ROT,string);
    SpielerInfo[playerid][pGebannt]=1;
    SavePlayer(playerid);
    Kick(playerid);
    }
    }
    else SpielerInfo[playerid][pGeld]=GetPlayerMoney(playerid);
    return 1;
    }


    mit defines?


    //edit: ein beispiel mit sscanf:

    new zahl;
    if(sscanf(inputtext,"d", zahl)) return SendClientMessage(playerid,farbe,"Du musst eine Zahl angeben!");


    du kannst auch mehrere parameter benutzen. ne Zahl und ein String, oder eine ID..

    sscanf ist wie gesagt besser, da es sonst auch wenn du "HALLO" eingibst er es als "0" erkennt.
    Soweit ich weiß sagt die sscanf ganz genau obs eine Zahl ist oder nicht. und noch mehr, kannst ja bisschen mehr abfragen als nur eine Zahl.

    füg noch ein else hinzu:


    }
    else SpielerInfo[playerid][pGeld] = GetPlayerMoney(playerid);


    und ich würde dir raten erstmal ein Warning senden zu lassen und das Geld abzuziehen. Könnte auch ein Lag sein und dann wird er gleich gebannt.

    GetPlayerPos(playerid, SpielerInfo[playerid][PosX],SpielerInfo[playerid][PosY],SpielerInfo[playerid][PosZ]);
    GetPlayerFacingAngle(playerid,SpielerInfo[playerid][PosA]);
    dini_FloatSet(DATEI, "PosXX", SpielerInfo[playerid][PosX]);
    dini_FloatSet(DATEI, "PosYY", SpielerInfo[playerid][PosY]);
    dini_FloatSet(DATEI, "PosZZ", SpielerInfo[playerid][PosZ]);
    dini_FloatSet(DATEI, "PosAA", SpielerInfo[playerid][PosA]);

    Immer die funktion nutzen und halt immer in einer 2. variablen speichern.
    Dann wie BlackAce schon sagte in OnPlayerUpdate überprüfen ob das Geld höher ist. wenn es niedrieger ist, pass die variable an.

    public OnPlayerEnterVehicle(playerid, vehicleid)
    {
    SetPlayerArmedWeapon(playerid,0);
    return 1;
    }


    Du musst einen eigenen Textdraw erstellen und dann einfach:

    new string[10];
    format(string,sizeof(string),"$%09d",GetPlayerMoney(playerid)); //Ich glaube die normale Geldanzeige hat 9 stellen, bin mir nicht sicher.
    PlayerTextDrawSetString(playerid, Textdrawid, string);



    Und wenn du ein AntiMoney CHeat haben willst, dann so wie ich es in der 1. antwort erklärt habe

    Zum Speichern:
    GetPlayerPos(playerid, SpielerInfo[playerid][PosX],SpielerInfo[playerid][PosY],SpielerInfo[playerid][PosZ]);
    GetPlayerFacingAngle(playerid,SpielerInfo[playerid][PosA]);
    dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosX]);
    dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosY]);
    dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosZ]);
    dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosA]);
    Zum Laden:
    SpielerInfo[playerid][PosX] = dini_Float(DATEI, "PosX");
    SpielerInfo[playerid][PosY] = dini_Float(DATEI, "PosY");
    SpielerInfo[playerid][PosZ] = dini_Float(DATEI, "PosZ");
    SpielerInfo[playerid][PosA] = dini_Float(DATEI, "PosA");

    SetPlayerArmedWeapon(playerid, weaponid);


    Sorry, hatte mich versehen :D


    Ja kannst du genau mit dieser Funktion: Bei Deagle: SetPlayerArmedWeapon(playerid,24); Du musst ihm ggf. die Waffe vorher geben mit GivePlayerWeapon(playerid,24,munition);


    3. Wie soll ich das verstehen?

    das ist möglich. beispiel:
    new name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    GetPlayerName(i,name,sizeof(name));
    dini_IntSet(DATEI,name,GetPlayerMoney(i));
    }

    1. SetPlayerArmedWeapon(playerid,0);


    2. GivePlayerWeapon(playerid, weaponid, ammo);


    3. Eine 2. Variable erstellen in der Das geld gespeichert wird. Beispiel:


    new pMoney[MAX_PLAYERS];
    nun würde ich eine eigene funktion schreiben und die anstelle von GivePlayerMoney und ResetPlayerMoney benutzen:


    stock p_GivePlayerMoney(playerid, money)
    {
    GivePlayerMoney(playerid,money);
    pMoney[playerid] += money;
    return 1;
    }


    stock p_ResetPlayerMoney(playerid)
    {
    ResetPlayerMoney(playerid);
    pMoney[playerid] = 0;
    return 1;
    }


    und nun einfach mit GetPlayerMoney abfragen ob das geld was er auf der hand hat höher ist als das was in der variablen steht.


    4. ist etwas komplizierter