Skip to content

Commit

Permalink
Merge pull request #559 from misternebula/dev
Browse files Browse the repository at this point in the history
0.21.1
  • Loading branch information
misternebula authored Aug 20, 2022
2 parents b1768e7 + 3a33795 commit 31b11a4
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 288 deletions.
1 change: 1 addition & 0 deletions QSB/ConversationSync/Patches/ConversationPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public static bool CharacterDialogueTree_InputDialogueOption(CharacterDialogueTr
}

var selectedOption = __instance._currentDialogueBox.OptionFromUIIndex(optionIndex);
// BUG: uses translated value instead of key
ConversationManager.Instance.SendPlayerOption(selectedOption.Text);
return true;
}
Expand Down
166 changes: 139 additions & 27 deletions QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ internal class LightSensorPatches : QSBPatch
[HarmonyPatch(nameof(SingleLightSensor.OnSectorOccupantsUpdated))]
private static bool OnSectorOccupantsUpdated(SingleLightSensor __instance)
{
if (LightSensorManager.IsPlayerLightSensor(__instance))
{
return true;
}
if (!QSBWorldSync.AllObjectsReady)
{
return true;
Expand Down Expand Up @@ -106,16 +102,15 @@ private static bool ManagedFixedUpdate(SingleLightSensor __instance)
__instance._fixedUpdateFrameDelayCount--;
return false;
}
var illuminated = __instance._illuminated;
var locallyIlluminated = qsbLightSensor._locallyIlluminated;
if (__instance._illuminatingDreamLanternList != null)
{
_illuminatingDreamLanternList.Clear();
_illuminatingDreamLanternList.AddRange(__instance._illuminatingDreamLanternList);
}
__instance.UpdateIllumination();
if (qsbLightSensor.Owner == QSBPlayerManager.LocalPlayerId)
{
var illuminated = __instance._illuminated;
if (__instance._illuminatingDreamLanternList != null)
{
_illuminatingDreamLanternList.Clear();
_illuminatingDreamLanternList.AddRange(__instance._illuminatingDreamLanternList);
}
__instance.UpdateIllumination();
if (!illuminated && __instance._illuminated)
{
__instance.OnDetectLight.Invoke();
Expand All @@ -132,6 +127,9 @@ private static bool ManagedFixedUpdate(SingleLightSensor __instance)
qsbLightSensor.SendMessage(new IlluminatingLanternsMessage(__instance._illuminatingDreamLanternList));
}
}

var locallyIlluminated = qsbLightSensor._locallyIlluminated;
UpdateLocalIllumination(__instance);
if (!locallyIlluminated && qsbLightSensor._locallyIlluminated)
{
qsbLightSensor.OnDetectLocalLight?.Invoke();
Expand All @@ -143,22 +141,56 @@ private static bool ManagedFixedUpdate(SingleLightSensor __instance)
return false;
}


#region player light sensor

[HarmonyPrefix]
[HarmonyPatch(nameof(SingleLightSensor.UpdateIllumination))]
private static bool UpdateIllumination(SingleLightSensor __instance)
[HarmonyPatch(nameof(SingleLightSensor.ManagedFixedUpdate))]
private static bool Player_ManagedFixedUpdate(SingleLightSensor __instance)
{
if (LightSensorManager.IsPlayerLightSensor(__instance))
if (!LightSensorManager.IsPlayerLightSensor(__instance))
{
return true;
}
if (!QSBWorldSync.AllObjectsReady)

if (__instance._fixedUpdateFrameDelayCount > 0)
{
return true;
__instance._fixedUpdateFrameDelayCount--;
return false;
}
var qsbLightSensor = __instance.GetWorldObject<QSBLightSensor>();
var illuminated = __instance._illuminated;
if (__instance._illuminatingDreamLanternList != null)
{
_illuminatingDreamLanternList.Clear();
_illuminatingDreamLanternList.AddRange(__instance._illuminatingDreamLanternList);
}
__instance.UpdateIllumination();
if (!illuminated && __instance._illuminated)
{
__instance.OnDetectLight.Invoke();
new PlayerSetIlluminatedMessage(QSBPlayerManager.LocalPlayerId, true).Send();
}
else if (illuminated && !__instance._illuminated)
{
__instance.OnDetectDarkness.Invoke();
new PlayerSetIlluminatedMessage(QSBPlayerManager.LocalPlayerId, false).Send();
}
if (__instance._illuminatingDreamLanternList != null &&
!__instance._illuminatingDreamLanternList.SequenceEqual(_illuminatingDreamLanternList))
{
new PlayerIlluminatingLanternsMessage(QSBPlayerManager.LocalPlayerId, __instance._illuminatingDreamLanternList).Send();
}
return false;
}

#endregion


[HarmonyPrefix]
[HarmonyPatch(nameof(SingleLightSensor.UpdateIllumination))]
private static bool UpdateIllumination(SingleLightSensor __instance)
{
__instance._illuminated = false;
qsbLightSensor._locallyIlluminated = false;
__instance._illuminatingDreamLanternList?.Clear();
if (__instance._lightSources == null || __instance._lightSources.Count == 0)
{
Expand Down Expand Up @@ -209,7 +241,6 @@ private static bool UpdateIllumination(SingleLightSensor __instance)
!__instance.CheckOcclusion(position, sensorWorldPos, sensorWorldDir))
{
__instance._illuminated = true;
qsbLightSensor._locallyIlluminated = true;
}
}
break;
Expand Down Expand Up @@ -238,7 +269,6 @@ private static bool UpdateIllumination(SingleLightSensor __instance)
!__instance.CheckOcclusion(probe.GetLightSourcePosition(), sensorWorldPos, sensorWorldDir))
{
__instance._illuminated = true;
qsbLightSensor._locallyIlluminated = true;
}
}
break;
Expand All @@ -253,9 +283,6 @@ private static bool UpdateIllumination(SingleLightSensor __instance)
{
__instance._illuminatingDreamLanternList.Add(dreamLanternController);
__instance._illuminated = true;

var dreamLanternItem = dreamLanternController.GetComponent<DreamLanternItem>();
qsbLightSensor._locallyIlluminated |= QSBPlayerManager.LocalPlayer.HeldItem?.AttachedObject == dreamLanternItem;
}
break;
}
Expand All @@ -269,9 +296,6 @@ private static bool UpdateIllumination(SingleLightSensor __instance)
!__instance.CheckOcclusion(owlight.transform.position, sensorWorldPos, sensorWorldDir, occludableLight))
{
__instance._illuminated = true;

var simpleLanternItem = (SimpleLanternItem)lightSource;
qsbLightSensor._locallyIlluminated |= QSBPlayerManager.LocalPlayer.HeldItem?.AttachedObject == simpleLanternItem;
}
}
break;
Expand All @@ -283,4 +307,92 @@ private static bool UpdateIllumination(SingleLightSensor __instance)
}
return false;
}

