This commit is contained in:
Aleksey 2020-10-05 13:02:11 +03:00
parent 22a6331496
commit b014f9b0dd
7 changed files with 137 additions and 9 deletions

View file

@ -1,6 +1,12 @@
package ru.betterend;
import java.util.Arrays;
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 ru.betterend.config.MainConfig;
import ru.betterend.recipe.AlloyingRecipes;
@ -12,6 +18,7 @@ import ru.betterend.registry.BlockTagRegistry;
import ru.betterend.registry.EntityRegistry;
import ru.betterend.registry.FeatureRegistry;
import ru.betterend.registry.ItemRegistry;
import ru.betterend.registry.ItemTagRegistry;
import ru.betterend.registry.SoundsRegistry;
import ru.betterend.util.Logger;
import ru.betterend.world.generator.BetterEndBiomeSource;
@ -33,6 +40,7 @@ public class BetterEnd implements ModInitializer {
EntityRegistry.register();
BiomeRegistry.register();
BetterEndBiomeSource.register();
ItemTagRegistry.register();
BlockTagRegistry.register();
CraftingRecipes.register();
AlloyingRecipes.register();

View file

@ -39,11 +39,18 @@ public class BlockOre extends OreBlock {
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.get(LootContextParameters.TOOL);
if (tool != null && tool.isEffectiveOn(state)) {
int count = 0;
int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool);
int min = MathHelper.clamp(minCount + fortune, 0, maxCount);
if (min == maxCount)
return Lists.newArrayList(new ItemStack(dropItem, maxCount));
int count = MHelper.randRange(min, maxCount, MHelper.RANDOM);
if (fortune > 0) {
int min = MathHelper.clamp(minCount + fortune, minCount, maxCount);
int max = maxCount + (fortune / Enchantments.FORTUNE.getMaxLevel());
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();

View file

@ -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.ToolManager;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.Material;
import net.minecraft.entity.EquipmentSlot;
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());
private final Multimap<EntityAttribute, EntityAttributeModifier> attributeModifiers;
private ItemStack itemStack;
public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings 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_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION));
this.attributeModifiers = builder.build();
this.itemStack = new ItemStack(this);
}
@Override
@ -73,11 +72,25 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
@Override
public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) {
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;
}
@Override
public float getMiningSpeedMultiplier(Tag<Item> tag, BlockState state, ItemStack stack, LivingEntity user) {
return ToolManager.handleBreakingSpeed(state, stack, user);
}
@Override
public int getMiningLevel(Tag<Item> tag, BlockState state, ItemStack stack, LivingEntity user) {
return this.getMaterial().getMiningLevel();
@ -88,10 +101,20 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool {
if (state.getMaterial().equals(Material.GLASS)) {
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 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

View file

@ -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();
}
}
}
}

View file

@ -88,6 +88,8 @@ public class ItemRegistry {
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.AXES, item);
} else if (item instanceof EndHoe) {
TagHelper.addTag((Tag.Identified<Item>) FabricToolTags.HOES, item);
} else if (item instanceof EndHammer) {
TagHelper.addTag((Tag.Identified<Item>) ItemTagRegistry.HAMMERS, item);
}
return item;

View 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
)
));
}
}

View file

@ -10,6 +10,7 @@
"TagGroupLoaderMixin",
"CraftingScreenHandlerMixin",
"GenerationSettingsMixin",
"AbstractBlockMixin",
"LivingEntityMixin",
"BiomeMixin"
],