コード例 #1
0
 public void Load()
 {
     if (savedVessel != null && savedSubspace != null)
     {
         if ((UnityEngine.Time.realtimeSinceStartup - lastLoadTime) > 5f)
         {
             lastLoadTime = UnityEngine.Time.realtimeSinceStartup;
             TimeSyncer.fetch.UnlockSubspace();
             long serverClock = TimeSyncer.fetch.GetServerClock();
             int newSubspace = TimeSyncer.fetch.LockNewSubspace(serverClock, savedSubspace.planetTime, savedSubspace.subspaceSpeed);
             using (MessageWriter mw = new MessageWriter())
             {
                 mw.Write<int>((int)WarpMessageType.NEW_SUBSPACE);
                 mw.Write<string>(Settings.fetch.playerName);
                 mw.Write<int>(newSubspace);
                 mw.Write<long>(serverClock);
                 mw.Write<double>(savedSubspace.planetTime);
                 mw.Write<float>(savedSubspace.subspaceSpeed);
                 NetworkWorker.fetch.SendWarpMessage(mw.GetMessageBytes());
             }
             TimeSyncer.fetch.LockSubspace(newSubspace);
             VesselWorker.fetch.LoadVessel(savedVessel);
             ScreenMessages.PostScreenMessage("Quickloaded!", 3f, ScreenMessageStyle.UPPER_CENTER);
         }
     }
     else
     {
         ScreenMessages.PostScreenMessage("No current quicksave to load from!", 3f, ScreenMessageStyle.UPPER_CENTER);
     }
 }
コード例 #2
0
 /// <summary>
 /// Write the constraint description to a MessageWriter
 /// </summary>
 /// <param name="writer">The writer on which the description is displayed</param>
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WritePredicate("String starting with");
     writer.WriteExpectedValue(MsgUtils.ClipString(expected, writer.MaxLineLength - 40, 0));
     if (this.caseInsensitive)
         writer.WriteModifier("ignoring case");
 }
コード例 #3
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     foreach (var msg in messages)
     {
         msg.Invoke(writer);
     }
 }
コード例 #4
0
ファイル: ScenarioData.cs プロジェクト: Opice/DarkMultiPlayer
 public static void SendScenarioModules(ClientObject client)
 {
     int numberOfScenarioModules = Directory.GetFiles(Path.Combine(Server.universeDirectory, "Scenarios", client.playerName)).Length;
     int currentScenarioModule = 0;
     string[] scenarioNames = new string[numberOfScenarioModules];
     byte[][] scenarioDataArray = new byte[numberOfScenarioModules][];
     foreach (string file in Directory.GetFiles(Path.Combine(Server.universeDirectory, "Scenarios", client.playerName)))
     {
         //Remove the .txt part for the name
         scenarioNames[currentScenarioModule] = Path.GetFileNameWithoutExtension(file);
         scenarioDataArray[currentScenarioModule] = File.ReadAllBytes(file);
         currentScenarioModule++;
     }
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.SCENARIO_DATA;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string[]>(scenarioNames);
         foreach (byte[] scenarioData in scenarioDataArray)
         {
             if (client.compressionEnabled)
             {
                 mw.Write<byte[]>(Compression.CompressIfNeeded(scenarioData));
             }
             else
             {
                 mw.Write<byte[]>(Compression.AddCompressionHeader(scenarioData, false));
             }
         }
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #5
0
        /// <summary>
        /// Writes the <see cref="UpgradeBuildingCommand"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="UpgradeBuildingCommand"/>.
        /// </param>
        public override void WriteCommand(MessageWriter writer)
        {
            writer.Write(BuildingGameIndex);

            writer.Write(Unknown1);
            writer.Write(Unknown2);
        }
コード例 #6
0
ファイル: PlayerColor.cs プロジェクト: Opice/DarkMultiPlayer
 public static void SendAllPlayerColors(ClientObject client)
 {
     Dictionary<string,float[]> sendColors = new Dictionary<string, float[]>();
     foreach (ClientObject otherClient in ClientHandler.GetClients())
     {
         if (otherClient.authenticated && otherClient.playerColor != null)
         {
             if (otherClient != client)
             {
                 sendColors[otherClient.playerName] = otherClient.playerColor;
             }
         }
     }
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.PLAYER_COLOR;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)PlayerColorMessageType.LIST);
         mw.Write<int>(sendColors.Count);
         foreach (KeyValuePair<string, float[]> kvp in sendColors)
         {
             mw.Write<string>(kvp.Key);
             mw.Write<float[]>(kvp.Value);
         }
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #7
0
 public PageUrlValidator(NameValueCollection queryString, DataManager manager)
 {
     _queryString = queryString;
     _isValid = false;
     _manager = manager;
     _writer = new MessageWriter();
 }
コード例 #8
0
        public async Task WritesMessage()
        {
            MemoryStream outputStream = new MemoryStream();

            MessageWriter messageWriter = 
                new MessageWriter(
                    outputStream,
                    this.messageSerializer);

            // Write the message and then roll back the stream to be read
            // TODO: This will need to be redone!
            await messageWriter.WriteMessage(Message.Event("testEvent", null));
            outputStream.Seek(0, SeekOrigin.Begin);

            string expectedHeaderString =
                string.Format(
                    Constants.ContentLengthFormatString,
                    ExpectedMessageByteCount);

            byte[] buffer = new byte[128];
            await outputStream.ReadAsync(buffer, 0, expectedHeaderString.Length);

            Assert.Equal(
                expectedHeaderString,
                Encoding.ASCII.GetString(buffer, 0, expectedHeaderString.Length));

            // Read the message
            await outputStream.ReadAsync(buffer, 0, ExpectedMessageByteCount);

            Assert.Equal(
                TestEventString,
                Encoding.UTF8.GetString(buffer, 0, ExpectedMessageByteCount));

            outputStream.Dispose();
        }
コード例 #9
0
 /// <summary>
 /// Write the constraint description to a MessageWriter
 /// </summary>
 /// <param name="writer">The writer on which the description is displayed</param>
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WritePredicate("String ending with");
     writer.WriteExpectedValue(expected);
     if (this.caseInsensitive)
         writer.WriteModifier("ignoring case");
 }
