Merge pull request #360 from misternebula/fix-travellers-playing

Fix travellers playing
This commit is contained in:
_nebula 2021-11-23 12:32:21 +00:00 committed by GitHub
commit b4ec0e34c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 160 additions and 5 deletions

View File

@ -0,0 +1,154 @@
using System;
using System.Linq;
using HarmonyLib;
using QSB.Patches;
using UnityEngine;
namespace QSB.Animation.NPC.Patches
{
[HarmonyPatch(typeof(TravelerController))]
public class TravelerControllerPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPrefix]
[HarmonyPatch(nameof(TravelerController.OnStartConversation))]
public static bool OnStartConversation(TravelerController __instance)
{
__instance._talking = true;
if (__instance is GabbroTravelerController gabbro)
{
if (gabbro._animator.enabled)
{
gabbro._animator.CrossFadeInFixedTime("Gabbro_Talking", 1.8f);
gabbro._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Talking", 1.8f);
}
Locator.GetTravelerAudioManager().StopTravelerAudio(gabbro.name);
}
else
{
if (__instance._animator != null && __instance._animator.enabled)
{
__instance._playingAnimID = __instance._animator.IsInTransition(0)
? __instance._animator.GetNextAnimatorStateInfo(0).fullPathHash
: __instance._animator.GetCurrentAnimatorStateInfo(0).fullPathHash;
__instance._animator.SetTrigger("Talking");
}
Locator.GetTravelerAudioManager().StopTravelerAudio(__instance.name);
if (__instance is ChertTravelerController chert)
{
chert._moodWeight = (float)chert._mood;
}
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(nameof(TravelerController.OnEndConversation))]
public static bool OnEndConversation(TravelerController __instance)
{
if (__instance is GabbroTravelerController gabbro)
{
if (gabbro._animator.enabled)
{
gabbro._animator.CrossFadeInFixedTime("Gabbro_Playing", gabbro._delayToRestartAudio, -1, -gabbro._delayToRestartAudio);
gabbro._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Playing", gabbro._delayToRestartAudio, -1, -gabbro._delayToRestartAudio);
}
Locator.GetTravelerAudioManager().PlayTravelerAudio(gabbro.name, gabbro._delayToRestartAudio);
if (DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_REMINDER") || DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION"))
{
var conditionState = DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION");
DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_REMINDER");
DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_ATTENTION");
GlobalMessenger<bool>.FireEvent("TriggerMapPromptReminder", conditionState);
}
}
else
{
if (__instance._animator != null && __instance._animator.enabled)
{
if (__instance._delayToRestartAudio > 0f)
{
__instance._animator.CrossFadeInFixedTime(__instance._playingAnimID, __instance._delayToRestartAudio, -1, -__instance._delayToRestartAudio);
}
else
{
__instance._animator.SetTrigger("Playing");
}
}
Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance.name, __instance._delayToRestartAudio);
}
__instance._talking = false;
return false;
}
}
internal static class TravelerAudioManagerExtensions
{
/// bad, but works great
private static SignalName TravelerToSignal(string name)
{
if (name.Contains("Esker"))
{
return SignalName.Traveler_Esker;
}
if (name.Contains("Chert"))
{
return SignalName.Traveler_Chert;
}
if (name.Contains("Riebeck"))
{
return SignalName.Traveler_Riebeck;
}
if (name.Contains("Gabbro"))
{
return SignalName.Traveler_Gabbro;
}
if (name.Contains("Feldspar"))
{
return SignalName.Traveler_Feldspar;
}
if (name.Contains("Nomai"))
{
return SignalName.Traveler_Nomai;
}
if (name.Contains("Prisoner"))
{
return SignalName.Traveler_Prisoner;
}
throw new ArgumentOutOfRangeException(nameof(name), name, null);
}
internal static void StopTravelerAudio(this TravelerAudioManager manager, string name)
{
var signalName = TravelerToSignal(name);
var audioSignal = manager._signals.First(x => x.GetName() == signalName);
audioSignal.GetOWAudioSource().FadeOut(0.5f);
}
internal static void PlayTravelerAudio(this TravelerAudioManager manager, string name, float audioDelay)
{
var signalName = TravelerToSignal(name);
var audioSignal = manager._signals.First(x => x.GetName() == signalName);
manager._playAfterDelay = false;
manager._playAudioTime = Time.time + audioDelay;
QSBCore.UnityEvents.RunWhen(() => Time.time >= manager._playAudioTime, () =>
{
if (!audioSignal.IsOnlyAudibleToScope() || audioSignal.GetOWAudioSource().isPlaying)
{
audioSignal.GetOWAudioSource().FadeIn(0.5f);
audioSignal.GetOWAudioSource().timeSamples = 0;
}
});
}
}
}

View File

@ -1,5 +1,4 @@
using OWML.Utils;
using QSB.Player;
using QSB.Player;
using System.Collections.Generic;
namespace QSB.Animation.NPC.WorldObjects
@ -32,9 +31,9 @@ namespace QSB.Animation.NPC.WorldObjects
}
public override CharacterDialogueTree GetDialogueTree()
=> AttachedObject.GetValue<CharacterDialogueTree>("_dialogueTree");
=> AttachedObject._dialogueTree;
public override bool InConversation()
=> AttachedObject.GetValue<bool>("_inConversation");
=> AttachedObject._inConversation;
}
}

View File

@ -76,7 +76,8 @@ namespace QSB.Patches
new LightSensorPatches(),
new AnglerPatches(),
new MeteorClientPatches(),
new MeteorServerPatches()
new MeteorServerPatches(),
new TravelerControllerPatches()
};
TypeToInstance = new Dictionary<QSBPatchTypes, Harmony>

View File

@ -53,6 +53,7 @@
<Compile Include="Animation\NPC\Events\NpcAnimationMessage.cs" />
<Compile Include="Animation\NPC\Patches\CharacterAnimationPatches.cs" />
<Compile Include="Animation\NPC\Patches\SolanumPatches.cs" />
<Compile Include="Animation\NPC\Patches\TravelerControllerPatches.cs" />
<Compile Include="Animation\NPC\WorldObjects\INpcAnimController.cs" />
<Compile Include="Animation\NPC\WorldObjects\NpcAnimController.cs" />
<Compile Include="Animation\NPC\WorldObjects\QSBCharacterAnimController.cs" />