diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c63faf5 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,73 @@ +name: Build and Release + +on: + pull_request: + types: [closed] + branches: [main] + +jobs: + release: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Cache Gradle + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-gradle- + + - name: Increment version + id: version + run: | + CURRENT=$(grep '^mod_version=' gradle.properties | cut -d'=' -f2) + NEW=$(python3 -c " + parts = '$CURRENT'.split('.') + major, minor = int(parts[0]), int(parts[1]) + minor += 1 + if minor >= 10: + major += 1 + minor = 0 + print(f'{major}.{minor}') + ") + sed -i "s/^mod_version=.*/mod_version=$NEW/" gradle.properties + echo "version=$NEW" >> "$GITHUB_OUTPUT" + echo "Bumped $CURRENT → $NEW" + + - name: Build + run: ./gradlew build + + - name: Commit version bump + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add gradle.properties + git commit -m "chore: bump version to ${{ steps.version.outputs.version }} [skip ci]" + git push + + - name: Create release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + JAR=$(find build/libs -name "hardworkers-*.jar" ! -name "*-sources*" | head -1) + gh release create "v${{ steps.version.outputs.version }}" \ + "$JAR#hardworkers-${{ steps.version.outputs.version }}.jar" \ + --title "Hard Workers v${{ steps.version.outputs.version }}" \ + --generate-notes diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43a350a --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Gradle +.gradle/ +build/ +out/ + +# Generated sources +src/generated/ + +# IntelliJ IDEA +.idea/ +*.iml +*.ipr +*.iws + +# Eclipse +.classpath +.project +.settings/ + +# VS Code +.vscode/ + +# macOS +.DS_Store + +# Windows +Thumbs.db diff --git a/build.gradle b/build.gradle index c121d3d..7bbdd3e 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,19 @@ repositories { mavenLocal() } +// NeoForge 21.1.x puts ASM 9.7 on the JVM module path. The NeoGradle plugin +// pulls in a transitive ASM 9.5 which then also lands on the classpath, +// causing BootstrapLauncher to refuse to start. Force everything to 9.7. +configurations.all { + resolutionStrategy { + force 'org.ow2.asm:asm:9.7' + force 'org.ow2.asm:asm-analysis:9.7' + force 'org.ow2.asm:asm-commons:9.7' + force 'org.ow2.asm:asm-tree:9.7' + force 'org.ow2.asm:asm-util:9.7' + } +} + dependencies { implementation "net.neoforged:neoforge:${project.neo_version}" } diff --git a/gradle.properties b/gradle.properties index aa8185b..242c861 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ loader_version_range=[2,) mod_id=hardworkers mod_name=Hard Workers mod_license=MIT -mod_version=1.0.0 +mod_version=0.0 mod_group_id=com.hardworkers.hardworkers mod_authors=holty07 mod_description=Adds worker blocks that spawn entities to automate tasks. Place a Lumberjack Block and watch him chop trees and replant saplings. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/src/main/java/com/hardworkers/hardworkers/HardWorkers.java b/src/main/java/com/hardworkers/hardworkers/HardWorkers.java index 261fcb5..e54f2d2 100644 --- a/src/main/java/com/hardworkers/hardworkers/HardWorkers.java +++ b/src/main/java/com/hardworkers/hardworkers/HardWorkers.java @@ -1,5 +1,6 @@ package com.hardworkers.hardworkers; +import com.hardworkers.hardworkers.init.ModBlockEntities; import com.hardworkers.hardworkers.init.ModBlocks; import com.hardworkers.hardworkers.init.ModEntities; import com.hardworkers.hardworkers.init.ModItems; @@ -17,6 +18,7 @@ public HardWorkers(IEventBus modEventBus, ModContainer modContainer) { ModBlocks.BLOCKS.register(modEventBus); ModItems.ITEMS.register(modEventBus); ModEntities.ENTITY_TYPES.register(modEventBus); + ModBlockEntities.BLOCK_ENTITY_TYPES.register(modEventBus); modContainer.registerConfig(ModConfig.Type.COMMON, HardWorkersConfig.SPEC); } diff --git a/src/main/java/com/hardworkers/hardworkers/HardWorkersConfig.java b/src/main/java/com/hardworkers/hardworkers/HardWorkersConfig.java index 3b2a3b3..6df490e 100644 --- a/src/main/java/com/hardworkers/hardworkers/HardWorkersConfig.java +++ b/src/main/java/com/hardworkers/hardworkers/HardWorkersConfig.java @@ -9,7 +9,6 @@ public class HardWorkersConfig { public static final ModConfigSpec SPEC; public static final ModConfigSpec.IntValue LUMBERJACK_SEARCH_RADIUS; - public static final ModConfigSpec.IntValue LUMBERJACK_CHOP_INTERVAL; static { BUILDER.comment("Lumberjack Settings").push("lumberjack"); @@ -18,10 +17,6 @@ public class HardWorkersConfig { .comment("Radius in blocks the lumberjack searches for trees around its home block") .defineInRange("searchRadius", 16, 4, 64); - LUMBERJACK_CHOP_INTERVAL = BUILDER - .comment("Ticks between each log broken (20 ticks = 1 second)") - .defineInRange("chopInterval", 20, 5, 100); - BUILDER.pop(); SPEC = BUILDER.build(); } diff --git a/src/main/java/com/hardworkers/hardworkers/block/FarmerBlock.java b/src/main/java/com/hardworkers/hardworkers/block/FarmerBlock.java new file mode 100644 index 0000000..1a4d2e0 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/FarmerBlock.java @@ -0,0 +1,148 @@ +package com.hardworkers.hardworkers.block; + +import com.hardworkers.hardworkers.blockentity.FarmerBlockEntity; +import com.hardworkers.hardworkers.entity.FarmerEntity; +import com.hardworkers.hardworkers.init.ModBlockEntities; +import com.hardworkers.hardworkers.init.ModEntities; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +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.BlockBehaviour; +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.DirectionProperty; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; + +import javax.annotation.Nullable; + +public class FarmerBlock extends BaseEntityBlock { + + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public static final MapCodec WOOD_CODEC = simpleCodec(p -> new FarmerBlock(FarmerTier.WOOD, p)); + public static final MapCodec STONE_CODEC = simpleCodec(p -> new FarmerBlock(FarmerTier.STONE, p)); + public static final MapCodec IRON_CODEC = simpleCodec(p -> new FarmerBlock(FarmerTier.IRON, p)); + public static final MapCodec DIAMOND_CODEC = simpleCodec(p -> new FarmerBlock(FarmerTier.DIAMOND, p)); + public static final MapCodec NETHERITE_CODEC = simpleCodec(p -> new FarmerBlock(FarmerTier.NETHERITE, p)); + + private final FarmerTier tier; + + public FarmerBlock(FarmerTier tier, BlockBehaviour.Properties properties) { + super(properties); + this.tier = tier; + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + public FarmerTier getTier() { return tier; } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @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 MapCodec codec() { + return switch (tier) { + case WOOD -> WOOD_CODEC; + case STONE -> STONE_CODEC; + case IRON -> IRON_CODEC; + case DIAMOND -> DIAMOND_CODEC; + case NETHERITE -> NETHERITE_CODEC; + }; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new FarmerBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return level.isClientSide() ? null + : createTickerHelper(type, ModBlockEntities.FARMER_BLOCK_ENTITY.get(), FarmerBlockEntity::serverTick); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + if (!level.isClientSide()) { + FarmerEntity farmer = ModEntities.FARMER.get().create(level); + if (farmer != null) { + farmer.setHomePosition(pos); + farmer.setTierEquipment(this.tier); + farmer.moveTo(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5, 0f, 0f); + level.addFreshEntity(farmer); + } + } + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!level.isClientSide() && !state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof FarmerBlockEntity be) { + Containers.dropContents(level, pos, be); + } + AABB searchArea = new AABB(pos).inflate(3.0); + level.getEntitiesOfClass(FarmerEntity.class, searchArea) + .stream() + .filter(e -> pos.equals(e.getHomePosition())) + .forEach(FarmerEntity::discard); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hitResult) { + if (!level.isClientSide() && level.getBlockEntity(pos) instanceof FarmerBlockEntity be) { + player.displayClientMessage(be.getStorageStatus(), true); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + public static BlockBehaviour.Properties baseProperties(MapColor color) { + return BlockBehaviour.Properties.of() + .mapColor(color) + .sound(SoundType.WOOD) + .strength(2.0f); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/FarmerTier.java b/src/main/java/com/hardworkers/hardworkers/block/FarmerTier.java new file mode 100644 index 0000000..0cdb0b9 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/FarmerTier.java @@ -0,0 +1,21 @@ +package com.hardworkers.hardworkers.block; + +public enum FarmerTier { + WOOD ("wood", 30, 0), + STONE ("stone", 24, 200), + IRON ("iron", 18, 100), + DIAMOND ("diamond", 12, 50), + NETHERITE("netherite", 6, 25); + + public final String id; + /** Ticks between each crop harvest action. */ + public final int harvestInterval; + /** Ticks between forced random-tick calls on crops in range (0 = no boost). */ + public final int growthBoostInterval; + + FarmerTier(String id, int harvestInterval, int growthBoostInterval) { + this.id = id; + this.harvestInterval = harvestInterval; + this.growthBoostInterval = growthBoostInterval; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/LumberjackBlock.java b/src/main/java/com/hardworkers/hardworkers/block/LumberjackBlock.java index a4a6dae..3480cbf 100644 --- a/src/main/java/com/hardworkers/hardworkers/block/LumberjackBlock.java +++ b/src/main/java/com/hardworkers/hardworkers/block/LumberjackBlock.java @@ -1,26 +1,108 @@ package com.hardworkers.hardworkers.block; +import com.hardworkers.hardworkers.blockentity.LumberjackBlockEntity; import com.hardworkers.hardworkers.entity.LumberjackEntity; import com.hardworkers.hardworkers.init.ModEntities; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; 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.DirectionProperty; import net.minecraft.world.level.material.MapColor; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; -public class LumberjackBlock extends Block { +import javax.annotation.Nullable; - public LumberjackBlock() { - super(BlockBehaviour.Properties.of() - .mapColor(MapColor.WOOD) - .sound(SoundType.WOOD) - .strength(2.0f) - ); +public class LumberjackBlock extends BaseEntityBlock { + + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + // One codec per tier — simpleCodec only encodes Properties, so we capture + // the tier via a lambda for each variant. + public static final MapCodec WOOD_CODEC = simpleCodec(p -> new LumberjackBlock(LumberjackTier.WOOD, p)); + public static final MapCodec STONE_CODEC = simpleCodec(p -> new LumberjackBlock(LumberjackTier.STONE, p)); + public static final MapCodec IRON_CODEC = simpleCodec(p -> new LumberjackBlock(LumberjackTier.IRON, p)); + public static final MapCodec DIAMOND_CODEC = simpleCodec(p -> new LumberjackBlock(LumberjackTier.DIAMOND, p)); + public static final MapCodec NETHERITE_CODEC = simpleCodec(p -> new LumberjackBlock(LumberjackTier.NETHERITE, p)); + + private final LumberjackTier tier; + + public LumberjackBlock(LumberjackTier tier, BlockBehaviour.Properties properties) { + super(properties); + this.tier = tier; + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @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))); + } + + public LumberjackTier getTier() { + return tier; + } + + @Override + public MapCodec codec() { + return switch (tier) { + case WOOD -> WOOD_CODEC; + case STONE -> STONE_CODEC; + case IRON -> IRON_CODEC; + case DIAMOND -> DIAMOND_CODEC; + case NETHERITE -> NETHERITE_CODEC; + }; + } + + // ------------------------------------------------------------------------- + // EntityBlock + // ------------------------------------------------------------------------- + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new LumberjackBlockEntity(pos, state); } + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + // ------------------------------------------------------------------------- + // Lifecycle + // ------------------------------------------------------------------------- + @Override public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { super.onPlace(state, level, pos, oldState, movedByPiston); @@ -28,6 +110,7 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS LumberjackEntity lumberjack = ModEntities.LUMBERJACK.get().create(level); if (lumberjack != null) { lumberjack.setHomePosition(pos); + lumberjack.setTierEquipment(this.tier); lumberjack.moveTo(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5, 0f, 0f); level.addFreshEntity(lumberjack); } @@ -37,6 +120,9 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { if (!level.isClientSide() && !state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof LumberjackBlockEntity be) { + Containers.dropContents(level, pos, be); + } AABB searchArea = new AABB(pos).inflate(3.0); level.getEntitiesOfClass(LumberjackEntity.class, searchArea) .stream() @@ -45,4 +131,28 @@ public void onRemove(BlockState state, Level level, BlockPos pos, BlockState new } super.onRemove(state, level, pos, newState, movedByPiston); } + + // ------------------------------------------------------------------------- + // Interaction + // ------------------------------------------------------------------------- + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hitResult) { + if (!level.isClientSide() && level.getBlockEntity(pos) instanceof LumberjackBlockEntity be) { + player.displayClientMessage(be.getStorageStatus(), true); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + public static BlockBehaviour.Properties baseProperties(MapColor color) { + return BlockBehaviour.Properties.of() + .mapColor(color) + .sound(SoundType.WOOD) + .strength(2.0f); + } } diff --git a/src/main/java/com/hardworkers/hardworkers/block/LumberjackTier.java b/src/main/java/com/hardworkers/hardworkers/block/LumberjackTier.java new file mode 100644 index 0000000..0a820f2 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/LumberjackTier.java @@ -0,0 +1,20 @@ +package com.hardworkers.hardworkers.block; + +public enum LumberjackTier { + + WOOD ("wood", 40), + STONE ("stone", 30), + IRON ("iron", 20), + DIAMOND ("diamond", 12), + NETHERITE("netherite", 6); + + /** Used in block/item registry names, e.g. "lumberjack_wood". */ + public final String id; + /** Ticks between breaking each log. Lower = faster. */ + public final int chopInterval; + + LumberjackTier(String id, int chopInterval) { + this.id = id; + this.chopInterval = chopInterval; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/MinerBlock.java b/src/main/java/com/hardworkers/hardworkers/block/MinerBlock.java new file mode 100644 index 0000000..ccf4aaf --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/MinerBlock.java @@ -0,0 +1,138 @@ +package com.hardworkers.hardworkers.block; + +import com.hardworkers.hardworkers.blockentity.MinerBlockEntity; +import com.hardworkers.hardworkers.entity.MinerEntity; +import com.hardworkers.hardworkers.init.ModEntities; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +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.DirectionProperty; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; + +import javax.annotation.Nullable; + +public class MinerBlock extends BaseEntityBlock { + + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public static final MapCodec WOOD_CODEC = simpleCodec(p -> new MinerBlock(MinerTier.WOOD, p)); + public static final MapCodec STONE_CODEC = simpleCodec(p -> new MinerBlock(MinerTier.STONE, p)); + public static final MapCodec IRON_CODEC = simpleCodec(p -> new MinerBlock(MinerTier.IRON, p)); + public static final MapCodec DIAMOND_CODEC = simpleCodec(p -> new MinerBlock(MinerTier.DIAMOND, p)); + public static final MapCodec NETHERITE_CODEC = simpleCodec(p -> new MinerBlock(MinerTier.NETHERITE, p)); + + private final MinerTier tier; + + public MinerBlock(MinerTier tier, BlockBehaviour.Properties properties) { + super(properties); + this.tier = tier; + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + public MinerTier getTier() { return tier; } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @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 MapCodec codec() { + return switch (tier) { + case WOOD -> WOOD_CODEC; + case STONE -> STONE_CODEC; + case IRON -> IRON_CODEC; + case DIAMOND -> DIAMOND_CODEC; + case NETHERITE -> NETHERITE_CODEC; + }; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new MinerBlockEntity(pos, state); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + if (!level.isClientSide()) { + MinerEntity miner = ModEntities.MINER.get().create(level); + if (miner != null) { + miner.setHomePosition(pos); + miner.setTierEquipment(this.tier); + miner.moveTo(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5, 0f, 0f); + level.addFreshEntity(miner); + } + } + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!level.isClientSide() && !state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof MinerBlockEntity be) { + Containers.dropContents(level, pos, be); + } + AABB searchArea = new AABB(pos).inflate(3.0); + level.getEntitiesOfClass(MinerEntity.class, searchArea) + .stream() + .filter(e -> pos.equals(e.getHomePosition())) + .forEach(MinerEntity::discard); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hitResult) { + if (!level.isClientSide() && level.getBlockEntity(pos) instanceof MinerBlockEntity be) { + player.displayClientMessage(be.getStorageStatus(), true); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + public static BlockBehaviour.Properties baseProperties(MapColor color) { + return BlockBehaviour.Properties.of() + .mapColor(color) + .sound(SoundType.STONE) + .strength(2.5f); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/MinerTier.java b/src/main/java/com/hardworkers/hardworkers/block/MinerTier.java new file mode 100644 index 0000000..29e0c95 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/MinerTier.java @@ -0,0 +1,17 @@ +package com.hardworkers.hardworkers.block; + +public enum MinerTier { + WOOD ("wood", 40), + STONE ("stone", 30), + IRON ("iron", 20), + DIAMOND ("diamond", 12), + NETHERITE("netherite", 6); + + public final String id; + public final int mineInterval; + + MinerTier(String id, int mineInterval) { + this.id = id; + this.mineInterval = mineInterval; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/WarehouseBlock.java b/src/main/java/com/hardworkers/hardworkers/block/WarehouseBlock.java new file mode 100644 index 0000000..bfb35fe --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/WarehouseBlock.java @@ -0,0 +1,139 @@ +package com.hardworkers.hardworkers.block; + +import com.hardworkers.hardworkers.blockentity.WarehouseBlockEntity; +import com.hardworkers.hardworkers.entity.WarehouseWorkerEntity; +import com.hardworkers.hardworkers.init.ModBlockEntities; +import com.hardworkers.hardworkers.init.ModEntities; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +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.DirectionProperty; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; + +import javax.annotation.Nullable; + +public class WarehouseBlock extends BaseEntityBlock { + + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public static final MapCodec WOOD_CODEC = simpleCodec(p -> new WarehouseBlock(WarehouseTier.WOOD, p)); + public static final MapCodec STONE_CODEC = simpleCodec(p -> new WarehouseBlock(WarehouseTier.STONE, p)); + public static final MapCodec IRON_CODEC = simpleCodec(p -> new WarehouseBlock(WarehouseTier.IRON, p)); + public static final MapCodec DIAMOND_CODEC = simpleCodec(p -> new WarehouseBlock(WarehouseTier.DIAMOND, p)); + public static final MapCodec NETHERITE_CODEC = simpleCodec(p -> new WarehouseBlock(WarehouseTier.NETHERITE, p)); + + private final WarehouseTier tier; + + public WarehouseBlock(WarehouseTier tier, BlockBehaviour.Properties properties) { + super(properties); + this.tier = tier; + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + public WarehouseTier getTier() { return tier; } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @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 MapCodec codec() { + return switch (tier) { + case WOOD -> WOOD_CODEC; + case STONE -> STONE_CODEC; + case IRON -> IRON_CODEC; + case DIAMOND -> DIAMOND_CODEC; + case NETHERITE -> NETHERITE_CODEC; + }; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new WarehouseBlockEntity(pos, state); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + if (!level.isClientSide()) { + WarehouseWorkerEntity worker = ModEntities.WAREHOUSE_WORKER.get().create(level); + if (worker != null) { + worker.setHomePosition(pos); + worker.setTier(this.tier); + worker.moveTo(pos.getX() + 0.5, pos.getY() + 1.0, pos.getZ() + 0.5, 0f, 0f); + level.addFreshEntity(worker); + } + } + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!level.isClientSide() && !state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof WarehouseBlockEntity be) { + Containers.dropContents(level, pos, be); + } + AABB searchArea = new AABB(pos).inflate(3.0); + level.getEntitiesOfClass(WarehouseWorkerEntity.class, searchArea) + .stream() + .filter(e -> pos.equals(e.getHomePosition())) + .forEach(WarehouseWorkerEntity::discard); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hitResult) { + if (!level.isClientSide() && level.getBlockEntity(pos) instanceof WarehouseBlockEntity be) { + player.openMenu(be); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + public static BlockBehaviour.Properties baseProperties(MapColor color) { + return BlockBehaviour.Properties.of() + .mapColor(color) + .sound(SoundType.WOOD) + .strength(2.5f); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/block/WarehouseTier.java b/src/main/java/com/hardworkers/hardworkers/block/WarehouseTier.java new file mode 100644 index 0000000..15cba64 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/block/WarehouseTier.java @@ -0,0 +1,19 @@ +package com.hardworkers.hardworkers.block; + +public enum WarehouseTier { + WOOD("wood", 4, 0.25), + STONE("stone", 8, 0.28), + IRON("iron", 12, 0.32), + DIAMOND("diamond", 18, 0.37), + NETHERITE("netherite", 27, 0.43); + + public final String id; + public final int stacksPerTrip; + public final double moveSpeed; + + WarehouseTier(String id, int stacksPerTrip, double moveSpeed) { + this.id = id; + this.stacksPerTrip = stacksPerTrip; + this.moveSpeed = moveSpeed; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/blockentity/FarmerBlockEntity.java b/src/main/java/com/hardworkers/hardworkers/blockentity/FarmerBlockEntity.java new file mode 100644 index 0000000..f103320 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/blockentity/FarmerBlockEntity.java @@ -0,0 +1,196 @@ +package com.hardworkers.hardworkers.blockentity; + +import com.hardworkers.hardworkers.block.FarmerBlock; +import com.hardworkers.hardworkers.block.FarmerTier; +import com.hardworkers.hardworkers.init.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.CocoaBlock; +import net.minecraft.world.level.block.FarmBlock; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.SweetBerryBushBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; + +/** + * Storage block for the farmer worker. + * + * Server tick responsibilities: + * 1. Keep all farmland within HYDRATION_RADIUS at maximum moisture so the + * block substitutes for a water source in a typical farm layout. + * 2. Call randomTick on every crop in the 5×5 harvest area at the tier's + * growthBoostInterval so higher tiers accelerate plant growth. + */ +public class FarmerBlockEntity extends BlockEntity implements Container { + + public static final int SLOT_COUNT = 27; + private static final int FARM_RADIUS = 2; // 5×5 harvest area + private static final int HYDRATION_RADIUS = 3; // slightly wider to cover farm edges + + private NonNullList items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + private final IItemHandler itemHandler = new InvWrapper(this); + + public FarmerBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.FARMER_BLOCK_ENTITY.get(), pos, state); + } + + public IItemHandler getItemHandler() { return itemHandler; } + + // ------------------------------------------------------------------------- + // Server tick + // ------------------------------------------------------------------------- + + public static void serverTick(Level level, BlockPos pos, BlockState state, FarmerBlockEntity be) { + if (!(level instanceof ServerLevel serverLevel)) return; + + // Hydrate surrounding farmland every 20 ticks (well ahead of random-tick decay) + if (level.getGameTime() % 20 == 0) { + hydrateFarmland(level, pos); + } + + FarmerTier tier = getTier(serverLevel, pos); + if (tier.growthBoostInterval > 0 && level.getGameTime() % tier.growthBoostInterval == 0) { + boostCropGrowth(serverLevel, pos); + } + } + + private static void hydrateFarmland(Level level, BlockPos center) { + for (int dx = -HYDRATION_RADIUS; dx <= HYDRATION_RADIUS; dx++) { + for (int dz = -HYDRATION_RADIUS; dz <= HYDRATION_RADIUS; dz++) { + for (int dy = -2; dy <= 1; dy++) { + BlockPos p = center.offset(dx, dy, dz); + BlockState s = level.getBlockState(p); + if (s.is(Blocks.FARMLAND) && s.getValue(FarmBlock.MOISTURE) < 7) { + level.setBlock(p, s.setValue(FarmBlock.MOISTURE, 7), Block.UPDATE_CLIENTS); + } + } + } + } + } + + private static void boostCropGrowth(ServerLevel level, BlockPos center) { + for (int dx = -FARM_RADIUS; dx <= FARM_RADIUS; dx++) { + for (int dz = -FARM_RADIUS; dz <= FARM_RADIUS; dz++) { + for (int dy = -1; dy <= 3; dy++) { + BlockPos p = center.offset(dx, dy, dz); + BlockState s = level.getBlockState(p); + Block b = s.getBlock(); + if (b instanceof BonemealableBlock bm && bm.isValidBonemealTarget(level, p, s)) { + bm.performBonemeal(level, level.random, p, s); + } else if (b instanceof NetherWartBlock) { + advanceAge(level, p, s, NetherWartBlock.AGE, 3); + } else if (b instanceof CocoaBlock) { + advanceAge(level, p, s, CocoaBlock.AGE, 2); + } else if (b instanceof SweetBerryBushBlock) { + advanceAge(level, p, s, SweetBerryBushBlock.AGE, 3); + } + } + } + } + } + + private static void advanceAge(ServerLevel level, BlockPos pos, BlockState state, + IntegerProperty ageProp, int maxAge) { + int age = state.getValue(ageProp); + if (age < maxAge) { + level.setBlock(pos, state.setValue(ageProp, age + 1), Block.UPDATE_CLIENTS); + } + } + + private static FarmerTier getTier(Level level, BlockPos pos) { + BlockState s = level.getBlockState(pos); + if (s.getBlock() instanceof FarmerBlock fb) return fb.getTier(); + return FarmerTier.WOOD; + } + + // ------------------------------------------------------------------------- + // Storage API + // ------------------------------------------------------------------------- + + public ItemStack insertItem(ItemStack incoming) { + if (incoming.isEmpty()) return ItemStack.EMPTY; + for (int i = 0; i < SLOT_COUNT; i++) { + ItemStack slot = items.get(i); + if (!slot.isEmpty() && slot.getItem() == incoming.getItem() + && ItemStack.isSameItemSameComponents(slot, incoming)) { + int space = slot.getMaxStackSize() - slot.getCount(); + if (space > 0) { + int toAdd = Math.min(space, incoming.getCount()); + slot.grow(toAdd); + setChanged(); + incoming = incoming.copyWithCount(incoming.getCount() - toAdd); + if (incoming.isEmpty()) return ItemStack.EMPTY; + } + } + } + for (int i = 0; i < SLOT_COUNT; i++) { + if (items.get(i).isEmpty()) { + int toStore = Math.min(incoming.getCount(), incoming.getMaxStackSize()); + items.set(i, incoming.copyWithCount(toStore)); + setChanged(); + int leftover = incoming.getCount() - toStore; + return leftover > 0 ? incoming.copyWithCount(leftover) : ItemStack.EMPTY; + } + } + return incoming; + } + + public boolean isFull() { + for (ItemStack s : items) { + if (s.isEmpty() || s.getCount() < s.getMaxStackSize()) return false; + } + return true; + } + + public Component getStorageStatus() { + int used = 0, total = 0; + for (ItemStack s : items) { if (!s.isEmpty()) { used++; total += s.getCount(); } } + if (used == 0) return Component.literal("Storage: empty"); + return Component.literal("Storage: " + used + "/" + SLOT_COUNT + " slots (" + total + " items)"); + } + + // ------------------------------------------------------------------------- + // Container + // ------------------------------------------------------------------------- + + @Override public int getContainerSize() { return SLOT_COUNT; } + @Override public boolean isEmpty() { for (ItemStack s : items) { if (!s.isEmpty()) return false; } return true; } + @Override public ItemStack getItem(int slot) { return slot >= 0 && slot < SLOT_COUNT ? items.get(slot) : ItemStack.EMPTY; } + @Override public ItemStack removeItem(int slot, int amount) { ItemStack r = ContainerHelper.removeItem(items, slot, amount); if (!r.isEmpty()) setChanged(); return r; } + @Override public ItemStack removeItemNoUpdate(int slot) { return ContainerHelper.takeItem(items, slot); } + @Override public void setItem(int slot, ItemStack stack) { if (slot >= 0 && slot < SLOT_COUNT) { items.set(slot, stack); setChanged(); } } + @Override public boolean stillValid(Player player) { return true; } + @Override public void clearContent() { items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); setChanged(); } + + // ------------------------------------------------------------------------- + // NBT + // ------------------------------------------------------------------------- + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + ContainerHelper.saveAllItems(tag, items, registries); + } + + @Override + public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, items, registries); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/blockentity/LumberjackBlockEntity.java b/src/main/java/com/hardworkers/hardworkers/blockentity/LumberjackBlockEntity.java new file mode 100644 index 0000000..1666899 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/blockentity/LumberjackBlockEntity.java @@ -0,0 +1,177 @@ +package com.hardworkers.hardworkers.blockentity; + +import com.hardworkers.hardworkers.init.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; + +/** + * Chest-sized (27-slot) storage for everything the lumberjack harvests: + * logs, saplings, apples, sticks, etc. + *