コード例 #10
0
 public static void RunNukeKSC(string commandText)
 {
     lock (Server.universeSizeLock)
     {
         string[] vesselList = Directory.GetFiles(Path.Combine(Server.universeDirectory, "Vessels"));
         int numberOfRemovals = 0;
         foreach (string vesselFile in vesselList)
         {
             string vesselID = Path.GetFileNameWithoutExtension(vesselFile);
             bool landedAtKSC = false;
             bool landedAtRunway = false;
             using (StreamReader sr = new StreamReader(vesselFile))
             {
                 string currentLine = sr.ReadLine();
                 while (currentLine != null && !landedAtKSC && !landedAtRunway)
                 {
                     string trimmedLine = currentLine.Trim();
                     if (trimmedLine.StartsWith("landedAt = "))
                     {
                         string landedAt = trimmedLine.Substring(trimmedLine.IndexOf("=") + 2);
                         if (landedAt == "KSC")
                         {
                             landedAtKSC = true;
                         }
                         if (landedAt == "Runway")
                         {
                             landedAtRunway = true;
                         }
                     }
                     currentLine = sr.ReadLine();
                 }
             }
             if (landedAtKSC | landedAtRunway)
             {
                 DarkLog.Normal("Removing vessel: " + vesselID);
                 //Delete it from the universe
                 if (File.Exists(vesselFile))
                 {
                     File.Delete(vesselFile);
                 }
                 //Send a vessel remove message
                 ServerMessage newMessage = new ServerMessage();
                 newMessage.type = ServerMessageType.VESSEL_REMOVE;
                 using (MessageWriter mw = new MessageWriter())
                 {
                     //Send it with a delete time of 0 so it shows up for all players.
                     mw.Write<int>(0);
                     mw.Write<double>(0);
                     mw.Write<string>(vesselID);
                     mw.Write<bool>(false);
                     newMessage.data = mw.GetMessageBytes();
                 }
                 ClientHandler.SendToAll(null, newMessage, false);
                 numberOfRemovals++;
             }
         }
         DarkLog.Normal("Nuked " + numberOfRemovals + " vessels around the KSC");
     }
 }
コード例 #11
0
        /// <summary>
        /// Writes the <see cref="BuyBuildingCommand"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="BuyBuildingCommand"/>.
        /// </param>
        public override void WriteCommand(MessageWriter writer)
        {
            writer.Write(X);
            writer.Write(Y);
            writer.Write(BuildingDataIndex);

            writer.Write(Unknown1);
        }
コード例 #12
0
ファイル: BuyDecoration.cs プロジェクト: circa94/CoCSharp
        /// <summary>
        /// Writes the <see cref="BuyDecoration"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="BuyDecoration"/>.
        /// </param>
        public override void WriteCommand(MessageWriter writer)
        {
            writer.Write(X);
            writer.Write(Y);
            writer.Write(DecorationDataIndex);

            writer.Write(Unknown1);
        }
コード例 #13
0
        public async Task<StreamResponse> HandleAsync(MessageWriter messageWriter, CancellationToken cancellationToken)
        {
            if (messageWriter == null)
            {
                throw new ArgumentNullException("messageWriter");
            }
            if (cancellationToken == null)
            {
                throw new ArgumentNullException("cancellationToken");
            }

            this.messageWriter = messageWriter;

            log.Trace("HandleAsync: '{0}' JobId: '{1}''", request.Handle, request.JobId);

            StreamResponse streamResponse = null;

            Job job = GetJobById(request.JobId, ref streamResponse); // if job is null, streamResponse is set to error
            if (job != null)
            {
                if (job.HasStatus)
                {
                    var awaitables = new List<Task>();
                    foreach (IJobStatus status in job.RetrieveStatus())
                    {
                        awaitables.Add(ListenStatusAsync(status));
                    }
                    await Task.WhenAll(awaitables);
                }

                try
                {
                    if (job.IsCompleted)
                    {
                        if (job.Result == null)
                        {
                            streamResponse = ToStreamResponse(GetResponseData(true, "Error! Job with ID '{0}' is completed but no result is available!\n", request.JobId));
                        }
                        else
                        {
                            streamResponse = ToStreamResponse(job.Result);
                        }
                    }
                    else
                    {
                        job.AttachListener(this);
                        IJobResult result = await job.ListenAsync();
                        streamResponse = StreamResponse.Create(result.ExitCode);
                    }
                }
                finally
                {
                    jobManager.RemoveJob(request.JobId);
                }
            }

            return streamResponse;
        }
コード例 #14
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     if (!(actual is SilverFunction)) {
         writer.WriteLine("Expected SilverFunction, but got {0} instead", actual.GetType());
     }
     else {
         writer.WriteLine("Expected {0}, but got {1} instead", actual, Expected);
     }
 }
コード例 #15
0
 public override void WriteActualValueTo(MessageWriter writer)
 {
     if (this.propertyExists) {
         writer.WriteActualValue(this.propValue);
     }
     else {
         writer.WriteActualValue(String.Format("The property {0} was not found on type {1}", name, base.actual.GetType()));
     }
 }
コード例 #16
0
        /// <summary>
        /// Writes the <see cref="OwnHomeDataMessage"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="OwnHomeDataMessage"/>.
        /// </param>
        public override void WriteMessage(MessageWriter writer)
        {
            if (OwnAvatarData == null) // quit early just not to mess up the stream
                throw new NullReferenceException("OwnAvatarData was null.");

            writer.Write((int)LastVisit.TotalSeconds);
            writer.Write(Unknown1); // -1
            writer.Write((int)DateTimeConverter.ToUnixTimestamp(Timestamp));

            OwnAvatarData.Write(writer);
        }
コード例 #17
0
        /// <summary>
        /// Constructor for ClientConnection
        /// </summary>
        /// <param name="id">ClientID is an id representing this connection</param>
        /// <param name="connection">This is a TCPConnection representing the connection to the client</param>
        /// <param name="MessageReceived">This is a delegate representing the method to be called when a message is received</param>
        /// <param name="ConnectionFailed">This is a delegate representing the method to be called when the connection fails</param>
        /// <param name="MessageFailed">This is a delegate representing the method to be called when a corrupt message is received</param>
        public ClientConnection(TCPConnection connection)
        {
            this.buffer = new Buffer<AbstractMessage>();
            this.connection = connection;
            ClientID = new ClientID();

            terminating = false;
            hasStarted = false;
            writer = new MessageWriter(this, connection);
            reader = new MessageReader(this, connection);
        }
        public void Write_WritesMessageToStorage()
        {
            var message = new Message("This is my message");
            var mockStorage = Substitute.For<IPersistentStorage>();

            var messageWriter = new MessageWriter(mockStorage);

            messageWriter.Write(message);

            mockStorage.Received(1).Write(Arg.Any<byte[]>());
        }
