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)); } } }
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); } }
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); }
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)); } } }
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); }