NPC OnPlayerText vs OnClientMessage

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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 Tag,


    ich möchte mein NPC ansprechen können und er soll eine Funktion ausführen wenn er etwas bestimmtes hört.


    Wenn ich es nun über OnClientMessage versuche, funktioniert es. Über OnPlayerText jedoch nicht.
    Warum funktionert es über OnPlayerText nicht? Es ist mir wichtg es über OnPlayerText zu machen, weil ich die playerid vom Spieler benötige.


    Code
    public OnClientMessage(color, text[])
    {
        SendChat("test"); //funktioniert
    }
    public OnPlayerText(playerid, text[])
    {
        SendChat("test"); //funktioniert nicht
    }

    Ich hab schon überall gegoogelt wo man nur googlen kann und finde nichts zu diesem Thema.


    Ich hoffe sehr, ihr könnt mir dabei helfen.


    Viele Grüße
    Gimbo

  • Warum machst du es nicht so wie im Beispiel von Wiki ?



    public OnPlayerText(playerid, text[])
    {
    if (strfind(text, "Hallo Bot") != -1)
    {
    new string[80], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "Hallo %s! Wie geht es dir?!", name); //Hier packst du die Funktion rein die passieren soll wenn Spieler X Hallo Bot sagt.
    SendChat(string);
    }
    return 1;
    }


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Warum funktionert es über OnPlayerText nicht?

    Scheint als wird das Callback gar nicht aufgerufen.
    Prüfe mal, ob du in allen Filterscripts und Gamemodes, sowie NPC Files, in denen OnPlayerText vorkommt, am Ende des OnPlayerText-Callbacks ein return 1; stehen hast. Falls es fehlt, oder dort ein return 0; steht, füge es hinzu bzw. ändere es zu return 1; ab.

  • Ich hatte davor das Beispiel aus der Wiki genutzt, er ging jedoch nicht. Deshalb hab ich versucht beim Aufruf der Funktion bereits ein einfaches "test" vom Bot ausgeben zu lassen um zu kommen ob das überhaupt funktioniert...


    Das ist der Code für mein Bot:


    Wenn ich "test" schreibe, funktioniert die Funktion "OnClientMessage" ordnungsgemäß und gibt mir auch "test" aus.
    Wenn ich nun "Hallo Bot" schreibe, geschieht nichts.



    Hier mal mein OnPlayerText vom Gamemode, hab das Gefühl es könnte was damit zu tun haben:

    Code
    public OnPlayerText(playerid, text[])
    {
        new ssname[MAX_PLAYER_NAME];
    	GetPlayerName(playerid,ssname,sizeof(ssname));
     	new sstring[128];
    	format(sstring, sizeof(sstring), "%s(%d) sagt: %s",ssname,playerid,text); 
    	SMessage(playerid,0xFFFFFFFF, sstring,20);
    	return 0;
    }


    Viele Grüße
    Gimbo

  • Ach natürlich. Wenn nichts returnt wird, kann auch nichts abgefragt werden :D
    Da wäre ich bestimmt auch noch drauf gekommen, nach 2-3 Stunden.


    Vielen Dank fürs Augen öffnen :)


    Viele Grüße
    Gimbo


    //edit: Es klang logisch, funktioniert jedoch immer noch nicht.
    Komischerweise wird jetzt der Text den ich geschrieben habe 2 mal ausgegeben. Also einmal der normale und einmal die "SMessage".

    Einmal editiert, zuletzt von Gimbo ()

  • Danke für deine weitere Antwort!


    Die Nachricht wird leider nicht vom NPC gesendet. Das ist ja das was ich erreichen möchte :D


    Es hat sich nichts verändert, nur dass jetzt wegen dem return 1 in der "OnPlayerText" funktion meines GameMods die eigentliche "Standardnachricht" ausgegeben wird, wenn ein Spieler auf dem Server etwas schreibt (also die, die für alle lesbar ist). Desweiteren wird meine formatierte Nachricht ausgegeben (%s sagt %s), also 2 Mal der selben Text.


    Das Callback wird nach wie vor noch nicht von dem NPC erkannt :/

  • Bei mir funktioniert es:
    public OnPlayerText(playerid, text[])
    {
    if(strfind(text, "test") == -1) SendChat("test"); //Die Abfrage nur, damit der Bot sich nicht selbst erkennt und spammt.
    return 1;
    }



    Versuche es gegebenenfalls mal auf einem leeren Server.

  • Hey!


    Hab es auf einem leeren Server versucht, dort hat es funktioniert und deswegen habe ich die Unterschiede zwischen meinem Gamemode und einem leeren neuen Server unter die Lupe genommen.


    Ein leerer Server hat die Funktion OnPlayerText gar nicht aufgelistet weshalb ich meine Funktion auch direkt ausgeklammert habe.
    Den selben Bot, wie auf dem neuen Server 1:1 übernommen und getestet - keine Wirkung. Funktionierte immer noch nicht.


    Ich habe mich gefragt, was meinen Server mit einem normalen unterscheidet und habe bei OnGameModeInit nachgeforscht.
    Habe nun gemerkt das ich den LimitGlobalChatRadius auf 0 gesetzt hatte (ich kannte die Funktion damals nicht und war so dumm und hatte sie auf 0 gesetzt, war 12 Jahre alt als ich diesen Server angefangen habe). Direkt ausgeklammert und siehe da, es funktioniert!


    Ich möchte das mit OnPlayerText ja nur anstatt OnClientMessage verwenden, weil ich noch bestimmte Bedingungen setzen möchte, bevor der Bot darauf reagiert. Beinahe hätte ich einfach nur über diese Bedingungen die Nachrichtenfarbe so verändert, dass ich die bei der Funktion "OnClientMessage" abfragen könnte. Es wäre mehr Arbeit gewesen und auch ziemlich scheiße meiner Meinung nach. Gut das ich am Ball geblieben bin und weiter nach dem Fehler gesucht habe.


    Ich bedanke mich herzlich bei dir für deine Geduld.
    Und JustMe, dir ebenfalls für die Hilfe jetzt und in dem anderen Beitrag.


    Ohne euch hätte ich es wahrscheinlich schon aufgegeben weil ich endlich mal mein Botsystem fertig machen möchte anstatt den ganzen Tag an einem Fehler rumzustochern. Deshalb vielen Dank!



    Viele Grüße
    Gimbo

  • Habe nun gemerkt das ich den LimitGlobalChatRadius auf 0 gesetzt hatte[...]. Direkt ausgeklammert und siehe da, es funktioniert!

    Super!
    Deine Vorgehensweise war perfekt so, genau so findet man solche doch recht unerklärlichen Fehler, zumindest wie sie auf den ersten Blick scheinen.
    Vielen Dank für die Beschreibung zur Lösungsfindung sowie die Lösung, wenn mal wieder jemand dieses Problem hat, dann hilft dies sicher sehr!