private static void UpdateLocalIllumination(SingleLightSensor __instance)
{
if (!QSBWorldSync.AllObjectsReady)
{
return;
}
var qsbLightSensor = __instance.GetWorldObject<QSBLightSensor>();

qsbLightSensor._locallyIlluminated = false;
if (__instance._lightSources == null || __instance._lightSources.Count == 0)
{
return;
}
var sensorWorldPos = __instance.transform.TransformPoint(__instance._localSensorOffset);
var sensorWorldDir = Vector3.zero;
if (__instance._directionalSensor)
{
sensorWorldDir = __instance.transform.TransformDirection(__instance._localDirection).normalized;
}
foreach (var lightSource in __instance._lightSources)
{
if ((__instance._lightSourceMask & lightSource.GetLightSourceType()) == lightSource.GetLightSourceType() &&
lightSource.CheckIlluminationAtPoint(sensorWorldPos, __instance._sensorRadius, __instance._maxDistance))
{
switch (lightSource.GetLightSourceType())
{
case LightSourceType.FLASHLIGHT:
{
if (lightSource is not QSBFlashlight)
{
var position = Locator.GetPlayerCamera().transform.position;
var vector3 = __instance.transform.position - position;
if (Vector3.Angle(Locator.GetPlayerCamera().transform.forward, vector3) <= __instance._maxSpotHalfAngle &&
!__instance.CheckOcclusion(position, sensorWorldPos, sensorWorldDir))
{
qsbLightSensor._locallyIlluminated = true;
}
}
break;
}
case LightSourceType.PROBE:
{
if (lightSource is not QSBProbe)
{
var probe = Locator.GetProbe();
if (probe != null &&
probe.IsLaunched() &&
!probe.IsRetrieving() &&
probe.CheckIlluminationAtPoint(sensorWorldPos, __instance._sensorRadius, __instance._maxDistance) &&
!__instance.CheckOcclusion(probe.GetLightSourcePosition(), sensorWorldPos, sensorWorldDir))
{
qsbLightSensor._locallyIlluminated = true;
}
}
break;
}
case LightSourceType.DREAM_LANTERN:
{
var dreamLanternController = lightSource as DreamLanternController;
if (dreamLanternController.IsLit() &&
dreamLanternController.IsFocused(__instance._lanternFocusThreshold) &&
dreamLanternController.CheckIlluminationAtPoint(sensorWorldPos, __instance._sensorRadius, __instance._maxDistance) &&
!__instance.CheckOcclusion(dreamLanternController.GetLightPosition(), sensorWorldPos, sensorWorldDir))
{
var dreamLanternItem = dreamLanternController.GetComponent<DreamLanternItem>();
qsbLightSensor._locallyIlluminated |= QSBPlayerManager.LocalPlayer.HeldItem?.AttachedObject == dreamLanternItem;
}
break;
}
case LightSourceType.SIMPLE_LANTERN:
foreach (var owlight in lightSource.GetLights())
{
var occludableLight = owlight.GetLight().shadows != LightShadows.None &&
owlight.GetLight().shadowStrength > 0.5f;
var maxDistance = Mathf.Min(__instance._maxSimpleLanternDistance, __instance._maxDistance);
if (owlight.CheckIlluminationAtPoint(sensorWorldPos, __instance._sensorRadius, maxDistance) &&
!__instance.CheckOcclusion(owlight.transform.position, sensorWorldPos, sensorWorldDir, occludableLight))
{
var simpleLanternItem = (SimpleLanternItem)lightSource;
qsbLightSensor._locallyIlluminated |= QSBPlayerManager.LocalPlayer.HeldItem?.AttachedObject == simpleLanternItem;
}
}
break;
}
}
}
}
}
Loading

0 comments on commit 31b11a4

Please sign in to comment.