D:\ValheimDev\Dumps\Old\assembly_valheim\WispSpawner.cs D:\ValheimDev\Dumps\Latest\assembly_valheim\WispSpawner.cs
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
   
public class WispSpawner : MonoBehaviour, Hoverable public class WispSpawner : MonoBehaviour, Hoverable
{ {
    private void Start()     private void Start()
    {     {
        WispSpawner.s_spawners.Add(this);         WispSpawner.s_spawners.Add(this);
        this.m_nview = base.GetComponentInParent<ZNetView>();         this.m_nview = base.GetComponentInParent<ZNetView>();
        base.InvokeRepeating("TrySpawn", 10f, 10f);         base.InvokeRepeating("TrySpawn", 10f, 10f);
        base.InvokeRepeating("UpdateDemister", UnityEngine.Random.Range(0f, 2f), 2f);         base.InvokeRepeating("UpdateDemister", UnityEngine.Random.Range(0f, 2f), 2f);
    }     }
   
    private void OnDestroy()     private void OnDestroy()
    {     {
        WispSpawner.s_spawners.Remove(this);         WispSpawner.s_spawners.Remove(this);
    }     }
   
    public string GetHoverText()     public string GetHoverText()
    {     {
        switch (this.GetStatus())         switch (this.GetStatus())
        {         {
        case WispSpawner.Status.NoSpace:         case WispSpawner.Status.NoSpace:
            return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_nospace )");             return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_nospace )");
        case WispSpawner.Status.TooBright:         case WispSpawner.Status.TooBright:
            return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_light )");             return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_light )");
        case WispSpawner.Status.Full:         case WispSpawner.Status.Full:
            return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_full )");             return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_full )");
        case WispSpawner.Status.Ok:         case WispSpawner.Status.Ok:
            return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_ok )");             return Localization.instance.Localize(this.m_name + " ( $piece_wisplure_ok )");
        default:         default:
            return "";             return "";
        }         }
    }     }
   
    public string GetHoverName()     public string GetHoverName()
    {     {
        return this.m_name;         return this.m_name;
    }     }
   
    private void UpdateDemister()     private void UpdateDemister()
    {     {
        if (this.m_wispsNearbyObject)         if (this.m_wispsNearbyObject)
        {         {
            int wispsInArea = LuredWisp.GetWispsInArea(this.m_spawnPoint.position, this.m_nearbyTreshold);             int wispsInArea = LuredWisp.GetWispsInArea(this.m_spawnPoint.position, this.m_nearbyTreshold);
            this.m_wispsNearbyObject.SetActive(wispsInArea > 0);             this.m_wispsNearbyObject.SetActive(wispsInArea > 0);
        }         }
    }     }
   
    private WispSpawner.Status GetStatus()     private WispSpawner.Status GetStatus()
    {     {
        if (Time.time - this.m_lastStatusUpdate < 4f)         if (Time.time - this.m_lastStatusUpdate < 4f)
        {         {
            return this.m_status;             return this.m_status;
        }         }
        this.m_lastStatusUpdate = Time.time;         this.m_lastStatusUpdate = Time.time;
        this.m_status = WispSpawner.Status.Ok;         this.m_status = WispSpawner.Status.Ok;
        if (!this.HaveFreeSpace())         if (!this.HaveFreeSpace())
        {         {
            this.m_status = WispSpawner.Status.NoSpace;             this.m_status = WispSpawner.Status.NoSpace;
        }         }
.        else if (this.m_onlySpawnAtNight && EnvMan.instance.IsDaylight())         else if (this.m_onlySpawnAtNight && EnvMan.IsDaylight())
        {         {
            this.m_status = WispSpawner.Status.TooBright;             this.m_status = WispSpawner.Status.TooBright;
        }         }
        else if (LuredWisp.GetWispsInArea(this.m_spawnPoint.position, this.m_maxSpawnedArea) >= this.m_maxSpawned)         else if (LuredWisp.GetWispsInArea(this.m_spawnPoint.position, this.m_maxSpawnedArea) >= this.m_maxSpawned)
        {         {
            this.m_status = WispSpawner.Status.Full;             this.m_status = WispSpawner.Status.Full;
        }         }
        return this.m_status;         return this.m_status;
    }     }
   
    private void TrySpawn()     private void TrySpawn()
    {     {
        if (!this.m_nview.IsValid() || !this.m_nview.IsOwner())         if (!this.m_nview.IsValid() || !this.m_nview.IsOwner())
        {         {
            return;             return;
        }         }
        DateTime time = ZNet.instance.GetTime();         DateTime time = ZNet.instance.GetTime();
        DateTime dateTime = new DateTime(this.m_nview.GetZDO().GetLong(ZDOVars.s_lastSpawn, 0L));         DateTime dateTime = new DateTime(this.m_nview.GetZDO().GetLong(ZDOVars.s_lastSpawn, 0L));
        if ((time - dateTime).TotalSeconds < (double)this.m_spawnInterval)         if ((time - dateTime).TotalSeconds < (double)this.m_spawnInterval)
        {         {
            return;             return;
        }         }
        if (UnityEngine.Random.value > this.m_spawnChance)         if (UnityEngine.Random.value > this.m_spawnChance)
        {         {
            return;             return;
        }         }
        if (this.GetStatus() != WispSpawner.Status.Ok)         if (this.GetStatus() != WispSpawner.Status.Ok)
        {         {
            return;             return;
        }         }
        Vector3 vector = this.m_spawnPoint.position + Quaternion.Euler(0f, (float)UnityEngine.Random.Range(0, 360), 0f) * Vector3.forward * this.m_spawnDistance;         Vector3 vector = this.m_spawnPoint.position + Quaternion.Euler(0f, (float)UnityEngine.Random.Range(0, 360), 0f) * Vector3.forward * this.m_spawnDistance;
        UnityEngine.Object.Instantiate<GameObject>(this.m_wispPrefab, vector, Quaternion.identity);         UnityEngine.Object.Instantiate<GameObject>(this.m_wispPrefab, vector, Quaternion.identity);
        this.m_nview.GetZDO().Set(ZDOVars.s_lastSpawn, ZNet.instance.GetTime().Ticks);         this.m_nview.GetZDO().Set(ZDOVars.s_lastSpawn, ZNet.instance.GetTime().Ticks);
    }     }
   
    private bool HaveFreeSpace()     private bool HaveFreeSpace()
    {     {
        if (this.m_maxCover <= 0f)         if (this.m_maxCover <= 0f)
        {         {
            return true;             return true;
        }         }
        float num;         float num;
        bool flag;         bool flag;
        Cover.GetCoverForPoint(this.m_coverPoint.position, out num, out flag, 0.5f);         Cover.GetCoverForPoint(this.m_coverPoint.position, out num, out flag, 0.5f);
        return num < this.m_maxCover;         return num < this.m_maxCover;
    }     }
   
    private void OnDrawGizmos()     private void OnDrawGizmos()
    {     {
    }     }
   
    public static WispSpawner GetBestSpawner(Vector3 p, float maxRange)     public static WispSpawner GetBestSpawner(Vector3 p, float maxRange)
    {     {
        WispSpawner wispSpawner = null;         WispSpawner wispSpawner = null;
        float num = 0f;         float num = 0f;
        foreach (WispSpawner wispSpawner2 in WispSpawner.s_spawners)         foreach (WispSpawner wispSpawner2 in WispSpawner.s_spawners)
        {         {
            float num2 = Vector3.Distance(wispSpawner2.m_spawnPoint.position, p);             float num2 = Vector3.Distance(wispSpawner2.m_spawnPoint.position, p);
            if (num2 <= maxRange)             if (num2 <= maxRange)
            {             {
                WispSpawner.Status status = wispSpawner2.GetStatus();                 WispSpawner.Status status = wispSpawner2.GetStatus();
                if (status != WispSpawner.Status.NoSpace && status != WispSpawner.Status.TooBright && (status != WispSpawner.Status.Full || num2 <= wispSpawner2.m_maxSpawnedArea) && (num2 < num || wispSpawner == null))                 if (status != WispSpawner.Status.NoSpace && status != WispSpawner.Status.TooBright && (status != WispSpawner.Status.Full || num2 <= wispSpawner2.m_maxSpawnedArea) && (num2 < num || wispSpawner == null))
                {                 {
                    num = num2;                     num = num2;
                    wispSpawner = wispSpawner2;                     wispSpawner = wispSpawner2;
                }                 }
            }             }
        }         }
        return wispSpawner;         return wispSpawner;
    }     }
   
    public string m_name = "$pieces_wisplure";     public string m_name = "$pieces_wisplure";
   
    public float m_spawnInterval = 5f;     public float m_spawnInterval = 5f;
   
    [Range(0f, 1f)]     [Range(0f, 1f)]
    public float m_spawnChance = 0.5f;     public float m_spawnChance = 0.5f;
   
    public int m_maxSpawned = 3;     public int m_maxSpawned = 3;
   
    public bool m_onlySpawnAtNight = true;     public bool m_onlySpawnAtNight = true;
   
    public bool m_dontSpawnInCover = true;     public bool m_dontSpawnInCover = true;
   
    [Range(0f, 1f)]     [Range(0f, 1f)]
    public float m_maxCover = 0.6f;     public float m_maxCover = 0.6f;
   
    public GameObject m_wispPrefab;     public GameObject m_wispPrefab;
   
    public GameObject m_wispsNearbyObject;     public GameObject m_wispsNearbyObject;
   
    public float m_nearbyTreshold = 5f;     public float m_nearbyTreshold = 5f;
   
    public Transform m_spawnPoint;     public Transform m_spawnPoint;
   
    public Transform m_coverPoint;     public Transform m_coverPoint;
   
    public float m_spawnDistance = 20f;     public float m_spawnDistance = 20f;
   
    public float m_maxSpawnedArea = 10f;     public float m_maxSpawnedArea = 10f;
   
    private ZNetView m_nview;     private ZNetView m_nview;
   
    private WispSpawner.Status m_status = WispSpawner.Status.Ok;     private WispSpawner.Status m_status = WispSpawner.Status.Ok;
   
    private float m_lastStatusUpdate = -1000f;     private float m_lastStatusUpdate = -1000f;
   
    private static readonly List<WispSpawner> s_spawners = new List<WispSpawner>();     private static readonly List<WispSpawner> s_spawners = new List<WispSpawner>();
   
    public enum Status     public enum Status
    {     {
        NoSpace,         NoSpace,
        TooBright,         TooBright,
        Full,         Full,
        Ok         Ok
    }     }
} }