コード例 #19
0
 /// <summary>
 /// Writes the <see cref="NewClientEncryptionMessage"/> to the specified <see cref="MessageWriter"/>.
 /// </summary>
 /// <param name="writer">
 /// <see cref="MessageWriter"/> that will be used to write the <see cref="NewClientEncryptionMessage"/>.
 /// </param>
 public override void WriteMessage(MessageWriter writer)
 {
     writer.Write(Unknown1);
     writer.Write(Unknown2);
     writer.Write(MajorVersion);
     writer.Write(Unknown4);
     writer.Write(MinorVersion);
     writer.Write(Hash);
     writer.Write(Unknown6);
     writer.Write(Unknown7);
 }
コード例 #20
0
        /// <summary>
        /// Writes the <see cref="MoveVillageObjectCommand"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="MoveVillageObjectCommand"/>.
        /// </param>
        /// <exception cref="NullReferenceException">MoveData is null.</exception>
        public override void WriteCommand(MessageWriter writer)
        {
            if (MoveData == null)
                throw new NullReferenceException("MoveData cannot be null");

            writer.Write(MoveData.X);
            writer.Write(MoveData.Y);
            writer.Write(MoveData.VillageObjectGameIndex);

            writer.Write(Unknown1);
        }
コード例 #21
0
 public static void SendConnectionEnd(ClientObject client, string reason)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CONNECTION_END;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string>(reason);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #22
0
ファイル: Chat.cs プロジェクト: Opice/DarkMultiPlayer
 public static void SendConsoleMessageToClient(ClientObject client, string message)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CHAT_MESSAGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)ChatMessageType.CONSOLE_MESSAGE);
         mw.Write<string>(message);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, false);
 }
コード例 #23
0
ファイル: CloudSetup.cs プロジェクト: perokvist/messageVault
        public static MessageWriter CreateAndInitWriter(CloudBlobContainer container)
        {
            container.CreateIfNotExists();
            var dataBlob = container.GetPageBlobReference(Constants.StreamFileName);
            var posBlob = container.GetPageBlobReference(Constants.PositionFileName);
            var pageWriter = new CloudPageWriter(dataBlob);
            var posWriter = new CloudCheckpointWriter(posBlob);
            var writer = new MessageWriter(pageWriter, posWriter);
            writer.Init();

            return writer;
        }
コード例 #24
0
ファイル: Header.cs プロジェクト: brookpatten/dbus-sharp
		internal void WriteHeaderToMessage (MessageWriter writer)
		{
			writer.Write ((byte)Endianness);
			writer.Write ((byte)MessageType);
			writer.Write ((byte)Flags);
			writer.Write (MajorVersion);
			writer.Write (Length);
			writer.Write (Serial);
			writer.WriteHeaderFields (fields);

			writer.CloseWrite ();
		}
コード例 #25
0
 public static void SendDMPModMessageToAll(ClientObject excludeClient, string modName, byte[] messageData, bool highPriority)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.MOD_DATA;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<string>(modName);
         mw.Write<byte[]>(messageData);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToAll(excludeClient, newMessage, highPriority);
 }
コード例 #26
0
 public static void SendAllAdmins(ClientObject client)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.ADMIN_SYSTEM;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write((int)AdminMessageType.LIST);
         mw.Write<string[]>(DarkMultiPlayerServer.AdminSystem.fetch.GetAdmins());
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #27
0
        /// <summary>
        /// Writes the <see cref="MoveVillageObjectCommand"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="MoveVillageObjectCommand"/>.
        /// </param>
        /// <exception cref="NullReferenceException">MovesData is null.</exception>
        public override void WriteCommand(MessageWriter writer)
        {
            if (MovesData == null)
                throw new NullReferenceException("MovesData cannot be null");

            for (int i = 0; i < MovesData.Length; i++)
            {
                writer.Write(MovesData[i].X);
                writer.Write(MovesData[i].Y);
                writer.Write(MovesData[i].VillageObjectGameIndex);
            }

            writer.Write(Unknown1);
        }
コード例 #28
0
ファイル: Handshake.cs プロジェクト: Opice/DarkMultiPlayer
 public static void SendHandshakeChallange(ClientObject client)
 {
     client.challange = new byte[1024];
     Random rand = new Random();
     rand.NextBytes(client.challange);
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.HANDSHAKE_CHALLANGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<byte[]>(client.challange);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #29
0
ファイル: Chat.cs プロジェクト: Opice/DarkMultiPlayer
 public static void SendChatMessageToClient(ClientObject client, string messageText)
 {
     ServerMessage newMessage = new ServerMessage();
     newMessage.type = ServerMessageType.CHAT_MESSAGE;
     using (MessageWriter mw = new MessageWriter())
     {
         mw.Write<int>((int)ChatMessageType.PRIVATE_MESSAGE);
         mw.Write<string>(Settings.settingsStore.consoleIdentifier);
         mw.Write<string>(client.playerName);
         mw.Write(messageText);
         newMessage.data = mw.GetMessageBytes();
     }
     ClientHandler.SendToClient(client, newMessage, true);
 }
コード例 #30
0
 public void AcquireLock(string lockName, bool force)
 {
     lock (lockObject)
     {
         using (MessageWriter mw = new MessageWriter())
         {
             mw.Write<int>((int)LockMessageType.ACQUIRE);
             mw.Write<string>(Settings.fetch.playerName);
             mw.Write<string>(lockName);
             mw.Write<bool>(force);
             NetworkWorker.fetch.SendLockSystemMessage(mw.GetMessageBytes());
         }
     }
 }
コード例 #31
0
 new public static compilation visit(compilation ast, TextWriter w, string[] args, MessageWriter msg)
 {
     if (msg.Count == 0)
     {
         (new typeswitch_ilgen(w, msg)).compilation(ast);
     }
     return(ast);
 }
コード例 #32
0
 /// <summary>
 /// Write the failure message to the MessageWriter provided
 /// as an argument. The default implementation simply passes
 /// the constraint and the actual value to the writer, which
 /// then displays the constraint description and the value.
 ///
 /// Constraints that need to provide additional details,
 /// such as where the error occured can override this.
 /// </summary>
 /// <param name="writer">The MessageWriter on which to display the message</param>
 public virtual void WriteMessageTo(MessageWriter writer)
 {
     writer.DisplayDifferences(this);
 }
コード例 #33
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     throw new System.NotImplementedException();
 }
コード例 #34
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WriteExpectedValue(failingExpected);
 }
コード例 #35
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WriteExpectedValue("an adult person at the age of at least 18");
 }
