package joshie.harvest.api.npc.schedule; import joshie.harvest.api.HFApi; import joshie.harvest.api.buildings.BuildingLocation; import joshie.harvest.api.calendar.Festival; import joshie.harvest.api.calendar.Season; import joshie.harvest.api.calendar.Weekday; import joshie.harvest.api.npc.NPC; import joshie.harvest.api.npc.NPCEntity; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ScheduleBuilder { public List<TimedSchedule> timedScheduleList = new ArrayList<>(); public List<HolidaySchedule> holidayScheduleList = new ArrayList<>(); public Map<BuildingLocation, Conditional> rules = new HashMap<>(); public final BuildingLocation default_; private final NPC npc; private ScheduleBuilder(NPC npc, @Nullable BuildingLocation default_) { this.npc = npc; this.default_ = default_; this.npc.setHome(default_); MinecraftForge.EVENT_BUS.post(new ScheduleEvent.Pre(npc, this)); } public static ScheduleBuilder create(NPC npc, @Nullable BuildingLocation default_) { return new ScheduleBuilder(npc, default_); } public ScheduleBuilder add(Season season, Weekday weekday, long time, BuildingLocation location) { timedScheduleList.add(new TimedSchedule(season, weekday, time, location)); return this; } public ScheduleBuilder add(Festival festival, long time, BuildingLocation location) { holidayScheduleList.add(new HolidaySchedule(festival, time, location)); return this; } public ScheduleBuilder add(BuildingLocation location, Conditional conditional) { rules.put(location, conditional); return this; } public void build() { MinecraftForge.EVENT_BUS.post(new ScheduleEvent.Post(npc, this)); npc.setScheduleHandler(HFApi.npc.buildSchedule(this)); } //For the normal everyday schedule public static class TimedSchedule { public Season season; public Weekday weekday; public long time; public BuildingLocation location; TimedSchedule(Season season, Weekday weekday, long time, BuildingLocation location) { this.season = season; this.weekday = weekday; this.time = time; this.location = location; } } //For special schedules on specific holidays public static class HolidaySchedule { public Festival festival; public long time; public BuildingLocation location; HolidaySchedule(Festival festival, long time, BuildingLocation location) { this.festival = festival; this.time = time; this.location = location; } } //For conditional schedules public static abstract class Conditional { public abstract boolean canDo(@Nonnull World world, @Nonnull NPCEntity npc); } }