This commit is contained in:
Mister_Nebula 2020-08-13 14:32:58 +01:00
parent 13b8632dcd
commit 5283982ff8
11 changed files with 138 additions and 26 deletions

View File

@ -1,4 +1,5 @@
using QSB.ElevatorSync;
using QSB.GeyserSync;
namespace QSB.Events
{
@ -24,6 +25,7 @@ namespace QSB.Events
new PlayerDeathEvent();
new PlayerStatesRequestEvent();
new ElevatorEvent();
new GeyserEvent();
Ready = true;
}

View File

@ -28,5 +28,6 @@
public static string QSBOnProbeAnchor = "QSBOnProbeAnchor";
public static string QSBOnProbeWarp = "QSBOnProbeWarp";
public static string QSBStartLift = "QSBStartLift";
public static string QSBGeyserState = "QSBGeyserState";
}
}

View File

@ -0,0 +1,44 @@
using QSB.Events;
using QSB.Messaging;
using QSB.Utility;
using QSB.WorldSync;
namespace QSB.GeyserSync
{
public class GeyserEvent : QSBEvent<GeyserMessage>
{
public override MessageType Type => MessageType.Geyser;
public static SyncObjects ObjectType => SyncObjects.Geysers;
public override void SetupListener()
{
GlobalMessenger<GeyserController, bool>.AddListener(EventNames.QSBGeyserState, (controller, state) => SendEvent(CreateMessage(controller, state)));
}
private GeyserMessage CreateMessage(GeyserController controller, bool state) => new GeyserMessage
{
SenderId = PlayerRegistry.LocalPlayer.NetId,
ObjectID = WorldRegistry.GetObjectID(ObjectType, controller),
ObjectType = ObjectType,
State = state
};
public override void OnReceiveRemote(GeyserMessage message)
{
if (!IsInUniverse || message.SenderId == PlayerRegistry.LocalPlayer.NetId)
{
return;
}
DebugLog.ToConsole($"Recieved geyser event for {message.ObjectID} to {message.State}");
if (message.State)
{
WorldRegistry.GeyserControllers[message.ObjectID].ActivateGeyser();
}
else
{
WorldRegistry.GeyserControllers[message.ObjectID].DeactivateGeyser();
}
}
}
}

View File

@ -0,0 +1,22 @@
using QSB.Messaging;
using UnityEngine.Networking;
namespace QSB.GeyserSync
{
public class GeyserMessage : WorldObjectMessage
{
public bool State { get; set; }
public override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
State = reader.ReadBoolean();
}
public override void Serialize(NetworkWriter writer)
{
base.Serialize(writer);
writer.Write(State);
}
}
}

View File

@ -18,6 +18,7 @@
PlayerSectorChange,
PlayerReady,
ProbeActiveChange,
Elevator
Elevator,
Geyser
}
}

View File

@ -0,0 +1,25 @@
using QSB.WorldSync;
using UnityEngine.Networking;
namespace QSB.Messaging
{
public class WorldObjectMessage : PlayerMessage
{
public SyncObjects ObjectType { get; set; }
public int ObjectID { get; set; }
public override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
ObjectType = (SyncObjects)reader.ReadInt32();
ObjectID = reader.ReadInt32();
}
public override void Serialize(NetworkWriter writer)
{
base.Serialize(writer);
writer.Write((int)ObjectType);
writer.Write(ObjectID);
}
}
}

View File

