Beiträge von Goldkiller

    Ich versteh überhaupt nicht wieso du bei OnPlayerRequestClass auf die Daten im Cache zugreifen willst.
    Nicht mal ein Query zum auslesen hast du gezeigt. Selbst wenn es dazu ein Query gibt,wie kannst du sicher sein,dass das letzte Query zum Spieler gehört der OnPlayerRequestClass aufruft ?


    Du solltest das nochmal überdenken. Das wird bestimmt nicht funktionieren sobald du mehr als 1 Spieler bei einem Restart hast. Überhaupt würde ich bei OnPlayerRequestClass keine Daten vom MySQL Server verarbeiten. Das gehört an eine Andere Stelle.


    //Edit:
    Auch die Sache mit dem Restart Timer kann man besser machen. Wer garantiert denn,dass es 6 Sekunden dauert die ganzen Profile zu speichern. Es kann auch nur 1 Sekunden dauern oder sogar mehr als 6 Sekunden. Das wäre dann entweder verschwendete Zeit oder nicht genug Zeit.
    Daher würde ich empfehlen,keinen Timer zu verwenden sondern ein pseudo query an den SQL Server senden wie z.B. "SELECT 1" NACH den Querys zum Speichern der Profile.
    Das dann mit mysql_tquery ( o.Ä. ) an ein Callback senden lassen und sobald es verarbeitet wurde weiss ich, dass alles SQL Kommandos ausgeführt wurden.
    Heißt also so:
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(!IsPlayerConnected(i)) continue;
    Speichern(i);
    }
    mysql_tquery(handle,"SELECT 1","",""); // tquery sagt mir nichts, da wird man aber bestimmt ein Callback angeben können oder eben OnQueryFinish verwenden.

    Zitat

    Zum Bitshiften - ist schon bewusst so, hab immer gedacht doppelt würde die Sache sicherer machen(hatte ich glaub irgendwo aus nem MrMonat TuT) - habs schon normal mit einem versucht ">" versucht, Folge: Fehlermeldung in Pawno, mit zwei war der Fehler weg?!


    Ne, Bitshiften macht was ganz anderes.
    X > Y ist etwas völlig anderes als X >> Y.
    Es sollte schon ein einfaches Größer/Kleiner/Gleich sein.
    Der Fehler kommt vllt weil du neben > noch ein = benutzt hast und es auf der falschen Seite war.


    Zitat

    Was ändert "SetTimerEx"? Funkt doch mit "SetTimer".


    Ich sehe zwar die Funktion "Fahrschule" nicht,allerdings glaube ich nicht,dass du diese Funktion global arbeiten lässt ohne zusätzliche Parameter.



    Zitat

    Zu den Checkpoints, mit denen hab ich eigentlich keinerlei Probleme & FSCPa wird auch nicht als 0 oder 1 erkannt, sondern tut schön was es soll & gibt den jeweiligen GameText aus & setzt FS1[playerid] auf den nächsten Wert. FS1 wird in "OnPlayerLeaveCheckpoint" sauber ausgelesen & der richtige CP wird gesetzt.
    Das ganze Fahrschulsystem hat - ohne den Countdown/Zeitlimit - optimal funktioniert, nur bekomm ich den verflixten Countdown nicht richtig eingebunden.


    Dann probier es mal mit einem zusätzlichem Spieler aus.Das kann dann schon mal gar nicht funktionieren. Dein Textdraw via MyTextDraw4 funktioniert auch nur solange es nur 1 Spieler gibt der gleichzeitig die Fahrschule macht.
    Das hier alles zu erklären würde den Rahmen sprengen, eine gute Methode ( Zumindest für die Checkpoints ) findest du wie gesagt in dem Tutorial.


    Zitat

    Nur das Problem, dass er schneller abläuft mit jedem CP den man durchfährt ist noch da. Meinst du deine Version CPs abzufahren ändert da was?


    Ich denke ja. Außerdem zeigt es wie man eine Serie von Checkpoints leicht abarbeiten lässt. Dein Code ist mMn viel zu umständlich und nicht gut lesbar.
    Mmn müsste sich der Code bei dir ständig überschneiden an dieser Stelle:
    if(IsPlayerInCheckpoint(playerid)==FSCPa[0])//<<<<<<<<<<<<<<
    {
    GameTextForPlayer(playerid,"~g~START~n~~r~Schaden am Wagen gibt Abzug~n~~y~3 Minuten Zeit",3000,3);
    FS1[playerid] = 2;//Checkpointvariable eins hoch
    Pruefung(playerid);//Countdown starten
    //In "OnPlayerLeaveCheckpoint(playerid)" wird der nächste CP erstellt
    }

    Denn diese Abfrage wird nach dem 1 Checkpoint auch immer wahr sein. Mein Vorschlag nochmal, schau dir das Tutorial an ;).


    Zu deinem neuem Quellcode:
    countdownFS unter Pruefung zu deklarieren ist nicht so klever. Denn es wird ständig mit dem Wert 180 gearbeitet und du zählst praktisch nie runter. Du solltest den Wert für die Restzeit an die Funktion Pruefung als Parameter weitergeben.
    Du brauchst auch den Timer nie unter CountItDown ablegen, da du sowieso repeat ausgeschaltet hast.Hier wieder das gleiche: Es funktioniert nur für 1 Spieler.

    Du machst es dir viel zu kompliziert, in dem du die Restzeit immer in Sekunde und Minuten aufteilst .


    Lass es doch bei Sekunden, die kann man einfach umwandeln. Wenn es noch 100 Sekunden sind,dann sind noch 1 Minuten und 40 Sekunden Restzeit.
    Rechnung zum Aufteilen ist doch ganz einfach.


    restzeit = 100;
    minuten = restzeit / 60;
    sekunden = restzeit % 60;
    minuten wäre 1, sekunden 40.


    // Edit:
    Da Code scheint noch viel mehr Fehler zu enthalten.
    Wieso rufst du ständig MyTextDraw4 auf ?


    else if(countdown1 >> 1 && countdown2 >> 1)
    Bitshiften, wirklich ?! Du meinst bestimmt > , nicht >>.
    SetTimer("Fahrschule",15,false);//Fahrzeug respawnen
    Eventuell SetTimerEx ?


    if(IsPlayerInCheckpoint(playerid)==FSCPa[1])
    IsPlayerInCheckpoint gibt nur 0 oder 1 zurück. Das kannst du gar nicht mit irgendeinem Checkpoint vergleichen.


    FSCPa[6] = SetPlayerCheckpoint(playerid,-2066.9626,-262.5959,35.3274,3.0);//p6
    Das ist auch Quatsch. SetPlayerCheckpoint gibt dir keinen Wert zurück, mit dem du etwas anfangen kannst.
    Du solltest eher in FSCPa einfach den Wert 6 schreiben, sofern er beim 6 Checkpoint ist.
    Für die Checkpoints empfehle ich dir daher mein Tutorial:
    [ SCRIPTING ] Checkpoints abfahren


    //Edit^X: Da sind bestimmt noch mehr Dinge, die nicht ganz richtig sind. Fang lieber nochmal neu an.

    So wird das nichts. Du solltest die Zeile 15198 mal markieren. Woher sollen wir denn sonst wissen, welche der 10 Zeilen den Fehler verursacht.


    Ich tippe aber mal auf diese Zeile:
    new namestring = strfind(pName, "_", true);
    Falls es Zeile 15198 ist, dann ließ nochmal die Fehlermeldung:

    Zitat

    argument type mismatch (argument 1)


    Heißt also,mit dem 1. Argument ( pName ) stimmt etwas nicht. Wo hast du überhaupt pName her ? Du solltest doch zumindest die Variable deklarieren und den Spielername ( GetPlayerName ) dort ablegen.

    Wieso leitest du überhaupt aus der ID den Namen ab,um diesen dann in eine Tabelle einzutragen ?
    Über ein ordentliches Select kannst du auch über die ID auf den Namen schließen. Hat auch was mit Normalisierungeiner Datenbank zu tun.


    Zitat

    Man kann klar und deutlich erkennen, das meine Tabelle die cih angeben habe messages heisst und da steht xxx.message existiert net?


    Auf dem Screenshot sieht man aber,dass die Tabelle messages heißt ( ohne s ).
    Das xxx ist auch nicht gerade unwichtig.

    Du musst es nur richtig lesen.
    Es kann doch gar nicht Stimmen,dass wenn du in der nähe des Punktes gibst du es verarbeistest mit "Du bist nicht in der nähe des Punktes".



    Wenn du wirklich ein Beispiel brauchst:
    new bla = 5;
    if( bla == 5 ) print("bla ist nicht 5");
    else print("bla ist 5")

    An deinem schlechten Coding-Stil.
    Bei der Anordnung kein wunder,dass du den Fehler nicht siehst.


    if(strcmp("/zoll1",cmdtext,true)==0)
    {
    if(IsPlayerInRangeOfPoint(playerid,3.0,47.2275390625, -1527.6552734375, 5.0373840332031)) return SendClientMessage(playerid,ROT,"Du bist nicht an Schranke 1");
    else // Du kannst dir hier wirklich ein else vorstellen. Zwar nicht wirklich korrekt,aber ok.
    {
    MoveSchranke(schranke1);
    }
    Schaut man sich den Code nochmal an:
    Ist man in der nähe des Punktes, dann kommt "Du bist nicht an Schranke 1".
    Tritt die o.g. Bedingung nicht ein, öffnet die Schranke.


    //Edit:
    Als Hinweis:
    new bla;
    {
    bla = 5;
    }
    Man kann { } machen ohne if etc.

    Ist nicht richtig.



    Der Code in der Schleife passt nicht ganz.
    Denn wenn der Spieler mit der ID 1 in der nähe des Tores ist, wird es geöffnet.
    Ist der Spieler mit der ID 2 nicht in der nähe des Tore,wird es wieder geschlossen. Völlig egal was "davor" passierte.


    Du solltest einfach prüfen ob 1 Spieler ( egal welcher ) in der nähe des Tores ist und dann öffnen. Ist kein Spieler ( egal welcher ) in der nähe des Tores,kannst du es schließen. Ob es auf oder zu ist solltest du sowieso in einer Variable festhalten.

    Selbst mit den Dateien kannst du auf den ersten Blick nichts anfangen, denn die müsstest du erstmal in ein lesbares Format umwandeln.
    http://gta.wikia.com/Paths_%28GTA_SA%29
    Ist auch relativ einfach,da der o.g. Link das Format aufweist.


    Leider find ich gerade nicht mehr das PAWN Script, mit dem ich mir mal die Paths ausgelesen habe und in ein sehr einfaches Format habe ausgeben lassen :S .

    Der Name ist schlecht gewählt und die Funktion ist nicht vollständig.


    So wie ich das sehe,benutzt du Sachen() um einen Index ( bei dir id genannt ) zu finden der wohl noch nicht belegt ist.
    new str[128], id=Sachen();
    new autohaus=aInfo[id][Autohaus], cpreis =aInfo[id][Preis];
    Allerdings kann die Funktion Sachen() bei dir nur 0 oder 1 zurückgeben. Allerdings ist 0 auch ein gültiger Index und diesen erhälst du,wenn die Funktion Sachen() keinen leeren Platz findet.
    Ist die Suche erfolgreich erhälst du immer den Wert 1 als Index, aber nicht den tatsächlichen Index bei dem ein leerer Platz gefunden wurde.
    Heißt:
    Du müsstest lediglich die return Werte abändern und dir überlegen, wie du den ungültigen Index abfängst.