Skip to content

Commit c8e4487

Browse files
authored
Merge pull request #635 from misternebula/dev
0.29.0
2 parents a1fcbd3 + 9ff28dc commit c8e4487

21 files changed

+281
-69
lines changed

QSB/Audio/Messages/ShipThrusterAudioOneShotMessage.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ public ShipThrusterAudioOneShotMessage(AudioType audioType, float pitch = 1f, fl
1313

1414
public override void OnReceiveRemote()
1515
{
16-
var source = ShipManager.Instance.ShipThrusterAudio._rotationalSource;
16+
var source = ShipManager.Instance?.ShipThrusterAudio?._rotationalSource;
17+
18+
if (source == null)
19+
{
20+
return;
21+
}
22+
1723
source.pitch = Data.pitch;
1824
source.PlayOneShot(Data.audioType, Data.volume);
1925
}

QSB/HUD/MultiplayerHUDManager.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System;
1010
using System.Linq;
1111
using UnityEngine;
12+
using UnityEngine.InputSystem;
1213
using UnityEngine.SceneManagement;
1314
using UnityEngine.UI;
1415

@@ -94,7 +95,7 @@ public void WriteMessage(string message, Color color)
9495

9596
if (_messages.Count > LINE_COUNT)
9697
{
97-
_messages.RemoveFirstElementAndShift();
98+
_messages.PopFromBack();
9899
}
99100

100101
var currentLineIndex = 10;
@@ -157,6 +158,8 @@ public void WriteMessage(string message, Color color)
157158
_textChat.GetComponent<CanvasGroup>().alpha = 1;
158159
}
159160

161+
ListStack<string> previousMessages = new(true);
162+
160163
private void Update()
161164
{
162165
if (!QSBWorldSync.AllObjectsReady || _playerList == null)
@@ -168,12 +171,39 @@ private void Update()
168171

169172
var inSuit = Locator.GetPlayerSuit().IsWearingHelmet();
170173

171-
if (OWInput.IsNewlyPressed(InputLibrary.enter, InputMode.Character) && !_writingMessage && inSuit && QSBCore.TextChatInput)
174+
if ((OWInput.IsNewlyPressed(InputLibrary.enter, InputMode.Character) || (Keyboard.current[Key.Slash].wasPressedThisFrame && OWInput.IsInputMode(InputMode.Character)))
175+
&& !_writingMessage && inSuit && QSBCore.TextChatInput)
172176
{
173177
OWInput.ChangeInputMode(InputMode.KeyboardInput);
174178
_writingMessage = true;
175179
_inputField.ActivateInputField();
176180
_textChat.GetComponent<CanvasGroup>().alpha = 1;
181+
182+
if (Keyboard.current[Key.Slash].wasPressedThisFrame)
183+
{
184+
Delay.RunNextFrame(() => _inputField.text = "/");
185+
}
186+
}
187+
188+
if (Keyboard.current[Key.UpArrow].wasPressedThisFrame && _writingMessage)
189+
{
190+
var currentText = _inputField.text;
191+
192+
if (previousMessages.Contains(currentText))
193+
{
194+
var index = previousMessages.IndexOf(currentText);
195+
196+
if (index == 0)
197+
{
198+
return;
199+
}
200+
201+
_inputField.text = previousMessages[index - 1];
202+
}
203+
else
204+
{
205+
_inputField.text = previousMessages.Last();
206+
}
177207
}
178208

179209
if (OWInput.IsNewlyPressed(InputLibrary.enter, InputMode.KeyboardInput) && _writingMessage)
@@ -185,6 +215,14 @@ private void Update()
185215
var message = _inputField.text;
186216
_inputField.text = "";
187217
message = message.Replace("\n", "").Replace("\r", "");
218+
219+
previousMessages.Push(message);
220+
221+
if (QSBCore.DebugSettings.DebugMode && CommandInterpreter.InterpretCommand(message))
222+
{
223+
return;
224+
}
225+
188226
message = $"{QSBPlayerManager.LocalPlayer.Name}: {message}";
189227
new ChatMessage(message, Color.white).Send();
190228
}

QSB/HUD/PlanetTrigger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public override void OnSectorOccupantAdded(SectorDetector detector)
1616
}
1717

1818
MultiplayerHUDManager.HUDIconStack.Push(Icon);
19-
var top = MultiplayerHUDManager.HUDIconStack.Peek();
19+
var top = MultiplayerHUDManager.HUDIconStack.PeekFront();
2020
new PlanetMessage(top).Send();
2121
}
2222

