Skip to content

Commit

Permalink
Migrate loot modifier to composable modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
KnightMiner committed Jun 4, 2023
1 parent a584ec2 commit 64bfa3d
Show file tree
Hide file tree
Showing 9 changed files with 166 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
{
"type": "tconstruct:loot",
"type": "tconstruct:composable",
"level_display": "tconstruct:default",
"enchantment": {
"name": "minecraft:fortune",
"level": 1
}
"modules": [
{
"type": "tconstruct:harvest_enchantment",
"name": "minecraft:fortune",
"level": 1
}
]
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
{
"type": "tconstruct:loot",
"type": "tconstruct:composable",
"level_display": "tconstruct:default",
"looting": 1
"modules": [
{
"type": "tconstruct:looting",
"level": 1
}
]
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
{
"type": "tconstruct:loot",
"type": "tconstruct:composable",
"level_display": {
"type": "tconstruct:unique",
"unique_until": 3
},
"enchantment": {
"name": "minecraft:fortune",
"level": 1
},
"looting": 1
"modules": [
{
"type": "tconstruct:harvest_enchantment",
"name": "minecraft:fortune",
"level": 1
},
{
"type": "tconstruct:looting",
"level": 1
}
]
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
{
"type": "tconstruct:loot",
"type": "tconstruct:composable",
"level_display": "tconstruct:no_levels",
"enchantment": {
"name": "minecraft:silk_touch",
"level": 1
}
"modules": [
{
"type": "tconstruct:harvest_enchantment",
"name": "minecraft:silk_touch",
"level": 1
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@
import java.util.Objects;
import java.util.function.BiConsumer;

/** Modifier to boost loot, from mobs or blocks */
/** Modifier to boost loot, from mobs or blocks
* @deprecated use {@link ComposableModifier} with {@link slimeknights.tconstruct.library.modifiers.modules.LootingModule}
* or {@link slimeknights.tconstruct.library.modifiers.modules.HarvestEnchantmentModule} */
@Deprecated
@RequiredArgsConstructor
public class LootModifier extends Modifier implements LootingModifierHook, HarvestEnchantmentsModifierHook {
@Nullable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package slimeknights.tconstruct.library.modifiers.modules;

import com.google.gson.JsonObject;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.ForgeRegistries;
import slimeknights.mantle.data.GenericLoaderRegistry.IGenericLoader;
import slimeknights.mantle.util.JsonHelper;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHook;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.HarvestEnchantmentsModifierHook;
import slimeknights.tconstruct.library.tools.context.ToolHarvestContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.utils.JsonUtils;

import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;

/**
* Module that adds an enchantment applied during harvesting. Used for silk touch and fortune.
* Currently, does not support incremental.
*/
public record HarvestEnchantmentModule(Enchantment enchantment, int level) implements ModifierModule, HarvestEnchantmentsModifierHook {
private static final List<ModifierHook<?>> DEFAULT_HOOKS = List.of(TinkerHooks.TOOL_HARVEST_ENCHANTMENTS, TinkerHooks.LEGGINGS_HARVEST_ENCHANTMENTS);

public HarvestEnchantmentModule(Enchantment enchantment) {
this(enchantment, 1);
}

@Override
public void applyHarvestEnchantments(IToolStackView tool, ModifierEntry modifier, ToolHarvestContext context, BiConsumer<Enchantment,Integer> consumer) {
consumer.accept(enchantment, level * modifier.getLevel());
}

@Override
public List<ModifierHook<?>> getDefaultHooks() {
return DEFAULT_HOOKS;
}

@Override
public IGenericLoader<? extends ModifierModule> getLoader() {
return LOADER;
}

public static IGenericLoader<HarvestEnchantmentModule> LOADER = new IGenericLoader<>() {
@Override
public HarvestEnchantmentModule deserialize(JsonObject json) {
Enchantment enchantment = JsonHelper.getAsEntry(ForgeRegistries.ENCHANTMENTS, json, "name");
int level = JsonUtils.getIntMin(json, "level", 1);
return new HarvestEnchantmentModule(enchantment, level);
}

@Override
public void serialize(HarvestEnchantmentModule object, JsonObject json) {
json.addProperty("name", Objects.requireNonNull(object.enchantment.getRegistryName()).toString());
json.addProperty("level", object.level);
}

@Override
public HarvestEnchantmentModule fromNetwork(FriendlyByteBuf buffer) {
Enchantment enchantment = buffer.readRegistryIdUnsafe(ForgeRegistries.ENCHANTMENTS);
int level = buffer.readVarInt();
return new HarvestEnchantmentModule(enchantment, level);
}

@Override
public void toNetwork(HarvestEnchantmentModule object, FriendlyByteBuf buffer) {
buffer.writeRegistryIdUnsafe(ForgeRegistries.ENCHANTMENTS, object.enchantment);
buffer.writeVarInt(object.level);
}
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package slimeknights.tconstruct.library.modifiers.modules;

import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import slimeknights.mantle.data.GenericIntSerializer;
import slimeknights.mantle.data.GenericLoaderRegistry.IGenericLoader;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHook;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.LootingModifierHook;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

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

/**
* Module for increasing the looting level, used for tools, on pants, and from bows
* Currently, does not support incremental.
*/
public record LootingModule(int level) implements LootingModifierHook, ModifierModule {
private static final List<ModifierHook<?>> DEFAULT_HOOKS = List.of(TinkerHooks.TOOL_LOOTING, TinkerHooks.LEGGINGS_LOOTING, TinkerHooks.PROJECTILE_LOOTING);
public static IGenericLoader<LootingModule> LOADER = new GenericIntSerializer<>("level", LootingModule::new, LootingModule::level);

@Override
public int getLootingValue(IToolStackView tool, ModifierEntry modifier, LivingEntity holder, Entity target, @Nullable DamageSource damageSource, int looting) {
return level * modifier.getLevel();
}

@Override
public List<ModifierHook<?>> getDefaultHooks() {
return DEFAULT_HOOKS;
}

@Override
public IGenericLoader<? extends ModifierModule> getLoader() {
return LOADER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@
import slimeknights.tconstruct.library.modifiers.impl.SingleLevelModifier;
import slimeknights.tconstruct.library.modifiers.impl.TankModifier;
import slimeknights.tconstruct.library.modifiers.impl.TotalArmorLevelModifier;
import slimeknights.tconstruct.library.modifiers.modules.HarvestEnchantmentModule;
import slimeknights.tconstruct.library.modifiers.modules.LootingModule;
import slimeknights.tconstruct.library.modifiers.modules.ModifierModule;
import slimeknights.tconstruct.library.modifiers.spilling.ISpillingEffect;
import slimeknights.tconstruct.library.modifiers.spilling.SpillingFluidManager;
import slimeknights.tconstruct.library.modifiers.spilling.effects.AddBreathSpillingEffect;
Expand Down Expand Up @@ -572,6 +575,9 @@ void registerSerializers(RegistryEvent.Register<RecipeSerializer<?>> event) {
ModifierLevelDisplay.LOADER.register(TConstruct.getResource("no_levels"), ModifierLevelDisplay.NO_LEVELS.getLoader());
ModifierLevelDisplay.LOADER.register(TConstruct.getResource("pluses"), ModifierLevelDisplay.PLUSES.getLoader());
ModifierLevelDisplay.LOADER.register(TConstruct.getResource("unique"), UniqueForLevels.LOADER);
// modifier modules
ModifierModule.LOADER.register(TConstruct.getResource("harvest_enchantment"), HarvestEnchantmentModule.LOADER);
ModifierModule.LOADER.register(TConstruct.getResource("looting"), LootingModule.LOADER);

ModifierPredicate.LOADER.register(TConstruct.getResource("and"), ModifierPredicate.AND);
ModifierPredicate.LOADER.register(TConstruct.getResource("or"), ModifierPredicate.OR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@
import slimeknights.tconstruct.library.modifiers.dynamic.EnchantmentModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.ExtraModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.InventoryMenuModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.LootModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.MobDisguiseModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.MobEffectModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.StatBoostModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.StatBoostModifier.ModifierDisplay;
import slimeknights.tconstruct.library.modifiers.dynamic.SwappableExtraSlotModifier;
import slimeknights.tconstruct.library.modifiers.modules.HarvestEnchantmentModule;
import slimeknights.tconstruct.library.modifiers.modules.LootingModule;
import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay;
import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay.UniqueForLevels;
import slimeknights.tconstruct.library.tools.SlotType;
Expand Down Expand Up @@ -139,10 +140,12 @@ protected void addModifiers() {


// loot
addModifier(TinkerModifiers.silky, new LootModifier(Enchantments.SILK_TOUCH, 1, ModifierLevelDisplay.NO_LEVELS));
addModifier(ModifierIds.luck, new LootModifier(Enchantments.BLOCK_FORTUNE, 1, 1, new UniqueForLevels(3)));
addModifier(ModifierIds.fortune, new LootModifier(Enchantments.BLOCK_FORTUNE, 1, ModifierLevelDisplay.DEFAULT));
addModifier(ModifierIds.looting, new LootModifier(1, ModifierLevelDisplay.DEFAULT));
buildModifier(TinkerModifiers.silky).levelDisplay(ModifierLevelDisplay.NO_LEVELS).addHook(new HarvestEnchantmentModule(Enchantments.SILK_TOUCH));
HarvestEnchantmentModule FORTUNE = new HarvestEnchantmentModule(Enchantments.BLOCK_FORTUNE);
LootingModule LOOTING = new LootingModule(1);
buildModifier(ModifierIds.luck).levelDisplay(new UniqueForLevels(3)).addHook(FORTUNE).addHook(LOOTING);
buildModifier(ModifierIds.fortune).addHook(FORTUNE);
buildModifier(ModifierIds.looting).addHook(LOOTING);

/// attack
addModifier(ModifierIds.sticky, MobEffectModifier.Builder.effect(MobEffects.MOVEMENT_SLOWDOWN).level(0, 0.5f).timeBase(20).timeMultiplierRandom(10).build());
Expand Down

0 comments on commit 64bfa3d

Please sign in to comment.