[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
  • Heyho


    Ich hab da son kleinen "Warning" eigentlich sind warnings ja nichts schlimmes, nur sieht es dennoch hässlich aus bei einem Selfmade :D


    Code
    ...selfmade.pwn(349) : warning 213: tag mismatch
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    
    
    
    1 Warning.



    Mein Stock dazu:


    Code
    stock isCarAnAhCar(vID){
    	for(new i = 0; i < sizeof(ahCars); i++){
    	    if(ahCars[i][id_x] == vID){
    		    return true;
    		}else{
    		    return false;
    		}
    	}
    	return 0;
    }

    Ich hoffe ihr habt eine idee 8| ich komme irgendwie immer durcheinander wann nun ein Stock und wann ein Callback genutzt werden sollte.


    MfG
    XonarZ


    //EDIT also ich musste statt if(isCarAnAhCar(vID) == false) ... einfach if(!isCarAnAhCar(vID)){ } machen und nun ist der warning weg :D

  • Noch zur Info:
    Der Grund für die Warnung war, dass du ein boolean (false) mit einem Integer (was dir die Funktion zurück gibt) verglichen hast. Da passt der Tag (bool: und keiner) nicht überein, daher die Warnung.


    Warnungen können zwar ignoriert werden, sprich der Code wird trotzdem kompiliert, sollten aber nicht ignoriert werden, da es trotzdem zu Fehlern kommen kann. Daher immer alle Warnungen beheben.



    Ein Callback nutzt du, wenn du die Funktion über einen Timer oder über mysql_pquery beispielsweise aufrufst. Einen stock (simple Funktion), wenn du diesen nur über direkte Code Zugriffe (also kein Timer, etc) aufrufst. Insofern hast du alles richtig gemacht.

  • Um es noch zu erwähnen, lösche das else aus der Schleife, das ist falsch, da es dann bei dem Ersten falschen Ergebnis false returnt.


    #Handy

    ast2ufdyxkb1.png


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

  • Aus irgendeinen Bug gurnd wie immer bei pawn will er es nicht setzten



    new pID,str[144];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,COLOR_GREY, "Benutze /bcpd playerid");
    PlayerTextDrawShow(pID,bcpdcard[pID][0]);
    PlayerTextDrawShow(pID,bcpdcard[pID][1]);
    PlayerTextDrawShow(pID,bcpdcard[pID][2]);
    PlayerTextDrawShow(pID,bcpdcard[pID][3]);
    format(str, sizeof(str), "%s", GetName(playerid));
    PlayerTextDrawSetString(pID,bcpdcard[1][pID], str);
    format(str, sizeof(str), "%s", GetName(playerid));
    PlayerTextDrawSetString(pID,bcpdcard[2][pID], str);
    format(str, sizeof(str), "%d.%d.%d", SpielerInfo[playerid][pDay],SpielerInfo[playerid][pMonth],SpielerInfo[playerid][pJahr]);
    PlayerTextDrawSetString(pID,bcpdcard[3][pID], str);


    doch alles bleibt gleich... -.-

  • habe ich jetzt geht der ganze befehl nicht mehr
    debug] Run time error 4: "Array index out of bounds"
    [debug] Attempted to read/write array element at index 29 in array of size 4
    [debug] AMX backtrace:
    [debug] #0 0048f480 in public ocmd_kacke(29, 8477560) in script.amx
    [debug] #1 native CallLocalFunction () in samp-server.exe
    [debug] #2 00006444 in public OnPlayerCommandText (29, 8477492) in

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Aktivier mal -d3, compile das Script neu und versuch dann den Fehler zu reproduzieren.
    Dann zeigt er die genaue Zeile an, in der, der Fehler gefunden wurde.


    Brauchst du garnicht;
    PlayerTextDrawSetString(pID,bcpdcard[2][pID], str);
    Hier ist jedesmal die playerid und der Index vertauscht.

  • wenn du mir sagst wie -d3 geht ^^
    aber ich habe mal max_players raus genommen teste grade neu


    //edit
    gelöst new:PlayerText:bcpdcard[MAX_PLAYERS][4];
    ich habe einfach max_players gelöscht und überall die 2te playerid raus so das es nur
    PlayerTextDrawSetString(pID,bcpdcard[2], str);

  • Nein.


    Beispiel:
    Spieler A bekommt das Textdraw angezeigt, das Textdraw hat die ID 0, weil es das erste ist.
    Die Variable hat den Wert 0.


    Spieler B bekommt das Textdraw irgendwann später auch erstellt und angezeigt, hat zuvor aber ein anderes Textdraw erstellt bekommen, dann hat sein Textdraw die ID 1. Die Variable damit auch.


    Wenn du jetzt für Spieler A das Textdraw löschst, dann wird für Spieler A das Textdraw 1 gelöscht, sprich ein falsches.



    Deine Variante funktioniert nur solange, wie du nicht mehr auf das Textdraw zugreifen willst, oder solange, alle Spieler das Textdraw mit der gleichen ID haben (Zufall).

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