Beiträge von Splash

    Nutze format und strcat.


    Beispiel:


    new str[128];
    format(str,sizeof(str),"Dieser Satz");
    strcat(str," wurde hier weitergeschrieben.",sizeof(str));


    //Würde mit printf das ausgeben:
    printf("Ausgabe: %s",str);
    //Ausgabe: Dieser Satz wurde hier weitergeschrieben.


    ^Würde dein Problem mit input line to long lösen^^

    Was du meinst sind die Spieler die auf so und soviel Servern spielen. Derzeitig sind laut SA:MP 5248 Server online wobei 43362 Spieler auf SA:MP Servern spielen.


    Im Clienten ist dies wie folgt zu lesen:


    Servers: x players, playing on x servers. (x player slots available)


    Kleiner Tipp solltest du nach Server suchen nutze am besten SACNR Monitor. (Hier sind alle Server vertretten)

    Nunja, ich verwende z.Z. ZCMD und schreibe aktuell wenige Befehle in den Public OnPlayerCommandText.
    Zudem wird, wenn ich ein falschen Befehl eingegeben habe, die Fehlermeldung nicht angezeigt sondern "Unknow Command".


    Bei zcmd funktioniert kein OnPlayerCommandText mehr. Siehe dazu den Hinweis von ZeeX:

    Zitat

    Important: Since v0.3 OnPlayerCommandText cannot be used anymore (also ZCMD_NO_CALLBACK option has been removed), but there are two new callbacks instead


    Dafür werden diese beiden genutzt:


    OnPlayerCommandReceived(playerid, cmdtext[]) //Wenn ein Spieler einen Befehl sendet
    und
    OnPlayerCommandPerformed(playerid, cmdtext[], success) //Wenn ein Befehl von einem Spieler ausgeführt wurde.


    Hierbei kannst du bei dem zweiten Callback dies nutzen:


    OnPlayerCommandPerformed(playerid,cmdtext[],success)
    {
    if(!success) // Befehl existiert nicht
    {
    SendClientMessage(playerid,COL_WHITE,"FEHLER");
    }
    return 1;
    }


    Mehr zum Include solltest du dir in dem entsprechenden Thema rauslesen: zcmd Topic

    Sorry aber dieses "Basic" Gamemode ist nicht zu verantworten...


    Grund:


    Es wird nicht DB_Escape genutzt was ein injecten der Datenbank möglich macht und sollte man darauf etwas aufbauen wollen, es einem Spieler ermöglicht sich als ein Admin einzuloggen.


    Siehe dazu auch ein Beispiel von d0. :



    PS: An die anderen es heisst immer noch SQLite und nicht SQLLite oder SQL-Lite.

    Logisch oder?


    new float:x,float:y,float:z; // <- deklarierst x,y,z
    GetPlayerPos(x,y,z); //bekommst x,y,z
    format(string,sizeof(string),"Datenbank Eintrag: x: %f | y: %f | z: %f | Name: %s",x1,y1,z1,name1); // <- nutzt x1,y1,z1


    PS: Du deklarierst 2 Mal die 3 Floats.


    EDIT:


    CMD:test(playerid,params[])
    {
    new name[128]:Float:zPos[3],query[258];
    if(sscanf(params,"s[128]",name)) return SendClientMessage(playerid,FARBE,"NUTZUNG: /test [name]");
    {
    GetPlayerPos(playerid,zPos[0],zPos[1],zPos[2]);
    format(string,sizeof(str),"Datenbank Eintrag: x: %f | y: %f | z: %f | Name: %s",zPos[0],zPos[1],zPos[2],name);
    SendClientMessage(playerid,COLOR_GREEN,str);
    format(query,sizeof(query),"INSERT INTO autos x='%f',y='%f',z='%f',name='%s",zPos[0],zPos[1],zPos[2],name);
    mysql_function_query(Data,query,false,"","");
    }
    return 1;
    }

    enum TTollGate
    {
    GateID,
    GateStatus,
    Float:OpenX,
    Float:OpenY,
    Float:OpenZ,
    Float:RotX,
    Float:RotY,
    Float:RotZ,
    TimeToClose
    }
    new ATollGates[MAX_TOLLS][TTollGate];


    Dazu dieser Stock:


    stock AddTollGate(GateModel, Float:OX, Float:OY, Float:OZ, Float:RX, Float:RY, Float:RZ)
    {
    for (new TollGate;TollGate<MAX_TOLLS;TollGate++)
    {
    if (ATollGates[TollGate][GateID] == 0)
    {
    ATollGates[TollGate][GateID] = CreateDynamicObject(GateModel, OX, OY, OZ, RX, RY, RZ,-1,-1,-1,250);
    ATollGates[TollGate][GateStatus] = 0;
    ATollGates[TollGate][OpenX] = OX;
    ATollGates[TollGate][OpenY] = OY;
    ATollGates[TollGate][OpenZ] = OZ;
    ATollGates[TollGate][RotX] = RX;
    ATollGates[TollGate][RotY] = RY;
    ATollGates[TollGate][RotZ] = RZ;
    break;
    }
    }
    }


    Dann das Object mit AddTollGate ganz normal wie CreateDynamicObject verwenden.


    Beispiel:


    #define MAX_TOLLS 100


    forward GateCheck(playerid);


    public OnGameModeInit()
    {
    AddTollGate(968,1751.79700, 521.95441, 27.55070, -3.00000, -90.00000, 341.42651);
    SetTimer("GateCheck",1000,1);
    return 1;
    }


    public GateCheck(playerid)
    {
    for (new TollGate; TollGate < MAX_TOLLS; TollGate++)
    {
    if (ATollGates[TollGate][GateID] != 0)
    {
    if(IsPlayerInRangeOfPoint(playerid,10,ATollGates[TollGate][OpenX], ATollGates[TollGate][OpenY], ATollGates[TollGate][OpenZ])) //hier wird abgefragt ob der Spieler in der Nähe des kreierten Gates ist!
    {
    if(ATollGates[TollGate][GateStatus]==0) //Gate/Tor ist geschlossen
    {
    MoveDynamicObject(öffnen);
    }
    }
    }
    if(ATollGates[TollGate][GateStatus]==1)
    {
    if(ATollGates[TollGate][TimeToClose]==DEINE_ZEIT_HIER)
    {
    MoveDynamicObject(schliessen);
    ATollGates[TollGate][TimeToClose]=0;
    ATollGates[TollGate][GateStatus]=0;
    }
    else
    {
    ATollGates[TollGate][TimeToClose]++;
    }
    }
    }
    return 1;
    }


    Nun nutzt ihr nur einen Timer und könnt weitere Tore simple mit der Funktion unter OnGameModeInit oder OnFilterScriptInit einfügen.


    Credits: PowerPC aus dem Gamemode PPC_Trucking. ^^

    Pseudocode:


    new bool:Banned[MAX_PLAYERS];


    public ServerTimer()
    {
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(GetPlayerPing(i) >= 300)
    {
    new string[128];
    format(string,sizeof(string),"Server | %s wurde vom Server gekickt. Grund: High-Ping (>300)",PlayerName[i]);
    SendClientMessageToAll(COLOR_BLASSRED,string);
    SetTimerEx("KickTimer",500,false,"i",i);
    }
    if(Banned[i]==false)
    {
    new w = GetPlayerWeapon(i);
    if(w == 38 || w == 37 || w == 36 || w == 35 || w == 39 || w == 40 || w == 18 || w == 9 || w == 8)
    {
    new query[128], string[128];
    format(string,sizeof(string),"Server | %s wurde vom Anti-Cheatsystem gebannt. Grund: Waffenhack",PlayerName[i]);
    SendClientMessageToAll(COLOR_BLASSRED,string);
    SetTimerEx("BanTimer",500,false,"i",i);
    format(query, sizeof(query), "INSERT INTO BanLog (Benutzer, Grund, Admin) VALUES ('%s', 'Waffenhack', 'Anticheat')", PlayerName[i]);
    mysql_query(query);
    mysql_free_result();
    Banned[i]=true;
    }
    return 1;
    }
    }
    return 1;
    }


    PS: Deine strings müssen auch nicht so groß sein, kannst maximal nur 128 Zeichen im Chat pro Zeile wiedergeben.

    Wäre auch mit einem Array getan ^^


    Beispiel:


    new LevelName[7][24] =
    {
    {"Player"},
    {"Admin LVL 1"},
    {"Admin LVL 2"},
    {"Admin LVL 3"},
    {"Admin LVL 4"},
    {"Co-Owner"},
    {"Owner"}
    }


    Nutzung mit deiner Abfrage:


    LevelName[SpielerInfo[playerid][pAdmin]]


    Bitte nicht vergessen das es auch ein pAdmin 0 gibt, daher Player oder auch Spieler mit in den Array ^^

    Erstelle eine Spielervariable und frage ab ob sie 0 ist, wenn ja und er gebannt wird setze sie auf 1.


    Da dadurch dass der ServerTimer 1 Sekunde hat und der Bantimer 2 Sekunden es so gesehen 3 mal auch detected wird.


    1 mal durchgelaufen = Cheater gefunden, setze Timer auf 2 Sekunden
    während der Bantimer die erste Sekunde durchläuft, hat der ServerTimer jedoch schon wieder eine Sekunde weg und da der Spieler noch Online ist, wird er nochmals detected
    Nun ist der BanTimer endlich bei seiner 2ten Sekunde angekommen und kann nun den Spieler kicken, da aber der ServerTimer wie ich mir denke vor deinem BanTimer aufgerufen wird detected ihn es ein drittes mal und es kommt auch ein drittes mal diese Nachricht.


    Zumal ein Timer von 500>250 ms sogar reichen würde um den Spieler zu kicken ^^

    stock GetPlayerSpeed(playerid)
    {
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid))
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 179.28625;
    return floatround(ST[3]);
    }


    Nun kannst du die Funktion GetPlayerSpeed(playerid) da nutzen wo du die Geschwindigkeit bekommen möchtest.


    Beispiel:


    forward SpeedTimer(playerid);


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
    {
    SetTimer("SpeedTimer",1000,1);
    }
    return 1;
    }


    public SpeedTimer(playerid)
    {
    printf("%d km/h",GetPlayerSpeed(playerid));
    return 1;
    }