Skip to content

Commit

Permalink
Implement loot modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
KnightMiner committed Apr 17, 2022
1 parent 388adf7 commit 38fd06f
Show file tree
Hide file tree
Showing 13 changed files with 169 additions and 84 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"type": "tconstruct:loot",
"enchantment": {
"name": "minecraft:fortune",
"level": 1
},
"single_level": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "tconstruct:loot",
"looting": 1,
"single_level": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"type": "tconstruct:loot",
"enchantment": {
"name": "minecraft:silk_touch",
"level": 1
},
"single_level": true
}
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ protected void generate() {
withL.accept(TinkerModifiers.doubleJump);
withL.accept(TinkerModifiers.flamewake);
withL.accept(TinkerModifiers.frostWalker);
withL.accept(TinkerModifiers.looting);
with.accept(ModifierIds.looting);
withL.accept(TinkerModifiers.pathMaker);
withL.accept(TinkerModifiers.plowing);
withL.accept(TinkerModifiers.pockets);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package slimeknights.tconstruct.library.modifiers.dynamic;

import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.ForgeRegistries;
import slimeknights.mantle.data.GenericLoaderRegistry.IGenericLoader;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.hooks.IArmorLootModifier;
import slimeknights.tconstruct.library.tools.context.ToolHarvestContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.utils.JsonUtils;

import javax.annotation.Nullable;
import java.util.Objects;
import java.util.function.BiConsumer;

/** Modifier to boost loot, from mobs or blocks */
@RequiredArgsConstructor
public class LootModifier extends Modifier implements IArmorLootModifier {
@Nullable
private final Enchantment enchantment;
private final int enchantmentLevel;
private final int lootingLevel;
private final boolean singleLevel;

public LootModifier(Enchantment enchantment, int level, boolean singleLevel) {
this(enchantment, level, 0, singleLevel);
}

public LootModifier(int lootingLevel, boolean singleLevel) {
this(null, 0, lootingLevel, singleLevel);
}

@Override
public Component getDisplayName(int level) {
if (singleLevel && level == 1) {
return getDisplayName();
}
return super.getDisplayName(level);
}

@Override
public int getLootingValue(IToolStackView tool, int level, LivingEntity holder, Entity target, @org.jetbrains.annotations.Nullable DamageSource damageSource, int looting) {
return looting + (this.lootingLevel * level);
}

@Override
public void applyHarvestEnchantments(IToolStackView tool, int level, ToolHarvestContext context, BiConsumer<Enchantment,Integer> consumer) {
if (enchantment != null && enchantmentLevel > 0) {
consumer.accept(enchantment, enchantmentLevel * level);
}
}

@Nullable
@Override
public <T> T getModule(Class<T> type) {
return tryModuleMatch(type, IArmorLootModifier.class, this);
}

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

/** Loader for this modifier */
public static final IGenericLoader<LootModifier> LOADER = new IGenericLoader<>() {
@Override
public LootModifier deserialize(JsonObject json) {
Enchantment enchantment = null;
int enchantmentLevel = 0;
if (json.has("enchantment")) {
JsonObject enchantmentJson = GsonHelper.getAsJsonObject(json, "enchantment");
enchantment = JsonUtils.getAsEntry(ForgeRegistries.ENCHANTMENTS, enchantmentJson, "name");
enchantmentLevel = GsonHelper.getAsInt(enchantmentJson, "level");
}
int looting = GsonHelper.getAsInt(json, "looting", 0);
boolean singleLevel = GsonHelper.getAsBoolean(json, "single_level", false);
return new LootModifier(enchantment, enchantmentLevel, looting, singleLevel);
}

@Override
public void serialize(LootModifier object, JsonObject json) {
if (object.enchantmentLevel > 0 && object.enchantment != null) {
JsonObject enchantment = new JsonObject();
enchantment.addProperty("name", Objects.requireNonNull(object.enchantment.getRegistryName()).toString());
enchantment.addProperty("level", object.enchantmentLevel);
json.add("enchantment", enchantment);
}
if (object.lootingLevel > 0) {
json.addProperty("looting", object.lootingLevel);
}
json.addProperty("single_level", object.singleLevel);
}

@Override
public LootModifier fromNetwork(FriendlyByteBuf buffer) {
int enchantmentLevel = buffer.readVarInt();
Enchantment enchantment = null;
if (enchantmentLevel > 0) {
enchantment = buffer.readRegistryIdUnsafe(ForgeRegistries.ENCHANTMENTS);
}
int lootingLevel = buffer.readVarInt();
boolean singleLevel = buffer.readBoolean();
return new LootModifier(enchantment, enchantmentLevel, lootingLevel, singleLevel);
}

@Override
public void toNetwork(LootModifier object, FriendlyByteBuf buffer) {
if (object.enchantmentLevel > 0 && object.enchantment != null) {
buffer.writeVarInt(object.enchantmentLevel);
buffer.writeRegistryIdUnsafe(ForgeRegistries.ENCHANTMENTS, object.enchantment);
} else {
buffer.writeVarInt(0);
}
buffer.writeVarInt(object.lootingLevel);
buffer.writeBoolean(object.singleLevel);
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import slimeknights.tconstruct.library.modifiers.ModifierManager;
import slimeknights.tconstruct.library.modifiers.dynamic.ConditionalDamageModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.ExtraModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.LootModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.MobDisguiseModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.StatBoostModifier;
import slimeknights.tconstruct.library.modifiers.impl.SingleLevelModifier;
Expand Down Expand Up @@ -97,7 +98,6 @@
import slimeknights.tconstruct.tools.modifiers.ability.tool.LuckModifier;
import slimeknights.tconstruct.tools.modifiers.ability.tool.MeltingModifier;
import slimeknights.tconstruct.tools.modifiers.ability.tool.OffhandAttackModifier;
import slimeknights.tconstruct.tools.modifiers.ability.tool.SilkyModifier;
import slimeknights.tconstruct.tools.modifiers.ability.tool.SpillingModifier;
import slimeknights.tconstruct.tools.modifiers.defense.BlastProtectionModifier;
import slimeknights.tconstruct.tools.modifiers.defense.DragonbornModifier;
Expand Down Expand Up @@ -179,13 +179,11 @@
import slimeknights.tconstruct.tools.modifiers.upgrades.general.SoulboundModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.general.TOPModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.harvest.BlastingModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.harvest.FortuneModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.harvest.HasteModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.harvest.HydraulicModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.harvest.LightspeedModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.FieryModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.KnockbackModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.LootingModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.PaddedModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.PiercingModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.melee.SeveringModifier;
Expand Down Expand Up @@ -258,15 +256,13 @@ public TinkerModifiers() {
public static final StaticModifier<BlastingModifier> blasting = MODIFIERS.register("blasting", BlastingModifier::new);
public static final StaticModifier<HydraulicModifier> hydraulic = MODIFIERS.register("hydraulic", HydraulicModifier::new);
public static final StaticModifier<LightspeedModifier> lightspeed = MODIFIERS.register("lightspeed", LightspeedModifier::new);
public static final StaticModifier<FortuneModifier> fortune = MODIFIERS.register("fortune", FortuneModifier::new);

// weapon
public static final StaticModifier<SwiftstrikeModifier> swiftstrike = MODIFIERS.register("swiftstrike", SwiftstrikeModifier::new);
public static final StaticModifier<KnockbackModifier> knockback = MODIFIERS.register("knockback", KnockbackModifier::new);
public static final StaticModifier<PaddedModifier> padded = MODIFIERS.register("padded", PaddedModifier::new);
public static final StaticModifier<FieryModifier> fiery = MODIFIERS.register("fiery", FieryModifier::new);
public static final StaticModifier<SeveringModifier> severing = MODIFIERS.register("severing", SeveringModifier::new);
public static final StaticModifier<LootingModifier> looting = MODIFIERS.register("looting", LootingModifier::new);

// damage boost
public static final StaticModifier<PiercingModifier> piercing = MODIFIERS.register("piercing", PiercingModifier::new);
Expand Down Expand Up @@ -324,7 +320,7 @@ public TinkerModifiers() {
// weapon
public static final StaticModifier<DuelWieldingModifier> dualWielding = MODIFIERS.register("dual_wielding", DuelWieldingModifier::new);
// harvest
public static final StaticModifier<SilkyModifier> silky = MODIFIERS.register("silky", SilkyModifier::new);
public static final DynamicModifier<Modifier> silky = MODIFIERS.registerDynamic("silky", Modifier.class);
public static final StaticModifier<AutosmeltModifier> autosmelt = MODIFIERS.register("autosmelt", AutosmeltModifier::new);
public static final StaticModifier<Modifier> expanded = MODIFIERS.register("expanded", Modifier::new);
public static final StaticModifier<ExchangingModifier> exchanging = MODIFIERS.register("exchanging", ExchangingModifier::new);
Expand Down Expand Up @@ -488,6 +484,7 @@ void registerSerializers(RegistryEvent.Register<RecipeSerializer<?>> event) {
ModifierManager.MODIFIER_LOADERS.register(TConstruct.getResource("extra_slot"), ExtraModifier.LOADER);
ModifierManager.MODIFIER_LOADERS.register(TConstruct.getResource("mob_disguise"), MobDisguiseModifier.LOADER);
ModifierManager.MODIFIER_LOADERS.register(TConstruct.getResource("conditional_damage"), ConditionalDamageModifier.LOADER);
ModifierManager.MODIFIER_LOADERS.register(TConstruct.getResource("loot"), LootModifier.LOADER);
}

@SubscribeEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public class ModifierIds {
// general abilities
public static final ModifierId reach = id("reach");

// loot
public static final ModifierId looting = id("looting");
public static final ModifierId fortune = id("fortune");

// damage boost
public static final ModifierId smite = id("smite");
public static final ModifierId baneOfSssss = id("bane_of_sssss");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.Tiers;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraftforge.common.ForgeMod;
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.data.tinkering.AbstractModifierProvider;
Expand All @@ -18,6 +19,7 @@
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.dynamic.ConditionalDamageModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.ExtraModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.LootModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.MobDisguiseModifier;
import slimeknights.tconstruct.library.modifiers.dynamic.StatBoostModifier;
import slimeknights.tconstruct.library.tools.SlotType;
Expand Down Expand Up @@ -87,6 +89,11 @@ protected void addModifiers() {
// general abilities
addModifier(ModifierIds.reach, StatBoostModifier.builder().attribute("tconstruct.modifier.reach", ForgeMod.REACH_DISTANCE.get(), Operation.ADDITION, 1, EquipmentSlot.MAINHAND, EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET).build());

// loot
addModifier(TinkerModifiers.silky, new LootModifier(Enchantments.SILK_TOUCH, 1, true));
addModifier(ModifierIds.fortune, new LootModifier(Enchantments.BLOCK_FORTUNE, 1, false));
addModifier(ModifierIds.looting, new LootModifier(1, false));

// damage boost
addModifier(ModifierIds.smite, new ConditionalDamageModifier(new MobTypePredicate(MobType.UNDEAD), 2.0f));
addModifier(ModifierIds.antiaquatic, new ConditionalDamageModifier(new MobTypePredicate(MobType.WATER), 2.0f));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import slimeknights.tconstruct.library.json.predicate.entity.MobTypePredicate;
import slimeknights.tconstruct.library.materials.definition.MaterialId;
import slimeknights.tconstruct.library.materials.definition.MaterialVariantId;
import slimeknights.tconstruct.library.modifiers.ModifierId;
import slimeknights.tconstruct.library.modifiers.util.LazyModifier;
import slimeknights.tconstruct.library.recipe.FluidValues;
import slimeknights.tconstruct.library.recipe.RandomItem;
Expand Down Expand Up @@ -984,8 +985,8 @@ private void addModifierRecipes(Consumer<FinishedRecipe> consumer) {
.saveSalvage(consumer, prefix(ModifierIds.gilded, abilitySalvage))
.save(consumer, prefix(ModifierIds.gilded, abilityFolder));
// luck is 3 recipes, similar for both so pulled into a function
luckRecipes(consumer, TinkerModifiers.luck, TinkerTags.Items.MELEE_OR_HARVEST, SlotType.ABILITY, false, abilityFolder, abilitySalvage);
luckRecipes(consumer, TinkerModifiers.looting, TinkerTags.Items.CHESTPLATES, SlotType.UPGRADE, true, upgradeFolder, upgradeSalvage);
luckRecipes(consumer, TinkerModifiers.luck.getId(), TinkerTags.Items.MELEE_OR_HARVEST, SlotType.ABILITY, false, abilityFolder, abilitySalvage);
luckRecipes(consumer, ModifierIds.looting, TinkerTags.Items.CHESTPLATES, SlotType.UPGRADE, true, upgradeFolder, upgradeSalvage);
ModifierRecipeBuilder.modifier(TinkerModifiers.luck)
.setTools(TinkerTags.Items.LEGGINGS)
.addInput(SizedIngredient.fromItems(Items.CORNFLOWER, Items.BLUE_ORCHID))
Expand Down Expand Up @@ -1571,8 +1572,8 @@ private void burningSpilling(Consumer<FinishedRecipe> consumer, FluidObject<?> f
}

/** Common logic to add recipes for luck and unarmed looting */
private void luckRecipes(Consumer<FinishedRecipe> consumer, LazyModifier modifier, TagKey<Item> tools, SlotType slotType, boolean unarmed, String folder, String salvage) {
String key = modifier.getId().getPath();
private void luckRecipes(Consumer<FinishedRecipe> consumer, ModifierId modifier, TagKey<Item> tools, SlotType slotType, boolean unarmed, String folder, String salvage) {
String key = modifier.getPath();
// level 1 always requires a slot
ModifierRecipeBuilder builder1 = ModifierRecipeBuilder.modifier(modifier)
.setTools(tools)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ protected void addMaterialTraits() {
// tier 3 - nether
addDefaultTraits(MaterialIds.cobalt, ModifierIds.lightweight);
// tier 3 - binding
addDefaultTraits(MaterialIds.darkthread, TinkerModifiers.looting);
addDefaultTraits(MaterialIds.darkthread, ModifierIds.looting);

// tier 4
addDefaultTraits(MaterialIds.queensSlime, TinkerModifiers.overlord, TinkerModifiers.overslime);
addDefaultTraits(MaterialIds.hepatizon, TinkerModifiers.momentum);
addDefaultTraits(MaterialIds.manyullyn, TinkerModifiers.insatiable);
addDefaultTraits(MaterialIds.blazingBone, TinkerModifiers.conducting);
// tier 4 - binding
addDefaultTraits(MaterialIds.ancientHide, TinkerModifiers.fortune);
addDefaultTraits(MaterialIds.ancientHide, ModifierIds.fortune);

// tier 5
addDefaultTraits(MaterialIds.enderslimeVine, TinkerModifiers.enderporting);
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit 38fd06f

Please sign in to comment.