diff --git a/gradle.properties b/gradle.properties index d67dcc2..76e520a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neo_version=26.1.2.44-beta mod_id=cakesticklib mod_name=CakeStickLib mod_license=Ora Et Labora License -mod_version=1.10.3 +mod_version=1.11 mod_group_id=com.devdyna.cakestick mod_authors=DevDyna mod_description=A standalone port of Synergy API to unify most of the code diff --git a/src/generated/resources/assets/cakesticklib/lang/en_us.json b/src/generated/resources/assets/cakesticklib/lang/en_us.json index 0b083ee..2d30c88 100644 --- a/src/generated/resources/assets/cakesticklib/lang/en_us.json +++ b/src/generated/resources/assets/cakesticklib/lang/en_us.json @@ -40,6 +40,17 @@ "cakesticklib.item.crafting_ingredient": "§7Crafting Ingredient", "cakesticklib.item.disabled": "§7Item-Form unobtainable", "cakesticklib.item.placeable": "§7Can be placed", + "cakesticklib.jei.alias.block.break": "Block Breaker", + "cakesticklib.jei.alias.drill": "Drill", + "cakesticklib.jei.alias.entity.killer": "Entity killer", + "cakesticklib.jei.alias.entity.mover": "Entity Mover", + "cakesticklib.jei.alias.fakeplayer": "FakePlayer", + "cakesticklib.jei.alias.hopper": "Hopper", + "cakesticklib.jei.alias.item.collector": "Item Collector", + "cakesticklib.jei.alias.miner": "Miner", + "cakesticklib.jei.alias.redstone.sensible": "Redstone Sensible", + "cakesticklib.jei.alias.tree.cutter": "Tree cutter", + "cakesticklib.jei.alias.tree.feller": "Tree feller", "cakesticklib.jei.copper_oxidation": "Copper Oxidation Info", "cakesticklib.jei.patina_drop": "§7Drop %s§7 items every scrape", "cakesticklib.jei.strippable": "Block Strippable Info", diff --git a/src/main/java/com/devdyna/cakesticklib/api/ItemLogisticUtils.java b/src/main/java/com/devdyna/cakesticklib/api/ItemLogisticUtils.java new file mode 100644 index 0000000..38b4314 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/ItemLogisticUtils.java @@ -0,0 +1,57 @@ +package com.devdyna.cakesticklib.api; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class ItemLogisticUtils { + + public static ArrayList unifyDrops(List... itemLists) { + ArrayList newItems = new ArrayList<>(); + + for (List items : itemLists) { + for (ItemStack incoming : items) { + + boolean found = false; + + for (int i = 0; i < newItems.size(); i++) { + ItemStack existing = newItems.get(i); + + if (existing.getItem() == incoming.getItem() && existing.getCount() < existing.getMaxStackSize()) { + + int newCount = Math.min(existing.getMaxStackSize(), existing.getCount() + incoming.getCount()); + + newItems.set(i, new ItemStack(existing.getItem(), newCount)); + found = true; + break; + } + } + + if (!found) { + newItems.add(new ItemStack(incoming.getItem(), incoming.getCount())); + } + } + } + + return newItems; + } + + public static void createLazyItemEntity(ItemStack stack, Level l, BlockPos pos, int lifespan, boolean noMotion) { + var item = new ItemEntity(l, + pos.getX() + 0.5f, + pos.getY() + 0.5f, + pos.getZ() + 0.5f, + stack); + + item.lifespan = lifespan; + if (noMotion) + item.setDeltaMovement(0, 0, 0); + + l.addFreshEntity(item); + } + +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/RandomUtil.java b/src/main/java/com/devdyna/cakesticklib/api/RandomUtil.java index 3107987..383f816 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/RandomUtil.java +++ b/src/main/java/com/devdyna/cakesticklib/api/RandomUtil.java @@ -3,11 +3,26 @@ import net.minecraft.world.level.Level; public class RandomUtil { + + /** + * @param chance must be inside {@code [ 0 <-> 100 ]} + */ public static boolean chance(Level level, int chance) { return level.getRandom().nextInt(100) < chance; } + /** + * @param chance must be inside {@code [ 0.0f <-> 1.0f ]} + */ + public static boolean chance(Level level, double chance) { + return level.getRandom().nextDouble() < chance; + } + public static boolean rnd50(Level level) { return level.getRandom().nextBoolean(); } + + public static double between(Level l, double min, double max) { + return min + l.getRandom().nextDouble() * (max - min); + } } diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/EnvironmentModifier.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/EnvironmentModifier.java new file mode 100644 index 0000000..025a885 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/EnvironmentModifier.java @@ -0,0 +1,11 @@ +package com.devdyna.cakesticklib.api.aspect.logic; + +public interface EnvironmentModifier { + abstract float getSpeedModifier(); + + abstract boolean isRequired(); + + default String failDescKey() { + return "";//TODO IMP : when defaul fall on errored jade + } +} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/FluidClearableTank.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/FluidClearableTank.java new file mode 100644 index 0000000..8f8d07f --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/FluidClearableTank.java @@ -0,0 +1,39 @@ +package com.devdyna.cakesticklib.api.aspect.logic; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.transfer.transaction.Transaction; + +public interface FluidClearableTank { + + default InteractionResult useItemToClear(BlockState blockState, Level level, + BlockPos blockPos, Player player, BlockHitResult blockHitResult) { + + // if (!player.isCrouching()) + // return InteractionResult.FAIL; + + if (level.isClientSide()) + return InteractionResult.SUCCESS; + + var cap = level.getCapability(Capabilities.Fluid.BLOCK, blockPos, + blockHitResult.getDirection()); + + if (cap == null) + return InteractionResult.FAIL; + + if (cap.getAmountAsInt(0) == 0) + return InteractionResult.FAIL; + + try (var tx = Transaction.openRoot()) { + cap.extract(0, cap.getResource(0), cap.getAmountAsInt(0), tx); + tx.commit(); + } + return InteractionResult.SUCCESS; + + } +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/NoGuiStorage.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/NoGuiStorage.java index 9718e60..22a8d6c 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/NoGuiStorage.java +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/NoGuiStorage.java @@ -2,6 +2,8 @@ import java.util.ArrayList; +import com.devdyna.cakesticklib.api.utils.x; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; @@ -10,6 +12,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.neoforged.neoforge.transfer.item.ItemResource; +import net.neoforged.neoforge.transfer.item.ItemStacksResourceHandler; +import net.neoforged.neoforge.transfer.transaction.Transaction; public interface NoGuiStorage { @@ -114,4 +119,36 @@ default void spawnItemEntity(Level l, BlockPos p, ItemStack s) { p.getZ() + 0.5, s.copy())); } + + ItemStacksResourceHandler getItemStorage(); + + default ItemStack simpleInsertItem(ItemStack stack) { + + var inserted = 0; + + try (Transaction tx = Transaction.openRoot()) { + inserted = getItemStorage().insert(0, ItemResource.of(stack), stack.getCount(), tx); + tx.commit(); + } + + return x.item(stack.getItem(), stack.getCount() - inserted); + } + + default ItemStack simpleExtractItem() { + + var resource = getItemStorage().getResource(0); + + if (resource.isEmpty()) + return ItemStack.EMPTY; + + try (Transaction tx = Transaction.openRoot()) { + + var extracted = getItemStorage() + .extract(0, resource, getItemStorage().getAmountAsInt(0), tx); + tx.commit(); + + return resource.toStack(extracted); + } + } + } diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/SimpleTickerDelay.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/SimpleTickerDelay.java new file mode 100644 index 0000000..0e92105 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/SimpleTickerDelay.java @@ -0,0 +1,8 @@ +package com.devdyna.cakesticklib.api.aspect.logic; + +import com.devdyna.cakesticklib.api.primitive.Ticker; + +public interface SimpleTickerDelay { + abstract Ticker getTicker(); + +} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/TimeredRecipe.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/TimeredRecipe.java new file mode 100644 index 0000000..d8fcc54 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/TimeredRecipe.java @@ -0,0 +1,6 @@ +package com.devdyna.cakesticklib.api.aspect.logic; + +public interface TimeredRecipe extends SimpleTickerDelay { + abstract float getTickerSpeed(); + +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/compat/jei/JEIAliasesHelper.java b/src/main/java/com/devdyna/cakesticklib/api/compat/jei/JEIAliasesHelper.java new file mode 100644 index 0000000..759921c --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/compat/jei/JEIAliasesHelper.java @@ -0,0 +1,40 @@ +package com.devdyna.cakesticklib.api.compat.jei; + +import static com.devdyna.cakesticklib.CakeStickLib.MODULE_ID; + +import java.util.Arrays; +import java.util.List; + +import com.devdyna.cakesticklib.api.utils.x; + +import mezz.jei.api.registration.IIngredientAliasRegistration; +import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.registries.DeferredHolder; + +public class JEIAliasesHelper { + + public static class Aliases { + public static final String BLOCK_BREAKER = MODULE_ID + ".jei.alias.block.break"; + public static final String DRILL = MODULE_ID + ".jei.alias.drill"; + public static final String MINER = MODULE_ID + ".jei.alias.miner"; + public static final String TREE_CUTTER = MODULE_ID + ".jei.alias.tree.cutter"; + public static final String TREE_FELLER = MODULE_ID + ".jei.alias.tree.feller"; + public static final String ENTITY_KILLER = MODULE_ID + ".jei.alias.entity.killer"; + public static final String FAKEPLAYER = MODULE_ID + ".jei.alias.fakeplayer"; + public static final String HOPPER = MODULE_ID + ".jei.alias.hopper"; + public static final String ITEM_COLLECTOR = MODULE_ID + ".jei.alias.item.collector"; + public static final String ENTITY_MOVER = MODULE_ID + ".jei.alias.entity.mover"; + public static final String REDSTONE_SENSIBLE = MODULE_ID + ".jei.alias.redstone.sensible"; + + } + + public static void addAlias(IIngredientAliasRegistration r, + List> i, + String... alias) { + + i.stream() + .map(DeferredHolder::get).map(x::item) + .forEach(e -> Arrays.asList(alias).forEach(a -> r.addAlias(e, a))); + + } +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/CropEntityInteraction.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/CropEntityInteraction.java index c943d4f..9fa3d1f 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/CropEntityInteraction.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/CropEntityInteraction.java @@ -13,7 +13,7 @@ public interface CropEntityInteraction { - static List> EntityTypeSafe = List.of(EntityType.FOX, EntityType.BEE); + static List> entityTypeSafe = List.of(EntityType.FOX, EntityType.BEE); /** * By default it dont stuck entity inside @@ -21,14 +21,14 @@ public interface CropEntityInteraction { *
* To make that you NEED to concat canStuckEntityWhen() */ - boolean HurtWhenInside(); + boolean hurtWhenInside(); - boolean HurtWhenStep(); + boolean hurtWhenStep(); - boolean StuckWhenInside(); + boolean stuckWhenInside(); default boolean stuckCondition(Entity entity) { - return entity instanceof LivingEntity && !EntityTypeSafe.contains(entity.getType()); + return entity instanceof LivingEntity && !entityTypeSafe.contains(entity.getType()); } default boolean hurtCondition(Entity entity, Level level) { @@ -46,14 +46,14 @@ default Vec3 speedFactor() { static double hurt = 0.003000000026077032; default void getEntityInside(BlockState state, ServerLevel level, BlockPos pos, Entity entity) { - if (StuckWhenInside()) + if (stuckWhenInside()) entity.makeStuckInBlock(state, speedFactor()); - if (HurtWhenInside()) + if (hurtWhenInside()) entity.hurtServer(level, level.damageSources().sweetBerryBush(), 1.0f); } default void getStepEntityOn(ServerLevel level, BlockPos pos, BlockState state, Entity entity) { - if (HurtWhenStep()) + if (hurtWhenStep()) entity.hurtServer(level, level.damageSources().sweetBerryBush(), 1.0f); } diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/Harvestable.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/Harvestable.java index ee7ee27..9328336 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/Harvestable.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/Harvestable.java @@ -2,9 +2,11 @@ import java.util.List; +import com.devdyna.cakesticklib.api.RandomUtil; import com.devdyna.cakesticklib.setup.Config; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -13,25 +15,44 @@ public interface Harvestable { - List getItemResult(Level level, BlockState state, BlockPos pos, Player player, ItemStack tool); + static boolean getConfig() { + return Config.HARVESTABLE_ACTION.get(); + } + + boolean canHarvest(Harvestable.Context ctx); + + List getItemsResult(Harvestable.Context ctx); + + /** + * Called after successfully collect all items , only to remove mature plants + */ + void replant(Harvestable.Context ctx); + + default void simpleAgeResetReplant(Harvestable.Context ctx) { + ctx.level().setBlockAndUpdate(ctx.pos(), ctx.state().setValue(getAgeProperty(), 0)); + } - int maxAge(); + default void simpleAgeRedutionReplant(Harvestable.Context ctx) { + ctx.level().setBlockAndUpdate(ctx.pos(), + ctx.state().setValue(getAgeProperty(), + (int) RandomUtil.between(ctx.level(), 0, getMaxAge() - 2))); + } - boolean canBeHarvested(BlockState state); + IntegerProperty getAgeProperty(); - IntegerProperty getPublicAgeProperty(); + int getMaxAge(); - default boolean harvestCrop(Level level, BlockState state, BlockPos pos, Player player, ItemStack tool) { - if (!level.isClientSide() && canBeHarvested(state) && Config.HARVESTABLE_ACTION.get()) { + public record Context(Level level, BlockPos pos, Player player) { + public static Context of(Level l, BlockPos p, Player e) { + return new Context(l, p, e); + } - getItemResult(level, state, pos, player, tool) - .forEach(item -> player.addItem(item)); + public BlockState state() { + return level.getBlockState(pos); + } - level.setBlockAndUpdate(pos, - state.setValue(getPublicAgeProperty(), level.getRandom().nextInt(maxAge() - 2))); - return true; + public BlockState state(Direction d) { + return level.getBlockState(pos.relative(d)); } - return false; } - } diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/PlantHandler.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/PlantHandler.java deleted file mode 100644 index b396e3c..0000000 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/PlantHandler.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.devdyna.cakesticklib.api.factories.plants; - -import java.util.ArrayList; -import java.util.List; - -import com.mojang.logging.LogUtils; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.properties.IntegerProperty; - -/** - * Functional Interface to allow compatibility with (Synergy) Harvester to - * harvest stuff safetly - * - * Credits : @DevDyna - */ -public interface PlantHandler { - - public enum HarvestMode { - /* - * Melons and Pumpkings - */ - BLOCK_NO_REPLANT, - - /* - * All Crops - */ - BLOCK_REPLANT, - - /** - * SugarCanes , Cactus and Bamboo - */ - BIG_PLANT; - } - - /** - * the result item after be broken a single block - *
- *
- * when BIG_PLANT it will return it foreach times was broken - */ - List itemResult(Level level, BlockPos pos); - - /** - * block to replant - *
- *
- * require to use setblock! - *
- *
- * ONLY WORK WITH BLOCK_REPLANT - */ - void blockReplanted(Level level, BlockPos pos); - - /** - * property of crop age - */ - IntegerProperty getProperty(); - - /** - * Type of mode to harvest it - */ - HarvestMode getMode(); - - /** - * Condition of when a block can be harvested - *
- *
- * Heavly suggested - *
- *
- * use .isMaxAge(BlockState) when the block is a crop - *
- *
- * or check block above on BIG_PLANTS - */ - boolean whenCanBeHarvested(Level level, BlockPos pos); - - /** - * Try to harvest the block - *
- *
- * Useful on custom Harvesting - * - * @return item harvesteds - */ - default List execute(Level level, BlockPos pos) { - - var state = level.getBlockState(pos); - var block = state.getBlock(); - - switch (getMode()) { - - case HarvestMode.BLOCK_NO_REPLANT: - if (whenCanBeHarvested(level, pos)) { - level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); - return itemResult(level, pos); - } - break; - - case HarvestMode.BLOCK_REPLANT: - if (whenCanBeHarvested(level, pos)) { - blockReplanted(level, pos); - return itemResult(level, pos); - } - break; - - case HarvestMode.BIG_PLANT: - if (whenCanBeHarvested(level, pos)) { - - ArrayList list = new ArrayList<>(); - while (level.getBlockState(pos.above()).is(block)) { - pos = pos.above(); - level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); - itemResult(level, pos).forEach(t -> list.add(t)); - } - return list; - } else - break; - - default: - LogUtils.getLogger().error("UNKNOWN HARVEST MODE"); - break; - } - return null; - } - -} diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java index 3eb8cf9..8554445 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java @@ -9,8 +9,6 @@ import java.util.function.BiFunction; import javax.annotation.Nullable; - -import com.devdyna.cakesticklib.api.factories.plants.builder.BaseCropBlock; import com.devdyna.cakesticklib.setup.Config; import net.minecraft.core.BlockPos; @@ -45,6 +43,7 @@ * * Credits : @DevDyna */ + public class VanillaPlants { static int treeHarvestingBlockLimit = Config.TREE_CUTTING_LIMIT.get(); @@ -80,54 +79,60 @@ public static List checkReplant(Level level, BlockPos pos, @Nullable var state = level.getBlockState(pos); var block = state.getBlock(); + if (block instanceof Harvestable harvestable) { - // skip BaseCropBlock plants due it already support Harvestable - if (block instanceof BaseCropBlock) - return null; + var ctx = Harvestable.Context.of(level, pos, player); + + if (harvestable.canHarvest(ctx)) { + harvestable.replant(ctx); + return harvestable.getItemsResult(ctx); + } + + } if (block instanceof CropBlock crop) { if (crop.isMaxAge(state)) { // synergy custom crops - if (crop instanceof PlantHandler handler) { - level.setBlockAndUpdate(pos, state.setValue(handler.getProperty(), 0)); + // if (crop instanceof PlantHandler handler) { + // level.setBlockAndUpdate(pos, state.setValue(handler.getProperty(), 0)); + // if (level.isClientSide()) + // onClientClick(level, player, hand, pos); + // else + // return Block.getDrops(state, (ServerLevel) level, pos, null); + + // } else { + + try { + // vanilla crops + if (block instanceof BeetrootBlock) + level.setBlockAndUpdate(pos, state.setValue(BeetrootBlock.AGE, 0)); + else + level.setBlockAndUpdate(pos, state.setValue(CropBlock.AGE, 0)); + if (level.isClientSide()) onClientClick(level, player, hand, pos); else return Block.getDrops(state, (ServerLevel) level, pos, null); - } else { - - try { - // vanilla crops - if (block instanceof BeetrootBlock) - level.setBlockAndUpdate(pos, state.setValue(BeetrootBlock.AGE, 0)); - else - level.setBlockAndUpdate(pos, state.setValue(CropBlock.AGE, 0)); - - if (level.isClientSide()) - onClientClick(level, player, hand, pos); - else - return Block.getDrops(state, (ServerLevel) level, pos, null); - - } catch (Exception e1) { - // crops with different properties - for (IntegerProperty p : allCropProperties) { - - if (state.hasProperty(p)) { - try { - level.setBlockAndUpdate(pos, state.setValue(p, 0)); - if (level.isClientSide()) - onClientClick(level, player, hand, pos); - else - return Block.getDrops(state, (ServerLevel) level, pos, null); - } catch (Exception e2) { - } + } catch (Exception e1) { + // crops with different properties + for (IntegerProperty p : allCropProperties) { + + if (state.hasProperty(p)) { + try { + level.setBlockAndUpdate(pos, state.setValue(p, 0)); + if (level.isClientSide()) + onClientClick(level, player, hand, pos); + else + return Block.getDrops(state, (ServerLevel) level, pos, null); + } catch (Exception e2) { } } - } + } + } } @@ -172,10 +177,10 @@ public static List checkNoReplant(Level level, BlockPos pos) { } public static void onClientClick(Level level, Player player, InteractionHand hand, BlockPos pos) { - if(player != null && hand != null) - player.swing(hand); - if(player != null) - level.playSound(player, pos, SoundEvents.BONE_MEAL_USE, SoundSource.BLOCKS, 3.0F, 2F); + if (player != null && hand != null) + player.swing(hand); + if (player != null) + level.playSound(player, pos, SoundEvents.CROP_BREAK, SoundSource.BLOCKS, 3.0F, 2F); } diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropBlock.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropBlock.java index 11a6d21..c3abcc7 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropBlock.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropBlock.java @@ -3,28 +3,20 @@ import java.util.List; import com.devdyna.cakesticklib.api.factories.plants.Harvestable; -import com.devdyna.cakesticklib.api.factories.plants.PlantHandler; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.CropBlock; import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; -import net.minecraft.world.phys.BlockHitResult; -public class BaseCropBlock extends CropBlock implements Harvestable, PlantHandler { +public abstract class BaseCropBlock extends CropBlock implements Harvestable { - public BaseCropBlock(Properties properties) { - super(properties.mapColor(MapColor.PLANT) + public BaseCropBlock(Properties p) { + super(p.mapColor(MapColor.PLANT) .noCollision() .randomTicks() .instabreak() @@ -33,59 +25,27 @@ public BaseCropBlock(Properties properties) { } @Override - protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, - Player player, InteractionHand hand, BlockHitResult hitResult) { - - if (harvestCrop(level, state, pos, player, stack)) - return InteractionResult.SUCCESS; - else - - return super.useItemOn(stack, state, level, pos, player, hand, hitResult); - } - - @Override - public List getItemResult(Level level, BlockState state, BlockPos pos, Player player, ItemStack tool) { - return Block.getDrops(state, (ServerLevel) level, pos, null, player, tool); - } - - @Override - public int maxAge() { - return getMaxAge(); - } - - @Override - public boolean canBeHarvested(BlockState state) { - return isMaxAge(state); + public boolean canHarvest(Harvestable.Context ctx) { + return isMaxAge(ctx.state()); } @Override - public IntegerProperty getPublicAgeProperty() { - return getAgeProperty(); - } + public List getItemsResult(Harvestable.Context ctx) { - @Override - public List itemResult(Level level, BlockPos pos) { - return Block.getDrops(level.getBlockState(pos), (ServerLevel) level, pos, null); - } + if (ctx.level() instanceof ServerLevel server) + return Block.getDrops(ctx.state(), server, ctx.pos(), null); - @Override - public void blockReplanted(Level level, BlockPos pos) { - level.setBlockAndUpdate(pos, level.getBlockState(pos).setValue(getAgeProperty(), 0)); - } - - @Override - public HarvestMode getMode() { - return HarvestMode.BLOCK_REPLANT; + return List.of(); } @Override - public boolean whenCanBeHarvested(Level level, BlockPos pos) { - return isMaxAge(level.getBlockState(pos)); + public void replant(Harvestable.Context ctx) { + simpleAgeResetReplant(ctx); } @Override - public IntegerProperty getProperty() { - return getAgeProperty(); + public IntegerProperty getAgeProperty() { + return super.getAgeProperty(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropMushroom.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropMushroom.java index f47ceb4..c8d8253 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropMushroom.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseCropMushroom.java @@ -19,13 +19,13 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.neoforge.common.CommonHooks; -public class BaseCropMushroom extends BaseShortCropBlock { +public abstract class BaseCropMushroom extends BaseShortCropBlock { - protected BaseCropMushroom(Properties properties) { - super(properties.sound(SoundType.GRASS)); - this.registerDefaultState( - stateDefinition.any() - .setValue(getAgeProperty(), 0)); + protected BaseCropMushroom(Properties p) { + super(p.sound(SoundType.GRASS)); + // this.registerDefaultState( + // stateDefinition.any() + // .setValue(getAgeProperty(), 0)); } VoxelShape[] SHAPE_BY_AGE = { Block.box(5.0, 0.0, 5.0, 11.0, 5.0, 11.0), Block.box(5.0, 0.0, 5.0, 11.0, 7.0, 11.0), diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseShortCropBlock.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseShortCropBlock.java index ea7231f..69d1117 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseShortCropBlock.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseShortCropBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class BaseShortCropBlock extends BaseCropBlock { +public abstract class BaseShortCropBlock extends BaseCropBlock { public static final int MAX_AGE = 5; public static final IntegerProperty AGE = BlockStateProperties.AGE_5; @@ -29,7 +29,7 @@ public BaseShortCropBlock(BlockBehaviour.Properties p) { } @Override - protected IntegerProperty getAgeProperty() { + public IntegerProperty getAgeProperty() { return AGE; } diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseWildCropBlock.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseWildCropBlock.java index d4bd7f2..405829c 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseWildCropBlock.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/builder/BaseWildCropBlock.java @@ -11,10 +11,10 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; -public class BaseWildCropBlock extends BushBlock { +public abstract class BaseWildCropBlock extends BushBlock { - protected BaseWildCropBlock(Properties properties) { - super(properties.mapColor(MapColor.PLANT) + protected BaseWildCropBlock(Properties p) { + super(p.mapColor(MapColor.PLANT) .noCollision() .randomTicks() .instabreak() diff --git a/src/main/java/com/devdyna/cakesticklib/api/recipe/RecipeCodecUtils.java b/src/main/java/com/devdyna/cakesticklib/api/recipe/RecipeCodecUtils.java new file mode 100644 index 0000000..cfa3cd9 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/recipe/RecipeCodecUtils.java @@ -0,0 +1,36 @@ +package com.devdyna.cakesticklib.api.recipe; + +import net.minecraft.world.item.ItemStackTemplate; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.crafting.SizedIngredient; +import net.neoforged.neoforge.fluids.FluidStackTemplate; +import net.neoforged.neoforge.fluids.crafting.FluidIngredient; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; + +public class RecipeCodecUtils { + + public static FluidStackTemplate optionalCodec(FluidStackTemplate f) { + return f.fluid() != null ? f : null; + } + + public static ItemStackTemplate optionalCodec(ItemStackTemplate i) { + return i.item() != null ? i : null; + } + + public static Ingredient optionalCodec(Ingredient i) { + return i.isEmpty() ? null : i; + } + + public static FluidIngredient optionalCodec(FluidIngredient f) { + return f.fluids().isEmpty() ? null : f; + } + + public static SizedIngredient optionalCodec(SizedIngredient i) { + return i.ingredient() == null || i.ingredient().isEmpty() ? null : i; + } + + public static SizedFluidIngredient optionalCodec(SizedFluidIngredient f) { + return f.ingredient() == null || f.ingredient().fluids().isEmpty() ? null : f; + } + +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeBuilder/ItemAttach.java b/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeBuilder/ItemAttach.java index 75f80b4..c8bb460 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeBuilder/ItemAttach.java +++ b/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeBuilder/ItemAttach.java @@ -3,6 +3,7 @@ import java.util.Arrays; import java.util.List; +import com.devdyna.cakesticklib.api.recipe.recipeOutput.ChanceOutput; import com.devdyna.cakesticklib.api.utils.x; import net.minecraft.tags.TagKey; @@ -255,6 +256,8 @@ default BUILDER output(DeferredHolder output, int count) { } } + //use ChanceOutput + @Deprecated public static interface SecondaryOutputItem extends BuilderAttach { abstract BUILDER secondary(ItemStackTemplate output, float chance); @@ -311,6 +314,36 @@ default BUILDER secondary(DeferredHolder secondary, int count, float } } + public static interface ItemOutputChance extends BuilderAttach { + + abstract BUILDER output(ChanceOutput.Item output); + + default BUILDER output(ItemStackTemplate output, float chance) { + return output(ChanceOutput.Item.of(output, chance)); + } + + default BUILDER output(Item output, float chance) { + return output(x.itemTemplate(output), chance); + } + + default BUILDER output(ItemLike output, float chance) { + return output(x.itemTemplate(output), chance); + } + + default BUILDER output(DeferredHolder output, float chance) { + return output(output.get(), chance); + } + + default BUILDER output(Item output, int count, float chance) { + return output(x.itemTemplate(output, count), chance); + } + + default BUILDER output(DeferredHolder output, int count, float chance) { + return output(output.get(), count, chance); + } + + } + public static interface ListedOutputItemStackTemplate extends BuilderAttach { diff --git a/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutput.java b/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutput.java new file mode 100644 index 0000000..a68ea85 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutput.java @@ -0,0 +1,78 @@ +package com.devdyna.cakesticklib.api.recipe.recipeOutput; + +import java.util.Optional; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStackTemplate; +import net.neoforged.neoforge.fluids.FluidStackTemplate; + +public class ChanceOutput { + + /** + * @param chance must be 0.0 -> 1.0 [ 1.0 == 100% ] + */ + public record Item(ItemStackTemplate item, float chance) { + + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + ItemStackTemplate.CODEC.fieldOf("item").forGetter(ChanceOutput.Item::item), + Codec.floatRange(0, 1).fieldOf("chance").forGetter(ChanceOutput.Item::chance)) + .apply(inst, ChanceOutput.Item::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec + .composite( + ItemStackTemplate.STREAM_CODEC, ChanceOutput.Item::item, + ByteBufCodecs.FLOAT, ChanceOutput.Item::chance, + ChanceOutput.Item::new); + + public static final ChanceOutput.Item of(ItemStackTemplate stack, float chance) { + return new ChanceOutput.Item(stack, chance); + } + + public static final Optional optional(ChanceOutput.Item t) { + return t != null ? Optional.of(t) : Optional.empty(); + } + + public static final boolean valid(ChanceOutput.Item t) { + return itemValid(t) && t.chance > 0f && t.chance <= 1f; + } + + public static final boolean itemValid(ChanceOutput.Item t) { + return t != null && t.item != null && t.item.item().value() != null; + } + } + + public record Fluid(FluidStackTemplate fluid, float chance) { + + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + FluidStackTemplate.CODEC.fieldOf("fluid").forGetter(ChanceOutput.Fluid::fluid), + Codec.floatRange(0, 1).fieldOf("chance").forGetter(ChanceOutput.Fluid::chance)) + .apply(inst, ChanceOutput.Fluid::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec + .composite( + FluidStackTemplate.STREAM_CODEC, ChanceOutput.Fluid::fluid, + ByteBufCodecs.FLOAT, ChanceOutput.Fluid::chance, + ChanceOutput.Fluid::new); + + public static final ChanceOutput.Fluid of(FluidStackTemplate fluid, float chance) { + return new ChanceOutput.Fluid(fluid, chance); + } + + public static final Optional optional(ChanceOutput.Fluid t) { + return t != null ? Optional.of(t) : Optional.empty(); + } + + public static final boolean valid(ChanceOutput.Fluid t) { + return fluidValid(t) && t.chance > 0f && t.chance <= 1f; + } + + public static final boolean fluidValid(ChanceOutput.Fluid t) { + return t != null && t.fluid != null && t.fluid.fluid().value() != null; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutputItem.java b/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutputItem.java deleted file mode 100644 index 299416a..0000000 --- a/src/main/java/com/devdyna/cakesticklib/api/recipe/recipeOutput/ChanceOutputItem.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.devdyna.cakesticklib.api.recipe.recipeOutput; - -import java.util.Optional; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStackTemplate; - -/** - * @param chance must be 0.0 -> 1.0 [ 1.0 == 100% ] - */ -public record ChanceOutputItem(ItemStackTemplate item, float chance) { - - public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( - ItemStackTemplate.CODEC.fieldOf("item").forGetter(ChanceOutputItem::item), - Codec.floatRange(0, 1).fieldOf("chance").forGetter(ChanceOutputItem::chance)) - .apply(inst, ChanceOutputItem::new)); - - public static final StreamCodec STREAM_CODEC = StreamCodec - .composite( - ItemStackTemplate.STREAM_CODEC, ChanceOutputItem::item, - ByteBufCodecs.FLOAT, ChanceOutputItem::chance, - ChanceOutputItem::new); - - public static final ChanceOutputItem of(ItemStackTemplate stack, float chance) { - return new ChanceOutputItem(stack, chance); - } - - public static final Optional optional(ChanceOutputItem t) { - return t != null ? Optional.of(t) : Optional.empty(); - } - - public static final boolean valid(ChanceOutputItem t) { - return itemValid(t) && t.chance > 0f && t.chance <= 1f; - } - - public static final boolean itemValid(ChanceOutputItem t) { - return t != null && t.item != null && t.item.item().value() != null; - } -} diff --git a/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtils.java b/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtils.java index 1ab0b8a..fdbe620 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtils.java +++ b/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtils.java @@ -9,6 +9,145 @@ public class ColorUtils { private static final long TICKS_PER_SECOND = 20L; private static final long MILLIS_PER_SECOND = 1000L; + public static final Color BLACK = Color.BLACK; + public static final Color BLUE = Color.BLUE; + public static final Color CYAN = Color.CYAN; + public static final Color DARK_GRAY = Color.DARK_GRAY; + public static final Color GRAY = Color.GRAY; + public static final Color GREEN = Color.GREEN; + public static final Color LIGHT_GRAY = Color.LIGHT_GRAY; + public static final Color MAGENTA = Color.MAGENTA; + public static final Color ORANGE = Color.ORANGE; + public static final Color PINK = Color.PINK; + public static final Color RED = Color.RED; + public static final Color WHITE = Color.WHITE; + public static final Color YELLOW = Color.YELLOW; + + // TODO verify if they respect color names + + public static final Color PURPLE = color(128, 0, 128); + public static final Color VIOLET = color(238, 130, 238); + public static final Color INDIGO = color(75, 0, 130); + + public static final Color LIME = color(0, 255, 0); + public static final Color TEAL = color(0, 128, 128); + public static final Color TURQUOISE = color(64, 224, 208); + + public static final Color NAVY = color(0, 0, 128); + public static final Color SKY_BLUE = color(135, 206, 235); + + public static final Color BROWN = color(165, 42, 42); + public static final Color TAN = color(210, 180, 140); + + public static final Color OLIVE = color(128, 128, 0); + public static final Color GOLD = color(255, 215, 0); + + public static final Color SILVER = color(192, 192, 192); + public static final Color MAROON = color(128, 0, 0); + + public static final Color CRIMSON = color(220, 20, 60); + public static final Color FIREBRICK = color(178, 34, 34); + public static final Color SALMON = color(250, 128, 114); + public static final Color CORAL = color(255, 127, 80); + + public static final Color DARK_ORANGE = color(255, 140, 0); + public static final Color PEACH = color(255, 218, 185); + + public static final Color KHAKI = color(240, 230, 140); + public static final Color LEMON = color(255, 250, 205); + + public static final Color FOREST_GREEN = color(34, 139, 34); + public static final Color LIME_GREEN = color(50, 205, 50); + public static final Color SEA_GREEN = color(46, 139, 87); + public static final Color MINT = color(189, 252, 201); + public static final Color SPRING_GREEN = color(0, 255, 127); + + public static final Color AQUA = color(0, 255, 255); + public static final Color AQUAMARINE = color(127, 255, 212); + + public static final Color DODGER_BLUE = color(30, 144, 255); + public static final Color DEEP_SKY_BLUE = color(0, 191, 255); + public static final Color STEEL_BLUE = color(70, 130, 180); + public static final Color ROYAL_BLUE = color(65, 105, 225); + public static final Color MIDNIGHT_BLUE = color(25, 25, 112); + + public static final Color PLUM = color(221, 160, 221); + public static final Color ORCHID = color(218, 112, 214); + public static final Color MEDIUM_PURPLE = color(147, 112, 219); + public static final Color DARK_VIOLET = color(148, 0, 211); + + public static final Color SADDLE_BROWN = color(139, 69, 19); + public static final Color CHOCOLATE = color(210, 105, 30); + public static final Color PERU = color(205, 133, 63); + public static final Color SANDY_BROWN = color(244, 164, 96); + + public static final Color IVORY = color(255, 255, 240); + public static final Color BEIGE = color(245, 245, 220); + public static final Color CREAM = color(255, 253, 208); + public static final Color SNOW = color(255, 250, 250); + + public static final Color DIM_GRAY = color(105, 105, 105); + public static final Color SLATE_GRAY = color(112, 128, 144); + public static final Color GAINSBORO = color(220, 220, 220); + + public static final Color BRONZE = color(205, 127, 50); + public static final Color COPPER = color(184, 115, 51); + + public static final Color HOT_PINK = color(255, 105, 180); + public static final Color DEEP_PINK = color(255, 20, 147); + public static final Color LIGHT_PINK = color(255, 182, 193); + public static final Color ROSE = color(255, 0, 127); + + public static final Color INDIAN_RED = color(205, 92, 92); + public static final Color TOMATO = color(255, 99, 71); + + public static final Color ORANGE_RED = color(255, 69, 0); + public static final Color GOLDENROD = color(218, 165, 32); + public static final Color DARK_GOLDENROD = color(184, 134, 11); + + public static final Color DARK_GREEN = color(0, 100, 0); + public static final Color OLIVE_DRAB = color(107, 142, 35); + public static final Color YELLOW_GREEN = color(154, 205, 50); + public static final Color LAWN_GREEN = color(124, 252, 0); + public static final Color PALE_GREEN = color(152, 251, 152); + public static final Color DARK_SEA_GREEN = color(143, 188, 143); + + public static final Color LIGHT_SEA_GREEN = color(32, 178, 170); + public static final Color DARK_CYAN = color(0, 139, 139); + + public static final Color CORNFLOWER_BLUE = color(100, 149, 237); + public static final Color CADET_BLUE = color(95, 158, 160); + public static final Color POWDER_BLUE = color(176, 224, 230); + public static final Color LIGHT_BLUE = color(173, 216, 230); + public static final Color LIGHT_SKY_BLUE = color(135, 206, 250); + public static final Color DARK_BLUE = color(0, 0, 139); + + public static final Color BLUE_VIOLET = color(138, 43, 226); + public static final Color MEDIUM_ORCHID = color(186, 85, 211); + public static final Color THISTLE = color(216, 191, 216); + public static final Color LAVENDER = color(230, 230, 250); + + public static final Color ROSY_BROWN = color(188, 143, 143); + public static final Color BURLYWOOD = color(222, 184, 135); + public static final Color WHEAT = color(245, 222, 179); + + public static final Color ALICE_BLUE = color(240, 248, 255); + public static final Color ANTIQUE_WHITE = color(250, 235, 215); + public static final Color FLORAL_WHITE = color(255, 250, 240); + public static final Color GHOST_WHITE = color(248, 248, 255); + public static final Color HONEYDEW = color(240, 255, 240); + public static final Color LAVENDER_BLUSH = color(255, 240, 245); + + public static final Color DARK_SLATE_GRAY = color(47, 79, 79); + public static final Color LIGHT_SLATE_GRAY = color(119, 136, 153); + public static final Color SILVER_GRAY = color(192, 192, 192); + + public static final Color CHARCOAL = color(54, 69, 79); + public static final Color AMBER = color(255, 191, 0); + public static final Color EMERALD = color(80, 200, 120); + public static final Color RUBY = color(224, 17, 95); + public static final Color SAPPHIRE = color(15, 82, 186); + public static Color color(int r, int g, int b) { return new Color(r, g, b); } diff --git a/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java b/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java index 4799cc1..435afc7 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java +++ b/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java @@ -1,5 +1,6 @@ package com.devdyna.cakesticklib.api.utils; +import java.util.ArrayList; import java.util.List; import net.minecraft.core.registries.Registries; @@ -8,12 +9,27 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public class LootTableHelper { + /** + * mainly useful to define valid blocks on Datagen SubLootBlocksProvider + */ + public List getValidBlocks(DeferredRegister.Blocks... blocks) { + List result = new ArrayList<>(); + List.of(blocks).forEach(t -> result.addAll(t.getEntries() + .stream() + .map(DeferredHolder::get) + .toList())); + return result; + } + public static LootTable getLootTable(Level level, Identifier rl) { return level.getServer().reloadableRegistries() .getLootTable(ResourceKey diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java index d7aa510..7bc72cd 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java @@ -15,11 +15,14 @@ public static void inventoryDestroy(BreakBlockEvent event) { var pos = event.getPos(); var be = level.getBlockEntity(pos); - if (be instanceof ItemStorageBlock storage) - if (storage.dropOnBreak()) - for (int i = 0; i < storage.getSlots(); i++) - Block.popResource((Level) level, pos, storage.getStackInSlot(i)); - + try { + if (be instanceof ItemStorageBlock storage) + if (storage.dropOnBreak()) + for (int i = 0; i < storage.getSlots(); i++) + Block.popResource((Level) level, pos, storage.getStackInSlot(i)); + } catch (Exception e) { + //it must prevent persistent broken storage blocks on break + } } } diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/events/VanillaHarvestable.java b/src/main/java/com/devdyna/cakesticklib/setup/common/events/VanillaHarvestable.java index 32eb144..7da28a6 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/events/VanillaHarvestable.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/events/VanillaHarvestable.java @@ -3,7 +3,6 @@ import java.util.*; import com.devdyna.cakesticklib.api.factories.plants.*; -import com.devdyna.cakesticklib.setup.Config; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; @@ -18,7 +17,7 @@ public static void harvestVanillaCrops(PlayerInteractEvent.RightClickBlock event var player = event.getEntity(); var hand = event.getHand(); - if (!Config.HARVESTABLE_ACTION.get()) + if (!Harvestable.getConfig()) return; List check = VanillaPlants.checkReplant(level, pos,player,hand); diff --git a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java index e17905a..2af656b 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java @@ -5,6 +5,7 @@ import java.util.List; +import com.devdyna.cakesticklib.api.compat.jei.JEIAliasesHelper; import com.devdyna.cakesticklib.api.datagen.LangUtils; import com.devdyna.cakesticklib.setup.registry.*; @@ -21,6 +22,23 @@ public DataLang(PackOutput o) { @Override protected void addTranslations() { + + //jei aliases + add(JEIAliasesHelper.Aliases.BLOCK_BREAKER, "Block Breaker"); + add(JEIAliasesHelper.Aliases.DRILL, "Drill"); + add(JEIAliasesHelper.Aliases.MINER, "Miner"); + add(JEIAliasesHelper.Aliases.TREE_CUTTER, "Tree cutter"); + add(JEIAliasesHelper.Aliases.TREE_FELLER, "Tree feller"); + add(JEIAliasesHelper.Aliases.ENTITY_KILLER, "Entity killer"); + add(JEIAliasesHelper.Aliases.FAKEPLAYER, "FakePlayer"); + add(JEIAliasesHelper.Aliases.HOPPER, "Hopper"); + add(JEIAliasesHelper.Aliases.ITEM_COLLECTOR, "Item Collector"); + add(JEIAliasesHelper.Aliases.ENTITY_MOVER, "Entity Mover"); + add(JEIAliasesHelper.Aliases.REDSTONE_SENSIBLE, "Redstone Sensible"); + + + + // mainly for Item Tooltips add(MODULE_ID + ".hold.shift", "§8Hold [" + TIP_COLOR + "Shift§8] to see more details"); add(MODULE_ID + ".item.disabled", TIP_COLOR + "Item-Form unobtainable");