Beiträge von Goldkiller

    Einige Fehler,es funktioniert nicht mal richtig.


    if (strcmp("/vstats", cmdtext, true, 10) == 0)
    {
    new string[64];
    format(string, sizeof(string), "Antworten\nJa: %d\nNein: %d", countja, countnein);
    ShowPlayerDialog(playerid, DIALOG_VSTATS, DIALOG_STYLE_INPUT, "[VS] Statisktik", "Bitte geben Sie die Frae ein.\nDie Frage sollte man mit 'Ja' und 'Nein' beatworten können", "Ok", "Abbr.");
    return 1;
    }

    Es gibt zu DIALOG_VSTATS keine Abfrage in OnDialogResponse,daher ist der Text falsch.Zusätzlich noch Rechtschreibfehler "Frae"


    Was macht OnGameModeInit,Exit und OnPlayerRequestClass in einem Filterscript,was nix mit Klassen zutun hat?
    public OnGameModeInit()
    {
    //Du darfst das hier nicht benutzen, wenn du ein Filterscript erstellst!
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    public OnGameModeExit()
    {
    return 1;
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    public OnPlayerRequestClass(playerid, classid)
    {
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
    }


    if(dialogid == DIALOG_VOTEADM)
    {
    if(response == 1)
    {
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    new string[128];
    format(string, sizeof(string), "&s", inputtext);
    ShowPlayerDialog(i, DIALOG_VOTEUSR, DIALOG_STYLE_MSGBOX, "[VS]Votesystem", string, "Ja", "Nein");
    }
    }
    }

    Die format-Zeile ist falsch, & anstatt %. Du brauchst dort sowieso keinen String zu formatieren,da die Frage sowieso schon in inputtext steht.Eine IsPlayerConnected-Abfrage wäre auch gut,sonst machst du den Code vllt 500x obwohl nur 1 Spieler auf dem Server ist.Folgendes würde ich dir auch empfehlen,denn man brauch hier nicht extra den Text zu formatieren.
    ShowPlayerDialog(i, DIALOG_VOTEUSR, DIALOG_STYLE_MSGBOX, "[VS]Votesystem", inputtext, "Ja", "Nein");

    Da gibts eigentlich nicht viel zu erklären.
    Mit GetTickCount bekommst du einen Wert zurück,der besagt welche "Zeit" wir gerade haben.Wie ein Datum kannst es dir vorstellen für irgendeinen Tag, nur eben für eine Zeit. Der Tick repräsentiert also irgendeinen Zeit, genau genommen die,wann er abgefragt wurde.Die Serveruhr,die den Tick zurück liefert,läuft ständig weiter und erhöht sich pro ms ( 1 tick = ms ) um 1.
    Wenn du also weisst, welchen Tick wir gerade haben und du rechnest 20 * 1000 Ticks drauf ( also 20 Sekunden ) , dann weisst du, welchen Tick wir in 20 Sekunden haben. Jetzt brauchst du nur noch Abfragen,ob der Tick schon erreicht wurde. Das ist natürlich nur eine Abfrage ob der aktuell zurückgelieferte Tick größere oder kleiner ist,da die Serveruhr ja ständig weiter läuft.


    Einen Nachteil hat GetTickCount allerdings schon,kannst ihn ja hier nachlesen:
    http://wiki.sa-mp.com/wiki/GetTickCount
    Glaube das Problem haben nur die wenigstens,denn wieso sollt ein Server mehr als 24 Tage ohne Neustart laufen :-O ...

    Das klappt auch problemlos ohne Timer, man brauch dafür nur GetTickCount() benutzen. Für sowas brauch man definitiv keinen Timer ...


    new BefehlFrei[MAX_PLAYERS];
    BefehlFrei[playerid] = GetTickCount() + 20 * 1000; // Wenn der Befehl ausgeführt wurde , sperren wir ihn für 20 Sekunden


    if( BefehlFrei[playerid] < GetTickCount() ) { // Befehl noch nicht wieder frei ! }

    Wie soll es denn ausgegeben werden ?
    Du solltest den String einmalig formatieren, da du ja zu allen Spielern den gleichen String senden möchtest. Lediglich das Senden sollte in der Schleife vorkommen. Anstatt die Schleife wäre auch SendClientMessageToAll nützlich,wenn es wirklich an ALLE gesendet werden soll.
    Du brauchst auch sowieso nicht 3x format, 1x tut es auch:
    format(string3,sizeof(string3),"%s %s: %s",alevel,SpielerName(playerid),text);
    "alevel" muss auch nicht 128 Zellen Groß sein, 22 tut es bei dir in diesem Fall auch.


    Genau genommen brauchst du die Variable "text" auch nicht, du kannst auch direkt params verwenden. Müsstest allerdings prüfen ob params leer ist ( isnull Funktion wäre sinnvoll ).

    Was du dort gerade machst ist irgendwie unvorteilhaft. Bist du dir denn übrigens sicher,dass du das Plugin von Strickenkid benutzt?
    mysql_query gibt kein Array zurück sondern nur folgendes:

    Zitat

    Returns 0 on success, error code (non-zero) on fail.


    Daher ist ein Array ( query ) überflüssig bzw du müsstest dort den Index angeben. zB würde folgendes funktionieren:
    query[4] = mysql_query( ... ); // In index 4 Wert ablegen


    Schau dir mal dieses Beispielscript an:
    http://www.strickenkid.com/mysql_plugin/example.pwn
    Dort siehst du,wie mysql_fetch_row genutzt wird.


    //Edit:
    Dann halt so,
    mysql_query("SELECT * FROM fahrzeuge WHERE ID=0");
    Wieso WHERE ?
    mysql_query("SELECT * FROM fahrzeuge");
    Du benutzt auch sscanf total falsch :/.
    new id, name[128], typ, Float:x, Float:y, Float:z, Float:r, f1, f2;
    sscanf(result,"p<|>isiffffii",id, name, typ, x, y, z, r, f1, f2);
    Du kannst sowieso kein floatstr in sscanf benutzen... Jedenfalls macht es kaum einen Sinn. Je nachdem welche sscanf Version du nutzt,musst du bei s auch die Arraygröße angeben.

    Okay,
    while(mysql_num_rows()) { // Soll alle Zeilen in der Tabelle durchgehen <-- macht es aber nicht.
    Angenommen du hast eine Zeile,gibt mysql_num_rows() dir immer 1 zurück.Daher ist die while() Bedingung immer wahr,daher auch die Endlosschleife.


    Du musst die aktuelle Zeile auslesen und die "markierte" Zeile weiter schieben.
    Heisst du startest beim lesen in Zeile 1. Ist Zeile 1 vorhanden ließt du sie und der Leseindex wird auf 2 gesetzt.Nun willst du Zeile 2 auslesen. Ist diese vorhanden, wird sie ausgegeben und der Leseindex wandert wieder einen weiter bis es an einen Leseindex stößt, wo kein Eintrag vorhanden ist.
    Müsste diese Funktion sein,
    http://wiki.sa-mp.com/wiki/MySQL_Plugin#mysql_fetch_row


    Die Funktion müsste die Zeile prüfen und gibt gegenfalls 1 oder 0 zurück und bewegt dann den Leseindex weiter.
    Leseindex ist vllt nicht der richtige Begriff, lässt sich aber denk ich damit gut verstehen.

    Kannst du auch.
    Du nimmst einfach den Rest,
    new ms = ( t2 - t1 ) % 1000;


    //Edit:
    Vielleicht interessiert dich ja diese Funktion:
    stock ConvertMSec(msecs,&msec,&sec,&min,&hour) {
    new
    rest;
    sec = 0;
    min = 0;
    hour = 0;
    msec = 0;
    hour = (msecs / ((60*60) * 1000));
    rest = (msecs % ((60*60) * 1000));

    min = (rest / (60 * 1000));
    rest = (rest % (60 * 1000));

    sec = (rest / 1000);
    rest = (rest % 1000);
    msec = rest;
    return 1;
    }

    Also haben alle Threads falsch gemacht? z.B. hier Click ! wtf?
    Frage1: Ist die höchste string größe nicht "128"?
    Frage2: string[0] = '\0'; // Für was ist das? warum unbedingt 0 und \ ?


    Frage 1. Nein, ist es nicht.Alleine schon ein Array anzulegen mit MAX_PLAYERS ist bei den meisten 500 und somit deutlich mehr als 128 ;) . Es gibt Limits für den Chat, dort war es früher 128 Zeichen. Jetzt ist es aber ~140 wegen den Farbcodes.
    Frage 2. \0 ist NULL-Character.Gibt an, dass der Text an dieser Stelle endet.Eigentlich sollte der String beim neu deklarieren sowieso dort einen NULL-Character habe, ich mach es aber aus gewohnheit immer dazu.


    Zitat

    Also haben alle Threads falsch gemacht? z.B. hier Click ! wtf?


    Ich poste nicht in jeden Thread und sehe auch nicht jeden. Dennoch,dort ist es ebenfalls falsch, gut gemerkt ;).

    Zitat

    Das hier sollte 100% funktioniert. Wurde auch getestet!


    Das glaub ich dir gerne,macht es trotzdem nicht richtig. Du hast es sicherlich nur mit einem Spieler getestet, daher wohl fehlerfrei.Mit mehr als einem Spieler funktioniert es nicht. Denn sobald
    ein Spieler gefunden wird mit Wanteds, wird für den Spieler der Dialog angezeigt. Nur sein Name taucht in dem Dialog auf. Wird ein weiterer Spieler gefunden, werden seine Daten formatiert und jetzt taucht nur dieser im Dialog auf. Heisst,du beachtest nicht ob zuvor schon Jemand mit Wanteds gefunden wurde.Auch im format ist ein Fehler, playerid anstatt i.
    Das else if ist ebenfalls falsch gesetzt.Hat ein Spieler keine Wanteds, kommt für ihn die Nachricht "Derzeit hat kein Spieler einen Wanted!" und das jedes mal wenn ein Spieler keine Wanteds hat.


    So ist es richtig, schau es dir mal an... vielleicht lernst du etwas daraus ;).
    ocmd:wanted(playerid,params[])
    {
    if(!isPlayerACop(playerid)) return SendClientMessage(playerid,COLOR_ROT,"Du bist kein Beamter");
    {
    new
    string[ 256 ]; // <- wir brauchen einiges an Speicher. Sollte aber ausreichen so
    string[0] = '\0';
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(GetPlayerWantedLevel(i) >=1)
    {
    format(string,sizeof(string),"%s%s(ID:%d) - %d Wanteds\n", string, SpielerName(i),playerid, GetPlayerWantedLevel(i));
    //SendClientMessage(playerid,COLOR_ROT,"-----Wanteds-------");
    //format(string, sizeof(string), "%s(ID:%d) - %d Wanteds\n", SpielerName(i),playerid, GetPlayerWantedLevel(i));
    //SendClientMessage(playerid,BLAU,string);
    // ShowPlayerDialog(playerid,DIALOG_WANTED,DIALOG_STYLE_MSGBOX,"Wanteds",string,"Weiter","Abbrechen");
    }
    /*
    else if(GetPlayerWantedLevel(i) == 0)
    {
    SendClientMessage(playerid,COLOR_ROT,"Derzeit hat kein Spieler einen Wanted!");
    }*/

    }
    if(string[0]) {
    ShowPlayerDialog(playerid,DIALOG_WANTED,DIALOG_STYLE_MSGBOX,"Wanteds",string,"Weiter","Abbrechen"); // Sicher DIALOG_STYLE_MSGBOX und nicht vllt LIST ?
    }
    else { // Wir haben keinen text formatiert, daher wohl auch Niemanden gefunden!
    SendClientMessage(playerid,COLOR_ROT,"Derzeit hat kein Spieler einen Wanted!");
    }
    }
    return 1;
    }


    //Edit: Wird ja wieder grandios eingerückt :\

    Das geht ganz leicht mit GetTickCount().
    Grundgerüst sieht so aus:
    new t1,t2;
    t1 = GetTickCount();
    // Speicherprozedur
    t2 = GetTickCount();
    printf("Es hat %d Sekunden gedauert", ( t2 - t1 ) / 1000 ) ;

    Nimmst also den Tickcount von Anfang und Ende,rechnest die gegeneinander und hast die ticks die vergangen sind dazwischen. 1 tick ist 1 ms, daher / 1000 für Sekunden.

    AddStaticVehicleEx(typ2,floatstr(x),floatstr(y),floatstr(z),floatstr(r),farbe3,farbe4,-1); // Fahrzeug sollte hier erstellt werden mit den Koordinaten
    SetVehicleNumberPlate(id2, name); // Fahrzeug mit einem neuer Schildnummer ausstatten

    Du solltest SetVehicleNumberPlate auf die vehicleid beziehen,die dir von AddStaticVehicle zurückgegeben wird.
    printf("%i, %f, %f, %f, %f, %i, %i", id2, floatstr(x),floatstr(y),floatstr(z),floatstr(r), farbe3, farbe4); // Meine Ausgabe
    Lass dort noch zusätzlich die ModelID ( typ2 ) ausgeben. Versuch auch mal damit zu debuggen.
    printf("DEBUG: AddStaticVehicleEx = %d", AddStaticVehicleEx(typ2,floatstr(x),floatstr(y),floatstr(z),floatstr(r),farbe3,farbe4,-1) );

    Was heisst denn bei dir "kann nichts in den Chat schreiben".
    Öffnet sich der Chat nicht um einen Text einzugeben ODER wird der abgesendete Text nicht im Chat angezeigt ?
    Falls letzteres, musst du mal OnPlayerText überprüfen und gegenfalls hier mal posten.


    aber gutes system 8/10


    Wenn du sowas schreibst,kannst auch gerne erwähnen was dir nicht gefällt oder was dir dort fehlt.


    MySQL brauch mal sogesagt nicht
    bei mir hat es auch mit Dini hingehauen und das Problemlos


    Öööhm, du meinst gPM mit dini ? Das funktioniert niemals ohne riesigen Aufwand es umzuschreiben :p.


    Habs drin...nur wie erhält der User jetzt eine Message wenn er sich einloggt das er eine neue PM hat...dies klappt nämlich noch nicht...


    Gruß Fahne


    Der Spieler erhält einen Hinweis, entweder wenn er zur Zeit des Empanges online ist ( a) ) oder er den Server betritt und er eine ungelesene Nachricht im Posteingang hat ( b) ).Der Spieler muss sich nicht einloggen, da ich eigentlich davon ausgehe,dass Usernamen per GM / FS gesichert sind. Werde aber demnächst eine Funktion hinzufügen, um das Postfach von gPM aus zu sichern.
    Eine Verknüpfung wäre sicherlich möglich mit einem vorhandenem Login-Script.


    Ansonsten,danke für die Kommentare.

    Musste erst mal googlen was überhaupt "now.in" ist ... .
    Man kann ja seit SA:MP 0.3d ohne Plugins Webcasts abspielen lassen. Wenn du die URL zu deinem Webcast / Radio hast,dann kannst du das natürlich Ingame abspielen lassen mit PlayAudioStreamForPlayer abspielen. Wo du die URL her bekommst kann ich dir nicht verraten,kenne "now.in" nicht :p .