summaryrefslogtreecommitdiff
path: root/Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs')
-rw-r--r--Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs139
1 files changed, 139 insertions, 0 deletions
diff --git a/Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs b/Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs
new file mode 100644
index 0000000..a2ec07b
--- /dev/null
+++ b/Valheim_v202102/Valheim/assembly_valheim/TreeLog.cs
@@ -0,0 +1,139 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class TreeLog : MonoBehaviour, IDestructible
+{
+ public float m_health = 60f;
+
+ public HitData.DamageModifiers m_damages;
+
+ public int m_minToolTier;
+
+ public EffectList m_destroyedEffect = new EffectList();
+
+ public EffectList m_hitEffect = new EffectList();
+
+ public DropTable m_dropWhenDestroyed = new DropTable();
+
+ public GameObject m_subLogPrefab;
+
+ public Transform[] m_subLogPoints = new Transform[0];
+
+ public float m_spawnDistance = 2f;
+
+ public float m_hitNoise = 100f;
+
+ private Rigidbody m_body;
+
+ private ZNetView m_nview;
+
+ private bool m_firstFrame = true;
+
+ private void Awake()
+ {
+ m_body = GetComponent<Rigidbody>();
+ m_body.maxDepenetrationVelocity = 1f;
+ m_nview = GetComponent<ZNetView>();
+ m_nview.Register<HitData>("Damage", RPC_Damage);
+ if (m_nview.IsOwner())
+ {
+ float @float = m_nview.GetZDO().GetFloat("health", -1f);
+ if (@float == -1f)
+ {
+ m_nview.GetZDO().Set("health", m_health);
+ }
+ else if (@float <= 0f)
+ {
+ m_nview.Destroy();
+ }
+ }
+ Invoke("EnableDamage", 0.2f);
+ }
+
+ private void EnableDamage()
+ {
+ m_firstFrame = false;
+ }
+
+ public DestructibleType GetDestructibleType()
+ {
+ return DestructibleType.Tree;
+ }
+
+ public void Damage(HitData hit)
+ {
+ if (!m_firstFrame && m_nview.IsValid())
+ {
+ m_nview.InvokeRPC("Damage", hit);
+ }
+ }
+
+ private void RPC_Damage(long sender, HitData hit)
+ {
+ if (!m_nview.IsOwner())
+ {
+ return;
+ }
+ float @float = m_nview.GetZDO().GetFloat("health");
+ if (@float <= 0f)
+ {
+ return;
+ }
+ hit.ApplyResistance(m_damages, out var significantModifier);
+ float totalDamage = hit.GetTotalDamage();
+ if (hit.m_toolTier < m_minToolTier)
+ {
+ DamageText.instance.ShowText(DamageText.TextType.TooHard, hit.m_point, 0f);
+ return;
+ }
+ if ((bool)m_body)
+ {
+ m_body.AddForceAtPosition(hit.m_dir * hit.m_pushForce * 2f, hit.m_point, ForceMode.Impulse);
+ }
+ DamageText.instance.ShowText(significantModifier, hit.m_point, totalDamage);
+ if (totalDamage <= 0f)
+ {
+ return;
+ }
+ @float -= totalDamage;
+ if (@float < 0f)
+ {
+ @float = 0f;
+ }
+ m_nview.GetZDO().Set("health", @float);
+ m_hitEffect.Create(hit.m_point, Quaternion.identity, base.transform);
+ if (m_hitNoise > 0f)
+ {
+ Player closestPlayer = Player.GetClosestPlayer(base.transform.position, 10f);
+ if ((bool)closestPlayer)
+ {
+ closestPlayer.AddNoise(m_hitNoise);
+ }
+ }
+ if (@float <= 0f)
+ {
+ Destroy();
+ }
+ }
+
+ private void Destroy()
+ {
+ ZNetScene.instance.Destroy(base.gameObject);
+ m_destroyedEffect.Create(base.transform.position, base.transform.rotation, base.transform);
+ List<GameObject> dropList = m_dropWhenDestroyed.GetDropList();
+ for (int i = 0; i < dropList.Count; i++)
+ {
+ Vector3 position = base.transform.position + base.transform.up * Random.Range(0f - m_spawnDistance, m_spawnDistance) + Vector3.up * 0.3f * i;
+ Quaternion rotation = Quaternion.Euler(0f, Random.Range(0, 360), 0f);
+ Object.Instantiate(dropList[i], position, rotation);
+ }
+ if (m_subLogPrefab != null)
+ {
+ Transform[] subLogPoints = m_subLogPoints;
+ foreach (Transform transform in subLogPoints)
+ {
+ Object.Instantiate(m_subLogPrefab, transform.position, base.transform.rotation).GetComponent<ZNetView>().SetLocalScale(base.transform.localScale);
+ }
+ }
+ }
+}