Skip to content

Commit

Permalink
feat: tags, fixes and more
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelHillcox committed Aug 10, 2024
1 parent 07e94c0 commit 244e313
Show file tree
Hide file tree
Showing 16 changed files with 175 additions and 35 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Just Hammers Changelog

## [21.0.3]

### Changed

- Added the hammers to the #minecraft:pickaxes tag
- Hammer repair durability is now handled by a percentage based system instead of a flat amount

### Fixed

- Fixed a crashing issue on fabric due to poorly registered handlers [#38](https://github.com/nanite/JustHammers/issues/38)
- The config system will now auto repair itself if it is missing a value
- Actually call the blockdrops event on NeoForge

## [21.0.2]

### Added
Expand Down
8 changes: 7 additions & 1 deletion common/src/main/java/pro/mikey/justhammers/HammerItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.*;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
Expand Down Expand Up @@ -189,7 +190,12 @@ public void findAndBreakNearBlocks(BlockHitResult pick, BlockPos blockPos, ItemS
if (correctToolForDrops) {
targetState.spawnAfterBreak((ServerLevel) level, pos, hammerStack, true);
List<ItemStack> drops = Block.getDrops(targetState, (ServerLevel) level, pos, level.getBlockEntity(pos), livingEntity, hammerStack);
drops.forEach(e -> Block.popResourceFromFace(level, pos, pick.getDirection(), e));

List<ItemEntity> dropEntities = drops.stream().map(e -> new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), e)).toList();
var result = HammersPlatform.blockDropsEvent((ServerLevel) level, pos, targetState, level.getBlockEntity(pos), dropEntities, livingEntity, hammerStack);
if (!result) {
drops.forEach(e -> Block.popResourceFromFace(level, pos, pick.getDirection(), e));
}
}
}

Expand Down
14 changes: 14 additions & 0 deletions common/src/main/java/pro/mikey/justhammers/HammersPlatform.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
package pro.mikey.justhammers;

import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;

import java.nio.file.Path;
import java.util.List;

