Пример #1
0
 public override bool ItemsCanBeRemoved(MyFixedPoint amount, IMyInventoryItem item)
 {
     if (amount == 0) return true;
     if (item == null) return false;
     var physItemObject = GetItemByID(item.ItemId);
     if (physItemObject.HasValue)
     {
         MyPhysicalInventoryItem physicalItem = physItemObject.Value;
         if (physicalItem.Amount >= amount)
         {
             return true;
         }
     }
     return false;
 }
Пример #2
0
        public void Clear(bool sync = true)
        {
            if (sync == false)
            {
                m_items.Clear();
                return;
            }

            MyPhysicalInventoryItem[] items = new MyPhysicalInventoryItem[m_items.Count];
            m_items.CopyTo(items);
            foreach (var it in items)
            {
                RemoveItems(it.ItemId);
            }
        }
Пример #3
0
        public bool RemoveItemsInternal(uint itemId, MyFixedPoint amount, bool sendEvent = true)
        {
            bool found = false;

            for (int i = 0; i < m_items.Count; i++)
            {
                if (m_items[i].ItemId == itemId)
                {
                    MyPhysicalInventoryItem item = m_items[i];
                    amount       = MathHelper.Clamp(amount, 0, m_items[i].Amount);
                    item.Amount -= amount;
                    if (item.Amount == 0 || amount == 0)
                    {
                        m_items.RemoveAt(i);
                    }
                    else
                    {
                        m_items[i] = item;
                    }

                    found = true;
                    break;
                }
            }
            if (!found)
            {
                Debug.Assert(!found, "Item is missing in inventory. Can't remove.");
                return(false);
            }

            RefreshVolumeAndMass();

            if (sendEvent)
            {
                OnContentsChanged();
            }
            return(true);
        }
        public static MyGuiControlGrid.Item CreateInventoryGridItem(MyPhysicalInventoryItem item)
        {
            var definition = MyDefinitionManager.Static.GetPhysicalItemDefinition(item.Content);

            var itemMass = definition.Mass * (double)item.Amount;
            var itemVolume = definition.Volume * 1000 * (double)item.Amount;

            var gridItem = new MyGuiControlGrid.Item(
                icon: definition.Icon,
                userData: item,
                toolTip: new StringBuilder().AppendFormat(MyTexts.GetString(MySpaceTexts.ToolTipTerminalInventory_ItemInfo),
                    definition.DisplayNameText,
                    (itemMass < 0.01) ? "<0.01" : itemMass.ToString(MyInventoryConstants.GUI_DISPLAY_FORMAT, CultureInfo.InvariantCulture),
                    (itemVolume < 0.01) ? "<0.01" : itemVolume.ToString(MyInventoryConstants.GUI_DISPLAY_FORMAT, CultureInfo.InvariantCulture),
                    (item.Content.Flags == MyItemFlags.Damaged ? MyTexts.Get(MySpaceTexts.ItemDamagedDescription) : MyTexts.Get(MySpaceTexts.Blank))).ToString());
            if (MyFakes.SHOW_INVENTORY_ITEM_IDS)
            {
                gridItem.ToolTip.AddToolTip(new StringBuilder().AppendFormat("ItemID: {0}", item.ItemId).ToString());
            }
            FormatItemAmount(item, m_textCache);
            gridItem.AddText(m_textCache, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_BOTTOM);
            m_textCache.Clear();

            if (definition.IconSymbol.HasValue)
                gridItem.AddText(MyTexts.Get(definition.IconSymbol.Value), MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP);
            return gridItem;
        }
        public static void FormatItemAmount(MyPhysicalInventoryItem item, StringBuilder text)
        {
            try
            {
                var typeId = item.Content.GetType();
                if (typeId == typeof(MyObjectBuilder_Ore) ||
                    typeId == typeof(MyObjectBuilder_Ingot))
                {
                    double amount = (double)item.Amount;

                    if (amount < 0.01)
                        text.Append(amount.ToString("<0.01", CultureInfo.InvariantCulture));
                    else if (item.Amount < 10)
                        text.Append(amount.ToString("0.##", CultureInfo.InvariantCulture));
                    else if (item.Amount < 100)
                        text.Append(amount.ToString("0.#", CultureInfo.InvariantCulture));
                    else if (item.Amount < 1000)
                        text.Append(amount.ToString("0.", CultureInfo.InvariantCulture));
                    else if (item.Amount < 10000)
                        text.Append((amount / 1000.0).ToString("0.##k", CultureInfo.InvariantCulture));
                    else if (item.Amount < 100000)
                        text.Append((amount / 1000.0).ToString("0.#k", CultureInfo.InvariantCulture));
                    else
                        text.Append((amount / 1000.0).ToString("#,##0.k", CultureInfo.InvariantCulture));
                }
                else if (typeId == typeof(MyObjectBuilder_PhysicalGunObject))
                {
                    Debug.Assert(item.Amount == 1, "There should only be one gun in a single slot. This is safe to ignore.");
                }
                else if (typeId == typeof(MyObjectBuilder_OxygenContainerObject))
                {
                    Debug.Assert(item.Amount == 1, "There should only be one oxygen bottle in a single slot. This is safe to ignore.");

                    var oxygenContainer = item.Content as MyObjectBuilder_OxygenContainerObject;
                    text.Append((oxygenContainer.OxygenLevel * 100f).ToString("F0") + "%");
                }
                else
                {
                    int integerPart = (int)item.Amount;
                    var decimalPart = item.Amount - integerPart;
                    if (decimalPart > 0)
                        text.Append('~'); // used for half empty magazines and such
                    text.Append(integerPart.ToString("#,##0.x", CultureInfo.InvariantCulture));
                }
            }
            catch (System.OverflowException)
            {
                text.Append("ERROR");
            }
        }
