Compare commits

14 Commits

Author SHA1 Message Date
Jottyfan
1d251b27e9 26.1-pre-1 2026-03-11 19:59:53 +01:00
Jottyfan
d888283838 version snapshot-10 2026-02-24 22:41:41 +01:00
Jottyfan
5bc14bb222 added potato stack 2026-02-22 19:13:15 +01:00
Jottyfan
a71c23cf28 breaking blocks fixed 2026-02-21 15:55:36 +01:00
Jottyfan
732c8fd3d2 finetuning 2026-02-18 19:01:53 +01:00
Jottyfan
96ee5749c9 added own creative tab 2026-02-18 18:48:55 +01:00
Jottyfan
8dc3145493 fixed snapshot-7 2026-02-12 16:06:19 +01:00
Jottyfan
ea72b9c7f0 fixes for version 26.1-snapshot-7, but bugs on fabric api 2026-02-11 18:01:51 +01:00
Jottyfan
7c531cdbef corrected drops on harvesting with special tools 2026-02-07 21:06:43 +01:00
Jottyfan
8e2eb70524 snapshot 6 version 2026-02-04 23:42:29 +01:00
Jottyfan
c0c70ecfce version number corrected 2026-01-27 20:07:41 +01:00
Jottyfan
57ed5584cb version 26.1-SNAPSHOT-5 2026-01-27 19:56:15 +01:00
Jottyfan
49820490b6 fixed bug on path creation 2026-01-25 08:57:25 +01:00
Jottyfan
489af3ef92 version update 2026-01-23 01:06:44 +01:00
27 changed files with 445 additions and 99 deletions

View File

@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -7,14 +7,14 @@ org.gradle.configuration-cache=false
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/develop # check these on https://fabricmc.net/develop
minecraft_version=26.1-snapshot-3 minecraft_version=26.1-pre-1
loader_version=0.18.4 loader_version=0.18.4
loom_version=1.14-SNAPSHOT loom_version=1.15-SNAPSHOT
# Mod Properties # Mod Properties
mod_version=26.1.3 mod_version=26.1-pre-1
maven_group=de.jottyfan.minecraft maven_group=de.jottyfan.minecraft
archives_base_name=quickly archives_base_name=quickly
# Dependencies # Dependencies
fabric_api_version=0.141.3+26.1 fabric_api_version=0.143.12+26.1

View File

