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); }
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(), })); }
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); }); }