mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-13 12:40:50 +00:00
added it
This commit is contained in:
parent
13b8632dcd
commit
5283982ff8
@ -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;
|
||||
}
|
||||
|
@ -28,5 +28,6 @@
|
||||
public static string QSBOnProbeAnchor = "QSBOnProbeAnchor";
|
||||
public static string QSBOnProbeWarp = "QSBOnProbeWarp";
|
||||
public static string QSBStartLift = "QSBStartLift";
|
||||
public static string QSBGeyserState = "QSBGeyserState";
|
||||
}
|
||||
}
|
||||
|
44
QSB/GeyserSync/GeyserEvent.cs
Normal file
44
QSB/GeyserSync/GeyserEvent.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
22
QSB/GeyserSync/GeyserMessage.cs
Normal file
22
QSB/GeyserSync/GeyserMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -18,6 +18,7 @@
|
||||
PlayerSectorChange,
|
||||
PlayerReady,
|
||||
ProbeActiveChange,
|
||||
Elevator
|
||||
Elevator,
|
||||
Geyser
|
||||
}
|
||||
}
|
||||
|
25
QSB/Messaging/WorldObjectMessage.cs
Normal file
25
QSB/Messaging/WorldObjectMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
14
QSB/QSB.cs
14
QSB/QSB.cs
@ -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");
|
||||
|
@ -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" />
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user