PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : waldhoppsers Fragenthread



waldhoppser
29.10.2009, 17:28
Hey,
wenn ich probiere auf hero.attribute[ATR_HITPOINTS] zuzugreifen,
(Variable = hero.attribute[ATR_HITPOINTS];)
zeigt mir zSpy nachdem Parsen den Fehler "Unknown Identifier ATTRIBUTE" an. Was hab ich falsch gemacht?

HolyWater
29.10.2009, 17:37
mit attributen hab ich lange nix zutun gehabt, aber kann es sein dass es hero.attributes heisst?

Marthog
29.10.2009, 17:37
(Variable = hero.attribute[ATR_HITPOINTS];)


Du hast die Klammer falsch gesetzt. Es muss so heißen:

Variable = hero.attribute[ATR_HITPOINTS];

@ HolyWater: Nö

Milky-Way
29.10.2009, 17:38
Poste bitte mal einen etwas größeren Skriptausschnitt

waldhoppser
29.10.2009, 18:08
func void Liferegeneration ()
{
var int AttributeI = hero.attribute[ATR_STRENGTH];
hero.attribute[ATR_STRENGTH] = AttributeI +2
};

Liferegeneration ist in einem Trigger angegeben.
Unter events abgespeichert.
@ Marthog: hab ich ja auchgeschrieben, aber das ; und ) wurde zu einem Smiley verwandelt.


edit: übrigens Gothic 2

Oparilames
29.10.2009, 18:23
Versuch mal die:

func void Liferegeneration ()
{
var int AttributeI;
AttributeI = hero.attribute[ATR_STRENGTH];
hero.attribute[ATR_STRENGTH] = AttributeI +2;
};
Oder einfacher:

func void Liferegeneration ()
{
hero.attribute[ATR_STRENGTH] +=2;
};
Wobei ich mir unsicher bin ob es +=2; oder =+2; heißen muss.
In C++ wäre es aber +=2;

Übrigens erhöhst du da die Stärke nicht die Lebensenergie ;)

Werden die Events auch nach NPC_Default.d und Classes.d und nach den NPCs geparst?

waldhoppser
29.10.2009, 19:20
Versuch mal die:

func void Liferegeneration ()
{
var int AttributeI;
AttributeI = hero.attribute[ATR_STRENGTH];
hero.attribute[ATR_STRENGTH] = AttributeI +2;
};
Oder einfacher:

func void Liferegeneration ()
{
hero.attribute[ATR_STRENGTH] +=2;
};
Wobei ich mir unsicher bin ob es +=2; oder =+2; heißen muss.
In C++ wäre es aber +=2;

Übrigens erhöhst du da die Stärke nicht die Lebensenergie ;)

Werden die Events auch nach NPC_Default.d und Classes.d und nach den NPCs geparst?

Das geht komischer weise o,O. (es ist auch +=).
nachdem Npc's und NPC_Default.d auf jeden Fall, Classes.d konnte ich auf jeden Fall nicht im ZSpy finden.
Und wo lag jetzt der Fehler?

Oparilames
29.10.2009, 19:25
Also es kann sein, dass ich mich jetzt zum Gespött der Scripter mache, aber es dürfte an dieser Zeile liegen:
var int AttributeI = hero.attribute[ATR_STRENGTH];

Du deklarierst und definierst gleichzeitig. Das macht man eigentlich nur bei constanzen. Das ist aber eine Variable die man eigentlich so anlegt:
var int AttributeI; AttributeI = hero.attribute[ATR_STRENGTH];

Außerdem hat in deinem Code nach
hero.attribute[ATR_STRENGTH] = AttributeI +2 das Semikolon gefehlt.

Lehona
29.10.2009, 19:25
var int AttributeI = xxx;

Das funktioniert so nicht. Man kann nur Konstanten direkt einen Startwert zuweisen. (Integer-) Variablen werden mit 0 initialisiert und man muss sie mit ihrem Startinhalt danach befüllen.

HolyWater
29.10.2009, 21:11
was mich grad interessiert:
funktioniert in daedalus

var int i;
i++;

Lehona
29.10.2009, 21:41
was mich grad interessiert:
funktioniert in daedalus

var int i;
i++;

Ich behaupte jetzt mal, dass es nicht funktioniert und den Syntax-Error ausspuckt, weil ich es afaik schonmal probiert habe. Aber evtl. habe ich auch einfach bloß an die Frage gedacht.

