Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst]Wo ist die Funktion Incinerate() ? (brennende Bäume)
- - By Serpens66 (More than 200 posts.) Date 21.09.2014 17:27
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 :) 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 =)
Parent - - By Clonkonaut (More than 200 posts.) Date 21.09.2014 18:14
Parent - - By Serpens66 (More than 200 posts.) Date 21.09.2014 18:26
oooookay...  hätte ich mir eig denken können, dass ich das in der Suche finde.. :D

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?
Parent - - By Zapper (More than 500 posts.) Date 21.09.2014 18:54

>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
Parent - - By Serpens66 (More than 200 posts.) Date 21.09.2014 18:58
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 :D

Aber wie ich das nun ohne Objekt und ohne script mache... da stehe ich vor einem Rätsel :D
Parent - - By Zapper (More than 500 posts.) Date 21.09.2014 19:19
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.
Parent - - By Serpens66 (More than 200 posts.) Date 21.09.2014 23:59
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 :D
( "/" vor dem strict, damit es hier im Forum nicht fett geschrieben wird)
Parent - - By Zapper (More than 500 posts.) Date 22.09.2014 07:08
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
Parent - - By Serpens66 (More than 200 posts.) Date 22.09.2014 11:14
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 :D

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.
Parent - - By Zapper (More than 500 posts.) Date 22.09.2014 11:44

>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.
Parent - - By Serpens66 (More than 200 posts.) Date 22.09.2014 13:25
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 :)
Parent - - By Serpens66 (More than 200 posts.) Date 22.09.2014 16:59
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.
Parent - - By Zapper (More than 500 posts.) Date 22.09.2014 17:50
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.
Parent - - By Serpens66 (More than 200 posts.) Date 22.09.2014 18:22
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.
Parent - - By Zapper (More than 500 posts.) Date 22.09.2014 20:25

>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.
Parent - - By Serpens66 (More than 200 posts.) Date 22.09.2014 21:33
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?
Parent - - By Zapper (More than 500 posts.) Date 23.09.2014 14:43

>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
Parent - - By Serpens66 (More than 200 posts.) Date 24.09.2014 14:28
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.
Parent - - By Serpens66 (More than 200 posts.) Date 30.09.2014 13:54
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??
Parent - - By Kanibal (More than 200 posts.) Date 30.09.2014 15:14

>das überprüft ob ein Objekt brennt.


`GetOCF() & OCF_OnFire`
Parent - - By Serpens66 (More than 200 posts.) Date 30.09.2014 16:42 Edited 30.09.2014 16:57
Vielen dank dafür, das hilft schonmal :)

Jetzt ist nur die Frage, wie ich das einbauen kann... Ich möchte ja, dass das Licht aufhört, sobald das Objekt nicht mehr brennt. Demnach kann ich den GetOCF Befehl wohl in keine bereits existierende Funktion schreiben, weil es keine gibt, die aufgerufen wird, wenn das Objekt nicht mehr brennt, oder?
hmmm könnte man Extinguish nehmen? ist das eine Funktion? Also sobald Extinguish passiert, soll das Licht ausgehen?

Falls das mit Extinguish nicht geht, wäre der einzige Weg der mir einfällt ein TimerCall, welcher überprüft ob ein Objekt brennt oder nicht.
Aber kann man für ein Objekt mehrere TimerCall und Timer definieren? Viele Objekte haben ja bereits einen TimerCall definiert, weshalb es wohl nicht umsetzbar wäre, wenn es nur einen TimerCall gibt und man GetOCF() & OCF_OnFire nur damit sinnvoll nutzen kann =/

Falls das alles nicht geht... kommen wir nochmal zur von Zapper geschriebenen Funktion zurück. Die ist soweit ja schon garnicht schlecht, denn Bäume zum leuchten zu bringen bekomme ich auch mit "GetOCF() & OCF_OnFire" nicht hin. Ich möchte lediglich einzelne Objekte davon ausschließen können. Ist das machbar? wie?

edit:

zusätzlich merke ich gerade, dass die FireStopFunktion von Zapper noch nicht einwandfrei funktioniert. Aktuell leuchten ja auch noch die DuroFlames von der Brandbombe. Wenn ich einen Clonk mit dieser Brandbombe anzünde, dann brennt er logischerweise und leuchtet auch. Wenn aber die Flammen der DuroFlames verschwinden und demnach nicht mehr brennen, dann hört plötzlich auch der Clonk auf zu leuchten, obwohl er noch brennt.   Aber wenn der Clonk von einem brennendem Baum Feuer fängt und dann stirbt, leuchtet seine Leiche weiter, obwohl er nicht mehr brennt.
Parent - - By Zapper (More than 500 posts.) Date 30.09.2014 19:51

