Give Gun?

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
  • GTA Eastcoast
    Ich benutze ocmd dafür, da ich das gut finde.
    Dafür benötigst du noch sscanf, beides im Anhang.


    Als erstes mache ich die Grundstrucktur des Commands der so aussieht:
    ocmd:givegun(playerid,params[])
    {
    return 1;
    }
    immer return 1; benutze, da sonst Server Unknow Command kommt.
    wenn das erledigt ist, dann folgt nun das:


    new pID /*Eine definition für den Spieler der die Waffe bekommen soll*/,waffe /*das steht für die Waffen ID die eingegeben wird*/,munition /*sollte sich schon klären*/;
    Nun kannst du wenn du das so möchtest auch noch einen Text mit dem Namen, der Waffe und der Munition dem Spieler schicken, dafür machst du folgendes:
    new textA[100], textB[100]; //Wird später gezeigt wofür man das anwendet
    der Command sieht dann jetzt schon so aus:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    return 1;
    }
    Das ist die Variante wo du keine Message an die zwei Spieler schicken lässt.
    Wenn das erledigt ist geht es nun an den eigentlichen Command, des sieht wie folgt aus
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    udd ist dafür da. u steht für den Spieler, d steht für einen Zahlenwert.
    Jetzt ist schon mal gegeben, wenn der Spieler den Befehl nicht richtig eingibt, dass die Meldung kommt wie
    der Befehl richtig genutzt wird. Ist das erledigt geht es nun an die Verteilung der Waffe + Munition.
    Das machst du wie folgt:
    GivePlayerWeapon(pID <-- Dem Spieler der als ID eingetipt wurde,waffe <--- Die Waffen ID die eingetipt wurde,munition <--- Die Munition die mitgegeben wird);
    Jetzt wird bei der Befehleingabe dem Spieler der als Ziel ausgewählt wurde die Waffen ID + die Munition gegeben.
    Aber es gibt ja nicht unendlich viele Waffen IDS. Du kannst mit einer Simplen if Abfrage einstellen
    bis zu welcher Waffen ID es gehen soll, ich nehmen jetzt einfach mal alle.
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    Nun ist gegeben, dass der Spieler nicht eine nicht vorhandene Waffen ID nimmt.
    Der Command sieht dann schonmal so aus:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    GivePlayerWeapon(pID,waffe,munition);
    return 1;
    }


    Jetzt noch wenn du einen Text an die Spieler senden willst.
    Dazu greifen wir das new textA[100], textB[100]; auf
    Jetzt wird folgendes gemacht:
    format(textA,sizeof(textA),"Spieler %s hat dir die Waffen ID %d und %d munition gegeben")
    Jetzt fragt sich natürlich wie wir jetzt den Spielernamen die WaffenID und die Munitionsangabe dort reinbekommen.
    Das geht so. %s steht für einen Text den man dort einfügen kann. %d für eine Zahl die angegeben werden kann.
    Zuerst den Namen, den Namen des Spielers findet man mit GetPlayerName heraus, aber dafür muss erst eine
    neue Definition gemacht werden, und zwar diese:
    new PName[MAX_PLAYER_NAME];
    Jetzt können wir durch dieses new den Namen mit GetPlayerName herausfinden, und das geht so:
    GetPlayerName(playerid,PName,sizeof(PName));
    Nun können wir mit dem Wort PName den Namen in der Message anzeigen lassen, dazu verändern wir das Format wie folgt:
    format(textA,sizeof(textA),"Spieler %s hat dir die Waffen ID %d und %d munition gegeben",PName);
    Nun wird der Name, wenn die Message gesendet wird angezeigt. Das selbe geht auch mit der Waffe und der Munition so.
    Da das schon definiert ist, kann man das gleich einfügen.
    format(textA,sizeof(textA),"Spieler %s hat dir die Waffen ID %d und %d munition gegeben",PName,waffe,munition);
    Nun kann man mit einer SendClientMessage dem gewünschten Spieler diese Information zeigen lassen.
    SendClientMessage(pID,FARBE,textA); //Texta deswegen, da das vorhin oben mit format gemacht wurde
    Fehlt nurnoch die Message für den vergeber, dazu muss ein neues new und GetPlayerName gemacht werden.
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(pID,pName,sizeof(pName));
    Nun muss ein zweites format erstellt werden.
    format(textB,sizeof(textB),"Du hast %s die Waffen ID %d mit %d munition gegeben",pName,waffe,munition);
    Der Command sieht dann so aus:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    GivePlayerWeapon(pID,waffe,munition);
    format(textB,sizeof(textB),"Du hast %s die Waffen ID %d mit %d munition gegeben",pName,waffe,munition);
    format(textA,sizeof(textA),"Spieler %s hat dir die Waffen ID %d und %d munition gegeben",PName);
    SendClientMessage(pID,FARBE,textA);
    SendClientMessage(playerid,FARBE,textB);
    return 1;
    }
    So sieht ein Command im Grunde aus, doch da du ja einem Spieler die Waffe geben willst, die auf deiner Hand liegt, muss man
    ein paar kleinigkeiten ändern.
    wieder der Grundbefehl mit den nötigen Checks:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    return 1;
    }
    Zuerst finden wir mal heraus ob der Spieler die nötige Munition dafür hat. Das machst du wie folgt.
    Eine Schleife und ein New wird hierbei benötigst:
    new weapons[13][2]; //13 = Slots 2 = 2 Angaben (Munition + Waffen ID)
    for (new i = 0; i < 13; i++)//(13 wegen: es gibt 12 slots)
    {
    GetPlayerWeaponData(playerid, i, weapons[i][0], weapons[i][1]);
    }
    Nun wird mit hilfe der Schleife die Daten herausgelesen.
    Nun kannst du folgendes machen:
    if(weapons[i][1] > munition)
    {
    //hier geht es dann weiter
    }
    Hier wird erfragt ob der Spieler eine höhere Munitionsanzahl hat, als er angegeben hatt.
    Nun kann man noch Abfragen ob der Spieler überhaupt die Waffen ID besitzt. Das geht so:
    if(weapons[i][0] == waffe)
    {
    //hier geht es dann weiter.
    }
    Nun wird erfragt, ob der Spieler 1. die Waffe überhaupt hat, und 2. die nötige Munition dazu besitzt.
    Der Command sieht dann so aus:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    new weapons[13][2];
    for (new i = 0; i < 13; i++)
    {
    if(weapons[i][0] == waffe&& weapons[i][1] > munition)
    {


    }
    else
    {
    SendClientMessage(playerid,FARBE,"Sie besitzen entweder die Waffe nicht, oder sie haben nicht genug Munition");
    }
    }
    return 1;
    }
    Nun wird dem Spieler der ausgewählt wurde die Waffe überreicht, und dem Spieler der sie vergibt
    wird diese weggenommen. Wegnehmen geht so, dass man die Munitionsanzahl des Spielers auf 0 setzt.
    Jetzt wird folgendes gemacht:
    GivePlayerWeapon(pID,waffe,munition);
    GivePlayerWeapon(playerid,waffe,0);
    Den Spieler der ausgewählt wurde wird die Waffe übergeben, und dem anderem Spieler weggenommen.
    Dieser Befehl funktioniert jetzt auf jede Distanz, und ich denke das soll so nicht sein.
    Um das zu verhindern kann man nun eine IsPlayerInRangeOfPoint abfrage erstellen. Dazu werden aber
    Koordinanten benötigt, die man nicht hat. Deswegen benutzt man hierbei GetPlayerPos. Das wendet man so an:
    new Float:x, Float:y, Float:z; //Koordinaten sind Floats und werden deswegen so erstellt.
    GetPlayerPos(pID,x,y,z); //Hier werden die Koordinanten herausgefunden
    So nun ist man im Besitzt der Koordinaten. Jetzt wird die IsPlayerInRangeOfPoint Abfrage erstellt:
    if(IsPlayerInRangeOfPoint(playerid,2.0/*distanz anpassen*/,x,y,z))
    {


    }
    Nun wird erfragt ob der Spieler den man auswählt auch an der Position des anderen Spieler ist.
    Der Command sieht dann so aus:
    ocmd:givegun(playerid,params[])
    {
    new pID, waffe, munition;
    new Float:x, Float:y, Float:z;
    GetPlayerPos(pID,x,y,z);
    if(sscanf(params,"udd",pID,waffe,munition))return SendClientMessage(playerid,FARBE,"Benutze: /givegun [playerid][WaffenID][Munition]");
    if(waffe > 46 || waffe < 1)return SendClientMessage(playerid,FARBE,"Error: Max Waffen ID = 46 Min Waffen ID = 1");
    if(IsPlayerInRangeOfPoint(playerid,2.0/*distanz anpassen*/,x,y,z))
    {
    new weapons[13][2];
    for (new i = 0; i < 13; i++)
    {
    if(weapons[i][0] == waffe && weapons[i][1] > munition)
    {
    GivePlayerWeapon(pID,waffe,munition);
    GivePlayerWeapon(playerid,waffe,0);
    }
    else
    {
    SendClientMessage(playerid,FARBE,"Sie besitzen entweder die Waffe nicht, oder sie haben nicht genug Munition");
    }
    }
    }
    else
    {
    SendClientMessage(playerid,FARBE,"Der Spieler ist nicht in Reichtweite
    }
    return 1;
    }
    Und so erstellst du einen /givegun Befehl.
    MfG: T4125Gamer