예제 #1
0
 public void CancelPlacement(bool notify = true)
 {
     enabled = false;
     skullItem.DestroyItem();
     skullItem.Kill();
     if (notify)
     {
         player.ChatMessage(msg("Help.Placement.3", player.userID));
     }
     Destroy(this);
 }
예제 #2
0
    public void OnDroppedOn(DroppedItem di)
    {
        if (item == null || di.item == null || Interface.CallHook("CanCombineDroppedItem", this, di) != null || item.info.stackable <= 1 || di.item.info != item.info || (di.item.IsBlueprint() && di.item.blueprintTarget != item.blueprintTarget) || (di.item.hasCondition && di.item.condition != di.item.maxCondition) || (item.hasCondition && item.condition != item.maxCondition))
        {
            return;
        }
        if (di.item.info != null && di.item.info.amountType == ItemDefinition.AmountType.Genetics)
        {
            int num  = ((di.item.instanceData != null) ? di.item.instanceData.dataInt : (-1));
            int num2 = ((item.instanceData != null) ? item.instanceData.dataInt : (-1));
            if (num != num2)
            {
                return;
            }
        }
        int num3 = di.item.amount + item.amount;

        if (num3 <= item.info.stackable && num3 != 0)
        {
            di.DestroyItem();
            di.Kill();
            item.amount = num3;
            item.MarkDirty();
            if (GetDespawnDuration() < float.PositiveInfinity)
            {
                Invoke(IdleDestroy, GetDespawnDuration());
            }
            Effect.server.Run("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", this, 0u, Vector3.zero, Vector3.zero);
        }
    }
예제 #3
0
        public Task <bool> DestroyAsync()
        {
            if (DroppedItem.IsDestroyed)
            {
                return(Task.FromResult(false));
            }

            DroppedItem.Kill();
            return(Task.FromResult(true));
        }
예제 #4
0
    public virtual void EatNearbyFood()
    {
        if (UnityEngine.Time.time < nextEatTime)
        {
            return;
        }
        float num = StaminaCoreFraction();

        nextEatTime = UnityEngine.Time.time + UnityEngine.Random.Range(2f, 3f) + Mathf.InverseLerp(0.5f, 1f, num) * 4f;
        if (num >= 1f)
        {
            return;
        }
        List <BaseEntity> obj = Facepunch.Pool.GetList <BaseEntity>();

        Vis.Entities(base.transform.position + base.transform.forward * 1.5f, 2f, obj, 67109377);
        obj.Sort((BaseEntity a, BaseEntity b) => (b is DroppedItem).CompareTo(a is DroppedItem));
        foreach (BaseEntity item in obj)
        {
            if (item.isClient)
            {
                continue;
            }
            DroppedItem droppedItem = item as DroppedItem;
            if ((bool)droppedItem && droppedItem.item != null && droppedItem.item.info.category == ItemCategory.Food)
            {
                ItemModConsumable component = droppedItem.item.info.GetComponent <ItemModConsumable>();
                if ((bool)component)
                {
                    ReplenishFromFood(component);
                    droppedItem.item.UseItem();
                    if (droppedItem.item.amount <= 0)
                    {
                        droppedItem.Kill();
                    }
                    break;
                }
            }
            CollectibleEntity collectibleEntity = item as CollectibleEntity;
            if ((bool)collectibleEntity && collectibleEntity.IsFood())
            {
                collectibleEntity.DoPickup(null);
                break;
            }
            GrowableEntity growableEntity = item as GrowableEntity;
            if ((bool)growableEntity && growableEntity.CanPick())
            {
                growableEntity.PickFruit(null);
                break;
            }
        }
        Facepunch.Pool.FreeList(ref obj);
    }
예제 #5
0
    public void OnDroppedOn(DroppedItem di)
    {
        if (this.item == null)
        {
            return;
        }
        if (di.item == null)
        {
            return;
        }
        if (Interface.CallHook("CanCombineDroppedItem", this, di) != null)
        {
            return;
        }
        if (this.item.info.stackable <= 1)
        {
            return;
        }
        if (di.item.info != this.item.info)
        {
            return;
        }
        if (di.item.IsBlueprint() && di.item.blueprintTarget != this.item.blueprintTarget)
        {
            return;
        }
        int num = di.item.amount + this.item.amount;

        if (num > this.item.info.stackable)
        {
            return;
        }
        if (num == 0)
        {
            return;
        }
        di.DestroyItem();
        di.Kill(BaseNetworkable.DestroyMode.None);
        this.item.amount = num;
        this.item.MarkDirty();
        if (this.GetDespawnDuration() < Single.PositiveInfinity)
        {
            base.Invoke(new Action(this.IdleDestroy), this.GetDespawnDuration());
        }
        Effect.server.Run("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", this, 0, Vector3.zero, Vector3.zero, null, false);
    }
예제 #6
0
    public void OnDroppedOn(DroppedItem di)
    {
        if (this.item == null || di.item == null || (Interface.CallHook("CanCombineDroppedItem", (object)this, (object)di) != null || this.item.info.stackable <= 1) || (Object.op_Inequality((Object)di.item.info, (Object)this.item.info) || di.item.IsBlueprint() && di.item.blueprintTarget != this.item.blueprintTarget))
        {
            return;
        }
        int num = di.item.amount + this.item.amount;

        if (num > this.item.info.stackable || num == 0)
        {
            return;
        }
        di.DestroyItem();
        di.Kill(BaseNetworkable.DestroyMode.None);
        this.item.amount = num;
        this.item.MarkDirty();
        if ((double)this.GetDespawnDuration() < double.PositiveInfinity)
        {
            this.Invoke(new Action(this.IdleDestroy), this.GetDespawnDuration());
        }
        Effect.server.Run("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", (BaseEntity)this, 0U, Vector3.get_zero(), Vector3.get_zero(), (Connection)null, false);
    }
