Decompiled source of GsiXDynamicShield v1.1.7

GsiX.DynamicShield.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
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 DynamicShield;
using GsiXHelper;
using HarmonyLib;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using Steamworks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("DynamicShield")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GsiX.DynamicShield")]
[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")]
public class DynamicEffect : MonoBehaviour
{
	public float effectInterval = Time.time;

	public int effectIconPos;

	public float effectIconDelay = 0.1f;

	public bool hasDynamicEffect;

	private int statusEffectHash = DynamicDefault.DynShieldUmbrella_Hash;

	private List<StatusEffect> playerSEList = new List<StatusEffect>();

	public void Awake()
	{
		if (!Player.IsPlacementGhost(((Component)this).gameObject))
		{
			((MonoBehaviour)this).InvokeRepeating("SlowUpdate", 0f, 0.22f);
		}
	}

	public void SlowUpdate()
	{
		if ((Object)(object)Player.m_localPlayer == (Object)null)
		{
			return;
		}
		if (((Character)Player.m_localPlayer).m_seman.HaveStatusEffect(statusEffectHash))
		{
			hasDynamicEffect = true;
			foreach (StatusEffect statusEffect in ((Character)Player.m_localPlayer).m_seman.m_statusEffects)
			{
				if (statusEffect.m_name == "$se_rested_name")
				{
					statusEffect.m_time = 0f;
				}
				if (statusEffect.m_name == "$se_wet_name" || statusEffect.m_name == "$se_burning_name" || statusEffect.m_name == "$se_frost_name" || statusEffect.m_name == "$se_lightning_name" || statusEffect.m_name == "$se_poison_name" || statusEffect.m_name == "$se_lightning_name")
				{
					playerSEList.Add(statusEffect);
				}
			}
			if (playerSEList.Count() <= 0)
			{
				return;
			}
			foreach (StatusEffect playerSE in playerSEList)
			{
				((Character)Player.m_localPlayer).m_seman.RemoveStatusEffect(playerSE, false);
			}
			playerSEList.Clear();
		}
		else
		{
			hasDynamicEffect = false;
		}
	}
}
public class DynamicEnemy : MonoBehaviour
{
	public DynamicTower m_dTower;

	public int GeneratorCost;

	public bool rangedEnable;

	public float rangedInterval;

	public int rangedTargetTotal;

	public int rangedCost;

	public bool showActivity;

	public bool miniAoeEnable;

	public float miniAoeDamage;

	public float miniAoeInterval;

	public int miniAoeTotalTarget;

	public int miniAoeCost;

	private int carI;

	private Character slowUpdateEnemy;

	private List<Character> slowUpdateExclude = new List<Character>();

	private List<Character> slowUpdateAoeExclude = new List<Character>();

	private Collider aimCollider;

	public void Awake()
	{
		if (Player.IsPlacementGhost(((Component)this).gameObject))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicEnemy Awake");
		}
		m_dTower = ((Component)this).GetComponent<DynamicTower>();
		if ((Object)(object)m_dTower.m_nview != (Object)null && m_dTower.m_nview.GetZDO() != null)
		{
			((MonoBehaviour)this).InvokeRepeating("FindTarget", 0f, rangedInterval);
			m_dTower.m_nview.Register<ZDOID>("RPC_AttackMiniAoe", (Action<long, ZDOID>)RPC_AttackMiniAoe);
			if (showActivity)
			{
				GH.DWarn(" DynamicEnemy Register");
			}
		}
	}

	public void Update()
	{
	}

	private void FindTarget()
	{
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: 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_0244: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_016a: 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)
		if ((Object)(object)m_dTower == (Object)null || !m_dTower.IsShieldOwner())
		{
			return;
		}
		if (rangedEnable && m_dTower.IsEnoughtFuel(GeneratorCost + rangedCost))
		{
			if (showActivity)
			{
				GH.DWarn(" DynamicEnemy Trigger");
			}
			for (carI = 0; carI < rangedTargetTotal; carI++)
			{
				slowUpdateEnemy = DynamicAmmo.GetEnemyInRange(new Vector3(((Component)m_dTower.m_shield).transform.position.x, ((Component)m_dTower.m_shield).transform.position.y + DynamicTower.fixedHeight * DynamicTower.shieldScale, ((Component)m_dTower.m_shield).transform.position.z), m_dTower.m_shield.m_radius, slowUpdateExclude, 1f);
				if ((Object)(object)slowUpdateEnemy == (Object)null)
				{
					break;
				}
				if ((Object)(object)slowUpdateEnemy != (Object)null && (Object)(object)slowUpdateEnemy.m_nview != (Object)null)
				{
					switch (Random.Range(0, 3))
					{
					case 0:
						Target(((Component)slowUpdateEnemy).gameObject, slowUpdateEnemy.GetZDOID(), DynamicAmmo.AmmoType.Light);
						break;
					case 1:
						Target(((Component)slowUpdateEnemy).gameObject, slowUpdateEnemy.GetZDOID(), DynamicAmmo.AmmoType.Sham);
						break;
					case 2:
						Target(((Component)slowUpdateEnemy).gameObject, slowUpdateEnemy.GetZDOID(), DynamicAmmo.AmmoType.Rads);
						break;
					}
				}
			}
			if (slowUpdateExclude.Count() > 0)
			{
				slowUpdateExclude.Clear();
			}
		}
		if (!miniAoeEnable || !m_dTower.IsEnoughtFuel(GeneratorCost + miniAoeCost) || !GH.IsTimeElpase(m_dTower.m_nview, ZDOVars.s_growStart, miniAoeInterval))
		{
			return;
		}
		GH.SetZDOsTime(m_dTower.m_nview, ZDOVars.s_growStart);
		int num = 0;
		for (int i = 0; i < miniAoeTotalTarget; i++)
		{
			slowUpdateEnemy = DynamicAmmo.GetEnemyInRange(new Vector3(((Component)m_dTower.m_shield).transform.position.x, ((Component)m_dTower.m_shield).transform.position.y + DynamicTower.fixedHeight * DynamicTower.shieldScale, ((Component)m_dTower.m_shield).transform.position.z), m_dTower.m_shield.m_radius, slowUpdateAoeExclude, 1f);
			if ((Object)(object)slowUpdateEnemy == (Object)null)
			{
				break;
			}
			InvokeMiniAoe(slowUpdateEnemy);
			num++;
		}
		if (num > 0)
		{
			m_dTower.InvokeUseFuel(miniAoeCost, 4, num);
		}
		slowUpdateAoeExclude.Clear();
		void Target(GameObject enemy, ZDOID targetZDOID, DynamicAmmo.AmmoType type)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			DynamicAmmo.ShootProjectile(m_dTower.m_shield, m_dTower, targetZDOID, enemy, type);
			m_dTower.InvokeUseFuel(rangedCost, 4, 1);
		}
	}

	private HitData CreateHitData(float damage, HitType hitType, Vector3 pos, Vector3 dir)
	{
		//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_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Expected O, but got Unknown
		return new HitData
		{
			m_damage = 
			{
				m_damage = damage
			},
			m_point = pos,
			m_dir = dir,
			m_hitType = hitType,
			m_toolTier = 4
		};
	}

	private void ShieldAOEEffect(Transform baseparent)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: 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)
		Vector3 position = baseparent.position;
		position.y += 0.5f;
		Quaternion rotation = baseparent.rotation;
		CreateDynamicEffect(DynamicAmmo.animeMiniAoe, position, rotation, baseparent);
	}

	private void ShieldPlayerEffect(Transform baseparent, float zOffsets, float incDegree, float maxDegree)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: 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_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: 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_006d: 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_0075: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = baseparent.position;
		position.y += zOffsets;
		Quaternion rotation = baseparent.rotation;
		rotation *= Quaternion.Euler(90f, 0f, 0f);
		CreateDynamicEffect(DynamicAmmo.animeDomehit, position, rotation, baseparent);
		float num = 0f;
		Quaternion val = baseparent.rotation;
		for (; num < maxDegree; num += incDegree)
		{
			val *= Quaternion.Euler(0f, num, 0f);
			CreateDynamicEffect(DynamicAmmo.animeDomehit, position, val, baseparent);
		}
	}

	private void CreateDynamicEffect(GameObject effectData, Vector3 pos, Quaternion rot, Transform baseparent, float scale = 1f)
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)effectData == (Object)null)
		{
			GH.DWarn("[Update] Try to create null effectData");
			return;
		}
		GameObject val = Object.Instantiate<GameObject>(effectData, pos, rot);
		if ((Object)(object)val == (Object)null)
		{
			GH.DWarn("[Update] Try to Instantiate object but return null");
		}
		else
		{
			val.transform.localScale = baseparent.localScale * scale;
		}
	}

	private void InvokeMiniAoe(Character badguy)
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		m_dTower.m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_AttackMiniAoe", new object[1] { badguy.GetZDOID() });
	}

	private void RPC_AttackMiniAoe(long sender, ZDOID zdoid)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = ZNetScene.instance.FindInstance(zdoid);
		if (!((Object)(object)val != (Object)null))
		{
			return;
		}
		Character component = val.GetComponent<Character>();
		if ((Object)(object)component != (Object)null)
		{
			Drawrays(m_dTower.m_shield, component, 1f);
			if (m_dTower.m_nview.IsOwner())
			{
				component.Damage(CreateHitData(miniAoeDamage, (HitType)20, ((Component)component).transform.position, ((Component)component).transform.forward));
				ShieldAOEEffect(((Component)component).transform);
				ShieldPlayerEffect(((Component)m_dTower.m_shield).transform, 7f, 45f, 180f);
			}
		}
	}

	private void Drawrays(ShieldGenerator from, Character to, float raylife, bool random = true)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d9: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: Unknown result type (might be due to invalid IL or missing references)
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: 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_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_015c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0160: Unknown result type (might be due to invalid IL or missing references)
		//IL_0165: Unknown result type (might be due to invalid IL or missing references)
		//IL_0167: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: 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_0184: 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_018d: Unknown result type (might be due to invalid IL or missing references)
		//IL_018f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = ((Component)from).transform.position + Vector3.up * DynamicTower.fixedHeight * DynamicTower.shieldScale;
		if (random)
		{
			Vector3 val2 = Vector2.op_Implicit(Random.insideUnitCircle * (m_dTower.domeScale + 0.5f));
			val.x += val2.x;
			val.y += Random.Range(0f, 0.4f);
			val.z += val2.y;
		}
		Vector3 val3 = GetCenterAim(((Component)to).gameObject, ((Component)to).transform.position) + Vector3.up * 0.5f;
		float num = Vector3.Distance(val, val3);
		float num2 = num / 30f;
		float num3 = 0f;
		float num4 = 0f;
		Vector3 val4 = (val3 - val) / 3f;
		Vector3 val5 = val + val4 + Vector3.up * num / 3f;
		Vector3 val6 = val5 + val4 + Vector3.up * num / 3f;
		List<Vector3> list = new List<Vector3> { val };
		while (num3 < num)
		{
			num3 += num2;
			num4 = num3 / num;
			Vector3 val7 = Vector3.Lerp(val, val5, num4);
			Vector3 val8 = Vector3.Lerp(val5, val6, num4);
			Vector3 val9 = Vector3.Lerp(val6, val3, num4);
			Vector3 val10 = Vector3.Lerp(val7, val8, num4);
			Vector3 val11 = Vector3.Lerp(val8, val9, num4);
			list.Add(Vector3.Lerp(val10, val11, num4));
		}
		Color red = Color.red;
		GH.DrawRayLine(list, 0.07f, raylife, red);
	}

	private Vector3 GetCenterAim(GameObject target, Vector3 oldAimCenter)
	{
		//IL_002e: 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_0028: Unknown result type (might be due to invalid IL or missing references)
		aimCollider = target.GetComponent<Collider>();
		if ((Object)(object)aimCollider != (Object)null)
		{
			Bounds bounds = aimCollider.bounds;
			return ((Bounds)(ref bounds)).center;
		}
		return oldAimCenter;
	}
}
public class DynamicFriendly : MonoBehaviour
{
	public DynamicTower m_dTower;