> Wenn aber die Flammen der DuroFlames verschwinden und demnach nicht mehr brennen, dann hört plötzlich auch der Clonk auf zu leuchten, obwohl er noch brennt.   Aber wenn der Clonk von einem brennendem Baum Feuer fängt und dann stirbt, leuchtet seine Leiche weiter, obwohl er nicht mehr brennt.


Das könnte das Problem mit der einen `static` Variablen sein, die für alle Objekte gilt
Parent - By Serpens66 (More than 200 posts.) Date 30.09.2014 20:16 Edited 01.10.2014 15:00

>Das könnte das Problem mit der einen static Variablen sein, die für alle Objekte gilt


ist es denn auch anders lösbar?
Und kann ich Ausnahmen definieren? z.b indem ich einen if Befehl davor schalte, sodass es z.b bei Duroflames nicht weiter ausgeführt wird, sondern gleich return inherited aufgerufen wird? (ich vermute mal shcon dass das geht, probiere ich morgen mal aus)

edit: jop, ich konnte mit einem if Befehl die Flames und Duroflames ausschließen :)
Parent - - By Serpens66 (More than 200 posts.) Date 01.10.2014 14:21 Edited 01.10.2014 15:33
auch nochmal für zukünfte Projekte von mir:
kann man irgendwie mehr als einen TimerCall pro Objekt definieren? bzw. verschiedene Timer?
edit:
Die Zeitfunktion, also Tag und Nacht, funktioniert ohne Timer.. also kann man TimerCall auch umgehen?
Parent - By Clonkonaut (More than 200 posts.) Date 02.10.2014 08:11

> kann man irgendwie mehr als einen TimerCall pro Objekt definieren? bzw. verschiedene Timer?


Nicht über den DefCore-Eintrag TimerCall, aber da Effekte nichts anderes als zeitlich wiederkehrende Aufrufe sind, kannst du über Effekte beliebig viele Timer umsetzen.
- By Serpens66 (More than 200 posts.) Date 08.10.2014 13:18
Habe eben das Pack "Ruf der Wipfe Remake" gefunden.  Das ist ja absolut genial! fast alles davon wollte ich auch umsetzen, bzw. habe es teilweise schon. Mal schauen wieviel ich davon integrieren kann, ohne das Skinpaket...

Jedenfalls leuchten die brennenden Bäume hier!!  Das Skript dazu ist vermutlich das hier:

/*-- Feuerlichter --*/

`#strict`

static const RDW_Firelight_Var=15;

global func FxFireStart(object obj, int iNumber, int iTemp, int iCausedBy, bool fBlasted, object pIncineratingObject)
{
  var ret=inherited(obj, iNumber, iTemp, iCausedBy, fBlasted, pIncineratingObject);
  if(ret>-1)
    if(!iTemp)
      if(dayhelligkeit<30)
        if(GetCategory(obj)&C4D_Structure||GetCategory(obj)&C4D_Vehicle||GetCategory(obj)&C4D_StaticBack)
          if(!IsAntiLag())
          {
            EffectVar(RDW_Firelight_Var,obj,iNumber)=CreateObject(LGFL,0,0,-1);
            EffectVar(RDW_Firelight_Var,obj,iNumber)->Init(obj,0,0,GetDefWidth(GetID(obj))*(GetCon(obj)-10)*4/100,RGB(150,100,50),true);
          }
  return(ret);
}

global func FxFireTimer(obj,iNumber,iTime)
{
  if(EffectVar(RDW_Firelight_Var,obj,iNumber))
    EffectVar(RDW_Firelight_Var,obj,iNumber)->Init(obj,0,0,(GetDefWidth(GetID(obj))*(GetCon(obj)-10)*4/100)+RandomX(-10,10),RGB(150,100,50),true);
  return(inherited(Par(), Par(1), Par(2), Par(3), Par(4), Par(5), Par(6), Par(7), Par(8), Par(9)));
}

global func FxFireStop(obj,iNumber,iReason,ftemp)
{
  if(!ftemp)
    if(EffectVar(RDW_Firelight_Var,obj,iNumber))
      RemoveObject(EffectVar(RDW_Firelight_Var,obj,iNumber));
  return(inherited(Par(), Par(1), Par(2), Par(3), Par(4), Par(5), Par(6), Par(7), Par(8), Par(9)));
}


Ich werde es mir jetzt noch genauer anschauen, aber vllt sieht ja einer von euch den entscheidenen Unterschied, warum das Script von Zapper für "burnto" Objekte nicht funktioniert hat, dieses Script es aber tut :)
Up Topic Deutsch / Hilfestellung / [Gelöst]Wo ist die Funktion Incinerate() ? (brennende Bäume)

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill