Skip to content

Commit

Permalink
Migrate repair factor to a modifier hook
Browse files Browse the repository at this point in the history
Added repair modifier module to increase/decrease repair amount]
Migrate cultivated to dynamic modifiers
Added 50% repair efficiency bonus to the emerald modifier
  • Loading branch information
KnightMiner committed Aug 9, 2023
1 parent 99af4c5 commit 09626c7
Show file tree
Hide file tree
Showing 16 changed files with 145 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"type": "tconstruct:composable",
"level_display": "tconstruct:default",
"tooltip_display": "always",
"modules": [
{
"type": "tconstruct:repair",
"leveling": 0.5
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
"operation": "multiply_base",
"value": 0.5
},
{
"type": "tconstruct:repair",
"leveling": 0.5
},
{
"type": "tconstruct:tool_stat",
"stat": "tconstruct:knockback_resistance",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,13 +428,8 @@ public int onDamageTool(IToolStackView tool, int level, int amount, @Nullable Li
return amount;
}

/**
* Called when the tool is repair. Can be used to decrease, increase, or cancel the repair.
* @param toolStack Tool stack
* @param level Tool level
* @param factor Original factor
* @return Replacement factor. Returning 0 prevents repair
*/
/** @deprecated use {@link slimeknights.tconstruct.library.modifiers.hook.RepairFactorModifierHook} */
@Deprecated
public float getRepairFactor(IToolStackView toolStack, int level, float factor) {
return factor;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import slimeknights.tconstruct.library.modifiers.hook.PlantHarvestModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileHitModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.RepairFactorModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ShearsModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ToolActionModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.TooltipModifierHook;
Expand Down Expand Up @@ -99,6 +100,9 @@ public void onEquipmentChange(IToolStackView tool, ModifierEntry modifier, Equip
}
});

/** Hook for modifying the repair amount for tools */
public static final ModifierHook<RepairFactorModifierHook> REPAIR_FACTOR = register("repair_factor", RepairFactorModifierHook.class, RepairFactorModifierHook.ComposeMerger::new, (tool, entry, factor) -> entry.getModifier().getRepairFactor(tool, entry.getLevel(), factor));


/* Composable only */

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package slimeknights.tconstruct.library.modifiers.hook;

import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

import java.util.Collection;

/** Hook called when repairing a tool to allow modifiers to adjust repair amount */
public interface RepairFactorModifierHook {
/**
* Called when the tool is repair. Can be used to decrease, increase, or cancel the repair.
* @param tool Tool stack
* @param entry Modifier and level
* @param factor Original factor
* @return Replacement factor. Returning 0 prevents repair
*/
float getRepairFactor(IToolStackView tool, ModifierEntry entry, float factor);

/** Merger that composes all submodules */
record ComposeMerger(Collection<RepairFactorModifierHook> modules) implements RepairFactorModifierHook {
@Override
public float getRepairFactor(IToolStackView tool, ModifierEntry entry, float factor) {
for (RepairFactorModifierHook module : modules) {
factor = module.getRepairFactor(tool, entry, factor);
}
return factor;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package slimeknights.tconstruct.library.modifiers.modules;

import com.google.gson.JsonObject;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.util.GsonHelper;
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.RepairFactorModifierHook;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

import java.util.List;

/** Module for multiplying tool repair */
public record RepairModule(float flat, float leveling) implements RepairFactorModifierHook, ModifierModule {
private static final List<ModifierHook<?>> DEFAULT_HOOKS = List.of(TinkerHooks.REPAIR_FACTOR);

@Override
public float getRepairFactor(IToolStackView tool, ModifierEntry entry, float factor) {
factor *= (1 + (entry.getEffectiveLevel(tool) * leveling) + flat);
return factor;
}

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

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

public static final IGenericLoader<RepairModule> LOADER = new IGenericLoader<>() {
@Override
public RepairModule deserialize(JsonObject json) {
float flat = GsonHelper.getAsFloat(json, "flat", 0);
float leveling = GsonHelper.getAsFloat(json, "leveling", 0);
return new RepairModule(flat, leveling);
}

@Override
public void serialize(RepairModule object, JsonObject json) {
if (object.flat != 0) {
json.addProperty("flat", object.flat);
}
if (object.leveling != 0) {
json.addProperty("leveling", object.leveling);
}
}

@Override
public RepairModule fromNetwork(FriendlyByteBuf buffer) {
float flat = buffer.readFloat();
float leveling = buffer.readFloat();
return new RepairModule(flat, leveling);
}

@Override
public void toNetwork(RepairModule object, FriendlyByteBuf buffer) {
buffer.writeFloat(object.flat);
buffer.writeFloat(object.leveling);
}
};


/* Helpers */

public static RepairModule flat(float value) {
return new RepairModule(value, 0);
}

public static RepairModule leveling(float leveling) {
return new RepairModule(0, leveling);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierId;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.recipe.tinkerstation.repairing.ModifierRepairRecipeSerializer.IModifierRepairRecipe;
import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil;
import slimeknights.tconstruct.library.tools.nbt.ToolStack;
Expand Down Expand Up @@ -99,7 +100,7 @@ public ItemStack assemble(CraftingContainer inv) {
float repairAmount = inputs.getSecond();
ToolStack tool = inputs.getFirst();
for (ModifierEntry entry : tool.getModifierList()) {
repairAmount = entry.getModifier().getRepairFactor(tool, entry.getLevel(), repairAmount);
repairAmount = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, repairAmount);
if (repairAmount <= 0) {
// failed to repair
return ItemStack.EMPTY;
Expand All @@ -125,7 +126,7 @@ public NonNullList<ItemStack> getRemainingItems(CraftingContainer inv) {
float repairFloat = tool.getModifierLevel(modifier) * repairAmount;
if (repairFloat > 0) {
for (ModifierEntry entry : tool.getModifierList()) {
repairFloat = entry.getModifier().getRepairFactor(tool, entry.getLevel(), repairFloat);
repairFloat = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, repairFloat);
if (repairFloat <= 0) {
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierId;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.recipe.modifiers.adding.IncrementalModifierRecipe;
import slimeknights.tconstruct.library.recipe.tinkerstation.IMutableTinkerStationContainer;
import slimeknights.tconstruct.library.recipe.tinkerstation.ITinkerStationContainer;
Expand Down Expand Up @@ -55,7 +56,7 @@ public ValidatedResult getValidatedResult(ITinkerStationContainer inv) {
// apply modifiers to possibly boost it
float repairFactor = 1;
for (ModifierEntry entry : tool.getModifierList()) {
repairFactor = entry.getModifier().getRepairFactor(tool, entry.getLevel(), repairFactor);
repairFactor = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, repairFactor);
if (repairFactor <= 0) {
return ValidatedResult.PASS;
}
Expand Down Expand Up @@ -85,7 +86,7 @@ public void updateInputs(ItemStack result, IMutableTinkerStationContainer inv, b
// rescale the amount based on modifiers
float repairFactor = 1.0f;
for (ModifierEntry entry : tool.getModifierList()) {
repairFactor = entry.getModifier().getRepairFactor(tool, entry.getLevel(), repairFactor);
repairFactor = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, repairFactor);
if (repairFactor <= 0) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import slimeknights.tconstruct.library.materials.definition.MaterialId;
import slimeknights.tconstruct.library.materials.stats.MaterialStatsId;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.recipe.material.MaterialRecipe;
import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
Expand Down Expand Up @@ -120,7 +121,7 @@ public ItemStack assemble(CraftingContainer inv) {
// adjust the factor based on modifiers
// main example is wood, +25% per level
for (ModifierEntry entry : tool.getModifierList()) {
repairAmount = entry.getModifier().getRepairFactor(tool, entry.getLevel(), repairAmount);
repairAmount = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, repairAmount);
if (repairAmount <= 0) {
// failed to repair
return tool.createStack();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public ValidatedResult getValidatedResult(ITinkerStationContainer inv) {
// apply modifier repair boost
float factor = cost / MaterialRecipe.INGOTS_PER_REPAIR;
for (ModifierEntry entry : tool.getModifierList()) {
factor = entry.getModifier().getRepairFactor(tool, entry.getLevel(), factor);
factor = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, factor);
if (factor <= 0) {
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import slimeknights.tconstruct.library.materials.definition.MaterialId;
import slimeknights.tconstruct.library.materials.stats.MaterialStatsId;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.recipe.material.MaterialRecipe;
import slimeknights.tconstruct.library.recipe.tinkerstation.IMutableTinkerStationContainer;
import slimeknights.tconstruct.library.recipe.tinkerstation.ITinkerStationContainer;
Expand Down Expand Up @@ -250,7 +251,7 @@ protected int repairFromSlot(ToolStack tool, MaterialId primaryMaterial, ITinker
// adjust the factor based on modifiers
// main example is wood, +25% per level
for (ModifierEntry entry : tool.getModifierList()) {
durabilityPerItem = entry.getModifier().getRepairFactor(tool, entry.getLevel(), durabilityPerItem);
durabilityPerItem = entry.getHook(TinkerHooks.REPAIR_FACTOR).getRepairFactor(tool, entry, durabilityPerItem);
if (durabilityPerItem <= 0) {
return 0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import slimeknights.tconstruct.library.modifiers.modules.ModifierModule;
import slimeknights.tconstruct.library.modifiers.modules.ModifierSlotModule;
import slimeknights.tconstruct.library.modifiers.modules.RarityModule;
import slimeknights.tconstruct.library.modifiers.modules.RepairModule;
import slimeknights.tconstruct.library.modifiers.modules.SwappableSlotModule;
import slimeknights.tconstruct.library.modifiers.modules.ToolActionsModule;
import slimeknights.tconstruct.library.modifiers.modules.ToolStatModule;
Expand Down Expand Up @@ -166,7 +167,6 @@
import slimeknights.tconstruct.tools.modifiers.slotless.OverslimeModifier;
import slimeknights.tconstruct.tools.modifiers.slotless.StatOverrideModifier;
import slimeknights.tconstruct.tools.modifiers.traits.DamageSpeedTradeModifier;
import slimeknights.tconstruct.tools.modifiers.traits.general.CultivatedModifier;
import slimeknights.tconstruct.tools.modifiers.traits.general.DenseModifier;
import slimeknights.tconstruct.tools.modifiers.traits.general.EnderportingModifier;
import slimeknights.tconstruct.tools.modifiers.traits.general.OvercastModifier;
Expand Down Expand Up @@ -427,7 +427,6 @@ public TinkerModifiers() {
public static final StaticModifier<StatOverrideModifier> statOverride = MODIFIERS.register("stat_override", StatOverrideModifier::new);

// traits - tier 1
public static final StaticModifier<CultivatedModifier> cultivated = MODIFIERS.register("cultivated", CultivatedModifier::new);
public static final StaticModifier<DamageSpeedTradeModifier> jagged = MODIFIERS.register("jagged", () -> new DamageSpeedTradeModifier(0.005f));
public static final StaticModifier<DamageSpeedTradeModifier> stonebound = MODIFIERS.register("stonebound", () -> new DamageSpeedTradeModifier(-0.005f));
// traits - tier 1 nether
Expand Down Expand Up @@ -604,6 +603,7 @@ void registerSerializers(RegistryEvent.Register<RecipeSerializer<?>> event) {
ModifierModule.LOADER.register(TConstruct.getResource("swappable_bonus_slot"), SwappableSlotModule.BonusSlot.LOADER);
ModifierModule.LOADER.register(TConstruct.getResource("mob_effect"), MobEffectModule.LOADER);
ModifierModule.LOADER.register(TConstruct.getResource("mob_disguise"), MobDisguiseModule.LOADER);
ModifierModule.LOADER.register(TConstruct.getResource("repair"), RepairModule.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 @@ -72,6 +72,7 @@ public class ModifierIds {


// traits - tier 1
public static final ModifierId cultivated = id("cultivated");
public static final ModifierId stringy = id("stringy");
public static final ModifierId flexible = id("flexible");
// traits - tier 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import slimeknights.tconstruct.library.modifiers.modules.MobEffectModule;
import slimeknights.tconstruct.library.modifiers.modules.ModifierSlotModule;
import slimeknights.tconstruct.library.modifiers.modules.RarityModule;
import slimeknights.tconstruct.library.modifiers.modules.RepairModule;
import slimeknights.tconstruct.library.modifiers.modules.SwappableSlotModule;
import slimeknights.tconstruct.library.modifiers.modules.ToolStatModule;
import slimeknights.tconstruct.library.modifiers.modules.VolatileFlagModule;
Expand Down Expand Up @@ -98,6 +99,7 @@ protected void addModifiers() {
.levelDisplay(ModifierLevelDisplay.SINGLE_LEVEL)
.addModule(new RarityModule(Rarity.UNCOMMON))
.addModule(ToolStatModule.multiplyBase(ToolStats.DURABILITY, 0.5f))
.addModule(RepairModule.leveling(0.5f))
// armor
.addModule(ToolStatModule.add(ToolStats.KNOCKBACK_RESISTANCE, 0.05f))
// melee harvest
Expand Down Expand Up @@ -212,6 +214,7 @@ protected void addModifiers() {
buildModifier(ModifierIds.snowBoots).addModule(new VolatileFlagModule(ModifiableArmorItem.SNOW_BOOTS)).tooltipDisplay(TooltipDisplay.NEVER);

// traits - tier 1
buildModifier(ModifierIds.cultivated).addModule(RepairModule.leveling(0.5f));
addModifier(ModifierIds.stringy, new Modifier());
buildModifier(ModifierIds.flexible).addModule(ToolStatModule.add(ToolStats.VELOCITY, 0.1f)).addModule(ToolStatModule.multiplyAll(ToolStats.PROJECTILE_DAMAGE, -0.1f));
// traits - tier 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public String getName() {
@Override
protected void addMaterialTraits() {
// tier 1
addDefaultTraits(MaterialIds.wood, TinkerModifiers.cultivated);
addDefaultTraits(MaterialIds.wood, ModifierIds.cultivated);
addDefaultTraits(MaterialIds.rock, TinkerModifiers.stonebound);
addDefaultTraits(MaterialIds.flint, TinkerModifiers.jagged);
addDefaultTraits(MaterialIds.bone, TinkerModifiers.piercing);
Expand Down

This file was deleted.

0 comments on commit 09626c7

Please sign in to comment.