Skip to content

Commit

Permalink
Implemented the Climatologist villager profession
Browse files Browse the repository at this point in the history
  • Loading branch information
Adubbz committed Feb 3, 2024
1 parent 0c521b9 commit 86fec8d
Show file tree
Hide file tree
Showing 12 changed files with 163 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// 1.20.4 2024-02-03T11:25:56.2030139 Tags for minecraft:point_of_interest_type mod id toughasnails
7ccb22b62459a1c793d38a6fafc772b5d19837e0 data/minecraft/tags/point_of_interest_type/acquirable_job_site.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"values": [
"toughasnails:climatologist"
]
}
21 changes: 21 additions & 0 deletions common/src/main/java/toughasnails/api/village/TANPoiTypes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.village;

import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import toughasnails.api.TANAPI;

public class TANPoiTypes
{
public static final ResourceKey<PoiType> CLIMATOLOGIST = createKey("climatologist");

private static ResourceKey<PoiType> createKey(String name)
{
return ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, new ResourceLocation(TANAPI.MOD_ID, name));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.village;

import net.minecraft.world.entity.npc.VillagerProfession;

public class TANVillagerProfessions
{
public static VillagerProfession CLIMATOLOGIST;
}
2 changes: 2 additions & 0 deletions common/src/main/java/toughasnails/core/ToughAsNails.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ private static void addRegistrars()
regHelper.addRegistrar(Registries.POTION, ModPotions::registerPotions);
regHelper.addRegistrar(Registries.CREATIVE_MODE_TAB, ModCreativeTab::registerCreativeTabs);
regHelper.addRegistrar(Registries.PARTICLE_TYPE, ModParticles::registerParticles);
regHelper.addRegistrar(Registries.POINT_OF_INTEREST_TYPE, ModVillages::registerPointsOfInterest);
regHelper.addRegistrar(Registries.VILLAGER_PROFESSION, ModVillages::registerProfessions);
}

private static void addHandlers()
Expand Down
85 changes: 82 additions & 3 deletions common/src/main/java/toughasnails/init/ModVillages.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,55 @@
******************************************************************************/
package toughasnails.init;

import com.google.common.collect.ImmutableSet;
import com.mojang.datafixers.util.Pair;
import glitchcore.event.village.WandererTradesEvent;
import net.minecraft.Util;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import net.minecraft.world.entity.ai.village.poi.PoiTypes;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerTrades;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.NoteBlockInstrument;
import net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
import net.minecraft.world.level.material.MapColor;
import toughasnails.api.TANAPI;
import toughasnails.api.block.TANBlocks;
import toughasnails.api.item.TANItems;
import toughasnails.api.village.TANPoiTypes;
import toughasnails.api.village.TANVillagerProfessions;
import toughasnails.block.RainCollectorBlock;
import toughasnails.block.TemperatureGaugeBlock;
import toughasnails.block.ThermoregulatorBlock;
import toughasnails.block.WaterPurifierBlock;
import toughasnails.core.ToughAsNails;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nullable;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Predicate;

public class ModVillages
{
Expand Down Expand Up @@ -66,6 +90,16 @@ public static void addBuildings(RegistryAccess registryAccess)
addBuildingToPool(templatePools, processorLists, new ResourceLocation("minecraft:village/taiga/houses"), ToughAsNails.MOD_ID + ":village/taiga/houses/taiga_climatologist_1", 2);
}

public static void registerPointsOfInterest(BiConsumer<ResourceLocation, PoiType> func)
{
register(func, TANPoiTypes.CLIMATOLOGIST, getBlockStates(TANBlocks.THERMOREGULATOR), 1, 1);
}

public static void registerProfessions(BiConsumer<ResourceLocation, VillagerProfession> func)
{
TANVillagerProfessions.CLIMATOLOGIST = register(func, "climatologist", TANPoiTypes.CLIMATOLOGIST, SoundEvents.VILLAGER_WORK_ARMORER);
}

