Exemplo n.º 1
0
        private void UpdateCoupleCockState(Message message, IClient sender)
        {
            if (worldTrains != null)
            {
                using (DarkRiftReader reader = message.GetReader())
                {
                    TrainCouplerCockChange cockStateChanged = reader.ReadSerializable <TrainCouplerCockChange>();
                    WorldTrain             train            = worldTrains.FirstOrDefault(t => t.Guid == cockStateChanged.TrainIdCoupler);
                    if (train == null)
                    {
                        train = new WorldTrain()
                        {
                            Guid = cockStateChanged.TrainIdCoupler,
                        };
                        worldTrains.Add(train);
                    }

                    if (cockStateChanged.IsCouplerFront)
                    {
                        train.IsFrontCouplerCockOpen = cockStateChanged.IsOpen;
                    }
                    else
                    {
                        train.IsRearCouplerCockOpen = cockStateChanged.IsOpen;
                    }
                }
            }

            Logger.Trace("[SERVER] > TRAIN_COUPLE_COCK");
            ReliableSendToOthers(message, sender);
        }
    public void ReceiveNetworkJunctionSwitch(Message message)
    {
        if (buffer.NotSyncedAddToBuffer(IsSynced, ReceiveNetworkJunctionSwitch, message))
        {
            return;
        }

        using (DarkRiftReader reader = message.GetReader())
        {
            Main.Log($"[CLIENT] < SWITCH_CHANGED");

            while (reader.Position < reader.Length)
            {
                Switch switchInfo = reader.ReadSerializable <Switch>();

                if (switchInfo.Id >= junctions.Length)
                {
                    Main.Log($"Unidentified junction received. Skipping (ID: {switchInfo.Id})");
                    return;
                }

                Junction junction = junctions[switchInfo.Id];
                if (switchInfo.SwitchToLeft && junction.selectedBranch == 0 || !switchInfo.SwitchToLeft && junction.selectedBranch == 1)
                {
                    Main.Log($"Junction with ID {switchInfo.Id} already set to correct branch.");
                    return;
                }

                IsChangeByNetwork = true;
                junction.Switch((Junction.SwitchMode)switchInfo.Mode);
                IsChangeByNetwork = false;
            }
        }
    }
Exemplo n.º 3
0
        private void OnCarDamage(Message message, IClient client)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                CarDamage  damage = reader.ReadSerializable <CarDamage>();
                WorldTrain train  = worldTrains.FirstOrDefault(t => t.Guid == damage.Guid);
                if (train == null)
                {
                    train = new WorldTrain()
                    {
                        Guid = damage.Guid,
                    };
                    worldTrains.Add(train);
                }

                switch (damage.DamageType)
                {
                case DamageType.Car:
                    train.CarHealth     = damage.NewHealth;
                    train.CarHealthData = damage.Data;
                    break;

                case DamageType.Cargo:
                    train.CargoHealth = damage.NewHealth;
                    break;
                }
            }

            Logger.Trace("[SERVER] > TRAIN_DAMAGE");
            ReliableSendToOthers(message, client);
        }
