예제 #1
0
파일: Client.cs 프로젝트: Phlarfl/TSML
        private Voxel AddClick(WorldMaster master, Maker maker, PacketAddVoxel packet)
        {
            int dstHeight = packet.DestinationHeight;
            var voxelType = packet.VoxelType;
            var vert      = new Vert()
            {
                angle  = packet.VertAngle,
                hexPos = packet.HexPos
            };

            if (!vert.full)
            {
                vert = master.grid.GetVertOrIterate(packet.HexPos, null);
            }

            if (!vert.full || !master.graph.IsCoordinateAllowed(vert.hexPos))
            {
                return(null);
            }

            maker.BeginNewAction();
            if (dstHeight == 0)
            {
                voxelType = VoxelType.Ground;
            }

            var result = master.graph.AddVoxel(vert.hexPos, (byte)dstHeight, voxelType, true);

            maker.AddAction(vert.hexPos, (byte)dstHeight, VoxelType.Empty, voxelType);
            maker.EndAction();
            return(result);
        }
예제 #2
0
파일: Client.cs 프로젝트: Phlarfl/TSML
        private void OnEvent(Event e)
        {
            var master = BootMaster.instance.worldMaster;

            if (e is EventGroundClickerAddClick eventAddClick)
            {
                var gc = eventAddClick.GroundClicker;

                var packetAddVoxel = new PacketAddVoxel(client)
                {
                    ValidAdd          = master.hoverData.validAdd,
                    DestinationHeight = master.hoverData.dstHeight,
                    VertAngle         = master.hoverData.dstVert.angle,
                    HexPos            = master.hoverData.dstVert.hexPos,
                    VoxelType         = gc.currentVoxelType,
                    PlanePos          = master.hoverData.dstVert.planePos
                };
                client.SendMessage(packetAddVoxel.Serialize(), NetDeliveryMethod.ReliableOrdered);
                client.FlushSendQueue();
            }
            else if (e is EventGroundClickerRemoveClick eventRemoveClick)
            {
                var gc = eventRemoveClick.GroundClicker;

                var packetRemoveVoxel = new PacketRemoveVoxel(client)
                {
                    ValidRemove       = master.hoverData.validRemove,
                    DestinationHeight = master.hoverData.dstHeight,
                    HexPos            = master.hoverData.dstVert.hexPos,
                    PlanePos          = master.hoverData.dstVert.planePos,
                    VoxelPosition     = master.hoverData.voxel.transform.position
                };
                client.SendMessage(packetRemoveVoxel.Serialize(), NetDeliveryMethod.ReliableOrdered);
                client.FlushSendQueue();
            }
        }