@@ -1,5 +1,7 @@
package de.jottyfan.minecraft; package de.jottyfan.minecraft;
import java.util.List;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -10,7 +12,10 @@ import de.jottyfan.minecraft.event.QuicklyEvents;
import de.jottyfan.minecraft.feature.QuicklyFeatures; import de.jottyfan.minecraft.feature.QuicklyFeatures;
import de.jottyfan.minecraft.item.QuicklyItems; import de.jottyfan.minecraft.item.QuicklyItems;
import de.jottyfan.minecraft.loot.QuicklyLootTables; import de.jottyfan.minecraft.loot.QuicklyLootTables;
import de.jottyfan.minecraft.tab.QuicklyTab;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
/** /**
* *
* @author jotty * @author jotty
@@ -25,11 +30,12 @@ public class Quickly implements ModInitializer {
public void onInitialize() { public void onInitialize() {
LOGGER.info("loading {}", MOD_ID); LOGGER.info("loading {}", MOD_ID);
QuicklyItems.registerModItems(); List<Item> items = QuicklyItems.registerModItems();
QuicklyBlocks.registerModBlocks(); List<Block> blocks = QuicklyBlocks.registerModBlocks();
QuicklyBlockEntity.registerBlockEntities(); QuicklyBlockEntity.registerBlockEntities();
QuicklyFeatures.registerFeatures(); QuicklyFeatures.registerFeatures();
QuicklyComposter.registerComposterItems(); QuicklyComposter.registerComposterItems();
QuicklyTab.registerItemGroup(items, blocks);
QuicklyLootTables.registerChanges(); QuicklyLootTables.registerChanges();
QuicklyEvents.registerBlockBreak(); QuicklyEvents.registerBlockBreak();
} }

View File

@@ -92,8 +92,8 @@ public class BlockDrill extends FallingBlock implements EntityBlock {
loadings.put(QuicklyItems.CANOLABOTTLESTACK, 72); loadings.put(QuicklyItems.CANOLABOTTLESTACK, 72);
Item item = itemStack.getItem(); Item item = itemStack.getItem();
if (QuicklyItems.MAGNIFIER.equals(item)) { if (QuicklyItems.MAGNIFIER.equals(item)) {
if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) { if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer && player != null) {
serverPlayer.displayClientMessage(Component.translatable("info.block.drillfuel", state.getValue(FUEL)), true); serverPlayer.connection.player.sendSystemMessage(Component.translatable("info.block.drillfuel", state.getValue(FUEL)), true);
} }
} else if (loadings.containsKey(item)) { } else if (loadings.containsKey(item)) {
Integer fuelWeight = loadings.get(item); Integer fuelWeight = loadings.get(item);

View File

@@ -2,7 +2,6 @@ package de.jottyfan.minecraft.block;
import de.jottyfan.minecraft.item.QuicklyItems; import de.jottyfan.minecraft.item.QuicklyItems;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.resources.Identifier;
import net.minecraft.world.Containers; import net.minecraft.world.Containers;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@@ -24,13 +23,13 @@ import net.minecraft.world.phys.shapes.VoxelShape;
*/ */
public class BlockPlant extends CropBlock { public class BlockPlant extends CropBlock {
private Identifier seedName; private DropDefinition seedDefinition;
private Identifier fruitName; private DropDefinition fruitDefinition;
public BlockPlant(Properties properties, Identifier seedName, Identifier fruitName) { public BlockPlant(Properties properties, DropDefinition seedDefinition, DropDefinition fruitDefinition) {
super(properties.noOcclusion().dynamicShape()); super(properties.noOcclusion().dynamicShape());
this.seedName = seedName; this.seedDefinition = seedDefinition;
this.fruitName = fruitName; this.fruitDefinition = fruitDefinition;
} }
@Override @Override
@@ -49,11 +48,11 @@ public class BlockPlant extends CropBlock {
} }
public ItemLike getSeed() { public ItemLike getSeed() {
return QuicklyItems.of(seedName); return QuicklyItems.of(seedDefinition.getIdentifier());
} }
public ItemLike getFruit() { public ItemLike getFruit() {
return QuicklyItems.of(fruitName); return QuicklyItems.of(fruitDefinition.getIdentifier());
} }
@Override @Override

View File

@@ -1,5 +1,8 @@
package de.jottyfan.minecraft.block; package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.List;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
import com.mojang.serialization.MapCodec; import com.mojang.serialization.MapCodec;
@@ -7,6 +10,7 @@ import com.mojang.serialization.MapCodec;
import de.jottyfan.minecraft.blockentity.BlockStackerEntity; import de.jottyfan.minecraft.blockentity.BlockStackerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@@ -15,8 +19,9 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
/** /**
* *
@@ -37,13 +42,21 @@ public class BlockStacker extends Block implements EntityBlock {
} }
@Override @Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) { protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(SOURCE, DEST); builder.add(SOURCE, DEST);
} }
@Override
protected List<ItemStack> getDrops(BlockState state, Builder params) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.STACKER));
return list;
}
@Override @Override
public BlockState getStateForPlacement(BlockPlaceContext context) { public BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(SOURCE, context.getNearestLookingDirection()).setValue(DEST, context.getNearestLookingDirection().getOpposite()); return this.defaultBlockState().setValue(SOURCE, context.getNearestLookingDirection()).setValue(DEST,
context.getNearestLookingDirection().getOpposite());
} }
@Override @Override

View File

@@ -0,0 +1,82 @@
package de.jottyfan.minecraft.block;
import java.util.Random;
import net.minecraft.resources.Identifier;
/**
*
* @author jotty
*
*/
public class DropDefinition {
private Identifier identifier;
private Integer minValue;
private Integer maxValue;
/**
* defines the drop definition; the item or block from identifier should be
* dropped x times (minValue <= x <= maxValue)
*
* @param identifier the identifier of the item or block
* @param minValue the minimum of dropped items or blocks
* @param maxValue the maximum of dropped items or blocks
*/
public static final DropDefinition of(Identifier identifier, Integer minValue, Integer maxValue) {
DropDefinition bean = new DropDefinition();
bean.setIdentifier(identifier);
bean.setMinValue(minValue);
bean.setMaxValue(maxValue);
return bean;
}
public int getRandomSize() {
if (maxValue - minValue < 1) {
return new Random().nextInt(maxValue);
} else {
return minValue + new Random().nextInt(maxValue - minValue);
}
}
/**
* @return the identifier
*/
public Identifier getIdentifier() {
return identifier;
}
/**
* @param identifier the identifier to set
*/
public void setIdentifier(Identifier identifier) {
this.identifier = identifier;
}
/**
* @return the minValue
*/
public Integer getMinValue() {
return minValue;
}
/**
* @param minValue the minValue to set
*/
public void setMinValue(Integer minValue) {
this.minValue = minValue;
}
/**
* @return the maxValue
*/
public Integer getMaxValue() {
return maxValue;
}
/**
* @param maxValue the maxValue to set
*/
public void setMaxValue(Integer maxValue) {
this.maxValue = maxValue;
}
}

View File

@@ -56,7 +56,7 @@ public class Itemhoarder extends Block implements EntityBlock {
@Override @Override
protected InteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, Player player, protected InteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, Player player,
InteractionHand hand, BlockHitResult hitResult) { InteractionHand hand, BlockHitResult hitResult) {
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer && player != null) {
if (QuicklyItems.MAGNIFIER.equals(itemStack.getItem())) { if (QuicklyItems.MAGNIFIER.equals(itemStack.getItem())) {
MutableComponent message = Component.empty(); MutableComponent message = Component.empty();
BlockEntity blockEntity = level.getBlockEntity(pos); BlockEntity blockEntity = level.getBlockEntity(pos);
@@ -68,7 +68,7 @@ public class Itemhoarder extends Block implements EntityBlock {
} }
} }
Component complete = Component.translatable("info.block.itemhoarder", message); Component complete = Component.translatable("info.block.itemhoarder", message);
serverPlayer.displayClientMessage(complete, false); serverPlayer.connection.player.sendSystemMessage(complete, false);
} }
} }
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View File

