Profile image

Funky Trees!

Dev WNP78  2.5 years ago

Andrew decided to call the new inputs system I cooked up "funky trees". Somehow escapes me why, but I'll roll with it. Here I'll describe what you can do in the land of funk.

Essentially what this means is that you can enter any mathematical expression (following this syntax) into an input field and it will be evaluated every frame. You can pull in data from a variety of sources, and process these how you like.


What you can now do is use the normal input axes:

  • Pitch
  • Roll
  • Yaw
  • Throttle
  • Brake
  • Trim
  • VTOL
  • LandingGear
  • FireGuns
  • FireWeapons
  • LaunchCountermeasures
  • Activate1
  • Activate2
  • Activate3
  • Activate4
  • Activate5
  • Activate6
  • Activate7
  • Activate8

Flight data

In addition to this you can access some information from the aircraft:

  • Altitude - Aircraft's altitude in metres
  • AltitudeAgl - Aircraft's altitude above ground level in metres
  • GS - The speed relative to the ground (m/s)
  • IAS - The speed relative to the air, adjusted for the desnity of the air (m/s)
  • TAS - The speed relative to the air (m/s)
  • Fuel - The amount of fuel remaining as a proportion of capacity (0 to 1)
  • AngleOfAttack - The angle of attack (angle airflow vertically meets the boresight) in degrees
  • AngleOfSlip - The horizontal equivalent of angle of attack (degrees)
  • PitchAngle - The pitch of the aircraft (degrees)
  • RollAngle - The roll of the aircraft (degrees)
  • Heading - The heading of the aircraft (degrees)
  • Time - The time since the level loaded (seconds)
  • GForce - The acceleration and gravitational "force" acting on the cockpit in G. I know it's not a force. Shut up.
  • VerticalG - The signed vertical component of the "G Force".
  • SelectedWeaponName - The name of the selected weapon
  • Latitude - The North/South position of the craft (metres)
  • Longitude - The East/West position of the craft (metres)
  • PitchRate - The pitch angular velocity in degrees/second
  • YawRate - The yaw angular velocity in degrees/second
  • RollRate - The roll angular velocity in degrees/second (these 3 inputs are better than using rate(PitchAngle) etc, because they account for wrapping around the angle, as well as being in local space: rate(Heading) is different to YawRate)
  • TargetSelected - true if a target is selected, else false.
  • TargetHeading - the heading to the selected target in degrees.
  • TargetElevation - the vertical angle to the selected target in degrees.
  • TargetDistance - the distance to the selected target in metres.


Values that are always the same:

  • pi the mathematical constant pi (half a tau, if you will).
  • e the mathematical constant e.
  • true a true boolean value
  • false a false boolean value