コード例 #36
0
        public override async ValueTask HandleMessageAsync(IMessageReader reader, MessageType messageType)
        {
            var flag = reader.Tag;

            _logger.LogTrace("[{0}] Server got {1}.", Id, flag);

            switch (flag)
            {
            case MessageFlags.HostGame:
            {
                // Read game settings.
                var gameInfo = Message00HostGameC2S.Deserialize(reader);

                // Create game.
                var game = await _gameManager.CreateAsync(gameInfo);

                // Code in the packet below will be used in JoinGame.
                using (var writer = MessageWriter.Get(MessageType.Reliable))
                {
                    Message00HostGameS2C.Serialize(writer, game.Code);
                    await Connection.SendAsync(writer);
                }

                break;
            }

            case MessageFlags.JoinGame:
            {
                Message01JoinGameC2S.Deserialize(
                    reader,
                    out var gameCode,
                    out _);

                var game = _gameManager.Find(gameCode);
                if (game == null)
                {
                    await DisconnectAsync(DisconnectReason.GameMissing);

                    return;
                }

                var result = await game.AddClientAsync(this);

                switch (result.Error)
                {
                case GameJoinError.None:
                    break;

                case GameJoinError.InvalidClient:
                    await DisconnectAsync(DisconnectReason.Custom, "Client is in an invalid state.");

                    break;

                case GameJoinError.Banned:
                    await DisconnectAsync(DisconnectReason.Banned);

                    break;

                case GameJoinError.GameFull:
                    await DisconnectAsync(DisconnectReason.GameFull);

                    break;

                case GameJoinError.InvalidLimbo:
                    await DisconnectAsync(DisconnectReason.Custom, "Invalid limbo state while joining.");

                    break;

                case GameJoinError.GameStarted:
                    await DisconnectAsync(DisconnectReason.GameStarted);

                    break;

                case GameJoinError.GameDestroyed:
                    await DisconnectAsync(DisconnectReason.Custom, DisconnectMessages.Destroyed);

                    break;

                case GameJoinError.Custom:
                    await DisconnectAsync(DisconnectReason.Custom, result.Message);

                    break;

                default:
                    await DisconnectAsync(DisconnectReason.Custom, "Unknown error.");

                    break;
                }

                break;
            }

            case MessageFlags.StartGame:
            {
                if (!IsPacketAllowed(reader, true))
                {
                    return;
                }

                await Player.Game.HandleStartGame(reader);

                break;
            }

            // No idea how this flag is triggered.
            case MessageFlags.RemoveGame:
                break;

            case MessageFlags.RemovePlayer:
            {
                if (!IsPacketAllowed(reader, true))
                {
                    return;
                }

                Message04RemovePlayerC2S.Deserialize(
                    reader,
                    out var playerId,
                    out var reason);

                await Player.Game.HandleRemovePlayer(playerId, (DisconnectReason)reason);

                break;
            }

            case MessageFlags.GameData:
            case MessageFlags.GameDataTo:
            {
                if (!IsPacketAllowed(reader, false))
                {
                    return;
                }

                var toPlayer = flag == MessageFlags.GameDataTo;

                // Handle packet.
                using var readerCopy = reader.Copy();

                // TODO: Return value, either a bool (to cancel) or a writer (to cancel (null) or modify/overwrite).
                try
                {
                    var verified = await Player.Game.HandleGameDataAsync(readerCopy, Player, toPlayer);

                    if (verified)
                    {
                        // Broadcast packet to all other players.
                        using (var writer = MessageWriter.Get(messageType))
                        {
                            if (toPlayer)
                            {
                                var target = reader.ReadPackedInt32();
                                reader.CopyTo(writer);
                                await Player.Game.SendToAsync(writer, target);
                            }
                            else
                            {
                                reader.CopyTo(writer);
                                await Player.Game.SendToAllExceptAsync(writer, Id);
                            }
                        }
                    }
                }
                catch (ImpostorCheatException e)
                {
                    if (_antiCheatConfig.BanIpFromGame)
                    {
                        Player.Game.BanIp(Connection.EndPoint.Address);
                    }

                    await DisconnectAsync(DisconnectReason.Hacking, e.Message);
                }

                break;
            }

            case MessageFlags.EndGame:
            {
                if (!IsPacketAllowed(reader, true))
                {
                    return;
                }

                await Player.Game.HandleEndGame(reader);

                break;
            }

            case MessageFlags.AlterGame:
            {
                if (!IsPacketAllowed(reader, true))
                {
                    return;
                }

                Message10AlterGameC2S.Deserialize(
                    reader,
                    out var gameTag,
                    out var value);

                if (gameTag != AlterGameTags.ChangePrivacy)
                {
                    return;
                }

                await Player.Game.HandleAlterGame(reader, Player, value);

                break;
            }

            case MessageFlags.KickPlayer:
            {
                if (!IsPacketAllowed(reader, true))
                {
                    return;
                }

                Message11KickPlayerC2S.Deserialize(
                    reader,
                    out var playerId,
                    out var isBan);

                await Player.Game.HandleKickPlayer(playerId, isBan);

                break;
            }

            case MessageFlags.GetGameListV2:
            {
                Message16GetGameListC2S.Deserialize(reader, out var options);
                await OnRequestGameListAsync(options);

                break;
            }

            default:
                _logger.LogWarning("Server received unknown flag {0}.", flag);
                break;
            }

#if DEBUG
            if (flag != MessageFlags.GameData &&
                flag != MessageFlags.GameDataTo &&
                flag != MessageFlags.EndGame &&
                reader.Position < reader.Length)
            {
                _logger.LogWarning(
                    "Server did not consume all bytes from {0} ({1} < {2}).",
                    flag,
                    reader.Position,
                    reader.Length);
            }
#endif
        }
コード例 #37
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.Write(Status);
 }
