public NetworkedEntity(string networkedType, Client relatedClient) : base() { NetworkedType = networkedType.Replace('¬', '-'); EntityID = GetNewEntityID(); NetworkedEntities.Add(EntityID, this); RelatedClient = relatedClient; DoFieldSetup(); }
public override void Delete() { base.Delete(); NetworkedEntities.Remove(EntityID); foreach (Client c in Client.AllClients.Values) { if (ShouldSendToClient(c)) { c.DeletedEntities.Add(EntityID, true); } } }
private ushort GetNewEntityID() { while (NetworkedEntities.ContainsKey(nextEntityID)) { if (nextEntityID == ushort.MaxValue) { nextEntityID = ushort.MinValue; } else { nextEntityID++; } } return(nextEntityID++); }
public VoxelSpaceMessageApplier(NetworkedEntities entities) : base(entities) { }
public TransformLerper(NetworkedEntities networkedEntities, World world) : base(world) { _entities = networkedEntities; }
public ProjectileMessageApplier(NetworkedEntities entities) : base(entities) { }
private static void _client_Started() { var world = new World(); var commandRecorder = new EntityCommandRecorder(); var scene = new Scene("Client", world, commandRecorder); var factory = _client.GraphicsDevice.ResourceFactory; var materialInputLayouts = new MaterialInputLayouts(); var textureLayout = factory.CreateResourceLayout( new ResourceLayoutDescription( new ResourceLayoutElementDescription("SurfaceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment), new ResourceLayoutElementDescription("SurfaceSampler", ResourceKind.Sampler, ShaderStages.Fragment), new ResourceLayoutElementDescription("TextureColour", ResourceKind.UniformBuffer, ShaderStages.Fragment))); materialInputLayouts.ResourceLayouts["Texture"] = textureLayout; materialInputLayouts.ResourceLayouts["WorldTransform"] = factory.CreateResourceLayout( new ResourceLayoutDescription( new ResourceLayoutElementDescription("WorldBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex))); materialInputLayouts.ResourceLayouts["SceneInputs"] = factory.CreateResourceLayout( new ResourceLayoutDescription( new ResourceLayoutElementDescription("ProjectionBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex), new ResourceLayoutElementDescription("ViewBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex), new ResourceLayoutElementDescription("SceneLighting", ResourceKind.UniformBuffer, ShaderStages.Fragment))); materialInputLayouts.ResourceLayouts["CameraInputs"] = factory.CreateResourceLayout( new ResourceLayoutDescription( new ResourceLayoutElementDescription("CameraInfo", ResourceKind.UniformBuffer, ShaderStages.Vertex))); materialInputLayouts.VertexLayouts["Model"] = new VertexLayoutDescription( new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Float3), new VertexElementDescription("TexCoords", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2), new VertexElementDescription("Normal", VertexElementSemantic.Normal, VertexElementFormat.Float3)); materialInputLayouts.VertexLayouts["Lighting"] = new VertexLayoutDescription( new VertexElementDescription("Light", VertexElementSemantic.Color, VertexElementFormat.Float1)); var mesh3dMaterial = new Material(_client.GraphicsDevice, _client.MainSceneFramebuffer, _client.Resources.LoadText("Shaders\\Mesh.vs"), _client.Resources.LoadText("Shaders\\Mesh.fg"), new string[] { "Model" }, new string[] { "SceneInputs", "WorldTransform", "Texture" }, materialInputLayouts); var lightMeshMaterial = new Material(_client.GraphicsDevice, _client.MainSceneFramebuffer, _client.Resources.LoadText("Shaders\\LightMesh.vs"), _client.Resources.LoadText("Shaders\\LightMesh.fg"), new string[] { "Model", "Lighting" }, new string[] { "SceneInputs", "WorldTransform", "Texture", "CameraInputs" }, materialInputLayouts); var voxelTexturesResource = _client.Resources.LoadImage("Textures\\spritesheet_tiles.png"); var voxelTexture = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.White); var redVoxelTexture = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, RgbaFloat.Red); var semiTransVoxelColour = new MaterialTexture(_client.GraphicsDevice, textureLayout, voxelTexturesResource, new RgbaFloat(1.0f, 1.0f, 1.0f, 0.8f)); Action <Entity> setVoxelRender = (Entity e) => { e.Set(new LightVertexResources()); e.Set(lightMeshMaterial); e.Set(voxelTexture); }; var networkedEntities = new NetworkedEntities(world); var clientSystem = new ClientSystem(world, _messageTargetMap, _clientMessagingChannel); clientSystem.AddListener(new TransformMessageApplier(networkedEntities)); clientSystem.AddListener(new ClientEntityAssignmentApplier(networkedEntities)); clientSystem.AddListener(new VoxelSpaceMessageApplier(networkedEntities)); clientSystem.AddListener(new VoxelGridMessageApplier(setVoxelRender, networkedEntities)); clientSystem.AddListener(new VoxelGridChangeMessageApplier(networkedEntities)); clientSystem.AddListener(new EntityRemover(networkedEntities)); clientSystem.AddListener(new ComponentSyncMessageApplier <EntityMetaData>(networkedEntities)); scene.AddSystem(clientSystem); var parallelRunner = new DefaultParallelRunner(8); var px = Image.Load("Assets\\Textures\\cloudtop_rt.png"); var nx = Image.Load("Assets\\Textures\\cloudtop_lf.png"); var py = Image.Load("Assets\\Textures\\cloudtop_up.png"); var ny = Image.Load("Assets\\Textures\\cloudtop_dn.png"); var pz = Image.Load("Assets\\Textures\\cloudtop_bk.png"); var nz = Image.Load("Assets\\Textures\\cloudtop_ft.png"); scene.AddSystem(new SkyboxRenderer(_client.GraphicsDevice, _client.MainSceneFramebuffer, px, nx, py, ny, pz, nz)); scene.AddSystem(new MeshGeometryRenderer(_client.GraphicsDevice, materialInputLayouts, world)); scene.AddSystem(new LightMeshGeometryRenderer(_client.GraphicsDevice, materialInputLayouts, world)); var voxelTypes = LoadVoxelTypes(); var editors = new List <IEditor>() { new SelectedEntitySystem(world), new EntityInspector(world), new EntityList(world), new SystemList(scene), new VoxelEditor(_clientMessagingChannel, world, voxelTypes.Select((t, i) => (t.Name, new Voxel() { Exists = true, BlockType = (ushort)i })).ToArray()), new VoxelSpaceLoader(_clientMessagingChannel, world) }; _editorMenu.AddEditorSet("Client", editors); scene.AddSystem(_editorMenu); scene.AddSystems(editors); scene.AddSystem(new SunLightPropogationSystem(world, new VoxelTypes(voxelTypes))); scene.AddSystem(new VoxelGridMesher(commandRecorder, world, new VoxelTypes(voxelTypes), _client.GraphicsDevice, parallelRunner)); scene.AddSystem(new MeshGeometryCleaner(world)); scene.AddSystem(new LightVertexCleaner(world)); scene.AddSystem(new TransformLerper(networkedEntities, world)); scene.AddSystem(new FlagClearingSystem <NeighbourMemberChanged>(world)); scene.AddSystem(new InputForceApplierInputSystem(_clientMessagingChannel, world)); scene.AddSystem(new SimpleCameraMoverInputSystem(_clientMessagingChannel, world)); world.SubscribeEntityDisposed((in Entity e) => { if (e.Has <VoxelGrid>()) { var voxelGrid = e.Get <VoxelGrid>(); voxelGrid.VoxelSpace.Remove(voxelGrid.MemberIndex); } });
private static void _server_Started() { var world = new World(); var commandRecorder = new EntityCommandRecorder(); var scene = new Scene("Server", world, commandRecorder); var networkedEntities = new NetworkedEntities(world); var physicsSystem = new PhysicsSystem(); var editors = new List <IEditor>() { //new EditorConsole(_client.Scene), new SelectedEntitySystem(world), new EntityInspector(world), new EntityList(world), new SystemList(scene), new AverageMetricValue(), new MetricGraph() }; _editorMenu.AddEditorSet("Server", editors); scene.AddSystems(editors); var parallelRunner = new DefaultParallelRunner(4); var serverSystem = new ServerSystem(world, _messageTargetMap); serverSystem.AddListener(new TransformMessageApplier(networkedEntities)); serverSystem.AddListener(new InputForceApplier(physicsSystem, world)); serverSystem.AddListener(new SimpleCameraMover(physicsSystem, networkedEntities)); serverSystem.AddListener(new VoxelEditReceiver(physicsSystem)); serverSystem.AddListener(new VoxelSpaceLoadReciever(world)); scene.AddSystem(serverSystem); var voxelTypes = LoadVoxelTypes(); var worldVoxelSpace = world.CreateEntity(); worldVoxelSpace.Set(new NetworkedEntity() { Id = Guid.NewGuid() }); worldVoxelSpace.Set(new Transform(worldVoxelSpace)); worldVoxelSpace.Set(new VoxelSpace(32, 1, worldVoxelSpace)); worldVoxelSpace.Set(new EntityMetaData() { Name = "Voxel Space" }); scene.AddSystem(new WorldSpaceLoader((e) => { }, world, worldVoxelSpace, 4, 3, 32)); scene.AddSystem(new ChunkGeneratorSystem(commandRecorder, parallelRunner, new ChunkGenerator(), world)); scene.AddSystem(new VoxelSpaceExpanderSystem((e) => { }, world)); scene.AddSystem(new PhysicsBlockFinder(world, parallelRunner)); scene.AddSystem(new VoxelSpaceChangePropogator(world)); scene.AddSystem(new VoxelStaticBodyGenerator(physicsSystem, world)); scene.AddSystem(new VoxelSpaceDynamicBodyGenerator(physicsSystem, world)); scene.AddSystem(physicsSystem); scene.AddSystem(new DynamicBodyPositionSync(world)); scene.AddSystem(new CharacterInputSystem(physicsSystem, world)); scene.AddSystem(new EntityRemovalSync(world)); scene.AddSystem(new ClientEntityAssignmentSystem()); scene.AddSystem(new TransformChangeServerSystem(world)); scene.AddSystem(new VoxelSpaceAddedServerSystem(world)); scene.AddSystem(new VoxelGridExistenceServerSystem(world)); scene.AddSystem(new VoxelGridChangeServerSystem(world)); scene.AddSystem(new ComponentSyncServerSystem <EntityMetaData>(world)); scene.AddSystem(new FlagClearingSystem <NeighbourMemberChanged>(world)); _server.SetScene(scene); }
public ConstructPilotingApplier(NetworkedEntities entities) : base(entities) { }
public override void Delete() { base.Delete(); NetworkedEntities.Remove(EntityID); }
public ClientEntityAssignmentApplier(NetworkedEntities entities) : base(entities) { }
public ThrusterMessageApplier(NetworkedEntities entities) : base(entities) { }
public ComponentSyncMessageApplier(NetworkedEntities entities) : base(entities) { }
private static byte[] GetNetworkTableHash(IList <NetworkedEntity> types) { bool first; const char separator = '¬'; StringBuilder sb = new StringBuilder(); foreach (var ent in types) { sb.Append(separator); sb.Append(separator); sb.Append(separator); sb.Append(ent.NetworkedType); sb.Append(separator); sb.Append(separator); first = true; foreach (NetworkField field in ent.Fields) { if (first) { first = false; } else { sb.Append(separator); } sb.Append(field.Describe()); } if (ent.UsesRelatedClient) { sb.Append(separator); sb.Append(separator); first = true; foreach (NetworkField field in ent.RelatedClientFields) { if (first) { first = false; } else { sb.Append(separator); } sb.Append(field.Describe()); } sb.Append(separator); sb.Append(separator); first = true; foreach (NetworkField field in ent.OtherClientFields) { if (first) { first = false; } else { sb.Append(separator); } sb.Append(field.Describe()); } } } string fullTable = sb.Length > 0 ? sb.ToString().Substring(3) : string.Empty; #if DEBUG #if SERVER Console.WriteLine("Server network table:"); #elif CLIENT Console.WriteLine("Client network table:"); #endif Console.WriteLine(fullTable.Replace(separator, '\n')); #endif MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(Constants.NetworkTableStringEncoding.GetBytes(fullTable)); md5.Clear(); AllEntities.Clear(); NetworkedEntities.Clear(); return(hash); }