static class ItemsForEmeralds implements VillagerTrades.ItemListing {
private final ItemStack itemStack;
private final int emeraldCost;
Expand Down Expand Up @@ -114,4 +148,49 @@ public static void addBuildingToPool(Registry<StructureTemplatePool> templatePoo
listOfPieceEntries.add(new Pair<>(piece, weight));
pool.rawTemplates = listOfPieceEntries;
}

private static PoiType register(BiConsumer<ResourceLocation, PoiType> func, ResourceKey<PoiType> key, Set<BlockState> states, int maxTickets, int validRange)
{
PoiType type = new PoiType(states, maxTickets, validRange);
func.accept(key.location(), type);
registerBlockStates(key, states);
return type;
}

private static VillagerProfession register(BiConsumer<ResourceLocation, VillagerProfession> func, String name, ResourceKey<PoiType> poi, @Nullable SoundEvent workSound)
{
return register(func, name, (h) -> h.is(poi), (h) -> h.is(poi), workSound);
}

private static VillagerProfession register(BiConsumer<ResourceLocation, VillagerProfession> func, String name, Predicate<Holder<PoiType>> heldJobSite, Predicate<Holder<PoiType>> acquirableJobSite, @Nullable SoundEvent workSound)
{
return register(func, name, heldJobSite, acquirableJobSite, ImmutableSet.of(), ImmutableSet.of(), workSound);
}

private static VillagerProfession register(BiConsumer<ResourceLocation, VillagerProfession> func, String name, ResourceKey<PoiType> poi, ImmutableSet<Item> requestedItems, ImmutableSet<Block> secondaryPoi, @Nullable SoundEvent workSound) {
return register(func, name, ($$1x) -> $$1x.is(poi), ($$1x) -> $$1x.is(poi), requestedItems, secondaryPoi, workSound);
}

private static VillagerProfession register(BiConsumer<ResourceLocation, VillagerProfession> func, String name, Predicate<Holder<PoiType>> heldJobSite, Predicate<Holder<PoiType>> acquirableJobSite, ImmutableSet<Item> requestedItems, ImmutableSet<Block> secondaryPoi, @Nullable SoundEvent workSound) {
return register(func, name, new VillagerProfession(ToughAsNails.MOD_ID + ":" + name, heldJobSite, acquirableJobSite, requestedItems, secondaryPoi, workSound));
}

private static VillagerProfession register(BiConsumer<ResourceLocation, VillagerProfession> func, String name, VillagerProfession profession)
{
func.accept(new ResourceLocation(ToughAsNails.MOD_ID, name), profession);
return profession;
}

private static Set<BlockState> getBlockStates(Block block)
{
return ImmutableSet.copyOf(block.getStateDefinition().getPossibleStates());
}

private static void registerBlockStates(ResourceKey<PoiType> key, Set<BlockState> states)
{
var holder = BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolderOrThrow(key);
states.forEach(state -> {
if (!PoiTypes.hasPoi(state)) PoiTypes.registerBlockStates(holder, Set.of(state));
});
}
}
3 changes: 2 additions & 1 deletion common/src/main/resources/toughasnails.accesswidener
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,5 @@ accessible method net/minecraft/world/damagesource/DamageSources source (Lnet/mi
# Villages
accessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool rawTemplates Ljava/util/List;
mutable field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool rawTemplates Ljava/util/List;
accessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool templates Lit/unimi/dsi/fastutil/objects/ObjectArrayList;
accessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool templates Lit/unimi/dsi/fastutil/objects/ObjectArrayList;
accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes registerBlockStates (Lnet/minecraft/core/Holder;Ljava/util/Set;)V
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public static void onGatherData(GatherDataEvent event)
generator.addProvider(event.includeServer(), new TANBiomeTagsProvider(output, datapackProvider.getRegistryProvider(), existingFileHelper));
generator.addProvider(event.includeServer(), new TANDamageTypeTagsProvider(output, datapackProvider.getRegistryProvider(), existingFileHelper));
generator.addProvider(event.includeServer(), new TANTrimMaterialTagsProvider(output, datapackProvider.getRegistryProvider(), existingFileHelper));
generator.addProvider(event.includeServer(), new TANPoiTypesTagsProvider(output, datapackProvider.getRegistryProvider(), existingFileHelper));

// Client
generator.addProvider(event.includeClient(), new TANItemModelProvider(output, existingFileHelper));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.forge.datagen.provider;

import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.PoiTypeTagsProvider;
import net.minecraft.tags.PoiTypeTags;
import net.minecraftforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.Nullable;
import toughasnails.api.village.TANPoiTypes;
import toughasnails.core.ToughAsNails;

import java.util.concurrent.CompletableFuture;

public class TANPoiTypesTagsProvider extends PoiTypeTagsProvider
{
public TANPoiTypesTagsProvider(PackOutput packOutput, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper)
{
super(packOutput, lookupProvider, ToughAsNails.MOD_ID, existingFileHelper);
}

@Override
protected void addTags(HolderLookup.Provider provider)
{
this.tag(PoiTypeTags.ACQUIRABLE_JOB_SITE).add(TANPoiTypes.CLIMATOLOGIST);
}
}
3 changes: 2 additions & 1 deletion forge/src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ public net.minecraft.world.item.alchemy.PotionBrewing m_43513_(Lnet/minecraft/wo

# Villages
public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210559_ #rawTemplates
public net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ #templates
public net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ #templates
public net.minecraft.world.entity.ai.village.poi.PoiTypes m_246216_(Lnet/minecraft/core/Holder;Ljava/util/Set;)V #registerBlockStates
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,5 @@ org.gradle.daemon=false

# Dependencies
nightconfig_version=3.6.7
glitchcore_version=1.0.0.56
serene_seasons_version=9.3.0.15
glitchcore_version=1.0.0.57
serene_seasons_version=9.3.0.18
1 change: 1 addition & 0 deletions neoforge/src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ public net.minecraft.world.item.alchemy.PotionBrewing addMix(Lnet/minecraft/worl
# Villages
public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool rawTemplates
public net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool templates
public net.minecraft.world.entity.ai.village.poi.PoiTypes registerBlockStates(Lnet/minecraft/core/Holder;Ljava/util/Set;)V

0 comments on commit 86fec8d

Please sign in to comment.