public void Test_Can_Serializer_MovementPacket_With_PathMovementData() { //arrange Unity3DProtobufPayloadRegister payloadRegister = new Unity3DProtobufPayloadRegister(); payloadRegister.RegisterDefaults(); payloadRegister.Register(); GladNet.ProtobufNetGladNetSerializerAdapter gladnetProtobuf = new ProtobufNetGladNetSerializerAdapter(PrefixStyle.Fixed32); //act MovementDataUpdateEventPayload payload = new MovementDataUpdateEventPayload(new EntityAssociatedData <IMovementData>[] { new EntityAssociatedData <IMovementData>(new NetworkEntityGuid(55), new PathBasedMovementData(new Vector3[] { new Vector3(1, 2, 3), new Vector3(2, 3, 4) }, 55)), }); byte[] serialize = gladnetProtobuf.Serialize(payload); //assert Assert.NotNull(serialize); Assert.IsNotEmpty(serialize); }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { //Register the serialization models. Unity3DProtobufPayloadRegister unityProtobufRegisteration = new Unity3DProtobufPayloadRegister(); unityProtobufRegisteration.RegisterDefaults(); unityProtobufRegisteration.Register(); builder.RegisterType <ProtobufNetGladNetSerializerAdapter>() .AsSelf() .AsImplementedInterfaces() .SingleInstance(); }
static async Task Main(string[] args) { ProtobufNetGladNetSerializerAdapter serializer = new ProtobufNetGladNetSerializerAdapter(); Unity3DProtobufPayloadRegister payloadRegister = new Unity3DProtobufPayloadRegister(); payloadRegister.RegisterDefaults(); payloadRegister.Register(); var client = new GladMMOUnmanagedNetworkClient <DotNetTcpClientNetworkClient, GameServerPacketPayload, GameClientPacketPayload, IGamePacketPayload>(new DotNetTcpClientNetworkClient(), serializer, new ConsoleLogger(LogLevel.All)) .AsManaged(); await client.ConnectAsync(IPAddress.Parse("72.190.177.214"), 5006); Thread.Sleep(3000); Console.WriteLine("Enter Character ID for test:"); int characterId = int.Parse(Console.ReadLine()); await client.SendMessage(new ClientSessionClaimRequestPayload("Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjYyN0YyQUFDMTZERTlENjNDMkY3NDQyQzk1OUFBNjEyQjIyOTlENDciLCJ0eXAiOiJKV1QifQ.eyJzdWIiOiIyNyIsIm5hbWUiOiJUZXN0UGxheWZhYiIsInBmaWQiOiJEMTdENUI1RDY5RTY3QTM2IiwidG9rZW5fdXNhZ2UiOiJhY2Nlc3NfdG9rZW4iLCJqdGkiOiIyMDM2Zjg1MC04ODY5LTQ4YzUtOWRkOS0xYWI4MzIzZjBkOTkiLCJzY29wZSI6Im9wZW5pZCIsImF1ZCI6ImF1dGgtc2VydmVyIiwiYXpwIjoiVlJHdWFyZGlhbnNBdXRoZW50aWNhdGlvbiIsIm5iZiI6MTU1OTYzNzkzMywiZXhwIjoxNTU5NjQxNTMzLCJpYXQiOjE1NTk2Mzc5MzMsImlzcyI6Imh0dHBzOi8vYXV0aC52cmd1YXJkaWFucy5uZXQvIn0.oWlUhM3JMI1jC6Irh8lUeTmzcIIl2TJfgps0dHSshS6-TcJsL37u3xP_xXE2x0FH3HkXbAPyCL2hYr7KdSnCATh1G1Ar9vqt3XY0HWw7lOCovmAYjPHPgaHZXGnlk6P35A4bpCK-gLPi4xTW6rHYa1SJt_oeNQfFuElaUTR1cj-TajqHCV6P3xb3cEcsAD4Z4Pye0x4RUANN6NKpMvc5c_GPfnoRDpPFQwM7e8616vPBoN2vR7k9pnvsaJPBdnlZrMA8fVmvigO4ARoyGMJNkgsVonF7Oyr1LfLJu47tuqEqzKL9pRkOFYvUyCHniImut6o0JMX5t2LWwA-GOhiRmzCLuiVV0GMHQLFRkZ7h3lw4lXC6-nbq-k9YQKbj3jDM8uLyQv0VdxJjfF28DIAs4Eo_5A5r6R48p0-opiU0SVLPK-IfNWCzl_jFXCpOq0otoKVx-lyl89eyMYATny4tr1qHT2FG6Y8Pdm8skz13iZltAivy-I6W5RbeZ7COgwtaHmcwqTOY7kpFAWZ0rylFTDbKL7K-Kf7QMNQfUw3yP8KOWk4KL6Wa9EFFkBzwcxFKX-fdVg08xTBYZWj5GuCU_gWCTYBviiBbwCC4H2yQcJ9gLvW6tVRDCPfbpZiuMU8FrUk_JflQoy-QXUV1L-CZofra-uUGmHmLya5gULbR6qI", characterId)); int packetCount = 0; try { while (true) { NetworkIncomingMessage <GameServerPacketPayload> message = await client.ReadMessageAsync() .ConfigureAwaitFalse(); Console.WriteLine($"\n#{packetCount} - Recieved Message Type: {message.Payload.GetType().Name}"); } } catch (Exception e) { Console.WriteLine(e); } }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { //https://stackoverflow.com/questions/4926676/mono-https-webrequest-fails-with-the-authentication-or-decryption-has-failed ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.CheckCertificateRevocationList = false; //TODO: Extract to seperate module like the client. //Register the serialization models. Unity3DProtobufPayloadRegister unityProtobufRegisteration = new Unity3DProtobufPayloadRegister(); unityProtobufRegisteration.RegisterDefaults(); unityProtobufRegisteration.Register(); //Set the sync context UnityAsyncHelper.InitializeSyncContext(); Application.targetFrameRate = 10; QualitySettings.vSyncCount = 0; HandleConfigurableDependencies(builder); //AuthToken //ZoneServerAuthenticationTokenRepository: IReadonlyAuthTokenRepository builder.RegisterType <ZoneServerAuthenticationTokenRepository>() .As <IReadonlyAuthTokenRepository>() .As <IAuthTokenRepository>() .SingleInstance(); builder.RegisterType <ProtobufNetGladNetSerializerAdapter>() .As <INetworkSerializationService>() .SingleInstance(); builder.RegisterType <ZoneServerDefaultRequestHandler>() .AsImplementedInterfaces() .SingleInstance(); builder.RegisterInstance(new UnityLogger(LogLevel.All)) .As <ILog>(); builder.RegisterType <MessageHandlerService <GameClientPacketPayload, GameServerPacketPayload, IPeerSessionMessageContext <GameServerPacketPayload> > >() .As <MessageHandlerService <GameClientPacketPayload, GameServerPacketPayload, IPeerSessionMessageContext <GameServerPacketPayload> > >() .SingleInstance(); builder.RegisterType <ZoneServerApplicationBase>() .SingleInstance() .AsSelf(); RegisterEntityMappableCollections(builder); //TODO: We should automate the registeration of message senders builder.RegisterType <VisibilityChangeMessageSender>() .AsImplementedInterfaces() .AsSelf(); builder.RegisterType <DefaultGameObjectToEntityMappable>() .As <IReadonlyGameObjectToEntityMappable>() .As <IGameObjectToEntityMappable>() .SingleInstance(); RegisterPlayerFactoryServices(builder); builder.RegisterType <GenericMessageSender <PlayerSelfSpawnEventPayload> >() .AsSelf() .AsImplementedInterfaces(); builder.RegisterType <DefaultManagedSessionFactory>() .AsImplementedInterfaces(); //TODO: Extract this into a handlers registrar //This is for mapping connection IDs to the main controlled EntityGuid. builder.RegisterInstance(new ConnectionEntityMap()) .AsImplementedInterfaces() .SingleInstance(); builder.RegisterType <PlayerEntityGuidEnumerable>() .As <IPlayerEntityGuidEnumerable>() .AsSelf(); builder.RegisterType <MovementUpdateMessageSender>() .As <INetworkMessageSender <EntityMovementMessageContext> >() .AsSelf(); //Keep this one here, zoneserver needs it. /*builder.Register<IServiceDiscoveryService>(context => RestService.For<IServiceDiscoveryService>("https://test-guardians-servicediscovery.azurewebsites.net")) * .As<IServiceDiscoveryService>() * .SingleInstance();*/ //builder.Register<IServiceDiscoveryService>(context => RestService.For<IServiceDiscoveryService>(@"http://72.190.177.214:5000")); builder.Register <IServiceDiscoveryService>(context => RestService.For <IServiceDiscoveryService>(@"http://72.190.177.214:5000")) .As <IServiceDiscoveryService>() .SingleInstance(); builder.Register(context => { IServiceDiscoveryService serviceDiscovery = context.Resolve <IServiceDiscoveryService>(); return(new AsyncEndpointZoneServerToGameServerService(QueryForRemoteServiceEndpoint(serviceDiscovery, "GameServer"))); }) .As <IZoneServerToGameServerClient>() .SingleInstance(); /*builder.RegisterType<DefaultMovementHandlerService>() * .As<IMovementDataHandlerService>() * .AsSelf(); * * builder.RegisterType<PathMovementBlockHandler>() * .AsImplementedInterfaces() * .AsSelf(); * * builder.RegisterType<PositionChangeMovementBlockHandler>() * .AsImplementedInterfaces() * .AsSelf();*/ builder.RegisterType <UtcNowNetworkTimeService>() .AsSelf() .AsImplementedInterfaces() .SingleInstance(); builder.RegisterType <FieldValueUpdateFactory>() .AsSelf() .AsImplementedInterfaces(); RegisterEntityDestructionServices(builder); //Honestly, before running this I think it'll be a MIRACLE if this actually works //Registering the generic networkmessage sender builder.RegisterGeneric(typeof(GenericMessageSender <>)) .As(typeof(INetworkMessageSender <>).MakeGenericType(typeof(GenericSingleTargetMessageContext <>))) .SingleInstance(); RegisterLockingPolicies(builder); //IPhysicsTriggerEventSubscribable TriggerEventSubscribable builder.RegisterInstance(GlobalPhysicsEventSystem.Instance) .AsImplementedInterfaces() .SingleInstance(); //DefaultEntitySessionMessageSender : IEntitySessionMessageSender builder.RegisterType <DefaultEntitySessionMessageSender>() .As <IEntitySessionMessageSender>(); //EntityBaseStatsDataFactory : IFactoryCreatable<EntityBaseStatsModel, EntityDataStatsDerivable> builder.RegisterType <EntityBaseStatsDataFactory>() .As <IFactoryCreatable <EntityBaseStatsModel, EntityDataStatsDerivable> >(); //RoundRobinSpawnStrategy : ISpawnPointStrategy builder.RegisterType <PlayerRoundRobinSpawnStrategy>() .As <ISpawnPointStrategy>(); builder.RegisterType <PlayerSpawnPointQueue>() .AsSelf() .SingleInstance(); builder.RegisterType <DefaultThreadUnSafeKnownEntitySet>() .AsSelf() .AsImplementedInterfaces() .SingleInstance(); //ServerMovementGeneratorFactory : IFactoryCreatable<IMovementGenerator<GameObject>, EntityAssociatedData<IMovementData>> builder.RegisterType <ServerMovementGeneratorFactory>() .As <IFactoryCreatable <IMovementGenerator <GameObject>, EntityAssociatedData <IMovementData> > >() .As <IMovementGeneratorFactory>() .AsSelf(); builder.RegisterType <RemoteGameObjectDataService>() .As <IGameObjectDataService>() .SingleInstance(); //DefaultSpellDataCollection : ISpellDataCollection, IReadonlySpellDataCollection builder.RegisterType <DefaultSpellDataCollection>() .AsImplementedInterfaces() .SingleInstance(); }