Kurzer
29.10.2009, 22:32
Ich behaupte jetzt mal, dass es nicht funktioniert und den Syntax-Error ausspuckt, weil ich es afaik schonmal probiert habe. Aber evtl. habe ich auch einfach bloß an die Frage gedacht.

Korrekt, es funktioniert nicht. Ich habe es auch bereit mal ausprobiert. ;) Mir wäre es eh irgendwo mal aufgefallen, wenn die PBs etwas derartiges benutzt hätten ;)

waldhoppser
30.10.2009, 22:18
So neues Problem:
Ich wollte, dass, nachdem ein Mover aktiviert wurde, eine Funktion aufgerufen wird.
Ich habe also einen Mover gebastelt und dazu einen Schalter (oCMobSwitch) und dann in "onStateFunc" des Schalters eine Funktion angegeben, die aber wird nicht aufgerufen.
(Es wird also keine Fehlermeldung angezeigt, es passiert einfach nichts [ausser die Moverbewegung])
Jetzt die Frage:
Wie kann ich die/eine Funktion aufrufen, wenn ich den/einen Schalter betätigt habe?

Zaphod Beeblebrox
30.10.2009, 22:40
So neues Problem:
Ich wollte, dass, nachdem ein Mover aktiviert wurde, eine Funktion aufgerufen wird.
Ich habe also einen Mover gebastelt und dazu einen Schalter (oCMobSwitch) und dann in "onStateFunc" des Schalters eine Funktion angegeben, die aber wird nicht aufgerufen.
(Es wird also keine Fehlermeldung angezeigt, es passiert einfach nichts [ausser die Moverbewegung])
Jetzt die Frage:
Wie kann ich die/eine Funktion aufrufen, wenn ich den/einen Schalter betätigt habe?

Du hast alles richtig gemacht. Die Funktion welche du unter onStateFunc eingetragen hast wird normalerweise aufgerufen. Du musst die Funktion Spacerer groß schreiben im Script ist es egal. Bei Schaltern muss die Funktion allerdings am ende ein S1 beinhalten. Ich mache mal ein Beispiel.

im Spacerer : onStateFunc : MEINSCRIPT_01
im Script : func void MEINSCRIPT_01_S1 ()

dann sollte es gehen. Das Script muss natürlich geparst werden.

waldhoppser
31.10.2009, 10:09
Genau, da war ja was...
:gratz

Kann ich mit einen Switch (mit einer?) mehrere Mover bewegen,
bzw. sich selbst weg bewegen?

HolyWater
31.10.2009, 10:19
Genau, da war ja was...
:gratz

Kann ich mit einen Switch (mit einer?) mehrere Mover bewegen,
bzw. sich selbst weg bewegen?

ich glaub dazu musst du ein zCMoverControler benutzen (glaube so heisst der)

waldhoppser
31.10.2009, 11:51
ich glaub dazu musst du ein zCMoverControler benutzen (glaube so heisst der)

Und wie stellt man ein, dass der Switch bewegt wird?

Oparilames
31.10.2009, 13:13
Mit Wld_SendTrigger ("VOBNAME"); kann man einzelne Mover und Trigger starten (mit einem weiteren davon wird das Vob entweder zurückgesetzt oder nochmal getriggert).
Du kannst auch eine Fuktion angeben, die mehrere Mover/Trigger startet.
func void test()
{
wld_sendtrigger("MEINVOB1");
wld_sendtrigger("MEINVOB2");
wld_sendtrigger("MEINVOB3");
wld_sendtrigger("MEINSCHALTER");
};

waldhoppser
31.10.2009, 13:16
Mit Wld_SendTrigger ("VOBNAME"); kann man einzelne Mover und Trigger starten (mit einem weiteren davon wird das Vob entweder zurückgesetzt oder nochmal getriggert).
Du kannst auch eine Fuktion angeben, die mehrere Mover/Trigger startet.
func void test()
{
wld_sendtrigger("MEINVOB1");
wld_sendtrigger("MEINVOB2");
wld_sendtrigger("MEINVOB3");
wld_sendtrigger("MEINSCHALTER");
};

Wäre es auch möglich den Schalter verschwinden zulassen?
(bzw. Abzufragen ob der Trigger benutzt wurde)

Milky-Way
31.10.2009, 13:40
Du könntest den Schalter wiederum an einen Mover hängen und in den Boden ziehen.

waldhoppser
31.10.2009, 14:24
Du könntest den Schalter wiederum an einen Mover hängen und in den Boden ziehen.

per Vobtree oder wie?

Dalai Zoll
31.10.2009, 14:58
Du brauchst dazu ein Mover Fake.

