using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.Scorchling;
using KinematicCharacterController;
using Microsoft.CodeAnalysis;
using On;
using On.EntityStates.Scorchling;
using On.RoR2;
using RoR2;
using RoR2.CharacterAI;
using RoR2.Projectile;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ScorchWurmTweaks")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ScorchWurmTweaks")]
[assembly: AssemblyTitle("ScorchWurmTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace ScorchWurmTweaks
{
[BepInPlugin("com.Nuxlar.ScorchWurmTweaks", "ScorchWurmTweaks", "1.0.2")]
public class ScorchWurmTweaks : BaseUnityPlugin
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static hook_OnBodyStart <>9__13_0;
public static hook_Burrow <>9__13_1;
public static hook_Breach <>9__13_2;
internal void <Awake>b__13_0(orig_OnBodyStart orig, CharacterMaster self, CharacterBody body)
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self, body);
if (((Object)body).name == "ScorchlingBody(Clone)")
{
Transform modelTransform = body.modelLocator.modelTransform;
HurtBoxGroup component = ((Component)modelTransform).GetComponent<HurtBoxGroup>();
Transform child = modelTransform.GetChild(0);
GameObject obj = Object.Instantiate<GameObject>(((Component)modelTransform.GetChild(0).GetChild(0).GetChild(0)
.GetChild(0)
.GetChild(0)
.GetChild(1)).gameObject, child);
obj.transform.localPosition = new Vector3(0f, 0.5f, 0f);
obj.transform.localScale = new Vector3(2f, 1.5f, 2f);
HurtBox component2 = obj.GetComponent<HurtBox>();
component.hurtBoxes = new List<HurtBox>(component.hurtBoxes) { component2 }.ToArray();
}
}
internal void <Awake>b__13_1(orig_Burrow orig, ScorchlingController self)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
self.isRecentlyBurrowed = true;
self.isBurrowed = true;
self.SetTeleportPermission(true);
if (NetworkServer.active)
{
self.breachSkill.stock = 1;
self.lavaBombSkill.stock = 0;
self.ensureBurrowSkill.stock = 5;
self.characterMotor.walkSpeedPenaltyCoefficient = 1f;
}
self.originalLayer = ((Component)self).gameObject.layer;
((Component)self).gameObject.layer = LayerIndex.GetAppropriateFakeLayerForTeam(self.characterBody.teamComponent.teamIndex).intVal;
((BaseCharacterController)self.characterMotor).Motor.RebuildCollidableLayers();
if (Object.op_Implicit((Object)(object)self.baseDirt) && Object.op_Implicit((Object)(object)self.dustTrail))
{
self.baseDirt.SetActive(false);
self.dustTrail.SetActive(true);
self.dustTrailActive = true;
((Component)self.armatureObject.transform.GetChild(0)).gameObject.SetActive(false);
((Component)self.armatureObject.transform.GetChild(1)).gameObject.SetActive(true);
self.meshObject.SetActive(false);
}
}
internal void <Awake>b__13_2(orig_Breach orig, ScorchlingController self)
{
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
self.isBurrowed = false;
self.SetTeleportPermission(false);
if (NetworkServer.active)
{
self.breachSkill.stock = 0;
self.lavaBombSkill.stock = 1;
self.ensureBurrowSkill.stock = 5;
self.characterMotor.walkSpeedPenaltyCoefficient = 0f;
if (Object.op_Implicit((Object)(object)self.characterBody))
{
self.characterBody.isSprinting = false;
}
if (Object.op_Implicit((Object)(object)self.rigidBodyMotor))
{
self.rigidBodyMotor.moveVector = Vector3.zero;
}
self.breachBaseDirtRotation = self.baseDirt.transform.rotation;
((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles = new Vector3(((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.x, Mathf.Floor(((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.y), ((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.z);
self.baseDirt.transform.localEulerAngles = Vector3.zero;
self.baseDirt.transform.rotation = self.breachBaseDirtRotation;
}
((Component)self).gameObject.layer = self.originalLayer;
((BaseCharacterController)self.characterMotor).Motor.RebuildCollidableLayers();
if (Object.op_Implicit((Object)(object)self.baseDirt) && Object.op_Implicit((Object)(object)self.dustTrail))
{
self.baseDirt.SetActive(true);
self.dustTrail.SetActive(false);
self.dustTrailActive = false;
((Component)self.armatureObject.transform.GetChild(0)).gameObject.SetActive(true);
((Component)self.armatureObject.transform.GetChild(1)).gameObject.SetActive(false);
self.meshObject.SetActive(true);
}
}
}
private GameObject scorchlingProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/Scorchling/ScorchlingBombProjectile.prefab").WaitForCompletion();
private GameObject scorchlingDOTProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/Scorchling/LavaBombHeatOrbProjectile.prefab").WaitForCompletion();
private GameObject scorchlingMaster = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/Scorchling/ScorchlingMaster.prefab").WaitForCompletion();
private GameObject scorchlingOrbGhost = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/Scorchling/LavaBombHeatOrbGhost.prefab").WaitForCompletion();
private SurfaceDef scorchlingDef = Addressables.LoadAssetAsync<SurfaceDef>((object)"RoR2/DLC2/Scorchling/sdScorchling.asset").WaitForCompletion();
public static ConfigEntry<bool> changeDOTDuration;
public static ConfigEntry<bool> changeAI;
public static ConfigEntry<bool> changeDamage;
public static ConfigEntry<bool> removeImmune;
private static ConfigFile SWTConfig { get; set; }
public void Awake()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Expected O, but got Unknown
//IL_01f4: 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_01ff: Expected O, but got Unknown
//IL_0218: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Expected O, but got Unknown
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Expected O, but got Unknown
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_0241: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Expected O, but got Unknown
SWTConfig = new ConfigFile(Paths.ConfigPath + "\\com.Nuxlar.ScorchWurmTweaks.cfg", true);
changeDOTDuration = SWTConfig.Bind<bool>("General", "Change duration of DOT sphere", true, "Should the duration of the fire orb be reduced? 7s -> 5s");
changeAI = SWTConfig.Bind<bool>("General", "Change AI", true, "Should the AI be changed?");
changeDamage = SWTConfig.Bind<bool>("General", "Change damage", true, "Should the damage of the lava bomb be reduced?");
removeImmune = SWTConfig.Bind<bool>("General", "Remove Immune", true, "Should a hurtbox be added so the wurm can be damaged underground?");
scorchlingOrbGhost.AddComponent<WurmProjFixer>();
if (changeDOTDuration.Value)
{
scorchlingDOTProjectile.GetComponent<DestroyOnTimer>().duration = 5f;
scorchlingDOTProjectile.GetComponent<ProjectileDotZone>().lifetime = 5f;
}
if (changeAI.Value)
{
foreach (AISkillDriver item in scorchlingMaster.GetComponents<AISkillDriver>().ToList())
{
if (item.customName == "LavaBomb")
{
item.selectionRequiresAimTarget = true;
item.selectionRequiresTargetLoS = true;
item.activationRequiresTargetLoS = true;
item.activationRequiresAimTargetLoS = true;
item.minDistance = 0f;
}
if (item.customName == "FollowNodeGraphToTarget")
{
item.minDistance = 5f;
}
if (item.customName == "ChaseOffNodegraph" || item.customName == "ChaseOffNodegraphClose")
{
Object.Destroy((Object)(object)item);
}
}
ScorchlingBreach.OnEnter += new hook_OnEnter(TweakBreach);
}
if (changeDamage.Value)
{
ScorchlingLavaBomb.OnEnter += new hook_OnEnter(TweakLavaBomb);
}
if (!removeImmune.Value)
{
return;
}
object obj = <>c.<>9__13_0;
if (obj == null)
{
hook_OnBodyStart val = delegate(orig_OnBodyStart orig, CharacterMaster self, CharacterBody body)
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self, body);
if (((Object)body).name == "ScorchlingBody(Clone)")
{
Transform modelTransform = body.modelLocator.modelTransform;
HurtBoxGroup component = ((Component)modelTransform).GetComponent<HurtBoxGroup>();
Transform child = modelTransform.GetChild(0);
GameObject obj4 = Object.Instantiate<GameObject>(((Component)modelTransform.GetChild(0).GetChild(0).GetChild(0)
.GetChild(0)
.GetChild(0)
.GetChild(1)).gameObject, child);
obj4.transform.localPosition = new Vector3(0f, 0.5f, 0f);
obj4.transform.localScale = new Vector3(2f, 1.5f, 2f);
HurtBox component2 = obj4.GetComponent<HurtBox>();
component.hurtBoxes = new List<HurtBox>(component.hurtBoxes) { component2 }.ToArray();
}
};
<>c.<>9__13_0 = val;
obj = (object)val;
}
CharacterMaster.OnBodyStart += (hook_OnBodyStart)obj;
object obj2 = <>c.<>9__13_1;
if (obj2 == null)
{
hook_Burrow val2 = delegate(orig_Burrow orig, ScorchlingController self)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
self.isRecentlyBurrowed = true;
self.isBurrowed = true;
self.SetTeleportPermission(true);
if (NetworkServer.active)
{
self.breachSkill.stock = 1;
self.lavaBombSkill.stock = 0;
self.ensureBurrowSkill.stock = 5;
self.characterMotor.walkSpeedPenaltyCoefficient = 1f;
}
self.originalLayer = ((Component)self).gameObject.layer;
((Component)self).gameObject.layer = LayerIndex.GetAppropriateFakeLayerForTeam(self.characterBody.teamComponent.teamIndex).intVal;
((BaseCharacterController)self.characterMotor).Motor.RebuildCollidableLayers();
if (Object.op_Implicit((Object)(object)self.baseDirt) && Object.op_Implicit((Object)(object)self.dustTrail))
{
self.baseDirt.SetActive(false);
self.dustTrail.SetActive(true);
self.dustTrailActive = true;
((Component)self.armatureObject.transform.GetChild(0)).gameObject.SetActive(false);
((Component)self.armatureObject.transform.GetChild(1)).gameObject.SetActive(true);
self.meshObject.SetActive(false);
}
};
<>c.<>9__13_1 = val2;
obj2 = (object)val2;
}
ScorchlingController.Burrow += (hook_Burrow)obj2;
object obj3 = <>c.<>9__13_2;
if (obj3 == null)
{
hook_Breach val3 = delegate(orig_Breach orig, ScorchlingController self)
{
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
self.isBurrowed = false;
self.SetTeleportPermission(false);
if (NetworkServer.active)
{
self.breachSkill.stock = 0;
self.lavaBombSkill.stock = 1;
self.ensureBurrowSkill.stock = 5;
self.characterMotor.walkSpeedPenaltyCoefficient = 0f;
if (Object.op_Implicit((Object)(object)self.characterBody))
{
self.characterBody.isSprinting = false;
}
if (Object.op_Implicit((Object)(object)self.rigidBodyMotor))
{
self.rigidBodyMotor.moveVector = Vector3.zero;
}
self.breachBaseDirtRotation = self.baseDirt.transform.rotation;
((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles = new Vector3(((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.x, Mathf.Floor(((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.y), ((Quaternion)(ref self.breachBaseDirtRotation)).eulerAngles.z);
self.baseDirt.transform.localEulerAngles = Vector3.zero;
self.baseDirt.transform.rotation = self.breachBaseDirtRotation;
}
((Component)self).gameObject.layer = self.originalLayer;
((BaseCharacterController)self.characterMotor).Motor.RebuildCollidableLayers();
if (Object.op_Implicit((Object)(object)self.baseDirt) && Object.op_Implicit((Object)(object)self.dustTrail))
{
self.baseDirt.SetActive(true);
self.dustTrail.SetActive(false);
self.dustTrailActive = false;
((Component)self.armatureObject.transform.GetChild(0)).gameObject.SetActive(true);
((Component)self.armatureObject.transform.GetChild(1)).gameObject.SetActive(false);
self.meshObject.SetActive(true);
}
};
<>c.<>9__13_2 = val3;
obj3 = (object)val3;
}
ScorchlingController.Breach += (hook_Breach)obj3;
}
private void TweakLavaBomb(orig_OnEnter orig, ScorchlingLavaBomb self)
{
ScorchlingLavaBomb.mortarDamageCoefficient = 1.5f;
orig.Invoke(self);
}
private void TweakBreach(orig_OnEnter orig, ScorchlingBreach self)
{
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: 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_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Expected O, but got Unknown
IntPtr functionPointer = typeof(BaseState).GetMethod("OnEnter").MethodHandle.GetFunctionPointer();
((Action)Activator.CreateInstance(typeof(Action), self, functionPointer))();
self.proceedImmediatelyToLavaBomb = true;
self.amServer = NetworkServer.active;
self.scorchlingController = ((Component)((EntityState)self).characterBody).GetComponent<ScorchlingController>();
Util.PlaySound(self.preBreachSoundString, ((EntityState)self).gameObject);
if (self.amServer)
{
if (self.proceedImmediatelyToLavaBomb)
{
self.breachToBurrow = 1f;
}
self.breachToBurrow += self.crackToBreachTime;
self.burrowToEndOfTime += self.breachToBurrow;
self.breachPosition = ((EntityState)self).characterBody.footPosition;
if (Object.op_Implicit((Object)(object)((EntityState)self).characterMotor))
{
((EntityState)self).characterMotor.walkSpeedPenaltyCoefficient = 0f;
}
((EntityState)self).characterBody.SetAimTimer(self.breachToBurrow);
TeleportHelper.TeleportBody(((EntityState)self).characterBody, self.breachPosition);
EffectManager.SpawnEffect(self.crackEffectPrefab, new EffectData
{
origin = self.breachPosition,
scale = self.crackRadius
}, true);
self.scorchlingController.SetTeleportPermission(false);
}
}
}
public class WurmProjFixer : MonoBehaviour
{
private void Start()
{
Object.Destroy((Object)(object)((Component)this).GetComponent<EffectManagerHelper>());
}
}
}