Files
flightgear-addon-missions/Nasal/extensions/gate_race_point.nas
T
2017-10-25 16:45:58 +03:00

89 lines
1.8 KiB
Plaintext

mission.extension_add("MissionObject", {
type: "gate-race-point",
new: func(n) {
var m = {
parents : [me],
name : n.getValue("name"),
activated : mission.get(n, "activated", 0),
heading : mission.get(n, "orientation/heading-deg", 0),
ignore_dist : mission.get(n, "ignore-distance-m", 100),
enter_actions : n.getNode("on-enter-actions"),
penalty_actions : n.getNode("on-penalty-actions"),
height : mission.get(n, "height-m", 20.0),
width : mission.get(n, "width-m", 20.0),
coord : mission.get_coord(n.getNode("world-position")),
_direct_dist : nil,
_norm_dist : 0,
_h_dist : nil,
_v_dist : nil,
_prev_norm_dist : nil,
};
m.timer = maketimer(0.5, func m._loop());
return m;
},
# init: func {
# if (me.activated)
# me.start();
# },
start: func {
me.timer.start();
},
stop: func {
me.timer.stop();
},
del: func {
me.stop();
},
_loop: func {
me._update();
},
_update: func {
var ac_coord = geo.aircraft_position();
me._direct_dist = me.coord.direct_distance_to(ac_coord);
var hdg = me.heading * D2R;
var crs = me.coord.course_to(ac_coord) * D2R;
me._v_dist = ac_coord.alt() - me.coord.alt();
var d = math.sqrt(me._direct_dist * me._direct_dist - me._v_dist * me._v_dist);
me._prev_norm_dist = me._norm_dist;
me._norm_dist = math.cos(hdg - crs) * d;
if (me._prev_norm_dist >= 0)
return;
if (me._norm_dist < 0)
return;
me._h_dist = math.sin(hdg - crs) * d;
if (math.abs(me._h_dist) > me.width/2)
return;
if (math.abs(me._v_dist) > me.height)
return;
if (me.enter_actions != nil)
mission.activate_object_group(me.enter_actions);
me.stop();
setprop("/sim/mission/race/signals/next-race-point", 1);
},
}); #extension_add