Пример #6
0
        private void CutTree(int itemInstanceId, Vector3D hitWorldPosition, Vector3 hitNormal, float forceMultiplier = 1.0f)
        {
            HkStaticCompoundShape shape = (HkStaticCompoundShape)Physics.RigidBody.GetShape();
            int physicsInstanceId;

            if (m_localIdToPhysicsShapeInstanceId.TryGetValue(itemInstanceId, out physicsInstanceId))
            {
                //Remove static tree
                MyEnvironmentItemData itemData = m_itemsData[itemInstanceId];

                RemoveItem(itemInstanceId, physicsInstanceId, sync: true);

                //Create fractured tree
                MyDefinitionId id = new MyDefinitionId(Definition.ItemDefinitionType, itemData.SubtypeId);
                var itemDefinition = MyDefinitionManager.Static.GetEnvironmentItemDefinition(id);
                if (MyModels.GetModelOnlyData(itemDefinition.Model).HavokBreakableShapes != null)
                {
                     CreateBreakableShape(itemDefinition, ref itemData, ref hitWorldPosition, hitNormal, forceMultiplier);
                }
                else
                {
                    // This is for SE when you hit a tree, it will create a floating object with the same model. In case it affects ME, it may be changed. Contact DusanA for it.
                    Debug.Assert(MyPerGameSettings.Game == GameEnum.SE_GAME);
                    MyPhysicalInventoryItem Item = new MyPhysicalInventoryItem() { Amount = 1, Content = new MyObjectBuilder_TreeObject() { SubtypeName = itemData.SubtypeId.ToString() } };
                    Vector3D pos = itemData.Transform.Position;
                    Vector3D gravity = -MyGravityProviderSystem.CalculateGravityInPointForGrid(pos);
                    gravity.Normalize();

                    MyFloatingObjects.Spawn(Item, pos + gravity, MyUtils.GetRandomPerpendicularVector(ref gravity), gravity);
                }
            }
            
        }
Пример #7
0
        private static void TransferOrRemove(MyInventory src, MyFixedPoint?amount, MyDefinitionId contentId, MyItemFlags flags = MyItemFlags.None, MyInventory dst = null, bool spawn = false)
        {
            //Debug.Assert(!amount.HasValue || amount.Value > 0, "Transfering 0 amount of item.");
            if (src.ContainItems(amount, contentId, flags))
            {
                bool         transferAll     = !amount.HasValue;
                MyFixedPoint remainingAmount = transferAll ? 0 : amount.Value;

                //TODO(AF) Remove oxygen specific code from inventory.
                //Will be fixed once MyInventory will support Entities.
                // If the requested item is an oxygen container, do a preliminary loop to pull any non-full items first.
                if (contentId.TypeId == typeof(MyObjectBuilder_OxygenContainerObject))
                {
                    int k = 0;
                    while (k < src.m_items.Count)
                    {
                        if (!transferAll && remainingAmount == 0)
                        {
                            break;
                        }

                        MyPhysicalInventoryItem item = src.m_items[k];

                        // Skip full oxygen bottles in this loop.  They will not be skipped in the next one.
                        var oxygenBottle = item.Content as MyObjectBuilder_OxygenContainerObject;
                        if (oxygenBottle != null && oxygenBottle.OxygenLevel == 1f)
                        {
                            k++;
                            continue;
                        }

                        if (item.Content.GetObjectId() != contentId)
                        {
                            k++;
                            continue;
                        }

                        if (transferAll || remainingAmount >= item.Amount)
                        {
                            remainingAmount -= item.Amount;
                            Transfer(src, dst, item.ItemId, -1, spawn: spawn);
                        }
                        else
                        {
                            Transfer(src, dst, item.ItemId, -1, remainingAmount, spawn);
                            remainingAmount = 0;
                        }
                    }
                }
                // End of oxygen specific code

                int i = 0;
                while (i < src.m_items.Count)
                {
                    if (!transferAll && remainingAmount == 0)
                    {
                        break;
                    }

                    MyPhysicalInventoryItem item = src.m_items[i];

                    if (item.Content.GetObjectId() != contentId)
                    {
                        i++;
                        continue;
                    }

                    if (transferAll || remainingAmount >= item.Amount)
                    {
                        remainingAmount -= item.Amount;
                        Transfer(src, dst, item.ItemId, -1, spawn: spawn);
                    }
                    else
                    {
                        Transfer(src, dst, item.ItemId, -1, remainingAmount, spawn);
                        remainingAmount = 0;
                    }
                }
            }
        }
