Example #1
0
        private void TryInitializeFurnace(FurnaceState state, EventScheduler scheduler, IWorld world,
                                          Coordinates3D coords, IItemRepository itemRepository)
        {
            if (TrackedFurnaces.ContainsKey(coords))
            {
                return;
            }

            var inputStack  = state.Items[FurnaceWindow.IngredientIndex];
            var fuelStack   = state.Items[FurnaceWindow.FuelIndex];
            var outputStack = state.Items[FurnaceWindow.OutputIndex];

            var input = itemRepository.GetItemProvider(inputStack.Id) as ISmeltableItem;
            var fuel  = itemRepository.GetItemProvider(fuelStack.Id) as IBurnableItem;

            if (state.BurnTimeRemaining > 0)
            {
                if (state.CookTime == -1 && input != null &&
                    (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput)))
                {
                    state.CookTime = 0;
                    SetState(world, coords, state);
                }

                var subject = new FurnaceEventSubject();
                TrackedFurnaces[coords] = subject;
                scheduler.ScheduleEvent("smelting", subject, TimeSpan.FromSeconds(1),
                                        server => UpdateFurnace(server.Scheduler, world, coords, itemRepository));
                return;
            }

            if (fuel != null && input != null)             // We can maybe start
            {
                if (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput))
                {
                    // We can definitely start
                    state.BurnTimeRemaining = state.BurnTimeTotal = (short)(fuel.BurnTime.TotalSeconds * 20);
                    state.CookTime          = 0;
                    state.Items[FurnaceWindow.FuelIndex].Count--;
                    SetState(world, coords, state);
                    world.SetBlockId(coords, LitFurnaceBlock.BlockId);
                    var subject = new FurnaceEventSubject();
                    TrackedFurnaces[coords] = subject;
                    scheduler.ScheduleEvent("smelting", subject, TimeSpan.FromSeconds(1),
                                            server => UpdateFurnace(server.Scheduler, world, coords, itemRepository));
                }
            }
        }
Example #2
0
        public void GenerateDropEntity(BlockDescriptor descriptor, IWorld world, IMultiPlayerServer server,
                                       ItemStack item)
        {
            var entityManager = server.GetEntityManagerForWorld(world);
            var items         = new ItemStack[0];
            var type          = ToolType.None;
            var material      = ToolMaterial.None;
            var held          = ItemRepository.GetItemProvider(item.Id);

            if (held is ToolItem)
            {
                var tool = held as ToolItem;
                material = tool.Material;
                type     = tool.ToolType;
            }

            if ((EffectiveTools & type) > 0)
            {
                if ((EffectiveToolMaterials & material) > 0)
                {
                    items = GetDrop(descriptor, item);
                }
            }

            foreach (var i in items)
            {
                if (i.Empty)
                {
                    continue;
                }
                var entity = new ItemEntity(descriptor.Coordinates.AsVector3() + new Vector3(0.5f), i);
                entityManager.SpawnEntity(entity);
            }
        }
Example #3
0
        private void UpdateFurnace(IEventScheduler scheduler, IWorld world, Coordinates3D coords, IItemRepository itemRepository)
        {
            if (TrackedFurnaces.ContainsKey(coords))
                TrackedFurnaces.Remove(coords);

            if (world.GetBlockID(coords) != FurnaceBlock.BlockID && world.GetBlockID(coords) != LitFurnaceBlock.BlockID)
            {
                /*if (window != null && !window.IsDisposed)
                    window.Dispose();*/
                return;
            }

            var state = GetState(world, coords);

            var inputStack = state.Items[FurnaceWindow.IngredientIndex];
            var outputStack = state.Items[FurnaceWindow.OutputIndex];

            var input = itemRepository.GetItemProvider(inputStack.ID) as ISmeltableItem;

            // Update burn time
            var burnTime = state.BurnTimeRemaining;
            if (state.BurnTimeRemaining > 0)
            {
                state.BurnTimeRemaining -= 20; // ticks
                if (state.BurnTimeRemaining <= 0)
                {
                    state.BurnTimeRemaining = 0;
                    state.BurnTimeTotal = 0;
                    world.SetBlockID(coords, FurnaceBlock.BlockID);
                }
            }

            // Update cook time
            if (state.CookTime < 200 && state.CookTime >= 0)
            {
                state.CookTime += 20; // ticks
                if (state.CookTime >= 200)
                    state.CookTime = 200;
            }

            // Are we done cooking?
            if (state.CookTime == 200 && burnTime > 0)
            {
                state.CookTime = -1;
                if (input != null && (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput)))
                {
                    if (outputStack.Empty)
                        outputStack = input.SmeltingOutput;
                    else if (outputStack.CanMerge(input.SmeltingOutput))
                        outputStack.Count += input.SmeltingOutput.Count;
                    state.Items[FurnaceWindow.OutputIndex] = outputStack;
                    state.Items[FurnaceWindow.IngredientIndex].Count--;
                }
            }

            SetState(world, coords, state);
            TryInitializeFurnace(state, scheduler, world, coords, itemRepository);
        }
