From 9ad284a95a7484e5f9f3244c9995ce7f3ed3a4f8 Mon Sep 17 00:00:00 2001 From: Jottyfan Date: Sun, 28 Dec 2025 18:30:23 +0100 Subject: [PATCH] added monster hoarder --- .../minecraft/block/BlockMonsterhoarder.java | 109 ++++++++++++++++++ .../minecraft/block/QuicklyBlocks.java | 3 + .../quickly/blockstates/monsterhoarder.json | 7 ++ .../assets/quickly/items/monsterhoarder.json | 6 + .../resources/assets/quickly/lang/de_de.json | 3 + .../resources/assets/quickly/lang/en_us.json | 3 + .../quickly/models/block/monsterhoarder.json | 6 + .../quickly/models/item/monsterhoarder.json | 10 ++ .../quickly/textures/block/monsterhoarder.png | Bin 0 -> 2370 bytes .../quickly/recipe/shaped_monsterhoarder.json | 17 +++ 10 files changed, 164 insertions(+) create mode 100644 src/main/java/de/jottyfan/minecraft/block/BlockMonsterhoarder.java create mode 100644 src/main/resources/assets/quickly/blockstates/monsterhoarder.json create mode 100644 src/main/resources/assets/quickly/items/monsterhoarder.json create mode 100644 src/main/resources/assets/quickly/models/block/monsterhoarder.json create mode 100644 src/main/resources/assets/quickly/models/item/monsterhoarder.json create mode 100644 src/main/resources/assets/quickly/textures/block/monsterhoarder.png create mode 100644 src/main/resources/data/quickly/recipe/shaped_monsterhoarder.json diff --git a/src/main/java/de/jottyfan/minecraft/block/BlockMonsterhoarder.java b/src/main/java/de/jottyfan/minecraft/block/BlockMonsterhoarder.java new file mode 100644 index 0000000..2a6dabb --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/block/BlockMonsterhoarder.java @@ -0,0 +1,109 @@ +package de.jottyfan.minecraft.block; + +import org.jspecify.annotations.Nullable; + +import de.jottyfan.minecraft.Quickly; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.ticks.ScheduledTick; + +/** + * + * @author jotty + * + */ +public class BlockMonsterhoarder extends Block { + + private static final Integer MINSUCKRADIUS = 2; + private static final Integer MAXSUCKRADIUS = 20; + private static final Integer MINBURNTICKS = 10; + private static final Integer MAXBURNTICKS = 200; + private static final IntegerProperty SUCKRADIUS = IntegerProperty.create("suckradius", MINSUCKRADIUS, MAXSUCKRADIUS); + private static final IntegerProperty BURNTICKS = IntegerProperty.create("burnticks", MINBURNTICKS, MAXBURNTICKS); + + public BlockMonsterhoarder(Properties properties) { + super(properties.strength(2.5f).lightLevel(state -> state.getValue(SUCKRADIUS))); + registerDefaultState(stateDefinition.any().setValue(SUCKRADIUS, MINSUCKRADIUS).setValue(BURNTICKS, MINBURNTICKS)); + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + builder.add(SUCKRADIUS, BURNTICKS); + } + + @Override + protected InteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, Player player, + InteractionHand hand, BlockHitResult hitResult) { + if (Items.WATER_BUCKET.equals(itemStack.getItem())) { + level.setBlock(pos, state.setValue(SUCKRADIUS, MINSUCKRADIUS), UPDATE_ALL); + player.setItemInHand(hand, new ItemStack(Items.BUCKET)); + } else if (Items.TORCH.equals(itemStack.getItem())) { + level.setBlock(pos, state.cycle(SUCKRADIUS), UPDATE_ALL); + itemStack.shrink(1); + } else if (Items.SOUL_TORCH.equals(itemStack.getItem())) { + int newBurnTicks = state.getValue(BURNTICKS) + 10; + newBurnTicks = newBurnTicks < MAXBURNTICKS ? newBurnTicks : MAXBURNTICKS; + level.setBlock(pos, state.setValue(BURNTICKS, newBurnTicks), UPDATE_ALL); + itemStack.shrink(1); + } else if (Items.REDSTONE_TORCH.equals(itemStack.getItem())) { + level.setBlock(pos, state.cycle(SUCKRADIUS), UPDATE_ALL); + } else if (Items.COPPER_TORCH.equals(itemStack.getItem())) { + level.setBlock(pos, state.setValue(BURNTICKS, MINBURNTICKS), UPDATE_ALL); + itemStack.shrink(1); + } else { + int suckRadius = state.getValue(SUCKRADIUS); + int burnTicks = state.getValue(BURNTICKS); + Component message = Component.translatable("info.block.monsterhoarder", suckRadius, burnTicks); + if (player instanceof ServerPlayer serverPlayer) { + serverPlayer.displayClientMessage(message, true); + } + } + return InteractionResult.SUCCESS; + } + + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (!level.isClientSide()) { + AABB checkArea = new AABB(pos).inflate(state.getValue(SUCKRADIUS)); + for (Monster monster : level.getEntitiesOfClass(Monster.class, checkArea)) { + if (monster.fireImmune()) { + monster.kill(level); + } else { + monster.igniteForTicks(state.getValue(BURNTICKS)); + } + } + } + if (level instanceof ServerLevel serverLevel) { + serverLevel.getBlockTicks() + .schedule(new ScheduledTick<>(this, pos, level.getGameTime() + 20, 1)); + } + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity by, ItemStack itemStack) { + if (level instanceof ServerLevel serverLevel) { + serverLevel.getBlockTicks() + .schedule(new ScheduledTick<>(this, pos, level.getGameTime() + 20, 1)); + level.playSound(null, pos, SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, SoundSource.PLAYERS, 1f, 1f); + } + } +} diff --git a/src/main/java/de/jottyfan/minecraft/block/QuicklyBlocks.java b/src/main/java/de/jottyfan/minecraft/block/QuicklyBlocks.java index b06f742..1bbbc0e 100644 --- a/src/main/java/de/jottyfan/minecraft/block/QuicklyBlocks.java +++ b/src/main/java/de/jottyfan/minecraft/block/QuicklyBlocks.java @@ -47,6 +47,8 @@ public class QuicklyBlocks { properties -> new BlockDrops(properties, new ItemStack(QuicklyItems.QUICKIEPOWDER, 9))); public static final Block SPEEDPOWDER = registerBlock("blockspeedpowder", properties -> new BlockDrops(properties, new ItemStack(QuicklyItems.SPEEDPOWDER, 9))); + public static final Block MONSTERHOARDER = registerBlock("monsterhoarder", + properties -> new BlockMonsterhoarder(properties)); private static final Block registerBlock(String name, Properties properties) { return QuicklyBlocks.registerBlock(name, properties, p -> new Block(p)); @@ -75,6 +77,7 @@ public class QuicklyBlocks { block.accept(EMPTYLAVAHOARDER); block.accept(SPEEDPOWDER); block.accept(QUICKIEPOWDER); + block.accept(MONSTERHOARDER); }); } } diff --git a/src/main/resources/assets/quickly/blockstates/monsterhoarder.json b/src/main/resources/assets/quickly/blockstates/monsterhoarder.json new file mode 100644 index 0000000..6d7ef35 --- /dev/null +++ b/src/main/resources/assets/quickly/blockstates/monsterhoarder.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "quickly:block/monsterhoarder" + } + } +} diff --git a/src/main/resources/assets/quickly/items/monsterhoarder.json b/src/main/resources/assets/quickly/items/monsterhoarder.json new file mode 100644 index 0000000..0ae5da4 --- /dev/null +++ b/src/main/resources/assets/quickly/items/monsterhoarder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "quickly:block/monsterhoarder" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/quickly/lang/de_de.json b/src/main/resources/assets/quickly/lang/de_de.json index ba01272..59b76fa 100644 --- a/src/main/resources/assets/quickly/lang/de_de.json +++ b/src/main/resources/assets/quickly/lang/de_de.json @@ -1,4 +1,5 @@ { + "info.block.monsterhoarder": "Radius: %s, Brenndauer: %s Ticks", "item.quickly.blockcanolaplant": "Rapspflanze", "item.quickly.blockcottonplant": "Baumwollpflanze", "item.quickly.blockquickiepowder": "Eilpulverblock", @@ -15,8 +16,10 @@ "item.quickly.cotton": "Baumwolle", "item.quickly.cottonseed": "Baumwollsaat", "item.quickly.emptylavahoarder": "Lavasauger", + "item.quickly.itemhoarder": "Itemsauger", "item.quickly.kelpbundle": "Seegrassbündel", "item.quickly.lavahoarder": "voller Lavasauger", + "item.quickly.monsterhoarder": "Monstersauger", "item.quickly.oredeepslateturquoise": "Türkistiefenerz", "item.quickly.oreturquoise": "Türkiserz", "item.quickly.oxidizedcopperpowder": "oxidiertes Kupferpulver", diff --git a/src/main/resources/assets/quickly/lang/en_us.json b/src/main/resources/assets/quickly/lang/en_us.json index c0b5953..2627cc4 100644 --- a/src/main/resources/assets/quickly/lang/en_us.json +++ b/src/main/resources/assets/quickly/lang/en_us.json @@ -1,4 +1,5 @@ { + "info.block.monsterhoarder": "radius: %s, burn ticks: %s", "item.quickly.blockcanolaplant": "canola plant", "item.quickly.blockcottonplant": "cotton plant", "item.quickly.blockquickiepowder": "quickie powder block", @@ -15,8 +16,10 @@ "item.quickly.cotton": "cotton", "item.quickly.cottonseed": "cotton seed", "item.quickly.emptylavahoarder": "lava hoarder", + "item.quickly.itemhoarder": "item hoarder", "item.quickly.kelpbundle": "kelp bundle", "item.quickly.lavahoarder": "filled lava hoarder", + "item.quickly.monsterhoarder": "monster hoarder", "item.quickly.oredeepslateturquoise": "turquoise deepslate ore", "item.quickly.oreturquoise": "turquoise ore", "item.quickly.oxidizedcopperpowder": "oxidized copper powder", diff --git a/src/main/resources/assets/quickly/models/block/monsterhoarder.json b/src/main/resources/assets/quickly/models/block/monsterhoarder.json new file mode 100644 index 0000000..ff272d1 --- /dev/null +++ b/src/main/resources/assets/quickly/models/block/monsterhoarder.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "quickly:block/monsterhoarder" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/quickly/models/item/monsterhoarder.json b/src/main/resources/assets/quickly/models/item/monsterhoarder.json new file mode 100644 index 0000000..3ad7423 --- /dev/null +++ b/src/main/resources/assets/quickly/models/item/monsterhoarder.json @@ -0,0 +1,10 @@ +{ + "parent": "quickly:block/monsterhoarder", + "display": { + "thirdperson": { + "rotation": [ 10, -45, 170 ], + "translation": [ 0, 1.5, -2.75 ], + "scale": [ 0.375, 0.375, 0.375 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/quickly/textures/block/monsterhoarder.png b/src/main/resources/assets/quickly/textures/block/monsterhoarder.png new file mode 100644 index 0000000000000000000000000000000000000000..aba9272439bb5ab7992405c870c6152ebd9121ba GIT binary patch literal 2370 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/quickly/recipe/shaped_monsterhoarder.json b/src/main/resources/data/quickly/recipe/shaped_monsterhoarder.json new file mode 100644 index 0000000..eba4daa --- /dev/null +++ b/src/main/resources/data/quickly/recipe/shaped_monsterhoarder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "tct", + "clc", + "tct" + ], + "key": { + "t": "quickly:turquoiseingot", + "l": "minecraft:copper_lantern", + "c": "quickly:copperstub" + }, + "result": { + "id": "quickly:monsterhoarder", + "count": 1 + } +} \ No newline at end of file