using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HexiBetterShotgun")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Makes the shotgun fire pellets that individually deal damage")]
[assembly: AssemblyFileVersion("0.3.8.0")]
[assembly: AssemblyInformationalVersion("0.3.8")]
[assembly: AssemblyProduct("HexiBetterShotgun")]
[assembly: AssemblyTitle("HexiBetterShotgun")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.8.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;
}
}
}
public class ShotgunConfig
{
[CompilerGenerated]
private static class <>O
{
public static HandleNamedMessageDelegate <0>__OnRequestSync;
public static HandleNamedMessageDelegate <1>__OnReceiveSync;
}
private static int numTightPelletsLocal = 3;
private static float tightPelletAngleLocal = 2.5f;
private static int numLoosePelletsLocal = 7;
private static float loosePelletAngleLocal = 10f;
private static bool enemiesFriendlyFireLocal = true;
public static int numTightPellets = 3;
public static float tightPelletAngle = 2.5f;
public static int numLoosePellets = 7;
public static float loosePelletAngle = 10f;
public static bool enemiesFriendlyFire = true;
private static void SetValues(int tightCount, float tightSpread, int looseCount, float looseSpread, bool enemiesFriendlyFireState)
{
numTightPellets = tightCount;
tightPelletAngle = tightSpread;
numLoosePellets = looseCount;
loosePelletAngle = looseSpread;
enemiesFriendlyFire = enemiesFriendlyFireState;
}
private static void SetToLocalValues()
{
SetValues(numTightPelletsLocal, tightPelletAngleLocal, numLoosePelletsLocal, loosePelletAngleLocal, enemiesFriendlyFireLocal);
}
public static void LoadConfig(ConfigFile config)
{
Debug.Log((object)config);
numTightPelletsLocal = Math.Clamp(config.Bind<int>("Pellets", "tightPelletCount", 3, "Number of pellets for tight grouping").Value, 0, 100);
tightPelletAngleLocal = Mathf.Clamp(config.Bind<float>("Pellets", "tightPelletAngle", 2.5f, "Pellet spread for tight grouping (degrees)").Value, 0f, 90f);
numLoosePelletsLocal = Math.Clamp(config.Bind<int>("Pellets", "loosePelletCount", 7, "Number of pellets for loose grouping").Value, 0, 100);
loosePelletAngleLocal = Mathf.Clamp(config.Bind<float>("Pellets", "loosePelletAngle", 10f, "Pellet spread for loose grouping (degrees)").Value, 0f, 90f);
enemiesFriendlyFireLocal = config.Bind<bool>("Enemies", "enemiesFriendlyFire", true, "Nutcracker can kill other enemies").Value;
SetToLocalValues();
}
public static byte[] GetSettings()
{
byte[] array = new byte[18]
{
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
Array.Copy(BitConverter.GetBytes(numTightPelletsLocal), 0, array, 1, 4);
Array.Copy(BitConverter.GetBytes(tightPelletAngleLocal), 0, array, 5, 4);
Array.Copy(BitConverter.GetBytes(numLoosePelletsLocal), 0, array, 9, 4);
Array.Copy(BitConverter.GetBytes(loosePelletAngleLocal), 0, array, 13, 4);
Array.Copy(BitConverter.GetBytes(enemiesFriendlyFireLocal), 0, array, 17, 1);
return array;
}
public static void SetSettings(byte[] data)
{
byte b = data[0];
byte b2 = b;
if (b2 == 1)
{
numTightPellets = BitConverter.ToInt32(data, 1);
tightPelletAngle = BitConverter.ToSingle(data, 5);
numLoosePellets = BitConverter.ToInt32(data, 9);
loosePelletAngle = BitConverter.ToSingle(data, 13);
enemiesFriendlyFire = BitConverter.ToBoolean(data, 17);
return;
}
throw new Exception("Invalid version byte");
}
private static bool IsHost()
{
return NetworkManager.Singleton.IsHost;
}
public static void OnRequestSync(ulong clientID, FastBufferReader reader)
{
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
if (!IsHost())
{
return;
}
Debug.Log((object)("SHOTGUN: Sending config to client " + clientID));
byte[] settings = GetSettings();
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(settings.Length, (Allocator)2, settings.Length);
try
{
((FastBufferWriter)(ref val)).WriteBytes(settings, -1, 0);
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("HexiShotgun_OnReceiveConfigSync", clientID, val, (NetworkDelivery)2);
}
catch (Exception ex)
{
Debug.LogError((object)("SHOTGUN: Failed to send config: " + ex));
}
finally
{
((FastBufferWriter)(ref val)).Dispose();
}
}
public static void OnReceiveSync(ulong clientID, FastBufferReader reader)
{
Debug.Log((object)"SHOTGUN: Received config from host");
byte[] settings = new byte[18];
try
{
((FastBufferReader)(ref reader)).ReadBytes(ref settings, 18, 0);
SetSettings(settings);
}
catch (Exception ex)
{
Debug.LogError((object)("SHOTGUN: Failed to receive config: " + ex));
SetToLocalValues();
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
private static void ServerConnect()
{
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: 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_0085: Expected O, but got Unknown
//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_0046: Expected O, but got Unknown
if (IsHost())
{
Debug.Log((object)"SHOTGUN: Started hosting, using local settings");
SetToLocalValues();
CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager;
object obj = <>O.<0>__OnRequestSync;
if (obj == null)
{
HandleNamedMessageDelegate val = OnRequestSync;
<>O.<0>__OnRequestSync = val;
obj = (object)val;
}
customMessagingManager.RegisterNamedMessageHandler("HexiShotgun_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
return;
}
Debug.Log((object)"SHOTGUN: Connected to server, requesting settings");
CustomMessagingManager customMessagingManager2 = NetworkManager.Singleton.CustomMessagingManager;
object obj2 = <>O.<1>__OnReceiveSync;
if (obj2 == null)
{
HandleNamedMessageDelegate val2 = OnReceiveSync;
<>O.<1>__OnReceiveSync = val2;
obj2 = (object)val2;
}
customMessagingManager2.RegisterNamedMessageHandler("HexiShotgun_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
FastBufferWriter val3 = default(FastBufferWriter);
((FastBufferWriter)(ref val3))..ctor(0, (Allocator)2, 0);
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("HexiShotgun_OnRequestConfigSync", 0uL, val3, (NetworkDelivery)2);
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
private static void ServerDisconnect()
{
Debug.Log((object)"SHOTGUN: Server disconnect");
SetToLocalValues();
}
}
namespace BetterShotgun
{
[BepInPlugin("HexiBetterShotgun", "HexiBetterShotgun", "0.3.8")]
public class Plugin : BaseUnityPlugin
{
private readonly Harmony harmony = new Harmony("HexiBetterShotgun");
private void Awake()
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin HexiBetterShotgun is loaded!");
ShotgunConfig.LoadConfig(((BaseUnityPlugin)this).Config);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Config loaded");
harmony.PatchAll(typeof(ShotgunPatch));
harmony.PatchAll(typeof(ShotgunConfig));
}
}
internal class ShotgunPatch
{
[HarmonyPatch(typeof(ShotgunItem), "ShootGun")]
[HarmonyPrefix]
private static bool ReplaceShotgunCode(ShotgunItem __instance, Vector3 shotgunPosition, Vector3 shotgunForward)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
NewShotgunHandler.ShootGun(__instance, shotgunPosition, shotgunForward);
return false;
}
[HarmonyPatch(typeof(StartOfRound), "ChooseNewRandomMapSeed")]
[HarmonyPostfix]
private static void UpdateShotgunSeed(StartOfRound __instance)
{
NewShotgunHandler.ShotgunRandom = new Random(__instance.randomMapSeed);
Debug.Log((object)("Shotgun seed: " + __instance.randomMapSeed));
}
}
internal class FadeOutLine : MonoBehaviour
{
private const float lifetime = 0.4f;
private const float width = 0.02f;
private static readonly Color col = new Color(1f, 0f, 0f);
private float alive = 0f;
private LineRenderer line;
public Vector3 start;
public Vector3 end;
private static readonly Material mat = new Material(Shader.Find("Legacy Shaders/Particles/Alpha Blended Premultiply"));
public void Prep()
{
//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_0038: 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_004f: 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_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: 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)
float num = Vector3.Distance(start, end);
float num2 = (30f - num) / 30f;
line = ((Component)this).gameObject.AddComponent<LineRenderer>();
line.startColor = col;
line.endColor = col * num2 + Color.black * (1f - num2);
line.startWidth = 0.02f;
line.endWidth = num2 * 0.02f;
line.SetPositions((Vector3[])(object)new Vector3[2] { start, end });
((Renderer)line).material = mat;
}
private void Update()
{
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
alive += Time.deltaTime;
if (alive >= 0.4f)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
return;
}
line.startColor = new Color(col.r, col.g, col.b, (0.4f - alive) / 0.4f);
line.endColor = new Color(line.endColor.r, line.endColor.g, line.endColor.b, (0.4f - alive) / 0.4f);
}
}
public class Counter<T>
{
public T item;
public int count;
}
public class CountHandler
{
public List<Counter<PlayerControllerB>> player = new List<Counter<PlayerControllerB>>();
public List<Counter<EnemyAI>> enemy = new List<Counter<EnemyAI>>();
public List<Counter<IHittable>> other = new List<Counter<IHittable>>();
public void AddPlayerToCount(PlayerControllerB p)
{
if (player.Any((Counter<PlayerControllerB> i) => (Object)(object)i.item == (Object)(object)p))
{
player.First((Counter<PlayerControllerB> i) => (Object)(object)i.item == (Object)(object)p).count++;
}
else
{
player.Add(new Counter<PlayerControllerB>
{
item = p,
count = 1
});
}
}
public void AddEnemyToCount(EnemyAI ai)
{
if (enemy.Any((Counter<EnemyAI> i) => (Object)(object)i.item == (Object)(object)ai))
{
enemy.First((Counter<EnemyAI> i) => (Object)(object)i.item == (Object)(object)ai).count++;
}
else
{
enemy.Add(new Counter<EnemyAI>
{
item = ai,
count = 1
});
}
}
public void AddOtherToCount(IHittable hit)
{
if (other.Any((Counter<IHittable> i) => i.item == hit))
{
other.First((Counter<IHittable> i) => i.item == hit).count++;
}
else
{
other.Add(new Counter<IHittable>
{
item = hit,
count = 1
});
}
}
}
internal class NewShotgunHandler
{
public const float range = 30f;
private static readonly int PLAYER_HIT_MASK = StartOfRound.Instance.collidersRoomMaskDefaultAndPlayers | 0x80000;
private static readonly int ENEMY_HIT_MASK = StartOfRound.Instance.collidersRoomMaskDefaultAndPlayers;
public static Random ShotgunRandom = new Random(0);
private static IEnumerator DelayedEarsRinging(float effectSeverity)
{
yield return (object)new WaitForSeconds(0.6f);
SoundManager.Instance.earsRingingTimer = effectSeverity;
}
private static void VisualiseShot(Vector3 start, Vector3 end)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_0014: 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_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)
GameObject val = new GameObject("Trail Visual");
FadeOutLine fadeOutLine = val.AddComponent<FadeOutLine>();
fadeOutLine.start = start;
fadeOutLine.end = end;
fadeOutLine.Prep();
}
public static void ShootGun(ShotgunItem gun, Vector3 shotgunPosition, Vector3 shotgunForward)
{
//IL_0007: 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_004b: 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_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)
//IL_0074: 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_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_0249: Unknown result type (might be due to invalid IL or missing references)
//IL_0258: Unknown result type (might be due to invalid IL or missing references)
//IL_026d: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: 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_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01de: Unknown result type (might be due to invalid IL or missing references)
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_0218: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: 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)
//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0335: Unknown result type (might be due to invalid IL or missing references)
//IL_033a: Unknown result type (might be due to invalid IL or missing references)
//IL_033e: Unknown result type (might be due to invalid IL or missing references)
//IL_033f: Unknown result type (might be due to invalid IL or missing references)
//IL_077e: Unknown result type (might be due to invalid IL or missing references)
//IL_0780: Unknown result type (might be due to invalid IL or missing references)
//IL_078a: Unknown result type (might be due to invalid IL or missing references)
//IL_036a: Unknown result type (might be due to invalid IL or missing references)
//IL_0352: Unknown result type (might be due to invalid IL or missing references)
//IL_07c9: Unknown result type (might be due to invalid IL or missing references)
//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
//IL_0710: Unknown result type (might be due to invalid IL or missing references)
//IL_0711: Unknown result type (might be due to invalid IL or missing references)
//IL_068a: Unknown result type (might be due to invalid IL or missing references)
//IL_068f: Unknown result type (might be due to invalid IL or missing references)
//IL_06d2: Unknown result type (might be due to invalid IL or missing references)
//IL_06d3: Unknown result type (might be due to invalid IL or missing references)
//IL_060d: Unknown result type (might be due to invalid IL or missing references)
//IL_0612: Unknown result type (might be due to invalid IL or missing references)
//IL_0539: Unknown result type (might be due to invalid IL or missing references)
//IL_053e: Unknown result type (might be due to invalid IL or missing references)
//IL_0655: Unknown result type (might be due to invalid IL or missing references)
//IL_0656: Unknown result type (might be due to invalid IL or missing references)
//IL_0581: Unknown result type (might be due to invalid IL or missing references)
//IL_0582: Unknown result type (might be due to invalid IL or missing references)
PlayerControllerB playerHeldBy = ((GrabbableObject)gun).playerHeldBy;
bool flag = ((GrabbableObject)gun).isHeld && (Object)(object)((GrabbableObject)gun).playerHeldBy != (Object)null;
if (flag)
{
shotgunPosition += ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.up * 0.25f;
}
bool flag2 = flag && (Object)(object)((GrabbableObject)gun).playerHeldBy == (Object)(object)GameNetworkManager.Instance.localPlayerController;
if (flag2)
{
((GrabbableObject)gun).playerHeldBy.playerBodyAnimator.SetTrigger("ShootShotgun");
}
RoundManager.PlayRandomClip(((Component)gun).GetComponent<ShotgunItem>().gunShootAudio, ((Component)gun).GetComponent<ShotgunItem>().gunShootSFX, true, 1f, 1840, 1000);
WalkieTalkie.TransmitOneShotAudio(((Component)gun).GetComponent<ShotgunItem>().gunShootAudio, ((Component)gun).GetComponent<ShotgunItem>().gunShootSFX[0], 1f);
gun.gunShootParticle.Play(true);
gun.isReloading = false;
gun.shellsLoaded = Mathf.Clamp(gun.shellsLoaded - 1, 0, 2);
PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
if ((Object)(object)localPlayerController == (Object)null)
{
return;
}
Vector3[] array = (Vector3[])(object)new Vector3[ShotgunConfig.numTightPellets + ShotgunConfig.numLoosePellets];
State state = Random.state;
Random.InitState(ShotgunRandom.Next());
for (int i = 0; i < ShotgunConfig.numTightPellets + ShotgunConfig.numLoosePellets; i++)
{
float num = ((i < ShotgunConfig.numTightPellets) ? ShotgunConfig.tightPelletAngle : ShotgunConfig.loosePelletAngle);
Vector3 val = Random.onUnitSphere;
float num2 = num * Mathf.Sqrt(Random.value);
if (Vector3.Angle(shotgunForward, val) < num2)
{
val *= -1f;
}
Vector3 val2 = Vector3.RotateTowards(shotgunForward, val, num2 * MathF.PI / 180f, 0f);
array[i] = val2;
}
Random.state = state;
float num3 = Vector3.Distance(((Component)localPlayerController).transform.position, ((Component)gun.shotgunRayPoint).transform.position);
float num4 = 0f;
if (num3 < 5f)
{
num4 = 0.8f;
HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
}
else if (num3 < 15f)
{
num4 = 0.5f;
HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
}
else if (num3 < 23f)
{
HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
}
if (num4 > 0f && SoundManager.Instance.timeSinceEarsStartedRinging > 16f && !flag)
{
((MonoBehaviour)gun).StartCoroutine(DelayedEarsRinging(num4));
}
CountHandler countHandler = new CountHandler();
Ray val4 = default(Ray);
IHittable val6 = default(IHittable);
EnemyAI val9 = default(EnemyAI);
foreach (Vector3 val3 in array)
{
((Ray)(ref val4))..ctor(shotgunPosition, val3);
RaycastHit[] array2 = ((!ShotgunConfig.enemiesFriendlyFire) ? Physics.RaycastAll(val4, 30f, flag ? PLAYER_HIT_MASK : ENEMY_HIT_MASK, (QueryTriggerInteraction)2) : Physics.RaycastAll(val4, 30f, PLAYER_HIT_MASK, (QueryTriggerInteraction)2));
Array.Sort(array2, (RaycastHit x, RaycastHit y) => ((RaycastHit)(ref x)).distance.CompareTo(((RaycastHit)(ref y)).distance));
Vector3 val5 = shotgunPosition + val3 * 30f;
Debug.Log((object)("SHOTGUN: RaycastAll hit " + array2.Length + " things (" + flag + "," + flag2 + ")"));
for (int k = 0; k < array2.Length; k++)
{
GameObject gameObject = ((Component)((RaycastHit)(ref array2[k])).transform).gameObject;
if (gameObject.TryGetComponent<IHittable>(ref val6))
{
if (val6 == ((GrabbableObject)gun).playerHeldBy)
{
continue;
}
EnemyAI val7 = null;
EnemyAICollisionDetect val8 = (EnemyAICollisionDetect)(object)((val6 is EnemyAICollisionDetect) ? val6 : null);
if (val8 != null)
{
val7 = val8.mainScript;
}
if ((Object)(object)val7 != (Object)null && ((!flag && !ShotgunConfig.enemiesFriendlyFire) || val7.isEnemyDead || val7.enemyHP <= 0 || !val7.enemyType.canDie))
{
continue;
}
if (val6 is PlayerControllerB)
{
countHandler.AddPlayerToCount((PlayerControllerB)(object)((val6 is PlayerControllerB) ? val6 : null));
}
else if ((Object)(object)val7 != (Object)null)
{
countHandler.AddEnemyToCount(val7);
}
else
{
if (!flag)
{
continue;
}
countHandler.AddOtherToCount(val6);
}
val5 = ((RaycastHit)(ref array2[k])).point;
Debug.Log((object)("SHOTGUN: Hit [" + ((object)val6)?.ToString() + "] (" + (k + 1) + "@" + Vector3.Distance(shotgunPosition, val5) + ")"));
break;
}
if (((Component)((RaycastHit)(ref array2[k])).collider).TryGetComponent<EnemyAI>(ref val9))
{
if (!flag || val9.isEnemyDead || val9.enemyHP <= 0 || !val9.enemyType.canDie)
{
continue;
}
countHandler.AddEnemyToCount(val9);
val5 = ((RaycastHit)(ref array2[k])).point;
Debug.Log((object)("SHOTGUN: Backup hit [" + ((object)val9)?.ToString() + "] (" + (k + 1) + "@" + Vector3.Distance(shotgunPosition, val5) + ")"));
break;
}
val5 = ((RaycastHit)(ref array2[k])).point;
Debug.Log((object)("SHOTGUN: Wall [" + ((object)gameObject)?.ToString() + "] (" + (k + 1) + "@" + Vector3.Distance(shotgunPosition, val5) + ")"));
break;
}
VisualiseShot(shotgunPosition, val5);
}
countHandler.player.ForEach(delegate(Counter<PlayerControllerB> p)
{
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
int num7 = p.count * 20;
Debug.Log((object)("SHOTGUN: Hit " + ((object)p.item)?.ToString() + " with " + p.count + " pellets for " + num7 + " damage"));
p.item.DamagePlayer(num7, true, true, (CauseOfDeath)7, 0, false, shotgunForward);
});
countHandler.enemy.ForEach(delegate(Counter<EnemyAI> e)
{
int num6 = e.count / 2 + 1;
Debug.Log((object)("SHOTGUN: Hit " + ((object)e.item)?.ToString() + " with " + e.count + " pellets for " + num6 + " damage"));
e.item.HitEnemy(num6, ((GrabbableObject)gun).playerHeldBy, true, -1);
});
countHandler.other.ForEach(delegate(Counter<IHittable> o)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
int num5 = o.count / 2 + 1;
Debug.Log((object)("SHOTGUN: Hit " + ((object)o.item)?.ToString() + " with " + o.count + " pellets for " + num5 + " damage"));
o.item.Hit(num5, shotgunForward, ((GrabbableObject)gun).playerHeldBy, true, -1);
});
((Ray)(ref val4))..ctor(shotgunPosition, shotgunForward);
RaycastHit val10 = default(RaycastHit);
if (Physics.Raycast(val4, ref val10, 30f, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1))
{
((Component)gun.gunBulletsRicochetAudio).transform.position = ((Ray)(ref val4)).GetPoint(((RaycastHit)(ref val10)).distance - 0.5f);
gun.gunBulletsRicochetAudio.Play();
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "HexiBetterShotgun";
public const string PLUGIN_NAME = "HexiBetterShotgun";
public const string PLUGIN_VERSION = "0.3.8";
}
}