コード例 #38
0
        public static void Postfix(Il2CppReferenceArray <GameData.PlayerInfo> JPGEIBIBJPJ)
        {
            Main.Logic.AllModPlayerControl.Clear();
            Main.Logic.WinReason = WinReasons.Crewmates;
            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId,
                                                                              (byte)CustomRPC.ResetVariables, Hazel.SendOption.None, -1);

            AmongUsClient.Instance.FinishRpcImmediately(writer);

            List <PlayerControl> crewmates = PlayerTools.getCrewMates();

            foreach (PlayerControl player in PlayerControl.AllPlayerControls.ToArray())
            {
                Main.Logic.AllModPlayerControl.Add(new ModPlayerControl {
                    PlayerControl = player, Role = "Impostor", reportsLeft = MaxReportCount.GetValue(), LastAbilityTime = null
                });
            }
            foreach (PlayerControl player in crewmates)
            {
                player.getModdedControl().Role = "Crewmate";
            }

            if (crewmates.Count > 0 && (rng.Next(0, 100) <= JesterSpawnChance.GetValue()))
            {
                var idx = rng.Next(0, crewmates.Count);
                crewmates[idx].getModdedControl().Role = "Jester";
                byte JesterId = crewmates[idx].PlayerId;
                crewmates.RemoveAt(idx);

                writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId,
                                                                    (byte)CustomRPC.SetJester, Hazel.SendOption.None, -1);
                writer.Write(JesterId);
                AmongUsClient.Instance.FinishRpcImmediately(writer);
            }
            if (crewmates.Count > 0 && (rng.Next(0, 100) <= SheriffSpawnChance.GetValue()))
            {
                var idx = rng.Next(0, crewmates.Count);
                crewmates[idx].getModdedControl().Role = "Sheriff";
                byte SheriffId = crewmates[idx].PlayerId;
                crewmates.RemoveAt(idx);

                writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId,
                                                                    (byte)CustomRPC.SetSheriff, Hazel.SendOption.None, -1);
                writer.Write(SheriffId);
                AmongUsClient.Instance.FinishRpcImmediately(writer);
            }

            localPlayers.Clear();
            localPlayer = PlayerControl.LocalPlayer;
            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
            {
                if (player.Data.IsImpostor)
                {
                    continue;
                }

                localPlayers.Add(player);
            }
            var localPlayerBytes = new List <byte>();

            foreach (PlayerControl player in localPlayers)
            {
                localPlayerBytes.Add(player.PlayerId);
            }
            writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetLocalPlayers, Hazel.SendOption.None, -1);
            writer.WriteBytesAndSize(localPlayerBytes.ToArray());
            AmongUsClient.Instance.FinishRpcImmediately(writer);
        }
コード例 #39
0
        /// <summary>
        /// Writes the <see cref="AvatarMessageComponent"/> to the specified <see cref="MessageWriter"/>.
        /// </summary>
        /// <param name="writer">
        /// <see cref="MessageWriter"/> that will be used to write the <see cref="AvatarMessageComponent"/>.
        /// </param>
        /// <exception cref="ArgumentNullException"><paramref name="writer"/> is null.</exception>
        public override void WriteMessageComponent(MessageWriter writer)
        {
            ThrowIfWriterNull(writer);

            writer.Write(UserId);
            writer.Write(HomeId);
            writer.Write(ClanData != null);
            if (ClanData != null)
            {
                writer.Write(ClanData.Id);
                writer.Write(ClanData.Name);
                writer.Write(ClanData.Badge);
                writer.Write((int)ClanData.Role);
                writer.Write(ClanData.Level);
                writer.Write(ClanData.Unknown1);
                if (ClanData.Unknown1 == 1)
                {
                    writer.Write(ClanData.Unknown2);
                }
            }

            writer.Write(LegendaryTrophy);
            writer.Write(BestSeasonEnabled);
            writer.Write(BestSeasonMonth);
            writer.Write(BestSeasonYear);
            writer.Write(BestSeasonPosition);
            writer.Write(BestSeasonTrophies);
            writer.Write(LastSeasonEnabled);
            writer.Write(LastSeasonMonth);
            writer.Write(LastSeasonYear);
            writer.Write(LastSeasonPosition); // 1
            writer.Write(LastSeasonTrophies);

            writer.Write(LeagueLevel);
            writer.Write(AllianceCastleLevel);
            writer.Write(AllianceCastleTotalCapacity);
            writer.Write(AllianceCastleUsedCapacity);
            writer.Write(Unknown13); // 1 = 8.x.x
            writer.Write(Unknown14); // 0 = 8.x.x
            writer.Write(TownHallLevel);
            writer.Write(Name);

            writer.Write(Unknown15); // -1

            writer.Write(ExpLevels);
            writer.Write(ExpPoints);
            writer.Write(Gems);
            writer.Write(FreeGems);

            writer.Write(Unknown16); // 1200
            writer.Write(Unknown17); // 60

            writer.Write(Trophies);

            writer.Write(AttacksWon);
            writer.Write(AttacksLost);
            writer.Write(DefensesWon);
            writer.Write(DefensesLost);

            writer.Write(Unknown18);
            writer.Write(Unknown19);
            writer.Write(Unknown20);

            // 8.551.4
            writer.Write(Unknown29);

            writer.Write(Unknown21); // 1, might be a bool
            writer.Write(Unknown22); // 946720861000

            writer.Write(IsNamed);

            writer.Write(Unknown23);
            writer.Write(Unknown24);
            writer.Write(Unknown25);
            writer.Write(Unknown26); // 1
            writer.Write(Unknown27); // 1 = 8.x.x
            writer.Write(Unknown28); // 0 = 8.x.x

            // 8.551.4
            writer.Write(Unknown30);

            writer.WriteSlotCollection(ResourcesCapacity);
            writer.WriteSlotCollection(ResourcesAmount);
            writer.WriteSlotCollection(Units);
            writer.WriteSlotCollection(Spells);
            writer.WriteSlotCollection(UnitUpgrades);
            writer.WriteSlotCollection(SpellUpgrades);
            writer.WriteSlotCollection(HeroUpgrades);
            writer.WriteSlotCollection(HeroHealths);
            writer.WriteSlotCollection(HeroStates);
            writer.WriteSlotCollection(AllianceUnits);
            writer.WriteSlotCollection(TutorialProgress);
            writer.WriteSlotCollection(Achievements);
            writer.WriteSlotCollection(AchievementProgress);
            writer.WriteSlotCollection(NpcStars);
            writer.WriteSlotCollection(NpcGold);
            writer.WriteSlotCollection(NpcElixir);

            writer.Write(Unknown31);

            writer.WriteSlotCollection(UnknownSlot1);
            writer.WriteSlotCollection(UnknownSlot2);
            writer.WriteSlotCollection(UnknownSlot3);
            writer.WriteSlotCollection(UnknownSlot4);
            writer.WriteSlotCollection(UnknownSlot5);
            writer.WriteSlotCollection(UnknownSlot6);
            writer.WriteSlotCollection(UnknownSlot7);

            writer.WriteSlotCollection(UnknownSlot8);
        }
コード例 #40
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WritePredicate("A fake object wrapper.");
 }