Пример #8
0
        public void AddItemsInternal(MyFixedPoint amount, MyObjectBuilder_PhysicalObject objectBuilder, int index = -1, uint?itemId = null)
        {
            Debug.Assert(amount > 0, "Adding 0 amount of item.");

            var newItem = new MyPhysicalInventoryItem()
            {
                Amount = amount, Content = objectBuilder
            };

            if (index >= 0 && index < m_items.Count)
            {
                if (m_items[index].Content.CanStack(objectBuilder))
                {
                    newItem.Amount += m_items[index].Amount;
                    newItem.ItemId  = m_items[index].ItemId;
                    m_items[index]  = newItem;
                }
                else
                {
                    newItem.ItemId = NextItemID;
                    m_items.Insert(index, newItem);
                }
            }
            else
            {
                bool add = true;
                bool canStackWithItself = newItem.Content.CanStack(newItem.Content);
                if (index < 0 && canStackWithItself)
                {
                    int?itemPos = FindFirstStackablePosition(objectBuilder);
                    if (itemPos.HasValue)
                    {
                        newItem.ItemId         = m_items[itemPos.Value].ItemId;
                        newItem.Amount        += m_items[itemPos.Value].Amount;
                        m_items[itemPos.Value] = newItem;
                        add = false;
                    }
                }
                if (add)
                {
                    if (canStackWithItself)
                    {
                        newItem.ItemId = itemId.HasValue ? itemId.Value : NextItemID;
                        m_items.Add(newItem);
                    }
                    else
                    {
                        var targetAmount = newItem.Amount;
                        newItem.Amount = 1;
                        for (MyFixedPoint addedAmount = 0; addedAmount < targetAmount; addedAmount += 1)
                        {
                            newItem.ItemId = itemId.HasValue ? itemId.Value : NextItemID;
                            itemId         = null; // so we use NextItemID next time
                            m_items.Add(newItem);
                            newItem.Content = newItem.Content.Clone() as MyObjectBuilder_PhysicalObject;
                            Debug.Assert(newItem.Content != null);
                        }
                    }
                }
            }

            RefreshVolumeAndMass();

            VerifyIntegrity();

            OnContentsChanged();
        }
Пример #9
0
        private static void FixTransferAmount(MyInventory src, MyInventory dst, MyPhysicalInventoryItem? srcItem, bool spawn, ref MyFixedPoint remove, ref MyFixedPoint add)
        {
            Debug.Assert(Sync.IsServer);
            if (srcItem.Value.Amount < remove)
            {
                remove = srcItem.Value.Amount;
                add = remove;
            }

            if (!MySession.Static.CreativeMode && !src.Equals(dst))
            {
                MyFixedPoint space = dst.ComputeAmountThatFits(srcItem.Value.Content.GetId());
                if (space < remove)
                {
                    if (spawn)
                    {
                        MyEntity e = (dst.Owner as MyEntity);
                        Matrix m = e.WorldMatrix;
                        MyFloatingObjects.Spawn(new MyPhysicalInventoryItem(remove - space, srcItem.Value.Content), e.PositionComp.GetPosition() + m.Forward + m.Up, m.Forward, m.Up, e.Physics);
                    }
                    else
                    {
                        remove = space;
                    }
                    add = space;
                }
            }
        }
Пример #10
0
        public void Clear(bool sync = true)
        {
            if (sync == false)
            {
                m_items.Clear();
                return;
            }

            MyPhysicalInventoryItem[] items = new MyPhysicalInventoryItem[m_items.Count];
            m_items.CopyTo(items);
            foreach (var it in items)
            {
                RemoveItems(it.ItemId);
            }
        }