@@ -1,5 +1,8 @@
package de.jottyfan.minecraft.block; package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.List;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
import de.jottyfan.minecraft.item.QuicklyItems; import de.jottyfan.minecraft.item.QuicklyItems;
@@ -20,8 +23,9 @@ import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.ticks.ScheduledTick; import net.minecraft.world.ticks.ScheduledTick;
@@ -46,10 +50,17 @@ public class Monsterhoarder extends Block {
} }
@Override @Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) { protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(SUCKRADIUS, BURNTICKS); builder.add(SUCKRADIUS, BURNTICKS);
} }
@Override
protected List<ItemStack> getDrops(BlockState state, Builder params) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.MONSTERHOARDER));
return list;
}
@Override @Override
protected InteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, Player player, protected InteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, Player player,
InteractionHand hand, BlockHitResult hitResult) { InteractionHand hand, BlockHitResult hitResult) {
@@ -73,8 +84,8 @@ public class Monsterhoarder extends Block {
int suckRadius = state.getValue(SUCKRADIUS); int suckRadius = state.getValue(SUCKRADIUS);
int burnTicks = state.getValue(BURNTICKS); int burnTicks = state.getValue(BURNTICKS);
Component message = Component.translatable("info.block.monsterhoarder", suckRadius, burnTicks); Component message = Component.translatable("info.block.monsterhoarder", suckRadius, burnTicks);
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer && player != null) {
serverPlayer.displayClientMessage(message, true); serverPlayer.connection.player.sendSystemMessage(message, true);
} }
} }
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

