package joshie.harvest.core.handlers; import joshie.harvest.api.ticking.DailyTickableBlock; import joshie.harvest.api.ticking.DailyTickableBlock.Phases; import joshie.harvest.core.util.HFTracker; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class DailyTickHandler extends HFTracker { private final Map<BlockPos, DailyTickableBlock> queue = new HashMap<>(); private final Map<Phases, Map<BlockPos, DailyTickableBlock>> blockTickables = new HashMap<>(); public DailyTickHandler() { for (Phases phase: Phases.values()) blockTickables.put(phase, new HashMap<>()); } //Add to the queue public void add(final BlockPos pos, final DailyTickableBlock daily) { queue.put(pos, daily); } void processQueue() { for (Entry<BlockPos, DailyTickableBlock> entry: queue.entrySet()) { DailyTickableBlock daily = entry.getValue(); for (Phases phase : daily.getPhases()) { blockTickables.get(phase).put(entry.getKey(), daily); } } queue.clear(); //Clear the old queue } void processPhase(Phases phase) { processTickableBlocks(blockTickables.get(phase)); } @SuppressWarnings("unchecked") private void processTickableBlocks(Map<BlockPos, DailyTickableBlock> tickables) { World world = getWorld(); Iterator<Entry<BlockPos, DailyTickableBlock>> entries = tickables.entrySet().iterator(); while(entries.hasNext()) { Entry<BlockPos, DailyTickableBlock> entry = entries.next(); BlockPos pos = entry.getKey(); if (world.isBlockLoaded(pos)) { IBlockState state = world.getBlockState(pos); DailyTickableBlock tickable = entry.getValue(); if (tickable.isStateCorrect(world, pos, state)) { tickable.newDay(world, pos, state); } else entries.remove(); } } } }