[Gelöst]Wo ist die Funktion Incinerate() ? (brennende Bäume)

Die im Titel genannte Funktion sorgt vermutlich für das Feuer das gezeigt wird, wenn Objekte aller Art eben Feuer fangen, also Bäume, Fahrzeuge und vllt auch Clonks.
Leider gibt es unter effekte nur 2 Arten von Flammen. Einmal die für die Brandbombe und einmal die für Öl welches Feuer fängt.  Das für Bäume usw. finde ich dort nicht.
Die Suche nach LocateFunc("Incinerate()") findet leider nichts. Ich komme auf diese Funktion, weil sie z.b beim Ballon erwähnt wird, wenn dieser von Brandfeilen getroffen wird.

Der Hintergrund ist, dass ich das feuer in meinem ObjectPack zum leuchten bringen will. Habe es nun schon bei Meteoriten so gemacht :slight_smile: Jetzt fallen schöne leuchtende Meteoriten vom Himmel =)  Hatte auch überlegt es bei dem Feuer der Brandbombe zu zu machen, aber leider entstehen dabei ja 20 einzelne Flammen und das Licht dieser überlagert sich, sodass es einfach viel zu grell, bzw. einfach nur noch weiß ist und zudem das Spiel dadurch viel zu sehr hakt, deswegen lasse ich das.  Aber bei wenigen einzelnen Objekten ist das mit dem Licht ein sehr schöner Effekt, weshalb ich es auch gern bei brennenden Bäumen usw. hätte =)

http://www.clonk.de/docs/de/sdk/script/fn/Incinerate.html

oooookay…  hätte ich mir eig denken können, dass ich das in der Suche finde… :smiley:

Nur heißt das jetzt, dass ich es nicht ändern kann? Kann ich das nicht irgendwie in mein Pack reinziehen und verändern oder ein appendto dafür machen, sodass nur wenn man Pack aktiviert ist, das Feuer leuchtet?

>Nur heißt das jetzt, dass ich es nicht ändern kann? Kann ich das nicht irgendwie in mein Pack reinziehen und verändern oder ein appendto dafür machen, sodass nur wenn man Pack aktiviert ist, das Feuer leuchtet?


Ja, du könntest Incinerate überladen. Das wird aber nicht aufgerufen wenn zB ein Objekt ein anderes anzündet oder wenn man durch Lava anfängt zu brennen etc.

Immer wenn ein Objekt anfängt zu brennen, wird aber der Callback Incineration aufgerufen. Den könntest du benutzen, wenn du irgendwas machen willst sobald dein Objekt anfängt zu brennen

okay, danke…

und wie mache ich das? Normalerweise würde ich nun einfach ins Objekt Feuer reingehen, dort dann die Leuchtfunktion und bei Initialize "TurnLightOn" einfügen und schon ists fertig :smiley:

Aber wie ich das nun ohne Objekt und ohne script mache… da stehe ich vor einem Rätsel :smiley:

Kannst ja mal folgendes machen und gucken was passiert:

Einfach in ein neues System.c4g Script das hier packen:

global func FxFireStart(target)
{
target->TurnLightOn();
return inherited(target, …);
}
global func FxFireStop(target)
{
target->TurnLightOff();
return inherited(target, …);
}

Damit überlädst du einfach den echten Feuereffekt. Aber weiss nicht genau ob das so funktioniert.
TurnLightOn/Off müssen dann natuerlich auch globale Funktionen sein.

okay… es funktioniert noch nicht ganz.

ich habe:

/– LeuchtFeuer –/

/#strict

static mlightt;

global func FxFireStart(target)
{
target->TurnLightOnGlobal();
return inherited(target, …);
}

global func FxFireStop(target)
{
target->TurnLightOffGlobal();
return inherited(target, …);
}

global func TurnLightOnGlobal()
{
  var iColor;
  iColor = RGBa(235,150,10,50);
  mlightt = AddLight(1000, iColor, this());
  return(1);
}

global func TurnLightOffGlobal()
{
  if (mlightt) RemoveObject(mlightt);
  return(1);
}


