Skip to content

Commit 1685ece

Browse files
feat: sound resolve, xp issues resolve
relates to: #57 relates to: #54 relates to: #52 relates to: #12 relates to: #47 realtes to: #44
1 parent 244e313 commit 1685ece

File tree

9 files changed

+104
-69
lines changed

9 files changed

+104
-69
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Release
33
on:
44
push:
55
tags:
6-
- "release/1.*/*"
6+
- "release/*"
77

88
jobs:
99
build:

CHANGELOG.md

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,14 @@
11
# Just Hammers Changelog
22

3-
## [21.0.3]
4-
5-
### Changed
6-
7-
- Added the hammers to the #minecraft:pickaxes tag
8-
- Hammer repair durability is now handled by a percentage based system instead of a flat amount
9-
10-
### Fixed
11-
12-
- Fixed a crashing issue on fabric due to poorly registered handlers [#38](https://github.com/nanite/JustHammers/issues/38)
13-
- The config system will now auto repair itself if it is missing a value
14-
- Actually call the blockdrops event on NeoForge
15-
16-
## [21.0.2]
3+
## [21.1.0]
174

185
### Added
196

20-
- Added a config option to disable the hammers durability from being shown in the tooltip [#22](https://github.com/nanite/JustHammers/issues/22)
21-
- Added a custom recipe type to allow for repairing the item in your crafting grid with the same material as the hammer
22-
23-
### Changed
24-
25-
- You can now enchant hammers with all the same enchantments as pickaxes [#29](https://github.com/nanite/JustHammers/issues/29)
26-
27-
### Fixed
28-
29-
- Hammer cores acting as hammers [#37](https://github.com/nanite/JustHammers/issues/37)
30-
- Hammers would apply one extra damage on break due to the hammer trying to break the same block twice [#36](https://github.com/nanite/JustHammers/issues/36)
31-
- Hammers will no longer void blocks like dirt and sand but will break slower like in vanilla [#35](https://github.com/nanite/JustHammers/issues/35)
32-
- Hammers now show in the hand correctly instead of looking like a normal item [#30](https://github.com/nanite/JustHammers/issues/30)
33-
- Hammers will no longer crash the client if durability goes negative (somehow) [#34](https://github.com/nanite/JustHammers/issues/34)
34-
35-
## [21.0.1]
36-
37-
### Fixed
38-
39-
- Unable to craft hammers due to missing recipes
40-
41-
## [21.0.0]
42-
43-
### Changed
44-
45-
- Ported to 1.21
7+
- Added a config to disable the no-breaking checks. This means, when enabled, hammers can break in the players inventory when their damage is depleted.
8+
- Added a config option to disable the "fancy" durability in the tooltip as some other mods will already provide something similar.
469

4710
### Fixed
4811

49-
- The hammers block outline would select fluids...
50-
51-
## [20.6.0]
52-
53-
### Changed
54-
55-
- Ported to 1.20.6
12+
- XP not dropping for ores and other blocks that drop XP
13+
- Sound being played for all breaking blocks which caused sound engine issues
14+
- Make netherite hammers fire resistant

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
id "architectury-plugin" version "3.4-SNAPSHOT"
3-
id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false
3+
id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false
44
id "me.modmuss50.mod-publish-plugin" version "0.5.1"
55
id 'pro.mikey.plugins.insaniam' version "0.1-SNAPSHOT"
66
}

common/src/main/java/pro/mikey/justhammers/HammerItem.java

Lines changed: 64 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,41 @@
22

33
import dev.architectury.event.EventResult;
44
import dev.architectury.event.events.common.BlockEvent;
5+
import dev.architectury.utils.value.IntValue;
56
import net.minecraft.ChatFormatting;
67
import net.minecraft.core.BlockPos;
78
import net.minecraft.core.Direction;
9+
import net.minecraft.core.Holder;
10+
import net.minecraft.core.Registry;
811
import net.minecraft.core.component.DataComponents;
12+
import net.minecraft.core.registries.BuiltInRegistries;
13+
import net.minecraft.core.registries.Registries;
914
import net.minecraft.network.chat.Component;
1015
import net.minecraft.server.level.ServerLevel;
1116
import net.minecraft.server.level.ServerPlayer;
1217
import net.minecraft.tags.BlockTags;
1318
import net.minecraft.tags.TagKey;
1419
import net.minecraft.world.entity.EquipmentSlot;
20+
import net.minecraft.world.entity.ExperienceOrb;
1521
import net.minecraft.world.entity.LivingEntity;
1622
import net.minecraft.world.entity.item.ItemEntity;
1723
import net.minecraft.world.item.*;
1824
import net.minecraft.world.item.crafting.Ingredient;
25+
import net.minecraft.world.item.enchantment.Enchantment;
26+
import net.minecraft.world.item.enchantment.EnchantmentHelper;
27+
import net.minecraft.world.item.enchantment.Enchantments;
28+
import net.minecraft.world.level.GameRules;
1929
import net.minecraft.world.level.Level;
2030
import net.minecraft.world.level.block.Block;
31+
import net.minecraft.world.level.block.Blocks;
2132
import net.minecraft.world.level.block.state.BlockState;
33+
import net.minecraft.world.level.gameevent.GameEvent;
2234
import net.minecraft.world.level.levelgen.structure.BoundingBox;
2335
import net.minecraft.world.phys.BlockHitResult;
2436
import net.minecraft.world.phys.HitResult;
2537
import org.jetbrains.annotations.NotNull;
26-
import org.jetbrains.annotations.Nullable;
2738
import pro.mikey.justhammers.config.SimpleJsonConfig;
28-
39+
import net.minecraft.world.phys.Vec3;
2940
import java.util.HashSet;
3041
import java.util.Iterator;
3142
import java.util.List;
@@ -38,17 +49,25 @@ public class HammerItem extends PickaxeItem {
3849
private final int radius;
3950

4051
public HammerItem(Tier tier, int radius, int depth, int level) {
41-
super(new WrappedTier(tier, computeDurability(tier, level)),
42-
new Item.Properties().arch$tab(Hammers.TAB)
43-
.durability(computeDurability(tier, level))
44-
.attributes(PickaxeItem.createAttributes(tier, 1, -2.8f))
45-
.component(DataComponents.TOOL, tier.createToolProperties(BlockTags.MINEABLE_WITH_PICKAXE))
46-
);
52+
super(new WrappedTier(tier, computeDurability(tier, level)), computeProperties(tier, level));
4753

4854
this.depth = depth;
4955
this.radius = radius;
5056
}
5157

58+
private static Item.Properties computeProperties(Tier tier, int level) {
59+
Properties itemProperties = new Properties().arch$tab(Hammers.TAB)
60+
.durability(computeDurability(tier, level))
61+
.attributes(PickaxeItem.createAttributes(tier, 1, -2.8f))
62+
.component(DataComponents.TOOL, tier.createToolProperties(BlockTags.MINEABLE_WITH_PICKAXE));
63+
64+
if (tier == Tiers.NETHERITE) {
65+
itemProperties.fireResistant();
66+
}
67+
68+
return itemProperties;
69+
}
70+
5271
@Override
5372
public void appendHoverText(ItemStack itemStack, TooltipContext tooltipContext, List<Component> list, TooltipFlag tooltipFlag) {
5473
list.add(Component.translatable("justhammers.tooltip.size", this.radius, this.radius, this.depth).withStyle(ChatFormatting.GRAY));
@@ -111,6 +130,10 @@ private static int computeDurability(Tier tier, int level) {
111130

112131
@Override
113132
public float getDestroySpeed(ItemStack itemStack, BlockState blockState) {
133+
if (SimpleJsonConfig.INSTANCE.allowHammerBreaking.get().getAsBoolean()) {
134+
return super.getDestroySpeed(itemStack, blockState);
135+
}
136+
114137
if (itemStack.getMaxDamage() - itemStack.getDamageValue() <= 1) {
115138
return -1f;
116139
}
@@ -162,7 +185,12 @@ public void findAndBreakNearBlocks(BlockHitResult pick, BlockPos blockPos, ItemS
162185
}
163186

164187
// Prevent the hammer from breaking if the damage is too high
165-
if (!player.isCreative() && (hammerStack.getDamageValue() + (damage + 1)) >= hammerStack.getMaxDamage() - 1) {
188+
boolean isBroken = (hammerStack.getDamageValue() + (damage + 1)) >= hammerStack.getMaxDamage() - 1;
189+
if (SimpleJsonConfig.INSTANCE.allowHammerBreaking.get().getAsBoolean()) {
190+
isBroken = hammerStack.getDamageValue() + (damage + 1) >= hammerStack.getMaxDamage();
191+
}
192+
193+
if (!player.isCreative() && isBroken) {
166194
break;
167195
}
168196

@@ -178,27 +206,50 @@ public void findAndBreakNearBlocks(BlockHitResult pick, BlockPos blockPos, ItemS
178206
}
179207

180208
// Throw event out there and let mods block us breaking this block
181-
EventResult eventResult = BlockEvent.BREAK.invoker().breakBlock(level, pos, targetState, (ServerPlayer) livingEntity, null);
209+
final int[] xp = {HammersPlatform.getBlockXpAmount(pos, targetState, level, livingEntity, hammerStack)};
210+
EventResult eventResult = BlockEvent.BREAK.invoker().breakBlock(level, pos, targetState, (ServerPlayer) livingEntity, xp[0] == -1 ? null : new IntValue() {
211+
@Override
212+
public void accept(int value) {
213+
xp[0] = value;
214+
}
215+
216+
@Override
217+
public int getAsInt() {
218+
return xp[0];
219+
}
220+
});
221+
182222
if (eventResult.isFalse()) {
183223
continue;
184224
}
185225

186-
removedPos.add(pos);
187-
level.destroyBlock(pos, false, livingEntity);
226+
final int outputXpLevel = xp[0];
227+
188228
if (!player.isCreative()) {
189229
boolean correctToolForDrops = player.hasCorrectToolForDrops(targetState);
190230
if (correctToolForDrops) {
191231
targetState.spawnAfterBreak((ServerLevel) level, pos, hammerStack, true);
192232
List<ItemStack> drops = Block.getDrops(targetState, (ServerLevel) level, pos, level.getBlockEntity(pos), livingEntity, hammerStack);
193-
194233
List<ItemEntity> dropEntities = drops.stream().map(e -> new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), e)).toList();
195234
var result = HammersPlatform.blockDropsEvent((ServerLevel) level, pos, targetState, level.getBlockEntity(pos), dropEntities, livingEntity, hammerStack);
196235
if (!result) {
197236
drops.forEach(e -> Block.popResourceFromFace(level, pos, pick.getDirection(), e));
198237
}
238+
239+
if (outputXpLevel != -1 && level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) {
240+
ExperienceOrb.award((ServerLevel) level, Vec3.atCenterOf(blockPos), outputXpLevel);
241+
}
199242
}
200243
}
201244

245+
removedPos.add(pos);
246+
targetState.getBlock().destroy(level, pos, targetState);
247+
BlockState newState = Blocks.AIR.defaultBlockState();
248+
var setResult = level.setBlock(pos, newState, 3);
249+
if (setResult) {
250+
level.gameEvent(GameEvent.BLOCK_DESTROY, blockPos, GameEvent.Context.of(livingEntity, newState));
251+
}
252+
202253
damage ++;
203254
}
204255

common/src/main/java/pro/mikey/justhammers/HammersPlatform.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import dev.architectury.injectables.annotations.ExpectPlatform;
44
import net.minecraft.core.BlockPos;
5+
import net.minecraft.world.level.Level;
6+
import net.minecraft.world.level.block.state.BlockState;
57
import net.minecraft.server.level.ServerLevel;
68
import net.minecraft.world.entity.Entity;
79
import net.minecraft.world.entity.item.ItemEntity;
@@ -20,6 +22,11 @@ public static Path getConfigDirectory() {
2022
throw new AssertionError();
2123
}
2224

25+
@ExpectPlatform
26+
public static int getBlockXpAmount(BlockPos pos, BlockState state, Level level, Entity entity, ItemStack tool) {
27+
throw new AssertionError();
28+
}
29+
2330
@ExpectPlatform
2431
public static boolean blockDropsEvent(ServerLevel level, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, List<ItemEntity> drops, @Nullable Entity breaker, ItemStack tool) {
2532
throw new AssertionError();

common/src/main/java/pro/mikey/justhammers/config/SimpleJsonConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ public enum SimpleJsonConfig {
4646
"The percentage of durability restored per repair item for netherite hammers"
4747
);
4848

49+
public final CommentedEntry allowHammerBreaking = create(
50+
"allowHammerBreaking",
51+
new JsonPrimitive(false),
52+
"Set to true to allow hammers to break when running out of durability"
53+
);
54+
4955
private JsonObject config;
5056

5157
public void load() {

fabric/src/main/java/pro/mikey/justhammers/fabric/HammersPlatformImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package pro.mikey.justhammers.fabric;
22

3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.world.level.Level;
5+
import net.minecraft.world.level.block.state.BlockState;
36
import dev.architectury.event.EventResult;
47
import net.minecraft.core.BlockPos;
58
import net.minecraft.server.level.ServerLevel;
@@ -23,6 +26,10 @@ public static Path getConfigDirectory() {
2326
return FabricLoader.getInstance().getConfigDir();
2427
}
2528

29+
public static int getBlockXpAmount(BlockPos pos, BlockState state, Level level, Entity entity, ItemStack tool) {
30+
return -1;
31+
}
32+
2633
public static boolean blockDropsEvent(ServerLevel level, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, List<ItemEntity> drops, @Nullable Entity breaker, ItemStack tool) {
2734
return false;
2835
}

gradle.properties

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
org.gradle.jvmargs=-Xmx2048M
22

3-
minecraft_version=1.21
3+
minecraft_version=1.21.1
44
enabled_platforms=fabric,neoforge
55

66
archives_base_name=just-hammers
7-
mod_version=21.0.3
7+
mod_version=21.1.0
88
maven_group=pro.mikey.mods
99

10-
architectury_version=13.0.1
10+
architectury_version=13.0.8
1111

12-
fabric_loader_version=0.15.11
13-
fabric_api_version=0.100.1+1.21
12+
fabric_loader_version=0.16.10
13+
fabric_api_version=0.115.4+1.21.1
1414

15-
neoforge_version=21.0.10-beta
15+
neoforge_version=21.1.141
1616

17-
rei_version=16.0.729
17+
rei_version=16.0.799
1818

1919
# Publishing
2020
modrinth_id=edU0NbZZ

neoforge/src/main/java/pro/mikey/justhammers/neoforge/HammersPlatformImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minecraft.world.entity.Entity;
66
import net.minecraft.world.entity.item.ItemEntity;
77
import net.minecraft.world.item.ItemStack;
8+
import net.minecraft.world.level.Level;
89
import net.minecraft.world.level.block.entity.BlockEntity;
910
import net.minecraft.world.level.block.state.BlockState;
1011
import net.neoforged.fml.loading.FMLPaths;
@@ -27,4 +28,8 @@ public static Path getConfigDirectory() {
2728
public static boolean blockDropsEvent(ServerLevel level, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, List<ItemEntity> drops, @Nullable Entity breaker, ItemStack tool) {
2829
return NeoForge.EVENT_BUS.post(new BlockDropsEvent(level, pos, state, blockEntity, drops, breaker, tool)).isCanceled();
2930
}
31+
32+
public static int getBlockXpAmount(BlockPos pos, BlockState state, Level level, Entity entity, ItemStack tool) {
33+
return state.getExpDrop(level, pos, level.getBlockEntity(pos), entity, tool);
34+
}
3035
}

0 commit comments

Comments
 (0)