コード例 #41
0
 public void GetLittleEndian()
 {
     Assert.IsTrue(MessageWriter.IsLittleEndian());
 }
コード例 #42
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WritePredicate("Path matching");
     writer.WriteExpectedValue(expected);
 }
コード例 #43
0
 public typeswitch_ilgen(TextWriter w, MessageWriter msg) : base(w, msg)
 {
 }
コード例 #44
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.Write(JToken.FromObject(Expected));
 }
コード例 #45
0
 public void SendOutputMessage()
 {
     MessageWriter.ShipDataOutputMessage(Ship);
 }
コード例 #46
0
ファイル: Client.cs プロジェクト: zneix/Impostor
 public void Send(MessageWriter writer)
 {
     Connection.Send(writer);
 }
コード例 #47
0
 public override void WriteActualValueTo(MessageWriter writer)
 {
     writer.Write(actual);
 }
コード例 #48
0
 public override void Write(MessageWriter writer, bool data)
 {
     writer.Write(data);
 }
コード例 #49
0
        public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target)
        {
            // Collect dead player info
            DeadPlayer deadPlayer = new DeadPlayer(target, DateTime.UtcNow, DeathReason.Kill, __instance);

            GameHistory.deadPlayers.Add(deadPlayer);

            // Reset killer to crewmate if resetToCrewmate
            if (resetToCrewmate)
            {
                __instance.Data.IsImpostor = false;
            }
            if (resetToDead)
            {
                __instance.Data.IsDead = true;
            }

            // Remove fake tasks when player dies
            if (target.hasFakeTasks())
            {
                target.clearAllTasks();
            }

            // Lover suicide trigger on murder
            if ((Lovers.lover1 != null && target == Lovers.lover1) || (Lovers.lover2 != null && target == Lovers.lover2))
            {
                PlayerControl otherLover = target == Lovers.lover1 ? Lovers.lover2 : Lovers.lover1;
                if (PlayerControl.LocalPlayer == target && otherLover != null && !otherLover.Data.IsDead && Lovers.bothDie)   // Only the dead lover sends the rpc
                {
                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LoverSuicide, Hazel.SendOption.Reliable, -1);
                    writer.Write(otherLover.PlayerId);
                    AmongUsClient.Instance.FinishRpcImmediately(writer);
                    RPCProcedure.loverSuicide(otherLover.PlayerId);
                }
            }

            // Sidekick promotion trigger on murder
            if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && target == Jackal.jackal && Jackal.jackal == PlayerControl.LocalPlayer)
            {
                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
                AmongUsClient.Instance.FinishRpcImmediately(writer);
                RPCProcedure.sidekickPromotes();
            }

            // Cleaner Button Sync
            if (Cleaner.cleaner != null && PlayerControl.LocalPlayer == Cleaner.cleaner && __instance == Cleaner.cleaner && HudManagerStartPatch.cleanerCleanButton != null)
            {
                HudManagerStartPatch.cleanerCleanButton.Timer = Cleaner.cleaner.killTimer;
            }

            // Warlock Button Sync
            if (Warlock.warlock != null && PlayerControl.LocalPlayer == Warlock.warlock && __instance == Warlock.warlock && HudManagerStartPatch.warlockCurseButton != null)
            {
                if (Warlock.warlock.killTimer > HudManagerStartPatch.warlockCurseButton.Timer)
                {
                    HudManagerStartPatch.warlockCurseButton.Timer = Warlock.warlock.killTimer;
                }
            }

            // Seer show flash and add dead player position
            if (Seer.seer != null && PlayerControl.LocalPlayer == Seer.seer && !Seer.seer.Data.IsDead && Seer.seer != target && Seer.mode <= 1)
            {
                HudManager.Instance.FullScreen.enabled = true;
                HudManager.Instance.StartCoroutine(Effects.Lerp(1f, new Action <float>((p) => {
                    var renderer = HudManager.Instance.FullScreen;
                    if (p < 0.5)
                    {
                        if (renderer != null)
                        {
                            renderer.color = new Color(42f / 255f, 187f / 255f, 245f / 255f, Mathf.Clamp01(p * 2 * 0.75f));
                        }
                    }
                    else
                    {
                        if (renderer != null)
                        {
                            renderer.color = new Color(42f / 255f, 187f / 255f, 245f / 255f, Mathf.Clamp01((1 - p) * 2 * 0.75f));
                        }
                    }
                    if (p == 1f && renderer != null)
                    {
                        renderer.enabled = false;
                    }
                })));
            }
            if (Seer.deadBodyPositions != null)
            {
                Seer.deadBodyPositions.Add(target.transform.position);
            }

            // Child set adapted kill cooldown
            if (Child.child != null && PlayerControl.LocalPlayer == Child.child && Child.child.Data.IsImpostor && Child.child == __instance)
            {
                var multiplier = Child.isGrownUp() ? 0.66f : 2f;
                Child.child.SetKillTimer(PlayerControl.GameOptions.KillCooldown * multiplier);
            }
        }
コード例 #50
0
 public override void WriteDescriptionTo(MessageWriter writer)
 {
 }
