public void DummyTest() { NetGroup group = new NetGroup { MeetupName = "wrocnet", City = "Wrocław" }; Assert.Same(group.City, "Wrocław"); }
public void ShouldFetchDataFromMeetup() { NetGroup group = new NetGroup { MeetupName = "wrocnet", City = "Wrocław" }; var data = sut.GetDataFromMeetupPage(new List <NetGroup> { group }); Assert.NotEmpty(data); }
/// <summary> /// 绑定分组内容 /// </summary> public void BindDrop_Group() { NetGroup nGoup = new NetGroup(); DataSet ds = nGoup.GetGroupList(); if (ds != null) { int count = ds.Tables[0].Rows.Count; if (count > 0) { drop_groupList.Items.Clear(); for (int i = 0; i < count; i++) { this.drop_groupList.Items.Add(new ListItem(ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][0].ToString())); } } } }
public BucketGroup() { this.NetGroup = new(); }
public MySprite1() { var nc = new NetConnection(); nc.asyncError += e => { RaiseMessage("nc.asyncError: " + e.errorID); }; nc.ioError += e => { RaiseMessage("nc.ioError: " + e.errorID); }; nc.securityError += e => { RaiseMessage("nc.securityError: " + e.errorID); }; nc.netStatus += e => { RaiseMessage("nc.netStatus: " + e.info.code); if (e.info.code == "NetGroup.Connect.Success") { connected = true; RaiseMessage("connected"); return; } if (e.info.code == "NetConnection.Connect.Success") { // http://forums.adobe.com/message/2774620 // Click on the 'Administration' tab and Enable UPnP if it is disabled. // http://book.zi5.me/books/read/2473/295 // this does not simply work anymore??? var groupspec = new GroupSpecifier("myGroup/groupOne"); //groupspec.multicastEnabled = true; groupspec.addIPMulticastAddress("239.254.254.1:30000"); groupspec.ipMulticastMemberUpdatesEnabled = true; groupspec.postingEnabled = true; //groupspec.serverChannelEnabled = true; //groupspec.addIPMulticastAddress("225.225.0.1:30303"); var group = new NetGroup(nc, groupspec.groupspecWithAuthorizations()); //var group = new NetGroup(nc, groupspec.groupspecWithoutAuthorizations()); group.deactivate += ee => { RaiseMessage("group.deactivate"); }; Action <string> PostMessage = message => { if (connected) { RaiseMessage("write: " + message); group.post(message); group.sendToAllNeighbors(message); } else { RaiseMessage("skip: " + message); } }; AtPostMessage += PostMessage; group.netStatus += g => { RaiseMessage("group.netStatus: " + g.info.code); if (g.info.code == "NetGroup.Posting.Notify") { // Type Coercion failed: cannot convert Object@60b6cb9 to LANMulticast_Components_MySprite1__f__AnonymousType0_1_33554444. var k = (string)g.info.message; RaiseMessage("read: " + k); } }; return; } }; // http://stackoverflow.com/questions/5332762/rtmfp-and-firewalls-routers nc.connect("rtmfp:"); }
public async Task StepAsync(CancellationToken cancellationToken) { try { if (player != null) { var builder = new FlatBufferBuilder(1); lock (world.Bodies) // wrong kind of lock but might do for now { // First try to focus camera on the player if they have // a fleet alive; var followFleet = player?.Fleet; // if the player doesn't have a fleet alive if (followFleet == null) { // check to see if they are spectating a fleet that's alive if (SpectatingFleet != null && SpectatingFleet.Exists) { followFleet = SpectatingFleet; } } if (followFleet == null) { // find someone else to watch followFleet = Player.GetWorldPlayers(world) .ToList() .Where(p => p.IsAlive) .OrderByDescending(p => p.Score * 10000 + (10000 - p.Fleet?.ID ?? 0)) .FirstOrDefault() ?.Fleet; } Body followBody = null; // if we're watching a fleet, watch the center of their fleet if (followFleet != null) { if (world.Hook.FollowFirstShip) { followBody = followFleet.Ships.FirstOrDefault(); } else { var center = FleetMath.FleetCenterNaive(followFleet.Ships); followBody = new Body { DefinitionTime = world.Time, OriginalPosition = center, Position = center, Momentum = followFleet.FleetMomentum }; } } // we've found someone to spectate, record it if (followFleet != player?.Fleet && followFleet != SpectatingFleet) { SpectatingFleet = followFleet; } // if we haven't found anything to watch yet, watch the first ship we find if (followBody == null) { followBody = player?.World.Bodies.OfType <Ship>().FirstOrDefault(); } // if we haven't found anything to watch yet, watch anything if (followBody == null) { followBody = player?.World.Bodies.FirstOrDefault(); } if (followBody != null) { var size = 6000; var viewportHeight = size * 2; var viewportWidth = size * 2; var playerViewport = new Envelope( followBody.Position.X - viewportWidth / 2, followBody.Position.Y - viewportHeight / 2, followBody.Position.X + viewportWidth / 2, followBody.Position.Y + viewportHeight / 2 ); BodyCache.Update( world.BodiesNear(playerViewport).ToList(), world.Time ); var updates = BodyCache.BodiesByError(); var updateBodies = updates.Take((int)this.Bandwidth); float VELOCITY_SCALE_FACTOR = 5000; var updatedGroups = BodyCache.GroupsByError().ToList(); var groupsVector = NetWorldView.CreateGroupsVector(builder, updatedGroups.Select(b => { var serverGroup = b.GroupUpdated; var caption = builder.CreateString(serverGroup.Caption ?? " "); var color = builder.CreateString(serverGroup.Color ?? ""); var customData = builder.CreateString(serverGroup.CustomData ?? ""); var group = NetGroup.CreateNetGroup(builder, group: serverGroup.ID, type: (byte)serverGroup.GroupType, captionOffset: caption, zindex: serverGroup.ZIndex, owner: serverGroup.OwnerID, colorOffset: color, customDataOffset: customData ); return(group); }).ToArray()); foreach (var update in updatedGroups) { update.GroupClient = update.GroupUpdated.Clone(); } var groupDeletesVector = NetWorldView.CreateGroupDeletesVector(builder, BodyCache.CollectStaleGroups().Select(b => b.GroupUpdated.ID ).ToArray()); NetWorldView.StartUpdatesVector(builder, updateBodies.Count()); foreach (var b in updateBodies) { var serverBody = b.BodyUpdated; var body = NetBody.CreateNetBody(builder, Id: serverBody.ID, DefinitionTime: serverBody.DefinitionTime, originalPosition_X: (short)serverBody.OriginalPosition.X, originalPosition_Y: (short)serverBody.OriginalPosition.Y, velocity_X: (short)(serverBody.Momentum.X * VELOCITY_SCALE_FACTOR), velocity_Y: (short)(serverBody.Momentum.Y * VELOCITY_SCALE_FACTOR), OriginalAngle: (sbyte)(serverBody.OriginalAngle / MathF.PI * 127), AngularVelocity: (sbyte)(serverBody.AngularVelocity * 10000), Size: (byte)(serverBody.Size / 5), Sprite: (ushort)serverBody.Sprite, Mode: serverBody.Mode, Group: serverBody.Group?.ID ?? 0); } var updatesVector = builder.EndVector(); foreach (var update in updateBodies) { update.BodyClient = update.BodyUpdated.Clone(); } var deletesVector = NetWorldView.CreateDeletesVector(builder, BodyCache.CollectStaleBuckets().Select(b => b.BodyUpdated.ID ).ToArray()); var messages = player.GetMessages(); VectorOffset announcementsVector = new VectorOffset(); if (messages != null && messages.Any()) { announcementsVector = NetWorldView.CreateAnnouncementsVector(builder, messages.Select(e => { var stringType = builder.CreateString(e.Type); var stringMessage = builder.CreateString(e.Message); var stringExtraData = e.ExtraData != null ? builder.CreateString(JsonConvert.SerializeObject(e.ExtraData)) : new StringOffset(); NetAnnouncement.StartNetAnnouncement(builder); NetAnnouncement.AddType(builder, stringType); NetAnnouncement.AddText(builder, stringMessage); if (e.ExtraData != null) { NetAnnouncement.AddExtraData(builder, stringExtraData); } NetAnnouncement.AddPointsDelta(builder, e.PointsDelta); return(NetAnnouncement.EndNetAnnouncement(builder)); }).ToArray()); } StringOffset customOffset = new StringOffset(); if (followFleet?.CustomData != null && followFleet.CustomData != CustomData) { customOffset = builder.CreateString(followFleet.CustomData); } NetWorldView.StartNetWorldView(builder); // define camera var cameraBody = NetBody.CreateNetBody( builder, Id: 0, DefinitionTime: followBody?.DefinitionTime ?? 0, originalPosition_X: (short)(followBody?.OriginalPosition.X ?? 0), originalPosition_Y: (short)(followBody?.OriginalPosition.Y ?? 0), velocity_X: (short)(followBody?.Momentum.X * VELOCITY_SCALE_FACTOR ?? 0), velocity_Y: (short)(followBody?.Momentum.Y * VELOCITY_SCALE_FACTOR ?? 0), OriginalAngle: (sbyte)(followBody?.OriginalAngle / MathF.PI / 127 ?? 0), AngularVelocity: 0, Size: 0, Sprite: 0, Mode: 0, Group: 0 ); NetWorldView.AddCamera(builder, cameraBody); NetWorldView.AddIsAlive(builder, player?.IsAlive ?? false); NetWorldView.AddTime(builder, world.Time); NetWorldView.AddUpdates(builder, updatesVector); NetWorldView.AddDeletes(builder, deletesVector); NetWorldView.AddGroups(builder, groupsVector); NetWorldView.AddGroupDeletes(builder, groupDeletesVector); if (messages != null && messages.Any()) { NetWorldView.AddAnnouncements(builder, announcementsVector); } if (followFleet?.CustomData != null && followFleet.CustomData != CustomData) { NetWorldView.AddCustomData(builder, customOffset); } CustomData = followFleet?.CustomData; var players = Player.GetWorldPlayers(world); NetWorldView.AddPlayerCount(builder, (uint)world.AdvertisedPlayerCount); NetWorldView.AddSpectatorCount(builder, (uint)players.Count(p => p.Connection?.IsSpectating ?? false)); NetWorldView.AddCooldownBoost(builder, (byte)((player?.Fleet?.BoostCooldownStatus * 255) ?? 0)); NetWorldView.AddCooldownShoot(builder, (byte)((player?.Fleet?.ShootCooldownStatus * 255) ?? 0)); NetWorldView.AddWorldSize(builder, (ushort)world.Hook.WorldSize); if (followFleet != null) { // inform the client of which the fleet id NetWorldView.AddFleetID(builder, (uint)followFleet.ID); } else { NetWorldView.AddFleetID(builder, 0); } var worldView = NetWorldView.EndNetWorldView(builder); var newHash = world.Hook.GetHashCode(); if (HookHash != newHash) { this.Events.Enqueue(new BroadcastEvent { EventType = "hook", Data = JsonConvert.SerializeObject(world.Hook) }); } HookHash = newHash; var q = NetQuantum.CreateNetQuantum(builder, AllMessages.NetWorldView, worldView.Value); builder.Finish(q.Value); } } await this.SendAsync(builder.DataBuffer, cancellationToken); if (LeaderboardTime != (world.Leaderboard?.Time ?? 0)) { LeaderboardTime = (world.Leaderboard?.Time ?? 0); builder = new FlatBufferBuilder(1); var stringName = builder.CreateString(world.Leaderboard?.ArenaRecord?.Name ?? " "); var stringColor = builder.CreateString(world.Leaderboard?.ArenaRecord?.Color ?? " "); NetLeaderboardEntry.StartNetLeaderboardEntry(builder); NetLeaderboardEntry.AddColor(builder, stringColor); NetLeaderboardEntry.AddName(builder, stringName); NetLeaderboardEntry.AddScore(builder, world.Leaderboard?.ArenaRecord?.Score ?? 0); NetLeaderboardEntry.AddToken(builder, !string.IsNullOrEmpty(world.Leaderboard?.ArenaRecord?.Token)); var record = NetLeaderboardEntry.EndNetLeaderboardEntry(builder); var entriesVector = NetLeaderboard.CreateEntriesVector(builder, world.Leaderboard.Entries.Select(e => { // the strings must be created into the buffer before the are referenced // and before the start of the entry object stringName = builder.CreateString(e.Name ?? string.Empty); stringColor = builder.CreateString(e.Color ?? string.Empty); StringOffset stringModeData = new StringOffset(); if (e.ModeData != null) { stringModeData = builder.CreateString(JsonConvert.SerializeObject(e.ModeData)); } // here's the start of the entry object, after this we can only use // predefined string offsets NetLeaderboardEntry.StartNetLeaderboardEntry(builder); NetLeaderboardEntry.AddFleetID(builder, e.FleetID); NetLeaderboardEntry.AddName(builder, stringName); NetLeaderboardEntry.AddColor(builder, stringColor); NetLeaderboardEntry.AddScore(builder, e.Score); NetLeaderboardEntry.AddPosition(builder, FromPositionVector(builder, e.Position)); NetLeaderboardEntry.AddToken(builder, !string.IsNullOrEmpty(e.Token)); if (e.ModeData != null) { NetLeaderboardEntry.AddModeData(builder, stringModeData); } return(NetLeaderboardEntry.EndNetLeaderboardEntry(builder)); }).ToArray()); var stringType = builder.CreateString(world.Leaderboard.Type ?? string.Empty); NetLeaderboard.StartNetLeaderboard(builder); NetLeaderboard.AddEntries(builder, entriesVector); NetLeaderboard.AddType(builder, stringType); NetLeaderboard.AddRecord(builder, record); var leaderboardOffset = NetLeaderboard.EndNetLeaderboard(builder); builder.Finish(NetQuantum.CreateNetQuantum(builder, AllMessages.NetLeaderboard, leaderboardOffset.Value).Value); await this.SendAsync(builder.DataBuffer, cancellationToken); } while (Events.Count > 0) { var e = Events.Dequeue(); var eventType = builder.CreateString(e.EventType); var eventData = builder.CreateString(e.Data); NetEvent.StartNetEvent(builder); NetEvent.AddType(builder, eventType); NetEvent.AddData(builder, eventData); var eventOffset = NetEvent.EndNetEvent(builder); builder.Finish(NetQuantum.CreateNetQuantum(builder, AllMessages.NetEvent, eventOffset.Value).Value); await this.SendAsync(builder.DataBuffer, cancellationToken); } } } catch (WebSocketException) { //Console.WriteLine(e); throw; } catch (Exception e) { Console.WriteLine(e); throw; } }
public static void remove_netStatus(NetGroup that, Action <NetStatusEvent> value) { CommonExtensions.RemoveDelegate(that, value, NetStatusEvent.NET_STATUS); }
public static void ConnectToSession(this ApplicationCanvas that, ConnectToSessionVariation variation = ConnectToSessionVariation.Flash) { var nc = new NetConnection(); var connected = false; Action <string> RaiseMessage = x => { that.About.Text = x + Environment.NewLine + that.About.Text; }; Action <string> PostMessage = message => { RaiseMessage("drop: " + message); }; #region AtNotifyBuildRocket that.AtNotifyBuildRocket += (x, y) => { XElement BuildRocket = new DoubleVector2 { X = x, Y = y }; PostMessage( new XElement("Updates", new XElement("BuildRocket", BuildRocket) ).ToString() ); }; #endregion #region AtNotifyVisualizeTouch that.AtNotifyVisualizeTouch += (x, y) => { XElement VisualizeTouch = new DoubleVector2 { X = x, Y = y }; PostMessage( new XElement("Updates", new XElement("VisualizeTouch", VisualizeTouch) ).ToString() ); }; #endregion nc.netStatus += e => { // http://stackoverflow.com/questions/10683595/cant-receive-netgroup-events RaiseMessage("nc.netStatus: " + e.info.code); if (e.info.code == "NetGroup.Connect.Success") { connected = true; RaiseMessage("connected"); return; } if (e.info.code == "NetConnection.Connect.Success") { // http://kafkaris.com/blog/2011/04/03/local-peer-to-peer-communication-in-as3-with-rtmfp/ // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/GroupSpecifier.html var groupspec = new GroupSpecifier("goo"); groupspec.postingEnabled = true; groupspec.routingEnabled = true; // // Necessary to multicast over a NetStream. groupspec.multicastEnabled = true; // // Must be enabled for LAN peer discovery to work groupspec.ipMulticastMemberUpdatesEnabled = true; // http://help.adobe.com/en_US/flashmediaserver/ssaslr/WS486834a3d4bc74a45ce7a7ac126f44d8a30-8000.html //groupspec.addIPMulticastAddress("225.225.0.1:30303"); // // Multicast address over which to exchange peer discovery. groupspec.addIPMulticastAddress("224.0.0.255:30000"); // Specify minimum GroupSpec version (FMS 4.5.2/Flash Player 11.5) groupspec.minGroupspecVersion = 2; var group = new NetGroup( nc, groupspec.groupspecWithAuthorizations() //groupspec.groupspecWithoutAuthorizations() ); // http://stackoverflow.com/questions/10206097/netstream-send-not-working-with-netgroup-in-rtmfp PostMessage = message => { if (connected) { RaiseMessage("write: " + new { message.Length }); //RaiseMessage("write: " + message); group.post(message); } else { //RaiseMessage("skip: " + message); } }; //AtPostMessage += PostMessage; group.netStatus += g => { if (g.info.code == "NetGroup.Posting.Notify") { // Type Coercion failed: cannot convert Object@60b6cb9 to LANMulticast_Components_MySprite1__f__AnonymousType0_1_33554444. var source = (string)g.info.message; RaiseMessage("group.netStatus: " + new { g.info.code, source }); //Console.WriteLine("source: " + source); var xml = XElement.Parse(source); xml.Elements().Where(k => k.Name.LocalName == "BuildRocket").Elements().WithEach( ksource => { //Console.WriteLine("BuildRocket: " + ksource); DoubleVector2 k = ksource; that.NotifyBuildRocket(k.X, k.Y); } ); xml.Elements().Where(k => k.Name.LocalName == "VisualizeTouch").Elements().WithEach( ksource => { //Console.WriteLine("VisualizeTouch: " + ksource); DoubleVector2 k = ksource; that.NotifyVisualizeTouch(k.X, k.Y); } ); return; } RaiseMessage("group.netStatus: " + g.info.code); }; return; } }; // X:\jsc.svn\examples\actionscript\FlashStratusDemo\FlashStratusDemo\ActionScript\OrcasFlashApplication.cs nc.connect("rtmfp:"); }
public static void InitializeConnection( this KeySample key, bool WriteMode = true, bool ReadMode = false, TextField text = null, Action <Action <string> > yield_PostMessage = null, Action <XElement> yield_Notify = null ) { //var that = new { About }; var nc = new NetConnection(); var connected = false; Action <string> RaiseMessage = x => { if (text != null) { //text.text = x + Environment.NewLine + text.text; text.text = x; } }; Action <string> PostMessage = message => { RaiseMessage("drop: " + message); }; if (WriteMode) { var sync = new ScriptCoreLib.ActionScript.flash.utils.Timer(1000 / 60); var syncid = 0; var was = -1; sync.timer += delegate { if (key.value == was) { if (was == 0) { return; } } syncid++; PostMessage( new XElement("sync", new XElement("KeySample", new XAttribute("value", "" + key.value), new XAttribute("forcex", "" + key.forcex), new XAttribute("forcey", "" + key.forcey), new XAttribute("syncid", "" + syncid) ) ).ToString() ); was = key.value; }; sync.start(); } //that.AtNotifyVisualizeTouch += // (x, y) => // { // XElement VisualizeTouch = new DoubleVector2 // { // X = x, // Y = y // }; // PostMessage( // new XElement("Updates", // new XElement("VisualizeTouch", VisualizeTouch) // ).ToString() // ); // }; nc.netStatus += e => { RaiseMessage("nc.netStatus: " + e.info.code); if (e.info.code == "NetGroup.Connect.Success") { connected = true; RaiseMessage("connected, looking for long range coms... (7 to 30sec delay) might need to reset android wifi, pc wifi or wifi router itself!"); return; } if (e.info.code == "NetConnection.Connect.Success") { RaiseMessage("looking for long range coms... looking for permission..."); var groupspec = new GroupSpecifier("myGroup/groupOne"); groupspec.postingEnabled = true; groupspec.ipMulticastMemberUpdatesEnabled = true; groupspec.addIPMulticastAddress("225.225.0.1:30303"); var group = new NetGroup(nc, groupspec.groupspecWithAuthorizations()); PostMessage = message => { if (connected) { RaiseMessage("write: " + message); group.post(message); } else { RaiseMessage("skip: " + message); } }; if (yield_PostMessage != null) { yield_PostMessage(PostMessage); } //if (WriteMode) //{ // PostMessage( // new XElement("KeySample", // new XAttribute("value", "" + key.value) // ).ToString() // ); //} //AtPostMessage += PostMessage; group.netStatus += g => { if (g.info.code == "NetGroup.Posting.Notify") { // Type Coercion failed: cannot convert Object@60b6cb9 to LANMulticast_Components_MySprite1__f__AnonymousType0_1_33554444. var source = (string)g.info.message; //Console.WriteLine("source: " + source); RaiseMessage("source: " + source); var xml = XElement.Parse(source); //xml.Elements().Where(k => k.Name.LocalName == "BuildRocket").Elements().WithEach( // ksource => // { // //Console.WriteLine("BuildRocket: " + ksource); // DoubleVector2 k = ksource; // that.NotifyBuildRocket(k.X, k.Y); // } //); if (yield_Notify != null) { yield_Notify(xml); } if (ReadMode) { //xml.Elements().Where(k => k.Name.LocalName == "KeySample").WithEach( xml.Elements("KeySample").WithEach( ksource => { var value = int.Parse(ksource.Attribute("value").Value); var forcex = double.Parse(ksource.Attribute("forcex").Value); var forcey = double.Parse(ksource.Attribute("forcey").Value); //RaiseMessage("value: " + value); key.value = value; key.forcex = forcex; key.forcey = forcey; //Console.WriteLine("VisualizeTouch: " + ksource); //new XElement("value", "" + k.value) //DoubleVector2 k = ksource; //that.NotifyVisualizeTouch(k.X, k.Y); } ); } return; } RaiseMessage("group.netStatus: " + g.info.code); }; return; } }; nc.connect("rtmfp:"); }
public async Task StepAsync(CancellationToken cancellationToken) { if (player != null) { // default to player var followFleet = player?.Fleet; // if the player doesn't have a fleet alive if (followFleet == null) { // find someone else to watch followFleet = Player.GetWorldPlayers(world) .ToList() .Where(p => p.IsAlive) .OrderByDescending(p => p.Score * 10000 + (10000 - p.Fleet.ID)) .FirstOrDefault() ?.Fleet; } Body followBody = null; // if we're watching a fleet, watch the center of their fleet if (followFleet != null) { var center = Core.Steering.Flocking.FleetCenterNaive(followFleet.Ships); followBody = new Body { DefinitionTime = world.Time, OriginalPosition = center, Position = center, Momentum = followFleet.FleetMomentum }; } // if we haven't found anything to watch yet, watch the first ship we find if (followBody == null) { followBody = player?.World.Bodies.OfType <Ship>().FirstOrDefault(); } // if we haven't found anything to watch yet, watch anything if (followBody == null) { followBody = player?.World.Bodies.FirstOrDefault(); } if (followBody != null) { var halfViewport = new Vector2(3000, 3000); BodyCache.Update( world.Bodies, world.Groups, world.Time, Vector2.Subtract(followBody.Position, halfViewport), Vector2.Add(followBody.Position, halfViewport) ); var updates = BodyCache.BodiesByError(); var updateBodies = updates.Take(100); var newHash = world.Hook.GetHashCode(); var builder = new FlatBufferBuilder(1); float VELOCITY_SCALE_FACTOR = 10000f; var updatedGroups = BodyCache.GroupsByError().ToList(); var groupsVector = NetWorldView.CreateGroupsVector(builder, updatedGroups.Select(b => { var serverGroup = b.GroupUpdated; var caption = builder.CreateString(serverGroup.Caption ?? " "); var group = NetGroup.CreateNetGroup(builder, group: serverGroup.ID, type: serverGroup.GroupType, captionOffset: caption, zindex: serverGroup.ZIndex ); return(group); }).ToArray()); foreach (var update in updatedGroups) { update.GroupClient = update.GroupUpdated.Clone(); } var groupDeletesVector = NetWorldView.CreateGroupDeletesVector(builder, BodyCache.CollectStaleGroups().Select(b => b.GroupUpdated.ID ).ToArray()); NetWorldView.StartUpdatesVector(builder, updateBodies.Count()); foreach (var b in updateBodies) { var serverBody = b.BodyUpdated; var body = NetBody.CreateNetBody(builder, Id: serverBody.ID, DefinitionTime: serverBody.DefinitionTime, originalPosition_X: (short)serverBody.OriginalPosition.X, originalPosition_Y: (short)serverBody.OriginalPosition.Y, velocity_X: (short)(serverBody.Momentum.X * VELOCITY_SCALE_FACTOR), velocity_Y: (short)(serverBody.Momentum.Y * VELOCITY_SCALE_FACTOR), OriginalAngle: (sbyte)(serverBody.OriginalAngle / MathF.PI * 127), AngularVelocity: (sbyte)(serverBody.AngularVelocity * VELOCITY_SCALE_FACTOR / MathF.PI * 127), Size: (byte)(serverBody.Size / 5), Sprite: (byte)serverBody.Sprite, Mode: 0, Group: serverBody.Group?.ID ?? 0); } var updatesVector = builder.EndVector(); foreach (var update in updateBodies) { update.BodyClient = update.BodyUpdated.Clone(); } var deletesVector = NetWorldView.CreateDeletesVector(builder, BodyCache.CollectStaleBuckets().Select(b => b.BodyUpdated.ID ).ToArray()); var messages = player.GetMessages(); VectorOffset announcementsVector = new VectorOffset(); if (messages != null && messages.Any()) { announcementsVector = NetWorldView.CreateAnnouncementsVector(builder, messages.Select(e => { var stringName = builder.CreateString(e); NetAnnouncement.StartNetAnnouncement(builder); NetAnnouncement.AddText(builder, stringName); return(NetAnnouncement.EndNetAnnouncement(builder)); }).ToArray()); } NetWorldView.StartNetWorldView(builder); // define camera var cameraBody = NetBody.CreateNetBody( builder, Id: 0, DefinitionTime: followBody?.DefinitionTime ?? 0, originalPosition_X: (short)(followBody?.OriginalPosition.X ?? 0), originalPosition_Y: (short)(followBody?.OriginalPosition.Y ?? 0), velocity_X: (short)(followBody?.Momentum.X * VELOCITY_SCALE_FACTOR ?? 0), velocity_Y: (short)(followBody?.Momentum.Y * VELOCITY_SCALE_FACTOR ?? 0), OriginalAngle: (sbyte)(followBody?.OriginalAngle / MathF.PI / 127 ?? 0), AngularVelocity: 0, Size: 0, Sprite: 0, Mode: 0, Group: 0 ); NetWorldView.AddCamera(builder, cameraBody); NetWorldView.AddIsAlive(builder, player?.IsAlive ?? false); NetWorldView.AddTime(builder, world.Time); NetWorldView.AddUpdates(builder, updatesVector); NetWorldView.AddDeletes(builder, deletesVector); NetWorldView.AddGroups(builder, groupsVector); NetWorldView.AddGroupDeletes(builder, groupDeletesVector); if (messages != null && messages.Any()) { NetWorldView.AddAnnouncements(builder, announcementsVector); } var worldView = NetWorldView.EndNetWorldView(builder); HookHash = newHash; var q = NetQuantum.CreateNetQuantum(builder, AllMessages.NetWorldView, worldView.Value); builder.Finish(q.Value); await this.SendAsync(builder.DataBuffer, cancellationToken); } if (LeaderboardTime != (world.Leaderboard?.Time ?? 0)) { LeaderboardTime = (world.Leaderboard?.Time ?? 0); var builder = new FlatBufferBuilder(1); var stringName = builder.CreateString(world.Leaderboard?.ArenaRecord?.Name ?? " "); var stringColor = builder.CreateString(world.Leaderboard?.ArenaRecord?.Color ?? " "); NetLeaderboardEntry.StartNetLeaderboardEntry(builder); NetLeaderboardEntry.AddColor(builder, stringColor); NetLeaderboardEntry.AddName(builder, stringName); NetLeaderboardEntry.AddScore(builder, world.Leaderboard?.ArenaRecord?.Score ?? 0); NetLeaderboardEntry.AddToken(builder, !string.IsNullOrEmpty(world.Leaderboard?.ArenaRecord?.Token)); var record = NetLeaderboardEntry.EndNetLeaderboardEntry(builder); var entriesVector = NetLeaderboard.CreateEntriesVector(builder, world.Leaderboard.Entries.Select(e => { stringName = builder.CreateString(e.Name ?? string.Empty); stringColor = builder.CreateString(e.Color ?? string.Empty); // stringToken = builder.CreateString( ?? string.Empty); NetLeaderboardEntry.StartNetLeaderboardEntry(builder); NetLeaderboardEntry.AddName(builder, stringName); NetLeaderboardEntry.AddColor(builder, stringColor); NetLeaderboardEntry.AddScore(builder, e.Score); NetLeaderboardEntry.AddPosition(builder, FromPositionVector(builder, e.Position)); NetLeaderboardEntry.AddToken(builder, !string.IsNullOrEmpty(e.Token)); return(NetLeaderboardEntry.EndNetLeaderboardEntry(builder)); }).ToArray()); var stringType = builder.CreateString(world.Leaderboard.Type ?? string.Empty); NetLeaderboard.StartNetLeaderboard(builder); NetLeaderboard.AddEntries(builder, entriesVector); NetLeaderboard.AddType(builder, stringType); NetLeaderboard.AddRecord(builder, record); var leaderboardOffset = NetLeaderboard.EndNetLeaderboard(builder); builder.Finish(NetQuantum.CreateNetQuantum(builder, AllMessages.NetLeaderboard, leaderboardOffset.Value).Value); await this.SendAsync(builder.DataBuffer, cancellationToken); } } }
public void ConnectToSession() { nc = new NetConnection(); var connected = false; nc.netStatus += e => { RaiseMessageFromFlash("nc.netStatus: " + e.info.code); if (e.info.code == "NetGroup.Connect.Success") { connected = true; RaiseAtConnect(); return; } if (e.info.code == "NetConnection.Connect.Success") { #region NetGroup // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/GroupSpecifier.html var groupname = "myGroup/groupX"; var groupip = "225.225.0.1:30000"; groupspec = new GroupSpecifier(groupname); groupspec.ipMulticastMemberUpdatesEnabled = true; //groupspec.multicastEnabled = true; groupspec.postingEnabled = true; groupspec.addIPMulticastAddress(groupip); //groupspec.addIPMulticastAddress("224.0.0.254"); // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetGroup.html group = new NetGroup(nc, groupspec.groupspecWithAuthorizations()); AtMessageToFlashNetGroup += message => { if (connected) { group.post(message); } }; group.netStatus += g => { RaiseMessageFromFlash("group.netStatus: " + g.info.code); #region NetGroup.Posting.Notify if (g.info.code == "NetGroup.Posting.Notify") { var source = (string)g.info.message; RaiseMessageFromFlash("message:" + source); try { var xml = XElement.Parse(source); FromNetGroup(xml); } catch { } } #endregion #region NetGroup.Neighbor.Connect if (g.info.code == "NetGroup.Neighbor.Connect") { // Sent when a neighbor connects to this node. // The info.neighbor:String property is the group address of the neighbor. // The info.peerID:String property is the peer ID of the neighbor. var peerID = g.info.peerID(); PeerArray.Add(peerID); } #endregion }; #endregion RaiseMessageFromFlash("NetGroup " + new { groupname, groupip }); } }; nc.connect("rtmfp:"); }