View File

@@ -1,5 +1,7 @@
package de.jottyfan.minecraft.block; package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import de.jottyfan.minecraft.Quickly; import de.jottyfan.minecraft.Quickly;
@@ -32,9 +34,11 @@ public class QuicklyBlocks {
public static final Block OREDEEPSLATETURQUOISE = registerBlock(ID.OREDEEPSLATETURQUOISE, public static final Block OREDEEPSLATETURQUOISE = registerBlock(ID.OREDEEPSLATETURQUOISE,
properties -> new BlockOre(properties, SoundEvents.AMETHYST_BLOCK_CHIME, ID.RAWTURQUOISE)); properties -> new BlockOre(properties, SoundEvents.AMETHYST_BLOCK_CHIME, ID.RAWTURQUOISE));
public static final Block COTTONPLANT = registerBlock(ID.BLOCKCOTTONPLANT, Properties.ofFullCopy(Blocks.WHEAT), public static final Block COTTONPLANT = registerBlock(ID.BLOCKCOTTONPLANT, Properties.ofFullCopy(Blocks.WHEAT),
properties -> new BlockPlant(properties, ID.COTTONSEED, ID.COTTON)); properties -> new BlockPlant(properties, DropDefinition.of(ID.COTTONSEED, 1, 1),
DropDefinition.of(ID.COTTON, 1, 1)));
public static final Block CANOLAPLANT = registerBlock(ID.BLOCKCANOLAPLANT, Properties.ofFullCopy(Blocks.WHEAT), public static final Block CANOLAPLANT = registerBlock(ID.BLOCKCANOLAPLANT, Properties.ofFullCopy(Blocks.WHEAT),
properties -> new BlockPlant(properties, ID.CANOLASEED, ID.CANOLA)); properties -> new BlockPlant(properties, DropDefinition.of(ID.CANOLASEED, 1, 1),
DropDefinition.of(ID.CANOLA, 1, 1)));
public static final Block LAVAHOARDER = registerBlock(ID.LAVAHOARDER, public static final Block LAVAHOARDER = registerBlock(ID.LAVAHOARDER,
Properties.of().strength(2.5f).lightLevel(state -> state.getValue(Lavahoarder.FILLED) ? 15 : 0), Properties.of().strength(2.5f).lightLevel(state -> state.getValue(Lavahoarder.FILLED) ? 15 : 0),
Lavahoarder::new); Lavahoarder::new);
@@ -98,7 +102,31 @@ public class QuicklyBlocks {
return BuiltInRegistries.BLOCK.getValue(identifier); return BuiltInRegistries.BLOCK.getValue(identifier);
} }
public static void registerModBlocks() { public static final List<Block> registerModBlocks() {
Quickly.LOGGER.info("forbid the optimizer to ignore static block registration"); Quickly.LOGGER.debug("register blocks");
List<Block> set = new ArrayList<>();
set.add(KELPBUNDLE);
set.add(TURQUOISEBLOCK);
set.add(ORETURQUOISE);
set.add(OREDEEPSLATETURQUOISE);
set.add(LAVAHOARDER);
set.add(QUICKIEPOWDER);
set.add(SPEEDPOWDER);
set.add(MONSTERHOARDER);
set.add(ITEMHOARDER);
set.add(DRILL);
set.add(STACKER);
set.add(DIRTSALPETER);
set.add(SANDSALPETER);
set.add(OREDEEPSLATESULFOR);
set.add(ORENETHERSULFOR);
set.add(ORESALPETER);
set.add(ORESANDSALPETER);
set.add(ORESULFOR);
set.add(ORESPEEDPOWDER);
set.add(OREDEEPSLATESPEEDPOWDER);
set.add(SALPETERBLOCK);
set.add(SULFORBLOCK);
return set;
} }
} }

