Skip to content

Commit

Permalink
Merge armor/held haste and knockback to make it easier to understand
Browse files Browse the repository at this point in the history
Not merging lightspeed as those two are distinct enough
Means the melee enchant can now be extracted into a crystal for armor
  • Loading branch information
KnightMiner committed Jan 4, 2023
1 parent 1c40af4 commit 0cf8056
Show file tree
Hide file tree
Showing 25 changed files with 94 additions and 134 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
"slots": {
"upgrades": 1
},
"modifier": "tconstruct:knockback_armor",
"modifier": "tconstruct:knockback",
"min_level": 1
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@
"amount_per_item": 9,
"needed_per_level": 45,
"leftover": "minecraft:redstone",
"tools": {
"tag": "tconstruct:modifiable/harvest"
},
"tools": [
{
"tag": "tconstruct:modifiable/harvest"
},
{
"tag": "tconstruct:modifiable/armor/chestplate"
}
],
"slots": {
"upgrades": 1
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
},
"amount_per_item": 1,
"needed_per_level": 45,
"tools": {
"tag": "tconstruct:modifiable/harvest"
},
"tools": [
{
"tag": "tconstruct:modifiable/harvest"
},
{
"tag": "tconstruct:modifiable/armor/chestplate"
}
],
"slots": {
"upgrades": 1
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
},
"allow_crystal": true,
"result": {
"name": "tconstruct:knockback_armor",
"name": "tconstruct:knockback",
"level": 1
},
"max_level": 3
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:haste"
}
]
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,7 @@
{
"type": "tconstruct:stat_boost",
"level_display": "tconstruct:default",
"attributes": [
"redirects": [
{
"unique": "tconstruct.modifier.armor_knockback",
"attribute": "minecraft:generic.attack_knockback",
"operation": "addition",
"amount": 1.0,
"slots": [
"feet",
"legs",
"chest",
"head"
]
"id": "tconstruct:knockback"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public static ModifierAttribute fromNetwork(FriendlyByteBuf buffer) {
}

/** Gets the UUID from a name */
private static UUID getUUID(String name, EquipmentSlot slot) {
public static UUID getUUID(String name, EquipmentSlot slot) {
return UUID.nameUUIDFromBytes((name + "." + slot.getName()).getBytes());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@
import slimeknights.tconstruct.tools.modifiers.traits.skull.WildfireModifier;
import slimeknights.tconstruct.tools.modifiers.traits.skull.WitheredModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.FeatherFallingModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.HasteArmorModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.HasteModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.ItemFrameModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.LeapingModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.LightspeedArmorModifier;
Expand Down Expand Up @@ -279,7 +279,7 @@ public TinkerModifiers() {
public static final StaticModifier<NearsightedModifier> nearsighted = MODIFIERS.register("nearsighted", NearsightedModifier::new);

// harvest
public static final DynamicModifier<Modifier> haste = MODIFIERS.registerDynamic("haste", Modifier.class);
public static final StaticModifier<HasteModifier> haste = MODIFIERS.register("haste", HasteModifier::new);
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);
Expand Down Expand Up @@ -332,7 +332,6 @@ public TinkerModifiers() {
public static final StaticModifier<SlurpingModifier> slurping = MODIFIERS.register("slurping", SlurpingModifier::new);
public static final StaticModifier<TotalArmorLevelModifier> aquaAffinity = MODIFIERS.register("aqua_affinity", () -> new TotalArmorLevelModifier(TinkerDataKeys.AQUA_AFFINITY, true));
// chestplate
public static final StaticModifier<HasteArmorModifier> hasteArmor = MODIFIERS.register("haste_armor", HasteArmorModifier::new);
public static final StaticModifier<UnarmedModifier> ambidextrous = MODIFIERS.register("ambidextrous", UnarmedModifier::new);
/** Renaming this but some addon is probably using it. You might want {@link #ambidextrous}, but you might simply want to update your logic */
@Deprecated
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ public class ModifierIds {
// defense
public static final ModifierId revitalizing = id("revitalizing");
// chestplate
public static final ModifierId knockbackArmor = id("knockback_armor");
public static final ModifierId strength = id("strength");
// leggings
public static final ModifierId pockets = id("pockets");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ protected void addModifiers() {
addRedirect(id("hoe_till"), redirect(TinkerModifiers.tilling.getId()));
addRedirect(id("firestarter_hidden"), redirect(TinkerModifiers.firestarter.getId()));

// merged some armor modifiers
addRedirect(id("haste_armor"), redirect(TinkerModifiers.haste.getId()));
addRedirect(id("knockback_armor"), redirect(TinkerModifiers.knockback.getId()));

// unarmed rework
addRedirect(id("unarmed"), redirect(TinkerModifiers.ambidextrous.getId()));

Expand Down Expand Up @@ -152,9 +156,6 @@ protected void addModifiers() {
LivingEntityPredicate.OR.create(new MobTypePredicate(MobType.ILLAGER), new TagEntityPredicate(TinkerTags.EntityTypes.VILLAGERS)), 2.0f));
addRedirect(id("fractured"), redirect(ModifierIds.sharpness));

// harvest
addModifier(TinkerModifiers.haste, StatBoostModifier.builder().add(ToolStats.MINING_SPEED, 4f).display(new UniqueForLevels(5)).build());

// ranged
addModifier(ModifierIds.power, StatBoostModifier.builder().add(ToolStats.PROJECTILE_DAMAGE, 0.5f).build());
addModifier(ModifierIds.quickCharge, StatBoostModifier.builder().multiplyBase(ToolStats.DRAW_SPEED, 0.25f).build());
Expand All @@ -169,7 +170,6 @@ protected void addModifiers() {
// TODO: floor?
addModifier(ModifierIds.revitalizing, StatBoostModifier.builder().attribute("tconstruct.modifier.revitalizing", Attributes.MAX_HEALTH, Operation.ADDITION, 2, armorSlots).build());
// chestplate
addModifier(ModifierIds.knockbackArmor, StatBoostModifier.builder().attribute("tconstruct.modifier.armor_knockback", Attributes.ATTACK_KNOCKBACK, Operation.ADDITION, 1, armorSlots).build());
addModifier(ModifierIds.strength, StatBoostModifier.builder().attribute("tconstruct.modifier.strength", Attributes.ATTACK_DAMAGE, Operation.MULTIPLY_TOTAL, 0.1f, armorSlots).build());
addRedirect(id("armor_power"), redirect(ModifierIds.strength));
// leggings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,7 @@ private void addModifierRecipes(Consumer<FinishedRecipe> consumer) {
*/

// haste can use redstone or blocks
hasteRecipes(consumer, TinkerModifiers.haste.getId(), Ingredient.of(TinkerTags.Items.HARVEST), 5, upgradeFolder, null);
// migration for 1.16 worlds
hasteRecipes(consumer, TinkerModifiers.haste.getId(), ingredientFromTags(TinkerTags.Items.HARVEST, TinkerTags.Items.CHESTPLATES), 5, null, upgradeSalvage);
hasteRecipes(consumer, TinkerModifiers.haste.getId(), ingredientFromTags(TinkerTags.Items.HARVEST, TinkerTags.Items.CHESTPLATES), 5, upgradeFolder, upgradeSalvage);
IncrementalModifierRecipeBuilder.modifier(TinkerModifiers.blasting)
.setTools(TinkerTags.Items.STONE_HARVEST)
.setInput(Tags.Items.GUNPOWDER, 1, 20)
Expand Down Expand Up @@ -780,15 +778,14 @@ private void addModifierRecipes(Consumer<FinishedRecipe> consumer) {
.saveSalvage(consumer, prefix(TinkerModifiers.itemFrame, upgradeSalvage))
.save(consumer, prefix(TinkerModifiers.itemFrame, upgradeFolder));
// upgrade - chestplate
hasteRecipes(consumer, TinkerModifiers.hasteArmor.getId(), Ingredient.of(TinkerTags.Items.CHESTPLATES), 5, upgradeFolder, upgradeSalvage);
ModifierRecipeBuilder.modifier(ModifierIds.knockbackArmor)
ModifierRecipeBuilder.modifier(TinkerModifiers.knockback)
.setTools(TinkerTags.Items.CHESTPLATES)
.addInput(Items.PISTON)
.addInput(TinkerWorld.slime.get(SlimeType.EARTH))
.setSlots(SlotType.UPGRADE, 1)
.setMaxLevel(3)
.saveSalvage(consumer, prefix(ModifierIds.knockbackArmor, upgradeSalvage))
.save(consumer, prefix(ModifierIds.knockbackArmor, upgradeFolder));
.saveSalvage(consumer, wrap(TinkerModifiers.knockback, upgradeSalvage, "_armor"))
.save(consumer, wrap(TinkerModifiers.knockback, upgradeFolder, "_armor"));
// upgrade - leggings
hasteRecipes(consumer, ModifierIds.speedy, Ingredient.of(TinkerTags.Items.LEGGINGS), 3, upgradeFolder, upgradeSalvage);
// leaping lets you disable skyslime geodes in case you don't like fun
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
import slimeknights.tconstruct.library.utils.BlockSideHitListener;
import slimeknights.tconstruct.tools.TinkerModifiers;
import slimeknights.tconstruct.tools.modifiers.defense.ProjectileProtectionModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.HasteArmorModifier;
import slimeknights.tconstruct.tools.modifiers.upgrades.armor.HasteModifier;

import java.util.List;
import java.util.Objects;
Expand Down Expand Up @@ -112,7 +112,7 @@ static void onBreakSpeed(PlayerEvent.BreakSpeed event) {
}

// next, add in armor haste
float armorHaste = ModifierUtil.getTotalModifierFloat(player, HasteArmorModifier.HASTE);
float armorHaste = ModifierUtil.getTotalModifierFloat(player, HasteModifier.HASTE);
if (armorHaste > 0) {
// adds in 10% per level
event.setNewSpeed(event.getNewSpeed() * (1 + 0.1f * armorHaste));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,49 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.TooltipFlag;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.library.modifiers.impl.IncrementalArmorLevelModifier;
import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay;
import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay.UniqueForLevels;
import slimeknights.tconstruct.library.tools.capability.TinkerDataCapability.TinkerDataKey;
import slimeknights.tconstruct.library.tools.context.ToolRebuildContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.stat.ModifierStatsBuilder;
import slimeknights.tconstruct.library.tools.stat.ToolStats;
import slimeknights.tconstruct.library.utils.TooltipKey;
import slimeknights.tconstruct.library.utils.Util;
import slimeknights.tconstruct.tools.TinkerModifiers;

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

public class HasteArmorModifier extends IncrementalArmorLevelModifier {
public class HasteModifier extends IncrementalArmorLevelModifier {
private static final Component MINING_SPEED = TConstruct.makeTranslation("modifier", "fake_attribute.mining_speed");
/** Player modifier data key for haste */
public static final TinkerDataKey<Float> HASTE = TConstruct.createKey("haste");

public HasteArmorModifier() {
private static final ModifierLevelDisplay NAME = new UniqueForLevels(5);

public HasteModifier() {
super(HASTE);
}

@Override
public Component getDisplayName() {
return super.getDisplayName();
public Component getDisplayName(int level) {
return NAME.nameForLevel(this, level);
}

@Override
public Component getDisplayName(int level) {
if (TinkerModifiers.haste.isBound()) {
return TinkerModifiers.haste.get().getDisplayName(level);
}
return super.getDisplayName(level);
public void addToolStats(ToolRebuildContext context, int level, ModifierStatsBuilder builder) {
ToolStats.MINING_SPEED.add(builder, 4 * getEffectiveLevel(context, level));
}

@Override
public void addInformation(IToolStackView tool, int level, @Nullable Player player, List<Component> tooltip, TooltipKey tooltipKey, TooltipFlag tooltipFlag) {
double boost = 0.1 * getScaledLevel(tool, level);
if (boost != 0) {
tooltip.add(applyStyle(new TextComponent(Util.PERCENT_BOOST_FORMAT.format(boost)).append(" ").append(MINING_SPEED)));
if (tool.hasTag(TinkerTags.Items.ARMOR)) {
double boost = 0.1 * getScaledLevel(tool, level);
if (boost != 0) {
tooltip.add(applyStyle(new TextComponent(Util.PERCENT_BOOST_FORMAT.format(boost)).append(" ").append(MINING_SPEED)));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,41 @@
package slimeknights.tconstruct.tools.modifiers.upgrades.melee;

import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.EquipmentSlot.Type;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.AttributeModifier.Operation;
import net.minecraft.world.entity.ai.attributes.Attributes;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.util.ModifierAttribute;
import slimeknights.tconstruct.library.tools.context.ToolAttackContext;
import slimeknights.tconstruct.library.tools.definition.ModifiableArmorMaterial;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;

import java.util.UUID;
import java.util.function.BiConsumer;

public class KnockbackModifier extends Modifier {
private static final UUID[] UUIDS = new UUID[4];
static {
for (EquipmentSlot slot : ModifiableArmorMaterial.ARMOR_SLOTS) {
UUIDS[slot.getIndex()] = ModifierAttribute.getUUID("tconstruct.knockback", slot);
}
}

@Override
public float beforeEntityHit(IToolStackView tool, int level, ToolAttackContext context, float damage, float baseKnockback, float knockback) {
return knockback + level * 0.5f;
// do not boost unarmed attacks twice, thats a bit too much knockback for the cost
if (!context.getAttacker().getItemInHand(context.getHand()).isEmpty()) {
return knockback + level * 0.5f;
}
return knockback;
}

@Override
public void addAttributes(IToolStackView tool, int level, EquipmentSlot slot, BiConsumer<Attribute,AttributeModifier> consumer) {
if (slot.getType() == Type.ARMOR) {
consumer.accept(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(UUIDS[slot.getIndex()], "tconstruct.knockback." + slot.getName(), 1 * getEffectiveLevel(tool, level), Operation.ADDITION));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"modifier_id": "tconstruct:haste_armor",
"modifier_id": "tconstruct:haste",
"text": [
{
"text": "Grants +10% mining speed per level for all held tools."
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"modifier_id": "tconstruct:knockback_armor",
"modifier_id": "tconstruct:knockback",
"text": [
{
"text": "Grants 1 knockback per level to all weapons, which launches a mob roughly 2 blocks. Most tools start with 0.4 knockback."
Expand Down

0 comments on commit 0cf8056

Please sign in to comment.