Schritt 1
Setze ein Vob ... ich nehme dazu immer die "Bürste" als Mover

Schritt 2
Setze den Switch als Child of Bürste
Das geht , wenn du irgend einen Switch den du im Spacer hast kopierst Strg+C den Hilfsmover (Bürste) anklickst und jetzt mit Strg+V den Schalter einfügst. Nicht vergessen alles im kopierten Switch zu löschen ...Vob Name ...TriggerTarget .....on state func... sonst löst der noch unerwünschte Dinge aus an anderer stelle.

Schritt 3
Den Schalter in Position bringen, er bewegt sich unabhängig vom Hilfsmover (Bürste)

Schritt 4
Wenn der Schalter in Position ist, dem Mover den 1. KeyFrame geben.

Schritt 5
Jetzt den Hilfsmover wegfahren, dabei den Schalter beobachten, den der Mover jetzt wegzieht (aus der Mesh) und dem Mover den 2. KeyFrame geben.

Schritt 6
Mover Apply

Schritt 7
Mover ShowVisual auf False stellen
Mover Apply

Schritt8
cdStatic auf false
cdDyn auf false
Static Vob auf false
Mover Apply

Schritt 9
Der Switch sollte ebenfalls ohne Kollision eingefügt werden, da er sonst beim wegfahren mit einem NPC kollidieren könnte oder dem Hero oder sonst einem Teil, das Kollision hat. Wenn das passiert, dann läuft der Mover weiter und der Switch bleibt hängen und dann stimmt der Einsetzpunkt des Switches nicht mehr.

Jetzt sollte das funktionieren.

waldhoppser
31.10.2009, 16:04
Jap tut es auch, Danke schön!:gratz

waldhoppser
10.11.2009, 18:59
Neues Problem:

func void STARTUP_NEWWORLD_KISTE()
{
Wld_InsertNpc (PAL_1010_TIM, "FP_STAND_TIM_01");
};

func void INIT_SUB_STARTUP_NEWWORLD_KISTE ()
{
};



func void INIT_STARTUP_NEWWORLD_KISTE()
{
B_InitMonsterAttitudes ();
B_InitGuildAttitudes();
B_InitNpcGlobals ();
INIT_SUB_STARTUP_NEWWORLD_KISTE ();
};

Fehlermeldung ist nicht vorhanden, "Tim" wird einfach nicht gespawnt.
NEWWORLD_KISTE(.zen) heißt meine Welt (im Ordner NewWorlds),
und "FP_STAND_TIM_01" ist auch vorhanden..
wo liegt der Fehler?

Wolfy
10.11.2009, 19:19
Hast du die Startup in die Gothic.src eingetragen?

Lehona
10.11.2009, 19:27
Zeig mal bitte den TA von Tim...

waldhoppser
10.11.2009, 19:31
Hast du die Startup in die Gothic.src eingetragen?
Heist die Zen wirklich NEWWORLD_KISTE.ZEN?

1. ist die normale nicht schon vorher eingespeichtert?
2. Ja.



@ Lehona
Tim:


FUNC VOID Rtn_Start_1010 ()
{
TA_Stand_WP (08,00,22,00,"FP_STAND_TIM_01");
TA_Stand_WP (22,00,08,00,"FP_STAND_TIM_01");
};

edit: gecodet

Lehona
10.11.2009, 19:39
Ich gehe davon aus, dass der FP nicht ans Waynet angeschlossen ist. Gib also einen WP an (Es heißt ja auch nicht umsonst TA_Stand_WP).

waldhoppser
10.11.2009, 19:45
Hm... und damit kommt die richtige Lösung mal wieder von Lehona :gratz .
Ist das nur bei TA_Stand_WP der Fall, oder muss ich immer einen WP angeben?

Lehona
10.11.2009, 20:01
Hm... und damit kommt die richtige Lösung mal wieder von Lehona :gratz .
Ist das nur bei TA_Stand_WP der Fall, oder muss ich immer einen WP angeben?

Bei allen TAs einen WP angeben, die entsprechenden FPs (Wenn der Ta denn welche verlangt) sucht sich der NPC dann selber.

waldhoppser
02.01.2010, 19:16
N'abend,
Ich habe mir in meiner Welt einen Trigger erstellt ("PETER"),
ihn meine Funktion aufrufen lassen ("scriptFunc: B_DIST"),
die wiederum eigentlich das Spiel crashen sollte:


func int B_DIST_S0 ()
{
const int I = 1;
const int O = 0;
I/O;
// Wld_SendTrigger ("PETER");
};