	public int GeneratorCost;

	public bool damagePlayer;

	public bool damageTamed;

	public bool showActivity;

	public bool regenPlayer;

	public float regenInterval;

	public float regenPlayerHP;

	public float regenPlayerStam;

	public bool regenTamed;

	public float regenTamedHP;

	public int regenCost;

	public int regenPieceNum;

	public bool regenPlayerPiece;

	public int cleanupNum;

	public float claenLifespan;

	public bool cleanFish;

	public bool claenInTar;

	public int cleanCost;

	public List<string> itemDestroyList;

	public List<string> itemIgnoreList;

	private int cleanCount;

	private List<string> clientDestroylistbuff = new List<string>();

	private List<string> clientignorelistbuff = new List<string>();

	private Fish fishbuff;

	private string ignoreNameBuff1;

	private string ignoreNameBuff2;

	private DynamicFriendly dynFriendly;

	private bool canPickup;

	private float pickupSpeed = 30f;

	private Vector3 autoPickup_Auto1;

	private Vector3 autoPickup_Auto2;

	private FloatingTerrainDummy floatingTerrainDummy;

	[NonSerialized]
	public Dictionary<ItemDrop, float> autoPickupList = new Dictionary<ItemDrop, float>();

	[NonSerialized]
	public Dictionary<ItemDrop, float> autoPickupBuff = new Dictionary<ItemDrop, float>();

