Bot einstellen

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
  • Guten Abend Breadfish-Community,


    ich benötige etwas Hilfe bezüglich der NPC-Bots.
    ( es ist etwas lange her das ich wieder mit NPC'S arbeite, da ich bisjetzt nur Actors genommen habe )


    Und zwar möchte ich, dass wenn man in ein Fahrzeug einsteigt ( Callback: OnPlayerEnterVehicle ) geprüft wird ob er die erlaubnis hat,
    wenn ja soll ein NPC als Beifahrer sitzen.


    NPC habe ich aufgenommen, die Aufnahme ist auf dem Fahrzeug.
    Folgendes habe ich versucht:

    //Edit
    Versuch Nr. 2


    if (IsASpecialCar(vehicleid) && !ispassenger)
    {
    new vID = GetPlayerVehicleID(playerid);
    ConnectNPC("MotorradBeifahrer", "MotorradBeifahrer");
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, botname, sizeof(botname));
    if(!strcmp(botname, "MotorradBeifahrer", true))
    {
    SetPlayerSkin(playerid, 1);
    PutPlayerInVehicle(playerid, vID, 1);
    }
    }



    // ---- //



    Das Problem ist, der Bot Connected wenn der einsteigt (so möchte ich es auch haben) auf das Fahrzeug aaber er setzt sich nicht als Beifahrer sondern steht am Neulingsspawn...
    Meine Vermutung ist das die Abfrage if(!strcmp(npcname, "MotorradBeifahrer", true)) nicht richtig funktioniert, denn der Bot hat auch den falschen Skin.


    Ich habe vordefinierte Fahrzeuge:
    (kurzer ausschnitt)


    Code
    TestVeh[6] = AddStaticVehicleEx(522,2025.7620, -1920.7080, 13.0423, 23.2178,1,1 ,-1); //NRG-500
        TestVeh[7] = AddStaticVehicleEx(522,2023.2120, -1920.7080, 13.0423, 23.2178,1,1 ,-1); //NRG-500

    in diese Fahrzeuge soll der Bot jenachdem wo der Player sitzt als Beifahrer sitzen.



    Hoffe mir kann jemand weiterhelfen...


    Vielen Dank im vorraus :)

  • Der Connected nicht instant...


    und

    • new npcname[MAX_PLAYER_NAME];
    • GetPlayerName(playerid, npcname, sizeof(npcname));
    • if(!strcmp(npcname, "MotorradBeifahrer", true))

    Damit prüfst du ob playerid (und das ist der Spieler selbst in dem Fall) diesen Namen hat...was Quatsch ist...


    Für NPCs musst du noch paar extra Dinge machen, zum einen schauen, dass er nicht in deine Dialog Abfragen stolpert von wegen Passwort...etc


    und dann unter OnPlayerSpawn prüfe ob es ein NPC ist und ob er diesen Namen hat und setze ihn dann in das Auto :)


    Normalerweise sollte dies funktionieren :)

    ast2ufdyxkb1.png


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

  • ah okey vielen Dank für die Antworten :)
    Stimmt @Kaliber, habe die Reihenfolge falsch gemacht...


    Eine Frage habe ich, muss ich für den Bot einen Account erstellen, sprich ihn in die Datenbank einsetzen?
    Weil habe gerade die Abfrage gemacht, wenn das ein NPC ist soll er Spawnen und Login/Registerdialog überspringen.
    Der steht aber immernoch beim Spawn... Er will einfach nicht als Beifahrer sitzen...



    Muss ich die Aufnahme auf dem Fahrzeug machen oder wenn er steht?
    Weil momentan habe ich die .rec Datei aufgenommen, wo er auf einem Motorrad hinten sitzt...

  • Setzt du den NPC bei OnPlayerSpawn in das Fahrzeug?

    Ja habe ich, allerdings möchte ich ihn als Beifahrer sitzten haben...


    Ich glaube das Thema ist erledigt, denn ich wollte wenn ein Spieler die Fahrschulprüfung macht, dass dann ein Bot als beifahrer sitzt.
    Dass das aber nicht geht und das nächste Problem auftritt wenn z.B. 2 Leute Fahrprüfung gleichtzeitig machen kann der Bot sich ja nicht einfach verdoppeln.
    Da ich da keine andere Lösung gefunden habe bzw denke ich, es ist nicht machbar, habe diesen Thread als erledigt markiert.



    Sollte es doch möglich sein, wäre ich sehr froh wenn mir jmd kurz erläutern könnte wie...

  • kann der Bot sich ja nicht einfach verdoppeln.

    Was spricht dagegen, einen weiteren Bot zu connecten, der die selbe Aufgabe übernimmt und halt anderes heißt ?

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

    Margarete Stokowski

  • Was spricht dagegen, einen weiteren Bot zu connecten, der die selbe Aufgabe übernimmt und halt anderes heißt ?

    Da hast du recht :whistling:


    Nur ich bekomme den Bot einfach nicht als Beifahrer gesetzt...
    Habe auch Testbefehle eingebaut um zu prüfen ob ich die Seat-ID richtig gesetzt habe...
    Das Problem ist, der Bot spawnt aber im CJ Skin ( nimmt nicht die andere Skin-ID an ) und steht am Zivispawn und nicht als Beifahrer.
    Der Bot soll nur connecten, wenn der Spieler die Prüfung macht, das klappt ja bis jetzt nur das er nicht als Beifahrer sitzt und nicht den Skin ändert...

  • Der Bot soll nur connecten, wenn der Spieler die Prüfung macht, das klappt ja bis jetzt nur das er nicht als Beifahrer sitzt und nicht den Skin ändert...

    Das deutet darauf hin, dass deine Abfrage unter OnPlayerSpawn falsch ist...

    ast2ufdyxkb1.png


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

  • hmmm...


    Aktueller Code:


    new vFahrschulMotorrad;


    (unter OnPlayerSpawn:(

    Code
    if(IsPlayerNPC(playerid))
    {
    	new botname[MAX_PLAYER_NAME];
      	GetPlayerName(playerid, botname, sizeof(botname));
       	if(!strcmp(botname, "MotorradBeifahrer", true))
       	{
    		SetPlayerSkin(playerid, 1);
         		PutPlayerInVehicle(playerid, vFahrschulMotorrad, 1 /* '1' als Beifahrer */);
       	}
    }




    (unter OnPlayerEnterVehicle:(

    Code
    if (IsAFahrschulCar(vehicleid) && !ispassenger)
    {
        if(TakingLesson[playerid] == 1)
        {
    		ConnectNPC("MotorradBeifahrer", "[BOT]MotorradBeifahrer");
            vFahrschulMotorrad = GetVehicleModel(vehicleid);
    	}
    }



    Sehe aber keinen Fehler bei OnPlayerSpawn...

  • Den Code von OnPlayerEnterVehicle solltest du nach OnPlayerStateChange mit PLAYER_STATE_DRIVER packen, sonst kommt es zu Fehlern, wenn der Spieler mehrmals "Einsteigen" drückt, bzw. sich beim Einsteigen bewegt und nicht einsteigt.


    Ändere dann außerdem:
    vFahrschulMotorrad = GetVehicleModel(vehicleid);
    zu:
    vFahrschulMotorrad = GetPlayerVehicleID(playerid);

  • aaaah jetzt kommen wir schon näher :)


    Also der Bot connected (klappte ja vorher auch) und der Spawnt dann über dem Motorrad, will aber nicht als Beifahrer sitzen...
    Und der Skin des Bots wird beim Spawnen nicht gesetzt ....


    Vermute mal bei PutPlayerInVehicle liegt ein Fehler mit der Seat-ID, wobei ich per Befehl mir printen gelassen habe was für eine ID ist wenn ich als Beifahrer sitze.
    Dementsprechend habe ich das beim Bot auch eingetragen, will aber nicht sitzten....

  • Füge den Code-Teil von OnPlayerSpawn zusätzlich bei OnVehicleStreamIn ein, nach der Prüfung ob vehicleid die vFahrschulMotorrad ist


    Meinst du das so?



    Oder noch eine Schleife einbauen welche alle Spieler durchgeht?


    //Edit:
    Habe es ebenfalls mit der Schleife versucht:

    spawnt jetzt direkt über mir, aber er sitzt immernoch nicht als Beifahrer und Skin wurde nicht geändert...




    //Edit2:


    Habe jetzt paar Tests durchgeführt, es ist egal welche Seat-ID ich angebe der Bot spawnt immer entweder im Fahrzeug oder über dem Fahrzeug.
    Hier mal ein Screen, habe es jetzt mit einem Sultan getestet da bei nem Motorrad der Bot darüber spawnt...

    Ich vermute der Fehler liegt hier:

    Code
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, botname, sizeof(botname));
    if(!strcmp(botname, "MotorradBeifahrer", true))
    {
    	SetPlayerSkin(playerid, 50);
       	PutPlayerInVehicle(playerid, vFahrschulMotorrad, 0);
    }

    ( bei der Abfrage if(!strcmp(botname, "MotorradBeifahrer", true)) ... )

  • So war es gemeint:
    public OnVehicleStreamIn(vehicleid, forplayerid)
    {
    if(vehicleid == vFahrschulMotorrad)
    {
    if(IsPlayerNPC(forplayerid))
    {
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(forplayerid, botname, sizeof(botname));
    if(!strcmp(botname, "MotorradBeifahrer", true))
    {
    SetPlayerSkin(forplayerid, 1);
    PutPlayerInVehicle(forplayerid, vFahrschulMotorrad, 1);
    }
    }
    }
    return 1;
    }

  • ja, bzw was heißt aufgenommen?


    Als ich ihn Aufgenommen habe, habe ich mich als Beifarer gesetzt und Aufnahme gestartet und gestoppt.
    Oder muss ich den Bot als Fahrer Aufnehmen?
    Wenn ja, dann habe ich das falsch gemacht, dachte das den Bot als Fahrer nur dann Aufnehmen wenn der fahren soll ^^

  • Das dürfte passen.
    Versuche es mal über einen Timer zu umgehen:
    public OnVehicleStreamIn(vehicleid, forplayerid)
    {
    if(vehicleid == vFahrschulMotorrad)
    {
    if(IsPlayerNPC(forplayerid))
    {
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(forplayerid, botname, sizeof(botname));
    if(!strcmp(botname, "MotorradBeifahrer", true))
    {
    SetPlayerSkin(forplayerid, 1);
    PutPlayerInVehicle(forplayerid, vFahrschulMotorrad, 1);
    SetTimerEx("PutInVeh", 5000, false, "ddd", forplayerid, vFahrschulMotorrad, 1);
    }
    }
    }
    return 1;
    }


    forward PutInVeh(playerid, vehicleid, seatid);
    public PutInVeh(playerid, vehicleid, seatid)
    {
    printf("Put %d in vehicle %d and seat %d.", playerid, vehicleid, seatid);
    return PutPlayerInVehicle(playerid, vehicleid, seatid);
    }


    Was gibt der Print eventuell aus?

  • Er printet mir folgendes aus:


    Es besteht jetzt aber ein problem undzwar jetzt stürtzt der Server ab, bzw nichts geht mehr wenn der Bot jetzt verbunden ist...
    Warum stürtzt jetzt der Server ab?

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