Skip to content

Commit

Permalink
Migrate process loot to a modifier hook
Browse files Browse the repository at this point in the history
Still undecided on that one, but might as well not be in the wrong place
  • Loading branch information
KnightMiner committed May 18, 2024
1 parent dce90b3 commit 3a5b0ce
Show file tree
Hide file tree
Showing 9 changed files with 70 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.level.storage.loot.LootContext;
import slimeknights.mantle.client.ResourceColorManager;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IGenericLoader;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IHaveLoader;
Expand Down Expand Up @@ -338,16 +337,6 @@ public boolean shouldDisplay(boolean advanced) {

/* Hooks */

/**
* Called on entity or block loot to allow modifying loot
* @param tool Current tool instance
* @param modifier Modifier level
* @param generatedLoot Current loot list before this modifier
* @param context Full loot context
* TODO: can we ditch this hook in favor of just using GLMs? Just need a loot condition to detect a modifier, and it gives us a lot more flexability
*/
public void processLoot(IToolStackView tool, ModifierEntry modifier, List<ItemStack> generatedLoot, LootContext context) {}


/* Modules */

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import slimeknights.tconstruct.library.modifiers.hook.armor.ProtectionModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.AttributesModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.EnchantmentModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.RepairFactorModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolActionModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolDamageModifierHook;
Expand Down Expand Up @@ -198,6 +199,8 @@ public void removeRawData(IToolStackView tool, Modifier modifier, RestrictedComp

/* Loot */

/** Hook to modify the results of a loot table */
public static final ModuleHook<ProcessLootModifierHook> PROCESS_LOOT = register("process_loot", ProcessLootModifierHook.class, ProcessLootModifierHook.AllMerger::new, (tool, modifier, loot, context) -> {});
/** Hook for a tool boosting the looting value */
public static final ModuleHook<LootingModifierHook> WEAPON_LOOTING = register("weapon_looting", LootingModifierHook.class, LootingModifierHook.ComposeMerger::new, (tool, modifier, context, looting) -> looting);
/** Hook for leggings boosting the tool's looting level */
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package slimeknights.tconstruct.library.modifiers.hook.behavior;

import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.LootContext;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

import java.util.Collection;
import java.util.List;

/** Hook for modifying items in a loot table. */
public interface ProcessLootModifierHook {
/**
* Called on entity or block loot to allow modifying loot
* @param tool Current tool instance
* @param modifier Modifier level
* @param generatedLoot Current loot list before this modifier
* @param context Full loot context
* TODO: can we ditch this hook in favor of just using GLMs? Just need a loot condition to detect a modifier, and it gives us a lot more flexability
*/
void processLoot(IToolStackView tool, ModifierEntry modifier, List<ItemStack> generatedLoot, LootContext context);

/** Merger that runs all hooks */
record AllMerger(Collection<ProcessLootModifierHook> modules) implements ProcessLootModifierHook {
@Override
public void processLoot(IToolStackView tool, ModifierEntry modifier, List<ItemStack> generatedLoot, LootContext context) {
for (ProcessLootModifierHook module : modules) {
module.processLoot(tool, modifier, generatedLoot, context);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import net.minecraftforge.common.loot.LootModifier;
import slimeknights.mantle.loot.AbstractLootModifierBuilder.GenericLootModifierBuilder;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.tools.helper.ModifierLootingHandler;
import slimeknights.tconstruct.library.tools.nbt.ToolStack;

Expand Down Expand Up @@ -48,7 +49,7 @@ protected ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generate
ToolStack tool = ToolStack.from(stack);
if (!tool.isBroken()) {
for (ModifierEntry entry : tool.getModifierList()) {
entry.getModifier().processLoot(tool, entry, generatedLoot, context);
entry.getHook(ModifierHooks.PROCESS_LOOT).processLoot(tool, entry, generatedLoot, context);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.common.recipe.RecipeCacheInvalidator;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.NoLevelsModifier;
import slimeknights.tconstruct.library.module.ModuleHookMap.Builder;
import slimeknights.tconstruct.library.recipe.SingleItemContainer;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

Expand All @@ -21,7 +24,7 @@
import java.util.Optional;
import java.util.concurrent.ExecutionException;

public class AutosmeltModifier extends NoLevelsModifier {
public class AutosmeltModifier extends NoLevelsModifier implements ProcessLootModifierHook {
/** Cache of relevant smelting recipes */
private final Cache<Item,Optional<SmeltingRecipe>> recipeCache = CacheBuilder
.newBuilder()
Expand All @@ -38,6 +41,11 @@ public AutosmeltModifier() {
});
}

@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, ModifierHooks.PROCESS_LOOT);
}

/**
* Gets a furnace recipe without using the cache
* @param stack Stack to try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import slimeknights.tconstruct.common.config.Config;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.combat.MeleeHitModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.NoLevelsModifier;
import slimeknights.tconstruct.library.modifiers.modules.fluid.TankModule;
Expand All @@ -27,7 +28,7 @@
import java.util.Iterator;
import java.util.List;

public class MeltingModifier extends NoLevelsModifier implements MeleeHitModifierHook {
public class MeltingModifier extends NoLevelsModifier implements MeleeHitModifierHook, ProcessLootModifierHook {
/** Max temperature allowed for melting items */
private static final int MAX_TEMPERATURE = 1000;

Expand All @@ -43,7 +44,7 @@ protected void registerHooks(Builder hookBuilder) {
super.registerHooks(hookBuilder);
tank = new TankModule(FluidType.BUCKET_VOLUME, true);
hookBuilder.addModule(tank);
hookBuilder.addHook(this, ModifierHooks.MELEE_HIT);
hookBuilder.addHook(this, ModifierHooks.MELEE_HIT, ModifierHooks.PROCESS_LOOT);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@
import net.minecraft.world.level.storage.loot.LootContext;
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.DurabilityShieldModifier;
import slimeknights.tconstruct.library.module.ModuleHookMap.Builder;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.stat.ToolStats;

import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.List;

public class StoneshieldModifier extends DurabilityShieldModifier {
public class StoneshieldModifier extends DurabilityShieldModifier implements ProcessLootModifierHook {
@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, ModifierHooks.PROCESS_LOOT);
}

@Override
public int getShieldCapacity(IToolStackView tool, ModifierEntry modifier) {
return (int)(modifier.getEffectiveLevel() * 100 * tool.getMultiplier(ToolStats.DURABILITY));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.armor.OnAttackedModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.interaction.GeneralInteractionModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.interaction.InteractionSource;
import slimeknights.tconstruct.library.module.ModuleHookMap.Builder;
Expand All @@ -32,13 +33,13 @@

import java.util.List;

public class TastyModifier extends Modifier implements GeneralInteractionModifierHook, OnAttackedModifierHook {
public class TastyModifier extends Modifier implements GeneralInteractionModifierHook, OnAttackedModifierHook, ProcessLootModifierHook {
// TODO: consider making this modifier dynamic and letting addons swap out representative items and food rewards
private static final Lazy<ItemStack> BACON_STACK = Lazy.of(() -> new ItemStack(TinkerCommons.bacon));

@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, ModifierHooks.GENERAL_INTERACT, ModifierHooks.ON_ATTACKED);
hookBuilder.addHook(this, ModifierHooks.GENERAL_INTERACT, ModifierHooks.ON_ATTACKED, ModifierHooks.PROCESS_LOOT);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,21 @@
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ProcessLootModifierHook;
import slimeknights.tconstruct.library.module.ModuleHookMap.Builder;
import slimeknights.tconstruct.library.recipe.modifiers.severing.SeveringRecipe;
import slimeknights.tconstruct.library.recipe.modifiers.severing.SeveringRecipeCache;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

import java.util.List;

public class SeveringModifier extends Modifier {
public class SeveringModifier extends Modifier implements ProcessLootModifierHook {
@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, ModifierHooks.PROCESS_LOOT);
}

@Override
public void processLoot(IToolStackView tool, ModifierEntry modifier, List<ItemStack> generatedLoot, LootContext context) {
// if no damage source, probably not a mob
Expand Down

0 comments on commit 3a5b0ce

Please sign in to comment.