View File

@@ -6,8 +6,10 @@ import com.google.common.collect.Lists;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.HoeItem; import net.minecraft.world.item.HoeItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@@ -18,6 +20,8 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CropBlock; import net.minecraft.world.level.block.CropBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
/** /**
@@ -26,18 +30,19 @@ import net.minecraft.world.phys.BlockHitResult;
* *
*/ */
public class QHoe extends HoeItem implements ToolRangeable { public class QHoe extends HoeItem implements ToolRangeable {
public QIP properties; public QIP properties;
public QHoe(QIP properties) { public QHoe(QIP properties) {
super(new ToolMaterial(BlockTags.INCORRECT_FOR_DIAMOND_TOOL, properties.getDurability(), 7f, 1f, 15, ItemTags.DIAMOND_TOOL_MATERIALS), 7f, 3.1f, properties); super(new ToolMaterial(BlockTags.INCORRECT_FOR_DIAMOND_TOOL, properties.getDurability(), 7f, 1f, 15,
ItemTags.DIAMOND_TOOL_MATERIALS), 7f, 3.1f, properties);
this.properties = properties; this.properties = properties;
} }
@Override @Override
public InteractionResult useOn(UseOnContext context) { public InteractionResult useOn(UseOnContext context) {
InteractionResult res = super.useOn(context); InteractionResult res = super.useOn(context);
boolean isCrop = context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof CropBlock; Block block = context.getLevel().getBlockState(context.getClickedPos()).getBlock();
boolean isCrop = block instanceof CropBlock;
if (!InteractionResult.PASS.equals(res) || isCrop) { if (!InteractionResult.PASS.equals(res) || isCrop) {
HarvestRange range = properties.getHarvestRange(); HarvestRange range = properties.getHarvestRange();
for (int x = -range.getxRange(); x <= range.getxRange(); x++) { for (int x = -range.getxRange(); x <= range.getxRange(); x++) {
@@ -55,6 +60,7 @@ public class QHoe extends HoeItem implements ToolRangeable {
} }
} }
} }
return InteractionResult.SUCCESS;
} }
return res; return res;
} }
@@ -69,13 +75,21 @@ public class QHoe extends HoeItem implements ToolRangeable {
} }
private void harvestIfPossible(BlockPos pos, Level level) { private void harvestIfPossible(BlockPos pos, Level level) {
BlockState blockState = level.getBlockState(pos); if (!level.isClientSide()) {
Block block = blockState.getBlock(); BlockState blockState = level.getBlockState(pos);
if (block instanceof CropBlock) { Block block = blockState.getBlock();
CropBlock cBlock = (CropBlock) block; if (block instanceof CropBlock cBlock) {
if (cBlock.isMaxAge(blockState)) { if (cBlock.isMaxAge(blockState)) {
Block.dropResources(blockState, level, pos); LootParams.Builder builder = new LootParams.Builder((ServerLevel) level)
level.setBlockAndUpdate(pos, cBlock.defaultBlockState()); .withParameter(LootContextParams.ORIGIN, pos.getCenter())
.withParameter(LootContextParams.BLOCK_STATE, blockState)
.withOptionalParameter(LootContextParams.BLOCK_ENTITY, level.getBlockEntity(pos))
.withParameter(LootContextParams.TOOL, ItemStack.EMPTY);
for (ItemStack stack : blockState.getDrops(builder)) {
Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), stack);
}
level.setBlockAndUpdate(pos, cBlock.defaultBlockState());
}
} }
} }
} }

View File