wenn ich es so stehen habe, dann leuchtet es nicht, sondern brennt ganz normal. Wenn ich aber das ",…" entferne, dann leuchtet es, aber brennt nicht :smiley:
( "/" vor dem strict, damit es hier im Forum nicht fett geschrieben wird)

Dann ist wohl erst ab #strict 2.
Ansonsten muss man die Parameter eben ausschreiben. Die drei Punkte stehen nur für "alle anderen Parameter auch noch".

Dann eben
FxFireStart(target, effectNumber, temp, a, b, c, d, e, f) mit inherited(target, effectNummer, temp, a, b, c, d, e, f)
und
FxFireStop(target, effectNumber, reason, temp) mit inherited(target, effectNumber, reason, temp).

Übrigens hast du jetzt eine globale Konstante "mlight". Das heisst, es wird wohl nur ein einziges Licht gleichzeitig funktionieren - und nicht eines per Objekt. Aber kannst ja erstmal schauen ob das mit dem Effekt jetzt so für ein Licht funktioniert

wenn ich es so eingebe, kommt erstmal die Fehlermeldung von einem unknown identifier in FxFireStart "effectnumber".  
Wenn ich effectnumber dann aus FireStart und dem dazugehörigen inherited entferne, kommt keine Fehlermeldung mehr, aber es brennt auch nur ganz normal, ohne Licht.

Habs auch nochmal mit strict 2 und den "…" versucht, aber das klappt auch nicht.  Mit vollständigen Fx Funktionen (außer beim start effecnumber) und bei den inherited Funktionen "target,…" kommt wieder nur das Licht, aber ohne Feuer.
Irgendwie wollen die nicht gemeinsam auftreten :smiley:

Stimmt, das mit mlgihtt könnte Probleme machen… falls es dann mal funktioniert schaue ich mal, ob ich auf die Konstante verzichten kann, indem ich einfach nur den AddLight Befehl reinschreibe und das Licht nicht wieder ausschalte. Denn meistens verschwindet das Licht automatisch, wenn der leuchtende Gegenstand verschwindet.

>Wenn ich effectnumber dann aus FireStart und dem dazugehörigen inherited entferne, kommt keine Fehlermeldung mehr, aber es brennt auch nur ganz normal, ohne Licht.


Das ist keine Lösung.
Die Fehlermeldung ist Unknown identifier "effectNummer" (nicht effectnumber), weil ich mich da vertippt hab. Einmal habe ich effectNumber geschrieben und einmal effectNummer.

Die Namen da (target, effectNumber etc.) sind übrigens einfach Namen für Parameter. Die kannst du dir aussuchen wie du magst - nur die Reihenfolge ist wichtig. Du hättest die Parameter auch alle a bis k oder p1 bis p10 nennen können, aber das ist ziemlich schlechter Stil.
Du wirst aber auf jeden Fall sowas wie iEffectNumber auch finden. Obwohl das leicht anders heisst, hat das genau den selben Inhalt. Es kommt nur auf die Position in der Parameterliste an.
Such dir einfach einen Stil aus, den du gut findest und mit dem du klar kommst und zieh den überall durch. (Ich zB würde wohl mittlerweile selbst Unterstriche zur Worttrennung benutzen: effect_nummer).

Was dann letztendlich diese Parameter für Inhalt haben bestimmt der, der deine Funktion aufruft - so wie du das machst, wenn du selbst Funktionen aus der Doku benutzt.

ah stimmt, das hab ich übersehen…

/– LeuchtFeuer –/

/#strict

static mlightt;

global func FxFireStart(target, effectNumber, temp, a, b, c, d, e, f)
{
target->TurnLightOnGlobal();
return inherited(target, effectNumber, temp, a, b, c, d, e, f);
}

global func FxFireStop(target, effectNumber, reason, temp)
{
target->TurnLightOffGlobal();
return inherited(target, effectNumber, reason, temp);
}

global func TurnLightOnGlobal()
{
  var iColor;
  iColor = RGBa(235,150,10,10);
  mlightt = AddLight(1000, iColor, this());
  return(1);
}