コード例 #51
0
ファイル: Client.cs プロジェクト: zneix/Impostor
        private void OnMessageReceived(MessageReader message, SendOption sendOption)
        {
            var flag = (RequestFlag)message.Tag;

            Logger.Verbose("[{0}] Server got {1}.", Id, flag);

            switch (flag)
            {
            case RequestFlag.HostGame:
            {
                // Read game settings.
                var gameInfoBytes = message.ReadBytesAndSize();
                var gameInfo      = GameOptionsData.Deserialize(gameInfoBytes);

                // Create game.
                var game = _gameManager.Create(this, gameInfo);
                if (game == null)
                {
                    Connection.Send(new Message1DisconnectReason(DisconnectReason.ServerFull));
                    return;
                }

                // Code in the packet below will be used in JoinGame.
                using (var writer = MessageWriter.Get(SendOption.Reliable))
                {
                    writer.StartMessage(0);
                    writer.Write(game.Code);
                    writer.EndMessage();

                    Connection.Send(writer);
                }
                break;
            }

            case RequestFlag.JoinGame:
            {
                var gameCode = message.ReadInt32();
                var unknown  = message.ReadByte();
                var game     = _gameManager.Find(gameCode);
                if (game == null)
                {
                    Connection.Send(new Message1DisconnectReason(DisconnectReason.GameMissing));
                    return;
                }

                game.HandleJoinGame(Player);
                break;
            }

            case RequestFlag.StartGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                Player.Game.HandleStartGame(message);
                break;
            }

            // No idea how this flag is triggered.
            case RequestFlag.RemoveGame:
                break;

            case RequestFlag.RemovePlayer:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                var playerId = message.ReadPackedInt32();
                var reason   = message.ReadByte();

                Player.Game.HandleRemovePlayer(playerId, (DisconnectReason)reason);
                break;
            }

            case RequestFlag.GameData:
            case RequestFlag.GameDataTo:
            {
                if (!IsPacketAllowed(message, false))
                {
                    return;
                }

                // Broadcast packet to all other players.
                using (var writer = MessageWriter.Get(sendOption))
                {
                    if (flag == RequestFlag.GameDataTo)
                    {
                        var target = message.ReadPackedInt32();
                        writer.CopyFrom(message);
                        Player.Game.SendTo(writer, target);
                    }
                    else
                    {
                        writer.CopyFrom(message);
                        Player.Game.SendToAllExcept(writer, Player);
                    }
                }
                break;
            }

            case RequestFlag.EndGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                Player.Game.HandleEndGame(message);
                break;
            }

            case RequestFlag.AlterGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                if (message.ReadByte() != (byte)AlterGameTags.ChangePrivacy)
                {
                    return;
                }

                var isPublic = message.ReadByte() == 1;

                Player.Game.HandleAlterGame(message, Player, isPublic);
                break;
            }

            case RequestFlag.KickPlayer:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                var playerId = message.ReadPackedInt32();
                var isBan    = message.ReadBoolean();

                Player.Game.HandleKickPlayer(playerId, isBan);
                break;
            }

            default:
                Logger.Warning("Server received unknown flag {0}.", flag);
                break;
            }

            if (flag != RequestFlag.GameData &&
                flag != RequestFlag.GameDataTo &&
                flag != RequestFlag.EndGame &&
                message.Position < message.Length)
            {
                Logger.Warning("Server did not consume all bytes from {0} ({1} < {2}).",
                               flag,
                               message.Position,
                               message.Length);
            }
        }
コード例 #52
0
 /// <summary>
 /// Write the constraint description to a MessageWriter
 /// </summary>
 /// <param name="writer">The writer on which the description is displayed</param>
 public override void WriteDescriptionTo(MessageWriter writer)
 {
     writer.WriteExpectedValue(this.expected);
     writer.WriteConnector("+/-");
     writer.WriteExpectedValue(this.tolerance);
 }
コード例 #53
0
 public override void WriteActualValueTo(MessageWriter writer)
 {
     writer.WriteActualValue(failingActual);
     writer.WriteLine();
     writer.Write("  On Property: " + failingPropertyName);
 }
コード例 #54
0
ファイル: Game.Data.cs プロジェクト: MaxtorCoder/Impostor
        public async ValueTask <bool> HandleGameDataAsync(IMessageReader parent, ClientPlayer sender, bool toPlayer)
        {
            // Find target player.
            ClientPlayer target = null;

            if (toPlayer)
            {
                var targetId = parent.ReadPackedInt32();
                if (targetId == FakeClientId && !_gamedataFakeReceived && sender.IsHost)
                {
                    _gamedataFakeReceived = true;

                    // Remove the fake client, we received the data.
                    using (var message = MessageWriter.Get(MessageType.Reliable))
                    {
                        WriteRemovePlayerMessage(message, false, FakeClientId, (byte)DisconnectReason.ExitGame);

                        await sender.Client.Connection.SendAsync(message);
                    }
                }
                else if (!TryGetPlayer(targetId, out target))
                {
                    _logger.LogWarning("Player {0} tried to send GameData to unknown player {1}.", sender.Client.Id, targetId);
                    return(false);
                }

                _logger.LogTrace("Received GameData for target {0}.", targetId);
            }

            // Parse GameData messages.
            while (parent.Position < parent.Length)
            {
                using var reader = parent.ReadMessage();

                switch (reader.Tag)
                {
                case GameDataTag.DataFlag:
                {
                    var netId = reader.ReadPackedUInt32();
                    if (_allObjectsFast.TryGetValue(netId, out var obj))
                    {
                        await obj.DeserializeAsync(sender, target, reader, false);
                    }
                    else
                    {
                        _logger.LogWarning("Received DataFlag for unregistered NetId {0}.", netId);
                    }

                    break;
                }

                case GameDataTag.RpcFlag:
                {
                    var netId = reader.ReadPackedUInt32();
                    if (_allObjectsFast.TryGetValue(netId, out var obj))
                    {
                        if (!await obj.HandleRpc(sender, target, (RpcCalls)reader.ReadByte(), reader))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        _logger.LogWarning("Received RpcFlag for unregistered NetId {0}.", netId);
                    }

                    break;
                }

                case GameDataTag.SpawnFlag:
                {
                    // Only the host is allowed to despawn objects.
                    if (!sender.IsHost)
                    {
                        if (await sender.Client.ReportCheatAsync(new CheatContext(nameof(GameDataTag.SpawnFlag)), "Tried to send SpawnFlag as non-host."))
                        {
                            return(false);
                        }
                    }

                    var objectId = reader.ReadPackedUInt32();
                    if (objectId < SpawnableObjects.Length)
                    {
                        var innerNetObject = (InnerNetObject)ActivatorUtilities.CreateInstance(_serviceProvider, SpawnableObjects[objectId], this);
                        var ownerClientId  = reader.ReadPackedInt32();

                        // Prevent fake client from being broadcasted.
                        // TODO: Remove message from stream properly.
                        if (ownerClientId == FakeClientId)
                        {
                            return(false);
                        }

                        innerNetObject.SpawnFlags = (SpawnFlags)reader.ReadByte();

                        var components      = innerNetObject.GetComponentsInChildren <InnerNetObject>();
                        var componentsCount = reader.ReadPackedInt32();

                        if (componentsCount != components.Count)
                        {
                            _logger.LogError(
                                "Children didn't match for spawnable {0}, name {1} ({2} != {3})",
                                objectId,
                                innerNetObject.GetType().Name,
                                componentsCount,
                                components.Count);
                            continue;
                        }

                        _logger.LogDebug(
                            "Spawning {0} components, SpawnFlags {1}",
                            innerNetObject.GetType().Name,
                            innerNetObject.SpawnFlags);

                        for (var i = 0; i < componentsCount; i++)
                        {
                            var obj = components[i];

                            obj.NetId   = reader.ReadPackedUInt32();
                            obj.OwnerId = ownerClientId;

                            _logger.LogDebug(
                                "- {0}, NetId {1}, OwnerId {2}",
                                obj.GetType().Name,
                                obj.NetId,
                                obj.OwnerId);

                            if (!AddNetObject(obj))
                            {
                                _logger.LogTrace("Failed to AddNetObject, it already exists.");

                                obj.NetId = uint.MaxValue;
                                break;
                            }

                            using var readerSub = reader.ReadMessage();
                            if (readerSub.Length > 0)
                            {
                                await obj.DeserializeAsync(sender, target, readerSub, true);
                            }

                            await OnSpawnAsync(obj);
                        }

                        continue;
                    }

                    _logger.LogError("Couldn't find spawnable object {0}.", objectId);
                    break;
                }

                // Only the host is allowed to despawn objects.
                case GameDataTag.DespawnFlag:
                {
                    var netId = reader.ReadPackedUInt32();
                    if (_allObjectsFast.TryGetValue(netId, out var obj))
                    {
                        if (sender.Client.Id != obj.OwnerId && !sender.IsHost)
                        {
                            _logger.LogWarning(
                                "Player {0} ({1}) tried to send DespawnFlag for {2} but was denied.",
                                sender.Client.Name,
                                sender.Client.Id,
                                netId);
                            return(false);
                        }

                        RemoveNetObject(obj);
                        await OnDestroyAsync(obj);

                        _logger.LogDebug("Destroyed InnerNetObject {0} ({1}), OwnerId {2}", obj.GetType().Name, netId, obj.OwnerId);
                    }
                    else
                    {
                        _logger.LogDebug(
                            "Player {0} ({1}) sent DespawnFlag for unregistered NetId {2}.",
                            sender.Client.Name,
                            sender.Client.Id,
                            netId);
                    }

                    break;
                }

                case GameDataTag.SceneChangeFlag:
                {
                    // Sender is only allowed to change his own scene.
                    var clientId = reader.ReadPackedInt32();
                    if (clientId != sender.Client.Id)
                    {
                        _logger.LogWarning(
                            "Player {0} ({1}) tried to send SceneChangeFlag for another player.",
                            sender.Client.Name,
                            sender.Client.Id);
                        return(false);
                    }

                    sender.Scene = reader.ReadString();

                    _logger.LogTrace("> Scene {0} to {1}", clientId, sender.Scene);
                    break;
                }

                case GameDataTag.ReadyFlag:
                {
                    var clientId = reader.ReadPackedInt32();
                    _logger.LogTrace("> IsReady {0}", clientId);
                    break;
                }

                default:
                {
                    _logger.LogTrace("Bad GameData tag {0}", reader.Tag);
                    break;
                }
                }

                if (sender.Client.Player == null)
                {
                    // Disconnect handler was probably invoked, cancel the rest.
                    return(false);
                }
            }

            return(true);
        }