@@ -28,7 +28,7 @@ public override void OnSectorOccupantRemoved(SectorDetector detector)
2828
}
2929

3030
MultiplayerHUDManager.HUDIconStack.Remove(Icon);
31-
var top = MultiplayerHUDManager.HUDIconStack.Peek();
31+
var top = MultiplayerHUDManager.HUDIconStack.PeekFront();
3232
new PlanetMessage(top).Send();
3333
}
3434
}

QSB/Localization/Translation.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Mirror;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32

43
namespace QSB.Localization;
54

@@ -29,7 +28,6 @@ public class Translation
2928
public string OK;
3029
public string ServerRefusedConnection;
3130
public string ClientDisconnectWithError;
32-
public Dictionary<TransportError, string> TransportErrors;
3331
public string QSBVersionMismatch;
3432
public string OWVersionMismatch;
3533
public string DLCMismatch;

QSB/Menus/MenuManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ private void OnDisconnected(TransportError error, string reason)
736736
}
737737
};
738738

739-
OpenInfoPopup(string.Format(QSBLocalization.Current.ClientDisconnectWithError, QSBLocalization.Current.TransportErrors[error], reason), QSBLocalization.Current.OK);
739+
OpenInfoPopup(string.Format(QSBLocalization.Current.ClientDisconnectWithError, reason), QSBLocalization.Current.OK);
740740
}
741741

742742
SetButtonActive(DisconnectButton, false);

QSB/Messaging/QSBMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public abstract class QSBMessage
77
/// <summary>
88
/// set automatically by Send
99
/// </summary>
10-
internal uint From;
10+
protected internal uint From;
1111
/// <summary>
1212
/// (default) uint.MaxValue = send to everyone <br/>
1313
/// 0 = send to host

QSB/Patches/QSBPatchManager.cs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,44 @@ public static void Init()
2323
{
2424
if (_inited)
2525
{
26-
var count = _patchList.Count;
26+
var newPatches = new List<QSBPatch>();
27+
2728
foreach (var type in typeof(QSBPatch).GetDerivedTypes())
2829
{
29-
if (!_patchList.Any(x => x.GetType() == type))
30+
if (!newPatches.Any(x => x.GetType() == type)
31+
&& !_patchList.Any(x => x.GetType() == type))
32+
{
33+
newPatches.Add((QSBPatch)Activator.CreateInstance(type));
34+
}
35+
}
36+
37+
_patchList.AddRange(newPatches);
38+
39+
// could do lots of code to make sure all addon patches are done here,
40+
// but the only patch type that will have been used by this point in the
41+
// mod execution is OnModStart
42+
43+
DebugLog.DebugWrite($"Re-patching block OnModStart for addons", MessageType.Info);
44+
var harmonyInstance = TypeToInstance[QSBPatchTypes.OnModStart];
45+
foreach (var patch in newPatches)
46+
{
47+
if (patch.Type != QSBPatchTypes.OnModStart)
48+
{
49+
continue;
50+
}
51+
52+
DebugLog.DebugWrite($" - Patching in {patch.GetType().Name}", MessageType.Info);
53+
try
54+
{
55+
patch.DoPatches(harmonyInstance);
56+
}
57+
catch (Exception ex)
3058
{
31-
_patchList.Add((QSBPatch)Activator.CreateInstance(type));
59+
DebugLog.ToConsole($"Error while patching {patch.GetType().Name} :\r\n{ex}", MessageType.Error);
3260
}
3361
}
3462

35-
DebugLog.DebugWrite($"Registered {_patchList.Count - count} addon patches.", MessageType.Success);
63+
DebugLog.DebugWrite($"Registered {newPatches.Count()} addon patches.", MessageType.Success);
3664
return;
3765
}
3866

@@ -59,10 +87,10 @@ public static void DoPatchType(QSBPatchTypes type)
5987
}
6088