(habs auch schon mit dem Printbefehl versucht)

Der Trigger wird in der Startup getriggert (in der Welteigenen Startup), sowie, um sicherzugehen, in einem Dialog.


Im Spiel allerdings wird weder der Printbefehl noch ein shutdown ausgeführt.
Wisst ihr weiter?
mfg

Sumpfkrautjunkie
02.01.2010, 19:46
Schreibe mal den Funktionsnamen bei scriptFunc komplett in Großbuchstaben:
B_DIST_S0

waldhoppser
02.01.2010, 19:56
Schreibe mal den Funktionsnamen bei scriptFunc komplett in Großbuchstaben:
B_DIST_S0

Ha, super es klappt :D
Nebenfrage: muss _S0(1) denn nicht normalerweise weggelassen werden?
(PS: Ich hatte mich übrigens verschrieben, ich habe da wohl "B_DIST" stehen)

waldhoppser
17.01.2010, 19:52
So eine neue Frage: Und zwar soll ein NPC ein Objekt angreifen (keinen anderen Npc). Wie kann ich das am besten lösen?
Könnte ich einfach einen NPC erstellen, der genauso aussieht wie das Objekt, bloß sich nicht bewegt?


Edit: Falls jmd die Suchfunktion benutzt^^:
Ich habs mit einem unsichtbaren NPC (Suchender-Robe Texturen durch Alpha-Texturen ersetzt), der vor einem Objekt steht. Ein Trigger fragt ab, ob er Tod ist und movt dann das Objekt weg, bzw. lässt das neue erscheinen.

waldhoppser
31.01.2010, 22:59
sry, für den 3xPost.
Zum neuesten Problem:
Ich möchte die Leben eines NPCs oben an den Bildschirm anzeigen lassen.
1. Wie finde ich die X|Y-Koordinaten raus, -> gibt es eine bessere Lösung, als sooft probieren bis es klappt?
2. Das Ep-Balkentutorial im Wiki ist etwas schwer zu verstehen, könnte mir das jmd, evtl, erklären?
mfg

Milky-Way
01.02.2010, 13:15
sry, für den 3xPost.
Zum neuesten Problem:
Ich möchte die Leben eines NPCs oben an den Bildschirm anzeigen lassen.
1. Wie finde ich die X|Y-Koordinaten raus, -> gibt es eine bessere Lösung, als sooft probieren bis es klappt?
2. Das Ep-Balkentutorial im Wiki ist etwas schwer zu verstehen, könnte mir das jmd, evtl, erklären?
mfg
1) Bei PrintScreen gibst Du es in Prozent an. 0,0 ist links oben, 100,100 recht unten. Generell solltest Du Prints immer unter verschiedenen Auflösungen testen.

2) Ja. Wo hast Du Schwierigkeiten?

waldhoppser
01.02.2010, 18:39
1.Wofür steht das Time beim nachfolgenden Code

PrintScreen ( s1, x,y,"font_g2.tga",time);

bzw. ist es überhaupt notwendig?
2. Woher weiß Gothic was ich aus der Font-datei haben will?
3. Wofür steht die DialogNummer (S1)?
4. Muss ich jedes Stück des Balkens einzeln anzeigen lassen?

Marthog
01.02.2010, 18:51
1. time ist die dauer, wie lange es dort stehen soll (bei Triggerschleife nicht länger als 1 oder 2 Sekunden).
2. Das wird durch den text definiert. Gothic sucht aus der Textur die richtigen Buchstabenstellen raus.

4. Ja, der Balken besteht aus veränderten Buchstaben und deswegen ist jeder Abschnitt ein eigener Buchstabe.

Milky-Way
01.02.2010, 19:16
1.Wofür steht das Time beim nachfolgenden
PrintScreen ( s1, x,y,"font_g2.tga",time);
bzw. ist es überhaupt notwendig?
Es ist, wie Marthog schon gesagt hat, die Zeit, die es angezeigt bleibt. Und ja, es ist notwendig. Wenn eine Funktion einen Parameter verlangt, muss der auch angegeben werden, sonst kommt eine Fehlermeldung beim Parsen.


2. Woher weiß Gothic was ich aus der Font-datei haben will?
Du musst ja die Buchstaben angeben, die geschrieben werden sollen. In der entsprechenden .FNT Datei (im _compiled Ordner) steht, wo dieser Buchstabe zu finden ist.


3. Wofür steht die DialogNummer (S1)?
Das ist etwas ungewöhnlich beschrieben. Mit DialogNummer ist der String gemeint, der angezeigt wird. Also zum Beispiel:

