Skip to content

Commit

Permalink
Rewrite loot table injection (#97)
Browse files Browse the repository at this point in the history
  • Loading branch information
legobmw99 committed Jan 13, 2024
1 parent aa89c06 commit 83fcc2a
Show file tree
Hide file tree
Showing 16 changed files with 207 additions and 186 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"type": "allomancy:lerasium_loot",
"chance_one_in": 5,
"conditions": [
{
"condition": "minecraft:any_of",
"terms": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/simple_dungeon"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/desert_pyramid"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/jungle_temple"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/woodland_mansion"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/end_city_treasure"
}
]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"type": "allomancy:unbreakable_dagger_loot",
"chance_one_in": 20,
"conditions": [
{
"condition": "minecraft:any_of",
"terms": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/woodland_mansion"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/end_city_treasure"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/pillager_outpost"
}
]
}
]
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"entries": [
"allomancy:unbreakable_dagger_loot",
"allomancy:lerasium_loot"
],
"replace": false
}
1 change: 0 additions & 1 deletion src/main/java/com/legobmw99/allomancy/Allomancy.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ public static void clientInit(final FMLClientSetupEvent e) {

public static void init(final FMLCommonSetupEvent e) {
PowersSetup.init(e);
MaterialsSetup.init(e);
}

}
19 changes: 8 additions & 11 deletions src/main/java/com/legobmw99/allomancy/api/enums/Metal.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.legobmw99.allomancy.api.enums;

import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import net.minecraft.util.StringRepresentable;

import java.util.Locale;

public enum Metal {
public enum Metal implements StringRepresentable {
IRON(true),
STEEL(IRON),
TIN,
Expand Down Expand Up @@ -64,13 +63,11 @@ public int getIndex() {
return ordinal();
}

public static final Codec<Metal> CODEC = Codec.STRING.comapFlatMap(s -> {
for (Metal mt : Metal.values()) {
if (mt.getName().equals(s)) {
return DataResult.success(mt);
}
}
return DataResult.error(() -> s + " is not a valid Metal");
}, Metal::getName);

public static final StringRepresentable.EnumCodec<Metal> CODEC = StringRepresentable.fromEnum(Metal::values);

@Override
public String getSerializedName() {
return getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ public static void gatherData(GatherDataEvent event) {
var fileHelper = event.getExistingFileHelper();
generator.addProvider(event.includeServer(), new Recipes(packOutput, lookup));
generator.addProvider(event.includeServer(), new LootTableProvider(packOutput, Collections.emptySet(),
List.of(new LootTableProvider.SubProviderEntry(BlockLootTables::new, LootContextParamSets.BLOCK),
new LootTableProvider.SubProviderEntry(DungeonLootTables::new, LootContextParamSets.EMPTY))));
List.of(new LootTableProvider.SubProviderEntry(BlockLootTables::new, LootContextParamSets.BLOCK))));
generator.addProvider(event.includeServer(), new LootModifiers(packOutput));

BlockTags blocktags = new BlockTags(packOutput, lookup, fileHelper);
generator.addProvider(event.includeServer(), blocktags);
generator.addProvider(event.includeServer(), new ItemTags(packOutput, lookup, blocktags.contentsGetter(), fileHelper));
Expand Down

This file was deleted.

37 changes: 37 additions & 0 deletions src/main/java/com/legobmw99/allomancy/datagen/LootModifiers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.legobmw99.allomancy.datagen;

import com.legobmw99.allomancy.Allomancy;
import com.legobmw99.allomancy.modules.materials.world.DaggerLootModifier;
import com.legobmw99.allomancy.modules.materials.world.LerasiumLootModifier;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.storage.loot.predicates.AnyOfCondition;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.neoforged.neoforge.common.data.GlobalLootModifierProvider;
import net.neoforged.neoforge.common.loot.LootTableIdCondition;

public class LootModifiers extends GlobalLootModifierProvider {

public LootModifiers(PackOutput output) {
super(output, Allomancy.MODID);
}

private static final ResourceLocation DUNGEON = new ResourceLocation("minecraft:chests/simple_dungeon");
private static final ResourceLocation DESERT = new ResourceLocation("minecraft:chests/desert_pyramid");
private static final ResourceLocation JUNGLE = new ResourceLocation("minecraft:chests/jungle_temple");
private static final ResourceLocation WOODLAND = new ResourceLocation("minecraft:chests/woodland_mansion");
private static final ResourceLocation END_CITY = new ResourceLocation("minecraft:chests/end_city_treasure");
private static final ResourceLocation OUTPOST = new ResourceLocation("minecraft:chests/pillager_outpost");

@Override
protected void start() {
var lerasiumLocations = new LootItemCondition[]{
AnyOfCondition.anyOf(LootTableIdCondition.builder(DUNGEON), LootTableIdCondition.builder(DESERT), LootTableIdCondition.builder(JUNGLE),
LootTableIdCondition.builder(WOODLAND), LootTableIdCondition.builder(END_CITY)).build()};
add("lerasium_loot", new LerasiumLootModifier(lerasiumLocations, 5));

var daggerLocations = new LootItemCondition[]{
AnyOfCondition.anyOf(LootTableIdCondition.builder(WOODLAND), LootTableIdCondition.builder(END_CITY), LootTableIdCondition.builder(OUTPOST)).build()};
add("unbreakable_dagger_loot", new DaggerLootModifier(daggerLocations, 20));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.legobmw99.allomancy.Allomancy;
import com.legobmw99.allomancy.api.enums.Metal;
import com.legobmw99.allomancy.modules.materials.world.LootTableInjector;
import com.legobmw99.allomancy.modules.materials.world.DaggerLootModifier;
import com.legobmw99.allomancy.modules.materials.world.LerasiumLootModifier;
import com.mojang.serialization.Codec;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.HolderSet;
Expand All @@ -28,8 +30,7 @@
import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest;
import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.loot.IGlobalLootModifier;
import net.neoforged.neoforge.common.world.BiomeModifier;
import net.neoforged.neoforge.common.world.BiomeModifiers;
import net.neoforged.neoforge.registries.DeferredBlock;
Expand All @@ -39,6 +40,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class MaterialsSetup {

Expand All @@ -62,8 +64,8 @@ public String toString() {
private static final ResourceKey<BiomeModifier> ADD_ALLOMANCY_ORES = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS,
new ResourceLocation(Allomancy.MODID, "overworld_ores"));

public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Allomancy.MODID);
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Allomancy.MODID);
private static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Allomancy.MODID);
private static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Allomancy.MODID);

public static final List<DeferredItem<Item>> FLAKES = new ArrayList<>();
public static final List<DeferredItem<Item>> NUGGETS = new ArrayList<>();
Expand Down Expand Up @@ -131,16 +133,15 @@ public String toString() {
}
}