Пример #11
0
        public void AddItemsInternal(MyFixedPoint amount, MyObjectBuilder_PhysicalObject objectBuilder, int index = -1, uint? itemId = null, bool stack = true)
        {
            Debug.Assert(amount > 0, "Adding 0 amount of item.");

            var newItem = new MyPhysicalInventoryItem() { Amount = amount, Content = objectBuilder };

            MyFixedPoint maxStack = MyFixedPoint.MaxValue;
            MyComponentDefinition compDef = null;
            if (MyDefinitionManager.Static.TryGetComponentDefinition(objectBuilder.GetId(), out compDef))
                maxStack = compDef.MaxStackAmount;

            if (index >= 0 && index < m_items.Count)
            {
                if (m_items[index].Content.CanStack(objectBuilder))
                {
                    var newStackVal = m_items[index].Amount + newItem.Amount - maxStack;
                    if (newStackVal > 0)
                    {
                        newItem.Amount = maxStack;
                        newItem.ItemId = m_items[index].ItemId;
                        m_items[index] = newItem;

                        newItem.Amount = newStackVal;
                        newItem.ItemId = GetNextItemID();
                        newItem.Content = objectBuilder.Clone() as MyObjectBuilder_PhysicalObject;
                        m_items.Add(newItem);
                    }
                    else
                    {
                        newItem.Amount += m_items[index].Amount;
                        newItem.ItemId = m_items[index].ItemId;
                        m_items[index] = newItem;
                    }
                }
                else
                {
                    newItem.ItemId = GetNextItemID();
                    m_items.Insert(index, newItem);
                }
            }
            else
            {
                bool add = true;
                bool canStackWithItself = newItem.Content.CanStack(newItem.Content);
                if (index < 0 && canStackWithItself && stack)
                {
                    int? itemPos = FindFirstStackablePosition(objectBuilder, maxStack - amount);
                    if (itemPos.HasValue)
                    {
                        newItem.ItemId = m_items[itemPos.Value].ItemId;
                        newItem.Amount += m_items[itemPos.Value].Amount;
                        m_items[itemPos.Value] = newItem;
                        add = false;
                    }
                }
                if (add)
                {
                    MyFixedPoint stackSize = canStackWithItself ? MyFixedPoint.Min(maxStack, amount) : 1;
                    var targetAmount = newItem.Amount;
                    MyFixedPoint addAmount = stackSize;
                    while (targetAmount > 0)
                    {
                        targetAmount -= stackSize;
                        if (targetAmount < 0)
                            addAmount = targetAmount + stackSize;
                        newItem.Amount = addAmount;
                        newItem.ItemId = itemId.HasValue ? itemId.Value : GetNextItemID();
                        itemId = null; // so we use NextItemID next time
                        m_items.Add(newItem);
                        newItem.Content = newItem.Content.Clone() as MyObjectBuilder_PhysicalObject;
                        Debug.Assert(newItem.Content != null);
                    }
                }
            }

            RefreshVolumeAndMass();

            VerifyIntegrity();

            OnContentsChanged();
        }
Пример #12
0
        public void AddItemsInternal(MyFixedPoint amount, MyObjectBuilder_PhysicalObject objectBuilder, int index = -1, uint? itemId = null)
        {
            Debug.Assert(amount > 0, "Adding 0 amount of item.");

            var newItem = new MyPhysicalInventoryItem() { Amount = amount, Content = objectBuilder };

            if (index >= 0 && index < m_items.Count)
            {
                if (m_items[index].Content.CanStack(objectBuilder))
                {
                    newItem.Amount += m_items[index].Amount;
                    newItem.ItemId = m_items[index].ItemId;
                    m_items[index] = newItem;
                }
                else
                {
                    newItem.ItemId = NextItemID;
                    m_items.Insert(index, newItem);
                }
            }
            else
            {
                bool add = true;
                bool canStackWithItself = newItem.Content.CanStack(newItem.Content);
                if (index < 0 && canStackWithItself)
                {
                    int? itemPos = FindFirstStackablePosition(objectBuilder);
                    if (itemPos.HasValue)
                    {
                        newItem.ItemId = m_items[itemPos.Value].ItemId;
                        newItem.Amount += m_items[itemPos.Value].Amount;
                        m_items[itemPos.Value] = newItem;
                        add = false;
                    }
                }
                if (add)
                {
                    if (canStackWithItself)
                    {
                        newItem.ItemId = itemId.HasValue ? itemId.Value : NextItemID;
                        m_items.Add(newItem);
                    }
                    else
                    {
                        var targetAmount = newItem.Amount;
                        newItem.Amount = 1;
                        for (MyFixedPoint addedAmount = 0; addedAmount < targetAmount; addedAmount += 1)
                        {
                            newItem.ItemId = itemId.HasValue ? itemId.Value : NextItemID;
                            itemId = null; // so we use NextItemID next time
                            m_items.Add(newItem);
                            newItem.Content = newItem.Content.Clone() as MyObjectBuilder_PhysicalObject;
                            Debug.Assert(newItem.Content != null);
                        }
                    }
                }
            }

            RefreshVolumeAndMass();

            VerifyIntegrity();

            OnContentsChanged();
        }