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.Bandit2.Weapon;
using EntityStates.Captain.Weapon;
using EntityStates.CaptainDefenseMatrixItem;
using EntityStates.Commando;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.Engi.EngiWeapon;
using EntityStates.Engi.Mine;
using EntityStates.Huntress;
using EntityStates.Merc;
using EntityStates.Railgunner.Reload;
using EntityStates.Railgunner.Weapon;
using EntityStates.VoidSurvivor;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.EntityStates.Bandit2.Weapon;
using On.EntityStates.CaptainDefenseMatrixItem;
using On.EntityStates.Commando;
using On.EntityStates.Engi.EngiWeapon;
using On.EntityStates.Engi.Mine;
using On.EntityStates.Huntress;
using On.EntityStates.Railgunner.Reload;
using On.EntityStates.Railgunner.Weapon;
using On.EntityStates.VoidSurvivor;
using On.RoR2;
using R2API;
using RoR2;
using RoR2.CharacterAI;
using RoR2.EntityLogic;
using RoR2.HudOverlay;
using RoR2.Projectile;
using RoR2.Skills;
using SurvivorsPlus.Bandit;
using SurvivorsPlus.Captain;
using SurvivorsPlus.Commando;
using SurvivorsPlus.Engineer;
using SurvivorsPlus.Huntress;
using SurvivorsPlus.Loader;
using SurvivorsPlus.Mercenary;
using SurvivorsPlus.REX;
using SurvivorsPlus.Railgunner;
using SurvivorsPlus.VoidFiend;
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.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("SurvivorsPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3a19b9bebbdbe9a3ce97821a90e60a74bc40b147")]
[assembly: AssemblyProduct("SurvivorsPlus")]
[assembly: AssemblyTitle("SurvivorsPlus")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace SurvivorsPlus
{
[BepInPlugin("com.Nuxlar.SurvivorsPlus", "SurvivorsPlus", "1.1.1")]
public class SurvivorsPlus : BaseUnityPlugin
{
private GameObject arti = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageBody.prefab").WaitForCompletion();
private GameObject mult = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/ToolbotBody.prefab").WaitForCompletion();
public static ConfigEntry<bool> enableAccelerationChanges;
public static ConfigEntry<bool> enableCommandoChanges;
public static ConfigEntry<bool> enableHuntressChanges;
public static ConfigEntry<bool> enableBanditChanges;
public static ConfigEntry<bool> enableEngineerChanges;
public static ConfigEntry<bool> enableMercChanges;
public static ConfigEntry<bool> enableREXChanges;
public static ConfigEntry<bool> enableRunnerChanges;
public static ConfigEntry<bool> enableAcridChanges;
public static ConfigEntry<bool> enableCaptainChanges;
public static ConfigEntry<bool> enableVoidFiendChanges;
public static ConfigEntry<bool> enableArtificerChanges;
public static ConfigEntry<bool> enableLoaderChanges;
private static ConfigFile SPConfig { 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
SPConfig = new ConfigFile(Paths.ConfigPath + "\\com.Nuxlar.SurvivorsPlus.cfg", true);
enableAccelerationChanges = SPConfig.Bind<bool>("General", "Enable Acceleration Changes", true, "Toggle Artificer and MUL-T acceleration changes on/off");
enableCommandoChanges = SPConfig.Bind<bool>("General", "Enable Commando Changes", true, "Toggle commando changes on/off");
enableHuntressChanges = SPConfig.Bind<bool>("General", "Enable Huntress Changes", true, "Toggle huntress changes on/off");
enableBanditChanges = SPConfig.Bind<bool>("General", "Enable Bandit Changes", true, "Toggle bandit changes on/off");
enableEngineerChanges = SPConfig.Bind<bool>("General", "Enable Engineer Changes", true, "Toggle engineer changes on/off");
enableMercChanges = SPConfig.Bind<bool>("General", "Enable Mercenary Changes", true, "Toggle mercenary changes on/off");
enableREXChanges = SPConfig.Bind<bool>("General", "Enable REX Changes", true, "Toggle REX changes on/off");
enableRunnerChanges = SPConfig.Bind<bool>("General", "Enable Railgunner Changes", true, "Toggle Railgunner changes on/off");
enableAcridChanges = SPConfig.Bind<bool>("General", "Enable Acrid Changes", true, "Toggle Acrid changes on/off");
enableCaptainChanges = SPConfig.Bind<bool>("General", "Enable Captain Changes", true, "Toggle Captain changes on/off");
enableVoidFiendChanges = SPConfig.Bind<bool>("General", "Enable Void Fiend Changes", true, "Toggle Void Fiend changes on/off");
enableArtificerChanges = SPConfig.Bind<bool>("General", "Enable Artificer Changes", true, "Toggle Artificer changes on/off");
enableLoaderChanges = SPConfig.Bind<bool>("General", "Enable Loader Changes", true, "Toggle Loader changes on/off");
if (enableAccelerationChanges.Value)
{
arti.GetComponent<CharacterBody>().baseAcceleration = 80f;
mult.GetComponent<CharacterBody>().baseAcceleration = 80f;
}
if (enableCommandoChanges.Value)
{
new CommandoChanges();
}
if (enableHuntressChanges.Value)
{
new HuntressChanges();
}
if (enableBanditChanges.Value)
{
new BanditChanges();
}
if (enableEngineerChanges.Value)
{
new EngineerChanges();
}
if (enableMercChanges.Value)
{
new MercenaryChanges();
}
if (enableREXChanges.Value)
{
new REXChanges();
}
if (enableRunnerChanges.Value)
{
new RailgunnerChanges();
}
if (enableCaptainChanges.Value)
{
new CaptainChanges();
}
if (enableVoidFiendChanges.Value)
{
new VoidFiendChanges();
}
if (enableLoaderChanges.Value)
{
new LoaderChanges();
}
}
public static void ChangeEntityStateValue(string entityStateConfiguration, string fieldName, string newValue)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion();
for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
{
if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
{
val.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = newValue;
}
}
}
public static void ChangeEntityStateValueO(string entityStateConfiguration, string fieldName, Object newValue)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion();
for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
{
if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
{
val.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue = newValue;
}
}
}
}
}
namespace SurvivorsPlus.VoidFiend
{
public class VoidFiendChanges
{
public VoidFiendChanges()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Expected O, but got Unknown
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Expected O, but got Unknown
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Expected O, but got Unknown
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
VoidSurvivorController.OnEnable += new hook_OnEnable(ChangeValues);
GlobalEventManager.OnCharacterDeath += new hook_OnCharacterDeath(ExtraCorruptionOnKill);
CorruptionTransitionBase.OnEnter += new hook_OnEnter(ReduceCorruptionAnim);
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (Object.op_Implicit((Object)(object)sender) && sender.HasBuff(Buffs.VoidSurvivorCorruptMode))
{
args.armorAdd -= 100f;
}
}
private void ReduceCorruptionAnim(orig_OnEnter orig, CorruptionTransitionBase self)
{
if (self is EnterCorruptionTransition)
{
self.duration = 0.75f;
}
orig.Invoke(self);
}
private void ChangeValues(orig_OnEnable orig, VoidSurvivorController self)
{
self.corruptionPerCrit = 0f;
self.corruptionForFullHeal = 0f;
self.corruptionFractionPerSecondWhileCorrupted = -1f / 30f;
self.corruptionPerSecondInCombat = 1f;
self.corruptionPerSecondOutOfCombat = 0f;
self.corruptionForFullDamage = 0f;
orig.Invoke(self);
}
private void ExtraCorruptionOnKill(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
{
orig.Invoke(self, damageReport);
if (Object.op_Implicit((Object)(object)damageReport.attackerBody) && Object.op_Implicit((Object)(object)((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>()) && !damageReport.attackerBody.HasBuff(Buffs.VoidSurvivorCorruptMode))
{
((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>().AddCorruption(2f);
}
}
}
}
namespace SurvivorsPlus.REX
{
public class REXChanges
{
public static GameObject syringe = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/SyringeProjectile.prefab").WaitForCompletion();
public REXChanges()
{
syringe.GetComponent<ProjectileController>().procCoefficient = 0.8f;
}
}
}
namespace SurvivorsPlus.Railgunner
{
public class RailgunnerChanges
{
private GameObject railgunner = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerBody.prefab").WaitForCompletion();
private GameObject polarMine = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerMineAltDetonated.prefab").WaitForCompletion();
private SkillDef badPrimary = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFirePistol.asset").WaitForCompletion();
private SkillDef snipeLight = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeLight.asset").WaitForCompletion();
private SkillDef snipeHeavy = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyScopeHeavy.asset").WaitForCompletion();
private SkillFamily utilityFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyUtilityFamily.asset").WaitForCompletion();
private SkillFamily specialFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodySpecialFamily.asset").WaitForCompletion();
public RailgunnerChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//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_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_025a: Unknown result type (might be due to invalid IL or missing references)
//IL_0264: Expected O, but got Unknown
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_0275: Expected O, but got Unknown
//IL_027c: Unknown result type (might be due to invalid IL or missing references)
//IL_0286: Expected O, but got Unknown
//IL_028d: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Expected O, but got Unknown
//IL_029e: Unknown result type (might be due to invalid IL or missing references)
//IL_02a8: Expected O, but got Unknown
//IL_02af: Unknown result type (might be due to invalid IL or missing references)
//IL_02b9: Expected O, but got Unknown
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Backpack.Offline.asset", "baseDuration", "5");
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "critDamageMultiplier", "0");
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "damageCoefficient", "3");
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "damageCoefficient", "6");
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeSuper.asset", "damageCoefficient", "24");
SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeCryo.asset", "damageCoefficient", "12");
railgunner.AddComponent<WeakspotController>();
polarMine.GetComponent<SlowDownProjectiles>().slowDownCoefficient = 0.01f;
SkillLocator component = railgunner.GetComponent<SkillLocator>();
GenericSkill[] components = railgunner.GetComponents<GenericSkill>();
foreach (GenericSkill val in components)
{
if (!val.skillName.Contains("Passive"))
{
Object.Destroy((Object)(object)val);
}
}
FamilyChanges();
component.primary.skillFamily.variants[0].skillDef.skillNameToken = "HH44 Rounds";
component.primary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a light projectile for <style=cIsDamage>300% damage</style>.";
component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Activate your <style=cIsUtility>long-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a piercing <style=cIsDamage>600% damage</style> railgun.";
component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>2400% damage</style> and <style=cIsDamage>150% Weak Point damage</style>. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds.";
component.special.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsUtility>Freezing</style>. Fire <style=cIsDamage>piercing</style> round for <style=cIsDamage>1200% damage</style>.";
CharacterBody.RecalculateStats += new Manipulator(DoubleLope);
CharacterBody.RecalculateStats += new Manipulator(DoubleCritMultiplier);
BaseFireSnipe.OnEnter += new hook_OnEnter(AddReload);
BaseFireSnipe.ModifyBullet += new hook_ModifyBullet(AlterBullet);
HurtBox.OnEnable += new hook_OnEnable(ReduceWeakpointSize);
Boosted.OnEnter += new hook_OnEnter(ReduceBoostBonus);
}
private void ReduceBoostBonus(orig_OnEnter orig, Boosted self)
{
self.bonusDamageCoefficient = 1.5f;
orig.Invoke(self);
}
private void ReduceWeakpointSize(orig_OnEnable orig, HurtBox self)
{
orig.Invoke(self);
HurtBox.sniperTargetRadius = 0.75f;
}
private void DoubleLope(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
val.GotoNext((MoveType)2, new Func<Instruction, bool>[2]
{
(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 2f),
(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 1f)
});
val.Emit(OpCodes.Ldarg_0);
val.EmitDelegate<Func<float, CharacterBody, float>>((Func<float, CharacterBody, float>)((float num, CharacterBody body) => (Object.op_Implicit((Object)(object)body.inventory) && body.inventory.GetItemCount(Items.ConvertCritChanceToCritDamage) > 0) ? 2f : num));
}
private void DoubleCritMultiplier(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
ILCursor val = new ILCursor(il);
int num = default(int);
val.GotoNext((MoveType)0, new Func<Instruction, bool>[3]
{
(Instruction x) => ILPatternMatchingExt.MatchCall<CharacterBody>(x, "get_critMultiplier"),
(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num),
(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.01f)
});
val.Index += 2;
val.Next.Operand = 0.02f;
}
private void AddReload(orig_OnEnter orig, BaseFireSnipe self)
{
if (self is FireSnipeLight)
{
self.useSecondaryStocks = true;
self.queueReload = true;
}
orig.Invoke(self);
}
private void AlterBullet(orig_ModifyBullet orig, BaseFireSnipe self, BulletAttack bulletAttack)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (self is FireSnipeLight)
{
bulletAttack.sniper = true;
bulletAttack.falloffModel = (FalloffModel)0;
EntityStateMachine val = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Reload");
if (Object.op_Implicit((Object)(object)val))
{
EntityState state = val.state;
Boosted val2 = (Boosted)(object)((state is Boosted) ? state : null);
if (val2 != null)
{
bulletAttack.damage += val2.GetBonusDamage() / 2f;
val2.ConsumeBoost(self.queueReload);
}
else if (self.queueReload)
{
EntityState state2 = val.state;
Waiting val3 = (Waiting)(object)((state2 is Waiting) ? state2 : null);
if (val3 != null)
{
val3.QueueReload();
}
}
}
EntityStateMachine val4 = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Backpack");
EntityState val5 = self.InstantiateBackpackState();
if (Object.op_Implicit((Object)(object)val4) && val5 != null)
{
val4.SetNextState(val5);
}
}
else
{
orig.Invoke(self, bulletAttack);
}
}
private void FamilyChanges()
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
SkillLocator component = railgunner.GetComponent<SkillLocator>();
GenericSkill val = railgunner.AddComponent<GenericSkill>();
val.skillName = "RailgunnerPrimary";
SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
((Object)val2).name = "RailgunnerPrimaryFamily";
val2.variants = (Variant[])(object)new Variant[2]
{
new Variant
{
skillDef = snipeLight
},
new Variant
{
skillDef = badPrimary
}
};
val._skillFamily = val2;
ContentAddition.AddSkillFamily(val2);
component.primary = val;
GenericSkill val3 = railgunner.AddComponent<GenericSkill>();
val.skillName = "RailgunnerSecondary";
SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>();
((Object)val4).name = "RailgunnerSecondaryFamily";
val4.variants = (Variant[])(object)new Variant[1]
{
new Variant
{
skillDef = snipeHeavy
}
};
val3._skillFamily = val4;
ContentAddition.AddSkillFamily(val4);
component.secondary = val3;
GenericSkill val5 = railgunner.AddComponent<GenericSkill>();
val5.skillName = "RailgunnerUtility";
val5._skillFamily = utilityFamily;
component.utility = val5;
GenericSkill val6 = railgunner.AddComponent<GenericSkill>();
val6.skillName = "RailgunnerSpecial";
val6._skillFamily = specialFamily;
component.special = val6;
}
}
public class WeakspotController : MonoBehaviour
{
public GameObject scopeOverlayPrefab = ((Component)Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerScopeHeavyOverlay.prefab").WaitForCompletion().transform.GetChild(0)).gameObject;
private OverlayController overlayController;
public void Start()
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
overlayController = HudOverlayManager.AddOverlay(((Component)this).gameObject, new OverlayCreationParams
{
prefab = scopeOverlayPrefab,
childLocatorEntry = "ScopeContainer"
});
}
public void OnDisable()
{
RemoveOverlay(0f);
}
protected void RemoveOverlay(float transitionDuration)
{
if (overlayController != null)
{
HudOverlayManager.RemoveOverlay(overlayController);
overlayController = null;
}
}
}
}
namespace SurvivorsPlus.Mercenary
{
public class EvisDashNux : BaseState
{
private Transform modelTransform;
public static GameObject blinkPrefab;
private float stopwatch;
private Vector3 dashVector = Vector3.zero;
public static float smallHopVelocity;
public static float dashPrepDuration;
public static float dashDuration = 0.3f;
public static float speedCoefficient = 25f;
public static string beginSoundString;
public static string endSoundString;
public static float overlapSphereRadius;
public static float lollypopFactor;
private Animator animator;
private CharacterModel characterModel;
private HurtBoxGroup hurtboxGroup;
private bool isDashing;
private AimRequest aimRequest;
public override void OnEnter()
{
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: 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)
((BaseState)this).OnEnter();
Util.PlaySound(EvisDash.beginSoundString, ((EntityState)this).gameObject);
modelTransform = ((EntityState)this).GetModelTransform();
if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
{
aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
}
if (Object.op_Implicit((Object)(object)modelTransform))
{
animator = ((Component)modelTransform).GetComponent<Animator>();
characterModel = ((Component)modelTransform).GetComponent<CharacterModel>();
}
if (((EntityState)this).isAuthority)
{
((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity);
}
if (NetworkServer.active)
{
((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
}
((EntityState)this).PlayAnimation("FullBody, Override", "EvisPrep", "EvisPrep.playbackRate", EvisDash.dashPrepDuration);
dashVector = ((EntityState)this).inputBank.aimDirection;
((EntityState)this).characterDirection.forward = dashVector;
}
private void CreateBlinkEffect(Vector3 origin)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Expected O, but got Unknown
EffectManager.SpawnEffect(EvisDash.blinkPrefab, new EffectData
{
rotation = Util.QuaternionSafeLookRotation(dashVector),
origin = origin
}, false);
}
public override void FixedUpdate()
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
//IL_0201: Unknown result type (might be due to invalid IL or missing references)
((EntityState)this).FixedUpdate();
stopwatch += Time.fixedDeltaTime;
if ((double)stopwatch > (double)EvisDash.dashPrepDuration && !isDashing)
{
isDashing = true;
dashVector = ((EntityState)this).inputBank.aimDirection;
CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
((EntityState)this).PlayCrossfade("FullBody, Override", "EvisLoop", 0.1f);
if (Object.op_Implicit((Object)(object)modelTransform))
{
TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
obj.duration = 0.6f;
obj.animateShaderAlpha = true;
obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
obj.destroyComponentOnEnd = true;
obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashBright");
obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
obj2.duration = 0.7f;
obj2.animateShaderAlpha = true;
obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
obj2.destroyComponentOnEnd = true;
obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded");
obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
}
}
bool flag = (double)stopwatch >= (double)EvisDash.dashDuration + (double)EvisDash.dashPrepDuration;
if (isDashing)
{
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
{
CharacterMotor characterMotor = ((EntityState)this).characterMotor;
characterMotor.rootMotion += dashVector * (base.moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime);
}
if (((EntityState)this).isAuthority)
{
Collider[] array = Physics.OverlapSphere(((EntityState)this).transform.position, ((EntityState)this).characterBody.radius + EvisDash.overlapSphereRadius * (flag ? EvisDash.lollypopFactor : 1f), LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask));
for (int i = 0; i < array.Length; i++)
{
HurtBox component = ((Component)array[i]).GetComponent<HurtBox>();
if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.healthComponent != (Object)(object)((EntityState)this).healthComponent)
{
((EntityState)this).outer.SetNextState((EntityState)(object)new EvisNux());
return;
}
}
}
}
if (flag && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
public override void OnExit()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
Util.PlaySound(EvisDash.endSoundString, ((EntityState)this).gameObject);
CharacterMotor characterMotor = ((EntityState)this).characterMotor;
characterMotor.velocity *= 0.1f;
((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity);
AimRequest obj = aimRequest;
if (obj != null)
{
obj.Dispose();
}
((EntityState)this).PlayAnimation("FullBody, Override", "EvisLoopExit");
if (NetworkServer.active)
{
((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
}
((EntityState)this).OnExit();
}
}
public class EvisNux : BaseState
{
private Transform modelTransform;
public static GameObject blinkPrefab;
public static float duration = 2f;
public static float damageCoefficient;
public static float damageFrequency;
public static float procCoefficient;
public static string beginSoundString;
public static string endSoundString;
public static float maxRadius;
public static GameObject hitEffectPrefab;
public static string slashSoundString;
public static string impactSoundString;
public static string dashSoundString;
public static float slashPitch;
public static float smallHopVelocity;
public static float lingeringInvincibilityDuration;
private CharacterModel characterModel;
private float stopwatch;
private float attackStopwatch;
private bool crit;
private static float minimumDuration = 0.5f;
private AimRequest aimRequest;
private int hitCount;
public override void OnEnter()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
((BaseState)this).OnEnter();
CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
Util.PlayAttackSpeedSound(Evis.beginSoundString, ((EntityState)this).gameObject, 1.2f);
crit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master);
modelTransform = ((EntityState)this).GetModelTransform();
if (Object.op_Implicit((Object)(object)modelTransform))
{
characterModel = ((Component)modelTransform).GetComponent<CharacterModel>();
}
if (Object.op_Implicit((Object)(object)characterModel))
{
CharacterModel obj = characterModel;
obj.invisibilityCount++;
}
if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams))
{
aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
}
if (NetworkServer.active)
{
((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility);
}
}
public override void FixedUpdate()
{
//IL_0274: Unknown result type (might be due to invalid IL or missing references)
//IL_0279: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Expected O, but got Unknown
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
((EntityState)this).FixedUpdate();
stopwatch += Time.fixedDeltaTime;
attackStopwatch += Time.fixedDeltaTime;
float num = 1f / Evis.damageFrequency / base.attackSpeedStat;
if ((double)attackStopwatch >= (double)num)
{
hitCount++;
attackStopwatch -= num;
HurtBox val = SearchForTarget();
if (Object.op_Implicit((Object)(object)val))
{
Util.PlayAttackSpeedSound(Evis.slashSoundString, ((EntityState)this).gameObject, Evis.slashPitch);
Util.PlaySound(Evis.dashSoundString, ((EntityState)this).gameObject);
Util.PlaySound(Evis.impactSoundString, ((EntityState)this).gameObject);
HurtBoxGroup hurtBoxGroup = val.hurtBoxGroup;
HurtBox val2 = hurtBoxGroup.hurtBoxes[Random.Range(0, hurtBoxGroup.hurtBoxes.Length - 1)];
if (Object.op_Implicit((Object)(object)val2))
{
Vector3 position = ((Component)val2).transform.position;
Vector2 insideUnitCircle = Random.insideUnitCircle;
Vector2 normalized = ((Vector2)(ref insideUnitCircle)).normalized;
Vector3 val3 = default(Vector3);
((Vector3)(ref val3))..ctor(normalized.x, 0f, normalized.y);
EffectManager.SimpleImpactEffect(Evis.hitEffectPrefab, position, val3, false);
Transform transform = ((Component)val.hurtBoxGroup).transform;
TemporaryOverlay obj = ((Component)transform).gameObject.AddComponent<TemporaryOverlay>();
obj.duration = num;
obj.animateShaderAlpha = true;
obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
obj.destroyComponentOnEnd = true;
obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget");
obj.AddToCharacerModel(((Component)transform).GetComponent<CharacterModel>());
if (NetworkServer.active)
{
DamageInfo val4 = new DamageInfo();
val4.damage = 1.5f * base.damageStat;
val4.attacker = ((EntityState)this).gameObject;
val4.procCoefficient = Evis.procCoefficient;
val4.position = ((Component)val2).transform.position;
val4.crit = crit;
if (hitCount == 7)
{
val4.damageType = (DamageType)(val4.damageType | 0x800000);
}
val2.healthComponent.TakeDamage(val4);
GlobalEventManager.instance.OnHitEnemy(val4, ((Component)val2.healthComponent).gameObject);
GlobalEventManager.instance.OnHitAll(val4, ((Component)val2.healthComponent).gameObject);
}
}
}
else if (((EntityState)this).isAuthority && (double)stopwatch > (double)Evis.minimumDuration)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.velocity = Vector3.zero;
}
if (!((double)stopwatch < (double)Evis.duration) && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
private HurtBox SearchForTarget()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: 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_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: 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)
BullseyeSearch val = new BullseyeSearch
{
searchOrigin = ((EntityState)this).transform.position,
searchDirection = Random.onUnitSphere,
maxDistanceFilter = Evis.maxRadius,
teamMaskFilter = TeamMask.GetUnprotectedTeams(((BaseState)this).GetTeam()),
sortMode = (SortMode)1
};
val.RefreshCandidates();
val.FilterOutGameObject(((EntityState)this).gameObject);
return val.GetResults().FirstOrDefault();
}
private void CreateBlinkEffect(Vector3 origin)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
EffectManager.SpawnEffect(Evis.blinkPrefab, new EffectData
{
rotation = Util.QuaternionSafeLookRotation(Vector3.up),
origin = origin
}, false);
}
public override void OnExit()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject);
CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject));
modelTransform = ((EntityState)this).GetModelTransform();
if (Object.op_Implicit((Object)(object)modelTransform))
{
TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
obj.duration = 0.6f;
obj.animateShaderAlpha = true;
obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
obj.destroyComponentOnEnd = true;
obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget");
obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>();
obj2.duration = 0.7f;
obj2.animateShaderAlpha = true;
obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
obj2.destroyComponentOnEnd = true;
obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded");
obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>());
}
if (Object.op_Implicit((Object)(object)characterModel))
{
CharacterModel obj3 = characterModel;
obj3.invisibilityCount--;
}
AimRequest obj4 = aimRequest;
if (obj4 != null)
{
obj4.Dispose();
}
if (NetworkServer.active)
{
((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, Evis.lingeringInvincibilityDuration);
}
Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject);
((BaseState)this).SmallHop(((EntityState)this).characterMotor, Evis.smallHopVelocity);
((EntityState)this).OnExit();
}
}
public class MercenaryChanges
{
private GameObject merc = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/MercBody.prefab").WaitForCompletion();
private GameObject evisOverlapProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/EvisOverlapProjectile.prefab").WaitForCompletion();
public MercenaryChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
Object.Destroy((Object)(object)evisOverlapProjectile.GetComponent<DelayedEvent>());
bool flag = default(bool);
ContentAddition.AddEntityState<EvisDashNux>(ref flag);
ContentAddition.AddEntityState<EvisNux>(ref flag);
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.Assaulter2.asset", "damageCoefficient", "4");
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.FocusedAssaultDash.asset", "delayedDamageCoefficient", "8");
CharacterBody component = merc.GetComponent<CharacterBody>();
component.baseRegen = 2.5f;
component.levelRegen = 0.5f;
SkillLocator component2 = merc.GetComponent<SkillLocator>();
component2.utility.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>400% damage</style>. If you hit an enemy, <style=cIsDamage>you can dash again</style>, up to <style=cIsDamage>3</style> total.";
component2.utility.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>800% damage</style> and <style=cIsUtility>Exposing</style> enemies after<style=cIsUtility> 1 second</style>.";
component2.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Target a nearby enemy, attacking them for <style=cIsDamage>150% damage</style> repeatedly. <style=cIsUtility>Exposing</style> on the final hit. <style=cIsUtility>You cannot be hit for the duration</style>.";
component2.special.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(EvisDashNux));
}
}
}
namespace SurvivorsPlus.Loader
{
public class LoaderChanges
{
private GameObject loader = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderBody.prefab").WaitForCompletion();
public LoaderChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
CharacterBody component = loader.GetComponent<CharacterBody>();
component.baseMaxHealth = 110f;
component.levelMaxHealth = 33f;
component.baseArmor = 10f;
}
}
}
namespace SurvivorsPlus.Huntress
{
public class HuntressChanges
{
public ModdedDamageType huntressSlow;
private GameObject arrowRainProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressArrowRain.prefab").WaitForCompletion();
private GameObject huntress = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressBody.prefab").WaitForCompletion();
public HuntressChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//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_0037: 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_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Expected O, but got Unknown
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_018b: Expected O, but got Unknown
huntressSlow = DamageAPI.ReserveDamageType();
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "orbProcCoefficient", "0.8");
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "baseDuration", "1");
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.ArrowRain.asset", "damageCoefficient", "6");
arrowRainProjectile.GetComponent<ProjectileDotZone>().overlapProcCoefficient = 0.6f;
arrowRainProjectile.GetComponent<ProjectileDamage>().damageType = (DamageType)0;
arrowRainProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(huntressSlow);
SkillLocator component = huntress.GetComponent<SkillLocator>();
component.utility.skillFamily.variants[0].skillDef.baseRechargeInterval = 6f;
SkillDef skillDef = component.utility.skillFamily.variants[1].skillDef;
skillDef.baseMaxStock = 1;
skillDef.baseRechargeInterval = 3f;
skillDef.skillDescriptionToken = "<style=cIsUtility>Agile</style>. <style=cIsUtility>Disappear</style> and <style=cIsUtility>teleport</style> a short distance.";
component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Throw a seeking glaive that bounces up to <style=cIsDamage>6</style> times for <style=cIsDamage>400%</style> damage.";
component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsUtility>Teleport</style> into the sky. Target an area to rain arrows, <style=cIsUtility>slowing</style> all enemies and dealing <style=cIsDamage>450% damage per second</style>.";
HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageType);
ArrowRain.UpdateAreaIndicator += new hook_UpdateAreaIndicator(ChangeAimLayer);
}
private void ApplyNewDamageType(orig_SendDamageDealt orig, DamageReport damageReport)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, huntressSlow) && Object.op_Implicit((Object)(object)damageReport.victimBody))
{
damageReport.victimBody.AddTimedBuff(Buffs.Slow80, 1f);
}
orig.Invoke(damageReport);
}
private void ChangeAimLayer(orig_UpdateAreaIndicator orig, ArrowRain self)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: 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_0053: Unknown result type (might be due to invalid IL or missing references)
if (Object.op_Implicit((Object)(object)self.areaIndicatorInstance))
{
float num = 1000f;
RaycastHit val = default(RaycastHit);
if (Physics.Raycast(((BaseState)self).GetAimRay(), ref val, num, LayerMask.op_Implicit(CommonMasks.bullet)))
{
self.areaIndicatorInstance.transform.position = ((RaycastHit)(ref val)).point;
self.areaIndicatorInstance.transform.up = ((RaycastHit)(ref val)).normal;
}
}
}
}
}
namespace SurvivorsPlus.Engineer
{
public class BetterFireBeam : BaseState
{
public GameObject effectPrefab;
public GameObject hitEffectPrefab = EngineerChanges.hitEffect;
public GameObject laserPrefab = EngineerChanges.laser;
public string muzzleString = "Muzzle";
public string attackSoundString = "";
public float damageCoefficient = 2f;
public float procCoefficient = 3f;
public float force;
public float minSpread;
public float maxSpread;
public int bulletCount = 1;
public float fireFrequency = 5f;
public float maxDistance = 50f;
private float fireTimer;
private Ray laserRay;
private Transform modelTransform;
private GameObject laserEffectInstance;
private Transform laserEffectInstanceEndTransform;
public int bulletCountCurrent = 1;
public override void OnEnter()
{
//IL_00b8: 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)
((BaseState)this).OnEnter();
fireTimer = 0f;
modelTransform = ((EntityState)this).GetModelTransform();
if (!Object.op_Implicit((Object)(object)modelTransform))
{
return;
}
ChildLocator component = ((Component)modelTransform).GetComponent<ChildLocator>();
if (!Object.op_Implicit((Object)(object)component))
{
return;
}
Transform val = component.FindChild(muzzleString);
if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)laserPrefab))
{
if (((Component)val).transform.childCount > 0)
{
laserEffectInstance = ((Component)((Component)val).transform.GetChild(0)).gameObject;
laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd");
}
if (!Object.op_Implicit((Object)(object)laserEffectInstance))
{
laserEffectInstance = Object.Instantiate<GameObject>(laserPrefab, val.position, val.rotation);
laserEffectInstance.transform.parent = val;
laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd");
}
}
}
public override void FixedUpdate()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
((EntityState)this).FixedUpdate();
laserRay = GetLaserRay();
fireTimer += Time.fixedDeltaTime;
if ((double)fireTimer > (double)(1f / (fireFrequency * ((EntityState)this).characterBody.attackSpeed)))
{
FireBullet(modelTransform, laserRay, muzzleString);
fireTimer = 0f;
}
if (Object.op_Implicit((Object)(object)laserEffectInstance) && Object.op_Implicit((Object)(object)laserEffectInstanceEndTransform))
{
laserEffectInstanceEndTransform.position = GetBeamEndPoint();
}
if (((EntityState)this).isAuthority && fireTimer == 0f)
{
((EntityState)this).outer.SetNextState(GetNextState());
}
}
protected Vector3 GetBeamEndPoint()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: 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_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
Vector3 point = ((Ray)(ref laserRay)).GetPoint(maxDistance);
GameObject gameObject = ((EntityState)this).gameObject;
Ray val = laserRay;
double num = maxDistance;
LayerIndex val2 = LayerIndex.world;
int num2 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask);
val2 = LayerIndex.entityPrecise;
int num3 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask);
LayerMask val3 = LayerMask.op_Implicit(num2 | num3);
RaycastHit val4 = default(RaycastHit);
if (Util.CharacterRaycast(gameObject, val, ref val4, (float)num, val3, (QueryTriggerInteraction)0))
{
point = ((RaycastHit)(ref val4)).point;
}
return point;
}
protected virtual EntityState GetNextState()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return EntityStateCatalog.InstantiateState(((EntityState)this).outer.mainStateType);
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return (InterruptPriority)1;
}
public virtual void ModifyBullet(BulletAttack bulletAttack)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
bulletAttack.damageType = (DamageType)(bulletAttack.damageType | 8);
}
public virtual bool ShouldFireLaser()
{
if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
{
return ((EntityState)this).inputBank.skill1.down;
}
return false;
}
public virtual Ray GetLaserRay()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return ((BaseState)this).GetAimRay();
}
private void FireBullet(Transform modelTransform, Ray laserRay, string targetMuzzle)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected O, but got Unknown
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
if (Object.op_Implicit((Object)(object)effectPrefab))
{
EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, targetMuzzle, false);
}
if (((EntityState)this).isAuthority)
{
BulletAttack val = new BulletAttack();
val.owner = ((EntityState)this).gameObject;
val.weapon = ((EntityState)this).gameObject;
val.origin = ((Ray)(ref laserRay)).origin;
val.aimVector = ((Ray)(ref laserRay)).direction;
val.minSpread = minSpread;
val.maxSpread = maxSpread;
val.bulletCount = 1u;
val.damage = damageCoefficient * base.damageStat / fireFrequency;
val.procCoefficient = procCoefficient / fireFrequency;
val.force = force;
val.muzzleName = targetMuzzle;
val.hitEffectPrefab = hitEffectPrefab;
val.isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master);
val.HitEffectNormal = false;
val.radius = 0f;
val.maxDistance = maxDistance;
ModifyBullet(val);
val.Fire();
}
}
}
public class EngineerChanges
{
public static GameObject hitEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Hitspark1.prefab").WaitForCompletion();
public static GameObject laser = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/LaserEngiTurret.prefab").WaitForCompletion();
private GameObject engi = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiBody.prefab").WaitForCompletion();
private GameObject engiWalkerTurret = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretBody.prefab").WaitForCompletion();
private GameObject engiWalkerTurretMaster = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretMaster.prefab").WaitForCompletion();
public EngineerChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//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_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01e3: Expected O, but got Unknown
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Expected O, but got Unknown
bool flag = default(bool);
ContentAddition.AddEntityState<BetterFireBeam>(ref flag);
SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Engi/EntityStates.EngiTurret.EngiTurretWeapon.FireBeam.asset", "maxDistance", "50");
SkillLocator component = engi.GetComponent<SkillLocator>();
SkillDef skillDef = component.primary.skillFamily.variants[0].skillDef;
skillDef.skillDescriptionToken = "Fire <style=cIsDamage>3</style> grenades that deal <style=cIsDamage>100% damage</style> each.";
skillDef.activationState = new SerializableEntityStateType(typeof(FireGrenades));
SkillDef skillDef2 = component.secondary.skillFamily.variants[0].skillDef;
skillDef2.skillDescriptionToken = "Place a large blast radius mine that deals <style=cIsDamage>deal 600% damage</style> each. Can place up to 4.";
skillDef2.baseRechargeInterval = 5f;
engiWalkerTurret.AddComponent<TurretBeamRemover>();
engiWalkerTurret.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(BetterFireBeam));
AISkillDriver[] array = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>()
where x.customName.Contains("ReturnToLeader")
select x).ToArray();
foreach (AISkillDriver val in array)
{
if (val.maxDistance == 110f)
{
val.maxDistance = 55f;
val.shouldSprint = true;
}
}
AISkillDriver obj = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>()
where x.customName.Contains("ChaseAndFireAtEnemy")
select x).First();
obj.maxDistance = 50f;
obj.shouldSprint = true;
BaseMineArmingState.OnEnter += new hook_OnEnter(BaseMineArmingState_OnEnter);
FireGrenades.OnEnter += new hook_OnEnter(FireGrenades_OnEnter);
}
private void BaseMineArmingState_OnEnter(orig_OnEnter orig, BaseMineArmingState self)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Expected O, but got Unknown
orig.Invoke(self);
if (self is MineArmingFull)
{
self.damageScale = 2f;
}
if (self is MineArmingWeak)
{
((EntityState)self).outer.SetState((EntityState)new MineArmingFull());
}
}
private void FireGrenades_OnEnter(orig_OnEnter orig, FireGrenades self)
{
FireGrenades.baseDuration = 1f;
self.grenadeCountMax = 3;
orig.Invoke(self);
}
}
public class TurretBeamRemover : MonoBehaviour
{
private GameObject muzzle;
private InputBankTest inputBank;
private void Start()
{
muzzle = ((Component)((Component)((Component)this).GetComponent<CharacterBody>().modelLocator.modelTransform).GetComponent<ChildLocator>().FindChild("Muzzle")).gameObject;
inputBank = ((Component)this).GetComponent<CharacterBody>().inputBank;
}
private void FixedUpdate()
{
if (muzzle.transform.childCount > 0 && !inputBank.skill1.down)
{
Object.Destroy((Object)(object)((Component)muzzle.transform.GetChild(0)).gameObject);
}
}
}
}
namespace SurvivorsPlus.Commando
{
public class BetterSuppressiveFire : BaseState
{
public static GameObject effectPrefab = FireBarrage.effectPrefab;
public static GameObject hitEffectPrefab = FireBarrage.hitEffectPrefab;
public static GameObject tracerEffectPrefab = FireBarrage.tracerEffectPrefab;
public static float damageCoefficient = 2f;
public static float force = FireSweepBarrage.force;
public static float minSpread = FireBarrage.minSpread;
public static float maxSpread = FireBarrage.maxSpread;
public static float baseDurationBetweenShots = 1f;
public static float totalDuration = 2f;
public static float bulletRadius = 1.5f;
public static int baseBulletCount = FireBarrage.baseBulletCount;
public static string fireBarrageSoundString = FireBarrage.fireBarrageSoundString;
public static float recoilAmplitude = FireBarrage.recoilAmplitude;
public static float spreadBloomValue = FireBarrage.spreadBloomValue;
private int totalBulletsFired;
private int bulletCount;
public float stopwatchBetweenShots;
private Animator modelAnimator;
private Transform modelTransform;
private float duration;
private float durationBetweenShots;
public override void OnEnter()
{
((BaseState)this).OnEnter();
((EntityState)this).characterBody.SetSpreadBloom(0.2f, false);
durationBetweenShots = FireBarrage.baseDurationBetweenShots / base.attackSpeedStat;
bulletCount = (int)((double)FireBarrage.baseBulletCount * (double)base.attackSpeedStat);
duration = durationBetweenShots * (float)bulletCount;
modelAnimator = ((EntityState)this).GetModelAnimator();
modelTransform = ((EntityState)this).GetModelTransform();
((EntityState)this).PlayCrossfade("Gesture, Additive", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f);
((EntityState)this).PlayCrossfade("Gesture, Override", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f);
if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
{
((EntityState)this).characterBody.SetAimTimer(2f);
}
FireBullet();
}
private void FireBullet()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
Ray aimRay = ((BaseState)this).GetAimRay();
string text = "MuzzleRight";
if (Object.op_Implicit((Object)(object)modelAnimator))
{
if (Object.op_Implicit((Object)(object)effectPrefab))
{
EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, text, false);
}
((EntityState)this).PlayAnimation("Gesture Additive, Right", "FirePistol, Right");
}
((BaseState)this).AddRecoil(-0.8f * recoilAmplitude, -1f * recoilAmplitude, -0.1f * recoilAmplitude, 0.15f * recoilAmplitude);
if (((EntityState)this).isAuthority)
{
new BulletAttack
{
owner = ((EntityState)this).gameObject,
weapon = ((EntityState)this).gameObject,
origin = ((Ray)(ref aimRay)).origin,
aimVector = ((Ray)(ref aimRay)).direction,
minSpread = minSpread,
maxSpread = maxSpread,
bulletCount = 1u,
falloffModel = (FalloffModel)0,
damage = damageCoefficient * base.damageStat,
force = force,
tracerEffectPrefab = tracerEffectPrefab,
muzzleName = text,
hitEffectPrefab = hitEffectPrefab,
isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master),
radius = bulletRadius,
smartCollision = true,
damageType = (DamageType)0,
procCoefficient = 2f
}.Fire();
}
((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue);
totalBulletsFired++;
Util.PlaySound(fireBarrageSoundString, ((EntityState)this).gameObject);
}
public override void OnExit()
{
((EntityState)this).OnExit();
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
stopwatchBetweenShots += Time.fixedDeltaTime;
if ((double)stopwatchBetweenShots >= (double)durationBetweenShots && totalBulletsFired < bulletCount)
{
stopwatchBetweenShots -= durationBetweenShots;
FireBullet();
}
if (totalBulletsFired == bulletCount && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return (InterruptPriority)1;
}
}
public class CommandoChanges
{
private GameObject commando = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion();
public CommandoChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00f4: Expected O, but got Unknown
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Expected O, but got Unknown
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Expected O, but got Unknown
SkillLocator component = commando.GetComponent<SkillLocator>();
component.secondary.skillFamily.variants[1].skillDef.skillDescriptionToken = "Fire two close-range blasts that deal <style=cIsDamage>12x200% damage</style> total.";
component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsUtility>piercing</style> bullet for <style=cIsDamage>400% damage</style>. Deals <style=cIsDamage>40%</style> more damage every time it passes through an enemy.";
SkillDef skillDef = component.utility.skillFamily.variants[0].skillDef;
skillDef.cancelSprintingOnActivation = false;
skillDef.skillDescriptionToken = "<style=cIsUtility>Roll</style> forward a short distance. You are <style=cIsDamage>invincible</style> during the roll.";
SkillDef skillDef2 = component.special.skillFamily.variants[0].skillDef;
skillDef2.skillDescriptionToken = "Fire a barrage of high impact rounds that deal <style=cIsDamage>200% damage</style> with <style=cIsUtility>double the proc coefficient</style>.";
skillDef2.activationState = new SerializableEntityStateType(typeof(BetterSuppressiveFire));
skillDef2.baseRechargeInterval = 6f;
GenericProjectileBaseState.OnEnter += new hook_OnEnter(AlterFMJ);
DodgeState.OnEnter += new hook_OnEnter(AddInvincibility);
DodgeState.OnExit += new hook_OnExit(RemoveInvincibility);
}
private void AlterFMJ(orig_OnEnter orig, GenericProjectileBaseState self)
{
if (self is FireFMJ)
{
self.damageCoefficient = 4f;
}
orig.Invoke(self);
}
private void AddInvincibility(orig_OnEnter orig, DodgeState self)
{
self.initialSpeedCoefficient = 4f;
self.finalSpeedCoefficient = 2f;
((EntityState)self).characterBody.AddBuff(Buffs.HiddenInvincibility);
orig.Invoke(self);
}
private void RemoveInvincibility(orig_OnExit orig, DodgeState self)
{
orig.Invoke(self);
((EntityState)self).characterBody.RemoveBuff(Buffs.HiddenInvincibility);
}
}
}
namespace SurvivorsPlus.Captain
{
public class CaptainChanges
{
private GameObject captain = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Captain/CaptainBody.prefab").WaitForCompletion();
public CaptainChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Expected O, but got Unknown
captain.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(FireCaptainShotgun));
DefenseMatrixOn.DeleteNearbyProjectile += new hook_DeleteNearbyProjectile(MicrobotEdit);
}
private void FamilyChanges()
{
SkillLocator component = captain.GetComponent<SkillLocator>();
GenericSkill val = captain.AddComponent<GenericSkill>();
val.skillName = "captainPrimary";
SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
((Object)val2).name = "captainPrimaryFamily";
val._skillFamily = val2;
ContentAddition.AddSkillFamily(val2);
component.primary = val;
GenericSkill val3 = captain.AddComponent<GenericSkill>();
val.skillName = "captainSecondary";
SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>();
((Object)val4).name = "captainSecondaryFamily";
val3._skillFamily = val4;
ContentAddition.AddSkillFamily(val4);
component.secondary = val3;
GenericSkill val5 = captain.AddComponent<GenericSkill>();
val5.skillName = "captainUtility";
component.utility = val5;
GenericSkill val6 = captain.AddComponent<GenericSkill>();
val6.skillName = "captainSpecial";
component.special = val6;
}
private bool MicrobotEdit(orig_DeleteNearbyProjectile orig, DefenseMatrixOn self)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: 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_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: 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_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Expected O, but got Unknown
Vector3 val = (Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody) ? ((BaseBodyAttachmentState)self).attachedBody.corePosition : Vector3.zero);
TeamIndex val2 = (TeamIndex)((!Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody)) ? (-1) : ((int)((BaseBodyAttachmentState)self).attachedBody.teamComponent.teamIndex));
float num = DefenseMatrixOn.projectileEraserRadius * DefenseMatrixOn.projectileEraserRadius;
int num2 = 0;
int itemStack = self.GetItemStack();
bool result = false;
List<ProjectileController> instancesList = InstanceTracker.GetInstancesList<ProjectileController>();
List<ProjectileController> list = new List<ProjectileController>();
int i = 0;
for (int count = instancesList.Count; i < count; i++)
{
if (num2 >= itemStack)
{
break;
}
ProjectileController val3 = instancesList[i];
if (val3.cannotBeDeleted || val3.teamFilter.teamIndex == val2)
{
continue;
}
Vector3 val4 = ((Component)val3).transform.position - val;
if (((Vector3)(ref val4)).sqrMagnitude < num)
{
bool flag = true;
ProjectileSimple component = ((Component)val3).gameObject.GetComponent<ProjectileSimple>();
ProjectileCharacterController component2 = ((Component)val3).gameObject.GetComponent<ProjectileCharacterController>();
if ((!Object.op_Implicit((Object)(object)component) || (Object.op_Implicit((Object)(object)component) && component.desiredForwardSpeed == 0f)) && !Object.op_Implicit((Object)(object)component2))
{
flag = false;
}
if (flag)
{
list.Add(val3);
num2++;
}
}
}
int j = 0;
for (int count2 = list.Count; j < count2; j++)
{
ProjectileController val5 = list[j];
if (Object.op_Implicit((Object)(object)val5))
{
result = true;
Vector3 position = ((Component)val5).transform.position;
Vector3 start = val;
if (Object.op_Implicit((Object)(object)DefenseMatrixOn.tracerEffectPrefab))
{
EffectData val6 = new EffectData
{
origin = position,
start = start
};
EffectManager.SpawnEffect(DefenseMatrixOn.tracerEffectPrefab, val6, true);
}
EntityState.Destroy((Object)(object)((Component)val5).gameObject);
}
}
return result;
}
}
}
namespace SurvivorsPlus.Bandit
{
public class BanditChanges
{
public ModdedDamageType banditOpenWound;
public ModdedDamageType banditDoubleHemorrhage;
private GameObject lightsOutEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2ResetEffect.prefab").WaitForCompletion();
private GameObject bandit = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2Body.prefab").WaitForCompletion();
private Material bloodMat = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Common/VFX/matBloodHumanLarge.mat").WaitForCompletion();
private DotIndex emptyDotIdx;
public BanditChanges()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//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_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Expected O, but got Unknown
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Expected O, but got Unknown
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_019a: Expected O, but got Unknown
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Expected O, but got Unknown
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Expected O, but got Unknown
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01cd: Expected O, but got Unknown
((Renderer)((Component)lightsOutEffect.transform.GetChild(0)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
((Renderer)((Component)lightsOutEffect.transform.GetChild(1)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
((Renderer)((Component)lightsOutEffect.transform.GetChild(2)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat;
SkillLocator component = bandit.GetComponent<SkillLocator>();
component.utility.skillFamily.variants[0].skillDef.beginSkillCooldownOnSkillEnd = true;
component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Lunge and slash for <style=cIsDamage>360% damage</style>. Critical Strikes also cause <style=cIsHealth>2 Hemorrhage stacks</style>.";
SkillDef skillDef = component.special.skillFamily.variants[0].skillDef;
skillDef.skillNameToken = "Open Wound";
skillDef.skillDescriptionToken = "<style=cIsDamage>Slayer</style>. Fire a revolver shot for <style=cIsDamage>600% damage</style>. Clears all stacks of <style=cIsHealth>Hemorrhage, dealing remaining damage immediately</style>.";
skillDef.baseRechargeInterval = 6f;
banditDoubleHemorrhage = DamageAPI.ReserveDamageType();
banditOpenWound = DamageAPI.ReserveDamageType();
CustomDotBehaviour val = new CustomDotBehaviour(OpenWoundBehavior);
emptyDotIdx = DotAPI.RegisterDotDef(0f, 0f, (DamageColorIndex)0, (BuffDef)null, val, (CustomDotVisual)null);
HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageTypes);
FireShotgun2.FireBullet += new hook_FireBullet(ModifyFire);
SlashBlade.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(IncreaseHemorrhageStacks);
Bandit2FirePrimaryBase.OnEnter += new hook_OnEnter(ReduceRecoil);
FireSidearmResetRevolver.ModifyBullet += new hook_ModifyBullet(AddOpenWound);
}
private void AddOpenWound(orig_ModifyBullet orig, FireSidearmResetRevolver self, BulletAttack bulletAttack)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
DamageAPI.AddModdedDamageType(bulletAttack, banditOpenWound);
orig.Invoke(self, bulletAttack);
}
private void OpenWoundBehavior(DotController self, DotStack dotStack)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: 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_005e: Invalid comparison between Unknown and I4
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Expected O, but got Unknown
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Expected O, but got Unknown
if (dotStack.dotIndex != emptyDotIdx || !Object.op_Implicit((Object)(object)self.victimBody) || !Object.op_Implicit((Object)(object)self.victimBody.healthComponent))
{
return;
}
int i = 0;
int count = self.dotStackList.Count;
float num = 0f;
for (; i < count; i++)
{
if ((int)self.dotStackList[i].dotIndex == 6)
{
float num2 = self.dotStackList[i].timer / 0.25f;
float damage = self.dotStackList[i].damage;
num += damage * num2;
self.dotStackList[i].timer = 0f;
}
}
if (num > 0f)
{
DamageInfo val = new DamageInfo();
val.damage = num;
val.position = self.victimBody.corePosition;
val.force = Vector3.zero;
val.crit = false;
val.procChainMask = default(ProcChainMask);
val.procCoefficient = 1f;
val.damageColorIndex = (DamageColorIndex)8;
val.damageType = (DamageType)0;
self.victimBody.healthComponent.TakeDamage(val);
EffectManager.SpawnEffect(lightsOutEffect, new EffectData
{
origin = self.victimBody.corePosition,
scale = self.victimBody.radius
}, true);
}
}
private void ModifyFire(orig_FireBullet orig, FireShotgun2 self, Ray aimRay)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: 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_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
((BaseState)self).StartAimMode(aimRay, 3f, false);
((GenericBulletBaseState)self).DoFireEffects();
((GenericBulletBaseState)self).PlayFireAnimation();
((BaseState)self).AddRecoil(-1f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1.5f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1f * ((GenericBulletBaseState)self).recoilAmplitudeX, 1f * ((GenericBulletBaseState)self).recoilAmplitudeX);
if (((EntityState)self).isAuthority)
{
Vector3 val = Vector3.Cross(((Ray)(ref aimRay)).direction, Vector3.up);
float num = 5f;
Ray val5 = default(Ray);
for (int i = 0; i < ((GenericBulletBaseState)self).bulletCount; i++)
{
float num2 = Random.Range((0f - num) / 2f, num / 2f);
float num3 = Random.Range((0f - num) / 2f, num / 2f);
Quaternion val2 = Quaternion.AngleAxis(num2, Vector3.up);
Quaternion val3 = Quaternion.AngleAxis(num3, val);
Vector3 val4 = val2 * val3 * ((Ray)(ref aimRay)).direction;
((Ray)(ref val5))..ctor(((Ray)(ref aimRay)).origin, val4);
BulletAttack val6 = ((GenericBulletBaseState)self).GenerateBulletAttack(val5);
((GenericBulletBaseState)self).ModifyBullet(val6);
val6.Fire();
}
}
}
private void IncreaseHemorrhageStacks(orig_AuthorityModifyOverlapAttack orig, SlashBlade self, OverlapAttack overlapAttack)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
DamageAPI.AddModdedDamageType(overlapAttack, banditDoubleHemorrhage);
orig.Invoke(self, overlapAttack);
}
private void ApplyNewDamageTypes(orig_SendDamageDealt orig, DamageReport damageReport)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditOpenWound) && Object.op_Implicit((Object)(object)damageReport.victimBody))
{
DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, emptyDotIdx, 0f, 1f, (uint?)null);
}
if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditDoubleHemorrhage) && damageReport.damageInfo.crit && Object.op_Implicit((Object)(object)damageReport.victimBody))
{
DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, (DotIndex)6, 8f, 1f, (uint?)null);
}
orig.Invoke(damageReport);
}
private void ReduceRecoil(orig_OnEnter orig, Bandit2FirePrimaryBase self)
{
if (self is Bandit2FireRifle)
{
((GenericBulletBaseState)self).spreadBloomValue = 0.65f;
((GenericBulletBaseState)self).spreadYawScale = 0.25f;
((GenericBulletBaseState)self).spreadPitchScale = 0.3f;
}
orig.Invoke(self);
}
}
}