@@ -1,6 +1,7 @@
package de.jottyfan.minecraft.item; package de.jottyfan.minecraft.item;
import java.util.List; import java.util.List;
import java.util.Set;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -26,7 +27,7 @@ public class QShovel extends ShovelItem implements ToolRangeable {
this.range = properties.getHarvestRange(); this.range = properties.getHarvestRange();
} }
private void createPathOnGrass(Level level, BlockPos pos, Direction side) { private void createPath(Level level, BlockPos pos, Direction side, Set<Block> validBlocks) {
BlockState blockState = level.getBlockState(pos); BlockState blockState = level.getBlockState(pos);
if (blockState.isAir()) { if (blockState.isAir()) {
// try to find one underneath // try to find one underneath
@@ -39,7 +40,9 @@ public class QShovel extends ShovelItem implements ToolRangeable {
if (side != Direction.DOWN) { if (side != Direction.DOWN) {
if (blockState != null && level.getBlockState(pos.above()).isAir()) { if (blockState != null && level.getBlockState(pos.above()).isAir()) {
if (!level.isClientSide()) { if (!level.isClientSide()) {
level.setBlockAndUpdate(pos, Blocks.DIRT_PATH.defaultBlockState()); if (validBlocks.contains(blockState.getBlock())) {
level.setBlockAndUpdate(pos, Blocks.DIRT_PATH.defaultBlockState());
}
} }
} }
} }
@@ -47,10 +50,13 @@ public class QShovel extends ShovelItem implements ToolRangeable {
@Override @Override
public InteractionResult useOn(UseOnContext context) { public InteractionResult useOn(UseOnContext context) {
for (BlockPos pos : range.getRangeAsBlockPosArray(context.getClickedPos(), true, new BlockPos(1, 1, 1))) { InteractionResult result = super.useOn(context);
createPathOnGrass(context.getLevel(), pos, context.getClickedFace()); if (InteractionResult.SUCCESS.equals(result)) {
for (BlockPos pos : range.getRangeAsBlockPosArray(context.getClickedPos(), true, new BlockPos(1, 1, 1))) {
createPath(context.getLevel(), pos, context.getClickedFace(), FLATTENABLES.keySet());
}
} }
return super.useOn(context); return result;
} }
@Override @Override

View File

@@ -1,5 +1,7 @@
package de.jottyfan.minecraft.item; package de.jottyfan.minecraft.item;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import de.jottyfan.minecraft.Quickly; import de.jottyfan.minecraft.Quickly;
@@ -44,6 +46,7 @@ public class QuicklyItems {
public static final Item SALPETER = registerItem(ID.SALPETER); public static final Item SALPETER = registerItem(ID.SALPETER);
public static final Item SULFOR = registerItem(ID.SULFOR); public static final Item SULFOR = registerItem(ID.SULFOR);
public static final Item CARROTSTACK = registerItem(ID.CARROTSTACK); public static final Item CARROTSTACK = registerItem(ID.CARROTSTACK);
public static final Item POTATOSTACK = registerItem(ID.POTATOSTACK);
// TODO: rename tools to speedaxe and quickaxe instead of the powder version // TODO: rename tools to speedaxe and quickaxe instead of the powder version
@@ -97,8 +100,50 @@ public class QuicklyItems {
return Registry.register(BuiltInRegistries.ITEM, identifier, item); return Registry.register(BuiltInRegistries.ITEM, identifier, item);
} }
public static final void registerModItems() { public static final List<Item> registerModItems() {
Quickly.LOGGER.info("forbid the optimizer to ignore static item registration"); Quickly.LOGGER.debug("adding Items");
List<Item> set = new ArrayList<>();
set.add(STUB);
set.add(RAWTURQUOISE);
set.add(TURQUOISEINGOT);
set.add(COTTON);
set.add(COTTONSEED);
set.add(CANOLA);
set.add(CANOLASEED);
set.add(CANOLABOTTLE);
set.add(CANOLABOTTLESTACK);
set.add(ROTTENFLESHSTRIPES);
set.add(OXIDIZEDCOPPERPOWDER);
set.add(COPPERSTRING);
set.add(COPPERPOWDER);
set.add(COPPERSTUB);
set.add(COPPERSTICK);
set.add(SPEEDPOWDER);
set.add(QUICKIEPOWDER);
set.add(SPEEDINGOT);
set.add(QUICKIEINGOT);
set.add(MAGNIFIER);
set.add(SALPETER);
set.add(SULFOR);
set.add(CARROTSTACK);
set.add(POTATOSTACK);
set.add(SPEEDAXE);
set.add(SPEEDHOE);
set.add(SPEEDPICKAXE);
set.add(SPEEDSHEARS);
set.add(SPEEDSHOVEL);
set.add(SPEEDWATERHOE);
set.add(QUICKIEAXE);
set.add(QUICKIEHOE);
set.add(QUICKIEPICKAXE);
set.add(QUICKIESHEARS);
set.add(QUICKIESHOVEL);
set.add(QUICKIEWATERHOE);
set.add(ARMOR_TURQUOISE_BOOTS);
set.add(ARMOR_TURQUOISE_HELMET);
set.add(ARMOR_TURQUOISE_LEGGINGS);
set.add(ARMOR_TURQUOISE_CHESTPLATE);
return set;
} }
/** /**

View File

@@ -1,34 +0,0 @@
package de.jottyfan.minecraft.mixin;
import java.util.Map;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import de.jottyfan.minecraft.block.QuicklyBlocks;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.chunk.ChunkSectionLayer;
import net.minecraft.world.level.block.Block;
/**
*
* @author jotty
*
*/
@Mixin(ItemBlockRenderTypes.class)
public class QuicklyMixin {
@Shadow
@Final
private static Map<Block, ChunkSectionLayer> TYPE_BY_BLOCK;
@Inject(method = "<clinit>", at = @At("RETURN"))
private static void onStaticInit(CallbackInfo info) {
ChunkSectionLayer cutout = ChunkSectionLayer.CUTOUT;
TYPE_BY_BLOCK.put(QuicklyBlocks.CANOLAPLANT, cutout);
TYPE_BY_BLOCK.put(QuicklyBlocks.COTTONPLANT, cutout);
}
}

View File

@@ -38,6 +38,7 @@ public class ID {
public static final Identifier SALPETER = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "salpeter"); public static final Identifier SALPETER = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "salpeter");
public static final Identifier SULFOR = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "sulfor"); public static final Identifier SULFOR = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "sulfor");
public static final Identifier CARROTSTACK = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "carrotstack"); public static final Identifier CARROTSTACK = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "carrotstack");
public static final Identifier POTATOSTACK = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "potatostack");
public static final Identifier SPEEDPOWDERAXE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "speedpowderaxe"); public static final Identifier SPEEDPOWDERAXE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "speedpowderaxe");
public static final Identifier SPEEDPOWDERHOE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "speedpowderhoe"); public static final Identifier SPEEDPOWDERHOE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "speedpowderhoe");
public static final Identifier SPEEDPOWDERPICKAXE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID, public static final Identifier SPEEDPOWDERPICKAXE = Identifier.fromNamespaceAndPath(Quickly.MOD_ID,

View File

@@ -0,0 +1,42 @@
package de.jottyfan.minecraft.tab;
import java.util.List;
import de.jottyfan.minecraft.Quickly;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
/**
*
* @author jotty
*
*/
public class QuicklyTab {
public static final void registerItemGroup(List<Item> items, List<Block> blocks) {
ResourceKey<CreativeModeTab> tabKey = ResourceKey.create(Registries.CREATIVE_MODE_TAB,
Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "itemgroup"));
CreativeModeTab quicklyTab = FabricCreativeModeTab.builder().icon(() -> new ItemStack(QuicklyItems.QUICKIEPICKAXE))
.title(Component.translatable("tab.quickly")).displayItems((params, output) -> {
for (Item item : items) {
output.accept(item);
}
for (Block block : blocks) {
output.accept(block);
}
}).build();
Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, tabKey, quicklyTab);
}
}

