Namechange mit Befehl und Erlaubnis

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
  • Heyho Leute,


    ich will euch heute mal Zeigen wie ihr ein Namechange macht mit einem Befehl und einem Admin Befehl der dem Spieler erlaubt den Namen zu ändern ;) viel Spaß beim Lesen :D


    Anfang:
    So was brauchen wir für das?

    • SSCANF Stock Function
    • ocmd | dcmd | rcmd | Was auch immer
    • Grundkenntnisse


    Script:
    Fangen wir an wir brauchen als erstes Globale variablen
    nähmlich player Variablen
    die so aussehen
    new variable[MAX_PLAYERS];
    Wie rufen wir das ganze dann auf?
    if(variable[playerid]==wert)
    Setzen tun wir es mit
    variable[playerid]=wert;
    Aber da wir in so einer Variable ein String speichern werden brauchen wir noch eine Zeichenkette
    Das machen wir so
    new namechange[MAX_PLAYER_NAME][MAX_PLAYERS];
    und
    new dontnamechange[MAX_PLAYERS];
    Das natürlich über OnGameModeInit da wir dies Global benötigen!


    So wir haben nun eine Variable die aber noch leer ist wie füllen wir sie?
    Wir machen jetzt unersen Befehl
    ocmd:namechange(playerid,params[])// Das sollte sich von alleine klären ansonsten playeridid gibt den spieler also die id zurück und params die parameter
    ocmd:namechange(playerid,params[])//unser befehl
    {
    new name[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME],str[128],astr[128]; //Die Variablen Local name2 für den input name um herauszufinden wie er heißt und der str zum formatieren und eine nachricht zu senden
    GetPlayerName(playerid,name,sizeof(name));//frägt den namen von playerid ab und gibt ihn dir zurück
    if(sscanf(params,"s",name2)) return SendClientMessage(playerid,-1,"SYNTAX: /namechange [NAME]");//Parameter überprüfung
    if(dontnamechange[playerid]==1) return SendClientMessage(playerid,-1,"Du hast schon ein Namechange angefordert! Warte auf ein Admin! Oder beende den Namechange! Mit /cnc"); //abfrage ob er evtl. schon ein namechange hat bzw. angefordert hat
    if(name2>MAX_PLAYER_NAME)return SendClientMessage(playerid,-1,"Der Name ist zu lang!");//Überprüfung ob der name der länge von MAX_PLAYER_NAME stimmt wenn nicht wird die nachricht returnt
    format(astr,sizeof(astr),"[NAMECHANGE]: Der Spieler %s hat ein Namechange angefordert er will nun %s heißen! /acceptnamechange [ID] um ihm das zu erlauben!",name,name2);
    for(new i; i=0; I<MAX_PLAYERS; i++)//eine for schleife die durch alle players geht
    {
    if(IsPlayerConnected(i))// überprüfen ob i connected ist
    {
    if(IsPlayerAdmin(i))//Abfrage ob i rcon admin ist
    {
    SendClientMessage(i,-1,astr);//Senden nun den astr an alle i bzw. die im Rcon sind!
    }
    }
    }
    namechange[playerid]==name2;//Setzen und den namechange wert auf den input
    dontnamechange[playerid]=1;//setten die variable damit er nicht nochmal ein namechange anfordert
    format(str,sizeof(str),"Du hast ein Antrag auf ein Namechange abgesendet warte bis ein Admin ihn akzeptiert! Name: %s",name2);//Hier wird der string formatiert
    SendClientMessage(playerid,str);//Erklärt sich von selbst!
    }
    So das ist der Befehl um einen Namechange anzufodern! (Hab paar Fehler eingebaut die ich oben beschrieben habe wie man was zuweist damit hier nicht so viel C&P betrieben wird!)


    So wie erwähnt solltet ihr eine Nachricht an einen Admin senden am besten mit dem Inhalt wie den Namechange namen... etc.
    Kommen wir zum cnc befehl!
    ocmd:cnc(playerid,params[])
    {
    new astr[128],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    if(dontnamechange!=1)return SendClientMessage(playerid,-1,"Du hast kein Namechange angefordert somit kannst du keinen Abbrechen!");//abfrage ob er überhaupt ein namechange angefordert hat
    SendClientMessage(playerid,-1,"Du hast den Namechange request abbgebrochen!");//Geben ihm die nachricht das er es abgebrochen hat
    format(astr,sizeof(astr),"Der Spieler %s[ID:%d] hat den Namechange antrag abbgebrochen du brauchst ihn nicht mehr annzunehmen!",name,playerid);//geben den format das der spieler %s mit der id %d(playerid) den Namechange doch nicht will!
    for(new i; i=0; I<MAX_PLAYERS; i++)//eine for schleife die durch alle players geht
    {
    if(IsPlayerConnected(i))// überprüfen ob i connected ist
    {
    if(IsPlayerAdmin(i))//Abfrage ob i rcon admin ist
    {
    SendClientMessage(i,-1,astr);//Senden nun den astr an alle i bzw. die im Rcon sind!
    }
    }
    }
    dontnamechange=0;//setzen die variable wieder auf 0 damit er wieder einen namechange anfordern kann.
    return 1;
    }
    Kommen wir zum Befehl
    ocmd:acceptnamechange(playerid,params[])
    {
    new pID,str[128],name[MAX_PLAYER_NAME];//variablen (local)
    GetPlayerName(playerid,name,sizeof(name));//frägt den namen von playerid ab
    if(!IsPlayerAdmin(playerid)) return 0;//rcon admin abfrage
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,-1,"SYNTAX: /acceptnamechange [ID/NAME]"); //sscanf abfrage
    if(dontnamechange[pID]==0)return SendClientMessage(playerid,-1,"Dieser Spieler hat kein Namechange angefordert!"); //Abfrage ob der Spieler ein namechange angefordert hat?
    format(str,sizeof(str),"Der Spieler %s heißt nun %s !",name,namechange[pID]);//formatierung vom string
    SendClientMessageToAll(str);//Hier wird an alle verbundenen clients der string gesendet!
    dontnamechange[pID]==0;//variable auf 0 da er sein namechange bekommt
    SetPlayerName(pID,namechange[playerid]);//Name wird auf den wer namechange[playerid] gesetzt!
    return 1;
    }(Wieder paar fehler eingebaut!)


    So kurze zussammenfassung:
    Sobald ein Spieler den Befehl /namechange NAME macht wird eine Nachricht an einen Admin gesendet mir eurem Inhalt sobald der Admin /acceptnamechange ID/NAME eingibt wird der name auf den variablen wert geändert!


    MFG
    Danke fürs Lesen! :thumbup:

    4 Mal editiert, zuletzt von Butt_Head ()

  • hab da mal ne frage, was heißt das alles??

    new name[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME],str[128];
    GetPlayerName(playerid,name,sizef(name);
    if(sscanf(params,"s",name2)) return SendClientMessage(playerid,-1,"SYNTAX: /namechange [NAME]");
    if(dontnamechange[playerid]==1) return SendClientMessage(playerid,-1,"Du hast schon ein Namechange angefordert! Warte auf ein Admin! Oder beende den Namechange! Mit /cnc");
    if(name2>MAX_PLAYER_NAME)return SendClientMessage(playerid,-1,"Der Name ist zu lang!");
    //Eine nachricht an die Admins kommen lassen da Grundwissen vorhanden sein sollte könnt ihr das selber machen...
    namechange[playerid]==name2;
    dontnamechange[playerid]=1;
    format(str,sizeof(str),"Du hast ein Antrag auf ein Namechange abgesendet warte bis ein Admin ihn akzeptiert! Name: %s",name2);
    SendClientMessage(playerid,str);

    Ja genau, das heißt das du nichts erklärt hast zu den einzelnden sachen, zudem ist es ein c&p code, also ich würd mir als neuling nicht die mühe machen es zu lesen wenn man gleich den code hat.


  • Hab doch deswegen Fehler eingebaut damit bsp. Hab ja oben erklärt wie man eine variable auf ein Wert setzt und guck wie ichs gemacht hab ;)


    Das du das nicht siehst 0.o


    /edit


    Habs einwenig erklärt aber wie ich am anfang sagte ein bisschen grund wissen ist gefragt dann soll ich nicht kommen ehh was macht SendClientMessage oder was auch immer...

    Einmal editiert, zuletzt von Butt_Head ()

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