Beiträge von Developer

    Guten Tag zusammen,


    heute zeige ich euch wie ihr einen Countdownbefehl + Funktion erstellen könnt. Das ganze benötigt Kenntnisse in

    • Pawn
    • Timern
    • Befehlerstellung


    Na gut dann fangen wir mal an:


    Zuerst müsst ihr im Script die forwards erstellen.Der Countdown soll von 4-1 gehen und danach LOS kommen
    forward CD4();// Für die erste Zahl die nach der Befehls eingabe erscheint
    forward CD3();// Für die zweite Zahl
    forward CD2(); // Für die Dritte Zahl
    forward CD1();// Für die vierte Zahl
    forward CDLos();// Für das LOS LOS LOS


    Dann müssen wir erstmal den Befehl erstellen.
    if(strcmp("/countdown",cmdtext,true) == 0)
    Jetzt haben wir schonmal das was man eingeben muss. Jetzt kommt das was dann ausgeführt wird
    {
    if (IsPlayerAdmin(playerid))// Frag ab ob der User Rcon Admin ist
    {
    SetTimer("CD4",1000,0);// Setzt den ersten Timer in Bewegung, das passiert nur wenn der User Rcon admin ist
    #error Das ist kein Copy & Past Tutorial
    }
    else SendClientMessage(playerid,COLOR_GRAD1,"* Du bist kein Administrator!");// Wenn der User kein Rcon Admin ist kommt das
    return 1;
    }
    Jetzt müssen wir die Publics erstellen für die Timer
    public CD4()
    {
    GameTextForAll("4",1000,3);// Zeigt allen Usern die Zahl 4
    SetTimer("CD3",1000/*1000 mili sec = 1 sec*/,0);// startet den Timer CD3
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }
    public CD3()
    {
    GameTextForAll("3",1000,3);// Zeigt allen Usern die Zahl 3
    SetTimer("CD2",1000,0);// startet den Timer CD2
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }
    public CD2()
    {
    GameTextForAll("2",1000,3); //Zeigt allen Usern die Zahl 2
    SetTimer("CD1",1000,0);// startet den Timer CD1
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }
    public CD1()
    {
    GameTextForAll("1",1000,3); //Zeigt allen Usern die Zahl 1
    SetTimer("CDLos",1000,0);// startet den Timer CDLos
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }
    public CDLos()
    {
    GameTextForAll("~g~] ! LOS LOS LOS ! ]",1000,3);// Zeigt allen Usern " LOS LOS LOS!"
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }


    Erweiterung
    Jetzt kommt noch eine Erweiterung. Undzwar ein Countdown, dem ein GMX folgt.(wenn man beides im Script einbaut sollte man diesen Countdown über einen anderen Befehl steuern!)
    Alle schritte bleiben wie oben gleich. Nur das wir beim Letzten Timer folgendes Ändern.
    public CDLos()
    {
    GameTextForAll("~g~] ! GMX! ]",1000,3);// Zeigt allen Usern " GMX!"
    /* jetzt kommt hier die Funktion des Server Restarts.Das machen wir via Rcon Command.*/
    SendRconCommand("gmx");
    return 1;
    #error Das ist kein Copy & Past Tutorial
    }


    Wenn man jetzt den Befehl ein gibt wird nach dem Countdown ein GMX (Gamemoderestart) durchgeführt.


    Ich weiß es ist eher ein Copy & Past Tutorial. Allerdings sollte es so wie es jetzt ist 6 Errors geben. Wenn man genau hinguckt sollte man die Fehler finden... die Fehler sind ja schließlich alle gleich...Wenn ihr Erros habt guckt euch den Satz vorher an ;)


    Ich hoffe das Tuto hat euch gefallen.


    Mit freundlichen Grüßen


    Edit: eine Erweiterung eingefügt
    Edit: Fehler behoben
    Edit3: zufrüh auf absenden -.-


    Edit4:



    Edit5: if (IsPlayerAdmin(playerid)) ist richtig danke BlackAce...

    So nach Längerer Zeit gibt es nun ein Update... Dieses Update ist jetzt über die Zeit in 2 Wochen entstanden.. Habe nicht die ganze Zeit daran geschrieben sondern höchstens 5 -10 min Pro Tag


    Undzwar Update auf Version 2.9.1(Only 0.3d R1 ! Dürfte Allerdings auch auf R2 funktionieren)
    [tabmenu]

    [tab= Benötigte Includes]

    #include <a_samp>
    #include <dini>
    #include <Dudb>
    #include <JunkBuster>
    [tab= Changelog]
    Der Changelog
    [subtab= Teams]
    Es gibt nun 5 Teams
    #define TEAM_ZIVILISTEN 0
    #define TEAM_COPS 1
    #define TEAM_MAFIA 2
    #define TEAM_NUTTE 3
    #define TEAM_NERDS 4
    #define TEAM_ABENTEUER 5
    [subtab= Funktionen]
    - Radio eingefügt(8 Radio Sender)
    -mehrere Neue Befehle
    - Alle Admin Befehle nur noch als Rcon Admin, wenn nicht Rcon Admin versucht einen Admin Befehl zumachen wird der Name in die ServerLog geschrieben
    Das sieht dann so aus:
    SpielerName hat versucht den /gmx Befehl zu nutzen
    - Anti Spawn Kill

    [tab= Gefundende Bugs]
    Manchmal kann man sich nicht einloggen
    [tab= Geplant für nächste Version]
    Zur Zeit nichts.
    [tab= Pastebin]
    http://pastebin.com/e9zzEJyY
    [tab= Download aller Datein]
    Folgt


    [/tabmenu]


    Erster Post wird editiert


    Edit 2 neue Version Siehe oben

    if (strcmp("/bsn", cmdtext, true,(playerid,0))


    {
    if (SetPlayerVirtualWorld(playerid,0))
    {
    SetPlayerVirtualWorld(playerid,0);
    SetPlayerPos(playerid,1045.3831,1013.0660,55.3047);
    SendClientMessage(playerid,Gruen,"%s ist zu /BSN Gegangen!");
    }
    else
    {
    SendClientMessage(playerid,Gruen,"Du kannst diesen Befehl hier nicht nutzen!");


    }
    }


    Und welche Zeile ist 480 ?

    Wie gesagt es läuft nicht Ständig durch SAMP Musik.... ich spiele zwischenzeitlich auch mal andere Musik.


    Edit: Eig nicht... das war keine Musik von nem anderen Sender... da achte ich penibel drauf

    also ich persönlich wähle die Lieder immer nach den so aus, das das Ende des einen Lieder perfekt zum Anfang des neuen Liedes passt...... Und wir spielen eigentlich alles.... Grade läuft I´m Sexy and I Know It jetzt gleich Good Feeling...

    ist sscanf nicht zur Zeit Buggy? mach mal das Plugin im Script (oben #include <sscanf>) raus und mache dafür ganz untem im script das hier rein:


    stock sscanf(string[], format[], {Float,_}:...)
    {
    #if defined isnull
    if (isnull(string))
    #else
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
    {
    return format[0];
    }
    #pragma tabsize 4
    new
    formatPos = 0,
    stringPos = 0,
    paramPos = 2,
    paramCount = numargs(),
    delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
    stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
    switch (format[formatPos++])
    {
    case '\0':
    {
    return 0;
    }
    case 'i', 'd':
    {
    new
    neg = 1,
    num = 0,
    ch = string[stringPos];
    if (ch == '-')
    {
    neg = -1;
    ch = string[++stringPos];
    }
    do
    {
    stringPos++;
    if ('0' <= ch <= '9')
    {
    num = (num * 10) + (ch - '0');
    }
    else
    {
    return -1;
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num * neg);
    }
    case 'h', 'x':
    {
    new
    num = 0,
    ch = string[stringPos];
    do
    {
    stringPos++;
    switch (ch)
    {
    case 'x', 'X':
    {
    num = 0;
    continue;
    }
    case '0' .. '9':
    {
    num = (num << 4) | (ch - '0');
    }
    case 'a' .. 'f':
    {
    num = (num << 4) | (ch - ('a' - 10));
    }
    case 'A' .. 'F':
    {
    num = (num << 4) | (ch - ('A' - 10));
    }
    default:
    {
    return -1;
    }
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num);
    }
    case 'c':
    {
    setarg(paramPos, 0, string[stringPos++]);
    }
    case 'f':
    {


    new changestr[16], changepos = 0, strpos = stringPos;
    while(changepos < 16 && string[strpos] && string[strpos] != delim)
    {
    changestr[changepos++] = string[strpos++];
    }
    changestr[changepos] = '\0';
    setarg(paramPos,0,_:floatstr(changestr));
    }
    case 'p':
    {
    delim = format[formatPos++];
    continue;
    }
    case '\'':
    {
    new
    end = formatPos - 1,
    ch;
    while ((ch = format[++end]) && ch != '\'') {}
    if (!ch)
    {
    return -1;
    }
    format[end] = '\0';
    if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
    {
    if (format[end + 1])
    {
    return -1;
    }
    return 0;
    }
    format[end] = '\'';
    stringPos = ch + (end - formatPos);
    formatPos = end + 1;
    }
    case 'u':
    {
    new
    end = stringPos - 1,
    id = 0,
    bool:num = true,
    ch;
    while ((ch = string[++end]) && ch != delim)
    {
    if (num)
    {
    if ('0' <= ch <= '9')
    {
    id = (id * 10) + (ch - '0');
    }
    else
    {
    num = false;
    }
    }
    }
    if (num && IsPlayerConnected(id))
    {
    setarg(paramPos, 0, id);
    }
    else
    {
    #if !defined foreach
    #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end] = '\0';
    num = false;
    new
    name[MAX_PLAYER_NAME];
    id = end - stringPos;
    foreach (Player, playerid)
    {
    GetPlayerName(playerid, name, sizeof (name));
    if (!strcmp(name, string[stringPos], true, id))
    {
    setarg(paramPos, 0, playerid);
    num = true;
    break;
    }
    }
    if (!num)
    {
    setarg(paramPos, 0, INVALID_PLAYER_ID);
    }
    string[end] = ch;
    #if defined __SSCANF_FOREACH__
    #undef foreach
    #undef __SSCANF_FOREACH__
    #endif
    }
    stringPos = end;
    }
    case 's', 'z':
    {
    new
    i = 0,
    ch;
    if (format[formatPos])
    {
    while ((ch = string[stringPos++]) && ch != delim)
    {
    setarg(paramPos, i++, ch);
    }
    if (!i)
    {
    return -1;
    }
    }
    else
    {
    while ((ch = string[stringPos++]))
    {
    setarg(paramPos, i++, ch);
    }
    }
    stringPos--;
    setarg(paramPos, i, '\0');
    }
    default:
    {
    continue;
    }
    }
    while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
    {
    stringPos++;
    }
    while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
    {
    stringPos++;
    }
    paramPos++;
    }
    do
    {
    if ((delim = format[formatPos++]) > ' ')
    {
    if (delim == '\'')
    {
    while ((delim = format[formatPos++]) && delim != '\'') {}
    }
    else if (delim != 'z')
    {
    return delim;
    }
    }
    }
    while (delim > ' ');
    return 0;
    }
    Dann compillen
    Und auch nicht das sscanf Plugin im CP auswählen

    Falls es für dich einfacher ist kannst du auch GivePlayerHealth nehmen... allerdings müsstest du dann diesen Stock unten im Script einfügen:


    stock GivePlayerHealth(playerid,Float:Health)
    {
    new Float:health; GetPlayerHealth(playerid,health);
    SetPlayerHealth(playerid,health+Health);
    return 1;


    Also sähe das dann so aus:
    {
    if(dialogid == Dialog_Menu)
    {
    if(response)
    {
    if(listitem == 0)
    {
    GivePlayerHealth(playerid,30);
    }
    if(listitem == 1)
    {
    GivePlayerHealth(playerid,20);
    }
    if(listitem == 2)
    {
    GivePlayerHealth(playerid,15);
    }
    if(listitem == 3)
    {
    GivePlayerHealth(playerid,15);
    }
    if(listitem == 4)
    {
    GivePlayerHealth(playerid,15);
    }
    if(listitem == 5)
    {
    GivePlayerHealth(playerid,100);
    }


    return 0;
    }
    }
    return 1;
    }
    Einrücken nicht vergessen!

    Einfach das erste SetPlayerPos durch SetPlayerPos(playerid, x achse/cord1 ,y achse cord 2,z achse cord3); ersetzen


    Also das xachse/cord bis z achse cord3 durch dein mit /save festgelegten Punkt ersetzen