global func TurnLightOffGlobal()
{
  if (mlightt) RemoveObject(mlightt);
  return(1);
}


kommt nur Feuer ohne Licht =/
und danke für die Erklärung der Parameter :slight_smile:

mir ist gerade aufgefallen, dass dieses Script doch funktioniert, aber vermutlich nicht die richtigen Funktionen sind, um das Feuer bei Bäumen zu beeinflussen… oderso.
Also bei Bäumen scheint ja nur "entweder oder" zu klappen.

Aber ich hab gerade zufällig gemerkt, dass durch das Skript das Feuer der Brandbombe leuchtet. Zu finden ist das Feuer unter Objects/Effects/DuroFlame.
Diese Flammen verwenden nämlich ebenfalls den Incinerate() Befehl.
Jetzt fragt sich nur, warum das hier klappt, aber nicht bei Bäumen und Co.

Außerdem ist der Effekt bei Duroflames/Flames natürlich nicht gut, weil sich bei 20 Flammen die Lichter überladen und einfach nur noch alles hakt. Demnach darf das Licht hier nicht erscheinen. Ich möchte es nur bei brennenden Objekten, wie Clonks, Gebäude, Bäume, Fahrzeuge, aber nicht bei den DuroFlames oder Flames. Bisher trifft es offensichtlich nur letztere beiden, weshalb ich denke es auch möglich sein sollte, nur alles außer die beiden Dinge zu ändern.

Seltsam; ich sehe eigentlich keinen Grund, warum das nur selektiv bei bestimmten Dingen funktioniert.

Vielleicht hat das Licht selbst noch irgendwelche Einschränkungen oder so?
Der globale FxFireStart Effekt sollte eigentlich für alle Objekte gelten.
Du kannst in die Fx*Start-Funktion ja mal testweise Log("%s brennt.", target->GetName()); reinschreiben, dann sollte geloggt werden bei welchen Objekten das aufgerufen wird.

sowohl bei den DuroFlames als auch bei Bäumen, erscheint im Log dann die Meldung "…brennt".
Aber trotzdem kommt bei Bäumen und Co kein Licht… Könnte das vllt was mit "nur eine Darstellung" zu tun haben? Irgendwer schrieb mal, dass nur eine Sache aufeinmal animiert werden kann, weshalb z.b die Werkstatt nicht betreten werden kann (animation Tür öffnen), während geforscht wird (animation Rauch).

Ein anderer Grund fällt mir nicht ein…

Der AddLight Befehl ist im Objekt LIGH im Hazardpack unter Effects/Light:

//erzeugt ein Licht mit Größe und Farbe und hängt es an pTarget
global func AddLight(int iSize, int iColor, object pTarget) {
  if(!pTarget)
    if(!(pTarget = this()))
      return();
 
  return(CreateLight(LIGH, iSize, iColor, pTarget));
}


Die Defcore von LIGH sieht so aus:

[DefCore]
id=LIGH
Version=4,9,8,2
Name=Light
Category=C4D_Foreground|C4D_MouseIgnore|C4D_Vehicle
Width=128
Height=128
Offset=-64,-64
Vertices=1
VertexCNAT=64
Components=LIGH=1
Picture=0,0,128,128
Rotate=1
StretchGrowth=1
IncompleteActivity=1
Oversize=1
NoStabilize=1
BlitMode=1
NoSell=1
NoGet=1


Falls dort nichts steht, was iwas verbieten könnte, könntest du ja vllt auch nochmal ins Hazardpack reinschauen, wenn du es aufm pc hast.

>Könnte das vllt was mit "nur eine Darstellung" zu tun haben?


Eher nicht.
Ein Objekt kann in CR nur eine Aktion gleichzeitig abspielen. Der Clonk kann zB nicht gleichzeitig laufen und schwimmen oder ein Gebäude die Tür öffnen und forschen.

Die Lichter sind aber schonmal viele verschiedene Objekte, also sollte es schon deshalb egal sein.

