Decompiled source of SlingShot v1.1.1

GsiX.SlingShot.dll

Decompiled 5 months ago
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
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 SlingShot;

internal class SlingJump
{
	private GameObject Anim_Jump1;

	private GameObject Anim_Jump2;

	private GameObject Anim_Jump3;

	private GameObject Anim_Jump4;

	private Quaternion rotbuff;

	private readonly float rotX = 90f;

	private readonly float rotY;

	private readonly float rotZ;

	public void LoadAnim()
	{
		Anim_Jump1 = ZNetScene.instance.GetPrefab("fx_iceshard_launch");
		Anim_Jump2 = ZNetScene.instance.GetPrefab("fx_float_nibble");
		Anim_Jump3 = ZNetScene.instance.GetPrefab("fx_fenring_flames");
		Anim_Jump4 = ZNetScene.instance.GetPrefab("fx_Abomination_attack1");
	}

	public void CreateEffect(Vector3 pos, Quaternion rot)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: 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_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: 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_0047: 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)
		rotbuff = rot;
		rotbuff *= Quaternion.Euler(rotX, rotY, rotZ);
		Play(Anim_Jump1, pos, rotbuff);
		Play(Anim_Jump2, pos, rotbuff);
		static void Play(GameObject fxAnime, Vector3 fxPos, Quaternion fxRot)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)fxAnime != (Object)null)
			{
				Object.Instantiate<GameObject>(fxAnime, fxPos, fxRot);
			}
		}
	}
}
[BepInPlugin("GsiX.SlingShot", "GsiX Sling Shot", "1.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
internal class SlingShotPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Player), "Start")]
	private static class Player_Start_Patch
	{
		private static void Postfix(Player __instance)
		{
			if (PluginEnabled.Value && !((Object)(object)__instance == (Object)null) && IsLocalPlayer(((Component)__instance).gameObject))
			{
				if ((Object)(object)LocalPlayer == (Object)null)
				{
					LocalPlayer = __instance;
				}
				if ((Object)(object)LocalCharac == (Object)null)
				{
					LocalCharac = ((Component)__instance).GetComponent<Character>();
				}
				if ((Object)(object)LocalHumans == (Object)null)
				{
					LocalHumans = ((Component)__instance).GetComponent<Humanoid>();
				}
				Hammers.ResetHomming(isrespawn: true);
			}
		}
	}

	[HarmonyPatch(typeof(Player), "OnJump")]
	private static class Player_OnJump_Patch
	{
		private static void Postfix(Player __instance)
		{
			if (PluginEnabled.Value && !((Object)(object)__instance == (Object)null) && IsLocalPlayer(((Component)__instance).gameObject))
			{
				AirJumpCount = 1;
			}
		}
	}

	[HarmonyPatch(typeof(Character), "UpdateGroundContact")]
	private static class Character_UpdateGroundContact_Patch
	{
		private static void Postfix(Character __instance, float dt)
		{
			if (PluginEnabled.Value && !((Object)(object)__instance == (Object)null) && IsLocalPlayer(((Component)__instance).gameObject) && __instance.IsOnGround())
			{
				AirJumpCount = 0;
				SlingJumpCount = 0;
				AirJumpOverride = false;
				if ((Object)(object)Hammers.homming_characterDamage != (Object)null)
				{
					Hammers.HommingCharacterDamageDelayStart();
				}
			}
		}
	}

	[HarmonyPatch(typeof(Character), "Damage")]
	private static class Character_Damage_Patch
	{
		private static bool Prefix(Character __instance, HitData hit, ref bool __runOriginal)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Invalid comparison between Unknown and I4
			if (!PluginEnabled.Value || (Object)(object)__instance == (Object)null || !IsLocalPlayer(((Component)__instance).gameObject))
			{
				return true;
			}
			if ((Object)(object)Hammers.homming_characterDamage == (Object)(object)__instance && (int)hit.m_hitType == 3)
			{
				__runOriginal = false;
				return false;
			}
			__runOriginal = true;
			return true;
		}
	}

	[HarmonyPatch(typeof(VisEquipment), "UpdateEquipmentVisuals")]
	private class VisEquipment_UpdateEquipmentVisuals_Patch
	{
		private static void Postfix(VisEquipment __instance)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnabled.Value && (Object)(object)__instance != (Object)null)
			{
				if ((Object)(object)__instance.m_rightItemInstance != (Object)null && __instance.m_rightItem == Hammers.name)
				{
					__instance.m_rightItemInstance.transform.localScale = Hammers.GetScale();
				}
				if ((Object)(object)__instance.m_rightBackItemInstance != (Object)null && __instance.m_rightBackItem == Hammers.name)
				{
					float num = Hammers.scale / 100f;
					__instance.m_rightBackItemInstance.transform.localScale = new Vector3(num, num, num);
					__instance.m_rightBackItemInstance.transform.localPosition = new Vector3(0f, 0f, 0.002f);
				}
			}
		}
	}

	[HarmonyPatch(typeof(ItemStand), "SetVisualItem")]
	private class ItemStand_SetVisualItem_Patch
	{
		private static void Postfix(ItemStand __instance, string itemName, int variant, int quality)
		{
			//IL_0045: 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)
			if (PluginEnabled.Value && (Object)(object)__instance != (Object)null && (Object)(object)__instance.m_visualItem != (Object)null && itemName == Hammers.name)
			{
				__instance.m_visualItem.transform.localScale = Hammers.GetScale();
				__instance.m_visualItem.transform.localPosition = new Vector3(0f, 0.03f, -0.4f);
			}
		}
	}

	[HarmonyPatch(typeof(Humanoid), "StartAttack")]
	private static class Humanoid_StartAttack_Patch
	{
		private static bool Prefix(Humanoid __instance, Character target, bool secondaryAttack, ref bool __runOriginal, ref bool __result)
		{
			if (PluginEnabled.Value && (Object)(object)__instance != (Object)null && IsLocalPlayer(((Component)__instance).gameObject))
			{
				if (!Hammers.IsHommingCompleted())
				{
					__result = false;
					__runOriginal = false;
					return __runOriginal;
				}
				if (secondaryAttack)
				{
					ItemData currentWeapon = __instance.GetCurrentWeapon();
					if (currentWeapon != null && Hammers.IsSlingPrefab(currentWeapon.m_dropPrefab) && ((RequiredJump.Value && AirJumpCount < 2 && !ZInput.GetKey((KeyCode)324, true)) || SlingJumpCount >= SlingJumpMaximum.Value))
					{
						__result = false;
						__runOriginal = false;
						return __runOriginal;
					}
				}
			}
			__runOriginal = true;
			return __runOriginal;
		}

		private static void Postfix(Humanoid __instance, Character target, bool secondaryAttack, bool __result)
		{
			if (!PluginEnabled.Value || !((Object)(object)__instance != (Object)null) || !IsLocalPlayer(((Component)__instance).gameObject) || !secondaryAttack || !Hammers.IsHommingCompleted())
			{
				return;
			}
			ItemData currentWeapon = __instance.GetCurrentWeapon();
			if (currentWeapon != null && Hammers.IsSlingPrefab(currentWeapon.m_dropPrefab) && __result)
			{
				Hammers.HommingStart(__instance, currentWeapon);
				SlingJumpCount++;
				if (SlingJumpCount >= 3 && SlingJumpCount < SlingJumpMaximum.Value)
				{
					PrintCenterMsg("Sling Jump Count <color=green>" + SlingJumpCount + "</color>");
				}
				else if (SlingJumpCount == SlingJumpMaximum.Value)
				{
					PrintCenterMsg("Sling Jump Count <color=green>Maximum</color>");
				}
			}
		}
	}

	[HarmonyPatch(typeof(Humanoid), "IsBlocking")]
	private static class Humanoid_IsBlocking_Patch
	{
		private static bool Prefix(Humanoid __instance, ref bool __result, ref bool __runOriginal)
		{
			//IL_0044: 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_0059: 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_007c: Unknown result type (might be due to invalid IL or missing references)
			if (!PluginEnabled.Value && (Object)(object)__instance == (Object)null)
			{
				__runOriginal = true;
				return __runOriginal;
			}
			if (IsLocalPlayer(((Component)__instance).gameObject))
			{
				ItemData currentWeapon = __instance.GetCurrentWeapon();
				if (Hammers.IsSlingPrefab(currentWeapon.m_dropPrefab))
				{
					Gizmos.color = Color.blue;
					Gizmos.DrawWireCube(((Component)__instance).transform.position + Vector3.down * 3f, new Vector3(1f, 0.05f, 1f));
					if (ZInput.GetKey((KeyCode)116, true) && Time.time - FarmModeInterval > 0.2f)
					{
						FarmModeInterval = Time.time;
						Hammers.SetFarmtype();
					}
				}
				if (Hammers.homming_timeOut != -1f)
				{
					__result = false;
					__runOriginal = false;
					return __runOriginal;
				}
			}
			__runOriginal = true;
			return __runOriginal;
		}
	}

	[HarmonyPatch(typeof(Projectile), "Setup")]
	private static class Projectile_Setup_Patch
	{
		private static void Postfix(Projectile __instance, Character owner, Vector3 velocity, float hitNoise, HitData hitData, ItemData item, ItemData ammo)
		{
			if (PluginEnabled.Value && (Object)(object)__instance != (Object)null && (Object)(object)owner != (Object)null && IsLocalPlayer(((Component)owner).gameObject) && item != null && Hammers.IsSlingPrefab(item.m_dropPrefab))
			{
				Hammers.ProjectileSetup(__instance, item, AreaAttackRadius.Value);
			}
		}
	}

	[HarmonyPatch(typeof(Projectile), "FixedUpdate")]
	private static class Projectile_FixedUpdate_Patch
	{
		private static bool Prefix(Projectile __instance, ref bool __runOriginal)
		{
			//IL_0035: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnabled.Value && IsSlingShotProjectile(__instance) && IsLocalPlayer(((Component)__instance.m_owner).gameObject))
			{
				Vector3 position = ((Component)__instance).transform.position;
				float value = SlingShotRange.Value;
				bool flag = Hammers.DidHitWater(position);
				bool key = ZInput.GetKey((KeyCode)32, true);
				if (key)
				{
					value = SlingJumpRange.Value;
				}
				if (Hammers.IsOutbound(__instance, value) || flag || Hammers.IsTimedOut())
				{
					if (key)
					{
						__instance.m_owner.m_seman.AddStatusEffect(SlingJumpSE.NameHash(), true, 0, 0f);
					}
					Hammers.SetFakeHit();
					__instance.OnHit((Collider)null, position, false);
					__runOriginal = false;
					return __runOriginal;
				}
			}
			__runOriginal = true;
			return __runOriginal;
		}
	}

	[HarmonyPatch(typeof(Projectile), "OnHit")]
	private static class Projectile_OnHit_Patch
	{
		private static void Postfix(Projectile __instance, Collider collider, Vector3 hitPoint, bool water)
		{
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_00a0: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnabled.Value && IsSlingShotProjectile(__instance) && Hammers.homming_timeOut != -1f)
			{
				bool teleport = false;
				bool createStartEffect = false;
				if (!Hammers.isFarming && ((!Hammers.DidHitWater(hitPoint) && !Hammers.IsFakeHit()) || (__instance.m_owner.m_seman.HaveStatusEffect(SlingJumpSEname) && !Hammers.DidHitWater(hitPoint))))
				{
					teleport = true;
					createStartEffect = EnableTakeoff.Value;
				}
				Vector3 position = ((Component)__instance.m_owner).transform.position;
				Hammers.HommingEnds(__instance, position, hitPoint, Quaternion.identity, teleport, createStartEffect, EnableLanding.Value);
				AirJumpOverride = true;
			}
		}
	}

	[HarmonyPatch(typeof(Projectile), "SpawnOnHit")]
	private static class Projectile_SpawnOnHit_Patch
	{
		private static bool Prefix(Projectile __instance, GameObject go, Collider collider, ref bool __runOriginal)
		{
			if (PluginEnabled.Value && IsSlingShotProjectile(__instance))
			{
				__runOriginal = false;
				return __runOriginal;
			}
			__runOriginal = true;
			return __runOriginal;
		}
	}

	[HarmonyPatch(typeof(TombStone), "Awake")]
	private static class TombStone_Awake_Patch
	{
		private static void Postfix(TombStone __instance)
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			if (!PluginEnabled.Value || !((Object)(object)__instance != (Object)null) || !Hammers.HasHommingDummy())
			{
				return;
			}
			long owner = __instance.GetOwner();
			long playerID = Player.m_localPlayer.GetPlayerID();
			if (owner != playerID)
			{
				return;
			}
			Container component = ((Component)__instance).GetComponent<Container>();
			Inventory val = ((component != null) ? component.GetInventory() : null);
			if (val != null)
			{
				if (val.HaveEmptySlot())
				{
					val.AddItem(Hammers.GetHommingDummy());
					DLog("SlingJump returned to " + Player.m_localPlayer.GetPlayerName() + "'s Tombstone inventory.");
				}
				else
				{
					ItemDrop.DropItem(Hammers.GetHommingDummy(), 0, ((Component)__instance).transform.position, ((Component)__instance).transform.rotation);
					DLog("SlingJump spawned next to " + Player.m_localPlayer.GetPlayerName() + "'s Tombstone.");
				}
				Hammers.ResetHomming(isrespawn: true);
			}
		}
	}

	[HarmonyPatch(typeof(ZSyncTransform), "OwnerSync")]
	private class ZSyncTransform_OwnerSync_Patch
	{
		private static void Postfix(ref ZSyncTransform __instance)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnabled.Value && IsSlingshotView(__instance.m_nview))
			{
				__instance.m_nview.m_syncInitialScale = false;
				__instance.m_nview.SetLocalScale(new Vector3(Hammers.scale, Hammers.scale, Hammers.scale));
			}
		}
	}

	[HarmonyPatch(typeof(ZSyncTransform), "ClientSync")]
	private class ZSyncTransform_ClientSync_Patch
	{
		private static void Postfix(ZSyncTransform __instance)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnabled.Value && IsSlingshotView(__instance.m_nview))
			{
				__instance.m_nview.m_syncInitialScale = false;
				__instance.m_nview.SetLocalScale(new Vector3(Hammers.scale, Hammers.scale, Hammers.scale));
			}
		}
	}

	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	private static class ZNetScene_Awake_Patch
	{
		private static void Postfix(ZNetScene __instance)
		{
			if ((Object)(object)__instance != (Object)null)
			{
				Hammers.LoadAnim();
				DoJumps.LoadAnim();
			}
		}
	}

	public const string PluginGUID = "GsiX.SlingShot";

	public const string PluginName = "GsiX Sling Shot";

	public const string PluginVersion = "1.1.1";

	public const string PluginNamespace = "SlingShot";

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

	private static ManualLogSource DeLogger;

	private static Player LocalPlayer;

	private static Character LocalCharac;

	private static Humanoid LocalHumans;

	private static StatusEffect SlingJumpSE;

	private static string SlingJumpSEname = "SlingJumpDescend";

	private static int AirJumpCount;

	private static int SlingJumpCount;

	private static bool AirJumpOverride;

	private static float FarmModeInterval = Time.time;

	public static readonly string[] WorkbenchPiece = new string[6] { "piece_workbench", "forge", "piece_stonecutter", "piece_artisanstation", "blackforge", "piece_magetable" };

	public static readonly string[] WorkbenchConfig = new string[6] { "workbench", "forge", "stonecutter", "artisanstation", "blackforge", "magetable" };

	private static ConfigEntry<bool> PluginEnabled;

	private static ConfigEntry<bool> EnableMessage;

	private static ConfigEntry<float> JumpHealthCost;

	private static ConfigEntry<int> MaximumDoubleJump;

	private static ConfigEntry<bool> EnableSlingJump;

	private static ConfigEntry<bool> JumpRequireHammer;

	private static ConfigEntry<string> SlingCraftStations;

	private static ConfigEntry<string> SlingShotRequirement1;

	private static ConfigEntry<string> SlingShotRequirement2;

	private static ConfigEntry<string> SlingShotRequirement3;

	private static ConfigEntry<string> SlingShotRequirement4;

	private static ConfigEntry<float> SlingShotRange;

	private static ConfigEntry<float> SlingJumpRange;

	private static ConfigEntry<int> SlingJumpMaximum;

	private static ConfigEntry<bool> EnableTakeoff;

	private static ConfigEntry<bool> EnableLanding;

	private static ConfigEntry<bool> RequiredJump;

	private static ConfigEntry<float> AreaAttackRadius;

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

	private static SlingHammer Hammers;

	private static SlingJump DoJumps;

	public void Awake()
	{
		DeLogger = ((BaseUnityPlugin)this).Logger;
		Hammers = new SlingHammer();
		DoJumps = new SlingJump();
		PluginEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("PluginEnable", "PluginEnabled", true, "Enable/disable plugin.");
		EnableMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGJUMP SETUP", "EnableMessage", true, "Enable/Disable center message from SlingShot.");
		JumpHealthCost = ((BaseUnityPlugin)this).Config.Bind<float>("SLINGJUMP SETUP", "HealthCost", 2f, "Health cost every time double jump prefomed. Set 0 to turn off.");
		MaximumDoubleJump = ((BaseUnityPlugin)this).Config.Bind<int>("SLINGJUMP SETUP", "MaxAirJump", 2, "How many midair jump allowed.");
		EnableSlingJump = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGJUMP SETUP", "EnableSlingJump", true, "Enable/Disable multiple midair jump.");
		JumpRequireHammer = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGJUMP SETUP", "JumpRequireHammer", true, "Require Sling Hammer to do multiple jump.");
		SlingCraftStations = ((BaseUnityPlugin)this).Config.Bind<string>("REQUIREMENT", "CraftingStation", "forge", "Valid list - workbench, forge, stonecutter, artisanstation, blackforge, magetable");
		SlingShotRequirement1 = ((BaseUnityPlugin)this).Config.Bind<string>("REQUIREMENT", "Requirement1", "Silver|20", "Crafting requirement. Can be empty for none");
		SlingShotRequirement2 = ((BaseUnityPlugin)this).Config.Bind<string>("REQUIREMENT", "Requirement2", "Crystal|10", "Crafting requirement. Can be empty for none");
		SlingShotRequirement3 = ((BaseUnityPlugin)this).Config.Bind<string>("REQUIREMENT", "Requirement3", "Thunderstone|1", "Crafting requirement. Can be empty for none");
		SlingShotRequirement4 = ((BaseUnityPlugin)this).Config.Bind<string>("REQUIREMENT", "Requirement4", "BattleaxeCrystal|1", "Crafting requirement. Can be empty for none");
		SlingShotRange = ((BaseUnityPlugin)this).Config.Bind<float>("SLINGSHOT SETUP", "SlingShotRange", 60f, "Maximum range Sling Shot didn't hit anything, return to owner. Min 5, Max 100 or timed out at 3 seconds");
		SlingJumpRange = ((BaseUnityPlugin)this).Config.Bind<float>("SLINGSHOT SETUP", "SlingJumpRange", 30f, "Maximum range Sling Jump to teleport player. Min 5, Max 50");
		SlingJumpMaximum = ((BaseUnityPlugin)this).Config.Bind<int>("SLINGSHOT SETUP", "SlingJumpMaximum", 10, "Maximum mid air sling jump(Holding Spacebar). Min 2, Max 15");
		EnableTakeoff = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGSHOT SETUP", "EnableTakeoffAnimation", true, "Leave an animation, mark the former location.");
		EnableLanding = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGSHOT SETUP", "EnableLandingAnimation", true, "Leave an animation, mark the later location.");
		RequiredJump = ((BaseUnityPlugin)this).Config.Bind<bool>("SLINGSHOT SETUP", "RequiredJump", true, "Require at least double jump to do slingshot. EnableSlingJump must set to true.");
		AreaAttackRadius = ((BaseUnityPlugin)this).Config.Bind<float>("SLINGSHOT SETUP", "AreaAttackRadius", 3f, "Area of Demolish/Fetch radius.");
		SlingShotRange.SettingChanged += delegate
		{
			UpdateSlingSetup();
		};
		SlingJumpRange.SettingChanged += delegate
		{
			UpdateSlingSetup();
		};
		SlingJumpMaximum.SettingChanged += delegate
		{
			UpdateSlingSetup();
		};
		harmony.PatchAll();
		AddLocalizations();
		SlingJumpStatusEffects();
		PrefabManager.OnVanillaPrefabsAvailable += SetupSlingShot;
	}

	private static void UpdateSlingSetup()
	{
		if (SlingShotRange.Value > 100f)
		{
			SlingShotRange.Value = 100f;
		}
		else if (SlingShotRange.Value < 5f)
		{
			SlingShotRange.Value = 5f;
		}
		if (SlingJumpRange.Value > 50f)
		{
			SlingJumpRange.Value = 50f;
		}
		else if (SlingShotRange.Value < 5f)
		{
			SlingShotRange.Value = 5f;
		}
		if (SlingJumpMaximum.Value > 15)
		{
			SlingJumpMaximum.Value = 15;
		}
		else if (SlingJumpMaximum.Value < 2)
		{
			SlingJumpMaximum.Value = 2;
		}
	}

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

	public void Update()
	{
		if (PluginEnabled.Value && !((Object)(object)LocalPlayer == (Object)null) && !((Object)(object)LocalCharac == (Object)null) && !((Object)(object)LocalHumans == (Object)null))
		{
			if (ZInput.GetKeyDown((KeyCode)32, true))
			{
				DoDoubleJump(LocalCharac);
			}
			Hammers.DelayedSlingActionUpdate();
			Hammers.AnimationSpeed();
			Hammers.HommingEndRetry();
			Hammers.HommingIntervalUpdate();
			Hammers.HommingCharacterDamageDelayUpdate();
		}
	}

	public void AddLocalizations()
	{
		CustomLocalization localization = LocalizationManager.Instance.GetLocalization();
		string text = "English";
		localization.AddTranslation(ref text, new Dictionary<string, string>
		{
			{
				Hammers.item.Replace("$", ""),
				"Sling Shot"
			},
			{ "item_slingshot_desc", "\n<color=yellow>Midair Slingshot Ability</color>" },
			{ "slingeffect_fffectname", "Sling Jump" }
		});
	}

	private void SlingJumpStatusEffects()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Expected O, but got Unknown
		SE_Stats obj = ScriptableObject.CreateInstance<SE_Stats>();
		((Object)obj).name = SlingJumpSEname;
		((StatusEffect)obj).m_name = "$slingeffect_fffectname";
		obj.m_maxMaxFallSpeed = 0.1f;
		CustomStatusEffect val = new CustomStatusEffect((StatusEffect)(object)obj, false);
		SlingJumpSE = val.StatusEffect;
		SlingJumpSE.m_ttl = 1f;
		ItemManager.Instance.AddStatusEffect(val);
	}

	public void SetupSlingShot()
	{
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Expected O, but got Unknown
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_014a: Expected O, but got Unknown
		string text = SlingCraftStations.Value.Replace(" ", "");
		string craftingStation = WorkbenchPiece[0];
		for (int i = 0; i < WorkbenchConfig.Length; i++)
		{
			if (WorkbenchConfig[i] == text)
			{
				craftingStation = WorkbenchPiece[i];
				break;
			}
		}
		LoadTexture("SlingShot", "slingshot_texture.png");
		Texture2D val = LoadTexture("SlingShot", "slingshot_icon.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 = Hammers.item;
		val3.Description = "$item_slingshot_desc";
		val3.CraftingStation = craftingStation;
		val3.RepairStation = null;
		val3.Amount = 1;
		val3.Icons = (Sprite[])(object)new Sprite[1] { val2 };
		ItemConfig val4 = val3;
		AddRequirement(val4, SlingShotRequirement1.Value);
		AddRequirement(val4, SlingShotRequirement2.Value);
		AddRequirement(val4, SlingShotRequirement3.Value);
		AddRequirement(val4, SlingShotRequirement4.Value);
		CustomItem val5 = new CustomItem(Hammers.name, Hammers.clone, val4);
		ItemManager.Instance.AddItem(val5);
		PrefabManager.OnVanillaPrefabsAvailable -= SetupSlingShot;
		static void AddRequirement(ItemConfig itemconfig, string requirement)
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Expected O, but got Unknown
			string text2 = requirement.Replace(" ", "");
			text2 = text2.Replace(" ", "");
			if (text2.Length > 3)
			{
				string[] array = text2.Split(new char[1] { '|' });
				if (array.Length == 2)
				{
					if (int.TryParse(array[1].Replace(" ", ""), out var result) && itemconfig != null)
					{
						itemconfig.AddRequirement(new RequirementConfig(array[0], result, 0, false));
					}
				}
				else
				{
					Logger.LogWarning((object)"********** AddRequirement Vertical Pipe/Splitter Error **********");
				}
			}
		}
	}

	public static void DoDoubleJump(Character character)
	{
		//IL_0158: 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_0176: 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_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_0189: 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_01aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d3: 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_01e5: 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_01ef: 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_01bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0201: Unknown result type (might be due to invalid IL or missing references)
		//IL_024e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		//IL_0292: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0321: Unknown result type (might be due to invalid IL or missing references)
		//IL_032c: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d9: Expected O, but got Unknown
		//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0300: Unknown result type (might be due to invalid IL or missing references)
		//IL_0309: Unknown result type (might be due to invalid IL or missing references)
		//IL_022c: Unknown result type (might be due to invalid IL or missing references)
		if (!EnableSlingJump.Value || AirJumpCount <= 0 || (AirJumpCount > MaximumDoubleJump.Value && !AirJumpOverride))
		{
			return;
		}
		if (JumpRequireHammer.Value)
		{
			Humanoid component = ((Component)character).GetComponent<Humanoid>();
			if ((Object)(object)component != (Object)null && (component.m_rightItem == null || !component.m_rightItem.IsWeapon() || !Hammers.IsSlingPrefab(component.m_rightItem.m_dropPrefab)))
			{
				return;
			}
		}
		if (JumpHealthCost.Value > 0f && character.GetHealth() - JumpHealthCost.Value <= JumpHealthCost.Value)
		{
			Hud.instance.FlashHealthBar();
			PrintCenterMsg("Health Too Low");
			return;
		}
		bool flag = false;
		if (!character.HaveStamina(character.m_jumpStaminaUsage))
		{
			if (character.IsPlayer())
			{
				Hud.instance.StaminaBarEmptyFlash();
			}
			flag = true;
		}
		float speed = character.m_speed;
		character.m_seman.ApplyStatusEffectSpeedMods(ref speed);
		if (speed <= 0f)
		{
			flag = true;
		}
		float num = 0f;
		Skills skills = character.GetSkills();
		if ((Object)(object)skills != (Object)null)
		{
			num = skills.GetSkillFactor((SkillType)100);
			if (!flag)
			{
				character.RaiseSkill((SkillType)100, 1f);
			}
			float num2 = 2f;
			if (AirJumpCount >= 2)
			{
				num2 = 4f;
			}
			num *= num2;
		}
		Vector3 val = character.m_body.velocity;
		Mathf.Acos(Mathf.Clamp01(character.m_lastGroundNormal.y));
		Vector3 val2 = character.m_lastGroundNormal + Vector3.up;
		Vector3 normalized = ((Vector3)(ref val2)).normalized;
		float num3 = 1f + num * 0.4f;
		float num4 = character.m_jumpForce * num3;
		float num5 = Vector3.Dot(normalized, val);
		if (num5 < num4)
		{
			val += normalized * (num4 - num5);
		}
		val += character.m_moveDir * character.m_jumpForceForward * num3;
		if (flag)
		{
			val *= character.m_jumpForceTiredFactor;
		}
		character.m_seman.ApplyStatusEffectJumpMods(ref val);
		if (val.x > 0f || val.y > 0f || val.z > 0f)
		{
			Hammers.homming_characterDamage = character;
			character.m_body.velocity = val;
			character.m_jumpTimer = 0f;
			character.m_zanim.SetTrigger("jump");
			character.AddNoise(30f);
			character.m_jumpEffects.Create(((Component)character).transform.position, ((Component)character).transform.rotation, ((Component)character).transform, 1f, -1);
			if (JumpHealthCost.Value > 0f)
			{
				Vector3 lastGroundPoint = character.m_lastGroundPoint;
				lastGroundPoint.y += 3f;
				HitData val3 = new HitData();
				val3.m_damage.m_damage = JumpHealthCost.Value;
				val3.m_point = lastGroundPoint;
				val3.m_dir = character.m_lastGroundNormal;
				val3.m_hitType = (HitType)14;
				character.Damage(val3);
			}
			DoJumps.CreateEffect(((Component)character).transform.position, ((Component)character).transform.rotation);
			AirJumpCount++;
			AirJumpOverride = false;
		}
	}

	private static bool IsLocalPlayer(GameObject instance)
	{
		if ((Object)(object)instance != (Object)null)
		{
			Player component = instance.GetComponent<Player>();
			if ((Object)(object)component != (Object)null)
			{
				return (Object)(object)component == (Object)(object)Player.m_localPlayer;
			}
			return false;
		}
		return false;
	}

	private static bool IsSlingShotProjectile(Projectile projectile)
	{
		if ((Object)(object)projectile != (Object)null && projectile.m_spawnItem != null && (Object)(object)projectile.m_owner != (Object)null)
		{
			return ((Object)projectile.m_spawnItem.m_dropPrefab).name == Hammers.name;
		}
		return false;
	}

	private static Texture2D LoadTexture(string pluginGUID, 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(pluginGUID + ".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 bool IsSlingshotView(ZNetView instance)
	{
		if ((Object)(object)instance != (Object)null)
		{
			return instance.GetPrefabName() == Hammers.name;
		}
		return false;
	}

	private static void PrintCenterMsg(string text)
	{
		if (EnableMessage.Value && (Object)(object)LocalHumans != (Object)null)
		{
			((Character)LocalHumans).Message((MessageType)2, Localization.instance.Localize(text), 0, (Sprite)null);
		}
	}

	private static void DLog(string text)
	{
		DeLogger.LogMessage((object)text);
	}
}
internal class SlingHammer
{
	private enum FarmType
	{
		Demolish,
		Repair,
		ItemFetch,
		FriendlyFetch,
		TameableFetch,
		EnemyFetch
	}

	public readonly string name = "SlingShot";

	public readonly string item = "$item_slingshot";

	public readonly string clone = "BattleaxeCrystal";

	private readonly string anime_throw = "SpearCarapace";

	private readonly string anime_dummy = "DvergerStaffIce_projectile";

	private readonly string sprite_start = "vfx_Potion_health_medium";

	private readonly string sprite_ends = "fx_Potion_frostresist";

	public float scale = 0.5f;

	private const float scale2 = 1f;

	private readonly float speedVels = 60f;

	private readonly float speedAnim = 3f;

	public bool isFarming;

	public bool isFakeHit;

	private Vector3 projectileScale = new Vector3(1f, 1f, 1f);

	private GameObject Hammer_Instance;

	private GameObject Hammer_Dummy;

	private GameObject Animat_Throw;

	private GameObject Sprite_Start;

	private GameObject Sprite_Ends;

	private Humanoid localHuman;

	private List<GameObject> Sprite_Hits = new List<GameObject>();

	private readonly string[] sprite_hits = new string[3] { "fx_shaman_fireball_expl", "fx_guardstone_permitted_add", "fx_himminafl_aoe" };

	private FarmType farmingType;

	private readonly string[] farmText = new string[6] { "Sling Demolish", "Sling Repair", "Sling Items Fetch", "Sling Friendly Fetch", "Sling Tameable Fetch", "Sling Enemy Fetch" };

	private readonly float DelayedPickup = 1f;

	private float DelayedItemDrop_Time = -1f;

	private float DelayedCharacter_Time = -1f;

	private float DelayedRepair_Time = -1f;

	private List<KeyValuePair<ItemDrop, Humanoid>> DelayedItemDrop = new List<KeyValuePair<ItemDrop, Humanoid>>();

	private List<KeyValuePair<Character, Character>> DelayedCharacter = new List<KeyValuePair<Character, Character>>();

	private List<KeyValuePair<WearNTear, Piece>> DelayedRepair = new List<KeyValuePair<WearNTear, Piece>>();

	private int ChracterkMask = LayerMask.GetMask(new string[5] { "character", "character_net", "character_ghost", "hitbox", "character_noenv" });

	private ZSyncAnimation homming_animE;

	private Humanoid homming_owneR;

	private ItemData homming_dummY;

	public Character homming_characterDamage;

	private Inventory homming_inventorY;

	private float homming_characterDelay = -1f;

	public float homming_timeOut = -1f;

	public float homming_equipDelay = -1f;

	private float homming_interval = -1f;

	private int homming_retry;

	public void LoadAnim()
	{
		//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: 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_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_04dc: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < sprite_hits.Length; i++)
		{
			GameObject prefab = ZNetScene.instance.GetPrefab(sprite_hits[i]);
			if ((Object)(object)prefab != (Object)null)
			{
				Sprite_Hits.Add(prefab);
			}
		}
		Animat_Throw = ZNetScene.instance.GetPrefab(anime_throw);
		Sprite_Start = ZNetScene.instance.GetPrefab(sprite_start);
		Sprite_Ends = ZNetScene.instance.GetPrefab(sprite_ends);
		Hammer_Dummy = ZNetScene.instance.GetPrefab(anime_dummy);
		Hammer_Instance = ZNetScene.instance.GetPrefab(name);
		if (!((Object)(object)Hammer_Instance != (Object)null))
		{
			return;
		}
		Hammer_Instance.transform.localScale = new Vector3(scale, scale, scale);
		ItemDrop val = default(ItemDrop);
		if (Hammer_Instance.TryGetComponent<ItemDrop>(ref val))
		{
			val.m_itemData.m_shared.m_animationState = (AnimationState)1;
			val.m_itemData.m_shared.m_itemType = (ItemType)3;
			val.m_itemData.m_shared.m_attachOverride = (ItemType)3;
			val.m_itemData.m_shared.m_weight = 1f;
			val.m_itemData.m_shared.m_equipDuration = 0f;
			val.m_itemData.m_shared.m_backstabBonus = 8f;
			val.m_itemData.m_shared.m_deflectionForce = 30f;
			val.m_itemData.m_shared.m_deflectionForcePerLevel = 20f;
			val.m_itemData.m_shared.m_blockPower = 20f;
			val.m_itemData.m_shared.m_blockPowerPerLevel = 10f;
			val.m_itemData.m_shared.m_attackForce = 10f;
			val.m_itemData.m_shared.m_movementModifier = 0f;
			val.m_itemData.m_shared.m_spawnOnHit = null;
			val.m_itemData.m_shared.m_spawnOnHitTerrain = null;
			val.m_itemData.m_shared.m_damages.m_damage = 40f;
			val.m_itemData.m_shared.m_damages.m_blunt = 1f;
			val.m_itemData.m_shared.m_damages.m_frost = 1f;
			val.m_itemData.m_shared.m_damages.m_slash = 12f;
			val.m_itemData.m_shared.m_damages.m_pierce = 12f;
			val.m_itemData.m_shared.m_damages.m_chop = 8f;
			val.m_itemData.m_shared.m_damages.m_pickaxe = 8f;
			val.m_itemData.m_shared.m_damages.m_lightning = 1f;
			val.m_itemData.m_shared.m_damages.m_fire = 1f;
			val.m_itemData.m_shared.m_damages.m_poison = 1f;
			val.m_itemData.m_shared.m_damages.m_spirit = 1f;
			val.m_itemData.m_shared.m_attack.m_drawDurationMin = 0f;
			val.m_itemData.m_shared.m_attack.m_attackStamina = 12f;
			val.m_itemData.m_shared.m_attack.m_attackAnimation = "swing_longsword";
			ItemDrop val2 = default(ItemDrop);
			if ((Object)(object)Animat_Throw != (Object)null && Animat_Throw.TryGetComponent<ItemDrop>(ref val2))
			{
				Attack val3 = val2.m_itemData.m_shared.m_secondaryAttack.Clone();
				val3.m_speedFactor = 0.1f;
				val3.m_projectileBursts = 1;
				val3.m_ammoItem = null;
				val3.m_attackProjectile = Hammer_Dummy;
				val3.m_projectileVel = speedVels;
				val3.m_projectileVelMin = speedVels;
				val3.m_projectileAccuracy = 1f;
				val3.m_projectileAccuracyMin = 1f;
				val3.m_attackHeight = 1.6f;
				val3.m_attackRange = 1.9f;
				val3.m_drawDurationMin = 0f;
				val3.m_attackStamina = 0f;
				val3.m_drawStaminaDrain = 0f;
				val3.m_damageMultiplier = 0f;
				val3.m_forceMultiplier = 0f;
				CollectionExtensions.AddItem<EffectData>((IEnumerable<EffectData>)val3.m_hitEffect.m_effectPrefabs, CreateEffect(Sprite_Ends));
				val.m_itemData.m_shared.m_secondaryAttack = val3;
			}
		}
		ZSyncTransform val4 = default(ZSyncTransform);
		if (Hammer_Instance.TryGetComponent<ZSyncTransform>(ref val4))
		{
			val4.m_syncPosition = true;
			val4.m_syncRotation = true;
			val4.m_syncScale = true;
			val4.m_useGravity = false;
			ZNetView val5 = default(ZNetView);
			if (((Component)val4).TryGetComponent<ZNetView>(ref val5))
			{
				val5.m_syncInitialScale = true;
				val5.SetLocalScale(new Vector3(scale, scale, scale));
			}
			Projectile projectile = default(Projectile);
			if (Hammer_Dummy.TryGetComponent<Projectile>(ref projectile))
			{
				val4.m_projectile = projectile;
			}
		}
	}

	public bool IsOutbound(Projectile projectile, float maxrange)
	{
		return GetDistance(projectile) > maxrange;
	}

	public bool DidHitWater(Vector3 pos)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		float liquidLevel = Floating.GetLiquidLevel(pos, 1f, (LiquidType)10);
		return pos.y < liquidLevel;
	}

	public float GetDistance(Projectile projectile)
	{
		//IL_000b: 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)
		return Vector3.Distance(((Component)projectile.m_owner).transform.position, ((Component)projectile).gameObject.transform.position);
	}

	public void ProjectileSetup(Projectile projectile, ItemData weapon, float aoe)
	{
		//IL_0051: 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_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Expected O, but got Unknown
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: 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)
		if (projectile.m_gravity == 0.01f)
		{
			return;
		}
		homming_animE = null;
		homming_dummY = weapon;
		projectile.m_spawnItem = weapon;
		projectile.m_gravity = 0.01f;
		projectile.m_canHitWater = false;
		projectile.m_stayAfterHitDynamic = false;
		projectile.m_stayAfterHitStatic = false;
		projectile.m_spawnOnHit = null;
		((Component)projectile).transform.localScale = projectileScale;
		projectile.m_nview.m_syncInitialScale = false;
		projectile.m_nview.SetLocalScale(projectileScale);
		projectile.m_randomSpawnOnHit.Clear();
		projectile.m_aoe = 0f;
		projectile.m_hitEffects = new EffectList();
		CollectionExtensions.AddItem<EffectData>((IEnumerable<EffectData>)projectile.m_hitEffects.m_effectPrefabs, CreateEffect(Sprite_Ends));
		if (isFarming)
		{
			projectile.m_aoe = aoe;
			if (farmingType == FarmType.Demolish)
			{
				DamageTypes damage = weapon.GetDamage();
				projectile.m_damage = ((DamageTypes)(ref damage)).Clone();
				projectile.m_damage.m_chop = 30f;
				projectile.m_damage.m_pickaxe = 30f;
			}
			else
			{
				projectile.m_damage.m_blunt = 0f;
				projectile.m_damage.m_chop = 0f;
				projectile.m_damage.m_damage = 0f;
				projectile.m_damage.m_fire = 0f;
				projectile.m_damage.m_frost = 0f;
				projectile.m_damage.m_lightning = 0f;
				projectile.m_damage.m_pickaxe = 0f;
				projectile.m_damage.m_pierce = 0f;
				projectile.m_damage.m_poison = 0f;
				projectile.m_damage.m_slash = 0f;
				projectile.m_damage.m_spirit = 0f;
			}
		}
		ZNetView val = default(ZNetView);
		if (((Component)projectile).TryGetComponent<ZNetView>(ref val) && val.IsValid())
		{
			val.GetZDO().Persistent = false;
		}
		Rigidbody val2 = default(Rigidbody);
		if (((Component)projectile).TryGetComponent<Rigidbody>(ref val2))
		{
			val2.collisionDetectionMode = (CollisionDetectionMode)3;
			val2.isKinematic = true;
			val2.useGravity = false;
		}
	}

	private EffectData CreateEffect(GameObject sprite)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		return new EffectData
		{
			m_prefab = sprite,
			m_enabled = true,
			m_variant = -1
		};
	}

	public Vector3 GetScale()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		return new Vector3(scale, scale, scale);
	}

	public float GetScaleValue()
	{
		return scale;
	}

	public bool IsSlingPrefab(GameObject itemdrop)
	{
		if ((Object)(object)itemdrop != (Object)null)
		{
			return ((Object)itemdrop).name == name;
		}
		return false;
	}

	public Vector3 GetOffsets(Vector3 pos)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = pos;
		float liquidLevel = Floating.GetLiquidLevel(val, 1f, (LiquidType)10);
		if (pos.y < liquidLevel)
		{
			val.y = liquidLevel + 0.5f;
		}
		else
		{
			val.y += 1f;
		}
		return val;
	}

	public void SetFakeHit()
	{
		isFakeHit = true;
	}

	public bool IsFakeHit()
	{
		return isFakeHit;
	}

	public void SetFarmtype()
	{
		farmingType++;
		if ((int)farmingType >= farmText.Length)
		{
			farmingType = FarmType.Demolish;
		}
		CenterMessage(farmText[(int)farmingType]);
	}

	public void DelayedSlingActionUpdate()
	{
		//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
		if (DelayedItemDrop_Time != -1f && DelayedItemDrop.Count > 0 && Time.time - DelayedItemDrop_Time >= DelayedPickup)
		{
			List<ItemDrop> list = new List<ItemDrop>();
			foreach (KeyValuePair<ItemDrop, Humanoid> item in DelayedItemDrop)
			{
				if (!list.Contains(item.Key) && (Object)(object)item.Key != (Object)null && (Object)(object)item.Key.m_nview != (Object)null && item.Key.m_nview.IsValid() && item.Key.m_nview.IsOwner() && (Object)(object)item.Value != (Object)null && ((Character)item.Value).IsPlayer() && !((Character)item.Value).IsDead())
				{
					item.Key.Pickup(item.Value);
					list.Add(item.Key);
				}
			}
			DelayedItemDrop_Time = -1f;
			DelayedItemDrop.Clear();
		}
		if (DelayedCharacter_Time != -1f && DelayedCharacter.Count > 0 && Time.time - DelayedCharacter_Time >= DelayedPickup)
		{
			foreach (KeyValuePair<Character, Character> item2 in DelayedCharacter)
			{
				if (IsValidCharacter(item2.Key) && (Object)(object)item2.Value != (Object)null && item2.Value.IsPlayer() && !item2.Value.IsDead())
				{
					((Component)item2.Key).transform.position = ((Component)item2.Value).transform.position;
				}
			}
			DelayedCharacter_Time = -1f;
			DelayedCharacter.Clear();
		}
		if (DelayedRepair_Time == -1f || DelayedRepair.Count <= 0 || !(Time.time - DelayedRepair_Time >= DelayedPickup))
		{
			return;
		}
		int num = 0;
		foreach (KeyValuePair<WearNTear, Piece> item3 in DelayedRepair)
		{
			if ((Object)(object)item3.Key != (Object)null && (Object)(object)item3.Value != (Object)null && item3.Key.GetHealthPercentage() < 1f)
			{
				item3.Key.Repair();
				item3.Value.m_placeEffect.Create(((Component)item3.Value).transform.position, ((Component)item3.Value).transform.rotation, (Transform)null, 1f, -1);
				num++;
			}
		}
		DelayedRepair_Time = -1f;
		DelayedRepair.Clear();
		if (num > 0)
		{
			if (num < 2)
			{
				CenterMessage("Sling Repaired <color=green>" + num + "</color> Piece");
			}
			else
			{
				CenterMessage("Sling Repaired <color=green>" + num + "</color> Pieces");
			}
		}
	}

	private void CenterMessage(string text)
	{
		localHuman = ((Component)Player.m_localPlayer).GetComponent<Humanoid>();
		if ((Object)(object)localHuman != (Object)null)
		{
			((Character)localHuman).Message((MessageType)2, Localization.instance.Localize(text), 0, (Sprite)null);
		}
	}

	public void HommingCharacterDamageDelayStart()
	{
		homming_characterDelay = Time.time;
	}

	public void HommingCharacterDamageDelayUpdate()
	{
		if (homming_characterDelay != -1f && Time.time - homming_characterDelay > 0.1f)
		{
			homming_characterDelay = -1f;
			homming_characterDamage = null;
		}
	}

	public bool HasHommingDummy()
	{
		return homming_dummY != null;
	}

	public ItemData GetHommingDummy()
	{
		return homming_dummY;
	}

	public void AnimationSpeed()
	{
		ZSyncAnimation obj = homming_animE;
		if (obj != null)
		{
			obj.SetSpeed(speedAnim);
		}
	}

	public void HommingStart(Humanoid human, ItemData weapon)
	{
		homming_timeOut = Time.time;
		homming_dummY = null;
		homming_owneR = human;
		homming_animE = ((Character)human).m_zanim;
		homming_inventorY = human.GetInventory();
		homming_characterDamage = ((Component)human).GetComponent<Character>();
		isFarming = ZInput.GetKey((KeyCode)324, true);
		isFakeHit = false;
	}

	public void HommingEnds(Projectile projectile, Vector3 posStart, Vector3 posEnds, Quaternion rot, bool teleport, bool createStartEffect, bool createEndEffect)
	{
		//IL_007f: 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_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_032c: Unknown result type (might be due to invalid IL or missing references)
		//IL_032d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0337: Unknown result type (might be due to invalid IL or missing references)
		//IL_0371: Unknown result type (might be due to invalid IL or missing references)
		//IL_0372: Unknown result type (might be due to invalid IL or missing references)
		//IL_037c: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_03df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_042b: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0412: Unknown result type (might be due to invalid IL or missing references)
		//IL_0414: 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_00de: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_0503: Unknown result type (might be due to invalid IL or missing references)
		//IL_0508: Unknown result type (might be due to invalid IL or missing references)
		//IL_0521: Unknown result type (might be due to invalid IL or missing references)
		//IL_052e: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		if (homming_timeOut == -1f)
		{
			return;
		}
		homming_timeOut = -1f;
		if (!((Object)(object)homming_owneR != (Object)null) || ((Character)homming_owneR).IsDead())
		{
			return;
		}
		if (isFarming)
		{
			Character component = ((Component)homming_owneR).GetComponent<Character>();
			switch (farmingType)
			{
			case FarmType.Demolish:
			{
				Vector3 val = posEnds;
				val.y += 0.3f;
				if ((Object)(object)Sprite_Hits[0] != (Object)null)
				{
					Object.Instantiate<GameObject>(Sprite_Hits[0], val, rot);
				}
				if ((Object)(object)Sprite_Hits[2] != (Object)null)
				{
					Object.Instantiate<GameObject>(Sprite_Hits[2], val, rot);
					Object.Instantiate<GameObject>(Sprite_Hits[2], val, rot);
					Object.Instantiate<GameObject>(Sprite_Hits[2], val, rot);
				}
				break;
			}
			case FarmType.Repair:
			{
				CreateFetchEffect(posEnds, rot, createLightning: false);
				List<Piece> list = new List<Piece>();
				List<Piece> list2 = new List<Piece>();
				Piece.GetAllPiecesInRadius(posEnds, projectile.m_aoe, list2);
				foreach (Piece item in list2)
				{
					if ((Object)(object)item != (Object)null && !list.Contains(item) && item.IsPlacedByPlayer())
					{
						WearNTear component3 = ((Component)item).GetComponent<WearNTear>();
						if ((Object)(object)component3 != (Object)null)
						{
							list.Add(item);
							KeyValuePair<WearNTear, Piece> keyValuePair2 = new KeyValuePair<WearNTear, Piece>(component3, item);
							DelayedRepair.Add(keyValuePair2);
						}
					}
				}
				if (DelayedRepair.Count > 0)
				{
					DelayedRepair_Time = Time.time;
				}
				break;
			}
			case FarmType.ItemFetch:
				CreateFetchEffect(posEnds, rot);
				foreach (ItemDrop s_instance in ItemDrop.s_instances)
				{
					if (IsValidItemDrop(s_instance) && s_instance.m_itemData.m_shared.m_name != projectile.m_spawnItem.m_shared.m_name && Vector3.Distance(posEnds, ((Component)s_instance).transform.position) <= projectile.m_aoe)
					{
						ItemDrop component2 = projectile.m_spawnItem.m_dropPrefab.GetComponent<ItemDrop>();
						if ((Object)(object)component2 != (Object)null && (Object)(object)s_instance != (Object)(object)component2 && ((Object)(object)s_instance.m_pickupRequester == (Object)null || (Object)(object)s_instance.m_pickupRequester == (Object)(object)component))
						{
							KeyValuePair<ItemDrop, Humanoid> keyValuePair = new KeyValuePair<ItemDrop, Humanoid>(s_instance, homming_owneR);
							DelayedItemDrop.Add(keyValuePair);
						}
					}
				}
				if (DelayedItemDrop.Count > 0)
				{
					DelayedItemDrop_Time = Time.time;
				}
				break;
			case FarmType.FriendlyFetch:
				CreateFetchEffect(posEnds, rot);
				DelayedCharacter = GetNearbyObject(posEnds, projectile.m_aoe, ChracterkMask, FarmType.FriendlyFetch);
				if (DelayedCharacter.Count > 0)
				{
					DelayedCharacter_Time = Time.time;
				}
				break;
			case FarmType.TameableFetch:
				CreateFetchEffect(posEnds, rot);
				DelayedCharacter = GetNearbyObject(posEnds, projectile.m_aoe, ChracterkMask, FarmType.TameableFetch);
				if (DelayedCharacter.Count > 0)
				{
					DelayedCharacter_Time = Time.time;
				}
				break;
			case FarmType.EnemyFetch:
				CreateFetchEffect(posEnds, rot);
				DelayedCharacter = GetNearbyObject(posEnds, projectile.m_aoe, ChracterkMask, FarmType.EnemyFetch);
				if (DelayedCharacter.Count > 0)
				{
					DelayedCharacter_Time = Time.time;
				}
				break;
			}
		}
		else
		{
			if (createStartEffect && (Object)(object)Sprite_Start != (Object)null)
			{
				Vector3 val2 = posStart;
				val2.y += 1f;
				Object.Instantiate<GameObject>(Sprite_Start, val2, rot);
			}
			if (createEndEffect && (Object)(object)Sprite_Ends != (Object)null)
			{
				Vector3 val3 = posEnds;
				val3.y += 1f;
				Object.Instantiate<GameObject>(Sprite_Ends, val3, rot);
			}
			if (teleport)
			{
				((Component)homming_owneR).transform.position = posEnds;
			}
		}
		if (homming_inventorY.AddItem(homming_dummY))
		{
			if (homming_owneR.GetRightItem() == null)
			{
				if (homming_owneR.m_currentAttack != null)
				{
					homming_owneR.m_currentAttack.Stop();
					homming_owneR.m_previousAttack = homming_owneR.m_currentAttack;
					homming_owneR.m_currentAttack = null;
				}
				if (!homming_owneR.EquipItem(homming_dummY, false))
				{
					homming_retry++;
					homming_equipDelay = Time.time;
					return;
				}
				((Character)homming_owneR).Message((MessageType)1, "$msg_added " + homming_dummY.m_shared.m_name, 1, homming_dummY.GetIcon());
			}
		}
		else
		{
			Vector3 position = ((Component)homming_owneR).transform.position;
			position.y += 1f;
			ItemDrop obj = ItemDrop.DropItem(homming_dummY, 0, position, ((Component)homming_owneR).transform.rotation);
			if (obj != null)
			{
				obj.Pickup(homming_owneR);
			}
		}
		ResetHomming();
		void CreateFetchEffect(Vector3 posAnimm, Quaternion rotAnimm, bool createLightning = true)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: 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_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val5 = posAnimm;
			val5.y -= 0.6f;
			if ((Object)(object)Sprite_Hits[1] != (Object)null)
			{
				Object.Instantiate<GameObject>(Sprite_Hits[1], val5, rotAnimm);
			}
			if ((Object)(object)Sprite_Hits[2] != (Object)null && createLightning)
			{
				Object.Instantiate<GameObject>(Sprite_Hits[2], val5, rotAnimm);
				Object.Instantiate<GameObject>(Sprite_Hits[2], val5, rotAnimm);
				Object.Instantiate<GameObject>(Sprite_Hits[2], val5, rotAnimm);
			}
		}
		List<KeyValuePair<Character, Character>> GetNearbyObject(Vector3 posNear, float radiusNear, int rayMaskNear, FarmType type)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			List<Character> list3 = new List<Character>();
			List<KeyValuePair<Character, Character>> list4 = new List<KeyValuePair<Character, Character>>();
			Collider[] array = Physics.OverlapSphere(posNear, radiusNear, rayMaskNear);
			foreach (Collider val4 in array)
			{
				if (Object.op_Implicit((Object)(object)val4.attachedRigidbody))
				{
					Character component4 = ((Component)val4.attachedRigidbody).GetComponent<Character>();
					if (IsValidCharacter(component4) && ((type.Equals(FarmType.EnemyFetch) && IsMonsterFaction(component4)) || (type.Equals(FarmType.FriendlyFetch) && !IsMonsterFaction(component4)) || (type.Equals(FarmType.TameableFetch) && IsTameable(component4))))
					{
						Character component5 = ((Component)homming_owneR).GetComponent<Character>();
						if ((Object)(object)component4 != (Object)(object)component5 && !list3.Contains(component4))
						{
							KeyValuePair<Character, Character> keyValuePair3 = new KeyValuePair<Character, Character>(component4, component5);
							list3.Add(component4);
							list4.Add(keyValuePair3);
						}
					}
				}
			}
			return list4;
		}
	}

	private bool IsValidItemDrop(ItemDrop itemDrop)
	{
		if ((Object)(object)itemDrop != (Object)null && (Object)(object)itemDrop.m_nview != (Object)null && itemDrop.m_nview.IsValid())
		{
			return itemDrop.m_nview.IsOwner();
		}
		return false;
	}

	private bool IsValidCharacter(Character charac)
	{
		if ((Object)(object)charac != (Object)null && (Object)(object)charac.m_nview != (Object)null && charac.m_nview.IsValid() && charac.m_nview.IsOwner())
		{
			return !charac.IsDead();
		}
		return false;
	}

	private bool IsMonsterFaction(Character charac)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Invalid comparison between Unknown and I4
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Invalid comparison between Unknown and I4
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Invalid comparison between Unknown and I4
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Invalid comparison between Unknown and I4
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Invalid comparison between Unknown and I4
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Invalid comparison between Unknown and I4
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Invalid comparison between Unknown and I4
		if ((int)charac.m_faction != 2 && (int)charac.m_faction != 3 && (int)charac.m_faction != 4 && (int)charac.m_faction != 7 && (int)charac.m_faction != 5 && (int)charac.m_faction != 6)
		{
			return (int)charac.m_faction == 9;
		}
		return true;
	}

	private bool IsTameable(Character charac)
	{
		return (Object)(object)((Component)charac).GetComponent<Tameable>() != (Object)null;
	}

	public void HommingEndRetry()
	{
		if (homming_equipDelay == -1f || !((Object)(object)homming_owneR != (Object)null) || ((Character)homming_owneR).IsDead() || !(Time.time - homming_equipDelay >= 0.1f))
		{
			return;
		}
		if (homming_inventorY.ContainsItem(homming_dummY))
		{
			if (homming_owneR.EquipItem(homming_dummY, false))
			{
				((Character)homming_owneR).Message((MessageType)1, "$msg_added " + homming_dummY.m_shared.m_name, 1, homming_dummY.GetIcon());
			}
			else
			{
				homming_retry++;
				homming_equipDelay = Time.time;
				if (homming_retry <= 4)
				{
					return;
				}
			}
		}
		ResetHomming();
	}

	public bool IsHommingCompleted()
	{
		if (homming_inventorY == null)
		{
			return homming_interval == -1f;
		}
		return false;
	}

	public void ResetHomming(bool isrespawn = false)
	{
		homming_interval = Time.time;
		homming_retry = 0;
		homming_timeOut = -1f;
		homming_equipDelay = -1f;
		homming_dummY = null;
		homming_owneR = null;
		homming_animE = null;
		homming_inventorY = null;
		isFarming = false;
		isFakeHit = false;
		if (isrespawn)
		{
			homming_characterDamage = null;
		}
	}

	public void HommingIntervalUpdate()
	{
		if (homming_interval != -1f && Time.time - homming_interval > 0.5f)
		{
			homming_interval = -1f;
		}
	}

	public bool IsTimedOut()
	{
		if (homming_timeOut != -1f)
		{
			return Time.time - homming_timeOut >= 3f;
		}
		return false;
	}
}