6189
OnPatchType?.SafeInvoke(type);
62-
//DebugLog.DebugWrite($"Patch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info);
90+
DebugLog.DebugWrite($"Patch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info);
6391
foreach (var patch in _patchList.Where(x => x.Type == type && x.PatchVendor.HasFlag(QSBCore.GameVendor)))
6492
{
65-
//DebugLog.DebugWrite($" - Patching in {patch.GetType().Name}", MessageType.Info);
93+
DebugLog.DebugWrite($" - Patching in {patch.GetType().Name}", MessageType.Info);
6694
try
6795
{
6896
patch.DoPatches(TypeToInstance[type]);

QSB/Player/PlayerInfo.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using QSB.ShipSync;
1212
using QSB.Tools;
1313
using QSB.Utility;
14+
using System.Collections.Generic;
1415
using System.Linq;
1516
using UnityEngine;
1617

@@ -178,5 +179,20 @@ public void Revive()
178179
HUDBox.OnRespawn();
179180
}
180181

182+
private Dictionary<string, object> _customData = new();
183+
184+
public void SetCustomData<T>(string key, T data)
185+
=> _customData[key] = data;
186+
187+
public T GetCustomData<T>(string key)
188+
{
189+
if (!_customData.ContainsKey(key))
190+
{
191+
return default;
192+
}
193+
194+
return (T)_customData[key];
195+
}
196+
181197
public override string ToString() => $"{PlayerId}:{GetType().Name} ({Name})";
182198
}

QSB/QSB.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
</None>
6969
</ItemGroup>
7070
<ItemGroup>
71-
<PackageReference Include="OuterWildsGameLibs" Version="1.1.13.393" IncludeAssets="compile" />
72-
<PackageReference Include="OWML" Version="2.9.0" IncludeAssets="compile" />
71+
<PackageReference Include="OuterWildsGameLibs" Version="1.1.13.457" IncludeAssets="compile" />
72+
<PackageReference Include="OWML" Version="2.9.3" IncludeAssets="compile" />
7373
<Reference Include="..\Mirror\*.dll" />
7474
<Reference Include="..\UniTask\*.dll" />
7575
<ProjectReference Include="..\EpicOnlineTransport\EpicOnlineTransport.csproj" />

QSB/QSBNetworkManager.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -106,52 +106,52 @@ public override void Awake()
106106
playerPrefab = QSBCore.NetworkAssetBundle.LoadAsset<GameObject>("Assets/Prefabs/NETWORK_Player_Body.prefab");
107107
playerPrefab.GetRequiredComponent<NetworkIdentity>().SetValue("_assetId", (uint)1);
108108

109-
ShipPrefab = MakeNewNetworkObject(2, "NetworkShip", typeof(ShipTransformSync));
109+
ShipPrefab = MakeNewNetworkObject("NetworkShip", typeof(ShipTransformSync));
110110
var shipVector3Sync = ShipPrefab.AddComponent<Vector3VariableSyncer>();
111111
var shipThrustSync = ShipPrefab.AddComponent<ShipThrusterVariableSyncer>();
112112
shipThrustSync.AccelerationSyncer = shipVector3Sync;
113113
spawnPrefabs.Add(ShipPrefab);
114114

115-
_probePrefab = MakeNewNetworkObject(3, "NetworkProbe", typeof(PlayerProbeSync));
115+
_probePrefab = MakeNewNetworkObject("NetworkProbe", typeof(PlayerProbeSync));
116116
spawnPrefabs.Add(_probePrefab);
117117

118-
OrbPrefab = MakeNewNetworkObject(4, "NetworkOrb", typeof(NomaiOrbTransformSync));
118+
OrbPrefab = MakeNewNetworkObject("NetworkOrb", typeof(NomaiOrbTransformSync));
119119
spawnPrefabs.Add(OrbPrefab);
120120

121-
AnglerPrefab = MakeNewNetworkObject(5, "NetworkAngler", typeof(AnglerTransformSync));
121+
AnglerPrefab = MakeNewNetworkObject("NetworkAngler", typeof(AnglerTransformSync));
122122
spawnPrefabs.Add(AnglerPrefab);
123123

124-
JellyfishPrefab = MakeNewNetworkObject(6, "NetworkJellyfish", typeof(JellyfishTransformSync));
124+
JellyfishPrefab = MakeNewNetworkObject("NetworkJellyfish", typeof(JellyfishTransformSync));
125125
spawnPrefabs.Add(JellyfishPrefab);
126126

127-
OccasionalPrefab = MakeNewNetworkObject(7, "NetworkOccasional", typeof(OccasionalTransformSync));
127+
OccasionalPrefab = MakeNewNetworkObject("NetworkOccasional", typeof(OccasionalTransformSync));
128128
spawnPrefabs.Add(OccasionalPrefab);
129129

130-
RaftPrefab = MakeNewNetworkObject(8, "NetworkRaft", typeof(RaftTransformSync));
130+
RaftPrefab = MakeNewNetworkObject("NetworkRaft", typeof(RaftTransformSync));
131131
spawnPrefabs.Add(RaftPrefab);
132132

133-
DoorPrefab = MakeNewNetworkObject(9, "NetworkEclipseDoor", typeof(EclipseDoorVariableSyncer));
133+
DoorPrefab = MakeNewNetworkObject("NetworkEclipseDoor", typeof(EclipseDoorVariableSyncer));
134134
spawnPrefabs.Add(DoorPrefab);
135135

136-
ElevatorPrefab = MakeNewNetworkObject(10, "NetworkEclipseElevator", typeof(EclipseElevatorVariableSyncer));
136+
ElevatorPrefab = MakeNewNetworkObject("NetworkEclipseElevator", typeof(EclipseElevatorVariableSyncer));
137137
spawnPrefabs.Add(ElevatorPrefab);
138138

139-
AirlockPrefab = MakeNewNetworkObject(11, "NetworkGhostAirlock", typeof(AirlockVariableSyncer));
139+
AirlockPrefab = MakeNewNetworkObject("NetworkGhostAirlock", typeof(AirlockVariableSyncer));
140140
spawnPrefabs.Add(AirlockPrefab);
141141

142-
ShipModulePrefab = MakeNewNetworkObject(12, "NetworkShipModule", typeof(ShipModuleTransformSync));
142+
ShipModulePrefab = MakeNewNetworkObject("NetworkShipModule", typeof(ShipModuleTransformSync));
143143
spawnPrefabs.Add(ShipModulePrefab);
144144

145-
ShipLegPrefab = MakeNewNetworkObject(13, "NetworkShipLeg", typeof(ShipLegTransformSync));
145+
ShipLegPrefab = MakeNewNetworkObject("NetworkShipLeg", typeof(ShipLegTransformSync));
146146
spawnPrefabs.Add(ShipLegPrefab);
147147

148-
ModelShipPrefab = MakeNewNetworkObject(14, "NetworkModelShip", typeof(ModelShipTransformSync));
148+
ModelShipPrefab = MakeNewNetworkObject("NetworkModelShip", typeof(ModelShipTransformSync));
149149
var modelShipVector3Syncer = ModelShipPrefab.AddComponent<Vector3VariableSyncer>();
150150
var modelShipThrusterVariableSyncer = ModelShipPrefab.AddComponent<ModelShipThrusterVariableSyncer>();
151151
modelShipThrusterVariableSyncer.AccelerationSyncer = modelShipVector3Syncer;
152152
spawnPrefabs.Add(ModelShipPrefab);
153153

154-
StationaryProbeLauncherPrefab = MakeNewNetworkObject(15, "NetworkStationaryProbeLauncher", typeof(StationaryProbeLauncherVariableSyncer));
154+
StationaryProbeLauncherPrefab = MakeNewNetworkObject("NetworkStationaryProbeLauncher", typeof(StationaryProbeLauncherVariableSyncer));
155155
spawnPrefabs.Add(StationaryProbeLauncherPrefab);
156156

157157
ConfigureNetworkManager();
@@ -207,11 +207,13 @@ private void InitPlayerName() =>
207207
}
208208
});
209209

210+
private static uint _assetId = 2; // 1 is the player
211+
210212
/// create a new network prefab from the network object prefab template.
211213
/// this works by calling Unload(false) and then reloading the AssetBundle,
212214
/// which makes LoadAsset give you a new resource.
213215
/// see https://docs.unity3d.com/Manual/AssetBundles-Native.html.
214-
private static GameObject MakeNewNetworkObject(uint assetId, string name, Type networkBehaviourType)
216+
public static GameObject MakeNewNetworkObject(string name, Type networkBehaviourType)
215217
{
216218
var bundle = QSBCore.Helper.Assets.LoadBundle("AssetBundles/qsb_empty");
217219

@@ -225,8 +227,11 @@ private static GameObject MakeNewNetworkObject(uint assetId, string name, Type n
225227
bundle.Unload(false);
226228

227229
template.name = name;
228-
template.AddComponent<NetworkIdentity>().SetValue("_assetId", assetId);
230+
template.AddComponent<NetworkIdentity>().SetValue("_assetId", _assetId);
229231
template.AddComponent(networkBehaviourType);
232+
233+
_assetId++;
234+
230235
return template;
231236
}
232237

0 commit comments

Comments
 (0)