Beiträge von Simon

    Guten Tag


    Habe einen Linux Server, auf dem der Server problemlos läuft.
    Ich benutze nie meinen Homeserver, da ich gar keine Lust habe 2 Datenbanken zu pflegen und immer zwischen den ganzen Passwörtern zu wechseln etc.


    In nächster Zeit habe ich aber keine möglichkeit, den Linux server zu erreichen und möchte deswegen ausnahmsweise den homeserver nutzen.
    Das problem was ich habe, bestimmt weil ich es ewig nciht mehr genutzt habe :x


    Habe die Plugins alle im plugin Ordner, die gamemodes auch richtig geschrieben im gamemodes und die filterscript richtig geschrieben im filterscripts ordner.
    Includes sind alle da und sonstige Dateien. Das Script compiled ohne errors oder warnings.


    Beim starten des Servers werden alle 4 Plugins geladen und auch das filterscript. sobald er zu guter letzt den gamemode laden will, kommt die wohl nervigste Error-Meldung: runtime error :(


    Spoiler anzeigen
    echo Executing Server Config...
    lanmode 0
    rcon_password root
    maxplayers 21
    port 7777
    hostname Server
    gamemode0 Server 1
    filterscripts gl_actions
    announce 0
    query 1
    chatlogging 0
    weburl http://www.moin.de
    onfoot_rate 40
    incar_rate 40
    weapon_rate 40
    stream_distance 300.0
    stream_rate 1000
    maxnpc 1
    logtimeformat [%H:%M:%S]
    plugins mysql streamer sscanf MapAndreas


    Spoiler anzeigen

    ----------
    Loaded log file: "server_log.txt".
    ----------

    Spoiler anzeigen
    SA-MP Dedicated Server
    ----------------------
    v0.3z, (C)2005-2014 SA-MP Team

    Spoiler anzeigen
    [12:42:17]
    [12:42:17] Server Plugins
    [12:42:17] --------------
    [12:42:17] Loading plugin: mysql
    [12:42:17]

    Spoiler anzeigen
    > MySQL plugin R5 successfully loaded.

    Spoiler anzeigen
    [12:42:17] Loaded.
    [12:42:17] Loading plugin: streamer
    [12:42:17]

    Spoiler anzeigen
    *** Streamer Plugin v2.7 by Incognito loaded ***

    Spoiler anzeigen
    [12:42:17] Loaded.
    [12:42:17] Loading plugin: sscanf
    [12:42:17]

    Spoiler anzeigen
    [12:42:17] ===============================

    Spoiler anzeigen
    [12:42:17] sscanf plugin loaded.

    Spoiler anzeigen
    [12:42:17] Version: 2.8.1

    Spoiler anzeigen
    [12:42:17] (c) 2012 Alex "Y_Less" Cole

    Spoiler anzeigen
    [12:42:17] ===============================

    Spoiler anzeigen
    [12:42:17] Loaded.
    [12:42:17] Loading plugin: MapAndreas
    [12:42:17] Loaded.
    [12:42:17] Loaded 4 plugins.

    Spoiler anzeigen
    [12:42:17]
    [12:42:17] Filterscripts
    [12:42:17] ---------------
    [12:42:17] Loading filterscript 'gl_actions.amx'...
    [12:42:17] Loaded 1 filterscripts.

    Spoiler anzeigen
    [12:42:17] Script[gamemodes/Server.amx]: Run time error 19: "File or function is not found"
    [12:42:17] Number of vehicle models: 0


    Bräuchte eben die Fehler bei denen dieser Error erscheint, um alles zu kontrollieren

    Hatte gerade was am 5. wert geändert gehabt, ist nun wieder ein string.


    Hmm klappt das so nicht? wäre ja schade :D


    wenn jemand einen Job aussucht, soll einer der möglichen "duty Stationen" in Form eines Checkpointes angezeigt werden und zwar zufällig jedesmal ein anderes.
    Da jeder Job verschiedend viele Stationen hat, dachte ich mir das ich die Varable einfach nie größer mache als maximum an duty stationen.


    Aber der braucht wohl einen einmaligen festen Wert..

    So ein kleiner Blöder Fehler..


    bitte einmal helfen..


    variable mit enum:

    Spoiler anzeigen
    enum zJobinfo
    {
    Jobname[50],
    Jobskin,
    JobGH,
    minLevel,
    Description,
    dutyCount,
    }

    Spoiler anzeigen
    new Ziviljobs[5][zJobinfo] = {
    {"Busfahrer", 253, 0, 1, "", 3},
    {"Taxifahrer", 7, 0, 1, "", 3},
    {"Holzfäller", 16, 0, 1, "", 1},
    {"Müllman", 42, 0, 1, "", 1},
    {"Farmer", 158, 0, 1, "", 4}


    Anwendung mit Fehler:

    Spoiler anzeigen
    new Float:rPos[3][Ziviljobs[j][dutyCount]];


    Fehler:

    Spoiler anzeigen
    error 008: must be a constant expression; assumed zero
    error 009: invalid array size (negative, zero or out of bounds)

    Ich habe mal den Code herausgeschnitten:


    Spoiler anzeigen
    enum cheatinfo
    {
    bool:active, //Antticheat für Spieler aktiv oder nicht
    pLag,
    pCheat,
    bool:GetMoney, //Money
    pMoney,
    bool:GetHealth, //Leben
    Float:pHealth,
    bool:GetArmour, //Rüstung
    Float:pArmour,
    bool:GetWeapon, //Waffen
    pWeapon[13],
    pAmmo[13],
    }
    new pAntiCheat[MAX_PLAYERS][cheatinfo];

    Spoiler anzeigen
    forward CheatCheck();
    forward Lag(playerid);
    forward Cheat(playerid, cGrund[]);
    forward ResetAntiCheat(playerid);
    forward SetAntiCheat(playerid);

    Spoiler anzeigen
    public OnGameModeInit()
    {
    SetTimer("CheatCheck", 773, 1);
    }

    Spoiler anzeigen
    public Lag(playerid)
    {
    pAntiCheat[playerid][pLag]++;
    if(pAntiCheat[playerid][pLag] >= Max_Lag)
    {
    new str[125];
    format(str,sizeof(str),"[Server] %s wurde vom Server gekickt, Grund: Lag", pName[playerid]);
    SendClientMessageToAll(0xFF6347FF,str);
    SendClientMessage(playerid, COLOR_ERROR,"Sie wurden vom Server gekickt, Grund: Lag");
    Kick(playerid);
    }
    return 1;
    }

    Spoiler anzeigen
    public Cheat(playerid, cGrund[])
    {
    pAntiCheat[playerid][pCheat]++;
    SendCheatWarn(playerid, cGrund);

    Spoiler anzeigen
    if(pAntiCheat[playerid][pCheat] >= Max_Cheat)
    {
    new str[125];
    format(str,sizeof(str),"[Server] %s wurde vom System gebannt, Grund: %s", pName[playerid], cGrund);
    SendClientMessageToAll(0xFF6347FF,str);
    Spieler[playerid][ban] = true;
    format(Spieler[playerid][bangrund],100,"%s",cGrund);
    Kick(playerid);
    }
    return 1;
    }

    Spoiler anzeigen
    public ResetAntiCheat(playerid)
    {
    pAntiCheat[playerid][active] = false;
    pAntiCheat[playerid][pLag] = 0;
    pAntiCheat[playerid][pCheat] = 0;
    pAntiCheat[playerid][GetMoney] = false;
    pAntiCheat[playerid][pMoney] = 0;
    pAntiCheat[playerid][GetHealth] = false;
    pAntiCheat[playerid][pHealth] = 0.0;
    pAntiCheat[playerid][GetArmour] = false;
    pAntiCheat[playerid][pArmour] = 0.0;
    pAntiCheat[playerid][GetWeapon] = false;
    for(new w = 0; w < 13; w++)
    {
    pAntiCheat[playerid][pWeapon][w] = 0;
    pAntiCheat[playerid][pAmmo][w] = 0;
    }
    return 1;
    }

    Spoiler anzeigen
    public SetAntiCheat(playerid)
    {
    pAntiCheat[playerid][GetHealth] = true;
    pAntiCheat[playerid][GetArmour] = true;
    pAntiCheat[playerid][GetMoney] = true;
    pAntiCheat[playerid][GetWeapon] = true;
    pAntiCheat[playerid][pLag] = 0;
    pAntiCheat[playerid][pCheat] = 0;
    pAntiCheat[playerid][pHealth] = 250.0;
    pAntiCheat[playerid][pArmour] = 250.0;
    pAntiCheat[playerid][pMoney] = GetPlayerMoney(playerid);
    for(new w = 0; w < 13; w++)
    {
    new weap[2];
    GetPlayerWeaponData(playerid, w, weap[0], weap[1]);
    pAntiCheat[playerid][pWeapon][w] = weap[0];
    pAntiCheat[playerid][pAmmo][w] = weap[1];
    }

    Spoiler anzeigen
    pAntiCheat[playerid][active] = true;
    }

    Spoiler anzeigen
    public OnPlayerDisconnect(playerid, reason)
    {
    ResetAntiCheat(playerid);
    return 1;
    }

    Spoiler anzeigen
    public OnPlayerSpawn(playerid)
    {
    SetAntiCheat(playerid);
    return 1;
    }

    Spoiler anzeigen
    public CheatCheck()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || !LoggedIn[i] || IsPlayerNPC(i)) continue;
    if(!pAntiCheat[i][active]) continue;

    Spoiler anzeigen
    //Anti-Money:
    if(pAntiCheat[i][pMoney] > GetPlayerMoney(i)) pAntiCheat[i][pMoney] = GetPlayerMoney(i);

    Spoiler anzeigen
    if(GetPlayerMoney(i) > pAntiCheat[i][pMoney])
    {
    if(pAntiCheat[i][GetMoney])
    {
    pAntiCheat[i][pMoney] = GetPlayerMoney(i);
    Lag(i);
    }
    else
    {
    ResetPlayerMoney(i);
    GivePlayerMoney(i, pAntiCheat[i][pMoney]);
    Cheat(i, "Geld-Cheat");
    }
    }
    else pAntiCheat[i][pMoney] = GetPlayerMoney(i);
    pAntiCheat[i][GetMoney] = false;

    Spoiler anzeigen
    //Anti-Leben:
    if(!aDuty[i]) //falls man Admin onDuty ist
    {
    new Float:cHP;
    GetPlayerHealth(i, cHP);
    if(cHP > 200.0) //man kann maximal 200.0 haben vom script aus
    {
    pAntiCheat[i][pCheat] = Max_Cheat-1;
    Cheat(i, "Leben-Cheat");
    continue;
    }
    else if(cHP > pAntiCheat[i][pHealth])
    {
    if(pAntiCheat[i][GetHealth])
    {
    pAntiCheat[i][pHealth] = cHP;
    Lag(i);
    }
    else
    {
    SetPlayerHealth(i, pAntiCheat[i][pHealth]);
    Cheat(i, "Leben-Cheat");
    }
    }
    else pAntiCheat[i][pHealth] = cHP;
    }
    pAntiCheat[i][GetHealth] = false;

    Spoiler anzeigen
    //Anti-Armour:
    new Float:cAHP;
    GetPlayerArmour(i, cAHP);
    if(cAHP > 200.0)
    {
    pAntiCheat[i][pCheat] = Max_Cheat-1;
    Cheat(i, "Armour-Cheat");
    continue;
    }
    else if(cAHP > pAntiCheat[i][pArmour])
    {
    if(pAntiCheat[i][GetArmour])
    {
    pAntiCheat[i][pArmour] = cAHP;
    Lag(i);
    }
    else
    {
    SetPlayerArmour(i, pAntiCheat[i][pArmour]);
    Cheat(i, "Armour-Cheat");
    }
    }
    else pAntiCheat[i][pArmour] = cAHP;
    pAntiCheat[i][GetArmour] = false;

    Spoiler anzeigen
    //Anti Weapon:
    for(new w = 0; w < 13; w++)
    {
    new pcweap[2];
    GetPlayerWeaponData(i, w, pcweap[0], pcweap[1]);
    if(pcweap[0] <= 0 || pcweap[1] <= 0)
    {
    pAntiCheat[i][pWeapon][w] = 0;
    pAntiCheat[i][pAmmo][w] = 0;
    continue;
    }
    if(pcweap[0] == 46)
    {
    pAntiCheat[i][pWeapon][w] = 46;
    pAntiCheat[i][pAmmo][w] = 1;
    continue;
    }

    Spoiler anzeigen
    if(pcweap[0] != pAntiCheat[i][pWeapon][w])
    {
    if(pAntiCheat[i][GetWeapon])
    {
    pAntiCheat[i][pWeapon][w] = pcweap[0];
    pAntiCheat[i][pAmmo][w] = pcweap[1];
    Lag(i);
    }
    else
    {
    pAntiCheat[i][GetWeapon] = true;
    DeletePlayerWeapon(i,pcweap[0]);
    Cheat(i, "Waffencheat");
    }
    }
    else
    {
    if(pcweap[1] < pAntiCheat[i][pAmmo][w]) pAntiCheat[i][pAmmo][w] = pcweap[1];
    else if(pcweap[1] > pAntiCheat[i][pAmmo][w])
    {
    if(pAntiCheat[i][GetWeapon])
    {
    pAntiCheat[i][pWeapon][w] = pcweap[0];
    pAntiCheat[i][pAmmo][w] = pcweap[1];
    Lag(i);
    }
    else
    {
    pAntiCheat[i][GetWeapon] = true;
    DeletePlayerWeapon(i,pcweap[0]);
    Cheat(i, "Waffencheat");
    }
    }
    }
    }
    pAntiCheat[i][GetWeapon] = false;
    }
    }

    Spoiler anzeigen
    stock j_GivePlayerWeapon(playerid, weaponid, ammo)
    {
    pAntiCheat[playerid][GetWeapon] = true;
    GivePlayerWeapon(playerid, weaponid, ammo);
    pAntiCheat[playerid][pWeapon][GetSlot(weaponid)] = weaponid;
    pAntiCheat[playerid][pAmmo][GetSlot(weaponid)] += ammo;
    return 1;
    }

    Spoiler anzeigen
    stock j_ResetPlayerWeapons(playerid)
    {
    pAntiCheat[playerid][GetWeapon] = true;
    ResetPlayerWeapons(playerid);
    for(new i = 0; i < 13; i++)
    {
    pAntiCheat[playerid][pWeapon][i] = 0;
    pAntiCheat[playerid][pAmmo][i] = 0;
    }
    return 1;
    }

    Spoiler anzeigen
    stock GetSlot(weaponx)
    {
    new slot;
    if(weaponx == 0 || weaponx == 1) slot = 0;
    else if(weaponx > 8 && weaponx < 10) slot = 1;
    else if(weaponx > 9 && weaponx < 16) slot = 10;
    else if(weaponx > 15 && weaponx < 20) slot = 8;
    else if(weaponx > 21 && weaponx < 25) slot = 2;
    else if(weaponx > 24 && weaponx < 28) slot = 3;
    else if(weaponx == 28 || weaponx == 29 || weaponx == 32) slot = 4;
    else if(weaponx == 30 || weaponx == 31) slot = 5;
    else if(weaponx == 33 || weaponx == 34) slot = 6;
    else if(weaponx > 34 || weaponx < 39) slot = 7;
    else slot = -1;
    return slot;
    }

    Spoiler anzeigen
    stock j_SetPlayerHealth(playerid, Float:hp)
    {
    pAntiCheat[playerid][GetHealth] = true;
    SetPlayerHealth(playerid, hp);
    pAntiCheat[playerid][pHealth] = hp;
    return 1;
    }

    Spoiler anzeigen
    stock j_SetPlayerArmour(playerid, Float:ahp)
    {
    pAntiCheat[playerid][GetArmour] = true;
    SetPlayerArmour(playerid, ahp);
    pAntiCheat[playerid][pArmour] = ahp;
    return 1;
    }

    Spoiler anzeigen
    stock j_GivePlayerMoney(playerid, amount, bool:mal100 = true)
    {
    pAntiCheat[playerid][GetMoney] = true;
    if(mal100)
    {
    GivePlayerMoney(playerid,amount*100);
    pAntiCheat[playerid][pMoney]+=amount*100;
    }
    else
    {
    GivePlayerMoney(playerid,amount);
    pAntiCheat[playerid][pMoney]+=amount;
    }
    return 1;
    }

    Es ist nun ein Beispiel, das selbe ist auch bei Waffen, Geld etc der Fall, wobei dies nicht so häufig geschieht...


    Ich habe gerade ein Anti-godmode gescriptet, welches noch nicht ganz funktioniert. um es zu testen haben wir uns abgeschossen und regelmäßig Leben gesetzt. Dabei waren so viele Fehlentscheidungen vom Script dabei, dass ich nun einfach euch Fragen möchte.


    Gerne poste ich Hier auch das Komplette anticheat :D



    Ich weiß auch nicht ob es sinnvoller ist, jedem Spieler beim connecten einen timer zu geben der für jeden Spieler individuell alles überprüft, oder ob ich den allgemeinen timer lassen soll, der alle Spieler durchgeht.
    Wir haben einen Leistungsstarken root, aber ob das sinn macht..

    Guten Tag


    Ich habe mir schon viele Anticheats angeguckt und viele selber gescriptet, habe jedoch immer wieder diese Probleme, das "nicht-cheaten" als cheat erkannt wird (auch bei bereits fertigen und "getesteten" includes und filterscripts hier im Forum.
    Cheaten wird zu 100% erkannt, jedoch wird viel zu oft ein Cheat im normalem Spielverlauf erkannt.


    Nehmen wir ein Beispiel, ein simples Anti-hp cheat:


    Ich nehme eine kontrollvariable:
    new Float:acHP[MAX_PLAYERS];


    ich habe das natürlich alles schön in Enums gepackt, sollte aber für ein kleines Beispiel so reichen..


    Wenn der Spieler nun conncten, deaktiviere ich erstmal den Anticheat bis er spawnt und setze sobald er erfolgeich gespawnt ist sämtliche Werte und aktiviere ihn dann:


    public OnPlayerSpawn(...)
    {
    GetPlayerHealth(playerid, acHP);
    AntiCheatAktivieren;
    }
    Nun bevor der Anticheat aktiviert wird, setze ich den Wert auf das Leben des Spielers. Nun wird der aktiviert und überprüft alle 750ms alle spieler die auf dem server sind:


    public timervon750ms()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(nicht aufm server oder anticheat deaktiviert) continue;


    new Float:checkHP;
    GetPlayerHealth(i, checkHP);
    if(checkHP > acHP[i]) //Hier wäre das ein Cheat-detect
    else acHP[i] = checkHP //hier wird dann das leben auf das abgefragte leben gesetzt, da es ja gleich oder tiefer ist (wenn er mal wo runtergefallen ist)
    }
    }


    Wenn ich nun das Leben im script setze mache ich das mit einer eigenen funktion:


    stock EigeneFunktion(playerid, Float:HP)
    {
    SetPlayerHealth(playerid, HP);
    acHP[playerid] = HP;
    }



    So sieht man es überall gelöst. Ich bin einen kleinen Schritt weitergegangen und habe mir überlegt, 2 Variabeln zu benutzen. die Eine ist ein boolean und sagt mir: der Spieler wird nun Leben bekommen oder nicht. die andere sagt mir, wie vorher, wieviel leben er maximal haben dürfte.
    ich frage also ab ob dieser nun mehr leben hat als er darf und wenn ja kontrolliere ich nochmal die 2. Variabel die mir sagt: oh er bekommt gerade leben und gebe ihm ein Lag-Warn oder sie sagt mir: ne der bekommt kein Leben und gebe ihm ein Cheat warn und setze die Variabel nach jeder Überprüfung auf false.
    ich dachte mir, dadurch werden einige Fehler korrigiert, da es eventuell sein kann das der timer sehr ungünstig ist und die überprüfung stattfindet wärend er leben bekommt. dies soll mit der 2. variabeln verhindert werden..



    Meine Frage ist nun: Wieso erkennt er sehr oft einen Cheat, obwohl es kein Cheat ist, gerne gebe ich auch mein Orignal Code, falls ihr den braucht.

    Simon: Was ist wenn diese Person aber schwimmt? Dann könnte der ja genauso einen Ban erhalten, oder halt die Strafe, die vom Script aus entschieden wurde.


    Das Wasser ist in einer Höhe von etwa 0.0. Wenn man darin schwimmt beträgt die maximale Höhe ich glaube ca 0-0.5. Ich habe sogar noch einen kleinen toleranz-bereich gelassen und lasse alles was über 2.5 schwimmt bannen.


    Jedoch ist das mit den Autos etwas schwieriger, weiß nicht genau ob da jemand ein bestimmtes Verhalten herausgefunden hat, was man abfragen kann..

    Erstmal solltest du MySQL benutzen, dies ist ganz einfach zu verstehen.


    Es gibt eine Handvoll MySQL Befehle die du im Internet schnell findest.
    Die zu verwenden tust du hauptsächlich mit ganz paar Befehlen. Also wer vernünftig Scripten will, der kann auch die Paar Befehle dazulernen die man braucht.



    Und dann wird die Schwierigkeit die am Anfang natürlich immer da ist gern gut geredet, da es ja passende Stocks gibt. Diese sind aber totaler Mist wenn man mal was größeres Scripten will.
    Wenn man das ganze noch mit Sscanf verbindet dann wird es nicht nur sehr einfach, sondern auch im Vergleich zu MySQL mit Stocks und DINI viel besser und schneller.

    Wie kann man einen Server besitzen, vorallem ein Selfmade Script, ohne zu wissen wo man das RCON Passwort finden kann.


    Das funktioniert doch gar nicht :D


    man MUSS die Server.cfg bearbeiten um ein Selfmade Script zum laufen zu bekommen, also erkläre mir mal bitte wie du den Server überhaupt Online bekommen hast :D

    Habs nun anders gelöst, ist zwar etwas doof, aber so wie ich es vorhatte würde es trotzdem nicht klappen.


    Aber die Frage finde ich trotzdem weiterhin interessant, könnte man bestimmt irgentwo gut gebrauche.
    Ich meinte ein bereits erstelles Array zu ändern. Oder auch einfach den Typ von einer Variablen zu ändern.


    Also das redefinieren von erstellten variabeln, ob typ, ob größe...

    Gibt es eine Möglichkeit, die größe eines Arrays zu ändern.


    Also ich erstelle ein Array:


    new Array[MAX_PLAYERS][50];


    nun möchte ich an einer anderen Stelle die größe ändern zu:
    new Array[MAX_PLAYERS][25];
    Dabei dürfen die Werte die bereits darin gespeichert sind aber nicht verloren gehen, also wenn ich was in Array[MAX_PLAYERS][0] - Array[MAX_PLAYERS][24] gespeichert habe, dürfen die Werte nicht verloren gehen.

    Gibt es ein Codeschnipsel in dem man ein bestimmtes Zeichen aus einem String löschen kann.


    Beispiel:
    new kommastr[50];
    format(kommastr,sizeof(kommastr),"Hallo, ich, heiße, Simon");
    und nun will man alle Kommas raus haben und macht zum Beispiel:
    Chardel(kommastr,',');
    und der neue string ist: "hallo ich heiße Simon"