	public void Awake()
	{
		if (Player.IsPlacementGhost(((Component)this).gameObject))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicFriendly Awake");
		}
		m_dTower = ((Component)this).GetComponent<DynamicTower>();
		if ((Object)(object)m_dTower.m_nview != (Object)null && m_dTower.m_nview.GetZDO() != null)
		{
			((MonoBehaviour)this).InvokeRepeating("FindTarget", 0f, regenInterval);
			if (showActivity)
			{
				GH.DWarn(" DynamicFriendly Register");
			}
		}
	}

	public void FixedUpdate()
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		UpdatePickUp(((Component)m_dTower.m_shield).transform.position, Time.time, Time.fixedDeltaTime);
	}

	private void FindTarget()
	{
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_dTower == (Object)null || !m_dTower.IsShieldOwner() || !m_dTower.IsEnoughtFuel(GeneratorCost + regenCost))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicFriendly Trigger");
		}
		foreach (Character s_character in Character.s_characters)
		{
			if ((Object)(object)s_character == (Object)null || (Object)(object)s_character.m_nview == (Object)null || s_character.IsDead() || IsOutsideShield(((Component)s_character).gameObject))
			{
				continue;
			}
			if (s_character.IsPlayer())
			{
				if ((!damagePlayer && regenPlayer && s_character.GetHealthPercentage() < 1f) || s_character.GetStaminaPercentage() < 1f)
				{
					DynamicFriendlyHealChars(s_character);
				}
			}
			else if (s_character.IsTamed() && (int)s_character.m_faction == 0 && !damageTamed && regenTamed && s_character.GetHealthPercentage() < 1f)
			{
				DynamicFriendlyHealTamed(s_character);
			}
		}
		if (regenPieceNum > 0)
		{
			cleanCount = 0;
			foreach (WearNTear s_allInstance in WearNTear.s_allInstances)
			{
				if (cleanCount >= regenPieceNum)
				{
					break;
				}
				if (!((Object)(object)s_allInstance == (Object)null) && !((Object)(object)s_allInstance.m_piece == (Object)null) && !(s_allInstance.m_healthPercentage >= 0.99f) && !IsOutsideShield(((Component)s_allInstance).gameObject) && (!regenPlayerPiece || s_allInstance.m_piece.IsPlacedByPlayer()) && !((Object)(object)s_allInstance.m_nview == (Object)null))
				{
					DynamicFriendlyRepair(s_allInstance);
					cleanCount++;
				}
			}
		}
		if (cleanupNum <= 0)
		{
			return;
		}
		cleanCount = 0;
		foreach (ItemDrop s_instance in ItemDrop.s_instances)
		{
			if (cleanCount >= cleanupNum)
			{
				break;
			}
			if ((Object)(object)s_instance == (Object)null || (Object)(object)s_instance.m_nview == (Object)null || !s_instance.m_nview.IsValid() || IsOutsideShield(((Component)s_instance).gameObject) || s_instance.GetTimeSinceSpawned() < (double)claenLifespan || (!claenInTar && s_instance.InTar()))
			{
				continue;
			}
			if (!s_instance.m_nview.IsOwner())
			{
				s_instance.m_nview.ClaimOwnership();
			}
			else
			{
				if (FindItemIgnore(s_instance))
				{
					continue;
				}
				if (FindItemDestroy(s_instance))
				{
					cleanCount++;
					DynamicFriendlyDestroy(s_instance);
					continue;
				}
				canPickup = true;
				foreach (ShieldGenerator instance in ShieldGenerator.m_instances)
				{
					dynFriendly = ((Component)instance).GetComponent<DynamicFriendly>();
					if ((Object)(object)dynFriendly != (Object)null && (dynFriendly.autoPickupList.ContainsKey(s_instance) || dynFriendly.autoPickupBuff.ContainsKey(s_instance)))
					{
						canPickup = false;
						break;
					}
				}
				if (canPickup)
				{
					s_instance.m_autoPickup = false;
					s_instance.m_itemData.m_shared.m_weight = 0f;
					autoPickupList.Add(s_instance, Time.time);
					cleanCount++;
				}
			}
		}
		bool FindItemDestroy(ItemDrop droppedItem)
		{
			clientDestroylistbuff = itemDestroyList;
			if (DynamicRPC.ClientDestroyListBuffer.Count() > 0)
			{
				clientDestroylistbuff = DynamicRPC.ClientDestroyListBuffer;
			}
			ignoreNameBuff1 = ((Object)droppedItem).name.Replace("(Clone)", "").ToLower();
			foreach (string item in clientDestroylistbuff)
			{
				if (ignoreNameBuff1.Contains(item.ToLower()))
				{
					return true;
				}
			}
			return false;
		}
		bool FindItemIgnore(ItemDrop droppedItem)
		{
			clientignorelistbuff = itemIgnoreList;
			if (DynamicRPC.ClientIgnoreListBuffer.Count() > 0)
			{
				clientignorelistbuff = DynamicRPC.ClientIgnoreListBuffer;
			}
			ignoreNameBuff2 = ((Object)droppedItem).name.Replace("(Clone)", "").ToLower();
			foreach (string item2 in clientignorelistbuff)
			{
				if (ignoreNameBuff2.Contains(item2.ToLower()))
				{
					if (item2.Contains("fish") && !cleanFish)
					{
						fishbuff = ((Component)droppedItem).GetComponent<Fish>();
						if ((Object)(object)fishbuff == (Object)null || !fishbuff.IsOutOfWater() || fishbuff.IsHooked())
						{
							continue;
						}
					}
					return true;
				}
			}
			return false;
		}
	}

	private void DynamicFriendlyHealChars(Character friendly)
	{
		if (friendly.GetHealthPercentage() < 1f)
		{
			friendly.Heal(regenPlayerHP, true);
		}
		if (friendly.GetStaminaPercentage() < 1f)
		{
			friendly.AddStamina(regenPlayerStam);
		}
		ShieldPlayerEffect(((Component)friendly).transform, 1f, 90f, 180f);
		m_dTower.InvokeUseFuel(regenCost, 0, 1);
	}

	private void DynamicFriendlyHealTamed(Character friendly)
	{
		friendly.Heal(regenTamedHP, true);
		ShieldPlayerEffect(((Component)friendly).transform, 1f, 90f, 180f);
		m_dTower.InvokeUseFuel(regenCost, 0, 1);
	}

	private void DynamicFriendlyRepair(WearNTear piece)
	{
		piece.Repair();
		ShieldOtherEffect(((Component)piece).transform);
		m_dTower.InvokeUseFuel(regenCost, 1, 1);
		if ((Object)(object)Player.m_localPlayer != (Object)null && !IsOutsideShield(((Component)Player.m_localPlayer).gameObject))
		{
			((Character)Player.m_localPlayer).Message((MessageType)1, Localization.instance.Localize("[DynamicShield] $msg_repaired", new string[1] { piece.m_piece.m_name }), 0, (Sprite)null);
		}
	}

	private void UpdatePickUp(Vector3 basePos, float currenTime, float dt)
	{
		//IL_001f: 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_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		if (!m_dTower.IsShieldOwner() || autoPickupList.Count <= 0)
		{
			return;
		}
		basePos += Vector3.up * DynamicTower.fixedHeight * DynamicTower.shieldScale;
		foreach (KeyValuePair<ItemDrop, float> autoPickup in autoPickupList)
		{
			if ((Object)(object)autoPickup.Key != (Object)null && Vector3.Distance(basePos, ((Component)autoPickup.Key).transform.position) > 1.5f && currenTime - autoPickup.Value < 5f)
			{
				AutoPickup(autoPickup.Key, basePos, dt);
			}
			else
			{
				autoPickupBuff.Add(autoPickup.Key, autoPickup.Value);
			}
		}
		if (autoPickupBuff.Count <= 0)
		{
			return;
		}
		foreach (KeyValuePair<ItemDrop, float> item in autoPickupBuff)
		{
			autoPickupList.Remove(item.Key);
			if ((Object)(object)item.Key != (Object)null)
			{
				DynamicFriendlyPickup(item.Key);
			}
		}
		autoPickupBuff.Clear();
	}

	public void AutoPickup(ItemDrop item, Vector3 basePos, float dt)
	{
		//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_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: 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_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_0098: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
		basePos += Vector3.up;
		if (!item.CanPickup(true))
		{
			item.RequestOwn();
			return;
		}
		autoPickup_Auto1 = Vector3.Normalize(basePos - ((Component)item).transform.position);
		autoPickup_Auto2 = autoPickup_Auto1 * pickupSpeed * dt;
		Transform transform = ((Component)item).transform;
		transform.position += autoPickup_Auto2;
		floatingTerrainDummy = ((Component)item).GetComponent<FloatingTerrainDummy>();
		if ((Object)(object)floatingTerrainDummy != (Object)null)
		{
			Transform transform2 = ((Component)floatingTerrainDummy).transform;
			transform2.position += autoPickup_Auto2;
		}
	}

	private void DynamicFriendlyPickup(ItemDrop item)
	{
		item.Load();
		if (PickupItem(item))
		{
			ShieldOtherEffect(((Component)item).transform);
			m_dTower.InvokeUseFuel(cleanCost, 2, 1);
			if ((Object)(object)Player.m_localPlayer != (Object)null && !IsOutsideShield(((Component)Player.m_localPlayer).gameObject))
			{
				((Character)Player.m_localPlayer).Message((MessageType)1, Localization.instance.Localize("[DynamicShield] Pickup " + item.m_itemData.m_shared.m_name), 0, (Sprite)null);
			}
		}
		bool PickupItem(ItemDrop droppedItem)
		{
			if (droppedItem.CanPickup(false) && m_dTower.m_container.m_inventory.AddItem(droppedItem.m_itemData))
			{
				EggGrow component = ((Component)droppedItem).GetComponent<EggGrow>();
				if ((Object)(object)component != (Object)null)
				{
					Object.Destroy((Object)(object)component);
				}
				if (m_dTower.m_nview.GetZDO() == null)
				{
					Object.Destroy((Object)(object)((Component)droppedItem).gameObject);
				}
				else
				{
					ZNetScene.instance.Destroy(((Component)droppedItem).gameObject);
				}
				if (m_dTower.m_container.m_inventory.GetEmptySlots() <= 2)
				{
					GH.MoveAllToCrate(m_dTower.m_container);
				}
				m_dTower.m_container.Save();
				return true;
			}
			return false;
		}
	}

	private void DynamicFriendlyDestroy(ItemDrop item)
	{
		ShieldOtherEffect(((Component)item).transform);
		m_dTower.InvokeUseFuel(cleanCost, 3, 1);
		if ((Object)(object)Player.m_localPlayer != (Object)null && !IsOutsideShield(((Component)Player.m_localPlayer).gameObject))
		{
			((Character)Player.m_localPlayer).Message((MessageType)1, Localization.instance.Localize("[DynamicShield] Cleaned " + item.m_itemData.m_shared.m_name), 0, (Sprite)null);
		}
		item.m_nview.Destroy();
	}

	private void ShieldPlayerEffect(Transform baseparent, float zOffsets, float incDegree, float maxDegree)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: 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_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: 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_006d: 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_0075: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = baseparent.position;
		position.y += zOffsets;
		Quaternion rotation = baseparent.rotation;
		rotation *= Quaternion.Euler(90f, 0f, 0f);
		CreateDynamicEffect(DynamicAmmo.animeDomehit, position, rotation, baseparent);
		float num = 0f;
		Quaternion val = baseparent.rotation;
		for (; num < maxDegree; num += incDegree)
		{
			val *= Quaternion.Euler(0f, num, 0f);
			CreateDynamicEffect(DynamicAmmo.animeDomehit, position, val, baseparent);
		}
	}

	private bool IsOutsideShield(GameObject pointB)
	{
		//IL_0010: 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)m_dTower.m_shield).transform.position, pointB.transform.position) > m_dTower.m_shield.m_radius;
	}

	private void ShieldOtherEffect(Transform baseparent)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = baseparent.position;
		Quaternion rotation = baseparent.rotation;
		CreateDynamicEffect(DynamicAmmo.animeRefuel, position, rotation, baseparent);
	}

	private void CreateDynamicEffect(GameObject effectData, Vector3 pos, Quaternion rot, Transform baseparent, float scale = 1f)
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)effectData == (Object)null)
		{
			GH.DWarn("[UpdateEnemyThink] Try to create null effectData");
			return;
		}
		GameObject val = Object.Instantiate<GameObject>(effectData, pos, rot);
		if ((Object)(object)val == (Object)null)
		{
			GH.DWarn("[UpdateEnemyThink] Try to Instantiate object but return null");
		}
		else
		{
			val.transform.localScale = baseparent.localScale * scale;
		}
	}
}
public class DynamicMisc : MonoBehaviour
{
	public DynamicTower m_dTower;

	public int GeneratorCost;

	public bool miscEnable;

	public float miscUpdateInterval;

	public int miscTotal;

	public int miscUseCost;

	public int miscNumber;

	public bool miscTreeLog;

	public bool miscPickable;

	public bool miscBush;

	public bool miscRock;

	public bool miscStump;

	public bool miscSeagal;

	public bool showActivity;

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

	private List<ZDOID> m_miscTarget2 = new List<ZDOID>();

	private bool m_miscCanTarget;

	private int tree;

	private int pick;

	private int seagul;

	private int statphy;

	private int radiusMult = 1;

	private float radiusApply;

	private Collider[] hitColliders;