PrintScreen ("Blöde Beschreibung!", 50,50, FONT_Screen, 1);
Damit wird dann für 1 Sekunde der Text Blöde Beschreibung mittig in der Schriftart FONT_Screen angezeigt.


4. Muss ich jedes Stück des Balkens einzeln anzeigen lassen?
Ich glaube, Du hast noch nicht ganz verstanden, wie es funktioniert. Im Fall von Lebenspunkten wird die Leiste als x voneinander unabhängige Teile dargestellt. Für jeden Teil wird dann einzeln geguckt, ob die Leiste bis dorthin voll sein sollte, oder nicht.
Das Problem ist, dass die einzelnen Buchstaben nur begrenzt groß sein dürfen. Deshalb kann man die Leiste nicht als ganzes anzeigen, sondern muss sie zerlegen.

waldhoppser
01.02.2010, 20:14
Es ist, wie Marthog schon gesagt hat, die Zeit, die es angezeigt bleibt. Und ja, es ist notwendig. Wenn eine Funktion einen Parameter verlangt, muss der auch angegeben werden, sonst kommt eine Fehlermeldung beim Parsen.


Du musst ja die Buchstaben angeben, die geschrieben werden sollen. In der entsprechenden .FNT Datei (im _compiled Ordner) steht, wo dieser Buchstabe zu finden ist.


Das ist etwas ungewöhnlich beschrieben. Mit DialogNummer ist der String gemeint, der angezeigt wird. Also zum Beispiel:

PrintScreen ("Blöde Beschreibung!", 50,50, FONT_Screen, 1);
Damit wird dann für 1 Sekunde der Text Blöde Beschreibung mittig in der Schriftart FONT_Screen angezeigt.


Ich glaube, Du hast noch nicht ganz verstanden, wie es funktioniert. Im Fall von Lebenspunkten wird die Leiste als x voneinander unabhängige Teile dargestellt. Für jeden Teil wird dann einzeln geguckt, ob die Leiste bis dorthin voll sein sollte, oder nicht.
Das Problem ist, dass die einzelnen Buchstaben nur begrenzt groß sein dürfen. Deshalb kann man die Leiste nicht als ganzes anzeigen, sondern muss sie zerlegen.

also muss ich "Befehlen":
"Hat der Spaten so und so viele Leben"
{ So und soviele Stücke Aktivieren};?

Milky-Way
01.02.2010, 20:20
Soll das jetzt schon irgendwelche Code-Ähnlichkeit besitzen? So geht es nämlich nicht.

Der Print-Befehl lautet:

//weglassen Dein Text in " " Position (in %) Schriftart Dauer
func VOID PrintScreen (var INT dialogNr, VAR STRING msg, VAR INT posx, VAR INT posy, VAR STRING font, VAR INT timeSec) { };

Falls es noch nicht klappt, sagst Du uns am Besten einfach, was Du vorhast. Vermutlich können wir Dir dann ganz schnell das gewünschte Skript produzieren, bzw. Dir dabei soweit helfen, dass Du es selbst schaffst.

waldhoppser
01.02.2010, 20:31
Ich möchte die Leben eines NPCs oben an den Bildschirm anzeigen lassen.



Frage nebenbei: Womit öffne ich .Fnt-Dateien?

Rantragon
01.02.2010, 20:45
Frage nebenbei: Womit öffne ich .Fnt-Dateien?

Warum willst du eine Font-Datei öffnen?

Ich glaube das geht mit Gimp, wenn nicht, dann damit: http://fnt.extensionfile.net/de

waldhoppser
01.02.2010, 20:50
Warum willst du eine Font-Datei öffnen?

Ich glaube das geht mit Gimp, wenn nicht, dann damit: http://fnt.extensionfile.net/de

Deswegen ->
Du musst ja die Buchstaben angeben, die geschrieben werden sollen. In der entsprechenden .FNT Datei (im _compiled Ordner) steht, wo dieser Buchstabe zu finden ist.

Milky-Way
01.02.2010, 21:24
Halte Dich doch einfach ans Tutorial. Was da nicht drin steht, brauchst Du auch nicht machen. ;) Wenn Du etwas anderes angezeigt bekommen möchtest, musst Du nur den Schriftsatz, also die .tga Datei verändern und ggf. andere "Buchstaben" anzeigen lassen.

waldhoppser
01.02.2010, 21:55
Halte Dich doch einfach ans Tutorial. Was da nicht drin steht, brauchst Du auch nicht machen. ;) Wenn Du etwas anderes angezeigt bekommen möchtest, musst Du nur den Schriftsatz, also die .tga Datei verändern und ggf. andere "Buchstaben" anzeigen lassen.