コード例 #55
0
 public abstract void UnsafeWrite(MessageWriter writer, object data);
コード例 #56
0
 public override async void Informar(string msg)
 {
     MessageWriter.WriteString(msg);
     await MessageWriter.StoreAsync();
 }
コード例 #57
0
 /// <summary>
 /// Write the constraint description to a MessageWriter
 /// </summary>
 /// <param name="writer">The writer on which the description is displayed</param>
 public abstract void WriteDescriptionTo(MessageWriter writer);
コード例 #58
0
ファイル: EqualConstraint.cs プロジェクト: idavis/Ensurance
 /// <summary>
 /// Write a failure message. Overridden to provide custom failure
 /// messages for EqualConstraint.
 /// </summary>
 /// <param name="writer">The MessageWriter to write to</param>
 public override void WriteMessageTo(MessageWriter writer)
 {
     DisplayDifferences(writer, _expected, Actual, 0);
 }
コード例 #59
0
 /// <summary>
 /// Write the actual value for a failing constraint test to a
 /// MessageWriter. The default implementation simply writes
 /// the raw value of actual, leaving it to the writer to
 /// perform any formatting.
 /// </summary>
 /// <param name="writer">The writer on which the actual value is displayed</param>
 public virtual void WriteActualValueTo(MessageWriter writer)
 {
     writer.WriteActualValue(actual);
 }
コード例 #60
0
 private static void SendNetworkMessage(ClientObject client, ServerMessage message)
 {
     //Write the send times down in SYNC_TIME_REPLY packets
     if (message.type == ServerMessageType.SYNC_TIME_REPLY)
     {
         try
         {
             using (MessageWriter mw = new MessageWriter())
             {
                 using (MessageReader mr = new MessageReader(message.data))
                 {
                     client.bytesQueuedOut += 8;
                     //Client send time
                     mw.Write <long>(mr.Read <long>());
                     //Server receive time
                     mw.Write <long>(mr.Read <long>());
                     //Server send time
                     mw.Write <long>(DateTime.UtcNow.Ticks);
                     message.data = mw.GetMessageBytes();
                 }
             }
         }
         catch (Exception e)
         {
             DarkLog.Debug("Error rewriting SYNC_TIME packet, Exception " + e);
         }
     }
     //Continue sending
     byte[] messageBytes = Common.PrependNetworkFrame((int)message.type, message.data);
     client.lastSendTime    = Server.serverClock.ElapsedMilliseconds;
     client.bytesQueuedOut -= messageBytes.Length;
     client.bytesSent      += messageBytes.Length;
     if (client.connectionStatus == ConnectionStatus.CONNECTED)
     {
         try
         {
             client.connection.GetStream().Write(messageBytes, 0, messageBytes.Length);
         }
         catch (Exception e)
         {
             HandleDisconnectException("Send Network Message", client, e);
             return;
         }
     }
     DMPPluginHandler.FireOnMessageSent(client, message);
     if (message.type == ServerMessageType.CONNECTION_END)
     {
         using (MessageReader mr = new MessageReader(message.data))
         {
             string reason = mr.Read <string>();
             DarkLog.Normal("Disconnecting client " + client.playerName + ", sent CONNECTION_END (" + reason + ") to endpoint " + client.endpoint);
             client.disconnectClient = true;
             DisconnectClient(client);
         }
     }
     if (message.type == ServerMessageType.HANDSHAKE_REPLY)
     {
         using (MessageReader mr = new MessageReader(message.data))
         {
             int    response = mr.Read <int>();
             string reason   = mr.Read <string>();
             if (response != 0)
             {
                 DarkLog.Normal("Disconnecting client " + client.playerName + ", sent HANDSHAKE_REPLY (" + reason + ") to endpoint " + client.endpoint);
                 client.disconnectClient = true;
                 DisconnectClient(client);
             }
         }
     }
 }