Skip to content

Commit

Permalink
done with GLM
Browse files Browse the repository at this point in the history
  • Loading branch information
RealYusufIsmail committed Aug 8, 2024
1 parent dbb5799 commit 41b9078
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// 1.21 2024-08-08T05:47:34.865233 Global Loot Modifiers : tutorialmod
60641db777c2d35cc872ccfc7cc7480e72559477 data/neoforge/loot_modifiers/global_loot_modifiers.json
7c8fa841a46c131d5b9d58923260f8681ecbe5fd data/tutorialmod/loot_modifiers/example_item_from_igloo_chest.json
a891e805643031c2b80b813521b72a35c95121b2 data/tutorialmod/loot_modifiers/example_item_from_iron_golem.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"entries": [
"tutorialmod:example_item_from_igloo_chest",
"tutorialmod:example_item_from_iron_golem"
],
"replace": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"type": "tutorialmod:add_item",
"conditions": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:chests/igloo_chest"
},
{
"chance": 0.35,
"condition": "minecraft:random_chance"
}
],
"item": "tutorialmod:example_item"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"type": "tutorialmod:add_item",
"conditions": [
{
"condition": "neoforge:loot_table_id",
"loot_table_id": "minecraft:entities/iron_golem"
}
],
"item": "tutorialmod:example_item"
}
2 changes: 2 additions & 0 deletions src/main/java/io/github/realyusufismail/TutorialMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.github.realyusufismail.init.BlockInit;
import io.github.realyusufismail.init.CreativeModeTabInit;
import io.github.realyusufismail.init.ItemInit;
import io.github.realyusufismail.init.LootModifierInit;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.Mod;
Expand All @@ -21,6 +22,7 @@ public TutorialMod(@NotNull IEventBus bus) {
ItemInit.ITEMS.register(bus);
BlockInit.BLOCKS.register(bus);
CreativeModeTabInit.CREATIVE_MODE_TABS.register(bus);
LootModifierInit.LOOT_MODIFIERS.register(bus);

bus.addListener(DataGenerators::gatherData);

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

import io.github.realyusufismail.TutorialMod;
import io.github.realyusufismail.data.lang.ModEnLangProvider;
import io.github.realyusufismail.data.loot.ModGlobalLootModifiersProvider;
import io.github.realyusufismail.data.loottable.ModLootTables;
import io.github.realyusufismail.data.recipe.MainModRecipeProvider;
import io.github.realyusufismail.data.tag.ModBlockTagsProvider;
Expand Down Expand Up @@ -31,6 +32,7 @@ public static void gatherData(GatherDataEvent event) {
generator.addProvider(true, new ModLootTables(output, event.getLookupProvider()));
generator.addProvider(true, new ModWorldGenProvider(output, event.getLookupProvider()));
generator.addProvider(true, new MainModRecipeProvider(generator, event.getLookupProvider()));
generator.addProvider(true, new ModGlobalLootModifiersProvider(output, event.getLookupProvider()));
} catch (RuntimeException e) {
TutorialMod.logger.error("Failed to gather data", e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.github.realyusufismail.data.loot;

import io.github.realyusufismail.TutorialMod;
import io.github.realyusufismail.init.ItemInit;
import io.github.realyusufismail.loot.AddItemModifier;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition;
import net.neoforged.neoforge.common.data.GlobalLootModifierProvider;
import net.neoforged.neoforge.common.loot.LootTableIdCondition;

import java.util.concurrent.CompletableFuture;

// see https://github.com/Luohuayu/CatServer/blob/1c92118fcca69ffac97a48c8e1f6e1bb861b41d1/src/main/java/org/bukkit/loot/LootTables.java#L71 for some loot tables
public class ModGlobalLootModifiersProvider extends GlobalLootModifierProvider {
public ModGlobalLootModifiersProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, TutorialMod.MOD_ID);
}

@Override
protected void start() {
add("example_item_from_igloo_chest", new AddItemModifier(new LootItemCondition[]{
LootTableIdCondition.builder(ResourceLocation.parse("chests/igloo_chest")).build(),
LootItemRandomChanceCondition.randomChance(0.35f).build()},
ItemInit.EXAMPLE_ITEM.get()));

add("example_item_from_iron_golem", new AddItemModifier(new LootItemCondition[]{
LootTableIdCondition.builder(ResourceLocation.parse("entities/iron_golem")).build()},
ItemInit.EXAMPLE_ITEM.get()));
}
}
15 changes: 15 additions & 0 deletions src/main/java/io/github/realyusufismail/init/LootModifierInit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.github.realyusufismail.init;

import com.mojang.serialization.MapCodec;
import io.github.realyusufismail.TutorialMod;
import io.github.realyusufismail.loot.AddItemModifier;
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;

public class LootModifierInit {
public static DeferredRegister<MapCodec<? extends IGlobalLootModifier>> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.GLOBAL_LOOT_MODIFIER_SERIALIZERS, TutorialMod.MOD_ID);

public static final DeferredHolder<MapCodec<? extends IGlobalLootModifier>, MapCodec<AddItemModifier>> ADD_ITEM_MODIFIER = LOOT_MODIFIERS.register("add_item", AddItemModifier.CODEC_SUPPLIER);
}
49 changes: 49 additions & 0 deletions src/main/java/io/github/realyusufismail/loot/AddItemModifier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.github.realyusufismail.loot;

import com.google.common.base.Suppliers;
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.world.item.Item;
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 AddItemModifier extends LootModifier {

public static Supplier<MapCodec<AddItemModifier>> CODEC_SUPPLIER = Suppliers.memoize(() -> RecordCodecBuilder
.mapCodec(instance -> AddItemModifier.codecStart(instance)
.and(BuiltInRegistries.ITEM.byNameCodec().fieldOf("item")
.forGetter(addItemModifierInstance -> addItemModifierInstance.item))
.apply(instance, AddItemModifier::new)));

private final Item item;

public AddItemModifier(LootItemCondition[] conditionsIn, Item item) {
super(conditionsIn);
this.item = item;
}

@Override
protected @NotNull ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot, LootContext context) {
for (LootItemCondition condition : this.conditions) {
if (!condition.test(context)) {
return generatedLoot;
}
}

generatedLoot.add(new ItemStack(this.item));
return generatedLoot;
}

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

0 comments on commit 41b9078

Please sign in to comment.