[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Meinst du in deinem Command oder extern durch etwas anderes? ^^

    Wird im Command wieder auf 0 gesetzt.


    Also /amodus aktiviert.
    Nochmal /amodus soll deaktivieren und den Namen wieder normal ohne [ADMIN] machen.
    Was mir grade aber aufgefallen ist, ist das sobald /amodus eingetippt wird, eine neue Accountdatei erstellt wird.
    Kein Plan wie ich das hinbekommen habe xD

  • Ich habe ein kleines Problem was ich überhaupt nicht verstehe, das sich auch auf andere befehle ausweitet.



    dcmd_pay(playerid,params[])
    {
    new pid;
    new geld;
    new spieler[256];
    new spieler2[256];
    new geber[MAX_PLAYER_NAME];
    new nehmer[MAX_PLAYER_NAME];
    new Float:x,Float:y,Float:z;
    GetPlayerName(playerid,geber,sizeof(geber));
    GetPlayerName(pid,nehmer,sizeof(nehmer));
    GetPlayerPos(pid,x,y,z);
    if(sscanf(params,"ui",pid,geld)) return SendClientMessage(playerid,Weiß,"Info: /pay (playerid) (summe)");
    if(pid == INVALID_PLAYER_ID) return SendClientMessage(playerid,Weiß,"Der Spieler mit dieser ID ist nicht Online!");
    if(pid == playerid) return SendClientMessage(playerid,Weiß,"Du kannst dir nicht selbst Geld geben!");
    if(!IsPlayerInRangeOfPoint(pid,2,x,y,z)) return SendClientMessage(playerid,Weiß,"Dieser Spieler ist nicht in der Nähe!");
    format(spieler,sizeof(spieler),"Du hast %s %i$ gegeben!", nehmer,geld);
    format(spieler2,sizeof(spieler2),"%s hat dir %i$ gegeben!",geber,geld);
    SendClientMessage(pid,Weiß,spieler2);
    SendClientMessage(playerid,Weiß,spieler);
    GivePlayerMoney(pid,geld);
    GivePlayerMoney(playerid,-geld);
    return 1;
    }


    Ich war auf meinem Testserver und habe diesen Befehl getestet mit 2 Accounts.
    Playerid 0 = NoxiZ und playerid 1 = chazer!
    Wenn playerid 0 der 1 geld gibt, steht da, du hast NoxiZ geld gegeben! Warum wird der name "chazer" nicht erkannt?
    wenn playerid 1 der 0 geld gibt, lässt sich nichts feststellen, da da ja NoxiZ stehen soll so wie gewünscht!


    wo ist der fehler?

  • Du musst auf die Reihenfolge achten. Du liest den Spielernamen von pid aus, aber danach erst die pid selber mit sscanf.


    So würde ich es machen, man kann die String-Variablen wiederverwenden und die Reihenfolge ist so auch korrekt.

    Einmal editiert, zuletzt von Madd92 ()

  • Hat gefunkt.


    und was ist daran falsch?
    ist aus nem tutorial so übernommen aber failt total



    dcmd_usedrugs(playerid,params[])
    {
    #pragma unused params
    new str[145];
    new strii[145];
    new Float:x, Float:y, Float:z;
    if(sSpieler[playerid][Drogen] <= 0) return SendClientMessage(playerid,Weiß,"Du hast keine Drogen!");
    sSpieler[playerid][Drogen]--;
    format(str, sizeof(str), "Du hast 1g Drogen genommen und 10HP erhalten (%d/10)", sSpieler[playerid][Drogen]);
    SendClientMessage(playerid,Weiß, str);
    GivePlayerHealth(playerid,10);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInRangeOfPoint(i, 40.0, x, y, z))
    {
    GetPlayerName(playerid, strii, sizeof(strii));
    GetPlayerPos(playerid, x, y, z);
    format(strii, sizeof(strii), "%s hat Drogen genommen!",playerid);
    SendClientMessage(i, Weiß, strii);
    }
    }
    }
    return 1;
    }


    der spieler der usedrugs benutzt nimmt 2 mal drogen wenn jemand in der nähe ist
    und der andere in der nähe sieht den text "NoxiZ hat Drogen genommen! hat Drogen genommen!"

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Auch da ist die Reihenfolge wieder völlig durcheinander, GetPlayerPos steht erst hinter IsPlayerInRangeOfPoint. Zumal wird strii für GetPlayerName und für die ClientMessage benutzt. Ein gut gemeinter Rat: lieber statt 1:1 kopieren, selber verstehen und umsetzen :)




  • dcmd_usedrugs(playerid)
    {
    new String[128], SpielerName[MAX_PLAYER_NAME], Float:x, Float:y, Float:z;


    if(sSpieler[playerid][Drogen] <= 0) return SendClientMessage(playerid, Weiß, "Du hast keine Drogen!");

    sSpieler[playerid][Drogen]--;
    GetPlayerPos(playerid, x, y, z);
    GivePlayerHealth(playerid, 10);
    GetPlayerName(playerid, SpielerName, MAX_PLAYER_NAME);

    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInRangeOfPoint(i, 40.0, x, y, z))
    {
    format(String, sizeof(String), "%s hat Drogen genommen!", SpielerName);
    SendClientMessage(i, Weiß, String);
    }
    }
    }
    format(String, sizeof(String), "Du hast 1g Drogen genommen und 10HP erhalten (%d/10)", sSpieler[playerid][Drogen]);
    SendClientMessage(playerid, Weiß, String);
    return 1;
    }


    //Edit kleiner Fail

  • Hey meine Spielerfunktionen in einem 1Sekunden Timer der sich wiederholt, start bei Serverstart, funktioniert nicht mehr so richtig, aber vor kurzem ging es noch einwandfrei.
    Der Timer funktioniert aber die Schleifenfunktion im Timer geht irgendwie nicht mehr und ich kann den Fehler selbst nicht finden


    Code:


    SA:MP in 2020?

  • Keine Bange der ist nicht kopiert höchstens von mir selber.


    habe diesen Befehl:



    dcmd_gc(playerid,params[])
    {
    new text[256];
    new spielername[MAX_PLAYER_NAME];
    if(sscanf(params,"s",text)) return SendClientMessage(playerid,Weiß,"Info: /gc (text)");
    if(sSpieler[playerid][Fraktion] < 1 || sSpieler[playerid][Fraktion] > 2) return SendClientMessage(playerid,Weiß,"Du bist in keiner Gang!");
    {
    GetPlayerName(playerid,spielername,sizeof(spielername));
    format(text,sizeof(text),"%s %s %s: %s",GetFraktionName(playerid),GetRangName(playerid),spielername,text);
    SendGangMessage(1&&2,Weiß,text);
    }
    return 1;
    }


    Wie man sehen kann soll der geschriebene Text an Fraktion 1 und 2 gesendet werden.
    Bei Frak. 1 klappt das auch, ob dabei die Nachricht an 2 gesendet wird, weiß ich momentan nicht.
    Bei Frak. 2 passiert wiederum nichts. Wie ich schon öfter bemerkt habe, kommt der nicht dastehende Text bei Fraktion 1 an.


    Mein stock sieht so aus:



    //GANGNACHRICHTEN
    stock SendGangMessage(frakid,farbe,string[])
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(sSpieler[i][Fraktion] == frakid)SendClientMessage(i,farbe,string);
    }
    }


    meine komplette bugliste besteht momentan aus diesem problem

  • @NoxiZ



    dcmd_gc(playerid,params[])
    {
    new text[256];
    new spielername[MAX_PLAYER_NAME];
    if(sscanf(params,"s",text)) return SendClientMessage(playerid,Weiß,"Info: /gc (text)");
    if(sSpieler[playerid][Fraktion] < 1 || sSpieler[playerid][Fraktion] > 2) return SendClientMessage(playerid,Weiß,"Du bist in keiner Gang!");
    {
    GetPlayerName(playerid,spielername,sizeof(spielername));
    format(text,sizeof(text),"%s %s %s: %s",GetFraktionName(playerid),GetRangName(playerid),spielername,text);
    SendGangMessage(1,Weiß,text);
    SendGangMessage(2,Weiß,text);
    }
    return 1;
    }


    1&&2 ist ein "Logik-Operator" und wird schließlich zu 1 siehe [wiki]Control_Structures#Operators[/wiki]

  • Hey ich frage mich gerade wie man am besten ein temp ban sys (temporäres Ban System) machen kann.
    Das heißt wenn z.B: ein Admin eingibt /ban [ID = 2] [Stunden = 5], dass dieser nach 5 Stunden automatisch entbannt ist?


    Ich weiß, dass es irgendwie mit Datum + Uhrzeit zusammenhängt jedoch kann ich mir nicht vorstellen wie ich das anstellen soll.

    SA:MP in 2020?

  • Das einfachste wäre wahrscheinlich mit Gettime die Unix-Zeit zum Zeitpunkt des Banns auszulesen und gemeinsam mit der Banndauer in deiner Datenbank zu speichern. Wenn der Spieler sich dann einloggen will, prüfst du, ob der Zeitpunkt des Banns länger zurückliegt, als die Banndauer lang ist. Man sollte dabei allerdings z.B. auf Sommer-/Winterzeit achten. Wenn du Google bemühst, findest du zu "samp temp ban" einige Beispiele :)

  • Habe diesen Giverank befehl



    dcmd_giverank(playerid,params[])
    {
    new pid;
    new rang = sSpieler[playerid][Rang];
    new spieler[256];
    new leader[256];
    new spielername[MAX_PLAYER_NAME];
    new leadername[MAX_PLAYER_NAME];
    if(sscanf(params,"ud",pid,rang)) return SendClientMessage(playerid,Weiß,"Info: /giverank (playerid)(rang)");
    if(pid == INVALID_PLAYER_ID) return SendClientMessage(playerid,Weiß,"Der Spieler mit dieser ID ist nicht Online!");
    if(sSpieler[playerid][Leader] < 1) return SendClientMessage(playerid,Weiß,"Du bist kein Leader!");
    if(pid == playerid) return SendClientMessage(playerid,Weiß,"Du kannst dir nicht selbst einen Rang geben!");
    if(rang < 1 || rang > 6) return SendClientMessage(playerid,Weiß,"Der Rang muss zwischen 1 und 6 liegen!");
    GetPlayerName(playerid,leadername,sizeof(leadername));
    GetPlayerName(pid,spielername,sizeof(spielername));
    if(sSpieler[playerid][Leader] > 0)
    {
    format(spieler,sizeof(spieler),"Du wurdest von %s zum Rang %d befördert",leadername,rang);
    format(leader,sizeof(leader),"Du hast %s zum Rang %d befördert",spielername,rang);
    SendClientMessage(pid,Weiß,spieler);
    SendClientMessage(playerid,Weiß,leader);
    }
    return 1;
    }


    und folgenden stock der die rangnamen definieren soll



    //FRAKTIONSRÄNGE
    stock GetRangName(playerid)
    {
    new name[32];
    name = "Rangname";
    switch(sSpieler[playerid][Fraktion])
    {
    case 1:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Laufbursche";
    case 2: name = "Fahrer";
    case 3: name = "Bodyguard";
    case 4: name = "Homie";
    case 5: name = "Rechte Hand";
    case 6: name = "Anführer";
    case 7: name = "Leader";
    }
    }
    case 2:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Laufbursche";
    case 2: name = "Fahrer";
    case 3: name = "Bodyguard";
    case 4: name = "Homie";
    case 5: name = "Rechte Hand";
    case 6: name = "Anführer";
    case 7: name = "Leader";
    }
    }
    case 3:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Officer";
    case 2: name = "Sergeant";
    case 3: name = "Leutenant";
    case 4: name = "Captain";
    case 5: name = "Inspector";
    case 6: name = "Chief";
    case 7: name = "Stuff Chief";
    }
    }
    case 4:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Rettungshelfer";
    case 2: name = "Rettungsassistent";
    case 3: name = "Rettungssanitäter";
    case 4: name = "Notarzt";
    case 5: name = "Notärztin";
    case 6: name = "Oberarzt";
    case 7: name = "Chefarzt";
    }
    }
    case 5:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Fahrlehrer";
    case 2: name = "Fahrlehrer";
    case 3: name = "Fahrlehrer";
    case 4: name = "Fahrlehrer";
    case 5: name = "Fahrlehrer";
    case 6: name = "Stv. Chef";
    case 7: name = "Chef";
    }
    }
    case 6:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Fahrer";
    case 2: name = "Logistiker";
    case 3: name = "Fachlogistiker";
    case 4: name = "Lagerleiter";
    case 5: name = "Lagermeister";
    case 6: name = "Stv. Geschäftsleitung";
    case 7: name = "Geschäftsleitung";
    }
    }
    }
    return name;
    }


    leider ändert sich nur der rang aber nicht der rangname.
    habe schon ein paar sachen versucht ohne erfolg

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