aber wie krieg ich die anderen Buchstaben raus?
edit: ich hätte in Deutsch aufpassen sollen...
edit²: Schon gut... Jetzt versteh ich diesen "Trick"

waldhoppser
02.02.2010, 20:57
FUNC VOID Lifebar (VAR INT x, VAR INT y, VAR INT time, VAR STRING s1, VAR STRING s2, VAR STRING s3, VAR STRING s4, VAR STRING s5, VAR STRING s6, VAR STRING s7, VAR STRING s8, VAR STRING s9, VAR STRING s10, VAR STRING s11, VAR STRING s12, VAR STRING s13, VAR STRING s14, VAR STRING s15, VAR STRING s16, VAR STRING s17, VAR STRING s18, VAR STRING s19, VAR STRING s20, VAR STRING s21)
{
PrintScreen ( s1, x,y,"font_g2.tga",time);
PrintScreen ( s2, x+1,y,"font_g2.tga",time);
PrintScreen ( s3, x+2,y,"font_g2.tga",time);
PrintScreen ( s4, x+3,y,"font_g2.tga",time);
PrintScreen ( s5, x+4,y,"font_g2.tga",time);
PrintScreen ( s6, x+5,y,"font_g2.tga",time);
PrintScreen ( s7, x+6,y,"font_g2.tga",time);
PrintScreen ( s8, x+7,y,"font_g2.tga",time);
PrintScreen ( s9, x+8,y,"font_g2.tga",time);
PrintScreen (s10, x+9,y,"font_g2.tga",time);
PrintScreen (s11, x+10,y,"font_g2.tga",time);
PrintScreen (s12, x+11,y,"font_g2.tga",time);
PrintScreen (s13, x+12,y,"font_g2.tga",time);
PrintScreen (s14, x+13,y,"font_g2.tga",time);
PrintScreen (s15, x+14,y,"font_g2.tga",time);
PrintScreen (s16, x+15,y,"font_g2.tga",time);
PrintScreen (s17, x+16,y,"font_g2.tga",time);
PrintScreen (s18, x+17,y,"font_g2.tga",time);
PrintScreen (s19, x+18,y,"font_g2.tga",time);
PrintScreen (s20, x+19,y,"font_g2.tga",time);
PrintScreen (s21, x+20,y,"font_g2.tga",time);
};



