Alek/decoupling (#23)

* refactoring
This commit is contained in:
AmazingAlek 2020-02-21 23:36:07 +01:00 committed by GitHub
parent 4ec5a39aa6
commit d7c0c06698
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 176 additions and 294 deletions

View File

@ -1,21 +0,0 @@
using UnityEngine;
using UnityEngine.Networking;
namespace QSB.Messaging
{
// Extend this to create new message handlers.
// You'll also need to create a new message type (add it to the enum).
public abstract class MessageHandler : MonoBehaviour
{
protected abstract MessageType Type { get; }
private void Awake()
{
NetworkServer.RegisterHandler((short)Type, OnServerReceiveMessage);
NetworkManager.singleton.client.RegisterHandler((short)Type, OnClientReceiveMessage);
}
protected abstract void OnClientReceiveMessage(NetworkMessage netMsg);
protected abstract void OnServerReceiveMessage(NetworkMessage netMsg);
}
}

View File

@ -1,35 +0,0 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("QSB.Messaging")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("QSB.Messaging")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d6bb93aa-f405-48d5-9c4c-49c3f8e81e9a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>QSB.Messaging</RootNamespace>
<AssemblyName>QSB.Messaging</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="0Harmony, Version=1.2.0.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Lib.Harmony.1.2.0.1\lib\net35\0Harmony.dll</HintPath>
</Reference>
<Reference Include="NAudio-Unity, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\NAudio-Unity.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Json.Net.Unity3D.9.0.1\lib\net35\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="OWML, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.dll</HintPath>
</Reference>
<Reference Include="OWML.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.Common.dll</HintPath>
</Reference>
<Reference Include="OWML.ModHelper, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.ModHelper.dll</HintPath>
</Reference>
<Reference Include="OWML.ModHelper.Assets, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.ModHelper.Assets.dll</HintPath>
</Reference>
<Reference Include="OWML.ModHelper.Events, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.ModHelper.Events.dll</HintPath>
</Reference>
<Reference Include="OWML.ModHelper.Menus, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\OWML.0.3.37\lib\net35\OWML.ModHelper.Menus.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="UnityEngine">
<HintPath>$(StartWorkingDirectory)\..\OuterWilds_Data\Managed\UnityEngine.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>$(StartWorkingDirectory)\..\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.Networking">
<HintPath>$(StartWorkingDirectory)\..\OuterWilds_Data\Managed\UnityEngine.Networking.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MessageHandler.cs" />
<Compile Include="MessageType.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SectorMessage.cs" />
<Compile Include="WakeUpMessage.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartWorkingDirectory>C:\Program Files\Epic Games\OuterWilds\OWML</StartWorkingDirectory>
</PropertyGroup>
<PropertyGroup>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Json.Net.Unity3D" version="9.0.1" targetFramework="net35" />
<package id="Lib.Harmony" version="1.2.0.1" targetFramework="net35" />
<package id="OWML" version="0.3.37" targetFramework="net35" />
</packages>

View File

@ -5,8 +5,6 @@ VisualStudioVersion = 16.0.29613.14
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QSB", "QSB\QSB.csproj", "{1F00090A-C697-4C55-B401-192F3CFB9DC2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QSB", "QSB\QSB.csproj", "{1F00090A-C697-4C55-B401-192F3CFB9DC2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QSB.Messaging", "QSB.Messaging\QSB.Messaging.csproj", "{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -17,10 +15,6 @@ Global
{1F00090A-C697-4C55-B401-192F3CFB9DC2}.Debug|Any CPU.Build.0 = Debug|Any CPU {1F00090A-C697-4C55-B401-192F3CFB9DC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F00090A-C697-4C55-B401-192F3CFB9DC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {1F00090A-C697-4C55-B401-192F3CFB9DC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F00090A-C697-4C55-B401-192F3CFB9DC2}.Release|Any CPU.Build.0 = Release|Any CPU {1F00090A-C697-4C55-B401-192F3CFB9DC2}.Release|Any CPU.Build.0 = Release|Any CPU
{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6BB93AA-F405-48D5-9C4C-49C3F8E81E9A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -1,8 +1,8 @@
using UnityEngine; using UnityEngine;
namespace QSB namespace QSB.Animation
{ {
public class FloatAnimParam public class AnimFloatParam
{ {
public float Current { get; private set; } public float Current { get; private set; }
public float Target { get; set; } public float Target { get; set; }

View File

@ -1,7 +1,7 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
namespace QSB namespace QSB.Animation
{ {
public class AnimationSync : NetworkBehaviour public class AnimationSync : NetworkBehaviour
{ {

View File

@ -2,7 +2,7 @@
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
namespace QSB namespace QSB.Animation
{ {
public class AnimatorMirror : MonoBehaviour public class AnimatorMirror : MonoBehaviour
{ {
@ -12,7 +12,7 @@ namespace QSB
private Animator _to; private Animator _to;
private bool _isRunning; private bool _isRunning;
private readonly Dictionary<string, FloatAnimParam> _floatParams = new Dictionary<string, FloatAnimParam>(); private readonly Dictionary<string, AnimFloatParam> _floatParams = new Dictionary<string, AnimFloatParam>();
public void Init(Animator from, Animator to) public void Init(Animator from, Animator to)
{ {
@ -28,7 +28,7 @@ namespace QSB
} }
foreach (var param in _from.parameters.Where(p => p.type == AnimatorControllerParameterType.Float)) foreach (var param in _from.parameters.Where(p => p.type == AnimatorControllerParameterType.Float))
{ {
_floatParams.Add(param.name, new FloatAnimParam()); _floatParams.Add(param.name, new AnimFloatParam());
} }
_isRunning = true; _isRunning = true;
} }

View File

@ -1,33 +0,0 @@
using UnityEngine;
namespace QSB
{
static class Helpers
{
// Stolen from here: https://gist.github.com/maxattack/4c7b4de00f5c1b95a33b
public static Quaternion QuaternionSmoothDamp(Quaternion rot, Quaternion target, ref Quaternion deriv, float time)
{
// account for double-cover
var Dot = Quaternion.Dot(rot, target);
var Multi = Dot > 0f ? 1f : -1f;
target.x *= Multi;
target.y *= Multi;
target.z *= Multi;
target.w *= Multi;
// smooth damp (nlerp approx)
var Result = new Vector4(
Mathf.SmoothDamp(rot.x, target.x, ref deriv.x, time),
Mathf.SmoothDamp(rot.y, target.y, ref deriv.y, time),
Mathf.SmoothDamp(rot.z, target.z, ref deriv.z, time),
Mathf.SmoothDamp(rot.w, target.w, ref deriv.w, time)
).normalized;
// compute deriv
var dtInv = 1f / Time.deltaTime;
deriv.x = (Result.x - rot.x) * dtInv;
deriv.y = (Result.y - rot.y) * dtInv;
deriv.z = (Result.z - rot.z) * dtInv;
deriv.w = (Result.w - rot.w) * dtInv;
return new Quaternion(Result.x, Result.y, Result.z, Result.w);
}
}
}

View File

@ -0,0 +1,42 @@
using System;
using UnityEngine.Networking;
namespace QSB.Messaging
{
// Extend this to create new message handlers.
public class MessageHandler<T> where T : QSBMessage, new()
{
public event Action<T> OnClientReceiveMessage;
public event Action<T> OnServerReceiveMessage;
public MessageHandler()
{
var message = (T)Activator.CreateInstance(typeof(T));
NetworkServer.RegisterHandler((short)message.MessageType, OnServerReceiveMessageHandler);
NetworkManager.singleton.client.RegisterHandler((short)message.MessageType, OnClientReceiveMessageHandler);
}
public void SendToAll(T message)
{
NetworkServer.SendToAll((short)message.MessageType, message);
}
public void SendToServer(T message)
{
NetworkManager.singleton.client.Send((short)message.MessageType, message);
}
private void OnClientReceiveMessageHandler(NetworkMessage netMsg)
{
var message = netMsg.ReadMessage<T>();
OnClientReceiveMessage?.Invoke(message);
}
private void OnServerReceiveMessageHandler(NetworkMessage netMsg)
{
var message = netMsg.ReadMessage<T>();
OnServerReceiveMessage?.Invoke(message);
}
}
}

View File

@ -5,7 +5,7 @@ namespace QSB.Messaging
public enum MessageType public enum MessageType
{ {
Sector = MsgType.Highest + 1, Sector = MsgType.Highest + 1,
WakeUp = MsgType.Highest + 2, WakeUp = MsgType.Highest + 2
// Add other message types here, incrementing the value. // Add other message types here, incrementing the value.
} }
} }

View File

@ -0,0 +1,9 @@
using UnityEngine.Networking;
namespace QSB.Messaging
{
public abstract class QSBMessage : MessageBase
{
public abstract MessageType MessageType { get; }
}
}

View File

@ -2,11 +2,11 @@
namespace QSB namespace QSB
{ {
class PreserveTimeScale : QSBBehaviour public class PreserveTimeScale : QSBBehaviour
{ {
void Update() private void Update()
{ {
if (isPlayerAwake) if (IsPlayerAwake)
{ {
Time.timeScale = 1; Time.timeScale = 1;
} }

View File

@ -16,12 +16,6 @@ namespace QSB
Cursor.visible = true; Cursor.visible = true;
} }
private void Update()
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
private void Start() private void Start()
{ {
Helper = ModHelper; Helper = ModHelper;
@ -31,6 +25,6 @@ namespace QSB
gameObject.AddComponent<NetworkManagerHUD>(); gameObject.AddComponent<NetworkManagerHUD>();
gameObject.AddComponent<PreserveTimeScale>(); gameObject.AddComponent<PreserveTimeScale>();
} }
} }
} }

View File

@ -94,33 +94,32 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AnimationSync.cs" /> <Compile Include="Animation\AnimationSync.cs" />
<Compile Include="AnimatorMirror.cs" /> <Compile Include="Animation\AnimatorMirror.cs" />
<Compile Include="FloatAnimParam.cs" /> <Compile Include="Animation\AnimFloatParam.cs" />
<Compile Include="DebugLog.cs" /> <Compile Include="DebugLog.cs" />
<Compile Include="Helpers.cs" /> <Compile Include="Messaging\MessageHandler.cs" />
<Compile Include="Messaging\MessageType.cs" />
<Compile Include="Messaging\QSBMessage.cs" />
<Compile Include="TransformSync\QuaternionHelper.cs" />
<Compile Include="QSBBehaviour.cs" /> <Compile Include="QSBBehaviour.cs" />
<Compile Include="PreserveTimeScale.cs" /> <Compile Include="PreserveTimeScale.cs" />
<Compile Include="ShipTransformSync.cs" /> <Compile Include="TransformSync\ShipTransformSync.cs" />
<Compile Include="TransformSync.cs" /> <Compile Include="TransformSync\TransformSync.cs" />
<Compile Include="TransformSync\SectorMessage.cs" />
<Compile Include="TransformSync\SectorSync.cs" />
<Compile Include="WakeUpMessage.cs" />
<Compile Include="WakeUpSync.cs" /> <Compile Include="WakeUpSync.cs" />
<Compile Include="QSBNetworkManager.cs" /> <Compile Include="QSBNetworkManager.cs" />
<Compile Include="QSB.cs" /> <Compile Include="QSB.cs" />
<Compile Include="NetworkPlayer.cs" /> <Compile Include="TransformSync\PlayerTransformSync.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SectorSync.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="default-config.json" /> <None Include="default-config.json" />
<None Include="manifest.json" /> <None Include="manifest.json" />
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\QSB.Messaging\QSB.Messaging.csproj">
<Project>{d6bb93aa-f405-48d5-9c4c-49c3f8e81e9a}</Project>
<Name>QSB.Messaging</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>md "$(StartWorkingDirectory)\Mods\$(ProjectName)" <PostBuildEvent>md "$(StartWorkingDirectory)\Mods\$(ProjectName)"
@ -128,7 +127,6 @@ md "$(StartWorkingDirectory)\Mods\$(ProjectName)\assets"
del "$(StartWorkingDirectory)\Mods\$(ProjectName)\config.json" del "$(StartWorkingDirectory)\Mods\$(ProjectName)\config.json"
copy /y "$(TargetPath)" "$(StartWorkingDirectory)\Mods\$(ProjectName)" copy /y "$(TargetPath)" "$(StartWorkingDirectory)\Mods\$(ProjectName)"
copy /y "$(TargetDir)\QSB.Messaging.dll" "$(StartWorkingDirectory)\Mods\$(ProjectName)"
copy /y "$(ProjectDir)\default-config.json" "$(StartWorkingDirectory)\Mods\$(ProjectName)" copy /y "$(ProjectDir)\default-config.json" "$(StartWorkingDirectory)\Mods\$(ProjectName)"

View File

@ -3,9 +3,9 @@ using UnityEngine.SceneManagement;
namespace QSB namespace QSB
{ {
abstract class QSBBehaviour : MonoBehaviour public abstract class QSBBehaviour : MonoBehaviour
{ {
protected bool isPlayerAwake; protected bool IsPlayerAwake;
protected virtual void Awake() protected virtual void Awake()
{ {
@ -27,7 +27,7 @@ namespace QSB
protected virtual void PlayerWokeUp() protected virtual void PlayerWokeUp()
{ {
isPlayerAwake = true; IsPlayerAwake = true;
} }
protected virtual void StartSolarSystem() { } protected virtual void StartSolarSystem() { }

View File

@ -1,17 +1,20 @@
using UnityEngine; using QSB.Animation;
using QSB.TransformSync;
using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
namespace QSB namespace QSB
{ {
public class QSBNetworkManager : NetworkManager public class QSBNetworkManager : NetworkManager
{ {
AssetBundle _assetBundle; private AssetBundle _assetBundle;
GameObject _shipPrefab; private GameObject _shipPrefab;
private void Awake() private void Awake()
{ {
_assetBundle = QSB.Helper.Assets.LoadBundle("assets/network"); _assetBundle = QSB.Helper.Assets.LoadBundle("assets/network");
playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab"); playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab");
playerPrefab.AddComponent<NetworkPlayer>(); playerPrefab.AddComponent<PlayerTransformSync>();
playerPrefab.AddComponent<AnimationSync>(); playerPrefab.AddComponent<AnimationSync>();
_shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab"); _shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");

View File

@ -1,10 +1,11 @@
using UnityEngine; using QSB.Animation;
using UnityEngine;
namespace QSB namespace QSB.TransformSync
{ {
public class NetworkPlayer : TransformSync public class PlayerTransformSync : TransformSync
{ {
public static NetworkPlayer LocalInstance { get; private set; } public static PlayerTransformSync LocalInstance { get; private set; }
private Transform _playerModel; private Transform _playerModel;

View File

@ -0,0 +1,33 @@
using UnityEngine;
namespace QSB.TransformSync
{
public static class QuaternionHelper
{
// Stolen from here: https://gist.github.com/maxattack/4c7b4de00f5c1b95a33b
public static Quaternion SmoothDamp(Quaternion rot, Quaternion target, ref Quaternion deriv, float time)
{
// account for double-cover
var dot = Quaternion.Dot(rot, target);
var multi = dot > 0f ? 1f : -1f;
target.x *= multi;
target.y *= multi;
target.z *= multi;
target.w *= multi;
// smooth damp (nlerp approx)
var result = new Vector4(
Mathf.SmoothDamp(rot.x, target.x, ref deriv.x, time),
Mathf.SmoothDamp(rot.y, target.y, ref deriv.y, time),
Mathf.SmoothDamp(rot.z, target.z, ref deriv.z, time),
Mathf.SmoothDamp(rot.w, target.w, ref deriv.w, time)
).normalized;
// compute deriv
var dtInv = 1f / Time.deltaTime;
deriv.x = (result.x - rot.x) * dtInv;
deriv.y = (result.y - rot.y) * dtInv;
deriv.z = (result.z - rot.z) * dtInv;
deriv.w = (result.w - rot.w) * dtInv;
return new Quaternion(result.x, result.y, result.z, result.w);
}
}
}

View File

@ -1,9 +1,12 @@
using UnityEngine.Networking; using QSB.Messaging;
using UnityEngine.Networking;
namespace QSB.Messaging namespace QSB.TransformSync
{ {
public class SectorMessage : MessageBase public class SectorMessage : QSBMessage
{ {
public override MessageType MessageType => MessageType.Sector;
public int SectorId; public int SectorId;
public uint SenderId; public uint SenderId;
@ -18,5 +21,6 @@ namespace QSB.Messaging
writer.Write(SectorId); writer.Write(SectorId);
writer.Write(SenderId); writer.Write(SenderId);
} }
} }
} }

View File

@ -1,31 +1,36 @@
using QSB.Messaging; using System.Collections.Generic;
using System.Collections.Generic; using QSB.Messaging;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking;
namespace QSB namespace QSB.TransformSync
{ {
public class SectorSync : MessageHandler public class SectorSync : MonoBehaviour
{ {
protected override MessageType Type => MessageType.Sector; public static SectorSync Instance { get; private set; }
private static Dictionary<uint, Transform> _playerSectors; private Dictionary<uint, Transform> _playerSectors;
private static Sector[] _allSectors; private Sector[] _allSectors;
private MessageHandler<SectorMessage> _sectorHandler;
private void Start() private void Start()
{ {
Instance = this;
DebugLog.Screen("Start SectorSync"); DebugLog.Screen("Start SectorSync");
_playerSectors = new Dictionary<uint, Transform>(); _playerSectors = new Dictionary<uint, Transform>();
_sectorHandler = new MessageHandler<SectorMessage>();
_sectorHandler.OnClientReceiveMessage += OnClientReceiveMessage;
_sectorHandler.OnServerReceiveMessage += OnServerReceiveMessage;
QSB.Helper.HarmonyHelper.AddPrefix<SectorDetector>("AddSector", typeof(Patches), "PreAddSector"); QSB.Helper.HarmonyHelper.AddPrefix<SectorDetector>("AddSector", typeof(Patches), "PreAddSector");
} }
public static void SetSector(uint id, Transform sectorTransform) public void SetSector(uint id, Transform sectorTransform)
{ {
_playerSectors[id] = sectorTransform; _playerSectors[id] = sectorTransform;
} }
public static void SetSector(uint id, Sector.Name sectorName) public void SetSector(uint id, Sector.Name sectorName)
{ {
DebugLog.Screen("Gonna set sector"); DebugLog.Screen("Gonna set sector");
@ -36,16 +41,15 @@ namespace QSB
SectorId = (int)sectorName, SectorId = (int)sectorName,
SenderId = id SenderId = id
}; };
NetworkManager.singleton.client.Send((short)MessageType.Sector, msg); _sectorHandler.SendToServer(msg);
} }
public static Transform GetSector(uint id) public Transform GetSector(uint id)
{ {
return _playerSectors[id]; return _playerSectors[id];
} }
private static Transform FindSectorTransform(Sector.Name sectorName) private Transform FindSectorTransform(Sector.Name sectorName)
{ {
if (_allSectors == null) if (_allSectors == null)
{ {
@ -61,12 +65,11 @@ namespace QSB
return null; return null;
} }
protected override void OnClientReceiveMessage(NetworkMessage netMsg) private void OnClientReceiveMessage(SectorMessage message)
{ {
DebugLog.Screen("OnClientReceiveMessage SectorSync"); DebugLog.Screen("OnClientReceiveMessage SectorSync");
var msg = netMsg.ReadMessage<SectorMessage>();
var sectorName = (Sector.Name)msg.SectorId; var sectorName = (Sector.Name)message.SectorId;
var sectorTransform = FindSectorTransform(sectorName); var sectorTransform = FindSectorTransform(sectorName);
if (sectorTransform == null) if (sectorTransform == null)
@ -75,15 +78,14 @@ namespace QSB
return; return;
} }
DebugLog.Screen("Found sector", sectorName, ", setting for", msg.SenderId); DebugLog.Screen("Found sector", sectorName, ", setting for", message.SenderId);
_playerSectors[msg.SenderId] = sectorTransform; _playerSectors[message.SenderId] = sectorTransform;
} }
protected override void OnServerReceiveMessage(NetworkMessage netMsg) private void OnServerReceiveMessage(SectorMessage message)
{ {
DebugLog.Screen("OnServerReceiveMessage SectorSync"); DebugLog.Screen("OnServerReceiveMessage SectorSync");
var msg = netMsg.ReadMessage<SectorMessage>(); _sectorHandler.SendToAll(message);
NetworkServer.SendToAll((short)MessageType.Sector, msg);
} }
private static class Patches private static class Patches
@ -95,9 +97,9 @@ namespace QSB
return; return;
} }
if (____occupantType == DynamicOccupant.Player && NetworkPlayer.LocalInstance != null) if (____occupantType == DynamicOccupant.Player && PlayerTransformSync.LocalInstance != null)
{ {
NetworkPlayer.LocalInstance.EnterSector(sector); PlayerTransformSync.LocalInstance.EnterSector(sector);
return; return;
} }

View File

@ -1,6 +1,6 @@
using UnityEngine; using UnityEngine;
namespace QSB namespace QSB.TransformSync
{ {
public class ShipTransformSync : TransformSync public class ShipTransformSync : TransformSync
{ {

View File

@ -1,7 +1,7 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
namespace QSB namespace QSB.TransformSync
{ {
public abstract class TransformSync : NetworkBehaviour public abstract class TransformSync : NetworkBehaviour
{ {
@ -33,12 +33,12 @@ namespace QSB
private void SetFirstSector() private void SetFirstSector()
{ {
_isSectorSetUp = true; _isSectorSetUp = true;
SectorSync.SetSector(netId.Value, Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform); SectorSync.Instance.SetSector(netId.Value, Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform);
} }
public void EnterSector(Sector sector) public void EnterSector(Sector sector)
{ {
SectorSync.SetSector(netId.Value, sector.GetName()); SectorSync.Instance.SetSector(netId.Value, sector.GetName());
} }
private void Update() private void Update()
@ -48,7 +48,7 @@ namespace QSB
return; return;
} }
var sectorTransform = SectorSync.GetSector(netId.Value); var sectorTransform = SectorSync.Instance.GetSector(netId.Value);
if (hasAuthority) if (hasAuthority)
{ {
@ -60,7 +60,7 @@ namespace QSB
_syncedTransform.parent = sectorTransform; _syncedTransform.parent = sectorTransform;
_syncedTransform.localPosition = Vector3.SmoothDamp(_syncedTransform.localPosition, transform.position, ref _positionSmoothVelocity, SmoothTime); _syncedTransform.localPosition = Vector3.SmoothDamp(_syncedTransform.localPosition, transform.position, ref _positionSmoothVelocity, SmoothTime);
_syncedTransform.localRotation = Helpers.QuaternionSmoothDamp(_syncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, Time.deltaTime); _syncedTransform.localRotation = QuaternionHelper.SmoothDamp(_syncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, Time.deltaTime);
} }
} }
} }

View File

@ -1,9 +1,12 @@
using UnityEngine.Networking; using QSB.Messaging;
using UnityEngine.Networking;
namespace QSB.Messaging namespace QSB
{ {
public class WakeUpMessage : MessageBase public class WakeUpMessage : QSBMessage
{ {
public override MessageType MessageType => MessageType.WakeUp;
private bool _wakeUp = true; private bool _wakeUp = true;
public override void Deserialize(NetworkReader reader) public override void Deserialize(NetworkReader reader)
@ -15,5 +18,6 @@ namespace QSB.Messaging
{ {
writer.Write(_wakeUp); writer.Write(_wakeUp);
} }
} }
} }

View File

@ -1,20 +1,20 @@
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.Messaging; using QSB.Messaging;
using System; using UnityEngine;
using UnityEngine.Networking;
namespace QSB namespace QSB
{ {
public class WakeUpSync : MessageHandler public class WakeUpSync : MonoBehaviour
{ {
public static bool IsServer; public static bool IsServer;
private MessageHandler<WakeUpMessage> _wakeUpHandler;
protected override MessageType Type => MessageType.WakeUp;
private void Start() private void Start()
{ {
DebugLog.Screen("Start WakeUpSync"); DebugLog.Screen("Start WakeUpSync");
GlobalMessenger.AddListener("WakeUp", OnWakeUp); GlobalMessenger.AddListener("WakeUp", OnWakeUp);
_wakeUpHandler = new MessageHandler<WakeUpMessage>();
_wakeUpHandler.OnClientReceiveMessage += OnClientReceiveMessage;
} }
private void OnWakeUp() private void OnWakeUp()
@ -22,12 +22,11 @@ namespace QSB
DebugLog.Screen("Sending wakeup to all my friends"); DebugLog.Screen("Sending wakeup to all my friends");
if (IsServer) if (IsServer)
{ {
var message = new WakeUpMessage(); _wakeUpHandler.SendToAll(new WakeUpMessage());
NetworkServer.SendToAll((short)MessageType.WakeUp, message);
} }
} }
protected override void OnClientReceiveMessage(NetworkMessage netMsg) private void OnClientReceiveMessage(WakeUpMessage message)
{ {
if (IsServer) if (IsServer)
{ {
@ -56,10 +55,5 @@ namespace QSB
GlobalMessenger.FireEvent("TakeFirstFlashbackSnapshot"); GlobalMessenger.FireEvent("TakeFirstFlashbackSnapshot");
} }
protected override void OnServerReceiveMessage(NetworkMessage netMsg)
{
throw new NotImplementedException();
}
} }
} }