예제 #1
0
        public void OnProductionBlockUpdate(ProductionBlueprintProhibitor prohibit)
        {
            var block  = prohibit.Entity;
            var player = Manager.Core.Players.TryGetPlayerByIdentity(block.OwnerId);
            var owner  = player != null?Manager.GetOrCreatePlayer(player) : null;

            var changed = true;

            while (changed)
            {
                changed = false;
                var list = prohibit.QueueItems;
                for (var i = 0; i < list.Count; i++)
                {
                    if (Manager.Definitions.Unlocks.Contains(list[i].BlueprintId))
                    {
                        if (owner != null && owner.HasUnlocked(list[i].BlueprintId))
                        {
                            continue;
                        }
                        var asm = prohibit.Entity as IMyAssembler;
                        if (i == 0 && asm != null)
                        {
                            asm.Repeating = false;
                        }
                        prohibit.Entity.RemoveQueueItem(i, list[i].Amount);
                        changed = true;
                    }
                }
            }

            var refinery = prohibit.Entity as IMyRefinery;

            if (refinery != null)
            {
                OnRefineryUpdate(prohibit, refinery, owner);
            }
        }
예제 #2
0
        private void OnRefineryUpdate(ProductionBlueprintProhibitor prohibit, IMyRefinery refinery, PlayerState owner)
        {
            var refineryDef =
                MyDefinitionManager.Static.GetCubeBlockDefinition(refinery.BlockDefinition) as MyRefineryDefinition;

            if (refineryDef == null)
            {
                return;
            }
            var canBeLocked = false;

            foreach (var clazz in refineryDef.BlueprintClasses)
            {
                if (Manager.Definitions.Unlocks.Contains(clazz.Id))
                {
                    canBeLocked = true;
                    break;
                }
                foreach (var sub in clazz)
                {
                    if (Manager.Definitions.Unlocks.Contains(sub.Id))
                    {
                        canBeLocked = true;
                        break;
                    }
                }
                if (canBeLocked)
                {
                    break;
                }
            }
            if (!canBeLocked)
            {
                return;
            }

            var isLockedForOwner = owner == null || !owner.HasUnlockedAnything;

            foreach (var clazz in refineryDef.BlueprintClasses)
            {
                if (isLockedForOwner)
                {
                    break;
                }
                isLockedForOwner |= !owner.HasUnlocked(clazz.Id);
            }
            foreach (var clazz in refineryDef.BlueprintClasses)
            {
                if (isLockedForOwner)
                {
                    break;
                }
                foreach (var sub in clazz)
                {
                    if (isLockedForOwner)
                    {
                        break;
                    }
                    isLockedForOwner |= !owner.HasUnlocked(sub.Id);
                }
            }

            if (!isLockedForOwner)
            {
                if (_wasRefineryEnabled.Remove(refinery.EntityId))
                {
                    refinery.Enabled = true;
                }
                return;
            }


            // Move first processable slot to start of inventory.

            // Disgusting allocation.  Can we do better?  Track inventory changes?  Something similar?
            var lockEverything = false;

            if (owner != null)
            {
                var items = refinery.InputInventory.GetItems();
                int firstUnlockedSlot;
                for (firstUnlockedSlot = 0; firstUnlockedSlot < items.Count; firstUnlockedSlot++)
                {
                    MyBlueprintDefinitionBase blueprint = null;
                    var id = new MyDefinitionId(items[firstUnlockedSlot].Content.TypeId,
                                                items[firstUnlockedSlot].Content.SubtypeId);
                    foreach (var clazz in refineryDef.BlueprintClasses)
                    {
                        blueprint = BlueprintLookup(clazz, id);
                        if (blueprint != null)
                        {
                            break;
                        }
                    }
                    if (blueprint != null && owner.HasUnlocked(blueprint.Id))
                    {
                        break;
                    }
                }
                if (firstUnlockedSlot >= items.Count)
                {
                    lockEverything = true;
                }
                else if (firstUnlockedSlot > 0)
                {
                    var amount  = items[firstUnlockedSlot].Amount;
                    var content = items[firstUnlockedSlot].Content as MyObjectBuilder_PhysicalObject;
                    if (content == null)
                    {
                        lockEverything = true;
                    }
                    else
                    {
                        refinery.InputInventory.RemoveItemsAt(firstUnlockedSlot);
                        refinery.InputInventory.AddItems(amount, content, 0);
                    }
                }
            }
            else
            {
                lockEverything = true;
            }

            if (lockEverything)
            {
                if (refinery.Enabled)
                {
                    _wasRefineryEnabled.Add(refinery.EntityId);
                    refinery.Enabled = false;
                }
            }
            else if (_wasRefineryEnabled.Remove(refinery.EntityId))
            {
                refinery.Enabled = true;
            }
        }