Exemplo n.º 4
0
        public void WeaponUpdateMessageRecieved(object sender, MessageReceivedEventArgs e)
        {
            using (Message message = e.GetMessage() as Message)
            {
                if (message.Tag == Tags.WeaponFireStartTag || message.Tag == Tags.WeaponFireEndTag || message.Tag == Tags.WeaponActionTag)
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        WeaponFireClientDTO data = reader.ReadSerializable <WeaponFireClientDTO>(); //Read the weapon fire dto off the stack

                        using (DarkRiftWriter fireStartWriter = DarkRiftWriter.Create())
                        {
                            WeaponFireServerDTO fireData = new WeaponFireServerDTO();
                            fireData.playerID = e.Client.ID;
                            fireData.fireNum  = data.fireNum;

                            fireStartWriter.Write(fireData);
                            int    extrastart   = reader.Position;
                            int    extralength  = reader.Length - reader.Position;
                            byte[] rawExtradata = reader.ReadRaw(extralength);
                            fireStartWriter.WriteRaw(rawExtradata, 0, extralength); //Write the extra data from the message
                            //TODO: Think about security implications of sending raw data from client to all clients

                            using (Message fireStartMessage = Message.Create(message.Tag, fireStartWriter)) //Repeat the incoming tagname as all message bodies are the same
                            {
                                foreach (IClient client in worldManager.clients[e.Client].World.GetClients().Where(x => x != e.Client))
                                {
                                    client.SendMessage(fireStartMessage, SendMode.Reliable);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
    private void OnJobDeptPaidMessage(Message message)
    {
        using (DarkRiftReader reader = message.GetReader())
        {
            Main.Log($"[CLIENT] < DEBT_JOB_PAID");

            while (reader.Position < reader.Length)
            {
                IsChangeByNetwork = true;
                DebtPaid data = reader.ReadSerializable <DebtPaid>();
                if (data.isDestroyed)
                {
                    StagedJobDebt debt = SingletonBehaviour <JobDebtController> .Instance.stagedJobsDebts.FirstOrDefault(t => t.ID == data.Id);

                    if (debt != null)
                    {
                        debt.Pay();
                    }
                }
                else
                {
                    ExistingJobDebt debt = SingletonBehaviour <JobDebtController> .Instance.existingTrackedJobs.FirstOrDefault(t => t.ID == data.Id);

                    if (debt != null)
                    {
                        debt.Pay();
                    }
                }
                IsChangeByNetwork = false;
            }
        }
    }
Exemplo n.º 6
0
        private void LocationUpdateMessage(Message message, IClient sender)
        {
            if (players.TryGetValue(sender, out Player player))
            {
                Location newLocation;
                using (DarkRiftReader reader = message.GetReader())
                {
                    newLocation     = reader.ReadSerializable <Location>();
                    player.position = newLocation.Position;
                    if (newLocation.Rotation.HasValue)
                    {
                        player.rotation = newLocation.Rotation.Value;
                    }
                }

                using (DarkRiftWriter writer = DarkRiftWriter.Create())
                {
                    newLocation.AproxPing = (int)(sender.RoundTripTime.SmoothedRtt / 2 * 1000);
                    writer.Write(newLocation);

                    using (Message outMessage = Message.Create((ushort)NetworkTags.PLAYER_LOCATION_UPDATE, writer))
                        foreach (IClient client in ClientManager.GetAllClients().Where(client => client != sender))
                        {
                            client.SendMessage(outMessage, SendMode.Unreliable);
                        }
                }
            }
        }
Exemplo n.º 7
0
 private void SetSpawn(Message message)
 {
     using (DarkRiftReader reader = message.GetReader())
     {
         playerSpawn = reader.ReadSerializable <SetSpawn>();
     }
 }
        private void MovementMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            using (Message message = e.GetMessage() as Message)
            {
                if (message.Tag == Tags.MovePlayerTag)
                {
                    // Read Player Coordinates From The Message
                    try
                    {
                        using (DarkRiftReader reader = message.GetReader())
                        {
                            // Get Player ID
                            Player player;
                            lock (players)
                                player = players[e.Client];

                            // Get Player Positions & Serialize it
                            Vec3 newPosition = reader.ReadSerializable <Vec3>();
                            Vec3 newRotation = reader.ReadSerializable <Vec3>();

                            lock (player)
                            {
                                //Update the player
                                player.Position = newPosition;
                                player.Rotation = newRotation;

                                //Serialize the whole player to the message so that we also include the ID
                                message.Serialize(player);
                            }

                            //Send to everyone else
                            foreach (IClient sendTo in ClientManager.GetAllClients().Except(new IClient[] { e.Client }))
                            {
                                sendTo.SendMessage(message, SendMode.Reliable);
                            }
                        }
                    }
                    catch (System.Exception ex)
                    {
                        //Console.WriteLine("An error was logged when the movement message was received: " + ex.Message);
                        //Console.WriteLine(ex.InnerException);
                        //Console.WriteLine(ex.Data);
                        //Console.WriteLine(ex.StackTrace);
                    }
                }
            }
        }
Exemplo n.º 9
0
        private void OnCarMUChange(Message message, IClient client)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                CarMUChange data  = reader.ReadSerializable <CarMUChange>();
                WorldTrain  train = worldTrains.FirstOrDefault(t => t.Guid == data.TrainId1);
                if (!(train is null))
                {
                    string value = "";
                    if (data.IsConnected)
                    {
                        value = data.TrainId2;
                    }
                    switch (train.CarType)
                    {
                    case TrainCarType.LocoShunter:
                        if (data.Train1IsFront)
                        {
                            train.MultipleUnit.IsFrontMUConnectedTo = value;
                        }
                        else
                        {
                            train.MultipleUnit.IsRearMUConnectedTo = value;
                        }
                        break;
                    }
                }

                if (data.IsConnected)
                {
                    train = worldTrains.FirstOrDefault(t => t.Guid == data.TrainId2);
                    if (!(train is null))
                    {
                        string value = "";
                        if (data.IsConnected)
                        {
                            value = data.TrainId1;
                        }
                        switch (train.CarType)
                        {
                        case TrainCarType.LocoShunter:
                            if (data.Train2IsFront)
                            {
                                train.MultipleUnit.IsFrontMUConnectedTo = value;
                            }
                            else
                            {
                                train.MultipleUnit.IsRearMUConnectedTo = value;
                            }
                            break;
                        }
                    }
                }
            }

            ReliableSendToOthers(message, client);
        }
Exemplo n.º 10
0
        private void UpdateCoupledHoseState(Message message, IClient sender)
        {
            if (worldTrains != null)
            {
                using (DarkRiftReader reader = message.GetReader())
                {
                    TrainCouplerHoseChange hoseStateChanged = reader.ReadSerializable <TrainCouplerHoseChange>();
                    WorldTrain             train            = worldTrains.FirstOrDefault(t => t.Guid == hoseStateChanged.TrainIdC1);
                    if (train == null)
                    {
                        train = new WorldTrain()
                        {
                            Guid = hoseStateChanged.TrainIdC1,
                        };
                        worldTrains.Add(train);
                    }

                    if (hoseStateChanged.IsC1Front)
                    {
                        train.FrontCouplerHoseConnectedTo = hoseStateChanged.TrainIdC2;
                    }
                    else
                    {
                        train.RearCouplerHoseConnectedTo = hoseStateChanged.TrainIdC2;
                    }

                    if (hoseStateChanged.IsConnected)
                    {
                        train = worldTrains.FirstOrDefault(t => t.Guid == hoseStateChanged.TrainIdC2);
                        if (train == null)
                        {
                            train = new WorldTrain()
                            {
                                Guid = hoseStateChanged.TrainIdC2,
                            };
                            worldTrains.Add(train);
                        }

                        if (hoseStateChanged.IsC2Front)
                        {
                            train.FrontCouplerHoseConnectedTo = hoseStateChanged.TrainIdC1;
                        }
                        else
                        {
                            train.RearCouplerHoseConnectedTo = hoseStateChanged.TrainIdC1;
                        }
                    }
                }
            }

            Logger.Trace("[SERVER] > TRAIN_COUPLE_HOSE");
            ReliableSendToOthers(message, sender);
        }
Exemplo n.º 11
0
        private void OnCargoChange(Message message, IClient client)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                TrainCargoChanged data  = reader.ReadSerializable <TrainCargoChanged>();
                WorldTrain        train = worldTrains.FirstOrDefault(t => t.Guid == data.Id);
                train.CargoType   = data.Type;
                train.CargoAmount = data.Amount;
            }

            Logger.Trace("[SERVER] > TRAIN_CARGO_CHANGE");
            ReliableSendToOthers(message, client);
        }
