Decompiled source of NoobBallista v1.2.7

GsiX.NoobBallista.dll

Decompiled 5 months ago
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("JotunnModStub")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("JotunnModStub")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("0.0.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.1.0")]
namespace NoobBallista
{
	[BepInPlugin("GsiX.NoobBallista", "GsiX Noob Ballista", "1.2.7")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	internal class NoobBallistaPlugins : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(ItemDrop), "Awake")]
		private class NoobBallista_ItemDrop_Awake_Patch
		{
			private static void Postfix(ItemDrop __instance)
			{
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBolt"))
				{
					__instance.m_itemData.m_shared.m_ammoType = "$ammo_noobbolt";
					__instance.m_itemData.m_shared.m_maxStackSize = BoltMaxStackSize.Value;
					__instance.m_itemData.m_shared.m_weight = 0.1f;
					__instance.m_itemData.m_shared.m_attackForce = BoltAttackForce.Value;
					__instance.m_itemData.m_shared.m_backstabBonus = BoltDamage.Value;
					__instance.m_itemData.m_shared.m_damages.m_damage = BoltDamage.Value;
					__instance.m_itemData.m_shared.m_damages.m_blunt = BoltBlunt.Value;
					__instance.m_itemData.m_shared.m_damages.m_slash = BoltSlash.Value;
					__instance.m_itemData.m_shared.m_damages.m_pierce = BoltPierce.Value;
					__instance.m_itemData.m_shared.m_damages.m_chop = BoltChop.Value;
					__instance.m_itemData.m_shared.m_damages.m_pickaxe = BoltPickAxe.Value;
					__instance.m_itemData.m_shared.m_damages.m_fire = BoltFire.Value;
					__instance.m_itemData.m_shared.m_damages.m_frost = BoltFrost.Value;
					__instance.m_itemData.m_shared.m_damages.m_lightning = BoltLighting.Value;
					__instance.m_itemData.m_shared.m_damages.m_poison = BoltPoison.Value;
					__instance.m_itemData.m_shared.m_damages.m_spirit = BoltSpirit.Value;
					if ((Object)(object)__instance.m_nview != (Object)null)
					{
						SetScale(__instance.m_nview);
					}
					ZSyncTransform component = ((Component)__instance).gameObject.GetComponent<ZSyncTransform>();
					if ((Object)(object)component != (Object)null)
					{
						component.m_syncPosition = true;
						component.m_syncRotation = true;
						component.m_syncScale = true;
					}
				}
			}
		}

		[HarmonyPatch(typeof(Turret), "Awake")]
		private class NoobBallista_Turret_Awake_Patch
		{
			private static void Postfix(ref Turret __instance)
			{
				//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_00d6: 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_015d: 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)
				if (!PluginEnabled.Value || !IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					return;
				}
				__instance.m_ammoType = "$ammo_noobbolt";
				__instance.m_holdRepeatInterval = 0.05f;
				__instance.m_attackWarmup = 0.5f;
				__instance.m_shootWhenAimDiff = 1f;
				__instance.m_lookAcceleration = 10f;
				__instance.m_noTargetScanRate = 2f;
				__instance.m_updateTargetTimer = 0f;
				__instance.m_updateTargetIntervalFar = __instance.m_updateTargetIntervalNear * 2f;
				__instance.m_horizontalAngle = 89f;
				__instance.m_lookDeacceleration = 10f;
				__instance.m_predictionModifier = 1f;
				__instance.m_verticalAngle = 90f;
				GameObject val = null;
				foreach (AmmoType item in __instance.m_allowedAmmo)
				{
					if (((Object)item.m_ammo).name == "TurretBolt")
					{
						val = item.m_visual;
						break;
					}
				}
				__instance.m_allowedAmmo.Clear();
				GameObject prefab = PrefabManager.Instance.GetPrefab("NoobBolt");
				if ((Object)(object)val != (Object)null && (Object)(object)prefab != (Object)null)
				{
					ItemDrop component = prefab.gameObject.GetComponent<ItemDrop>();
					if ((Object)(object)component != (Object)null)
					{
						__instance.m_allowedAmmo.Add(new AmmoType
						{
							m_ammo = component,
							m_visual = val
						});
					}
				}
			}
		}

		[HarmonyPatch(typeof(Turret), "UpdateAttack")]
		private class NoobBallista_Turret_UpdateAttack_Patch
		{
			private static void Postfix(Turret __instance)
			{
				if (!PluginEnabled.Value || !IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					return;
				}
				if (__instance.m_targetPlayers != IsTargetPlayer.Value)
				{
					__instance.m_targetPlayers = IsTargetPlayer.Value;
					if (!__instance.m_targetPlayers && (Object)(object)__instance.m_target != (Object)null && __instance.m_target.IsPlayer())
					{
						__instance.m_target = null;
						__instance.m_haveTarget = false;
					}
				}
				if (__instance.m_targetTamed != IsTargetTamed.Value)
				{
					__instance.m_targetTamed = IsTargetTamed.Value;
					if (!__instance.m_targetTamed && (Object)(object)__instance.m_target != (Object)null && __instance.m_target.IsTamed())
					{
						__instance.m_target = null;
						__instance.m_haveTarget = false;
					}
				}
				if (__instance.m_viewDistance != ViewDistance.Value)
				{
					__instance.m_viewDistance = ViewDistance.Value;
				}
				if (__instance.m_maxAmmo != MaximumAmmo.Value)
				{
					__instance.m_maxAmmo = MaximumAmmo.Value;
				}
				if (__instance.m_attackCooldown != AttackCooldown.Value)
				{
					__instance.m_attackCooldown = AttackCooldown.Value;
				}
				if (__instance.m_turnRate != TurnRate.Value)
				{
					__instance.m_turnRate = TurnRate.Value;
				}
				if (IsRequiredAmmo.Value)
				{
					if (__instance.m_returnAmmoOnDestroy != ReturnAmmoOnDestroy.Value)
					{
						__instance.m_returnAmmoOnDestroy = ReturnAmmoOnDestroy.Value;
					}
				}
				else if (__instance.m_returnAmmoOnDestroy)
				{
					__instance.m_returnAmmoOnDestroy = false;
				}
				AddInfinityAmmo(__instance);
			}
		}

		[HarmonyPatch(typeof(Turret), "GetHoverText")]
		private class NoobBallista_Turret_GetHoverText_Patch
		{
			private static bool Prefix(ref Turret __instance, ref string __result, ref bool __runOriginal)
			{
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					if (!__instance.m_nview.IsValid())
					{
						return true;
					}
					if (!PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))
					{
						return true;
					}
					int ammo = __instance.GetAmmo();
					int maxAmmo = __instance.m_maxAmmo;
					WearNTear component = ((Component)__instance).gameObject.GetComponent<WearNTear>();
					if ((Object)(object)component != (Object)null)
					{
						int num = (int)(component.GetHealthPercentage() * 100f);
						string text = ((num > 60) ? "green" : ((num <= 30 || num > 60) ? "red" : "orange"));
						if (IsRequiredAmmo.Value)
						{
							__result = $"{BallistaName.Value} ( {ammo} / {maxAmmo} )\n<color={text}>Health {num}%</color>\n[<color=yellow><b>E</b></color>] Add {BoltName.Value}\n[<color=yellow><b>Shift + E</b></color>] Add Max {BoltName.Value}";
						}
						else
						{
							__result = $"{BallistaName.Value}\n<color={text}>Health {num}%</color>";
						}
					}
					else if (IsRequiredAmmo.Value)
					{
						__result = $"{BallistaName.Value} ( {ammo} / {maxAmmo} )\n[<color=yellow><b>E</b></color>] Add {BoltName.Value}\n[<color=yellow><b>Shift + E</b></color>] Add Max {BoltName.Value}";
					}
					else
					{
						__result = BallistaName.Value;
					}
					__runOriginal = false;
					return false;
				}
				__runOriginal = true;
				return true;
			}
		}

		[HarmonyPatch(typeof(Turret), "UseItem")]
		private class NoobBallista_UseItem_Patch
		{
			private static bool Prefix(ref Turret __instance, Humanoid user, ItemData item, ref bool __result, ref bool __runOriginal)
			{
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					__runOriginal = false;
					if (!IsRequiredAmmo.Value)
					{
						((Character)user).Message((MessageType)2, BallistaName.Value + " Infinity Ammo", 0, (Sprite)null);
						__result = false;
						return false;
					}
					Inventory inventory = user.GetInventory();
					if (inventory == null)
					{
						((Character)user).Message((MessageType)2, "Player's Inventory Error", 0, (Sprite)null);
						__result = false;
						return false;
					}
					if (item == null)
					{
						item = __instance.FindAmmoItem(inventory, true);
						if (item == null)
						{
							((Character)user).Message((MessageType)2, "$msg_noturretammo", 0, (Sprite)null);
							__result = false;
							return false;
						}
						if (__instance.GetAmmo() > 0)
						{
							ItemDrop component = ZNetScene.instance.GetPrefab(__instance.GetAmmoType()).GetComponent<ItemDrop>();
							((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_turretotherammo") + Localization.instance.Localize(component.m_itemData.m_shared.m_name), 0, (Sprite)null);
							__result = false;
							return false;
						}
					}
					if (!__instance.IsItemAllowed(((Object)item.m_dropPrefab).name))
					{
						((Character)user).Message((MessageType)2, "$msg_wontwork", 0, (Sprite)null);
						__result = false;
						return false;
					}
					int ammo = __instance.GetAmmo();
					if (ammo > 0 && __instance.GetAmmoType() != ((Object)item.m_dropPrefab).name)
					{
						ItemDrop component2 = ZNetScene.instance.GetPrefab(__instance.GetAmmoType()).GetComponent<ItemDrop>();
						((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_turretotherammo") + Localization.instance.Localize(component2.m_itemData.m_shared.m_name), 0, (Sprite)null);
						__result = false;
						return false;
					}
					ZLog.Log((object)("trying to add ammo " + item.m_shared.m_name));
					if (ammo >= __instance.m_maxAmmo)
					{
						((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null);
						__result = false;
						return false;
					}
					Game.instance.IncrementPlayerStat((PlayerStatType)78, 1f);
					if (CheckKeyHeld("left shift"))
					{
						int num = inventory.CountItems(item.m_shared.m_name, -1, false);
						int num2 = __instance.m_maxAmmo - ammo;
						int num3 = num - num2;
						if (num3 < 0)
						{
							num3 = num;
						}
						inventory.RemoveItem(item, num3);
						for (int i = 0; i < num3; i++)
						{
							__instance.m_nview.InvokeRPC("RPC_AddAmmo", new object[1] { ((Object)item.m_dropPrefab).name });
						}
						((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name + " " + num3 + "pcs", 0, (Sprite)null);
					}
					else
					{
						inventory.RemoveItem(item, 1);
						__instance.m_nview.InvokeRPC("RPC_AddAmmo", new object[1] { ((Object)item.m_dropPrefab).name });
					}
					__result = true;
					return false;
				}
				__runOriginal = true;
				return true;
			}
		}

		[HarmonyPatch(typeof(Turret), "ShootProjectile")]
		private class NoobBallista_Turret_ShootProjectile_Patch
		{
			private static void Postfix(Turret __instance)
			{
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					AddInfinityAmmo(__instance);
				}
			}
		}

		[HarmonyPatch(typeof(Turret), "UpdateTarget")]
		private class NoobBallista_Turret_UpdateTarget_Patch
		{
			private static bool Prefix(Turret __instance, float dt, ref bool __runOriginal)
			{
				//IL_009b: 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_01c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01df: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ea: 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_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_0144: 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)
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBallista"))
				{
					__runOriginal = false;
					if (!__instance.m_nview.IsValid())
					{
						return false;
					}
					if (!__instance.HasAmmo())
					{
						if (__instance.m_haveTarget)
						{
							__instance.m_nview.InvokeRPC(ZNetView.Everybody, "RPC_SetTarget", new object[1] { ZDOID.None });
						}
						AddInfinityAmmo(__instance);
						return false;
					}
					__instance.m_updateTargetTimer -= dt;
					if (__instance.m_updateTargetTimer <= 0f)
					{
						__instance.m_updateTargetTimer = (Character.IsCharacterInRange(((Component)__instance).transform.position, 40f) ? __instance.m_updateTargetIntervalNear : __instance.m_updateTargetIntervalFar);
						Character val = BaseAI.FindClosestCreature(((Component)__instance).transform, __instance.m_eye.transform.position, 0f, __instance.m_viewDistance, __instance.m_horizontalAngle, false, false, true, __instance.m_targetPlayers, (__instance.m_targetItems.Count > 0) ? __instance.m_targetTamedConfig : __instance.m_targetTamed, __instance.m_targetCharacters);
						if ((Object)(object)val != (Object)(object)__instance.m_target && IsMonsterFaction(val))
						{
							__instance.m_newTargetEffect.Create(((Component)__instance).transform.position, ((Component)__instance).transform.rotation, (Transform)null, 1f, -1);
							__instance.m_nview.InvokeRPC(ZNetView.Everybody, "RPC_SetTarget", new object[1] { val.GetZDOID() });
						}
					}
					if (__instance.m_haveTarget && (!Object.op_Implicit((Object)(object)__instance.m_target) || __instance.m_target.IsDead()))
					{
						ZLog.Log((object)"Target is gone");
						__instance.m_nview.InvokeRPC(ZNetView.Everybody, "RPC_SetTarget", new object[1] { ZDOID.None });
						__instance.m_lostTargetEffect.Create(((Component)__instance).transform.position, ((Component)__instance).transform.rotation, (Transform)null, 1f, -1);
					}
					return false;
				}
				__runOriginal = true;
				return true;
				static bool IsMonsterFaction(Character characters)
				{
					//IL_0024: Unknown result type (might be due to invalid IL or missing references)
					//IL_002a: Invalid comparison between Unknown and I4
					//IL_002d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0033: Invalid comparison between Unknown and I4
					//IL_0036: Unknown result type (might be due to invalid IL or missing references)
					//IL_003c: Invalid comparison between Unknown and I4
					//IL_003f: Unknown result type (might be due to invalid IL or missing references)
					//IL_0045: Invalid comparison between Unknown and I4
					//IL_0048: Unknown result type (might be due to invalid IL or missing references)
					//IL_004e: Invalid comparison between Unknown and I4
					//IL_0051: Unknown result type (might be due to invalid IL or missing references)
					//IL_0057: Invalid comparison between Unknown and I4
					//IL_005a: Unknown result type (might be due to invalid IL or missing references)
					//IL_0061: Invalid comparison between Unknown and I4
					if ((Object)(object)characters == (Object)null)
					{
						return false;
					}
					if (characters.IsBoss())
					{
						if (IsTargetBoss.Value)
						{
							return true;
						}
						return false;
					}
					if ((int)characters.m_faction == 2 || (int)characters.m_faction == 3 || (int)characters.m_faction == 4 || (int)characters.m_faction == 7 || (int)characters.m_faction == 5 || (int)characters.m_faction == 6 || (int)characters.m_faction == 9)
					{
						return true;
					}
					return false;
				}
			}
		}

		[HarmonyPatch(typeof(Projectile), "FixedUpdate")]
		private class NoobBallista_Projectile_FixedUpdate_Patch
		{
			private static void Postfix(Projectile __instance)
			{
				//IL_0054: 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_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: 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_0074: 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_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: 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_00a1: 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_00b4: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				if (PluginEnabled.Value && IsNoobProjectile(__instance))
				{
					SetScale(__instance.m_nview);
					if (IsRequiredAmmo.Value && IsReturnAmmo.Value && __instance.m_ttl <= 0f)
					{
						Quaternion rotation = ((Component)__instance).transform.rotation;
						float x = ((Quaternion)(ref rotation)).eulerAngles.x;
						rotation = ((Component)__instance).transform.rotation;
						float num = ((Quaternion)(ref rotation)).eulerAngles.y + 180f;
						rotation = ((Component)__instance).transform.rotation;
						Quaternion val = Quaternion.Euler(x, num, ((Quaternion)(ref rotation)).eulerAngles.z);
						Vector3 val2 = ((Component)__instance).transform.position + ((Component)__instance).transform.TransformDirection(__instance.m_spawnOffset);
						ItemDrop.DropItem(__instance.m_ammo, 0, val2, val);
					}
				}
			}
		}

		[HarmonyPatch(typeof(Projectile), "OnHit")]
		private static class NoobBallista_Projectile_OnHit_Patch
		{
			private static bool Prefix(Projectile __instance, Collider collider, Vector3 hitPoint, bool water, ref bool __runOriginal)
			{
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				if (PluginEnabled.Value && IsNoobProjectile(__instance) && (Object)(object)collider != (Object)null)
				{
					IDestructible component = Projectile.FindHitObject(collider).GetComponent<IDestructible>();
					if (component != null && __instance.IsValidTarget(component))
					{
						Character val = (Character)(object)((component is Character) ? component : null);
						if (Object.op_Implicit((Object)(object)val))
						{
							if (!IsDamageTamed.Value && (Object)(object)((Component)val).gameObject.GetComponent<Tameable>() != (Object)null && val.m_tamed)
							{
								Physics.IgnoreCollision(collider, ((Component)val).gameObject.GetComponent<Collider>());
								__runOriginal = false;
								return false;
							}
							if (!IsDamagePlayer.Value && (int)val.m_faction == 0)
							{
								Physics.IgnoreCollision(collider, ((Component)val).gameObject.GetComponent<Collider>());
								__runOriginal = false;
								return false;
							}
						}
					}
				}
				__runOriginal = true;
				return true;
			}
		}

		[HarmonyPatch(typeof(ZSyncTransform), "OwnerSync")]
		private class NoobBallista_ZSyncTransform_OwnerSync_Patch
		{
			private static void Postfix(ref ZSyncTransform __instance)
			{
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBolt"))
				{
					SetScale(__instance.m_nview);
				}
			}
		}

		[HarmonyPatch(typeof(ZSyncTransform), "ClientSync")]
		private class NoobBallista_ZSyncTransform_ClientSync_Patch
		{
			private static void Postfix(ZSyncTransform __instance)
			{
				if (PluginEnabled.Value && IsNoobPrefab(__instance.m_nview, "NoobBolt"))
				{
					SetScale(__instance.m_nview);
				}
			}
		}

		[HarmonyPatch(typeof(ZNetScene), "Awake")]
		private static class NoobBallista_ZNetScene_Awake_Patch
		{
			private static void Postfix(ZNetScene __instance)
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: 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_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0156: Unknown result type (might be due to invalid IL or missing references)
				//IL_00df: 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)
				if (!PluginEnabled.Value)
				{
					return;
				}
				Vector3 newScale = GetNewScale();
				GameObject prefab = ZNetScene.instance.GetPrefab("NoobBallista");
				if ((Object)(object)prefab != (Object)null)
				{
					prefab.transform.localScale = newScale;
					Piece component = prefab.GetComponent<Piece>();
					Turret component2 = prefab.GetComponent<Turret>();
					if ((Object)(object)component != (Object)null)
					{
						SetScale(component.m_nview);
					}
					if ((Object)(object)component2 != (Object)null)
					{
						SetScale(component2.m_nview);
					}
					BoxCollider component3 = prefab.GetComponent<BoxCollider>();
					if ((Object)(object)component3 != (Object)null)
					{
						float num = Mathf.Clamp(BallistaSize.Value, 0.1f, 1f);
						float num2 = 2.2f * num;
						float num3 = 1.8f * (1f - num);
						float num4 = num2;
						float num5 = num3 / 2f - 0.02f;
						component3.center = new Vector3(0f, num5, 0f);
						component3.size = new Vector3(num2, num3, num4);
					}
				}
				GameObject prefab2 = ZNetScene.instance.GetPrefab("NoobBolt");
				if ((Object)(object)prefab2 != (Object)null)
				{
					prefab2.transform.localScale = GetNewScale();
					ItemDrop component4 = prefab2.GetComponent<ItemDrop>();
					if ((Object)(object)component4 != (Object)null)
					{
						SetScale(component4.m_nview);
					}
					BoxCollider component5 = prefab2.GetComponent<BoxCollider>();
					if ((Object)(object)component5 != (Object)null)
					{
						component5.size = newScale;
					}
				}
			}
		}

		public const string PluginGUID = "GsiX.NoobBallista";

		public const string PluginName = "GsiX Noob Ballista";

		public const string PluginVersion = "1.2.7";

		public const string PluginNamespace = "NoobBallista";

		private readonly Harmony harmony = new Harmony("GsiX.NoobBallista");

		private const string NameTurret = "NoobBallista";

		private const string NameBolt = "NoobBolt";

		private const string NameItem = "$item_noobbolt";

		public static ConfigEntry<bool> PluginEnabled;

		public static ConfigEntry<bool> IsRequiredAmmo;

		public static ConfigEntry<bool> IsReturnAmmo;

		public static ConfigEntry<bool> IsTargetTamed;

		public static ConfigEntry<bool> IsTargetPlayer;

		public static ConfigEntry<bool> IsTargetBoss;

		public static ConfigEntry<bool> IsDamagePlayer;

		public static ConfigEntry<bool> IsDamageTamed;

		public static ConfigEntry<string> BallistaName;

		public static ConfigEntry<float> BallistaSize;

		public static ConfigEntry<float> ViewDistance;

		public static ConfigEntry<int> MaximumAmmo;

		public static ConfigEntry<float> AttackCooldown;

		public static ConfigEntry<float> TurnRate;

		public static ConfigEntry<bool> ReturnAmmoOnDestroy;

		public static ConfigEntry<string> TurretRequirement1;

		public static ConfigEntry<string> TurretRequirement2;

		public static ConfigEntry<string> TurretRequirement3;

		public static ConfigEntry<string> TurretRequirement4;

		public static ConfigEntry<string> TurretRequirement5;

		public static ConfigEntry<string> BoltName;

		public static ConfigEntry<int> BoltMaxStackSize;

		public static ConfigEntry<float> BoltAttackForce;

		public static ConfigEntry<float> BoltDamage;

		public static ConfigEntry<float> BoltBlunt;

		public static ConfigEntry<float> BoltSlash;

		public static ConfigEntry<float> BoltPierce;

		public static ConfigEntry<float> BoltChop;

		public static ConfigEntry<float> BoltPickAxe;

		public static ConfigEntry<float> BoltFire;

		public static ConfigEntry<float> BoltFrost;

		public static ConfigEntry<float> BoltLighting;

		public static ConfigEntry<float> BoltPoison;

		public static ConfigEntry<float> BoltSpirit;

		public static ConfigEntry<string> BoltRequirement1;

		public static ConfigEntry<string> BoltRequirement2;

		public static ConfigEntry<string> BoltRequirement3;

		private static readonly Dictionary<string, Texture2D> cachedTextures = new Dictionary<string, Texture2D>();

		public void Awake()
		{
			PluginEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Plugin Enable", "PluginEnabled", true, "Plugin Enabled/Disabled");
			IsRequiredAmmo = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsRequiredAmmo", false, "Is the ballista required ammo to shoot.");
			IsReturnAmmo = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsReturnAmmo", true, "Ballista return ammo upon hit target. Override by IsRequiredAmmo");
			IsTargetTamed = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsTargetTamed", false, "Allow Ballista to target tamed animal.");
			IsTargetPlayer = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsTargetPlayer", false, "Allow Ballista to target human player.");
			IsTargetBoss = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsTargetBoss", false, "Allow Ballista to target boss.");
			IsDamagePlayer = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsDamagePlayer", false, "Allow Ballista to do damage to player.");
			IsDamageTamed = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsDamageTamed", false, "Allow Ballista to do damage tammed animal.");
			BallistaName = ((BaseUnityPlugin)this).Config.Bind<string>("Turret Setup", "BallistaName", "Noob Ballista", "Rename your Ballista. Required game restart");
			BallistaSize = ((BaseUnityPlugin)this).Config.Bind<float>("Turret Setup", "BallistaSize", 0.3f, "Ballista scale size. Valid value 0.1 ~ 1.0");
			ViewDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Turret Setup", "ViewDistance", 30f, "Distance Ballista can shoot.");
			MaximumAmmo = ((BaseUnityPlugin)this).Config.Bind<int>("Turret Setup", "MaximumAmmo", 100, "Maximum ammo stored on Ballista");
			AttackCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Turret Setup", "AttackCooldown", 1f, "Ballista interval between shoot.");
			TurnRate = ((BaseUnityPlugin)this).Config.Bind<float>("Turret Setup", "TurnRate", 100f, "Ballista turn speed.");
			ReturnAmmoOnDestroy = ((BaseUnityPlugin)this).Config.Bind<bool>("Turret Setup", "ReturnAmmoOnDestroy", true, "Ballista respawn ammo on destroyed. Override by IsRequiredAmmo");
			TurretRequirement1 = ((BaseUnityPlugin)this).Config.Bind<string>("TURRET REQUIREMENT", "TurretRequirement1", "Wood|12", "Ballista crafting requirement. Can be empty for none.");
			TurretRequirement2 = ((BaseUnityPlugin)this).Config.Bind<string>("TURRET REQUIREMENT", "TurretRequirement2", "Stone|4", "Ballista crafting requirement. Can be empty for none.");
			TurretRequirement3 = ((BaseUnityPlugin)this).Config.Bind<string>("TURRET REQUIREMENT", "TurretRequirement3", "Resin|20", "Ballista crafting requirement. Can be empty for none.");
			TurretRequirement4 = ((BaseUnityPlugin)this).Config.Bind<string>("TURRET REQUIREMENT", "TurretRequirement4", "DeerHide|14", "Ballista crafting requirement. Can be empty for none.");
			TurretRequirement5 = ((BaseUnityPlugin)this).Config.Bind<string>("TURRET REQUIREMENT", "TurretRequirement5", "LeatherScraps|18", "Ballista crafting requirement. Can be empty for none.");
			BoltName = ((BaseUnityPlugin)this).Config.Bind<string>("Bolt Setup", "BoltName", "Noob Bolt", "Rename your Ballista's Bolt. Required game restart.");
			BoltMaxStackSize = ((BaseUnityPlugin)this).Config.Bind<int>("Bolt Setup", "BoltMaxStackSize", 300, "Bolt stack size.");
			BoltAttackForce = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "AttackForce", 24f, "Bolt attack force. Vanilla default 45");
			BoltDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltDamage", 12f, "Bolt damage. Vanilla default 45.");
			BoltPierce = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltPierce", 12f, "Bolt Pierce damage Vanilla default 75.");
			BoltBlunt = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltBlunt", 12f, "Bolt Blunt damage");
			BoltSlash = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltSlash", 12f, "Bolt Slash damage");
			BoltChop = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltChop", 12f, "Bolt Chop damage");
			BoltPickAxe = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltPickAxe", 12f, "Bolt PickAxe damage");
			BoltFire = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltFire", 12f, "Bolt Fire damage");
			BoltFrost = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltFrost", 12f, "Bolt Frost damage");
			BoltLighting = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltLighting", 12f, "Bolt Lighting damage");
			BoltPoison = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltPoison", 12f, "Bolt Poison damage");
			BoltSpirit = ((BaseUnityPlugin)this).Config.Bind<float>("Bolt Setup", "BoltSpirit", 12f, "Bolt Spirit damage");
			BoltRequirement1 = ((BaseUnityPlugin)this).Config.Bind<string>("BOLT REQUIREMENT", "BoltRequirement1", "Wood|10", "Bolt crafting requirement. Can be empty for none.");
			BoltRequirement2 = ((BaseUnityPlugin)this).Config.Bind<string>("BOLT REQUIREMENT", "BoltRequirement2", "Resin|5", "Bolt crafting requirement. Can be empty for none.");
			BoltRequirement3 = ((BaseUnityPlugin)this).Config.Bind<string>("BOLT REQUIREMENT", "BoltRequirement3", "", "Bolt crafting requirement. Can be empty for none.");
			harmony.PatchAll();
			PrefabManager.OnVanillaPrefabsAvailable += SetupNoobBallista;
			AddLocalizations();
		}

		public void OnDestroy()
		{
			harmony.UnpatchSelf();
		}

		private void AddLocalizations()
		{
			CustomLocalization localization = LocalizationManager.Instance.GetLocalization();
			string text = "English";
			localization.AddTranslation(ref text, new Dictionary<string, string>
			{
				{ "item_noobballista", BallistaName.Value },
				{
					"item_noobballista_desc",
					"Defensive " + BallistaName.Value
				},
				{
					"$item_noobbolt".Replace("$", ""),
					BoltName.Value
				},
				{
					"item_noobbolt_desc",
					BoltName.Value + " for turret " + BallistaName.Value
				},
				{
					"ammo_noobbolt",
					"Ammo " + BoltName.Value
				}
			});
		}

		private void SetupNoobBallista()
		{
			//IL_0039: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Expected O, but got Unknown
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: 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_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: 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_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: 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_017e: Expected O, but got Unknown
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Expected O, but got Unknown
			Texture2D styleTex = LoadTexture("NoobBallista", "noobmissile_texture_red.png");
			Texture2D val = LoadTexture("NoobBallista", "noobmissile_icon_red.png");
			Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero);
			ItemConfig val3 = new ItemConfig();
			val3.Name = "$item_noobbolt";
			val3.Description = "$item_noobbolt_desc";
			val3.CraftingStation = "piece_workbench";
			val3.RepairStation = null;
			val3.Amount = 30;
			val3.Icons = (Sprite[])(object)new Sprite[1] { val2 };
			val3.StyleTex = styleTex;
			ItemConfig val4 = val3;
			AddRequirement(BoltRequirement1.Value, null, val4);
			AddRequirement(BoltRequirement2.Value, null, val4);
			AddRequirement(BoltRequirement3.Value, null, val4);
			CustomItem val5 = new CustomItem("NoobBolt", "TurretBolt", val4);
			ItemManager.Instance.AddItem(val5);
			Texture2D val6 = LoadTexture("NoobBallista", "noobballista_icon.png");
			Sprite icon = Sprite.Create(val6, new Rect(0f, 0f, (float)((Texture)val6).width, (float)((Texture)val6).height), Vector2.zero);
			PieceConfig val7 = new PieceConfig
			{
				Name = "$item_noobballista",
				Description = "$item_noobballista_desc",
				PieceTable = "Hammer",
				Category = "Misc",
				CraftingStation = "",
				Icon = icon,
				AllowedInDungeons = true
			};
			AddRequirement(TurretRequirement1.Value, val7);
			AddRequirement(TurretRequirement2.Value, val7);
			AddRequirement(TurretRequirement3.Value, val7);
			AddRequirement(TurretRequirement4.Value, val7);
			AddRequirement(TurretRequirement5.Value, val7);
			CustomPiece val8 = new CustomPiece("NoobBallista", "piece_turret", val7);
			PieceManager.Instance.AddPiece(val8);
			PrefabManager.OnVanillaPrefabsAvailable -= SetupNoobBallista;
			static void AddRequirement(string requirement, PieceConfig piececonfig = null, ItemConfig itemconfig = null)
			{
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Expected O, but got Unknown
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0086: Expected O, but got Unknown
				string text = requirement.Replace(" ", "");
				text = text.Replace(" ", "");
				if (text.Length > 3)
				{
					string[] array = text.Split(new char[1] { '|' });
					if (array.Length == 2)
					{
						if (int.TryParse(array[1].Replace(" ", ""), out var result))
						{
							if (piececonfig != null)
							{
								piececonfig.AddRequirement(new RequirementConfig(array[0], result, 0, true));
							}
							if (itemconfig != null)
							{
								itemconfig.AddRequirement(new RequirementConfig(array[0], result, 0, false));
							}
						}
					}
					else
					{
						Logger.LogWarning((object)"********** AddRequirement Vertical Pipe/Splitter Error **********");
					}
				}
			}
		}

		private static Texture2D LoadTexture(string pluginNameSpace, string fileName)
		{
			//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_0057: Expected O, but got Unknown
			//IL_0059: Expected O, but got Unknown
			Texture2D val;
			if (cachedTextures.ContainsKey(fileName))
			{
				val = cachedTextures[fileName];
			}
			else
			{
				Stream? manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(pluginNameSpace + ".Package.Assets." + fileName);
				byte[] array = new byte[manifestResourceStream.Length];
				manifestResourceStream.Read(array, 0, array.Length);
				Texture2D val2 = new Texture2D(0, 0);
				ImageConversion.LoadImage(val2, array);
				val = val2;
				cachedTextures.Add(fileName, val);
			}
			return val;
		}

		private static Vector3 GetNewScale()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Clamp(BallistaSize.Value, 0.1f, 1f);
			return new Vector3(num, num, num);
		}

		private static void AddInfinityAmmo(Turret turret)
		{
			if (IsRequiredAmmo.Value)
			{
				return;
			}
			for (int i = 0; i < 2; i++)
			{
				if (turret.GetAmmo() >= 2)
				{
					break;
				}
				turret.m_nview.InvokeRPC("RPC_AddAmmo", new object[1] { "NoobBolt" });
			}
		}

		private static bool IsNoobProjectile(Projectile projectile)
		{
			if ((Object)(object)projectile != (Object)null && projectile.m_ammo != null)
			{
				return projectile.m_ammo.m_shared.m_name == "$item_noobbolt";
			}
			return false;
		}

		private static void SetScale(ZNetView zview)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)zview != (Object)null)
			{
				zview.m_syncInitialScale = false;
				zview.SetLocalScale(GetNewScale());
			}
		}

		private static bool IsNoobPrefab(ZNetView instance, string name)
		{
			if ((Object)(object)instance != (Object)null)
			{
				return instance.GetPrefabName() == name;
			}
			return false;
		}

		private static bool CheckKeyHeld(string value, bool req = true)
		{
			try
			{
				return Input.GetKey(value.ToLower());
			}
			catch
			{
				return !req;
			}
		}
	}
}
namespace NoobBallista.Properties
{
	[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
	[DebuggerNonUserCode]
	[CompilerGenerated]
	internal class Resources
	{
		private static ResourceManager resourceMan;

		private static CultureInfo resourceCulture;

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static ResourceManager ResourceManager
		{
			get
			{
				if (resourceMan == null)
				{
					resourceMan = new ResourceManager("NoobBallista.Properties.Resources", typeof(Resources).Assembly);
				}
				return resourceMan;
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		internal static CultureInfo Culture
		{
			get
			{
				return resourceCulture;
			}
			set
			{
				resourceCulture = value;
			}
		}

		internal Resources()
		{
		}
	}
}