[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
  • Heya,
    habe mir vor ca. einer Stunde einen kleinen /ammo CMD erstellt, der die momentan ausgewählte Waffe mit so oder so viel Patronen füllen soll, wobei der Spieler aber 500$ abdrücken muss.
    Alles klappt, kein Error, jedoch ist es ingame nur Schrott - es zeigt mir bei JEDER Waffe den Text für die Melee-Waffen an. :/
    if (strcmp("/ammo", cmdtext, true, 10) == 0)
    {
    new pMoney, pWeapon;
    pMoney = GetPlayerMoney(playerid);
    pWeapon = GetPlayerWeapon(playerid);

    if(pMoney == 500 || pMoney > 500){
    if (GetPlayerWeapon(playerid) == 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15){
    SendClientMessage(playerid,COLOR_RED,"You can't buy ammo for a melee weapon!");
    }else if(GetPlayerWeapon(playerid) == 16 || 17 || 18){
    GivePlayerWeapon(playerid,pWeapon,5);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 5 peaces of your current weapon!");
    }else if(GetPlayerWeapon(playerid) == 22 || 23){
    GivePlayerWeapon(playerid,pWeapon,75);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 75 cartridges for your pistol!");
    }else if(GetPlayerWeapon(playerid) == 24){
    GivePlayerWeapon(playerid,pWeapon,20);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 20 cartridges for your deagle!");
    }else if(GetPlayerWeapon(playerid) == 25 || 26 || 27){
    GivePlayerWeapon(playerid,pWeapon,20);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 20 cartridges for your shotgun!");
    }else if(GetPlayerWeapon(playerid) == 28 || 29 || 32){
    GivePlayerWeapon(playerid,pWeapon,85);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 285 cartridges for your SMG!");
    }else if(GetPlayerWeapon(playerid) == 30 || 31){
    GivePlayerWeapon(playerid,pWeapon,65);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 65 cartridges for your AK-47 / M4!");
    }else{
    SendClientMessage(playerid,COLOR_RED,"The Administrator disabled /ammo for this weapon!");
    }
    }
    return 1;
    }


    Ich habe mal stark die Vermutung, dass das ganze nicht funktioniert, da pWeapon nicht richtig geupdated wird.(Ja, ich weiß, dass man die new's direkt zuweißen kann, jedoch habe ich etwas ausprobiert. )

  • Wenn du mehrere sachen abfragen willst, müsstest du es so machen:
    if (GetPlayerWeapon(playerid) == 0 || GetPlayerWeapon(playerid) == 1 || GetPlayerWeapon(playerid) == 2 || GetPlayerWeapon(playerid) == 3 //usw...
    Bei deinem vorhaben würde sich die verwendung von switch mehr lohnen.
    Ausserdem kannst du
    if(pMoney == 500 || pMoney > 500){
    direkt mit einer größer-gleich (>=) abfrage lösen.
    if (strcmp("/ammo", cmdtext, true, 10) == 0)
    {
    new
    pMoney = GetPlayerMoney(playerid),
    pWeapon = GetPlayerWeapon(playerid)
    ;
    if(pMoney >= 500)
    {
    switch(pWeapon)
    {
    case 0 .. 15:
    {
    SendClientMessage(playerid,COLOR_RED,"You can't buy ammo for a melee weapon!");
    }
    case 16,17,18:
    {
    GivePlayerWeapon(playerid,pWeapon,5);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 5 peaces of your current weapon!");
    }
    case 22,23:
    {
    GivePlayerWeapon(playerid,pWeapon,75);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 75 cartridges for your pistol!");
    }
    case 24:
    {
    GivePlayerWeapon(playerid,pWeapon,20);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 20 cartridges for your deagle!");
    }
    case 25,26,27:
    {
    GivePlayerWeapon(playerid,pWeapon,20);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 20 cartridges for your shotgun!");
    }
    case 28,29,32:
    {
    GivePlayerWeapon(playerid,pWeapon,85);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 285 cartridges for your SMG!");
    }
    case 30,31:
    {
    GivePlayerWeapon(playerid,pWeapon,65);
    SendClientMessage(playerid,COLOR_GREEN,"You successfully bought 65 cartridges for your AK-47 / M4!");
    }
    default:
    {
    SendClientMessage(playerid,COLOR_RED,"The Administrator disabled /ammo for this weapon!");
    }
    }
    }
    return 1;
    }

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Das ist übrigens genug Problem für ein eigenes Topic ;)


    Ganz ganz schlimm ist die leserlichkeit hierbei - dafür gibt es eine Hilfe, die nennt sich "switch case" ;)


    Daraus wird aus folgender Zeile:


    if (GetPlayerWeapon(playerid) == 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15)
    lediglich:


    case 0..14:


    Ich war jetzt zu faul das alles umzuschreiben, vielleichst machst du es ja selber ;)




    Das ganze müsste in etwa so aussehen, mehr zu switch/case findest du in der englischen Wiki oder hier in irgendwelchen Tutorials :P


    switch(GetPlayerWeapon(playerid))
    {
    case 0..14:
    {
    SendClientMessage(playerid,COLOR_RED,"You can't buy ammo for a melee weapon!");
    }

    }



    Das Hauptproblem allerdings war ja was anderes, das hattest du auch relativ gut erkannt.
    Das Problem ist folgendes: GetPlayerWeapon gibt lediglich die aktuelle Waffe des Spielers zurück, die er auch in der Hand hat. Am leichtesten wäre daher (sofern du weißt, dass der Spieler aus jedem Slot eine Waffe besitzt) der Einsatz von SetPlayerAmmo, ansonsten musst du eine Spur komplizierter rangehen - GetPlayerWeaponData ist da die Funktion die du brauchst.


    Probier erstmal selbst weiter, erst wenns wieder irgendwo hakt nachfragen. ;)


    EDIT: Uh, der Maddin war im Sprinttemp :thumbup:

  • Huch, Maddin hat ja richtig Gas gegeben :D
    Argh, ich wusste das es "switch" auch in PAWN gibt!
    Aber mir viel das ganze erst ein, als ich fertig mit dem Ganzen war ... aber das mit dem ".." war mir neu, kewl. :3
    Vielen dank, funktioniert jetzt. :)



    /edit ( Um doppelpost zu vermeiden, w00t )
    Wie sieht es eigendlich nochmal mit boundary ... walls (?) aus?
    Wie hieß das nochmal, mensch ... eh, denn ich brauche eine, um die Spieler in einer Zone zu halten.
    Klar, positionen braucht man, mal angenommen ich hätte diese schon, was muss ich danach machen?

  • hiho, ich frage mich gerade wie man des ShowStats übersichtlich machen kann, dort habe ich mal folgendes gemalt:

    nun meine frage die leerzeichen ist das alles abgezählt bzw muss man das x fach ausprobieren bis es passt pro zeile?
    und wie könnte man die Stats im script übersichtlich machen formats in 3 zeilen dann noch beliebige leerzeichen dann ists schon nichmehr übersichtlch D:

  • versuchs ma mit tabs ist glaub ich \t
    also
    format(string,sizeod(string),"blaaaa \tbaaaa");
    so in etwa

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

    Margarete Stokowski

  • Hey


    wisst ihr wo der Fehler ist?


    public IsPlayerInGangZone(playerid)
    {
    for(new t = 1; t < MAX_GEBIETE; t++)
    {
    new string[75];
    format(string, sizeof(string), "SAP/GangSystem/Zonen/%d.gebiet", t);
    if(fexist(string))
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    if ((x > Gebiete[t][gminX] && x < Gebiete[t][gmaxX]) && (y > Gebiete[t][gminY] && y < Gebiete[t][gmaxY])){return 1;}
    else{return 0;}
    }
    }}


    Zeile (4362) : warning 209: function "IsPlayerInGangZone" should return a value



    ich finde den wirklich nicht :o


    MFG: Apoolecu

  • Trotzdem hat die funktion glaube ich einen kleinen denkfehler. Wegen dem else return wirst du nie weiter als bis zum ersetn durchlauf der schleife kommen...
    Und strings innerhalb von schleifen zu erstellen ist auch nicht empfehlenswert.

    public IsPlayerInGangZone(playerid)
    {
    for(new t = 1,string[75]; t < MAX_GEBIETE; t++)
    {
    format(string, sizeof(string), "SAP/GangSystem/Zonen/%d.gebiet", t);
    if(fexist(string))
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    if ((x > Gebiete[t][gminX] && x < Gebiete[t][gmaxX]) && (y > Gebiete[t][gminY] && y < Gebiete[t][gmaxY])) return 1;
    }
    }
    return 0;
    }

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Hey habe den nächsten Fehler und zwar wird dies mal der Dialog irgendwie nicht erstellt, Definiert ist er oben im Script ;)


    if(dialogid == DIALOG_GGangC)
    {
    if(response == 0)
    {}
    if(response == 1)
    {
    if(listitem == 0) // Grün
    {
    Gang[Gangerstellt][gColor] = 0x339933FF;
    ShowPlayerDialog(playerid,DIALOG_GGangW1,DIALOG_STYLE_LIST,"Gang System: Gang erstellen","Schlagring\nGolfschläger\nSchlagstock\nMesser\nBaseballschläger\nSchaufel\nBrechstange\nKantana","Weiter","");
    }
    if(listitem == 1) // Rot
    {
    Gang[Gangerstellt][gColor] = 0xCE000000;
    ShowPlayerDialog(playerid,DIALOG_GGangW1,DIALOG_STYLE_LIST,"Gang System: Gang erstellen","Schlagring\nGolfschläger\nSchlagstock\nMesser\nBaseballschläger\nSchaufel\nBrechstange\nKantana","Weiter","");
    }
    if(listitem == 2) // Blau
    {
    Gang[Gangerstellt][gColor] = 0x0000F600;
    ShowPlayerDialog(playerid,DIALOG_GGangW1,DIALOG_STYLE_LIST,"Gang System: Gang erstellen","Schlagring\nGolfschläger\nSchlagstock\nMesser\nBaseballschläger\nSchaufel\nBrechstange\nKantana","Weiter","");
    }
    if(listitem == 3) // Schwarz
    {
    Gang[Gangerstellt][gColor] = 0x000000;
    ShowPlayerDialog(playerid,DIALOG_GGangW1,DIALOG_STYLE_LIST,"Gang System: Gang erstellen","Schlagring\nGolfschläger\nSchlagstock\nMesser\nBaseballschläger\nSchaufel\nBrechstange\nKantana","Weiter","");
    }
    if(listitem == 4) // Gelb
    {
    Gang[Gangerstellt][gColor] = 0xFFDE00FF;
    ShowPlayerDialog(playerid,DIALOG_GGangW1,DIALOG_STYLE_LIST,"Gang System: Gang erstellen","Schlagring\nGolfschläger\nSchlagstock\nMesser\nBaseballschläger\nSchaufel\nBrechstange\nKantana","Weiter","");
    }
    }
    }


    maddin also die Funktion funktioniert jetzt schon ;)


    EDIT: Erledigt ;)

  • Humm,
    'tschuldige wenn ich dich einmal unterbrechen darf, apoolecu, aber ich komm einfach nicht weiter.
    in BlackFoX' Tutorial , diesem hier, erwähnt erselbst, wie man Variablen wie Geld o.ä speichert.


    Ich wollte die Spieler positionen speichern und aufrufen, jedoch wurde mir etwas klar: Geht nicht so ich es mir vorgestellt hatte.
    Im Grunde müssen die coord's einzeln gespeichert werden, x, y und z.
    Mit GetPlayerPos würde das einfach gehen, wenn man nicht immer sowohl x wie auch y und z angeben müsste
    Im Grunde wäre es dann so;
    dini_FloatSet(accFormat,"lastx",GetPlayerPos(playerid, lastx));
    dini_FloatSet(accFormat,"lasty",GetPlayerPos(playerid, lasty));
    dini_FloatSet(accFormat,"lastz",GetPlayerPos(playerid, lastz));
    Geht ja leider nicht.
    Meine Frage nun; wie sonst? :o

  • Herp, wie gesagt, so einfach geht das scheinbar nicht :/


    public OnPlayerDisconnect(playerid, reason)
    {
    new iPlayer[MAX_PLAYER_NAME];
    new String[100];
    GetPlayerName(playerid, iPlayer, sizeof(iPlayer));
    format(String, sizeof(String), "[SERVER] %s left the Server!", iPlayer);
    SendClientMessageToAll(COLOR_RED, String);

    new pName[SLOTS],accFormat[128];
    GetPlayerName(playerid,pName,sizeof pName);
    format(accFormat,sizeof accFormat,"%s.p",pName);
    if(fexist(accFormat) && Player[playerid][logged_in])
    {
    dini_IntSet(accFormat,"rank",GetPlayerWantedLevel(playerid));
    dini_IntSet(accFormat,"score",GetPlayerScore(playerid));
    dini_IntSet(accFormat,"money",GetPlayerMoney(playerid));
    dini_IntSet(accFormat,"skin",GetPlayerSkin(playerid));
    dini_FloatSet(accFormat,"lastx",lastx)); // <---------------------- Zeile 97
    dini_FloatSet(accFormat,"lasty",lasty));
    dini_FloatSet(accFormat,"lastz",lastz));
    }else{
    Player[playerid][logged_in] = 0;
    Player[playerid][rank] = 0;
    Player[playerid][score] = 0;
    Player[playerid][money] = 0;
    Player[playerid][skin] = 0;
    Player[playerid][lastx] = (0.0);
    Player[playerid][lasty] = (0.0);
    Player[playerid][lastz] = (0.0);
    }
    return 1;
    }


    /edit:
    Natürlich noch enum;
    enum pData
    {
    rank,
    score,
    money,
    skin,
    Float:lastx,Float:lasty,Float:lastz,
    logged_in
    }

  • Kommt erstmal darauf an, über was du hochlädst, welches Programm du verwendest usw.
    Hast du alle FTP daten die du brauchst?
    Benutzt du überhaupt ein FTP Programm, oder hast du gar keins?
    Diese ganzen Fragen spielen einen hohen Faktor. *trollface.jpg*


    /edit:
    hab jetzt auch meins herrausgefunden:
    es waren 3 klammern zuviel bei BloodyEric's code. ^^
    Trotzdem danke Eric, wäre alleine nicht auf die Idee gekommen das Ganze auf diese Weiße zu speichern. :)