Exemplo n.º 12
0
        private void OnAuthChange(Message message)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                CarsAuthChange        authChange = reader.ReadSerializable <CarsAuthChange>();
                List <IClient>        sentTo     = new List <IClient>();
                IEnumerable <IClient> players    = PluginManager.GetPluginByType <PlayerPlugin.PlayerPlugin>().GetPlayers();
                foreach (string guid in authChange.Guids)
                {
                    WorldTrain train = worldTrains.FirstOrDefault(t => t.Guid == guid);
                    if (train != null)
                    {
                        if (!sentTo.Any(c => c.ID == train.AuthorityPlayerId))
                        {
                            IClient ocl = players.FirstOrDefault(c => c.ID == train.AuthorityPlayerId);
                            if (ocl != null)
                            {
                                if (ocl.ID != 0)
                                {
                                    ocl.SendMessage(message, SendMode.Reliable);
                                }
                                sentTo.Add(ocl);
                            }
                        }
                        train.AuthorityPlayerId = authChange.PlayerId;
                    }
                }
                Logger.Trace("[SERVER] > TRAIN_AUTH_CHANGE");
                IClient cl = players.FirstOrDefault(c => c.ID == authChange.PlayerId);
                if (cl.ID != 0)
                {
                    SendDelayedMessage(authChange, NetworkTags.TRAIN_AUTH_CHANGE, cl, (int)sentTo.OrderByDescending(c => c.RoundTripTime.SmoothedRtt).First().RoundTripTime.SmoothedRtt / 2 * 1000);
                }
                sentTo.Add(cl);

                foreach (IClient client in players)
                {
                    if (!sentTo.Any(c => c.ID == client.ID))
                    {
                        using (DarkRiftWriter writer = DarkRiftWriter.Create())
                        {
                            writer.Write(authChange);
                            using (Message msg = Message.Create((ushort)NetworkTags.TRAIN_AUTH_CHANGE, writer))
                            {
                                client.SendMessage(msg, SendMode.Reliable);
                            }
                        }
                    }
                }
            }
        }
 public void HandlePlayerInputFromReader(DarkRiftReader reader, ClientDataTags tag)
 {
     if (tag == ClientDataTags.MoveObject)
     {
         var data = reader.ReadSerializable <MovementData>();
         networkEntity.rotation = data.rotation;
         var maxDir = Mathf.Max(data.movementVector.x, data.movementVector.y, data.movementVector.z);
         if (maxDir > 1f)
         {
             data.movementVector /= maxDir;
         }
         networkEntity.position += data.movementVector * speed * Time.fixedDeltaTime;
     }
     else if (tag == ClientDataTags.SetObjectPosition)
     {
         var data = reader.ReadSerializable <MovementData>();
         networkEntity.rotation = data.rotation;
         var movVector = (data.movementVector - networkEntity.position);
         if (movVector.magnitude < snapMaxMagnitude)
         {
             networkEntity.position = data.movementVector;
         }
     }
 }
Exemplo n.º 14
0
        private void OnTurntableReleaseAuth(Message message, IClient client)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                ReleaseAuthority info      = reader.ReadSerializable <ReleaseAuthority>();
                Turntable        turntable = turntableStates.FirstOrDefault(t => t.Position == info.Position);
                if (turntable != null)
                {
                    turntable.playerAuthId = 0;
                }
            }

            Logger.Trace("[SERVER] > TURNTABLE_AUTH_RELEASE");
            ReliableSendToOthers(message, client);
        }
Exemplo n.º 15
0
        private void ServerPlayerInitializer(Message message, IClient sender)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                NPlayer player = reader.ReadSerializable <NPlayer>();
                if (playerConnecting != null)
                {
                    buffer.AddToBuffer(InitializePlayer, player, sender);
                    return;
                }

                pingSendTimer.Stop();
                InitializePlayer(player, sender);
            }
        }