예제 #7
0
        object CanCombineDroppedItem(DroppedItem groundItem, DroppedItem droppedItem) //Combines multiple dropped items of same type, to increase performance
        {
            if (!CombineItems(groundItem.item, droppedItem.item))
            {
                return(null);
            }

            /*
             * if (num > groundItem.item.info.stackable)
             * {
             *  return false;
             * }
             * if (num == 0)
             * {
             *  return false;
             * }*/
            itemGrid.SetDespawnTime(groundItem); //Update respawn time TODO: change it later so it doesnt reset each time item is added / removed
            droppedItem.Kill(BaseNetworkable.DestroyMode.None);
            //groundItem.Invoke(new Action(() => { groundItem.DestroyItem(); groundItem.Kill(); }), groundItem.GetDespawnDuration());
            Effect.server.Run("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", groundItem, 0u, Vector3.zero, Vector3.zero, null, false);
            return(true);
        }
예제 #8
0
        private void Unload()
        {
            if (!ServerMgr.Instance.Restarting)
            {
                SaveData();
            }

            ItemPlacement[] placementComps = UnityEngine.Object.FindObjectsOfType <ItemPlacement>();
            if (placementComps != null)
            {
                foreach (ItemPlacement placement in placementComps)
                {
                    placement.CancelPlacement();
                }
            }

            for (int i = signRegisteredSkulls.Count - 1; i >= 0; i--)
            {
                DroppedItem skullItem = signRegisteredSkulls.ElementAt(i).Value;
                skullItem?.DestroyItem();
                if (skullItem != null && !skullItem.IsDestroyed)
                {
                    skullItem.Kill();
                }
            }

            for (int i = 0; i < spearRegisteredSkulls.Count; i++)
            {
                KeyValuePair <DroppedItem, List <DroppedItem> > kvp = spearRegisteredSkulls.ElementAt(i);

                DroppedItem        spear  = kvp.Key;
                List <DroppedItem> skulls = kvp.Value;

                if (spear == null)
                {
                    continue;
                }

                for (int y = 0; y < skulls.Count; y++)
                {
                    DroppedItem skullItem = skulls[y];
                    if (skullItem != null)
                    {
                        skullItem.DestroyItem();
                        if (skullItem != null && !skullItem.IsDestroyed)
                        {
                            skullItem.Kill();
                        }
                    }
                }

                Pool.FreeList(ref skulls);

                spear.DestroyItem();

                if (!spear.IsDestroyed)
                {
                    spear.Kill();
                }
            }

            configData = null;
            Instance   = null;
        }
    public void EatNearbyFood()
    {
        if (Time.time < this.nextEatTime)
        {
            return;
        }
        float single = this.StaminaCoreFraction();

        this.nextEatTime = Time.time + UnityEngine.Random.Range(2f, 3f) + Mathf.InverseLerp(0.5f, 1f, single) * 4f;
        if (single >= 1f)
        {
            return;
        }
        List <BaseEntity> list = Pool.GetList <BaseEntity>();

        Vis.Entities <BaseEntity>(base.transform.position + (base.transform.forward * 1.5f), 2f, list, 67109377, QueryTriggerInteraction.Collide);
        list.Sort((BaseEntity a, BaseEntity b) => b is DroppedItem.CompareTo(a is DroppedItem));
        foreach (BaseEntity baseEntity in list)
        {
            if (baseEntity.isClient)
            {
                continue;
            }
            DroppedItem droppedItem = baseEntity as DroppedItem;
            if (droppedItem && droppedItem.item != null && droppedItem.item.info.category == ItemCategory.Food)
            {
                ItemModConsumable component = droppedItem.item.info.GetComponent <ItemModConsumable>();
                if (component)
                {
                    base.ClientRPC(null, "Eat");
                    this.lastEatTime = Time.time;
                    float ifType  = component.GetIfType(MetabolismAttribute.Type.Calories);
                    float ifType1 = component.GetIfType(MetabolismAttribute.Type.Hydration);
                    float single1 = component.GetIfType(MetabolismAttribute.Type.Health) + component.GetIfType(MetabolismAttribute.Type.HealthOverTime);
                    this.ReplenishStaminaCore(ifType, ifType1);
                    this.Heal(single1 * 2f);
                    droppedItem.item.UseItem(1);
                    if (droppedItem.item.amount > 0)
                    {
                        break;
                    }
                    droppedItem.Kill(BaseNetworkable.DestroyMode.None);
                    Pool.FreeList <BaseEntity>(ref list);
                    return;
                }
            }
            CollectibleEntity collectibleEntity = baseEntity as CollectibleEntity;
            if (!collectibleEntity || !collectibleEntity.IsFood())
            {
                PlantEntity plantEntity = baseEntity as PlantEntity;
                if (!plantEntity || !plantEntity.CanPick())
                {
                    continue;
                }
                plantEntity.PickFruit(null);
                Pool.FreeList <BaseEntity>(ref list);
                return;
            }
            else
            {
                collectibleEntity.DoPickup(null);
                Pool.FreeList <BaseEntity>(ref list);
                return;
            }
        }
        Pool.FreeList <BaseEntity>(ref list);
    }