Nützliche Codeschnipsel

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Fast Player Commands (FPC)


    FPC ist eine art Makro die es ermöglicht Befehle schneller auszuführen und dank sscanf können wir sogar die einzelnen Parameter auslesen.
    Es gibt nicht viel dabei zu erklären, es ist ein einfaches Makro das viel viel kürzer ist wie zb. dcmd und ihr müsst nicht kein extra dcmd_ thread hinzufügen, ihr könnt alles in dem Callback erledigen.


    Das ganze ist Resourcen sparender als strtok, strrest, dcmd_...


    Die groß und kleinschreibung wird für jedem befehl nicht beachtet, ihr könnt also alle befehle mit CAPSLOCK oder ganz klein schreiben, es macht kein unterschied wenn ihr diesen Befehl ingame eingibt.
    Ihr benötigt lediglich die sscanf funktion von Y_Less.


    In eurem Filterscript / Gamemode könnte dass ganze dann so aussehen:


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if(Command("/KickEx"))
    {
    new pid, kickreason[128];
    if(sscanf(cmdtext, "uz", pid, kickreason)) return SendClientMessage(playerid, COLOR_WHITE, "[Benutzung] /KickEx [Name/ID] [Reason]");
    if(!IsPlayerConnected(pid)) return SendClientMessage(playerid, COLOR_WHITE, "Spieler wurde nicht gefunden.");
    if(!strlen(kickreason)) kickreason[0] = '-'
    format(str, sizeof(str), "Du wurdest vom server gekickt, grund: %s", kickreason);
    SendClientMessage(pid, COLOR_RED, str);
    Kick(pid);
    return 1;
    }
    return 0;
    }


    Die einzelnen befehle müssen wohl nicht erklärt werden, die dürften euch ja klar sein ;).


    Wer die sscanf befehle nicht kennt:

    • u - Hiermit könnt ihr die Spielerid raufinden *
    • c - Ein Char
    • d, i - Ein Zahlenwert KEIN FLOAT!
    • h, x - Ein Hex-wert
    • f - Ein Floatwert
    • s - Ein einzelner String
    • z - Der Restliche string **
    • pX - An additional delimiter where X is another character. // Keine ahnung
    • '' - Encloses a litteral string to locate. // Keine ahnung

    * Wenn ihr zb ein /kick befehl habt und ihr wollt den spieler mit /kick Spieler kicken, könnt ihr ein teil des namens angeben, falls mehrer den gleichen eingegeben part haben wird INVALID_PLAYER_ID (0xFFFF) zurückgegeben, angemommen der User heißt Momo5000 (ID: 0) und wollen ihn kicken, wir haben nun 3 varianten zu verfügung:

    /kick Momo
    /kick Momo5000
    /kick 0


    ** z sollte immer am ende eingesetzt werden da es alle restlichen parameter als string zurück gibt.


    Wie könnt ihr FPC benutzen? ganz einfach, ihr fügt diesen Define unter den includes ein.
    #define Command(%1) (!strcmp(cmdtext, %1, true, strlen(%1)) && strdel(cmdtext, 0, strlen(%1) + 1) == true)


    Und zu guter letzt fügt ihr den Sscanf stock von Y_Less ganz untem im script ein:
    /*
    * @Function: sscanf(string[], format[], {Float,_}:...)
    * @Info: Used to get the command params
    */


    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;
    }


    Bugs könnt ihr gerne reporten, ich versuche diese dann zu beheben, so viel spaß beim scripten nun :thumbup:


    Edit: Sinnloses Include entfernt.

    SA-MP Scripting Hilfe/Erklärungen bekommt ihr auf der SA-MP Wikipedia

    3 Mal editiert, zuletzt von .#~Momo ()

  • Zitat

    Es gibt nicht viel dabei zu erklären, es ist ein einfaches Makro das viel viel kürzer ist wie zb. dcmd und ihr müsst nicht kein extra dcmd_ thread hinzufügen, ihr könnt alles in dem Callback erledigen.
    Das ganze ist Resourcen sparender als strtok, strrest, dcmd_..


    Das hätte Ich mal gerne bewiesen.Jeder kann mit Wörtern um sich werfen ... . Kannst gerne mal dein Testscript zeigen,womit du dass herrausgefunden hast.
    Denn so wie Ich dass sehe,ist das Makro von dir definitiv langsamer als dcmd. strtok & strrest kann Ich jetzt nichts zu sagen.

  • schließe mich Goldkiller an ich sehe daran nichts ressourcensparenderes als bei dcmd .... geschweige von zcmd oder ocmd, ich werde mal die Funktion testen , wie Ressourcensparend es wirklich ist , wenn ich mal zeit habe ...

  • #define AddPVarInt(%1,%2,%3) SetPVarInt(%1,%2,GetPVarInt(%1,%2)+%3)
    Nichts großes aber es spart ein paar Zeilen und ein wenig an Zeit

  • Eine Funktion mit dem man einen Spieler MIT seinen Wagen porten kann...
    forward SetPlayerPosWithVehicle(playerid, Float:x, Float:y, Float:z);
    public SetPlayerPosWithVehicle(playerid, Float:x, Float:y, Float:z)
    {
    new pvehid,pseatid;
    if(IsPlayerInAnyVehicle(playerid))
    {
    pvehid = GetPlayerVehicleID(playerid);
    pseatid = GetPlayerVehicleSeat(playerid);
    RemovePlayerFromVehicle(playerid);
    SetPlayerPos(playerid, x, y, z);
    SetVehiclePos(pvehid, x, y, z);
    PutPlayerInVehicle(playerid, pvehid, pseatid);
    return 1;
    }
    SetPlayerPos(playerid, x, y, z);
    return 0;
    }

  • Ich glaube das mit Kick(pid); würde nicht funktionieren soviel ich hier sehe hast du nicht definiert was pid ist ^^ die playerid von sich selbst oder von jemanden ^^

  • if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xFF0000, "Du bist kein Administrator!!!");


    QuadraticRootCalc(Float:Xsq,Float:X,Float:num)

    Einmal editiert, zuletzt von 東志新川薩摩 ()

  • Selbstmord-Attentat Snippet


    Gut für DM Server, sry falls das schon jemand das (oder ähnliches) zuvor gepostet hat.
    Kann man auch per Tastenbefehl einbauen, aber ich zeige hier, wie man es per Befehl macht.



    if(strcmp("/selbstmordbombe", cmdtext, true, 5) == 0 || strcmp("/sb",cmdtext, true, 5) == 0)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    CreateExplosion(x+random(2), y+random(2), z+random(2), 2, 10.0);
    SetPlayerHealth(playerid, 0.0);
    return 1;
    }
    }


    Ich hoffe irgendjemand könnte so etwas gebrauchen. ^^
    Gruß,
    Airsnake

  • für include oder so neue funktion um mehrere moveobjects zu sparen:
    native AttachObjectToObject(objectid, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);


    _____________________________________________________________________________________________________________________________________________
    Die Anwort auf ALLES
    x = 9 * 6
    x = 3 * 3 * 2 * 3 = 42 (heißt auch das eigentlich alles 42 "returnt" [return 42;])
    Definitionsmenge = [0;42]
    ==> Lösungsmenge = {}


    Daraus Folgt: Das Leben macht keinen Sinn .
    Details siehe Reiseführer "Per Anhalter durch die Galaxis".


  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hier mal ein /heal befehl für nur für admins ist bestimmt für manche nüzlich#
    if (strcmp("/heal", cmdtext, true) == 0)//Rcon Befehle
    {
    if(IsPlayerAdmin(playerid))
    {
    SetPlayerHealth(playerid, 100);
    SetPlayerArmour(playerid, 100);
    SendClientMessage(playerid, 0xFFFF00AA, "Server: Du hast dich Geheilt!");
    }else{
    SendClientMessage(playerid, 0xFFFF00AA, "Server: Das ist nur für Admins verfügbar!");
    }
    return 1;
    }
    Hier mal ein Godmode befehl nur für admins ist zwar nicht wichtig aber trozdem ^^
    if (strcmp("/godmodeaus", cmdtext, true, 10) == 0)
    {
    if(IsPlayerAdmin(playerid))
    {
    new playrname[MAX_PLAYER_NAME];
    new pname[MAX_PLAYER_NAME];
    new string[100];
    SetPlayerHealth(playerid, 100);
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string, sizeof(string), "%s hat den GodMode ausgeschaltet!", pname);
    SendClientMessageToAll(0xFFFF00AA, string);
    GetPlayerName(playerid, playrname, sizeof(playrname));
    }else{
    SendClientMessage(playerid, 0xAA3333AA, "Server: Du bist kein Admin");
    }
    return 1;
    }
    //-------------/godmodean-----------
    if (strcmp("/godmodean", cmdtext, true, 10) == 0)
    {
    if(IsPlayerAdmin(playerid))
    {
    new playrname[MAX_PLAYER_NAME];
    new pname[MAX_PLAYER_NAME];
    new string[100];
    SetPlayerHealth(playerid, 0x7F800000);
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string, sizeof(string), "%s hat den GodMode eingeschaltet!", pname);
    SendClientMessageToAll(0xFFFF00AA, string);
    GetPlayerName(playerid, playrname, sizeof(playrname));
    }else{
    SendClientMessage(playerid, 0xAA3333AA, "Server: Du bist kein Admin");
    }
    return 1;
    }
    und hier mal ein schnipsel für DM oder Stunt server oder was weiß ich
    wo man an der seite sehen kann wer wen gekillt hat oder gestorben ist ^^
    public OnPlayerDeath(playerid, killerid, reason)
    {
    SendDeathMessage(killerid, playerid, reason);
    GameTextForPlayer(killerid,"KILLA",2000,2);
    GameTextForPlayer(playerid,"~r~DEAD",2000,5);
    SetPlayerScore(killerid,GetPlayerScore(killerid) +1);
    SetPlayerScore(playerid,GetPlayerScore(playerid) -1);


    GivePlayerMoney(killerid, 100);
    return 1;
    }

    Einmal editiert, zuletzt von Anonymous ()


  • @Teamspirit: Klar definiert er pid, siehe hier if(sscanf(cmdtext, "uz", pid, kickreason)) return SendClientMessage(playerid, COLOR_WHITE, "[Benutzung] /KickEx [Name/ID] [Reason]");

    stimmt sry habs übersehn


  • #define Seconds(%0,%1,%2,%3) return ((%0*86400)+(%1*3600)+(%2*60)+(%3))
    #define Minutes(%0,%1,%2,%3) return ((%0*1440)+(%1*60)+(%2)+(%3*60))
    #define Hours(%0,%1,%2,%3) return ((%0*24)+(%1)+(%2*60)+(%3*3600))
    #define Days(%0,%1,%2,%3) return ((%3*86400)+(%2*1440)+(%1*24)+(%0))


    Seconds( Tage, Stunden, Minuten, Sekunden )
    Minutes( Tage, Stunden, Minuten, Sekunden )
    Hours( Tage, Stunden, Minuten, Sekunden )
    Days( Tage, Stunden, Minuten, Sekunden )


    __________________________________________________________


    Einige kennen doch die mktime Funktion.
    Ich hab eine Funktion entwickelt, welche die Sekunden wieder in ein Datum umwandeln.
    (Die Funktion braucht jedoch mktime)
    Header:
    date(zeitpunkt, &hour, &minute, &second, &day, &month, &year) // by Steam
    ( Der Zeitpunkt ist der Parameter für die Sekunden seit 01. Januar 1970 00:00:00 )
    Funktion:

    stock date(zeitpunkt, &hour, &minute, &second, &day, &month, &year) // by Steam
    {
    new h = 0, m = 0, s = 0, da = 1, mo = 1, ye = 1970;
    for(;;) { ye++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { ye--; break; } }
    for(;;) { mo++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { mo--; break; } }
    for(;;) { da++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { da--; break; } }
    for(;;) { h++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { h--; break; } }
    for(;;) { m++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { m--; break; } }
    for(;;) { s++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { s--; break; } }
    hour = h; minute = m; second = s; day = da; month = mo; year = ye; return 1;
    }

    Beispiel:

    new h, mins, s, d, m, y;
    date(mktime(18, 32, 0, 16, 04, 2002), h, mins, s, d, m, y);
    printf("%d.%d.%d %d:%d:%d", d, m, y, h, mins, s);


    Hier ist noch mktime:

    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2 = second + (minute * 60) + (hour * 3600), days_of_month[12], days_this_year = day;
    if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31};
    else days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31};
    if(month > 1) for(new i=0; i<month-1;i++) days_this_year += days_of_month[i];
    timestamp2 += days_this_year * 86400;
    for(new j=1970;j<year;j++) {
    timestamp2 += 31536000;
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) timestamp2 += 86400;
    }
    return timestamp2;
    }

    Einmal editiert, zuletzt von d30af26d ()

  • Eightball / Ask The Ball / Whatever :D

    Gibt verschiedene Antworten zurück, ähnlich wie /flipcoin :) .
    Irgendwo im Script:

    AskTheBall(playerid)
    {
    if(random(500) < 25) return SendClientMessage(playerid, COLOR_YELLOW, "Signs point to yes.");
    else if(random(500) >= 25 && random(500) < 50) return SendClientMessage(playerid, COLOR_YELLOW, "Yes.");
    else if(random(500) >= 50 && random(500) < 75) return SendClientMessage(playerid, COLOR_YELLOW, "Reply hazy, try again.");
    else if(random(500) >= 75 && random(500) < 100) return SendClientMessage(playerid, COLOR_YELLOW, "Without a doubt.");
    else if(random(500) >= 100 && random(500) < 125) return SendClientMessage(playerid, COLOR_YELLOW, "My sources say no.");
    else if(random(500) >= 125 && random(500) < 150) return SendClientMessage(playerid, COLOR_YELLOW, "As I see it, yes.");
    else if(random(500) >= 150 && random(500) < 175) return SendClientMessage(playerid, COLOR_YELLOW, "You may rely on it.");
    else if(random(500) >= 175 && random(500) < 200) return SendClientMessage(playerid, COLOR_YELLOW, "Concentrate and ask again.");
    else if(random(500) >= 200 && random(500) < 225) return SendClientMessage(playerid, COLOR_YELLOW, "Outlook not so good.");
    else if(random(500) >= 225 && random(500) < 250) return SendClientMessage(playerid, COLOR_YELLOW, "It is decidedly so.");
    else if(random(500) >= 250 && random(500) < 275) return SendClientMessage(playerid, COLOR_YELLOW, "Better not tell you now.");
    else if(random(500) >= 275 && random(500) < 300) return SendClientMessage(playerid, COLOR_YELLOW, "Very doubtful.");
    else if(random(500) >= 300 && random(500) < 325) return SendClientMessage(playerid, COLOR_YELLOW, "Yes - definitely.");
    else if(random(500) >= 325 && random(500) < 350) return SendClientMessage(playerid, COLOR_YELLOW, "It is certain.");
    else if(random(500) >= 350 && random(500) < 375) return SendClientMessage(playerid, COLOR_YELLOW, "Cannot predict now.");
    else if(random(500) >= 375 && random(500) < 400) return SendClientMessage(playerid, COLOR_YELLOW, "Most likely.");
    else if(random(500) >= 400 && random(500) < 425) return SendClientMessage(playerid, COLOR_YELLOW, "Ask again later.");
    else if(random(500) >= 425 && random(500) < 450) return SendClientMessage(playerid, COLOR_YELLOW, "My reply is no.");
    else if(random(500) >= 450 && random(500) < 475) return SendClientMessage(playerid, COLOR_YELLOW, "Outlook good.");
    else if(random(500) >= 475 && random(500) < 500) return SendClientMessage(playerid, COLOR_YELLOW, "Don't count on it.");
    return 1;
    }


    Unter OnPlayerCommandText:

    if (strcmp(cmdtext, "/asktheball", true)==0)
    {
    AskTheBall(playerid);
    }


    Gruß,
    Airsnake

  • Dir ist bewusst, dass die Zufallszahl jedes Mal neu generiert wird? Benutz eine Variable und frag diese ab.


    Oder besser, benutz switch:
    switch(random(500))
    {
    case 0..24: SendClientMessage(...);
    case 25..49: SendClientMessage(...);
    case 50..74: SendClientMessage(...);
    case 75..99: SendClientMessage(...);
    }


    //edit: Writing-Fail korregiert


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

  • Für Teamdeathmatch´s bestimmt immer gut zu gebrauchen, die Car Bombe ;)
    Ich hoffe das erklärt sich von selbst :)


    if (strcmp("/carbomb", cmdtext, true) == 0) //Wenn man /carbomb eingibt
    {
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, 0xFF0000FF,"Du musst dich dafür in einem Fahrzeug befinden!"); //Fragt ab ob er in einem Fahrzeug ist
    new Float:x,Float:y,Float:z; //Difiniert die Koadinaten [Floats] x,y,z
    GetPlayerPos(playerid,x,y,z); //Fragt er die Position des Spielers ab in dem falle x,y,z
    CreateExplosion(x,y,z,7,10.10); // erstellt eine Explosion an x,y,z
    SendClientMessage(playerid, 0xFF0000FF,"Bombe erfolgreich gezündet!");//Erklärt sich von selber
    return 1;
    }


    Edit:/
    Hier mal ein Auto Spawn Befehl mit ID´s ^^
    Ich hab hier im Thread noch kein solchen Schnipsel gefunden, oder muss ihn wohl übersehen haben...


    Unten im Script, damit ihr den Befehl auch ohne Errors Funktioniert^^
    //-----------------strget---------------
    stock strget(strx[], pos, search = ' ') {
    new arg, ret[128], idxx;
    for (new i = 0; i < strlen(strx); i++) {
    if(strx[i] == search || i == strlen(strx) || strx[i + 1] == 10) {
    arg++;
    if (arg == pos + 1){
    ret[i-idxx] = EOS;
    return ret;
    } else if (arg == pos)
    idxx= i+1;
    }
    else if (arg == pos)
    ret[i - idxx] = strx[i];
    }
    return ret;
    }

    Strget bringt das man halt im Befehl sachen wie /skin [pID] [skinID] machen kann :P


    Kommen wir zum Vehicle Spawn:
    ///carspawn
    if(!strcmp(strget(cmdtext, 0), "/vspawn")) //Wenn man vspawn eingibt
    {
    if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,ROT,"Du bist kein Admin!"); //Wird überprüft ob man Admin ist, bei Bedarf kann man es einfach Entfernen ;)
    new veh = strval(strget(cmdtext, 1));//Legt fest das nach dem /vspawn noch ID z.b eingegeben werden muss
    if(veh < 0 || veh > 1000) //Legt fest welche ID´s man nutzen kann in diesem Fall von 0 bis 1000 da ich jetzt nicht genau weiß von wie viel bis wie viel die Veh ID´s gehen^^
    {
    SendClientMessage(playerid, ROT, "Da ist was falsch, benutze /veh [ID]"); //Wenn man Id vergisst kommt die Meldung halt
    return 1;
    }
    new Float:x,Float:y,Float:z; //Wenn alles Richtig ist, ortet er wie im oberen Schnipsel wieder die Pos
    GetPlayerPos(playerid,x,y,z); //Siehe oben
    CreateVehicle(veh,x+1,y+1,z+1,5.5,1,1,0); //Vehicle mit der angegeben ID wird gespawnt...
    return 1;
    }
    Ich hoffe das ist einigermaßen gut Erklärt da ich nicht weiß wie ich das mit strget erklären soll...

    Einmal editiert, zuletzt von Aarys ()


  • forward Bombe(playerid);
    forward Entschärft(playerid);
    if(strcmp(cmdtext,"/entschärfen", true ) == 0)


    {
    If(IsPlayerInRangeOfPoint(playerid, 1.0, x, y, z)) return SendClientMessage(playerid, rot,"Du bist nicht bei der Bombe");
    {
    KillTimer(Bombe);


    SetTimer("Entschärft",6000, 0);
    SendClientMessage(playerid, grün,"Du hast die Bombe erfolgreich entschärft");
    return 1;


    }



    if(strcmp(cmdtext,"/bombe", true ) == 0)
    {
    new Float:x, y,z;


    GetPlayerPos(playerid, x, y, z);


    SetTimer("Bombe",600000,0);
    return 1;
    }



    public Bombe(playerid)
    {
    CreateExplosion(x, y, z, 2, 10.0);



    SendClientMessage(playerid, rot,"Deine Bombe ist erfolgreich in die Luft gegangen");
    return 1;
    }



    public Entschärft(playerid)


    {
    SendClientMessageToAll(rot, "Die Bombe wurde entschärft");
    return 1;
    }




    ;) Hoffe es funkt XD falls net sagt mir warum :D


    lg
    t.S

  • Wie wärs, wenn du das vorher noch compilen und testen würdest?


    Das kann eigentlich gar nicht funktionieren....Gründe:


    1. Variablen X, Y und Z sind nicht global, sondern lokal in /bombe
    2. Variablen Y und Z sind keine Floats, sondern Integer
    3. Bombe ist der Funktionsname des Timers und nicht die Timer-ID (so lässt sich KillTimer nicht anwenden)
    4. Zeile 6 ist das if großgeschrieben
    5. Du musst SetTimerEx benutzen, um die playerid für Bombe(playerid) und Entschärft(playerid) zu übergeben
    6. Der Compiler wird sicherlich keine Funktion durchgehen lassen, die Umlaute enthält (Entschärft(playerid))
    7. Nicht jeder hat die Farbdefinitionen rot und grün
    8. /entschärfen hat einen Klammerfehler und die IsPlayerInRangeOfPoint-Abfrage darin ist verkehrt herum (es muss abgefragt werden, ob man nicht bei der Bombe ist)


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

  • Hier mal was kleines für Stunt server :)
    if(strcmp("/fix", cmdtext, true, 10) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    SetVehicleHealth(GetPlayerVehicleID(playerid), 1000.0);
    RepairVehicle(GetPlayerVehicleID(playerid));
    SendClientMessage(playerid, COLOR_GREY, "Car repaired");
    }
    }
    return 1;
    }


    :D Was schaut ihr mich alle an??? Ich bin auch nur eine Signatur :D

  • :rolleyes: C&P merkt man direkt, du musst nicht abfragen ob jemand Connected ist oder nicht :D


    also einfach so:
    if(strcmp("/fix", cmdtext, true, 10) == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid,0xFF0000FF,"Du bist in keinem Fahrzeug!"); //Wenn man in keinem Fahrzeug sitzt, kommt diese Meldung
    {
    SetVehicleHealth(GetPlayerVehicleID(playerid), 1000.0);
    RepairVehicle(GetPlayerVehicleID(playerid));
    SendClientMessage(playerid, COLOR_GREY, "Auto Repariert!"); //Die Farbe würde ich als Hex Code hinschreiben, weil man ja nie weiß ob er/sie schon COLOR_GREY definiert hat ;)
    return 1;
    }
    }


    Nunja hier mal eine eine abgekürzte Funktion (SendClientMessage) + Eigene Unknow Command Meldung...


    SCM Also SendClientMessage:


    Oben im Script bei den Defines:
    #define SCM(%0,%1,%2) do{new _str[128]; format(_str,128,%2); SendClientMessage(%0,%1,_str);}while(FALSE)

    Un dann darunter:
    new FALSE = false;

    Jetzt könnt ihr ohne Probleme z.b in einem Befehl SCM einbauen als Beispiel der /fix Befehl von oben:
    if(strcmp("/fix", cmdtext, true, 10) == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid))return SCM(playerid,0xFF0000FF,"Du bist in keinem Fahrzeug!"); //Wenn man in keinem Fahrzeug sitzt, kommt diese Meldung
    {
    SetVehicleHealth(GetPlayerVehicleID(playerid), 1000.0);
    RepairVehicle(GetPlayerVehicleID(playerid));
    SCM(playerid, COLOR_GREY, "Auto Repariert!"); //Die Farbe würde ich als Hex Code hinschreiben, weil man ja nie weiß ob er/sie schon COLOR_GREY definiert hat ;)
    return 1;
    }
    }


    :P
    Weiter geht´s die Error Meldung (Also die eigene):
    Unter dem letzten Command von OnPlacerCommandText:
    else
    {
    SendClientMessage(playerid,0xFF0000FF,"Dieser Befehl existiert nicht!"); //Farbecode+Meldung ist natürlich anpassbar :)
    return 1;
    }
    Es könnte z.b so aussehen:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/info", cmdtext, true) == 0)
    {
    SendClientMessage(playerid, 0xAFAFAFAA, "Gamemode By -Name-");
    return 1;
    }


    else
    {
    SendClientMessage(playerid,0xFF0000FF,"ERROR: Dieser Befehl wurde Deaktiviert oder Existiert nicht!");//Wie gesagt Farbcode sowie die Meldung sind anpassbar ;)
    return 1;
    }
    }


    Hoffe das ist Hilfreich :D

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen