Beiträge von SBIKA

    Einigen ist sicherlich aufgefallen, dass SendClientMessageTo* im gegensatz zu normalem Chat keinen automatischen Umbruch vollzieht, damit alle Spieler den Text in voller laenge sehen koennen. Der Text verschwindet bei niederigeren Aufloesungen, da der Text einfach ueber die Laenge des Bildschirms hinaus geht. Diese schlampig programmierte Funktion die aus meiner langeweile herraus entstand und nur kurz getestet wurde soll das problem beseitigen.


    Nutzung:
    SendClientMessageToAll_lineBrea( text ); / SendClientMessageToAll_lineBrea( text, color );
    bzw.
    SendClientMessageToAll_lineBrea( text, color, beliebigeZahl );
    Die beliebige Zahl gibt an, nach wievielen buchstaben ein Umbruch folgen soll. Ohne Angabe dieser Zahl geschieht der Umbruch nach 86 Zeichen und ist somit an fast gleicher Stelle, wie der Chat-Message umbruch.
    Kann zu unerwarteten Laengen kommen, sofern {}-farben verwendet werden, da diese fuer den Client unsichtbar sind, von diesem Script aber mitgezaehlt werden.


    stock memcpythisplease( dst[], src[], maxlen, offsetSrc = 0, offsetDst = 0 )
    {
    // we cant use pointers so we gotta use offsets
    // this function is for strings only
    if ( maxlen > (strlen(dst) - offsetDst) )
    maxlen = (strlen(dst)-offsetDst);
    for ( new i = 0; i < maxlen; i++ )
    {
    dst[i+offsetDst] = src[i+offsetSrc];
    }
    }
    #define MAX_PLAYER_TEXT_ONSCREEN 86
    stock SendClientMessageToAll_lineBrea( textToShow[], color = 0xFFFFFFFF, lineBreakAfter = MAX_PLAYER_TEXT_ONSCREEN,
    textToS_size = sizeof textToShow )
    {
    new copyCat = 0;
    while ( strlen(textToShow) > lineBreakAfter )
    {
    copyCat = textToShow[lineBreakAfter-1];
    textToShow[lineBreakAfter-1] = 0;
    SendClientMessageToAll(color,textToShow);
    textToShow[lineBreakAfter-1] = copyCat;
    memcpythisplease( textToShow, textToShow, textToS_size, (lineBreakAfter-1), 0 );
    }
    SendClientMessageToAll(color,textToShow);
    }
    Fuer das k von break war kein Platz mehr ;)
    Kann mit leichtigkeit fuer SendClientMessageToPlayer ummodifiziert werden.

    Also das Wiki sagt uns folgendes: Limits
    Text I/O 128 cells (512 bytes)


    Also kann der Text 128 Zellen (gleich 512 bytes) enthalte.


    edit: ASCII nutzt 7 Bit strukturen, welche jeweils zwei Werte (1 u 0) annehmen können. 2^7 = 128.


    Dass ASCII 7 bit (bzw. wenn man die extended ASCII Zeichen mit zaehlt alle 8 bit eines bytes) nutzt hat aber nichts mit der maximalen Zeichenlaenge zu tun. Normaler weise ist ASCII nur 1 byte lang, aber pawn scheint wohl alles in 4byte zu packen, daher sind die 128 Zeichen dort als 512 byte anstatt 128 byte aufgelistet.


    SA-MP hat eine maximale textlaenge von 128 zeichen.
    Was MasterX4 beschreibt ist ein normaler Chat-Text. Dieser wird nach x-Zeichen (habe sie nicht gezaehlt) in eine neue Zeile geschoben. Mit SendClientMessage* Nachrichten wird das nicht gemacht. Sie gehen einfach ueber die Laenge des Bildschirms hinaus, haben jedoch ebenfalls eine maximale text-laenge von 128Zeichen.
    Wenn nun der vom domme erstellte command 'o' verwendet wird und 128zeichen gesendet werden wird der Text zum ende hin abgeschnitten, da nur 128 Zeichen erlaubt sind und am Anfang noch Zeichen hinzugefuegt werden und danach wird noch etwas visuell abgeschnitten, sofern die Bildschirm aufloesung zu klein fuer 128Zeichen in einer Reihe ist.
    Um dieses problem zu loesen muesste man die strlen vom Input string nehmen und wenn sie > ist als x-zeichen wird der Restliche Teilstring mit einem seperaten SendClientMessage* gesendet.


    Pseudo-code von dem was ich meine:

    #define MAX_PLAYER_TEXT_LENGTH (128)


    dcmd_o(playerid,params[]) {
    new Text[MAX_PLAYER_TEXT_LENGTH];
    new newText[MAX_PLAYER_TEXT_LENGTH+123]; // 123 = Ersetzen mit erwarteter Laenge von 'GetPVarInt(playerid,"Alter"),GetName(playerid),playerid'
    new copyCat;
    if(SpielerEingeloggt[playerid] == 0) { return SendClientMessage(playerid,rot,"Du bist nicht eingeloggt!"); }
    if(sscanf(params, "s",Text)) { return SendClientMessage(playerid,rot,"Nutzung: /o [Text]"); }
    format(newText,sizeof newText," (( %d* %s[%d]: %s ))",GetPVarInt(playerid,"Alter"),GetName(playerid),playerid,Text);
    if ( strlen(newText) > MAX_PLAYER_TEXT_LENGTH ){ copyCat = newText[MAX_PLAYER_TEXT_LENGTH-1]; newText[MAX_PLAYER_TEXT_LENGTH-1] = 0; }
    SendClientMessageToAll(weiss,string);
    newText[MAX_PLAYER_TEXT_LENGTH-1] = copyCat;
    SendClientMessageToAll(weiss,&newText[MAX_PLAYER_TEXT_LENGTH-1]);
    return 1;
    }
    Fehler garantie: Garantiere dass Fehler drin sind.


    Edit:
    Habe mal den pseudo-code in echten code umgewandelt. Ohne pointer ist das eine echt bloede Aufgabe soetwas zu entwickeln und memcpy ist ohne pointer auch mehr Dekoration als nuetzlich.
    Link: http://forum.sa-mp.de/san-andreas-multiplayer/scripting-base/18-nützliche-codeschnipsel-26#post589437

    In der gta3.img mal sowieso nicht, da das die vorhandene Datei von GTA San Andreas ist, ansonsten müssten Fahrzeugmods u.ä. gelöscht werden. Ich schau mal nach, ich befürchte das Ladebild irgendwo in folgenden Dateien:
    custom.img
    SAMP.img
    SAMPCOL.img
    Ich schau ebend....


    Der sa-mp screen war schon dort bevor diese Dateien hinzugefuegt wurden. In den Dateien befinden sich die SA-MP objekte.
    Ich wuerde eher in der dll Datei und in der saa Datei suchen. Die saa Datei ist jedoch verschluesselt und bei der dll sind die resource Daten vermutlich komprimiert.

    Hab einen Befehl erstellt, bei dem in einem Auto mit ID 405 bei Eingabe von "/Transporter" ein Auftrag gestartet wird.


    new vehicleid = GetPlayerVehicleID(playerid);
    new model = GetVehicleModel(vehicleid);
    if(model == 405)
    {


    Du hast anstatt der vehicleid die modelID mit 405 verglichen. Bei ModelID 405 sind alle Sentinel betroffen.
    BTW. ich wuerde auch eine Nachricht geben, wenn sich der Spieler nicht in der angegebenen Range befindet, ansonsten ist es doch ein wenig komisch fuer den Nutzer gar keine Antwort auf einen Befehl zu bekommen.


    @Tommy
    auf minimap spieler anzeigen
    ShowPlayerMarkers(1); bzw. ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL);


    HEiTZER
    IsTrailerAttachedToVehicle(vehicleid); - um ueberhaupt festzustellen, ob ein Trailer an dem Vehicle ist.
    GetVehicleTrailer(vehicleid); - um die TrailerID von dem Vehicle zu bekommen.

    Und beispielsweise United Multiplayer ist wieder was komplett selbstgescriptetes oder wie?


    United Multiplayer ist SA-MP. Es wurde von den SA-MP entwicklern lediglich so modifiziert, dass das anti-cheat die von GTA:United modifizierten Dateien akzeptiert.

    Entweder du speicherst in irgendeiner variable, dass der User gerade den ammucenter pickup gefunden hat und ueberpruefst die Variable in einem /enter command, oder du ueberpruefst einfach, ob der Spieler sich in einem gedachten Rechteck um den Pickup befindet wenn dieser /enter eingibt. Ich wuerde das zweite bevorzugen, da es mir weniger stoeranfaellig erscheint. Das pickup waere im 2ten Fall jedoch eher dekoration damit der User weiss das dort eine teleport Moeglichkeit besteht.

    number of arguments does not match definition
    Bedeutet soviel wie, dass du nicht die korrekte anzahl an argumenten/parametern der funktion uebergibst..


    include/a_vehicles.inc verraet uns wie die Function korrekt aufzurufen ist:
    CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay);


    Du hast die rotation vergessen...

    Kein wunder wenn man bei dem durcheinander den ueberblick verliert. Deadwalker lag schon ganz richtig mit seiner Aussage.
    Hier ist dein Code mit uebersichtlicheren Einrueckungen, so gehen die Klammern nicht so leicht verloren. Bin mir nicht sicher, ob OnPlayerSelectedMenuRow einen wichtige rueckgabe wert hat, aber in dem Fall wuerde ich das return 1, wie es Deadwalker vorschlug, in die einzelnen if() setzen und ueberpruefen, ob eine korrekte Auswahl getroffen wurde ( 'default: return 0;' ).
    public OnPlayerSelectedMenuRow(playerid, row)
    {
    if(GetPlayerMenu(playerid) == test4)
    {
    switch(row)
    {
    case 0:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 1:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 2:
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Gratuliere, jetzt folgt die praktische Prüfung.");
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Steigen Sie bitte in das weiße Fahrzeug und fahren Sie die Checkpoints ab.");
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Fahren Sie dabei nicht schneller als 80 km/h.");
    TogglePlayerControllable(playerid, 1);
    praxis(playerid);
    SetPlayerInterior(playerid,0);
    }
    case 3:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 4:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 5:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);


    }
    case 6:
    {
    HideMenuForPlayer(test4,playerid);
    TogglePlayerControllable(playerid, 1);
    }
    }
    }
    else if(GetPlayerMenu(playerid) == test3)
    {
    switch(row)
    {
    case 0:
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Gratuliere für die richtige Antwort! Es folgt Frage 4.");
    ShowMenuForPlayer(test4,playerid);
    testt4(playerid);
    }
    case 1:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 2:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 3:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 4:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 5:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 6:
    {
    HideMenuForPlayer(test3,playerid);
    TogglePlayerControllable(playerid, 1);
    }
    }
    }
    else if(GetPlayerMenu(playerid) == test2)
    {
    switch(row)
    {
    case 0:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 1:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 2:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 3:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 4:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 5:
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Gratuliere für die richtige Antwort, es folgt Frage 3.");
    ShowMenuForPlayer(test3,playerid);
    testt3(playerid);
    }
    case 6:
    {
    HideMenuForPlayer(test2,playerid);
    TogglePlayerControllable(playerid, 1);
    }
    }
    }
    else if(GetPlayerMenu(playerid) == test1)
    {
    switch(row)
    {
    case 0:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 1:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 2:
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Gratuliere für die richtige Antwort, es folgt Frage 2.");
    ShowMenuForPlayer(test2,playerid);
    testt2(playerid);
    }
    case 3:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 4:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 5:
    {
    SendClientMessage(playerid, COLOR_RED, "Das war die falsche Antwort. Leider durchgefallen.");
    TogglePlayerControllable(playerid, 1);
    }
    case 6:
    {
    HideMenuForPlayer(test1,playerid);
    TogglePlayerControllable(playerid, 1);
    }
    }
    }
    return 1;
    }


    Edit: Einrueckungen sind leider doch nicht so schoen geworden, speziell in den switch-statements. In pawno sah das noch ganz gut aus, doofe Abstaende zwischen drin ;)


    Wieviele in diesem forum koennen wirklich scripten und wieviele haben einfach nur CTRL+C&V benutzt? Flummi hatte bereits eine fast korrekte Loesung gezeigt, wo nur das else{} verrutscht ist und wenn ich dann die Loesungs/verbesserungsvorschlaege hoere glaube ich dass der grossteil der Leute sich zu Gruppe 2 zaehlen darf..

    SetPlayerColor(playerid, color);


    Nur 2 argumente. Daher auch die warnung im Beispiel mit RandomColor[randcol][0] und [1] zusammen. Ein spieler kann nur eine farbe gleichzeitig zugewiesen werden.


    In dem Fall:
    SetPlayerColor(playerid, RandomColor[randcol][0]);
    SetPlayerColor(playerid, RandomColor[randcol][1]);
    resultiert es in schwarz (0x00000000), da [1] undefiniert ist.


    Ein Multidimensionales array zu verwenden erscheint mir nicht sinnvoll, ausser wenn du die zugewiesene Farbe fuer den Spieler in einer variable speichern moechtest.


    new RandomColor[30] =
    {
    0xFF1400FF,
    0x00FF14FF,etc.
    Zusammen mit:SetPlayerColor(playerid, RandomColor[randcol]);Sollte das problem beseitigen.

    native SendDeathMessage(killer,killee,weapon);


    In OnPlayerDeath saehe das inetwa so aus:
    OnPlayerDeath(playerid, killerid, reason){SendDeathMessage(killerid,playerid,reason)}

    SA-MP nutzt SQLite und nicht Mysql.
    Datenbanken werden im scriptfiles Ordner gespeichert. db_open() laedt eine existierende Datenbank, oder erstellt eine neue, sofern noch keine mit dem angegebenen Namen besteht.
    In deinem Bsp. werden die account daten aus der Tabelle einer uns unbekannten Datenbank geladen.


    Ob du die entsprechenden Tabellen in deinem Fall manuell erstellen musst, oder ob eine vorkonfigurierte Datenbank bei dem script dabei ist kann ich nicht beantworten. Wenn es ein script ist, welches oeffentlich ist wuerde ich behaupten, dass entweder eine Datenbank mitgeliefert ist, oder Kontrollstrukturen vorhanden sind, welche automatisch eine neue Tabelle erstellen, sofern keine vorhanden ist.