triggers hold their owners

This commit is contained in:
JohnCorby 2022-01-12 19:12:37 -08:00
parent fafe7617c5
commit 2cbff8bb9a
6 changed files with 50 additions and 33 deletions

View File

@ -128,7 +128,7 @@ namespace QSB.Player.Messages
QSBWorldSync.GetWorldObjects<QSBTornado>().ForEach(tornado QSBWorldSync.GetWorldObjects<QSBTornado>().ForEach(tornado
=> tornado.SendMessage(new TornadoFormStateMessage(tornado.FormState) { To = From })); => tornado.SendMessage(new TornadoFormStateMessage(tornado.FormState) { To = From }));
QSBWorldSync.GetWorldObjects<QSBTrigger>().ForEach(trigger QSBWorldSync.GetWorldObjects<IQSBTrigger>().ForEach(trigger
=> trigger.SendMessage(new TriggerResyncMessage(trigger.Players))); => trigger.SendMessage(new TriggerResyncMessage(trigger.Players)));
} }

View File

@ -8,9 +8,20 @@ using UnityEngine;
namespace QSB.TriggerSync namespace QSB.TriggerSync
{ {
public abstract class QSBTrigger : WorldObject<OWTriggerVolume> public interface IQSBTrigger : IWorldObject
{ {
public readonly List<PlayerInfo> Players = new(); List<PlayerInfo> Players { get; }
void Enter(PlayerInfo player);
void Exit(PlayerInfo player);
}
public abstract class QSBTrigger<TO> : WorldObject<OWTriggerVolume>, IQSBTrigger
{
public TO TriggerOwner { get; init; }
public List<PlayerInfo> Players { get; } = new();
public override void Init() public override void Init()
{ {
@ -27,7 +38,7 @@ namespace QSB.TriggerSync
} }
else if (AttachedObject._trackedObjects.Contains(Locator.GetPlayerDetector())) else if (AttachedObject._trackedObjects.Contains(Locator.GetPlayerDetector()))
{ {
this.SendMessage(new TriggerMessage(true)); ((IQSBTrigger)this).SendMessage(new TriggerMessage(true));
} }
}); });
} }
@ -52,7 +63,7 @@ namespace QSB.TriggerSync
{ {
if (hitObj.CompareTag("PlayerDetector")) if (hitObj.CompareTag("PlayerDetector"))
{ {
this.SendMessage(new TriggerMessage(true)); ((IQSBTrigger)this).SendMessage(new TriggerMessage(true));
} }
} }
@ -60,7 +71,7 @@ namespace QSB.TriggerSync
{ {
if (hitObj.CompareTag("PlayerDetector")) if (hitObj.CompareTag("PlayerDetector"))
{ {
this.SendMessage(new TriggerMessage(false)); ((IQSBTrigger)this).SendMessage(new TriggerMessage(false));
} }
} }
@ -87,19 +98,19 @@ namespace QSB.TriggerSync
} }
} }
public class QSBCharacterTrigger : QSBTrigger public class QSBCharacterTrigger : QSBTrigger<CharacterAnimController>
{ {
} }
public class QSBSolanumTrigger : QSBTrigger public class QSBSolanumTrigger : QSBTrigger<NomaiConversationManager>
{ {
} }
public class QSBVesselCageTrigger : QSBTrigger public class QSBVesselCageTrigger : QSBTrigger<VesselWarpController>
{ {
} }
public class QSBMaskZoneTrigger : QSBTrigger public class QSBMaskZoneTrigger : QSBTrigger<MaskZoneController>
{ {
} }
} }

View File

@ -1,5 +1,4 @@
using QSB.WorldSync; using QSB.WorldSync;
using System.Linq;
namespace QSB.TriggerSync namespace QSB.TriggerSync
{ {
@ -9,26 +8,10 @@ namespace QSB.TriggerSync
protected override void RebuildWorldObjects(OWScene scene) protected override void RebuildWorldObjects(OWScene scene)
{ {
QSBWorldSync.Init<QSBCharacterTrigger, OWTriggerVolume>( QSBWorldSync.Init<QSBCharacterTrigger, CharacterAnimController>(x => x.playerTrackingZone);
QSBWorldSync.GetUnityObjects<CharacterAnimController>() QSBWorldSync.Init<QSBSolanumTrigger, NomaiConversationManager>(x => x._watchPlayerVolume);
.Where(x => x.playerTrackingZone) QSBWorldSync.Init<QSBVesselCageTrigger, VesselWarpController>(x => x._cageTrigger);
.Select(x => x.playerTrackingZone) QSBWorldSync.Init<QSBMaskZoneTrigger, MaskZoneController>(x => x._maskZoneTrigger);
);
QSBWorldSync.Init<QSBSolanumTrigger, OWTriggerVolume>(
QSBWorldSync.GetUnityObjects<NomaiConversationManager>()
.Select(x => x._watchPlayerVolume)
);
QSBWorldSync.Init<QSBVesselCageTrigger, OWTriggerVolume>(
QSBWorldSync.GetUnityObjects<VesselWarpController>()
.Select(x => x._cageTrigger)
);
QSBWorldSync.Init<QSBMaskZoneTrigger, OWTriggerVolume>(
QSBWorldSync.GetUnityObjects<MaskZoneController>()
.Select(x => x._maskZoneTrigger)
);
} }
} }
} }

View File

@ -3,7 +3,7 @@ using QSB.Player;
namespace QSB.TriggerSync namespace QSB.TriggerSync
{ {
public class TriggerMessage : QSBBoolWorldObjectMessage<QSBTrigger> public class TriggerMessage : QSBBoolWorldObjectMessage<IQSBTrigger>
{ {
public TriggerMessage(bool entered) => Value = entered; public TriggerMessage(bool entered) => Value = entered;

View File

@ -10,7 +10,7 @@ namespace QSB.TriggerSync
/// <summary> /// <summary>
/// always sent by host /// always sent by host
/// </summary> /// </summary>
public class TriggerResyncMessage : QSBWorldObjectMessage<QSBTrigger> public class TriggerResyncMessage : QSBWorldObjectMessage<IQSBTrigger>
{ {
private uint[] _playerIds; private uint[] _playerIds;

View File

@ -1,6 +1,7 @@
using OWML.Common; using OWML.Common;
using QSB.ConversationSync.Patches; using QSB.ConversationSync.Patches;
using QSB.LogSync; using QSB.LogSync;
using QSB.TriggerSync;
using QSB.Utility; using QSB.Utility;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -176,6 +177,28 @@ namespace QSB.WorldSync
} }
} }
public static void Init<TWorldObject, TUnityObject>(Func<TUnityObject, OWTriggerVolume> triggerSelector)
where TWorldObject : QSBTrigger<TUnityObject>, new()
where TUnityObject : MonoBehaviour
{
var list = GetUnityObjects<TUnityObject>()
.Select(x => (triggerSelector(x), x))
.Where(x => x.Item1);
foreach (var (item, owner) in list)
{
var obj = new TWorldObject
{
AttachedObject = item,
ObjectId = WorldObjects.Count,
TriggerOwner = owner
};
obj.Init();
WorldObjects.Add(obj);
WorldObjectsToUnityObjects.Add(item, obj);
}
}
public static void SetDialogueCondition(string name, bool state) public static void SetDialogueCondition(string name, bool state)
{ {
if (!QSBCore.IsHost) if (!QSBCore.IsHost)