	public void Awake()
	{
		if (Player.IsPlacementGhost(((Component)this).gameObject))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicMisc Awake");
		}
		m_dTower = ((Component)this).GetComponent<DynamicTower>();
		m_miscTarget.Clear();
		m_miscTarget2.Clear();
		if ((Object)(object)m_dTower.m_nview != (Object)null && m_dTower.m_nview.GetZDO() != null)
		{
			((MonoBehaviour)this).InvokeRepeating("FindTarget", 0f, miscUpdateInterval);
			((MonoBehaviour)this).InvokeRepeating("ShootTarget", 0f, 0.22f);
			m_dTower.m_nview.Register<int>("RPC_IncrementDynamicStats", (Action<long, int>)RPC_IncrementDynamicStats);
			if (showActivity)
			{
				GH.DWarn(" DynamicMisc Register");
			}
		}
	}

	private void FindTarget()
	{
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0453: Unknown result type (might be due to invalid IL or missing references)
		//IL_047b: Unknown result type (might be due to invalid IL or missing references)
		//IL_05af: Unknown result type (might be due to invalid IL or missing references)
		//IL_0555: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_dTower == (Object)null || !m_dTower.IsShieldOwner() || !miscEnable || !m_dTower.IsEnoughtFuel(GeneratorCost + miscUseCost))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicMisc Trigger");
		}
		tree = 0;
		pick = 0;
		seagul = 0;
		statphy = 0;
		radiusApply = m_dTower.m_shield.m_radius / 3f * (float)radiusMult;
		radiusMult++;
		if (radiusMult > 3)
		{
			radiusMult = 1;
		}
		hitColliders = Physics.OverlapSphere(((Component)m_dTower.m_shield).transform.position, radiusApply);
		Collider[] array = hitColliders;
		foreach (Collider val in array)
		{
			if ((Object)(object)val == (Object)null)
			{
				continue;
			}
			if (tree >= miscTotal && pick >= miscTotal && seagul >= miscTotal && statphy >= miscTotal)
			{
				break;
			}
			if (miscTreeLog)
			{
				TreeLog componentInParent = ((Component)val).GetComponentInParent<TreeLog>();
				if ((Object)(object)componentInParent != (Object)null)
				{
					if (tree < miscTotal && (Object)(object)componentInParent.m_nview != (Object)null)
					{
						ReloadAmmo(((Component)componentInParent).gameObject, componentInParent.m_nview.GetZDO().m_uid);
						tree++;
					}
					continue;
				}
			}
			if (miscPickable)
			{
				Pickable componentInParent2 = ((Component)val).GetComponentInParent<Pickable>();
				if ((Object)(object)componentInParent2 != (Object)null)
				{
					if (pick < miscTotal && (Object)(object)componentInParent2.m_nview != (Object)null && componentInParent2.m_nview.IsValid() && !componentInParent2.m_picked && componentInParent2.CanBePicked())
					{
						componentInParent2.m_nview.InvokeRPC("RPC_Pick", Array.Empty<object>());
						pick++;
						m_dTower.InvokeUseFuel(0, 5, 1);
					}
					continue;
				}
				PickableItem componentInParent3 = ((Component)val).GetComponentInParent<PickableItem>();
				if ((Object)(object)componentInParent3 != (Object)null)
				{
					if (pick < miscTotal && (Object)(object)componentInParent3.m_nview != (Object)null && componentInParent3.m_nview.IsValid() && !componentInParent3.m_picked)
					{
						componentInParent3.m_nview.InvokeRPC("Pick", Array.Empty<object>());
						pick++;
						m_dTower.InvokeUseFuel(0, 5, 1);
					}
					continue;
				}
				Beehive componentInParent4 = ((Component)val).GetComponentInParent<Beehive>();
				if ((Object)(object)componentInParent4 != (Object)null)
				{
					if (pick < miscTotal && (Object)(object)componentInParent4.m_nview != (Object)null && componentInParent4.m_nview.IsValid() && componentInParent4.GetHoneyLevel() >= 10)
					{
						componentInParent4.m_nview.InvokeRPC("RPC_Extract", Array.Empty<object>());
						InvokeIncrementStats((PlayerStatType)76);
						pick++;
						m_dTower.InvokeUseFuel(0, 5, 1);
					}
					continue;
				}
				SapCollector componentInParent5 = ((Component)val).GetComponentInParent<SapCollector>();
				if ((Object)(object)componentInParent5 != (Object)null)
				{
					if (pick < miscTotal && (Object)(object)componentInParent5.m_nview != (Object)null && componentInParent5.m_nview.IsValid() && componentInParent5.GetLevel() >= 10)
					{
						componentInParent5.m_nview.InvokeRPC("RPC_Extract", Array.Empty<object>());
						InvokeIncrementStats((PlayerStatType)77);
						pick++;
						m_dTower.InvokeUseFuel(0, 5, 1);
					}
					continue;
				}
			}
			if (miscSeagal)
			{
				RandomFlyingBird componentInParent6 = ((Component)val).GetComponentInParent<RandomFlyingBird>();
				if ((Object)(object)componentInParent6 != (Object)null)
				{
					if (seagul < miscTotal && ((Object)componentInParent6).name.StartsWith("Seagal") && (Object)(object)componentInParent6.m_nview != (Object)null && GH.TerrainCheck(((Component)componentInParent6).transform.position, -0.1f))
					{
						ReloadAmmo(((Component)componentInParent6).gameObject, componentInParent6.m_nview.GetZDO().m_uid);
						seagul++;
					}
					continue;
				}
			}
			if ((!miscStump && !miscRock && !miscBush) || statphy >= miscTotal)
			{
				continue;
			}
			StaticPhysics componentInParent7 = ((Component)val).GetComponentInParent<StaticPhysics>();
			Destructible componentInParent8 = ((Component)val).GetComponentInParent<Destructible>();
			if ((Object)(object)componentInParent7 != (Object)null && (Object)(object)componentInParent8 != (Object)null && (Object)(object)componentInParent7.m_nview != (Object)null)
			{
				m_miscCanTarget = false;
				if (((Object)componentInParent7).name.Contains("Stub") || ((Object)componentInParent7).name.Contains("Stump"))
				{
					m_miscCanTarget = miscStump;
				}
				else if (((Object)componentInParent7).name.StartsWith("Rock") && GH.TerrainCheck(((Component)componentInParent7).transform.position))
				{
					m_miscCanTarget = miscRock;
				}
				else if (((Object)componentInParent7).name.StartsWith("Bush"))
				{
					m_miscCanTarget = miscBush;
				}
				if (m_miscCanTarget)
				{
					ReloadAmmo(((Component)componentInParent7).gameObject, componentInParent7.m_nview.GetZDO().m_uid);
					statphy++;
				}
			}
		}
	}

	private void ReloadAmmo(GameObject target, ZDOID zdoid)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < 3; i++)
		{
			m_miscTarget.Add(target);
			m_miscTarget2.Add(zdoid);
		}
		m_dTower.InvokeUseFuel(miscUseCost, 5, 1);
	}

	private void InvokeIncrementStats(PlayerStatType statType)
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Expected I4, but got Unknown
		m_dTower.m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_IncrementDynamicStats", new object[1] { (int)statType });
	}

	private void RPC_IncrementDynamicStats(long sender, int statsType)
	{
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)ZNet.instance != (Object)null && (Object)(object)Player.m_localPlayer != (Object)null && !ZNet.instance.IsServer() && Vector3.Distance(((Component)Player.m_localPlayer).transform.position, ((Component)m_dTower.m_shield).transform.position) <= m_dTower.m_shield.m_radius)
		{
			Game.instance.IncrementPlayerStat((PlayerStatType)statsType, 1f);
		}
	}

	private void ShootTarget()
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: 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)
		if (m_dTower.IsShieldOwner() && m_miscTarget.Count > 0)
		{
			GameObject val = m_miscTarget.First();
			m_miscTarget.Remove(val);
			ZDOID val2 = m_miscTarget2.First();
			m_miscTarget2.Remove(val2);
			if ((Object)(object)val != (Object)null)
			{
				DynamicAmmo.ShootProjectile(m_dTower.m_shield, m_dTower, val2, val, DynamicAmmo.AmmoType.Ice);
			}
		}
	}
}
public class DynamicAmmo : MonoBehaviour
{
	public enum AmmoType
	{
		Ice,
		Light,
		Sham,
		Rads,
		len
	}

	public ZDOID targetZDOID;

	public ShieldGenerator m_tower;

	public Projectile m_projectile;

	public ZNetView m_nview;

	public GameObject m_target;

	public Character m_targetBff;

	public int retry;

	public bool hasHeight;

	public float m_ttl = 10f;

	public float turnRate = 180f;

	public Vector3 pointA;

	public Vector3 pointB;

	public Vector3 posAmmo;

	public Vector3 posBff;

	public Vector3 posNow;

	public Vector3 posOld = Vector3.zero;

	public Vector3 vecFwd;

	public List<Vector3> rayPoint = new List<Vector3>();

	private float deltaTime;

	private Collider aimCollider;

	public static float m_speed1 = 20f;

	public static float m_speed2 = 15f;

	public static float m_speed3 = 10f;

	private static GameObject projectileBuff;

	public static GameObject projectileIce;

	public static GameObject projectileLight;

	public static GameObject projectileSham;

	public static GameObject projectileRads;

	public static string[] projectileName_Dynamic = new string[4] { "DynamicIce", "DynamicLightning", "DynamicSham", "DynamicRad" };

	public static string[] projectileName_Vanilla = new string[4] { "staff_iceshard_projectile", "staff_lightning_projectile", "GoblinShaman_projectile_fireball", "radiation" };

	public static GameObject animeMiniAoe;

	public static GameObject animeRefuel;

	public static GameObject animeDomehit;

	public static float projectileDamage;

	public static float iceshardFrost;

	public static float lightningLight;

	public static float fireballFire;

	public static float radiatonSpirit;

	public static bool seeThruWall;

	public static bool canHitStructure;

	public static bool canHitPlayer;

	public static bool canHitTameable;

	public static bool canHitWild;

	public static bool canHitBoss;

	public static bool showDebugRay;

	private static Vector3 endPos = default(Vector3);

	private TreeBase hitTreeBase;

	private Projectile hitProjectile;

	private WearNTear hitWearTear;

	private Collider[] hitColliders;

	public void Awake()
	{
		m_nview = ((Component)this).GetComponent<ZNetView>();
		m_projectile = ((Component)this).GetComponent<Projectile>();
		if ((Object)(object)m_nview != (Object)null && m_nview.GetZDO() != null)
		{
			((MonoBehaviour)this).InvokeRepeating("SlowUpdate", 0f, 1f);
			((MonoBehaviour)this).InvokeRepeating("UpdateTarget", 0f, 0.22f);
			m_nview.Register("RPC_IncrementDynamicAmmoSkill", (Action<long>)RPC_IncrementDynamicAmmoSkill);
		}
	}