public class HammersPlatform {
@ExpectPlatform
public static Path getConfigDirectory() {
// Just throw an error, the content should get replaced at runtime.
throw new AssertionError();
}

@ExpectPlatform
public static boolean blockDropsEvent(ServerLevel level, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, List<ItemEntity> drops, @Nullable Entity breaker, ItemStack tool) {
throw new AssertionError();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,16 @@ public enum SimpleJsonConfig {
"Set to true to disable the durability tooltip on hammers"
);

public final CommentedEntry durabilityPerRepairItem = create(
"durabilityPerRepairItem",
new JsonPrimitive(400),
"The amount of durability restored per repair item"
public final CommentedEntry durabilityRepairPercentage = create(
"durabilityRepairPercentage",
new JsonPrimitive(33.33D),
"The percentage of durability restored per repair item"
);

public final CommentedEntry durabilityRepairPercentageNetherite = create(
"durabilityRepairPercentageNetherite",
new JsonPrimitive(100D),
"The percentage of durability restored per repair item for netherite hammers"
);

private JsonObject config;
Expand All @@ -49,6 +55,7 @@ public void load() {

try {
config = GSON.fromJson(Files.newBufferedReader(CONFIG_FILE), JsonObject.class);
addMissingEntries();
} catch (Exception e) {
LOGGER.error("Failed to load config", e);
writeDefault();
Expand All @@ -70,6 +77,26 @@ public void writeDefault() {
}
}

public void addMissingEntries() {
var changed = false;
for (CommentedEntry entry : entries) {
if (!config.has(entry.key)) {
entry.write(config);
changed = true;
}
}

if (!changed) {
return;
}

try {
Files.write(CONFIG_FILE, GSON.toJson(config).getBytes());
} catch (Exception e) {
LOGGER.error("Failed to write default config", e);
}
}

private CommentedEntry create(String key, JsonPrimitive defaultValue, String comment) {
CommentedEntry commentedEntry = new CommentedEntry(this, key, defaultValue, comment);
entries.add(commentedEntry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import dev.architectury.registry.registries.DeferredRegister;
import dev.architectury.registry.registries.RegistrySupplier;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
Expand All @@ -14,7 +15,7 @@ public class HammerRecipes {
public static final DeferredRegister<RecipeType<?>> RECIPE_TYPES = DeferredRegister.create(Hammers.MOD_ID, Registries.RECIPE_TYPE);
public static final DeferredRegister<RecipeSerializer<?>> RECIPE_SERIALIZER = DeferredRegister.create(Hammers.MOD_ID, Registries.RECIPE_SERIALIZER);

public static final RegistrySupplier<RecipeType<RepairRecipe>> REPAIR_RECIPE = RECIPE_TYPES.register("repair", () -> RecipeType.register(ResourceLocation.fromNamespaceAndPath(Hammers.MOD_ID, "hammer_repair").toString()));
public static final RegistrySupplier<RecipeType<RepairRecipe>> REPAIR_RECIPE = RECIPE_TYPES.register("hammer_repair", () -> new RecipeType<>() {});
public static final RegistrySupplier<RecipeSerializer<RepairRecipe>> REPAIR_RECIPE_SERIALIZER = RECIPE_SERIALIZER.register("repair", () -> new SimpleCraftingRecipeSerializer<>(RepairRecipe::new));

public static void init() {
Expand Down
40 changes: 30 additions & 10 deletions common/src/main/java/pro/mikey/justhammers/recipe/RepairRecipe.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import com.mojang.datafixers.util.Pair;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.NonNullList;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.DiggerItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.CraftingInput;
import net.minecraft.world.item.crafting.CustomRecipe;
Expand Down Expand Up @@ -39,14 +42,20 @@ public RepairRecipe(CraftingBookCategory craftingBookCategory) {
// How damaged is the hammer?
var currentDamage = hammer.getDamageValue();

// Repair is calculated as a percentage of the max damage. If the max damage is 1000 and the repair percentage is 33.33%, then 333 durability is restored.
// How many items would it take to get the current damage to 0?
var neededRepairItems = (int) Math.ceil((double) currentDamage / SimpleJsonConfig.INSTANCE.durabilityPerRepairItem.get().getAsInt());
boolean isNetheriteHammer = ((DiggerItem) hammer.getItem()).getTier().getRepairIngredient().test(new ItemStack(Items.NETHERITE_INGOT));
var repairPercentage = isNetheriteHammer ? SimpleJsonConfig.INSTANCE.durabilityRepairPercentageNetherite.get().getAsDouble() : SimpleJsonConfig.INSTANCE.durabilityRepairPercentage.get().getAsDouble();
var repairAmount = Math.floor((hammer.getMaxDamage() / 100D) * repairPercentage);

// Figure out how many items are needed to repair the hammer
var neededRepairItems = Math.max(1, (int) Math.floor((double) currentDamage / repairAmount));

// Clamp the amount of items to the amount of items in the stack
neededRepairItems = Math.min(neededRepairItems, repairItem.getCount());

// Remove that amount of items from the stack used to repair the hammer
repairItem.shrink(neededRepairItems);
repairItem.shrink(neededRepairItems - 1);

// Return the remaining items
return remainingItems;
Expand All @@ -70,12 +79,24 @@ public boolean matches(CraftingInput recipeInput, Level level) {
var repairItem = repairTargets.getSecond();

var repairedHammer = hammer.copy();
var repairAmount = SimpleJsonConfig.INSTANCE.durabilityPerRepairItem.get().getAsInt() * repairItem.getCount();
// Repair is calculated as a percentage of the max damage. This assumes that the max damage is 100% meaning that if the repair percentage is 33.33%, then 33.33% of the max damage is restored.
boolean isNetheriteHammer = ((DiggerItem) hammer.getItem()).getTier().getRepairIngredient().test(new ItemStack(Items.NETHERITE_INGOT));
var percentage = isNetheriteHammer ? SimpleJsonConfig.INSTANCE.durabilityRepairPercentageNetherite.get().getAsDouble() : SimpleJsonConfig.INSTANCE.durabilityRepairPercentage.get().getAsDouble();
var repairAmount = Math.floor((hammer.getMaxDamage() / 100D) * percentage);

var currentDamage = hammer.getDamageValue();

var newDamage = Math.min(Math.max(0, currentDamage - repairAmount), hammer.getMaxDamage());
repairedHammer.setDamageValue(newDamage);
// How many items would it take to get the current damage to 0 and how many items do we have access to
var neededRepairItems = Math.max(1, (int) Math.floor((double) currentDamage / repairAmount));
var availableRepairItems = repairItem.getCount();

// Clamp the amount of items to the amount of items in the stack
neededRepairItems = Math.min(neededRepairItems, availableRepairItems);

// Take the needed repair items from the stack and times it by the repair amount to get the total repair amount
var repairAmountTotal = neededRepairItems * repairAmount;
var newDamage = Math.max(0, currentDamage - repairAmountTotal);
repairedHammer.setDamageValue((int) newDamage);

return repairedHammer;
}
Expand All @@ -92,11 +113,6 @@ public boolean canCraftInDimensions(int i, int j) {

@Nullable
private Pair<ItemStack, ItemStack> getRepairTargets(CraftingInput recipeInput) {
// Ensure we have more than 2 slots
if (recipeInput.width() < 2 || recipeInput.height() < 2) {
return null;
}

if (recipeInput.ingredientCount() != 2) {
return null;
}
Expand All @@ -117,6 +133,10 @@ private Pair<ItemStack, ItemStack> getRepairTargets(CraftingInput recipeInput) {
return null;
}

if (hammer.getDamageValue() == 0) {
return null;
}

// Get the repair material
var repairItem = ((HammerItem) hammer.getItem()).getTier().getRepairIngredient();
if (repairItem.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// 1.21 2024-07-25T14:02:24.106241 Just Hammers/Recipes
// 1.21 2024-08-10T18:18:49.132614 Just Hammers/Recipes
c873416043e364ce7d1f246e760cd82ff88084d0 data/justhammers/advancement/recipes/tools/reinforced_impact_core.json
770db99b6530b132e3aa46a37023e850c77719cc data/justhammers/recipe/reinforced_core.json
7c135c16b91a1f0c859766d4853e06e99a7af507 data/justhammers/recipe/iron_hammer.json
3dfeb37dddc1ac4d7f2af313bc6d87b27534251d data/justhammers/recipe/netherite_hammer.json
1f90d76abd8134ce788ab305442a68bd78eab719 data/justhammers/advancement/recipes/tools/diamond_destructor_hammer.json
6aa2a5f1d82ca751b336cc1b6daf2046b6528f83 data/justhammers/advancement/recipes/tools/netherite_reinforced_impact_hammer.json
7238b4229a4052e341be4149041b9258d6c05df8 data/justhammers/advancement/recipes/tools/iron_destructor_hammer.json
3955773485fb2702affa034441c965bbd9cf64d2 data/justhammers/advancement/recipes/tools/netherite_hammer.json
07816b20c47189e8368a59d9038fdc1ee9abc970 data/justhammers/advancement/recipes/tools/stone_hammer.json
3955773485fb2702affa034441c965bbd9cf64d2 data/justhammers/advancement/recipes/tools/netherite_hammer.json
4d5c47668ec41b1dbc3ad7dcce3c8b8c34165bdd data/justhammers/advancement/recipes/tools/gold_impact_hammer.json
dd0ba4267b623d288a79e46e67862dd736e730ef data/justhammers/recipe/stone_destructor_hammer.json
cca5c643dde2c7b267ad68f50057987058bd6211 data/justhammers/advancement/recipes/tools/stone_reinforced_hammer.json
Expand Down Expand Up @@ -55,6 +55,6 @@ bd3f7a17e17393374a2a91c25f6077ca60c9a657 data/justhammers/recipe/diamond_hammer.
65db0e9c8365d6bb1d6c92a4f2613faae727dfbd data/justhammers/recipe/gold_reinforced_impact_hammer.json
dbeb2ee1b90b47e9a57b8c29d2912d3cf827a05f data/justhammers/advancement/recipes/tools/reinforced_core.json
b649ca87f6eb0d8e6c451a85f1dfb028fedf6f93 data/justhammers/advancement/recipes/tools/netherite_reinforced_hammer.json
ede677891c0725814d26598735db6f6460672aaf data/justhammers/advancement/recipes/tools/stone_reinforced_impact_hammer.json
c56f61f15b1df8ad137b553b61e23374238531cc data/justhammers/advancement/recipes/tools/gold_destructor_hammer.json
ede677891c0725814d26598735db6f6460672aaf data/justhammers/advancement/recipes/tools/stone_reinforced_impact_hammer.json
fa9615ba639634649982afa022c056c9ce712c9f data/justhammers/recipe/netherite_impact_hammer.json
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
// 1.21 2024-07-25T14:02:24.10516 Just Hammers/Model Definitions
// 1.21 2024-08-10T18:18:49.1313 Just Hammers/Model Definitions
af15d8a613c9b3d3b2fafd9f589b4618a49e06d4 assets/justhammers/models/item/reinforced_core.json
39172ed7e621d3dae002c0cc8a05f8531ab9a83e assets/justhammers/models/item/netherite_hammer.json
435ab4bc67cb3396f6cee1a4acacceae90cccd4d assets/justhammers/models/item/gold_reinforced_impact_hammer.json
859daf3a5f6e27c59861a11de7a6a07b358c58ef assets/justhammers/models/item/stone_impact_hammer.json
be2e2b21b0efa819cecf0dfe4455d2bf9c1bae61 assets/justhammers/models/item/gold_hammer.json
1e5510305d71a3b4eb623252a3fc49985bb9c1fe assets/justhammers/models/item/diamond_hammer.json
a22457cf043b6159fa7add5d7c4d5261fd153a96 assets/justhammers/models/item/diamond_impact_hammer.json
18289c73818e70bbb9022c86b0ac104f586a6da8 assets/justhammers/models/item/gold_impact_hammer.json
cc6ba727edfad7f6baae5dbcf19ab00111744fde assets/justhammers/models/item/stone_reinforced_hammer.json
e1753872b6b236c5205c7108c8430a7b746f9dc6 assets/justhammers/models/item/stone_reinforced_impact_hammer.json
c0c3dc0e15f860caefff1ff8e04a5fa3588e5c2a assets/justhammers/models/item/destructor_core.json
6a01201fd726b07a8e922be9c1ef166912785fef assets/justhammers/models/item/diamond_reinforced_hammer.json
639f6ed7332a683563dd98d8337b8f38fc82d06e assets/justhammers/models/item/impact_core.json
7c2a0ad25e7591a7236de872e9063a616240799b assets/justhammers/models/item/iron_reinforced_impact_hammer.json
fe12e2a75a65763b5abfe7bc4a590c06dcb5c729 assets/justhammers/models/item/netherite_reinforced_hammer.json
786ff93f4a209b589222f8b04e9bebd90efbb52d assets/justhammers/models/item/netherite_impact_hammer.json
0a1b842f549519a8a93c8d7ddf2991f4f9c46666 assets/justhammers/models/item/gold_reinforced_hammer.json
435ab4bc67cb3396f6cee1a4acacceae90cccd4d assets/justhammers/models/item/gold_reinforced_impact_hammer.json
39172ed7e621d3dae002c0cc8a05f8531ab9a83e assets/justhammers/models/item/netherite_hammer.json
be2e2b21b0efa819cecf0dfe4455d2bf9c1bae61 assets/justhammers/models/item/gold_hammer.json
859daf3a5f6e27c59861a11de7a6a07b358c58ef assets/justhammers/models/item/stone_impact_hammer.json
6471f9d9ad496ce50a0ac3a7a81b983794730854 assets/justhammers/models/item/gold_destructor_hammer.json
c6d2f0f8c0a3ef8ec7e72fc4a66bdfb7f2b09a11 assets/justhammers/models/item/netherite_reinforced_impact_hammer.json
187ca0538543f4b4207a6a48ae433a347c993543 assets/justhammers/models/item/netherite_destructor_hammer.json
99c96c721a88fe2b1e44c721c0d4f8cae5c568c3 assets/justhammers/models/item/iron_hammer.json
ecb4259b8cfc86898fffad8ee038de7f20c45429 assets/justhammers/models/item/diamond_destructor_hammer.json
c0c3dc0e15f860caefff1ff8e04a5fa3588e5c2a assets/justhammers/models/item/destructor_core.json
6a01201fd726b07a8e922be9c1ef166912785fef assets/justhammers/models/item/diamond_reinforced_hammer.json
209d68466503f8de616ec8a0fb3b8eea38c4ec2d assets/justhammers/models/item/iron_destructor_hammer.json
b271d5334779ed7168a60128122e32020ba2e9be assets/justhammers/models/item/stone_destructor_hammer.json
639f6ed7332a683563dd98d8337b8f38fc82d06e assets/justhammers/models/item/impact_core.json
7c2a0ad25e7591a7236de872e9063a616240799b assets/justhammers/models/item/iron_reinforced_impact_hammer.json
f09440affe732c1ce3e9fc8860d19380e13381af assets/justhammers/models/item/iron_reinforced_hammer.json
871b486e71d948e25854d62f2ba6c0231cbc921b assets/justhammers/models/item/iron_impact_hammer.json
fe12e2a75a65763b5abfe7bc4a590c06dcb5c729 assets/justhammers/models/item/netherite_reinforced_hammer.json
51b14b9ca563670a5e6906d7b92dac64dd2e7e03 assets/justhammers/models/item/reinforced_impact_core.json
a206fec3126dedfd18d855815d596548f9aa6782 assets/justhammers/models/item/stone_hammer.json
c369f0809c2d052fd0f0035c471de0ce604bf514 assets/justhammers/models/item/diamond_reinforced_impact_hammer.json
786ff93f4a209b589222f8b04e9bebd90efbb52d assets/justhammers/models/item/netherite_impact_hammer.json
0a1b842f549519a8a93c8d7ddf2991f4f9c46666 assets/justhammers/models/item/gold_reinforced_hammer.json
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// 1.21 2024-07-25T14:02:24.104203 Just Hammers/Language (en_us)
// 1.21 2024-08-10T18:18:49.130628 Just Hammers/Language (en_us)
35eb489b75622d3a6de2a4646dd60da205f971c0 assets/justhammers/lang/en_us.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// 1.21 2024-07-25T14:02:24.106031 Just Hammers/Tags for minecraft:item
// 1.21 2024-08-10T18:18:49.132366 Just Hammers/Tags for minecraft:item
8f00d59c4ee4152476a67d97c79144ff77644f0e data/minecraft/tags/item/enchantable/vanishing.json
8f00d59c4ee4152476a67d97c79144ff77644f0e data/minecraft/tags/item/pickaxes.json
8f00d59c4ee4152476a67d97c79144ff77644f0e data/minecraft/tags/item/enchantable/durability.json
8f00d59c4ee4152476a67d97c79144ff77644f0e data/justhammers/tags/item/hammer.json
8f00d59c4ee4152476a67d97c79144ff77644f0e data/minecraft/tags/item/enchantable/mining_loot.json
Expand Down
29 changes: 29 additions & 0 deletions fabric/src/main/generated/data/minecraft/tags/item/pickaxes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"values": [
"justhammers:stone_hammer",
"justhammers:iron_hammer",
"justhammers:gold_hammer",
"justhammers:diamond_hammer",
"justhammers:netherite_hammer",
"justhammers:stone_impact_hammer",
"justhammers:iron_impact_hammer",
"justhammers:gold_impact_hammer",
"justhammers:diamond_impact_hammer",
"justhammers:netherite_impact_hammer",
"justhammers:stone_reinforced_hammer",
"justhammers:iron_reinforced_hammer",
"justhammers:gold_reinforced_hammer",
"justhammers:diamond_reinforced_hammer",
"justhammers:netherite_reinforced_hammer",
"justhammers:stone_reinforced_impact_hammer",
"justhammers:iron_reinforced_impact_hammer",
"justhammers:gold_reinforced_impact_hammer",
"justhammers:diamond_reinforced_impact_hammer",
"justhammers:netherite_reinforced_impact_hammer",
"justhammers:stone_destructor_hammer",
"justhammers:iron_destructor_hammer",
"justhammers:gold_destructor_hammer",
"justhammers:diamond_destructor_hammer",
"justhammers:netherite_destructor_hammer"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ protected void addTags(HolderLookup.Provider wrapperLookup) {
tag(ItemTags.MINING_ENCHANTABLE).addAll(hammers);

tag(HammerTags.HAMMERS).addAll(hammers);
tag(ItemTags.PICKAXES).addAll(hammers);
}
}

Expand Down
Loading

0 comments on commit 244e313

Please sign in to comment.