using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using Bastian;
using BepInEx;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.Merc;
using HarmonyLib;
using KinematicCharacterController;
using R2API;
using RoR2;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Faji'sBastianRework")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP")]
[assembly: AssemblyProduct("Faji'sBastianRework")]
[assembly: AssemblyCopyright("Copyright © HP 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e7143390-952a-4efc-910e-7b0468bfa1ce")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace BastianPatch;
public static class BastianOverrides
{
public static void Apply()
{
Debug.Log((object)"[BastianPatch] Apply() called");
LanguageAPI.Add("BASTIAN_M2", "Ion Burst / Ion Channel");
LanguageAPI.Add("BASTIAN_M2_DESCRIPTION", "<style=cIsUtility>TAP:</style> Fire a quick ion shot for <style=cIsDamage>200% damage</style>.\n<style=cIsUtility>HOLD:</style> Sacrifice a portion of your health to greatly increase damage. If you have at least <style=cIsUtility>2 Ion Charges</style>, the shot ricochets to another target. Each additional 2 charges adds another bounce, up to <style=cIsUtility>5 total targets</style> at <style=cIsUtility>10 Ion Charges</style>.");
LanguageAPI.Add("BASTIAN_UTIL", "Dash / Empowered Dash");
LanguageAPI.Add("BASTIAN_UTIL_DESCRIPTION", "<style=cIsUtility>TAP:</style> Dash forward, <style=cIsUtility>stunning</style> nearby enemies.\n<style=cIsUtility>HOLD:</style> Sacrifice health to trigger a powerful explosion. Consumes <style=cIsUtility>15 Ion Charges</style> to grant the <style=cIsUtility>Evasive</style> buff to yourself and nearby allies, enhancing mobility and survivability.");
LanguageAPI.Add("BASTIAN_SPEC", "Ion Release / Ion Detonation");
LanguageAPI.Add("BASTIAN_SPEC_DESCRIPTION", "<style=cIsUtility>TAP:</style> Consume all Ion to heal based on stacks and gain speed. <style=cIsUtility>While this skill is recharging, you cannot generate Ion Charges.</style>\n<style=cIsUtility>HOLD:</style> Sacrifice health to unleash a massive explosion, granting team buffs. <style=cIsUtility>While this skill is recharging, you cannot generate Ion Charges.</style>");
LanguageAPI.Add("BASTIAN_SPEC_KEYWORD", "Evasive: Gain <style=cIsUtility>35% movement speed</style>, <style=cIsUtility>+X% regen</style>, and augment your abilities. While active, Ion gain is halved.");
}
}
[BepInPlugin("com.OnlyFaji.bastianpatch", "Bastian Patch", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public const string PluginGuid = "com.OnlyFaji.bastianpatch";
public const string PluginName = "Bastian Patch";
public const string PluginVersion = "1.0.0";
public static BuffDef HiddenInvincibility;
public static BuffDef SpeedBuff;
public static uint DashFastEventId;
public static GameObject ExplosionEffectPrefab;
private void Awake()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
new Harmony("com.OnlyFaji.bastianpatch").PatchAll();
RicochetHandler.InitConfig(((BaseUnityPlugin)this).Config);
Language.onCurrentLanguageChanged += BastianOverrides.Apply;
Type type = AccessTools.TypeByName("Bastian.Prefabs");
if (type == null)
{
((BaseUnityPlugin)this).Logger.LogError((object)"[BastianPatch] Could not find Bastian.Prefabs!");
return;
}
object? value = AccessTools.Field(type, "muzzleflash").GetValue(null);
TapSecondary.muzzleflash = (GameObject)((value is GameObject) ? value : null);
object? value2 = AccessTools.Field(type, "tracer").GetValue(null);
TapSecondary.tracer = (GameObject)((value2 is GameObject) ? value2 : null);
object? value3 = AccessTools.Field(type, "bulletImpact").GetValue(null);
TapSecondary.bulletImpact = (GameObject)((value3 is GameObject) ? value3 : null);
HoldSecondary.muzzleflash = TapSecondary.muzzleflash;
HoldSecondary.tracer = TapSecondary.tracer;
HoldSecondary.bulletImpact = TapSecondary.bulletImpact;
object? value4 = AccessTools.Field(type, "speed").GetValue(null);
SpeedBuff = (BuffDef)((value4 is BuffDef) ? value4 : null);
object? value5 = AccessTools.Field(type, "explosionEffect").GetValue(null);
ExplosionEffectPrefab = (GameObject)((value5 is GameObject) ? value5 : null);
Type type2 = AccessTools.TypeByName("Bastian.Buffs");
if (type2 != null)
{
object? value6 = AccessTools.Field(type2, "HiddenInvincibility").GetValue(null);
HiddenInvincibility = (BuffDef)((value6 is BuffDef) ? value6 : null);
}
Type type3 = AccessTools.TypeByName("Bastian.Sounds");
if (type3 != null)
{
FieldInfo fieldInfo = AccessTools.Field(type3, "Play_Bastian_DashFast");
if (fieldInfo != null)
{
DashFastEventId = (uint)fieldInfo.GetValue(null);
}
}
Type type4 = AccessTools.TypeByName("Bastian.Configs");
if (type4 == null)
{
((BaseUnityPlugin)this).Logger.LogError((object)"[BastianPatch] Could not find Bastian.Configs!");
return;
}
FieldInfo fieldInfo2 = AccessTools.Field(type4, "M2_Damage");
if (fieldInfo2 != null)
{
object value7 = fieldInfo2.GetValue(null);
if (value7 != null)
{
PropertyInfo property = value7.GetType().GetProperty("Value");
if (property != null)
{
float num = (HoldSecondary.baseDamageCoefficient = (TapSecondary.damageCoefficient = (float)property.GetValue(value7)));
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[BastianPatch] Configs: M2_Damage={num}");
}
}
}
HoldUtilityDash.sacrificePercent = ((BaseUnityPlugin)this).Config.Bind<float>("Utility", "SacrificePercent", 0.25f, "Fraction of current HP to sacrifice on Hold Utility Dash").Value;
HoldUtilityDash.baseDamageCoefficient = ((BaseUnityPlugin)this).Config.Bind<float>("Utility", "BaseDamageCoefficient", 5f, "Base damage coefficient for Hold Utility Dash (500% = 5.0)").Value;
HoldUtilityDash.sacrificeScaling = ((BaseUnityPlugin)this).Config.Bind<float>("Utility", "SacrificeScaling", 0.01f, "Scaling factor applied per HP lost for Hold Utility Dash").Value;
TapSpecial.healPerStack = ((BaseUnityPlugin)this).Config.Bind<float>("Special", "Tap_HealPerIonStack", 0.01f, "Heal fraction of max HP per Ion stack consumed on Tap Special (0.01 = 1%)").Value;
HoldSpecial.sacrificePercent = ((BaseUnityPlugin)this).Config.Bind<float>("Special", "Hold_SacrificePercent", 0.75f, "Fraction of current HP to sacrifice on Hold Special (0.75 = 75%)").Value;
HoldSpecial.baseDamageCoefficient = ((BaseUnityPlugin)this).Config.Bind<float>("Special", "Hold_BaseDamageCoefficient", 5f, "Base damage coefficient for Hold Special (500% = 5.0)").Value;
HoldSpecial.ionScaling = ((BaseUnityPlugin)this).Config.Bind<float>("Special", "Hold_IonScalingPerStack", 50f, "Additive damage coefficient gained per Ion stack consumed on Hold Special").Value;
HoldSpecial.sacrificeScaling = ((BaseUnityPlugin)this).Config.Bind<float>("Special", "Hold_SacrificeScaling", 0.01f, "Additive damage coefficient gained per HP lost on Hold Special").Value;
RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: 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_00bc: 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_0131: Unknown result type (might be due to invalid IL or missing references)
SkillDef val = SkillCatalog.allSkillDefs.FirstOrDefault((Func<SkillDef, bool>)((SkillDef sd) => sd.skillNameToken == "BASTIAN_M2"));
if ((Object)(object)val != (Object)null)
{
val.activationState = new SerializableEntityStateType(typeof(SecondaryDispatcher));
val.activationStateMachineName = "Weapon";
val.baseMaxStock = 8;
val.stockToConsume = 0;
val.beginSkillCooldownOnSkillEnd = true;
val.mustKeyPress = true;
}
SkillDef val2 = SkillCatalog.allSkillDefs.FirstOrDefault((Func<SkillDef, bool>)((SkillDef sd) => sd.skillNameToken == "BASTIAN_UTIL"));
if ((Object)(object)val2 != (Object)null)
{
val2.activationState = new SerializableEntityStateType(typeof(UtilityDispatcher));
val2.activationStateMachineName = "Body";
val2.baseMaxStock = 3;
val2.stockToConsume = 0;
val2.beginSkillCooldownOnSkillEnd = true;
val2.mustKeyPress = true;
}
SkillDef val3 = SkillCatalog.allSkillDefs.FirstOrDefault((Func<SkillDef, bool>)((SkillDef sd) => sd.skillNameToken == "BASTIAN_SPEC"));
if ((Object)(object)val3 != (Object)null)
{
val3.activationState = new SerializableEntityStateType(typeof(SpecialDispatcher));
val3.activationStateMachineName = "Body";
val3.baseMaxStock = 1;
val3.stockToConsume = 0;
val3.beginSkillCooldownOnSkillEnd = true;
val3.mustKeyPress = true;
}
});
}
private void Start()
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"[BastianPatch] Calling Apply() in Start()");
BastianOverrides.Apply();
}
}
[HarmonyPatch(typeof(BlastDamageBuildupController), "FillChargeAuthority")]
public static class BlastChargePatch
{
private static bool Prefix(BlastDamageBuildupController __instance)
{
CharacterBody component = ((Component)__instance).GetComponent<CharacterBody>();
if ((Object)(object)component == (Object)null)
{
return true;
}
SkillLocator skillLocator = component.skillLocator;
if ((Object)(object)skillLocator == (Object)null || (Object)(object)skillLocator.special == (Object)null)
{
return true;
}
if (skillLocator.special.cooldownRemaining > 0f)
{
return false;
}
return true;
}
}
public class HoldSecondary : BaseSkillState
{
public static GameObject muzzleflash;
public static GameObject tracer;
public static GameObject bulletImpact;
public static float baseDamageCoefficient = 2f;
public static float sacrificePercent = 0.15f;
public static float sacrificeScaling = 0.007f;
private float duration;
private bool hasFired;
public override void OnEnter()
{
((BaseState)this).OnEnter();
duration = 0.5f / ((BaseState)this).attackSpeedStat;
Debug.Log((object)"[BastianPatch] Entered HoldSecondary state!");
if ((Object)(object)((EntityState)this).skillLocator?.secondary != (Object)null && ((EntityState)this).skillLocator.secondary.stock > 0)
{
((EntityState)this).skillLocator.secondary.DeductStock(1);
}
((EntityState)this).PlayAnimation("Gesture, Aimed", "Shoot", "M2", duration, 0f);
((EntityState)this).PlayAnimation("Gesture, Override", "BufferEmpty");
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (!hasFired && ((EntityState)this).fixedAge >= 0.1f * duration)
{
hasFired = true;
FireEmpoweredBullet();
}
if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
private void FireEmpoweredBullet()
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//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_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Expected O, but got Unknown
//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_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: 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_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: 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_0164: 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_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_019a: Expected O, but got Unknown
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Expected O, but got Unknown
Util.PlaySound("Play_Bastian_Fire", ((EntityState)this).gameObject);
EffectManager.SimpleMuzzleFlash(muzzleflash, ((EntityState)this).gameObject, "fingerMuzzle", false);
CharacterBody characterBody = ((EntityState)this).characterBody;
if ((Object)(object)((characterBody != null) ? characterBody.healthComponent : null) == (Object)null)
{
return;
}
float num = ((EntityState)this).characterBody.healthComponent.health * sacrificePercent;
((EntityState)this).characterBody.healthComponent.TakeDamage(new DamageInfo
{
damage = num,
damageType = DamageTypeCombo.op_Implicit((DamageType)1),
attacker = ((EntityState)this).gameObject,
inflictor = ((EntityState)this).gameObject
});
float num2 = num * sacrificeScaling;
float num3 = baseDamageCoefficient + num2;
float finalDamage = num3 * ((BaseState)this).damageStat;
Ray aimRay = ((BaseState)this).GetAimRay();
bool crit = ((BaseState)this).RollCrit();
if (!((EntityState)this).isAuthority)
{
return;
}
BulletAttack val = new BulletAttack
{
owner = ((EntityState)this).gameObject,
weapon = ((EntityState)this).gameObject,
origin = ((Ray)(ref aimRay)).origin,
aimVector = ((Ray)(ref aimRay)).direction,
damage = finalDamage,
isCrit = crit,
tracerEffectPrefab = tracer,
hitEffectPrefab = bulletImpact,
muzzleName = "fingerMuzzle",
force = 150f,
procCoefficient = 0.6f,
maxDistance = 100f,
radius = 1f,
falloffModel = (FalloffModel)0
};
val.hitCallback = (HitCallback)delegate(BulletAttack ba, ref BulletHit hitInfo)
{
if (Object.op_Implicit((Object)(object)hitInfo.hitHurtBox))
{
RicochetHandler.HandleRicochet(((EntityState)this).characterBody, hitInfo.hitHurtBox, finalDamage, crit, null);
}
return BulletAttack.defaultHitCallback.Invoke(ba, ref hitInfo);
};
val.Fire();
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
public class HoldSpecial : BaseSkillState
{
public float charge;
public static float sacrificePercent = 0.75f;
public static float baseDamageCoefficient = 5f;
public static float ionScaling = 0.4f;
public static float sacrificeScaling = 0.01f;
private float duration = 0.35f;
private float fireDelay;
private bool hasFired;
public override void OnEnter()
{
((BaseState)this).OnEnter();
if ((Object)(object)((EntityState)this).skillLocator != (Object)null && (Object)(object)((EntityState)this).skillLocator.special != (Object)null)
{
((EntityState)this).skillLocator.special.DeductStock(1);
}
duration /= ((BaseState)this).attackSpeedStat;
fireDelay = duration * 0.16f;
((EntityState)this).PlayCrossfade("FullBody, Override", "Release", "Special", duration, duration * 0.1f);
}
public override void FixedUpdate()
{
//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_0091: 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_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: 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_00a9: 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_00c6: Expected O, but got Unknown
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: 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_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: 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_017b: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: 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_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
//IL_01e3: Expected O, but got Unknown
((EntityState)this).FixedUpdate();
if (((EntityState)this).fixedAge < fireDelay && Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.velocity = Vector3.zero;
}
if (((EntityState)this).fixedAge >= fireDelay && !hasFired)
{
hasFired = true;
if (((EntityState)this).isAuthority)
{
float num = ((EntityState)this).characterBody.healthComponent.health * sacrificePercent;
((EntityState)this).characterBody.healthComponent.TakeDamage(new DamageInfo
{
damage = num,
damageType = DamageTypeCombo.op_Implicit((DamageType)1),
attacker = ((EntityState)this).gameObject,
inflictor = ((EntityState)this).gameObject
});
BlastDamageBuildupController component = ((Component)((EntityState)this).characterBody).GetComponent<BlastDamageBuildupController>();
int num2 = 0;
if ((Object)(object)component != (Object)null)
{
num2 = Mathf.FloorToInt(component.charge);
component.charge = 0f;
component.SyncCheckBuffs(0f);
}
float num3 = baseDamageCoefficient + (float)num2 * ionScaling;
float num4 = num * sacrificeScaling;
float num5 = num3 + num4;
float baseDamage = num5 * ((BaseState)this).damageStat;
new BlastAttack
{
attacker = ((EntityState)this).gameObject,
inflictor = ((EntityState)this).gameObject,
teamIndex = ((EntityState)this).teamComponent.teamIndex,
baseDamage = baseDamage,
radius = 75f,
position = ((EntityState)this).characterBody.corePosition,
falloffModel = (FalloffModel)0,
procCoefficient = 1f
}.Fire();
if ((Object)(object)Plugin.ExplosionEffectPrefab != (Object)null)
{
EffectManager.SpawnEffect(Plugin.ExplosionEffectPrefab, new EffectData
{
origin = ((EntityState)this).characterBody.corePosition,
scale = 75f
}, true);
}
((BaseState)this).SmallHop(((EntityState)this).characterMotor, ((EntityState)this).characterBody.jumpPower);
}
}
if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
internal class HoldSpecialStart : BaseSkillState
{
private float duration = 1f;
private AimRequest aimRequest;
private bool success;
private float charge;
public override void OnEnter()
{
//IL_0079: 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)
((BaseState)this).OnEnter();
duration /= ((BaseState)this).attackSpeedStat;
((EntityState)this).PlayAnimation("FullBody, Override", "Charge", "Special", duration, 0f);
AkSoundEngine.PostEvent(Plugin.DashFastEventId, ((EntityState)this).gameObject);
Transform val = ((BaseState)this).FindModelChild("center");
if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)Plugin.ExplosionEffectPrefab))
{
Object.Instantiate<GameObject>(Plugin.ExplosionEffectPrefab, val.position, Quaternion.identity, val);
}
if ((Object)(object)((EntityState)this).cameraTargetParams != (Object)null)
{
aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2);
}
if ((Object)(object)((EntityState)this).characterMotor != (Object)null)
{
((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground(0.1f);
((BaseState)this).SmallHop(((EntityState)this).characterMotor, 16f);
}
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && ((EntityState)this).isAuthority)
{
((EntityState)this).characterMotor.velocity.y += 11f * Time.deltaTime;
}
if (((EntityState)this).fixedAge >= duration)
{
success = true;
if (((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextState((EntityState)(object)new HoldSpecial
{
charge = charge
});
}
}
}
public override void OnExit()
{
((EntityState)this).OnExit();
AimRequest obj = aimRequest;
if (obj != null)
{
obj.Dispose();
}
if (!success)
{
((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty");
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return (InterruptPriority)1;
}
public override void OnSerialize(NetworkWriter writer)
{
((BaseSkillState)this).OnSerialize(writer);
writer.Write(charge);
}
public override void OnDeserialize(NetworkReader reader)
{
((BaseSkillState)this).OnDeserialize(reader);
charge = reader.ReadSingle();
}
}
internal class HoldUtilityDash : BaseSkillState
{
private Vector3 dashVector;
private float duration = 0.35f;
private bool appliedEffects;
private bool stoppedEarly;
public static float sacrificePercent = 0.25f;
public static float sacrificeScaling = 0.01f;
public static float baseDamageCoefficient = 5f;
public override void OnEnter()
{
//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_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)
((BaseState)this).OnEnter();
if ((Object)(object)((EntityState)this).skillLocator?.utility != (Object)null)
{
((EntityState)this).skillLocator.utility.DeductStock(1);
}
((EntityState)this).PlayAnimation("FullBody, Override", "Dash", "Utility", duration * 3f, 0f);
if (NetworkServer.active && (Object)(object)Plugin.HiddenInvincibility != (Object)null)
{
((EntityState)this).characterBody.AddBuff(Plugin.HiddenInvincibility);
}
Vector3 aimDirection = ((EntityState)this).inputBank.aimDirection;
dashVector = ((Vector3)(ref aimDirection)).normalized;
}
public override void FixedUpdate()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: 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_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: 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_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
((EntityState)this).FixedUpdate();
if (!stoppedEarly && (Object)(object)((EntityState)this).characterMotor != (Object)null)
{
CharacterMotor characterMotor = ((EntityState)this).characterMotor;
characterMotor.rootMotion += dashVector * (((BaseState)this).moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime);
Vector3 position = ((EntityState)this).transform.position;
Vector3 val = dashVector;
LayerIndex val2 = LayerIndex.world;
int num = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask);
val2 = LayerIndex.entityPrecise;
RaycastHit val3 = default(RaycastHit);
if (Physics.SphereCast(position, 1f, val, ref val3, 1.5f, num | LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask)))
{
stoppedEarly = true;
}
}
if (!appliedEffects && (((EntityState)this).fixedAge >= duration || stoppedEarly) && ((EntityState)this).isAuthority)
{
appliedEffects = true;
DoEmpoweredEffects();
}
if ((((EntityState)this).fixedAge >= duration || stoppedEarly) && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextStateToMain();
}
}
private void DoEmpoweredEffects()
{
//IL_0023: 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)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: 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_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Expected O, but got Unknown
//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)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: 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_00d5: 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_00f7: 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_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Expected O, but got Unknown
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
float num = ((EntityState)this).characterBody.healthComponent.health * sacrificePercent;
((EntityState)this).characterBody.healthComponent.TakeDamage(new DamageInfo
{
damage = num,
damageType = DamageTypeCombo.op_Implicit((DamageType)1),
attacker = ((EntityState)this).gameObject,
inflictor = ((EntityState)this).gameObject
});
float num2 = num * sacrificeScaling;
float num3 = baseDamageCoefficient + num2;
float baseDamage = num3 * ((BaseState)this).damageStat;
new BlastAttack
{
attacker = ((EntityState)this).gameObject,
inflictor = ((EntityState)this).gameObject,
teamIndex = ((EntityState)this).teamComponent.teamIndex,
baseDamage = baseDamage,
radius = 20f,
position = ((EntityState)this).characterBody.corePosition,
falloffModel = (FalloffModel)0,
procCoefficient = 0.6f
}.Fire();
if ((Object)(object)Plugin.ExplosionEffectPrefab != (Object)null)
{
EffectManager.SpawnEffect(Plugin.ExplosionEffectPrefab, new EffectData
{
origin = ((EntityState)this).characterBody.corePosition,
scale = 20f
}, true);
}
((EntityState)this).PlayCrossfade("FullBody, Override", "Release", "Special", 0.35f, 0.1f);
((BaseState)this).SmallHop(((EntityState)this).characterMotor, ((EntityState)this).characterBody.jumpPower);
BlastDamageBuildupController component = ((Component)((EntityState)this).characterBody).GetComponent<BlastDamageBuildupController>();
if (!((Object)(object)component != (Object)null) || !(component.charge >= 15f))
{
return;
}
component.charge -= 15f;
component.SyncCheckBuffs(component.charge);
if (!((Object)(object)Plugin.SpeedBuff != (Object)null))
{
return;
}
foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers(((EntityState)this).teamComponent.teamIndex))
{
if (Vector3.Distance(teamMember.body.corePosition, ((EntityState)this).characterBody.corePosition) <= 20f)
{
teamMember.body.AddTimedBuff(Plugin.SpeedBuff, 10f);
}
}
}
public override void OnExit()
{
if (NetworkServer.active && (Object)(object)Plugin.HiddenInvincibility != (Object)null)
{
((EntityState)this).characterBody.RemoveBuff(Plugin.HiddenInvincibility);
}
((EntityState)this).OnExit();
}
}
internal class HoldUtilityStart : BaseState
{
private float duration = 0.29f;
public override void OnEnter()
{
//IL_0031: 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)
((BaseState)this).OnEnter();
duration /= base.attackSpeedStat;
if ((Object)(object)((EntityState)this).characterMotor != (Object)null)
{
((EntityState)this).characterMotor.velocity = Vector3.zero;
}
((EntityState)this).PlayAnimation("FullBody, Override", "Dash Windup", "Utility", duration, 0f);
if (Plugin.DashFastEventId != 0)
{
AkSoundEngine.PostEvent(Plugin.DashFastEventId, ((EntityState)this).gameObject);
}
((EntityState)this).characterBody.SetAimTimer(0f);
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextState((EntityState)(object)new HoldUtilityDash());
}
}
}
public static class RicochetHandler
{
private static ConfigEntry<int> MaxBounces;
private static ConfigEntry<float> BounceRadius;
private static ConfigEntry<int> ChargeCostPerBounce;
private static readonly GameObject Tracer = (GameObject)AccessTools.Field(AccessTools.TypeByName("Bastian.Prefabs"), "tracer").GetValue(null);
public static void InitConfig(ConfigFile config)
{
MaxBounces = config.Bind<int>("Ricochet", "MaxBounces", 5, "Maximum number of ricochet bounces");
BounceRadius = config.Bind<float>("Ricochet", "BounceRadius", 40f, "Maximum distance (meters) to search for the next ricochet target");
ChargeCostPerBounce = config.Bind<int>("Ricochet", "ChargeCostPerBounce", 2, "Ion charges consumed per ricochet bounce");
}
public static void HandleRicochet(CharacterBody attackerBody, HurtBox initialTarget, float baseDamage, bool isCrit, object damageTypeCombo)
{
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: 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_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: 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_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: 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_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: 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_017e: 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_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
//IL_0192: Unknown result type (might be due to invalid IL or missing references)
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Expected O, but got Unknown
//IL_00fc: 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_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0201: Expected O, but got Unknown
BlastDamageBuildupController component = ((Component)attackerBody).GetComponent<BlastDamageBuildupController>();
if ((Object)(object)component == (Object)null)
{
return;
}
int num = (int)component.charge;
int num2 = Mathf.Min(MaxBounces.Value, num / ChargeCostPerBounce.Value);
if (num2 <= 0)
{
return;
}
HashSet<HurtBox> hashSet = new HashSet<HurtBox> { initialTarget };
HurtBox val = initialTarget;
for (int i = 0; i < num2; i++)
{
HurtBox val2 = FindNextTarget(val, hashSet, BounceRadius.Value);
if ((Object)(object)val2 == (Object)null)
{
break;
}
component.charge -= (float)ChargeCostPerBounce.Value;
if (component.charge < 0f)
{
component.charge = 0f;
}
component.SyncCheckBuffs(component.charge);
hashSet.Add(val2);
DamageType val3 = (DamageType)0;
if (damageTypeCombo is DamageTypeCombo val4)
{
val3 = val4.damageType;
}
Vector3 val5 = ((Component)val2).transform.position - ((Component)val).transform.position;
Vector3 normalized = ((Vector3)(ref val5)).normalized;
BulletAttack val6 = new BulletAttack
{
owner = ((Component)attackerBody).gameObject,
weapon = ((Component)attackerBody).gameObject,
origin = ((Component)val).transform.position,
aimVector = normalized,
damage = baseDamage,
isCrit = isCrit,
procCoefficient = 0.6f,
damageType = DamageTypeCombo.op_Implicit(val3),
falloffModel = (FalloffModel)0,
maxDistance = BounceRadius.Value,
radius = 1f,
tracerEffectPrefab = Tracer
};
val6.Fire();
if ((Object)(object)Tracer != (Object)null)
{
EffectData val7 = new EffectData
{
origin = ((Component)val).transform.position,
start = ((Component)val2).transform.position
};
val7.SetHurtBoxReference(val2);
EffectManager.SpawnEffect(Tracer, val7, true);
}
val = val2;
}
}
private static HurtBox FindNextTarget(HurtBox from, HashSet<HurtBox> alreadyHit, float radius)
{
//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_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: 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_0018: 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_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: 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_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: 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_0058: Expected O, but got Unknown
BullseyeSearch val = new BullseyeSearch
{
searchOrigin = ((Component)from).transform.position,
searchDirection = Vector3.zero,
maxDistanceFilter = radius,
teamMaskFilter = TeamMask.GetEnemyTeams(from.healthComponent.body.teamComponent.teamIndex),
sortMode = (SortMode)1,
filterByLoS = false
};
val.RefreshCandidates();
List<HurtBox> list = val.GetResults().ToList();
if (list.Count <= 1)
{
return null;
}
foreach (HurtBox item in list)
{
if (!alreadyHit.Contains(item))
{
return item;
}
}
foreach (HurtBox item2 in list)
{
if ((Object)(object)item2 != (Object)(object)from)
{
return item2;
}
}
return null;
}
}
public class SecondaryDispatcher : BaseSkillState
{
private bool transitioned;
public static float HoldThreshold = 0.25f;
public override void OnEnter()
{
((BaseState)this).OnEnter();
transitioned = false;
Debug.Log((object)"[BastianPatch] Entered SecondaryDispatcher state!");
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (!transitioned)
{
if (!((EntityState)this).inputBank.skill2.down)
{
Debug.Log((object)"[BastianPatch] Branching to TapSecondary");
((EntityState)this).outer.SetNextState((EntityState)(object)new TapSecondary());
transitioned = true;
}
else if (((EntityState)this).fixedAge >= HoldThreshold)
{
Debug.Log((object)"[BastianPatch] Branching to HoldSecondary");
((EntityState)this).outer.SetNextState((EntityState)(object)new HoldSecondary());
transitioned = true;
}
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
public class SpecialDispatcher : BaseSkillState
{
private float pressStartTime;
private bool transitioned;
public static float HoldThreshold = 0.2f;
public override void OnEnter()
{
((BaseState)this).OnEnter();
pressStartTime = Time.time;
transitioned = false;
Debug.Log((object)"[BastianPatch] Entered SpecialDispatcher state!");
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (!transitioned)
{
if (!((EntityState)this).inputBank.skill4.down)
{
Debug.Log((object)"[BastianPatch] Branching to TapSpecial");
((EntityState)this).outer.SetNextState((EntityState)(object)new TapSpecial());
transitioned = true;
}
else if (Time.time - pressStartTime >= HoldThreshold)
{
Debug.Log((object)"[BastianPatch] Branching to HoldSpecialStart");
((EntityState)this).outer.SetNextState((EntityState)(object)new HoldSpecialStart());
transitioned = true;
}
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
public class TapSecondary : BaseSkillState
{
public static GameObject muzzleflash;
public static GameObject tracer;
public static GameObject bulletImpact;
public static float damageCoefficient = 2f;
private float duration;
public override void OnEnter()
{
((BaseState)this).OnEnter();
duration = 0.5f / ((BaseState)this).attackSpeedStat;
Debug.Log((object)"[BastianPatch] Entered TapSecondary state!");
if (Object.op_Implicit((Object)(object)((EntityState)this).skillLocator) && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.secondary))
{
((EntityState)this).skillLocator.secondary.DeductStock(1);
}
((EntityState)this).PlayAnimation("Gesture, Aimed", "Shoot", "M2", duration, 0f);
((EntityState)this).PlayAnimation("Gesture, Override", "BufferEmpty");
FireBullet();
((EntityState)this).outer.SetNextStateToMain();
}
private void FireBullet()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: 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_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: 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_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: 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_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: 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_00b5: 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_00cb: 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_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
Util.PlaySound("Play_Bastian_Fire", ((EntityState)this).gameObject);
EffectManager.SimpleMuzzleFlash(muzzleflash, ((EntityState)this).gameObject, "fingerMuzzle", false);
Ray aimRay = ((BaseState)this).GetAimRay();
if (((EntityState)this).isAuthority)
{
new BulletAttack
{
owner = ((EntityState)this).gameObject,
weapon = ((EntityState)this).gameObject,
origin = ((Ray)(ref aimRay)).origin,
aimVector = ((Ray)(ref aimRay)).direction,
damage = damageCoefficient * ((BaseState)this).damageStat,
isCrit = ((BaseState)this).RollCrit(),
tracerEffectPrefab = tracer,
hitEffectPrefab = bulletImpact,
muzzleName = "fingerMuzzle",
force = 150f,
procCoefficient = 0.6f,
maxDistance = 100f,
radius = 1f,
falloffModel = (FalloffModel)0
}.Fire();
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
public class TapSpecial : BaseSkillState
{
public static float healPerStack = 0.01f;
public override void OnEnter()
{
//IL_00cf: 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_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
((BaseState)this).OnEnter();
if ((Object)(object)((EntityState)this).skillLocator?.special != (Object)null)
{
((EntityState)this).skillLocator.special.DeductStock(1);
}
BlastDamageBuildupController component = ((Component)((EntityState)this).characterBody).GetComponent<BlastDamageBuildupController>();
if ((Object)(object)component != (Object)null && component.charge > 0f)
{
int num = Mathf.FloorToInt(component.charge);
component.charge = 0f;
component.SyncCheckBuffs(0f);
CharacterBody characterBody = ((EntityState)this).characterBody;
if ((Object)(object)((characterBody != null) ? characterBody.healthComponent : null) != (Object)null)
{
float num2 = ((EntityState)this).characterBody.healthComponent.fullHealth * healPerStack * (float)num;
((EntityState)this).characterBody.healthComponent.Heal(num2, default(ProcChainMask), true);
}
if ((Object)(object)Plugin.SpeedBuff != (Object)null)
{
((EntityState)this).characterBody.AddTimedBuff(Plugin.SpeedBuff, 10f);
}
if ((Object)(object)Plugin.ExplosionEffectPrefab != (Object)null)
{
GameObject val = Object.Instantiate<GameObject>(Plugin.ExplosionEffectPrefab, ((EntityState)this).characterBody.corePosition, Quaternion.identity);
val.transform.localScale = Vector3.one * 10f;
val.AddComponent<ImplodeEffect>();
}
}
((EntityState)this).outer.SetNextStateToMain();
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}
public class ImplodeEffect : MonoBehaviour
{
private float lifetime = 0.5f;
private float age;
private Vector3 startScale;
private void Start()
{
//IL_0007: 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)
startScale = ((Component)this).transform.localScale;
}
private void Update()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: 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)
age += Time.deltaTime;
float num = age / lifetime;
((Component)this).transform.localScale = Vector3.Lerp(startScale, Vector3.zero, num);
if (age >= lifetime)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
internal class TapUtilityDash : BaseSkillState
{
private Vector3 dashVector;
private float duration = 0.35f;
private readonly float stunRadius = 5f;
public override void OnEnter()
{
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
((BaseState)this).OnEnter();
if ((Object)(object)((EntityState)this).skillLocator != (Object)null && (Object)(object)((EntityState)this).skillLocator.utility != (Object)null)
{
((EntityState)this).skillLocator.utility.DeductStock(1);
}
((EntityState)this).PlayAnimation("FullBody, Override", "Dash", "Utility", duration * 3f, 0f);
if (NetworkServer.active && (Object)(object)Plugin.HiddenInvincibility != (Object)null)
{
((EntityState)this).characterBody.AddBuff(Plugin.HiddenInvincibility);
}
dashVector = ((EntityState)this).inputBank.aimDirection;
}
public override void FixedUpdate()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: 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_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: 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_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: 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_00d8: 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)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
((EntityState)this).FixedUpdate();
if ((Object)(object)((EntityState)this).characterMotor != (Object)null)
{
CharacterMotor characterMotor = ((EntityState)this).characterMotor;
characterMotor.rootMotion += dashVector * (((BaseState)this).moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime);
}
if (NetworkServer.active)
{
Vector3 position = ((EntityState)this).transform.position;
float num = stunRadius;
LayerIndex entityPrecise = LayerIndex.entityPrecise;
Collider[] array = Physics.OverlapSphere(position, num, LayerMask.op_Implicit(((LayerIndex)(ref entityPrecise)).mask));
Collider[] array2 = array;
foreach (Collider val in array2)
{
HurtBox component = ((Component)val).GetComponent<HurtBox>();
if ((Object)(object)component != (Object)null && (Object)(object)component.healthComponent != (Object)null && component.healthComponent.alive)
{
TeamMask enemyTeams = TeamMask.GetEnemyTeams(((EntityState)this).teamComponent.teamIndex);
if (((TeamMask)(ref enemyTeams)).HasTeam(component.healthComponent.body.teamComponent.teamIndex))
{
SetStateOnHurt.SetStunOnObject(((Component)component.healthComponent).gameObject, 1f);
}
}
}
}
if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
{
((EntityState)this).PlayCrossfade("FullBody, Override", "Release", "Special", 0.35f, 0.1f);
((BaseState)this).SmallHop(((EntityState)this).characterMotor, ((EntityState)this).characterBody.jumpPower * 0.5f);
((EntityState)this).outer.SetNextStateToMain();
}
}
public override void OnExit()
{
if (NetworkServer.active && (Object)(object)Plugin.HiddenInvincibility != (Object)null)
{
((EntityState)this).characterBody.RemoveBuff(Plugin.HiddenInvincibility);
}
((EntityState)this).OnExit();
}
}
internal class TapUtilityStart : BaseState
{
private float duration = 0.29f;
public override void OnEnter()
{
//IL_0031: 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)
((BaseState)this).OnEnter();
duration /= base.attackSpeedStat;
if ((Object)(object)((EntityState)this).characterMotor != (Object)null)
{
((EntityState)this).characterMotor.velocity = Vector3.zero;
}
((EntityState)this).PlayAnimation("FullBody, Override", "Dash Windup", "Utility", duration, 0f);
if (Plugin.DashFastEventId != 0)
{
AkSoundEngine.PostEvent(Plugin.DashFastEventId, ((EntityState)this).gameObject);
}
((EntityState)this).characterBody.SetAimTimer(0f);
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority)
{
((EntityState)this).outer.SetNextState((EntityState)(object)new TapUtilityDash());
}
}
}
public class UtilityDispatcher : BaseSkillState
{
private float pressStartTime;
private bool transitioned;
public static float HoldThreshold = 0.25f;
public override void OnEnter()
{
((BaseState)this).OnEnter();
pressStartTime = Time.time;
transitioned = false;
Debug.Log((object)"[BastianPatch] Entered UtilityDispatcher state!");
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
if (!transitioned)
{
if (!((EntityState)this).inputBank.skill3.down)
{
Debug.Log((object)"[BastianPatch] Branching to TapUtilityStart");
((EntityState)this).outer.SetNextState((EntityState)(object)new TapUtilityStart());
transitioned = true;
}
else if (Time.time - pressStartTime >= HoldThreshold)
{
Debug.Log((object)"[BastianPatch] Branching to HoldUtilityStart");
((EntityState)this).outer.SetNextState((EntityState)(object)new HoldUtilityStart());
transitioned = true;
}
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
//IL_0002: 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)
return (InterruptPriority)1;
}
}