func void LEBENSBALKEN_S0()
{


// Print ("lol");
if hero.attribute[ATR_HITPOINTS] >= 100 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "n");};
if hero.attribute[ATR_HITPOINTS] >= 95 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 90 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 85 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 80 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 75 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 70 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 65 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 60 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 55 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 50 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 45 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 40 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 35 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 30 { Lifebar (50,50,1, "J", ".", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 25 { Lifebar (50,50, 1, "J", ".", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 20 { Lifebar (50,50, 1, "J", ".", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 15 { Lifebar (50,50, 1, "J", ".", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 10 { Lifebar (50,50, 1, "J", ".", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};
if hero.attribute[ATR_HITPOINTS] >= 5 { Lifebar (50,50, 1, "J", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "i", "n");};


// PrintScreen ( ".", 50,50,"font_g2.tga",1);

Wld_SendTrigger ("PETER");
};
So folgendes Problem: Funktion wird aufgerufen, aber kein Balken erstellt
(Bewiesen durch eine Printprobe).
die .tga ist auch im _compiled-Ordner als .tey vorhanden.
Was mach ich falsch?

Milky-Way
02.02.2010, 21:10
Erstmal etwas allgemeines:
Dir ist schon klar, dass Du momentan die absoluten Werte des aktuellen Lebens abfragst, oder? Es wäre vermutlich geschickter, Leben * 100 / Leben_max zu rechnen, damit es in Prozent ist.

Zu Deinem Problem:
Bau mal einen Print in eine einzelne IF-Abfrage ein, die auch erfüllt ist.

waldhoppser
03.02.2010, 06:44
hm stimmt... Aber es ist sowieso ja erst im Alphastadium.
zwar nicht in einer Abfrage, aber der Befehl ist ja schließlich derselbe.

// PrintScreen ( ".", 50,50,"font_g2.tga",1);

Es funktioniert aber nicht.
Edit: Um blöden Fragen zuvor zu kommen: Ja, ich habe es auch auskommentiert, aber da es nichts gebracht hat, muss der Fehler ja woanders liegen und hab es wieder auskommentiert

Milky-Way
03.02.2010, 12:57
Also wie jetzt:
Wird die Funktion aufgerufen oder nicht?
Schreib mal in die Lifebar Funktion:
Print ("Test1");
und in Lebensbalken_S0
Print ("Test2");
und beobachte, was passiert.

Überprüfe die Angaben beim Trigger im Spacer.

waldhoppser
03.02.2010, 13:07
Beide Funktionen werden aufgerufen. (heißt "Test1" erscheint nur, da es "Test2" annulliert, ein weiterer Test, in dem Test1 fehlt, ergibt, dass "Test2" geprintet wird.)

Milky-Way
03.02.2010, 13:55
Dann guck bitte mal, ob von Deiner Textur eine -C.TEX im _compiled Ordner liegt.

waldhoppser
03.02.2010, 14:42
Dann guck bitte mal, ob von Deiner Textur eine -C.TEX im _compiled Ordner liegt.

positiv. Da liegt sie.

Milky-Way
03.02.2010, 15:14
Gibt es dort auch eine .FNT Datei gleichen Namens?

waldhoppser
04.02.2010, 12:01
Auch sie
hm als ich eine neue Font gemacht habe gings.
Wahrscheinlich hab ich den einen Namen groß und in dem Script klein, oder andersrum, geschrieben.
Ich danke euch trotzdem herzlich^^
mfg

waldhoppser
23.02.2010, 13:47
Moinmoin,
Ich will in einer Welt ein Haus hinzufügen, dafür habe ich die .3ds in Blender importiert. Die Textur wurde allerdings nicht übernommen.
Es wäre schade, wenn es in das Haus rein regnete, und ebenso wenn ich alles nochmal texturieren müsste, hätte vielleicht jemand von euch eine Idee, wie man das umgehen kann?
mfg waldhoppser

Simon
23.02.2010, 15:00
(ohne den thread durchgelesen zu haben)

Hast du den Kerrax Im-/Exporter? (http://krximpexp.sourceforge.net/)
Mit dem sollte es eigentlich gehen...

waldhoppser
23.02.2010, 17:43
(ohne den thread durchgelesen zu haben)

Hast du den Kerrax Im-/Exporter? (http://krximpexp.sourceforge.net/)
Mit dem sollte es eigentlich gehen...

Mit dem wird mir alles Pink (es könnte sogar 255|0|255 sein) angezeigt. Was mach ich falsch?

waldhoppser
10.05.2010, 19:51
(oberes Problem noch aktuell; sry für den Doppelpost)
Moin, ich möchte das mein Npc sich nicht von Pfeilen, die auf ihn geschossen werden, ablenken lässt, wie könnte ich das am besten tun?
Edit: Wie kann ich einen toten Npc aus meiner Welt entfernen?
- hat sich erledigt -----


(habe die Posts zusammengefügt um möglichst nur einen Doppelpost zu machen)

Also nun zu einem neuen Problem :
Ich würde gerne einen auswechselbaren TA(soll erst nach einem bestimmten Ereignis passieren) für mehrere NPCs verwenden.
Npc_ExchangeRoutine fällt natürlich weg, da die NPCs nicht die selbe ID haben( Npc_ExchangeRoutine fragt ja nur nach dem Namen, nicht nach Prä- und Suffix), gibt es also eine andere Funktion, die dasselbe tut? (bzw. ließe sich das Manuell machen wie Ai_stanup und Npc.dialyRoutine = soundso?)

mfg und danke im Vorraus

Milgo
10.05.2010, 19:53
[...]
Also nun zu einem neuen Problem :
Ich würde gerne einen auswechselbaren TA(soll erst nach einem bestimmten Ereignis passieren) für mehrere NPCs verwenden.
Npc_ExchangeRoutine fällt natürlich weg, da die NPCs nicht die selbe ID haben( Npc_ExchangeRoutine fragt ja nur nach dem Namen, nicht nach Prä- und Suffix), gibt es also eine andere Funktion, die dasselbe tut? (bzw. ließe sich das Manuell machen wie Ai_stanup und Npc.dialyRoutine = soundso?)
[...]
Ich versteh dein Problem nicht - du willst, dass mehrere NPCs den TA wechseln? Wo ist das Problem? Warum nicht wie folgt?

Npc_ExchangeRoutine(npc1,"NEUER_TA");
Npc_ExchangeRoutine(npc2,"NEUER_TA");
Npc_ExchangeRoutine(npc3,"NEUER_TA");

Rantragon
10.05.2010, 19:54
Für mich ist aus deiner Frage nicht genau hervorgegangen, was du willst.
Was meintst du mit "auswechselbarem TA" und so?

waldhoppser
10.05.2010, 20:13
Ich versteh dein Problem nicht - du willst, dass mehrere NPCs den TA wechseln? Wo ist das Problem? Warum nicht wie folgt?

Npc_ExchangeRoutine(npc1,"NEUER_TA");
Npc_ExchangeRoutine(npc2,"NEUER_TA");
Npc_ExchangeRoutine(npc3,"NEUER_TA");
(oder wie von Rantragon)
Es wird ja nur "NEUER_TA" als Parameter übergeben. -> Daraus schließe ich, dass er die ID aus dem NPC davor bezieht(der ja auch übergeben wird).

Heißt der Ta müsste so heißen:
Rtn_Neuer_ta_(ID_vom_NPC_)666.
Ich wollte jetzt wissen, ob es irgendwie möglich ist eine Ta (Rtn_Neuer_ta_666)
für mehrere NPCs zu verwenden, die erst während des Spiels ihnen gegeben werden(Die NPCs haben ja unterschiedliche IDs).

Hm... kann man es so verstehen?

Rantragon
10.05.2010, 20:16
So wie ich es verstanden habe, willst du einfach, dass die NPCs zu einem bestimmten Zeitpunkt den gleichen TA erhalten...das Problem sehe ich dennoch (wie Milgo) nicht. :dnuhr:

Was spricht dagegen einfach einen gleichen TA bei jedem NPC zu schreiben und ihn Zeitgleich aufzurufen?

Sorry, wenn ich deine Problematik nicht raffe ^^

waldhoppser
10.05.2010, 20:27
So wie ich es verstanden habe, willst du einfach, dass die NPCs zu einem bestimmten Zeitpunkt den gleichen TA erhalten...das Problem sehe ich dennoch (wie Milgo) nicht. :dnuhr:

Was spricht dagegen einfach einen gleichen TA bei jedem NPC zu schreiben und ihn Zeitgleich aufzurufen?

Sorry, wenn ich deine Problematik nicht raffe ^^

nee schon ok, liegt wohl eher an mir^^,
also das Problem ist einfach, dass ich für jeden NPC eine neue Ta schreiben müsste, und da Informatiker, ja eher faul sind, würde ich gerne einen TA für alle NPCs schreiben (sie sollen alle an den selben Stellen schlafen gehen und an den selben Stellen herumstehen).
Ich hoffe soweit ist es wenigstens verständlich^^
Bevor ich hier totalen Mist schreibe: Wie funktioniert NPC_exchangeRoutine?
Also wie kommt es vom Teilstring und NPCinstanz auf den Funktionsnamen der ID?

Rantragon
10.05.2010, 20:36
Erstell einfach eine Datei, die vor den NPCs geparst wird und schreibe eine Funktion, wie diese:


FUNC VOID Name ()
{
//TAs
};

Jetzt kannst du den TA von überall her aufrufen.

Wo ich mir aber nicht sicher bin, ist bei Folgendem: Muss die ID im Funktionsnamen vorhanden sein?


Wie genau NPC_ExchangeRoutine (var C_NPC, var string s1) funktioniert, kann ich dir leider nicht sagen.

waldhoppser
10.05.2010, 20:47
Erstell einfach eine Datei, die vor den NPCs geparst wird und schreibe eine Funktion, wie diese:


FUNC VOID Name ()
{
//TAs
};

Jetzt kannst du den TA von überall her aufrufen.

Wo ich mir aber nicht sicher bin, ist bei Folgendem: Muss die ID im Funktionsnamen vorhanden sein?


Wie genau NPC_ExchangeRoutine (var C_NPC, var string s1) funktioniert, kann ich dir leider nicht sagen.

hm ließe sich ja ausprobieren... Aber, da ich morgen Latein schreibe, nicht mehr heute:D

Milgo
10.05.2010, 20:55
Die ID muss vorhanden sein - so wie du dir das wünschst funktioniert es leider nicht. ;)

Rantragon
10.05.2010, 20:56
Die ID muss vorhanden sein - so wie du dir das wünschst funktioniert es leider nicht. ;)

Ok, schade, aber eine Frage habe ich dann noch:

Warum eigentlich? Hat es einen bestimmten Grunde, warum die ID da sein muss?

Lehona
10.05.2010, 20:58
Weil sie automatisch hinzugefügt wird.

Evtl. kann man oCNPC.daily_routine ändern. Angaben wie immer ohne Gewähr.