Start adding cultivator and fish items, and recipe builder adjustments as well is egg block adjustments

This commit is contained in:
2026-06-17 14:59:01 -04:00
parent a7ad9f50c1
commit 4f83a41fe9
72 changed files with 3407 additions and 24 deletions
@@ -7,6 +7,7 @@ import dev.architectury.registry.menu.MenuRegistry;
import dev.architectury.registry.client.rendering.BlockEntityRendererRegistry; import dev.architectury.registry.client.rendering.BlockEntityRendererRegistry;
import net.cmr.jurassicrevived.block.ModBlocks; import net.cmr.jurassicrevived.block.ModBlocks;
import net.cmr.jurassicrevived.block.entity.ModBlockEntities; import net.cmr.jurassicrevived.block.entity.ModBlockEntities;
import net.cmr.jurassicrevived.block.renderer.CultivatorBlockEntityRenderer;
import net.cmr.jurassicrevived.block.renderer.TankBlockEntityRenderer; import net.cmr.jurassicrevived.block.renderer.TankBlockEntityRenderer;
import net.cmr.jurassicrevived.entity.ModEntities; import net.cmr.jurassicrevived.entity.ModEntities;
import net.cmr.jurassicrevived.entity.client.*; import net.cmr.jurassicrevived.entity.client.*;
@@ -129,6 +130,7 @@ public class CommonClientClass {
LifecycleEvent.SETUP.register(() -> { LifecycleEvent.SETUP.register(() -> {
BlockEntityRendererRegistry.register(ModBlockEntities.TANK_BE.get(), TankBlockEntityRenderer::new); BlockEntityRendererRegistry.register(ModBlockEntities.TANK_BE.get(), TankBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(ModBlockEntities.CULTIVATOR_BE.get(), CultivatorBlockEntityRenderer::new);
}); });
} }
@@ -143,6 +145,7 @@ public class CommonClientClass {
MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYONIC_MACHINE_MENU.get(), EmbryonicMachineScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYONIC_MACHINE_MENU.get(), EmbryonicMachineScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYO_CALCIFICATION_MACHINE_MENU.get(), EmbryoCalcificationMachineScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYO_CALCIFICATION_MACHINE_MENU.get(), EmbryoCalcificationMachineScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.INCUBATOR_MENU.get(), IncubatorScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.INCUBATOR_MENU.get(), IncubatorScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.CULTIVATOR_MENU.get(), CultivatorScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.TANK_MENU.get(), TankScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.TANK_MENU.get(), TankScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.POWER_CELL_MENU.get(), PowerCellScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.POWER_CELL_MENU.get(), PowerCellScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.WOOD_CRATE_MENU.get(), CrateScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.WOOD_CRATE_MENU.get(), CrateScreen::new);
@@ -93,6 +93,8 @@ public class ModBlocks {
() -> new EmbryoCalcificationMachineBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_BLACK))); () -> new EmbryoCalcificationMachineBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_BLACK)));
public static final RegistrySupplier<Block> INCUBATOR = registerBlock("incubator", public static final RegistrySupplier<Block> INCUBATOR = registerBlock("incubator",
() -> new IncubatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_BLACK))); () -> new IncubatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_BLACK)));
public static final RegistrySupplier<Block> CULTIVATOR = registerBlock("cultivator",
() -> new CultivatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_BLACK)));
public static final RegistrySupplier<Block> WHITE_GENERATOR = registerBlock("white_generator", public static final RegistrySupplier<Block> WHITE_GENERATOR = registerBlock("white_generator",
() -> new GeneratorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY))); () -> new GeneratorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY)));
public static final RegistrySupplier<Block> WHITE_DNA_EXTRACTOR = registerBlock("white_dna_extractor", public static final RegistrySupplier<Block> WHITE_DNA_EXTRACTOR = registerBlock("white_dna_extractor",
@@ -111,6 +113,8 @@ public class ModBlocks {
() -> new EmbryoCalcificationMachineBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY))); () -> new EmbryoCalcificationMachineBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY)));
public static final RegistrySupplier<Block> WHITE_INCUBATOR = registerBlock("white_incubator", public static final RegistrySupplier<Block> WHITE_INCUBATOR = registerBlock("white_incubator",
() -> new IncubatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY))); () -> new IncubatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY)));
public static final RegistrySupplier<Block> WHITE_CULTIVATOR = registerBlock("white_cultivator",
() -> new CultivatorBlock(BlockBehaviour.Properties.of().noOcclusion().requiresCorrectToolForDrops().strength(4f).noLootTable().mapColor(MapColor.COLOR_LIGHT_GRAY)));
//? if >1.20.1 { //? if >1.20.1 {
/*public static final RegistrySupplier<Block> ROYAL_FERN = registerBlock("royal_fern", /*public static final RegistrySupplier<Block> ROYAL_FERN = registerBlock("royal_fern",
@@ -525,6 +529,15 @@ public class ModBlocks {
public static final RegistrySupplier<Block> MUSSASAURUS_EGG = registerBlock("mussasaurus_egg", public static final RegistrySupplier<Block> MUSSASAURUS_EGG = registerBlock("mussasaurus_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.MUSSASAURUS)); () -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.MUSSASAURUS));
public static final RegistrySupplier<Block> COELACANTH_EGG = registerBlock("coelacanth_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.COELACANTH));
public static final RegistrySupplier<Block> MAWSONIA_EGG = registerBlock("mawsonia_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.MAWSONIA));
public static final RegistrySupplier<Block> ALLIGATOR_GAR_EGG = registerBlock("alligator_gar_egg",
() -> new EggBlock(BlockBehaviour.Properties.of().strength(4f).requiresCorrectToolForDrops(), ModEntities.ALLIGATOR_GAR));
public static final RegistrySupplier<Block> INCUBATED_APATOSAURUS_EGG = registerBlock("incubated_apatosaurus_egg", public static final RegistrySupplier<Block> INCUBATED_APATOSAURUS_EGG = registerBlock("incubated_apatosaurus_egg",
@@ -0,0 +1,233 @@
package net.cmr.jurassicrevived.block.custom;
//? if >1.20.1 {
/*import com.mojang.serialization.MapCodec;
import net.minecraft.core.component.DataComponents;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.ItemInteractionResult;
*///?}
import dev.architectury.registry.menu.MenuRegistry;
import net.cmr.jurassicrevived.block.entity.ModBlockEntities;
import net.cmr.jurassicrevived.block.entity.custom.CultivatorBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ItemParticleOption;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource;
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.item.Items;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.Nullable;
public class CultivatorBlock extends BaseEntityBlock {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public static final BooleanProperty LIT = BlockStateProperties.LIT;
//? if >1.20.1 {
/*public static final MapCodec<CultivatorBlock> CODEC = simpleCodec(CultivatorBlock::new);
@Override protected MapCodec<? extends BaseEntityBlock> codec() { return CODEC; }
*///?}
public CultivatorBlock(Properties properties) {
super(properties);
}
private static final VoxelShape SHAPE = Shapes.box(
0.0 / 16.0, 0.0 / 16.0, 0.0 / 16.0,
16.0 / 16.0, 32.0 / 16.0, 16.0 / 16.0
);
@Override
public BlockState rotate(BlockState state, Rotation rotation) {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)));
}
@Override
public BlockState mirror(BlockState state, Mirror mirror) {
return state.rotate(mirror.getRotation(state.getValue(FACING)));
}
@Override
public @Nullable BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite().getOpposite()).setValue(LIT, false);
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(FACING, LIT);
}
@Override
public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
}
@Override
public @Nullable BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new CultivatorBlockEntity(blockPos, blockState);
}
@Override
public RenderShape getRenderShape(BlockState state) {
return RenderShape.MODEL;
}
@Override
//? if >1.20.1 {
/*public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
*///?} else {
public void playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
//?}
if (!level.isClientSide) {
if (player.getAbilities().instabuild) {
level.removeBlockEntity(pos);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL);
//? if >1.20.1 {
/*return state;
*///?} else {
return;
//?}
}
BlockEntity be = level.getBlockEntity(pos);
if (be instanceof CultivatorBlockEntity fbe) {
ItemStack stack = new ItemStack(this.asItem());
if (!fbe.isEmptyForDrop()) {
//? if >1.20.1 {
/*CompoundTag tag = fbe.saveWithoutMetadata(level.registryAccess());
var beTypeKey = level.registryAccess().registryOrThrow(Registries.BLOCK_ENTITY_TYPE).getKey(fbe.getType());
if (beTypeKey != null) tag.putString("id", beTypeKey.toString());
stack.set(DataComponents.BLOCK_ENTITY_DATA, CustomData.of(tag));
*///?} else {
CompoundTag tag = fbe.saveWithoutMetadata();
stack.getOrCreateTagElement("BlockEntityTag").merge(tag);
//?}
}
popResource(level, pos, stack);
level.removeBlockEntity(pos);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL);
//? if >1.20.1 {
/*return state;
*///?} else {
return;
//?}
}
}
super.playerWillDestroy(level, pos, state, player);
//? if >1.20.1 {
/*return state;
*///?} else {
return;
//?}
}
//? if >1.20.1 {
/*@Override
protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHitResult) {
BlockEntity entity = pLevel.getBlockEntity(pPos);
if (entity instanceof CultivatorBlockEntity cultivatorBlockEntity) {
if (!pLevel.isClientSide()) {
if (pStack.is(Items.WATER_BUCKET)) {
long currentAmount = cultivatorBlockEntity.getFluid().getAmount();
if (16000 - currentAmount >= 1000) {
if (!pPlayer.getAbilities().instabuild) {
pPlayer.setItemInHand(pHand, new ItemStack(Items.BUCKET));
}
cultivatorBlockEntity.getFluidHandler(null).fill(dev.architectury.fluid.FluidStack.create(net.minecraft.world.level.material.Fluids.WATER, 1000), false);
return ItemInteractionResult.SUCCESS;
}
}
MenuRegistry.openExtendedMenu((ServerPlayer) pPlayer, cultivatorBlockEntity);
}
return ItemInteractionResult.sidedSuccess(pLevel.isClientSide());
}
return ItemInteractionResult.sidedSuccess(pLevel.isClientSide());
}
*///?} else {
@Override
public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
BlockEntity entity = level.getBlockEntity(pos);
if (entity instanceof CultivatorBlockEntity cultivatorBlockEntity) {
if (!level.isClientSide()) {
ItemStack stack = player.getItemInHand(hand);
if (stack.is(Items.WATER_BUCKET)) {
long currentAmount = cultivatorBlockEntity.getFluid().getAmount();
if (16000 - currentAmount >= 1000) {
if (!player.getAbilities().instabuild) {
player.setItemInHand(hand, new ItemStack(Items.BUCKET));
}
cultivatorBlockEntity.getFluidHandler(null).fill(dev.architectury.fluid.FluidStack.create(net.minecraft.world.level.material.Fluids.WATER, 1000), false);
return InteractionResult.SUCCESS;
}
}
MenuRegistry.openExtendedMenu((ServerPlayer) player, cultivatorBlockEntity);
}
return InteractionResult.sidedSuccess(level.isClientSide());
}
return InteractionResult.sidedSuccess(level.isClientSide());
}
//?}
@Override
public @Nullable <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> blockEntityType) {
if (blockEntityType != ModBlockEntities.CULTIVATOR_BE.get()) return null;
if (level.isClientSide) {
return null;
} else {
return createTickerHelper(blockEntityType, ModBlockEntities.CULTIVATOR_BE.get(),
(level1, blockPos, blockState, cultivatorBlockEntity) -> cultivatorBlockEntity.tick(level1, blockPos, blockState));
}
}
@Override
public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) {
if (!state.getValue(LIT)) {
return;
}
double xPos = (double)pos.getX() + 0.5;
double yPos = pos.getY();
double zPos = (double)pos.getZ() + 0.5;
Direction direction = state.getValue(FACING).getOpposite();
Direction.Axis axis = direction.getAxis();
double defaultOffset = random.nextDouble() * 0.6 - 0.3;
double xOffsets = axis == Direction.Axis.X ? (double)direction.getStepX() * 0.52 : defaultOffset;
double yOffset = random.nextDouble() * 6.0 / 8.0;
double zOffset = axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.52 : defaultOffset;
level.addParticle(ParticleTypes.SMOKE, xPos + xOffsets, yPos + yOffset, zPos + zOffset, 0.0, 0.0, 0.0);
BlockEntity be = level.getBlockEntity(pos);
if(be instanceof CultivatorBlockEntity cultivatorBlockEntity && !cultivatorBlockEntity.itemHandler.getItem(1).isEmpty()) {
level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, cultivatorBlockEntity.itemHandler.getItem(1)),
xPos + xOffsets, yPos + yOffset, zPos + zOffset, 0.0, 0.0, 0.0);
}
}
}
@@ -2,6 +2,7 @@ package net.cmr.jurassicrevived.block.custom;
import net.cmr.jurassicrevived.block.entity.custom.EggBlockEntity; import net.cmr.jurassicrevived.block.entity.custom.EggBlockEntity;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@@ -12,12 +13,20 @@ import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.SimpleWaterloggedBlock;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
@@ -26,14 +35,43 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
public class EggBlock extends Block implements EntityBlock { public class EggBlock extends Block implements EntityBlock, SimpleWaterloggedBlock {
private final Supplier<? extends EntityType<? extends Mob>> toSpawn; private final Supplier<? extends EntityType<? extends Mob>> toSpawn;
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
private final int hatchSeconds = 1200; private final int hatchSeconds = 1200;
public EggBlock(Properties pProperties, Supplier<? extends EntityType<? extends Mob>> toSpawn) { public EggBlock(Properties pProperties, Supplier<? extends EntityType<? extends Mob>> toSpawn) {
super(pProperties); super(pProperties);
this.toSpawn = toSpawn; this.toSpawn = toSpawn;
this.registerDefaultState(this.stateDefinition.any().setValue(WATERLOGGED, false));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(WATERLOGGED);
}
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos());
return this.defaultBlockState().setValue(WATERLOGGED, fluidstate.getType() == Fluids.WATER);
}
@Override
@SuppressWarnings("deprecation")
public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos currentPos, BlockPos neighborPos) {
if (state.getValue(WATERLOGGED)) {
level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level));
}
return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos);
}
@Override
@SuppressWarnings("deprecation")
public FluidState getFluidState(BlockState state) {
return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state);
} }
private static final VoxelShape EGG_SHAPE = Block.box(6.5D, 0.0D, 6.5D, 9.5D, 4.0D, 9.5D); private static final VoxelShape EGG_SHAPE = Block.box(6.5D, 0.0D, 6.5D, 9.5D, 4.0D, 9.5D);
@@ -2,6 +2,7 @@ package net.cmr.jurassicrevived.block.custom;
import net.cmr.jurassicrevived.block.entity.custom.EggBlockEntity; import net.cmr.jurassicrevived.block.entity.custom.EggBlockEntity;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@@ -12,12 +13,20 @@ import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.SimpleWaterloggedBlock;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
@@ -26,14 +35,44 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
public class IncubatedEggBlock extends Block implements EntityBlock { public class IncubatedEggBlock extends Block implements EntityBlock, SimpleWaterloggedBlock
{
private final Supplier<? extends EntityType<? extends Mob>> toSpawn; private final Supplier<? extends EntityType<? extends Mob>> toSpawn;
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
private final int hatchSeconds = 60; private final int hatchSeconds = 60;
public IncubatedEggBlock(Properties pProperties, Supplier<? extends EntityType<? extends Mob>> toSpawn) { public IncubatedEggBlock(Properties pProperties, Supplier<? extends EntityType<? extends Mob>> toSpawn) {
super(pProperties); super(pProperties);
this.toSpawn = toSpawn; this.toSpawn = toSpawn;
this.registerDefaultState(this.stateDefinition.any().setValue(WATERLOGGED, false));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(WATERLOGGED);
}
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos());
return this.defaultBlockState().setValue(WATERLOGGED, fluidstate.getType() == Fluids.WATER);
}
@Override
@SuppressWarnings("deprecation")
public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos currentPos, BlockPos neighborPos) {
if (state.getValue(WATERLOGGED)) {
level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level));
}
return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos);
}
@Override
@SuppressWarnings("deprecation")
public FluidState getFluidState(BlockState state) {
return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state);
} }
private static final VoxelShape EGG_SHAPE = Block.box(6.5D, 0.0D, 6.5D, 9.5D, 4.0D, 9.5D); private static final VoxelShape EGG_SHAPE = Block.box(6.5D, 0.0D, 6.5D, 9.5D, 4.0D, 9.5D);
@@ -109,6 +109,9 @@ public class ModBlockEntities {
ModBlocks.CHILESAURUS_EGG.get(), ModBlocks.CHILESAURUS_EGG.get(),
ModBlocks.MUSSASAURUS_EGG.get(), ModBlocks.MUSSASAURUS_EGG.get(),
ModBlocks.THESCELOSAURUS_EGG.get(), ModBlocks.THESCELOSAURUS_EGG.get(),
ModBlocks.COELACANTH_EGG.get(),
ModBlocks.MAWSONIA_EGG.get(),
ModBlocks.ALLIGATOR_GAR_EGG.get(),
ModBlocks.INCUBATED_APATOSAURUS_EGG.get(), ModBlocks.INCUBATED_APATOSAURUS_EGG.get(),
ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(), ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(),
ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get(), ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get(),
@@ -237,6 +240,10 @@ public class ModBlockEntities {
BLOCK_ENTITIES.register("incubator_be", () -> BlockEntityType.Builder.of( BLOCK_ENTITIES.register("incubator_be", () -> BlockEntityType.Builder.of(
IncubatorBlockEntity::new, ModBlocks.INCUBATOR.get(), ModBlocks.WHITE_INCUBATOR.get()).build(null)); IncubatorBlockEntity::new, ModBlocks.INCUBATOR.get(), ModBlocks.WHITE_INCUBATOR.get()).build(null));
public static final RegistrySupplier<BlockEntityType<CultivatorBlockEntity>> CULTIVATOR_BE =
BLOCK_ENTITIES.register("cultivator_be", () -> BlockEntityType.Builder.of(
CultivatorBlockEntity::new, ModBlocks.CULTIVATOR.get(), ModBlocks.WHITE_CULTIVATOR.get()).build(null));
public static void register() { public static void register() {
BLOCK_ENTITIES.register(); BLOCK_ENTITIES.register();
} }
@@ -0,0 +1,576 @@
package net.cmr.jurassicrevived.block.entity.custom;
import dev.architectury.fluid.FluidStack;
import dev.architectury.registry.menu.ExtendedMenuProvider;
import net.cmr.jurassicrevived.block.custom.CultivatorBlock;
import net.cmr.jurassicrevived.block.entity.ModBlockEntities;
import net.cmr.jurassicrevived.block.entity.energy.ModEnergyStorage;
import net.cmr.jurassicrevived.block.entity.energy.ModEnergyUtil;
import net.cmr.jurassicrevived.config.JRConfigManager;
import net.cmr.jurassicrevived.platform.transfer.InternalFluidHandler;
import net.cmr.jurassicrevived.platform.transfer.InternalFluidProvider;
import net.cmr.jurassicrevived.recipe.CultivatorRecipe;
import net.cmr.jurassicrevived.recipe.CultivatorRecipeInput;
import net.cmr.jurassicrevived.recipe.ModRecipes;
import net.cmr.jurassicrevived.screen.custom.CultivatorMenu;
import net.cmr.jurassicrevived.util.ModTags;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.HopperBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
//? if >1.20.1 {
/*import net.minecraft.core.HolderLookup;
import net.minecraft.world.item.crafting.RecipeHolder;
*///?} else {
import net.minecraft.core.RegistryAccess;
//?}
import java.util.Optional;
public class CultivatorBlockEntity extends BlockEntity implements ExtendedMenuProvider, ModEnergyUtil.EnergyProvider, InternalFluidProvider
{
private boolean allowInternalExtraction = false;
public final SimpleContainer itemHandler = new SimpleContainer(5) {
@Override
public void setChanged() {
super.setChanged();
CultivatorBlockEntity.this.setChanged();
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3);
}
}
@Override
public boolean canPlaceItem(int slot, ItemStack stack) {
if (slot >= 2 && slot <= 4) return false;
if (slot == WATER_SLOT) {
return stack.is(Items.WATER_BUCKET);
}
if (slot == FOSSILBLOCK_SLOT) return stack.is(net.cmr.jurassicrevived.block.ModBlocks.STONE_FOSSIL.get().asItem()) || stack.is(net.cmr.jurassicrevived.block.ModBlocks.DEEPSLATE_FOSSIL.get().asItem());
return false;
}
@Override
public ItemStack removeItem(int slot, int amount) {
if (slot == FOSSILBLOCK_SLOT && !allowInternalExtraction) {
boolean isPlayer = false;
for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
String className = element.getClassName();
if (className.contains("inventory") || className.contains("player") || className.contains("ServerGamePacketListenerImpl")) {
isPlayer = true;
break;
}
}
if (!isPlayer) return ItemStack.EMPTY;
}
if (slot == WATER_SLOT && getItem(slot).is(Items.WATER_BUCKET)) {
boolean isPlayer = false;
for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
String className = element.getClassName();
if (className.contains("inventory") || className.contains("player") || className.contains("ServerGamePacketListenerImpl")) {
isPlayer = true;
break;
}
}
if (!isPlayer) return ItemStack.EMPTY;
}
return super.removeItem(slot, amount);
}
};
private static final int WATER_SLOT = 0;
private static final int FOSSILBLOCK_SLOT = 1;
private static final int[] OUTPUT_SLOTS = {2, 3, 4};
private static final int WATER_CRAFT_AMOUNT = 250;
private static final long TANK_CAPACITY = 16000;
private FluidStack fluidStack = FluidStack.empty();
private ItemStack lockedOutput = ItemStack.EMPTY;
private String lastInputSignature = "";
private final ContainerData data;
private int progress = 0;
private int maxProgress = 200;
private final int DEFAULT_MAX_PROGRESS = 200;
private static final int TRANSFER_RATE = 1000;
private final ModEnergyStorage energyStorage = createEnergyStorage();
private final InternalFluidHandler fluidHandler = new InternalFluidHandler() {
@Override
public FluidStack getFluid() {
return fluidStack;
}
@Override
public long getCapacity() {
return TANK_CAPACITY;
}
@Override
public long fill(FluidStack stack, boolean simulate) {
if (stack.isEmpty()) return 0;
if (!fluidStack.isEmpty() && fluidStack.getFluid() != stack.getFluid()) return 0;
long space = TANK_CAPACITY - fluidStack.getAmount();
if (space <= 0) return 0;
long toFill = Math.min(space, stack.getAmount());
if (!simulate) {
fluidStack = FluidStack.create(stack.getFluid(), fluidStack.getAmount() + toFill);
setChanged();
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3);
}
}
return toFill;
}
@Override
public FluidStack drain(long amount, boolean simulate) {
if (fluidStack.isEmpty() || amount <= 0) return FluidStack.empty();
long drained = Math.min(amount, fluidStack.getAmount());
FluidStack out = FluidStack.create(fluidStack.getFluid(), drained);
if (!simulate) {
long remaining = fluidStack.getAmount() - drained;
fluidStack = remaining > 0
? FluidStack.create(fluidStack.getFluid(), remaining)
: FluidStack.empty();
setChanged();
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3);
}
}
return out;
}
};
@Override
public InternalFluidHandler getFluidHandler(@Nullable Direction side) {
return this.fluidHandler;
}
public CultivatorBlockEntity(BlockPos pos, BlockState blockState) {
super(ModBlockEntities.CULTIVATOR_BE.get(), pos, blockState);
this.data = new ContainerData() {
@Override
public int get(int pIndex) {
return switch (pIndex) {
case 0 -> CultivatorBlockEntity.this.progress;
case 1 -> CultivatorBlockEntity.this.maxProgress;
default -> 0;
};
}
@Override
public void set(int pIndex, int pValue) {
switch (pIndex) {
case 0 -> CultivatorBlockEntity.this.progress = pValue;
case 1 -> CultivatorBlockEntity.this.maxProgress = pValue;
}
}
@Override
public int getCount() {
return 2;
}
};
}
private ModEnergyStorage createEnergyStorage() {
return new ModEnergyStorage(64000, TRANSFER_RATE) {
@Override
public void onEnergyChanged() {
setChanged();
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3);
}
}
@Override
public boolean canExtract() {
return false;
}
@Override
public int extractEnergy(int maxExtract, boolean simulate) {
return 0;
}
};
}
@Override
public ModEnergyStorage getEnergyStorage(@Nullable Direction direction) {
return this.energyStorage;
}
public FluidStack getFluid() {
return fluidStack;
}
private void setFluid(FluidStack stack) {
this.fluidStack = stack == null || stack.isEmpty() ? FluidStack.empty() : stack;
setChanged();
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3);
}
}
@Override
public Component getDisplayName() {
return Component.translatable("block.jurassicrevived.cultivator");
}
@Override
public void saveExtraData(FriendlyByteBuf buf) {
buf.writeBlockPos(getBlockPos());
}
@Nullable
@Override
public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) {
return new CultivatorMenu(i, inventory, this, this.data);
}
public boolean isEmptyForDrop() {
return itemHandler.isEmpty() && fluidStack.isEmpty() && progress == 0;
}
//? if >1.20.1 {
/*@Override
protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) {
super.saveAdditional(tag, registries);
tag.put("Inventory", saveInventory(registries));
tag.putInt("Prog", this.progress);
tag.putInt("MaxProg", this.maxProgress);
tag.put("Energy", energyStorage.saveNBT());
if (!fluidStack.isEmpty()) {
tag.put("Fluid", fluidStack.write(registries, new CompoundTag()));
}
}
@Override
protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) {
super.loadAdditional(tag, registries);
loadInventory(tag.getList("Inventory", 10), registries);
progress = tag.getInt("Prog");
maxProgress = tag.getInt("MaxProg");
if (tag.contains("Energy")) energyStorage.loadNBT(tag.getCompound("Energy"));
if (tag.contains("Fluid", 10)) {
CompoundTag fluidTag = tag.getCompound("Fluid");
if (fluidTag.contains("id") && fluidTag.contains("amount")) {
fluidStack = FluidStack.read(registries, fluidTag).orElse(FluidStack.empty());
} else {
fluidStack = FluidStack.empty();
}
} else {
fluidStack = FluidStack.empty();
}
}
private ListTag saveInventory(HolderLookup.Provider registries) {
ListTag listTag = new ListTag();
for (int slot = 0; slot < itemHandler.getContainerSize(); slot++) {
ItemStack stack = itemHandler.getItem(slot);
if (!stack.isEmpty()) {
CompoundTag stackTag = new CompoundTag();
stackTag.putByte("Slot", (byte) slot);
listTag.add(stack.save(registries, stackTag));
}
}
return listTag;
}
private void loadInventory(ListTag listTag, HolderLookup.Provider registries) {
itemHandler.clearContent();
for (int i = 0; i < listTag.size(); i++) {
CompoundTag stackTag = listTag.getCompound(i);
int slot = stackTag.getByte("Slot") & 255;
if (slot >= 0 && slot < itemHandler.getContainerSize()) {
itemHandler.setItem(slot, ItemStack.parseOptional(registries, stackTag));
}
}
}
*///?} else {
@Override
protected void saveAdditional(CompoundTag tag) {
super.saveAdditional(tag);
tag.put("Inventory", saveInventory());
tag.putInt("Prog", this.progress);
tag.putInt("MaxProg", this.maxProgress);
tag.put("Energy", energyStorage.saveNBT());
CompoundTag fluidTag = new CompoundTag();
fluidStack.write(fluidTag);
tag.put("Fluid", fluidTag);
}
@Override
public void load(CompoundTag tag) {
super.load(tag);
loadInventory(tag.getList("Inventory", 10));
progress = tag.getInt("Prog");
maxProgress = tag.getInt("MaxProg");
if (tag.contains("Energy")) energyStorage.loadNBT(tag.getCompound("Energy"));
if (tag.contains("Fluid")) fluidStack = FluidStack.read(tag.getCompound("Fluid"));
}
private ListTag saveInventory() {
ListTag listTag = new ListTag();
for (int slot = 0; slot < itemHandler.getContainerSize(); slot++) {
ItemStack stack = itemHandler.getItem(slot);
if (!stack.isEmpty()) {
CompoundTag stackTag = new CompoundTag();
stackTag.putByte("Slot", (byte) slot);
stack.save(stackTag);
listTag.add(stackTag);
}
}
return listTag;
}
private void loadInventory(ListTag listTag) {
itemHandler.clearContent();
for (int i = 0; i < listTag.size(); i++) {
CompoundTag stackTag = listTag.getCompound(i);
int slot = stackTag.getByte("Slot") & 255;
if (slot >= 0 && slot < itemHandler.getContainerSize()) {
itemHandler.setItem(slot, ItemStack.of(stackTag));
}
}
}
//?}
public void tick(Level level, BlockPos pos, BlockState state) {
if (level.isClientSide) return;
pullEnergyFromNeighbors();
handleBucketInput();
pushOutputsToHoppers();
//? if >1.20.1 {
/*Optional<RecipeHolder<CultivatorRecipe>> recipeOpt = getCurrentRecipe();
*///?} else {
Optional<CultivatorRecipe> recipeOpt = getCurrentRecipe();
//?}
if (recipeOpt.isEmpty()) {
resetProgress();
level.setBlockAndUpdate(pos, state.setValue(CultivatorBlock.LIT, false));
return;
}
String currentSignature = stackSig(itemHandler.getItem(FOSSILBLOCK_SLOT));
if (progress == 0 && (lockedOutput.isEmpty() || !currentSignature.equals(lastInputSignature))) {
//? if >1.20.1 {
/*lockedOutput = determineOutput(recipeOpt.get().value()).copy();
*///?} else {
lockedOutput = determineOutput(recipeOpt.get()).copy();
//?}
lastInputSignature = currentSignature;
}
if (!lockedOutput.isEmpty() && canInsertOutput(lockedOutput) && fluidStack.getAmount() >= WATER_CRAFT_AMOUNT) {
if (JRConfigManager.get().requirePower) {
if (energyStorage.getEnergyStored() < 10) return;
energyStorage.extractEnergy(10, false);
}
progress++;
level.setBlockAndUpdate(pos, state.setValue(CultivatorBlock.LIT, true));
if (progress >= maxProgress) {
craftItem(lockedOutput);
fluidStack.setAmount(fluidStack.getAmount() - WATER_CRAFT_AMOUNT);
resetProgress();
level.setBlockAndUpdate(pos, state.setValue(CultivatorBlock.LIT, false));
}
} else {
resetProgress();
level.setBlockAndUpdate(pos, state.setValue(CultivatorBlock.LIT, false));
}
}
private void handleBucketInput() {
ItemStack stack = itemHandler.getItem(WATER_SLOT);
if (stack.is(Items.WATER_BUCKET) && (TANK_CAPACITY - fluidStack.getAmount() >= 1000)) {
if (fluidStack.isEmpty() || fluidStack.getFluid().is(FluidTags.WATER)) {
fluidStack = FluidStack.create(net.minecraft.world.level.material.Fluids.WATER, fluidStack.getAmount() + 1000);
itemHandler.setItem(WATER_SLOT, new ItemStack(Items.BUCKET));
setChanged();
}
}
}
private void craftItem(ItemStack output) {
allowInternalExtraction = true;
try {
for (int slot : OUTPUT_SLOTS) {
ItemStack stack = itemHandler.getItem(slot);
if (stack.isEmpty()) {
itemHandler.setItem(slot, output.copy());
itemHandler.removeItem(FOSSILBLOCK_SLOT, 1);
return;
} else if (isSameItem(stack, output) && stack.getCount() + output.getCount() <= stack.getMaxStackSize()) {
stack.grow(output.getCount());
itemHandler.removeItem(FOSSILBLOCK_SLOT, 1);
return;
}
}
} finally {
allowInternalExtraction = false;
}
}
private boolean canInsertOutput(ItemStack output) {
for (int slot : OUTPUT_SLOTS) {
ItemStack stack = itemHandler.getItem(slot);
if (stack.isEmpty() || (isSameItem(stack, output) && stack.getCount() + output.getCount() <= stack.getMaxStackSize())) return true;
}
return false;
}
private boolean isSameItem(ItemStack stack, ItemStack other) {
//? if >1.20.1 {
/*return ItemStack.isSameItemSameComponents(stack, other);
*///?} else {
return ItemStack.isSameItemSameTags(stack, other);
//?}
}
//? if >1.20.1 {
/*private Optional<RecipeHolder<CultivatorRecipe>> getCurrentRecipe() {
return level.getRecipeManager().getRecipeFor(ModRecipes.CULTIVATOR_RECIPE_TYPE.get(), new CultivatorRecipeInput(itemHandler.getItem(FOSSILBLOCK_SLOT), itemHandler.getItem(WATER_SLOT)), level);
}
*///?} else {
private Optional<CultivatorRecipe> getCurrentRecipe() {
return level.getRecipeManager().getRecipeFor(ModRecipes.CULTIVATOR_RECIPE_TYPE.get(), new CultivatorRecipeInput(itemHandler.getItem(FOSSILBLOCK_SLOT), itemHandler.getItem(WATER_SLOT)), level);
}
//?}
private ItemStack determineOutput(CultivatorRecipe recipe) {
var registry = level.registryAccess().registryOrThrow(Registries.ITEM);
var tagged = registry.getTag(ModTags.Items.FOSSILS);
//? if >1.20.1 {
/*ItemStack fallback = recipe.output().copy();
*///?} else {
ItemStack fallback = recipe.getResultItem(level.registryAccess()).copy();
//?}
if (tagged.isEmpty()) return fallback;
int total = 0;
java.util.List<net.minecraft.world.item.Item> items = new java.util.ArrayList<>();
java.util.List<Integer> weights = new java.util.ArrayList<>();
for (var h : tagged.get()) {
int w = recipe.getWeightFor(h.value());
if (w > 0) {
items.add(h.value());
weights.add(w);
total += w;
}
}
if (total <= 0) return fallback;
int roll = level.random.nextInt(total);
int acc = 0;
for (int i = 0; i < items.size(); i++) {
acc += weights.get(i);
if (roll < acc) return new ItemStack(items.get(i), Math.max(1, fallback.getCount()));
}
return fallback;
}
private String stackSig(ItemStack s) {
return s.isEmpty() ? "empty" : BuiltInRegistries.ITEM.getKey(s.getItem()).toString() + ":" + s.getCount();
}
private void resetProgress() {
this.progress = 0;
this.maxProgress = DEFAULT_MAX_PROGRESS;
}
private void pullEnergyFromNeighbors() {
for (Direction dir : Direction.values()) {
BlockEntity be = level.getBlockEntity(worldPosition.relative(dir));
if (be instanceof ModEnergyUtil.EnergyProvider provider) {
ModEnergyStorage source = provider.getEnergyStorage(dir.getOpposite());
if (source != null && source.canExtract()) {
int accepted = energyStorage.receiveEnergy(TRANSFER_RATE, true);
if (accepted > 0) {
energyStorage.receiveEnergy(source.extractEnergy(accepted, false), false);
}
}
}
}
}
private void pushOutputsToHoppers() {
for (int slot : OUTPUT_SLOTS) {
pushSlotToHoppers(slot);
}
}
private void pushSlotToHoppers(int slot) {
ItemStack stack = itemHandler.getItem(slot);
if (stack.isEmpty()) return;
for (Direction dir : Direction.values()) {
BlockEntity be = level.getBlockEntity(worldPosition.relative(dir));
if (!(be instanceof Container target)) continue;
ItemStack toMove = stack.copy();
ItemStack remainder = HopperBlockEntity.addItem(itemHandler, target, toMove, dir);
if (remainder.getCount() != stack.getCount()) {
itemHandler.setItem(slot, remainder);
setChanged();
return;
}
}
}
//? if >1.20.1 {
/*@Override
public CompoundTag getUpdateTag(HolderLookup.Provider registries) { return saveWithoutMetadata(registries); }
*///?} else {
@Override
public CompoundTag getUpdateTag() { return saveWithoutMetadata(); }
//?}
@Override
public @Nullable Packet<ClientGamePacketListener> getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); }
}
@@ -0,0 +1,205 @@
package net.cmr.jurassicrevived.block.renderer;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import dev.architectury.fluid.FluidStack;
import dev.architectury.hooks.fluid.FluidStackHooks;
import net.cmr.jurassicrevived.Constants;
import net.cmr.jurassicrevived.block.entity.custom.CultivatorBlockEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
// Credits to TurtyWurty
// Under MIT-License: https://github.com/DaRealTurtyWurty/1.20-Tutorial-Mod?tab=MIT-1-ov-file#readme
public class CultivatorBlockEntityRenderer implements BlockEntityRenderer<CultivatorBlockEntity> {
public CultivatorBlockEntityRenderer(BlockEntityRendererProvider.Context context) {
}
@Override
public void render(CultivatorBlockEntity pBlockEntity, float partialTick, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight, int packedOverlay) {
FluidStack fluidStack = pBlockEntity.getFluid();
if (fluidStack.isEmpty())
return;
Level level = pBlockEntity.getLevel();
if (level == null)
return;
TextureAtlasSprite sprite = FluidStackHooks.getStillTexture(fluidStack);
if (isMissing(sprite)) {
sprite = FluidStackHooks.getStillTexture(fluidStack.getFluid());
}
if (isMissing(sprite)) {
if (fluidStack.getFluid() == Fluids.WATER) {
sprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS)
.apply(Constants.r2("block/water_still"));
}
}
if (isMissing(sprite)) return;
int tintColor = FluidStackHooks.getColor(fluidStack);
FluidState state = fluidStack.getFluid().defaultFluidState();
VertexConsumer builder = pBuffer.getBuffer(ItemBlockRenderTypes.getRenderLayer(state));
// 1. Adjust bounds for a 2-block tall model
float MIN_Y = 0.125f; // 2 pixels from the bottom
float MAX_Y = 1.875f; // 2 blocks (2.0) minus 2 pixels from the top (0.125)
float MIN_X = 0.1f;
float MAX_X = 0.9f;
float MIN_Z = 0.1f;
float MAX_Z = 0.9f;
// 2. Calculate actual fluid height
float capacity = 16000f;
float fluidHeight = ((float) fluidStack.getAmount() / capacity) * (MAX_Y - MIN_Y);
float absoluteTop = MIN_Y + fluidHeight;
// UV coordinates mapping for horizontal planes
float uMin = spriteU(sprite, MIN_X);
float uMax = spriteU(sprite, MAX_X);
float vMinZ = spriteV(sprite, MIN_Z);
float vMaxZ = spriteV(sprite, MAX_Z);
// 3. Render Top Face (visible from above)
addQuad(builder, pPoseStack,
MIN_X, absoluteTop, MAX_Z, uMin, vMaxZ,
MAX_X, absoluteTop, MAX_Z, uMax, vMaxZ,
MAX_X, absoluteTop, MIN_Z, uMax, vMinZ,
MIN_X, absoluteTop, MIN_Z, uMin, vMinZ,
pPackedLight, tintColor);
// 4. Render Bottom Face (visible from below)
addQuad(builder, pPoseStack,
MIN_X, MIN_Y, MIN_Z, uMin, vMinZ,
MAX_X, MIN_Y, MIN_Z, uMax, vMinZ,
MAX_X, MIN_Y, MAX_Z, uMax, vMaxZ,
MIN_X, MIN_Y, MAX_Z, uMin, vMaxZ,
pPackedLight, tintColor);
// 5. Render Sides in 1-block vertical chunks to prevent texture atlas bleeding
int bottomBlock = (int) Math.floor(MIN_Y);
int topBlock = (int) Math.floor(absoluteTop);
for (int yLevel = bottomBlock; yLevel <= topBlock; yLevel++) {
float chunkMinY = Math.max(MIN_Y, yLevel);
float chunkMaxY = Math.min(absoluteTop, yLevel + 1f);
if (chunkMinY >= chunkMaxY) continue; // Skip empty chunks
// Get local block coordinates (0.0 to 1.0) for proper UV mapping
float localMinY = chunkMinY - yLevel;
float localMaxY = chunkMaxY - yLevel;
float vTop = spriteV(sprite, 1f - localMaxY);
float vBottom = spriteV(sprite, 1f - localMinY);
// North Face (Z=MIN_Z)
addQuad(builder, pPoseStack,
MAX_X, chunkMaxY, MIN_Z, uMax, vTop,
MAX_X, chunkMinY, MIN_Z, uMax, vBottom,
MIN_X, chunkMinY, MIN_Z, uMin, vBottom,
MIN_X, chunkMaxY, MIN_Z, uMin, vTop,
pPackedLight, tintColor);
// South Face (Z=MAX_Z)
addQuad(builder, pPoseStack,
MIN_X, chunkMaxY, MAX_Z, uMin, vTop,
MIN_X, chunkMinY, MAX_Z, uMin, vBottom,
MAX_X, chunkMinY, MAX_Z, uMax, vBottom,
MAX_X, chunkMaxY, MAX_Z, uMax, vTop,
pPackedLight, tintColor);
// West Face (X=MIN_X)
addQuad(builder, pPoseStack,
MIN_X, chunkMaxY, MIN_Z, uMin, vTop,
MIN_X, chunkMinY, MIN_Z, uMin, vBottom,
MIN_X, chunkMinY, MAX_Z, uMax, vBottom,
MIN_X, chunkMaxY, MAX_Z, uMax, vTop,
pPackedLight, tintColor);
// East Face (X=MAX_X)
addQuad(builder, pPoseStack,
MAX_X, chunkMaxY, MAX_Z, uMax, vTop,
MAX_X, chunkMinY, MAX_Z, uMax, vBottom,
MAX_X, chunkMinY, MIN_Z, uMin, vBottom,
MAX_X, chunkMaxY, MIN_Z, uMin, vTop,
pPackedLight, tintColor);
}
}
private static boolean isMissing(TextureAtlasSprite sprite) {
return sprite == null || sprite.atlasLocation().getPath().contains("missingno");
}
//? if >1.20.1 {
/*private static float spriteU(TextureAtlasSprite sprite, float normalizedU) {
return sprite.getU0() + (sprite.getU1() - sprite.getU0()) * normalizedU;
}
private static float spriteV(TextureAtlasSprite sprite, float normalizedV) {
return sprite.getV0() + (sprite.getV1() - sprite.getV0()) * normalizedV;
}
*///?} else {
private static float spriteU(TextureAtlasSprite sprite, float normalizedU) {
return sprite.getU(normalizedU * 16);
}
private static float spriteV(TextureAtlasSprite sprite, float normalizedV) {
return sprite.getV(normalizedV * 16);
}
//?}
private static void addQuad(VertexConsumer builder, PoseStack poseStack,
float x0, float y0, float z0, float u0, float v0,
float x1, float y1, float z1, float u1, float v1,
float x2, float y2, float z2, float u2, float v2,
float x3, float y3, float z3, float u3, float v3,
int packedLight, int color) {
drawVertex(builder, poseStack, x0, y0, z0, u0, v0, packedLight, color);
drawVertex(builder, poseStack, x1, y1, z1, u1, v1, packedLight, color);
drawVertex(builder, poseStack, x2, y2, z2, u2, v2, packedLight, color);
drawVertex(builder, poseStack, x3, y3, z3, u3, v3, packedLight, color);
}
//? if >1.20.1 {
/*private static void drawVertex(VertexConsumer builder, PoseStack poseStack, float x, float y, float z, float u, float v, int packedLight, int color) {
int a = (color >> 24) & 0xFF;
int r = (color >> 16) & 0xFF;
int g = (color >> 8) & 0xFF;
int b = color & 0xFF;
if (a == 0) {
a = 255;
}
builder.addVertex(poseStack.last().pose(), x, y, z)
.setColor(r, g, b, a)
.setUv(u, v)
.setLight(packedLight)
.setNormal(1, 0, 0);
}
*///?} else {
private static void drawVertex(VertexConsumer builder, PoseStack poseStack, float x, float y, float z, float u, float v, int packedLight, int color) {
int a = (color >> 24) & 0xFF;
int r = (color >> 16) & 0xFF;
int g = (color >> 8) & 0xFF;
int b = (color) & 0xFF;
builder.vertex(poseStack.last().pose(), x, y, z)
.color(r, g, b, a)
.uv(u, v)
.uv2(packedLight)
.normal(poseStack.last().normal(), 1, 0, 0)
.endVertex();
}
//?}
}
@@ -0,0 +1,215 @@
package net.cmr.jurassicrevived.compat;
import dev.architectury.fluid.FluidStack;
import dev.architectury.hooks.fluid.FluidStackHooks;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.gui.builder.IRecipeSlotBuilder;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.helpers.IGuiHelper;
import mezz.jei.api.recipe.IFocusGroup;
import mezz.jei.api.recipe.RecipeIngredientRole;
import mezz.jei.api.recipe.RecipeType;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.cmr.jurassicrevived.Constants;
import net.cmr.jurassicrevived.block.ModBlocks;
import net.cmr.jurassicrevived.config.JRConfigManager;
import net.cmr.jurassicrevived.recipe.CultivatorRecipe;
import net.cmr.jurassicrevived.screen.renderer.FluidTankRenderer;
import net.cmr.jurassicrevived.util.ModTags;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.material.Fluids;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class CultivatorRecipeCategory implements IRecipeCategory<CultivatorRecipe> {
public static final ResourceLocation UID = Constants.rl("cultivating");
public static final ResourceLocation TEXTURE = Constants.rl("textures/gui/fossil_cleaner/fossil_cleaner_gui.png");
private static final ResourceLocation BUBBLES_TEXTURE = Constants.rl("textures/gui/generic/bubbles.png");
private static final ResourceLocation WHITE_BUBBLES_TEXTURE = Constants.rl("textures/gui/generic/white_bubbles.png");
private static final ResourceLocation POWER_BAR_TEXTURE = Constants.rl("textures/gui/generic/power_bar.png");
public static final RecipeType<CultivatorRecipe> CULTIVATOR_RECIPE_RECIPE_TYPE =
new RecipeType<>(UID, CultivatorRecipe.class);
private final IDrawable background;
private final IDrawable icon;
private final FluidTankRenderer fluidRenderer;
private static List<ItemStack> WATER_CONTAINERS_CACHE = null;
public CultivatorRecipeCategory(IGuiHelper guiHelper) {
this.background = guiHelper.drawableBuilder(TEXTURE, 0, 0, 176, 80).setTextureSize(176, 166).build();
this.icon = guiHelper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(ModBlocks.CULTIVATOR.get()));
this.fluidRenderer = new FluidTankRenderer(64000, true, 16, 50);
if (WATER_CONTAINERS_CACHE == null) {
WATER_CONTAINERS_CACHE = buildWaterContainersList();
}
}
@Override
public RecipeType<CultivatorRecipe> getRecipeType() {
return CULTIVATOR_RECIPE_RECIPE_TYPE;
}
@Override
public Component getTitle() {
return Component.translatable("block.jurassicrevived.cultivator");
}
@Override
public int getWidth() {
return background.getWidth();
}
@Override
public int getHeight() {
return background.getHeight();
}
@Override
public void draw(CultivatorRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) {
background.draw(guiGraphics);
FluidStack water = FluidStack.create(Fluids.WATER, 250);
fluidRenderer.render(guiGraphics, 7, 8, water);
int tankX = 7;
int tankY = 8;
int tankW = fluidRenderer.getWidth();
int tankH = fluidRenderer.getHeight();
int mx = (int) mouseX;
int my = (int) mouseY;
if (mx >= tankX && mx < tankX + tankW && my >= tankY && my < tankY + tankH) {
guiGraphics.renderTooltip(
Minecraft.getInstance().font,
fluidRenderer.getTooltip(water, Minecraft.getInstance().options.advancedItemTooltips ? net.minecraft.world.item.TooltipFlag.Default.ADVANCED : net.minecraft.world.item.TooltipFlag.Default.NORMAL),
java.util.Optional.empty(),
mx,
my
);
}
guiGraphics.blit(BUBBLES_TEXTURE, 73, 37, 0, 0, 29, 12, 29, 12);
if (JRConfigManager.get().requirePower) {
guiGraphics.blit(POWER_BAR_TEXTURE, 159, 10, 0, 0, 10, 66, 10, 66);
// Fill amount for JEI: show total required energy (2000 FE) relative to 64000 FE capacity
// Our simple fill is purely visual for JEI, not tied to any BE
int barX = 160;
int barY = 11;
int barW = 8;
int barH = 64;
int maxTicks = 200;
long now = System.currentTimeMillis();
int progress = (int)((now / 50L) % maxTicks); // ~20 TPS
int arrowPixels = 29;
int progFilled = progress * arrowPixels / maxTicks;
if (progFilled > 0) {
guiGraphics.blit(WHITE_BUBBLES_TEXTURE, 73, 37, 0, 0, progFilled, 12, 29, 12);
}
int requiredFE = 2000;
int capacityFE = 64000;
int filled = (int)(barH * (requiredFE / (float)capacityFE));
// Render red fill similar to EnergyDisplayTooltipArea
guiGraphics.fillGradient(barX, barY + (barH - filled), barX + barW, barY + barH, 0xffb51500, 0xff600b00);
// Tooltip "2000 / 64000 FE" on hover over the energy area
if (mx >= barX && mx < barX + barW && my >= barY && my < barY + barH) {
List<Component> tips = List.of(Component.literal("2000 / 64000 FE"));
guiGraphics.renderTooltip(Minecraft.getInstance().font, tips, java.util.Optional.empty(), mx, my);
}
}
}
@Override
public @Nullable IDrawable getIcon() {
return icon;
}
@Override
public void setRecipe(IRecipeLayoutBuilder builder, CultivatorRecipe recipe, IFocusGroup focuses) {
// Single consumable input (fossil block)
builder.addSlot(RecipeIngredientRole.INPUT, 57, 35).addIngredients(recipe.getIngredients().get(0));
// Water container acceptance list at (7, 61), discovered dynamically
var waterItems = builder.addSlot(RecipeIngredientRole.INPUT, 7, 61).addItemStacks(WATER_CONTAINERS_CACHE);
waterItems.addRichTooltipCallback((view, tooltip) -> {
tooltip.add(Component.translatable("jurassicrevived.tooltip.accepts_any_water_container"));
});
// Output list: all fossils from the tag, tooltip shows per-item weight from the recipe
var level = Minecraft.getInstance().level;
if (level != null) {
var itemRegistry = level.registryAccess().registryOrThrow(Registries.ITEM);
var fossilsTagOpt = itemRegistry.getTag(ModTags.Items.FOSSILS);
List<ItemStack> fossilOutputs = fossilsTagOpt.map(holderSet ->
holderSet.stream()
.map(h -> new ItemStack(h.value(), Math.max(1, recipe.output().getCount())))
.collect(Collectors.toList())
).orElse(List.of());
// Hide zero-weight fossils
fossilOutputs = fossilOutputs.stream()
.filter(stack -> recipe.getWeightFor(stack.getItem()) > 0)
.collect(Collectors.toList());
var slot = builder.addSlot(RecipeIngredientRole.OUTPUT, 103, 35).addItemStacks(fossilOutputs);
slot.addRichTooltipCallback((view, tooltip) -> {
var opt = view.getDisplayedItemStack();
if (opt.isPresent()) {
int weight = recipe.getWeightFor(opt.get().getItem());
//tooltip.add(Component.literal("Weight: " + weight));
}
});
return;
}
builder.addSlot(RecipeIngredientRole.OUTPUT, 103, 35).addItemStack(recipe.output());
}
private static List<ItemStack> buildWaterContainersList() {
var list = new ArrayList<ItemStack>();
// Always include vanilla water bucket (already filled)
list.add(new ItemStack(Items.WATER_BUCKET));
var mc = Minecraft.getInstance();
var level = mc.level;
if (level == null) {
return Collections.unmodifiableList(list);
}
final int REQUIRED_MB = 250;
var itemRegistry = level.registryAccess().registryOrThrow(Registries.ITEM);
for (Item item : itemRegistry) {
if (item == Items.WATER_BUCKET) continue;
ItemStack empty = new ItemStack(item);
// Check if item is a fluid container using Architectury's hooks
// This is a simplified check; a more robust one would involve checking capabilities or similar hooks
// For now, we'll rely on known items or basic checks if available via Architectury
// Since Architectury abstracts this, we might need to rely on platform-specific implementations or common helpers if available.
// However, without a direct common "isFluidContainer" helper in the provided context, we might skip complex checks or use a simple list.
// For the sake of this conversion, we will stick to just the water bucket as a safe default
// or implement a more complex check if Architectury provides one.
// Given the constraints, we'll simplify this to just water buckets for now to avoid platform-specific code in common.
}
return Collections.unmodifiableList(list);
}
}
@@ -52,6 +52,7 @@ public class JEIJRPlugin implements IModPlugin {
registration.addRecipeCategories(new EmbryonicMachineRecipeCategory(registration.getJeiHelpers().getGuiHelper())); registration.addRecipeCategories(new EmbryonicMachineRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new EmbryoCalcificationMachineRecipeCategory(registration.getJeiHelpers().getGuiHelper())); registration.addRecipeCategories(new EmbryoCalcificationMachineRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new IncubatorRecipeCategory(registration.getJeiHelpers().getGuiHelper())); registration.addRecipeCategories(new IncubatorRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new CultivatorRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
} }
@Override @Override
@@ -75,6 +76,8 @@ public class JEIJRPlugin implements IModPlugin {
.getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList(); .getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList();
List<IncubatorRecipe> incubatorRecipes = recipeManager List<IncubatorRecipe> incubatorRecipes = recipeManager
.getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList(); .getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList();
List<CultivatorRecipe> cultivatorRecipes = recipeManager
.getAllRecipesFor(ModRecipes.CULTIVATOR_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList();
*///?} else { *///?} else {
List<DNAExtractorRecipe> dnaExtractorRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get()); List<DNAExtractorRecipe> dnaExtractorRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get());
List<DNAAnalyzerRecipe> dnaAnalyzerRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_ANALYZER_RECIPE_TYPE.get()); List<DNAAnalyzerRecipe> dnaAnalyzerRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_ANALYZER_RECIPE_TYPE.get());
@@ -84,6 +87,7 @@ public class JEIJRPlugin implements IModPlugin {
List<EmbryonicMachineRecipe> embryonicMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYONIC_MACHINE_RECIPE_TYPE.get()); List<EmbryonicMachineRecipe> embryonicMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYONIC_MACHINE_RECIPE_TYPE.get());
List<EmbryoCalcificationMachineRecipe> embryoCalcificationMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get()); List<EmbryoCalcificationMachineRecipe> embryoCalcificationMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get());
List<IncubatorRecipe> incubatorRecipes = recipeManager.getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get()); List<IncubatorRecipe> incubatorRecipes = recipeManager.getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get());
List<CultivatorRecipe> cultivatorRecipes = recipeManager.getAllRecipesFor(ModRecipes.CULTIVATOR_RECIPE_TYPE.get());
//?} //?}
registration.addRecipes(DNAExtractorRecipeCategory.DNA_EXTRACTOR_RECIPE_RECIPE_TYPE, dnaExtractorRecipes); registration.addRecipes(DNAExtractorRecipeCategory.DNA_EXTRACTOR_RECIPE_RECIPE_TYPE, dnaExtractorRecipes);
@@ -94,6 +98,7 @@ public class JEIJRPlugin implements IModPlugin {
registration.addRecipes(EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE, embryonicMachineRecipes); registration.addRecipes(EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE, embryonicMachineRecipes);
registration.addRecipes(EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE, embryoCalcificationMachineRecipes); registration.addRecipes(EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE, embryoCalcificationMachineRecipes);
registration.addRecipes(IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE, incubatorRecipes); registration.addRecipes(IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE, incubatorRecipes);
registration.addRecipes(CultivatorRecipeCategory.CULTIVATOR_RECIPE_RECIPE_TYPE, cultivatorRecipes);
} }
@Override @Override
@@ -114,6 +119,8 @@ public class JEIJRPlugin implements IModPlugin {
EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE); EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE);
registration.addRecipeClickArea(IncubatorScreen.class, 51, 16, 72, 16, registration.addRecipeClickArea(IncubatorScreen.class, 51, 16, 72, 16,
IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE); IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE);
registration.addRecipeClickArea(CultivatorScreen.class, 51, 16, 72, 16,
CultivatorRecipeCategory.CULTIVATOR_RECIPE_RECIPE_TYPE);
} }
@Override @Override
@@ -126,6 +133,7 @@ public class JEIJRPlugin implements IModPlugin {
registration.addRecipeCatalyst(new ItemStack(ModBlocks.EMBRYONIC_MACHINE.get()), EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.EMBRYONIC_MACHINE.get()), EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()), EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()), EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.INCUBATOR.get()), IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.INCUBATOR.get()), IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.CULTIVATOR.get()), CultivatorRecipeCategory.CULTIVATOR_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_DNA_EXTRACTOR.get()), DNAExtractorRecipeCategory.DNA_EXTRACTOR_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_DNA_EXTRACTOR.get()), DNAExtractorRecipeCategory.DNA_EXTRACTOR_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_DNA_ANALYZER.get()), DNAAnalyzerRecipeCategory.DNA_ANALYZER_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_DNA_ANALYZER.get()), DNAAnalyzerRecipeCategory.DNA_ANALYZER_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_FOSSIL_GRINDER.get()), FossilGrinderRecipeCategory.FOSSIL_GRINDER_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_FOSSIL_GRINDER.get()), FossilGrinderRecipeCategory.FOSSIL_GRINDER_RECIPE_RECIPE_TYPE);
@@ -134,6 +142,7 @@ public class JEIJRPlugin implements IModPlugin {
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_EMBRYONIC_MACHINE.get()), EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_EMBRYONIC_MACHINE.get()), EmbryonicMachineRecipeCategory.EMBRYONIC_MACHINE_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()), EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()), EmbryoCalcificationMachineRecipeCategory.EMBRYO_CALCIFICATION_MACHINE_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_INCUBATOR.get()), IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE); registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_INCUBATOR.get()), IncubatorRecipeCategory.INCUBATOR_RECIPE_RECIPE_TYPE);
registration.addRecipeCatalyst(new ItemStack(ModBlocks.WHITE_CULTIVATOR.get()), CultivatorRecipeCategory.CULTIVATOR_RECIPE_RECIPE_TYPE);
} }
@Override @Override
@@ -210,5 +219,14 @@ public class JEIJRPlugin implements IModPlugin {
0, // The index where the player inventory slots START (slot 0) 0, // The index where the player inventory slots START (slot 0)
36 // The NUMBER of player inventory slots to check (slots 0-35) 36 // The NUMBER of player inventory slots to check (slots 0-35)
); );
registration.addRecipeTransferHandler(
CultivatorMenu.class,
ModMenuTypes.CULTIVATOR_MENU.get(),
CultivatorRecipeCategory.CULTIVATOR_RECIPE_RECIPE_TYPE,
36, // The index of the FIRST recipe input slot in your Menu (slot 36)
2, // The NUMBER of recipe input slots (slots 36, 37)
0, // The index where the player inventory slots START (slot 0)
36 // The NUMBER of player inventory slots to check (slots 0-35)
);
} }
} }
@@ -304,6 +304,53 @@ public class MachineJadePlugin implements IWailaPlugin {
} }
}, FossilCleanerBlock.class }, FossilCleanerBlock.class
); );
reg.registerBlockComponent(new snownee.jade.api.IBlockComponentProvider() {
//? if >1.20.1 {
/*@Override
public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) {
CompoundTag data = accessor.getServerData();
if (data == null || !data.contains(NBT_PROGRESS) || !data.contains(NBT_MAX)) return;
int progress = Math.max(0, data.getInt(NBT_PROGRESS));
int max = Math.max(1, data.getInt(NBT_MAX));
float ratio = Mth.clamp(progress / (float) max, 0.0f, 1.0f);
IElementHelper h = IElementHelper.get();
ProgressStyle style = h.progressStyle()
.color(0xFFFFFFFF, 0xFFFFFFFF)
.direction(ScreenDirection.RIGHT)
.fitContentX(true)
.fitContentY(true);
BoxStyle box = BoxStyle.getNestedBox();
IElement bar = h.progress(ratio, Component.empty(), style, box, true);
tooltip.add(bar);
}
*///?} else {
@Override
public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) {
CompoundTag data = accessor.getServerData();
if (!data.contains(NBT_PROGRESS) || !data.contains(NBT_MAX)) return;
int progress = data.getInt(NBT_PROGRESS);
int max = Math.max(1, data.getInt(NBT_MAX));
float ratio = Mth.clamp(progress / (float) max, 0.0f, 1.0f);
IElementHelper h = tooltip.getElementHelper();
IProgressStyle pStyle = h.progressStyle()
.color(0xFFFFFFFF)
.textColor(0xFFFFFFFF);
IBoxStyle box = new ThickBorderBox(1.0f);
tooltip.add(h.progress(ratio, Component.empty(), pStyle, box, false));
}
//?}
@Override
public ResourceLocation getUid() {
return UID;
}
}, CultivatorBlock.class
);
reg.registerBlockComponent(new snownee.jade.api.IBlockComponentProvider() { reg.registerBlockComponent(new snownee.jade.api.IBlockComponentProvider() {
//? if >1.20.1 { //? if >1.20.1 {
/*@Override /*@Override
@@ -469,5 +516,6 @@ public class MachineJadePlugin implements IWailaPlugin {
reg.registerBlockDataProvider(provider, FossilCleanerBlockEntity.class); reg.registerBlockDataProvider(provider, FossilCleanerBlockEntity.class);
reg.registerBlockDataProvider(provider, FossilGrinderBlockEntity.class); reg.registerBlockDataProvider(provider, FossilGrinderBlockEntity.class);
reg.registerBlockDataProvider(provider, IncubatorBlockEntity.class); reg.registerBlockDataProvider(provider, IncubatorBlockEntity.class);
reg.registerBlockDataProvider(provider, CultivatorBlockEntity.class);
} }
} }
@@ -159,6 +159,9 @@ public class ModBlockLootTableProvider {
helper.dropSelf(ModBlocks.CHILESAURUS_EGG.get()); helper.dropSelf(ModBlocks.CHILESAURUS_EGG.get());
helper.dropSelf(ModBlocks.MUSSASAURUS_EGG.get()); helper.dropSelf(ModBlocks.MUSSASAURUS_EGG.get());
helper.dropSelf(ModBlocks.THESCELOSAURUS_EGG.get()); helper.dropSelf(ModBlocks.THESCELOSAURUS_EGG.get());
helper.dropSelf(ModBlocks.COELACANTH_EGG.get());
helper.dropSelf(ModBlocks.MAWSONIA_EGG.get());
helper.dropSelf(ModBlocks.ALLIGATOR_GAR_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_APATOSAURUS_EGG.get()); helper.dropSelf(ModBlocks.INCUBATED_APATOSAURUS_EGG.get());
helper.dropSelf(ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get()); helper.dropSelf(ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get());
@@ -181,6 +181,7 @@ public class ModBlockStateProvider {
helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.EMBRYONIC_MACHINE.get()); helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.EMBRYONIC_MACHINE.get());
helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()); helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get());
helper.horizontalFacingLitWithItem(ModBlocks.INCUBATOR.get()); helper.horizontalFacingLitWithItem(ModBlocks.INCUBATOR.get());
helper.horizontalFacingLitWithItem(ModBlocks.CULTIVATOR.get());
helper.horizontalFacingLitWithItem(ModBlocks.WHITE_GENERATOR.get()); helper.horizontalFacingLitWithItem(ModBlocks.WHITE_GENERATOR.get());
helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_DNA_EXTRACTOR.get()); helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_DNA_EXTRACTOR.get());
@@ -191,6 +192,7 @@ public class ModBlockStateProvider {
helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_EMBRYONIC_MACHINE.get()); helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_EMBRYONIC_MACHINE.get());
helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()); helper.horizontalFacingLitNoBlockstateWithItem(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get());
helper.horizontalFacingLitWithItem(ModBlocks.WHITE_INCUBATOR.get()); helper.horizontalFacingLitWithItem(ModBlocks.WHITE_INCUBATOR.get());
helper.horizontalFacingLitWithItem(ModBlocks.WHITE_CULTIVATOR.get());
helper.eggLike(ModBlocks.VELOCIRAPTOR_EGG.get()); helper.eggLike(ModBlocks.VELOCIRAPTOR_EGG.get());
helper.eggLike(ModBlocks.TYRANNOSAURUS_REX_EGG.get()); helper.eggLike(ModBlocks.TYRANNOSAURUS_REX_EGG.get());
@@ -270,6 +272,9 @@ public class ModBlockStateProvider {
helper.eggLike(ModBlocks.CHILESAURUS_EGG.get()); helper.eggLike(ModBlocks.CHILESAURUS_EGG.get());
helper.eggLike(ModBlocks.MUSSASAURUS_EGG.get()); helper.eggLike(ModBlocks.MUSSASAURUS_EGG.get());
helper.eggLike(ModBlocks.THESCELOSAURUS_EGG.get()); helper.eggLike(ModBlocks.THESCELOSAURUS_EGG.get());
helper.eggLike(ModBlocks.COELACANTH_EGG.get());
helper.eggLike(ModBlocks.MAWSONIA_EGG.get());
helper.eggLike(ModBlocks.ALLIGATOR_GAR_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get()); helper.eggLike(ModBlocks.INCUBATED_VELOCIRAPTOR_EGG.get());
helper.eggLike(ModBlocks.INCUBATED_TYRANNOSAURUS_REX_EGG.get()); helper.eggLike(ModBlocks.INCUBATED_TYRANNOSAURUS_REX_EGG.get());
@@ -76,6 +76,7 @@ public class ModBlockTagProvider {
ModBlocks.EMBRYONIC_MACHINE.get(), ModBlocks.EMBRYONIC_MACHINE.get(),
ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(),
ModBlocks.INCUBATOR.get(), ModBlocks.INCUBATOR.get(),
ModBlocks.CULTIVATOR.get(),
ModBlocks.WHITE_GENERATOR.get(), ModBlocks.WHITE_GENERATOR.get(),
ModBlocks.WHITE_DNA_EXTRACTOR.get(), ModBlocks.WHITE_DNA_EXTRACTOR.get(),
ModBlocks.WHITE_DNA_ANALYZER.get(), ModBlocks.WHITE_DNA_ANALYZER.get(),
@@ -85,6 +86,7 @@ public class ModBlockTagProvider {
ModBlocks.WHITE_EMBRYONIC_MACHINE.get(), ModBlocks.WHITE_EMBRYONIC_MACHINE.get(),
ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get(), ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get(),
ModBlocks.WHITE_INCUBATOR.get(), ModBlocks.WHITE_INCUBATOR.get(),
ModBlocks.WHITE_CULTIVATOR.get(),
ModBlocks.TANK.get(), ModBlocks.TANK.get(),
ModBlocks.POWER_CELL.get(), ModBlocks.POWER_CELL.get(),
ModBlocks.IRON_CRATE.get() ModBlocks.IRON_CRATE.get()
@@ -170,7 +172,9 @@ public class ModBlockTagProvider {
ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(), ModBlocks.INCUBATED_ZHENYUANOPTERUS_EGG.get(),
ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get(), ModBlocks.INCUBATED_ACHILLOBATOR_EGG.get(),
ModBlocks.INCUBATED_SUCHOMIMUS_EGG.get(), ModBlocks.INCUBATED_SUCHOMIMUS_EGG.get(),
ModBlocks.INCUBATED_CHILESAURUS_EGG.get() ModBlocks.INCUBATED_CHILESAURUS_EGG.get(),
ModBlocks.INCUBATED_THESCELOSAURUS_EGG.get(),
ModBlocks.INCUBATED_MUSSASAURUS_EGG.get()
); );
helper.tag(BlockTags.MINEABLE_WITH_SHOVEL, helper.tag(BlockTags.MINEABLE_WITH_SHOVEL,
@@ -531,5 +531,26 @@ public class ModEntityLootTableProvider {
.add(LootItem.lootTableItem(ModItems.FRESH_THESCELOSAURUS_SKULL.get())) .add(LootItem.lootTableItem(ModItems.FRESH_THESCELOSAURUS_SKULL.get()))
) )
); );
helper.add(ModEntities.COELACANTH.get(), LootTable.lootTable()
.withPool(LootPool.lootPool()
.setRolls(ConstantValue.exactly(1))
.add(LootItem.lootTableItem(ModItems.FRESH_COELACANTH_SKULL.get()))
)
);
helper.add(ModEntities.MAWSONIA.get(), LootTable.lootTable()
.withPool(LootPool.lootPool()
.setRolls(ConstantValue.exactly(1))
.add(LootItem.lootTableItem(ModItems.FRESH_MAWSONIA_SKULL.get()))
)
);
helper.add(ModEntities.ALLIGATOR_GAR.get(), LootTable.lootTable()
.withPool(LootPool.lootPool()
.setRolls(ConstantValue.exactly(1))
.add(LootItem.lootTableItem(ModItems.FRESH_ALLIGATOR_GAR_SKULL.get()))
)
);
} }
} }
@@ -100,6 +100,9 @@ public class ModItemModelProvider {
helper.spawnEgg(ModItems.CHILESAURUS_SPAWN_EGG.get()); helper.spawnEgg(ModItems.CHILESAURUS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.THESCELOSAURUS_SPAWN_EGG.get()); helper.spawnEgg(ModItems.THESCELOSAURUS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.MUSSASAURUS_SPAWN_EGG.get()); helper.spawnEgg(ModItems.MUSSASAURUS_SPAWN_EGG.get());
helper.spawnEgg(ModItems.COELACANTH_SPAWN_EGG.get());
helper.spawnEgg(ModItems.MAWSONIA_SPAWN_EGG.get());
helper.spawnEgg(ModItems.ALLIGATOR_GAR_SPAWN_EGG.get());
helper.basicItemModel(ModItems.FROG_MATERIAL.get()); helper.basicItemModel(ModItems.FROG_MATERIAL.get());
helper.basicItemModel(ModItems.FROG_DNA.get()); helper.basicItemModel(ModItems.FROG_DNA.get());
@@ -196,6 +199,9 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.CHILESAURUS_SKULL_FOSSIL.get()); helper.basicItemModel(ModItems.CHILESAURUS_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.THESCELOSAURUS_SKULL_FOSSIL.get()); helper.basicItemModel(ModItems.THESCELOSAURUS_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.MUSSASAURUS_SKULL_FOSSIL.get()); helper.basicItemModel(ModItems.MUSSASAURUS_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.COELACANTH_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.MAWSONIA_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.ALLIGATOR_GAR_SKULL_FOSSIL.get());
helper.basicItemModel(ModItems.FRESH_APATOSAURUS_SKULL.get()); helper.basicItemModel(ModItems.FRESH_APATOSAURUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_ALBERTOSAURUS_SKULL.get()); helper.basicItemModel(ModItems.FRESH_ALBERTOSAURUS_SKULL.get());
@@ -275,6 +281,9 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.FRESH_CHILESAURUS_SKULL.get()); helper.basicItemModel(ModItems.FRESH_CHILESAURUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_THESCELOSAURUS_SKULL.get()); helper.basicItemModel(ModItems.FRESH_THESCELOSAURUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_MUSSASAURUS_SKULL.get()); helper.basicItemModel(ModItems.FRESH_MUSSASAURUS_SKULL.get());
helper.basicItemModel(ModItems.FRESH_COELACANTH_SKULL.get());
helper.basicItemModel(ModItems.FRESH_MAWSONIA_SKULL.get());
helper.basicItemModel(ModItems.FRESH_ALLIGATOR_GAR_SKULL.get());
helper.basicItemModel(ModItems.APATOSAURUS_TISSUE.get()); helper.basicItemModel(ModItems.APATOSAURUS_TISSUE.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_TISSUE.get()); helper.basicItemModel(ModItems.ALBERTOSAURUS_TISSUE.get());
@@ -354,6 +363,9 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.CHILESAURUS_TISSUE.get()); helper.basicItemModel(ModItems.CHILESAURUS_TISSUE.get());
helper.basicItemModel(ModItems.THESCELOSAURUS_TISSUE.get()); helper.basicItemModel(ModItems.THESCELOSAURUS_TISSUE.get());
helper.basicItemModel(ModItems.MUSSASAURUS_TISSUE.get()); helper.basicItemModel(ModItems.MUSSASAURUS_TISSUE.get());
helper.basicItemModel(ModItems.COELACANTH_TISSUE.get());
helper.basicItemModel(ModItems.MAWSONIA_TISSUE.get());
helper.basicItemModel(ModItems.ALLIGATOR_GAR_TISSUE.get());
helper.basicItemModel(ModItems.APATOSAURUS_DNA.get()); helper.basicItemModel(ModItems.APATOSAURUS_DNA.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_DNA.get()); helper.basicItemModel(ModItems.ALBERTOSAURUS_DNA.get());
@@ -433,6 +445,9 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.CHILESAURUS_DNA.get()); helper.basicItemModel(ModItems.CHILESAURUS_DNA.get());
helper.basicItemModel(ModItems.THESCELOSAURUS_DNA.get()); helper.basicItemModel(ModItems.THESCELOSAURUS_DNA.get());
helper.basicItemModel(ModItems.MUSSASAURUS_DNA.get()); helper.basicItemModel(ModItems.MUSSASAURUS_DNA.get());
helper.basicItemModel(ModItems.COELACANTH_DNA.get());
helper.basicItemModel(ModItems.MAWSONIA_DNA.get());
helper.basicItemModel(ModItems.ALLIGATOR_GAR_DNA.get());
helper.basicItemModel(ModItems.APATOSAURUS_SYRINGE.get()); helper.basicItemModel(ModItems.APATOSAURUS_SYRINGE.get());
helper.basicItemModel(ModItems.ALBERTOSAURUS_SYRINGE.get()); helper.basicItemModel(ModItems.ALBERTOSAURUS_SYRINGE.get());
@@ -512,6 +527,9 @@ public class ModItemModelProvider {
helper.basicItemModel(ModItems.CHILESAURUS_SYRINGE.get()); helper.basicItemModel(ModItems.CHILESAURUS_SYRINGE.get());
helper.basicItemModel(ModItems.THESCELOSAURUS_SYRINGE.get()); helper.basicItemModel(ModItems.THESCELOSAURUS_SYRINGE.get());
helper.basicItemModel(ModItems.MUSSASAURUS_SYRINGE.get()); helper.basicItemModel(ModItems.MUSSASAURUS_SYRINGE.get());
helper.basicItemModel(ModItems.COELACANTH_SYRINGE.get());
helper.basicItemModel(ModItems.MAWSONIA_SYRINGE.get());
helper.basicItemModel(ModItems.ALLIGATOR_GAR_SYRINGE.get());
helper.simpleBlockItemModel(ModBlocks.APATOSAURUS_EGG.get()); helper.simpleBlockItemModel(ModBlocks.APATOSAURUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.ALBERTOSAURUS_EGG.get()); helper.simpleBlockItemModel(ModBlocks.ALBERTOSAURUS_EGG.get());
@@ -591,6 +609,9 @@ public class ModItemModelProvider {
helper.simpleBlockItemModel(ModBlocks.CHILESAURUS_EGG.get()); helper.simpleBlockItemModel(ModBlocks.CHILESAURUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.THESCELOSAURUS_EGG.get()); helper.simpleBlockItemModel(ModBlocks.THESCELOSAURUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.MUSSASAURUS_EGG.get()); helper.simpleBlockItemModel(ModBlocks.MUSSASAURUS_EGG.get());
helper.simpleBlockItemModel(ModBlocks.COELACANTH_EGG.get());
helper.simpleBlockItemModel(ModBlocks.MAWSONIA_EGG.get());
helper.simpleBlockItemModel(ModBlocks.ALLIGATOR_GAR_EGG.get());
helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_POLE.get().asItem()); helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_POLE.get().asItem());
helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_WIRE.get().asItem()); helper.basicItemModel(ModBlocks.LOW_SECURITY_FENCE_WIRE.get().asItem());
@@ -92,7 +92,10 @@ public class ModItemTagProvider {
ModItems.SUCHOMIMUS_TISSUE.get(), ModItems.SUCHOMIMUS_TISSUE.get(),
ModItems.MUSSASAURUS_TISSUE.get(), ModItems.MUSSASAURUS_TISSUE.get(),
ModItems.THESCELOSAURUS_TISSUE.get(), ModItems.THESCELOSAURUS_TISSUE.get(),
ModItems.CHILESAURUS_TISSUE.get() ModItems.CHILESAURUS_TISSUE.get(),
ModItems.COELACANTH_TISSUE.get(),
ModItems.MAWSONIA_TISSUE.get(),
ModItems.ALLIGATOR_GAR_TISSUE.get()
); );
helper.tag(ModTags.Items.DNA, helper.tag(ModTags.Items.DNA,
@@ -174,7 +177,10 @@ public class ModItemTagProvider {
ModItems.SUCHOMIMUS_DNA.get(), ModItems.SUCHOMIMUS_DNA.get(),
ModItems.MUSSASAURUS_DNA.get(), ModItems.MUSSASAURUS_DNA.get(),
ModItems.THESCELOSAURUS_DNA.get(), ModItems.THESCELOSAURUS_DNA.get(),
ModItems.CHILESAURUS_DNA.get() ModItems.CHILESAURUS_DNA.get(),
ModItems.COELACANTH_DNA.get(),
ModItems.MAWSONIA_DNA.get(),
ModItems.ALLIGATOR_GAR_DNA.get()
); );
helper.tag(ModTags.Items.SYRINGES, helper.tag(ModTags.Items.SYRINGES,
@@ -256,7 +262,10 @@ public class ModItemTagProvider {
ModItems.SUCHOMIMUS_SYRINGE.get(), ModItems.SUCHOMIMUS_SYRINGE.get(),
ModItems.MUSSASAURUS_SYRINGE.get(), ModItems.MUSSASAURUS_SYRINGE.get(),
ModItems.THESCELOSAURUS_SYRINGE.get(), ModItems.THESCELOSAURUS_SYRINGE.get(),
ModItems.CHILESAURUS_SYRINGE.get() ModItems.CHILESAURUS_SYRINGE.get(),
ModItems.COELACANTH_SYRINGE.get(),
ModItems.MAWSONIA_SYRINGE.get(),
ModItems.ALLIGATOR_GAR_SYRINGE.get()
); );
helper.tag(ModTags.Items.EGGS, helper.tag(ModTags.Items.EGGS,
@@ -337,7 +346,10 @@ public class ModItemTagProvider {
Item.byBlock(ModBlocks.SUCHOMIMUS_EGG.get()), Item.byBlock(ModBlocks.SUCHOMIMUS_EGG.get()),
Item.byBlock(ModBlocks.MUSSASAURUS_EGG.get()), Item.byBlock(ModBlocks.MUSSASAURUS_EGG.get()),
Item.byBlock(ModBlocks.THESCELOSAURUS_EGG.get()), Item.byBlock(ModBlocks.THESCELOSAURUS_EGG.get()),
Item.byBlock(ModBlocks.CHILESAURUS_EGG.get()) Item.byBlock(ModBlocks.CHILESAURUS_EGG.get()),
Item.byBlock(ModBlocks.COELACANTH_EGG.get()),
Item.byBlock(ModBlocks.MAWSONIA_EGG.get()),
Item.byBlock(ModBlocks.ALLIGATOR_GAR_EGG.get())
); );
helper.tag(ModTags.Items.FOSSILS, helper.tag(ModTags.Items.FOSSILS,
@@ -416,7 +428,10 @@ public class ModItemTagProvider {
ModItems.SUCHOMIMUS_SKULL_FOSSIL.get(), ModItems.SUCHOMIMUS_SKULL_FOSSIL.get(),
ModItems.MUSSASAURUS_SKULL_FOSSIL.get(), ModItems.MUSSASAURUS_SKULL_FOSSIL.get(),
ModItems.THESCELOSAURUS_SKULL_FOSSIL.get(), ModItems.THESCELOSAURUS_SKULL_FOSSIL.get(),
ModItems.CHILESAURUS_SKULL_FOSSIL.get() ModItems.CHILESAURUS_SKULL_FOSSIL.get(),
ModItems.COELACANTH_SKULL_FOSSIL.get(),
ModItems.MAWSONIA_SKULL_FOSSIL.get(),
ModItems.ALLIGATOR_GAR_SKULL_FOSSIL.get()
); );
helper.tag(ModTags.Items.SKULLS, helper.tag(ModTags.Items.SKULLS,
@@ -498,7 +513,10 @@ public class ModItemTagProvider {
ModItems.FRESH_SUCHOMIMUS_SKULL.get(), ModItems.FRESH_SUCHOMIMUS_SKULL.get(),
ModItems.FRESH_MUSSASAURUS_SKULL.get(), ModItems.FRESH_MUSSASAURUS_SKULL.get(),
ModItems.FRESH_THESCELOSAURUS_SKULL.get(), ModItems.FRESH_THESCELOSAURUS_SKULL.get(),
ModItems.FRESH_CHILESAURUS_SKULL.get() ModItems.FRESH_CHILESAURUS_SKULL.get(),
ModItems.FRESH_COELACANTH_SKULL.get(),
ModItems.FRESH_MAWSONIA_SKULL.get(),
ModItems.FRESH_ALLIGATOR_GAR_SKULL.get()
); );
} }
} }
@@ -130,6 +130,7 @@ public class ModRecipeProvider {
helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYONIC_MACHINE.get(), 1, new String[]{"AAA", "BCB", "ADA"}, 'A', Items.IRON_INGOT, 'B', ModItems.TEST_TUBE.get(), 'C', Items.IRON_NUGGET, 'D', Items.REDSTONE); helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYONIC_MACHINE.get(), 1, new String[]{"AAA", "BCB", "ADA"}, 'A', Items.IRON_INGOT, 'B', ModItems.TEST_TUBE.get(), 'C', Items.IRON_NUGGET, 'D', Items.REDSTONE);
helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, new String[]{"AB ", "CDE", "FAF"}, 'A', Items.IRON_INGOT, 'B', ModItems.SYRINGE.get(), 'C', ModItems.SCREEN.get(), 'D', ModItems.CABLE.get(), 'E', ModItems.PROCESSOR.get(), 'F', Items.FLINT); helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, new String[]{"AB ", "CDE", "FAF"}, 'A', Items.IRON_INGOT, 'B', ModItems.SYRINGE.get(), 'C', ModItems.SCREEN.get(), 'D', ModItems.CABLE.get(), 'E', ModItems.PROCESSOR.get(), 'F', Items.FLINT);
helper.buildShaped(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, new String[]{"AAA", "BCB", "DED"}, 'A', Blocks.GLASS, 'B', Items.COPPER_INGOT, 'C', Blocks.HAY_BLOCK, 'D', Items.IRON_INGOT, 'E', ModItems.CABLE.get()); helper.buildShaped(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, new String[]{"AAA", "BCB", "DED"}, 'A', Blocks.GLASS, 'B', Items.COPPER_INGOT, 'C', Blocks.HAY_BLOCK, 'D', Items.IRON_INGOT, 'E', ModItems.CABLE.get());
helper.buildShaped(RecipeCategory.MISC, ModBlocks.CULTIVATOR.get(), 1, new String[]{"AAA", "BCB", "DED"}, 'A', Blocks.GLASS, 'B', Items.COPPER_INGOT, 'C', Blocks.HAY_BLOCK, 'D', Items.IRON_INGOT, 'E', ModItems.CABLE.get());
helper.buildShaped(RecipeCategory.MISC, ModItems.WRENCH.get(), 1, new String[]{" A ", " BA", "B "}, 'A', Items.IRON_INGOT, 'B', Items.IRON_NUGGET); helper.buildShaped(RecipeCategory.MISC, ModItems.WRENCH.get(), 1, new String[]{" A ", " BA", "B "}, 'A', Items.IRON_INGOT, 'B', Items.IRON_NUGGET);
helper.buildShaped(RecipeCategory.MISC, ModBlocks.ITEM_PIPE.get(), 8, new String[]{"AAA"}, 'A', ModItems.CABLE.get()); helper.buildShaped(RecipeCategory.MISC, ModBlocks.ITEM_PIPE.get(), 8, new String[]{"AAA"}, 'A', ModItems.CABLE.get());
helper.buildShaped(RecipeCategory.MISC, ModBlocks.FLUID_PIPE.get(), 8, new String[]{" A ", "BBB", " A "}, 'A', Items.WATER_BUCKET, 'B', ModItems.CABLE.get()); helper.buildShaped(RecipeCategory.MISC, ModBlocks.FLUID_PIPE.get(), 8, new String[]{" A ", "BBB", " A "}, 'A', Items.WATER_BUCKET, 'B', ModItems.CABLE.get());
@@ -152,7 +153,9 @@ public class ModRecipeProvider {
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get(), 1, "white_embryo_calcification_machine_from_embryo_calcification_machine", ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()); helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get(), 1, "white_embryo_calcification_machine_from_embryo_calcification_machine", ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get());
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, "embryo_calcification_machine_from_white_embryo_calcification_machine", ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()); helper.buildShapeless(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, "embryo_calcification_machine_from_white_embryo_calcification_machine", ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get());
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_INCUBATOR.get(), 1, "white_incubator_from_incubator", ModBlocks.INCUBATOR.get()); helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_INCUBATOR.get(), 1, "white_incubator_from_incubator", ModBlocks.INCUBATOR.get());
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_CULTIVATOR.get(), 1, "white_cultivator_from_cultivator", ModBlocks.CULTIVATOR.get());
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, "incubator_from_white_incubator", ModBlocks.WHITE_INCUBATOR.get()); helper.buildShapeless(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, "incubator_from_white_incubator", ModBlocks.WHITE_INCUBATOR.get());
helper.buildShapeless(RecipeCategory.MISC, ModBlocks.CULTIVATOR.get(), 1, "cultivator_from_white_cultivator", ModBlocks.WHITE_CULTIVATOR.get());
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.APATOSAURUS_TISSUE.get(), ModItems.APATOSAURUS_DNA.get(), 1); helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.APATOSAURUS_TISSUE.get(), ModItems.APATOSAURUS_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), ModItems.ALBERTOSAURUS_DNA.get(), 1); helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), ModItems.ALBERTOSAURUS_DNA.get(), 1);
@@ -232,6 +235,9 @@ public class ModRecipeProvider {
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CHILESAURUS_TISSUE.get(), ModItems.CHILESAURUS_DNA.get(), 1); helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CHILESAURUS_TISSUE.get(), ModItems.CHILESAURUS_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.THESCELOSAURUS_TISSUE.get(), ModItems.THESCELOSAURUS_DNA.get(), 1); helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.THESCELOSAURUS_TISSUE.get(), ModItems.THESCELOSAURUS_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MUSSASAURUS_TISSUE.get(), ModItems.MUSSASAURUS_DNA.get(), 1); helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MUSSASAURUS_TISSUE.get(), ModItems.MUSSASAURUS_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.COELACANTH_TISSUE.get(), ModItems.COELACANTH_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MAWSONIA_TISSUE.get(), ModItems.MAWSONIA_DNA.get(), 1);
helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALLIGATOR_GAR_TISSUE.get(), ModItems.ALLIGATOR_GAR_DNA.get(), 1);
helper.fossilCleaning(ModBlocks.STONE_FOSSIL.get(), ModItems.APATOSAURUS_SKULL_FOSSIL.get(), 1); helper.fossilCleaning(ModBlocks.STONE_FOSSIL.get(), ModItems.APATOSAURUS_SKULL_FOSSIL.get(), 1);
helper.fossilCleaning(ModBlocks.DEEPSLATE_FOSSIL.get(), ModItems.VELOCIRAPTOR_SKULL_FOSSIL.get(), 1); helper.fossilCleaning(ModBlocks.DEEPSLATE_FOSSIL.get(), ModItems.VELOCIRAPTOR_SKULL_FOSSIL.get(), 1);
@@ -311,6 +317,9 @@ public class ModRecipeProvider {
helper.fossilGrinding(ModItems.CHILESAURUS_SKULL_FOSSIL.get(), ModItems.CHILESAURUS_TISSUE.get(), 1); helper.fossilGrinding(ModItems.CHILESAURUS_SKULL_FOSSIL.get(), ModItems.CHILESAURUS_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.THESCELOSAURUS_SKULL_FOSSIL.get(), ModItems.THESCELOSAURUS_TISSUE.get(), 1); helper.fossilGrinding(ModItems.THESCELOSAURUS_SKULL_FOSSIL.get(), ModItems.THESCELOSAURUS_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.MUSSASAURUS_SKULL_FOSSIL.get(), ModItems.MUSSASAURUS_TISSUE.get(), 1); helper.fossilGrinding(ModItems.MUSSASAURUS_SKULL_FOSSIL.get(), ModItems.MUSSASAURUS_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.COELACANTH_SKULL_FOSSIL.get(), ModItems.COELACANTH_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.MAWSONIA_SKULL_FOSSIL.get(), ModItems.MAWSONIA_TISSUE.get(), 1);
helper.fossilGrinding(ModItems.ALLIGATOR_GAR_SKULL_FOSSIL.get(), ModItems.ALLIGATOR_GAR_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_ALBERTOSAURUS_SKULL.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), 1); helper.skullToTissue(ModItems.FRESH_ALBERTOSAURUS_SKULL.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_APATOSAURUS_SKULL.get(), ModItems.APATOSAURUS_TISSUE.get(), 1); helper.skullToTissue(ModItems.FRESH_APATOSAURUS_SKULL.get(), ModItems.APATOSAURUS_TISSUE.get(), 1);
@@ -390,6 +399,9 @@ public class ModRecipeProvider {
helper.skullToTissue(ModItems.FRESH_CHILESAURUS_SKULL.get(), ModItems.CHILESAURUS_TISSUE.get(), 1); helper.skullToTissue(ModItems.FRESH_CHILESAURUS_SKULL.get(), ModItems.CHILESAURUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_THESCELOSAURUS_SKULL.get(), ModItems.THESCELOSAURUS_TISSUE.get(), 1); helper.skullToTissue(ModItems.FRESH_THESCELOSAURUS_SKULL.get(), ModItems.THESCELOSAURUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_MUSSASAURUS_SKULL.get(), ModItems.MUSSASAURUS_TISSUE.get(), 1); helper.skullToTissue(ModItems.FRESH_MUSSASAURUS_SKULL.get(), ModItems.MUSSASAURUS_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_COELACANTH_SKULL.get(), ModItems.COELACANTH_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_MAWSONIA_SKULL.get(), ModItems.MAWSONIA_TISSUE.get(), 1);
helper.skullToTissue(ModItems.FRESH_ALLIGATOR_GAR_SKULL.get(), ModItems.ALLIGATOR_GAR_TISSUE.get(), 1);
helper.dnaAnalyzing(ModItems.TEST_TUBE.get(), ModItems.FROG_MATERIAL.get(), ModItems.FROG_DNA.get(), 1); helper.dnaAnalyzing(ModItems.TEST_TUBE.get(), ModItems.FROG_MATERIAL.get(), ModItems.FROG_DNA.get(), 1);
@@ -487,6 +499,9 @@ public class ModRecipeProvider {
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CHILESAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CHILESAURUS_SYRINGE.get(), 1); helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CHILESAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CHILESAURUS_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.THESCELOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.THESCELOSAURUS_SYRINGE.get(), 1); helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.THESCELOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.THESCELOSAURUS_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MUSSASAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MUSSASAURUS_SYRINGE.get(), 1); helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MUSSASAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MUSSASAURUS_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.COELACANTH_DNA.get(), ModItems.FROG_DNA.get(), ModItems.COELACANTH_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MAWSONIA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MAWSONIA_SYRINGE.get(), 1);
helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ALLIGATOR_GAR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ALLIGATOR_GAR_SYRINGE.get(), 1);
helper.embryoCalcification(ModItems.ALBERTOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.ALBERTOSAURUS_EGG.get(), 1); helper.embryoCalcification(ModItems.ALBERTOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.ALBERTOSAURUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.APATOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.APATOSAURUS_EGG.get(), 1); helper.embryoCalcification(ModItems.APATOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.APATOSAURUS_EGG.get(), 1);
@@ -566,6 +581,9 @@ public class ModRecipeProvider {
helper.embryoCalcification(ModItems.CHILESAURUS_SYRINGE.get(), Items.EGG, ModBlocks.CHILESAURUS_EGG.get(), 1); helper.embryoCalcification(ModItems.CHILESAURUS_SYRINGE.get(), Items.EGG, ModBlocks.CHILESAURUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.THESCELOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.THESCELOSAURUS_EGG.get(), 1); helper.embryoCalcification(ModItems.THESCELOSAURUS_SYRINGE.get(), Items.EGG, ModBlocks.THESCELOSAURUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.MUSSASAURUS_SYRINGE.get(), Items.EGG, ModBlocks.MUSSASAURUS_EGG.get(), 1); helper.embryoCalcification(ModItems.MUSSASAURUS_SYRINGE.get(), Items.EGG, ModBlocks.MUSSASAURUS_EGG.get(), 1);
helper.embryoCalcification(ModItems.COELACANTH_SYRINGE.get(), Items.EGG, ModBlocks.COELACANTH_EGG.get(), 1);
helper.embryoCalcification(ModItems.MAWSONIA_SYRINGE.get(), Items.EGG, ModBlocks.MAWSONIA_EGG.get(), 1);
helper.embryoCalcification(ModItems.ALLIGATOR_GAR_SYRINGE.get(), Items.EGG, ModBlocks.ALLIGATOR_GAR_EGG.get(), 1);
helper.incubating(ModBlocks.APATOSAURUS_EGG.get(), ModBlocks.INCUBATED_APATOSAURUS_EGG.get(), 1); helper.incubating(ModBlocks.APATOSAURUS_EGG.get(), ModBlocks.INCUBATED_APATOSAURUS_EGG.get(), 1);
helper.incubating(ModBlocks.ALBERTOSAURUS_EGG.get(), ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(), 1); helper.incubating(ModBlocks.ALBERTOSAURUS_EGG.get(), ModBlocks.INCUBATED_ALBERTOSAURUS_EGG.get(), 1);
@@ -0,0 +1,192 @@
package net.cmr.jurassicrevived.datagen.custom;
import net.cmr.jurassicrevived.recipe.CultivatorRecipe;
import net.minecraft.advancements.*;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
import net.minecraft.core.NonNullList;
import net.minecraft.core.registries.BuiltInRegistries;
//? if >1.20.1 {
/*import net.minecraft.data.recipes.RecipeOutput;
*///?}
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike;
import java.util.LinkedHashMap;
import java.util.Map;
//? if <=1.20.1 {
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.cmr.jurassicrevived.recipe.ModRecipes;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import org.jetbrains.annotations.Nullable;
import java.util.function.Consumer;
//?}
public class CultivatingRecipeBuilder {
private java.util.Optional<ItemLike> firstItem = java.util.Optional.empty();
private java.util.Optional<Item> resultItem = java.util.Optional.empty();
private final int count;
//? if >1.20.1 {
/*private final Map<String, Criterion<?>> criteria;
*///?} else {
private final Map<String, InventoryChangeTrigger.TriggerInstance> criteria;
//?}
private final Map<ResourceLocation, Integer> weights = new java.util.HashMap<>();
public CultivatingRecipeBuilder(ItemLike ingredient, ItemLike placeholderResult, int count) {
this.firstItem = java.util.Optional.of(ingredient);
this.resultItem = java.util.Optional.of(placeholderResult.asItem());
this.count = count;
this.criteria = new LinkedHashMap();
}
public static CultivatingRecipeBuilder randomFossil(ItemLike consumableInput, ItemLike placeholderResult, int count) {
return new CultivatingRecipeBuilder(consumableInput, placeholderResult, count);
}
public CultivatingRecipeBuilder addFossilWeight(ItemLike fossilItem, int weight) {
ResourceLocation id = BuiltInRegistries.ITEM.getKey(fossilItem.asItem());
if (id != null) {
weights.put(id, weight);
}
return this;
}
//? if >1.20.1 {
/*public void save(RecipeOutput output) {
ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow());
ResourceLocation id = ResourceLocation.fromNamespaceAndPath(
resultKey.getNamespace(),
resultKey.getPath() + "_from_cultivating"
);
save(output, id);
}
public void save(RecipeOutput output, ResourceLocation recipeId) {
NonNullList<Ingredient> inputs = NonNullList.create();
inputs.add(Ingredient.of(firstItem.orElseThrow()));
ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count);
CultivatorRecipe recipe = new CultivatorRecipe(inputs, result, Map.copyOf(this.weights));
AdvancementHolder advancementHolder = null;
if (!this.criteria.isEmpty()) {
Advancement.Builder builder = output.advancement();
for (Map.Entry<String, Criterion<?>> e : this.criteria.entrySet()) {
builder.addCriterion(e.getKey(), e.getValue());
}
builder.rewards(AdvancementRewards.Builder.recipe(recipeId));
builder.requirements(AdvancementRequirements.Strategy.OR);
advancementHolder = builder.build(recipeId.withPrefix("recipes/"));
}
output.accept(recipeId, recipe, advancementHolder);
}
*///?} else {
public void save(Consumer<FinishedRecipe> consumer) {
ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow());
ResourceLocation id = new ResourceLocation(
resultKey.getNamespace(),
resultKey.getPath() + "_from_cultivating"
);
save(consumer, id);
}
public void save(Consumer<FinishedRecipe> consumer, ResourceLocation recipeId) {
Advancement.Builder advancementBuilder = Advancement.Builder.advancement();
advancementBuilder.parent(new ResourceLocation("recipes/root"))
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId))
.rewards(AdvancementRewards.Builder.recipe(recipeId))
.requirements(RequirementsStrategy.OR);
this.criteria.forEach(advancementBuilder::addCriterion);
consumer.accept(new Result(
recipeId,
Ingredient.of(firstItem.orElseThrow()),
this.resultItem.orElseThrow(),
this.count,
this.weights,
advancementBuilder,
new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath())
));
}
public static class Result implements FinishedRecipe {
private final ResourceLocation id;
private final Ingredient first;
private final Item result;
private final int count;
private final Map<ResourceLocation, Integer> weights;
private final Advancement.Builder advancement;
private final ResourceLocation advancementId;
public Result(ResourceLocation id, Ingredient first, Item result, int count, Map<ResourceLocation, Integer> weights, Advancement.Builder advancement, ResourceLocation advancementId) {
this.id = id;
this.first = first;
this.result = result;
this.count = count;
this.weights = weights;
this.advancement = advancement;
this.advancementId = advancementId;
}
@Override
public void serializeRecipeData(JsonObject json) {
JsonArray ingredients = new JsonArray();
ingredients.add(first.toJson());
json.add("ingredients", ingredients);
JsonObject resultObj = new JsonObject();
resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString());
if (count > 1) {
resultObj.addProperty("count", count);
}
json.add("result", resultObj);
if (!weights.isEmpty()) {
JsonObject weightsObj = new JsonObject();
weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v));
json.add("weights", weightsObj);
}
}
@Override
public ResourceLocation getId() {
return id;
}
@Override
public RecipeSerializer<?> getType() {
return ModRecipes.CULTIVATOR_SERIALIZER.get();
}
@Nullable
@Override
public JsonObject serializeAdvancement() {
return advancement.serializeToJson();
}
@Nullable
@Override
public ResourceLocation getAdvancementId() {
return advancementId;
}
}
//?}
//? if >1.20.1 {
/*public CultivatingRecipeBuilder unlockedBy(String name, Criterion<?> criterion) {
*///?} else {
public CultivatingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) {
//?}
this.criteria.put(name, criterion);
return this;
}
}
@@ -534,6 +534,9 @@ public class ModEntities {
registerGroundAnimalSpawn(CHILESAURUS); registerGroundAnimalSpawn(CHILESAURUS);
registerGroundAnimalSpawn(MUSSASAURUS); registerGroundAnimalSpawn(MUSSASAURUS);
registerGroundAnimalSpawn(THESCELOSAURUS); registerGroundAnimalSpawn(THESCELOSAURUS);
registerGroundAnimalSpawn(COELACANTH);
registerGroundAnimalSpawn(MAWSONIA);
registerGroundAnimalSpawn(ALLIGATOR_GAR);
} }
private static <T extends Animal> void registerGroundAnimalSpawn(RegistrySupplier<EntityType<T>> entityType) { private static <T extends Animal> void registerGroundAnimalSpawn(RegistrySupplier<EntityType<T>> entityType) {
@@ -25,6 +25,9 @@ public class CompsognathusModel extends GeoModel<CompsognathusEntity> {
map.put(CompsognathusVariant.FEMALE, Constants.rl("textures/entity/compsognathus_female.png")); map.put(CompsognathusVariant.FEMALE, Constants.rl("textures/entity/compsognathus_female.png"));
}); });
private static final ResourceLocation REBIRTH_LOCATION =
Constants.rl("textures/entity/compsognathus_rebirth.png");
// Model-local "currently applied" offsets; cleared before each entity render // Model-local "currently applied" offsets; cleared before each entity render
private float[] appliedYaw = null; private float[] appliedYaw = null;
private float[] appliedRoll = null; private float[] appliedRoll = null;
@@ -36,6 +39,10 @@ public class CompsognathusModel extends GeoModel<CompsognathusEntity> {
@Override @Override
public ResourceLocation getTextureResource(CompsognathusEntity animatable) { public ResourceLocation getTextureResource(CompsognathusEntity animatable) {
if (animatable.hasCustomName() && "rebirth".equalsIgnoreCase(animatable.getName().getString())) {
return REBIRTH_LOCATION;
}
return LOCATION_BY_VARIANT.get(animatable.getVariant()); return LOCATION_BY_VARIANT.get(animatable.getVariant());
} }
@@ -6,6 +6,7 @@ import net.cmr.jurassicrevived.entity.ai.DinoData;
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase; import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
import net.cmr.jurassicrevived.entity.ai.IDinoData; import net.cmr.jurassicrevived.entity.ai.IDinoData;
import net.cmr.jurassicrevived.entity.client.AlligatorGarVariant; import net.cmr.jurassicrevived.entity.client.AlligatorGarVariant;
import net.cmr.jurassicrevived.item.ModItems;
import net.minecraft.Util; import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataAccessor;
@@ -22,6 +23,7 @@ import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl;
import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation;
import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation;
import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@@ -95,10 +97,10 @@ public class AlligatorGarEntity extends DinoEntityBase implements GeoEntity {
return new WaterBoundPathNavigation(this, pLevel); return new WaterBoundPathNavigation(this, pLevel);
} }
//@Override @Override
//public ItemStack getPickResult() { public ItemStack getPickResult() {
// return new ItemStack(ModItems.ALLIGATOR_GAR_SPAWN_EGG.get()); return new ItemStack(ModItems.ALLIGATOR_GAR_SPAWN_EGG.get());
//} }
@Override @Override
public boolean isCarnivore() { public boolean isCarnivore() {
@@ -101,10 +101,10 @@ public class CoelacanthEntity extends DinoEntityBase implements GeoEntity {
return new WaterBoundPathNavigation(this, pLevel); return new WaterBoundPathNavigation(this, pLevel);
} }
//@Override @Override
//public ItemStack getPickResult() { public ItemStack getPickResult() {
// return new ItemStack(ModItems.COELACANTH_SPAWN_EGG.get()); return new ItemStack(ModItems.COELACANTH_SPAWN_EGG.get());
//} }
@Override @Override
public boolean isCarnivore() { public boolean isCarnivore() {
@@ -6,6 +6,7 @@ import net.cmr.jurassicrevived.entity.ai.DinoData;
import net.cmr.jurassicrevived.entity.ai.DinoEntityBase; import net.cmr.jurassicrevived.entity.ai.DinoEntityBase;
import net.cmr.jurassicrevived.entity.ai.IDinoData; import net.cmr.jurassicrevived.entity.ai.IDinoData;
import net.cmr.jurassicrevived.entity.client.MawsoniaVariant; import net.cmr.jurassicrevived.entity.client.MawsoniaVariant;
import net.cmr.jurassicrevived.item.ModItems;
import net.minecraft.Util; import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataAccessor;
@@ -22,6 +23,7 @@ import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl;
import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation;
import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation;
import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@@ -95,10 +97,10 @@ public class MawsoniaEntity extends DinoEntityBase implements GeoEntity {
return new WaterBoundPathNavigation(this, pLevel); return new WaterBoundPathNavigation(this, pLevel);
} }
//@Override @Override
//public ItemStack getPickResult() { public ItemStack getPickResult() {
// return new ItemStack(ModItems.MAWSONIA_SPAWN_EGG.get()); return new ItemStack(ModItems.MAWSONIA_SPAWN_EGG.get());
//} }
@Override @Override
public boolean isCarnivore() { public boolean isCarnivore() {
@@ -124,6 +124,7 @@ public class ModCreativeTabs {
output.accept(ModBlocks.EMBRYONIC_MACHINE.get()); output.accept(ModBlocks.EMBRYONIC_MACHINE.get());
output.accept(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()); output.accept(ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get());
output.accept(ModBlocks.INCUBATOR.get()); output.accept(ModBlocks.INCUBATOR.get());
output.accept(ModBlocks.CULTIVATOR.get());
output.accept(ModBlocks.WHITE_GENERATOR.get()); output.accept(ModBlocks.WHITE_GENERATOR.get());
output.accept(ModBlocks.WHITE_DNA_EXTRACTOR.get()); output.accept(ModBlocks.WHITE_DNA_EXTRACTOR.get());
@@ -134,6 +135,7 @@ public class ModCreativeTabs {
output.accept(ModBlocks.WHITE_EMBRYONIC_MACHINE.get()); output.accept(ModBlocks.WHITE_EMBRYONIC_MACHINE.get());
output.accept(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()); output.accept(ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get());
output.accept(ModBlocks.WHITE_INCUBATOR.get()); output.accept(ModBlocks.WHITE_INCUBATOR.get());
output.accept(ModBlocks.WHITE_CULTIVATOR.get());
output.accept(ModBlocks.STONE_FOSSIL.get()); output.accept(ModBlocks.STONE_FOSSIL.get());
output.accept(ModBlocks.DEEPSLATE_FOSSIL.get()); output.accept(ModBlocks.DEEPSLATE_FOSSIL.get());
@@ -163,6 +165,7 @@ public class ModCreativeTabs {
// Skull fossils (alphabetical) // Skull fossils (alphabetical)
output.accept(ModItems.ACHILLOBATOR_SKULL_FOSSIL.get()); output.accept(ModItems.ACHILLOBATOR_SKULL_FOSSIL.get());
output.accept(ModItems.ALBERTOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.ALBERTOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.ALLIGATOR_GAR_SKULL_FOSSIL.get());
output.accept(ModItems.ALLOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.ALLOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.ALVAREZSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.ALVAREZSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.ANKYLOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.ANKYLOSAURUS_SKULL_FOSSIL.get());
@@ -176,6 +179,7 @@ public class ModCreativeTabs {
output.accept(ModItems.CERATOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.CERATOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.CHASMOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.CHASMOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.CHILESAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.CHILESAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.COELACANTH_SKULL_FOSSIL.get());
output.accept(ModItems.COELOPHYSIS_SKULL_FOSSIL.get()); output.accept(ModItems.COELOPHYSIS_SKULL_FOSSIL.get());
output.accept(ModItems.COELURUS_SKULL_FOSSIL.get()); output.accept(ModItems.COELURUS_SKULL_FOSSIL.get());
output.accept(ModItems.COMPSOGNATHUS_SKULL_FOSSIL.get()); output.accept(ModItems.COMPSOGNATHUS_SKULL_FOSSIL.get());
@@ -200,6 +204,7 @@ public class ModCreativeTabs {
output.accept(ModItems.LUDODACTYLUS_SKULL_FOSSIL.get()); output.accept(ModItems.LUDODACTYLUS_SKULL_FOSSIL.get());
output.accept(ModItems.MAJUNGASAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.MAJUNGASAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.MAMENCHISAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.MAMENCHISAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.MAWSONIA_SKULL_FOSSIL.get());
output.accept(ModItems.METRIACANTHOSAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.METRIACANTHOSAURUS_SKULL_FOSSIL.get());
output.accept(ModItems.MOGANOPTERUS_SKULL_FOSSIL.get()); output.accept(ModItems.MOGANOPTERUS_SKULL_FOSSIL.get());
output.accept(ModItems.MUSSASAURUS_SKULL_FOSSIL.get()); output.accept(ModItems.MUSSASAURUS_SKULL_FOSSIL.get());
@@ -240,6 +245,7 @@ public class ModCreativeTabs {
// Fresh skulls (alphabetical) // Fresh skulls (alphabetical)
output.accept(ModItems.FRESH_ACHILLOBATOR_SKULL.get()); output.accept(ModItems.FRESH_ACHILLOBATOR_SKULL.get());
output.accept(ModItems.FRESH_ALBERTOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_ALBERTOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_ALLIGATOR_GAR_SKULL.get());
output.accept(ModItems.FRESH_ALLOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_ALLOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_ALVAREZSAURUS_SKULL.get()); output.accept(ModItems.FRESH_ALVAREZSAURUS_SKULL.get());
output.accept(ModItems.FRESH_ANKYLOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_ANKYLOSAURUS_SKULL.get());
@@ -253,6 +259,7 @@ public class ModCreativeTabs {
output.accept(ModItems.FRESH_CERATOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_CERATOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_CHASMOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_CHASMOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_CHILESAURUS_SKULL.get()); output.accept(ModItems.FRESH_CHILESAURUS_SKULL.get());
output.accept(ModItems.FRESH_COELACANTH_SKULL.get());
output.accept(ModItems.FRESH_COELOPHYSIS_SKULL.get()); output.accept(ModItems.FRESH_COELOPHYSIS_SKULL.get());
output.accept(ModItems.FRESH_COELURUS_SKULL.get()); output.accept(ModItems.FRESH_COELURUS_SKULL.get());
output.accept(ModItems.FRESH_COMPSOGNATHUS_SKULL.get()); output.accept(ModItems.FRESH_COMPSOGNATHUS_SKULL.get());
@@ -280,6 +287,7 @@ public class ModCreativeTabs {
output.accept(ModItems.FRESH_LUDODACTYLUS_SKULL.get()); output.accept(ModItems.FRESH_LUDODACTYLUS_SKULL.get());
output.accept(ModItems.FRESH_MAJUNGASAURUS_SKULL.get()); output.accept(ModItems.FRESH_MAJUNGASAURUS_SKULL.get());
output.accept(ModItems.FRESH_MAMENCHISAURUS_SKULL.get()); output.accept(ModItems.FRESH_MAMENCHISAURUS_SKULL.get());
output.accept(ModItems.FRESH_MAWSONIA_SKULL.get());
output.accept(ModItems.FRESH_METRIACANTHOSAURUS_SKULL.get()); output.accept(ModItems.FRESH_METRIACANTHOSAURUS_SKULL.get());
output.accept(ModItems.FRESH_MOGANOPTERUS_SKULL.get()); output.accept(ModItems.FRESH_MOGANOPTERUS_SKULL.get());
output.accept(ModItems.FRESH_MUSSASAURUS_SKULL.get()); output.accept(ModItems.FRESH_MUSSASAURUS_SKULL.get());
@@ -319,6 +327,7 @@ public class ModCreativeTabs {
// Tissue (alphabetical) // Tissue (alphabetical)
output.accept(ModItems.ACHILLOBATOR_TISSUE.get()); output.accept(ModItems.ACHILLOBATOR_TISSUE.get());
output.accept(ModItems.ALBERTOSAURUS_TISSUE.get()); output.accept(ModItems.ALBERTOSAURUS_TISSUE.get());
output.accept(ModItems.ALLIGATOR_GAR_TISSUE.get());
output.accept(ModItems.ALLOSAURUS_TISSUE.get()); output.accept(ModItems.ALLOSAURUS_TISSUE.get());
output.accept(ModItems.ALVAREZSAURUS_TISSUE.get()); output.accept(ModItems.ALVAREZSAURUS_TISSUE.get());
output.accept(ModItems.ANKYLOSAURUS_TISSUE.get()); output.accept(ModItems.ANKYLOSAURUS_TISSUE.get());
@@ -332,6 +341,7 @@ public class ModCreativeTabs {
output.accept(ModItems.CERATOSAURUS_TISSUE.get()); output.accept(ModItems.CERATOSAURUS_TISSUE.get());
output.accept(ModItems.CHASMOSAURUS_TISSUE.get()); output.accept(ModItems.CHASMOSAURUS_TISSUE.get());
output.accept(ModItems.CHILESAURUS_TISSUE.get()); output.accept(ModItems.CHILESAURUS_TISSUE.get());
output.accept(ModItems.COELACANTH_TISSUE.get());
output.accept(ModItems.COELOPHYSIS_TISSUE.get()); output.accept(ModItems.COELOPHYSIS_TISSUE.get());
output.accept(ModItems.COELURUS_TISSUE.get()); output.accept(ModItems.COELURUS_TISSUE.get());
output.accept(ModItems.COMPSOGNATHUS_TISSUE.get()); output.accept(ModItems.COMPSOGNATHUS_TISSUE.get());
@@ -359,6 +369,7 @@ public class ModCreativeTabs {
output.accept(ModItems.LUDODACTYLUS_TISSUE.get()); output.accept(ModItems.LUDODACTYLUS_TISSUE.get());
output.accept(ModItems.MAJUNGASAURUS_TISSUE.get()); output.accept(ModItems.MAJUNGASAURUS_TISSUE.get());
output.accept(ModItems.MAMENCHISAURUS_TISSUE.get()); output.accept(ModItems.MAMENCHISAURUS_TISSUE.get());
output.accept(ModItems.MAWSONIA_TISSUE.get());
output.accept(ModItems.METRIACANTHOSAURUS_TISSUE.get()); output.accept(ModItems.METRIACANTHOSAURUS_TISSUE.get());
output.accept(ModItems.MOGANOPTERUS_TISSUE.get()); output.accept(ModItems.MOGANOPTERUS_TISSUE.get());
output.accept(ModItems.MUSSASAURUS_TISSUE.get()); output.accept(ModItems.MUSSASAURUS_TISSUE.get());
@@ -399,6 +410,7 @@ public class ModCreativeTabs {
// DNA (alphabetical) // DNA (alphabetical)
output.accept(ModItems.ACHILLOBATOR_DNA.get()); output.accept(ModItems.ACHILLOBATOR_DNA.get());
output.accept(ModItems.ALBERTOSAURUS_DNA.get()); output.accept(ModItems.ALBERTOSAURUS_DNA.get());
output.accept(ModItems.ALLIGATOR_GAR_DNA.get());
output.accept(ModItems.ALLOSAURUS_DNA.get()); output.accept(ModItems.ALLOSAURUS_DNA.get());
output.accept(ModItems.ALVAREZSAURUS_DNA.get()); output.accept(ModItems.ALVAREZSAURUS_DNA.get());
output.accept(ModItems.ANKYLOSAURUS_DNA.get()); output.accept(ModItems.ANKYLOSAURUS_DNA.get());
@@ -412,6 +424,7 @@ public class ModCreativeTabs {
output.accept(ModItems.CERATOSAURUS_DNA.get()); output.accept(ModItems.CERATOSAURUS_DNA.get());
output.accept(ModItems.CHASMOSAURUS_DNA.get()); output.accept(ModItems.CHASMOSAURUS_DNA.get());
output.accept(ModItems.CHILESAURUS_DNA.get()); output.accept(ModItems.CHILESAURUS_DNA.get());
output.accept(ModItems.COELACANTH_DNA.get());
output.accept(ModItems.COELOPHYSIS_DNA.get()); output.accept(ModItems.COELOPHYSIS_DNA.get());
output.accept(ModItems.COELURUS_DNA.get()); output.accept(ModItems.COELURUS_DNA.get());
output.accept(ModItems.COMPSOGNATHUS_DNA.get()); output.accept(ModItems.COMPSOGNATHUS_DNA.get());
@@ -439,6 +452,7 @@ public class ModCreativeTabs {
output.accept(ModItems.LUDODACTYLUS_DNA.get()); output.accept(ModItems.LUDODACTYLUS_DNA.get());
output.accept(ModItems.MAJUNGASAURUS_DNA.get()); output.accept(ModItems.MAJUNGASAURUS_DNA.get());
output.accept(ModItems.MAMENCHISAURUS_DNA.get()); output.accept(ModItems.MAMENCHISAURUS_DNA.get());
output.accept(ModItems.MAWSONIA_DNA.get());
output.accept(ModItems.METRIACANTHOSAURUS_DNA.get()); output.accept(ModItems.METRIACANTHOSAURUS_DNA.get());
output.accept(ModItems.MOGANOPTERUS_DNA.get()); output.accept(ModItems.MOGANOPTERUS_DNA.get());
output.accept(ModItems.MUSSASAURUS_DNA.get()); output.accept(ModItems.MUSSASAURUS_DNA.get());
@@ -479,6 +493,7 @@ public class ModCreativeTabs {
// Syringes (alphabetical) // Syringes (alphabetical)
output.accept(ModItems.ACHILLOBATOR_SYRINGE.get()); output.accept(ModItems.ACHILLOBATOR_SYRINGE.get());
output.accept(ModItems.ALBERTOSAURUS_SYRINGE.get()); output.accept(ModItems.ALBERTOSAURUS_SYRINGE.get());
output.accept(ModItems.ALLIGATOR_GAR_SYRINGE.get());
output.accept(ModItems.ALLOSAURUS_SYRINGE.get()); output.accept(ModItems.ALLOSAURUS_SYRINGE.get());
output.accept(ModItems.ALVAREZSAURUS_SYRINGE.get()); output.accept(ModItems.ALVAREZSAURUS_SYRINGE.get());
output.accept(ModItems.ANKYLOSAURUS_SYRINGE.get()); output.accept(ModItems.ANKYLOSAURUS_SYRINGE.get());
@@ -492,6 +507,7 @@ public class ModCreativeTabs {
output.accept(ModItems.CERATOSAURUS_SYRINGE.get()); output.accept(ModItems.CERATOSAURUS_SYRINGE.get());
output.accept(ModItems.CHASMOSAURUS_SYRINGE.get()); output.accept(ModItems.CHASMOSAURUS_SYRINGE.get());
output.accept(ModItems.CHILESAURUS_SYRINGE.get()); output.accept(ModItems.CHILESAURUS_SYRINGE.get());
output.accept(ModItems.COELACANTH_SYRINGE.get());
output.accept(ModItems.COELOPHYSIS_SYRINGE.get()); output.accept(ModItems.COELOPHYSIS_SYRINGE.get());
output.accept(ModItems.COELURUS_SYRINGE.get()); output.accept(ModItems.COELURUS_SYRINGE.get());
output.accept(ModItems.COMPSOGNATHUS_SYRINGE.get()); output.accept(ModItems.COMPSOGNATHUS_SYRINGE.get());
@@ -519,6 +535,7 @@ public class ModCreativeTabs {
output.accept(ModItems.LUDODACTYLUS_SYRINGE.get()); output.accept(ModItems.LUDODACTYLUS_SYRINGE.get());
output.accept(ModItems.MAJUNGASAURUS_SYRINGE.get()); output.accept(ModItems.MAJUNGASAURUS_SYRINGE.get());
output.accept(ModItems.MAMENCHISAURUS_SYRINGE.get()); output.accept(ModItems.MAMENCHISAURUS_SYRINGE.get());
output.accept(ModItems.MAWSONIA_SYRINGE.get());
output.accept(ModItems.METRIACANTHOSAURUS_SYRINGE.get()); output.accept(ModItems.METRIACANTHOSAURUS_SYRINGE.get());
output.accept(ModItems.MOGANOPTERUS_SYRINGE.get()); output.accept(ModItems.MOGANOPTERUS_SYRINGE.get());
output.accept(ModItems.MUSSASAURUS_SYRINGE.get()); output.accept(ModItems.MUSSASAURUS_SYRINGE.get());
@@ -559,6 +576,7 @@ public class ModCreativeTabs {
// Eggs (alphabetical) // Eggs (alphabetical)
output.accept(ModBlocks.ACHILLOBATOR_EGG.get()); output.accept(ModBlocks.ACHILLOBATOR_EGG.get());
output.accept(ModBlocks.ALBERTOSAURUS_EGG.get()); output.accept(ModBlocks.ALBERTOSAURUS_EGG.get());
output.accept(ModBlocks.ALLIGATOR_GAR_EGG.get());
output.accept(ModBlocks.ALLOSAURUS_EGG.get()); output.accept(ModBlocks.ALLOSAURUS_EGG.get());
output.accept(ModBlocks.ALVAREZSAURUS_EGG.get()); output.accept(ModBlocks.ALVAREZSAURUS_EGG.get());
output.accept(ModBlocks.ANKYLOSAURUS_EGG.get()); output.accept(ModBlocks.ANKYLOSAURUS_EGG.get());
@@ -572,6 +590,7 @@ public class ModCreativeTabs {
output.accept(ModBlocks.CERATOSAURUS_EGG.get()); output.accept(ModBlocks.CERATOSAURUS_EGG.get());
output.accept(ModBlocks.CHASMOSAURUS_EGG.get()); output.accept(ModBlocks.CHASMOSAURUS_EGG.get());
output.accept(ModBlocks.CHILESAURUS_EGG.get()); output.accept(ModBlocks.CHILESAURUS_EGG.get());
output.accept(ModBlocks.COELACANTH_EGG.get());
output.accept(ModBlocks.COELOPHYSIS_EGG.get()); output.accept(ModBlocks.COELOPHYSIS_EGG.get());
output.accept(ModBlocks.COELURUS_EGG.get()); output.accept(ModBlocks.COELURUS_EGG.get());
output.accept(ModBlocks.COMPSOGNATHUS_EGG.get()); output.accept(ModBlocks.COMPSOGNATHUS_EGG.get());
@@ -599,6 +618,7 @@ public class ModCreativeTabs {
output.accept(ModBlocks.LUDODACTYLUS_EGG.get()); output.accept(ModBlocks.LUDODACTYLUS_EGG.get());
output.accept(ModBlocks.MAJUNGASAURUS_EGG.get()); output.accept(ModBlocks.MAJUNGASAURUS_EGG.get());
output.accept(ModBlocks.MAMENCHISAURUS_EGG.get()); output.accept(ModBlocks.MAMENCHISAURUS_EGG.get());
output.accept(ModBlocks.MAWSONIA_EGG.get());
output.accept(ModBlocks.METRIACANTHOSAURUS_EGG.get()); output.accept(ModBlocks.METRIACANTHOSAURUS_EGG.get());
output.accept(ModBlocks.MOGANOPTERUS_EGG.get()); output.accept(ModBlocks.MOGANOPTERUS_EGG.get());
output.accept(ModBlocks.MUSSASAURUS_EGG.get()); output.accept(ModBlocks.MUSSASAURUS_EGG.get());
@@ -644,6 +664,7 @@ public class ModCreativeTabs {
builder.displayItems((params, output) -> { builder.displayItems((params, output) -> {
output.accept(ModItems.ACHILLOBATOR_SPAWN_EGG.get()); output.accept(ModItems.ACHILLOBATOR_SPAWN_EGG.get());
output.accept(ModItems.ALBERTOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.ALBERTOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.ALLIGATOR_GAR_SPAWN_EGG.get());
output.accept(ModItems.ALLOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.ALLOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.ALVAREZSAURUS_SPAWN_EGG.get()); output.accept(ModItems.ALVAREZSAURUS_SPAWN_EGG.get());
output.accept(ModItems.ANKYLOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.ANKYLOSAURUS_SPAWN_EGG.get());
@@ -657,6 +678,7 @@ public class ModCreativeTabs {
output.accept(ModItems.CERATOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.CERATOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.CHASMOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.CHASMOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.CHILESAURUS_SPAWN_EGG.get()); output.accept(ModItems.CHILESAURUS_SPAWN_EGG.get());
output.accept(ModItems.COELACANTH_SPAWN_EGG.get());
output.accept(ModItems.COELOPHYSIS_SPAWN_EGG.get()); output.accept(ModItems.COELOPHYSIS_SPAWN_EGG.get());
output.accept(ModItems.COELURUS_SPAWN_EGG.get()); output.accept(ModItems.COELURUS_SPAWN_EGG.get());
output.accept(ModItems.COMPSOGNATHUS_SPAWN_EGG.get()); output.accept(ModItems.COMPSOGNATHUS_SPAWN_EGG.get());
@@ -684,6 +706,7 @@ public class ModCreativeTabs {
output.accept(ModItems.LUDODACTYLUS_SPAWN_EGG.get()); output.accept(ModItems.LUDODACTYLUS_SPAWN_EGG.get());
output.accept(ModItems.MAJUNGASAURUS_SPAWN_EGG.get()); output.accept(ModItems.MAJUNGASAURUS_SPAWN_EGG.get());
output.accept(ModItems.MAMENCHISAURUS_SPAWN_EGG.get()); output.accept(ModItems.MAMENCHISAURUS_SPAWN_EGG.get());
output.accept(ModItems.MAWSONIA_SPAWN_EGG.get());
output.accept(ModItems.METRIACANTHOSAURUS_SPAWN_EGG.get()); output.accept(ModItems.METRIACANTHOSAURUS_SPAWN_EGG.get());
output.accept(ModItems.MOGANOPTERUS_SPAWN_EGG.get()); output.accept(ModItems.MOGANOPTERUS_SPAWN_EGG.get());
output.accept(ModItems.MUSSASAURUS_SPAWN_EGG.get()); output.accept(ModItems.MUSSASAURUS_SPAWN_EGG.get());
@@ -189,6 +189,12 @@ public class ModItems {
() -> new CustomGenderedSpawnEggItem(ModEntities.THESCELOSAURUS, 0xff6d7a83, 0xffbac6d1, new Item.Properties())); () -> new CustomGenderedSpawnEggItem(ModEntities.THESCELOSAURUS, 0xff6d7a83, 0xffbac6d1, new Item.Properties()));
public static final RegistrySupplier<Item> MUSSASAURUS_SPAWN_EGG = ITEMS.register("mussasaurus_spawn_egg", public static final RegistrySupplier<Item> MUSSASAURUS_SPAWN_EGG = ITEMS.register("mussasaurus_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.MUSSASAURUS, 0xff6c6724, 0xff222611, new Item.Properties())); () -> new CustomGenderedSpawnEggItem(ModEntities.MUSSASAURUS, 0xff6c6724, 0xff222611, new Item.Properties()));
public static final RegistrySupplier<Item> COELACANTH_SPAWN_EGG = ITEMS.register("coelacanth_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.COELACANTH, 0xff3a4862, 0xff616e87, new Item.Properties()));
public static final RegistrySupplier<Item> MAWSONIA_SPAWN_EGG = ITEMS.register("mawsonia_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.MAWSONIA, 0xff595d4d, 0xffd8d8b6, new Item.Properties()));
public static final RegistrySupplier<Item> ALLIGATOR_GAR_SPAWN_EGG = ITEMS.register("alligator_gar_spawn_egg",
() -> new CustomGenderedSpawnEggItem(ModEntities.ALLIGATOR_GAR, 0xff969180, 0xffe4675a, new Item.Properties()));
public static final RegistrySupplier<Item> TEST_TUBE = ITEMS.register("test_tube", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> TEST_TUBE = ITEMS.register("test_tube", () -> new Item(new Item.Properties().stacksTo(16)));
@@ -278,6 +284,9 @@ public class ModItems {
public static final RegistrySupplier<Item> CHILESAURUS_SKULL_FOSSIL = ITEMS.register("chilesaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> CHILESAURUS_SKULL_FOSSIL = ITEMS.register("chilesaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> THESCELOSAURUS_SKULL_FOSSIL = ITEMS.register("thescelosaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> THESCELOSAURUS_SKULL_FOSSIL = ITEMS.register("thescelosaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> MUSSASAURUS_SKULL_FOSSIL = ITEMS.register("mussasaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> MUSSASAURUS_SKULL_FOSSIL = ITEMS.register("mussasaurus_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> COELACANTH_SKULL_FOSSIL = ITEMS.register("coelacanth_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> MAWSONIA_SKULL_FOSSIL = ITEMS.register("mawsonia_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> ALLIGATOR_GAR_SKULL_FOSSIL = ITEMS.register("alligator_gar_skull_fossil", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_VELOCIRAPTOR_SKULL = ITEMS.register("fresh_velociraptor_skull", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> FRESH_VELOCIRAPTOR_SKULL = ITEMS.register("fresh_velociraptor_skull", () -> new Item(new Item.Properties().stacksTo(16)));
@@ -358,6 +367,9 @@ public class ModItems {
public static final RegistrySupplier<Item> FRESH_CHILESAURUS_SKULL = ITEMS.register("fresh_chilesaurus_skull", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> FRESH_CHILESAURUS_SKULL = ITEMS.register("fresh_chilesaurus_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_THESCELOSAURUS_SKULL = ITEMS.register("fresh_thescelosaurus_skull", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> FRESH_THESCELOSAURUS_SKULL = ITEMS.register("fresh_thescelosaurus_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_MUSSASAURUS_SKULL = ITEMS.register("fresh_mussasaurus_skull", () -> new Item(new Item.Properties().stacksTo(16))); public static final RegistrySupplier<Item> FRESH_MUSSASAURUS_SKULL = ITEMS.register("fresh_mussasaurus_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_COELACANTH_SKULL = ITEMS.register("fresh_coelacanth_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_MAWSONIA_SKULL = ITEMS.register("fresh_mawsonia_skull", () -> new Item(new Item.Properties().stacksTo(16)));
public static final RegistrySupplier<Item> FRESH_ALLIGATOR_GAR_SKULL = ITEMS.register("fresh_alligator_gar_skull", () -> new Item(new Item.Properties().stacksTo(16)));
// Tissue group // Tissue group
@@ -439,6 +451,9 @@ public class ModItems {
public static final RegistrySupplier<Item> CHILESAURUS_TISSUE = ITEMS.register("chilesaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC))); public static final RegistrySupplier<Item> CHILESAURUS_TISSUE = ITEMS.register("chilesaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> THESCELOSAURUS_TISSUE = ITEMS.register("thescelosaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC))); public static final RegistrySupplier<Item> THESCELOSAURUS_TISSUE = ITEMS.register("thescelosaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> MUSSASAURUS_TISSUE = ITEMS.register("mussasaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC))); public static final RegistrySupplier<Item> MUSSASAURUS_TISSUE = ITEMS.register("mussasaurus_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> COELACANTH_TISSUE = ITEMS.register("coelacanth_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> MAWSONIA_TISSUE = ITEMS.register("mawsonia_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
public static final RegistrySupplier<Item> ALLIGATOR_GAR_TISSUE = ITEMS.register("alligator_gar_tissue", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.EPIC)));
// DNA group // DNA group
@@ -520,6 +535,9 @@ public class ModItems {
public static final RegistrySupplier<Item> CHILESAURUS_DNA = ITEMS.register("chilesaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE))); public static final RegistrySupplier<Item> CHILESAURUS_DNA = ITEMS.register("chilesaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> THESCELOSAURUS_DNA = ITEMS.register("thescelosaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE))); public static final RegistrySupplier<Item> THESCELOSAURUS_DNA = ITEMS.register("thescelosaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> MUSSASAURUS_DNA = ITEMS.register("mussasaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE))); public static final RegistrySupplier<Item> MUSSASAURUS_DNA = ITEMS.register("mussasaurus_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> COELACANTH_DNA = ITEMS.register("coelacanth_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> MAWSONIA_DNA = ITEMS.register("mawsonia_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
public static final RegistrySupplier<Item> ALLIGATOR_GAR_DNA = ITEMS.register("alligator_gar_dna", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.RARE)));
// Syringe group // Syringe group
@@ -601,7 +619,9 @@ public class ModItems {
public static final RegistrySupplier<Item> CHILESAURUS_SYRINGE = ITEMS.register("chilesaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON))); public static final RegistrySupplier<Item> CHILESAURUS_SYRINGE = ITEMS.register("chilesaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> THESCELOSAURUS_SYRINGE = ITEMS.register("thescelosaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON))); public static final RegistrySupplier<Item> THESCELOSAURUS_SYRINGE = ITEMS.register("thescelosaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> MUSSASAURUS_SYRINGE = ITEMS.register("mussasaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON))); public static final RegistrySupplier<Item> MUSSASAURUS_SYRINGE = ITEMS.register("mussasaurus_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> COELACANTH_SYRINGE = ITEMS.register("coelacanth_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> MAWSONIA_SYRINGE = ITEMS.register("mawsonia_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static final RegistrySupplier<Item> ALLIGATOR_GAR_SYRINGE = ITEMS.register("alligator_gar_syringe", () -> new Item(new Item.Properties().stacksTo(8).rarity(Rarity.UNCOMMON)));
public static void register() { public static void register() {
ITEMS.register(); ITEMS.register();
@@ -25,6 +25,7 @@ public class MenuScreensMixin {
MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYONIC_MACHINE_MENU.get(), EmbryonicMachineScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYONIC_MACHINE_MENU.get(), EmbryonicMachineScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYO_CALCIFICATION_MACHINE_MENU.get(), EmbryoCalcificationMachineScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.EMBRYO_CALCIFICATION_MACHINE_MENU.get(), EmbryoCalcificationMachineScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.INCUBATOR_MENU.get(), IncubatorScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.INCUBATOR_MENU.get(), IncubatorScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.CULTIVATOR_MENU.get(), CultivatorScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.TANK_MENU.get(), TankScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.TANK_MENU.get(), TankScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.POWER_CELL_MENU.get(), PowerCellScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.POWER_CELL_MENU.get(), PowerCellScreen::new);
MenuRegistry.registerScreenFactory(ModMenuTypes.WOOD_CRATE_MENU.get(), CrateScreen::new); MenuRegistry.registerScreenFactory(ModMenuTypes.WOOD_CRATE_MENU.get(), CrateScreen::new);
@@ -0,0 +1,244 @@
package net.cmr.jurassicrevived.recipe;
//? if >1.20.1 {
/*import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.HolderLookup;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
*///?} else {
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.util.GsonHelper;
//?}
import net.cmr.jurassicrevived.util.ModTags;
import net.minecraft.core.NonNullList;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//? if >1.20.1 {
/*public record CultivatorRecipe(NonNullList<Ingredient> inputs, ItemStack output, Map<ResourceLocation, Integer> weights) implements Recipe<CultivatorRecipeInput> {
*///?} else {
public class CultivatorRecipe implements Recipe<CultivatorRecipeInput> {
private final NonNullList<Ingredient> inputs;
private final ItemStack output;
private final ResourceLocation id;
private final Map<ResourceLocation, Integer> weights;
//?}
//? if <=1.20.1 {
public CultivatorRecipe(ResourceLocation id, NonNullList<Ingredient> inputs, ItemStack output, Map<ResourceLocation, Integer> weights) {
this.id = id;
this.inputs = inputs;
this.output = output;
this.weights = Map.copyOf(weights);
}
//?}
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override
public boolean matches(@NotNull CultivatorRecipeInput input, Level level) {
if (level.isClientSide()) return false;
if (inputs.isEmpty()) return false;
// Single fossil block ingredient lives in machine slot 0 (input.getItem(0))
return inputs.get(0).test(input.getItem(0));
}
//? if >1.20.1 {
/*@Override
public @NotNull ItemStack assemble(CultivatorRecipeInput input, HolderLookup.Provider registries) {
return getWeightedResult(registries);
}
@Override
public @NotNull ItemStack getResultItem(HolderLookup.Provider registries) {
return output.copy();
}
*///?} else {
@Override
public ItemStack assemble(CultivatorRecipeInput input, RegistryAccess registries) {
return getWeightedResult(registries);
}
@Override
public ItemStack getResultItem(RegistryAccess registries) {
return output.copy();
}
@Override
public ResourceLocation getId() {
return id;
}
//?}
private ItemStack getWeightedResult(Object registries) {
//? if >1.20.1 {
/*var fossilTag = BuiltInRegistries.ITEM.getOrCreateTag(ModTags.Items.FOSSILS);
List<ItemStack> candidates = fossilTag.stream().map(ItemStack::new).toList();
*///?} else {
ItemStack[] candidatesArr = Ingredient.of(ModTags.Items.FOSSILS).getItems();
List<ItemStack> candidates = List.of(candidatesArr);
//?}
if (candidates.isEmpty()) return output.copy();
RandomSource random = RandomSource.create();
long total = 0;
int[] weightsArray = new int[candidates.size()];
for (int i = 0; i < candidates.size(); i++) {
Item item = candidates.get(i).getItem();
ResourceLocation key = BuiltInRegistries.ITEM.getKey(item);
int w = Math.max(0, weights.getOrDefault(key, 1));
weightsArray[i] = w;
total += w;
}
if (total <= 0) return candidates.get(random.nextInt(candidates.size())).copy();
long roll = 1L + (total <= Integer.MAX_VALUE ? random.nextInt((int) total) : Math.abs(random.nextLong()) % total);
long cumulative = 0;
for (int i = 0; i < candidates.size(); i++) {
cumulative += weightsArray[i];
if (roll <= cumulative) return candidates.get(i).copy();
}
return candidates.get(candidates.size() - 1).copy();
}
@Override
public boolean canCraftInDimensions(int width, int height) {
return true;
}
@Override
public @NotNull NonNullList<Ingredient> getIngredients() {
return inputs;
}
@Override
public @NotNull RecipeSerializer<?> getSerializer() {
return ModRecipes.CULTIVATOR_SERIALIZER.get();
}
@Override
public @NotNull RecipeType<?> getType() {
return ModRecipes.CULTIVATOR_RECIPE_TYPE.get();
}
public int getWeightFor(Item item) {
ResourceLocation key = BuiltInRegistries.ITEM.getKey(item);
return weights.getOrDefault(key, 1);
}
//? if <=1.20.1 {
public ItemStack output() { return output; }
//?}
//? if >1.20.1 {
/*public Map<ResourceLocation, Integer> weights() { return weights; }
public ItemStack output() { return output; }
*///?}
public static class Serializer implements RecipeSerializer<CultivatorRecipe> {
//? if >1.20.1 {
/*private static final Codec<Map<ResourceLocation, Integer>> WEIGHTS_CODEC =
Codec.unboundedMap(ResourceLocation.CODEC, Codec.INT);
public static final MapCodec<CultivatorRecipe> CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group(
Ingredient.CODEC_NONEMPTY.listOf().fieldOf("ingredients").flatXmap(list -> {
if (list.size() != 1) return DataResult.error(() -> "Must have 1 ingredient");
return DataResult.success(NonNullList.of(Ingredient.EMPTY, list.toArray(Ingredient[]::new)));
}, DataResult::success).forGetter(CultivatorRecipe::inputs),
ItemStack.CODEC.fieldOf("result").forGetter(CultivatorRecipe::output),
WEIGHTS_CODEC.optionalFieldOf("fossil_weights", Map.of()).forGetter(CultivatorRecipe::weights)
).apply(inst, CultivatorRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, CultivatorRecipe> STREAM_CODEC = StreamCodec.of(
(buf, recipe) -> {
ByteBufCodecs.collection(NonNullList::createWithCapacity, Ingredient.CONTENTS_STREAM_CODEC).encode(buf, recipe.inputs());
ItemStack.STREAM_CODEC.encode(buf, recipe.output());
buf.writeMap(recipe.weights(), ResourceLocation.STREAM_CODEC, ByteBufCodecs.VAR_INT);
},
buf -> {
NonNullList<Ingredient> inputs = ByteBufCodecs.collection(NonNullList::createWithCapacity, Ingredient.CONTENTS_STREAM_CODEC).decode(buf);
ItemStack output = ItemStack.STREAM_CODEC.decode(buf);
Map<ResourceLocation, Integer> weights = buf.readMap(
HashMap<ResourceLocation, Integer>::new,
ResourceLocation.STREAM_CODEC,
ByteBufCodecs.VAR_INT
);
return new CultivatorRecipe(inputs, output, weights);
}
);
@Override public MapCodec<CultivatorRecipe> codec() { return CODEC; }
@Override public StreamCodec<RegistryFriendlyByteBuf, CultivatorRecipe> streamCodec() { return STREAM_CODEC; }
*///?} else {
@Override
public CultivatorRecipe fromJson(ResourceLocation id, JsonObject json) {
ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "result"));
JsonArray ingredients = GsonHelper.getAsJsonArray(json, "ingredients");
NonNullList<Ingredient> inputs = NonNullList.withSize(1, Ingredient.EMPTY);
inputs.set(0, Ingredient.fromJson(ingredients.get(0)));
Map<ResourceLocation, Integer> weights = new HashMap<>();
if (json.has("fossil_weights")) {
JsonObject weightsObj = json.getAsJsonObject("fossil_weights");
for (String key : weightsObj.keySet()) {
weights.put(ResourceLocation.tryParse(key), weightsObj.get(key).getAsInt());
}
}
return new CultivatorRecipe(id, inputs, output, weights);
}
@Override
public CultivatorRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buf) {
int size = buf.readVarInt();
NonNullList<Ingredient> inputs = NonNullList.withSize(size, Ingredient.EMPTY);
for (int i = 0; i < size; i++) {
inputs.set(i, Ingredient.fromNetwork(buf));
}
ItemStack output = buf.readItem();
Map<ResourceLocation, Integer> weights = buf.readMap(FriendlyByteBuf::readResourceLocation, FriendlyByteBuf::readVarInt);
return new CultivatorRecipe(id, inputs, output, weights);
}
@Override
public void toNetwork(FriendlyByteBuf buf, CultivatorRecipe recipe) {
buf.writeVarInt(recipe.inputs.size());
for (Ingredient ing : recipe.inputs) {
ing.toNetwork(buf);
}
buf.writeItem(recipe.output);
buf.writeMap(recipe.weights, FriendlyByteBuf::writeResourceLocation, FriendlyByteBuf::writeVarInt);
}
//?}
}
}
@@ -0,0 +1,35 @@
package net.cmr.jurassicrevived.recipe;
import net.minecraft.world.item.ItemStack;
//? if >1.20.1 {
/*import net.minecraft.world.item.crafting.RecipeInput;
*///?} else {
import net.minecraft.world.SimpleContainer;
//?}
import java.util.List;
//? if >1.20.1 {
/*public record CultivatorRecipeInput(ItemStack fossil, ItemStack waterSlot) implements RecipeInput {
@Override
public ItemStack getItem(int index) {
return switch (index) {
case 0 -> fossil;
case 1 -> waterSlot;
default -> throw new IllegalArgumentException("Unexpected slot index: " + index);
};
}
@Override
public int size() {
return 2;
}
}
*///?} else {
public class CultivatorRecipeInput extends SimpleContainer {
public CultivatorRecipeInput(ItemStack fossil, ItemStack waterSlot) {
super(fossil, waterSlot);
}
}
//?}
@@ -55,6 +55,16 @@ public record DNAAnalyzerRecipe(
return output.copy(); return output.copy();
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override @Override
public ItemStack getResultItem(HolderLookup.Provider provider) { public ItemStack getResultItem(HolderLookup.Provider provider) {
return output.copy(); return output.copy();
@@ -94,6 +94,16 @@ public record DNAExtractorRecipe(
@Override public RecipeSerializer<?> getSerializer() { return ModRecipes.DNA_EXTRACTOR_SERIALIZER.get(); } @Override public RecipeSerializer<?> getSerializer() { return ModRecipes.DNA_EXTRACTOR_SERIALIZER.get(); }
@Override public RecipeType<?> getType() { return ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get(); } @Override public RecipeType<?> getType() { return ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get(); }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
public int getWeightFor(Item item) { public int getWeightFor(Item item) {
ResourceLocation key = BuiltInRegistries.ITEM.getKey(item); ResourceLocation key = BuiltInRegistries.ITEM.getKey(item);
return weights.getOrDefault(key, 1); return weights.getOrDefault(key, 1);
@@ -35,6 +35,16 @@ public record DNAHybridizerRecipe(ResourceLocation id, NonNullList<Ingredient> i
return inputs; return inputs;
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override @Override
public boolean matches(DNAHybridizerRecipeInput recipeInput, Level level) { public boolean matches(DNAHybridizerRecipeInput recipeInput, Level level) {
if (level.isClientSide) return false; if (level.isClientSide) return false;
@@ -33,6 +33,16 @@ public record EmbryoCalcificationMachineRecipe(ResourceLocation id, NonNullList<
return inputs; return inputs;
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override @Override
public boolean matches(EmbryoCalcificationMachineRecipeInput recipeInput, Level level) { public boolean matches(EmbryoCalcificationMachineRecipeInput recipeInput, Level level) {
if (level.isClientSide) return false; if (level.isClientSide) return false;
@@ -76,6 +76,16 @@ public class EmbryonicMachineRecipe implements Recipe<EmbryonicMachineRecipeInpu
return output.copy(); return output.copy();
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override @Override
public @NotNull ItemStack getResultItem(HolderLookup.Provider registries) { public @NotNull ItemStack getResultItem(HolderLookup.Provider registries) {
return output.copy(); return output.copy();
@@ -69,6 +69,16 @@ public class FossilCleanerRecipe implements Recipe<FossilCleanerRecipeInput> {
return getWeightedResult(registries); return getWeightedResult(registries);
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
@Override @Override
public @NotNull ItemStack getResultItem(HolderLookup.Provider registries) { public @NotNull ItemStack getResultItem(HolderLookup.Provider registries) {
return output.copy(); return output.copy();
@@ -59,6 +59,16 @@ public class FossilGrinderRecipe implements Recipe<FossilGrinderRecipeInput> {
return inputs.get(0).test(input.getItem(0)); return inputs.get(0).test(input.getItem(0));
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
//? if >1.20.1 { //? if >1.20.1 {
/*@Override /*@Override
public @NotNull ItemStack assemble(FossilGrinderRecipeInput input, HolderLookup.Provider registries) { public @NotNull ItemStack assemble(FossilGrinderRecipeInput input, HolderLookup.Provider registries) {
@@ -49,6 +49,16 @@ public class IncubatorRecipe implements Recipe<IncubatorRecipeInput> {
return inputs.get(0).test(input.getItem(0)); return inputs.get(0).test(input.getItem(0));
} }
@Override
public boolean isSpecial() {
return true;
}
@Override
public boolean showNotification() {
return false;
}
//? if >1.20.1 { //? if >1.20.1 {
/*@Override /*@Override
public @NotNull ItemStack assemble(IncubatorRecipeInput input, HolderLookup.Provider registries) { public @NotNull ItemStack assemble(IncubatorRecipeInput input, HolderLookup.Provider registries) {
@@ -93,6 +93,16 @@ public class ModRecipes {
} }
}); });
public static final RegistrySupplier<RecipeSerializer<CultivatorRecipe>> CULTIVATOR_SERIALIZER =
SERIALIZERS.register("cultivating", CultivatorRecipe.Serializer::new);
public static final RegistrySupplier<RecipeType<CultivatorRecipe>> CULTIVATOR_RECIPE_TYPE =
TYPES.register("cultivating", () -> new RecipeType<CultivatorRecipe>() {
@Override
public String toString() {
return "cultivating";
}
});
public static void register() { public static void register() {
SERIALIZERS.register(); SERIALIZERS.register();
TYPES.register(); TYPES.register();
@@ -30,6 +30,8 @@ public class ModMenuTypes {
MENUS.register("embryo_calcification_machine_menu", () -> MenuRegistry.ofExtended(EmbryoCalcificationMachineMenu::new)); MENUS.register("embryo_calcification_machine_menu", () -> MenuRegistry.ofExtended(EmbryoCalcificationMachineMenu::new));
public static final RegistrySupplier<MenuType<IncubatorMenu>> INCUBATOR_MENU = public static final RegistrySupplier<MenuType<IncubatorMenu>> INCUBATOR_MENU =
MENUS.register("incubator_menu", () -> MenuRegistry.ofExtended(IncubatorMenu::new)); MENUS.register("incubator_menu", () -> MenuRegistry.ofExtended(IncubatorMenu::new));
public static final RegistrySupplier<MenuType<CultivatorMenu>> CULTIVATOR_MENU =
MENUS.register("cultivator_menu", () -> MenuRegistry.ofExtended(CultivatorMenu::new));
public static final RegistrySupplier<MenuType<TankMenu>> TANK_MENU = public static final RegistrySupplier<MenuType<TankMenu>> TANK_MENU =
MENUS.register("tank_menu", () -> MenuRegistry.ofExtended(TankMenu::new)); MENUS.register("tank_menu", () -> MenuRegistry.ofExtended(TankMenu::new));
public static final RegistrySupplier<MenuType<PowerCellMenu>> POWER_CELL_MENU = public static final RegistrySupplier<MenuType<PowerCellMenu>> POWER_CELL_MENU =
@@ -0,0 +1,146 @@
package net.cmr.jurassicrevived.screen.custom;
import net.cmr.jurassicrevived.block.ModBlocks;
import net.cmr.jurassicrevived.block.entity.custom.CultivatorBlockEntity;
import net.cmr.jurassicrevived.screen.ModMenuTypes;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
public class CultivatorMenu extends AbstractContainerMenu {
public final CultivatorBlockEntity blockEntity;
public final Level level;
public final ContainerData data;
public CultivatorMenu(int containerId, Inventory inventory, FriendlyByteBuf data) {
this(containerId, inventory, inventory.player.level().getBlockEntity(data.readBlockPos()), new SimpleContainerData(2));
}
public CultivatorMenu(int containerId, Inventory inventory, BlockEntity entity, ContainerData data) {
super(ModMenuTypes.CULTIVATOR_MENU.get(), containerId);
blockEntity = ((CultivatorBlockEntity) entity);
this.level = inventory.player.level();
this.data = data;
addPlayerInventory(inventory);
addPlayerHotbar(inventory);
// Water Input Slot (0)
this.addSlot(new Slot(blockEntity.itemHandler, 0, 7, 61) {
@Override
public boolean mayPlace(ItemStack stack) {
// Simplified validation for common: accepts bucket or water bucket
return stack.is(Items.WATER_BUCKET);
}
});
// Fossil Block Slot (1)
this.addSlot(new Slot(blockEntity.itemHandler, 1, 56, 35) {
@Override
public boolean mayPlace(ItemStack stack) {
return stack.getItem() == ModBlocks.STONE_FOSSIL.get().asItem() || stack.getItem() == ModBlocks.DEEPSLATE_FOSSIL.get().asItem();
}
});
// Output Slots (2, 3, 4)
this.addSlot(new Slot(blockEntity.itemHandler, 2, 103, 35) {
@Override
public boolean mayPlace(ItemStack stack) {
return false;
}
});
this.addSlot(new Slot(blockEntity.itemHandler, 3, 121, 35) {
@Override
public boolean mayPlace(ItemStack stack) {
return false;
}
});
this.addSlot(new Slot(blockEntity.itemHandler, 4, 139, 35) {
@Override
public boolean mayPlace(ItemStack stack) {
return false;
}
});
addDataSlots(data);
}
public boolean isCrafting() {
return data.get(0) > 0;
}
public int getScaledArrowProgress() {
int progress = this.data.get(0);
int maxProgress = this.data.get(1);
int arrowPixelSize = 29;
return maxProgress != 0 && progress != 0 ? progress * arrowPixelSize / maxProgress : 0;
}
private static final int HOTBAR_SLOT_COUNT = 9;
private static final int PLAYER_INVENTORY_ROW_COUNT = 3;
private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9;
private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT;
private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT;
private static final int VANILLA_FIRST_SLOT_INDEX = 0;
private static final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_SLOT_COUNT;
private static final int TE_INVENTORY_SLOT_COUNT = 5;
@Override
public ItemStack quickMoveStack(Player playerIn, int pIndex) {
Slot sourceSlot = slots.get(pIndex);
if (sourceSlot == null || !sourceSlot.hasItem()) return ItemStack.EMPTY;
ItemStack sourceStack = sourceSlot.getItem();
ItemStack copyOfSourceStack = sourceStack.copy();
if (pIndex < VANILLA_SLOT_COUNT) {
// Player inventory -> machine inputs (slots 0 and 1)
int teInputStart = TE_INVENTORY_FIRST_SLOT_INDEX;
int teInputEndExclusive = TE_INVENTORY_FIRST_SLOT_INDEX + 2;
if (!moveItemStackTo(sourceStack, teInputStart, teInputEndExclusive, false)) {
return ItemStack.EMPTY;
}
} else if (pIndex < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) {
// Machine -> player inventory
if (!moveItemStackTo(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_SLOT_COUNT, false)) {
return ItemStack.EMPTY;
}
} else {
return ItemStack.EMPTY;
}
if (sourceStack.isEmpty()) {
sourceSlot.set(ItemStack.EMPTY);
} else {
sourceSlot.setChanged();
}
sourceSlot.onTake(playerIn, sourceStack);
return copyOfSourceStack;
}
@Override
public boolean stillValid(Player player) {
return stillValid(ContainerLevelAccess.create(this.level, this.blockEntity.getBlockPos()),
player, this.blockEntity.getBlockState().getBlock());
}
public void addPlayerInventory(Inventory playerInventory) {
for (int i = 0; i < 3; i++) {
for (int l = 0; l < 9; l++) {
this.addSlot(new Slot(playerInventory, l + i * 9 + 9, 8 + l * 18, 84 + i * 18));
}
}
}
public void addPlayerHotbar(Inventory playerInventory) {
for (int i = 0; i < 9; i++) {
this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142));
}
}
}
@@ -0,0 +1,142 @@
package net.cmr.jurassicrevived.screen.custom;
import com.mojang.blaze3d.systems.RenderSystem;
import dev.architectury.fluid.FluidStack;
import net.cmr.jurassicrevived.Constants;
import net.cmr.jurassicrevived.config.JRConfigManager;
import net.cmr.jurassicrevived.screen.renderer.EnergyDisplayTooltipArea;
import net.cmr.jurassicrevived.screen.renderer.FluidTankRenderer;
import net.cmr.jurassicrevived.util.MouseUtil;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.TooltipFlag;
import java.util.Optional;
public class CultivatorScreen extends AbstractContainerScreen<CultivatorMenu> {
private static final ResourceLocation GUI_TEXTURE =
Constants.rl("textures/gui/fossil_cleaner/fossil_cleaner_gui.png");
private static final ResourceLocation BUBBLES_TEXTURE =
Constants.rl("textures/gui/generic/bubbles.png");
private static final ResourceLocation WHITE_BUBBLES_TEXTURE =
Constants.rl("textures/gui/generic/white_bubbles.png");
private static final ResourceLocation POWER_BAR_TEXTURE =
Constants.rl("textures/gui/generic/power_bar.png");
private static final ResourceLocation SKULL_TEXTURE =
Constants.rl("textures/gui/generic/skull.png");
private FluidTankRenderer fluidRenderer;
private EnergyDisplayTooltipArea energyInfoArea;
public CultivatorScreen(CultivatorMenu menu, Inventory playerInventory, Component title) {
super(menu, playerInventory, title);
}
@Override
protected void init() {
super.init();
this.inventoryLabelY = 10000;
this.titleLabelY = 10000;
assignFluidRenderer();
assignEnergyInfoArea();
}
private void renderEnergyAreaTooltip(GuiGraphics guiGraphics, int pMouseX, int pMouseY, int x, int y) {
if(isMouseAboveArea(pMouseX, pMouseY, x, y, 160, 11, 8, 64) && JRConfigManager.get().requirePower) {
guiGraphics.renderTooltip(this.font, energyInfoArea.getTooltips(),
Optional.empty(), pMouseX - x, pMouseY - y);
}
}
private void assignEnergyInfoArea() {
energyInfoArea = new EnergyDisplayTooltipArea(((width - imageWidth) / 2) + 160,
((height - imageHeight) / 2) + 11, menu.blockEntity.getEnergyStorage(null));
}
private void assignFluidRenderer() {
fluidRenderer = new FluidTankRenderer(16000, true, 16, 50);
}
private void renderFluidTooltipArea(GuiGraphics guiGraphics, int MouseX, int MouseY, int x, int y,
FluidStack stack, int offsetX, int offsetY, FluidTankRenderer renderer) {
if(isMouseAboveArea(MouseX, MouseY, x, y, offsetX, offsetY, renderer)) {
guiGraphics.renderTooltip(this.font, renderer.getTooltip(stack, TooltipFlag.Default.NORMAL),
Optional.empty(), MouseX - x, MouseY - y);
}
}
@Override
protected void renderLabels(GuiGraphics guiGraphics, int pMouseX, int pMouseY) {
int x = (width - imageWidth) / 2;
int y = (height - imageHeight) / 2;
renderFluidTooltipArea(guiGraphics, pMouseX, pMouseY, x, y, menu.blockEntity.getFluid(), 7, 8, fluidRenderer);
if (JRConfigManager.get().requirePower) {
renderEnergyAreaTooltip(guiGraphics, pMouseX, pMouseY, x, y);
}
}
@Override
protected void renderBg(GuiGraphics guiGraphics, float v, int i, int i1) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, GUI_TEXTURE);
int x = (this.width - this.imageWidth) / 2;
int y = (this.height - this.imageHeight) /2;
guiGraphics.blit(GUI_TEXTURE, x, y, 0, 0, this.imageWidth, this.imageHeight, 176, 166);
guiGraphics.blit(BUBBLES_TEXTURE, x + 73, y + 37, 0, 0, 29, 12, 29, 12);
guiGraphics.blit(SKULL_TEXTURE, x + 57, y + 35, 0, 0, 16, 16, 16, 16);
RenderProgressArrow(guiGraphics, x, y);
if (JRConfigManager.get().requirePower) {
guiGraphics.blit(POWER_BAR_TEXTURE, x+159, y+10, 0, 0, 10, 66, 10, 66);
}
}
private void RenderProgressArrow(GuiGraphics guiGraphics, int x, int y) {
if(menu.isCrafting()) {
guiGraphics.blit(WHITE_BUBBLES_TEXTURE, x+73, y + 37, 0, 0, menu.getScaledArrowProgress(), 12, 29, 12);
}
}
@Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) {
//? if >1.20.1 {
/*this.renderBackground(guiGraphics, mouseX, mouseY, partialTick);
*///?} else {
renderBackground(guiGraphics);
//?}
super.render(guiGraphics, mouseX, mouseY, partialTick);
int x = (this.width - this.imageWidth) / 2;
int y = (this.height - this.imageHeight) /2;
if (MouseUtil.isMouseOver(mouseX, mouseY, x + 7, y + 8, 16, 50)) {
renderHoverHighlight(guiGraphics, x + 7, y + 8, 16, 50);
}
renderTooltip(guiGraphics, mouseX, mouseY);
fluidRenderer.render(guiGraphics, x + 7, y + 8, menu.blockEntity.getFluid());
if (JRConfigManager.get().requirePower) {
energyInfoArea.render(guiGraphics);
}
}
private static void renderHoverHighlight(GuiGraphics g, int x, int y, int w, int h) {
g.pose().pushPose();
g.pose().translate(0, 0, 200);
g.fillGradient(x, y, x + w, y + h, 0x80FFFFFF, 0x80FFFFFF);
g.pose().popPose();
}
public static boolean isMouseAboveArea(int pMouseX, int pMouseY, int x, int y, int offsetX, int offsetY, FluidTankRenderer renderer) {
return MouseUtil.isMouseOver(pMouseX, pMouseY, x + offsetX, y + offsetY, renderer.getWidth(), renderer.getHeight());
}
public static boolean isMouseAboveArea(int pMouseX, int pMouseY, int x, int y, int offsetX, int offsetY, int width, int height) {
return MouseUtil.isMouseOver(pMouseX, pMouseY, x + offsetX, y + offsetY, width, height);
}
}
@@ -88,7 +88,10 @@ public final class ModSpawnDefinitions {
spawn("utahraptor", ModEntities.UTAHRAPTOR, 4, 1, 3, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), spawn("utahraptor", ModEntities.UTAHRAPTOR, 4, 1, 3, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST),
spawn("velociraptor", ModEntities.VELOCIRAPTOR, 5, 2, 4, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), spawn("velociraptor", ModEntities.VELOCIRAPTOR, 5, 2, 4, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD),
spawn("zhenyuanopterus", ModEntities.ZHENYUANOPTERUS, 2, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN), spawn("zhenyuanopterus", ModEntities.ZHENYUANOPTERUS, 2, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN),
spawn("achillobator", ModEntities.ACHILLOBATOR, 3, 1, 2, BiomeTags.IS_TAIGA) spawn("achillobator", ModEntities.ACHILLOBATOR, 3, 1, 2, BiomeTags.IS_TAIGA),
spawn("coelacanth", ModEntities.COELACANTH, 9, 3, 6, BiomeTags.IS_OCEAN, BiomeTags.IS_RIVER),
spawn("mawsonia", ModEntities.MAWSONIA, 3, 1, 2, BiomeTags.IS_OCEAN, BiomeTags.IS_RIVER),
spawn("alligator_gar", ModEntities.ALLIGATOR_GAR, 6, 1, 2, BiomeTags.IS_OCEAN, BiomeTags.IS_RIVER)
); );
@SafeVarargs @SafeVarargs
@@ -85,6 +85,9 @@
"item.jurassicrevived.chilesaurus_spawn_egg": "Chilesaurus Spawn Egg", "item.jurassicrevived.chilesaurus_spawn_egg": "Chilesaurus Spawn Egg",
"item.jurassicrevived.thescelosaurus_spawn_egg": "Thescelosaurus Spawn Egg", "item.jurassicrevived.thescelosaurus_spawn_egg": "Thescelosaurus Spawn Egg",
"item.jurassicrevived.mussasaurus_spawn_egg": "Mussasaurus Spawn Egg", "item.jurassicrevived.mussasaurus_spawn_egg": "Mussasaurus Spawn Egg",
"item.jurassicrevived.coelacanth_spawn_egg": "Coelacanth Spawn Egg",
"item.jurassicrevived.mawsonia_spawn_egg": "Mawsonia Spawn Egg",
"item.jurassicrevived.alligator_gar_spawn_egg": "Alligator Gar Spawn Egg",
"entity.jurassicrevived.apatosaurus": "Apatosaurus", "entity.jurassicrevived.apatosaurus": "Apatosaurus",
"entity.jurassicrevived.albertosaurus": "Albertosaurus", "entity.jurassicrevived.albertosaurus": "Albertosaurus",
@@ -166,6 +169,9 @@
"entity.jurassicrevived.chilesaurus": "Chilesaurus", "entity.jurassicrevived.chilesaurus": "Chilesaurus",
"entity.jurassicrevived.thescelosaurus": "Thescelosaurus", "entity.jurassicrevived.thescelosaurus": "Thescelosaurus",
"entity.jurassicrevived.mussasaurus": "Mussasaurus", "entity.jurassicrevived.mussasaurus": "Mussasaurus",
"entity.jurassicrevived.coelacanth": "Coelacanth",
"entity.jurassicrevived.mawsonia": "Mawsonia",
"entity.jurassicrevived.alligator_gar": "Alligator Gar",
"block.jurassicrevived.cat_plushie": "Cat Plushie", "block.jurassicrevived.cat_plushie": "Cat Plushie",
"block.jurassicrevived.trash_can": "Trash Can", "block.jurassicrevived.trash_can": "Trash Can",
@@ -238,6 +244,7 @@
"block.jurassicrevived.embryonic_machine": "Embryonic Machine", "block.jurassicrevived.embryonic_machine": "Embryonic Machine",
"block.jurassicrevived.embryo_calcification_machine": "Embryo Calcification Machine", "block.jurassicrevived.embryo_calcification_machine": "Embryo Calcification Machine",
"block.jurassicrevived.incubator": "Incubator", "block.jurassicrevived.incubator": "Incubator",
"block.jurassicrevived.cultivator": "Cultivator",
"block.jurassicrevived.white_generator": "White Generator", "block.jurassicrevived.white_generator": "White Generator",
"block.jurassicrevived.white_dna_extractor": "White DNA Extractor", "block.jurassicrevived.white_dna_extractor": "White DNA Extractor",
@@ -248,6 +255,7 @@
"block.jurassicrevived.white_embryonic_machine": "White Embryonic Machine", "block.jurassicrevived.white_embryonic_machine": "White Embryonic Machine",
"block.jurassicrevived.white_embryo_calcification_machine": "White Embryo Calcification Machine", "block.jurassicrevived.white_embryo_calcification_machine": "White Embryo Calcification Machine",
"block.jurassicrevived.white_incubator": "White Incubator", "block.jurassicrevived.white_incubator": "White Incubator",
"block.jurassicrevived.white_cultivator": "White Cultivator",
"block.jurassicrevived.stone_fossil": "Stone Fossil", "block.jurassicrevived.stone_fossil": "Stone Fossil",
"block.jurassicrevived.deepslate_fossil": "Deepslate Fossil", "block.jurassicrevived.deepslate_fossil": "Deepslate Fossil",
@@ -344,6 +352,9 @@
"item.jurassicrevived.chilesaurus_skull_fossil": "Chilesaurus Skull Fossil", "item.jurassicrevived.chilesaurus_skull_fossil": "Chilesaurus Skull Fossil",
"item.jurassicrevived.thescelosaurus_skull_fossil": "Thescelosaurus Skull Fossil", "item.jurassicrevived.thescelosaurus_skull_fossil": "Thescelosaurus Skull Fossil",
"item.jurassicrevived.mussasaurus_skull_fossil": "Mussasaurus Skull Fossil", "item.jurassicrevived.mussasaurus_skull_fossil": "Mussasaurus Skull Fossil",
"item.jurassicrevived.coelacanth_skull_fossil": "Coelacanth Skull Fossil",
"item.jurassicrevived.mawsonia_skull_fossil": "Mawsonia Skull Fossil",
"item.jurassicrevived.alligator_gar_skull_fossil": "Alligator Gar Skull Fossil",
"item.jurassicrevived.fresh_velociraptor_skull": "Fresh Velociraptor Skull", "item.jurassicrevived.fresh_velociraptor_skull": "Fresh Velociraptor Skull",
"item.jurassicrevived.fresh_tyrannosaurus_rex_skull": "Fresh Tyrannosaurus Rex Skull", "item.jurassicrevived.fresh_tyrannosaurus_rex_skull": "Fresh Tyrannosaurus Rex Skull",
@@ -423,6 +434,9 @@
"item.jurassicrevived.fresh_chilesaurus_skull": "Fresh Chilesaurus Skull", "item.jurassicrevived.fresh_chilesaurus_skull": "Fresh Chilesaurus Skull",
"item.jurassicrevived.fresh_thescelosaurus_skull": "Fresh Thescelosaurus Skull", "item.jurassicrevived.fresh_thescelosaurus_skull": "Fresh Thescelosaurus Skull",
"item.jurassicrevived.fresh_mussasaurus_skull": "Fresh Mussasaurus Skull", "item.jurassicrevived.fresh_mussasaurus_skull": "Fresh Mussasaurus Skull",
"item.jurassicrevived.fresh_coelacanth_skull": "Fresh Coelacanth Skull",
"item.jurassicrevived.fresh_mawsonia_skull": "Fresh Mawsonia Skull",
"item.jurassicrevived.fresh_alligator_gar_skull": "Fresh Alligator Gar Skull",
"item.jurassicrevived.test_tube": "Test Tube", "item.jurassicrevived.test_tube": "Test Tube",
"item.jurassicrevived.syringe": "Syringe", "item.jurassicrevived.syringe": "Syringe",
@@ -518,6 +532,9 @@
"item.jurassicrevived.chilesaurus_tissue": "Chilesaurus Tissue", "item.jurassicrevived.chilesaurus_tissue": "Chilesaurus Tissue",
"item.jurassicrevived.thescelosaurus_tissue": "Thescelosaurus Tissue", "item.jurassicrevived.thescelosaurus_tissue": "Thescelosaurus Tissue",
"item.jurassicrevived.mussasaurus_tissue": "Mussasaurus Tissue", "item.jurassicrevived.mussasaurus_tissue": "Mussasaurus Tissue",
"item.jurassicrevived.coelacanth_tissue": "Coelacanth Tissue",
"item.jurassicrevived.mawsonia_tissue": "Mawsonia Tissue",
"item.jurassicrevived.alligator_gar_tissue": "Alligator Gar Tissue",
"item.jurassicrevived.velociraptor_dna": "Velociraptor DNA", "item.jurassicrevived.velociraptor_dna": "Velociraptor DNA",
"item.jurassicrevived.tyrannosaurus_rex_dna": "Tyrannosaurus Rex DNA", "item.jurassicrevived.tyrannosaurus_rex_dna": "Tyrannosaurus Rex DNA",
@@ -597,6 +614,9 @@
"item.jurassicrevived.chilesaurus_dna": "Chilesaurus DNA", "item.jurassicrevived.chilesaurus_dna": "Chilesaurus DNA",
"item.jurassicrevived.thescelosaurus_dna": "Thescelosaurus DNA", "item.jurassicrevived.thescelosaurus_dna": "Thescelosaurus DNA",
"item.jurassicrevived.mussasaurus_dna": "Mussasaurus DNA", "item.jurassicrevived.mussasaurus_dna": "Mussasaurus DNA",
"item.jurassicrevived.coelacanth_dna": "Coelacanth DNA",
"item.jurassicrevived.mawsonia_dna": "Mawsonia DNA",
"item.jurassicrevived.alligator_gar_dna": "Alligator Gar DNA",
"item.jurassicrevived.velociraptor_syringe": "Velociraptor Syringe", "item.jurassicrevived.velociraptor_syringe": "Velociraptor Syringe",
"item.jurassicrevived.tyrannosaurus_rex_syringe": "Tyrannosaurus Rex Syringe", "item.jurassicrevived.tyrannosaurus_rex_syringe": "Tyrannosaurus Rex Syringe",
@@ -676,6 +696,9 @@
"item.jurassicrevived.chilesaurus_syringe": "Chilesaurus Syringe", "item.jurassicrevived.chilesaurus_syringe": "Chilesaurus Syringe",
"item.jurassicrevived.thescelosaurus_syringe": "Thescelosaurus Syringe", "item.jurassicrevived.thescelosaurus_syringe": "Thescelosaurus Syringe",
"item.jurassicrevived.mussasaurus_syringe": "Mussasaurus Syringe", "item.jurassicrevived.mussasaurus_syringe": "Mussasaurus Syringe",
"item.jurassicrevived.coelacanth_syringe": "Coelacanth Syringe",
"item.jurassicrevived.mawsonia_syringe": "Mawsonia Syringe",
"item.jurassicrevived.alligator_gar_syringe": "Alligator Gar Syringe",
"block.jurassicrevived.velociraptor_egg": "Velociraptor Egg", "block.jurassicrevived.velociraptor_egg": "Velociraptor Egg",
"block.jurassicrevived.tyrannosaurus_rex_egg": "Tyrannosaurus Rex Egg", "block.jurassicrevived.tyrannosaurus_rex_egg": "Tyrannosaurus Rex Egg",
@@ -755,6 +778,9 @@
"block.jurassicrevived.chilesaurus_egg": "Chilesaurus Egg", "block.jurassicrevived.chilesaurus_egg": "Chilesaurus Egg",
"block.jurassicrevived.thescelosaurus_egg": "Thescelosaurus Egg", "block.jurassicrevived.thescelosaurus_egg": "Thescelosaurus Egg",
"block.jurassicrevived.mussasaurus_egg": "Mussasaurus Egg", "block.jurassicrevived.mussasaurus_egg": "Mussasaurus Egg",
"block.jurassicrevived.coelacanth_egg": "Coelacanth Egg",
"block.jurassicrevived.mawsonia_egg": "Mawsonia Egg",
"block.jurassicrevived.alligator_gar_egg": "Alligator Gar Egg",
"block.jurassicrevived.incubated_velociraptor_egg": "§aIncubated Velociraptor Egg", "block.jurassicrevived.incubated_velociraptor_egg": "§aIncubated Velociraptor Egg",
"block.jurassicrevived.incubated_tyrannosaurus_rex_egg": "§aIncubated Tyrannosaurus Rex Egg", "block.jurassicrevived.incubated_tyrannosaurus_rex_egg": "§aIncubated Tyrannosaurus Rex Egg",
@@ -0,0 +1,174 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"ambientocclusion": false,
"render_type": "cutout",
"texture_size": [128, 128],
"textures": {
"1": "jurassicrevived:block/cultivator",
"particle": "jurassicrevived:block/cultivator"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [6, 5.5, 8, 5.75], "texture": "#1"},
"east": {"uv": [6, 5.75, 8, 6], "texture": "#1"},
"south": {"uv": [6, 6, 8, 6.25], "texture": "#1"},
"west": {"uv": [6, 6.25, 8, 6.5], "texture": "#1"},
"up": {"uv": [6, 2, 4, 0], "texture": "#1"},
"down": {"uv": [6, 2, 4, 4], "texture": "#1"}
}
},
{
"from": [0, 2, 0],
"to": [1, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
"faces": {
"north": {"uv": [6, 6.75, 6.125, 10.25], "texture": "#1"},
"east": {"uv": [6.125, 6.75, 6.25, 10.25], "texture": "#1"},
"south": {"uv": [6.25, 6.75, 6.375, 10.25], "texture": "#1"},
"west": {"uv": [6.375, 6.75, 6.5, 10.25], "texture": "#1"},
"up": {"uv": [8, 8, 7.875, 7.875], "texture": "#1"},
"down": {"uv": [8.125, 0, 8, 0.125], "texture": "#1"}
}
},
{
"from": [0, 2, 15],
"to": [1, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 15]},
"faces": {
"north": {"uv": [6.5, 6.75, 6.625, 10.25], "texture": "#1"},
"east": {"uv": [6.625, 6.75, 6.75, 10.25], "texture": "#1"},
"south": {"uv": [6.75, 6.75, 6.875, 10.25], "texture": "#1"},
"west": {"uv": [6.875, 6.75, 7, 10.25], "texture": "#1"},
"up": {"uv": [8.125, 0.25, 8, 0.125], "texture": "#1"},
"down": {"uv": [8.125, 0.25, 8, 0.375], "texture": "#1"}
}
},
{
"from": [15, 2, 15],
"to": [16, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 15]},
"faces": {
"north": {"uv": [7, 6.75, 7.125, 10.25], "texture": "#1"},
"east": {"uv": [7.125, 6.75, 7.25, 10.25], "texture": "#1"},
"south": {"uv": [0, 7.25, 0.125, 10.75], "texture": "#1"},
"west": {"uv": [0.125, 7.25, 0.25, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.5, 8, 0.375], "texture": "#1"},
"down": {"uv": [8.125, 0.5, 8, 0.625], "texture": "#1"}
}
},
{
"from": [15, 2, 0],
"to": [16, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]},
"faces": {
"north": {"uv": [0.25, 7.25, 0.375, 10.75], "texture": "#1"},
"east": {"uv": [0.375, 7.25, 0.5, 10.75], "texture": "#1"},
"south": {"uv": [0.5, 7.25, 0.625, 10.75], "texture": "#1"},
"west": {"uv": [0.625, 7.25, 0.75, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.75, 8, 0.625], "texture": "#1"},
"down": {"uv": [0.875, 8, 0.75, 8.125], "texture": "#1"}
}
},
{
"from": [0.15, 1.65, 0.15],
"to": [15.85, 30.35, 15.85],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 1.5, 0]},
"faces": {
"north": {"uv": [0, 0, 2, 3.625], "texture": "#1"},
"east": {"uv": [2, 0, 4, 3.625], "texture": "#1"},
"south": {"uv": [0, 3.625, 2, 7.25], "texture": "#1"},
"west": {"uv": [2, 3.625, 4, 7.25], "texture": "#1"},
"up": {"uv": [6, 6, 4, 4], "texture": "#1"},
"down": {"uv": [8, 0, 6, 2], "texture": "#1"}
}
},
{
"from": [0, 30, 0],
"to": [16, 32, 16],
"faces": {
"north": {"uv": [6, 6.5, 8, 6.75], "texture": "#1"},
"east": {"uv": [6.75, 4, 8.75, 4.25], "texture": "#1"},
"south": {"uv": [6.75, 4.25, 8.75, 4.5], "texture": "#1"},
"west": {"uv": [6.75, 4.5, 8.75, 4.75], "texture": "#1"},
"up": {"uv": [8, 4, 6, 2], "texture": "#1"},
"down": {"uv": [6, 6, 4, 8], "texture": "#1"}
}
},
{
"from": [5, 28, 5],
"to": [11, 30, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -2, 0]},
"faces": {
"north": {"uv": [1.5, 7.25, 2.25, 7.5], "texture": "#1"},
"east": {"uv": [2.25, 7.25, 3, 7.5], "texture": "#1"},
"south": {"uv": [3, 7.25, 3.75, 7.5], "texture": "#1"},
"west": {"uv": [7.25, 6.75, 8, 7], "texture": "#1"},
"up": {"uv": [6.75, 4.75, 6, 4], "texture": "#1"},
"down": {"uv": [6.75, 4.75, 6, 5.5], "texture": "#1"}
}
},
{
"from": [7.5, 22, 7.5],
"to": [8.5, 28, 8.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0.5, -4, -0.5]},
"faces": {
"north": {"uv": [7.5, 7.75, 7.625, 8.5], "texture": "#1"},
"east": {"uv": [7.625, 7.75, 7.75, 8.5], "texture": "#1"},
"south": {"uv": [7.75, 7.75, 7.875, 8.5], "texture": "#1"},
"west": {"uv": [2, 7.875, 2.125, 8.625], "texture": "#1"},
"up": {"uv": [8.125, 0.875, 8, 0.75], "texture": "#1"},
"down": {"uv": [1, 8, 0.875, 8.125], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.2, 0.2, 0.2]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"translation": [0, -3, 0],
"scale": [0.4, 0.4, 0.4]
},
"head": {
"translation": [0, 10, 0],
"scale": [0.5, 0.5, 0.5]
},
"fixed": {
"translation": [0, -4, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8]
}
]
}
@@ -0,0 +1,295 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"ambientocclusion": false,
"render_type": "cutout",
"texture_size": [128, 128],
"textures": {
"1": "jurassicrevived:block/cultivator_lit",
"particle": "jurassicrevived:block/cultivator_lit"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [6, 5.5, 8, 5.75], "texture": "#1"},
"east": {"uv": [6, 5.75, 8, 6], "texture": "#1"},
"south": {"uv": [6, 6, 8, 6.25], "texture": "#1"},
"west": {"uv": [6, 6.25, 8, 6.5], "texture": "#1"},
"up": {"uv": [6, 2, 4, 0], "texture": "#1"},
"down": {"uv": [6, 2, 4, 4], "texture": "#1"}
}
},
{
"from": [0, 2, 0],
"to": [1, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
"faces": {
"north": {"uv": [6, 6.75, 6.125, 10.25], "texture": "#1"},
"east": {"uv": [6.125, 6.75, 6.25, 10.25], "texture": "#1"},
"south": {"uv": [6.25, 6.75, 6.375, 10.25], "texture": "#1"},
"west": {"uv": [6.375, 6.75, 6.5, 10.25], "texture": "#1"},
"up": {"uv": [8, 8, 7.875, 7.875], "texture": "#1"},
"down": {"uv": [8.125, 0, 8, 0.125], "texture": "#1"}
}
},
{
"from": [0, 2, 15],
"to": [1, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 15]},
"faces": {
"north": {"uv": [6.5, 6.75, 6.625, 10.25], "texture": "#1"},
"east": {"uv": [6.625, 6.75, 6.75, 10.25], "texture": "#1"},
"south": {"uv": [6.75, 6.75, 6.875, 10.25], "texture": "#1"},
"west": {"uv": [6.875, 6.75, 7, 10.25], "texture": "#1"},
"up": {"uv": [8.125, 0.25, 8, 0.125], "texture": "#1"},
"down": {"uv": [8.125, 0.25, 8, 0.375], "texture": "#1"}
}
},
{
"from": [15, 2, 15],
"to": [16, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 15]},
"faces": {
"north": {"uv": [7, 6.75, 7.125, 10.25], "texture": "#1"},
"east": {"uv": [7.125, 6.75, 7.25, 10.25], "texture": "#1"},
"south": {"uv": [0, 7.25, 0.125, 10.75], "texture": "#1"},
"west": {"uv": [0.125, 7.25, 0.25, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.5, 8, 0.375], "texture": "#1"},
"down": {"uv": [8.125, 0.5, 8, 0.625], "texture": "#1"}
}
},
{
"from": [15, 2, 0],
"to": [16, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]},
"faces": {
"north": {"uv": [0.25, 7.25, 0.375, 10.75], "texture": "#1"},
"east": {"uv": [0.375, 7.25, 0.5, 10.75], "texture": "#1"},
"south": {"uv": [0.5, 7.25, 0.625, 10.75], "texture": "#1"},
"west": {"uv": [0.625, 7.25, 0.75, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.75, 8, 0.625], "texture": "#1"},
"down": {"uv": [0.875, 8, 0.75, 8.125], "texture": "#1"}
}
},
{
"from": [0.15, 1.65, 0.15],
"to": [15.85, 30.35, 15.85],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 1.5, 0]},
"faces": {
"north": {"uv": [0, 0, 2, 3.625], "texture": "#1"},
"east": {"uv": [2, 0, 4, 3.625], "texture": "#1"},
"south": {"uv": [0, 3.625, 2, 7.25], "texture": "#1"},
"west": {"uv": [2, 3.625, 4, 7.25], "texture": "#1"},
"up": {"uv": [6, 6, 4, 4], "texture": "#1"},
"down": {"uv": [8, 0, 6, 2], "texture": "#1"}
}
},
{
"from": [0, 30, 0],
"to": [16, 32, 16],
"faces": {
"north": {"uv": [6, 6.5, 8, 6.75], "texture": "#1"},
"east": {"uv": [6.75, 4, 8.75, 4.25], "texture": "#1"},
"south": {"uv": [6.75, 4.25, 8.75, 4.5], "texture": "#1"},
"west": {"uv": [6.75, 4.5, 8.75, 4.75], "texture": "#1"},
"up": {"uv": [8, 4, 6, 2], "texture": "#1"},
"down": {"uv": [6, 6, 4, 8], "texture": "#1"}
}
},
{
"from": [5, 28, 5],
"to": [11, 30, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -2, 0]},
"faces": {
"north": {"uv": [1.5, 7.25, 2.25, 7.5], "texture": "#1"},
"east": {"uv": [2.25, 7.25, 3, 7.5], "texture": "#1"},
"south": {"uv": [3, 7.25, 3.75, 7.5], "texture": "#1"},
"west": {"uv": [7.25, 6.75, 8, 7], "texture": "#1"},
"up": {"uv": [6.75, 4.75, 6, 4], "texture": "#1"},
"down": {"uv": [6.75, 4.75, 6, 5.5], "texture": "#1"}
}
},
{
"from": [7.5, 22, 7.5],
"to": [8.5, 28, 8.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0.5, -4, -0.5]},
"faces": {
"north": {"uv": [7.5, 7.75, 7.625, 8.5], "texture": "#1"},
"east": {"uv": [7.625, 7.75, 7.75, 8.5], "texture": "#1"},
"south": {"uv": [7.75, 7.75, 7.875, 8.5], "texture": "#1"},
"west": {"uv": [2, 7.875, 2.125, 8.625], "texture": "#1"},
"up": {"uv": [8.125, 0.875, 8, 0.75], "texture": "#1"},
"down": {"uv": [1, 8, 0.875, 8.125], "texture": "#1"}
}
},
{
"from": [6, 17, 6.6],
"to": [9, 23, 9.6],
"rotation": {"angle": 45, "axis": "z", "origin": [7, 21, 6.6]},
"faces": {
"north": {"uv": [6.75, 4.75, 7.125, 5.5], "texture": "#1"},
"east": {"uv": [7.125, 4.75, 7.5, 5.5], "texture": "#1"},
"south": {"uv": [0.75, 7.25, 1.125, 8], "texture": "#1"},
"west": {"uv": [1.125, 7.25, 1.5, 8], "texture": "#1"},
"up": {"uv": [2.375, 7.875, 2, 7.5], "texture": "#1"},
"down": {"uv": [2.75, 7.5, 2.375, 7.875], "texture": "#1"}
}
},
{
"from": [6.8, 18.8, 6.3],
"to": [7.8, 20.8, 7.3],
"rotation": {"angle": -22.5, "axis": "z", "origin": [6.8, 20.8, 6.3]},
"faces": {
"north": {"uv": [3.75, 7.875, 4, 8], "rotation": 90, "texture": "#1"},
"east": {"uv": [8.125, 5, 7.875, 5.125], "rotation": 270, "texture": "#1"},
"south": {"uv": [7.875, 4.75, 8.125, 4.875], "rotation": 270, "texture": "#1"},
"west": {"uv": [8.125, 5, 7.875, 4.875], "rotation": 270, "texture": "#1"},
"up": {"uv": [8, 0.875, 8.125, 1], "rotation": 270, "texture": "#1"},
"down": {"uv": [1, 8, 1.125, 8.125], "rotation": 270, "texture": "#1"}
}
},
{
"from": [5, 20, 8.7],
"to": [7, 21, 9.7],
"rotation": {"angle": 45, "axis": "z", "origin": [7, 21, 9.7]},
"faces": {
"north": {"uv": [7.875, 5.125, 8.125, 5.25], "texture": "#1"},
"east": {"uv": [8, 1, 8.125, 1.125], "texture": "#1"},
"south": {"uv": [7.875, 5.25, 8.125, 5.375], "texture": "#1"},
"west": {"uv": [1.125, 8, 1.25, 8.125], "texture": "#1"},
"up": {"uv": [8.125, 5.5, 7.875, 5.375], "texture": "#1"},
"down": {"uv": [8.125, 7, 7.875, 7.125], "texture": "#1"}
}
},
{
"from": [3.75, 21.15, 6.55],
"to": [6.85, 24.25, 9.65],
"rotation": {"angle": -22.5, "axis": "z", "origin": [5.8, 22.2, 6.6]},
"faces": {
"north": {"uv": [2.75, 7.5, 3.125, 7.875], "rotation": 90, "texture": "#1"},
"east": {"uv": [7.875, 7.375, 7.5, 7.75], "rotation": 270, "texture": "#1"},
"south": {"uv": [7.5, 4.75, 7.875, 5.125], "rotation": 270, "texture": "#1"},
"west": {"uv": [7.875, 7.375, 7.5, 7], "rotation": 270, "texture": "#1"},
"up": {"uv": [3.125, 7.5, 3.5, 7.875], "rotation": 270, "texture": "#1"},
"down": {"uv": [7.5, 5.125, 7.875, 5.5], "rotation": 270, "texture": "#1"}
}
},
{
"from": [2.6, 21.7, 7.6],
"to": [4.6, 23.7, 8.6],
"rotation": {"angle": 0, "axis": "y", "origin": [5.6, 22.7, 6.6]},
"faces": {
"north": {"uv": [2.125, 7.875, 2.375, 8.125], "rotation": 90, "texture": "#1"},
"east": {"uv": [8.125, 7.5, 7.875, 7.625], "rotation": 270, "texture": "#1"},
"south": {"uv": [2.375, 7.875, 2.625, 8.125], "rotation": 270, "texture": "#1"},
"west": {"uv": [8.125, 7.5, 7.875, 7.375], "rotation": 270, "texture": "#1"},
"up": {"uv": [3.375, 7.875, 3.5, 8.125], "rotation": 270, "texture": "#1"},
"down": {"uv": [7.875, 7.125, 8, 7.375], "rotation": 270, "texture": "#1"}
}
},
{
"from": [8.475, 14.7, 7.1],
"to": [10.475, 19.7, 9.1],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8.475, 17.7, 7.1]},
"faces": {
"north": {"uv": [3.75, 7.25, 4, 7.875], "texture": "#1"},
"east": {"uv": [7.25, 7, 7.5, 7.625], "texture": "#1"},
"south": {"uv": [1.5, 7.5, 1.75, 8.125], "texture": "#1"},
"west": {"uv": [1.75, 7.5, 2, 8.125], "texture": "#1"},
"up": {"uv": [2.875, 8.125, 2.625, 7.875], "texture": "#1"},
"down": {"uv": [3.125, 7.875, 2.875, 8.125], "texture": "#1"}
}
},
{
"from": [5.975, 14.5, 7.6],
"to": [9.975, 16.5, 8.6],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.975, 16.5, 6.6]},
"faces": {
"north": {"uv": [3.5, 7.5, 3.75, 8], "rotation": 270, "texture": "#1"},
"east": {"uv": [8.125, 7.75, 7.875, 7.625], "rotation": 90, "texture": "#1"},
"south": {"uv": [7.25, 7.625, 7.5, 8.125], "rotation": 90, "texture": "#1"},
"west": {"uv": [8.125, 7.75, 7.875, 7.875], "rotation": 90, "texture": "#1"},
"up": {"uv": [3.25, 7.875, 3.375, 8.375], "rotation": 90, "texture": "#1"},
"down": {"uv": [3.125, 7.875, 3.25, 8.375], "rotation": 90, "texture": "#1"}
}
},
{
"from": [5.975, 16.5, 7.6],
"to": [6.975, 17.5, 8.6],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.975, 16.5, 6.6]},
"faces": {
"north": {"uv": [8, 1.125, 8.125, 1.25], "rotation": 270, "texture": "#1"},
"east": {"uv": [8.125, 1.5, 8, 1.375], "rotation": 90, "texture": "#1"},
"south": {"uv": [8, 1.25, 8.125, 1.375], "rotation": 90, "texture": "#1"},
"west": {"uv": [8.125, 1.5, 8, 1.625], "rotation": 90, "texture": "#1"},
"up": {"uv": [1.375, 8, 1.5, 8.125], "rotation": 90, "texture": "#1"},
"down": {"uv": [1.25, 8, 1.375, 8.125], "rotation": 90, "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.2, 0.2, 0.2]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"translation": [0, -3, 0],
"scale": [0.4, 0.4, 0.4]
},
"head": {
"translation": [0, 10, 0],
"scale": [0.5, 0.5, 0.5]
},
"fixed": {
"translation": [0, -4, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [9, 10, 11, 12, 13, 14, 15, 16]
}
]
}
]
}
@@ -0,0 +1,174 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"ambientocclusion": false,
"render_type": "cutout",
"texture_size": [128, 128],
"textures": {
"1": "jurassicrevived:block/white_cultivator",
"particle": "jurassicrevived:block/white_cultivator"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [6, 5.5, 8, 5.75], "texture": "#1"},
"east": {"uv": [6, 5.75, 8, 6], "texture": "#1"},
"south": {"uv": [6, 6, 8, 6.25], "texture": "#1"},
"west": {"uv": [6, 6.25, 8, 6.5], "texture": "#1"},
"up": {"uv": [6, 2, 4, 0], "texture": "#1"},
"down": {"uv": [6, 2, 4, 4], "texture": "#1"}
}
},
{
"from": [0, 2, 0],
"to": [1, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
"faces": {
"north": {"uv": [6, 6.75, 6.125, 10.25], "texture": "#1"},
"east": {"uv": [6.125, 6.75, 6.25, 10.25], "texture": "#1"},
"south": {"uv": [6.25, 6.75, 6.375, 10.25], "texture": "#1"},
"west": {"uv": [6.375, 6.75, 6.5, 10.25], "texture": "#1"},
"up": {"uv": [8, 8, 7.875, 7.875], "texture": "#1"},
"down": {"uv": [8.125, 0, 8, 0.125], "texture": "#1"}
}
},
{
"from": [0, 2, 15],
"to": [1, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 15]},
"faces": {
"north": {"uv": [6.5, 6.75, 6.625, 10.25], "texture": "#1"},
"east": {"uv": [6.625, 6.75, 6.75, 10.25], "texture": "#1"},
"south": {"uv": [6.75, 6.75, 6.875, 10.25], "texture": "#1"},
"west": {"uv": [6.875, 6.75, 7, 10.25], "texture": "#1"},
"up": {"uv": [8.125, 0.25, 8, 0.125], "texture": "#1"},
"down": {"uv": [8.125, 0.25, 8, 0.375], "texture": "#1"}
}
},
{
"from": [15, 2, 15],
"to": [16, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 15]},
"faces": {
"north": {"uv": [7, 6.75, 7.125, 10.25], "texture": "#1"},
"east": {"uv": [7.125, 6.75, 7.25, 10.25], "texture": "#1"},
"south": {"uv": [0, 7.25, 0.125, 10.75], "texture": "#1"},
"west": {"uv": [0.125, 7.25, 0.25, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.5, 8, 0.375], "texture": "#1"},
"down": {"uv": [8.125, 0.5, 8, 0.625], "texture": "#1"}
}
},
{
"from": [15, 2, 0],
"to": [16, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]},
"faces": {
"north": {"uv": [0.25, 7.25, 0.375, 10.75], "texture": "#1"},
"east": {"uv": [0.375, 7.25, 0.5, 10.75], "texture": "#1"},
"south": {"uv": [0.5, 7.25, 0.625, 10.75], "texture": "#1"},
"west": {"uv": [0.625, 7.25, 0.75, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.75, 8, 0.625], "texture": "#1"},
"down": {"uv": [0.875, 8, 0.75, 8.125], "texture": "#1"}
}
},
{
"from": [0.15, 1.65, 0.15],
"to": [15.85, 30.35, 15.85],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 1.5, 0]},
"faces": {
"north": {"uv": [0, 0, 2, 3.625], "texture": "#1"},
"east": {"uv": [2, 0, 4, 3.625], "texture": "#1"},
"south": {"uv": [0, 3.625, 2, 7.25], "texture": "#1"},
"west": {"uv": [2, 3.625, 4, 7.25], "texture": "#1"},
"up": {"uv": [6, 6, 4, 4], "texture": "#1"},
"down": {"uv": [8, 0, 6, 2], "texture": "#1"}
}
},
{
"from": [0, 30, 0],
"to": [16, 32, 16],
"faces": {
"north": {"uv": [6, 6.5, 8, 6.75], "texture": "#1"},
"east": {"uv": [6.75, 4, 8.75, 4.25], "texture": "#1"},
"south": {"uv": [6.75, 4.25, 8.75, 4.5], "texture": "#1"},
"west": {"uv": [6.75, 4.5, 8.75, 4.75], "texture": "#1"},
"up": {"uv": [8, 4, 6, 2], "texture": "#1"},
"down": {"uv": [6, 6, 4, 8], "texture": "#1"}
}
},
{
"from": [5, 28, 5],
"to": [11, 30, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -2, 0]},
"faces": {
"north": {"uv": [1.5, 7.25, 2.25, 7.5], "texture": "#1"},
"east": {"uv": [2.25, 7.25, 3, 7.5], "texture": "#1"},
"south": {"uv": [3, 7.25, 3.75, 7.5], "texture": "#1"},
"west": {"uv": [7.25, 6.75, 8, 7], "texture": "#1"},
"up": {"uv": [6.75, 4.75, 6, 4], "texture": "#1"},
"down": {"uv": [6.75, 4.75, 6, 5.5], "texture": "#1"}
}
},
{
"from": [7.5, 22, 7.5],
"to": [8.5, 28, 8.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0.5, -4, -0.5]},
"faces": {
"north": {"uv": [7.5, 7.75, 7.625, 8.5], "texture": "#1"},
"east": {"uv": [7.625, 7.75, 7.75, 8.5], "texture": "#1"},
"south": {"uv": [7.75, 7.75, 7.875, 8.5], "texture": "#1"},
"west": {"uv": [2, 7.875, 2.125, 8.625], "texture": "#1"},
"up": {"uv": [8.125, 0.875, 8, 0.75], "texture": "#1"},
"down": {"uv": [1, 8, 0.875, 8.125], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.2, 0.2, 0.2]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"translation": [0, -3, 0],
"scale": [0.4, 0.4, 0.4]
},
"head": {
"translation": [0, 10, 0],
"scale": [0.5, 0.5, 0.5]
},
"fixed": {
"translation": [0, -4, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8]
}
]
}
@@ -0,0 +1,295 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"ambientocclusion": false,
"render_type": "cutout",
"texture_size": [128, 128],
"textures": {
"1": "jurassicrevived:block/white_cultivator_lit",
"particle": "jurassicrevived:block/white_cultivator_lit"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [6, 5.5, 8, 5.75], "texture": "#1"},
"east": {"uv": [6, 5.75, 8, 6], "texture": "#1"},
"south": {"uv": [6, 6, 8, 6.25], "texture": "#1"},
"west": {"uv": [6, 6.25, 8, 6.5], "texture": "#1"},
"up": {"uv": [6, 2, 4, 0], "texture": "#1"},
"down": {"uv": [6, 2, 4, 4], "texture": "#1"}
}
},
{
"from": [0, 2, 0],
"to": [1, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]},
"faces": {
"north": {"uv": [6, 6.75, 6.125, 10.25], "texture": "#1"},
"east": {"uv": [6.125, 6.75, 6.25, 10.25], "texture": "#1"},
"south": {"uv": [6.25, 6.75, 6.375, 10.25], "texture": "#1"},
"west": {"uv": [6.375, 6.75, 6.5, 10.25], "texture": "#1"},
"up": {"uv": [8, 8, 7.875, 7.875], "texture": "#1"},
"down": {"uv": [8.125, 0, 8, 0.125], "texture": "#1"}
}
},
{
"from": [0, 2, 15],
"to": [1, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 15]},
"faces": {
"north": {"uv": [6.5, 6.75, 6.625, 10.25], "texture": "#1"},
"east": {"uv": [6.625, 6.75, 6.75, 10.25], "texture": "#1"},
"south": {"uv": [6.75, 6.75, 6.875, 10.25], "texture": "#1"},
"west": {"uv": [6.875, 6.75, 7, 10.25], "texture": "#1"},
"up": {"uv": [8.125, 0.25, 8, 0.125], "texture": "#1"},
"down": {"uv": [8.125, 0.25, 8, 0.375], "texture": "#1"}
}
},
{
"from": [15, 2, 15],
"to": [16, 30, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 15]},
"faces": {
"north": {"uv": [7, 6.75, 7.125, 10.25], "texture": "#1"},
"east": {"uv": [7.125, 6.75, 7.25, 10.25], "texture": "#1"},
"south": {"uv": [0, 7.25, 0.125, 10.75], "texture": "#1"},
"west": {"uv": [0.125, 7.25, 0.25, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.5, 8, 0.375], "texture": "#1"},
"down": {"uv": [8.125, 0.5, 8, 0.625], "texture": "#1"}
}
},
{
"from": [15, 2, 0],
"to": [16, 30, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]},
"faces": {
"north": {"uv": [0.25, 7.25, 0.375, 10.75], "texture": "#1"},
"east": {"uv": [0.375, 7.25, 0.5, 10.75], "texture": "#1"},
"south": {"uv": [0.5, 7.25, 0.625, 10.75], "texture": "#1"},
"west": {"uv": [0.625, 7.25, 0.75, 10.75], "texture": "#1"},
"up": {"uv": [8.125, 0.75, 8, 0.625], "texture": "#1"},
"down": {"uv": [0.875, 8, 0.75, 8.125], "texture": "#1"}
}
},
{
"from": [0.15, 1.65, 0.15],
"to": [15.85, 30.35, 15.85],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 1.5, 0]},
"faces": {
"north": {"uv": [0, 0, 2, 3.625], "texture": "#1"},
"east": {"uv": [2, 0, 4, 3.625], "texture": "#1"},
"south": {"uv": [0, 3.625, 2, 7.25], "texture": "#1"},
"west": {"uv": [2, 3.625, 4, 7.25], "texture": "#1"},
"up": {"uv": [6, 6, 4, 4], "texture": "#1"},
"down": {"uv": [8, 0, 6, 2], "texture": "#1"}
}
},
{
"from": [0, 30, 0],
"to": [16, 32, 16],
"faces": {
"north": {"uv": [6, 6.5, 8, 6.75], "texture": "#1"},
"east": {"uv": [6.75, 4, 8.75, 4.25], "texture": "#1"},
"south": {"uv": [6.75, 4.25, 8.75, 4.5], "texture": "#1"},
"west": {"uv": [6.75, 4.5, 8.75, 4.75], "texture": "#1"},
"up": {"uv": [8, 4, 6, 2], "texture": "#1"},
"down": {"uv": [6, 6, 4, 8], "texture": "#1"}
}
},
{
"from": [5, 28, 5],
"to": [11, 30, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -2, 0]},
"faces": {
"north": {"uv": [1.5, 7.25, 2.25, 7.5], "texture": "#1"},
"east": {"uv": [2.25, 7.25, 3, 7.5], "texture": "#1"},
"south": {"uv": [3, 7.25, 3.75, 7.5], "texture": "#1"},
"west": {"uv": [7.25, 6.75, 8, 7], "texture": "#1"},
"up": {"uv": [6.75, 4.75, 6, 4], "texture": "#1"},
"down": {"uv": [6.75, 4.75, 6, 5.5], "texture": "#1"}
}
},
{
"from": [7.5, 22, 7.5],
"to": [8.5, 28, 8.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0.5, -4, -0.5]},
"faces": {
"north": {"uv": [7.5, 7.75, 7.625, 8.5], "texture": "#1"},
"east": {"uv": [7.625, 7.75, 7.75, 8.5], "texture": "#1"},
"south": {"uv": [7.75, 7.75, 7.875, 8.5], "texture": "#1"},
"west": {"uv": [2, 7.875, 2.125, 8.625], "texture": "#1"},
"up": {"uv": [8.125, 0.875, 8, 0.75], "texture": "#1"},
"down": {"uv": [1, 8, 0.875, 8.125], "texture": "#1"}
}
},
{
"from": [6, 17, 6.6],
"to": [9, 23, 9.6],
"rotation": {"angle": 45, "axis": "z", "origin": [7, 21, 6.6]},
"faces": {
"north": {"uv": [6.75, 4.75, 7.125, 5.5], "texture": "#1"},
"east": {"uv": [7.125, 4.75, 7.5, 5.5], "texture": "#1"},
"south": {"uv": [0.75, 7.25, 1.125, 8], "texture": "#1"},
"west": {"uv": [1.125, 7.25, 1.5, 8], "texture": "#1"},
"up": {"uv": [2.375, 7.875, 2, 7.5], "texture": "#1"},
"down": {"uv": [2.75, 7.5, 2.375, 7.875], "texture": "#1"}
}
},
{
"from": [4.8, 19.8, 6.3],
"to": [6.8, 20.8, 7.3],
"rotation": {"angle": 67.5, "axis": "z", "origin": [6.8, 20.8, 6.3]},
"faces": {
"north": {"uv": [3.75, 7.875, 4, 8], "texture": "#1"},
"east": {"uv": [8, 0.875, 8.125, 1], "texture": "#1"},
"south": {"uv": [7.875, 4.75, 8.125, 4.875], "texture": "#1"},
"west": {"uv": [1, 8, 1.125, 8.125], "texture": "#1"},
"up": {"uv": [8.125, 5, 7.875, 4.875], "texture": "#1"},
"down": {"uv": [8.125, 5, 7.875, 5.125], "texture": "#1"}
}
},
{
"from": [5, 20, 8.7],
"to": [7, 21, 9.7],
"rotation": {"angle": 45, "axis": "z", "origin": [7, 21, 9.7]},
"faces": {
"north": {"uv": [7.875, 5.125, 8.125, 5.25], "texture": "#1"},
"east": {"uv": [8, 1, 8.125, 1.125], "texture": "#1"},
"south": {"uv": [7.875, 5.25, 8.125, 5.375], "texture": "#1"},
"west": {"uv": [1.125, 8, 1.25, 8.125], "texture": "#1"},
"up": {"uv": [8.125, 5.5, 7.875, 5.375], "texture": "#1"},
"down": {"uv": [8.125, 7, 7.875, 7.125], "texture": "#1"}
}
},
{
"from": [4.75, 21.15, 6.55],
"to": [7.85, 24.25, 9.65],
"rotation": {"angle": 67.5, "axis": "z", "origin": [5.8, 22.2, 6.6]},
"faces": {
"north": {"uv": [2.75, 7.5, 3.125, 7.875], "texture": "#1"},
"east": {"uv": [3.125, 7.5, 3.5, 7.875], "texture": "#1"},
"south": {"uv": [7.5, 4.75, 7.875, 5.125], "texture": "#1"},
"west": {"uv": [7.5, 5.125, 7.875, 5.5], "texture": "#1"},
"up": {"uv": [7.875, 7.375, 7.5, 7], "texture": "#1"},
"down": {"uv": [7.875, 7.375, 7.5, 7.75], "texture": "#1"}
}
},
{
"from": [4.6, 23.4, 7.6],
"to": [6.6, 25.4, 8.6],
"rotation": {"angle": 67.5, "axis": "z", "origin": [5.6, 22.4, 6.6]},
"faces": {
"north": {"uv": [2.125, 7.875, 2.375, 8.125], "texture": "#1"},
"east": {"uv": [3.375, 7.875, 3.5, 8.125], "texture": "#1"},
"south": {"uv": [2.375, 7.875, 2.625, 8.125], "texture": "#1"},
"west": {"uv": [7.875, 7.125, 8, 7.375], "texture": "#1"},
"up": {"uv": [8.125, 7.5, 7.875, 7.375], "texture": "#1"},
"down": {"uv": [8.125, 7.5, 7.875, 7.625], "texture": "#1"}
}
},
{
"from": [8.475, 14.7, 7.1],
"to": [10.475, 19.7, 9.1],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8.475, 17.7, 7.1]},
"faces": {
"north": {"uv": [3.75, 7.25, 4, 7.875], "texture": "#1"},
"east": {"uv": [7.25, 7, 7.5, 7.625], "texture": "#1"},
"south": {"uv": [1.5, 7.5, 1.75, 8.125], "texture": "#1"},
"west": {"uv": [1.75, 7.5, 2, 8.125], "texture": "#1"},
"up": {"uv": [2.875, 8.125, 2.625, 7.875], "texture": "#1"},
"down": {"uv": [3.125, 7.875, 2.875, 8.125], "texture": "#1"}
}
},
{
"from": [5.975, 14.5, 7.6],
"to": [9.975, 16.5, 8.6],
"rotation": {"angle": -22.5, "axis": "z", "origin": [7.975, 16.5, 6.6]},
"faces": {
"north": {"uv": [3.5, 7.5, 3.75, 8], "rotation": 270, "texture": "#1"},
"east": {"uv": [8.125, 7.75, 7.875, 7.625], "rotation": 90, "texture": "#1"},
"south": {"uv": [7.25, 7.625, 7.5, 8.125], "rotation": 90, "texture": "#1"},
"west": {"uv": [8.125, 7.75, 7.875, 7.875], "rotation": 90, "texture": "#1"},
"up": {"uv": [3.25, 7.875, 3.375, 8.375], "rotation": 90, "texture": "#1"},
"down": {"uv": [3.125, 7.875, 3.25, 8.375], "rotation": 90, "texture": "#1"}
}
},
{
"from": [6.975, 14.5, 7.6],
"to": [7.975, 15.5, 8.6],
"rotation": {"angle": -112.5, "axis": "z", "origin": [7.975, 16.5, 6.6]},
"faces": {
"north": {"uv": [8, 1.125, 8.125, 1.25], "texture": "#1"},
"east": {"uv": [1.25, 8, 1.375, 8.125], "texture": "#1"},
"south": {"uv": [8, 1.25, 8.125, 1.375], "texture": "#1"},
"west": {"uv": [1.375, 8, 1.5, 8.125], "texture": "#1"},
"up": {"uv": [8.125, 1.5, 8, 1.375], "texture": "#1"},
"down": {"uv": [8.125, 1.5, 8, 1.625], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.2, 0.2, 0.2]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.2, 0.2, 0.2]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"translation": [0, -3, 0],
"scale": [0.4, 0.4, 0.4]
},
"head": {
"translation": [0, 10, 0],
"scale": [0.5, 0.5, 0.5]
},
"fixed": {
"translation": [0, -4, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
{
"name": "group",
"origin": [8, 8, 8],
"scope": 0,
"color": 0,
"children": [9, 10, 11, 12, 13, 14, 15, 16]
}
]
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

@@ -47,6 +47,11 @@ public class JRMod implements ModInitializer
ModBlockEntities.FOSSIL_CLEANER_BE.get() ModBlockEntities.FOSSIL_CLEANER_BE.get()
); );
FluidStorage.SIDED.registerForBlockEntities((be, side) ->
new FabricTransferHelper.InternalFluidStorage(((CultivatorBlockEntity) be).getFluidHandler(side)),
ModBlockEntities.CULTIVATOR_BE.get()
);
ItemStorage.SIDED.registerForBlockEntities((be, side) -> ItemStorage.SIDED.registerForBlockEntities((be, side) ->
InventoryStorage.of(((GeneratorBlockEntity) be).itemHandler, side), InventoryStorage.of(((GeneratorBlockEntity) be).itemHandler, side),
ModBlockEntities.GENERATOR_BE.get() ModBlockEntities.GENERATOR_BE.get()
@@ -92,6 +97,11 @@ public class JRMod implements ModInitializer
ModBlockEntities.INCUBATOR_BE.get() ModBlockEntities.INCUBATOR_BE.get()
); );
ItemStorage.SIDED.registerForBlockEntities((be, side) ->
InventoryStorage.of(((CultivatorBlockEntity) be).itemHandler, side),
ModBlockEntities.CULTIVATOR_BE.get()
);
EnergyStorage.SIDED.registerForBlockEntities((be, side) -> EnergyStorage.SIDED.registerForBlockEntities((be, side) ->
new FabricEnergyWrapper(((PowerCellBlockEntity) be).getEnergyStorage(side)), new FabricEnergyWrapper(((PowerCellBlockEntity) be).getEnergyStorage(side)),
ModBlockEntities.POWER_CELL_BE.get() ModBlockEntities.POWER_CELL_BE.get()
@@ -141,5 +151,10 @@ public class JRMod implements ModInitializer
new FabricEnergyWrapper(((IncubatorBlockEntity) be).getEnergyStorage(side)), new FabricEnergyWrapper(((IncubatorBlockEntity) be).getEnergyStorage(side)),
ModBlockEntities.INCUBATOR_BE.get() ModBlockEntities.INCUBATOR_BE.get()
); );
EnergyStorage.SIDED.registerForBlockEntities((be, side) ->
new FabricEnergyWrapper(((CultivatorBlockEntity) be).getEnergyStorage(side)),
ModBlockEntities.CULTIVATOR_BE.get()
);
} }
} }
@@ -18,9 +18,16 @@ public class JRModClient implements ClientModInitializer {
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.TANK.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.TANK.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.INCUBATOR.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.INCUBATOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_INCUBATOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.CULTIVATOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_CULTIVATOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.DNA_EXTRACTOR.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.DNA_EXTRACTOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_DNA_EXTRACTOR.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.FOSSIL_GRINDER.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.FOSSIL_GRINDER.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_FOSSIL_GRINDER.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.FOSSIL_CLEANER.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.FOSSIL_CLEANER.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_FOSSIL_CLEANER.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.DNA_HYBRIDIZER.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.DNA_HYBRIDIZER.get(), RenderType.translucent());
BlockRenderLayerMap.INSTANCE.putBlock(ModBlocks.WHITE_DNA_HYBRIDIZER.get(), RenderType.translucent());
} }
} }