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
=> tornado.SendMessage(new TornadoFormStateMessage(tornado.FormState) { To = From }));
QSBWorldSync.GetWorldObjects<QSBTrigger>().ForEach(trigger
QSBWorldSync.GetWorldObjects<IQSBTrigger>().ForEach(trigger
=> trigger.SendMessage(new TriggerResyncMessage(trigger.Players)));
}

View File

@ -8,9 +8,20 @@ using UnityEngine;
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()
{
@ -27,7 +38,7 @@ namespace QSB.TriggerSync
}
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"))
{
this.SendMessage(new TriggerMessage(true));
((IQSBTrigger)this).SendMessage(new TriggerMessage(true));
}
}
@ -60,7 +71,7 @@ namespace QSB.TriggerSync
{
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 System.Linq;
namespace QSB.TriggerSync
{
@ -9,26 +8,10 @@ namespace QSB.TriggerSync
protected override void RebuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBCharacterTrigger, OWTriggerVolume>(
QSBWorldSync.GetUnityObjects<CharacterAnimController>()
.Where(x => x.playerTrackingZone)
.Select(x => x.playerTrackingZone)
);
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)
);
QSBWorldSync.Init<QSBCharacterTrigger, CharacterAnimController>(x => x.playerTrackingZone);
QSBWorldSync.Init<QSBSolanumTrigger, NomaiConversationManager>(x => x._watchPlayerVolume);
QSBWorldSync.Init<QSBVesselCageTrigger, VesselWarpController>(x => x._cageTrigger);
QSBWorldSync.Init<QSBMaskZoneTrigger, MaskZoneController>(x => x._maskZoneTrigger);
}
}
}

View File

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

View File

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

View File

@ -1,6 +1,7 @@
using OWML.Common;
using QSB.ConversationSync.Patches;
using QSB.LogSync;
using QSB.TriggerSync;
using QSB.Utility;
using System;
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)
{
if (!QSBCore.IsHost)