View File

@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "quickly:item/potatostack"
}
}

View File

@@ -38,6 +38,7 @@
"item.quickly.oresulfor": "Schwefelgestein", "item.quickly.oresulfor": "Schwefelgestein",
"item.quickly.oreturquoise": "Türkiserz", "item.quickly.oreturquoise": "Türkiserz",
"item.quickly.oxidizedcopperpowder": "oxidiertes Kupferpulver", "item.quickly.oxidizedcopperpowder": "oxidiertes Kupferpulver",
"item.quickly.potatostack": "Kartoffelbündel",
"item.quickly.quickieingot": "Eilpulverbarren", "item.quickly.quickieingot": "Eilpulverbarren",
"item.quickly.quickiepowder": "Eilpulver", "item.quickly.quickiepowder": "Eilpulver",
"item.quickly.quickiepowderaxe": "Eilaxt", "item.quickly.quickiepowderaxe": "Eilaxt",

View File

@@ -38,6 +38,7 @@
"item.quickly.oresulfor": "sulfor stone", "item.quickly.oresulfor": "sulfor stone",
"item.quickly.oreturquoise": "turquoise ore", "item.quickly.oreturquoise": "turquoise ore",
"item.quickly.oxidizedcopperpowder": "oxidized copper powder", "item.quickly.oxidizedcopperpowder": "oxidized copper powder",
"item.quickly.potatostack": "potato bundle",
"item.quickly.quickieingot": "quickie powder ingot", "item.quickly.quickieingot": "quickie powder ingot",
"item.quickly.quickiepowder": "quickie powder", "item.quickly.quickiepowder": "quickie powder",
"item.quickly.quickiepowderaxe": "hurry axe", "item.quickly.quickiepowderaxe": "hurry axe",

