コード例 #1
0
        public void DummyTest()
        {
            NetGroup group = new NetGroup {
                MeetupName = "wrocnet", City = "Wrocław"
            };

            Assert.Same(group.City, "Wrocław");
        }
コード例 #2
0
        public void ShouldFetchDataFromMeetup()
        {
            NetGroup group = new NetGroup {
                MeetupName = "wrocnet", City = "Wrocław"
            };
            var data = sut.GetDataFromMeetupPage(new List <NetGroup> {
                group
            });

            Assert.NotEmpty(data);
        }
コード例 #3
0
        /// <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()));
                    }
                }
            }
        }
コード例 #4
0
 public BucketGroup()
 {
     this.NetGroup = new();
 }
コード例 #5
0
        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:");
        }
コード例 #6
0
ファイル: Connection.cs プロジェクト: yahyaguzide/daud
        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;
            }
        }
コード例 #7
0
 public static void remove_netStatus(NetGroup that, Action <NetStatusEvent> value)
 {
     CommonExtensions.RemoveDelegate(that, value, NetStatusEvent.NET_STATUS);
 }
コード例 #8
0
        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:");
        }
コード例 #9
0
        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:");
        }
コード例 #10
0
        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);
                }
            }
        }
コード例 #11
0
        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:");
        }