예제 #3
0
파일: Server.cs 프로젝트: Phlarfl/TSML
        public void Update()
        {
            if (server != null)
            {
                NetIncomingMessage incoming;
                while ((incoming = server.ReadMessage()) != null)
                {
                    switch (incoming.MessageType)
                    {
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.DebugMessage:
                    case NetIncomingMessageType.WarningMessage:
                    case NetIncomingMessageType.ErrorMessage:
                    {
                        var message = incoming.ReadString();
                        Print(message);
                    }
                    break;

                    case NetIncomingMessageType.StatusChanged:
                    {
                        var status = (NetConnectionStatus)incoming.ReadByte();
                        var reason = incoming.ReadString();

                        switch (status)
                        {
                        case NetConnectionStatus.Connected:
                        {
                            var hailMessage = incoming.SenderConnection.RemoteHailMessage;
                            var name        = hailMessage.ReadString();
                            Print($"{name} joined the game");

                            if (BootMaster.instance.worldMaster && BootMaster.instance.worldMaster.state == WorldMaster.State.Done)
                            {
                                var packetWorld = new PacketWorld(server)
                                {
                                    WorldData = BootMaster.instance.worldMaster.GetSaveString()
                                };
                                var outgoing = packetWorld.Serialize();
                                incoming.SenderConnection.SendMessage(outgoing, NetDeliveryMethod.ReliableOrdered, 0);
                            }
                        }
                        break;

                        case NetConnectionStatus.Disconnected:
                        {
                            Print($"{NetUtility.ToHexString(incoming.SenderConnection.RemoteUniqueIdentifier)} {status}: {reason}");
                        }
                        break;
                        }
                    }
                    break;

                    case NetIncomingMessageType.Data:
                    {
                        var packetType = (PacketType)incoming.ReadByte();
                        switch (packetType)
                        {
                        case PacketType.WORLD_DATA:
                        {
                            var packet = new PacketWorld(server);
                            packet.Deserialize(incoming);
                        }
                        break;

                        case PacketType.ADD_VOXEL:
                        {
                            var packet = new PacketAddVoxel(server);
                            packet.Deserialize(incoming);

                            var others = server.Connections;
                            others.Remove(incoming.SenderConnection);

                            if (others.Count > 0)
                            {
                                server.SendMessage(packet.Serialize(), others, NetDeliveryMethod.ReliableOrdered, 0);
                            }
                        }
                        break;

                        case PacketType.REMOVE_VOXEL:
                        {
                            var packet = new PacketRemoveVoxel(server);
                            packet.Deserialize(incoming);

                            var others = server.Connections;
                            others.Remove(incoming.SenderConnection);

                            if (others.Count > 0)
                            {
                                server.SendMessage(packet.Serialize(), others, NetDeliveryMethod.ReliableOrdered, 0);
                            }
                        }
                        break;
                        }
                    }
                    break;
                    }
                    server.Recycle(incoming);
                }
            }
        }
예제 #4
0
파일: Client.cs 프로젝트: Phlarfl/TSML
        public void Update(object peer)
        {
            NetIncomingMessage incoming;

            while ((incoming = client.ReadMessage()) != null)
            {
                switch (incoming.MessageType)
                {
                case NetIncomingMessageType.VerboseDebugMessage:
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.WarningMessage:
                case NetIncomingMessageType.ErrorMessage:
                {
                    var message = incoming.ReadString();
                    Print(message);
                }
                break;

                case NetIncomingMessageType.StatusChanged:
                {
                    var status = (NetConnectionStatus)incoming.ReadByte();
                    var reason = incoming.ReadString();

                    switch (status)
                    {
                    case NetConnectionStatus.Connected:
                    {
                        Print($"{status}: {reason}");
                    }
                    break;

                    case NetConnectionStatus.Disconnected:
                    {
                        Print($"{status}: {reason}");
                        Shutdown(reason);
                    }
                    break;
                    }
                }
                break;

                case NetIncomingMessageType.Data:
                {
                    var packetType = (PacketType)incoming.ReadByte();
                    switch (packetType)
                    {
                    case PacketType.WORLD_DATA:
                    {
                        var packet = new PacketWorld(client);
                        packet.Deserialize(incoming);

                        if (BootMaster.instance.worldMaster)
                        {
                            BootMaster.instance.worldMaster.SaveCurrentAndLoadAsNew(packet.WorldData);
                        }
                    }
                    break;

                    case PacketType.ADD_VOXEL:
                    {
                        var packet = new PacketAddVoxel(client);
                        packet.Deserialize(incoming);

                        var master        = BootMaster.instance.worldMaster;
                        var maker         = master.maker;
                        var groundClicker = master.groundClicker;

                        if (packet.ValidAdd)
                        {
                            var voxel = AddClick(master, maker, packet);
                            groundClicker.lastAddedVoxel = voxel;
                            master.clickEffect.Click(true, packet.PlanePos, packet.DestinationHeight, voxel.type);
                        }
                    }
                    break;

                    case PacketType.REMOVE_VOXEL:
                    {
                        var packet = new PacketRemoveVoxel(client);
                        packet.Deserialize(incoming);

                        var master = BootMaster.instance.worldMaster;
                        var maker  = master.maker;

                        if (packet.ValidRemove)
                        {
                            var voxel = RemoveClick(master, maker, packet);
                            master.clickEffect.Click(false, packet.PlanePos, packet.DestinationHeight, voxel.type);
                        }
                    }
                    break;
                    }
                }
                break;
                }
                client.Recycle(incoming);
            }
        }