Initial Emesary convertion (incomplete)
This commit is contained in:
@@ -0,0 +1,260 @@
|
||||
#
|
||||
#
|
||||
# Use to transmit events that happen at a specific place; can be used to make
|
||||
# models that are simulated locally (e.g. tankers) appear on other player's MP sessions.
|
||||
var ArmamentNotification_Id = 19;
|
||||
|
||||
var ArmamentNotification =
|
||||
{
|
||||
# new:
|
||||
# _ident - the identifier for the notification. not bridged.
|
||||
# _name - name of the notification, bridged.
|
||||
# _kind - created, moved, deleted, impact (see notifications.nas)
|
||||
# _secondary_kind - This is the entity on which the activity is being performed. See below for predefined types.
|
||||
##
|
||||
new: func(_ident="none", _kind=0, _secondary_kind=0)
|
||||
{
|
||||
var new_class = emesary.Notification.new("ArmamentNotification", _ident, ArmamentNotification_Id);
|
||||
|
||||
new_class.Kind = _kind;
|
||||
new_class.SecondaryKind = _secondary_kind;
|
||||
new_class.RelativeAltitude = 0;
|
||||
new_class.IsDistinct = 0;
|
||||
new_class.Distance = 0;
|
||||
new_class.Bearing = 0;
|
||||
new_class.RemoteCallsign = ""; # associated remote callsign.
|
||||
|
||||
new_class.bridgeProperties = func
|
||||
{
|
||||
return
|
||||
[
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Kind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Kind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.SecondaryKind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.SecondaryKind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(new_class.RelativeAltitude,2,1/10);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,2,1/10,pos);new_class.RelativeAltitude=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(new_class.Distance,2,1/10);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,2,1/10,pos);new_class.Distance=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(geo.normdeg180(new_class.Bearing),1,1.54);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,1,1.54,pos);new_class.Bearing=geo.normdeg(dv.value);return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferString.encode(new_class.RemoteCallsign);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferString.decode(v,pos);new_class.RemoteCallsign=dv.value;return dv},
|
||||
},
|
||||
];
|
||||
};
|
||||
return new_class;
|
||||
},
|
||||
};
|
||||
|
||||
var ArmamentInFlightNotification_Id = 21;
|
||||
var ArmamentInFlightNotification =
|
||||
{
|
||||
# new:
|
||||
# _ident - the identifier for the notification. not bridged.
|
||||
# _name - name of the notification, bridged.
|
||||
# _kind - created, moved, deleted (see below). This is the activity that the notification represents, called kind to avoid confusion with notification type.
|
||||
# _secondary_kind - This is the entity on which the activity is being performed. See below for predefined types.
|
||||
#
|
||||
# UniqueIdentity - an identity that is unique to the sending instance of FG. Can be combined with the callsign to create an MP unique ID.
|
||||
##
|
||||
new: func(_ident="none", _unique=0, _kind=0, _secondary_kind=0)
|
||||
{
|
||||
var new_class = emesary.Notification.new("ArmamentInFlightNotification", _ident, ArmamentInFlightNotification_Id);
|
||||
|
||||
new_class.Kind = _kind;
|
||||
new_class.SecondaryKind = _secondary_kind;
|
||||
new_class.Position = geo.aircraft_position();
|
||||
new_class.UniqueIndex = 0;
|
||||
|
||||
new_class.Heading = 360;
|
||||
new_class.Pitch = 90;
|
||||
new_class.u_fps = 0;
|
||||
new_class.IsDistinct = 0;
|
||||
new_class.Callsign = nil; # populated automatically by the incoming bridge when routed
|
||||
new_class.RemoteCallsign = ""; # associated remote callsign.
|
||||
new_class.Flags = 0; # 8 bits for whatever.
|
||||
new_class.UniqueIdentity = _unique;
|
||||
|
||||
new_class.GetBridgeMessageNotificationTypeKey = func {
|
||||
return new_class.NotificationType~"."~new_class.Ident~"."~new_class.UniqueIndex;
|
||||
};
|
||||
new_class.bridgeProperties = func
|
||||
{
|
||||
return
|
||||
[
|
||||
{
|
||||
getValue:func{return emesary.TransferCoord.encode(new_class.Position);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferCoord.decode(v, pos);new_class.Position=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Kind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Kind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.SecondaryKind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.SecondaryKind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
#0..6696 fps (3967kts), mach 6.1 (SL) - factor 0.03703
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(new_class.u_fps-3348,1,1/0.03703);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,1,1/0.03703,pos);new_class.u_fps=dv.value+3348;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(geo.normdeg180(new_class.Heading),1,1.54);},#1.0/0.65
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,1,1.54,pos);new_class.Heading=geo.normdeg(dv.value);return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(new_class.Pitch, 1, 1/1.38);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,1, 1/1.38, pos);new_class.Pitch=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferString.encode(new_class.RemoteCallsign);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferString.decode(v,pos);new_class.RemoteCallsign=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Flags);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Flags=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.UniqueIdentity);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.UniqueIdentity=dv.value;return dv},
|
||||
},
|
||||
|
||||
];
|
||||
};
|
||||
return new_class;
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
var StaticNotification_Id = 25;
|
||||
var StaticNotification =
|
||||
{
|
||||
# new:
|
||||
# _ident - the identifier for the notification. not bridged.
|
||||
# _kind - created, moved, deleted (see below). This is the activity that the notification represents, called kind to avoid confusion with notification type.
|
||||
# _secondary_kind - This is the entity on which the activity is being performed. See below for predefined types.
|
||||
#
|
||||
# UniqueIdentity - an identity that is unique to the sending instance of FG. Can be combined with the callsign to create an MP unique ID.
|
||||
##
|
||||
new: func(_ident="stat", _unique=0, _kind=0, _secondary_kind=0)
|
||||
{
|
||||
var new_class = emesary.Notification.new("StaticNotification", _ident, StaticNotification_Id);
|
||||
# _ident -> "stat"
|
||||
new_class.UniqueIdentity = _unique; # random from 0 to 15000000 that identifies each static object
|
||||
new_class.Kind = _kind; # 1=create, 2=move, 3=delete, 4=request_all
|
||||
new_class.SecondaryKind = _secondary_kind; # 0 = small crater, 1 = big crater, 2 = smoke
|
||||
new_class.IsDistinct = 0; # keep it 0
|
||||
new_class.Callsign = nil; # populated automatically by the incoming bridge when routed
|
||||
|
||||
new_class.Position = geo.aircraft_position(); # position
|
||||
new_class.Heading = 360; # heading
|
||||
new_class.Flags1 = 0; # 7 bits for whatever.
|
||||
new_class.Flags2 = 0; # 7 bits for whatever.
|
||||
|
||||
new_class.GetBridgeMessageNotificationTypeKey = func {
|
||||
return new_class.NotificationType~"."~new_class.Ident~"."~new_class.UniqueIdentity;
|
||||
};
|
||||
new_class.bridgeProperties = func
|
||||
{
|
||||
return
|
||||
[
|
||||
{
|
||||
getValue:func{return emesary.TransferCoord.encode(new_class.Position);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferCoord.decode(v, pos);new_class.Position=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Kind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Kind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.SecondaryKind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.SecondaryKind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferFixedDouble.encode(geo.normdeg180(new_class.Heading),1,1.54);},#1.0/0.65
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferFixedDouble.decode(v,1,1.54,pos);new_class.Heading=geo.normdeg(dv.value);return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Flags1);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Flags1=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Flags2);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Flags2=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferInt.encode(new_class.UniqueIdentity,3);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferInt.decode(v,3,pos);new_class.UniqueIdentity=dv.value;return dv},
|
||||
},
|
||||
];
|
||||
};
|
||||
return new_class;
|
||||
},
|
||||
};
|
||||
|
||||
var ObjectInFlightNotification_Id = 22;
|
||||
var ObjectInFlightNotification =
|
||||
{
|
||||
# new:
|
||||
# _ident - the identifier for the notification. not bridged.
|
||||
# _name - name of the notification, bridged.
|
||||
# _kind - created, moved, deleted (see below). This is the activity that the notification represents, called kind to avoid confusion with notification type.
|
||||
# _secondary_kind - This is the entity on which the activity is being performed. See below for predefined types.
|
||||
#
|
||||
# UniqueIdentity - an identity that is unique to the sending instance of FG. Can be combined with the callsign to create an MP unique ID.
|
||||
##
|
||||
new: func(_ident="none", _unique=0, _kind=0, _secondary_kind=0)
|
||||
{
|
||||
var new_class = emesary.Notification.new("ObjectInFlightNotification", _ident, ObjectInFlightNotification_Id);
|
||||
|
||||
new_class.Kind = _kind;
|
||||
new_class.SecondaryKind = _secondary_kind;
|
||||
new_class.Position = geo.aircraft_position();
|
||||
new_class.UniqueIndex = 0;
|
||||
new_class.IsDistinct = 1;
|
||||
new_class.Callsign = nil; # populated automatically by the incoming bridge when routed
|
||||
new_class.UniqueIdentity = _unique;
|
||||
|
||||
new_class.GetBridgeMessageNotificationTypeKey = func {
|
||||
return new_class.NotificationType~"."~new_class.Ident~"."~new_class.UniqueIndex;
|
||||
};
|
||||
new_class.bridgeProperties = func
|
||||
{
|
||||
return
|
||||
[
|
||||
{
|
||||
getValue:func{return emesary.TransferCoord.encode(new_class.Position);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferCoord.decode(v, pos);new_class.Position=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.Kind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.Kind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.SecondaryKind);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.SecondaryKind=dv.value;return dv},
|
||||
},
|
||||
{
|
||||
getValue:func{return emesary.TransferByte.encode(new_class.UniqueIdentity);},
|
||||
setValue:func(v,root,pos){var dv=emesary.TransferByte.decode(v,pos);new_class.UniqueIdentity=dv.value;return dv},
|
||||
},
|
||||
|
||||
];
|
||||
};
|
||||
return new_class;
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,84 @@
|
||||
# Emesary bridged transmitter for armament notifications.
|
||||
#
|
||||
# Richard Harrison 2017
|
||||
#
|
||||
# NOTES:
|
||||
# 1.The incoming bridges that is defined here will apply to all models that
|
||||
# are loaded over MP; it is better to create the bridges here rather than in the model.xml
|
||||
# So given that we don't want a bridge on all MP models only those that are on OPRF
|
||||
# aircraft that want to receive notifications we will create the incoming bridge here
|
||||
# and thus only an OPRF model will receive notifications from another OPRF model.
|
||||
#
|
||||
# 2. The Emesary MP bridge requires two sides; the outgoing and incoming.
|
||||
# - The outgoing aircraft will forwards all received notifications via MP;
|
||||
# and these will be received by a similarly equipped craft.
|
||||
# - The receiving aircraft will receive all notifications from other MP craft via
|
||||
# the globalTransmitter - which is bridged via property #18 /sim/multiplay/emesary/bridge[18]
|
||||
#------------------------------------------------------------------------------------------
|
||||
|
||||
# Setup the bridge
|
||||
# armament notification 24 bytes
|
||||
# geoEventNotification - 34 bytes + the length of the RemoteCallsign and Name fields.
|
||||
#NOTE: due to bug in Emesary MP Bridge (fixed in 2019.2 after 24/3/2020) we can only
|
||||
# reliably send one message type per bridge - so for the maximum compatibility
|
||||
# we will use two bridges.
|
||||
# If at some point in the future we target 2019.2 as a min ver we can use a single
|
||||
# bridge and setup the notification list to contain all of the armament hit/flying notifications
|
||||
#i.e. change to [notifications.ArmamentInFlightNotification.new(nil), notifications.ArmamentNotification.new(nil)];
|
||||
var geoRoutedNotifications = [notifications.ArmamentInFlightNotification.new()];
|
||||
var geoBridgedTransmitter = emesary.Transmitter.new("geoOutgoingBridge");
|
||||
var geooutgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new("f16mp.geo",geoRoutedNotifications, 18, "", geoBridgedTransmitter);
|
||||
|
||||
# bridge should be tuned to be around 90% of the packet size full.
|
||||
geooutgoingBridge.TransmitFrequencySeconds = 0.75;
|
||||
geooutgoingBridge.MPStringMaxLen = 150;
|
||||
emesary_mp_bridge.IncomingMPBridge.startMPBridge(geoRoutedNotifications, 18, emesary.GlobalTransmitter);
|
||||
|
||||
|
||||
#----- bridge hit (armament) notifications
|
||||
var hitRoutedNotifications = [notifications.ArmamentNotification.new(),notifications.StaticNotification.new()];
|
||||
var hitBridgedTransmitter = emesary.Transmitter.new("armamentNotificationBridge");
|
||||
var hitoutgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new("f16mp.hit",hitRoutedNotifications, 19, "", hitBridgedTransmitter);
|
||||
hitoutgoingBridge.TransmitFrequencySeconds = 1.5;
|
||||
hitoutgoingBridge.MPStringMaxLen = 120;
|
||||
emesary_mp_bridge.IncomingMPBridge.startMPBridge(hitRoutedNotifications, 19, emesary.GlobalTransmitter);
|
||||
|
||||
#----- bridge object notifications
|
||||
var objectRoutedNotifications = [notifications.ObjectInFlightNotification.new()];
|
||||
var objectBridgedTransmitter = emesary.Transmitter.new("objectNotificationBridge");
|
||||
var objectoutgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new("f16mp.object",objectRoutedNotifications, 17, "", objectBridgedTransmitter);
|
||||
objectoutgoingBridge.TransmitFrequencySeconds = 0.2;
|
||||
objectoutgoingBridge.MessageLifeTime = 1;
|
||||
objectoutgoingBridge.MPStringMaxLen = 150;
|
||||
emesary_mp_bridge.IncomingMPBridge.startMPBridge(objectRoutedNotifications, 17, emesary.GlobalTransmitter);
|
||||
|
||||
#
|
||||
# debug all messages - this can be removed when testing isn't required.
|
||||
var debugRecipient = emesary.Recipient.new("Debug");
|
||||
debugRecipient.Receive = func(notification)
|
||||
{
|
||||
if (notification.NotificationType != "FrameNotification") {
|
||||
print ("recv(0): type=",notification.NotificationType, " fromIncoming=",notification.FromIncomingBridge);
|
||||
|
||||
if (notification.NotificationType == "ArmamentInFlightNotification") {
|
||||
print("recv(1): ",notification.NotificationType, " ", notification.Ident);
|
||||
debug.dump(notification);
|
||||
|
||||
} else if (notification.NotificationType == "ArmamentNotification") {
|
||||
if (notification.FromIncomingBridge) {
|
||||
print("recv(2): ",notification.NotificationType, " ", notification.Ident,
|
||||
" Kind=",notification.Kind,
|
||||
" SecondaryKind=",notification.SecondaryKind,
|
||||
" RelativeAltitude=",notification.RelativeAltitude,
|
||||
" Distance=",notification.Distance,
|
||||
" Bearing=",notification.Bearing,
|
||||
" RemoteCallsign=",notification.RemoteCallsign);
|
||||
debug.dump(notification);
|
||||
}
|
||||
}
|
||||
}
|
||||
return emesary.Transmitter.ReceiptStatus_NotProcessed; # we're not processing it, just looking
|
||||
}
|
||||
# uncomment next line to activate debug recipient.
|
||||
#emesary.GlobalTransmitter.Register(debugRecipient);
|
||||
|
||||
Executable → Regular
+1096
-408
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user