Some mining/drop related fixes

This commit is contained in:
Frank 2022-03-18 15:34:18 +01:00
parent a2acd50658
commit 61f9854cd5
3 changed files with 88 additions and 24 deletions

View file

@ -0,0 +1,63 @@
package ru.bclib.blocks;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import ru.bclib.client.render.BCLRenderLayer;
import ru.bclib.interfaces.RenderLayerProvider;
import ru.bclib.interfaces.tools.AddMineablePickaxe;
import java.util.Collections;
import java.util.List;
public class BaseGlassBlock extends BaseBlockNotFull implements AddMineablePickaxe, RenderLayerProvider {
public BaseGlassBlock(Block block) {
this(block, 0.3f);
}
public BaseGlassBlock(Block block, float resistance) {
super(FabricBlockSettings.copyOf(block)
.resistance(resistance)
.nonOpaque()
.isSuffocating((arg1, arg2, arg3) -> false)
.isViewBlocking((arg1, arg2, arg3) -> false));
}
@Environment(EnvType.CLIENT)
public float getShadeBrightness(BlockState state, BlockGetter view, BlockPos pos) {
return 1.0F;
}
@Override
public boolean propagatesSkylightDown(BlockState state, BlockGetter view, BlockPos pos) {
return true;
}
@Environment(EnvType.CLIENT)
public boolean skipRendering(BlockState state, BlockState neighbor, Direction facing) {
return neighbor.getBlock() == this ? true : super.skipRendering(state, neighbor, facing);
}
@Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Collections.singletonList(new ItemStack(this));
}
return Collections.emptyList();
}
@Override
public BCLRenderLayer getRenderLayer() {
return BCLRenderLayer.TRANSLUCENT;
}
}

View file

@ -7,6 +7,7 @@ import net.minecraft.util.Mth;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TieredItem;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.ItemLike;
@ -34,6 +35,7 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider {
private final Supplier<Item> dropItem;
private final int minCount;
private final int maxCount;
private final int miningLevel;
public BaseOreBlock(Supplier<Item> drop, int minCount, int maxCount, int experience) {
this(drop, minCount, maxCount, experience, 0);
@ -56,16 +58,11 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider {
}
public BaseOreBlock(Properties properties, Supplier<Item> drop, int minCount, int maxCount, int experience, int miningLevel) {
super(makeProps(properties, miningLevel), UniformInt.of(experience>0?1:0, experience));
super(properties, UniformInt.of(experience>0?1:0, experience));
this.dropItem = drop;
this.minCount = minCount;
this.maxCount = maxCount;
}
private static Properties makeProps(Properties properties, int level){
//TODO: 1.18.2 make sure this works with the new tag system
//FabricBlockInternals.computeExtraData(properties).addMiningLevel(FabricToolTags.PICKAXES, level);
return properties;
this.miningLevel = miningLevel;
}
@Override
@ -74,30 +71,35 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider {
return LootUtil
.getDrops(this, state, builder)
.orElseGet(
()->BaseOreBlock.getDroppedItems(this, dropItem.get(), maxCount, minCount, state, builder)
()->BaseOreBlock.getDroppedItems(this, dropItem.get(), maxCount, minCount, miningLevel, state, builder)
);
}
public static List<ItemStack> getDroppedItems(ItemLike block, Item dropItem, int maxCount, int minCount, BlockState state, LootContext.Builder builder) {
public static List<ItemStack> getDroppedItems(ItemLike block, Item dropItem, int maxCount, int minCount, int miningLevel, BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null && tool.isCorrectToolForDrops(state)) {
if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Collections.singletonList(new ItemStack(block));
boolean canMine = miningLevel==0;
if (tool.getItem() instanceof TieredItem tired) {
canMine = tired.getTier().getLevel()>=miningLevel;
}
int count;
int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool);
if (enchantment > 0) {
int min = Mth.clamp(minCount + enchantment, minCount, maxCount);
int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel());
if (min == max) {
return Collections.singletonList(new ItemStack(dropItem, max));
if (canMine) {
if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Collections.singletonList(new ItemStack(block));
}
count = MHelper.randRange(min, max, MHelper.RANDOM);
int count;
int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool);
if (enchantment > 0) {
int min = Mth.clamp(minCount + enchantment, minCount, maxCount);
int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel());
if (min == max) {
return Collections.singletonList(new ItemStack(dropItem, max));
}
count = MHelper.randRange(min, max, MHelper.RANDOM);
} else {
count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM);
}
return Collections.singletonList(new ItemStack(dropItem, count));
}
else {
count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM);
}
return Collections.singletonList(new ItemStack(dropItem, count));
}
return Collections.emptyList();
}

View file

@ -9,7 +9,6 @@ import net.minecraft.world.item.Tier;
import ru.bclib.client.models.ModelsHelper;
import ru.bclib.interfaces.ItemModelProvider;
//TODO: 1.18.2 See if mining speed is still ok.
public class BaseAxeItem extends AxeItem implements ItemModelProvider {
public BaseAxeItem(Tier material, float attackDamage, float attackSpeed, Properties settings) {
super(material, attackDamage, attackSpeed, settings);