Hammers
This commit is contained in:
parent
22a6331496
commit
b014f9b0dd
7 changed files with 137 additions and 9 deletions
|
@ -1,6 +1,12 @@
|
||||||
package ru.betterend;
|
package ru.betterend;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
|
import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags;
|
||||||
|
import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl;
|
||||||
|
import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import ru.betterend.config.MainConfig;
|
import ru.betterend.config.MainConfig;
|
||||||
import ru.betterend.recipe.AlloyingRecipes;
|
import ru.betterend.recipe.AlloyingRecipes;
|
||||||
|
@ -12,6 +18,7 @@ import ru.betterend.registry.BlockTagRegistry;
|
||||||
import ru.betterend.registry.EntityRegistry;
|
import ru.betterend.registry.EntityRegistry;
|
||||||
import ru.betterend.registry.FeatureRegistry;
|
import ru.betterend.registry.FeatureRegistry;
|
||||||
import ru.betterend.registry.ItemRegistry;
|
import ru.betterend.registry.ItemRegistry;
|
||||||
|
import ru.betterend.registry.ItemTagRegistry;
|
||||||
import ru.betterend.registry.SoundsRegistry;
|
import ru.betterend.registry.SoundsRegistry;
|
||||||
import ru.betterend.util.Logger;
|
import ru.betterend.util.Logger;
|
||||||
import ru.betterend.world.generator.BetterEndBiomeSource;
|
import ru.betterend.world.generator.BetterEndBiomeSource;
|
||||||
|
@ -33,6 +40,7 @@ public class BetterEnd implements ModInitializer {
|
||||||
EntityRegistry.register();
|
EntityRegistry.register();
|
||||||
BiomeRegistry.register();
|
BiomeRegistry.register();
|
||||||
BetterEndBiomeSource.register();
|
BetterEndBiomeSource.register();
|
||||||
|
ItemTagRegistry.register();
|
||||||
BlockTagRegistry.register();
|
BlockTagRegistry.register();
|
||||||
CraftingRecipes.register();
|
CraftingRecipes.register();
|
||||||
AlloyingRecipes.register();
|
AlloyingRecipes.register();
|
||||||
|
|
|
@ -39,11 +39,18 @@ public class BlockOre extends OreBlock {
|
||||||
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
|
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
|
||||||
ItemStack tool = builder.get(LootContextParameters.TOOL);
|
ItemStack tool = builder.get(LootContextParameters.TOOL);
|
||||||
if (tool != null && tool.isEffectiveOn(state)) {
|
if (tool != null && tool.isEffectiveOn(state)) {
|
||||||
|
int count = 0;
|
||||||
int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool);
|
int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool);
|
||||||
int min = MathHelper.clamp(minCount + fortune, 0, maxCount);
|
if (fortune > 0) {
|
||||||
if (min == maxCount)
|
int min = MathHelper.clamp(minCount + fortune, minCount, maxCount);
|
||||||
return Lists.newArrayList(new ItemStack(dropItem, maxCount));
|
int max = maxCount + (fortune / Enchantments.FORTUNE.getMaxLevel());
|
||||||
int count = MHelper.randRange(min, maxCount, MHelper.RANDOM);
|
if (min == max) {
|
||||||
|
return Lists.newArrayList(new ItemStack(dropItem, max));
|
||||||
|
}
|
||||||
|
count = MHelper.randRange(min, max, MHelper.RANDOM);
|
||||||
|
} else {
|
||||||
|
count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM);
|
||||||
|
}
|
||||||
return Lists.newArrayList(new ItemStack(dropItem, count));
|
return Lists.newArrayList(new ItemStack(dropItem, count));
|
||||||
}
|
}
|
||||||
return Lists.newArrayList();
|
return Lists.newArrayList();
|
||||||
|
|
|
@ -11,6 +11,7 @@ import io.netty.util.internal.ThreadLocalRandom;
|
||||||
import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool;
|
import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool;
|
||||||
import net.fabricmc.fabric.api.tool.attribute.v1.ToolManager;
|
import net.fabricmc.fabric.api.tool.attribute.v1.ToolManager;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.block.Material;
|
import net.minecraft.block.Material;
|
||||||
import net.minecraft.entity.EquipmentSlot;
|
import net.minecraft.entity.EquipmentSlot;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
@ -32,7 +33,6 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
|
||||||
public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current());
|
public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current());
|
||||||
|
|
||||||
private final Multimap<EntityAttribute, EntityAttributeModifier> attributeModifiers;
|
private final Multimap<EntityAttribute, EntityAttributeModifier> attributeModifiers;
|
||||||
private ItemStack itemStack;
|
|
||||||
|
|
||||||
public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) {
|
public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) {
|
||||||
super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings);
|
super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings);
|
||||||
|
@ -42,7 +42,6 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
|
||||||
builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION));
|
builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION));
|
||||||
builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION));
|
builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION));
|
||||||
this.attributeModifiers = builder.build();
|
this.attributeModifiers = builder.build();
|
||||||
this.itemStack = new ItemStack(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -73,11 +72,25 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
|
||||||
@Override
|
@Override
|
||||||
public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) {
|
public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) {
|
||||||
if (state.getMaterial().equals(Material.GLASS)) {
|
if (state.getMaterial().equals(Material.GLASS)) {
|
||||||
return 10.0F;
|
return this.getMaterial().getMiningSpeedMultiplier() * 2.0F;
|
||||||
|
}
|
||||||
|
if (isEffectiveOn(state)) {
|
||||||
|
float mult = 1.0F;
|
||||||
|
if (state.isOf(Blocks.DIAMOND_BLOCK) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.REDSTONE_BLOCK)) {
|
||||||
|
mult = this.getMaterial().getMiningSpeedMultiplier();
|
||||||
|
} else {
|
||||||
|
mult = this.getMaterial().getMiningSpeedMultiplier() / 2.0F;
|
||||||
|
}
|
||||||
|
return mult > 1.0F ? mult : 1.0F;
|
||||||
}
|
}
|
||||||
return 1.0F;
|
return 1.0F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getMiningSpeedMultiplier(Tag<Item> tag, BlockState state, ItemStack stack, LivingEntity user) {
|
||||||
|
return ToolManager.handleBreakingSpeed(state, stack, user);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMiningLevel(Tag<Item> tag, BlockState state, ItemStack stack, LivingEntity user) {
|
public int getMiningLevel(Tag<Item> tag, BlockState state, ItemStack stack, LivingEntity user) {
|
||||||
return this.getMaterial().getMiningLevel();
|
return this.getMaterial().getMiningLevel();
|
||||||
|
@ -88,10 +101,20 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
|
||||||
if (state.getMaterial().equals(Material.GLASS)) {
|
if (state.getMaterial().equals(Material.GLASS)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!state.getMaterial().equals(Material.STONE)) {
|
if (!state.isOf(Blocks.REDSTONE_BLOCK) && !state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.EMERALD_BLOCK) && !state.isOf(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ToolManager.handleIsEffectiveOnIgnoresVanilla(state, itemStack, null);
|
int level = this.getMaterial().getMiningLevel();
|
||||||
|
if (state.isOf(Blocks.IRON_ORE) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.LAPIS_ORE)) {
|
||||||
|
return level >= 1;
|
||||||
|
}
|
||||||
|
if (state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.DIAMOND_ORE) || state.isOf(Blocks.EMERALD_ORE) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.GOLD_ORE) || state.isOf(Blocks.REDSTONE_ORE)) {
|
||||||
|
return level >= 2;
|
||||||
|
}
|
||||||
|
if (state.isOf(Blocks.OBSIDIAN) || state.isOf(Blocks.CRYING_OBSIDIAN) || state.isOf(Blocks.RESPAWN_ANCHOR) || state.isOf(Blocks.ANCIENT_DEBRIS)) {
|
||||||
|
return level >= 3;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
package ru.betterend.mixin.common;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import net.minecraft.block.AbstractBlock;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
|
import net.minecraft.enchantment.Enchantments;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.loot.context.LootContext;
|
||||||
|
import net.minecraft.loot.context.LootContextParameters;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
import ru.betterend.item.EndHammer;
|
||||||
|
import ru.betterend.util.MHelper;
|
||||||
|
|
||||||
|
@Mixin(AbstractBlock.class)
|
||||||
|
public abstract class AbstractBlockMixin {
|
||||||
|
|
||||||
|
@Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true)
|
||||||
|
public void getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable<List<ItemStack>> info) {
|
||||||
|
if (state.isOf(Blocks.GLOWSTONE)) {
|
||||||
|
ItemStack tool = builder.get(LootContextParameters.TOOL);
|
||||||
|
if (tool != null && tool.getItem() instanceof EndHammer) {
|
||||||
|
int min = 3;
|
||||||
|
int max = 4;
|
||||||
|
int count = 0;
|
||||||
|
int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool);
|
||||||
|
if (fortune > 0) {
|
||||||
|
fortune /= Enchantments.FORTUNE.getMaxLevel();
|
||||||
|
min = MathHelper.clamp(min + fortune, min, max);
|
||||||
|
if (min == max) {
|
||||||
|
info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max)));
|
||||||
|
info.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count = MHelper.randRange(min, max, MHelper.RANDOM);
|
||||||
|
info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, count)));
|
||||||
|
info.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -88,6 +88,8 @@ public class ItemRegistry {
|
||||||
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.AXES, item);
|
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.AXES, item);
|
||||||
} else if (item instanceof EndHoe) {
|
} else if (item instanceof EndHoe) {
|
||||||
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.HOES, item);
|
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.HOES, item);
|
||||||
|
} else if (item instanceof EndHammer) {
|
||||||
|
TagHelper.addTag((Tag.Identified<Item>) ItemTagRegistry.HAMMERS, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
|
|
36
src/main/java/ru/betterend/registry/ItemTagRegistry.java
Normal file
36
src/main/java/ru/betterend/registry/ItemTagRegistry.java
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
package ru.betterend.registry;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.tag.TagRegistry;
|
||||||
|
import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl;
|
||||||
|
import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.tag.Tag;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import ru.betterend.BetterEnd;
|
||||||
|
|
||||||
|
public class ItemTagRegistry {
|
||||||
|
public final static Tag<Item> HAMMERS = registerFabricItemTag("hammer");
|
||||||
|
|
||||||
|
public static Tag<Item> registerItemTag(String name) {
|
||||||
|
return TagRegistry.item(BetterEnd.makeID(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Tag<Item> registerFabricItemTag(String name) {
|
||||||
|
return TagRegistry.item(new Identifier("fabric", name));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register() {
|
||||||
|
ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(
|
||||||
|
Arrays.asList(
|
||||||
|
ItemRegistry.IRON_HAMMER,
|
||||||
|
ItemRegistry.GOLDEN_HAMMER,
|
||||||
|
ItemRegistry.DIAMOND_HAMMER,
|
||||||
|
ItemRegistry.NETHERITE_HAMMER,
|
||||||
|
ItemRegistry.TERMINITE_HAMMER,
|
||||||
|
ItemRegistry.AETERNIUM_HAMMER
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
"TagGroupLoaderMixin",
|
"TagGroupLoaderMixin",
|
||||||
"CraftingScreenHandlerMixin",
|
"CraftingScreenHandlerMixin",
|
||||||
"GenerationSettingsMixin",
|
"GenerationSettingsMixin",
|
||||||
|
"AbstractBlockMixin",
|
||||||
"LivingEntityMixin",
|
"LivingEntityMixin",
|
||||||
"BiomeMixin"
|
"BiomeMixin"
|
||||||
],
|
],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue