Skip to content

Commit

Permalink
feat: Loot Table testing
Browse files Browse the repository at this point in the history
  • Loading branch information
darksonic300 committed Aug 2, 2024
1 parent b8d146b commit d95af5d
Show file tree
Hide file tree
Showing 18 changed files with 325 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// 1.21 2024-08-03T01:13:59.9045726 Global Loot Modifiers : seidr
b96a1c0bdb959e665bcc5b47474394305d4ea5f3 data/neoforge/loot_modifiers/global_loot_modifiers.json
1fdd6144e2cba6d5491dac4dbebdf706877e6643 data/seidr/loot_modifiers/mineshaft_loot_modifiers.json
49f03a6c5409a669c4827452551f2e0db73e597a data/seidr/loot_modifiers/nether_loot_modifiers.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"entries": [
"seidr:mineshaft_loot_modifiers",
"seidr:nether_loot_modifiers"
],
"replace": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"type": "seidr:mineshaft_loot",
"chanceToSpawn": 0.8,
"conditions": [
{
"condition": "minecraft:any_of",
"terms": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/abandoned_mineshaft"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/jungle_temple"
}
]
}
],
"items": [
{
"data": {
"count": 1,
"id": "seidr:incomplete_undead_tablet"
},
"weight": 70
},
{
"data": {
"count": 1,
"id": "seidr:effect_remove_tablet"
},
"weight": 30
}
],
"totalWeight": 100
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"type": "seidr:mineshaft_loot",
"chanceToSpawn": 0.8,
"conditions": [
{
"condition": "minecraft:any_of",
"terms": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/ruined_portal"
},
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/nether_bridge"
}
]
}
],
"items": [
{
"data": {
"count": 1,
"id": "seidr:attraction_tablet"
},
"weight": 20
},
{
"data": {
"count": 1,
"id": "seidr:damaged_undead_tablet"
},
"weight": 30
},
{
"data": {
"count": 1,
"id": "seidr:fireball_tablet"
},
"weight": 60
}
],
"totalWeight": 110
}
10 changes: 7 additions & 3 deletions src/main/java/com/github/darksonic300/seidr/Seidr.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import com.github.darksonic300.seidr.datagen.SeidrItemModelData;
import com.github.darksonic300.seidr.datagen.SeidrLanguageData;
import com.github.darksonic300.seidr.datagen.SeidrRecipeData;
import com.github.darksonic300.seidr.datagen.loot.modifiers.SeidrGlobalLootModifiers;
import com.github.darksonic300.seidr.datagen.loot.modifiers.SeidrLootDataProvider;
import com.github.darksonic300.seidr.datagen.tags.SeidrBlockTagData;
import com.github.darksonic300.seidr.datagen.tags.SeidrItemTagData;
import com.github.darksonic300.seidr.effect.SeidrEffects;
import com.github.darksonic300.seidr.entity.SeidrEntityTypes;
import com.github.darksonic300.seidr.item.SeidrScrollItems;
import com.github.darksonic300.seidr.item.SeidrItems;
import com.github.darksonic300.seidr.particle.SeidrParticleTypes;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
Expand Down Expand Up @@ -41,12 +43,13 @@ public Seidr(IEventBus modEventBus, ModContainer modContainer)
{
modEventBus.addListener(this::dataSetup);

SeidrScrollItems.SCROLL_ITEMS.register(modEventBus);
SeidrScrollItems.TABLET_ITEMS.register(modEventBus);
SeidrItems.SCROLL_ITEMS.register(modEventBus);
SeidrItems.TABLET_ITEMS.register(modEventBus);
SeidrSoundEvents.SOUNDS.register(modEventBus);
SeidrEntityTypes.ENTITY_TYPES.register(modEventBus);
SeidrParticleTypes.PARTICLE_TYPES.register(modEventBus);
SeidrEffects.MOB_EFFECTS.register(modEventBus);
SeidrGlobalLootModifiers.LOOT_MODIFIERS.register(modEventBus);

modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC);
this.eventSetup(modEventBus);
Expand Down Expand Up @@ -75,5 +78,6 @@ public void dataSetup(GatherDataEvent event) {
SeidrBlockTagData blockTags = new SeidrBlockTagData(packOutput, lookupProvider, fileHelper);
generator.addProvider(event.includeServer(), blockTags);
generator.addProvider(event.includeServer(), new SeidrItemTagData(packOutput, lookupProvider, blockTags.contentsGetter()));
generator.addProvider(event.includeServer(), new SeidrLootDataProvider(packOutput, lookupProvider));
}
}
6 changes: 3 additions & 3 deletions src/main/java/com/github/darksonic300/seidr/SeidrTabs.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.darksonic300.seidr;

