Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ protected override void Awake()
goIconLAN = this.FindChildByName("LAN Icon");
}
else
{
{
goIconLAN = Instantiate(goIconPassword, goIconPassword.transform.parent);
goIconLAN.name = "LAN Icon";
Vector3 LANpos = goIconLAN.transform.localPosition;
Expand Down Expand Up @@ -113,7 +113,7 @@ public void UpdateView()
serverName.text = data.Name;
playerCount.text = $"{data.CurrentPlayers} / {data.MaxPlayers}";

ping.text = $"<color={GetColourForPing(data.Ping)}>{(data.Ping < 0 ? "?" : data.Ping)} ms</color>";
ping.text = $"<color={GetColourForPing(data.Ping)}>{(data.Ping < 0 ? "?" : data.Ping.ToString())} ms</color>";

// Hide the icon if the server does not have a password
goIconPassword.SetActive(data.HasPassword);
Expand Down
5 changes: 5 additions & 0 deletions Multiplayer/Networking/Managers/Client/NetworkClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1293,6 +1293,11 @@ public void SendTrainSyncRequest(ushort netId)
}, DeliveryMethod.ReliableUnordered);
}

public void SendTrainCarSpawnRequest(TrainCar trainCar)
{
SendPacketToServer(ServerboundTrainCarSpawnRequest.FromTrainCar(trainCar), DeliveryMethod.ReliableOrdered);
}