Example #4
0
        private void TryInitializeFurnace(FurnaceState state, IEventScheduler scheduler, IWorld world,
                                          Coordinates3D coords, IItemRepository itemRepository)
        {
            if (TrackedFurnaces.ContainsKey(coords))
                return;

            var inputStack = state.Items[FurnaceWindow.IngredientIndex];
            var fuelStack = state.Items[FurnaceWindow.FuelIndex];
            var outputStack = state.Items[FurnaceWindow.OutputIndex];

            var input = itemRepository.GetItemProvider(inputStack.ID) as ISmeltableItem;
            var fuel = itemRepository.GetItemProvider(fuelStack.ID) as IBurnableItem;

            if (state.BurnTimeRemaining > 0)
            {
                if (state.CookTime == -1 && input != null && (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput)))
                {
                    state.CookTime = 0;
                    SetState(world, coords, state);
                }
                var subject = new FurnaceEventSubject();
                TrackedFurnaces[coords] = subject;
                scheduler.ScheduleEvent("smelting", subject, TimeSpan.FromSeconds(1),
                    server => UpdateFurnace(server.Scheduler, world, coords, itemRepository));
                return;
            }

            if (fuel != null && input != null) // We can maybe start
            {
                if (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput))
                {
                    // We can definitely start
                    state.BurnTimeRemaining = state.BurnTimeTotal = (short)(fuel.BurnTime.TotalSeconds * 20);
                    state.CookTime = 0;
                    state.Items[FurnaceWindow.FuelIndex].Count--;
                    SetState(world, coords, state);
                    world.SetBlockID(coords, LitFurnaceBlock.BlockID);
                    var subject = new FurnaceEventSubject();
                    TrackedFurnaces[coords] = subject;
                    scheduler.ScheduleEvent("smelting", subject, TimeSpan.FromSeconds(1),
                        server => UpdateFurnace(server.Scheduler, world, coords, itemRepository));
                }
            }
        }
Example #5
0
        private void UpdateFurnace(EventScheduler scheduler, IWorld world, Coordinates3D coords,
                                   IItemRepository itemRepository)
        {
            if (TrackedFurnaces.ContainsKey(coords))
            {
                TrackedFurnaces.Remove(coords);
            }

            if (world.GetBlockId(coords) != BlockId && world.GetBlockId(coords) != LitFurnaceBlock.BlockId)
            {
                return;
            }

            var state = GetState(world, coords);

            var inputStack  = state.Items[FurnaceWindow.IngredientIndex];
            var outputStack = state.Items[FurnaceWindow.OutputIndex];

            var input = itemRepository.GetItemProvider(inputStack.Id) as ISmeltableItem;

            // Update burn time
            var burnTime = state.BurnTimeRemaining;

            if (state.BurnTimeRemaining > 0)
            {
                state.BurnTimeRemaining -= 20;                 // ticks
                if (state.BurnTimeRemaining <= 0)
                {
                    state.BurnTimeRemaining = 0;
                    state.BurnTimeTotal     = 0;
                    world.SetBlockId(coords, BlockId);
                }
            }

            // Update cook time
            if (state.CookTime < 200 && state.CookTime >= 0)
            {
                state.CookTime += 20;                 // ticks
                if (state.CookTime >= 200)
                {
                    state.CookTime = 200;
                }
            }

            // Are we done cooking?
            if (state.CookTime == 200 && burnTime > 0)
            {
                state.CookTime = -1;
                if (input != null && (outputStack.Empty || outputStack.CanMerge(input.SmeltingOutput)))
                {
                    if (outputStack.Empty)
                    {
                        outputStack = input.SmeltingOutput;
                    }
                    else if (outputStack.CanMerge(input.SmeltingOutput))
                    {
                        outputStack.Count += input.SmeltingOutput.Count;
                    }
                    state.Items[FurnaceWindow.OutputIndex] = outputStack;
                    state.Items[FurnaceWindow.IngredientIndex].Count--;
                }
            }

            SetState(world, coords, state);
            TryInitializeFurnace(state, scheduler, world, coords, itemRepository);
        }