These are useful for... maths or something.

  • Mathematical:

    • +, - addition and subtraction (- can be used as a unary operator, for instance -Pitch

    • *, / multiplication and division

  • Comparison:

    • <, > less than, greater than

    • <=, >= less than or equal to, greater than or equal to

    • ==, != equal to, not equal to

  • Boolean:

    • &, AND

    • |, OR

    • !, NOT (this is a unary operator)

    • Ternary operator: condition ? value_if_true : value_if_false - this chooses between two values based on the condition.


Finally, there's some helpful functions to do maths for you!

  • abs(x) - The absolute (positive) value of x.
  • ammo(name) - The amount of ammo of the weapon with name. Remember to put the name in " quotes.
  • ceil(x) - x rounded up to an integer.
  • clamp(x, min, max) - x clamped between min and max.
  • clamp01(x) - Equivalent to clamp(x, 0, 1).
  • deltaangle(a, b) - The shortest angle delta between angles a and b in degrees.
  • exp(x) - Returns e raised to the power of x.
  • floor(x) - x rounded down to an integer.
  • inverselerp(a, b, x) - Calculates the linear parameter t that produces the interpolant value within the range [a, b].
  • lerp(a, b, t) - Linearly interpolates between a and b, by a proportion of t.
  • lerpangle(a, b, t) - Similar to lerp, but interpolates correctly when values pass 360 degrees.
  • lerpunclamped(a, b, t) - Similar to lerp, but doesn't clamp the value between a and b.
  • log(x, p) - The logarithm of x in base p.
  • log10(x) - Equivalent to log(x, 10).
  • pingpong(x, l) - "Ping-pongs" the value x so it is never larger than l and never less than 0.
  • max(a, b) - The largest value between a and b.
  • min(a, b) - The smallest value between a and b.
  • pow(x, p) - x raised to the power of p.
  • repeat(x, l) - Loops the value x so it is never larger than l and never less than 0.
  • round(x) - Rounds x to the nearest integer.
  • sign(x) - The sign of x (1 if x positive, -1 if x negative)
  • smoothstep(a, b, t) - Similar to lerp, but with smoothing at the ends.
  • sqrt(x) - The square root of x.
  • sin(x) - The sine of x (degrees)
  • cos(x) - The cosine of x (degrees)
  • tan(x) - The tangent of x (degrees)
  • asin(x) - The arc-sine of x (degrees)
  • acos(x) - The arc-cosine of x (degrees)
  • atan(x) - The arc-tangent of x (degrees)

Memory Functions

These are functions that are special because their output not only depends on inputs but their previous state.
- sum(x) - Returns the sum of all it's inputs over time (the integral of x)
- rate(x) - Returns the rate of change of x relative to its value last frame (the derivative of x)
- smooth(x, t) - When loaded, it's output is set to x. As x changes, the output tries to move to x, but at a rate of no greater than t. This is vaguely equivalent to changing the speed of a rotator.
- PID(target, current, p, i , d) - Evaluates a PID controller with the setpoint of "target", process variable "current" and the gains p, i, and d. Equivalent to: p * (target - current) + i * sum(target - current) - d * rate(current)

With all of these at your disposal, I'm excited to see what kind of contraptions you guys come up with, and I'm also open to some suggestions as to some things that could be added.

-WNP78, your funk master.

  • Log in to leave a comment
  • Profile image
    888 Khanhlam

    @WNP78 Do you think about a system that detects error with funky tree? I kinda messed up alot and had to write the code again.

    17 hours ago
  • Profile image
    0 Xbacon

    Does anyone know how to make a piston look like shock?

  • Profile image
    0 lizhei


  • Profile image
    2,887 Darg12e

    can someone fix this code?
    its for my su 27 i need this to only go halfway on a rotator(its good) but the problem is its unstable for my su27 it does unnecessary adjustment when u pitch up it does not counter it it stays theyre before countering it i need it to counter it. its like a flyby wire idk

    (Pitch) * (Activate1 ? 2 : 1) + clamp(PitchRate/100 ,-1,1) * (abs(AngleOfSlip) > 90 ? -1 : 1) + Roll

    2 days ago
  • Profile image
    1,854 Lake

    @WNP78 sorry to interrupt buy what does quote do?

    2 days ago
  • Profile image
    1,854 Lake

    @WNP78 thanks I was going to make a wing gun with limited ammo.

    3 days ago
  • Profile image
    Dev WNP78

    @Lake that's just the website formatting glitching. if you put " inside code block it shows as &quot;. I changed the text to be bold so it doesn't do that

    +1 3 days ago
  • Profile image
    1,854 Lake

    Someone please explain the &quot

    3 days ago
  • Profile image

    This will delay action by one second before Actuating, the same will happen with retraction. It’s scrappy but I hope it suits your purpose.

    +1 3 days ago
  • Profile image

    @SkyJayTheFirst do you mean a one second delay before it begins to move or takes one second to fully actuate?

    +1 3 days ago
  • Profile image

    @Darg12e I'm wondering the same thing, but nobody has answered my question.

    +1 4 days ago
  • Profile image
    2,887 Darg12e

    is there a way to add a delay to an airbreak part?

    like the input is Activate1 but it will have a 1 second delay

    4 days ago
  • Profile image

    @WNP78 that is pretty cool

    4 days ago
  • Profile image

    @WNP78 is there a formula I can use in an aircraft for mixture that essentially the lower it goes lowers the ma rpm, while still being at full throttle, like for example if the mixture was open (high) it would use 100% of the engines power, but if it was closed or lower, it would use less than 100%?

    5 days ago
  • Profile image

    @WoodPlaneBuilder GeE, i WoUlDn'T hAvE gUeSsEd! I mean how would I do it with Overload.

    9 days ago
  • Profile image
    47 Ramme

    I need help with the labels with funky tree

    10 days ago
  • Profile image

    @@SkyJayTheFirst use overload for that

    16 days ago
  • Profile image

    How would I set a delay to something when I activate it?

    17 days ago
  • Profile image
    1,402 toorbokkot

    I want to make two working modes for the rotator: automatic and manual, how can I do it?

    17 days ago
  • Profile image

    Use the input LandingGear

    19 days ago
  • Profile image

    How can I make a hinge rotator activate when I press the gear symbol on mobile

    20 days ago
  • Profile image

    @Louisianaboy2021024 that looks like an interesting command to me what r u trying to do with that lol?

    22 days ago
  • Profile image

    @WNP78 oh

    22 days ago
  • Profile image
    Dev WNP78

    @Louisianaboy2021024 that looks like part of a dev console command, not an FT variable.

    22 days ago
  • Profile image

    Where do I put the variable MissileLauncherLeft>MissileLauncherScript>set. enabled false at?

    +2 22 days ago
  • Log in to see more comments