public void SendTrainDeleteRequest(ushort netId)
{
SendPacketToServer(new ServerboundTrainDeleteRequestPacket
Expand Down
2 changes: 1 addition & 1 deletion Multiplayer/Networking/Managers/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public abstract class NetworkManager
protected NetworkManager(Settings settings)
{
netPacketProcessor = new NetPacketProcessor();
//transport = new LiteNetLibTransport();
// transport = new LiteNetLibTransport();
transport = new SteamWorksTransport();

transport.OnConnectionRequest += OnConnectionRequest;
Expand Down
20 changes: 18 additions & 2 deletions Multiplayer/Networking/Managers/Server/NetworkServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
using Multiplayer.Networking.Packets.Serverbound.Train;
using Multiplayer.Networking.Packets.Unconnected;
using System.Text;
using Multiplayer.Components;
using Multiplayer.Networking.Data.Train;
using Multiplayer.Networking.TransportLayers;
using Multiplayer.Networking.Packets.Serverbound.Jobs;
Expand Down Expand Up @@ -131,6 +132,7 @@ protected override void Subscribe()

netPacketProcessor.SubscribeReusable<ServerboundPlayerPositionPacket, ITransportPeer>(OnServerboundPlayerPositionPacket);
netPacketProcessor.SubscribeReusable<ServerboundTrainSyncRequestPacket>(OnServerboundTrainSyncRequestPacket);
netPacketProcessor.SubscribeReusable<ServerboundTrainCarSpawnRequest>(OnServerboundTrainCarSpawnRequest);
netPacketProcessor.SubscribeReusable<ServerboundTrainDeleteRequestPacket, ITransportPeer>(OnServerboundTrainDeleteRequestPacket);
netPacketProcessor.SubscribeReusable<ServerboundTrainRerailRequestPacket, ITransportPeer>(OnServerboundTrainRerailRequestPacket);
netPacketProcessor.SubscribeReusable<ServerboundLicensePurchaseRequestPacket, ITransportPeer>(OnServerboundLicensePurchaseRequestPacket);
Expand Down Expand Up @@ -208,7 +210,7 @@ public override void OnPeerConnected(ITransportPeer peer)
public override void OnPeerDisconnected(ITransportPeer peer, DisconnectReason disconnectReason)
{
byte id = (byte)peer.Id;
Log($"Player {(serverPlayers.TryGetValue(id, out ServerPlayer player) ? player : id)} disconnected: {disconnectReason}");
Log($"Player {(serverPlayers.TryGetValue(id, out ServerPlayer player) ? player.Id : id)} disconnected: {disconnectReason}");

if (WorldStreamingInit.isLoaded)
SaveGameManager.Instance.UpdateInternalData();
Expand Down Expand Up @@ -1025,6 +1027,20 @@ private void OnServerboundTrainSyncRequestPacket(ServerboundTrainSyncRequestPack
networkedTrainCar.Server_DirtyAllState();
}

private void OnServerboundTrainCarSpawnRequest(ServerboundTrainCarSpawnRequest packet)
{
if (!TrainComponentLookup.Instance.LiveryFromId(packet.LiveryID, out TrainCarLivery livery))
{
NetworkLifecycle.Instance.Client.LogDebug(() => $"Tried spawning car but couldn't find TrainCarLivery with ID {packet.LiveryID}");
return;
}

Multiplayer.Log($"Client spawned {livery.name} car");
TrainCar trainCar = CarSpawner.Instance.SpawnCar(livery.prefab, RailTrack.GetClosest(packet.Position).track, packet.Position, packet.Forward, true);
NetworkedTrainCar networkedTrainCar = NetworkedCarSpawner.SpawnCar(TrainsetSpawnPart.FromTrainSet([trainCar])[0]);
NetworkLifecycle.Instance.Server.SendSpawnTrainCar(networkedTrainCar);
}

private void OnServerboundTrainDeleteRequestPacket(ServerboundTrainDeleteRequestPacket packet, ITransportPeer peer)
{
if (!TryGetServerPlayer(peer, out ServerPlayer player))
Expand Down Expand Up @@ -1176,7 +1192,7 @@ private void OnServerboundWarehouseMachineControllerRequestPacket(ServerboundWar
if(!NetworkedWarehouseMachineController.Get(packet.NetId, out var targetWarehouse))
{
LogWarning($"ServerboundWarehouseMachineControllerRequestPacket() WarehouseMachineController not found. NetId: {packet.NetId}");
return;
return;
}

//Todo: add check for player distance from machine
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using DV.ThingTypes;
using UnityEngine;

namespace Multiplayer.Networking.Packets.Serverbound.Train;

public class ServerboundTrainCarSpawnRequest
{
public Vector3 Position { get; set; }
public Vector3 Forward { get; set; }
public bool Derailed { get; set; }
public string LiveryID { get; set; }

public static ServerboundTrainCarSpawnRequest FromTrainCar(TrainCar trainCar)
{
return new ServerboundTrainCarSpawnRequest
{
Position = trainCar.transform.position,
Forward = trainCar.transform.forward,
Derailed = trainCar.derailed,
LiveryID = trainCar.carLivery.id,
};
}
}
43 changes: 0 additions & 43 deletions Multiplayer/Patches/CommsRadio/CommsRadioCarSpawnerPatch.cs

This file was deleted.

91 changes: 61 additions & 30 deletions Multiplayer/Patches/Train/CarSpawnerPatch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Multiplayer.Components.Networking.Train;
using Multiplayer.Utils;
using System.Collections.Generic;
using DV.ThingTypes;
using UnityEngine;

namespace Multiplayer.Patches.Train;

Expand All @@ -24,59 +26,88 @@ private static void PrepareTrainCarForDeleting(TrainCar trainCar)
NetworkLifecycle.Instance.Server?.SendDestroyTrainCar(networkedTrainCar);
}

//Called from
[HarmonyPatch(nameof(CarSpawner.SpawnCars))]
[HarmonyPostfix]
private static void SpawnCars(List<TrainCar> __result)
{
if (UnloadWatcher.isUnloading)
return;

if (!NetworkLifecycle.Instance.IsHost())
return;

if (__result == null || __result.Count == 0)
return;

//Coupling is delayed by AutoCouple(), so a true trainset for the entire consist doesn't exist yet
Multiplayer.LogDebug(() => $"SpawnCars() {__result?.Count} cars spawned, sending to players");
NetworkLifecycle.Instance.Server.SendSpawnTrainset(__result, true, true);

}

[HarmonyPatch(nameof(CarSpawner.SpawnCarFromRemote))]
[HarmonyPatch(nameof(CarSpawner.SpawnCar))]
[HarmonyPostfix]
private static void SpawnCarFromRemote(TrainCar __result)
private static void SpawnCar(TrainCar __result)
{
if (UnloadWatcher.isUnloading)
return;

if (!NetworkLifecycle.Instance.IsHost())
{
NetworkLifecycle.Instance.Client.SendTrainCarSpawnRequest(__result);
CarSpawner.Instance.DeleteCar(__result);
return;
}

if (__result == null)
return;

Multiplayer.LogDebug(() => $"SpawnCarFromRemote() {__result?.carLivery?.name} spawned, sending to players");
//Coupling is delayed by AutoCouple(), so a true trainset for the entire consist doesn't exist yet
Multiplayer.LogDebug(() => $"SpawnCar() {__result?.carLivery?.name} car spawned, sending to players");
NetworkLifecycle.Instance.Server.SendSpawnTrainset([__result], true, true);

}

[HarmonyPatch(nameof(CarSpawner.SpawnCarOnClosestTrack))]
[HarmonyPatch(nameof(CarSpawner.SpawnCars))]
[HarmonyPostfix]
private static void SpawnCarOnClosestTrack(TrainCar __result)
private static void SpawnCars(List<TrainCar> __result)
{
if (UnloadWatcher.isUnloading)
return;

if (!NetworkLifecycle.Instance.IsHost())
return;
{
// todo: Create a SendTrainSetSpawnRequest packet and use that in these situations.
foreach (TrainCar trainCar in __result)
{
NetworkLifecycle.Instance.Client.SendTrainCarSpawnRequest(trainCar);
CarSpawner.Instance.DeleteCar(trainCar);
}

if (__result == null)
return;
}

Multiplayer.LogDebug(() => $"SpawnCarOnClosestTrack() {__result?.carLivery?.name} spawned, sending to players");
NetworkLifecycle.Instance.Server.SendSpawnTrainset([__result], true, true);
if (__result == null || __result.Count == 0)
return;

//Coupling is delayed by AutoCouple(), so a true trainset for the entire consist doesn't exist yet
Multiplayer.LogDebug(() => $"SpawnCars() {__result?.Count} cars spawned, sending to players");
NetworkLifecycle.Instance.Server.SendSpawnTrainset(__result, true, true);
}

// [HarmonyPatch(nameof(CarSpawner.SpawnCarFromRemote))]
// [HarmonyPostfix]
// private static void SpawnCarFromRemote(TrainCar __result)
// {
// if (UnloadWatcher.isUnloading)
// return;
//
// if (!NetworkLifecycle.Instance.IsHost())
// return;
//
// if (__result == null)
// return;
//
// Multiplayer.LogDebug(() => $"SpawnCarFromRemote() {__result?.carLivery?.name} spawned, sending to players");
// NetworkLifecycle.Instance.Server.SendSpawnTrainset([__result], true, true);
//
// }
//
// [HarmonyPatch(nameof(CarSpawner.SpawnCarOnClosestTrack))]
// [HarmonyPostfix]
// private static void SpawnCarOnClosestTrack(TrainCar __result)
// {
// if (UnloadWatcher.isUnloading)
// return;
//
// if (!NetworkLifecycle.Instance.IsHost())
// return;
//
// if (__result == null)
// return;
//
// Multiplayer.LogDebug(() => $"SpawnCarOnClosestTrack() {__result?.carLivery?.name} spawned, sending to players");
// NetworkLifecycle.Instance.Server.SendSpawnTrainset([__result], true, true);
//
// }
}