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
  • Wieso entwirfst du denn Funktionen für alte SA:MP Versionen.


    Abwärtskompatibilität, aus genanntem Grund. Dass es nichts zur Optimierung tut war mir klar, darum ging es auch in der ursprünglichen Funktion gar nicht.


    Hier, nochmal 10% schneller:
    stock IsPlayerLookingAtPos(playerid, Float:x, Float:y, Float:z, Float:radius = 3.0, Float:maxdist = 100.0)
    {
    static Float:cx, Float:cy, Float:cz, Float:vx, Float:vy, Float:vz, Float:dist;
    GetPlayerCameraPos(playerid, cx, cy, cz);
    GetPlayerCameraFrontVector(playerid, vx, vy, vz);
    cx-=x;
    cy-=y;
    cz-=z;
    dist = VectorSize(cx, cy, cz);
    return (dist > maxdist) ? 0 : _:(radius >= VectorSize(vx * dist + cx, vy * dist + cy, vz * dist + cz)); //<- Nur übernommen aus Geschwindigkeitsgründen, keineswegs befürwortet!
    }


    Hast noch einen auf Lager?

  • Ich habe von meinem Beitrag davor gesprochen und natürlich ist dist = VectorSize(cx-x, cy-y, cz-z); übersichtlicher als dist = floatsqroot((cx-x)*(cx-x) + (cy-y)*(cy-y) + (cz-z)*(cz-z));


    Das mag ja sein, kreide ich dir auch nicht an,
    fakt ist aber das der Rest des Codes ein Haufen irgendwas ist.


    Das hat Jeffry auch schonmal in deinen Releases erwähnt, das ist weder übersichtlich noch hilft es jemanden, der verstehen will was da gerade vor sicht geht.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • fakt ist aber das der Rest des Codes ein Haufen irgendwas ist.


    Welcher Rest? :huh:


    Es gibt keinen Rest, das was ich danach geschrieben habe, bezog sich nur auf die Geschwindigkeit.


    das ist weder übersichtlich noch hilft es jemanden, der verstehen will was da gerade vor sicht geht.


    Habe ich mir auch nicht als oberste Priorität gesetzt.


    Meinen Code finde ich eigentlich relativ übersichtlich, zumindest übersichtlicher als den Code von manch anderen Leuten :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Habe ich mir auch nicht als oberste Priorität gesetzt.


    Wenn man schon angibt, etwas übersichtlicher zu gestalten, dann sollte man es auch durchziehen und nicht eine Zeile kritisieren und den Rest da hin klatschen.
    Eine Rechnung mit einer Funktion zu ersetzen zeugt nicht im geringsten von Übersichtlichkeit.


    Bitte leg einfach deine Überheblichkeit und auch deine Arroganz ab - ist ja schlimm :thumbdown:
    Vor allem wenn man in einem Forum für Coding ist, ist das eine unglaublich schlechte Angewohnheit

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Wenn man schon angibt, etwas übersichtlicher zu gestalten, dann sollte man es auch durchziehen und nicht eine Zeile kritisieren und den Rest da hin klatschen.


    Was redest du hier von kritisieren? 8|


    Ich habe ihn lediglich auf die Funktion hingewiesen.


    Bitte leg einfach deine Überheblichkeit und auch deine Arroganz ab - ist ja schlimm


    Na da spricht ja der richtige :whistling:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ich habe ihn lediglich auf die Funktion hingewiesen.


    Ach und das ist keine Kritik ?
    Kritik muss nicht negativ sein ;)


    Na da spricht ja der richtige :whistling:


    Die hab ich schon lange abgelegt :P

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Hey,


    ich habe ein kleines System mit dem man in Geschäfte wie 24/7 oder BSN gehen kann.
    Es ist nicht perfekt, jedoch hoffe ich das es den ein oder anderen etwas Arbeit erspart.


    #define MAX_OPEN (65)
    enum OpenInteriors
    {
    Float:OpenEingangX,
    Float:OpenEingangY,
    Float:OpenEingangZ,
    Float:OpenAusgangX,
    Float:OpenAusgangY,
    Float:OpenAusgangZ,
    OpenInteriorID,
    OpenInteriorVirtual
    };
    new const OpenInteriorsInfo[MAX_OPEN][OpenInteriors]={


    {1554.9116, -1675.4540, 16.1953, 246.783996, 63.900199, 1003.640625, 6, 0},//LSPD Eingang
    {1525.6305, -1677.7211, 5.8906, 246.4299, 88.0091, 1003.6406, 6, 0},//LSPD Garage
    {1572.2103, -1636.4850, 13.5578, 1563.4890, -1666.7212, 28.3956, 0, 0},//LSPD Dach
    {-1605.5992, 711.1667, 13.8672, 246.3578, 107.5715, 1003.2188, 10, 0},//SAPD Eingang
    {-1606.3939, 672.4710, -5.2422, 215.3691, 126.3465, 1003.2188, 10, 0},//SAPD Garage
    {1172.6982, -1323.3925, 15.4019, 1164.3640,-1329.9182,31.4802, 0, 0},//Sanitäter Aufzug
    {1480.9857, -1771.6151, 18.7958, 389.9328, 173.6173, 1008.3828, 3, 0},//Stadthalle Eingang
    {1833.4132, -1842.6372, 13.3934, -25.8406, -187.6714, 1003.5469, 17, 0}, // 24/7 LS Bahnhof
    {1929.2400, -1776.2889, 13.3934,-25.8406, -187.6714, 1003.5469, 17, 1}, // 24/7 Idleewood Tankstelle
    {999.9698, -920.0452, 42.3281, -25.8406, -187.6714, 1003.5469, 17, 2}, // 24/7 Mullholland Tankstelle
    {-78.6431, -1169.8074, 2.1424, -25.8406, -187.6714, 1003.5469, 17, 3}, // 24/7 Flint County Tankstelle
    {-1562.4082, -2733.1560, 48.7435, -25.8406, -187.6714, 1003.5469, 17, 4}, // 24/7 Whetstone Tankstelle
    {2194.4885, 1990.9581, 12.2969, -25.8406, -187.6714, 1003.5469, 17, 5}, // 24/7 Starfish Casino
    {2097.6875, 2224.2371, 11.0234, -25.8406, -187.6714, 1003.5469, 17, 6}, // 24/7 Emerald Isle
    {2884.7900, 2453.6396, 11.0690, -25.8406, -187.6714, 1003.5469, 17, 7}, // 24/7 Creek
    {2546.4626, 1971.9843, 10.8203, -25.8406, -187.6714, 1003.5469, 17, 8}, // 24/7 Starfish Casino
    {2452.3582, 2064.7256, 10.8203, -25.8406, -187.6714, 1003.5469, 17, 9}, // 24/7 Old Venturas Strip
    {2637.2122, 1129.2606, 11.1797, -25.8406, -187.6714, 1003.5469, 17, 10}, // 24/7 Come-A-Lot Tankstelle
    {1352.4924, -1758.8451, 13.5078, -25.8406, -187.6714, 1003.5469, 17, 11}, // 24/7 Stadthalle
    {-1676.0979, 432.0437, 7.1797, -25.8406, -187.6714, 1003.5469, 17, 12}, // 24/7 Easter Basin Tankstelle
    {-2420.1526, 969.8209, 45.2969, -25.8406, -187.6714, 1003.5469, 17, 13}, // 24/7 Juniper Hollow Tankstelle
    {2188.0325, 2469.6150, 11.2422, -25.8406, -187.6714, 1003.5469, 17, 14}, // 24/7 Emerals Isle Tankstelle
    {2150.7471, 2734.0337, 11.1763, -25.8406, -187.6714, 1003.5469, 17, 15}, // 24/7 Spinybed Tankstelle
    {1599.2450, 2221.7290, 11.0625, -25.8406, -187.6714, 1003.5469, 17, 16}, // 24/7 Redsands West Tankstelle
    {2117.5227, 896.7756, 11.1797, -25.8406, -187.6714, 1003.5469, 17, 17}, // 24/7 The Strip Tankstelle
    {663.0126, 1716.5026, 7.1875, -25.8406, -187.6714, 1003.5469, 17, 18}, // 24/7 Bone County Tankstelle
    {-1271.6030, 2713.2217, 50.2663, -25.8406, -187.6714, 1003.5469, 17, 19}, // 24/7 Tierra Robada Tankstelle
    {-1465.7823, 1873.4202, 32.6328, -25.8406, -187.6714, 1003.5469, 17, 20}, // 24/7 Tierra Robada 2 Tankstelle
    {1383.1257, 465.3380, 20.1948, -25.8406, -187.6714, 1003.5469, 17, 21}, // 24/7 Montgomery Tankstelle
    {2244.4226, -1665.0626, 15.4766, 207.7523, -111.0303, 1005.1328, 15, 0}, // Ganton Binco
    {2861.3064, 2430.7085, 11.0690, 207.7523, -111.0303, 1005.1328, 15, 1}, // Creek Binco
    {2102.2195, 2257.3752, 11.0234, 207.7523, -111.0303, 1005.1328, 15, 2}, // Emerald Isle Binco
    {2112.8276, -1212.0350, 23.9637, 207.7523, -111.0303, 1005.1328, 15, 3}, // Jefferson Binco
    {1656.6327, 1733.3412, 10.8281, 207.7523, -111.0303, 1005.1328, 15, 4}, // Las Venturas Airport Binco
    {461.1960, -1500.8562, 31.0593, 227.2287, -8.1683, 1002.2109, 5, 5}, // Rodeo Victim
    {-1694.5387, 950.7520, 24.8906, 227.2287, -8.1683, 1002.2109, 5, 6}, // Downtown San Fierro Victim
    {2090.4067, 2224.2866, 11.0234, 161.4139, -96.8216, 1001.8047, 18, 7}, // Emerald Isle Zip
    {-1882.4608, 866.2303, 35.1719, 161.4139, -96.8216, 1001.8047, 18, 8}, // Downtown San Fierro Zip
    {1457.3076, -1137.4480, 23.9657, 161.4139, -96.8216, 1001.8047, 18, 9}, // Downtown Los Santos Zip
    {2104.8557, -1806.4862, 13.3934, 372.3584, -133.0832, 1001.4922, 5, 0}, // Idleewood Pizza
    {2332.2166, 74.9827, 26.6210, 372.3584, -133.0832, 1001.4922, 5, 1}, // Palomino Creek Pizza
    {1367.2854, 248.4236, 19.5669, 372.3584, -133.0832, 1001.4922, 5, 2}, // Montgomery Pizza
    {203.5421, -202.4460, 1.5781, 372.3584, -133.0832, 1001.4922, 5, 3}, // Blueberry Pizza
    {2083.3149, 2224.0027, 11.0234, 372.3584, -133.0832, 1001.4922, 5, 4}, // Emerald Isle Pizza
    {-1720.9486, 1359.7400, 7.1853, 372.3584, -133.0832, 1001.4922, 5, 5}, // Espalande North San Fierro Pizza
    {-1808.4294, 945.5788, 24.8906, 372.3584, -133.0832, 1001.4922, 5, 6}, // Financial San Fierro Pizza
    {928.3748, -1352.8358, 13.3438, 364.8388, -11.4912, 1001.8516, 9, 0}, // Market Cluckin Bell
    {-1816.5310, 618.4895, 35.1719, 364.8388, -11.4912, 1001.8516, 9, 1}, // Downtown San Fierro Cluckin Bell
    {2397.7275, -1898.7258, 13.5469, 364.8388, -11.4912, 1001.8516, 9, 2}, // Willowfield Cluckin Bell
    {-1213.4275, 1830.5964, 41.9297, 364.8388, -11.4912, 1001.8516, 9, 3}, // Tierra Robada Cluckin Bell
    {2420.0740, -1508.9742, 24.0000, 364.8388, -11.4912, 1001.8516, 9, 4}, // East Los Santos Cluckin Bell
    {2393.2778, 2041.8110, 10.8203, 364.8388, -11.4912, 1001.8516, 9, 5}, // Old Venturas Strip Cluckin Bell
    {2838.3022, 2407.4683, 11.0690, 364.8388, -11.4912, 1001.8516, 9, 6}, // Creek Cluckin Bell
    {172.6606, 1176.6274, 14.7645, 364.8388, -11.4912, 1001.8516, 9, 7}, // Bone County Cluckin Bell
    {2638.1880, 1671.9564, 11.0234, 364.8388, -11.4912, 1001.8516, 9, 8}, // Pilgrim Cluckin Bell
    {2102.4355, 2228.7559, 11.0234, 364.8388, -11.4912, 1001.8516, 9, 9}, // Emerald Isle Cluckin Bell
    {-2155.0603, -2460.3020, 30.8516, 364.8388, -11.4912, 1001.8516, 9, 10}, // Angel Pine Cluckin Bell
    {1199.9180, -918.6084, 43.1153, 363.0526, -74.9714, 1001.5078, 10, 0}, // BSN
    {811.0704, -1616.0961, 13.5469, 363.0526, -74.9714, 1001.5078, 10, 1}, // Marina Burger Shot
    {-2336.6326, -166.8775, 35.5547, 363.0526, -74.9714, 1001.5078, 10, 2}, // Garcia Burger Shot
    {1872.5382, 2071.7246, 11.0625, 363.0526, -74.9714, 1001.5078, 10, 3}, // Redsands East Burger Shot
    {-1912.3461, 828.0004, 35.2243, 363.0526, -74.9714, 1001.5078, 10, 4}, // Downtown San Fierro Burger Shot
    {2472.3828, 2034.1818, 11.0625, 363.0526, -74.9714, 1001.5078, 10, 5}, // Old Venturas Strip Burger Shot
    {2169.7561, 2795.9231, 10.8203, 363.0526, -74.9714, 1001.5078, 10, 6}, // Spinybed Burger Shot
    {1158.2513, 2072.1287, 11.0625, 363.0526, -74.9714, 1001.5078, 10, 7} // Whitewood Estates Burger Shot
    };






    OnGameModeInit



    for(new i=0;i<MAX_OPEN;i++)
    {
    CreatePickup(1318, 1, OpenInteriorsInfo[i][OpenEingangX], OpenInteriorsInfo[i][OpenEingangY], OpenInteriorsInfo[i][OpenEingangZ], 0);
    CreatePickup(1318, 1, OpenInteriorsInfo[i][OpenAusgangX], OpenInteriorsInfo[i][OpenAusgangY], OpenInteriorsInfo[i][OpenAusgangZ], OpenInteriorsInfo[i][OpenInteriorVirtual]);
    }


    OnPlayerKeyStateChange


    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    for(new i=0; i<MAX_OPEN; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 1.5, OpenInteriorsInfo[i][OpenEingangX], OpenInteriorsInfo[i][OpenEingangY], OpenInteriorsInfo[i][OpenEingangZ]))//Eingang
    {
    SetPlayerVirtualWorld(playerid, OpenInteriorsInfo[i][OpenInteriorVirtual]);
    SetPlayerInterior(playerid, OpenInteriorsInfo[i][OpenInteriorID]);
    SetPlayerPos(playerid, OpenInteriorsInfo[i][OpenAusgangX], OpenInteriorsInfo[i][OpenAusgangY], OpenInteriorsInfo[i][OpenAusgangZ]);
    break;
    }
    if(IsPlayerInRangeOfPoint(playerid, 1.5, OpenInteriorsInfo[i][OpenAusgangX], OpenInteriorsInfo[i][OpenAusgangY], OpenInteriorsInfo[i][OpenAusgangZ]) && GetPlayerVirtualWorld(playerid)==OpenInteriorsInfo[i[OpenInteriorVirtual])//Ausgang
    {
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    SetPlayerPos(playerid, OpenInteriorsInfo[i][OpenEingangX], OpenInteriorsInfo[i][OpenEingangY], OpenInteriorsInfo[i][OpenEingangZ]);
    break;
    }
    }
    }


    Gruß:
    ZeusLukas

    6 Mal editiert, zuletzt von Lukaz ()

  • Guten Tag!


    Ich habe eine kleine, nützliche Funktion für das Löschen des Chats erstellt.


    stock clearChat(lines=20, playerid=-1) {
    new i=0;
    for(; i < lines; i++) {
    if(playerid==-1)SendClientMessageToAll(-1, " ");
    else SendClientMessage(playerid, -1, " ");
    }
    return 1;
    }

    Benutzung


    clearChat(); // Löscht den Chat aller Spieler um 20 Zeilen.

    Benutzung
    clearChat(40); // Löscht den Chat aller Spieler um 40 Zeilen

    Benutzung
    clearChat(20, playerid); // Löscht den Chat von 'playerid' um 20 Zeilen.


    Mit freundlichen Grüßen,
    HydranT_!

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



    ich möchte dir einen Verbesserungsvorschlag machen:
    In deinem Code, der keinesfalls falsch ist, und perfekt funktionieren würde, wird unnötige Rechenarbeit durchgeführt.
    Das stört zwar bei so einem kleinen Teil des Codes nicht, aber wenn du größere Mengen Text schreibst,
    könnte sich das negativ auf deinen Server auswirken.


    Zur Erklärung:
    In der Schleife wird geprüft ob playerid = -1 ist, also ob die leere Nachricht an alle oder nur an einen Spieler geschickt wird.
    Wenn die Schleife 20x durchgeführt wird (default), wird es also 20x geprüft - obwohl man es nur einmal prüfen müsste.


    Beispiel:
    stock clearChat(lines=20, playerid=-1)
    {
    new i=0;
    if(playerid==-1)
    {
    for(; i < lines; i++)
    {
    SendClientMessageToAll(-1," ");
    }
    }
    else
    {
    for(; i < lines; i++)
    {
    SendClientMessage(playerid-1," ");
    }
    }
    return 1;
    }


    Ich habe es etwas ausführlich geschrieben (mit den Klammern), damit es jeder versteht.
    Kann dann jeder so wie er will hinschreiben.


    Ich hoffe es ist erlaubt dir diesen Vorschlag zu machen, ebenso hoffe ich,
    dass ich dir ein bisschen weiterhelfen konnte.



    Liebe Grüße,
    Pille

  • Nützlich für bspw. die näherste Tankstelle auf der Map makieren o.Ä.
    Rechnet die Reichweite vom Spieler und den Koordinaten und wählt davon das, welches dem Spieler am nähesten ist.


    new Float:tankstellen[2][] = {
    {-1471.5, 1863.75, 32.7},
    {-1326.5, 2677.5, 50.1}
    };


    new Float:distance[sizeof(tankstellen)], Float:minimum, x;
    for(new i = 0; i < sizeof(tankstellen); i++) {
    distance[i] = GetPlayerDistanceFromPoint(playerid, tankstellen[i][0], tankstellen[i][1], tankstellen[i][2]);
    }


    for(new i = 0; i < sizeof(distance); i++) {
    if(distance[i] < minimum || minimum == 0) {
    minimum = distance[i];
    x = i;
    }
    }

  • Warum umbedingt 2 schleifen das geht auch direkt in einer:



    stock getNearstOilStation(playerid) {
    new i, x = -1;
    for(; i < sizeof(tankstellen); i++) {
    if(x == -1 || GetPlayerDistanceFromPoint(playerid, tankstellen[i][0], tankstellen[i][1], tankstellen[i][2]) < GetPlayerDistanceFromPoint(playerid, tankstellen[x][0], tankstellen[x][1], tankstellen[x][2])) x = i;
    }
    return x;
    }



    nun gut die schnellere variante wäre wahrscheinlich so, da die übergabe einer Float von einer variablen schneller ist als der Aufruf einer Funktion



    stock getNearstOilStation(playerid) {
    new i, x = -1, Float: distanz[2];
    for(; i < sizeof(tankstellen); i++) {
    distanz[0] = GetPlayerDistanceFromPoint(playerid, tankstellen[i][0], tankstellen[i][1], tankstellen[i][2]);
    if(x == -1 || distanz[0] < distanz[1]) x = i, distanz[1] = distanz[0];
    }
    return x;
    }

  • Hier eine nützliche Funktion:


    stock ReplaceString(const search[],const replace[], source[], size=sizeof source) //(c) by Kaliber
    {
    new i=strfind(source,search),tmp=strlen(search);
    if(i==-1) return 0;
    for( ; i!=-1; i=strfind(source,search,false,i+1))
    {
    strdel(source,i,i+tmp),strins(source,replace,i,size);
    }
    return 1;
    }


    //Beispiel:
    new string[64] = "Ich liebe Gemüse und Gemüse!";
    ReplaceString("Gemüse", "Schokolade", string);
    print(string); //-> "Ich liebe Schokolade und Schokolade!"


    Gibt es zwar schon, aber diese Funktion ist um einiges schneller, als das was ich sonst so gesehen habe ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Dein Code geht dir auf die Bretter, wenn jemand sowas macht:
    ReplaceString("Gemüse", "Schoki & Gemüse", string);
    Dann wird nämlich gar nichts ausgegeben.


    So wäre es korrekt:
    stock ReplaceString(const search[],const replace[], source[], size=sizeof source)
    {
    new i=strfind(source,search),tmp=strlen(search),len=strlen(replace);
    if(i==-1) return 0;
    for( ; i!=-1; i=strfind(source,search,false,i+len))
    {
    strdel(source,i,i+tmp);
    strins(source,replace,i,size);
    }
    return 1;
    }

  • In diesem Beitrag möchte ich einige Commands zur "Verfügung" stellen. Für Neulinge oder auch für euch falls ihr einen vergessen habt.
    Befehle werden sein:
    /heal [ID]
    /kill [ID]
    /ban [ID]
    /givemoney [ID]


    Als erstes brauchen wir einen Stock "IstSpielerAdmin" um abzufragen ob der Spieler Admin ist. Denn solche Befehle wie /heal, /kill usw. sollte kein normaler User können (bis auf /givemoney aber das habe ich noch unter Admin-Rechte stehen)


    Der Stock sollte so aussehen:

    stock IstSpielerAdmin(playerid,level) //mit "level" bestimmen wir welchen Adminrang der Nutzer haben soll um dies benutzen zu können
    {
    if(sSpieler[playerid][Adminlevel] >= level) return 1; // Wenn vom Spieler das Adminlevel genausogroß ist wie level (oben erklärt) dann soll was passieren
    return 0;
    }


    Gut. Haben wir das schonmal geschafft. Nun kommen wir zu dem Befehl /heal
    Den Befehl habe ich mit dcmd geschrieben.



    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


    Einfach nach den Includes schreiben und dann könnt ihr schon mit dcmd arbeiten.


    Zuerst gehen wir zu "OnPlayerCommandText" und schreiben nach den { }

    dcmd(heal,4,cmdtext); //die 4 steht für die Anzahl der Buchstaben in dem Wort (h-e-a-l) also 4


    Jetzt können wir wirklich unseren Befehl schreiben.


    Wir gehen dazu unter die letzte geschweifte Klammer von den OnPlayerCommandText und schreiben:

    dcmd_heal(playerid,params[]) //die Parameter werden später noch festgelegt
    {
    new i;
    if(strlen(params))
    {
    i=strval(params); //der Parameter wird festgelegt
    if(IsPlayerConnected(i)) //wenn der Spieler eingeloggt ist (i - steht für den Spieler den wir heilen wollen)
    {
    if(sSpieler[playerid][Adminlevel]>=2) //der Spieler der heilen möchte den Adminrang 2 hat
    {
    SetPlayerHealth(i,100); //soll der von dem angegebenen Spieler das Leben auf 100 machen
    SendClientMessage(i,gelb,"Du wurdest geheilt."); //Diese Message wird an die ID wiedergegeben
    SendClientMessage(playerid,gelb,"Du hast jemanden geheilt."); //Diese Message wird dir wiedergegeben
    }
    else //sollte aber der Adminrang 0 oder 1 sein
    {
    SendClientMessage(playerid,rot,"Du bist kein Admin! Oder dein Adminlevel ist zu niedrig!"); //wird die Message dir ausgegeben
    }
    }
    }
    return 1;
    }


    Die Kommentare sollten euch alles erklären.
    Kommen wir nun zu /kill dazu müssen wir unter "OnPlayerCommandText" nach der ersten geschweiften Klammer (da wo unser heal steht) dies schreiben:

    dcmd(kill,4,cmdtext); //die 4 steht wieder für die Anzahl der Buchstaben (k-i-l-l)


    Nun fügt ihr unter den OnPlayerCommandText und UNTER dem Befehl "dcmd_heal" dies ein:

    dcmd_kill(playerid,params[]) //die Parameter werden später noch festgelegt
    {
    new i;
    if(strlen(params))
    {
    i=strval(params); //wir legen gerade den Parameter fest
    if(IsPlayerConnected(i)) //wenn der angegebene Spieler eingeloggt ist
    {
    if(sSpieler[playerid][Adminlevel]>=3) //und der User der ihn töten möchte den Adminrang 3 hat
    {
    SetPlayerHealth(i,0); //soll er das leben auf 0 setzen (also töten)
    SendClientMessage(i,rot,"Du wurdest getötet."); //diese Nachricht wird an dem Spieler der getötet wurde ausgegeben
    SendClientMessage(playerid,gelb,"Du hast jemanden getötet."); //diese Nachricht wird an dir ausgegeben
    }
    else //wenn er aber Adminrang 0,1 oder 2 ist
    {
    SendClientMessage(playerid,rot,"Du bist kein Admin! Oder dein Adminlevel ist zu niedrig!"); //soll diese Message ausgegeben werden
    }
    }
    }
    return 1;
    }


    Nun kommen wir zu /ban. Dies tun wir ebenfalls mit dcmd. Wir gehen wieder unter "OnPlayerCommandText" und schreiben unter "kill" und "heal"

    dcmd(ban,3,cmdtext); // die 3 steht für die Anzahl der Buchstaben (b-a-n)


    Nun geht ihr unter die letzte geschweifte Klammer von OnPlayerCommandText und dort sehen wir die anderen dcmd Befehle.
    Nun sucht ihr einen freien Platz unter den dcmd kill und schreibt dies:

    dcmd_ban(playerid,params[]) //der Parameter wird später noch festgelegt
    {
    new i;
    if(strlen(params))
    {
    i=strval(params); //hier wird der Parameter festgelegt
    if(IsPlayerConnected(i)) //wenn der angegebene Spieler den wir bannen wollen eingeloggt ist
    {
    if(sSpieler[playerid][Adminlevel]>=5) //und der Spieler der ihn bannen möchte den Adminrang 5 hat
    {
    SendClientMessage(i,gelb,"Du wurdest gebannt."); //Diese Message wird an die ID wiedergegebe
    SendClientMessage(playerid,gelb,"Du hast jemanden gebannt."); //Diese Message wird dir wiedergegeben
    Ban(i); //soll er diesen Spieler bannen
    // macht nicht zuerst Ban(i) ansonsten bekommt er die Nachricht nicht mehr!!
    }
    else //sollte dies nicht funktionieren
    {
    SendClientMessage(playerid,rot,"Du bist kein Admin! Oder dein Adminlevel ist zu niedrig!"); //wird diese Message ausgegeben
    }
    }
    else
    {
    SendClientMessage(playerid,rot,"Der angegebene Spieler konnte nicht gefunden werden."); //ist der Spieler nicht eingeloggt kommt diese Message
    }
    }
    return 1;
    }


    Als letztes kommen wir zu /givemoney. /givemoney ist auch ein dcmd Befehl.
    Ihr geht wieder zu OnPlayerCommandText und schreibt unter dcmdban dies:

    dcmd(givemoney,9,cmdtext); //die 9 steht für die Anzahl der Buchstaben in dem Wort (g-i-v-e-m-o-n-e-y)


    Danach geht ihr zu den anderen dcmd Befehlen und schreibt unter den letzten (also ban) das hier:

    dcmd_givemoney(playerid, params[])
    {
    if(IstSpielerAdmin(playerid,3)) //wenn der Spieler den Adminrang 3 hat
    {
    new
    giveplayerid, //hier legen wir Strings fest (berichtigt mich wenn ich was falsches sage)
    amount;
    if (sscanf(params, "ud", giveplayerid, amount)) SendClientMessage(playerid, 0xFF0000AA, "Benutzung: /givemoney [ID] [SUMME]"); //wenn bei SSCANF die parameter "u" und "d" vorkommen (u steht für den Spieler und d für einen Integer)
    else if (giveplayerid == INVALID_PLAYER_ID) SendClientMessage(playerid, 0xFF0000AA, "Spieler nicht gefunden"); //sollte die PlayerID nicht vorhanden sein dann kommt die Message
    else if (amount == GetPlayerMoney(playerid)) SendClientMessage(playerid, 0xFF0000AA, "Geld konnte nicht übertragen werden.");
    else
    {
    GivePlayerMoney(giveplayerid, amount); //dann soll das Geld übertragen werden
    //GivePlayerMoney(playerid, 0 - amount); - ausgeklammert lassen sonst funktioniert der Befehl nicht mehr!
    SendClientMessage(playerid, gelb, "Geld gesendet!"); //an uns
    SendClientMessage(giveplayerid, gelb, "Geld erhalten!"); //an den angegebenen Spieler
    }
    }
    return 1;
    }


    Bei /givemoney habe ich mir Hilfe von SA:MP Wikipedia geholt da ich den Befehl selber gesucht habe und dauernd nur "Geld konnte nicht übertragen werden." Befehl bekam. (Wurde von mir auf Deutsch frei übersetzt)
    Also einfach GivePlayerMoney(playerid, 0 - amount); weg lassen!


    Die Befehle habe ich natürlich selber geschrieben (außer /givemoney)
    dann habe ich noch Befehle wie /makeberuf (einen Spieler in den Beruf tun - war mir vor 1 Tag noch nötig)
    und weitere Befehle wie /stats , /quitjob, /binichadmin, /tellspd (teleport-lspd), /gmx (Serverneustart), usw.

  • Wie kommen alle eigentlich immer darauf, das alle Scripter süchtig sind. So ein gutes Itemsystem braucht 1-2 Wochen wenn man täglich ein bissien Scriptet.


    und hab ein Itemsystem in 1-2 Tagen (maximal 3).


    Es soll zumindestens gut sein. Und ohne Fehler&Sicherheitslücken. Und das geht nicht in 2 Stunden.


    Ich bitte euch...eigentlich braucht man dafür keine 5 Minuten hier mal ein sehr gutes Beispiel dafür:


    enum e_Items (<<=1)
    {
    Hut = 1,
    Shirt,
    Tasche,
    Fahrrad,
    Shit //man kann hier 32 Items erstellen, sollte fürs erste reichen :)
    };
    new e_Items:Items[MAX_PLAYERS];


    //Dann ein paar Makros:
    #define GivePlayerItem(%0,%1) Items[%0] |= %1
    #define RemovePlayerItem(%0,%1) Items[%0] &= ~(%1)
    #define ResetAllItems(%0) Items[%0] = 0
    #define HasItem(%0,%1) (Items[%0] & (%1))


    //Dann kann man das einfach setzen:
    GivePlayerItem(playerid, Hut);


    //Dann removen:
    RemovePlayerItem(playerid, Hut);


    //Dann einfach prüfen:
    if(HasItem(playerid,Hut))
    {
    //Hier hat er einen Hut
    }


    //Speichern, ganz easy als Integer in seinem Speicher System...in Items[playerid] steht alles und dann einfach laden lassen...


    Effizient, einfach und schnell ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Nebenbei (<<=1) was bezweckt das bei dem Enum?


    Das du dort mit Bits arbeiten kannst.


    Wichtig ist dabei auch, das der erste Wert 1 ist


    Code
    Hut = 1


    Ansonsten ist jeder Wert den man ausliest 0.
    Aber er muss ja eine gewisse Gültigkeit aufweisen, wenn etwas da ist.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski