D:\ValheimDev\Dumps\Old\assembly_valheim\OfferingBowl.cs D:\ValheimDev\Dumps\Latest\assembly_valheim\OfferingBowl.cs
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
   
public class OfferingBowl : MonoBehaviour, Hoverable, Interactable public class OfferingBowl : MonoBehaviour, Hoverable, Interactable
{ {
    private void Awake()     private void Awake()
    {     {
        this.m_solidRayMask = LayerMask.GetMask(new string[] { "Default", "static_solid", "Default_small", "piece" });         this.m_solidRayMask = LayerMask.GetMask(new string[] { "Default", "static_solid", "Default_small", "piece" });
    }     }
   
    private void Start()     private void Start()
    {     {
        this.m_nview = base.GetComponentInParent<ZNetView>();         this.m_nview = base.GetComponentInParent<ZNetView>();
        if (!this.m_nview)         if (!this.m_nview)
        {         {
            return;             return;
        }         }
        this.m_nview.Register<Vector3, bool>("RPC_SpawnBoss", new Action<long, Vector3, bool>(this.RPC_SpawnBoss));         this.m_nview.Register<Vector3, bool>("RPC_SpawnBoss", new Action<long, Vector3, bool>(this.RPC_SpawnBoss));
        this.m_nview.Register("RPC_BossSpawnInitiated", new Action<long>(this.RPC_BossSpawnInitiated));         this.m_nview.Register("RPC_BossSpawnInitiated", new Action<long>(this.RPC_BossSpawnInitiated));
        this.m_nview.Register("RPC_RemoveBossSpawnInventoryItems", new Action<long>(this.RPC_RemoveBossSpawnInventoryItems));         this.m_nview.Register("RPC_RemoveBossSpawnInventoryItems", new Action<long>(this.RPC_RemoveBossSpawnInventoryItems));
    }     }
   
    public string GetHoverText()     public string GetHoverText()
    {     {
        if (this.m_useItemStands)         if (this.m_useItemStands)
        {         {
            return Localization.instance.Localize(this.m_name + "\n[<color=yellow><b>$KEY_Use</b></color>] " + this.m_useItemText);             return Localization.instance.Localize(this.m_name + "\n[<color=yellow><b>$KEY_Use</b></color>] " + this.m_useItemText);
        }         }
        return Localization.instance.Localize(this.m_name + "\n[<color=yellow><b>1-8</b></color>] " + this.m_useItemText);         return Localization.instance.Localize(this.m_name + "\n[<color=yellow><b>1-8</b></color>] " + this.m_useItemText);
    }     }
   
    public string GetHoverName()     public string GetHoverName()
    {     {
        return this.m_name;         return this.m_name;
    }     }
   
    public bool Interact(Humanoid user, bool hold, bool alt)     public bool Interact(Humanoid user, bool hold, bool alt)
    {     {
        if (hold || this.IsBossSpawnQueued() || !this.m_useItemStands)         if (hold || this.IsBossSpawnQueued() || !this.m_useItemStands)
        {         {
            return false;             return false;
        }         }
        using (List<ItemStand>.Enumerator enumerator = this.FindItemStands().GetEnumerator())         using (List<ItemStand>.Enumerator enumerator = this.FindItemStands().GetEnumerator())
        {         {
            while (enumerator.MoveNext())             while (enumerator.MoveNext())
            {             {
                if (!enumerator.Current.HaveAttachment())                 if (!enumerator.Current.HaveAttachment())
                {                 {
.                    user.Message(MessageHud.MessageType.Center, "$msg_incompleteoffering", 0, null);                     user.Message(MessageHud.MessageType.Center, this.m_incompleteOfferText, 0, null);
                    return false;                     return false;
                }                 }
            }             }
        }         }
        this.m_interactUser = user;         this.m_interactUser = user;
        this.InitiateSpawnBoss(this.GetSpawnPosition(), false);         this.InitiateSpawnBoss(this.GetSpawnPosition(), false);
        return true;         return true;
    }     }
   
    public bool UseItem(Humanoid user, ItemDrop.ItemData item)     public bool UseItem(Humanoid user, ItemDrop.ItemData item)
    {     {
        if (this.m_useItemStands)         if (this.m_useItemStands)
        {         {
            return false;             return false;
        }         }
        if (this.IsBossSpawnQueued())         if (this.IsBossSpawnQueued())
        {         {
            return true;             return true;
        }         }
        if (!(this.m_bossItem != null))         if (!(this.m_bossItem != null))
        {         {
            return false;             return false;
        }         }
        if (!(item.m_shared.m_name == this.m_bossItem.m_itemData.m_shared.m_name))         if (!(item.m_shared.m_name == this.m_bossItem.m_itemData.m_shared.m_name))
        {         {
.            user.Message(MessageHud.MessageType.Center, "$msg_offerwrong", 0, null);             user.Message(MessageHud.MessageType.Center, this.m_wrongOfferText, 0, null);
            return true;             return true;
        }         }
        int num = user.GetInventory().CountItems(this.m_bossItem.m_itemData.m_shared.m_name, -1, true);         int num = user.GetInventory().CountItems(this.m_bossItem.m_itemData.m_shared.m_name, -1, true);
        if (num < this.m_bossItems)         if (num < this.m_bossItems)
        {         {
            if (num == 0 && Game.m_worldLevel > 0 && user.GetInventory().CountItems(this.m_bossItem.m_itemData.m_shared.m_name, -1, false) > 0)             if (num == 0 && Game.m_worldLevel > 0 && user.GetInventory().CountItems(this.m_bossItem.m_itemData.m_shared.m_name, -1, false) > 0)
            {             {
                user.Message(MessageHud.MessageType.Center, Localization.instance.Localize("$msg_ng_the_x") + item.m_shared.m_name + Localization.instance.Localize("$msg_ng_x_is_too_low"), 0, null);                 user.Message(MessageHud.MessageType.Center, Localization.instance.Localize("$msg_ng_the_x") + item.m_shared.m_name + Localization.instance.Localize("$msg_ng_x_is_too_low"), 0, null);
            }             }
            else             else
            {             {
.                user.Message(MessageHud.MessageType.Center, string.Format("$msg_incompleteoffering: {0} {1} / {2}", this.m_bossItem.m_itemData.m_shared.m_name, num.ToString(), this.m_bossItems), 0, null);                 user.Message(MessageHud.MessageType.Center, string.Format("{0}: {1} {2} / {3}", new object[] 
                  { 
                      this.m_incompleteOfferText, 
                      this.m_bossItem.m_itemData.m_shared.m_name, 
                      num.ToString(), 
                      this.m_bossItems 
                  }), 0, null);
            }             }
            return true;             return true;
        }         }
        if (this.m_bossPrefab != null)         if (this.m_bossPrefab != null)
        {         {
            this.m_usedSpawnItem = item;             this.m_usedSpawnItem = item;
            this.m_interactUser = user;             this.m_interactUser = user;
            this.InitiateSpawnBoss(this.GetSpawnPosition(), true);             this.InitiateSpawnBoss(this.GetSpawnPosition(), true);
        }         }
        else if (this.m_itemPrefab != null && this.SpawnItem(this.m_itemPrefab, user as Player))         else if (this.m_itemPrefab != null && this.SpawnItem(this.m_itemPrefab, user as Player))
        {         {
            user.GetInventory().RemoveItem(item.m_shared.m_name, this.m_bossItems, -1, true);             user.GetInventory().RemoveItem(item.m_shared.m_name, this.m_bossItems, -1, true);
            user.ShowRemovedMessage(this.m_bossItem.m_itemData, this.m_bossItems);             user.ShowRemovedMessage(this.m_bossItem.m_itemData, this.m_bossItems);
.            user.Message(MessageHud.MessageType.Center, "$msg_offerdone", 0, null);             user.Message(MessageHud.MessageType.Center, this.m_usedAltarText, 0, null);
            this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);             this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);
        }         }
        if (!string.IsNullOrEmpty(this.m_setGlobalKey))         if (!string.IsNullOrEmpty(this.m_setGlobalKey))
        {         {
            ZoneSystem.instance.SetGlobalKey(this.m_setGlobalKey);             ZoneSystem.instance.SetGlobalKey(this.m_setGlobalKey);
        }         }
        return true;         return true;
    }     }
   
    private bool SpawnItem(ItemDrop item, Player player)     private bool SpawnItem(ItemDrop item, Player player)
    {     {
        if (item.m_itemData.m_shared.m_questItem && player.HaveUniqueKey(item.m_itemData.m_shared.m_name))         if (item.m_itemData.m_shared.m_questItem && player.HaveUniqueKey(item.m_itemData.m_shared.m_name))
        {         {
.            player.Message(MessageHud.MessageType.Center, "$msg_cantoffer", 0, null);             player.Message(MessageHud.MessageType.Center, this.m_cantOfferText, 0, null);
            return false;             return false;
        }         }
        UnityEngine.Object.Instantiate<ItemDrop>(item, this.m_itemSpawnPoint.position, Quaternion.identity);         UnityEngine.Object.Instantiate<ItemDrop>(item, this.m_itemSpawnPoint.position, Quaternion.identity);
        return true;         return true;
    }     }
   
    private Vector3 GetSpawnPosition()     private Vector3 GetSpawnPosition()
    {     {
        if (this.m_spawnPoints.Count > 0)         if (this.m_spawnPoints.Count > 0)
        {         {
            return this.m_spawnPoints[UnityEngine.Random.Range(0, this.m_spawnPoints.Count)].transform.position;             return this.m_spawnPoints[UnityEngine.Random.Range(0, this.m_spawnPoints.Count)].transform.position;
        }         }
        Vector3 vector = base.transform.localToWorldMatrix * this.m_spawnAreaOffset;         Vector3 vector = base.transform.localToWorldMatrix * this.m_spawnAreaOffset;
        return base.transform.position + vector;         return base.transform.position + vector;
    }     }
   
    private void InitiateSpawnBoss(Vector3 point, bool removeItemsFromInventory)     private void InitiateSpawnBoss(Vector3 point, bool removeItemsFromInventory)
    {     {
        this.m_nview.InvokeRPC("RPC_SpawnBoss", new object[] { point, removeItemsFromInventory });         this.m_nview.InvokeRPC("RPC_SpawnBoss", new object[] { point, removeItemsFromInventory });
    }     }
   
    private void RPC_SpawnBoss(long senderId, Vector3 point, bool removeItemsFromInventory)     private void RPC_SpawnBoss(long senderId, Vector3 point, bool removeItemsFromInventory)
    {     {
        if (!this.m_nview.IsOwner() || this.IsBossSpawnQueued())         if (!this.m_nview.IsOwner() || this.IsBossSpawnQueued())
        {         {
            return;             return;
        }         }
        Vector3 vector;         Vector3 vector;
        if (this.CanSpawnBoss(point, out vector))         if (this.CanSpawnBoss(point, out vector))
        {         {
            if (!this.m_nview && this.m_nview.IsValid())             if (!this.m_nview && this.m_nview.IsValid())
            {             {
                return;                 return;
            }             }
            this.SpawnBoss(vector);             this.SpawnBoss(vector);
            this.m_nview.InvokeRPC(senderId, "RPC_BossSpawnInitiated", Array.Empty<object>());             this.m_nview.InvokeRPC(senderId, "RPC_BossSpawnInitiated", Array.Empty<object>());
            if (removeItemsFromInventory)             if (removeItemsFromInventory)
            {             {
                this.m_nview.InvokeRPC(senderId, "RPC_RemoveBossSpawnInventoryItems", Array.Empty<object>());                 this.m_nview.InvokeRPC(senderId, "RPC_RemoveBossSpawnInventoryItems", Array.Empty<object>());
                return;                 return;
            }             }
            this.RemoveAltarItems();             this.RemoveAltarItems();
        }         }
    }     }
   
    private void SpawnBoss(Vector3 spawnPoint)     private void SpawnBoss(Vector3 spawnPoint)
    {     {
        base.Invoke("DelayedSpawnBoss", this.m_spawnBossDelay);         base.Invoke("DelayedSpawnBoss", this.m_spawnBossDelay);
        this.m_spawnBossStartEffects.Create(spawnPoint, Quaternion.identity, null, 1f, -1);         this.m_spawnBossStartEffects.Create(spawnPoint, Quaternion.identity, null, 1f, -1);
        this.m_bossSpawnPoint = spawnPoint;         this.m_bossSpawnPoint = spawnPoint;
    }     }
   
    private void RPC_RemoveBossSpawnInventoryItems(long senderId)     private void RPC_RemoveBossSpawnInventoryItems(long senderId)
    {     {
        this.m_interactUser.GetInventory().RemoveItem(this.m_usedSpawnItem.m_shared.m_name, this.m_bossItems, -1, true);         this.m_interactUser.GetInventory().RemoveItem(this.m_usedSpawnItem.m_shared.m_name, this.m_bossItems, -1, true);
        this.m_interactUser.ShowRemovedMessage(this.m_bossItem.m_itemData, this.m_bossItems);         this.m_interactUser.ShowRemovedMessage(this.m_bossItem.m_itemData, this.m_bossItems);
.        this.m_interactUser.Message(MessageHud.MessageType.Center, "$msg_offerdone", 0, null);         this.m_interactUser.Message(MessageHud.MessageType.Center, this.m_usedAltarText, 0, null);
        if (this.m_itemSpawnPoint)         if (this.m_itemSpawnPoint)
        {         {
            this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);             this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);
        }         }
    }     }
   
    private void RemoveAltarItems()     private void RemoveAltarItems()
    {     {
        foreach (ItemStand itemStand in this.FindItemStands())         foreach (ItemStand itemStand in this.FindItemStands())
        {         {
            itemStand.DestroyAttachment();             itemStand.DestroyAttachment();
        }         }
        if (this.m_itemSpawnPoint)         if (this.m_itemSpawnPoint)
        {         {
            this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);             this.m_fuelAddedEffects.Create(this.m_itemSpawnPoint.position, base.transform.rotation, null, 1f, -1);
        }         }
    }     }
   
    private void RPC_BossSpawnInitiated(long senderId)     private void RPC_BossSpawnInitiated(long senderId)
    {     {
.        this.m_interactUser.Message(MessageHud.MessageType.Center, "$msg_offerdone", 0, null);         this.m_interactUser.Message(MessageHud.MessageType.Center, this.m_usedAltarText, 0, null);
    }     }
   
    private bool CanSpawnBoss(Vector3 point, out Vector3 spawnPoint)     private bool CanSpawnBoss(Vector3 point, out Vector3 spawnPoint)
    {     {
        spawnPoint = Vector3.zero;         spawnPoint = Vector3.zero;
        int i = 0;         int i = 0;
        while (i < 100)         while (i < 100)
        {         {
            Vector2 vector = UnityEngine.Random.insideUnitCircle * this.m_spawnBossMaxDistance;             Vector2 vector = UnityEngine.Random.insideUnitCircle * this.m_spawnBossMaxDistance;
            spawnPoint = point + new Vector3(vector.x, 0f, vector.y);             spawnPoint = point + new Vector3(vector.x, 0f, vector.y);
            if (this.m_enableSolidHeightCheck)             if (this.m_enableSolidHeightCheck)
            {             {
                float num;                 float num;
                ZoneSystem.instance.GetSolidHeight(spawnPoint, out num, this.m_getSolidHeightMargin);                 ZoneSystem.instance.GetSolidHeight(spawnPoint, out num, this.m_getSolidHeightMargin);
                if (num >= 0f && Mathf.Abs(num - base.transform.position.y) <= this.m_spawnBossMaxYDistance && Vector3.Distance(spawnPoint, point) >= this.m_spawnBossMinDistance)                 if (num >= 0f && Mathf.Abs(num - base.transform.position.y) <= this.m_spawnBossMaxYDistance && Vector3.Distance(spawnPoint, point) >= this.m_spawnBossMinDistance)
                {                 {
                    if (this.m_spawnPointClearingRadius > 0f)                     if (this.m_spawnPointClearingRadius > 0f)
                    {                     {
                        spawnPoint.y = num + this.m_spawnYOffset;                         spawnPoint.y = num + this.m_spawnYOffset;
                        int num2 = Physics.OverlapSphereNonAlloc(spawnPoint, this.m_spawnPointClearingRadius, null, this.m_solidRayMask);                         int num2 = Physics.OverlapSphereNonAlloc(spawnPoint, this.m_spawnPointClearingRadius, null, this.m_solidRayMask);
                        if (num2 > 0)                         if (num2 > 0)
                        {                         {
                            ZLog.Log(num2);                             ZLog.Log(num2);
                            goto IL_FC;                             goto IL_FC;
                        }                         }
                    }                     }
                    spawnPoint.y = num + this.m_spawnYOffset;                     spawnPoint.y = num + this.m_spawnYOffset;
                    return true;                     return true;
                }                 }
                IL_FC:                 IL_FC:
                i++;                 i++;
                continue;                 continue;
            }             }
            return true;             return true;
        }         }
        return false;         return false;
    }     }
   
    private bool IsBossSpawnQueued()     private bool IsBossSpawnQueued()
    {     {
        return base.IsInvoking("DelayedSpawnBoss");         return base.IsInvoking("DelayedSpawnBoss");
    }     }
   
    private void DelayedSpawnBoss()     private void DelayedSpawnBoss()
    {     {
.        BaseAI component = UnityEngine.Object.Instantiate<GameObject>(this.m_bossPrefab, this.m_bossSpawnPoint, Quaternion.identity).GetComponent<BaseAI>();         GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(this.m_bossPrefab, this.m_bossSpawnPoint, Quaternion.identity); 
          BaseAI component = gameObject.GetComponent<BaseAI>();
        if (component != null)         if (component != null)
        {         {
            component.SetPatrolPoint();             component.SetPatrolPoint();
.              if (this.m_alertOnSpawn)
              {
                  component.Alert();
              }
          }
          GameObject[] array = this.m_spawnBossDoneffects.Create(this.m_bossSpawnPoint, Quaternion.identity, null, 1f, -1);
          for (int i = 0; i < array.Length; i++)
          {
              IProjectile[] componentsInChildren = array[i].GetComponentsInChildren<IProjectile>();
              if (componentsInChildren.Length != 0)
              {
                  IProjectile[] array2 = componentsInChildren;
                  for (int j = 0; j < array2.Length; j++)
                  {
                      array2[j].Setup(gameObject.GetComponent<Character>(), Vector3.zero, -1f, null, null, null);
                  }
              }
        }         }
.        this.m_spawnBossDoneffects.Create(this.m_bossSpawnPoint, Quaternion.identity, null, 1f, -1);  
    }     }
   
    private List<ItemStand> FindItemStands()     private List<ItemStand> FindItemStands()
    {     {
        List<ItemStand> list = new List<ItemStand>();         List<ItemStand> list = new List<ItemStand>();
        foreach (ItemStand itemStand in UnityEngine.Object.FindObjectsOfType<ItemStand>())         foreach (ItemStand itemStand in UnityEngine.Object.FindObjectsOfType<ItemStand>())
        {         {
            if (Vector3.Distance(base.transform.position, itemStand.transform.position) <= this.m_itemstandMaxRange && itemStand.gameObject.name.CustomStartsWith(this.m_itemStandPrefix))             if (Vector3.Distance(base.transform.position, itemStand.transform.position) <= this.m_itemstandMaxRange && itemStand.gameObject.name.CustomStartsWith(this.m_itemStandPrefix))
            {             {
                list.Add(itemStand);                 list.Add(itemStand);
            }             }
        }         }
        return list;         return list;
    }     }
   
    private void OnDrawGizmosSelected()     private void OnDrawGizmosSelected()
    {     {
        if (!this.m_renderSpawnAreaGizmos)         if (!this.m_renderSpawnAreaGizmos)
        {         {
            return;             return;
        }         }
        Gizmos.color = Color.green;         Gizmos.color = Color.green;
        Utils.DrawGizmoCylinder(this.GetSpawnPosition(), this.m_spawnBossMaxDistance, this.m_spawnBossMaxYDistance, 32);         Utils.DrawGizmoCylinder(this.GetSpawnPosition(), this.m_spawnBossMaxDistance, this.m_spawnBossMaxYDistance, 32);
        Gizmos.color = Color.red;         Gizmos.color = Color.red;
        if (this.m_spawnBossMinDistance > 0f)         if (this.m_spawnBossMinDistance > 0f)
        {         {
            Utils.DrawGizmoCylinder(this.GetSpawnPosition(), this.m_spawnBossMinDistance, this.m_spawnBossMaxYDistance, 32);             Utils.DrawGizmoCylinder(this.GetSpawnPosition(), this.m_spawnBossMinDistance, this.m_spawnBossMaxYDistance, 32);
        }         }
    }     }
   
