[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
  • Nein der letzte Eintrag ist -1.
    Die Frage ist nur was er genau vorhat, will er wirklich nur den letzten Wert(so wie es für mich klingt) oder will er den letzten Wert der nicht dem Standardwert entspricht(deine Schleife).

    Ja ich wollte nur den wirklich letzten Wert :D


    Noch ne Frage
    Meine binary suche ist irgendwie kaputt :D returnt immer 0,kA warum, hat jemand eventuell zufaellig ne binaersuch Funktion auf Lager?


    Oder muss ich l un r eventuell anders festlegen?


    Der fragliche Teil:


    Code
    new mres = binsearch(MoneyPickups,pickupid,MoneyPickups[0],MoneyPickups[sizeof(MoneyPickups)-1]);
            if(MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE;
            printf("ID:%d mres: %d",pickupid,mres);


    Es kommt immer zu return 0 aus meiner binsearch funktion



    Habe als l das erste Element genommen also das am weitesten Links ist MoneyPickups[0] und das am weitesten rechts ist MoneyPickups[sizeof(MoneyPickups)-1]

    Einmal editiert, zuletzt von Sub Royal ()

  • Hier, mach es mal so:


    ast2ufdyxkb1.png


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

  • Danke dir ! :D warum funktioniert deine binaersuche , jedoch meine nicht? :D Habe ich da was falsch gemacht?


    Super dann werde ich mal folgendes einbauen :D



    C
    new ares = binsearch(pickupid,ActorPickups,sizeof(ActorPickups));
    		if(ares != -1) return index=ares,ACTOR_TYPE;
    		printf("ID: %d ares: %d",pickupid,ares);
    		new mres = binsearch(pickupid,MoneyPickups,sizeof(MoneyPickups));
    		if(mres != -1) return index=mres,MONEY_TYPE;
    		printf("ID: %d mres: %d",pickupid,mres);

    Vielen Dank nochmal! Zu Binaersuche im PAWN konnte mir leider im englischen Forum nicht geholfen werden

  • Habe ich da was falsch gemacht?

    Also 2 Dinge:


    1. 0 zu returnen ist nicht gut, da auch das 1. Element im Array mit 0 indexiert ist.


    2. mit l und r gibst du die Array Positionen an und nicht die Elemente.


    Also deine müsste z.B. so aussehen:


    binsearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);

    ast2ufdyxkb1.png


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

  • Hallo, kann mir jemand verraten warum der 2 Sting nicht an gesendet wird? Im Spiel ist nur eine Leerzeile im Chat dann



    ocmd:ooc(playerid,params[])
    {
    new string1[128],string2[128];
    if(!IsPlayerGM(playerid,2)) return 1;
    if (OOChat == 1)
    {
    format(string1,sizeof(string1), "%s %s hat den OOC Chat geschlossen!", GetGMRang(playerid),getPlayerName(playerid));
    SendClientMessageToAll(FARBE_ROT,string2);
    OOChat = 0;
    }
    else
    {
    OOChat = 1;
    format(string2,sizeof(string2), "%s %s hat den OOC Chat geöffnen (/o )!", GetGMRang(playerid),getPlayerName(playerid));
    SendClientMessageToAll(FARBE_ROT,string2);
    }
    return 1;
    }

  • Hallo, kann mir jemand verraten warum der 2 Sting nicht an gesendet wird? Im Spiel ist nur eine Leerzeile im Chat dann

    Hier, probier mal folgendes:

    C
    ocmd:ooc(playerid,params[])
    {
        if(!IsPlayerGM(playerid,2)) return 1;
        new string[128];
        format(string,sizeof(string),"%s %s hat den OOC Chat %s!", GetGMRang(playerid),getPlayerName(playerid),((OOChat)?("geschlossen"):("geöffnet (/o )")));
        SendClientMessageToAll(FARBE_ROT,string);
        OOChat = !OOChat;
        return 1;
    }

    Da sparste dir einiges :)

    ast2ufdyxkb1.png


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

  • Hier, probier mal folgendes:

    C
    ocmd:ooc(playerid,params[])
    {
        if(!IsPlayerGM(playerid,2)) return 1;
        new string[128];
        format(string,sizeof(string),"%s %s hat den OOC Chat %s!", GetGMRang(playerid),getPlayerName(playerid),((OOChat)?("geschlossen"):("geöffnet (/o )")));
        SendClientMessageToAll(FARBE_ROT,string);
        OOChat = !OOChat;
        return 1;
    }

    Da sparste dir einiges :)

    Hat funktioniert, danke.
    Ich wusste gar nicht das man einen string so noch einmal teilen kann

  • passt net ganz...

    Du hast das Dollar-Zeichen hinten hin gemacht. Das ist von der Schreibweise her nicht richtig.
    Daher auch der Punkt an der falschen Stelle.


    Wenn du es zwingend so haben willst, dann so:
    new str[16], money = GetPlayerMoney(playerid);
    format(str, sizeof(str), "%d$", money);
    if(money >= 0)
    {
    for(new i = strlen(str)-4; i > 0; i-=3) strins(str, ".", i);
    }
    else
    {
    for(new i = strlen(str)-4; i > 1; i-=3) strins(str, ".", i);
    }
    PlayerTextDrawSetString(playerid, pMoneyText[playerid], str);

  • Ich muss leider nochmal stoeren :D



    C
    stock GetPickupType(pickupid, &index)
    {
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
    	return INVALID_PICKUP_TYPE;
    }


    Wenn ich das so schreibe, dann funktioniert das ganze nur fuer die Actor Pickups, das heisst beim Geld einsammeln kriegt der Spieler kein Geld


    C
    stock GetPickupType(pickupid, &index)
    {
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
    	return INVALID_PICKUP_TYPE;
    }

    Wenn ich das so rum mache ist das genau umgedreht :D Money Pickups funktionieren, das heisst der Spieler kriegt Geld, jedoch funktionieren die ActorPickups nicht ?(
    Kann ich das irgendwie mit nem if-else Gebilde loesen ? :D

  • Nein, das bedeutet dass du in beiden Arrays die selben IDs hast xD


    Irgendwas stimmt da mit deiner Zuweisung nicht ^^


    Aber wie gesagt, eigentlich musst du Money pickups nicht extra definieren nur alle anderen ^^

    ast2ufdyxkb1.png


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

  • Nein, das bedeutet dass du in beiden Arrays die selben IDs hast xD


    Irgendwas stimmt da mit deiner Zuweisung nicht ^^


    Aber wie gesagt, eigentlich musst du Money pickups nicht extra definieren nur alle anderen ^^

    Ja das probiere ich mal :D
    Mit der Zuweisugn hmm, habe da nix gefunden
    Habe mal die Inhalte von dem kleineren Array im grossen gesucht, und das einzige wo es immer ein match gibt, ist bei Pickupid 0, die ist in beiden drin, keine Ahnung warum
    Alle anderen sind nicht in den jeweils anderem Array enthalten

  • Habe mal die Inhalte von dem kleineren Array im grossen gesucht, und das einzige wo es immer ein match gibt, ist bei Pickupid 0, die ist in beiden drin, keine Ahnung warum

    Eventuell leere Indizes.
    Um Fehler mit der ID 0 zu vermeiden entweder alle Array-Indizes auf -1 setzen, oder ganz oben in OnGameModeInit ein Pickup im Nirgendwo erstellen, das hat dann die ID 0 und wird nie aufgerufen.



    Alle anderen sind nicht in den jeweils anderem Array enthalten

    Siehe Post #24.196.

  • Eventuell leere Indizes.Um Fehler mit der ID 0 zu vermeiden entweder alle Array-Indizes auf -1 setzen, oder ganz oben in OnGameModeInit ein Pickup im Nirgendwo erstellen, das hat dann die ID 0 und wird nie aufgerufen.



    Siehe Post #24.196.

    Danke dir, das hat mir schonmal geholfen die doppelten IDs zu verhindern :D
    Habe jedoch immernoch das Problem wenn:


    Den Teil aus Post #24.196 habe ich auch eingebaut.


    Ich das hier habe


    C
    stock GetPickupType(pickupid, &index)
        {
        	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
        	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
        	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
        	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
        	return INVALID_PICKUP_TYPE;
        }


    Und dann ein ActorPickup einsammle, dann wird INVALID_PICKUP_TYPE returnt, weshalb weiss ich nicht.
    Wenn ich ein MoneyPickup einsammle ist alles gut, dann funktioniert alles so wie es soll.
    Ist alles umgedreht, also der Teil mit den ActorPickups oben, funktionieren die ActorPickups super, sammle ich jedoch ein MoneyPickup ein wird INVALID_PICKUP_TYPE returnt.


    So als wuerde es mir scheinen dass nach dem ersten if statement der direkt dannach zu return INVALID_PICKUP_TYPE geht.


    Aktuell benutze ich den Teil von Kaliber der prima funkt mit den beiden for Schleifen, mit der Suche waere aber die Kroenung :D



    Sind Queues eigentlich moeglich in PAWN?

    Einmal editiert, zuletzt von Sub Royal ()

  • Du hast das Dollar-Zeichen hinten hin gemacht. Das ist von der Schreibweise her nicht richtig.Daher auch der Punkt an der falschen Stelle.


    Wenn du es zwingend so haben willst, dann so:
    new str[16], money = GetPlayerMoney(playerid);format(str, sizeof(str), "%d$", money);if(money >= 0){ for(new i = strlen(str)-4; i > 0; i-=3) strins(str, ".", i);}else{ for(new i = strlen(str)-4; i > 1; i-=3) strins(str, ".", i);}PlayerTextDrawSetString(playerid, pMoneyText[playerid], str);

    vielen Dank :) hat geklappt

    Mit freundlichen Grüßen,
    Dachdecker

  • :D habe den Fehler dank dem englischen SAMP Forum gefunden X/:D


    C
    stock GetPickupType(pickupid, &index)
    {
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ares > -1 && MoneyPickups[ares] == pickupid) return index=ares,ACTOR_TYPE;
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(mres > -1 && MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE;
    	return INVALID_PICKUP_TYPE;
    }

    Habe faelschlicherweise auch unten MoneyPickups drin statt ActorPickups X( jetzt gehts einwandfrei

  • CMD:load(playerid, params[])
    {
    new string[128], int, vehicleid = GetPlayerVehicleID(playerid);
    if(sscanf(params, "i", int))return SendClientMessage(playerid, COLOR_GREY, "{247BA6}* Benutze {33AA33}/load [Menge]");
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_GREY, "** Du befindest dich in keinem Lieferwagen.");
    if(!(Spieler[playerid][pFraktion] == 1))return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Beamter.");
    //if(GetVehicleModel(vehicleid) == 428) return SendClientMessage(playerid, COLOR_RED,"Du bist in keinem Transporter.");
    if(!IsPlayerInRangeOfPoint(playerid, 5.0, 2185.9954,-2262.5286,13.5721))
    {
    if(int < 1 || int > 50000)return SendClientMessage(playerid, COLOR_GREY, "Du kannst nur maximal 50000 Produkte aufladen.");
    new money = int*4;
    if(GetMoney(playerid) < money)return SendClientMessage(playerid, COLOR_GREY, ERROR_MONEY);
    if((int+Vehicle[vehicleid][vehProds]) > 50000)return SendClientMessage(playerid, COLOR_GREY, "** Du kannst nur maximal 50000 Produkte aufladen.");
    Vehicle[vehicleid][vehProds] += int;
    GiveMoney(playerid, -money);
    SendClientMessage(playerid, COLOR_GREEN,"Ladung: Materialien");
    format(string, sizeof(string), "Menge: %d/50000", Vehicle[vehicleid][vehProds], money);
    SendClientMessage(playerid, COLOR_GREEN, string);
    }
    return 1;
    }
    CMD:unload(playerid, params[])
    {
    new string[128], int, vehicleid = GetPlayerVehicleID(playerid);
    if(sscanf(params, "i", int))return SendClientMessage(playerid, COLOR_GREY, "{247BA6}* Benutze {33AA33}/unload [Menge]");
    if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_GREY, "** Du befindest dich in keinem Lieferwagen.");
    if(!(Spieler[playerid][pFraktion] == 1))return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Beamter.");
    //if(GetVehicleModel(vehicleid) == 428) return SendClientMessage(playerid, COLOR_RED,"Du bist in keinem Transporter.");
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 1563.6859,-1694.5925,5.8906))
    {
    if(Frak[1][frakEisen] > 50000)return SendClientMessage(playerid, COLOR_GREY, "** Das Lager ist voll.");
    Frak[1][frakEisen] += (int*50);
    Vehicle[vehicleid][vehProds] -= int;
    format(string, sizeof(string), "{B4B5B7}Verbrecher mit /arrest einsperren\n\n{21DD00}Waffenkammer (LSPD)\n%d/250000\nMaterialien", Frak[1][frakEisen]);
    Update3DTextLabelText(lspd3d, COLOR_LSPDSTOR, string);
    SendClientMessage(playerid, COLOR_GREEN,"Gehalt: 300000$");
    format(string, sizeof(string), "Materialien: %d/50000", Vehicle[vehicleid][vehProds]);
    SendClientMessage(playerid, COLOR_GREEN, string);
    Spieler[playerid][pBank] += 300000;
    format(string, sizeof(string), "* Staatskasse hat dir 300000$ überwiesen. Betreff: Materialien abgeliefert (%d)", Vehicle[vehicleid][vehProds]);
    SendClientMessage(playerid, COLOR_GREEN, string);
    }
    return 1;
    }



    Hallo, ich habe ein kleines problem wen ich die mats unten abgebe in der Garage (LSPD)
    sieht das so aus obwohl es nur 50.000 Stück waren und 7 Stück drinne waren.



    Einmal editiert, zuletzt von seegras () aus folgendem Grund: Wir haben auch PAWN-Syntaxhighlighting