コード例 #1
0
    public bool AddClientToZone(int clientId, EntityNetworkClient networkClient)
    {
        var channelDown = new ProtobufChannelToClientZoneOutbound()
        {
            OutboundChannel = new EntityNetworkChannelToClientZone {
                NetworkClient = networkClient
            },
            TypeTable = GetTypeAliasTable(),
            TypeModel = GetTypeModel(),
        };

        if (_zone.AddClient(clientId, channelDown) == false)
        {
            return(false);
        }

        var channelUp = new ProtobufChannelToServerZoneInbound
        {
            TypeTable         = GetTypeAliasTable(),
            TypeModel         = GetTypeModel(),
            ClientId          = clientId,
            InboundServerZone = _zone
        };

        _zoneChannelMap.Add(clientId, channelUp);

        OnClientAdd(clientId);
        return(true);
    }
コード例 #2
0
        private Tuple <int, GameInfo> Enter(string userId, IGameObserver observer)
        {
            if (_userMap.ContainsKey(userId))
            {
                throw new InvalidOperationException();
            }

            NotifyToAllObservers(o => o.Enter(userId));

            var clientId = ++_lastClientId;

            var userData = new UserData
            {
                UserActor = Sender.Cast <UserRef>().WithRequestWaiter(this),
                Observer  = (GameObserver)observer,
                ClientId  = clientId,
            };

            userData.OutboundChannel = new ProtobufChannelToClientZoneOutbound
            {
                TypeTable       = _typeTable.Value,
                TypeModel       = _typeModel.Value,
                OutboundChannel = userData
            };

            userData.InboundChannel = new ProtobufChannelToServerZoneInbound
            {
                TypeTable         = _typeTable.Value,
                TypeModel         = _typeModel.Value,
                ClientId          = clientId,
                InboundServerZone = _zone
            };

            _userMap.Add(userId, userData);
            _zone.AddClient(clientId, userData.OutboundChannel);

            // TEST SPAWN
            _zone.RunAction(zone =>
            {
                zone.Spawn(typeof(ISpaceShip), clientId, EntityFlags.Normal);
            });

            return(Tuple.Create(
                       clientId,
                       new GameInfo
            {
                Name = _name,
                Users = _userMap.Keys.ToList(),
            }));
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: qipa/EntityNetwork
        private static void Main(string[] args)
        {
            var typeTable = new TypeAliasTable();

            var typeModel = TypeModel.Create();

            typeModel.Add(typeof(TrackablePocoTracker <ISpaceShipData>), false)
            .SetSurrogate(typeof(TrackableSpaceShipDataTrackerSurrogate));

            var serverZone = new ServerZone(EntityFactory.Default);

            var clientZones = Enumerable.Range(0, 2).Select(i =>
            {
                var channelUp = new ProtobufChannelToServerZoneOutbound
                {
                    TypeTable       = typeTable,
                    TypeModel       = typeModel,
                    OutboundChannel = new DummyChannelToServerZoneInbound
                    {
                        Channel = new ProtobufChannelToServerZoneInbound
                        {
                            TypeTable         = typeTable,
                            TypeModel         = typeModel,
                            ClientId          = i + 1,
                            InboundServerZone = serverZone,
                        }
                    }
                };
                var clientZone = new ClientZone(EntityFactory.Default, channelUp);
                var channel    = new ProtobufChannelToClientZoneOutbound
                {
                    TypeTable       = typeTable,
                    TypeModel       = typeModel,
                    OutboundChannel = new ProtobufChannelToClientZoneInbound()
                    {
                        TypeTable         = typeTable,
                        TypeModel         = typeModel,
                        InboundClientZone = clientZone,
                    }
                };
                serverZone.AddClient(i + 1, channel);
                return(clientZone);
            }).ToArray();

            serverZone.RunAction(zone =>
            {
                zone.Spawn(typeof(ISpaceShip), 0, EntityFlags.AnyoneCanControl);
            });

            var cship1A = (ClientSpaceShip)clientZones[0].GetEntity(1);
            var cship1B = (ClientSpaceShip)clientZones[1].GetEntity(1);

            Console.WriteLine($"cship1A.Score = {cship1A.Data.Score}");
            clientZones[0].RunAction(_ => cship1A.Say("Hello"));
            Console.WriteLine($"cship1A.Score = {cship1A.Data.Score}");
            clientZones[0].RunAction(_ => cship1A.Stop(1, 2));
            clientZones[1].RunAction(_ =>
            {
                cship1B.Say("World");
                cship1B.Shoot(1, 2, 3, 4);
            });
        }