private static final DeferredRegister<Codec<? extends IGlobalLootModifier>> GLM = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS,
Allomancy.MODID);
public static final Supplier<Codec<LerasiumLootModifier>> LERASIUM_LOOT = GLM.register("lerasium_loot", LerasiumLootModifier.CODEC);
public static final Supplier<Codec<DaggerLootModifier>> DAGGER_LOOT = GLM.register("unbreakable_dagger_loot", DaggerLootModifier.CODEC);

public static void register(IEventBus bus) {
BLOCKS.register(bus);
ITEMS.register(bus);
}

public static void init(final FMLCommonSetupEvent e) {
e.enqueueWork(() -> {
NeoForge.EVENT_BUS.register(LootTableInjector.class);
});
GLM.register(bus);
}

public static Block createStandardBlock() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.legobmw99.allomancy.modules.materials.world;

import com.google.common.base.Suppliers;
import com.legobmw99.allomancy.modules.combat.CombatSetup;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.neoforged.neoforge.common.loot.IGlobalLootModifier;
import net.neoforged.neoforge.common.loot.LootModifier;
import org.jetbrains.annotations.NotNull;

import java.util.function.Supplier;

public class DaggerLootModifier extends LootModifier {

public int chance_one_in;
public static final Supplier<Codec<DaggerLootModifier>> CODEC = Suppliers.memoize(
() -> RecordCodecBuilder.create(inst -> codecStart(inst).and(Codec.INT.fieldOf("chance_one_in").forGetter(t -> t.chance_one_in)).apply(inst, DaggerLootModifier::new)));

public DaggerLootModifier(LootItemCondition[] conditionsIn, int chance_one_in) {
super(conditionsIn);
this.chance_one_in = chance_one_in;
}

@Override
protected @NotNull ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot, LootContext context) {
if (context.getRandom().nextInt(this.chance_one_in) == 0) {
ItemStack dagger = new ItemStack(CombatSetup.OBSIDIAN_DAGGER.get());
CompoundTag nbt = new CompoundTag();
nbt.putBoolean("Unbreakable", true);
dagger.setTag(nbt);
generatedLoot.add(dagger);
}
return generatedLoot;
}

@Override
public Codec<? extends IGlobalLootModifier> codec() {
return CODEC.get();
}
}

0 comments on commit 83fcc2a

Please sign in to comment.