Skip to content

Commit 670c221

Browse files
Fix GT shears so they behave like vanilla ones and fix #4534 (#4626)
Co-authored-by: Jurre Groenendijk <jurre@jilles.com>
1 parent 45a4931 commit 670c221

30 files changed

Lines changed: 355 additions & 52 deletions

src/generated/resources/assets/gtceu/lang/en_ud.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4815,6 +4815,7 @@
48154815
"item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§",
48164816
"item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§",
48174817
"item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§",
4818+
"item.gtceu.tool.behavior.shears": "sqoɯ puɐ sʞɔoןq sɹɐǝɥSɟ§ :ɹǝuǝpɹɐ⅁ɐ§",
48184819
"item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§",
48194820
"item.gtceu.tool.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§",
48204821
"item.gtceu.tool.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§",

src/generated/resources/assets/gtceu/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4815,6 +4815,7 @@
48154815
"item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops",
48164816
"item.gtceu.tool.behavior.remove_wax": "§6Cleaner: §fRemoves Wax",
48174817
"item.gtceu.tool.behavior.scrape": "§bPolisher: §fRemoves Oxidation",
4818+
"item.gtceu.tool.behavior.shears": "§aGardener: §fShears blocks and mobs",
48184819
"item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields",
48194820
"item.gtceu.tool.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice",
48204821
"item.gtceu.tool.behavior.strip_log": "§5Artisan: §fStrips Logs",
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"values": [
3+
"#minecraft:leaves",
4+
"#minecraft:wool",
5+
"minecraft:cobweb",
6+
"minecraft:dead_bush",
7+
"minecraft:fern",
8+
"minecraft:glow_lichen",
9+
"minecraft:hanging_roots",
10+
"minecraft:large_fern",
11+
"minecraft:nether_sprouts",
12+
"minecraft:seagrass",
13+
"minecraft:grass",
14+
"minecraft:small_dripleaf",
15+
"minecraft:tall_grass",
16+
"minecraft:tall_seagrass",
17+
"minecraft:tripwire",
18+
"minecraft:twisting_vines",
19+
"minecraft:vine",
20+
"minecraft:weeping_vines"
21+
]
22+
}

