Texte / RPG-TutorialRPG-TutorialEs wird dringendst empfohlen, verlinktes Doku-Material gründlich zu lesen! Eventuell auftretende Ähnlichkeiten zu existierenden Clonkern sind rein zufällig, nicht böse gemeint und rein zufällig, echt ehrlich! PS: Scriptauszüge sind absichtlich mit Notepad-Screenshots dargestellt! Ein GesprächspartnerZuallererst kopieren wir uns den Clonk in unser Szenario und löschen alles darin Befindliche außer ActMap, DefCore, Graphics, Overlay und Script. Dann ändern wir die ID des Clonks, z.B. "RPG1". Als nächstes öffnen wir Script.c und löschen den kompletten Script des Clonks. Stattdessen inkludieren wir den einfach. Brauchen wir vielleicht noch. Das müsste dann so aussehen: Als nächstes definieren wir in der DefCore Entrance, damit wir später per Springen mit dem Clonk reden können. Als Wert verwenden wir "Entrance=-8,-10,16,20", d.h. einfach die komplette Clonk-Fläche. Zurück zum Script. Wir benutzen die Funktion ActivateEntrance(), welche aufgerufen wird, wenn man vor dem Eingang Springen drückt. Für den Anfang geben wir mit Message() eine einfach Nachricht aus. Das könnte dann so aussehen: Danach starten wir unser Szen im Editor und ziehen uns unseren Clonk per Drag'n'Drop ins Spiel und sprechen ihn einfach mal an: Für den Anfang nicht schlecht, jedoch wollen wir richtige Dialoge und mehrere Auswahlmöglichkeiten haben. Deswegen: Der DialogDer Dialog - Basiswissen Einen Dialog macht man mithilfe eines Menüs. Darum lesen wir uns auch zuerst die Doku dazu durch. CreateMenu() und AddMenuItem() sowie CloseMenu(). So weit so gut. Allerdings ist das mit dem Dialog als Menü etwas kompliziert. Zunächst brauchen wir nämlich das Objekt, in das das Menü soll, also den Clonk. Zum Glück übergibt ActivateEntrance() als ersten Parameter das Objekt, das versucht dieses hier zu betreten. Also scripten wir erstmal: public func ActivateEntrance(object pClonk) Den Dialog öffnen Da der Clonk noch weiterhin versucht, dieses Objekt zu betreten, würde das Menü immer wieder geöffnet werden. Um das zu vermeiden geben wir unserem Clonk erstmal die Anweisung, damit aufzuhören: SetCommand(pClonk,""); Als nächstes öffnen wir ein Menü im Dialog-Stil. Dazu einfach ein normales Menü öffnen und bei int iStyle den Wert C4MN_Style_Dialog übergeben. Das sieht dann so aus: CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0); Den Dialog füllen Als erstes fügen wir einen leeren Eintrag mit einem Bild unseres Geschprächpartners ein. Das geht so: AddMenuItem("","",GetID(this()),pClonk,0,0,0); Als nächstes folgt der Text, den unser Gegenüber uns mitteilen will. Ein "" als zweiter Parameter sorgt immer dafür, dass der Eintrag nicht auswählbar ist. AddMenuItem("Hallo. Willst du einen Flint?","",0,pClonk,0,0,0); Wir wollen nun zwei Antwortmöglichkeiten geben. Nämlich einfach "Ja" oder "Nein". Doch bevor wir das tun, müssen wir die Funktionen schreiben, die durch die Einträge aufgerufen werden. Wir benutzen zwei Funktionen: Eine, die den Dialog einfach nur beendet, und eine, die dann eben die Aktion ausführt. Einen Dialog beenden Ein Menü wird allgemein durch CloseMenu() beendet. Wir schreiben nun eine Funktion, die den Dialog beendet: Die ID wird deswegen übergeben, weil ein Menü beim Auswählen eines Eintrags automatisch als ersten Parameter die ID übergibt, die bei AddMenuItem() als dritter Parameter angegeben wird. Ja, ich will Flint! Als nächstes folgt die Funktion, die dem Clonk den Flint übergibt. Wir nennen sie einfach mal GiveFlint(). Auch hier wird als erster Parameter wieder die ID übergeben, also schreiben wir: protected func GiveFlint(id ID, object pClonk) Der Rest ist recht einfach. Wir drücken dem Clonk einen Flint in die Hand und beenden den Dialog mit unserer zuvor gescripteten Funktion: Die Menüeinträge Danach fügen wir weiter oben noch die nötigen Menüeinträge ein: AddMenuItem("Ja!","GiveFlint",0,pClonk,0,pClonk,0); AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0); Und fertig! Der gesamte Script sollte dann so aussehen: Ingame sieht das dann so aus: Hat er auch einen Namen?Unser Gesprächspartner soll auch einen Namen und eine hübschere Farbe bekommen. Das machen wir bequem mit der Initialize()-Funktion. Damit der Clonk auch korrekt initialisiert wird und normal reagiert rufen wir danach die überladene Funktion mit return(_inherited()); auf. Wir scripten also: Das ganze sieht dann so aus: Bedingte GesprächsoptionenAuslagern Zuallererst lagern wir erstmal ein paar Sachen in andere Funktionen aus, um die ganze Sache übersichtlich zu halten. Wir scripten uns eine Funtkion, die das Menü öffnet, indem wir einfach den Script aus ActivateEntrance() ausschneiden. Ich nenne die Funktion einfach OpenTalk(pClonk): Den Rest wollen wir ja variabel machen. Also basteln wir uns erstmal eine Funktion Menu1(pClonk). Wir kopieren den restlichen Script da rein: Hat er schon einen Flint? Nun bauen wir uns erstmal eine zweite Funktion, die dem armen Clonk mitteilt, dass er schon einen Flint hat, und deswegen keinen mehr bekommt. Wir geben dabei nur die Antwortmöglichkeit "Tschüss": Der Rest ist wieder einfach. Wir nehmen unsere ActivateEntrance()-Funtkion vom Anfang und öffnen mit der zuvor gescripteten Funktion OpenTalk() einen Dialog. Dann überprüfen wir mit FindContents(), ob der Clonk schon einen Flint hat. Wenn ja, rufen wir unser zweites Menü auf, ansonsten das erste: Gesamtscript: Einmalige AktionenWir wollen nun, dass uns Günther einmal einen Superflint gibt. Aber eben nur einmal. Dazu bedarf es einer lokalen Variable und einer weiteren Menü-Funktion. Wir scripten also den Menüeintrag mit einer neuen Funktion Menu3(). Dazu brauchen wir aber auch eine neue Funktion, die dem Clonk einen Superflint gibt. Die nennen wir einfach GiveSuperFlint(). Dann definieren wir eine lokale Variable SFlint: Dann müssen wir in der Funktion GiveSuperFlint() diese Varaible auf 1 setzen, und im ActivateEntrance()-Script genau das überprüfen: Hier nochmal die GiveSuperFlint()-Funktion: HändlerEin Händler Zuerst brauchen wir einen Händler, also duplizieren wir einfach unseren Günther und ändern wieder die ID. Ein Menü Dann öffnen wir den Script und benennen Menu1() in Menu() um. Menu2() und Menu3() löschen wir. Wir geben einen Text ein, sowie die Auswahlmöglichkeiten "Einkaufen" und "Tschüss". Als Funktion für das Einkaufen geben wir statt GiveFlint() die Funktion BuyMenu an. Die scripten wir später noch. Wie? Das, was der Händler alles da hat, definieren wir über seinen Inhalt. Alles was er da drin hat, kann er auch verkaufen. Also brauchen wir eine Schleife, die zu jedem enthaltenen Objekt einen Menüeintrag macht. Das Kaufmenü Also, scripten wir die Funktion BuyMenu(id ID, object pCLonk). Zuerst einmal öffnen wir einen neuen Dialog, da der alte durch Auswählen eines Eintrags geschlossen wurde. Und zwar einfach mittels der Funktion OpenTalk(pClonk). Dann die Zähl-Variable definieren. Hier im Beispiel ist das i. Dann eine kleine while-Schleife, die pro Objekt einen Eintrag macht. Als Funktion beim Auswählen nehmen wir Buy. Für Script-Neulinge steht sie nochmal hier: while(Contents(i,0)) { AddMenuItem(Format("%s kaufen:%d",GetName(Contents(i,0)),GetValue(Contents(i,0))),"Buy",GetID(Contents(i,0)),pClonk,0,pClonk,0); i++; } Zum Schluss noch einen Eintrag, um die ganze Sache auch abbrechen zu können, ohne etwas zu kaufen. Die gesamte Funktion sieht dann so aus: Einkaufen! Jetzt brauchen wir noch eine Funktion, die dem Clonk sein Objekt gibt und ihm Geld klaut. Allerdings soll auch überprüft werden, ob der Clonk auch genug Geld hat. Also überprüfen wir das erstmal. Wenn ja, geben wir ihm sein Objekt, ziehen im Geld ab und spielen noch einen netten Sound ab. Andernfalls spielen wir einen bösen Sound ab und geben ihm nichts. Zum Schluss öffnen wir das Menü einfach wieder, falls der Clonk noch was kaufen will. Und fertig! Dann ist der Händler vorerst fertig. Wir geben ihm noch einen anderen Namen und probieren ihn aus. Verkaufen? Verkaufen geht genauso, bloß dass nicht der Inhalt des Händlers, sondern der des Clonks durchsucht werden muss. Das Objekt muss dann entfernt werden und dem Clonk Geld gegeben statt abgezogen werden. QuestsEin Aufgabensteller Zuerst brauchen wir jemanden, der uns diese Aufgabe stellt. Dafür duplizieren wir wieder Günther, ändern seine ID und nennen ihn "Matthes der Dorfchef". Eine globale Variable Wir öffenen/erstellen nun den Szenarioscript und definieren eine globale Vraiable namens Quest. Die benutzen wir, um wie beim Kapitel "Einmalige Aktionen" die Aufgabe nur einmal zu stellen und dann immer nachzufragen, ob sie schon erledigt wurde. Die Aufgabe Wir inszenieren also eine kleine Unterhaltung zwischen dem Clonk und Matthes, in dem Matthes ihm vom bösen Günther erzählt und ihn bittet, Günther totzumachen. Matthes übergibt uns dann einen Teraflint. Da wir das ja schon können, gehe ich jetzt nicht näher darauf ein. Da der Script: Hat er schon Ja gesagt? Wir brauchen noch eine Überprüfung in ActivateEntrance(), die feststellt, ob die Aufgabe schon gestellt wurde: Ok, ich machs. Als nächstes brauchen wir die Funktion AcceptGunther(id ID, object pClonk). In dieser wird dem Clonk der Teraflint übergeben und die globale Variable wird gesetzt. Dazu noch einen Sound und fertig: Ok, erledigt! Als nächstes ergänzen wir die Frage nach Erfüllung der Aufgabe um eine Abfrage, ob Günther noch lebt. Wenn nicht, gibt es einen zusätzlichen Eintrag, durch den man dann auch eine Belohnung bekommt: Belohnung Als nächstes dann eine Funktion, die uns dafür belohnt und die Quest-Variable auf 2 setzt: Danke! Wenn wir jetzt Matthes ansprechen, soll er uns nur noch "Danke sagen" und wir sollen nur noch "Tschüss" sagen können. Also scripten wir in ActivateEntrance() eine weitere Abfrage: Dann brauchen wir nurnoch die Menü-Funktion Menu5(). Aber sowas ist mitlerweile ja kein Problem mehr: Und fertig! Jetzt haben wir schon ein richtiges kleines Mini-RPG, indem man von Matthes den Auftrag bekommt, Günther zu töten, der einem auch noch kostenlos Flints gibt. Einen Händler, bei dem man sich Sachen kaufen kann gibt es auch. Ist doch garnicht mal so schlecht für den Anfang... Clonkbastler 27.03.2008 87 Kommentare |
@Veltago: Ersetze einfach das ">if(!GetAlive(FindObjekt(EFLN)))" durch ein "FindObject(...a)&&FindObject(...b)" mit den Parametern zum Finden eines Objekts mit einer gewissen Inhalts-ID von pClonk.
Und es bietet sich an, das Überprüfen des Questziels in das Dialogmenü zu setzen. Dann muss man sich nicht jedes Mal, wenn man eine Wompfbeere oder einen Stein kaufen möchte, den Questdialog anhören und umgekehrt.
Macht genau das:
Es sucht sich irgendeinen EFLN (also wohl Terraflint) auf der Karte und prüft ob dieser noch lebt oder schon tot ist. Also, ich meine, es würde genau das machen, hätte man FindObject richtig geschrieben. Also muss man da was ändern, ja.
Man kann Händler und Questgeber kombinieren, aber das wird vermutlich nicht durch simples zusammenkopieren klappen. Ob deine "Lösung" funktioniert weiß ich nicht. Ich kann das nicht so mal eben überschauen.
Edit:
Nach kürzerem ansehen kann ich sagen: Es geht nicht, man kann nicht einfach zusammenkopieren. Ich weiß nicht, inwiefern dir Funktionen ein Begriff sind, aber bei zwei Funktionen mit dem gleichen Namen wird eine überschrieben...
Zuletzt geändert: 16.10.2009 21:09
Ich hab da den Händler und Questgeber zusammengefügt damit im Menü steht
Ja!
Nein.
Kannst du mir einen Gefallen tun?
geht das?
Häh?
Fehlt Klammer zu.
Gibt bestimmt noch viel mehr; Semantik hab ich nicht beachtet. Wenn Clonk abstürzt ist das meistens nicht so schlimm und wenn du den Debug-Modus aktiviert hast, gibt es keine bessere Möglichkeit ein Script zu überprüfen, als es auszuführen...
Zuletzt geändert: 15.10.2009 17:44
Probiers doch aus. o_O
/*-- Bert --*/
#strict
#include CLNK
protected func Initialize() {
{
SetName("Bert");
SetColourDw(RGB(64,64,64));
}
public func ActivateEntrance(objekt pClonk)
{
OpenTalk(pClonk);
if(FindContens(AXE1,pClonk)) Menu3(pClonk);
else Menu(pClonk);
return(true);
}
/*------ Menüs ------*/
protected func Menu1(objekt pClonk)
{
AddMenuItem("Hallo. Brauchst du was?","",0,pClonk,0,0,0);
AddMenuItem("Kaufen",BuyMenu",0,pClonk,0,pClonk,0);
AddMenuItem("Nein.",EndTalk",0,pClonk,0,pClonk,0);
}
protected func BuyMenu(id ID, objekt pClonk)
{
OpenTalk(pClonk);
var i;
while(Contens(i,0))
{
AddMenuItem(Format("%s kaufen %d",GetName(Contens(i,0)),GetValue(Contens(i,0)),"Buy",GetID(Contens(i,0)),pClonk,0,pClonk,0);
i++;
}
/*--- Funktionen ---*/
protected func Buy(id ID, objekt pClonk)
{
if(GetWealth(GetOwner(pClonk))>=GetValue(0,ID))
{
CreateContens(ID,pClonk);
DoWealth(GetOwner(pClonk),-GetValue(0,ID));
Sound("Cash");
}
else
Sound("Error");
BuyMenu(0,pClonk);
}
/*--- Menüfunktionen ---*/
protected func EndTalk(id ID, objekt pClonk)
{
CloseMenu(pClonk);
}
protected func EndTalk(objekt pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}
/* ------ Quest ------*/
protected func Menu1(objekt pClonk)
{
AddMenuItem("Hallo, ich bin der Händler. Könntest du mir einen Gefallen tun?","",0,pClonk,0,0,0);
AddMenuItem("Kommt drauf an?","Menu2",0,pClonk,0,pClonk,0);
}
protected func Menu2(id ID, objekt pClonk)
{
OpenTalk(pClonk);
AddMenuItem("Bring mir eine Kältepflanze und eine Feuerpflanze.","",0,pClonk,0,0,0);
AddMenuItem("Wo kann ich den solche Pflanzen finden","Menu3",0,pClonk,0,pClonk,0,0,0);
}
protected func Menu3(id ID, objekt pClonk)
{
OpenTalk(pClonk);
AddMenuItem("Keine Ahnung... Such doch mal.","",0,pClonk,0,0,0);
AddMenuItem("Okay! Schon so gut wie erledigt!","AcceptFind",0,pClonk,0,pClonk,0);
AddMenuItem(Nene! Denkst du ich schlepp mich für deine dummen Pflanzen hier um die Welt?!","EndTalk",0,pClonk,0,pClonk,0);
}
public func ActivateEntrance(objekt pClonk)
{
OpenTalk(pClonk);
if(!Quest) Menu1(pClonk);
else(Menu4(pClonk));
return(true);
}
/* --- Funktionen ---*/
protected func AcceptFind(id ID, objekt pClonk)
{
CreateContents(AXE1,pClonk);
Sound("Connect");
Quest=1;
}
protected func Menu4(objekt pClonk)
{
OpenTalk(pClonk);
AddMenuItem("Hast du sie?","",0,pClonk,0,0,0);
AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0);
if(!GetAlive(FindObjekt(EFLN))) AddMenuItem("Ja!","Belohnung",0,pClonk,0,pClonk.0);
}
protected func Belohnung(id ID, objekt pClonk)
{
DoWealth(GetOwner(pClonk),200);
Sound("Cash");
OpenTalk(pClonk);
AddMenuItem("Danke! Hier!","",0,pClonk,0,pClonk,0);
AddMenuItem("Mögest du auf einem guten Pfad wandeln.","EndTalk",0,pClonk,0,pClonk,0);
}
public func ActivateEntrance(objekt pClonk)
{
OpenTalk(pClonk);
if(!Quest) Menu1(pClonk);
else if(Quest==1) Menu4(pClonk);
else if(Quest==2 Menu5(pClonk);
return(true);
}
protected func Menu5(objekt pClonk)
{
OpenTalk(pClonk);
AddMenuItem("DankeDanke...","",0,pClonk,0,0,0);
AddMenuItem("Tschüss!","EndTalk",0,pClonk,0,pClonk,0);
}
Umsetzung.: +3
Funktion:-1
Idee: +1
Umsetzung: +2
Nutzen: +1
D´oh! Hab jetz gemerkt worans liegt -.-
Zuletzt geändert: 17.08.2008 15:51
mfg Dragonclonk.
protected func BuyMenu(id ID, object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
while(Contents(i,0))
{
AddMenuItem(Format("%s kaufen:%d",GetName(Contents(i,0)),GetValue(Contents(i,0))),"Buy2",GetID(Contents(i,0)),pClonk,0,pClonk,0);
protected func Buy2(id ID, object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
if(GetWealth(GetOwner(pClonk))>=GetValue(0,ID))
{
CreateContents(ID,pClonk);
DoWealth(GetOwner(pClonk),-GetValue(0,ID));
Sound("UnCash")
}
else
Sound("CommandFailure1");
BuyMenu(0,pClonk);
}
i++;
}
AddMenuItem("Tüß, geh weiter","Gehen",0,pClonk,0,pClonk,0);
}
Und müsst ihr die Kommentare hier mit euren riesigen Scripten fluten? Das macht die Seite etwas unübersichtlich.
Zuletzt geändert: 26.04.2008 23:41
(Admin-snip)
Ok danke.
Zuletzt geändert: 27.04.2008 10:49
Wer mir des als erster macht gebe ich ihn 10 Clunker xD(Weiß net was ich mit denn Clunker machen soll xD)
du darfst nur texturen für ein material verwenden, wenn die kombination auch in der TexMap.txt definiert ist
Du hast da nach den if-Anweisungen in ActivateEntrance() ein paar geschweifte Klammern vergessen...
/*-- RPG Testclonk --*/
#strict
#include
public func ActivateEntrance(object pClonk)
{
opentalk(pClonk);
if(Equal(Local(1),0)) SetCommand(pClonk,""); Menu1(pClonk);
if(Equal(Local(1),1)) SetCommand(pClonk,""); Beleidigt(pClonk);
if(Equal(Local(1),2)) SetCommand(pClonk,""); Befreit(pClonk);
if(Equal(Local(1),3)) SetCommand(pClonk,""); Nein(pClonk);
return(true);
}
public func opentalk(object pClonk)
{
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}
protected func Initialize()
{
SetName("Fremder");
SetColorDw(RGB(130,100,70));
return(_inherited());
}
protected func Menu1(object pClonk)
{
AddMenuItem("Seid gegrüßt!","",0,pClonk,0,pClonk,0);
AddMenuItem("Guten Tag.","Aufruf01",0,pClonk,0,pClonk,0);
AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,pClonk,0);
}
protected func Aufruf01(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Was führt euch her?","",0,pClonk,0,pClonk,0);
AddMenuItem("Ich suche einen Job.","Aufruf02",0,pClonk,0,pClonk,0);
AddMenuItem("Nichts. Ich muss dann mal.","Gehen",0,pClonk,0,pClonk,0);
}
protected func Aufruf02(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Oh, da seid ihr bei mir genau richtig!","",0,pClonk,0,pClonk,0);
AddMenuItem("Wunderbar. Was kann ich tun?","Aufruf03",0,pClonk,0,pClonk,0);
}
protected func Aufruf03(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Mein Sohn wurde von den Räubern entführt. Könnt ihr ihn befreien?","",0,pClonk,0,pClonk,0);
AddMenuItem("Natürlich, das ist Ehrensache!","Aufruf04",0,pClonk,0,pClonk,0);
AddMenuItem("Ich hab besseres zu tun.","EndGehen",0,pClonk,0,pClonk,0);
}
protected func Aufruf04(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Oh, ich danke euch! Hier ist ein wenig Gold. Den Rest bekommt ihr hinterher.","",0,pClonk,0,pClonk,0);
AddMenuItem("Auf bald!","Gehen",0,pClonk,0,pClonk,0);
SetGlobal(1,1);
SetLocal(1,2);
}
protected func Befreit(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Habt ihr meinen Sohn schon befreit?","",0,pClonk,0,pClonk,0);
if(Equal(Global(1),2)) AddMenuItem("Er... Er ist tot...","Gerettet",0,pClonk,0,pClonk,0);
AddMenuItem("Nein, noch nicht...","Gehen",0,pClonk,0,pClonk,0);
}
protected func Beleidigt(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Ich will nicht mit euch sprechen!","",0,pClonk,0,pClonk,0);
AddMenuItem("Ok...","Gehen",0,pClonk,0,pClonk,0);
}
protected func Nein(id ID,object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("*schluchtz* :(","",0,pClonk,0,pClonk,0);
AddMenuItem("...","Gehen",0,pClonk,0,pClonk,0);
}
protected func Gehen(id ID,object pClonk)
{
CloseMenu(pClonk);
}
protected func Gerettet(id ID,object pClonk)
{
SetLocal(1,3);
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Naja... Trotzdem danke. :(","",0,pClonk,0,pClonk,0);
AddMenuItem("Tschüss!","Gehen",0,pClonk,0,pClonk,0);
}
protected func EndGehen(id ID,object pClonk)
{
SetLocal(1,1);
CloseMenu(pClonk);
opentalk(pClonk);
AddMenuItem("Wie kannst du nur?!","",0,pClonk,0,pClonk,0);
AddMenuItem("Tschüss!","Gehen",0,pClonk,0,pClonk,0);
}
Der Fehler liegt bei den Einträgen in Menu1(). Als vorletzter Parameter muss noch pClonk übergeben werden.
Zuletzt geändert: 07.04.2008 17:30
protected func Aufruf01(id ID,object pClonk)
{
opentalk(pClonk);
öffnest du ein neues Gespräch, du hast aber schon eins offen.
Die Gespräche überschreiben sich, es erscheint ein leeres Fenster, kein Error
Das ist der Script:
/*-- Fremder --*/
#strict
#include
public func ActivateEntrance(object pClonk)
{
opentalk(pClonk);
Menu1(pClonk);
return(true);
}
protected func opentalk(object pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}
protected func Initialize()
{
SetName("Fremder");
SetColorDw(RGB(130,100,70));
return(_inherited());
}
protected func Menu1(object pClonk)
{
AddMenuItem("Seid gegrüßt!","",0,pClonk,0,0,0);
AddMenuItem("Guten Tag.","Aufruf01",0,pClonk,0,0,0);
AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,0,0);
}
protected func Aufruf01(id ID,object pClonk)
{
opentalk(pClonk);
AddMenuItem("Was führt euch her?","",0,pClonk,0,pClonk,0);
AddMenuItem("Ich suche einen Job.","Aufruf02",0,pClonk,0,pClonk,0);
AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,pClonk,0);
}
protected func Gehen(id ID,object pClonk)
{
CloseMenu(pClonk);
}
Außerdem noch die Categroy in der DefCore auf C4D_Object ändern, damit der NPC nicht wegfliegt, wenn er von nem Stein getroffen wird...
War mir so schon lang genug ;)
Zuletzt geändert: 06.04.2008 09:46
wenn deine hier beschrieben clonks sterben kann man immernoch mit den Leichen reden :D
ich würde sie unverwundbar machen.. ist ja doof wenn ein händler stirbt, bzw wenn man bei einer leiche einkaufen muss
Alles geht nochmals danke aber keiner macht 2 Menu auf also am anfang da aber wenn Menu2 oder BuyMenu usw. machen will beendet er der das talk, kein error angezeigt.
das dürfte helfen
Ja!
Aber trotzdem ein Super Tutorial.
Hab's noch ein Bissle erweitert mit SetCommand des Talkers, das ist toll. ;)
Klein schreiben, ist ein Datentyp.
protected func OpenTalk(Object pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}
Stimmt was net C4Scripter 0.9.9 funzt net, schor früher probirt.
C4Scripter 0.9.9 (CC)
C4Scripter 0.71 (CCAN)
protected func Menu2(object pClonk)
{
AddMenuItem("Ich seh das eins hast...","",pClonk,0,0,0);
AddMenuItem("Tüß!","EndTalk",0,pClonk,0,pClonk,0);
}
protected func GiveFlint(id ID, object pClonk)
{
CreateContents(FLNT,pClonk);
EndTalk(0,pClonk);
}
protected func EndTalk(id ID, object pClonk)
{
CloseMenu(pClonk);
}
protected func OpenTalk(Object pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}
Aber mein fehler mit ;
by: OpenTalk(Gesil #107) (obj Richard #103) (Händler.c4d\Script.c:43)
by: ActivateEntrance(Gesil #107) (obj Richard #103) (Händler.c4d\Script.c:0)
Das ist es!!
Help.
Hir:
public func ActivateEntrance(object pClonk)
{
OpenTalk(pClonk)
if(FindContents(FLNT,pClonk)) Menu2(pClonk);
else Menu1(pClonk)
return(true);
}
protected func Menu1(object pClonk)
{
AddMenuItem("Hallo Wilst du einen Flint?","",0,pClonk,0,0,0);
AddMenuItem("Ja!","GiveFlint",0,pClonk,0,pClonk,0);
AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0);
return(true);
}
Zuletzt geändert: 30.03.2008 14:22
Hätt ichs mir nur durchgelesen...
Das liegt vermutlich daran das du die Verttices gelöscht hast. Kopiere einfach nochmal Defcore.txt vom orginal clonk rein und ändere die ID.
Theoretisch sollten NPC's das auch nicht tun. Günther allerdings schon. Ich ergänze das mal eben. Dankeschön.
Durch _inherited() wird eine "überladene" funktion aufgerufen, in dem fall das was im clonk script steht. (Nämlich SetAction("Walk"); )
Wäre gut wenn du das noch oben erklärst.
Niwoh ungleich Niveau.
Niwohlos!
Ja warum denn nicht? Nach else kann man auch einen ganzen Block schreiben, und so sparen wir noch zwei geschweifte Klammern... ;)
else lässt sich öfters schachteln?
"else if" <- Das haut mich jetzt um.
Zuletzt geändert: 28.03.2008 21:58
Ich habe zwar C4Scripter, benutzte ihn aber nie. Ich hab das ganze selbst zum ersten Mal gemacht und wollte vorher nicht die ganzen Optionen ändern und mich mit C4Scripter zurechtfinden zu müssen... Sry.
warum kann man texte nicht bevoten?
[+][+][+][+][+] wenns möglich wär