+ * Implements {@link Container} for vanilla hopper compatibility. + * Exposes {@link IItemHandler} via capability for mod pipes. + */ +public class LumberjackBlockEntity extends BlockEntity implements Container { + + public static final int SLOT_COUNT = 27; + + private NonNullList items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + + private final IItemHandler itemHandler = new InvWrapper(this); + + public LumberjackBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.LUMBERJACK_BLOCK_ENTITY.get(), pos, state); + } + + // ------------------------------------------------------------------------- + // Public API + // ------------------------------------------------------------------------- + + public IItemHandler getItemHandler() { + return itemHandler; + } + + /** + * Inserts {@code incoming} into the best available slot. + * Merges with existing stacks of the same item first, then fills empty slots. + * + * @return the leftover that could not be stored (empty if fully accepted). + */ + public ItemStack insertItem(ItemStack incoming) { + if (incoming.isEmpty()) return ItemStack.EMPTY; + + // Pass 1 — merge into existing matching stacks + for (int i = 0; i < SLOT_COUNT; i++) { + ItemStack slot = items.get(i); + if (!slot.isEmpty() + && slot.getItem() == incoming.getItem() + && ItemStack.isSameItemSameComponents(slot, incoming)) { + int space = slot.getMaxStackSize() - slot.getCount(); + if (space > 0) { + int toAdd = Math.min(space, incoming.getCount()); + slot.grow(toAdd); + setChanged(); + incoming = incoming.copyWithCount(incoming.getCount() - toAdd); + if (incoming.isEmpty()) return ItemStack.EMPTY; + } + } + } + + // Pass 2 — fill the first empty slot + for (int i = 0; i < SLOT_COUNT; i++) { + if (items.get(i).isEmpty()) { + int toStore = Math.min(incoming.getCount(), incoming.getMaxStackSize()); + items.set(i, incoming.copyWithCount(toStore)); + setChanged(); + int leftover = incoming.getCount() - toStore; + return leftover > 0 ? incoming.copyWithCount(leftover) : ItemStack.EMPTY; + } + } + + return incoming; // no space + } + + /** Returns true when every slot is occupied with a full stack. */ + public boolean isFull() { + for (ItemStack stack : items) { + if (stack.isEmpty() || stack.getCount() < stack.getMaxStackSize()) return false; + } + return true; + } + + public Component getStorageStatus() { + int usedSlots = 0; + int totalItems = 0; + for (ItemStack stack : items) { + if (!stack.isEmpty()) { + usedSlots++; + totalItems += stack.getCount(); + } + } + if (usedSlots == 0) return Component.literal("Storage: empty"); + return Component.literal( + "Storage: " + usedSlots + "/" + SLOT_COUNT + " slots (" + totalItems + " items)" + ); + } + + // ------------------------------------------------------------------------- + // Container (vanilla hopper compatibility) + // ------------------------------------------------------------------------- + + @Override + public int getContainerSize() { + return SLOT_COUNT; + } + + @Override + public boolean isEmpty() { + for (ItemStack stack : items) { + if (!stack.isEmpty()) return false; + } + return true; + } + + @Override + public ItemStack getItem(int slot) { + return slot >= 0 && slot < SLOT_COUNT ? items.get(slot) : ItemStack.EMPTY; + } + + @Override + public ItemStack removeItem(int slot, int amount) { + ItemStack result = ContainerHelper.removeItem(items, slot, amount); + if (!result.isEmpty()) setChanged(); + return result; + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(items, slot); + } + + @Override + public void setItem(int slot, ItemStack stack) { + if (slot >= 0 && slot < SLOT_COUNT) { + items.set(slot, stack); + setChanged(); + } + } + + @Override + public boolean stillValid(Player player) { + return true; + } + + @Override + public void clearContent() { + items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + setChanged(); + } + + // ------------------------------------------------------------------------- + // NBT + // ------------------------------------------------------------------------- + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + ContainerHelper.saveAllItems(tag, items, registries); + } + + @Override + public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, items, registries); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/blockentity/MinerBlockEntity.java b/src/main/java/com/hardworkers/hardworkers/blockentity/MinerBlockEntity.java new file mode 100644 index 0000000..737e6e3 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/blockentity/MinerBlockEntity.java @@ -0,0 +1,97 @@ +package com.hardworkers.hardworkers.blockentity; + +import com.hardworkers.hardworkers.init.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; + +public class MinerBlockEntity extends BlockEntity implements Container { + + public static final int SLOT_COUNT = 27; + + private NonNullList items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + private final IItemHandler itemHandler = new InvWrapper(this); + + public MinerBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.MINER_BLOCK_ENTITY.get(), pos, state); + } + + public IItemHandler getItemHandler() { return itemHandler; } + + public ItemStack insertItem(ItemStack incoming) { + if (incoming.isEmpty()) return ItemStack.EMPTY; + for (int i = 0; i < SLOT_COUNT; i++) { + ItemStack slot = items.get(i); + if (!slot.isEmpty() + && slot.getItem() == incoming.getItem() + && ItemStack.isSameItemSameComponents(slot, incoming)) { + int space = slot.getMaxStackSize() - slot.getCount(); + if (space > 0) { + int toAdd = Math.min(space, incoming.getCount()); + slot.grow(toAdd); + setChanged(); + incoming = incoming.copyWithCount(incoming.getCount() - toAdd); + if (incoming.isEmpty()) return ItemStack.EMPTY; + } + } + } + for (int i = 0; i < SLOT_COUNT; i++) { + if (items.get(i).isEmpty()) { + int toStore = Math.min(incoming.getCount(), incoming.getMaxStackSize()); + items.set(i, incoming.copyWithCount(toStore)); + setChanged(); + int leftover = incoming.getCount() - toStore; + return leftover > 0 ? incoming.copyWithCount(leftover) : ItemStack.EMPTY; + } + } + return incoming; + } + + public boolean isFull() { + for (ItemStack stack : items) { + if (stack.isEmpty() || stack.getCount() < stack.getMaxStackSize()) return false; + } + return true; + } + + public Component getStorageStatus() { + int usedSlots = 0, totalItems = 0; + for (ItemStack stack : items) { + if (!stack.isEmpty()) { usedSlots++; totalItems += stack.getCount(); } + } + if (usedSlots == 0) return Component.literal("Storage: empty"); + return Component.literal("Storage: " + usedSlots + "/" + SLOT_COUNT + " slots (" + totalItems + " items)"); + } + + @Override public int getContainerSize() { return SLOT_COUNT; } + @Override public boolean isEmpty() { for (ItemStack s : items) { if (!s.isEmpty()) return false; } return true; } + @Override public ItemStack getItem(int slot) { return slot >= 0 && slot < SLOT_COUNT ? items.get(slot) : ItemStack.EMPTY; } + @Override public ItemStack removeItem(int slot, int amount) { ItemStack r = ContainerHelper.removeItem(items, slot, amount); if (!r.isEmpty()) setChanged(); return r; } + @Override public ItemStack removeItemNoUpdate(int slot) { return ContainerHelper.takeItem(items, slot); } + @Override public void setItem(int slot, ItemStack stack) { if (slot >= 0 && slot < SLOT_COUNT) { items.set(slot, stack); setChanged(); } } + @Override public boolean stillValid(Player player) { return true; } + @Override public void clearContent() { items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); setChanged(); } + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + ContainerHelper.saveAllItems(tag, items, registries); + } + + @Override + public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, items, registries); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/blockentity/WarehouseBlockEntity.java b/src/main/java/com/hardworkers/hardworkers/blockentity/WarehouseBlockEntity.java new file mode 100644 index 0000000..e90dfb2 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/blockentity/WarehouseBlockEntity.java @@ -0,0 +1,107 @@ +package com.hardworkers.hardworkers.blockentity; + +import com.hardworkers.hardworkers.init.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.MenuProvider; +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.ChestMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.InvWrapper; + +public class WarehouseBlockEntity extends BlockEntity implements Container, MenuProvider { + + public static final int SLOT_COUNT = 27; + + private NonNullList items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + private final IItemHandler itemHandler = new InvWrapper(this); + + public WarehouseBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.WAREHOUSE_BLOCK_ENTITY.get(), pos, state); + } + + public IItemHandler getItemHandler() { return itemHandler; } + + public ItemStack insertItem(ItemStack incoming) { + if (incoming.isEmpty()) return ItemStack.EMPTY; + for (int i = 0; i < SLOT_COUNT; i++) { + ItemStack slot = items.get(i); + if (!slot.isEmpty() && slot.getItem() == incoming.getItem() + && ItemStack.isSameItemSameComponents(slot, incoming)) { + int space = slot.getMaxStackSize() - slot.getCount(); + if (space > 0) { + int toAdd = Math.min(space, incoming.getCount()); + slot.grow(toAdd); + setChanged(); + incoming = incoming.copyWithCount(incoming.getCount() - toAdd); + if (incoming.isEmpty()) return ItemStack.EMPTY; + } + } + } + for (int i = 0; i < SLOT_COUNT; i++) { + if (items.get(i).isEmpty()) { + int toStore = Math.min(incoming.getCount(), incoming.getMaxStackSize()); + items.set(i, incoming.copyWithCount(toStore)); + setChanged(); + int leftover = incoming.getCount() - toStore; + return leftover > 0 ? incoming.copyWithCount(leftover) : ItemStack.EMPTY; + } + } + return incoming; + } + + public boolean isFull() { + for (ItemStack s : items) { + if (s.isEmpty() || s.getCount() < s.getMaxStackSize()) return false; + } + return true; + } + + // MenuProvider — opens a 3×9 chest screen + + @Override + public Component getDisplayName() { + return Component.translatable("container.hardworkers.warehouse"); + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory playerInventory, Player player) { + return ChestMenu.threeRows(id, playerInventory, this); + } + + // Container + + @Override public int getContainerSize() { return SLOT_COUNT; } + @Override public boolean isEmpty() { for (ItemStack s : items) { if (!s.isEmpty()) return false; } return true; } + @Override public ItemStack getItem(int slot) { return slot >= 0 && slot < SLOT_COUNT ? items.get(slot) : ItemStack.EMPTY; } + @Override public ItemStack removeItem(int slot, int amount) { ItemStack r = ContainerHelper.removeItem(items, slot, amount); if (!r.isEmpty()) setChanged(); return r; } + @Override public ItemStack removeItemNoUpdate(int slot) { return ContainerHelper.takeItem(items, slot); } + @Override public void setItem(int slot, ItemStack stack) { if (slot >= 0 && slot < SLOT_COUNT) { items.set(slot, stack); setChanged(); } } + @Override public boolean stillValid(Player player) { return true; } + @Override public void clearContent() { items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); setChanged(); } + + // NBT + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + ContainerHelper.saveAllItems(tag, items, registries); + } + + @Override + public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + items = NonNullList.withSize(SLOT_COUNT, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, items, registries); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/client/ClientEvents.java b/src/main/java/com/hardworkers/hardworkers/client/ClientEvents.java index 4fc46cf..146978f 100644 --- a/src/main/java/com/hardworkers/hardworkers/client/ClientEvents.java +++ b/src/main/java/com/hardworkers/hardworkers/client/ClientEvents.java @@ -1,7 +1,10 @@ package com.hardworkers.hardworkers.client; import com.hardworkers.hardworkers.HardWorkers; +import com.hardworkers.hardworkers.entity.client.FarmerRenderer; import com.hardworkers.hardworkers.entity.client.LumberjackRenderer; +import com.hardworkers.hardworkers.entity.client.MinerRenderer; +import com.hardworkers.hardworkers.entity.client.WarehouseWorkerRenderer; import com.hardworkers.hardworkers.init.ModEntities; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -14,5 +17,8 @@ public class ClientEvents { @SubscribeEvent public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(ModEntities.LUMBERJACK.get(), LumberjackRenderer::new); + event.registerEntityRenderer(ModEntities.MINER.get(), MinerRenderer::new); + event.registerEntityRenderer(ModEntities.FARMER.get(), FarmerRenderer::new); + event.registerEntityRenderer(ModEntities.WAREHOUSE_WORKER.get(), WarehouseWorkerRenderer::new); } } diff --git a/src/main/java/com/hardworkers/hardworkers/entity/FarmerEntity.java b/src/main/java/com/hardworkers/hardworkers/entity/FarmerEntity.java new file mode 100644 index 0000000..b278661 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/FarmerEntity.java @@ -0,0 +1,81 @@ +package com.hardworkers.hardworkers.entity; + +import com.hardworkers.hardworkers.block.FarmerTier; +import com.hardworkers.hardworkers.entity.ai.HarvestCropsGoal; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; + +public class FarmerEntity extends PathfinderMob { + + private BlockPos homePosition = BlockPos.ZERO; + + public FarmerEntity(EntityType type, Level level) { + super(type, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return PathfinderMob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 20.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.FOLLOW_RANGE, 16.0); + } + + @Override + protected void registerGoals() { + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new HarvestCropsGoal(this)); + goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 0.6)); + goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + } + + @Override + public void tick() { + super.tick(); + if (!level().isClientSide() && tickCount % 100 == 0 && !homePosition.equals(BlockPos.ZERO)) { + if (level().getBlockState(homePosition).isAir()) { + discard(); + } + } + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putInt("HomeX", homePosition.getX()); + tag.putInt("HomeY", homePosition.getY()); + tag.putInt("HomeZ", homePosition.getZ()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("HomeX")) { + homePosition = new BlockPos(tag.getInt("HomeX"), tag.getInt("HomeY"), tag.getInt("HomeZ")); + } + } + + public BlockPos getHomePosition() { return homePosition; } + public void setHomePosition(BlockPos pos) { this.homePosition = pos; } + + public void setTierEquipment(FarmerTier tier) { + var hoe = switch (tier) { + case WOOD -> Items.WOODEN_HOE; + case STONE -> Items.STONE_HOE; + case IRON -> Items.IRON_HOE; + case DIAMOND -> Items.DIAMOND_HOE; + case NETHERITE -> Items.NETHERITE_HOE; + }; + setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(hoe)); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/LumberjackEntity.java b/src/main/java/com/hardworkers/hardworkers/entity/LumberjackEntity.java index 6d00274..65d167a 100644 --- a/src/main/java/com/hardworkers/hardworkers/entity/LumberjackEntity.java +++ b/src/main/java/com/hardworkers/hardworkers/entity/LumberjackEntity.java @@ -1,16 +1,20 @@ package com.hardworkers.hardworkers.entity; +import com.hardworkers.hardworkers.block.LumberjackTier; import com.hardworkers.hardworkers.entity.ai.ChopTreeGoal; import com.hardworkers.hardworkers.entity.ai.FindTreeGoal; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; public class LumberjackEntity extends PathfinderMob { @@ -76,11 +80,17 @@ public void setHomePosition(BlockPos pos) { this.homePosition = pos; } - public BlockPos getTargetTree() { - return targetTree; - } + public BlockPos getTargetTree() { return targetTree; } + public void setTargetTree(BlockPos pos) { this.targetTree = pos; } - public void setTargetTree(BlockPos pos) { - this.targetTree = pos; + public void setTierEquipment(LumberjackTier tier) { + var axe = switch (tier) { + case WOOD -> Items.WOODEN_AXE; + case STONE -> Items.STONE_AXE; + case IRON -> Items.IRON_AXE; + case DIAMOND -> Items.DIAMOND_AXE; + case NETHERITE -> Items.NETHERITE_AXE; + }; + setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(axe)); } } diff --git a/src/main/java/com/hardworkers/hardworkers/entity/MinerEntity.java b/src/main/java/com/hardworkers/hardworkers/entity/MinerEntity.java new file mode 100644 index 0000000..4c54693 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/MinerEntity.java @@ -0,0 +1,89 @@ +package com.hardworkers.hardworkers.entity; + +import com.hardworkers.hardworkers.block.MinerTier; +import com.hardworkers.hardworkers.entity.ai.MineForwardGoal; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; + +public class MinerEntity extends PathfinderMob { + + private BlockPos homePosition = BlockPos.ZERO; + private int currentDepth = 1; + + public MinerEntity(EntityType type, Level level) { + super(type, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return PathfinderMob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 20.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.FOLLOW_RANGE, 80.0); + } + + @Override + protected void registerGoals() { + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new MineForwardGoal(this)); + goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 0.5)); + goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + } + + @Override + public void tick() { + super.tick(); + if (!level().isClientSide() && tickCount % 100 == 0 && !homePosition.equals(BlockPos.ZERO)) { + if (level().getBlockState(homePosition).isAir()) { + discard(); + } + } + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putInt("HomeX", homePosition.getX()); + tag.putInt("HomeY", homePosition.getY()); + tag.putInt("HomeZ", homePosition.getZ()); + tag.putInt("CurrentDepth", currentDepth); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("HomeX")) { + homePosition = new BlockPos(tag.getInt("HomeX"), tag.getInt("HomeY"), tag.getInt("HomeZ")); + } + if (tag.contains("CurrentDepth")) { + currentDepth = tag.getInt("CurrentDepth"); + } + } + + public BlockPos getHomePosition() { return homePosition; } + public void setHomePosition(BlockPos pos) { this.homePosition = pos; } + + public int getCurrentDepth() { return currentDepth; } + public void setCurrentDepth(int depth) { this.currentDepth = depth; } + + public void setTierEquipment(MinerTier tier) { + var pick = switch (tier) { + case WOOD -> Items.WOODEN_PICKAXE; + case STONE -> Items.STONE_PICKAXE; + case IRON -> Items.IRON_PICKAXE; + case DIAMOND -> Items.DIAMOND_PICKAXE; + case NETHERITE -> Items.NETHERITE_PICKAXE; + }; + setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(pick)); + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/WarehouseWorkerEntity.java b/src/main/java/com/hardworkers/hardworkers/entity/WarehouseWorkerEntity.java new file mode 100644 index 0000000..d603e73 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/WarehouseWorkerEntity.java @@ -0,0 +1,87 @@ +package com.hardworkers.hardworkers.entity; + +import com.hardworkers.hardworkers.block.WarehouseTier; +import com.hardworkers.hardworkers.entity.ai.CollectItemsGoal; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import java.util.ArrayList; +import java.util.List; + +public class WarehouseWorkerEntity extends PathfinderMob { + + private BlockPos homePosition = BlockPos.ZERO; + private WarehouseTier tier = WarehouseTier.WOOD; + public final List carrying = new ArrayList<>(); + + public WarehouseWorkerEntity(EntityType type, Level level) { + super(type, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return PathfinderMob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 20.0) + .add(Attributes.MOVEMENT_SPEED, 0.25) + .add(Attributes.FOLLOW_RANGE, 64.0); + } + + @Override + protected void registerGoals() { + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new CollectItemsGoal(this)); + goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 0.6)); + goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + } + + @Override + public void tick() { + super.tick(); + if (!level().isClientSide() && tickCount % 100 == 0 && !homePosition.equals(BlockPos.ZERO)) { + if (level().getBlockState(homePosition).isAir()) { + discard(); + } + } + } + + public void setTier(WarehouseTier tier) { + this.tier = tier; + var speedAttr = getAttribute(Attributes.MOVEMENT_SPEED); + if (speedAttr != null) speedAttr.setBaseValue(tier.moveSpeed); + } + + public WarehouseTier getTier() { return tier; } + public int getStacksPerTrip() { return tier.stacksPerTrip; } + public BlockPos getHomePosition() { return homePosition; } + public void setHomePosition(BlockPos pos) { this.homePosition = pos; } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putInt("HomeX", homePosition.getX()); + tag.putInt("HomeY", homePosition.getY()); + tag.putInt("HomeZ", homePosition.getZ()); + tag.putString("Tier", tier.name()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("HomeX")) { + homePosition = new BlockPos(tag.getInt("HomeX"), tag.getInt("HomeY"), tag.getInt("HomeZ")); + } + if (tag.contains("Tier")) { + try { + setTier(WarehouseTier.valueOf(tag.getString("Tier"))); + } catch (IllegalArgumentException ignored) {} + } + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/ai/ChopTreeGoal.java b/src/main/java/com/hardworkers/hardworkers/entity/ai/ChopTreeGoal.java index 4433779..8dc0ada 100644 --- a/src/main/java/com/hardworkers/hardworkers/entity/ai/ChopTreeGoal.java +++ b/src/main/java/com/hardworkers/hardworkers/entity/ai/ChopTreeGoal.java @@ -1,6 +1,7 @@ package com.hardworkers.hardworkers.entity.ai; -import com.hardworkers.hardworkers.HardWorkersConfig; +import com.hardworkers.hardworkers.block.LumberjackBlock; +import com.hardworkers.hardworkers.blockentity.LumberjackBlockEntity; import com.hardworkers.hardworkers.entity.LumberjackEntity; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -8,26 +9,31 @@ import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelEvent; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import java.util.*; /** - * Navigates to the tree set by FindTreeGoal, breaks every connected log - * (BFS-collected, chopped bottom-to-top) at the configured interval, then - * plants the matching sapling at the base position. + * Navigates to the tree set by FindTreeGoal, breaks every connected log at the + * configured interval, then instantly clears all associated leaves (collecting + * their drops — saplings, apples, sticks), and finally plants a sapling. + * + * All drops go into the LumberjackBlockEntity; overflow lands on the ground. */ public class ChopTreeGoal extends Goal { private static final double REACH_DIST_SQ = 16.0; // 4-block reach private static final int MAX_LOGS = 256; + /** Margin around the log bounding box to scan for leaf blocks. */ + private static final int LEAF_MARGIN = 3; private final LumberjackEntity lumberjack; private int chopTimer = 0; private final List logsToChop = new ArrayList<>(); + private final List leavesToClear = new ArrayList<>(); private Block saplingType = null; private BlockPos plantPos = null; @@ -56,7 +62,7 @@ public void start() { saplingType = saplingFor(level.getBlockState(treeBase).getBlock()); plantPos = treeBase; - collectTreeLogs(level, treeBase); + collectTreeBlocks(level, treeBase); navigateTo(treeBase); } @@ -75,21 +81,22 @@ public void tick() { } chopTimer++; - if (chopTimer >= HardWorkersConfig.LUMBERJACK_CHOP_INTERVAL.get()) { + if (chopTimer >= chopInterval()) { chopTimer = 0; chopNext(); } if (logsToChop.isEmpty()) { + clearLeaves(); plantSapling(); lumberjack.setTargetTree(null); - // canContinueToUse() will return false next tick, triggering stop() } } @Override public void stop() { logsToChop.clear(); + leavesToClear.clear(); saplingType = null; plantPos = null; chopTimer = 0; @@ -98,6 +105,15 @@ public void stop() { // ------------------------------------------------------------------------- + /** Returns the chop interval from the home block's tier, with a safe fallback. */ + private int chopInterval() { + BlockState home = lumberjack.level().getBlockState(lumberjack.getHomePosition()); + if (home.getBlock() instanceof LumberjackBlock lb) { + return lb.getTier().chopInterval; + } + return 20; + } + private void navigateTo(BlockPos pos) { lumberjack.getNavigation().moveTo( pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 1.0 @@ -111,19 +127,36 @@ private void chopNext() { BlockPos logPos = logsToChop.remove(0); BlockState state = level.getBlockState(logPos); - if (!state.is(BlockTags.LOGS)) return; // already broken by something else + if (!state.is(BlockTags.LOGS)) return; lumberjack.getLookControl().setLookAt( logPos.getX() + 0.5, logPos.getY() + 0.5, logPos.getZ() + 0.5 ); if (level instanceof ServerLevel serverLevel) { - Block.dropResources(state, serverLevel, logPos, null, lumberjack, ItemStack.EMPTY); - level.setBlock(logPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); - level.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, logPos, Block.getId(state)); + List drops = Block.getDrops(state, serverLevel, logPos, null); + serverLevel.setBlock(logPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + serverLevel.levelEvent(2001, logPos, Block.getId(state)); // 2001 = block break particles + sound + depositItems(serverLevel, drops); } } + /** Instantly removes all leaf blocks that were part of this tree, collecting their drops. */ + private void clearLeaves() { + Level level = lumberjack.level(); + if (!(level instanceof ServerLevel serverLevel)) return; + + for (BlockPos leafPos : leavesToClear) { + BlockState leafState = serverLevel.getBlockState(leafPos); + if (!leafState.is(BlockTags.LEAVES)) continue; // may have already decayed + + List drops = Block.getDrops(leafState, serverLevel, leafPos, null); + serverLevel.setBlock(leafPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + depositItems(serverLevel, drops); + } + leavesToClear.clear(); + } + private void plantSapling() { if (plantPos == null || saplingType == null) return; @@ -137,9 +170,39 @@ private void plantSapling() { } } - /** BFS from the base log to collect all connected log blocks. */ - private void collectTreeLogs(Level level, BlockPos base) { + /** + * Sends all {@code drops} to the block entity's storage. + * Items that don't fit are popped as entities near the lumberjack. + */ + private void depositItems(ServerLevel level, List drops) { + BlockEntity be = level.getBlockEntity(lumberjack.getHomePosition()); + if (be instanceof LumberjackBlockEntity storage) { + for (ItemStack drop : drops) { + ItemStack remainder = storage.insertItem(drop); + if (!remainder.isEmpty()) { + Block.popResource(level, lumberjack.blockPosition(), remainder); + } + } + } else { + for (ItemStack drop : drops) { + Block.popResource(level, lumberjack.blockPosition(), drop); + } + } + } + + // ------------------------------------------------------------------------- + // Tree scanning + // ------------------------------------------------------------------------- + + /** + * BFS from {@code base} to collect all connected log blocks into + * {@link #logsToChop}, then scans the log bounding box for associated + * leaf blocks into {@link #leavesToClear}. + */ + private void collectTreeBlocks(Level level, BlockPos base) { logsToChop.clear(); + leavesToClear.clear(); + Set visited = new HashSet<>(); Queue queue = new ArrayDeque<>(); queue.add(base); @@ -151,7 +214,6 @@ private void collectTreeLogs(Level level, BlockPos base) { logsToChop.add(current); - // Logs connect upward, diagonally-up, and horizontally (for large oak etc.) BlockPos[] neighbours = { current.above(), current.north(), current.south(), current.east(), current.west(), @@ -168,8 +230,39 @@ private void collectTreeLogs(Level level, BlockPos base) { } } - // Bottom logs first so the tree "falls" from the base logsToChop.sort(Comparator.comparingInt(BlockPos::getY)); + collectLeafBlocks(level); + } + + /** + * Scans a box around the collected logs (+ {@link #LEAF_MARGIN}) for + * leaf blocks and populates {@link #leavesToClear}. + */ + private void collectLeafBlocks(Level level) { + if (logsToChop.isEmpty()) return; + + int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, minZ = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE, maxZ = Integer.MIN_VALUE; + for (BlockPos p : logsToChop) { + if (p.getX() < minX) minX = p.getX(); + if (p.getY() < minY) minY = p.getY(); + if (p.getZ() < minZ) minZ = p.getZ(); + if (p.getX() > maxX) maxX = p.getX(); + if (p.getY() > maxY) maxY = p.getY(); + if (p.getZ() > maxZ) maxZ = p.getZ(); + } + + Set logSet = new HashSet<>(logsToChop); + for (int x = minX - LEAF_MARGIN; x <= maxX + LEAF_MARGIN; x++) { + for (int y = minY - 1; y <= maxY + LEAF_MARGIN; y++) { + for (int z = minZ - LEAF_MARGIN; z <= maxZ + LEAF_MARGIN; z++) { + BlockPos p = new BlockPos(x, y, z); + if (!logSet.contains(p) && level.getBlockState(p).is(BlockTags.LEAVES)) { + leavesToClear.add(p); + } + } + } + } } private Block saplingFor(Block log) { @@ -181,7 +274,6 @@ private Block saplingFor(Block log) { if (log == Blocks.DARK_OAK_LOG || log == Blocks.STRIPPED_DARK_OAK_LOG) return Blocks.DARK_OAK_SAPLING; if (log == Blocks.MANGROVE_LOG || log == Blocks.STRIPPED_MANGROVE_LOG) return Blocks.MANGROVE_PROPAGULE; if (log == Blocks.CHERRY_LOG || log == Blocks.STRIPPED_CHERRY_LOG) return Blocks.CHERRY_SAPLING; - if (log == Blocks.PALE_OAK_LOG || log == Blocks.STRIPPED_PALE_OAK_LOG) return Blocks.PALE_OAK_SAPLING; return Blocks.OAK_SAPLING; } } diff --git a/src/main/java/com/hardworkers/hardworkers/entity/ai/CollectItemsGoal.java b/src/main/java/com/hardworkers/hardworkers/entity/ai/CollectItemsGoal.java new file mode 100644 index 0000000..a7eb2e8 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/ai/CollectItemsGoal.java @@ -0,0 +1,209 @@ +package com.hardworkers.hardworkers.entity.ai; + +import com.hardworkers.hardworkers.blockentity.FarmerBlockEntity; +import com.hardworkers.hardworkers.blockentity.LumberjackBlockEntity; +import com.hardworkers.hardworkers.blockentity.MinerBlockEntity; +import com.hardworkers.hardworkers.blockentity.WarehouseBlockEntity; +import com.hardworkers.hardworkers.entity.WarehouseWorkerEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.items.IItemHandler; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +public class CollectItemsGoal extends Goal { + + private static final int SEARCH_RADIUS = 32; + private static final double REACH_SQ = 9.0; // 3-block reach + private static final int IDLE_COOLDOWN = 60; // ticks to wait when nothing found + + private final WarehouseWorkerEntity worker; + private BlockPos sourcePos = null; + private int cooldown = 0; + private BlockPos cachedSource = null; + private int fullScanCooldown = 0; + + public CollectItemsGoal(WarehouseWorkerEntity worker) { + this.worker = worker; + setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + BlockPos home = worker.getHomePosition(); + if (home == null || home.equals(BlockPos.ZERO)) return false; + + // Already carrying — must return to deposit + if (!worker.carrying.isEmpty()) return true; + + if (cooldown-- > 0) return false; + + // Skip if warehouse is full + WarehouseBlockEntity wbe = getWarehouse(home); + if (wbe == null || wbe.isFull()) { cooldown = IDLE_COOLDOWN; return false; } + + sourcePos = findSource(worker.level(), home); + if (sourcePos == null) { cooldown = IDLE_COOLDOWN; return false; } + return true; + } + + @Override + public boolean canContinueToUse() { + BlockPos home = worker.getHomePosition(); + return home != null && !home.equals(BlockPos.ZERO) + && (sourcePos != null || !worker.carrying.isEmpty()); + } + + @Override + public void start() { + if (!worker.carrying.isEmpty()) { + navigateTo(worker.getHomePosition()); + } else if (sourcePos != null) { + navigateTo(sourcePos); + } + } + + @Override + public void tick() { + BlockPos home = worker.getHomePosition(); + if (home == null) { stop(); return; } + + if (!worker.carrying.isEmpty()) { + // Return home and deposit + if (worker.blockPosition().distSqr(home) <= REACH_SQ) { + depositItems(home); + sourcePos = null; + cooldown = 20; + stop(); + } else if (!worker.getNavigation().isInProgress()) { + navigateTo(home); + } + } else if (sourcePos != null) { + // Head to source and collect + if (worker.blockPosition().distSqr(sourcePos) <= REACH_SQ) { + collectItems(); + if (worker.carrying.isEmpty()) { + // Source was empty — try again later + cachedSource = null; + sourcePos = null; + cooldown = IDLE_COOLDOWN; + stop(); + } else { + sourcePos = null; + navigateTo(home); + } + } else if (!worker.getNavigation().isInProgress()) { + navigateTo(sourcePos); + } + } else { + stop(); + } + } + + @Override + public void stop() { + sourcePos = null; + worker.getNavigation().stop(); + } + + private void navigateTo(BlockPos pos) { + worker.getNavigation().moveTo(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 1.0); + } + + private void collectItems() { + if (sourcePos == null) return; + BlockEntity be = worker.level().getBlockEntity(sourcePos); + IItemHandler handler = getItemHandler(be); + if (handler == null) { sourcePos = null; return; } + + int limit = worker.getStacksPerTrip(); + int collected = 0; + for (int slot = 0; slot < handler.getSlots() && collected < limit; slot++) { + ItemStack stack = handler.extractItem(slot, 64, false); + if (!stack.isEmpty()) { + worker.carrying.add(stack); + collected++; + } + } + cachedSource = sourcePos; + } + + private void depositItems(BlockPos home) { + WarehouseBlockEntity wbe = getWarehouse(home); + List overflow = new ArrayList<>(); + for (ItemStack stack : worker.carrying) { + if (wbe != null) { + ItemStack leftover = wbe.insertItem(stack); + if (!leftover.isEmpty()) overflow.add(leftover); + } else { + overflow.add(stack); + } + } + worker.carrying.clear(); + // Drop any overflow near the warehouse + for (ItemStack stack : overflow) { + worker.level().addFreshEntity(new ItemEntity( + worker.level(), + home.getX() + 0.5, home.getY() + 1.0, home.getZ() + 0.5, + stack)); + } + } + + private WarehouseBlockEntity getWarehouse(BlockPos pos) { + BlockEntity be = worker.level().getBlockEntity(pos); + return be instanceof WarehouseBlockEntity wbe ? wbe : null; + } + + private BlockPos findSource(Level level, BlockPos home) { + // Try cached source first (avoids full scan in steady state) + if (cachedSource != null) { + BlockEntity be = level.getBlockEntity(cachedSource); + if (isNonEmptySource(be)) return cachedSource; + cachedSource = null; + } + + if (fullScanCooldown-- > 0) return null; + fullScanCooldown = 40; + + BlockPos closest = null; + int closestDistSq = Integer.MAX_VALUE; + for (int dx = -SEARCH_RADIUS; dx <= SEARCH_RADIUS; dx++) { + for (int dy = -4; dy <= 4; dy++) { + for (int dz = -SEARCH_RADIUS; dz <= SEARCH_RADIUS; dz++) { + BlockPos p = home.offset(dx, dy, dz); + if (p.equals(home)) continue; + BlockEntity be = level.getBlockEntity(p); + if (isNonEmptySource(be)) { + int distSq = (int) home.distSqr(p); + if (distSq < closestDistSq) { + closestDistSq = distSq; + closest = p.immutable(); + } + } + } + } + } + cachedSource = closest; + return closest; + } + + private boolean isNonEmptySource(BlockEntity be) { + if (be instanceof LumberjackBlockEntity lbe) return !lbe.isEmpty(); + if (be instanceof MinerBlockEntity mbe) return !mbe.isEmpty(); + if (be instanceof FarmerBlockEntity fbe) return !fbe.isEmpty(); + return false; + } + + private IItemHandler getItemHandler(BlockEntity be) { + if (be instanceof LumberjackBlockEntity lbe) return lbe.getItemHandler(); + if (be instanceof MinerBlockEntity mbe) return mbe.getItemHandler(); + if (be instanceof FarmerBlockEntity fbe) return fbe.getItemHandler(); + return null; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/ai/FindTreeGoal.java b/src/main/java/com/hardworkers/hardworkers/entity/ai/FindTreeGoal.java index 6dd94bc..4ba45c3 100644 --- a/src/main/java/com/hardworkers/hardworkers/entity/ai/FindTreeGoal.java +++ b/src/main/java/com/hardworkers/hardworkers/entity/ai/FindTreeGoal.java @@ -1,14 +1,19 @@ package com.hardworkers.hardworkers.entity.ai; import com.hardworkers.hardworkers.HardWorkersConfig; +import com.hardworkers.hardworkers.blockentity.LumberjackBlockEntity; import com.hardworkers.hardworkers.entity.LumberjackEntity; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; /** * Scans the configurable area around the lumberjack's home block for the base @@ -30,6 +35,7 @@ public FindTreeGoal(LumberjackEntity lumberjack) { @Override public boolean canUse() { if (lumberjack.getTargetTree() != null) return false; + if (isStorageFull()) return false; if (searchCooldown > 0) { searchCooldown--; return false; @@ -37,6 +43,12 @@ public boolean canUse() { return true; } + private boolean isStorageFull() { + Level level = lumberjack.level(); + BlockEntity be = level.getBlockEntity(lumberjack.getHomePosition()); + return be instanceof LumberjackBlockEntity storage && storage.isFull(); + } + @Override public boolean canContinueToUse() { return false; // one-shot; ChopTreeGoal picks up from here @@ -57,6 +69,8 @@ private BlockPos findNearestTreeBase() { BlockPos home = lumberjack.getHomePosition(); int radius = HardWorkersConfig.LUMBERJACK_SEARCH_RADIUS.get(); + Set claimed = getClaimedTrees(level, home, radius); + BlockPos nearest = null; double nearestDistSq = Double.MAX_VALUE; @@ -64,8 +78,9 @@ private BlockPos findNearestTreeBase() { for (int z = -radius; z <= radius; z++) { for (int y = -radius / 2; y <= radius / 2; y++) { BlockPos candidate = home.offset(x, y, z); - BlockState state = level.getBlockState(candidate); + if (claimed.contains(candidate)) continue; + BlockState state = level.getBlockState(candidate); if (state.is(BlockTags.LOGS) && isBaseLog(level, candidate)) { double distSq = home.distSqr(candidate); if (distSq < nearestDistSq) { @@ -79,6 +94,18 @@ private BlockPos findNearestTreeBase() { return nearest; } + /** Returns the set of tree-base positions already claimed by other lumberjacks in the area. */ + private Set getClaimedTrees(Level level, BlockPos home, int radius) { + AABB searchBox = new AABB( + home.getX() - radius, home.getY() - radius / 2.0, home.getZ() - radius, + home.getX() + radius, home.getY() + radius / 2.0, home.getZ() + radius + ); + Set claimed = new HashSet<>(); + level.getEntitiesOfClass(LumberjackEntity.class, searchBox, e -> e != lumberjack) + .forEach(e -> { if (e.getTargetTree() != null) claimed.add(e.getTargetTree()); }); + return claimed; + } + /** A base log is a log block that does not have another log directly below it. */ private boolean isBaseLog(Level level, BlockPos pos) { return !level.getBlockState(pos.below()).is(BlockTags.LOGS); diff --git a/src/main/java/com/hardworkers/hardworkers/entity/ai/HarvestCropsGoal.java b/src/main/java/com/hardworkers/hardworkers/entity/ai/HarvestCropsGoal.java new file mode 100644 index 0000000..52e31e4 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/ai/HarvestCropsGoal.java @@ -0,0 +1,209 @@ +package com.hardworkers.hardworkers.entity.ai; + +import com.hardworkers.hardworkers.block.FarmerBlock; +import com.hardworkers.hardworkers.block.FarmerTier; +import com.hardworkers.hardworkers.blockentity.FarmerBlockEntity; +import com.hardworkers.hardworkers.entity.FarmerEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CocoaBlock; +import net.minecraft.world.level.block.CropBlock; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.SweetBerryBushBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.IntegerProperty; + +import java.util.EnumSet; +import java.util.List; + +/** + * Scans the 5×5 area around the farmer's home block for mature crops, + * walks to each one, harvests it, replants it (resetting the block to age 0 + * so the stem/plant remains), and deposits the drops into storage. + * + * Supported crop types: + * CropBlock – wheat, carrots, potatoes, beetroot + * NetherWartBlock – nether wart + * CocoaBlock – cocoa beans (facing preserved on replant) + * SweetBerryBushBlock – sweet berries (set to age 1 on replant) + * Melon / Pumpkin – fruit block is removed; stem stays to regrow + */ +public class HarvestCropsGoal extends Goal { + + private static final int FARM_RADIUS = 2; // 5×5 area + private static final double REACH_SQ = 6.25; // 2.5-block reach + private static final int SCAN_Y_MIN = -1; + private static final int SCAN_Y_MAX = 3; + + private final FarmerEntity farmer; + private BlockPos targetCrop = null; + private int harvestTimer = 0; + private int searchCooldown = 0; + + public HarvestCropsGoal(FarmerEntity farmer) { + this.farmer = farmer; + setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + if (isStorageFull()) return false; + if (searchCooldown > 0) { searchCooldown--; return false; } + targetCrop = findMatureCrop(); + return targetCrop != null; + } + + @Override + public boolean canContinueToUse() { + return targetCrop != null && !isStorageFull(); + } + + @Override + public void start() { + harvestTimer = 0; + navigateTo(targetCrop); + } + + @Override + public void stop() { + targetCrop = null; + harvestTimer = 0; + farmer.getNavigation().stop(); + } + + @Override + public void tick() { + if (targetCrop == null) return; + + // Re-validate: another farmer (or random decay) may have cleared it + if (!isMatureCrop(farmer.level().getBlockState(targetCrop))) { + targetCrop = findMatureCrop(); + if (targetCrop == null) { searchCooldown = 40; return; } + } + + farmer.getLookControl().setLookAt( + targetCrop.getX() + 0.5, targetCrop.getY() + 0.5, targetCrop.getZ() + 0.5); + + double distSq = farmer.distanceToSqr( + targetCrop.getX() + 0.5, targetCrop.getY() + 0.5, targetCrop.getZ() + 0.5); + + if (distSq > REACH_SQ) { + // Navigate to the farmland tile below the crop so the entity walks on ground + navigateTo(targetCrop); + return; + } + + harvestTimer++; + if (harvestTimer < harvestInterval()) return; + harvestTimer = 0; + + harvest(targetCrop); + + // Find the next crop immediately + targetCrop = findMatureCrop(); + if (targetCrop == null) searchCooldown = 40; + } + + // ------------------------------------------------------------------------- + + private void harvest(BlockPos pos) { + Level level = farmer.level(); + if (!(level instanceof ServerLevel serverLevel)) return; + + BlockState state = serverLevel.getBlockState(pos); + if (!isMatureCrop(state)) return; + + Block block = state.getBlock(); + List drops = Block.getDrops(state, serverLevel, pos, null); + + // Replant by resetting to the youngest growth stage + if (block instanceof CropBlock crop) { + serverLevel.setBlock(pos, crop.defaultBlockState(), Block.UPDATE_ALL); + } else if (block instanceof NetherWartBlock) { + serverLevel.setBlock(pos, Blocks.NETHER_WART.defaultBlockState(), Block.UPDATE_ALL); + } else if (block instanceof CocoaBlock) { + // Keep the attached facing when replanting + serverLevel.setBlock(pos, state.setValue(CocoaBlock.AGE, 0), Block.UPDATE_ALL); + } else if (block instanceof SweetBerryBushBlock) { + // Age 1 = regrowth stage (age 0 is the initial tiny sprout) + serverLevel.setBlock(pos, state.setValue(SweetBerryBushBlock.AGE, 1), Block.UPDATE_ALL); + } else { + // Melon / pumpkin — just remove the fruit; stem regrows on its own + serverLevel.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + } + + serverLevel.levelEvent(2001, pos, Block.getId(state)); + depositItems(serverLevel, drops); + } + + private BlockPos findMatureCrop() { + Level level = farmer.level(); + BlockPos home = farmer.getHomePosition(); + + BlockPos nearest = null; + double nearestDistSq = Double.MAX_VALUE; + + for (int dx = -FARM_RADIUS; dx <= FARM_RADIUS; dx++) { + for (int dz = -FARM_RADIUS; dz <= FARM_RADIUS; dz++) { + for (int dy = SCAN_Y_MIN; dy <= SCAN_Y_MAX; dy++) { + BlockPos candidate = home.offset(dx, dy, dz); + if (isMatureCrop(level.getBlockState(candidate))) { + double distSq = home.distSqr(candidate); + if (distSq < nearestDistSq) { + nearestDistSq = distSq; + nearest = candidate; + } + } + } + } + } + return nearest; + } + + private boolean isMatureCrop(BlockState state) { + Block block = state.getBlock(); + if (block instanceof CropBlock crop) return crop.isMaxAge(state); + if (block instanceof NetherWartBlock) return state.getValue(NetherWartBlock.AGE) == 3; + if (block instanceof CocoaBlock) return state.getValue(CocoaBlock.AGE) == 2; + if (block instanceof SweetBerryBushBlock) return state.getValue(SweetBerryBushBlock.AGE) == 3; + if (block == Blocks.MELON || block == Blocks.PUMPKIN) return true; + return false; + } + + private void navigateTo(BlockPos cropPos) { + // Walk to the tile at the crop's Y level (entity walks on same Y as crop for tall crops, + // or one below for standard crops; navigator handles the adjustment) + farmer.getNavigation().moveTo(cropPos.getX() + 0.5, cropPos.getY(), cropPos.getZ() + 0.5, 0.9); + } + + private int harvestInterval() { + BlockState homeState = farmer.level().getBlockState(farmer.getHomePosition()); + if (homeState.getBlock() instanceof FarmerBlock fb) return fb.getTier().harvestInterval; + return 30; + } + + private boolean isStorageFull() { + BlockEntity be = farmer.level().getBlockEntity(farmer.getHomePosition()); + return be instanceof FarmerBlockEntity storage && storage.isFull(); + } + + private void depositItems(ServerLevel level, List drops) { + BlockEntity be = level.getBlockEntity(farmer.getHomePosition()); + if (be instanceof FarmerBlockEntity storage) { + for (ItemStack drop : drops) { + ItemStack remainder = storage.insertItem(drop); + if (!remainder.isEmpty()) { + Block.popResource(level, farmer.blockPosition(), remainder); + } + } + } else { + drops.forEach(d -> Block.popResource(level, farmer.blockPosition(), d)); + } + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/ai/MineForwardGoal.java b/src/main/java/com/hardworkers/hardworkers/entity/ai/MineForwardGoal.java new file mode 100644 index 0000000..1ed6fdf --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/ai/MineForwardGoal.java @@ -0,0 +1,166 @@ +package com.hardworkers.hardworkers.entity.ai; + +import com.hardworkers.hardworkers.block.MinerBlock; +import com.hardworkers.hardworkers.block.MinerTier; +import com.hardworkers.hardworkers.blockentity.MinerBlockEntity; +import com.hardworkers.hardworkers.entity.MinerEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.EnumSet; +import java.util.List; + +/** + * Mines a 3-block-tall (Y, Y+1, Y+2) tunnel in the direction the miner block + * faces, up to 64 blocks deep. One block is mined per interval; the current + * depth is saved in the entity so progress survives world restarts. + * + * Tier capability (blocks in the path that need a higher tier are skipped): + * WOOD – no NEEDS_STONE_TOOL, NEEDS_IRON_TOOL, or NEEDS_DIAMOND_TOOL blocks + * STONE – no NEEDS_IRON_TOOL or NEEDS_DIAMOND_TOOL blocks + * IRON – no NEEDS_DIAMOND_TOOL blocks + * DIAMOND / NETHERITE – mines everything (except bedrock) + */ +public class MineForwardGoal extends Goal { + + public static final int MAX_DEPTH = 64; + public static final int TUNNEL_HEIGHT = 3; + + private final MinerEntity miner; + private int mineTimer = 0; + + public MineForwardGoal(MinerEntity miner) { + this.miner = miner; + setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + return miner.getCurrentDepth() <= MAX_DEPTH && !isStorageFull(); + } + + @Override + public boolean canContinueToUse() { + return miner.getCurrentDepth() <= MAX_DEPTH; + } + + @Override + public void stop() { + mineTimer = 0; + miner.getNavigation().stop(); + } + + @Override + public void tick() { + if (!(miner.level() instanceof ServerLevel serverLevel)) return; + + int depth = miner.getCurrentDepth(); + if (depth > MAX_DEPTH) return; + + Direction facing = getHomeFacing(); + if (facing == null) return; + + BlockPos homePos = miner.getHomePosition(); + // Mine behind the block (opposite of FACING so the drill-face points toward the player) + BlockPos facePos = homePos.relative(facing.getOpposite(), depth); + + // Walk toward the current mining face and look at it + miner.getNavigation().moveTo(facePos.getX() + 0.5, facePos.getY(), facePos.getZ() + 0.5, 0.85); + miner.getLookControl().setLookAt(facePos.getX() + 0.5, facePos.getY() + 1.0, facePos.getZ() + 0.5); + + if (isStorageFull()) return; + + mineTimer++; + if (mineTimer < mineInterval()) return; + mineTimer = 0; + + // Find and mine the first block at this depth that needs mining + for (int h = 0; h < TUNNEL_HEIGHT; h++) { + BlockPos minePos = facePos.above(h); + BlockState state = serverLevel.getBlockState(minePos); + + if (!needsMining(state)) continue; + + miner.getLookControl().setLookAt(minePos.getX() + 0.5, minePos.getY() + 0.5, minePos.getZ() + 0.5); + List drops = Block.getDrops(state, serverLevel, minePos, null); + serverLevel.setBlock(minePos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + serverLevel.levelEvent(2001, minePos, Block.getId(state)); + depositItems(serverLevel, drops); + return; // one block per interval + } + + // All three heights at this depth are clear (air, bedrock, or tier-restricted) → advance + miner.setCurrentDepth(depth + 1); + } + + // ------------------------------------------------------------------------- + + /** + * Returns true if this block should be mined (not air, not bedrock, not a + * liquid, and within the tier's capability). + */ + private boolean needsMining(BlockState state) { + if (state.isAir()) return false; + if (state.is(Blocks.BEDROCK)) return false; + if (state.is(Blocks.WATER) || state.is(Blocks.LAVA)) return false; + return canMine(state); + } + + /** Returns true if the current tier can break this block. */ + private boolean canMine(BlockState state) { + return switch (getHomeTier()) { + case WOOD -> !state.is(BlockTags.NEEDS_STONE_TOOL) + && !state.is(BlockTags.NEEDS_IRON_TOOL) + && !state.is(BlockTags.NEEDS_DIAMOND_TOOL); + case STONE -> !state.is(BlockTags.NEEDS_IRON_TOOL) + && !state.is(BlockTags.NEEDS_DIAMOND_TOOL); + case IRON -> !state.is(BlockTags.NEEDS_DIAMOND_TOOL); + case DIAMOND, NETHERITE -> true; + }; + } + + private MinerTier getHomeTier() { + BlockState homeState = miner.level().getBlockState(miner.getHomePosition()); + if (homeState.getBlock() instanceof MinerBlock mb) return mb.getTier(); + return MinerTier.NETHERITE; + } + + private Direction getHomeFacing() { + BlockState homeState = miner.level().getBlockState(miner.getHomePosition()); + if (homeState.hasProperty(MinerBlock.FACING)) return homeState.getValue(MinerBlock.FACING); + return null; + } + + private int mineInterval() { + return getHomeTier().mineInterval; + } + + private boolean isStorageFull() { + BlockEntity be = miner.level().getBlockEntity(miner.getHomePosition()); + return be instanceof MinerBlockEntity storage && storage.isFull(); + } + + private void depositItems(ServerLevel level, List drops) { + BlockEntity be = level.getBlockEntity(miner.getHomePosition()); + if (be instanceof MinerBlockEntity storage) { + for (ItemStack drop : drops) { + ItemStack remainder = storage.insertItem(drop); + if (!remainder.isEmpty()) { + Block.popResource(level, miner.blockPosition(), remainder); + } + } + } else { + for (ItemStack drop : drops) { + Block.popResource(level, miner.blockPosition(), drop); + } + } + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/client/FarmerRenderer.java b/src/main/java/com/hardworkers/hardworkers/entity/client/FarmerRenderer.java new file mode 100644 index 0000000..ed9923a --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/client/FarmerRenderer.java @@ -0,0 +1,25 @@ +package com.hardworkers.hardworkers.entity.client; + +import com.hardworkers.hardworkers.entity.FarmerEntity; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.resources.ResourceLocation; + +public class FarmerRenderer extends HumanoidMobRenderer> { + + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath("hardworkers", "textures/entity/farmer.png"); + + public FarmerRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new HumanoidModel<>(ctx.bakeLayer(ModelLayers.PLAYER)), 0.5f); + addLayer(new ItemInHandLayer<>(this, ctx.getItemInHandRenderer())); + } + + @Override + public ResourceLocation getTextureLocation(FarmerEntity entity) { + return TEXTURE; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/entity/client/LumberjackRenderer.java b/src/main/java/com/hardworkers/hardworkers/entity/client/LumberjackRenderer.java index f054cec..6b322b3 100644 --- a/src/main/java/com/hardworkers/hardworkers/entity/client/LumberjackRenderer.java +++ b/src/main/java/com/hardworkers/hardworkers/entity/client/LumberjackRenderer.java @@ -5,6 +5,7 @@ import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; import net.minecraft.resources.ResourceLocation; public class LumberjackRenderer extends HumanoidMobRenderer> { @@ -13,7 +14,8 @@ public class LumberjackRenderer extends HumanoidMobRenderer(ctx.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), 0.5f); + super(ctx, new HumanoidModel<>(ctx.bakeLayer(ModelLayers.PLAYER)), 0.5f); + addLayer(new ItemInHandLayer<>(this, ctx.getItemInHandRenderer())); } @Override @@ -21,3 +23,4 @@ public ResourceLocation getTextureLocation(LumberjackEntity entity) { return TEXTURE; } } + diff --git a/src/main/java/com/hardworkers/hardworkers/entity/client/MinerRenderer.java b/src/main/java/com/hardworkers/hardworkers/entity/client/MinerRenderer.java new file mode 100644 index 0000000..b225453 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/client/MinerRenderer.java @@ -0,0 +1,26 @@ +package com.hardworkers.hardworkers.entity.client; + +import com.hardworkers.hardworkers.entity.MinerEntity; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.resources.ResourceLocation; + +public class MinerRenderer extends HumanoidMobRenderer> { + + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath("hardworkers", "textures/entity/miner.png"); + + public MinerRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new HumanoidModel<>(ctx.bakeLayer(ModelLayers.PLAYER)), 0.5f); + addLayer(new ItemInHandLayer<>(this, ctx.getItemInHandRenderer())); + } + + @Override + public ResourceLocation getTextureLocation(MinerEntity entity) { + return TEXTURE; + } +} + diff --git a/src/main/java/com/hardworkers/hardworkers/entity/client/WarehouseWorkerRenderer.java b/src/main/java/com/hardworkers/hardworkers/entity/client/WarehouseWorkerRenderer.java new file mode 100644 index 0000000..c1f4ba0 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/entity/client/WarehouseWorkerRenderer.java @@ -0,0 +1,24 @@ +package com.hardworkers.hardworkers.entity.client; + +import com.hardworkers.hardworkers.entity.WarehouseWorkerEntity; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; + +public class WarehouseWorkerRenderer extends HumanoidMobRenderer> { + + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath("hardworkers", "textures/entity/warehouse_worker.png"); + + public WarehouseWorkerRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new HumanoidModel<>(ctx.bakeLayer(ModelLayers.PLAYER)), 0.5f); + // No ItemInHandLayer — warehouse workers don't carry visible items + } + + @Override + public ResourceLocation getTextureLocation(WarehouseWorkerEntity entity) { + return TEXTURE; + } +} diff --git a/src/main/java/com/hardworkers/hardworkers/events/ModEventSubscriber.java b/src/main/java/com/hardworkers/hardworkers/events/ModEventSubscriber.java index aa3d176..fa79b86 100644 --- a/src/main/java/com/hardworkers/hardworkers/events/ModEventSubscriber.java +++ b/src/main/java/com/hardworkers/hardworkers/events/ModEventSubscriber.java @@ -1,12 +1,18 @@ package com.hardworkers.hardworkers.events; import com.hardworkers.hardworkers.HardWorkers; +import com.hardworkers.hardworkers.entity.FarmerEntity; import com.hardworkers.hardworkers.entity.LumberjackEntity; +import com.hardworkers.hardworkers.entity.MinerEntity; +import com.hardworkers.hardworkers.entity.WarehouseWorkerEntity; +import com.hardworkers.hardworkers.init.ModBlockEntities; import com.hardworkers.hardworkers.init.ModEntities; import com.hardworkers.hardworkers.init.ModItems; import net.minecraft.world.item.CreativeModeTabs; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; @@ -16,12 +22,58 @@ public class ModEventSubscriber { @SubscribeEvent public static void onEntityAttributeCreation(EntityAttributeCreationEvent event) { event.put(ModEntities.LUMBERJACK.get(), LumberjackEntity.createAttributes().build()); + event.put(ModEntities.MINER.get(), MinerEntity.createAttributes().build()); + event.put(ModEntities.FARMER.get(), FarmerEntity.createAttributes().build()); + event.put(ModEntities.WAREHOUSE_WORKER.get(), WarehouseWorkerEntity.createAttributes().build()); } @SubscribeEvent public static void onBuildCreativeTab(BuildCreativeModeTabContentsEvent event) { if (event.getTabKey() == CreativeModeTabs.FUNCTIONAL_BLOCKS) { - event.accept(ModItems.LUMBERJACK_BLOCK_ITEM); + event.accept(ModItems.LUMBERJACK_WOOD_ITEM); + event.accept(ModItems.LUMBERJACK_STONE_ITEM); + event.accept(ModItems.LUMBERJACK_IRON_ITEM); + event.accept(ModItems.LUMBERJACK_DIAMOND_ITEM); + event.accept(ModItems.LUMBERJACK_NETHERITE_ITEM); + event.accept(ModItems.MINER_WOOD_ITEM); + event.accept(ModItems.MINER_STONE_ITEM); + event.accept(ModItems.MINER_IRON_ITEM); + event.accept(ModItems.MINER_DIAMOND_ITEM); + event.accept(ModItems.MINER_NETHERITE_ITEM); + event.accept(ModItems.FARMER_WOOD_ITEM); + event.accept(ModItems.FARMER_STONE_ITEM); + event.accept(ModItems.FARMER_IRON_ITEM); + event.accept(ModItems.FARMER_DIAMOND_ITEM); + event.accept(ModItems.FARMER_NETHERITE_ITEM); + event.accept(ModItems.WAREHOUSE_WOOD_ITEM); + event.accept(ModItems.WAREHOUSE_STONE_ITEM); + event.accept(ModItems.WAREHOUSE_IRON_ITEM); + event.accept(ModItems.WAREHOUSE_DIAMOND_ITEM); + event.accept(ModItems.WAREHOUSE_NETHERITE_ITEM); } } + + @SubscribeEvent + public static void onRegisterCapabilities(RegisterCapabilitiesEvent event) { + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + ModBlockEntities.LUMBERJACK_BLOCK_ENTITY.get(), + (be, side) -> be.getItemHandler() + ); + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + ModBlockEntities.MINER_BLOCK_ENTITY.get(), + (be, side) -> be.getItemHandler() + ); + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + ModBlockEntities.FARMER_BLOCK_ENTITY.get(), + (be, side) -> be.getItemHandler() + ); + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + ModBlockEntities.WAREHOUSE_BLOCK_ENTITY.get(), + (be, side) -> be.getItemHandler() + ); + } } diff --git a/src/main/java/com/hardworkers/hardworkers/init/ModBlockEntities.java b/src/main/java/com/hardworkers/hardworkers/init/ModBlockEntities.java new file mode 100644 index 0000000..5d3b894 --- /dev/null +++ b/src/main/java/com/hardworkers/hardworkers/init/ModBlockEntities.java @@ -0,0 +1,66 @@ +package com.hardworkers.hardworkers.init; + +import com.hardworkers.hardworkers.HardWorkers; +import com.hardworkers.hardworkers.blockentity.FarmerBlockEntity; +import com.hardworkers.hardworkers.blockentity.LumberjackBlockEntity; +import com.hardworkers.hardworkers.blockentity.MinerBlockEntity; +import com.hardworkers.hardworkers.blockentity.WarehouseBlockEntity; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModBlockEntities { + + public static final DeferredRegister> BLOCK_ENTITY_TYPES = + DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, HardWorkers.MODID); + + public static final DeferredHolder, BlockEntityType> LUMBERJACK_BLOCK_ENTITY = + BLOCK_ENTITY_TYPES.register("lumberjack_block", () -> + BlockEntityType.Builder.of( + LumberjackBlockEntity::new, + ModBlocks.LUMBERJACK_WOOD.get(), + ModBlocks.LUMBERJACK_STONE.get(), + ModBlocks.LUMBERJACK_IRON.get(), + ModBlocks.LUMBERJACK_DIAMOND.get(), + ModBlocks.LUMBERJACK_NETHERITE.get() + ).build(null) + ); + + public static final DeferredHolder, BlockEntityType> MINER_BLOCK_ENTITY = + BLOCK_ENTITY_TYPES.register("miner_block", () -> + BlockEntityType.Builder.of( + MinerBlockEntity::new, + ModBlocks.MINER_WOOD.get(), + ModBlocks.MINER_STONE.get(), + ModBlocks.MINER_IRON.get(), + ModBlocks.MINER_DIAMOND.get(), + ModBlocks.MINER_NETHERITE.get() + ).build(null) + ); + + public static final DeferredHolder, BlockEntityType> FARMER_BLOCK_ENTITY = + BLOCK_ENTITY_TYPES.register("farmer_block", () -> + BlockEntityType.Builder.of( + FarmerBlockEntity::new, + ModBlocks.FARMER_WOOD.get(), + ModBlocks.FARMER_STONE.get(), + ModBlocks.FARMER_IRON.get(), + ModBlocks.FARMER_DIAMOND.get(), + ModBlocks.FARMER_NETHERITE.get() + ).build(null) + ); + + public static final DeferredHolder, BlockEntityType> WAREHOUSE_BLOCK_ENTITY = + BLOCK_ENTITY_TYPES.register("warehouse_block", () -> + BlockEntityType.Builder.of( + WarehouseBlockEntity::new, + ModBlocks.WAREHOUSE_WOOD.get(), + ModBlocks.WAREHOUSE_STONE.get(), + ModBlocks.WAREHOUSE_IRON.get(), + ModBlocks.WAREHOUSE_DIAMOND.get(), + ModBlocks.WAREHOUSE_NETHERITE.get() + ).build(null) + ); +} + diff --git a/src/main/java/com/hardworkers/hardworkers/init/ModBlocks.java b/src/main/java/com/hardworkers/hardworkers/init/ModBlocks.java index 8fa6482..07bc136 100644 --- a/src/main/java/com/hardworkers/hardworkers/init/ModBlocks.java +++ b/src/main/java/com/hardworkers/hardworkers/init/ModBlocks.java @@ -1,7 +1,15 @@ package com.hardworkers.hardworkers.init; import com.hardworkers.hardworkers.HardWorkers; +import com.hardworkers.hardworkers.block.FarmerBlock; +import com.hardworkers.hardworkers.block.FarmerTier; import com.hardworkers.hardworkers.block.LumberjackBlock; +import com.hardworkers.hardworkers.block.LumberjackTier; +import com.hardworkers.hardworkers.block.MinerBlock; +import com.hardworkers.hardworkers.block.MinerTier; +import com.hardworkers.hardworkers.block.WarehouseBlock; +import com.hardworkers.hardworkers.block.WarehouseTier; +import net.minecraft.world.level.material.MapColor; import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredRegister; @@ -9,6 +17,84 @@ public class ModBlocks { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(HardWorkers.MODID); - public static final DeferredBlock LUMBERJACK_BLOCK = - BLOCKS.register("lumberjack_block", LumberjackBlock::new); + public static final DeferredBlock LUMBERJACK_WOOD = + BLOCKS.register("lumberjack_wood", + () -> new LumberjackBlock(LumberjackTier.WOOD, LumberjackBlock.baseProperties(MapColor.WOOD))); + + public static final DeferredBlock LUMBERJACK_STONE = + BLOCKS.register("lumberjack_stone", + () -> new LumberjackBlock(LumberjackTier.STONE, LumberjackBlock.baseProperties(MapColor.STONE))); + + public static final DeferredBlock LUMBERJACK_IRON = + BLOCKS.register("lumberjack_iron", + () -> new LumberjackBlock(LumberjackTier.IRON, LumberjackBlock.baseProperties(MapColor.METAL))); + + public static final DeferredBlock LUMBERJACK_DIAMOND = + BLOCKS.register("lumberjack_diamond", + () -> new LumberjackBlock(LumberjackTier.DIAMOND, LumberjackBlock.baseProperties(MapColor.DIAMOND))); + + public static final DeferredBlock LUMBERJACK_NETHERITE = + BLOCKS.register("lumberjack_netherite", + () -> new LumberjackBlock(LumberjackTier.NETHERITE, LumberjackBlock.baseProperties(MapColor.COLOR_BLACK))); + + public static final DeferredBlock MINER_WOOD = + BLOCKS.register("miner_wood", + () -> new MinerBlock(MinerTier.WOOD, MinerBlock.baseProperties(MapColor.STONE))); + + public static final DeferredBlock MINER_STONE = + BLOCKS.register("miner_stone", + () -> new MinerBlock(MinerTier.STONE, MinerBlock.baseProperties(MapColor.STONE))); + + public static final DeferredBlock MINER_IRON = + BLOCKS.register("miner_iron", + () -> new MinerBlock(MinerTier.IRON, MinerBlock.baseProperties(MapColor.METAL))); + + public static final DeferredBlock MINER_DIAMOND = + BLOCKS.register("miner_diamond", + () -> new MinerBlock(MinerTier.DIAMOND, MinerBlock.baseProperties(MapColor.DIAMOND))); + + public static final DeferredBlock MINER_NETHERITE = + BLOCKS.register("miner_netherite", + () -> new MinerBlock(MinerTier.NETHERITE, MinerBlock.baseProperties(MapColor.COLOR_BLACK))); + + public static final DeferredBlock FARMER_WOOD = + BLOCKS.register("farmer_wood", + () -> new FarmerBlock(FarmerTier.WOOD, FarmerBlock.baseProperties(MapColor.PLANT))); + + public static final DeferredBlock FARMER_STONE = + BLOCKS.register("farmer_stone", + () -> new FarmerBlock(FarmerTier.STONE, FarmerBlock.baseProperties(MapColor.STONE))); + + public static final DeferredBlock FARMER_IRON = + BLOCKS.register("farmer_iron", + () -> new FarmerBlock(FarmerTier.IRON, FarmerBlock.baseProperties(MapColor.METAL))); + + public static final DeferredBlock FARMER_DIAMOND = + BLOCKS.register("farmer_diamond", + () -> new FarmerBlock(FarmerTier.DIAMOND, FarmerBlock.baseProperties(MapColor.DIAMOND))); + + public static final DeferredBlock FARMER_NETHERITE = + BLOCKS.register("farmer_netherite", + () -> new FarmerBlock(FarmerTier.NETHERITE, FarmerBlock.baseProperties(MapColor.COLOR_BLACK))); + + public static final DeferredBlock WAREHOUSE_WOOD = + BLOCKS.register("warehouse_wood", + () -> new WarehouseBlock(WarehouseTier.WOOD, WarehouseBlock.baseProperties(MapColor.WOOD))); + + public static final DeferredBlock WAREHOUSE_STONE = + BLOCKS.register("warehouse_stone", + () -> new WarehouseBlock(WarehouseTier.STONE, WarehouseBlock.baseProperties(MapColor.STONE))); + + public static final DeferredBlock WAREHOUSE_IRON = + BLOCKS.register("warehouse_iron", + () -> new WarehouseBlock(WarehouseTier.IRON, WarehouseBlock.baseProperties(MapColor.METAL))); + + public static final DeferredBlock WAREHOUSE_DIAMOND = + BLOCKS.register("warehouse_diamond", + () -> new WarehouseBlock(WarehouseTier.DIAMOND, WarehouseBlock.baseProperties(MapColor.DIAMOND))); + + public static final DeferredBlock WAREHOUSE_NETHERITE = + BLOCKS.register("warehouse_netherite", + () -> new WarehouseBlock(WarehouseTier.NETHERITE, WarehouseBlock.baseProperties(MapColor.COLOR_BLACK))); } + diff --git a/src/main/java/com/hardworkers/hardworkers/init/ModEntities.java b/src/main/java/com/hardworkers/hardworkers/init/ModEntities.java index 2639da7..8cbb444 100644 --- a/src/main/java/com/hardworkers/hardworkers/init/ModEntities.java +++ b/src/main/java/com/hardworkers/hardworkers/init/ModEntities.java @@ -1,7 +1,10 @@ package com.hardworkers.hardworkers.init; import com.hardworkers.hardworkers.HardWorkers; +import com.hardworkers.hardworkers.entity.FarmerEntity; import com.hardworkers.hardworkers.entity.LumberjackEntity; +import com.hardworkers.hardworkers.entity.MinerEntity; +import com.hardworkers.hardworkers.entity.WarehouseWorkerEntity; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; @@ -20,4 +23,29 @@ public class ModEntities { .clientTrackingRange(10) .build("lumberjack") ); + + public static final DeferredHolder, EntityType> MINER = + ENTITY_TYPES.register("miner", () -> + EntityType.Builder.of(MinerEntity::new, MobCategory.MISC) + .sized(0.6f, 1.95f) + .clientTrackingRange(80) + .build("miner") + ); + + public static final DeferredHolder, EntityType> FARMER = + ENTITY_TYPES.register("farmer", () -> + EntityType.Builder.of(FarmerEntity::new, MobCategory.MISC) + .sized(0.6f, 1.95f) + .clientTrackingRange(10) + .build("farmer") + ); + + public static final DeferredHolder, EntityType> WAREHOUSE_WORKER = + ENTITY_TYPES.register("warehouse_worker", () -> + EntityType.Builder.of(WarehouseWorkerEntity::new, MobCategory.MISC) + .sized(0.6f, 1.95f) + .clientTrackingRange(10) + .build("warehouse_worker") + ); } + diff --git a/src/main/java/com/hardworkers/hardworkers/init/ModItems.java b/src/main/java/com/hardworkers/hardworkers/init/ModItems.java index e96d0e9..d7ae5c0 100644 --- a/src/main/java/com/hardworkers/hardworkers/init/ModItems.java +++ b/src/main/java/com/hardworkers/hardworkers/init/ModItems.java @@ -9,6 +9,28 @@ public class ModItems { public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(HardWorkers.MODID); - public static final DeferredItem LUMBERJACK_BLOCK_ITEM = - ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_BLOCK); + public static final DeferredItem LUMBERJACK_WOOD_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_WOOD); + public static final DeferredItem LUMBERJACK_STONE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_STONE); + public static final DeferredItem LUMBERJACK_IRON_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_IRON); + public static final DeferredItem LUMBERJACK_DIAMOND_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_DIAMOND); + public static final DeferredItem LUMBERJACK_NETHERITE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.LUMBERJACK_NETHERITE); + + public static final DeferredItem MINER_WOOD_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.MINER_WOOD); + public static final DeferredItem MINER_STONE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.MINER_STONE); + public static final DeferredItem MINER_IRON_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.MINER_IRON); + public static final DeferredItem MINER_DIAMOND_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.MINER_DIAMOND); + public static final DeferredItem MINER_NETHERITE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.MINER_NETHERITE); + + public static final DeferredItem FARMER_WOOD_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.FARMER_WOOD); + public static final DeferredItem FARMER_STONE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.FARMER_STONE); + public static final DeferredItem FARMER_IRON_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.FARMER_IRON); + public static final DeferredItem FARMER_DIAMOND_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.FARMER_DIAMOND); + public static final DeferredItem FARMER_NETHERITE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.FARMER_NETHERITE); + + public static final DeferredItem WAREHOUSE_WOOD_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.WAREHOUSE_WOOD); + public static final DeferredItem WAREHOUSE_STONE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.WAREHOUSE_STONE); + public static final DeferredItem WAREHOUSE_IRON_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.WAREHOUSE_IRON); + public static final DeferredItem WAREHOUSE_DIAMOND_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.WAREHOUSE_DIAMOND); + public static final DeferredItem WAREHOUSE_NETHERITE_ITEM = ITEMS.registerSimpleBlockItem(ModBlocks.WAREHOUSE_NETHERITE); } + diff --git a/src/main/resources/assets/hardworkers/blockstates/farmer_diamond.json b/src/main/resources/assets/hardworkers/blockstates/farmer_diamond.json new file mode 100644 index 0000000..181dee8 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/farmer_diamond.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/farmer_diamond" }, + "facing=east": { "model": "hardworkers:block/farmer_diamond", "y": 90 }, + "facing=south": { "model": "hardworkers:block/farmer_diamond", "y": 180 }, + "facing=west": { "model": "hardworkers:block/farmer_diamond", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/farmer_iron.json b/src/main/resources/assets/hardworkers/blockstates/farmer_iron.json new file mode 100644 index 0000000..bb5ec1c --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/farmer_iron.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/farmer_iron" }, + "facing=east": { "model": "hardworkers:block/farmer_iron", "y": 90 }, + "facing=south": { "model": "hardworkers:block/farmer_iron", "y": 180 }, + "facing=west": { "model": "hardworkers:block/farmer_iron", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/farmer_netherite.json b/src/main/resources/assets/hardworkers/blockstates/farmer_netherite.json new file mode 100644 index 0000000..e94297c --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/farmer_netherite.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/farmer_netherite" }, + "facing=east": { "model": "hardworkers:block/farmer_netherite", "y": 90 }, + "facing=south": { "model": "hardworkers:block/farmer_netherite", "y": 180 }, + "facing=west": { "model": "hardworkers:block/farmer_netherite", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/farmer_stone.json b/src/main/resources/assets/hardworkers/blockstates/farmer_stone.json new file mode 100644 index 0000000..6881f8a --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/farmer_stone.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/farmer_stone" }, + "facing=east": { "model": "hardworkers:block/farmer_stone", "y": 90 }, + "facing=south": { "model": "hardworkers:block/farmer_stone", "y": 180 }, + "facing=west": { "model": "hardworkers:block/farmer_stone", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/farmer_wood.json b/src/main/resources/assets/hardworkers/blockstates/farmer_wood.json new file mode 100644 index 0000000..0972c6a --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/farmer_wood.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/farmer_wood" }, + "facing=east": { "model": "hardworkers:block/farmer_wood", "y": 90 }, + "facing=south": { "model": "hardworkers:block/farmer_wood", "y": 180 }, + "facing=west": { "model": "hardworkers:block/farmer_wood", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_block.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_block.json deleted file mode 100644 index a1d4a9a..0000000 --- a/src/main/resources/assets/hardworkers/blockstates/lumberjack_block.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "hardworkers:block/lumberjack_block" - } - } -} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_diamond.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_diamond.json new file mode 100644 index 0000000..395444a --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/lumberjack_diamond.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/lumberjack_diamond" }, + "facing=east": { "model": "hardworkers:block/lumberjack_diamond", "y": 90 }, + "facing=south": { "model": "hardworkers:block/lumberjack_diamond", "y": 180 }, + "facing=west": { "model": "hardworkers:block/lumberjack_diamond", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_iron.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_iron.json new file mode 100644 index 0000000..6d98702 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/lumberjack_iron.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/lumberjack_iron" }, + "facing=east": { "model": "hardworkers:block/lumberjack_iron", "y": 90 }, + "facing=south": { "model": "hardworkers:block/lumberjack_iron", "y": 180 }, + "facing=west": { "model": "hardworkers:block/lumberjack_iron", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_netherite.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_netherite.json new file mode 100644 index 0000000..e9f0116 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/lumberjack_netherite.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/lumberjack_netherite" }, + "facing=east": { "model": "hardworkers:block/lumberjack_netherite", "y": 90 }, + "facing=south": { "model": "hardworkers:block/lumberjack_netherite", "y": 180 }, + "facing=west": { "model": "hardworkers:block/lumberjack_netherite", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_stone.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_stone.json new file mode 100644 index 0000000..3993453 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/lumberjack_stone.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/lumberjack_stone" }, + "facing=east": { "model": "hardworkers:block/lumberjack_stone", "y": 90 }, + "facing=south": { "model": "hardworkers:block/lumberjack_stone", "y": 180 }, + "facing=west": { "model": "hardworkers:block/lumberjack_stone", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/lumberjack_wood.json b/src/main/resources/assets/hardworkers/blockstates/lumberjack_wood.json new file mode 100644 index 0000000..0380024 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/lumberjack_wood.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/lumberjack_wood" }, + "facing=east": { "model": "hardworkers:block/lumberjack_wood", "y": 90 }, + "facing=south": { "model": "hardworkers:block/lumberjack_wood", "y": 180 }, + "facing=west": { "model": "hardworkers:block/lumberjack_wood", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/miner_diamond.json b/src/main/resources/assets/hardworkers/blockstates/miner_diamond.json new file mode 100644 index 0000000..95ffa8a --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/miner_diamond.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/miner_diamond" }, + "facing=east": { "model": "hardworkers:block/miner_diamond", "y": 90 }, + "facing=south": { "model": "hardworkers:block/miner_diamond", "y": 180 }, + "facing=west": { "model": "hardworkers:block/miner_diamond", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/miner_iron.json b/src/main/resources/assets/hardworkers/blockstates/miner_iron.json new file mode 100644 index 0000000..df45356 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/miner_iron.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/miner_iron" }, + "facing=east": { "model": "hardworkers:block/miner_iron", "y": 90 }, + "facing=south": { "model": "hardworkers:block/miner_iron", "y": 180 }, + "facing=west": { "model": "hardworkers:block/miner_iron", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/miner_netherite.json b/src/main/resources/assets/hardworkers/blockstates/miner_netherite.json new file mode 100644 index 0000000..f723b11 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/miner_netherite.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/miner_netherite" }, + "facing=east": { "model": "hardworkers:block/miner_netherite", "y": 90 }, + "facing=south": { "model": "hardworkers:block/miner_netherite", "y": 180 }, + "facing=west": { "model": "hardworkers:block/miner_netherite", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/miner_stone.json b/src/main/resources/assets/hardworkers/blockstates/miner_stone.json new file mode 100644 index 0000000..b6c9587 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/miner_stone.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/miner_stone" }, + "facing=east": { "model": "hardworkers:block/miner_stone", "y": 90 }, + "facing=south": { "model": "hardworkers:block/miner_stone", "y": 180 }, + "facing=west": { "model": "hardworkers:block/miner_stone", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/miner_wood.json b/src/main/resources/assets/hardworkers/blockstates/miner_wood.json new file mode 100644 index 0000000..fbcc002 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/miner_wood.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/miner_wood" }, + "facing=east": { "model": "hardworkers:block/miner_wood", "y": 90 }, + "facing=south": { "model": "hardworkers:block/miner_wood", "y": 180 }, + "facing=west": { "model": "hardworkers:block/miner_wood", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/warehouse_diamond.json b/src/main/resources/assets/hardworkers/blockstates/warehouse_diamond.json new file mode 100644 index 0000000..853e373 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/warehouse_diamond.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/warehouse_diamond" }, + "facing=south": { "model": "hardworkers:block/warehouse_diamond", "y": 180 }, + "facing=east": { "model": "hardworkers:block/warehouse_diamond", "y": 90 }, + "facing=west": { "model": "hardworkers:block/warehouse_diamond", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/warehouse_iron.json b/src/main/resources/assets/hardworkers/blockstates/warehouse_iron.json new file mode 100644 index 0000000..4da8fff --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/warehouse_iron.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/warehouse_iron" }, + "facing=south": { "model": "hardworkers:block/warehouse_iron", "y": 180 }, + "facing=east": { "model": "hardworkers:block/warehouse_iron", "y": 90 }, + "facing=west": { "model": "hardworkers:block/warehouse_iron", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/warehouse_netherite.json b/src/main/resources/assets/hardworkers/blockstates/warehouse_netherite.json new file mode 100644 index 0000000..bd2d59d --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/warehouse_netherite.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/warehouse_netherite" }, + "facing=south": { "model": "hardworkers:block/warehouse_netherite", "y": 180 }, + "facing=east": { "model": "hardworkers:block/warehouse_netherite", "y": 90 }, + "facing=west": { "model": "hardworkers:block/warehouse_netherite", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/warehouse_stone.json b/src/main/resources/assets/hardworkers/blockstates/warehouse_stone.json new file mode 100644 index 0000000..3dbdc83 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/warehouse_stone.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/warehouse_stone" }, + "facing=south": { "model": "hardworkers:block/warehouse_stone", "y": 180 }, + "facing=east": { "model": "hardworkers:block/warehouse_stone", "y": 90 }, + "facing=west": { "model": "hardworkers:block/warehouse_stone", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/blockstates/warehouse_wood.json b/src/main/resources/assets/hardworkers/blockstates/warehouse_wood.json new file mode 100644 index 0000000..a7aa495 --- /dev/null +++ b/src/main/resources/assets/hardworkers/blockstates/warehouse_wood.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "hardworkers:block/warehouse_wood" }, + "facing=south": { "model": "hardworkers:block/warehouse_wood", "y": 180 }, + "facing=east": { "model": "hardworkers:block/warehouse_wood", "y": 90 }, + "facing=west": { "model": "hardworkers:block/warehouse_wood", "y": 270 } + } +} diff --git a/src/main/resources/assets/hardworkers/lang/en_us.json b/src/main/resources/assets/hardworkers/lang/en_us.json index 2170903..c369a59 100644 --- a/src/main/resources/assets/hardworkers/lang/en_us.json +++ b/src/main/resources/assets/hardworkers/lang/en_us.json @@ -1,4 +1,31 @@ { - "block.hardworkers.lumberjack_block": "Lumberjack Block", - "entity.hardworkers.lumberjack": "Lumberjack" + "block.hardworkers.lumberjack_wood": "Lumberjack Block (Wood)", + "block.hardworkers.lumberjack_stone": "Lumberjack Block (Stone)", + "block.hardworkers.lumberjack_iron": "Lumberjack Block (Iron)", + "block.hardworkers.lumberjack_diamond": "Lumberjack Block (Diamond)", + "block.hardworkers.lumberjack_netherite": "Lumberjack Block (Netherite)", + "entity.hardworkers.lumberjack": "Lumberjack", + + "block.hardworkers.miner_wood": "Miner Block (Wood)", + "block.hardworkers.miner_stone": "Miner Block (Stone)", + "block.hardworkers.miner_iron": "Miner Block (Iron)", + "block.hardworkers.miner_diamond": "Miner Block (Diamond)", + "block.hardworkers.miner_netherite": "Miner Block (Netherite)", + "entity.hardworkers.miner": "Miner", + + "block.hardworkers.farmer_wood": "Farmer Block (Wood)", + "block.hardworkers.farmer_stone": "Farmer Block (Stone)", + "block.hardworkers.farmer_iron": "Farmer Block (Iron)", + "block.hardworkers.farmer_diamond": "Farmer Block (Diamond)", + "block.hardworkers.farmer_netherite": "Farmer Block (Netherite)", + "entity.hardworkers.farmer": "Farmer", + + "block.hardworkers.warehouse_wood": "Warehouse Block (Wood)", + "block.hardworkers.warehouse_stone": "Warehouse Block (Stone)", + "block.hardworkers.warehouse_iron": "Warehouse Block (Iron)", + "block.hardworkers.warehouse_diamond": "Warehouse Block (Diamond)", + "block.hardworkers.warehouse_netherite": "Warehouse Block (Netherite)", + "entity.hardworkers.warehouse_worker": "Warehouse Worker", + + "container.hardworkers.warehouse": "Warehouse Storage" } diff --git a/src/main/resources/assets/hardworkers/models/block/farmer_diamond.json b/src/main/resources/assets/hardworkers/models/block/farmer_diamond.json new file mode 100644 index 0000000..68919fe --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/farmer_diamond.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/farmer_diamond_front", + "up": "hardworkers:block/farmer_diamond_top", + "down": "hardworkers:block/farmer_diamond_bottom", + "north": "hardworkers:block/farmer_diamond_front", + "south": "hardworkers:block/farmer_diamond_back", + "east": "hardworkers:block/farmer_diamond_side", + "west": "hardworkers:block/farmer_diamond_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/farmer_iron.json b/src/main/resources/assets/hardworkers/models/block/farmer_iron.json new file mode 100644 index 0000000..a628a1f --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/farmer_iron.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/farmer_iron_front", + "up": "hardworkers:block/farmer_iron_top", + "down": "hardworkers:block/farmer_iron_bottom", + "north": "hardworkers:block/farmer_iron_front", + "south": "hardworkers:block/farmer_iron_back", + "east": "hardworkers:block/farmer_iron_side", + "west": "hardworkers:block/farmer_iron_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/farmer_netherite.json b/src/main/resources/assets/hardworkers/models/block/farmer_netherite.json new file mode 100644 index 0000000..d1d7378 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/farmer_netherite.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/farmer_netherite_front", + "up": "hardworkers:block/farmer_netherite_top", + "down": "hardworkers:block/farmer_netherite_bottom", + "north": "hardworkers:block/farmer_netherite_front", + "south": "hardworkers:block/farmer_netherite_back", + "east": "hardworkers:block/farmer_netherite_side", + "west": "hardworkers:block/farmer_netherite_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/farmer_stone.json b/src/main/resources/assets/hardworkers/models/block/farmer_stone.json new file mode 100644 index 0000000..e24b574 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/farmer_stone.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/farmer_stone_front", + "up": "hardworkers:block/farmer_stone_top", + "down": "hardworkers:block/farmer_stone_bottom", + "north": "hardworkers:block/farmer_stone_front", + "south": "hardworkers:block/farmer_stone_back", + "east": "hardworkers:block/farmer_stone_side", + "west": "hardworkers:block/farmer_stone_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/farmer_wood.json b/src/main/resources/assets/hardworkers/models/block/farmer_wood.json new file mode 100644 index 0000000..b48f4f9 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/farmer_wood.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/farmer_wood_front", + "up": "hardworkers:block/farmer_wood_top", + "down": "hardworkers:block/farmer_wood_bottom", + "north": "hardworkers:block/farmer_wood_front", + "south": "hardworkers:block/farmer_wood_back", + "east": "hardworkers:block/farmer_wood_side", + "west": "hardworkers:block/farmer_wood_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_block.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_block.json deleted file mode 100644 index 56c1209..0000000 --- a/src/main/resources/assets/hardworkers/models/block/lumberjack_block.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "hardworkers:block/lumberjack_block" - } -} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_diamond.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_diamond.json new file mode 100644 index 0000000..75a3d49 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/lumberjack_diamond.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/lumberjack_diamond_front", + "up": "hardworkers:block/lumberjack_diamond_top", + "down": "hardworkers:block/lumberjack_diamond_bottom", + "north": "hardworkers:block/lumberjack_diamond_front", + "south": "hardworkers:block/lumberjack_diamond_back", + "east": "hardworkers:block/lumberjack_diamond_side", + "west": "hardworkers:block/lumberjack_diamond_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_iron.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_iron.json new file mode 100644 index 0000000..8af24bd --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/lumberjack_iron.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/lumberjack_iron_front", + "up": "hardworkers:block/lumberjack_iron_top", + "down": "hardworkers:block/lumberjack_iron_bottom", + "north": "hardworkers:block/lumberjack_iron_front", + "south": "hardworkers:block/lumberjack_iron_back", + "east": "hardworkers:block/lumberjack_iron_side", + "west": "hardworkers:block/lumberjack_iron_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_netherite.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_netherite.json new file mode 100644 index 0000000..f9108c9 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/lumberjack_netherite.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/lumberjack_netherite_front", + "up": "hardworkers:block/lumberjack_netherite_top", + "down": "hardworkers:block/lumberjack_netherite_bottom", + "north": "hardworkers:block/lumberjack_netherite_front", + "south": "hardworkers:block/lumberjack_netherite_back", + "east": "hardworkers:block/lumberjack_netherite_side", + "west": "hardworkers:block/lumberjack_netherite_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_stone.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_stone.json new file mode 100644 index 0000000..dc6abdd --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/lumberjack_stone.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/lumberjack_stone_front", + "up": "hardworkers:block/lumberjack_stone_top", + "down": "hardworkers:block/lumberjack_stone_bottom", + "north": "hardworkers:block/lumberjack_stone_front", + "south": "hardworkers:block/lumberjack_stone_back", + "east": "hardworkers:block/lumberjack_stone_side", + "west": "hardworkers:block/lumberjack_stone_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/lumberjack_wood.json b/src/main/resources/assets/hardworkers/models/block/lumberjack_wood.json new file mode 100644 index 0000000..97dc63d --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/lumberjack_wood.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/lumberjack_wood_front", + "up": "hardworkers:block/lumberjack_wood_top", + "down": "hardworkers:block/lumberjack_wood_bottom", + "north": "hardworkers:block/lumberjack_wood_front", + "south": "hardworkers:block/lumberjack_wood_back", + "east": "hardworkers:block/lumberjack_wood_side", + "west": "hardworkers:block/lumberjack_wood_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/miner_diamond.json b/src/main/resources/assets/hardworkers/models/block/miner_diamond.json new file mode 100644 index 0000000..754fc72 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/miner_diamond.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/miner_diamond_front", + "up": "hardworkers:block/miner_diamond_top", + "down": "hardworkers:block/miner_diamond_bottom", + "north": "hardworkers:block/miner_diamond_front", + "south": "hardworkers:block/miner_diamond_back", + "east": "hardworkers:block/miner_diamond_side", + "west": "hardworkers:block/miner_diamond_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/miner_iron.json b/src/main/resources/assets/hardworkers/models/block/miner_iron.json new file mode 100644 index 0000000..0ecef80 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/miner_iron.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/miner_iron_front", + "up": "hardworkers:block/miner_iron_top", + "down": "hardworkers:block/miner_iron_bottom", + "north": "hardworkers:block/miner_iron_front", + "south": "hardworkers:block/miner_iron_back", + "east": "hardworkers:block/miner_iron_side", + "west": "hardworkers:block/miner_iron_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/miner_netherite.json b/src/main/resources/assets/hardworkers/models/block/miner_netherite.json new file mode 100644 index 0000000..59d3b59 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/miner_netherite.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/miner_netherite_front", + "up": "hardworkers:block/miner_netherite_top", + "down": "hardworkers:block/miner_netherite_bottom", + "north": "hardworkers:block/miner_netherite_front", + "south": "hardworkers:block/miner_netherite_back", + "east": "hardworkers:block/miner_netherite_side", + "west": "hardworkers:block/miner_netherite_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/miner_stone.json b/src/main/resources/assets/hardworkers/models/block/miner_stone.json new file mode 100644 index 0000000..ad06e3e --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/miner_stone.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/miner_stone_front", + "up": "hardworkers:block/miner_stone_top", + "down": "hardworkers:block/miner_stone_bottom", + "north": "hardworkers:block/miner_stone_front", + "south": "hardworkers:block/miner_stone_back", + "east": "hardworkers:block/miner_stone_side", + "west": "hardworkers:block/miner_stone_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/miner_wood.json b/src/main/resources/assets/hardworkers/models/block/miner_wood.json new file mode 100644 index 0000000..906ae98 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/miner_wood.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "hardworkers:block/miner_wood_front", + "up": "hardworkers:block/miner_wood_top", + "down": "hardworkers:block/miner_wood_bottom", + "north": "hardworkers:block/miner_wood_front", + "south": "hardworkers:block/miner_wood_back", + "east": "hardworkers:block/miner_wood_side", + "west": "hardworkers:block/miner_wood_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/warehouse_diamond.json b/src/main/resources/assets/hardworkers/models/block/warehouse_diamond.json new file mode 100644 index 0000000..d16865b --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/warehouse_diamond.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hardworkers:block/warehouse_diamond_bottom", + "up": "hardworkers:block/warehouse_diamond_top", + "north": "hardworkers:block/warehouse_diamond_front", + "south": "hardworkers:block/warehouse_diamond_back", + "east": "hardworkers:block/warehouse_diamond_side", + "west": "hardworkers:block/warehouse_diamond_side", + "particle": "hardworkers:block/warehouse_diamond_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/warehouse_iron.json b/src/main/resources/assets/hardworkers/models/block/warehouse_iron.json new file mode 100644 index 0000000..dce5a56 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/warehouse_iron.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hardworkers:block/warehouse_iron_bottom", + "up": "hardworkers:block/warehouse_iron_top", + "north": "hardworkers:block/warehouse_iron_front", + "south": "hardworkers:block/warehouse_iron_back", + "east": "hardworkers:block/warehouse_iron_side", + "west": "hardworkers:block/warehouse_iron_side", + "particle": "hardworkers:block/warehouse_iron_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/warehouse_netherite.json b/src/main/resources/assets/hardworkers/models/block/warehouse_netherite.json new file mode 100644 index 0000000..effc7bc --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/warehouse_netherite.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hardworkers:block/warehouse_netherite_bottom", + "up": "hardworkers:block/warehouse_netherite_top", + "north": "hardworkers:block/warehouse_netherite_front", + "south": "hardworkers:block/warehouse_netherite_back", + "east": "hardworkers:block/warehouse_netherite_side", + "west": "hardworkers:block/warehouse_netherite_side", + "particle": "hardworkers:block/warehouse_netherite_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/warehouse_stone.json b/src/main/resources/assets/hardworkers/models/block/warehouse_stone.json new file mode 100644 index 0000000..11e7728 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/warehouse_stone.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hardworkers:block/warehouse_stone_bottom", + "up": "hardworkers:block/warehouse_stone_top", + "north": "hardworkers:block/warehouse_stone_front", + "south": "hardworkers:block/warehouse_stone_back", + "east": "hardworkers:block/warehouse_stone_side", + "west": "hardworkers:block/warehouse_stone_side", + "particle": "hardworkers:block/warehouse_stone_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/block/warehouse_wood.json b/src/main/resources/assets/hardworkers/models/block/warehouse_wood.json new file mode 100644 index 0000000..f61f834 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/block/warehouse_wood.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "hardworkers:block/warehouse_wood_bottom", + "up": "hardworkers:block/warehouse_wood_top", + "north": "hardworkers:block/warehouse_wood_front", + "south": "hardworkers:block/warehouse_wood_back", + "east": "hardworkers:block/warehouse_wood_side", + "west": "hardworkers:block/warehouse_wood_side", + "particle": "hardworkers:block/warehouse_wood_side" + } +} diff --git a/src/main/resources/assets/hardworkers/models/item/farmer_diamond.json b/src/main/resources/assets/hardworkers/models/item/farmer_diamond.json new file mode 100644 index 0000000..3f07faf --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/farmer_diamond.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/farmer_diamond" } diff --git a/src/main/resources/assets/hardworkers/models/item/farmer_iron.json b/src/main/resources/assets/hardworkers/models/item/farmer_iron.json new file mode 100644 index 0000000..f0bf775 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/farmer_iron.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/farmer_iron" } diff --git a/src/main/resources/assets/hardworkers/models/item/farmer_netherite.json b/src/main/resources/assets/hardworkers/models/item/farmer_netherite.json new file mode 100644 index 0000000..aac49f3 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/farmer_netherite.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/farmer_netherite" } diff --git a/src/main/resources/assets/hardworkers/models/item/farmer_stone.json b/src/main/resources/assets/hardworkers/models/item/farmer_stone.json new file mode 100644 index 0000000..42d65e8 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/farmer_stone.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/farmer_stone" } diff --git a/src/main/resources/assets/hardworkers/models/item/farmer_wood.json b/src/main/resources/assets/hardworkers/models/item/farmer_wood.json new file mode 100644 index 0000000..68af928 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/farmer_wood.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/farmer_wood" } diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_block.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_block.json deleted file mode 100644 index 0384ee3..0000000 --- a/src/main/resources/assets/hardworkers/models/item/lumberjack_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "hardworkers:block/lumberjack_block" -} diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_diamond.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_diamond.json new file mode 100644 index 0000000..d25bdea --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/lumberjack_diamond.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/lumberjack_diamond" +} diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_iron.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_iron.json new file mode 100644 index 0000000..cbbcbdf --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/lumberjack_iron.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/lumberjack_iron" +} diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_netherite.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_netherite.json new file mode 100644 index 0000000..fae465d --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/lumberjack_netherite.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/lumberjack_netherite" +} diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_stone.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_stone.json new file mode 100644 index 0000000..527a40d --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/lumberjack_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/lumberjack_stone" +} diff --git a/src/main/resources/assets/hardworkers/models/item/lumberjack_wood.json b/src/main/resources/assets/hardworkers/models/item/lumberjack_wood.json new file mode 100644 index 0000000..9de19ac --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/lumberjack_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/lumberjack_wood" +} diff --git a/src/main/resources/assets/hardworkers/models/item/miner_diamond.json b/src/main/resources/assets/hardworkers/models/item/miner_diamond.json new file mode 100644 index 0000000..91cb814 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/miner_diamond.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/miner_diamond" } diff --git a/src/main/resources/assets/hardworkers/models/item/miner_iron.json b/src/main/resources/assets/hardworkers/models/item/miner_iron.json new file mode 100644 index 0000000..568bd1e --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/miner_iron.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/miner_iron" } diff --git a/src/main/resources/assets/hardworkers/models/item/miner_netherite.json b/src/main/resources/assets/hardworkers/models/item/miner_netherite.json new file mode 100644 index 0000000..73f4fa9 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/miner_netherite.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/miner_netherite" } diff --git a/src/main/resources/assets/hardworkers/models/item/miner_stone.json b/src/main/resources/assets/hardworkers/models/item/miner_stone.json new file mode 100644 index 0000000..42fd84d --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/miner_stone.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/miner_stone" } diff --git a/src/main/resources/assets/hardworkers/models/item/miner_wood.json b/src/main/resources/assets/hardworkers/models/item/miner_wood.json new file mode 100644 index 0000000..a80d909 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/miner_wood.json @@ -0,0 +1 @@ +{ "parent": "hardworkers:block/miner_wood" } diff --git a/src/main/resources/assets/hardworkers/models/item/warehouse_diamond.json b/src/main/resources/assets/hardworkers/models/item/warehouse_diamond.json new file mode 100644 index 0000000..62c0a25 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/warehouse_diamond.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/warehouse_diamond" +} diff --git a/src/main/resources/assets/hardworkers/models/item/warehouse_iron.json b/src/main/resources/assets/hardworkers/models/item/warehouse_iron.json new file mode 100644 index 0000000..6a8e272 --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/warehouse_iron.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/warehouse_iron" +} diff --git a/src/main/resources/assets/hardworkers/models/item/warehouse_netherite.json b/src/main/resources/assets/hardworkers/models/item/warehouse_netherite.json new file mode 100644 index 0000000..3d71a1a --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/warehouse_netherite.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/warehouse_netherite" +} diff --git a/src/main/resources/assets/hardworkers/models/item/warehouse_stone.json b/src/main/resources/assets/hardworkers/models/item/warehouse_stone.json new file mode 100644 index 0000000..35c720e --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/warehouse_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/warehouse_stone" +} diff --git a/src/main/resources/assets/hardworkers/models/item/warehouse_wood.json b/src/main/resources/assets/hardworkers/models/item/warehouse_wood.json new file mode 100644 index 0000000..71e494f --- /dev/null +++ b/src/main/resources/assets/hardworkers/models/item/warehouse_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "hardworkers:block/warehouse_wood" +} diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_back.png b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_bottom.png b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_front.png b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_side.png b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_top.png b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_diamond_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_iron_back.png b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_iron_bottom.png b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_iron_front.png b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_iron_side.png b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_iron_top.png b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_iron_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_back.png b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_bottom.png b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_front.png b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_side.png b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_top.png b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_netherite_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_stone_back.png b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_stone_bottom.png b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_stone_front.png b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_stone_side.png b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_stone_top.png b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_stone_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_wood_back.png b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_wood_bottom.png b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_wood_front.png b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_wood_side.png b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/farmer_wood_top.png b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/farmer_wood_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_block.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_block.png deleted file mode 100644 index 6aba097..0000000 Binary files a/src/main/resources/assets/hardworkers/textures/block/lumberjack_block.png and /dev/null differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_back.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_back.png new file mode 100644 index 0000000..eb0b1a1 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_bottom.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_bottom.png new file mode 100644 index 0000000..bb3518f Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_front.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_front.png new file mode 100644 index 0000000..bf7fea8 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_side.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_side.png new file mode 100644 index 0000000..6aaaf10 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_top.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_top.png new file mode 100644 index 0000000..195c303 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_diamond_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_back.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_back.png new file mode 100644 index 0000000..8dcf9ca Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_bottom.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_bottom.png new file mode 100644 index 0000000..650fda3 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_front.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_front.png new file mode 100644 index 0000000..bf17d64 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_side.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_side.png new file mode 100644 index 0000000..f1cb1ca Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_top.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_top.png new file mode 100644 index 0000000..54e34d8 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_iron_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_back.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_back.png new file mode 100644 index 0000000..a852a71 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_bottom.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_bottom.png new file mode 100644 index 0000000..c86ba39 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_front.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_front.png new file mode 100644 index 0000000..45a439b Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_side.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_side.png new file mode 100644 index 0000000..99b8afe Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_top.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_top.png new file mode 100644 index 0000000..fc47ef4 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_netherite_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_back.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_back.png new file mode 100644 index 0000000..dd1b0b1 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_bottom.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_bottom.png new file mode 100644 index 0000000..9d1fa38 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_front.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_front.png new file mode 100644 index 0000000..961f8b3 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_side.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_side.png new file mode 100644 index 0000000..f744aea Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_top.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_top.png new file mode 100644 index 0000000..5fa995b Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_stone_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_back.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_back.png new file mode 100644 index 0000000..9846156 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_bottom.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_bottom.png new file mode 100644 index 0000000..3e60a95 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_front.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_side.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_side.png new file mode 100644 index 0000000..a56e953 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_top.png b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_top.png new file mode 100644 index 0000000..cb3124f Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/lumberjack_wood_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_diamond_back.png b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_back.png new file mode 100644 index 0000000..1adeb0f Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_diamond_bottom.png b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_bottom.png new file mode 100644 index 0000000..74620ba Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_diamond_front.png b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_front.png new file mode 100644 index 0000000..3d4e9b0 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_diamond_side.png b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_side.png new file mode 100644 index 0000000..912a36c Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_diamond_top.png b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_top.png new file mode 100644 index 0000000..cba297c Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_diamond_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_iron_back.png b/src/main/resources/assets/hardworkers/textures/block/miner_iron_back.png new file mode 100644 index 0000000..934ac32 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_iron_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_iron_bottom.png b/src/main/resources/assets/hardworkers/textures/block/miner_iron_bottom.png new file mode 100644 index 0000000..6ba76a8 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_iron_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_iron_front.png b/src/main/resources/assets/hardworkers/textures/block/miner_iron_front.png new file mode 100644 index 0000000..ccf1f14 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_iron_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_iron_side.png b/src/main/resources/assets/hardworkers/textures/block/miner_iron_side.png new file mode 100644 index 0000000..df59dcd Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_iron_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_iron_top.png b/src/main/resources/assets/hardworkers/textures/block/miner_iron_top.png new file mode 100644 index 0000000..3427bbb Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_iron_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_netherite_back.png b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_back.png new file mode 100644 index 0000000..b12af5a Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_netherite_bottom.png b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_bottom.png new file mode 100644 index 0000000..3fba80c Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_netherite_front.png b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_front.png new file mode 100644 index 0000000..615a267 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_netherite_side.png b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_side.png new file mode 100644 index 0000000..be427d0 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_netherite_top.png b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_top.png new file mode 100644 index 0000000..9d0285f Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_netherite_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_stone_back.png b/src/main/resources/assets/hardworkers/textures/block/miner_stone_back.png new file mode 100644 index 0000000..c7d3bcd Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_stone_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_stone_bottom.png b/src/main/resources/assets/hardworkers/textures/block/miner_stone_bottom.png new file mode 100644 index 0000000..82852ab Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_stone_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_stone_front.png b/src/main/resources/assets/hardworkers/textures/block/miner_stone_front.png new file mode 100644 index 0000000..a6a4bf2 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_stone_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_stone_side.png b/src/main/resources/assets/hardworkers/textures/block/miner_stone_side.png new file mode 100644 index 0000000..2b7dcc9 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_stone_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_stone_top.png b/src/main/resources/assets/hardworkers/textures/block/miner_stone_top.png new file mode 100644 index 0000000..c4f5375 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_stone_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_wood_back.png b/src/main/resources/assets/hardworkers/textures/block/miner_wood_back.png new file mode 100644 index 0000000..1820a9c Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_wood_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_wood_bottom.png b/src/main/resources/assets/hardworkers/textures/block/miner_wood_bottom.png new file mode 100644 index 0000000..da26b5f Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_wood_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_wood_front.png b/src/main/resources/assets/hardworkers/textures/block/miner_wood_front.png new file mode 100644 index 0000000..54befc9 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_wood_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_wood_side.png b/src/main/resources/assets/hardworkers/textures/block/miner_wood_side.png new file mode 100644 index 0000000..879f448 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_wood_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/miner_wood_top.png b/src/main/resources/assets/hardworkers/textures/block/miner_wood_top.png new file mode 100644 index 0000000..6beb7c9 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/miner_wood_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_back.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_bottom.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_front.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_side.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_top.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_diamond_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_back.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_bottom.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_front.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_side.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_top.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_iron_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_back.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_bottom.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_front.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_side.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_top.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_netherite_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_back.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_bottom.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_front.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_side.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_top.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_stone_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_back.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_back.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_back.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_bottom.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_bottom.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_bottom.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_front.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_front.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_front.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_side.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_side.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_side.png differ diff --git a/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_top.png b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_top.png new file mode 100644 index 0000000..8307aed Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/block/warehouse_wood_top.png differ diff --git a/src/main/resources/assets/hardworkers/textures/entity/farmer.png b/src/main/resources/assets/hardworkers/textures/entity/farmer.png new file mode 100644 index 0000000..7b543ff Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/entity/farmer.png differ diff --git a/src/main/resources/assets/hardworkers/textures/entity/lumberjack.png b/src/main/resources/assets/hardworkers/textures/entity/lumberjack.png index 0b75077..d45c19b 100644 Binary files a/src/main/resources/assets/hardworkers/textures/entity/lumberjack.png and b/src/main/resources/assets/hardworkers/textures/entity/lumberjack.png differ diff --git a/src/main/resources/assets/hardworkers/textures/entity/miner.png b/src/main/resources/assets/hardworkers/textures/entity/miner.png new file mode 100644 index 0000000..c912e53 Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/entity/miner.png differ diff --git a/src/main/resources/assets/hardworkers/textures/entity/warehouse_worker.png b/src/main/resources/assets/hardworkers/textures/entity/warehouse_worker.png new file mode 100644 index 0000000..912a45d Binary files /dev/null and b/src/main/resources/assets/hardworkers/textures/entity/warehouse_worker.png differ diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/farmer_diamond.json b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_diamond.json new file mode 100644 index 0000000..4d5cf7a --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_diamond.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:farmer_diamond" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/farmer_iron.json b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_iron.json new file mode 100644 index 0000000..dfe7034 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_iron.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:farmer_iron" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/farmer_netherite.json b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_netherite.json new file mode 100644 index 0000000..3abba91 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_netherite.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:farmer_netherite" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/farmer_stone.json b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_stone.json new file mode 100644 index 0000000..10491c5 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_stone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:farmer_stone" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/farmer_wood.json b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_wood.json new file mode 100644 index 0000000..35d0a15 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/farmer_wood.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:farmer_wood" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/miner_diamond.json b/src/main/resources/data/hardworkers/loot_table/blocks/miner_diamond.json new file mode 100644 index 0000000..c520a30 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/miner_diamond.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:miner_diamond" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/miner_iron.json b/src/main/resources/data/hardworkers/loot_table/blocks/miner_iron.json new file mode 100644 index 0000000..e7ab408 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/miner_iron.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:miner_iron" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/miner_netherite.json b/src/main/resources/data/hardworkers/loot_table/blocks/miner_netherite.json new file mode 100644 index 0000000..124fe00 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/miner_netherite.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:miner_netherite" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/miner_stone.json b/src/main/resources/data/hardworkers/loot_table/blocks/miner_stone.json new file mode 100644 index 0000000..aa0c0cf --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/miner_stone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:miner_stone" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/miner_wood.json b/src/main/resources/data/hardworkers/loot_table/blocks/miner_wood.json new file mode 100644 index 0000000..d78efbb --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/miner_wood.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ "type": "minecraft:item", "name": "hardworkers:miner_wood" }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_diamond.json b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_diamond.json new file mode 100644 index 0000000..fb23961 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_diamond.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ + "type": "minecraft:item", + "name": "hardworkers:warehouse_diamond" + }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_iron.json b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_iron.json new file mode 100644 index 0000000..d5e9e81 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_iron.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ + "type": "minecraft:item", + "name": "hardworkers:warehouse_iron" + }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_netherite.json b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_netherite.json new file mode 100644 index 0000000..5fef24d --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_netherite.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ + "type": "minecraft:item", + "name": "hardworkers:warehouse_netherite" + }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_stone.json b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_stone.json new file mode 100644 index 0000000..4f4bd68 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_stone.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ + "type": "minecraft:item", + "name": "hardworkers:warehouse_stone" + }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_wood.json b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_wood.json new file mode 100644 index 0000000..9a412b7 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_table/blocks/warehouse_wood.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:block", + "pools": [{ + "rolls": 1, + "entries": [{ + "type": "minecraft:item", + "name": "hardworkers:warehouse_wood" + }], + "conditions": [{ "condition": "minecraft:survives_explosion" }] + }] +} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_block.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_block.json deleted file mode 100644 index e7358ce..0000000 --- a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_block.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { "condition": "minecraft:survives_explosion" } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "hardworkers:lumberjack_block" - } - ], - "rolls": 1.0 - } - ] -} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_diamond.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_diamond.json new file mode 100644 index 0000000..b50308d --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_diamond.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:block", + "pools": [{ + "bonus_rolls": 0.0, + "conditions": [{ "condition": "minecraft:survives_explosion" }], + "entries": [{ "type": "minecraft:item", "name": "hardworkers:lumberjack_diamond" }], + "rolls": 1.0 + }] +} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_iron.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_iron.json new file mode 100644 index 0000000..9bc3e26 --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_iron.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:block", + "pools": [{ + "bonus_rolls": 0.0, + "conditions": [{ "condition": "minecraft:survives_explosion" }], + "entries": [{ "type": "minecraft:item", "name": "hardworkers:lumberjack_iron" }], + "rolls": 1.0 + }] +} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_netherite.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_netherite.json new file mode 100644 index 0000000..5c3184b --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_netherite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:block", + "pools": [{ + "bonus_rolls": 0.0, + "conditions": [{ "condition": "minecraft:survives_explosion" }], + "entries": [{ "type": "minecraft:item", "name": "hardworkers:lumberjack_netherite" }], + "rolls": 1.0 + }] +} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_stone.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_stone.json new file mode 100644 index 0000000..85df1fa --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_stone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:block", + "pools": [{ + "bonus_rolls": 0.0, + "conditions": [{ "condition": "minecraft:survives_explosion" }], + "entries": [{ "type": "minecraft:item", "name": "hardworkers:lumberjack_stone" }], + "rolls": 1.0 + }] +} diff --git a/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_wood.json b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_wood.json new file mode 100644 index 0000000..efca92e --- /dev/null +++ b/src/main/resources/data/hardworkers/loot_tables/blocks/lumberjack_wood.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:block", + "pools": [{ + "bonus_rolls": 0.0, + "conditions": [{ "condition": "minecraft:survives_explosion" }], + "entries": [{ "type": "minecraft:item", "name": "hardworkers:lumberjack_wood" }], + "rolls": 1.0 + }] +} diff --git a/src/main/resources/data/hardworkers/recipes/farmer_diamond.json b/src/main/resources/data/hardworkers/recipes/farmer_diamond.json new file mode 100644 index 0000000..88c86c0 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/farmer_diamond.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:diamond_hoe" }, + "B": { "item": "hardworkers:farmer_iron" } + }, + "result": { "id": "hardworkers:farmer_diamond", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/farmer_iron.json b/src/main/resources/data/hardworkers/recipes/farmer_iron.json new file mode 100644 index 0000000..6ecbd44 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/farmer_iron.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:iron_hoe" }, + "B": { "item": "hardworkers:farmer_stone" } + }, + "result": { "id": "hardworkers:farmer_iron", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/farmer_netherite.json b/src/main/resources/data/hardworkers/recipes/farmer_netherite.json new file mode 100644 index 0000000..e7ee353 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/farmer_netherite.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:netherite_hoe" }, + "B": { "item": "hardworkers:farmer_diamond" } + }, + "result": { "id": "hardworkers:farmer_netherite", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/farmer_stone.json b/src/main/resources/data/hardworkers/recipes/farmer_stone.json new file mode 100644 index 0000000..cac11d1 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/farmer_stone.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:stone_hoe" }, + "B": { "item": "hardworkers:farmer_wood" } + }, + "result": { "id": "hardworkers:farmer_stone", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/farmer_wood.json b/src/main/resources/data/hardworkers/recipes/farmer_wood.json new file mode 100644 index 0000000..94516b4 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/farmer_wood.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WWW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:wooden_hoe" } + }, + "result": { "id": "hardworkers:farmer_wood", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_block.json b/src/main/resources/data/hardworkers/recipes/lumberjack_block.json deleted file mode 100644 index 552f098..0000000 --- a/src/main/resources/data/hardworkers/recipes/lumberjack_block.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "pattern": [ - "PPP", - "PAP", - "PPP" - ], - "key": { - "P": { "tag": "minecraft:planks" }, - "A": { "tag": "minecraft:axes" } - }, - "result": { - "id": "hardworkers:lumberjack_block", - "count": 1 - } -} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_diamond.json b/src/main/resources/data/hardworkers/recipes/lumberjack_diamond.json new file mode 100644 index 0000000..f2021d1 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/lumberjack_diamond.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:diamond_axe" }, + "B": { "item": "hardworkers:lumberjack_iron" } + }, + "result": { "id": "hardworkers:lumberjack_diamond", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_iron.json b/src/main/resources/data/hardworkers/recipes/lumberjack_iron.json new file mode 100644 index 0000000..db13e23 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/lumberjack_iron.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:iron_axe" }, + "B": { "item": "hardworkers:lumberjack_stone" } + }, + "result": { "id": "hardworkers:lumberjack_iron", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_netherite.json b/src/main/resources/data/hardworkers/recipes/lumberjack_netherite.json new file mode 100644 index 0000000..c90312e --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/lumberjack_netherite.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:netherite_axe" }, + "B": { "item": "hardworkers:lumberjack_diamond" } + }, + "result": { "id": "hardworkers:lumberjack_netherite", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_stone.json b/src/main/resources/data/hardworkers/recipes/lumberjack_stone.json new file mode 100644 index 0000000..e2682e5 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/lumberjack_stone.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:stone_axe" }, + "B": { "item": "hardworkers:lumberjack_wood" } + }, + "result": { "id": "hardworkers:lumberjack_stone", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/lumberjack_wood.json b/src/main/resources/data/hardworkers/recipes/lumberjack_wood.json new file mode 100644 index 0000000..5eae3cb --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/lumberjack_wood.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WWW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:wooden_axe" } + }, + "result": { "id": "hardworkers:lumberjack_wood", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/miner_diamond.json b/src/main/resources/data/hardworkers/recipes/miner_diamond.json new file mode 100644 index 0000000..d01b45d --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/miner_diamond.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:diamond_pickaxe" }, + "B": { "item": "hardworkers:miner_iron" } + }, + "result": { "id": "hardworkers:miner_diamond", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/miner_iron.json b/src/main/resources/data/hardworkers/recipes/miner_iron.json new file mode 100644 index 0000000..b68388c --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/miner_iron.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:iron_pickaxe" }, + "B": { "item": "hardworkers:miner_stone" } + }, + "result": { "id": "hardworkers:miner_iron", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/miner_netherite.json b/src/main/resources/data/hardworkers/recipes/miner_netherite.json new file mode 100644 index 0000000..bf19879 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/miner_netherite.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:netherite_pickaxe" }, + "B": { "item": "hardworkers:miner_diamond" } + }, + "result": { "id": "hardworkers:miner_netherite", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/miner_stone.json b/src/main/resources/data/hardworkers/recipes/miner_stone.json new file mode 100644 index 0000000..f7613c6 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/miner_stone.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WBW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:stone_pickaxe" }, + "B": { "item": "hardworkers:miner_wood" } + }, + "result": { "id": "hardworkers:miner_stone", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/miner_wood.json b/src/main/resources/data/hardworkers/recipes/miner_wood.json new file mode 100644 index 0000000..1a0e783 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/miner_wood.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ "WWW", "WAW", "WWW" ], + "key": { + "W": { "tag": "minecraft:planks" }, + "A": { "item": "minecraft:wooden_pickaxe" } + }, + "result": { "id": "hardworkers:miner_wood", "count": 1 } +} diff --git a/src/main/resources/data/hardworkers/recipes/warehouse_diamond.json b/src/main/resources/data/hardworkers/recipes/warehouse_diamond.json new file mode 100644 index 0000000..cb2aad3 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/warehouse_diamond.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": ["DDD", "DWD", "DDD"], + "key": { + "D": {"item": "minecraft:diamond"}, + "W": {"item": "hardworkers:warehouse_iron"} + }, + "result": {"id": "hardworkers:warehouse_diamond", "count": 1} +} diff --git a/src/main/resources/data/hardworkers/recipes/warehouse_iron.json b/src/main/resources/data/hardworkers/recipes/warehouse_iron.json new file mode 100644 index 0000000..4f90eea --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/warehouse_iron.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": ["III", "IWI", "III"], + "key": { + "I": {"item": "minecraft:iron_ingot"}, + "W": {"item": "hardworkers:warehouse_stone"} + }, + "result": {"id": "hardworkers:warehouse_iron", "count": 1} +} diff --git a/src/main/resources/data/hardworkers/recipes/warehouse_netherite.json b/src/main/resources/data/hardworkers/recipes/warehouse_netherite.json new file mode 100644 index 0000000..41175c7 --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/warehouse_netherite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": ["NNN", "NWN", "NNN"], + "key": { + "N": {"item": "minecraft:netherite_ingot"}, + "W": {"item": "hardworkers:warehouse_diamond"} + }, + "result": {"id": "hardworkers:warehouse_netherite", "count": 1} +} diff --git a/src/main/resources/data/hardworkers/recipes/warehouse_stone.json b/src/main/resources/data/hardworkers/recipes/warehouse_stone.json new file mode 100644 index 0000000..21213cc --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/warehouse_stone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": ["SSS", "SWS", "SSS"], + "key": { + "S": {"item": "minecraft:cobblestone"}, + "W": {"item": "hardworkers:warehouse_wood"} + }, + "result": {"id": "hardworkers:warehouse_stone", "count": 1} +} diff --git a/src/main/resources/data/hardworkers/recipes/warehouse_wood.json b/src/main/resources/data/hardworkers/recipes/warehouse_wood.json new file mode 100644 index 0000000..99108ce --- /dev/null +++ b/src/main/resources/data/hardworkers/recipes/warehouse_wood.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": ["PPP", "PCP", "PPP"], + "key": { + "P": {"item": "minecraft:oak_planks"}, + "C": {"item": "minecraft:chest"} + }, + "result": {"id": "hardworkers:warehouse_wood", "count": 1} +}