	public void FixedUpdate()
	{
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: 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_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0196: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)m_nview == (Object)null || !m_nview.IsOwner())
		{
			return;
		}
		if ((Object)(object)m_target == (Object)null && retry <= 2)
		{
			retry++;
			if ((Object)(object)m_tower != (Object)null)
			{
				m_targetBff = GetEnemyInRange(pointA, m_tower.m_radius, new List<Character>());
				if ((Object)(object)m_targetBff != (Object)null)
				{
					m_target = ((Component)m_targetBff).gameObject;
				}
			}
		}
		if ((Object)(object)m_target != (Object)null)
		{
			posBff = GetCenterAim(m_target, posBff);
		}
		else if (!hasHeight)
		{
			hasHeight = true;
			posBff.y = GH.GetTerrainHeight(posBff);
		}
		pointB = posBff;
		posAmmo = ((Component)m_projectile).transform.position;
		posNow = GetVecForward(pointA, posAmmo, pointB, 0.5f, out vecFwd);
		m_projectile.m_vel = Vector3.RotateTowards(m_projectile.m_vel, vecFwd, turnRate * Time.deltaTime * ((float)Math.PI / 180f), 0f);
		if (showDebugRay)
		{
			if (Vector3.Distance(posNow, posOld) > 0.5f)
			{
				posOld = posNow;
				rayPoint.Add(posOld);
			}
			GH.DrawRayLine(rayPoint, 0.05f, 0.1f, Color.red);
		}
	}

	public void InvokeIncrementAmmoSkill()
	{
		m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_IncrementDynamicAmmoSkill", Array.Empty<object>());
	}

	public void RPC_IncrementDynamicAmmoSkill(long sender)
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: 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_00a0: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Invalid comparison between Unknown and I4
		//IL_013b: 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_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)Player.m_localPlayer == (Object)null || !(Vector3.Distance(((Component)m_tower).transform.position, ((Component)Player.m_localPlayer).transform.position) <= m_tower.m_radius))
		{
			return;
		}
		float raiseSkillAmount = m_projectile.m_raiseSkillAmount;
		string text = "";
		SkillType val = (SkillType)0;
		if (((Character)Player.m_localPlayer).GetSkillFactor(m_projectile.m_skill) < 1f)
		{
			val = (SkillType)10;
			text = "Blood +";
		}
		else if (((Character)Player.m_localPlayer).GetSkillFactor((SkillType)9) < 1f)
		{
			val = (SkillType)9;
			text = "Element +";
		}
		else
		{
			val = (SkillType)999;
			text = "++ All Skills ++";
		}
		if ((int)val != 0)
		{
			if ((int)val == 999)
			{
				AddSkills((SkillType)1, raiseSkillAmount);
				AddSkills((SkillType)2, raiseSkillAmount);
				AddSkills((SkillType)3, raiseSkillAmount);
				AddSkills((SkillType)4, raiseSkillAmount);
				AddSkills((SkillType)6, raiseSkillAmount);
				AddSkills((SkillType)7, raiseSkillAmount);
				AddSkills((SkillType)8, raiseSkillAmount);
				AddSkills((SkillType)11, raiseSkillAmount);
				AddSkills((SkillType)12, raiseSkillAmount);
				AddSkills((SkillType)13, raiseSkillAmount);
				AddSkills((SkillType)14, raiseSkillAmount);
				AddSkills((SkillType)100, raiseSkillAmount);
				AddSkills((SkillType)101, raiseSkillAmount);
				AddSkills((SkillType)102, raiseSkillAmount);
				AddSkills((SkillType)103, raiseSkillAmount);
				AddSkills((SkillType)104, raiseSkillAmount);
				AddSkills((SkillType)110, raiseSkillAmount);
			}
			else
			{
				AddSkills(val, raiseSkillAmount);
			}
			Vector3 position = ((Component)Player.m_localPlayer).transform.position;
			position.y += 1.2f;
			float num = 1f;
			((Character)Player.m_localPlayer).m_seman.ModifyRaiseSkill(val, ref num);
			text += num * raiseSkillAmount;
			DynamicText.instance.ShowText(DynamicText.TextType.Skill, position, text);
		}
		static void AddSkills(SkillType addskilltype, float skillamount)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			if (((Character)Player.m_localPlayer).GetSkillFactor(addskilltype) < 1f)
			{
				((Character)Player.m_localPlayer).RaiseSkill(addskilltype, skillamount);
			}
		}
	}

	public void SetStartPoint(Vector3 start)
	{
		//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_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: 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_001b: Unknown result type (might be due to invalid IL or missing references)
		pointA = start;
		posAmmo = start;
		posOld = start;
		rayPoint.Add(start);
	}

	private Vector3 GetVecForward(Vector3 start, Vector3 ammo, Vector3 end, float targetOffsets, out Vector3 fwd)
	{
		//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_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: 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_0034: 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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: 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_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: 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_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: 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_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		if (DistanceVector2(ammo, end) < 5f)
		{
			fwd = end - ammo;
			return end;
		}
		float num = DistanceVector2(start, end);
		float num2 = DistanceVector2(start, ammo) + targetOffsets;
		Vector3 val = (end - start) / 3f;
		Vector3 val2 = start + val + Vector3.up * 15f;
		Vector3 val3 = val2 + val + Vector3.up * 15f;
		if (num2 <= num)
		{
			deltaTime = num2 / num;
		}
		Vector3 val4 = Vector3.Lerp(start, val2, deltaTime);
		Vector3 val5 = Vector3.Lerp(val2, val3, deltaTime);
		Vector3 val6 = Vector3.Lerp(val3, end, deltaTime);
		Vector3 val7 = Vector3.Lerp(val4, val5, deltaTime);
		Vector3 val8 = Vector3.Lerp(val5, val6, deltaTime);
		Vector3 val9 = Vector3.Lerp(val7, val8, deltaTime) + Vector3.up * 7f;
		fwd = val9 - ammo;
		return val9;
	}

	private float DistanceVector2(Vector3 startt, Vector3 endd)
	{
		//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_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = startt;
		val.y = endd.y;
		return Vector3.Distance(val, endd);
	}

	private Vector3 GetCenterAim(GameObject target, Vector3 oldAimCenter)
	{
		//IL_002e: 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_0028: Unknown result type (might be due to invalid IL or missing references)
		aimCollider = target.GetComponent<Collider>();
		if ((Object)(object)aimCollider != (Object)null)
		{
			Bounds bounds = aimCollider.bounds;
			return ((Bounds)(ref bounds)).center;
		}
		return oldAimCenter;
	}

	public static Character GetEnemyInRange(Vector3 basePos, float range, List<Character> excludList, float targetHeight = 0f)
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		foreach (Character s_character in Character.s_characters)
		{
			if (excludList.Contains(s_character) || (Object)(object)s_character == (Object)null || Vector3.Distance(((Component)s_character).transform.position, basePos) > range || (Object)(object)((Component)s_character).GetComponent<Growup>() != (Object)null || (s_character.IsBoss() && !canHitBoss))
			{
				continue;
			}
			if (!seeThruWall)
			{
				endPos = new Vector3(((Component)s_character).transform.position.x, ((Component)s_character).transform.position.y + targetHeight, ((Component)s_character).transform.position.z);
				if (GH.RaycastIsBlocked(basePos, endPos))
				{
					continue;
				}
			}
			if (!canHitPlayer && (int)s_character.m_faction == 0)
			{
				continue;
			}
			if ((Object)(object)((Component)s_character).GetComponent<Tameable>() != (Object)null)
			{
				if (s_character.IsTamed())
				{
					if (!canHitTameable)
					{
						continue;
					}
				}
				else if (!canHitWild)
				{
					continue;
				}
			}
			if (!s_character.IsDead())
			{
				excludList.Add(s_character);
				return s_character;
			}
		}
		return null;
	}

	public static void ShootProjectile(ShieldGenerator tower, DynamicTower dyntower, ZDOID zdoid, GameObject victim, AmmoType ammotype)
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: 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_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0072: 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)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: 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)
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_010a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0179: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_0183: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Expected O, but got Unknown
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_021d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0222: Unknown result type (might be due to invalid IL or missing references)
		//IL_025c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02de: Unknown result type (might be due to invalid IL or missing references)
		//IL_034a: Unknown result type (might be due to invalid IL or missing references)
		//IL_032b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: Unknown result type (might be due to invalid IL or missing references)
		projectileBuff = GetAmmoFromType(ammotype);
		if ((Object)(object)tower == (Object)null || (Object)(object)dyntower == (Object)null || (Object)(object)victim == (Object)null || (Object)(object)projectileBuff == (Object)null)
		{
			return;
		}
		Vector3 val = GetTowerShootPos(addoffsets: true);
		Vector3 val2 = val;
		val2.y += 1f;
		Vector3 val3 = val2 - val;
		Quaternion val4 = Quaternion.LookRotation(val3, Vector3.up);
		GameObject val5 = Object.Instantiate<GameObject>(projectileBuff, val, val4);
		if ((Object)(object)val5 == (Object)null)
		{
			return;
		}
		Projectile component = val5.GetComponent<Projectile>();
		DynamicAmmo component2 = val5.GetComponent<DynamicAmmo>();
		if ((Object)(object)component == (Object)null || (Object)(object)component2 == (Object)null)
		{
			Object.Destroy((Object)(object)val5);
			return;
		}
		component2.targetZDOID = zdoid;
		component2.m_tower = tower;
		component2.m_target = victim;
		component2.pointB = victim.transform.position;
		component2.posBff = victim.transform.position;
		component2.SetStartPoint(val);
		float num = Vector3.Distance(component2.pointA, component2.pointB);
		if (num <= 5f)
		{
			component.m_vel = ((Vector3)(ref val3)).normalized * m_speed3;
		}
		else if (num <= 10f)
		{
			component.m_vel = ((Vector3)(ref val3)).normalized * m_speed2;
		}
		else
		{
			component.m_vel = ((Vector3)(ref val3)).normalized * m_speed1;
		}
		HitData val6 = new HitData();
		((DamageTypes)(ref val6.m_damage)).Add(GetDamageType(ammotype), 1);
		val6.m_pushForce = 3f;
		val6.m_backstabBonus = 3f;
		val6.m_dodgeable = false;
		val6.m_blockable = false;
		val6.m_ranged = true;
		val6.m_skill = (SkillType)10;
		val6.m_skillRaiseAmount = (Game.m_worldLevel + 1) * 2;
		val6.m_hitType = (HitType)19;
		val6.m_healthReturn = 10f;
		val6.m_toolTier = 4;
		val6.m_itemWorldLevel = 0;
		val6.m_staggerMultiplier = 3f;
		component.m_damage = val6.m_damage;
		component.m_originalHitData = val6;
		component.m_stayTTL = 0f;
		component.m_gravity = 0f;
		component.m_stayAfterHitStatic = false;
		component.m_stayAfterHitDynamic = false;
		component.m_skill = val6.m_skill;
		component.m_raiseSkillAmount = val6.m_skillRaiseAmount;
		Rigidbody component3 = ((Component)component).GetComponent<Rigidbody>();
		if ((Object)(object)component3 != (Object)null)
		{
			component3.mass = 0f;
		}
		Piece component4 = ((Component)tower).GetComponent<Piece>();
		if ((Object)(object)component4 != (Object)null)
		{
			long creator = component4.GetCreator();
			component.m_owner = (Character)(object)Player.GetPlayer(creator);
			if ((Object)(object)component.m_owner != (Object)null)
			{
				val6.m_attacker = component.m_owner.GetZDOID();
			}
		}
		if ((Object)(object)component.m_owner == (Object)null)
		{
			component.m_owner = (Character)(object)Player.GetPlayer(tower.m_nview.GetZDO().GetOwner());
			if ((Object)(object)component.m_owner != (Object)null)
			{
				val6.m_attacker = component.m_owner.GetZDOID();
			}
		}
		IProjectile component5 = val5.GetComponent<IProjectile>();
		if (component5 != null)
		{
			component5.Setup(component.m_owner, component.m_vel, 0f, val6, (ItemData)null, (ItemData)null);
		}
		static GameObject GetAmmoFromType(AmmoType type)
		{
			GameObject val8 = null;
			switch (type)
			{
			case AmmoType.Ice:
				val8 = projectileIce;
				if ((Object)(object)val8 == (Object)null)
				{
					GH.DWarn(" projectileIce == null");
				}
				break;
			case AmmoType.Light:
				val8 = projectileLight;
				if ((Object)(object)val8 == (Object)null)
				{
					GH.DWarn(" projectileLight == null");
				}
				break;
			case AmmoType.Sham:
				val8 = projectileSham;
				if ((Object)(object)val8 == (Object)null)
				{
					GH.DWarn(" projectileSham == null");
				}
				break;
			case AmmoType.Rads:
				val8 = projectileRads;
				if ((Object)(object)val8 == (Object)null)
				{
					GH.DWarn(" projectileRads == null");
				}
				break;
			default:
				val8 = null;
				GH.DWarn(" Attempt to fetch unknown projectile type");
				break;
			}
			return val8;
		}
		static DamageTypes GetDamageType(AmmoType type)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			DamageTypes result = default(DamageTypes);
			switch (type)
			{
			case AmmoType.Ice:
				result.m_damage = projectileDamage;
				result.m_blunt = 50f;
				result.m_slash = 50f;
				result.m_pierce = 50f;
				result.m_chop = 50f;
				result.m_pickaxe = 50f;
				break;
			case AmmoType.Light:
				result.m_damage = projectileDamage;
				result.m_lightning = lightningLight;
				result.m_poison = 3f;
				break;
			case AmmoType.Sham:
				result.m_damage = projectileDamage;
				result.m_fire = fireballFire;
				result.m_poison = 3f;
				break;
			case AmmoType.Rads:
				result.m_damage = projectileDamage;
				result.m_spirit = radiatonSpirit;
				result.m_poison = 3f;
				break;
			}
			return result;
		}
		Vector3 GetTowerShootPos(bool addoffsets = false)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val7 = ((Component)tower).transform.position;
			val7.y += DynamicTower.fixedHeight + 0.5f;
			if ((Object)(object)dyntower != (Object)null)
			{
				if (addoffsets)
				{
					val7 += dyntower.shootOffsets[dyntower.offsets];
					dyntower.offsets++;
					if (dyntower.offsets >= dyntower.shootOffsets.Length)
					{
						dyntower.offsets = 0;
					}
				}
			}
			else
			{
				val7 += Random.onUnitSphere * 1.5f;
			}
			return val7;
		}
	}

	public static bool IsAmmo(string name)
	{
		if (name.StartsWith(projectileName_Dynamic[0]) || name.StartsWith(projectileName_Dynamic[1]) || name.StartsWith(projectileName_Dynamic[2]) || name.StartsWith(projectileName_Dynamic[3]))
		{
			return true;
		}
		return false;
	}

	public bool IsHitPiecesNStatic(Collider projectileCollider, GameObject hitObject)
	{
		hitTreeBase = hitObject.GetComponent<TreeBase>();
		if ((Object)(object)hitTreeBase != (Object)null)
		{
			IgnoreAllCollider(projectileCollider, hitObject);
			return true;
		}
		hitProjectile = hitObject.GetComponent<Projectile>();
		if ((Object)(object)hitProjectile != (Object)null)
		{
			IgnoreAllCollider(projectileCollider, hitObject);
			return true;
		}
		hitWearTear = hitObject.GetComponent<WearNTear>();
		if ((Object)(object)hitWearTear != (Object)null && !canHitStructure)
		{
			IgnoreAllCollider(projectileCollider, hitObject);
			return true;
		}
		return false;
		void IgnoreAllCollider(Collider baseCollider, GameObject go)
		{
			hitColliders = go.GetComponentsInChildren<Collider>(true);
			if (hitColliders.Length != 0)
			{
				Collider[] array = hitColliders;
				foreach (Collider val in array)
				{
					Physics.IgnoreCollision(baseCollider, val);
				}
			}
		}
	}

	public bool IsHitCharacter(Collider projectileCollider, Character character)
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)((Component)character).GetComponent<Tameable>() != (Object)null)
		{
			if (character.m_tamed)
			{
				if (!canHitTameable)
				{
					Physics.IgnoreCollision(projectileCollider, ((Component)character).gameObject.GetComponent<Collider>());
					return true;
				}
			}
			else if (!canHitWild)
			{
				Physics.IgnoreCollision(projectileCollider, ((Component)character).gameObject.GetComponent<Collider>());
				return true;
			}
		}
		else if ((int)character.m_faction == 0 && character.IsPlayer())
		{
			if (!canHitPlayer)
			{
				Physics.IgnoreCollision(projectileCollider, ((Component)character).gameObject.GetComponent<Collider>());
				return true;
			}
		}
		else if (character.IsBoss() && !canHitBoss)
		{
			Physics.IgnoreCollision(projectileCollider, ((Component)character).gameObject.GetComponent<Collider>());
			return true;
		}
		return false;
	}
}
public class DynamicText : MonoBehaviour
{
	public enum TextType
	{
		Heal,
		Repair,
		Pickup,
		Destroy,
		Enemy,
		Misc,
		AOE,
		Skill
	}