.    public string m_name = "Ancient bowl";     [Header("Tokens")] 
      public string m_name = "$piece_offerbowl"; 
   
      public string m_useItemText = "$piece_offerbowl_offeritem";
   
      public string m_usedAltarText = "$msg_offerdone"; 
   
.    public string m_useItemText = "Burn item";     public string m_cantOfferText = "$msg_cantoffer";
   
.      public string m_wrongOfferText = "$msg_offerwrong";
   
      public string m_incompleteOfferText = "$msg_incompleteoffering";
   
      [Header("Settings")]
    public ItemDrop m_bossItem;     public ItemDrop m_bossItem;
   
    public int m_bossItems = 1;     public int m_bossItems = 1;
   
    public GameObject m_bossPrefab;     public GameObject m_bossPrefab;
   
    public ItemDrop m_itemPrefab;     public ItemDrop m_itemPrefab;
   
    public Transform m_itemSpawnPoint;     public Transform m_itemSpawnPoint;
   
    public string m_setGlobalKey = "";     public string m_setGlobalKey = "";
   
    public bool m_renderSpawnAreaGizmos;     public bool m_renderSpawnAreaGizmos;
.   
      public bool m_alertOnSpawn;
   
    [Header("Boss")]     [Header("Boss")]
    public float m_spawnBossDelay = 5f;     public float m_spawnBossDelay = 5f;
   
    public float m_spawnBossMaxDistance = 40f;     public float m_spawnBossMaxDistance = 40f;
   
    public float m_spawnBossMinDistance;     public float m_spawnBossMinDistance;
   
    public float m_spawnBossMaxYDistance = 9999f;     public float m_spawnBossMaxYDistance = 9999f;
   
    public int m_getSolidHeightMargin = 1000;     public int m_getSolidHeightMargin = 1000;
   
    public bool m_enableSolidHeightCheck = true;     public bool m_enableSolidHeightCheck = true;
   
    public float m_spawnPointClearingRadius;     public float m_spawnPointClearingRadius;
   
    public float m_spawnYOffset = 1f;     public float m_spawnYOffset = 1f;
   
    public Vector3 m_spawnAreaOffset;     public Vector3 m_spawnAreaOffset;
   
    public List<GameObject> m_spawnPoints = new List<GameObject>();     public List<GameObject> m_spawnPoints = new List<GameObject>();
   
    [Header("Use itemstands")]     [Header("Use itemstands")]
    public bool m_useItemStands;     public bool m_useItemStands;
   
    public string m_itemStandPrefix = "";     public string m_itemStandPrefix = "";
   
    public float m_itemstandMaxRange = 20f;     public float m_itemstandMaxRange = 20f;
   
    [Header("Effects")]     [Header("Effects")]
    public EffectList m_fuelAddedEffects = new EffectList();     public EffectList m_fuelAddedEffects = new EffectList();
   
    public EffectList m_spawnBossStartEffects = new EffectList();     public EffectList m_spawnBossStartEffects = new EffectList();
   
    public EffectList m_spawnBossDoneffects = new EffectList();     public EffectList m_spawnBossDoneffects = new EffectList();
   
    private Vector3 m_bossSpawnPoint;     private Vector3 m_bossSpawnPoint;
   
    private int m_solidRayMask;     private int m_solidRayMask;
   
    private static readonly Collider[] s_tempColliders = new Collider[1];     private static readonly Collider[] s_tempColliders = new Collider[1];
   
    private ZNetView m_nview;     private ZNetView m_nview;
   
    private Humanoid m_interactUser;     private Humanoid m_interactUser;
   
    private ItemDrop.ItemData m_usedSpawnItem;     private ItemDrop.ItemData m_usedSpawnItem;
} }