import com.github.darksonic300.seidr.item.SeidrScrollItems;
import com.github.darksonic300.seidr.item.SeidrItems;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.*;
import net.neoforged.api.distmarker.Dist;
Expand All @@ -16,9 +16,9 @@ public class SeidrTabs {
public static void buildCreativeModeTabs(BuildCreativeModeTabContentsEvent event) {
ResourceKey<CreativeModeTab> tab = event.getTabKey();
if(tab == CreativeModeTabs.TOOLS_AND_UTILITIES) {
for (DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.SCROLL_ITEMS.getEntries())
for (DeferredHolder<Item, ? extends Item> item : SeidrItems.SCROLL_ITEMS.getEntries())
event.accept(item.get());
for(DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.TABLET_ITEMS.getEntries())
for(DeferredHolder<Item, ? extends Item> item : SeidrItems.TABLET_ITEMS.getEntries())
event.accept(item.get());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.github.darksonic300.seidr.datagen;

import com.github.darksonic300.seidr.datagen.tags.SeidrItemTagData;
import com.github.darksonic300.seidr.datagen.tags.SeidrTags;
import com.github.darksonic300.seidr.item.SeidrScrollItems;
import com.github.darksonic300.seidr.item.SeidrItems;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
Expand All @@ -19,10 +17,10 @@ public SeidrItemModelData(PackOutput output, ExistingFileHelper existingFileHelp

@Override
protected void registerModels() {
for(DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.SCROLL_ITEMS.getEntries())
for(DeferredHolder<Item, ? extends Item> item : SeidrItems.SCROLL_ITEMS.getEntries())
this.scrollItem(item.get());

for(DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.TABLET_ITEMS.getEntries())
for(DeferredHolder<Item, ? extends Item> item : SeidrItems.TABLET_ITEMS.getEntries())
this.tabletItem(item.get());
}

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

import com.github.darksonic300.seidr.Seidr;
import com.github.darksonic300.seidr.item.ScrollItem;
import com.github.darksonic300.seidr.item.SeidrScrollItems;
import com.github.darksonic300.seidr.item.SeidrItems;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.LanguageProvider;

Expand All @@ -15,19 +15,19 @@ public SeidrLanguageData(PackOutput output) {

@Override
protected void addTranslations() {
addScroll(SeidrScrollItems.ATTRACTION_SCROLL, "Attraction", "- All nearby animals will follow you");
addScroll(SeidrScrollItems.EFFECT_REMOVE_SCROLL, "Purity", "- Clears all active effects");
addScroll(SeidrScrollItems.FIREBALL_SCROLL, "Fireball", "- Shoots a powerful fireball");
addScroll(SeidrScrollItems.SOUND_BLAST_SCROLL, "Echo" , "- Harnesses the power of the Warden");

addIncompleteScroll(SeidrScrollItems.INCOMPLETE_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addIncompleteScroll(SeidrScrollItems.INCOMPLETE_RESISTANCE_SCROLL, "Endurance", "- Decreases incoming damage");
addDamagedScroll(SeidrScrollItems.DAMAGED_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addDamagedScroll(SeidrScrollItems.DAMAGED_RESISTANCE_SCROLL, "Resilience", "- Decreases incoming damage");
addDamagedScroll(SeidrScrollItems.DAMAGED_WALKING_SCROLL, "Light Walk", "- Makes you walk on water");
addCompleteScroll(SeidrScrollItems.COMPLETE_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addCompleteScroll(SeidrScrollItems.COMPLETE_RESISTANCE_SCROLL, "Resilience", "- Decreases incoming damage");
addCompleteScroll(SeidrScrollItems.COMPLETE_WALKING_SCROLL, "Light Walk", "- Makes you walk on water");
addScroll(SeidrItems.ATTRACTION_SCROLL, "Attraction", "- All nearby animals will follow you");
addScroll(SeidrItems.EFFECT_REMOVE_SCROLL, "Purity", "- Clears all active effects");
addScroll(SeidrItems.FIREBALL_SCROLL, "Fireball", "- Shoots a powerful fireball");
addScroll(SeidrItems.SOUND_BLAST_SCROLL, "Echo" , "- Harnesses the power of the Warden");

addIncompleteScroll(SeidrItems.INCOMPLETE_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addIncompleteScroll(SeidrItems.INCOMPLETE_RESISTANCE_SCROLL, "Endurance", "- Decreases incoming damage");
addDamagedScroll(SeidrItems.DAMAGED_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addDamagedScroll(SeidrItems.DAMAGED_RESISTANCE_SCROLL, "Resilience", "- Decreases incoming damage");
addDamagedScroll(SeidrItems.DAMAGED_WALKING_SCROLL, "Light Walk", "- Makes you walk on water");
addCompleteScroll(SeidrItems.COMPLETE_UNDEAD_SCROLL, "the Undead", "- Summons undead mobs to fight for you");
addCompleteScroll(SeidrItems.COMPLETE_RESISTANCE_SCROLL, "Resilience", "- Decreases incoming damage");
addCompleteScroll(SeidrItems.COMPLETE_WALKING_SCROLL, "Light Walk", "- Makes you walk on water");
}

public void addScroll(Supplier<? extends ScrollItem> key, String name, String description) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.darksonic300.seidr.datagen;

import com.github.darksonic300.seidr.datagen.tags.SeidrTags;
import com.github.darksonic300.seidr.item.SeidrScrollItems;
import com.github.darksonic300.seidr.item.SeidrItems;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.recipes.RecipeCategory;
Expand All @@ -24,17 +24,17 @@ public SeidrRecipeData(PackOutput pOutput, CompletableFuture<HolderLookup.Provid

@Override
protected void buildRecipes(RecipeOutput consumer) {
for (DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.SCROLL_ITEMS.getEntries()) {
for (DeferredHolder<Item, ? extends Item> item : SeidrItems.SCROLL_ITEMS.getEntries()) {
scrollRecipe(item, consumer);
}
for (DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.TABLET_ITEMS.getEntries()) {
for (DeferredHolder<Item, ? extends Item> item : SeidrItems.TABLET_ITEMS.getEntries()) {
duplicate(item.get(), consumer);
}
}

public void scrollRecipe(DeferredHolder<Item, ? extends Item> scroll, RecipeOutput consumer) {
Item ingredient = null;
for (DeferredHolder<Item, ? extends Item> item : SeidrScrollItems.TABLET_ITEMS.getEntries()) {
for (DeferredHolder<Item, ? extends Item> item : SeidrItems.TABLET_ITEMS.getEntries()) {
if (scroll.getId().toLanguageKey().startsWith(item.getId().toLanguageKey().replaceFirst("_tablet", ""))) {
ingredient = item.get();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.github.darksonic300.seidr.datagen.loot.modifiers;

import com.google.common.base.Suppliers;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.util.random.WeightedEntry;
import net.minecraft.util.random.WeightedRandom;
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.List;
import java.util.function.Supplier;

public class SeidrAddLootModifier extends LootModifier {

public static final MapCodec<SeidrAddLootModifier> CODEC = RecordCodecBuilder.mapCodec(inst ->
LootModifier.codecStart(inst).and(inst.group(
WeightedEntry.Wrapper.codec(ItemStack.CODEC).listOf().fieldOf("items").forGetter(m -> m.items),
Codec.INT.fieldOf("totalWeight").forGetter(m -> m.totalWeight),
Codec.FLOAT.fieldOf("chanceToSpawn").forGetter(m -> m.chance)
)).apply(inst, SeidrAddLootModifier::new)
);

public final List<WeightedEntry.Wrapper<ItemStack>> items;
public final int totalWeight;
public final float chance;

public SeidrAddLootModifier(final LootItemCondition[] conditionsIn, List<WeightedEntry.Wrapper<ItemStack>> items, int totalWeight, float chance) {
super(conditionsIn);
this.items = items.stream().map(wrapper -> WeightedEntry.wrap(wrapper.data().copy(), wrapper.getWeight().asInt())).toList();
this.totalWeight = totalWeight;
this.chance = chance;
}

@Override
protected @NotNull ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot, LootContext context) {

// size of the loots
int size = generatedLoot.size();

// is the loot full?
boolean isFull = size == 27;

// size diff for when it's not full
int sizeDiff = 27-size;

// if the loot is not full, for each slot remaining, have x chance to add one of our item in the empty slots
if(!isFull) {
for(int i = 0; i<= sizeDiff; i++) {
if(context.getRandom().nextFloat() > chance) {
WeightedRandom.getRandomItem(context.getRandom(), this.items, totalWeight).ifPresent(e -> generatedLoot.add(e.data()));
}
}
}

return generatedLoot;
}

@Override
public MapCodec<? extends IGlobalLootModifier> codec() {
return CODEC;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.github.darksonic300.seidr.datagen.loot.modifiers;

import com.github.darksonic300.seidr.Seidr;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import net.neoforged.neoforge.common.loot.IGlobalLootModifier;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.NeoForgeRegistries;

import java.util.function.Supplier;

public class SeidrGlobalLootModifiers {
public static final DeferredRegister<MapCodec<? extends IGlobalLootModifier>> LOOT_MODIFIERS =
DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, Seidr.MODID);

public static final Supplier<MapCodec<SeidrAddLootModifier>> NETHER_LOOT_CODEC = LOOT_MODIFIERS.register("nether_loot", () -> SeidrAddLootModifier.CODEC);
public static final Supplier<MapCodec<SeidrAddLootModifier>> MINESHAFT_LOOT_CODEC = LOOT_MODIFIERS.register("mineshaft_loot", () -> SeidrAddLootModifier.CODEC);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.github.darksonic300.seidr.datagen.loot.modifiers;

import com.github.darksonic300.seidr.Seidr;
import com.github.darksonic300.seidr.item.SeidrItems;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.random.WeightedEntry;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.neoforged.neoforge.common.data.GlobalLootModifierProvider;
import net.neoforged.neoforge.common.loot.LootTableIdCondition;

import java.util.List;
import java.util.concurrent.CompletableFuture;

public class SeidrLootDataProvider extends GlobalLootModifierProvider {
public SeidrLootDataProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, Seidr.MODID);
}

@Override
protected void start() {
add("nether_loot_modifiers", new SeidrAddLootModifier(
new LootItemCondition[] { LootTableIdCondition.builder(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/ruined_portal"))
.or(LootTableIdCondition.builder(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/nether_bridge")))
.build() },
List.of(
WeightedEntry.wrap(new ItemStack(SeidrItems.ATTRACTION_TABLET.get(), 1), 20),
WeightedEntry.wrap(new ItemStack(SeidrItems.DAMAGED_UNDEAD_TABLET.get(), 1), 30),
WeightedEntry.wrap(new ItemStack(SeidrItems.FIREBALL_TABLET.get(), 1), 60)
),
110,
0.8f
));

add("mineshaft_loot_modifiers", new SeidrAddLootModifier(
new LootItemCondition[] { LootTableIdCondition.builder(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/abandoned_mineshaft"))
.or(LootTableIdCondition.builder(ResourceLocation.fromNamespaceAndPath("minecraft", "chests/jungle_temple")))
.build() },
List.of(
WeightedEntry.wrap(new ItemStack(SeidrItems.INCOMPLETE_UNDEAD_TABLET.get(), 1), 70),
WeightedEntry.wrap(new ItemStack(SeidrItems.EFFECT_REMOVE_TABLET.get(), 1), 30)
),
100,
0.8f
));
}
}
Loading

0 comments on commit d95af5d

Please sign in to comment.