99 lines
2.7 KiB
Text
99 lines
2.7 KiB
Text
|
# Class things:
|
||
|
var name = 'TFC';
|
||
|
var parents = [SymbolLayer.Controller];
|
||
|
var __self__ = caller(0)[0];
|
||
|
SymbolLayer.Controller.add(name, __self__);
|
||
|
SymbolLayer.add(name, {
|
||
|
parents: [SymbolLayer],
|
||
|
type: name, # Symbol type
|
||
|
df_controller: __self__, # controller to use by default -- this one
|
||
|
});
|
||
|
|
||
|
var model_root = props.globals.getNode("/ai/models/");
|
||
|
|
||
|
var new = func(layer) {
|
||
|
var m = {
|
||
|
parents: [__self__],
|
||
|
layer: layer,
|
||
|
listeners: [],
|
||
|
query_range_nm: 25,
|
||
|
};
|
||
|
# Listen to ai model events
|
||
|
append(m.listeners, setlistener(
|
||
|
model_root.getNode("model-added"), func(n) {
|
||
|
var node = props.globals.getNode(n.getValue());
|
||
|
var name = node.getName();
|
||
|
if (name == "aircraft" or name == "multiplayer")
|
||
|
layer.onAdded(TrafficModel.new(node));
|
||
|
}
|
||
|
));
|
||
|
append(m.listeners, setlistener(
|
||
|
model_root.getNode("model-removed"), func(n) {
|
||
|
var node = props.globals.getNode(n.getValue());
|
||
|
var name = node.getName();
|
||
|
if (name == "aircraft" or name == "multiplayer")
|
||
|
layer.onRemoved(TrafficModel.new(node));
|
||
|
}
|
||
|
));
|
||
|
layer.searcher._equals = func(l,r) l.equals(r);
|
||
|
return m;
|
||
|
};
|
||
|
var del = func() {
|
||
|
#print(name~".lcontroller.del()");
|
||
|
foreach (var l; me.listeners)
|
||
|
removelistener(l);
|
||
|
};
|
||
|
|
||
|
var TrafficModel = {
|
||
|
new: func(node, id=nil, layer=nil) {
|
||
|
if (id == nil) id = node.getValue("id");
|
||
|
var m = {
|
||
|
# Note: because this inherits from props.Node, Symbol.Controller.equals
|
||
|
# will call l.equals(r) -- the one defined below
|
||
|
parents: [TrafficModel, geo.Coord, node],
|
||
|
id: id,
|
||
|
node: node,
|
||
|
pos: node.getNode("position"),
|
||
|
};
|
||
|
if (m.pos == nil)
|
||
|
m.latlon = func [nil,nil,nil];
|
||
|
return m;
|
||
|
},
|
||
|
equals: func(other) other.id == me.id,
|
||
|
latlon: func() {
|
||
|
return [
|
||
|
me.pos.getValue("latitude-deg"),
|
||
|
me.pos.getValue("longitude-deg"),
|
||
|
me.pos.getValue("altitude-ft")
|
||
|
];
|
||
|
},
|
||
|
};
|
||
|
|
||
|
var searchCmd = func {
|
||
|
# TODO: this would be a good candidate for splitting across frames
|
||
|
#print("Doing query: "~name);
|
||
|
|
||
|
var result = [];
|
||
|
var pos = geo.Coord.new(); # FIXME: all of these should be instance variables
|
||
|
var myPosition = geo.Coord.new();
|
||
|
# FIXME: need a Map Controller for this, and all query_range's/get_position's
|
||
|
var myPositionVec = me.get_position();
|
||
|
myPosition.set_latlon( myPositionVec[0], myPositionVec[1]);
|
||
|
var max_dist_m = me.query_range()*NM2M;
|
||
|
|
||
|
# AI and Multiplayer traffic
|
||
|
foreach (var traffic; [model_root.getChildren("aircraft"), model_root.getChildren("multiplayer")])
|
||
|
foreach(var t; traffic) {
|
||
|
pos.set_latlon(t.getValue("position/latitude-deg"),
|
||
|
t.getValue("position/longitude-deg"));
|
||
|
|
||
|
if (pos.distance_to( myPosition ) <= max_dist_m )
|
||
|
append(result, TrafficModel.new(t, nil, me.layer));
|
||
|
}
|
||
|
|
||
|
#debug.dump(result);
|
||
|
#return [];
|
||
|
return result;
|
||
|
};
|
||
|
|