tutorial:villager_activities
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
tutorial:villager_activities [2023/09/13 20:30] – removed - external edit (Unknown date) 127.0.0.1 | tutorial:villager_activities [2023/09/13 20:30] (current) – ↷ Page moved from villager_activities to tutorial:villager_activities nebelnidas | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Activities ====== | ||
+ | This is summary of how to add stuff for villagers to do. [[https:// | ||
+ | An activity is a set of tasks. | ||
+ | First register the activity: | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public static final Activity PRAY = Activity.register(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Then create a task: | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public class FindTempleTask extends Task< | ||
+ | public FindTempleTask() { | ||
+ | super(ImmutableMap.of(ReligiousVillagersMod.MOSQUE_POINT, | ||
+ | } | ||
+ | |||
+ | protected boolean shouldRun(ServerWorld world, VillagerEntity entity) { | ||
+ | return world.getPointOfInterestStorage() | ||
+ | .getNearestPosition( | ||
+ | ReligiousVillagersMod.BELIEVER.getCompletionCondition(), | ||
+ | entity.getBlockPos(), | ||
+ | 48, | ||
+ | PointOfInterestStorage.OccupationStatus.ANY | ||
+ | ).isPresent(); | ||
+ | } | ||
+ | |||
+ | protected void run(ServerWorld world, VillagerEntity entity, long time) { | ||
+ | ReligiousVillagersMod.LOGGER.info(" | ||
+ | |||
+ | world.getPointOfInterestStorage() | ||
+ | .getPositions( | ||
+ | ReligiousVillagersMod.BELIEVER.getCompletionCondition(), | ||
+ | (blockPos) -> { | ||
+ | Path path = entity | ||
+ | .getNavigation() | ||
+ | .findPathTo(blockPos, | ||
+ | return (path != null && path.reachesTarget()); | ||
+ | }, | ||
+ | entity.getBlockPos(), | ||
+ | 48, | ||
+ | PointOfInterestStorage.OccupationStatus.ANY | ||
+ | ) | ||
+ | .findAny() | ||
+ | .ifPresent(blockPos -> { | ||
+ | GlobalPos globalPos = GlobalPos.create(world.getRegistryKey(), | ||
+ | entity.getBrain().remember(ReligiousVillagersMod.MOSQUE_POINT, | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This task just finds a ReligiousVillagersMod.MOSQUE_POINT: | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public static final MemoryModuleType< | ||
+ | " | ||
+ | GlobalPos.CODEC | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | The mosque point is a point of interest (like work benches, or a home): | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | static { | ||
+ | | ||
+ | " | ||
+ | ); | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | private static void addPointsOfInterest() { | ||
+ | VillagerEntityAccessor.setPointsOfInterest( | ||
+ | new ImmutableMap.Builder< | ||
+ | .putAll(VillagerEntity.POINTS_OF_INTEREST) | ||
+ | .put(MOSQUE_POINT, | ||
+ | .build()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | The position is saved in a memory module: | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | VillagerEntityAccessor.setMemoryModules(new ImmutableList.Builder< | ||
+ | .addAll(VillagerEntityAccessor.getMemoryModules()).add(MOSQUE_POINT).build()); | ||
+ | </ | ||
+ | |||
+ | Once you have a task, you can create a set of tasks (aka Activity): | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public static ImmutableList< | ||
+ | return ImmutableList.of( | ||
+ | Pair.of(1, | ||
+ | Pair.of(2, | ||
+ | MOSQUE_POINT, | ||
+ | )), | ||
+ | Pair.of(3, | ||
+ | Pair.of(3, | ||
+ | Pair.of(99, | ||
+ | ); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Then, you need to add the activity to their brain: | ||
+ | |||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | @Mixin(VillagerEntity.class) | ||
+ | public class VillagerEntityMixin { | ||
+ | @Inject(at = @At(" | ||
+ | private void initBrain(Brain< | ||
+ | VillagerEntity $this = (VillagerEntity) (Object) this; | ||
+ | |||
+ | if (!$this.isBaby()) { | ||
+ | brain.setTaskList( | ||
+ | ReligiousVillagersMod.PRAY, | ||
+ | createPrayTasks(0.75F) | ||
+ | ); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | And to their schedule: | ||
+ | |||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | static { | ||
+ | addScheduled(); | ||
+ | } | ||
+ | |||
+ | private static void addScheduled() { | ||
+ | ScheduleAccessor.setVillagerDefault( | ||
+ | new ScheduleBuilder(Schedule.VILLAGER_DEFAULT).withActivity(10, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | If all went well and you have all the accessors, you should be able to put down an emerald block inside a village and villagers will pray before work: | ||
+ | |||
+ | {{ : |