using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using DM;
using Functions;
using HarmonyLib;
using Landfall.TABS;
using Landfall.TABS.AI;
using RestInPieces;
using TFBGames;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("RestInPieces")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("GeeztJeez")]
[assembly: AssemblyProduct("RestInPieces")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7acfaef0-7669-4401-8bff-5a9a02e18c75")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.4.0")]
[module: UnverifiableCode]
namespace RestInPieces
{
[BepInPlugin("GeeztJeez.RestInPieces", "RestInPieces", "1.0.4")]
internal class Loader : BaseUnityPlugin
{
private static ConfigEntry<float> configPiecesDuration;
private static ConfigEntry<bool> configEnableMod;
private static ConfigEntry<float> configPiecesChance;
public static bool Enabled => configEnableMod.Value;
public static float Duration => configPiecesDuration.Value;
public static float Chances => configPiecesChance.Value;
private void Awake()
{
((MonoBehaviour)this).StartCoroutine("Call");
}
private IEnumerator Call()
{
yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)Object.FindObjectOfType<ServiceLocator>() != (Object)null));
yield return (object)new WaitUntil((Func<bool>)(() => ServiceLocator.GetService<ISaveLoaderService>() != null));
Debug.Log((object)"Loading RestInPieces...");
SLMALoader.GetInstance();
_ = ContentDatabase.Instance().LandfallContentDatabase;
new Harmony("RestInPieces").PatchAll();
GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>();
for (int i = 0; i < array.Length; i++)
{
if (Object.op_Implicit((Object)(object)array[i].GetComponentInChildren<Unit>()))
{
array[i].gameObject.AddComponent<GoreMechanic>();
}
}
DoConfig();
((MonoBehaviour)this).StartCoroutine(GenerateSettings());
Debug.Log((object)"Loaded RestInPieces Successfully!");
}
private IEnumerator GenerateSettings()
{
GlobalSettingsHandler service = null;
yield return (object)new WaitUntil((Func<bool>)(() => Object.op_Implicit((Object)(object)(service = ServiceLocator.GetService<GlobalSettingsHandler>()))));
List<SettingsInstance> list = service.GameplaySettings.ToList();
SettingsInstance val2 = new SettingsInstance();
val2.settingsType = (SettingsType)0;
val2.options = new string[2] { "On", "Off" };
val2.currentValue = ((!configEnableMod.Value) ? 1 : 0);
val2.m_settingsKey = "Use Rest In Pieces";
val2.toolTip = "Enables Rest In Pieces mod.";
SettingsInstance val3 = val2;
val3.OnValueChanged += delegate(int val)
{
configEnableMod.Value = val == 0;
};
list.Add(val3);
SettingsInstance val4 = new SettingsInstance
{
currentSliderValue = configPiecesDuration.Value,
defaultSliderValue = 1f,
max = 5f,
min = 0.1f,
m_settingsKey = "Pieces Duration",
settingsType = (SettingsType)1,
toolTip = "Determines the duration of body parts pieces in battlefield. (default: 1)"
};
val4.OnSliderValueChanged += delegate(float val)
{
configPiecesDuration.Value = val;
};
list.Add(val4);
SettingsInstance val5 = new SettingsInstance
{
currentSliderValue = configPiecesChance.Value,
defaultSliderValue = 25f,
max = 100f,
min = 0f,
m_settingsKey = "Body Explosion Chances",
settingsType = (SettingsType)1,
toolTip = "Determines the chance of body parts pieces explodes in battlefield. (default: 25)"
};
val5.OnSliderValueChanged += delegate(float val)
{
configPiecesChance.Value = val;
};
list.Add(val5);
((object)service).GetType().GetField("m_gameplaySettings", (BindingFlags)(-1)).SetValue(service, list.ToArray());
}
private void DoConfig()
{
configPiecesChance = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Chance", 25f, "Determines the change of body parts explosion");
configPiecesDuration = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Duration", 1f, "Determines the duration of pieces");
configEnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable Rest In Pieces Mod");
}
}
}
namespace Functions
{
public class GoreMechanic : MonoBehaviour
{
public Unit unit;
public bool isIceGiant;
public void Start()
{
if (Loader.Enabled)
{
unit = ((Component)((Component)this).gameObject.transform.root).GetComponentInChildren<Unit>();
if (Object.op_Implicit((Object)(object)((Component)unit).GetComponentInChildren<IceGiant>()))
{
isIceGiant = true;
}
}
}
public void Update()
{
if (Loader.Enabled && unit.data.Dead)
{
Weapon[] componentsInChildren = ((Component)unit).GetComponentsInChildren<Weapon>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Component)componentsInChildren[i]).gameObject.transform.SetParent((Transform)null);
}
if (Random.Range(0f, 100f) <= Loader.Chances)
{
BodyExplodes(unit.unitBlueprint);
}
Object.Destroy((Object)(object)this);
}
}
private void SpawnBodyPart(string exclusion)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)unit))
{
return;
}
GameObject[] array = GetCorpseBlueprint(unit.unitBlueprint).Spawn(unit.data.mainRig.position, unit.data.mainRig.rotation, unit.Team, 1f, (UnitPoolInfo?)null);
ConfigurableJoint val3 = default(ConfigurableJoint);
foreach (GameObject val in array)
{
CleanUp(val);
SetParent[] componentsInChildren = val.GetComponentsInChildren<SetParent>();
foreach (SetParent val2 in componentsInChildren)
{
if (!((Object)((Component)val2).gameObject).name.Contains(exclusion))
{
Transform transform = ((Component)val2).gameObject.transform;
transform.localScale *= 0f;
if (((Component)((Component)val2).transform.parent).gameObject.TryGetComponent<ConfigurableJoint>(ref val3))
{
Transform transform2 = ((Component)((Component)val2).transform.parent).gameObject.transform;
transform2.localScale *= 0f;
}
}
}
}
}
private void SpawnBodyPartMammoth(string exclusion)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)unit))
{
return;
}
GameObject[] array = GetCorpseBlueprint(unit.unitBlueprint).Spawn(unit.data.mainRig.position, unit.data.mainRig.rotation, unit.Team, 1f, (UnitPoolInfo?)null);
ConfigurableJoint val3 = default(ConfigurableJoint);
foreach (GameObject val in array)
{
CleanUp(val);
SetParent[] componentsInChildren = val.GetComponentsInChildren<SetParent>();
foreach (SetParent val2 in componentsInChildren)
{
if (((Object)((Component)val2).gameObject).name.Contains("M_") && !((Object)((Component)val2).gameObject).name.Contains(exclusion))
{
Transform transform = ((Component)val2).gameObject.transform;
transform.localScale *= 0f;
if (((Component)((Component)val2).transform.parent).gameObject.TryGetComponent<ConfigurableJoint>(ref val3))
{
Transform transform2 = ((Component)((Component)val2).transform.parent).gameObject.transform;
transform2.localScale *= 0f;
}
}
}
if (!(exclusion != "M_Head"))
{
continue;
}
Head[] componentsInChildren2 = val.GetComponentsInChildren<Head>();
foreach (Head val4 in componentsInChildren2)
{
if (((Object)((Component)val4).gameObject).name.Contains("Bete"))
{
Transform transform3 = ((Component)val4).gameObject.transform;
transform3.localScale *= 0f;
}
}
}
}
public void BodyExplodes(UnitBlueprint unitBlueprint)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Invalid comparison between Unknown and I4
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Invalid comparison between Unknown and I4
if ((int)unit.RigType == 3)
{
SetParent[] componentsInChildren = ((Component)unit).GetComponentsInChildren<SetParent>();
foreach (SetParent val in componentsInChildren)
{
if (((Object)((Component)val).gameObject).name.Contains("M_"))
{
SpawnBodyPartMammoth(((Object)((Component)val).gameObject).name);
}
}
Object.Destroy((Object)(object)((Component)unit).gameObject);
}
else
{
if (isIceGiant || unitBlueprint.Name.Contains("RAPTOR") || (int)unit.unitType == 1)
{
return;
}
SetParent[] componentsInChildren = ((Component)unit).GetComponentsInChildren<SetParent>();
foreach (SetParent val2 in componentsInChildren)
{
if (((Object)((Component)val2).gameObject).name.Contains("M_"))
{
SpawnBodyPart(((Object)((Component)val2).gameObject).name);
}
}
Object.Destroy((Object)(object)((Component)unit).gameObject);
}
}
private void CleanUp(GameObject gameObject)
{
gameObject.AddComponent<CleanUp>();
gameObject.AddComponent<KillAfterSeconds>().seconds = 0.1f;
gameObject.AddComponent<SinkOnDeath>().time = Loader.Duration;
GooglyEye[] componentsInChildren = gameObject.GetComponentsInChildren<GooglyEye>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
componentsInChildren[i].SetState((EyeState)2);
}
GoreMechanic componentInChildren = gameObject.GetComponentInChildren<GoreMechanic>();
if (Object.op_Implicit((Object)(object)componentInChildren))
{
Object.Destroy((Object)(object)componentInChildren);
}
PlacementSpawnEffects componentInChildren2 = gameObject.GetComponentInChildren<PlacementSpawnEffects>();
if (Object.op_Implicit((Object)(object)componentInChildren2))
{
Object.Destroy((Object)(object)((Component)componentInChildren2).gameObject);
}
UnitSounds componentInChildren3 = gameObject.GetComponentInChildren<UnitSounds>();
if (Object.op_Implicit((Object)(object)componentInChildren3))
{
Object.Destroy((Object)(object)((Component)componentInChildren3).gameObject);
}
}
private UnitBlueprint GetCorpseBlueprint(UnitBlueprint baseBlueprint)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Expected O, but got Unknown
return new UnitBlueprint((UnitBlueprint)SLMALoader.SDic["blueprints"]["UNIT_TRIBAL_CLUB"])
{
health = 0f,
Mount = null,
LeftWeapon = null,
RightWeapon = null,
holdinigWithTwoHands = false,
excludeFromWinCondition = true,
objectsToSpawnAsChildren = null,
m_props = baseBlueprint.m_props,
UnitBase = baseBlueprint.UnitBase
};
}
}
public class CleanUp : MonoBehaviour
{
private Unit unit;
public void Start()
{
unit = ((Component)this).gameObject.GetComponentInChildren<Unit>();
}
public void Update()
{
if (Object.op_Implicit((Object)(object)unit))
{
UnitAPI componentInChildren = ((Component)unit).GetComponentInChildren<UnitAPI>();
if (Object.op_Implicit((Object)(object)componentInChildren))
{
Object.Destroy((Object)(object)componentInChildren);
}
unit.SetHealthBarActive(false);
unit.data.health = 0f;
unit.data.immunityForSeconds = 0f;
unit.data.healthHandler.Die((Unit)null);
}
}
}
}