Пример #1
0
        // ReSharper restore FunctionNeverReturns

        private static void PlayerThread(NetworkPlayer player)
        {
            NetworkStream clientStream;

            //make all the introductions. we do this before sending the world so the client doesn't see them as new connections
            foreach (var otherPlayer in Players.Values)
            {
                try
                {
                    new Connect(otherPlayer.Id, otherPlayer.UserName, otherPlayer.Coords)
                    {
                        ConnectedPlayer = player, Immediate = true
                    }.Send();
                }
                catch (Exception ex)
                {
                    WriteToServerConsoleLog(string.Format("{0} {1} caused an exception and was removed: {2}", player.UserName, player.IpAddress, ex.Message));
#if DEBUG
                    WriteToServerConsoleLog(ex.StackTrace);
#endif
                }

                new Connect(player.Id, player.UserName, player.Coords)
                {
                    ConnectedPlayer = otherPlayer
                }.Send();
            }

            try
            {
                Players.TryAdd(player.Id, player);                 //note: it is not possible for the add to fail on ConcurrentDictionary, see: http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections
                UpdateServerConsolePlayerList();

                var getWorld = new GetWorld {
                    ConnectedPlayer = player
                };
                getWorld.Send();
                WriteToServerConsoleLog(String.Format("World send complete to {0} ({1} compressed, {2} uncompressed)", player.IpAddress, getWorld.DataLength, getWorld.UncompressedLength));

                //create a thread to handle communication with connected client
                player.TcpClient.NoDelay = true;
                clientStream             = player.TcpClient.GetStream();
            }
            catch (Exception ex)
            {
                HandleNetworkError(player, ex);
                return;
            }

            var actionTypebytes = new byte[sizeof(ushort)];
            try
            {
                if (!string.IsNullOrWhiteSpace(Config.MOTD))
                {
                    new ServerMsg(Config.MOTD, player).Send();
                }

                while (true)
                {
                    Thread.Sleep(10);                     //bm: polling is expensive. don't remove this or the server will pin your machine when only a couple users are online
                    GameAction gameAction;
                    while (player.SendQueue.Count > 0 && player.SendQueue.TryDequeue(out gameAction))
                    {
                        gameAction.Immediate = true;
                        gameAction.Send();
                    }

                    if (!clientStream.DataAvailable)
                    {
                        continue;
                    }
                    var bytesRead = 0;
                    while (bytesRead < actionTypebytes.Length)
                    {
                        bytesRead += clientStream.Read(actionTypebytes, bytesRead, actionTypebytes.Length - bytesRead);
                    }
                    var actionType = (ActionType)BitConverter.ToUInt16(actionTypebytes, 0);
                    switch (actionType)
                    {
                    case ActionType.AddBlock:
                        gameAction = new AddBlock();
                        break;

                    case ActionType.AddBlockItem:
                        gameAction = new AddBlockItem();
                        break;

                    case ActionType.AddBlockMulti:
                        gameAction = new AddBlockMulti();
                        break;

                    case ActionType.AddCuboid:
                        gameAction = new AddCuboid();
                        break;

                    case ActionType.AddProjectile:
                        gameAction = new AddProjectile();
                        break;

                    case ActionType.AddStaticItem:
                        gameAction = new AddStaticItem();
                        break;

                    case ActionType.AddStructure:
                        gameAction = new AddStructure();
                        break;

                    case ActionType.ChatMsg:
                        gameAction = new ChatMsg();
                        break;

                    case ActionType.Disconnect:
                        gameAction = new Disconnect();
                        break;

                    case ActionType.PickupBlockItem:
                        gameAction = new PickupBlockItem();
                        break;

                    case ActionType.PlayerInfo:
                        gameAction = new PlayerInfo();
                        break;

                    case ActionType.PlayerMove:
                        gameAction = new PlayerMove();
                        break;

                    case ActionType.PlayerOption:
                        gameAction = new PlayerOption();
                        break;

                    case ActionType.RemoveBlock:
                        gameAction = new RemoveBlock();
                        break;

                    case ActionType.RemoveBlockItem:
                        gameAction = new RemoveBlockItem();
                        break;

                    case ActionType.RemoveBlockMulti:
                        gameAction = new RemoveBlockMulti();
                        break;

                    case ActionType.ServerCommand:
                        gameAction = new ServerCommand();
                        break;

                    case ActionType.Connect:
                    case ActionType.ServerMsg:
                    case ActionType.ServerSync:
                    case ActionType.GetWorld:
                        throw new Exception(string.Format("Server should not receive action type: {0}", actionType));

                    case ActionType.Error:
                        var bytes = 0;
                        while (clientStream.ReadByte() != -1)
                        {
                            bytes++;
                        }
                        throw new Exception("GameAction 'Error' received. " + bytes + " byte(s) remained in the stream.");

                    default:
                        throw new Exception(string.Format("Unknown action type: {0}", actionType));
                    }
                    gameAction.ConnectedPlayer = player;
                    gameAction.Receive();
                    if (HasServerConsole && CaptureIncoming)                     //only stream messages if there is a console window and it has requested to display them
                    {
                        _serverConsole.UpdateStreamLogInvokable(gameAction, player, false);
                    }
                    if (actionType == ActionType.Disconnect)
                    {
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                HandleNetworkError(player, ex);
            }
        }
Пример #2
0
    private List<AddStructure> LoadAllLists()
    {
        string connectionString = ConfigurationSettings.AppSettings["fleetnetbaseConnectionString"];
        DataBlock dataBlock = new DataBlock(connectionString, ConfigurationManager.AppSettings["language"]);
        try
        {
            int orgId = Convert.ToInt32(Session["CURRENT_ORG_ID"]);
            List<AddStructure> addStructureList = new List<AddStructure>();
            int i = 0;

            AddStructure addStructureTemp;
            List<int> dataBlockIds = new List<int>();

            dataBlock.OpenConnection();
            dataBlockIds = dataBlock.GetAllUnparsedDataBlockIDs(orgId);
            foreach (int dataBlockId in dataBlockIds)
            {
                i++;
                addStructureTemp = new AddStructure();
                addStructureTemp.dataBlockId = dataBlockId;
                addStructureTemp.number = i;
                addStructureTemp.name = dataBlock.GetDataBlock_FileName(dataBlockId);
                addStructureTemp.state = dataBlock.GetDataBlockState(dataBlockId);
                addStructureTemp.byteSize = Convert.ToInt32(dataBlock.GetDataBlock_BytesCount(dataBlockId));

                addStructureList.Add(addStructureTemp);
            }
            if (dataBlockIds.Count == 0)
            {
                Parse_Button.Enabled = false;
                Status.Text = "Нет записей для отображения";
            }
            else
            {
                Parse_Button.Enabled = true;
                Status.Text = "";
            }

            AddGrid.DataSource = CreateDataSource(addStructureList);
            AddGrid.DataBind();
            SetDelColVisible(true);
            setParseButtonVisible(true);
            dataBlock.CloseConnection();
            return addStructureList;
        }
        catch (Exception ex)
        {
            dataBlock.CloseConnection();
            Status.Text = "Произошла ошибка: " + ex.Message;
            return null;
        }
        finally
        {
            StatusUpdatePanel.Update();
        }
    }