enter/exit dream world message using global messenger

This commit is contained in:
JohnCorby 2022-03-25 18:54:07 -07:00
parent 1e1d565be4
commit 81fad82948
4 changed files with 53 additions and 36 deletions

View File

@ -1,23 +1,35 @@
using QSB.ItemSync.WorldObjects.Items;
using JetBrains.Annotations;
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Player;
using QSB.Player.TransformSync;
using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QSB.EchoesOfTheEye.DreamWorld.Messages;
internal class EnterDreamWorldMessage : QSBMessage<int>
[UsedImplicitly]
internal class EnterDreamWorldMessage : QSBWorldObjectMessage<QSBDreamLanternItem>
{
public EnterDreamWorldMessage(int lanternId) : base(lanternId) { }
static EnterDreamWorldMessage()
{
GlobalMessenger.AddListener(OWEvents.EnterDreamWorld, () =>
{
if (!PlayerTransformSync.LocalInstance)
{
return;
}
Locator.GetDreamWorldController()
.GetPlayerLantern()
.GetWorldObject<QSBDreamLanternItem>()
.SendMessage(new EnterDreamWorldMessage());
});
}
public override void OnReceiveRemote()
{
var player = QSBPlayerManager.GetPlayer(From);
player.InDreamWorld = true;
player.AssignedSimulationLantern = QSBWorldSync.GetWorldObject<QSBDreamLanternItem>(Data);
player.AssignedSimulationLantern = WorldObject;
}
}

View File

@ -0,0 +1,30 @@
using JetBrains.Annotations;
using QSB.Messaging;
using QSB.Player;
using QSB.Player.TransformSync;
namespace QSB.EchoesOfTheEye.DreamWorld.Messages;
[UsedImplicitly]
internal class ExitDreamWorldMessage : QSBMessage
{
static ExitDreamWorldMessage()
{
GlobalMessenger.AddListener(OWEvents.ExitDreamWorld, () =>
{
if (!PlayerTransformSync.LocalInstance)
{
return;
}
new ExitDreamWorldMessage().Send();
});
}
public override void OnReceiveRemote()
{
var player = QSBPlayerManager.GetPlayer(From);
player.InDreamWorld = false;
player.AssignedSimulationLantern = null;
}
}

View File

@ -1,27 +0,0 @@
using HarmonyLib;
using QSB.EchoesOfTheEye.DreamWorld.Messages;
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Patches;
using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QSB.EchoesOfTheEye.DreamWorld.Patches;
internal class DreamWorldPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPostfix]
[HarmonyPatch(typeof(DreamWorldController), nameof(DreamWorldController.SpawnInDreamWorld))]
public static void EnterDreamWorld()
{
var currentLantern = (DreamLanternItem)Locator.GetToolModeSwapper().GetItemCarryTool().GetHeldItem();
var currentQSBLantern = currentLantern.GetWorldObject<QSBDreamLanternItem>();
new EnterDreamWorldMessage(currentQSBLantern.ObjectId).Send();
}
}

View File

@ -29,4 +29,6 @@ public static class OWEvents
public const string ExitShip = nameof(ExitShip);
public const string EyeStateChanged = nameof(EyeStateChanged);
public const string FlickerOffAndOn = nameof(FlickerOffAndOn);
public const string EnterDreamWorld = nameof(EnterDreamWorld);
public const string ExitDreamWorld = nameof(ExitDreamWorld);
}