	public class WorldTextInstance
	{
		public Vector3 m_worldPos;

		public GameObject m_gui;

		public float m_timer;

		public TMP_Text m_textField;
	}

	public static DynamicText m_instance;

	public float m_textDuration = 1.5f;

	public float m_maxTextDistance = 30f;

	public int m_largeFontSize = 16;

	public int m_smallFontSize = 8;

	public float m_smallFontDistance = 10f;

	public GameObject m_worldTextBase;

	public List<WorldTextInstance> m_worldTexts = new List<WorldTextInstance>();

	public DamageText m_body;

	private float alpha = 0.5f;

	public static DynamicText instance => m_instance;

	public void Awake()
	{
		m_instance = this;
		m_body = ((Component)this).GetComponent<DamageText>();
		m_worldTextBase = DamageText.instance.m_worldTextBase;
		ZRoutedRpc.instance.Register<ZPackage>("RPC_DamageText", (Action<long, ZPackage>)RPC_DamageText);
	}

	public void LateUpdate()
	{
		UpdateWorldTexts(Time.deltaTime);
	}

	public void UpdateWorldTexts(float dt)
	{
		//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_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0114: Unknown result type (might be due to invalid IL or missing references)
		WorldTextInstance worldTextInstance = null;
		Camera mainCamera = Utils.GetMainCamera();
		foreach (WorldTextInstance worldText in m_worldTexts)
		{
			worldText.m_timer += dt;
			if (worldText.m_timer > m_textDuration && worldTextInstance == null)
			{
				worldTextInstance = worldText;
			}
			worldText.m_worldPos.y += dt;
			float num = Mathf.Clamp01(worldText.m_timer / m_textDuration);
			Color color = ((Graphic)worldText.m_textField).color;
			color.a = 1f - Mathf.Pow(num, 3f);
			((Graphic)worldText.m_textField).color = color;
			Vector3 val = Utils.WorldToScreenPointScaled(mainCamera, worldText.m_worldPos);
			if (val.x < 0f || val.x > (float)Screen.width || val.y < 0f || val.y > (float)Screen.height || val.z < 0f)
			{
				worldText.m_gui.SetActive(false);
				continue;
			}
			worldText.m_gui.SetActive(true);
			worldText.m_gui.transform.position = val;
		}
		if (worldTextInstance != null)
		{
			Object.Destroy((Object)(object)worldTextInstance.m_gui);
			m_worldTexts.Remove(worldTextInstance);
		}
	}

