[Gelöst] Abprallen vs hangeln an Tunneldecke

Ob ein Clonk sich zb an der Decke eines Tunnels festhält und hangelt, oder ob er davon abprallt, scheint von seiner Geschwindigkeit abzuhängen.

Nun ist das Problem, dass ich meine Clonks ein wenig schneller gemacht habe (walk wert höher gesetzt). Wenn ich nun direkt in einem normal gegrabenen horizontalen Tunnel stehe und springe, pralle ich von der Decke ab, anstatt mich daran festzuhalten. Unveränderte Clonks halten sich fest, so wie es sein soll.

Eigentlich sollte der schnellere Clonk besser sein. Aber durch diesen Abpraller ist er in komplexen Tunnelsystemem fast nicht mehr zu gebrauchen, da er nur selten dann hangelt, wenn er es soll…
Kann ich da was machen? Oder ist das alles hard gecodet und ich kann daran nichts ändern, dass er so schnell abprallt? (ich dachte jetzt daran die geforderte Geschwindigkeit fürs abprallen ein stück raufzusetzen)

Wenn du am Script bzw. an der DefCore was ändern willst, könntest du dir das bestimmt über ContactCalls (ContactTop, glaube ich) zurechthacken. Dafür musst du aber eben in die DefCore ContactCalls=1 einfügen - mit einem einfachen Appendto oder so geht das nicht.

PS:

>Oder ist das alles hard gecodet


Jupp, alles in der Engine

ob appendto oder defcore ist egal, hauptsache es geht iwie :slight_smile:

Ich nehme an ContactTop wird dann automatisch aufgerufen, wenn der Clonk die Decke berührt?Einmalig oder ständig in einer schleife, solange er die decke berührt? (wie ist contacttop definiert, also funktioniert das auch bei schrägen tunneln? )
Und dann könnte ich in dieser funktion dafür sorgen, dass der clonk hangelt? Geht das dann mit SetCommand?

Allerdings möchte ich da ja dennoch eine selbstgewählte Geschwindigkeitsbegrenzung haben… sobald ContactTop aufgerufen wird, ist die Geschwindigkeit vermutlich schon wieder Null, oder?

Hier ist die Dokuseite dazu, auch wenn das nicht soo ergiebig ist: http://www.clonk.de/docs/de/sdk/definition/cnat.html

Der Clonk hat verschiedene Berührungspunkte mit der Landschaft (die Vertices). Davon ist einer als “oben” definiert (siehe DefCore - VertexCNAT). Wenn dieser Vertex jetzt festes Material berührt (und vorher keines berührt hatte), dann wird einmal die Funktion ContactTop aufgerufen.

Im Gegensatz zu Hit ist in der Funktion die Geschwindigkeit noch nicht zurückgesetzt! So funktioniert zB der Fallschaden im EKE Pack.
Dadrin könntest du dann gegebenenfalls die Geschwindigkeit auf 0 setzen, oder die Aktion “Hangle” selbst setzen oder so. Irgendwas wird schon funktionieren

func Hit()
{
  if (GetContact (0, -1, CNAT_Top)) SetAction("Walk");
}


Koennte gehen, hat aber bestimmt komische Nebeneffekte :slight_smile:

Danke Zapper und auch danke an Sven2 :slight_smile:

mit ContactTop und SetAction("Hangle") lässt es sich lösen :slight_smile:

protected func ContactTop()
{
if(Abs(GetYDir()) > 26 && Abs(GetYDir()) < 50) 
SetAction("Hangle");
}

26 weil der clonk mit einer geschwindigket kleiner 26 aufjedenfall noch von alleine hangelt und 50 so als grob geschätzter wert, bis wohin es noch gehen soll, bei 36 prallt man bereits ab

obs auch mit der Hit() Konstruktion geht, hab ich nicht getestet, möchte aber auch keine komischen Nebeneffekte :smiley:

> 26 weil der clonk mit einer geschwindigket kleiner 26 aufjedenfall noch von alleine hangelt


Das Script ist aber nicht gleich deinem Kommentar. Jetzt setzt du Hangeln fuer Werte zwischen 27 und 49. Ausserdem interessieren dich ja nur negative Werte; da geht auch einfach:

if (Inside(GetYDir(), -50, -26)) SetAction("Hangle");

ja ich hab schon überlegt, ob das abs() nötig ist und ich nicht einfach nur negative werte betrachte… aber da es unwahrscheinlich/nicht möglich ist, dass ContactTop mit einer positiven Geschwindigkeit ausgeführt wird, dachte ich mir, dass es egal ist :D   Aber sicherheitshalber passe ich das mal für negative Werte an :wink: "Inside()" kannte ich noch nicht, das ist natürlich hilfreich, danke :slight_smile:

Aber wieso entspricht das Script nicht dem Kommentar? Es war schon sinn der Sache Hangeln für Werte zwischen 27 und 49 zu setzen (bzw. negativ).  Oder meinst du ich hätte >= und <= nehmen sollen?  Auf ±1 kommt es zum glück nicht an, da es recht grob gewählte werte sind, die ich evlt noch anpassen muss :wink: