using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCCutscene.Patches;
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Animations.Rigging;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("LCCutscene")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LCCutscene")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ab36879c-13c9-4bbe-ad1f-d5d9f31d2b8b")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
public enum EndPosition
{
Camera,
Custom
}
public enum SceneType
{
Cutscene,
QuickScene
}
public enum Transition
{
Fade,
FadeIn,
FadeOut,
Instant
}
namespace LCCutscene
{
public class Content
{
public static AssetBundle MainAssets;
public static void TryLoadAssets()
{
if ((Object)(object)MainAssets == (Object)null)
{
MainAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "cutsceneasset"));
Plugin.mls.LogInfo((object)"Loaded asset bundle!");
}
}
}
public class Cutscene
{
public Transform CameraTransform { get; private set; }
public float Time { get; private set; }
public Transition TransitionIn { get; set; } = Transition.Fade;
public Transition TransitionOut { get; set; } = Transition.Fade;
public float TransitionInSpeed { get; set; } = 1f;
public float TransitionOutSpeed { get; set; } = 1f;
public bool AllowPlayerDeath { get; set; } = false;
public bool AllowPlayerMovement { get; set; } = false;
public Cutscene(Transform cameraTransform, float time)
{
CameraTransform = cameraTransform;
Time = time;
}
}
public class CutsceneManager : MonoBehaviour
{
[CompilerGenerated]
private sealed class <DoCutscene>d__54 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Cutscene cutscene;
public CutsceneManager <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <DoCutscene>d__54(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Expected O, but got Unknown
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Expected O, but got Unknown
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02ae: Expected O, but got Unknown
//IL_0226: Unknown result type (might be due to invalid IL or missing references)
//IL_0230: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>4__this.currentCutscene = cutscene;
<>4__this.currentSceneTime = 0f;
<>4__this.sceneType = SceneType.Cutscene;
if (cutscene.TransitionIn != Transition.Instant)
{
<>4__this.inTransition = true;
CutsceneManager.OnSceneTransitionIn?.Invoke(<>4__this, EventArgs.Empty);
}
if (cutscene.TransitionIn == Transition.Fade || cutscene.TransitionIn == Transition.FadeIn)
{
<>2__current = (object)new WaitForSeconds(1f / cutscene.TransitionInSpeed);
<>1__state = 1;
return true;
}
goto IL_0104;
case 1:
<>1__state = -1;
goto IL_0104;
case 2:
<>1__state = -1;
<>4__this.OutTransition = true;
CutsceneManager.OnSceneTransitionOut?.Invoke(<>4__this, EventArgs.Empty);
<>2__current = (object)new WaitForSeconds(1f / cutscene.TransitionOutSpeed);
<>1__state = 3;
return true;
case 3:
<>1__state = -1;
break;
case 4:
{
<>1__state = -1;
break;
}
IL_0104:
<>4__this.cutscenePlaying = true;
CutsceneManager.OnSceneStart?.Invoke(<>4__this, EventArgs.Empty);
StartOfRound.Instance.allowLocalPlayerDeath = cutscene.AllowPlayerDeath;
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).Disable();
}
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false).Disable();
}
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Look", false).Disable();
}
if (cutscene.TransitionOut != Transition.Instant && cutscene.TransitionOut != Transition.FadeOut)
{
<>2__current = (object)new WaitForSeconds(cutscene.Time - 1f / cutscene.TransitionOutSpeed);
<>1__state = 2;
return true;
}
<>2__current = (object)new WaitForSeconds(cutscene.Time);
<>1__state = 4;
return true;
}
if (((Behaviour)<>4__this.CutsceneCamera).enabled)
{
((Behaviour)<>4__this.CutsceneCamera).enabled = false;
}
if (!((Behaviour)StartOfRound.Instance.localPlayerController.gameplayCamera).enabled)
{
((Behaviour)StartOfRound.Instance.localPlayerController.gameplayCamera).enabled = true;
}
<>4__this.cutscenePlaying = false;
<>4__this.currentSceneTime = 0f;
<>4__this.sceneType = null;
<>4__this.timeSinceStart = 0f;
CutsceneManager.OnSceneEnd?.Invoke(<>4__this, EventArgs.Empty);
if (!StartOfRound.Instance.allowLocalPlayerDeath)
{
StartOfRound.Instance.allowLocalPlayerDeath = true;
}
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).Enable();
}
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false).Enable();
}
if (!cutscene.AllowPlayerMovement)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Look", false).Enable();
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <DoCutscene>d__55 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public QuickScene quickScene;
public CutsceneManager <>4__this;
private PlayerControllerB <player>5__1;
private ConstraintSource <source>5__2;
private float <sceneStartTime>5__3;
private PlayerPose <>s__4;
private PlayerPose <>s__5;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <DoCutscene>d__55(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
<player>5__1 = null;
<source>5__2 = default(ConstraintSource);
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_0348: Unknown result type (might be due to invalid IL or missing references)
//IL_0352: Expected O, but got Unknown
//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
//IL_02c2: Expected O, but got Unknown
//IL_04b7: Unknown result type (might be due to invalid IL or missing references)
//IL_04bc: Unknown result type (might be due to invalid IL or missing references)
//IL_04bf: Unknown result type (might be due to invalid IL or missing references)
//IL_04e0: Unknown result type (might be due to invalid IL or missing references)
//IL_057e: Unknown result type (might be due to invalid IL or missing references)
//IL_0553: Unknown result type (might be due to invalid IL or missing references)
Quaternion rotation;
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
<>4__this.currentQuickScene = quickScene;
<>4__this.currentSceneTime = 0f;
<>4__this.sceneType = SceneType.QuickScene;
<player>5__1 = StartOfRound.Instance.localPlayerController;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).Disable();
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false).Disable();
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Look", false).Disable();
<player>5__1.disableLookInput = true;
<source>5__2 = default(ConstraintSource);
((ConstraintSource)(ref <source>5__2)).weight = 1f;
((ConstraintSource)(ref <source>5__2)).sourceTransform = quickScene.TargetPosition;
if (quickScene.SnapPlayerToPositions)
{
<>4__this.playerConstraint.AddSource(<source>5__2);
<>4__this.playerConstraint.locked = true;
ParentConstraint playerConstraint2 = <>4__this.playerConstraint;
rotation = ((Component)<player>5__1).gameObject.transform.rotation;
playerConstraint2.rotationAtRest = ((Quaternion)(ref rotation)).eulerAngles;
<>4__this.playerConstraint.translationAtRest = ((Component)<player>5__1).gameObject.transform.localPosition;
<>4__this.playerConstraint.constraintActive = true;
}
<>4__this.inTransition = true;
if (quickScene.POV == POVType.Full)
{
<>4__this.SetPlayerInFPS(state: true);
}
<>4__this.timeSinceStart = Time.realtimeSinceStartup;
Plugin.mls.LogDebug((object)"Transitioning the player...");
PlayerPose startingPose = quickScene.StartingPose;
<>s__4 = startingPose;
switch (<>s__4)
{
case PlayerPose.Standing:
if (<player>5__1.isCrouching)
{
<player>5__1.Crouch(!<player>5__1.isCrouching);
}
break;
case PlayerPose.Crouched:
if (!<player>5__1.isCrouching)
{
<player>5__1.Crouch(!<player>5__1.isCrouching);
}
break;
}
CutsceneManager.OnSceneTransitionIn?.Invoke(<>4__this, EventArgs.Empty);
<>2__current = (object)new WaitUntil((Func<bool>)(() => !<>4__this.inTransition));
<>1__state = 1;
return true;
}
case 1:
<>1__state = -1;
Plugin.mls.LogDebug((object)"Starting Quickscene...");
<sceneStartTime>5__3 = Time.realtimeSinceStartup;
<>4__this.cutscenePlaying = true;
CutsceneManager.OnSceneStart?.Invoke(<>4__this, EventArgs.Empty);
if (quickScene.POV == POVType.Full)
{
<>4__this.StartQuickSceneAnimation(quickScene);
}
<>2__current = (object)new WaitForSeconds(quickScene.Time);
<>1__state = 2;
return true;
case 2:
{
<>1__state = -1;
if (quickScene.POV == POVType.Full)
{
<>4__this.StopQuickSceneAnimation(quickScene);
}
if (quickScene.POV == POVType.Full)
{
<>4__this.SetPlayerInFPS(state: false);
}
<>4__this.cutscenePlaying = false;
<>4__this.currentSceneTime = 0f;
<>4__this.sceneType = null;
<>4__this.timeSinceStart = 0f;
CutsceneManager.OnSceneEnd?.Invoke(<>4__this, EventArgs.Empty);
PlayerPose endingPose = quickScene.EndingPose;
<>s__5 = endingPose;
switch (<>s__5)
{
case PlayerPose.Standing:
if (<player>5__1.isCrouching)
{
<player>5__1.Crouch(!<player>5__1.isCrouching);
}
break;
case PlayerPose.Crouched:
if (!<player>5__1.isCrouching)
{
<player>5__1.Crouch(!<player>5__1.isCrouching);
}
break;
}
if (quickScene.SnapPlayerToPositions)
{
ParentConstraint playerConstraint = <>4__this.playerConstraint;
rotation = ((Component)<player>5__1).transform.rotation;
playerConstraint.rotationAtRest = ((Quaternion)(ref rotation)).eulerAngles;
<>4__this.playerConstraint.translationAtRest = ((Component)<player>5__1).transform.position;
<>4__this.playerConstraint.weight = 0f;
<>4__this.playerConstraint.constraintActive = false;
<>4__this.playerConstraint.RemoveSource(0);
}
if ((Object)(object)quickScene.TargetEndPosition != (Object)null)
{
((Component)<player>5__1).transform.position = quickScene.TargetEndPosition.position;
}
((Component)<player>5__1).transform.rotation = Quaternion.Euler(0f, quickScene.TargetEndRotation, 0f);
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).Enable();
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Jump", false).Enable();
IngamePlayerSettings.Instance.playerInput.actions.FindAction("Look", false).Enable();
<player>5__1.disableLookInput = false;
return false;
}
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private Volume fadeVolume;
private bool inTransition;
private bool OutTransition;
private float transitionTime = 0f;
private SceneType? sceneType = null;
private Cutscene currentCutscene;
private QuickScene currentQuickScene;
private float currentSceneTime = 0f;
private bool initialized = false;
private float timeSinceStart = 0f;
private PlayerControllerB player;
private Animation playerAnim;
private RigBuilder rigs;
private List<ParentConstraint> constraints = new List<ParentConstraint>();
private ParentConstraint playerConstraint;
private bool localPlayerSet = false;
private bool inFPS = false;
public static CutsceneManager Instance { get; private set; }
public Camera CutsceneCamera { get; private set; }
public bool cutscenePlaying { get; private set; } = false;
public static event EventHandler OnSceneStart;
public static event EventHandler OnSceneEnd;
public static event EventHandler OnSceneTransitionIn;
public static event EventHandler OnSceneTransitionOut;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
else
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
private void Start()
{
Init();
}
private void Init()
{
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
if (!initialized)
{
if (!Object.op_Implicit((Object)(object)fadeVolume))
{
GameObject val = new GameObject("Fade Volume");
fadeVolume = val.AddComponent<Volume>();
fadeVolume.profile = Content.MainAssets.LoadAsset<VolumeProfile>("Assets/Cutscene/fade.asset");
fadeVolume.isGlobal = true;
fadeVolume.weight = 0f;
fadeVolume.sharedProfile = Content.MainAssets.LoadAsset<VolumeProfile>("Assets/Cutscene/fade.asset");
}
CutsceneCamera = new GameObject("Cutscene_Camera").AddComponent<Camera>();
((Component)CutsceneCamera).gameObject.tag = "MainCamera";
CutsceneCamera.cullingMask = 557520895;
((Behaviour)CutsceneCamera).enabled = false;
initialized = true;
Plugin.mls.LogInfo((object)"Cutscene Manager initialized!");
}
else
{
Plugin.mls.LogWarning((object)"Tried to initialize Cutscene Manager when already initialized!");
}
}
private void SetLocalPlayer()
{
playerAnim = ((Component)((Component)player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>();
playerConstraint = ((Component)player).gameObject.GetComponent<ParentConstraint>();
rigs = ((Component)((Component)player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<RigBuilder>();
constraints.Add(((Component)player.gameplayCamera).gameObject.GetComponent<ParentConstraint>());
constraints.Add(((Component)((Component)player).transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly")).gameObject.GetComponent<ParentConstraint>());
localPlayerSet = true;
}
private void Update()
{
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_07a9: Unknown result type (might be due to invalid IL or missing references)
//IL_07ca: Unknown result type (might be due to invalid IL or missing references)
//IL_0829: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)player == (Object)null)
{
player = StartOfRound.Instance.localPlayerController;
}
else if (!localPlayerSet)
{
SetLocalPlayer();
}
if ((Object)(object)player != (Object)null && localPlayerSet)
{
foreach (ParentConstraint constraint in constraints)
{
constraint.weight = Mathf.Lerp(constraint.weight, inFPS ? 1f : 0f, (currentQuickScene == null) ? 0f : (currentQuickScene.SnapSpeed * Time.deltaTime));
}
constraints[0].constraintActive = constraints[0].weight > 0.05f;
}
if (inTransition)
{
if (sceneType.GetValueOrDefault() == SceneType.QuickScene && currentQuickScene != null)
{
playerConstraint.weight = Mathf.Lerp(playerConstraint.weight, 1f, currentQuickScene.SnapSpeed * Time.deltaTime);
((Component)player).transform.rotation = Quaternion.Lerp(((Component)player).transform.rotation, Quaternion.Euler(0f, currentQuickScene.TargetRotation, 0f), currentQuickScene.SnapSpeed * Time.deltaTime);
if (playerConstraint.weight > 0.95f)
{
inTransition = false;
playerConstraint.weight = 1f;
}
if (Time.realtimeSinceStartup - timeSinceStart >= 5f)
{
inTransition = false;
}
}
else if (sceneType == SceneType.Cutscene && currentCutscene != null)
{
if (currentCutscene.TransitionIn == Transition.Fade)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(0f, 1f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionInSpeed;
}
else if (transitionTime >= 1f && transitionTime < 2f)
{
fadeVolume.weight = Mathf.Lerp(1f, 0f, transitionTime - 1f);
transitionTime += Time.deltaTime * currentCutscene.TransitionInSpeed;
}
else if (transitionTime >= 2f && !OutTransition)
{
inTransition = false;
transitionTime = 0f;
}
}
else if (currentCutscene.TransitionIn == Transition.FadeIn)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(0f, 1f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionInSpeed;
}
else if (transitionTime >= 1f)
{
inTransition = false;
transitionTime = 0f;
}
}
else if (currentCutscene.TransitionIn == Transition.FadeOut)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(1f, 0f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionInSpeed;
}
else if (transitionTime >= 1f)
{
inTransition = false;
transitionTime = 0f;
}
}
}
}
else if (OutTransition)
{
if (currentCutscene.TransitionOut == Transition.Fade)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(0f, 1f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionOutSpeed;
}
else if (transitionTime >= 1f && transitionTime < 2f)
{
fadeVolume.weight = Mathf.Lerp(1f, 0f, transitionTime - 1f);
transitionTime += Time.deltaTime * currentCutscene.TransitionOutSpeed;
}
else if (transitionTime >= 2f)
{
OutTransition = false;
transitionTime = 0f;
}
}
else if (currentCutscene.TransitionOut == Transition.FadeIn)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(0f, 1f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionOutSpeed;
}
else if (transitionTime >= 1f)
{
OutTransition = false;
transitionTime = 0f;
}
}
else if (currentCutscene.TransitionOut == Transition.FadeOut)
{
if (transitionTime < 1f)
{
fadeVolume.weight = Mathf.Lerp(1f, 0f, transitionTime);
transitionTime += Time.deltaTime * currentCutscene.TransitionOutSpeed;
}
else if (transitionTime >= 1f)
{
OutTransition = false;
transitionTime = 0f;
}
}
}
else
{
fadeVolume.weight = 0f;
}
if (!cutscenePlaying)
{
return;
}
if (sceneType == SceneType.Cutscene && currentCutscene != null)
{
if (((Behaviour)StartOfRound.Instance.localPlayerController.gameplayCamera).enabled)
{
((Behaviour)player.gameplayCamera).enabled = false;
}
if (!((Behaviour)CutsceneCamera).enabled)
{
((Behaviour)CutsceneCamera).enabled = true;
}
((Component)CutsceneCamera).transform.position = currentCutscene.CameraTransform.position;
((Component)CutsceneCamera).transform.rotation = currentCutscene.CameraTransform.rotation;
currentSceneTime += Time.deltaTime;
}
if (sceneType.GetValueOrDefault() == SceneType.QuickScene && currentQuickScene != null)
{
((Component)player).transform.rotation = Quaternion.Euler(0f, currentQuickScene.TargetRotation, 0f);
}
}
private void SetPlayerInFPS(bool state)
{
if ((Object)(object)player == (Object)null)
{
return;
}
inFPS = state;
((Renderer)player.thisPlayerModelArms).enabled = !state;
((Renderer)player.thisPlayerModel).shadowCastingMode = (ShadowCastingMode)(state ? 1 : 3);
foreach (RigLayer layer in rigs.layers)
{
layer.active = !state;
}
}
public void PlayAnimationOnOtherPlayer(PlayerControllerB _player, QuickScene _quickScene)
{
if ((Object)(object)_player == (Object)null)
{
return;
}
Animation component = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>();
RigBuilder component2 = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<RigBuilder>();
component.Stop();
if (_quickScene.Clips.Count > 0)
{
for (int i = 0; i < _quickScene.Clips.Count; i++)
{
AnimationClip val = _quickScene.Clips[i];
val.legacy = true;
component.AddClip(val, "Animation" + (i + 1));
}
for (int j = 0; j < _quickScene.Clips.Count; j++)
{
if (j == 0)
{
component.Play("Animation1");
}
component.PlayQueued("Animation" + (j + 1));
AnimationClip val2 = _quickScene.Clips[j];
val2.legacy = false;
}
}
foreach (RigLayer layer in component2.layers)
{
layer.active = false;
}
((Behaviour)_player.playerBodyAnimator).enabled = false;
}
public void PlayAnimationOnOtherPlayer(PlayerControllerB _player, List<AnimationClip> clips)
{
if ((Object)(object)_player == (Object)null)
{
return;
}
Animation component = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>();
RigBuilder component2 = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<RigBuilder>();
component.Stop();
if (clips.Count > 0)
{
for (int i = 0; i < clips.Count; i++)
{
AnimationClip val = clips[i];
val.legacy = true;
component.AddClip(val, "Animation" + (i + 1));
}
for (int j = 0; j < clips.Count; j++)
{
if (j == 0)
{
component.Play("Animation1");
}
component.PlayQueued("Animation" + (j + 1));
AnimationClip val2 = clips[j];
val2.legacy = false;
}
}
foreach (RigLayer layer in component2.layers)
{
layer.active = false;
}
((Behaviour)_player.playerBodyAnimator).enabled = false;
}
public void StopAnimationOnOtherPlayer(PlayerControllerB _player)
{
if ((Object)(object)_player == (Object)null)
{
return;
}
Animation component = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>();
RigBuilder component2 = ((Component)((Component)_player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<RigBuilder>();
foreach (RigLayer layer in component2.layers)
{
layer.active = true;
}
((Behaviour)_player.playerBodyAnimator).enabled = true;
component.Stop();
for (int i = 0; i < playerAnim.GetClipCount(); i++)
{
component.RemoveClip("Animation" + (i + 1));
}
component.clip = null;
}
private void StartQuickSceneAnimation(QuickScene scene)
{
if (scene == null)
{
return;
}
playerAnim.Stop("Animation");
if (scene.useAnimationList)
{
for (int i = 0; i < scene.Clips.Count; i++)
{
AnimationClip val = scene.Clips[i];
val.legacy = true;
playerAnim.AddClip(val, "Animation" + (i + 1));
}
}
else if (scene.Clips.Count > 0)
{
scene.Clips[0].legacy = true;
playerAnim.AddClip(scene.Clips[0], "Animation1");
}
if (scene.useAnimationList)
{
for (int j = 0; j < scene.Clips.Count; j++)
{
if (j == 0)
{
playerAnim.Play("Animation1");
}
playerAnim.PlayQueued("Animation" + (j + 1));
AnimationClip val2 = scene.Clips[j];
val2.legacy = false;
}
}
else
{
scene.Clips[0].legacy = false;
if (scene.Clips.Count > 0)
{
playerAnim.Play("Animation1");
}
}
((Behaviour)player.playerBodyAnimator).enabled = false;
}
public void StopQuickSceneAnimation(QuickScene scene)
{
if (scene != null)
{
playerAnim.Stop();
for (int i = 0; i < playerAnim.GetClipCount(); i++)
{
playerAnim.RemoveClip("Animation" + (i + 1));
}
((Behaviour)player.playerBodyAnimator).enabled = true;
playerAnim.clip = null;
}
}
public void PlayScene(Cutscene cutscene)
{
if (!Object.op_Implicit((Object)(object)cutscene.CameraTransform) || (Object)(object)cutscene.CameraTransform == (Object)null)
{
Plugin.mls.LogError((object)$"Camera is {cutscene.CameraTransform}! Cutscene aborted.");
}
else if (!Object.op_Implicit((Object)(object)StartOfRound.Instance.localPlayerController) || (Object)(object)StartOfRound.Instance.localPlayerController == (Object)null)
{
Plugin.mls.LogError((object)$"Player is {StartOfRound.Instance.localPlayerController}! Cutscene aborted.");
}
else if (cutscene.Time <= 0f)
{
Plugin.mls.LogError((object)"Cutscene time can't be 0 or lower! Cutscene aborted.");
}
else if (cutscenePlaying)
{
Plugin.mls.LogError((object)"A cutscene is already playing! Cutscene aborted.");
}
else
{
((MonoBehaviour)this).StartCoroutine(DoCutscene(cutscene));
}
}
public void PlayScene(QuickScene quickScene)
{
if ((Object)(object)quickScene.TargetPosition == (Object)null)
{
Plugin.mls.LogError((object)$"Target view is {quickScene.TargetPosition}! Cutscene aborted.");
}
else if (!Object.op_Implicit((Object)(object)StartOfRound.Instance.localPlayerController) || (Object)(object)StartOfRound.Instance.localPlayerController == (Object)null)
{
Plugin.mls.LogError((object)$"Player is {StartOfRound.Instance.localPlayerController}! Cutscene aborted.");
}
else if (quickScene.Time <= 0f)
{
Plugin.mls.LogError((object)"Cutscene time can't be 0 or lower! Cutscene aborted.");
}
else if (cutscenePlaying)
{
Plugin.mls.LogError((object)"A cutscene is already playing! Cutscene aborted.");
}
else
{
((MonoBehaviour)this).StartCoroutine(DoCutscene(quickScene));
}
}
[IteratorStateMachine(typeof(<DoCutscene>d__54))]
private IEnumerator DoCutscene(Cutscene cutscene)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <DoCutscene>d__54(0)
{
<>4__this = this,
cutscene = cutscene
};
}
[IteratorStateMachine(typeof(<DoCutscene>d__55))]
private IEnumerator DoCutscene(QuickScene quickScene)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <DoCutscene>d__55(0)
{
<>4__this = this,
quickScene = quickScene
};
}
}
[BepInPlugin("Chaos.LCCutscene", "LCCutscene", "2.0.1")]
public class Plugin : BaseUnityPlugin
{
private const string modGUID = "Chaos.LCCutscene";
private const string modName = "LCCutscene";
private const string modVersion = "2.0.1";
private readonly Harmony harmony = new Harmony("Chaos.LCCutscene");
public static Plugin Instance;
public static ManualLogSource mls;
public static ConfigFile config;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
mls = ((BaseUnityPlugin)this).Logger;
Content.TryLoadAssets();
harmony.PatchAll(typeof(PlayerPatch));
harmony.PatchAll(typeof(StartOfRoundPatch));
mls.LogInfo((object)"LCCutscene started.");
}
}
public class QuickScene
{
public float Time { get; private set; }
public Transform TargetPosition { get; private set; }
public Transform TargetEndPosition { get; private set; }
public float TargetRotation { get; private set; }
public float TargetEndRotation { get; private set; }
public List<AnimationClip> Clips { get; private set; }
public POVType POV { get; private set; }
public PlayerPose StartingPose { get; private set; }
public PlayerPose EndingPose { get; private set; }
public bool SnapPlayerToPositions { get; private set; }
public float SnapSpeed { get; private set; }
public bool useAnimationList { get; private set; } = false;
public QuickScene(float time, Transform targetPosition, float targetRotation, AnimationClip clip, Transform targetEndPosition = null, float? targetEndRotation = null, bool snapPlayersToPositions = true, float snapSpeed = 10f, PlayerPose startingPose = PlayerPose.Standing, PlayerPose endingPose = PlayerPose.Standing)
{
Time = time;
TargetPosition = targetPosition;
TargetEndPosition = targetEndPosition;
TargetRotation = targetRotation;
Clips = new List<AnimationClip>();
Clips.Add(clip);
if (targetEndRotation.HasValue)
{
TargetEndRotation = targetEndRotation.Value;
}
else
{
TargetEndRotation = TargetRotation;
}
POV = POVType.Full;
StartingPose = startingPose;
EndingPose = endingPose;
SnapPlayerToPositions = snapPlayersToPositions;
SnapSpeed = snapSpeed;
}
public QuickScene(float time, Transform targetPosition, float targetRotation, List<AnimationClip> clips, Transform targetEndPosition = null, float? targetEndRotation = null, bool snapPlayersToPositions = true, float snapSpeed = 10f, PlayerPose startingPose = PlayerPose.Standing, PlayerPose endingPose = PlayerPose.Standing)
{
Time = time;
TargetPosition = targetPosition;
TargetEndPosition = targetEndPosition;
TargetRotation = targetRotation;
Clips = clips;
useAnimationList = true;
if (targetEndRotation.HasValue)
{
TargetEndRotation = targetEndRotation.Value;
}
else
{
TargetEndRotation = TargetRotation;
}
POV = POVType.Full;
StartingPose = startingPose;
EndingPose = endingPose;
SnapPlayerToPositions = snapPlayersToPositions;
SnapSpeed = snapSpeed;
}
}
public enum PlayerPose
{
Standing,
Crouched
}
public enum POVType
{
Full,
ArmsOnly
}
}
namespace LCCutscene.Patches
{
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerPatch
{
[HarmonyPatch(typeof(PlayerControllerB), "Awake")]
[HarmonyPostfix]
public static void Awake(PlayerControllerB __instance)
{
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Expected O, but got Unknown
//IL_027f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
//IL_0301: Unknown result type (might be due to invalid IL or missing references)
bool flag = IsPlayerSetup(__instance);
Plugin.mls.LogDebug((object)(__instance.playerUsername + " is setup? : " + flag));
if (!flag)
{
Animation val = ((Component)((Component)__instance).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>();
if ((Object)(object)val == (Object)null)
{
val = ((Component)((Component)__instance).transform.Find("ScavengerModel/metarig")).gameObject.AddComponent<Animation>();
}
val.playAutomatically = true;
ParentConstraint val2 = ((Component)__instance).gameObject.GetComponent<ParentConstraint>();
if ((Object)(object)val2 == (Object)null)
{
val2 = ((Component)__instance).gameObject.AddComponent<ParentConstraint>();
}
val2.constraintActive = false;
val2.weight = 0f;
val2.locked = false;
val2.rotationAxis = (Axis)0;
ParentConstraint val3 = ((Component)__instance.gameplayCamera).gameObject.GetComponent<ParentConstraint>();
if ((Object)(object)val3 == (Object)null)
{
val3 = ((Component)__instance.gameplayCamera).gameObject.AddComponent<ParentConstraint>();
}
ConstraintSource val4 = default(ConstraintSource);
Transform obj = ((Component)__instance).transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/spine.004/CamPoint");
GameObject val5 = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val5 == (Object)null)
{
val5 = new GameObject("CamPoint");
}
val5.transform.SetParent(((Component)__instance).transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/spine.004"));
val5.transform.localPosition = new Vector3(0f, 0.20460416f, 0.1370099f);
val5.transform.localScale = Vector3.one;
val5.transform.localRotation = Quaternion.identity;
((ConstraintSource)(ref val4)).weight = 1f;
((ConstraintSource)(ref val4)).sourceTransform = val5.transform;
val3.AddSource(val4);
val3.translationAtRest = Vector3.zero;
val3.rotationAtRest = Vector3.zero;
val3.locked = true;
val3.SetTranslationOffset(0, new Vector3(0f, 0.22934699f, 0.022789001f));
val3.SetRotationOffset(0, new Vector3(-1.4772427f, 0f, 0f));
val3.weight = 0f;
val3.constraintActive = false;
ParentConstraint val6 = ((Component)((Component)__instance).transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly")).gameObject.GetComponent<ParentConstraint>();
if ((Object)(object)val6 == (Object)null)
{
val6 = ((Component)((Component)__instance).transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly")).gameObject.AddComponent<ParentConstraint>();
}
ConstraintSource val7 = default(ConstraintSource);
((ConstraintSource)(ref val7)).weight = 1f;
((ConstraintSource)(ref val7)).sourceTransform = ((Component)__instance.gameplayCamera).transform;
val6.AddSource(val7);
val6.translationAtRest = Vector3.zero;
val6.rotationAtRest = new Vector3(89.980225f, 0f, 0f);
val6.locked = true;
val6.SetTranslationOffset(0, new Vector3(0f, -2.359903f, -0.013459206f));
val6.SetRotationOffset(0, Vector3.zero);
val6.weight = 0f;
val6.constraintActive = false;
}
}
private static bool IsPlayerSetup(PlayerControllerB player)
{
bool flag = Object.op_Implicit((Object)(object)((Component)((Component)player).transform.Find("ScavengerModel/metarig")).gameObject.GetComponent<Animation>());
bool flag2 = Object.op_Implicit((Object)(object)((Component)player).transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/spine.004/CamPoint"));
bool flag3 = Object.op_Implicit((Object)(object)((Component)player).gameObject.GetComponent<ParentConstraint>());
bool flag4 = Object.op_Implicit((Object)(object)((Component)player.gameplayCamera).gameObject.GetComponent<ParentConstraint>());
Transform obj = ((Component)player).transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly");
bool flag5 = Object.op_Implicit((Object)(object)((obj != null) ? ((Component)obj).gameObject.GetComponent<ParentConstraint>() : null));
return flag && flag2 && flag3 && flag4 && flag5;
}
}
[HarmonyPatch(typeof(StartOfRound))]
public class StartOfRoundPatch
{
[HarmonyPatch(typeof(StartOfRound), "Awake")]
[HarmonyPrefix]
private static void Awake(ref StartOfRound __instance)
{
CutsceneManager component = ((Component)__instance).gameObject.GetComponent<CutsceneManager>();
if (!Object.op_Implicit((Object)(object)component))
{
((Component)__instance).gameObject.AddComponent<CutsceneManager>();
}
}
}
}