	public void AddInworldText(TextType type, Vector3 pos, float distance, string num, bool mySelf)
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		if (m_worldTexts.Count <= 200)
		{
			WorldTextInstance worldTextInstance = new WorldTextInstance();
			worldTextInstance.m_worldPos = pos + Random.insideUnitSphere * 0.5f;
			worldTextInstance.m_gui = Object.Instantiate<GameObject>(m_worldTextBase, ((Component)this).transform);
			worldTextInstance.m_textField = worldTextInstance.m_gui.GetComponent<TMP_Text>();
			worldTextInstance.m_timer = 0f;
			m_worldTexts.Add(worldTextInstance);
			string text = "";
			Color color = Color.white;
			GetColorNText(type, ref text, ref color);
			worldTextInstance.m_textField.text = text + num;
			((Graphic)worldTextInstance.m_textField).color = color;
			if (distance > m_smallFontDistance)
			{
				worldTextInstance.m_textField.fontSize = m_smallFontSize;
			}
			else
			{
				worldTextInstance.m_textField.fontSize = m_largeFontSize;
			}
		}
	}

	private void GetColorNText(TextType texttype, ref string text, ref Color color)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_0156: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		text = "";
		color = Color.white;
		switch (texttype)
		{
		case TextType.Heal:
			color = new Color(0f, 1f, 0f, alpha);
			text = "Heal ";
			break;
		case TextType.Repair:
			color = new Color(0.4f, 1f, 0.4f, alpha);
			text = "Repair ";
			break;
		case TextType.Pickup:
			color = new Color(0f, 1f, 1f, alpha);
			text = "Pickup ";
			break;
		case TextType.Destroy:
			color = new Color(1f, 0.5f, 0.5f, alpha);
			text = "Destroy ";
			break;
		case TextType.Enemy:
			color = new Color(1f, 0.62f, 0.31f, alpha);
			text = "Enemy ";
			break;
		case TextType.Misc:
			color = new Color(1f, 1f, 0.7f, alpha);
			text = "Misc ";
			break;
		case TextType.AOE:
			color = new Color(1f, 0f, 0f, alpha);
			text = "AOE ";
			break;
		case TextType.Skill:
			color = Color.yellow;
			text = "";
			break;
		default:
			color = Color.white;
			break;
		}
	}

	public void ShowText(TextType type, Vector3 pos, string num, bool player = false)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Expected O, but got Unknown
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		ZPackage val = new ZPackage();
		val.Write((int)type);
		val.Write(pos);
		val.Write(num);
		val.Write(player);
		ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "RPC_DamageText", new object[1] { val });
	}

	public void RPC_DamageText(long sender, ZPackage pkg)
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		Camera mainCamera = Utils.GetMainCamera();
		if (Object.op_Implicit((Object)(object)mainCamera) && !Hud.IsUserHidden())
		{
			TextType type = (TextType)pkg.ReadInt();
			Vector3 val = pkg.ReadVector3();
			string num = pkg.ReadString();
			bool flag = pkg.ReadBool();
			float num2 = Vector3.Distance(((Component)mainCamera).transform.position, val);
			if (!(num2 > m_maxTextDistance))
			{
				bool mySelf = flag && sender == ZNet.GetUID();
				AddInworldText(type, val, num2, num, mySelf);
			}
		}
	}
}
public class DynamicTower : MonoBehaviour
{
	public ShieldGenerator m_shield;

	public ZNetView m_nview;

	public Container m_container;

	public bool showActivity;

	public int generatorCost;

	private Transform fakeDome1;

	private Transform fakeDome2;

	private Transform[] fakeWisps;

	public int Frag;

	public int Chrd = 1;

	public int Fuel = 2;

	private bool isDropContent;

	public float[] fuelAmount = new float[3] { -1f, -1f, -1f };

	public string[] fuelName = new string[3] { "BoneFragments", "CharredBone", "None" };

	private int wispNum;

	private int maxWisp = 10;

	private int ringNum;

	private int maxRing = 5;

	private float ringRad;

	private float ringOff;

	private Color ringColor = new Color(0.313f, 1f, 1f, 0.3f);

	private float particlePosition = 4f;

	private float particleDirection = 1f;

	private float triggerTime = 10f;

	public float domeScale;

	private bool triggerIsUsed;

	private Vector3 fixedPoint = new Vector3(0f, fixedHeight, 0f);

	public int offsets;

	public Vector3[] shootOffsets = (Vector3[])(object)new Vector3[5]
	{
		new Vector3(0f, 0f, 0f),
		new Vector3(0f, 0f, 1f),
		new Vector3(1f, 0f, 1f),
		new Vector3(1f, 0f, -1f),
		new Vector3(-1f, 0f, 1f)
	};

	public static GameObject DynamicGoblin;

	public static GameObject DynamicStaff;

	public static GameObject DynamicWisp;

	public static string[] fakeName_Goblin = new string[2] { "vfx_DynamicGoblinShield", "vfx_GoblinShield" };

	public static string[] fakeName_Staff = new string[2] { "vfx_DynamicStaffShield", "vfx_StaffShield" };

	public static string[] fakeName_Wisp = new string[2] { "DynamicWisp", "LuredWisp" };

	public static float shieldScale = 1.5f;

	public static float fixedHeight = 6.7f;

	private string zdoCount;

	private int healCount;

	private int repairCount;

	private int pickupCount;

	private int destroyCount;

	private int enemyCount;

	private int miscCount;

	private int aoeCount;

	public void Awake()
	{
		if (Player.IsPlacementGhost(((Component)this).gameObject))
		{
			return;
		}
		if (showActivity)
		{
			GH.DWarn(" DynamicTrigger Awake");
		}
		m_shield = ((Component)this).GetComponent<ShieldGenerator>();
		m_nview = ((Component)this).GetComponent<ZNetView>();
		m_container = ((Component)this).GetComponent<Container>();
		fuelAmount[Fuel] = -1f;
		isDropContent = false;
		if (!((Object)(object)m_nview != (Object)null) || m_nview.GetZDO() == null)
		{
			return;
		}
		((MonoBehaviour)this).InvokeRepeating("ApplyShieldEffect", 0f, 0.5f);
		m_nview.Register<string, int>("RPC_AddDynamicFuel", (Action<long, string, int>)RPC_AddDynamicFuel);
		m_nview.Register<int, int, int>("RPC_UseDynamicFuel", (Action<long, int, int, int>)RPC_UseDynamicFuel);
		m_nview.Register<int>("RPC_UseDynamicAoe", (Action<long, int>)RPC_UseDynamicAoe);
		if ((Object)(object)m_shield != (Object)null)
		{
			EffectData[] effectPrefabs = m_shield.m_fuelAddedEffects.m_effectPrefabs;
			foreach (EffectData val in effectPrefabs)
			{
				if (val != null && (Object)(object)val.m_prefab != (Object)null && ((Object)val.m_prefab).name == "sfx_kiln_addore")
				{
					val.m_prefab.SetActive(false);
					break;
				}
			}
		}
		((MonoBehaviour)this).InvokeRepeating("DynamicSlowUpdate", 0f, 1f);
		if (m_nview.IsOwner())
		{
			RemoveAllWisp();
		}
	}

	public void Update()
	{
		//IL_003a: 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)
		if (!IsShieldValid())
		{
			return;
		}
		if (ringNum > 0)
		{
			ringRad = 1.8f;
			ringOff = -1f;
			for (int i = 0; i < ringNum; i++)
			{
				GH.DrawRayCircle(((Component)m_shield).transform.position, 0.1f, ringRad, (fixedHeight + ringOff) * shieldScale, ringColor);
				ringRad -= 0.3f;
				ringOff -= 0.5f;
			}
		}
		if (fuelAmount[Fuel] > 0f)
		{
			GH.ShowHaloRing(m_shield, "DynamicParticle_Ring1", 2f, 1.4f, ref particlePosition, ref particleDirection);
			GH.FollowLeadHaloRing(m_shield, "DynamicParticle_Ring2", 1.2f, particlePosition - 0.5f);
			GH.FollowLeadHaloRing(m_shield, "DynamicParticle_Ring3", 1f, particlePosition - 1f);
			GH.FollowLeadHaloRing(m_shield, "DynamicParticle_Ring4", 0.8f, particlePosition - 1.5f);
		}
		if (m_nview.IsOwner())
		{
			domeScale = Mathf.Max(fuelAmount[Fuel] / (float)m_shield.m_maxFuel, 0.1f);
			FindandSet(fakeName_Goblin[0] + "(Clone)", domeScale, 0.5f * domeScale);
			FindandSet(fakeName_Staff[0] + "(Clone)", domeScale);
		}
		void FindandSet(string fxname, float set, float rad = 0f)
		{
			fakeDome1 = ((Component)m_shield).transform.Find(fxname);
			if ((Object)(object)fakeDome1 != (Object)null)
			{
				UpdateLocalPosition(((Component)fakeDome1).gameObject, set, rad);
			}
		}
	}