also hast du auch keine Idee, warum es bei Bäumen und Co nicht klappt?
Wie bist du eigentlich auf die Funktion FireStart gekommen? Wo ist diese definiert, bzw. ihr effekt?

>also hast du auch keine Idee, warum es bei Bäumen und Co nicht klappt?


Nicht direkt

>Wie bist du eigentlich auf die Funktion FireStart gekommen? Wo ist diese definiert, bzw. ihr effekt?


Der (engineinterne) echte Feuereffekt heisst "Fire". Damit könntest du zum Beispiel dein eigenes Feuer einbauen, wenn du wolltest

sooo…
also durch deinen hinweis mit dem Löschen aus dem anderen Thread, habe ich mir gedacht, dass ich es einfach so mache, dass ich in die Funktion Incineration() jedes Objekts einfach den Lichtbefehl reinschreibe. Also sobald das Objekt brennt, fängt das Objekt selbst an zu leuchten, und nicht das Feuer.
Jetzt fehlt mir nur gerade ein Befehl der das Licht wieder ausknipst, sobald das Objekt nicht mehr brennt, gibt es da was?
Hab dafür kurz deine FireStop Funktion probiert. Das klappt zwar, aber das greift ja auf alle objekte zu, und dann würde vermutlich überall das licht ausgehen, wenn ein objekt nicht mehr brennt, oder?

Bei Tieren klappt es schonmal, das feuer geht aus, wenn der Wipf tot ist (in der Death funktion) oder etwas betritt (die beiden Befehle, die wir beim Plutonium angewandt haben, damit das licht nicht eingesammelt wird. Das mit dem Tod ist nicht optimal, da er ja auch gelöscht werden könnte ). Aber bei Bäumen oder Luftschiff klappt es aktuell nicht. Ich habe die nötigen Befehle sowohl in den normalen Baum, als auch in den toten Baum geschrieben. Aber es leuchtet nichts…  möglicherweise könnte das aber auch an der Umwandlung von Baum zu toter Baum liegen… aber eigentlich müsste der tote baum dann doch merken, dass er brennt, und anfange zu leuchten, oder nicht?
Wenn ich beim toten Baum in "Initialize" das Licht einschalte, dann leuchtet der Baum bei Spielstart, aber nicht, wenn der normale baum in einen toten Baum umgewandelt wird.

gut, ich habe zumindest das Problem gefunden.

Es liegt tatsächlich an den "Burn to" Objekten. Bei Incineration steht bei den Ojektskripten auch der Hinweis:
Wenn das Objekt entzündet wird. Achtung: Bei Objekten, die ihre Definition mit BurnTo ändern, findet der Aufruf im verbrannten Objekt statt!

Dennoch funktioniert es auch nicht, wenn man im verbrannten Objekt das leuchten in der Incineration funktion hinzufügt.
Aber wenn man im DefCore den "BurnTo=…" Eintrag entfernt, dann leuchten auch brennende Bäume usw.

Beim Material Holz verhält es sich ähnlich. Holz hat im Skript bereits einen Incineration Eintrag, dass die Farbe geändert werden soll. Zündet man es an, leuchtet es ganz kurz auf und leuchtet dann nicht mehr, sobald die Farbe vom Holz sich geändert hat.

Meine Leuchtfunktion sieht so aus:
public func Incineration() {
  //  brennen leuchtet
TurnLightOn();
_inherited();
}


Man könnte jetzt vermuten, dass die Standardincinerationfunktionen die meinige überschreiben, auch wenn ich sie direkt ins Skript des Objekts schreibe…
Habt ihr eine Idee dazu, wie ich das lösen kann, ohne alle "BurnTo" Objekte zu verbannen?

Zusätzlich fehlt mir leider immernoch etwas, das überprüft ob ein Objekt brennt. Aktull leuchtet z.b. ein Clonk weiter, nachdem er gelöscht wurde =/
In den Objektskripten habe ich dazu nichts gefunden… aber es muss das irgendwas dazu geben, oder nicht??

>das überprüft ob ein Objekt brennt.


`GetOCF() & OCF_OnFire`