94 lines
3.2 KiB
Plaintext
94 lines
3.2 KiB
Plaintext
#
|
|
# Aerotow Everywhere - Add-on for FlightGear
|
|
#
|
|
# Written and developer by Roman Ludwicki (PlayeRom, SP-ROM)
|
|
#
|
|
# Copyright (C) 2022 Roman Ludwicki
|
|
#
|
|
# Aerotow Everywhere is an Open Source project and it is licensed
|
|
# under the GNU Public License v3 (GPLv3)
|
|
#
|
|
|
|
var Thermal = {
|
|
#
|
|
# Constructor
|
|
#
|
|
# addon - Addon object
|
|
# message - Message object
|
|
#
|
|
new: func (addon, message) {
|
|
var obj = { parents: [Thermal] };
|
|
|
|
obj.addon = addon;
|
|
obj.addonNodePath = addon.node.getPath();
|
|
obj.message = message;
|
|
obj.listeners = [];
|
|
|
|
# Listener for calculate distance from meters to nautical miles.
|
|
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/distance-m", func (node) {
|
|
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/distance-nm", node.getValue() * globals.M2NM);
|
|
}));
|
|
|
|
# Listener for calculate strength from ft/s to m/s.
|
|
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/strength-fps", func (node) {
|
|
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/strength-mps", node.getValue() * globals.FPS2KT * globals.KT2MPS);
|
|
}));
|
|
|
|
# Listener for calculate diameter from ft to m.
|
|
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/diameter-ft", func (node) {
|
|
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/diameter-m", node.getValue() * globals.FT2M);
|
|
}));
|
|
|
|
# Listener for calculate height from ft to m.
|
|
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/height-msl", func (node) {
|
|
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/height-msl-m", node.getValue() * globals.FT2M);
|
|
}));
|
|
|
|
return obj;
|
|
},
|
|
|
|
#
|
|
# Destructor
|
|
#
|
|
del: func () {
|
|
foreach (var listener; me.listeners) {
|
|
removelistener(listener);
|
|
}
|
|
},
|
|
|
|
#
|
|
# Add thermal 300 m before glider position.
|
|
#
|
|
# Return 1 on successful, otherwise 0.
|
|
#
|
|
add: func () {
|
|
var heading = getprop("/orientation/heading-deg") or 0;
|
|
var distance = getprop(me.addonNodePath ~ "/addon-devel/add-thermal/distance-m") or 300;
|
|
|
|
var position = geo.aircraft_position();
|
|
position.apply_course_distance(heading, distance);
|
|
|
|
# Get random layer from 1 to 4
|
|
var layer = int(rand() * 4) + 1;
|
|
|
|
var args = props.Node.new({
|
|
"type": "thermal",
|
|
"model": "Models/Weather/altocumulus_layer" ~ layer ~ ".xml",
|
|
"latitude": position.lat(),
|
|
"longitude": position.lon(),
|
|
"strength-fps": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/strength-fps") or 16.0,
|
|
"diameter-ft": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/diameter-ft") or 4000,
|
|
"height-msl": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/height-msl") or 9000,
|
|
"search-order": "DATA_ONLY"
|
|
});
|
|
|
|
if (fgcommand("add-aiobject", args)) {
|
|
me.message.success("The thermal has been added");
|
|
return 1;
|
|
}
|
|
|
|
me.message.error("Adding thermal failed");
|
|
return 0;
|
|
},
|
|
};
|