[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
  • Hallo^


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


    Hallo bekomme folgenden Fehler: error 035: argument type mismatch (argument 1) (2x)
    beide treten in der SendClient Zeile auf. Dabei hab ich dachte alles. Kann jemand Helfen^^

  • printf gibt immer aus dass die Pickupids 1, 2,3,4,5 sind, bei einer sizeof(GlobalActors) von 5, egal was ich als pickupid in die Funktion gebe

    Das liegt daran, dass du pickupids nicht setzen kannst, sondern sie werden zugewiesen...


    Wie vehicleids / objectids / actorids auch, werden vom Server erstellt :)


    Aber schau nochmal in meinen Code...hab doch gezeigt wie du es machen musst ^^

    ast2ufdyxkb1.png


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

  • Guten Morgen,


    kann mir jemand sagen, ob der Befehl so stimmt? Er soll vor /tv die Coords "speichern" und nach /tv wieder zu dieser Position zurück kehren, anstatt zu Spawnen



    ocmd:tv(playerid,params[])
    {
    if(!IsPlayerGM(playerid,2)) return 1;
    new pID,Float:X,Float:Y,Float:Z;
    if(sscanf(params, "u", pID)) return SendClientMessage(playerid,FARBE_ROT," INFO: /tv [Playerid]");
    GetPlayerPos(playerid,X,Y,Z);
    if(!Beobachte[playerid])
    {
    new string[128];
    TogglePlayerSpectating(playerid, 1);
    PlayerSpectatePlayer(playerid, pID);
    format(string, sizeof(string), "%s %s beobachtet nun den Spieler %s",GetGMRang(playerid),getPlayerName(playerid),getPlayerName(pID));
    SendClientMessage(playerid, FARBE_ROT, string);
    Beobachte[playerid] = true;
    CMDLog(string);
    }
    else
    {
    TogglePlayerSpectating(playerid, 0);
    SetCameraBehindPlayer(playerid);
    Beobachte[playerid] = false;
    SetPlayerPos(playerid,X,Y,Z);
    }
    return 1;
    }

  • Kaliber:


    Habe es mit der Pickupzuweisung so wie in deinem Vorschlag gemacht :D



    Habe jedoch ein kleines Problem:



    Ich versuche gerade irgendwie hinzukriegen, dass der else Teil ausgefuehrt wird, wenn das aufgesammelte Pickup keine Pickupid aus ActorPickups, aber natuehrlich klappt das nicht verneunftig.


    Wie kann ich realisieren, dass else erst ausgefuehrt wird, wenn die For schleife durch ist, und die Bedingung darin nicht erfuellt ist?

  • Probier es mal so:



    public OnPlayerPickUpPickup(playerid, pickupid)
    {
    for(new i=0; i<sizeof(GlobalActors); i++)
    {
    if(pickupid != ActorPickups[i])continue;
    ShowMenuForPlayer(shopmenu,playerid);
    TogglePlayerControllable(playerid,false);
    return 1;
    }
    maxmoney = maxmoney -1;
    DestroyPickup(pickupid);
    GivePlayerMoney(playerid, 1000);
    printf("ID picked up: %d",maxmoney);
    return 1;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Danke dir, leider haut das auch irgendwie nicht hin:/


    Nochmal alle Teile.


    Auf den Counter via Globale Variable habe ich verzichtet da ich das in einer for schleife eh mit Iterator mache (oder ist das mein Fehler? :D)


    Nochmal die Actor Funktion wo das PickUp generiert wird



    Wo es aufgesammelt wird



    Und der Funktionsaufruf


    C
    for(new g=0;g<sizeof(GlobalActors);g++)
    	{
    		CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,ActorPickups[g]);		
    		SetActorInvulnerable(g+1, true);
    	}

    Wenn ich alles richtig verstanden habe, muesste die Pickupid, beispielsweise bei der ersten Iteration bei g= 0 ActorPickups[0] uebergeben werden, und dann ActorPickups[0] = CreatePickup dann ausgefuehrt werden, oder?
    Oder kann man keiene Werte aus Arrays in einer Funktion uebergeben?




    Weitere Frage:


    Ich habe einen Command mit dem ein Spieler unsichtbar wird, und setze dann einen Timer von 60 Sekunden um ihn wieder sichtbar zu machen.
    Problem ist: Ueber einen Timer kann ich ja keine Parameter an die Funktion uebergeben, wie kriege ich das dann realisiert? Muss ich vielleicht mit dem & Symbol arbeiten? Weil irgendwie muss die Funktion ja wissen bei welchem Spieler die 60 Sekunden abgelaufen sind.


    Macht es ausserdem irgendwo sinn in PAWN volatile einzusetzen? Ich habe mal in meine Arrays testweise volatile reingepackt, sehe aber keinen Unterschied.
    Auch in der Dokumentation zu PAWN habe ich nix zu volatile gefunden, kenne das nur aus C daher weiss ich nicht was es in PAWN bringen sollte

  • Wie wäre es, wenn du das ein bisschen übersichtlicher gestaltest.


    Also, es würde funktionieren, wie Pr0x das gezeigt hat, aber nur unter der Vorraussetzung, dass du entweder ActorPickups oder MoneyPickups hast.
    Falls noch eine weitere Art Pickup hinzukommt, wird das als money interpretiert...


    Also hier mal ein kleines Beispiel wie man sowas aufbauen könnte:


    Nur so als Anregung bzw Idee, damit du es übersichtlicher hast ^^
    Musst halt auch schauen, dass du im Callback immer das Richtige Array verwendest, welches du unten angibst, da sich daran der Index anpasst :)


    //Edit:
    Parameter übergibst du mit SetTimerEx //Wiki Code buggt.lel


    volatile existiert in Pawn nicht, da das alles in einer VM ausgeführt wird und nicht direkt auf der Hardware.

    ast2ufdyxkb1.png


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

  • Wow klasse das funktioniert alles 1A :D jetzt funktioniert mein Gamemode endlich und ich kann endlich die neue Version veroeffentlichen :D
    Die enum Variante ist wirklich klasse!


    Mir ist jedoch aufgefallen, da mein Skript jetzt mit Makros vollgeballert wurde, bestimmt 600-700 Zeilen mit einem # inzwischen :D dauert das Compilen leider ziemlich lange!


    Noch ne Frage zu dem OnPlayerPickUpPickup


    Da wird ja letztendlich in dem Array gesucht wie ich das sehe, das kann ja bei 4000 MoneyPickups beispielsweise ziemlich lange dauern.
    Damit es keinen Ueberlauf an Pickups gibt (ueber 4096) habe ich die so definiert, ist das richtig?

    C
    new ActorPickups[sizeof(GlobalActors)];new MoneyPickups[MAX_PICKUPS-sizeof(GlobalActors)-1];


    Ist es eventuell weiterhin sinvoll oder moeglich, bei GetPickupType die binaere Suche anzuwenden? Zumindest hat sie ja eine geringere Laufzeit
    Habe da an sowas gedacht was ich mal aus nem C Buch entnommen, und umgebaut habe



    Habe mir eventuell folgendes gedacht



    //edit: vergiss meinen Code der ist mist :D

    Einmal editiert, zuletzt von Sub Royal ()

  • Wenn dein Hauptbestandteil aus money Pickups besteht, dann kannst du es smarter machen und brauchst diese gar nicht definieren.


    Dann sind die MoneyPickups alle INVALID_PICKUP_TYPE, das funktioniert solange du alle anderen definierst :)


    Dann suchst der nur in den anderen und wenn er es dort nicht findet, weiß er instant, dass es ein money pickup sein muss :)


    Eine Binäre Suche funktioniert leider nur mit geordneten Arrays. Also wenn sie sortiert wären, würde das gehen..sind sie aber hier leider nicht, da ja in der Mitte zum beispeil ein Pickup verschwinden könnte... :)


    //Edit:


    Zitat

    bestimmt 600-700 Zeilen mit einem # inzwischen


    Das sind aber ganz schön viele...da könntest du bestimmt etwas vereinfachen ^^

    ast2ufdyxkb1.png


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

  • Hallo Zusammen^^


    ich habe folgendes Problem,


    Mein Fraktionschat funktioniert nur in 1 Fraktion. Kann mir jemand sagen warum?


    ocmd:f(playerid,params[])
    {
    new string[128];
    if(IsPlayerInFraktion(playerid,0)) return 1;
    if(sscanf(params, "s[128]", string)) return SendClientMessage(playerid,FARBE_ROT," INFO: /f (Fraktionschat) [Nachricht]");
    new fID = sInfo[playerid][Fraktion];
    format(string,sizeof(string), "**((%s: %s ))**", getPlayerName(playerid),string);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))return 1;
    if(!IsPlayerInFraktion(i,fID))return 1;
    SendClientMessage(i, FARBE_FUNK, string);
    }
    return 1;
    }

  • Wie sieht denn IsPlayInFraktion aus?

  • Danke Kaliber: :D


    So jetzt kommt meine vielleicht fuer heute letzte Frage :D


    Ich werde tatsaechlich spaeter noch mehr Pickups hinzufuegen, deshalb habe ich das mit dem sortieren mal gemacht.


    Bei dem Array mit den Actors ist das kein Problem, da aendert sich ja nix dran, und es funktioniert auch


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

    Mal angenommen ich will das Array sortieren damit das mit der binaersuche klappt, wo muesste ich das Sortieren dann ausfuehren also wo im Code? :D
    Habe dazu eine super tolle HeapSort Funktion


  • Quicksort wäre schneller als Heapsort :P


    Und du müsstest genau dann das Array neu sortieren, wenn sich etwas ändert, also genau unter:


    MoneyPickups[index]=-1;

    ast2ufdyxkb1.png


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

  • Dann ist der letzte Eintrag ja nicht -1, sondern 3...

    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).

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

    Margarete Stokowski