@ -2,9 +2,11 @@
using OWML.ModHelper;
using QSB.ElevatorSync;
using QSB.Events;
using QSB.GeyserSync;
using QSB.Utility;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
namespace QSB
{
@ -33,17 +35,14 @@ namespace QSB
GlobalMessenger.AddListener(EventNames.RestartTimeLoop, OnLoopStart);
GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp);
SceneManager.sceneLoaded += OnSceneLoad;
}
private void OnWakeUp()
{
WokenUp = true;
GlobalMessenger.FireEvent(EventNames.QSBPlayerStatesRequest);
foreach (var geyser in GameObject.FindObjectsOfType<GeyserController>())
{
DebugLog.ToConsole(geyser.name + " : " + geyser.GetInstanceID());
}
}
private void OnLoopStart()
@ -51,6 +50,11 @@ namespace QSB
WokenUp = false;
}
private void OnSceneLoad(Scene scene, LoadSceneMode mode)
{
WorldRegistry.GenerateComponentList();
}
public override void Configure(IModConfig config)
{
DefaultServerIP = config.GetSettingsValue<string>("defaultServerIP");

View File

@ -134,7 +134,8 @@
<Compile Include="Events\PlayerStatesRequestEvent.cs" />
<Compile Include="Events\PlayerSuitEvent.cs" />
<Compile Include="Events\ServerTimeEvent.cs" />
<Compile Include="GeyserSync\GeyserPatches.cs" />
<Compile Include="GeyserSync\GeyserEvent.cs" />
<Compile Include="GeyserSync\GeyserMessage.cs" />
<Compile Include="Messaging\AnimTriggerMessage.cs" />
<Compile Include="Messaging\PlayerDeathMessage.cs" />
<Compile Include="Messaging\PlayerLeaveMessage.cs" />
@ -144,6 +145,7 @@
<Compile Include="Events\QSBEvent.cs" />
<Compile Include="Messaging\PlayerJoinMessage.cs" />
<Compile Include="Messaging\ToggleMessage.cs" />
<Compile Include="Messaging\WorldObjectMessage.cs" />
<Compile Include="Tools\QSBFlashlight.cs" />
<Compile Include="Tools\QSBProbe.cs" />
<Compile Include="Tools\QSBTool.cs" />
@ -183,6 +185,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utility\UnityHelper.cs" />
<Compile Include="WorldRegistry.cs" />
<Compile Include="WorldSync\SyncObjects.cs" />
</ItemGroup>
<ItemGroup>
<None Include="default-config.json" />

View File

@ -121,9 +121,10 @@ namespace QSB
gameObject.AddComponent<RespawnOnDeath>();
gameObject.AddComponent<PreventShipDestruction>();
if (!Network.isServer)
if (NetworkClient.active && !NetworkServer.active)
{
gameObject.AddComponent<Events.PlayerState>();
QSB.Helper.HarmonyHelper.EmptyMethod<GeyserController>("Update");
}
_canEditName = false;

View File

@ -1,31 +1,39 @@
using System;
using QSB.Events;
using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
namespace QSB
{
public static class WorldRegistry
{
private static List<QSBWorldComponent> ComponentList = new List<QSBWorldComponent>();
public static List<GeyserController> GeyserControllers = new List<GeyserController>();
public static Dictionary<int, object> GetInstanceIds(Type typeToFind)
public static void GenerateComponentList()
{
var components = GameObject.FindObjectsOfType(typeToFind);
var dict = new Dictionary<int, object>();
foreach (var component in components)
GeyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>().ToList();
foreach (var component in GeyserControllers)
{
dict.Add(component.GetInstanceID(), component);
if (NetworkServer.active)
{
component.OnGeyserActivateEvent += () => GlobalMessenger<GeyserController, bool>.FireEvent(EventNames.QSBGeyserState, component, true);
component.OnGeyserDeactivateEvent += () => GlobalMessenger<GeyserController, bool>.FireEvent(EventNames.QSBGeyserState, component, false);
}
}
return dict;
}
public static int GetObjectID(SyncObjects type, object component)
{
switch (type)
{
case SyncObjects.Geysers:
return GeyserControllers.FindIndex(x => x == component);
}
return 0;
}
}
class QSBWorldComponent
{
public int InstanceID;
public string Hierarchy;
public object Instance;
}
}

View File

@ -3,9 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace QSB.GeyserSync
namespace QSB.WorldSync
{
class GeyserPatches
public enum SyncObjects
{
Geysers
}
}