Hi,
ich habe das E.P.I.C. Pack und möchte davon ein paar Elemente in meine eigene Sammlung hinzufügen. Ich möchte die ganzen Fallenarten und Verletzungen nicht haben, die brauch ich nicht auch wenn sie interessant sind. Was ich aber besonders gut finde ist einmal, dass getragene Objekte tatsächlich in den Händen der clonks angezeigt werden (dies ist bereits in einem appendto geregelt) und die "Hide" und "Feigh Death" Möglichkeiten würde ich gerne nutzen.
Nun sind diese beiden Fähigkeiten leider in einen neuen Clonk geschrieben, anstelle ein appendto zu machen. Ich hätte lieber nur eine Clonkdatei, eben die aus Objects, und sonst nur appendtos damit, ich alle neuen fähigkeiten meiner Clonks richtig nutzen kann (habe z.b noch destruction, reparieren…).
Wenn ich nun bei der Clonkdatei des Epic Packs einfach unter strict:
"#appendto CLNK"
"#include CLNK"
schreibe, dann lässt sich ein Szenario, welches das Epicpack und das objects pack nutzt nicht mehr laden. Es hängt einfach beim Laden und geht nicht mehr weiter.
Daraus schließe ich mal, dass es nicht so leicht geht… was muss ich nun also tun, um daraus ein apppendto zu machen?
Edit: nur für andere, die eine Antwort zu der Frage aus der Überschrift suchen:
Man kann aus einer Überladung nur im Bezug auf das Skript ein appendto machen. Daten die z.b in der DefCore oder anderen Orten angegeben sind, kann man nicht via appendto machen, weshalb Überladungen manchmal nötig sind.
Du könntest doch den Script der Funktionen rauskopieren, und in ein appendto-Script setzen, oder hab ich da was falsch verstanden?
das hauptproblem ist vermutlich, dass ich noch ziemlich neu bin und eig keine Ahnung habe, wie ein Appendto funnktioniert. Also ich weiß mittlerweile eben, dass man das nutzt, um an vorhandene Objekte noch funktioinen im Skript dranzuhängen. Aber welche Merkmale so ein appendto aufweisen mus, um ein solches zu sein, weiß ich nicht.
also beim schritt " in ein appendto script setzen" wüsste ich jetzt nicht, wie dieses a. script aussehen müsste, um ein solches zu sein.
Ich kenne nur die oben geposteten kriterien, aber damit scheint es ja nicht zu gehen… oder liegt das an der länge des clonkskripts oder den anderen in der clonkdatei enthaltenenen dinge?
Stell dir ein appendto vor, wie als hättest du einen normalen Zettel, mit irgendwelchen Buchstaben, vollkommen irrelevant. Dann, hast du einen weiteren Zettel, auch mit Buchstaben, den du unten am anderen Zettel festklebst!
Daher fügt ein appendto noch weiteren Script hinzu, wie der 2. Zettel weitere Buchstaben.
Zum Script:
#appendto CLNK
protected func foo() {
//hier steht halt das, was du aus dem Script des Clonkes mit den Funktionen kopiert hast
}
So ungefähr müsste es dann wohl aussehen.
hmhm. soweit war es mir schon klar, aber trzd. danke.
Die Frage ist nur, warum klappt es nicht, wenn ich einfach über das vorhandene Script die oben genannte Anweisungen schreibe?
Ich geh mal wirklich davon aus, dass es an den ganzen anderen Dateien liegt, wie defcore und was da noch alles beim clonk dabei ist (seht ihr ja wenn ihr in den objects den Clonk aufruft).
Nur sind hier im epic pack halt noch ein paar zusätzliche inhalte, die natürlich nicht verloren gehen dürfen, wenn ich nun das Skript einfach über copy paste in ein appendto verwandle (das wäre also dasselbe, was ich bisher schon gemacht habe, mit dem unterschied, dass alle zusätzlichen Dateien fehlen).
Ich weiß nicht, welche Dateien wie wichtig für diese neuen Funktionen sind. Als Beispiel nur mal die String Datei mit den nötigen Bezeichnungen "Hide" usw., die dann im Menü erscheinen sollen.
Am besten wäre es wohl, wenn du dir einfach mal das E.P.I.K pack runterländst, und dir da den overload zum clonk anschaust.
ein AppendTo macht aber gar nicht mit dem DefCore, und den anderen Sachen, ein AppendTo macht nur Script!
Zusätzlich würde ich sagen, das #appendto CLNK und #include CLNK sich nicht so ganz vertragen, denn es wird an das Script des Clonkes ein "#include CLNK" reingesetzt, wodurch sich der Clonk rekursiv immer wieder selbst inkludiert. Ich denke, da liegt das Problem, warum die Engine an dem Punkt nicht weiterlädt.
Aber warte, ich mir das Pack mal holen, und dann mal gucken.
Die Autoren von E.P.I.C haben die Overloads glaube ich nicht aus Tradition benutzt. Vor allem für das Verstecken und das Totstellen sind da neue Actions in dem Clonk definiert worden (“Faint”, “Hiding”, etc.). Für Sachen wie ActMap, DefCore, Graphics, etc. funktionieren #AppendTos nicht wirklich (außer natürlich in OC, wo ja bekanntermaßen alles besser ist). Hängt sich die Engine denn richtig auf oder beendet die mit einer Fehlermeldung? Du brauchst übrigens eigentlich kein #include bei #AppendTos, denn der Skript wird ja schon quasi unter den Originalskript kopiert, daher sind die Symbole des Skripts bekannt.
danke für die Antwort
die oben geschriebenen Anweisungen habe ich nur genommen, weil diese auch in anderen appendtos verwendet wurden. Ich lerne und mache alles halt durch Vergleiche. Also wenn ich ein appendto machen will, schaue ich mir funktionierende Appendtos an und versuche rauszufinden, was die entscheidenden Punkte sind. Deswegen das "include"…
Also meinst du ich kann diese Hide und todesfunktion nicht in ein Appendto bekommen? Wie kann ich es dann lösen? Weißt du welche Dinge in welchen Dateien usw. wichtig für diese 2 funktionen sind? Dann könnte ich sie ja vllt in eine Kopie des Objektordners beim normalen Clonk einfügen oderso… ?
>Also meinst du ich kann diese Hide und todesfunktion nicht in ein Appendto bekommen?
Also ich kenn keine Möglichkeit, Graphiken nachträglich an Objekte zu binden (außer vielleicht hackige Overlays, aber verursacht vermutlich mehr Probleme, als es löst). Du kannst die Funktionen natürlich selber nachskripten, das sollte auch nicht so unglaublich schwer sein. Das mit den Items in der Hand ist vermutlich schwerer, aber da könntest du schauen, wie E.P.I.C das genau macht und den Teil versuchen zu isolieren (*sollte* ja eigentlich keine Spezial-Actions benötigen).
>Dann könnte ich sie ja vllt in eine Kopie des Objektordners beim normalen Clonk einfügen oderso... ?
Objects.c4d sollte man nicht duplizieren. Ist doof in Netzwerkspielen.
der objects.c4d ist natürlich dann innerhalb eines objektordnders "sammlung" , das sollte doch dann gehen, oder nicht?
Das mit den Objekte in der Hand halten konnte ich schon isolieren, da es schon vorher in einem appendto stand. Musst nur den ganzen Wunden-kram aus dem skript löschen, sieht jetzt so aus:
appendto
/* Initialisierung */
protected func Initialize()
{
AddEffect("InventarCheck", this, 1, 1, this);
AddEffect("IntWoundHandling",this,1,0,this);
return(inherited());
}
private func FxInventarCheckTimer()
{
if(Contents() && (GetAction() eq "Walk" || GetAction() eq "HoldWalk" || GetAction() eq "Jump" || GetAction() eq "HoldJump"))
{
//Richtungen
var iDir = GetDir(); if(iDir == 0) iDir = -1; else iDir = 1;
var iDirReversed = GetDir(); if(iDirReversed == 0) iDirReversed = 1; else iDirReversed = -1;
// Maße und Anpassungen
var iYOffset = -1000;
var iXOffset = 4000;
var iXWidth = iDirReversed * 1000;
var iYHeight = 1000;
// Zusätzliches
var iOverlayMode = GFXOV_MODE_Object;
var szAction = 0;
// Sonderbehandlungen:
if(GetID(Contents()) == AXE1) { iXWidth = iDir * 1000; }
if(GetID(Contents()) == FLAG) { iXWidth = iDir * 1000; }
if(GetID(Contents()) == BOW1) { iXOffset = 3000; iYOffset = -1500; }
if(GetID(Contents()) == LANC) { iYOffset = -15000; }
if(GetID(Contents()) == ARCH) { iYOffset = -8000; }
// Sonderbehandlungen mit Aktionen:
if(GetID(Contents()) == CNDL) { iXOffset = 5500; iYOffset = -6500; }
if(GetID(Contents()) == BANR) { iYOffset = -15000; }
var iR = GetR(Contents());
SetR(0, Contents());
// Legt die Objektgrafik auf den Clonk
SetGraphics(0, 0, GetID(Contents()), 1, iOverlayMode, szAction, GetObjectBlitMode(Contents()), Contents());
SetObjDrawTransform(iXWidth, 0, (GetDir()*2-1) * iXOffset, 0, iYHeight, iYOffset, 0, 1);
// Hand über das Objekt legen
SetGraphics(0, 0, CHD, 2, GFXOV_MODE_Base);
SetObjDrawTransform((GetDir()*2-1) * 1000, 0, (GetDir()*2-1) * 1000, 0, 1000, 00, 0, 2);
if(this->~IsHidden()) {
SetClrModulation(RGBa(205,205,205,170),this,1);
SetClrModulation(RGBa(205,205,205,170),this,2);
}
if(GetAction() eq "Walk") SetAction("HoldWalk");
if(GetAction() eq "Jump") SetAction("HoldJump");
SetR(iR, Contents());
}
else
{
// Overlay Grafiken entfernen
SetGraphics(0, 0, 0, 1);
SetGraphics(0, 0, 0, 2);
if(GetAction() eq "HoldWalk") SetAction("Walk");
if(GetAction() eq "HoldJump") SetAction("Jump");
}
}
(also für jeden, der das auch haben will, dass der Clonk die items in der Hand hält
wie gesagt aus dem E.P.I.C Pack)
EDIT: okay, man benötigt die Grafiken im EPIC Pack dafür, sonst klappts nicht ^^
jetzt mache ich mich mal an die Änderungen ,die es im clonkskript gibt und vergleiche mit dem Original… ich denke man kann das neue clnkskript ruhig verwenden, muss es aber ein klein wenig ändern, da der Clonk darin nicht mit Lehm und Metal brücken bauen kann. Das wird einem extra appendto geregelt, keine ahnung warum.
Jedenfalls schau ich mir das jetzt genau an, und vermutlich kann ichs doch verwenden.
Edit:
so ich habe nun alles verglichen… für meine Wünsche musste ich lediglich die neuen Kampfmoves usw. löschen und dass dabei eben wunden entstehen. Außerdem noch die neue Art des Bäume zerkleinerns musste ich im Skript löschen. Nun sind die einzigen Unterschiede zum Original die Hide und diese feithDeath Fähigkeit
In der Actmap sind auch noch die neuen Fähigkeiten defininert, habe dort auch die nicht benötigten Dinge gelöscht.
Und natürlich braucht man aus der StringTblUS.txt Datei die Befehle im Menü:
CtxFeignDeath=Feign Death
CtxRise=Rise
CtxHide=Hide
Aber was ich nicht verstehe, ist warum ich mit diesem neuen Clonk keine metall und Lehmbrücken bauen kann… und warum es der object Clonk kann, obwohl im Skript dazu nichts steht…
einzige erklärung die ich habe, ist dass es im original ebenfalls irgendein Clonk appendto gibt, welches ihm diese Fähigkeiten zuschreibt…
Ach und merkwürdigerweise wird durch den neuen Clonk das Sichtfeld reduziert. Es liegt defintiv am Clonk. Ich vermute, dass ich im Script irgendeine Änderung einer Zahl übersehen habe, wodurch das Sichtfeld kleiner wird…
Fällt euch da was ein ,was dafür verantwortlich sein könnte?
Das Sichtfeld wird mit [SetPlrViewRange](http://crdocs.clonkspot.org/de/sdk/script/fn/SetPlrViewRange.html) verändert, such mal danach.
danke dir.
Leider ist laut der suchfunktion weder das Wort "View" noch "Range" im Skript enthalten =/
Es scheint aber wirklich am Script zu liegen. Wenn ich den ClonkOrdner aus Epic kopiere und dort das Script des Objekte Clonks reinpacke, dann ist die Sicht ganz normal…
Edit:
ich hab gerade festgestellt, dass das oben gepostete Skript, also das appendto, dafür sorgt, dass ich mit meinem Clonk nichts mehr mit dem Bausatz bauen kann. Ich kann es zwar in der Liste auswählen, aber es erscheint keine Baustelle, es kommt aber auch keine Fehlermeldung…
Also anscheinend habe ich da doch etwas wichtiges rausgelöscht… =( … finde aber nicht, was wichtig gewesen sein könnte… hmm…
->
es scheint an der Kombination von Epic Clonk und dem Appendto Skript zu liegen. Nehme ich eines von beiden raus, bzw. ersetze den Clonk durch das Original, dann kann ich bauen.
Wobei ich sagen muss, dass ich immernoch, bis auf die Grafiken, im Skript die Hide und Death Fähigkeit und die 4 neuen Anweisungen in der ActMap.txt Datei, keinen Unterschied zwischen den Clonks sehen kann. ICh kann mir nicht erklären, warum beim Epic Clonk, der Sichtradius kleiner ist und er keine Lehm/Metallbrücken bauen kann. Und auch nicht, warum er nicht bauen kann…
AAAH, ich sehe gerade in dem Original Appendto Ordner ist noch eine weiteres appendto drin, mit dem ich nichts anfangen konnte, weshalb ichs gelöscht hatte. Es ist ein appendto für den Bausatz, wodurch das bauen dann eben funktioniert. Aber keine Ahung, warum sowas nötig ist, aber im normalen Objektpaket nicht O.ô
Ist dir jetzt eigentlich klar, was #appendto macht und wie es funktioniert?
> "#appendto CLNK"
> "#include CLNK"
Das führt sehr wahrscheinlich zu einer Endlosschleife: Das eigene Skript wird an CLNK angehängt, dann wird das (neue) CLNK-Skript hergenommen und an sich selbst angehängt und dieses geänderte Skript wieder an CLNK usw.
ist es denn egal, in welcher Reihenfolge die beiden Befehle geschrieben werden? Also es gibt eine Endlosschleife bei beiden Reihenfolgevarianten?
Ich hab das so gemacht, weil es in zahlreichen anderen appendtos aus allenmöglichen fertigen Packs ebenfalls so steht. Nicht in allen, aber in vielen, und da sind die reihenfolgen unterschiedlich, mal so, mal so… und es verursacht keine Fehler.
edit: und ja mir ist klar, dass appendto das darunter folgende script an das Originalscript dranhängt.
Aber was include macht, wusste ich bisher nicht, jetzt weiß ich es
Allerdings glaube ich nicht, dass es zu einer Endlosschließe führt… ich meine warum sollten zahlreiche Entwickler aus ccan soetwas falsch machen? Wundert mich etwas… wie kann man denn rausfinden, ob wirlich eine endlosschliefe entsteht? Weil es ergeben sich ja keinerlei Fehler dadurch.
Die Reihenfolge ist egal. Ich habe auch gerade noch mal nachgelesen und anscheinend ist das doch okay. Dann muss dein Problem woanders liegen.
hab grad nochmal editiert
also ja, ich denke auch dass das problem woanders liegt.
Mit "problem" meinst du das Problem des sichtradiuses? Oder dass kein Lehm/Metall/ Bausatz ohne appendto aus EPIC funktioniert?
Edit: das Lehm/Metal/Bausatz Problem lässt sich ja durch die mitgelieferten fertigen appendtos lösen.
Das einzige was ich noch nicht lösen konnte, ist das mit dem Sichtradius.
Ich meinte das hier:
> schreibe, dann lässt sich ein Szenario, welches das Epicpack und das objects pack nutzt nicht mehr laden.
Vielleicht habe ich aber auch nicht gründlich gelesen und das ist schon kein Problem mehr. Das Sichtradiusproblem könnte vielerlei Ursachen haben, das Problem mit Bausatz und Lehm klingt so, als hätte dein benutzter Clonk nicht die notwendigen Actions, um das zu machen. Actions kannst du durch #include / #appendto wie hier schon erwähnt nicht manipulieren.
Ich fragte nur generell nach, weil die Diskussion ein paar Unsicherheiten bei der genauen Überladung von Objekten / Funktion beinhaltete.
achso, ne mit dem Problem hab ich mich nicht weiter beschäfttigt, weil ich stattdessen nun ja sozusagen diesen Epic Clonk einfach übernommen habe, aber zuvor diese ganzen Verletzung und Kampfneuerungen aus dem Script entfernt habe. Also habe ich letzlich kein appendto selbst geschrieben.
Aber ja, bei mir herrschen seeehr viele unsicherheiten, aber mit jedem Tag und Post hier im Forum lerne ich mehr =)
hier mal das fertige appendto, damit der Clonk wieder Lehmbrücken bauen kann (vor strict und appendo ein "/" gesetzt, damit das Forum es nicht fett schreibt):
/– Neues Objekt –/
/#strict
/#appendto LOAM
private func CanBridgeHere(object clonk)
{
// Nur wenn der Clonk steht und sich im Freien befindet
if (GetAction(clonk) ne "Walk" && GetAction(clonk) ne "HoldWalk") return false;
if (Contained(clonk)) return false;
// Brücke OK
return true;
}
Möglicherweise wirst du daraus schlau, warum es ohne dieses appendto nicht funktioniert? "Holdwalk" hat glaube ich mit der neuen Grafik zu tun, dass der Clonk gegenstände in der Hand hält. Also möglich, dass das die URsache ist und man deswegen ein appednto braucht?
Zum Sichtradius habe ich aber überhaupt keine Idee… … =/
> Also möglich, dass das die URsache ist und man deswegen ein appednto braucht?
Ja, das ist die Ursache. Das Lehmobjekt (LOAM) überprüft, ob der Clonk gerade steht (Action "Walk") und nicht etwa springt, fliegt oder sonst etwas macht und lässt nur dann einen Brückenbau zu. Wenn "HoldWalk" "Walk" ersetzt beim Objektetragen, dann muss der Lehm dahingehend modifiziert sein, dass auch bei "HoldWalk" der Brückenbau zulässig ist. Denn wenn ich Lehm bauen will, dann habe ich Lehm in der Hand und wahrscheinlich macht der Clonk "HoldWalk".
gut wunderbar, dann ist das Rätsel also gelöst, danke
Kannst du ein paar Vorschläge bringen, wodurch der Sichtradius des Clonks beeinflusst werden könnte? Also "View" und "range" stehen wie gesagt nirgends im Skript. Was könnte da noch stehen? Oder könnte es vllt doch woanders geregelt sein ? (wobei, wenn ich das EPIC Clonkskript mit dem alten clonkskript ersetze, dann ist die Sicht wieder normal, obwohl der Rest noch zum Epic Clonk gehört. Allerdings sagt das wie wir gerade beim Lehmbeispiel gesehen haben nicht soviel aus, weil durch die Änderung des Skripts gleichzeitig "Holdwalk" in der actMApt ausgeschaltet wird)