src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -345,39 +345,29 @@ default int getTotalHarvestLevel(ItemStack stack) {
345345

346346
if (!player.isShiftKeyDown()) {
347347
ServerPlayer serverPlayer = (ServerPlayer) player;
348-
int result = -1;
349-
if (isTool(stack, GTToolType.SHEARS)) {
350-
result = shearBlockRoutine(serverPlayer, stack, pos);
351-
}
352-
if (result != 0) {
353-
// prevent exploits with instantly breakable blocks
354-
BlockState state = player.level().getBlockState(pos);
355-
boolean effective = false;
356-
for (GTToolType type : getToolClasses(stack)) {
357-
if (type.harvestTags.stream().anyMatch(state::is)) {
358-
effective = true;
359-
break;
360-
}
348+
// prevent exploits with instantly breakable blocks
349+
BlockState state = player.level().getBlockState(pos);
350+
boolean effective = false;
351+
for (GTToolType type : getToolClasses(stack)) {
352+
if (type.harvestTags.stream().anyMatch(state::is)) {
353+
effective = true;
354+
break;
361355
}
356+
}
362357

363-
effective |= isToolEffective(state, getToolClasses(stack), getTotalHarvestLevel(stack));
364-
365-
if (effective) {
366-
if (areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) {
367-
if (playSoundOnBlockDestroy()) playSound(player);
368-
} else {
369-
if (result == -1) {
370-
var tag = getBehaviorsTag(stack);
371-
if (tag.getBoolean(TREE_FELLING_KEY) &&
372-
!tag.getBoolean(DISABLE_TREE_FELLING_KEY) &&
373-
state.is(BlockTags.LOGS)) {
374-
TreeFellingHelper.fellTree(stack, player.level(), state, pos, player);
375-
}
376-
if (playSoundOnBlockDestroy()) playSound(player);
377-
} else {
378-
return true;
379-
}
358+
effective |= isToolEffective(state, getToolClasses(stack), getTotalHarvestLevel(stack));
359+
360+
if (effective) {
361+
if (areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) {
362+
if (playSoundOnBlockDestroy()) playSound(player);
363+
} else {
364+
var tag = getBehaviorsTag(stack);
365+
if (tag.getBoolean(TREE_FELLING_KEY) &&
366+
!tag.getBoolean(DISABLE_TREE_FELLING_KEY) &&
367+
state.is(BlockTags.LOGS)) {
368+
TreeFellingHelper.fellTree(stack, player.level(), state, pos, player);
380369
}
370+
if (playSoundOnBlockDestroy()) playSound(player);
381371
}
382372
}
383373
}
@@ -390,7 +380,8 @@ default int getTotalHarvestLevel(ItemStack stack) {
390380
getToolStats().getBehaviors()
391381
.forEach(behavior -> behavior.onBlockDestroyed(stack, worldIn, state, pos, entityLiving));
392382

393-
if ((double) state.getDestroySpeed(worldIn, pos) != 0.0D) {
383+
if ((double) state.getDestroySpeed(worldIn, pos) != 0.0D ||
384+
getToolType().harvestTags.stream().anyMatch(state::is)) {
394385
ToolHelper.damageItem(stack, entityLiving, getToolStats().getToolDamagePerBlockBreak(stack));
395386
}
396387
if (entityLiving instanceof Player && playSoundOnBlockDestroy()) {
@@ -646,6 +637,18 @@ default Map<Enchantment, Integer> getDefaultEnchantments(ItemStack stack) {
646637
return InteractionResultHolder.pass(heldItem);
647638
}
648639

640+
default InteractionResult definition$interactLivingEntity(ItemStack stack, Player player,
641+
LivingEntity interactionTarget,
642+
InteractionHand usedHand) {
643+
for (IToolBehavior behavior : getToolStats().getBehaviors()) {
644+
if (behavior.onInteractLivingEntity(stack, player, interactionTarget, usedHand) ==
645+
InteractionResult.SUCCESS) {
646+
return InteractionResult.SUCCESS;
647+
}
648+
}
649+
return InteractionResult.PASS;
650+
}
651+
649652
default boolean definition$shouldOpenUIAfterUse(UseOnContext context) {
650653
for (IToolBehavior behavior : getToolStats().getBehaviors()) {
651654
if (!behavior.shouldOpenUIAfterUse(context)) {

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTAxeItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
109109
return definition$use(level, player, usedHand);
110110
}
111111

112+
@Override
113+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
114+
InteractionHand usedHand) {
115+
return definition$interactLivingEntity(stack, player, interactionTarget, usedHand);
116+
}
117+
112118
@Override
113119
public boolean isElectric() {
114120
return electricTier > -1;

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTHoeItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
109109
return definition$use(level, player, usedHand);
110110
}
111111

112+
@Override
113+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
114+
InteractionHand usedHand) {
115+
return definition$interactLivingEntity(stack, player, interactionTarget, usedHand);
116+
}
117+
112118
@Override
113119
public boolean isElectric() {
114120
return electricTier > -1;

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTShovelItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
109109
return definition$use(level, player, usedHand);
110110
}
111111

112+
@Override
113+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
114+
InteractionHand usedHand) {
115+
return definition$interactLivingEntity(stack, player, interactionTarget, usedHand);
116+
}
117+
112118
@Override
113119
public boolean isElectric() {
114120
return electricTier > -1;

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTSwordItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
109109
return definition$use(level, player, usedHand);
110110
}
111111

112+
@Override
113+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
114+
InteractionHand usedHand) {
115+
return definition$interactLivingEntity(stack, player, interactionTarget, usedHand);
116+
}
117+
112118
@Override
113119
public boolean isElectric() {
114120
return electricTier > -1;

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ public InteractionResultHolder<ItemStack> use(Level level, Player player, Intera
116116
return definition$use(level, player, usedHand);
117117
}
118118

119+
@Override
120+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
121+
InteractionHand usedHand) {
122+
return definition$interactLivingEntity(stack, player, interactionTarget, usedHand);
123+
}
124+
119125
@Override
120126
public boolean isElectric() {
121127
return electricTier > -1;

src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,9 @@ public class GTToolType {
264264
public static final GTToolType SHEARS = GTToolType.builder("shears")
265265
.toolTag(ToolItemTagType.MATCH, CustomTags.SHEARS)
266266
.harvestTag(CustomTags.MINEABLE_WITH_SHEARS)
267-
.toolStats(b -> b)
268-
.defaultActions(ToolActions.DEFAULT_SHEARS_ACTIONS)
267+
.toolStats(b -> b.blockBreaking().attackDamage(1.0F).attackSpeed(-2.8F)
268+
.behaviors(ShearBehavior.INSTANCE))
269+
.defaultActions(ToolActions.SHEARS_DIG)
269270
.build();
270271
public static final GTToolType DRILL_LV = GTToolType.builder("lv_drill")
271272
.idFormat("lv_%s_drill")

0 commit comments

Comments
 (0)