private void scheduleInitiativeEvents(EventScheduler <WorldState> scheduler, List <Tram> trams, List <Stop> stops) { for (int i = 0; i < 5; i++) { scheduler.ScheduleEvent(new DepartStopEvent(trams[i], stops[0], scheduler), i * 60); } foreach (var stop in stops) { scheduler.ScheduleEvent(new PassengerArriveEvent(stop, scheduler), 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)); } } }