	public void DynamicSlowUpdate()
	{
		//IL_025c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_027a: Unknown result type (might be due to invalid IL or missing references)
		//IL_027f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0285: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: 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_02f3: Unknown result type (might be due to invalid IL or missing references)
		if (!IsShieldValid())
		{
			return;
		}
		if (fuelAmount[Fuel] == -1f)
		{
			LoadFuel();
			LoadCounter();
			fakeDome2 = ((Component)m_shield).transform.Find(fakeName_Goblin[0] + "(Clone)");
			if ((Object)(object)fakeDome2 != (Object)null)
			{
				ZNetScene.instance.Destroy(((Component)fakeDome2).gameObject);
			}
			fakeDome2 = ((Component)m_shield).transform.Find(fakeName_Staff[0] + "(Clone)");
			if ((Object)(object)fakeDome2 != (Object)null)
			{
				ZNetScene.instance.Destroy(((Component)fakeDome2).gameObject);
			}
			return;
		}
		if (triggerIsUsed && GH.IsTimeElpase(m_nview, ZDOVars.s_lastTime, triggerTime))
		{
			triggerIsUsed = false;
		}
		ringNum = CountRingNumber();
		if (!m_nview.IsOwner() || isDropContent)
		{
			return;
		}
		fakeDome2 = ((Component)m_shield).transform.Find(fakeName_Goblin[0] + "(Clone)");
		if ((Object)(object)fakeDome2 == (Object)null)
		{
			CreateDome(DynamicGoblin);
		}
		fakeDome2 = ((Component)m_shield).transform.Find(fakeName_Staff[0] + "(Clone)");
		if ((Object)(object)fakeDome2 == (Object)null)
		{
			CreateDome(DynamicStaff);
		}
		fakeWisps = FindChildren(((Component)m_shield).transform, fakeName_Wisp[0] + "(Clone)");
		wispNum = GetWispNumber();
		if (wispNum < fakeWisps.Length)
		{
			if ((Object)(object)ZNetScene.instance != (Object)null)
			{
				Transform val = ((Component)m_shield).transform.Find(fakeName_Wisp[0] + "(Clone)");
				if ((Object)(object)val != (Object)null)
				{
					ZNetScene.instance.Destroy(((Component)val).gameObject);
				}
			}
		}
		else
		{
			if (wispNum <= fakeWisps.Length || !((Object)(object)ZNetScene.instance != (Object)null))
			{
				return;
			}
			Vector3 val2 = ((Component)m_shield).transform.position + Vector3.up * fixedHeight * shieldScale;
			GameObject val3 = Object.Instantiate<GameObject>(DynamicWisp, val2, Quaternion.identity);
			if ((Object)(object)val3 != (Object)null)
			{
				val3.transform.SetParent(((Component)m_shield).transform, true);
				val3.transform.localPosition = new Vector3(0f, fixedHeight * shieldScale, 0f);
				LuredWisp component = val3.GetComponent<LuredWisp>();
				if ((Object)(object)component != (Object)null)
				{
					component.m_despawnTimer = 3f;
					component.m_targetPoint = val2;
					component.m_despawnInDaylight = false;
				}
				else
				{
					ZNetScene.instance.Destroy(val3);
				}
			}
		}
		int CountRingNumber()
		{
			return (int)Mathf.Ceil(Mathf.Lerp(0f, (float)maxRing, fuelAmount[Fuel] / (float)m_shield.m_maxFuel));
		}
		int GetWispNumber()
		{
			return (int)Mathf.Ceil(Mathf.Lerp(0f, (float)maxWisp, fuelAmount[Fuel] / (float)m_shield.m_maxFuel));
		}
	}

	private Transform[] FindChildren(Transform transform, string name)
	{
		return (from t in ((Component)transform).GetComponentsInChildren<Transform>()
			where ((Object)t).name == name
			select t).ToArray();
	}

	private void RemoveAllWisp()
	{
		if ((Object)(object)ZNetScene.instance == (Object)null)
		{
			return;
		}
		Transform[] array = FindChildren(((Component)m_shield).transform, fakeName_Wisp[0] + "(Clone)");
		if (array.Length != 0)
		{
			for (int i = 0; i < array.Length; i++)
			{
				ZNetScene.instance.Destroy(((Component)array[i]).gameObject);
			}
		}
	}

	private GameObject CreateDome(GameObject fxobj, float addRadius = 0f)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = ((Component)m_shield).transform.position + Vector3.up * fixedHeight * shieldScale;
		GameObject val2 = Object.Instantiate<GameObject>(fxobj, val, ((Component)m_shield).transform.rotation);
		if ((Object)(object)val2 != (Object)null)
		{
			val2.transform.SetParent(((Component)m_shield).transform, true);
			UpdateLocalPosition(val2, 0.1f, addRadius);
			return val2;
		}
		return null;
	}

	private void UpdateLocalPosition(GameObject vfxobj, float innerRad, float addRadius = 0f)
	{
		//IL_0018: 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)
		if ((Object)(object)vfxobj != (Object)null)
		{
			vfxobj.transform.localScale = new Vector3(innerRad + addRadius, innerRad + addRadius, innerRad + addRadius);
			vfxobj.transform.localPosition = new Vector3(0f, fixedHeight, 0f);
		}
	}

	public void InvokeUseAoe(int cost)
	{
		triggerIsUsed = true;
		m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_UseDynamicAoe", new object[1] { cost });
	}

	private void RPC_UseDynamicAoe(long sender, int amount)
	{
		triggerIsUsed = true;
		RPC_UseDynamicFuel(0L, amount, 6, 1);
		if ((Object)(object)m_nview != (Object)null && m_nview.IsOwner())
		{
			GH.SetZDOsTime(m_nview, ZDOVars.s_lastTime);
		}
	}

	public void InvokeAddFuel(string fuelname, int amount = 1)
	{
		m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_AddDynamicFuel", new object[2] { fuelname, amount });
	}

	private void RPC_AddDynamicFuel(long sender, string fuelname, int amount)
	{
		//IL_0098: 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)
		if (fuelname.StartsWith(fuelName[Frag]))
		{
			fuelAmount[Frag] += amount;
		}
		else if (fuelname.StartsWith(fuelName[Chrd]))
		{
			fuelAmount[Chrd] += amount;
		}
		fuelAmount[Fuel] = fuelAmount[Frag] + fuelAmount[Chrd];
		m_shield.m_fuelAddedEffects.Create(((Component)m_shield).transform.position, ((Component)m_shield).transform.rotation, ((Component)m_shield).transform, 1f, -1);
		SetFuel();
	}

	public void InvokeUseFuel(int cost, int DynType, int hitCount)
	{
		m_nview.InvokeRPC(ZRoutedRpc.Everybody, "RPC_UseDynamicFuel", new object[3] { cost, DynType, hitCount });
	}

	private void RPC_UseDynamicFuel(long sender, int amount, int type, int hitNum)
	{
		if (fuelAmount[Frag] > 0f)
		{
			fuelAmount[Frag] = Mathf.Max(fuelAmount[Frag] - (float)amount, 0f);
		}
		else if (fuelAmount[Chrd] > 0f)
		{
			fuelAmount[Chrd] = Mathf.Max(fuelAmount[Chrd] - (float)amount, 0f);
		}
		fuelAmount[Fuel] = fuelAmount[Frag] + fuelAmount[Chrd];
		SetFuel();
		for (int i = 0; i < hitNum; i++)
		{
			ShowHitCount((DynamicText.TextType)type);
		}
	}

	private void SetFuel()
	{
		if ((Object)(object)m_nview != (Object)null && m_nview.IsOwner())
		{
			m_nview.GetZDO().Set(ZDOVars.s_stamina, Mathf.Max(fuelAmount[Frag], 0f));
			m_nview.GetZDO().Set(ZDOVars.s_health, Mathf.Max(fuelAmount[Chrd], 0f));
			m_nview.GetZDO().Set(ZDOVars.s_fuel, Mathf.Max(fuelAmount[Fuel], 0f));
		}
	}

	public void DropOnDestroy(Container crate, GameObject cargeCrate)
	{
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: 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_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		if (((Object)(object)ZNetScene.instance == (Object)null && (Object)(object)m_shield == (Object)null) || (Object)(object)m_nview == (Object)null)
		{
			return;
		}
		isDropContent = true;
		if (!m_nview.IsOwner())
		{
			return;
		}
		Transform val = ((Component)m_shield).transform.Find(fakeName_Goblin[0] + "(Clone)");
		if ((Object)(object)val != (Object)null)
		{
			ZNetScene.instance.Destroy(((Component)val).gameObject);
		}
		val = ((Component)m_shield).transform.Find(fakeName_Staff[0] + "(Clone)");
		if ((Object)(object)val != (Object)null)
		{