View File

@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "quickly:item/potatostack"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

View File

@@ -0,0 +1,56 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "quickly:canola",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"min": 1,
"max": 2
},
"add": false
}
],
"conditions": [
{
"condition": "minecraft:location_check",
"predicate": {
"block": {
"properties": {
"age": "7"
}
}
}
}
]
}
]
},
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "quickly:canolaseed",
"functions": [
{
"function": "minecraft:apply_bonus",
"enchantment": "minecraft:fortune",
"formula": "minecraft:binomial_with_bonus_count",
"parameters": {
"extra": 2,
"probability": 0.5
}
}
]
}
]
}
]
}

View File

@@ -0,0 +1,55 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "quickly:cotton",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"min": 1,
"max": 3
}
}
],
"conditions": [
{
"condition": "minecraft:location_check",
"predicate": {
"block": {
"properties": {
"age": "7"
}
}
}
}
]
}
]
},
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "quickly:cottonseed",
"functions": [
{
"function": "minecraft:apply_bonus",
"enchantment": "minecraft:fortune",
"formula": "minecraft:binomial_with_bonus_count",
"parameters": {
"extra": 2,
"probability": 0.5
}
}
]
}
]
}
]
}

View File

@@ -0,0 +1,13 @@
{
"type": "crafting_shaped",
"pattern": [
"cc",
"cc"
],
"key": {
"c": "minecraft:potato"
},
"result": {
"id": "quickly:potatostack"
}
}

View File

@@ -0,0 +1,10 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
"quickly:potatostack"
],
"result": {
"id": "minecraft:potato",
"count": 4
}
}

View File

@@ -22,9 +22,6 @@
"de.jottyfan.minecraft.QuicklyClient" "de.jottyfan.minecraft.QuicklyClient"
] ]
}, },
"mixins": [
"quickly.mixins.json"
],
"depends": { "depends": {
"fabricloader": ">=0.18.4", "fabricloader": ">=0.18.4",
"minecraft": "~26.1-", "minecraft": "~26.1-",

View File

@@ -1,14 +0,0 @@
{
"required": true,
"package": "de.jottyfan.minecraft.mixin",
"compatibilityLevel": "JAVA_25",
"mixins": [
"QuicklyMixin"
],
"injectors": {
"defaultRequire": 1
},
"overwrites": {
"requireAnnotations": true
}
}