15 Commits

Author SHA1 Message Date
Jottyfan
84b3779af2 repaired hopper for itemhoarder 2025-12-30 19:19:03 +01:00
Jottyfan
0aa12478b4 corrected drops on destroyment of block 2025-12-30 18:58:49 +01:00
Jottyfan
cf33fa2474 show content the right way on right click 2025-12-30 18:51:40 +01:00
Jottyfan
e26eeb438e info about items in itemhoarder started 2025-12-29 08:31:57 +01:00
Jottyfan
dc30a395f4 itemhoarder sucks, but items get lost on harvesting block 2025-12-28 20:34:43 +01:00
Jottyfan
9ad284a95a added monster hoarder 2025-12-28 18:30:23 +01:00
Jottyfan
5020d30a30 added speedpowder and quickiepowder and its basic recipes 2025-12-27 23:59:17 +01:00
Jottyfan
bc4eb4220d added quickly tab for creative mode 2025-12-27 23:18:57 +01:00
Jottyfan
20ec69b571 code cleanup 2025-12-27 15:07:59 +01:00
Jottyfan
127bdfc782 added lava hoarder 2025-12-26 23:12:51 +01:00
Jottyfan
b0ceac38cb added copper powder and its oxidized version with its items 2025-12-26 18:16:20 +01:00
Jottyfan
1856271617 added canola flasks 2025-12-26 17:46:22 +01:00
Jottyfan
3f7eaf48e3 added canola 2025-12-26 17:36:50 +01:00
Jottyfan
a4dd705db3 added armor 2025-12-25 18:26:31 +01:00
Jottyfan
83ddc724bd added rotten flesh stripes 2025-12-25 17:47:16 +01:00
157 changed files with 1799 additions and 88 deletions

View File

@@ -4,16 +4,12 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.jottyfan.minecraft.block.QuicklyBlocks;
import de.jottyfan.minecraft.composter.QuicklyComposter;
import de.jottyfan.minecraft.feature.QuicklyFeatures;
import de.jottyfan.minecraft.item.QuicklyItems;
import de.jottyfan.minecraft.loot.QuicklyLootTables;
import de.jottyfan.minecraft.tab.QuicklyTab;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.loot.v3.LootTableEvents;
import net.fabricmc.fabric.api.registry.CompostingChanceRegistry;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
/**
*
* @author jotty
@@ -24,39 +20,15 @@ public class Quickly implements ModInitializer {
public static final Logger LOGGER = LogManager.getLogger(MOD_ID);
private void registerComposterItems() {
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.COTTONSEED, 0.5f);
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.COTTON, 0.75f);
}
private void registerLootTableChanges() {
LootTableEvents.MODIFY.register((key, tableBuilder, source, registries) -> {
if (source.isBuiltin()) {
// TODO: maybe, better harvest cotton from dry grass instead?
Identifier shortGrass = Identifier.fromNamespaceAndPath("minecraft", "blocks/short_grass");
Identifier tallGrass = Identifier.fromNamespaceAndPath("minecraft", "blocks/tall_grass");
if (key.identifier().equals(shortGrass)) {
LootPool.Builder poolBuilder = LootPool.lootPool()
.setRolls(ConstantValue.exactly(1f))
.when(LootItemRandomChanceCondition.randomChance(0.1f))
.add(LootItem.lootTableItem(QuicklyItems.COTTONSEED));
tableBuilder.withPool(poolBuilder);
} else if (key.identifier().equals(tallGrass)) {
// for the canola loot table block later
}
}
});
}
@Override
public void onInitialize() {
LOGGER.info("loading {}", MOD_ID);
QuicklyTab.registerItemGroup();
QuicklyItems.registerModItems();
QuicklyBlocks.registerModBlocks();
QuicklyFeatures.registerFeatures();
registerComposterItems();
registerLootTableChanges();
QuicklyComposter.registerComposterItems();
QuicklyLootTables.registerChanges();
}
}

View File

@@ -15,5 +15,6 @@ public class QuicklyClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
BlockRenderLayerMap.putBlock(QuicklyBlocks.COTTONPLANT, ChunkSectionLayer.CUTOUT);
BlockRenderLayerMap.putBlock(QuicklyBlocks.CANOLAPLANT, ChunkSectionLayer.CUTOUT);
}
}

View File

@@ -1,11 +1,10 @@
package de.jottyfan.minecraft.block;
import java.util.Arrays;
import java.util.List;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
@@ -14,14 +13,18 @@ import net.minecraft.world.level.storage.loot.LootParams.Builder;
* @author jotty
*
*/
public class BlockOreDeepslateTurquoise extends BlockOreTurquoise {
public class BlockDrops extends Block {
public BlockOreDeepslateTurquoise(Properties properties) {
private ItemStack dropItems;
public BlockDrops(Properties properties, ItemStack dropItems) {
super(properties);
this.dropItems = dropItems;
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(QuicklyItems.RAWTURQUOISE, 2) });
ItemStack droppable = dropItems == null ? new ItemStack(this.asItem()) : dropItems;
return Arrays.asList(new ItemStack[] { droppable });
}
}

View File

@@ -0,0 +1,47 @@
package de.jottyfan.minecraft.block;
import java.util.Arrays;
import java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.projectile.Projectile;
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.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.phys.BlockHitResult;
/**
*
* @author jotty
*
*/
public class BlockOre extends Block {
private SoundEvent soundEvent;
private ItemStack dropItems;
public BlockOre(Properties properties, SoundEvent soundEvent, ItemStack dropItems) {
super(properties.requiresCorrectToolForDrops());
this.soundEvent = soundEvent;
this.dropItems = dropItems;
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder builder) {
ItemStack droppable = dropItems == null ? new ItemStack(this.asItem()) : dropItems;
return Arrays.asList(new ItemStack[] { droppable });
}
@Override
protected void onProjectileHit(final Level level, final BlockState state, final BlockHitResult hitResult,
final Projectile projectile) {
if (!level.isClientSide() && soundEvent != null) {
BlockPos hitPos = hitResult.getBlockPos();
level.playSound(null, hitPos, soundEvent, SoundSource.BLOCKS, 1.0F, 0.5F + level.getRandom().nextFloat() * 1.2F);
}
}
}

View File

@@ -1,28 +0,0 @@
package de.jottyfan.minecraft.block;
import java.util.Arrays;
import java.util.List;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.AmethystBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
/**
*
* @author jotty
*
*/
public class BlockOreTurquoise extends AmethystBlock {
public BlockOreTurquoise(Properties properties) {
super(properties.strength(3.0f).sound(SoundType.AMETHYST).requiresCorrectToolForDrops());
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(QuicklyItems.RAWTURQUOISE) });
}
}

View File

@@ -0,0 +1,125 @@
package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
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.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
/**
*
* @author jotty
*
*/
public class EmptyLavahoarder extends Block {
public EmptyLavahoarder(Properties properties) {
super(properties);
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder params) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.EMPTYLAVAHOARDER));
return list;
}
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean found = Lavahoarder.suckLava(level, pos.north());
found = found || Lavahoarder.suckLava(level, pos.south());
found = found || Lavahoarder.suckLava(level, pos.east());
found = found || Lavahoarder.suckLava(level, pos.west());
found = found || Lavahoarder.suckLava(level, pos.above());
found = found || Lavahoarder.suckLava(level, pos.below());
if (found) {
level.setBlock(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState(), 2);
level.scheduleTick(pos, QuicklyBlocks.LAVAHOARDER, 1);
} else {
level.scheduleTick(pos, this, 1);
}
}
private static final String stringOf(BlockPos pos) {
StringBuilder buf = new StringBuilder();
buf.append(pos.getX()).append(":");
buf.append(pos.getY()).append(":");
buf.append(pos.getZ());
return buf.toString();
}
private static final BlockPos blockPosOf(String s) {
if (s.contains(":")) {
String[] parts = s.split(":");
if (parts.length > 2) {
Integer x = Integer.valueOf(parts[0]);
Integer y = Integer.valueOf(parts[1]);
Integer z = Integer.valueOf(parts[2]);
return new BlockPos(x, y, z);
} else {
return null;
}
} else {
return null;
}
}
private void findAllAttachedLavaBlocks(Set<String> list, BlockPos pos, Level level, Integer counter) {
if (counter < 1) {
return;
} else if (Blocks.LAVA.equals(level.getBlockState(pos).getBlock())) {
String p = stringOf(pos);
if (!list.contains(p)) {
list.add(p);
findAllAttachedLavaBlocks(list, pos.above(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.below(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.north(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.south(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.east(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.west(), level, counter - 1);
}
}
}
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) {
Set<String> positions = new HashSet<>();
Integer counter = 8; // TODO: make it level up - able
findAllAttachedLavaBlocks(positions, pos.above(), level, counter);
findAllAttachedLavaBlocks(positions, pos.below(), level, counter);
findAllAttachedLavaBlocks(positions, pos.north(), level, counter);
findAllAttachedLavaBlocks(positions, pos.south(), level, counter);
findAllAttachedLavaBlocks(positions, pos.east(), level, counter);
findAllAttachedLavaBlocks(positions, pos.west(), level, counter);
Integer amount = positions.size();
for (String p : positions) {
level.setBlock(blockPosOf(p), Blocks.AIR.defaultBlockState(), 2);
}
if (amount > 0) {
level.setBlock(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState(), 2);
level.scheduleTick(pos, QuicklyBlocks.LAVAHOARDER, 1);
int count = 0;
Random random = new Random();
for (int i = 0; i < amount; i++) {
if (random.nextFloat() < 0.0125) {
count++;
}
}
if (count > 0) {
Lavahoarder.spawnRandomItems(level, pos.above(), count);
}
} else {
level.scheduleTick(pos, this, 1);
}
}
}

View File

@@ -0,0 +1,89 @@
package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.List;
import org.jspecify.annotations.Nullable;
import de.jottyfan.minecraft.blockentity.ItemHoarderBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
/**
*
* @author jotty
*
*/
public class Itemhoarder extends Block implements EntityBlock {
public Itemhoarder(Properties properties) {
super(properties.strength(2.5f));
}
@Override
public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState blockState) {
return new ItemHoarderBlockEntity(pos, blockState);
}
@Nullable
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state,
BlockEntityType<T> type) {
return level.isClientSide() ? null : (lvl, pos, st, be) -> {
if (be instanceof ItemHoarderBlockEntity ihbe) {
ItemHoarderBlockEntity.tick(lvl, pos, st, ihbe);
}
};
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player,
BlockHitResult hitResult) {
MutableComponent message = Component.empty();
BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof ItemHoarderBlockEntity) {
ItemHoarderBlockEntity ihbe = (ItemHoarderBlockEntity) blockEntity;
for (ItemStack stack : ihbe.getStacks().values()) {
MutableComponent line = Component.literal(stack.getCount() + "x ").append(stack.getHoverName());
message.append(Component.literal("\n")).append(line);
}
}
Component complete = Component.translatable("info.block.itemhoarder", message);
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.displayClientMessage(complete, false);
}
return InteractionResult.SUCCESS;
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder builder) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.ITEMHOARDER));
BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY);
if (blockEntity instanceof ItemHoarderBlockEntity) {
ItemHoarderBlockEntity ihbe = (ItemHoarderBlockEntity) blockEntity;
for (ItemStack stack : ihbe.getStacks().values()) {
list.add(stack);
}
}
return list;
}
}

View File

@@ -0,0 +1,128 @@
package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
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.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.phys.BlockHitResult;
/**
*
* @author jotty
*
*/
public class Lavahoarder extends Block {
public Lavahoarder(Properties properties) {
super(properties);
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder params) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.LAVAHOARDER));
return list;
}
public static final void spawnRandomItems(Level level, BlockPos pos, Integer count) {
Integer which = level.getRandom().nextInt(10);
ItemStack stack = null;
if (which < 1) {
stack = new ItemStack(Items.DIAMOND, level.getRandom().nextInt(count + 2));
} else if (which < 2) {
stack = new ItemStack(Items.EMERALD, level.getRandom().nextInt(count + 1));
} else if (which < 3) {
stack = new ItemStack(Items.RAW_GOLD, level.getRandom().nextInt(count));
} else if (which < 4) {
stack = new ItemStack(Items.RAW_IRON, level.getRandom().nextInt(count + 1));
} else if (which < 5) {
stack = new ItemStack(Items.RAW_COPPER, level.getRandom().nextInt(count + 2));
} else if (which < 6) {
stack = new ItemStack(Items.OBSIDIAN);
} else if (which < 7) {
stack = new ItemStack(Items.LAPIS_LAZULI);
} else if (which < 8) {
stack = new ItemStack(QuicklyItems.RAWTURQUOISE);
// } else if (which < 9) {
// stack = new ItemStack(QuicklyItems.SULFOR);
}
if (stack != null) {
level.addFreshEntity(new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), stack));
}
}
/**
* sucks the lava that touches the block
*
* @param world the world
* @param pos the pos
* @return true if lava was found
*/
public static final boolean suckLava(ServerLevel level, BlockPos pos) {
if (level == null) {
return false;
} else if (Blocks.LAVA.equals(level.getBlockState(pos).getBlock())) {
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 2);
if (new Random().nextFloat() > 0.9f) {
spawnRandomItems(level, pos.above(), 2);
}
return true;
}
return false;
}
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
suckLava(level, pos.north());
suckLava(level, pos.south());
suckLava(level, pos.east());
suckLava(level, pos.west());
suckLava(level, pos.above());
suckLava(level, pos.below());
level.scheduleTick(pos, this, 1);
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player,
BlockHitResult hitResult) {
if (!level.isClientSide()) {
ItemStack handStack = player.getMainHandItem();
if (handStack != null && Items.BUCKET.equals(handStack.getItem())) {
Integer amount = handStack.getCount();
ItemStack lavaBucketStack = new ItemStack(Items.LAVA_BUCKET, 1);
ItemStack emptyBucketStack = new ItemStack(Items.BUCKET, amount - 1);
if (emptyBucketStack.getCount() < 1) {
player.setItemInHand(InteractionHand.MAIN_HAND, lavaBucketStack);
} else {
player.setItemInHand(InteractionHand.MAIN_HAND, emptyBucketStack);
level.addFreshEntity(new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), lavaBucketStack));
}
spawnRandomItems(level, pos, 2);
level.setBlock(pos, QuicklyBlocks.EMPTYLAVAHOARDER.defaultBlockState(), 2);
level.scheduleTick(pos, this, 1);
}
}
return InteractionResult.SUCCESS; // forbid to empty the just filled lava bucket
}
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) {
level.scheduleTick(pos, this, 1);
}
}

View File

@@ -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 Monsterhoarder 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 Monsterhoarder(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<Block, BlockState> 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);
}
}
}

View File

@@ -3,18 +3,26 @@ package de.jottyfan.minecraft.block;
import java.util.function.Function;
import de.jottyfan.minecraft.Quickly;
import de.jottyfan.minecraft.blockentity.ItemHoarderBlockEntity;
import de.jottyfan.minecraft.item.QuicklyItems;
import de.jottyfan.minecraft.tab.QuicklyTab;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder.Factory;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.Item;
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.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour.Properties;
/**
@@ -26,11 +34,37 @@ public class QuicklyBlocks {
public static final Block KELPBUNDLE = registerBlock("kelpbundle",
Properties.of().instabreak().sound(SoundType.WET_GRASS).strength(0.1f).friction(0.95f));
public static final Block TURQUOISEBLOCK = registerBlock("blockturquoise", Properties.of().strength(1.5f));
public static final Block ORETURQUOISE = registerBlock("oreturquoise", p -> new BlockOreTurquoise(p));
public static final Block ORETURQUOISE = registerBlock("oreturquoise",
properties -> new BlockOre(properties.strength(3.0f).sound(SoundType.AMETHYST), SoundEvents.AMETHYST_BLOCK_CHIME,
new ItemStack(QuicklyItems.RAWTURQUOISE)));
public static final Block OREDEEPSLATETURQUOISE = registerBlock("oredeepslateturquoise",
p -> new BlockOreDeepslateTurquoise(p));
properties -> new BlockOre(properties, SoundEvents.AMETHYST_BLOCK_CHIME,
new ItemStack(QuicklyItems.RAWTURQUOISE, 2)));
public static final Block COTTONPLANT = registerBlock("blockcottonplant", Properties.ofFullCopy(Blocks.WHEAT),
p -> new BlockPlant(p, "cottonseed", "cotton"));
properties -> new BlockPlant(properties, "cottonseed", "cotton"));
public static final Block CANOLAPLANT = registerBlock("blockcanolaplant", Properties.ofFullCopy(Blocks.WHEAT),
properties -> new BlockPlant(properties, "canolaseed", "canola"));
public static final Block LAVAHOARDER = registerBlock("lavahoarder",
Properties.of().strength(2.5f).lightLevel(_ -> 15), properties -> new Lavahoarder(properties));
public static final Block EMPTYLAVAHOARDER = registerBlock("emptylavahoarder", Properties.of().strength(2.5f),
properties -> new EmptyLavahoarder(properties));
public static final Block QUICKIEPOWDER = registerBlock("blockquickiepowder",
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 Monsterhoarder(properties));
public static final Block ITEMHOARDER = registerBlock("itemhoarder", properties -> new Itemhoarder(properties));
public static final BlockEntityType<ItemHoarderBlockEntity> BLOCKENTITY_ITEMHOARDER = (BlockEntityType<ItemHoarderBlockEntity>) registerBlockEntity("itemhoarderblockentity", ItemHoarderBlockEntity::new, ITEMHOARDER);
private static final BlockEntityType<? extends BlockEntity> registerBlockEntity(String name, Factory<? extends BlockEntity> factory, Block block) {
return Registry.register(
BuiltInRegistries.BLOCK_ENTITY_TYPE,
Identifier.fromNamespaceAndPath(Quickly.MOD_ID, name),
FabricBlockEntityTypeBuilder.create(factory, block).build()
);
}
private static final Block registerBlock(String name, Properties properties) {
return QuicklyBlocks.registerBlock(name, properties, p -> new Block(p));
@@ -51,12 +85,16 @@ public class QuicklyBlocks {
}
public static void registerModBlocks() {
ItemGroupEvents.modifyEntriesEvent(CreativeModeTabs.BUILDING_BLOCKS).register(block -> {
ItemGroupEvents.modifyEntriesEvent(QuicklyTab.QUICKLY_TAB).register(block -> {
block.accept(KELPBUNDLE);
block.accept(TURQUOISEBLOCK);
block.accept(ORETURQUOISE);
block.accept(OREDEEPSLATETURQUOISE);
block.accept(COTTONPLANT);
block.accept(EMPTYLAVAHOARDER);
block.accept(SPEEDPOWDER);
block.accept(QUICKIEPOWDER);
block.accept(MONSTERHOARDER);
block.accept(ITEMHOARDER);
});
}
}

View File

@@ -0,0 +1,172 @@
package de.jottyfan.minecraft.blockentity;
import java.util.HashMap;
import java.util.Map;
import com.mojang.serialization.Codec;
import de.jottyfan.minecraft.Quickly;
import de.jottyfan.minecraft.block.QuicklyBlocks;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.Container;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.HopperBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import net.minecraft.world.phys.AABB;
/**
*
* @author jotty
*
*/
public class ItemHoarderBlockEntity extends BlockEntity implements Container {
public static final Codec<Map<String, ItemStack>> ITEM_STACK_MAP_CODEC =
Codec.unboundedMap(Codec.STRING, ItemStack.CODEC);
private Map<String, ItemStack> stacks = new HashMap<>();
private static final Integer suckradius = 4;
public ItemHoarderBlockEntity(BlockPos pos, BlockState state) {
super(QuicklyBlocks.BLOCKENTITY_ITEMHOARDER, pos, state);
}
private static final String getItemId(Item item) {
return item.getName().getString();
}
public final static boolean setStackToSlots(ItemStack stack, Map<String, ItemStack> stacks) {
if (stack.isEmpty()) {
Quickly.LOGGER.info("FATAL!!! tried to set empty stack. Check your code!");
return false;
}
String key = getItemId(stack.getItem());
ItemStack s = stacks.get(key);
if (s == null) {
stacks.put(key, stack);
} else {
stacks.get(key).grow(stack.getCount());
}
return true;
}
private static final void suck(Level level, BlockPos pos, ItemHoarderBlockEntity be) {
AABB checkArea = new AABB(pos).inflate(suckradius);
for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, checkArea, Entity::isAlive)) {
ItemStack stack = itemEntity.getItem();
if (ItemHoarderBlockEntity.setStackToSlots(stack, be.getStacks())) {
itemEntity.discard();
}
}
}
private static final void dropToHopper(Level level, BlockPos pos, BlockState state,
ItemHoarderBlockEntity blockEntity) {
BlockEntity beBelow = level.getBlockEntity(pos.below());
if (beBelow instanceof Container targetInventory) {
for (String stackKey : blockEntity.getStacks().keySet()) {
ItemStack stackInSlot = blockEntity.getStack(stackKey);
if (!stackInSlot.isEmpty()) {
ItemStack toInsert = stackInSlot.copy();
int oldCount = toInsert.getCount();
ItemStack remainder = HopperBlockEntity.addItem(blockEntity, targetInventory, toInsert, Direction.UP);
int movedAmount = oldCount - remainder.getCount();
if (movedAmount > 0) {
stackInSlot.shrink(movedAmount);
blockEntity.setChanged();
targetInventory.setChanged();
return;
}
}
}
}
}
private ItemStack getStack(String stackKey) {
return stacks.get(stackKey);
}
public static void tick(Level level, BlockPos pos, BlockState state, ItemHoarderBlockEntity be) {
suck(level, pos, be);
dropToHopper(level, pos, state, be);
}
@Override
protected void saveAdditional(ValueOutput output) {
super.saveAdditional(output);
output.store("items", ITEM_STACK_MAP_CODEC, stacks);
}
@Override
protected void loadAdditional(ValueInput input) {
super.loadAdditional(input);
stacks.clear();
stacks.putAll(input.read("items", ITEM_STACK_MAP_CODEC).orElse(Map.of()));
}
public float getSuckradius() {
return suckradius;
}
@Override
public int getContainerSize() {
return stacks.size() + 1;
}
@Override
public boolean isEmpty() {
return stacks.isEmpty();
}
@Override
public ItemStack getItem(int slot) {
// buggy; do not use this. The map wants to have an item name instead
return ItemStack.EMPTY;
}
@Override
public ItemStack removeItem(int slot, int count) {
// buggy; do not use this. The map wants to have an item name instead
return ItemStack.EMPTY;
}
@Override
public ItemStack removeItemNoUpdate(int slot) {
// buggy; do not use this. The map wants to have an item name instead
return ItemStack.EMPTY;
}
@Override
public void setItem(int slot, ItemStack itemStack) {
if (slot < stacks.size()) {
stacks.get(itemStack.getItem().getName().getString()).grow(itemStack.getCount());
} else if (!itemStack.isEmpty()) {
stacks.put(itemStack.getItem().getName().getString(), itemStack);
}
setChanged();
}
@Override
public boolean stillValid(Player player) {
return true;
}
@Override
public void clearContent() {
stacks.clear();
setChanged();
}
public Map<String, ItemStack> getStacks() {
return stacks;
}
}

View File

@@ -0,0 +1,20 @@
package de.jottyfan.minecraft.composter;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.fabricmc.fabric.api.registry.CompostingChanceRegistry;
/**
*
* @author jotty
*
*/
public class QuicklyComposter {
public static final void registerComposterItems() {
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.COTTONSEED, 0.5f);
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.COTTON, 0.75f);
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.CANOLASEED, 0.5f);
CompostingChanceRegistry.INSTANCE.add(QuicklyItems.CANOLA, 0.75f);
}
}

View File

@@ -0,0 +1,31 @@
package de.jottyfan.minecraft.item;
import java.util.EnumMap;
import de.jottyfan.minecraft.Quickly;
import net.minecraft.core.Registry;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Util;
import net.minecraft.world.item.equipment.ArmorMaterial;
import net.minecraft.world.item.equipment.ArmorType;
import net.minecraft.world.item.equipment.EquipmentAsset;
/**
*
* @author jotty
*
*/
public class ModArmorMaterials {
static ResourceKey<? extends Registry<EquipmentAsset>> REGISTRY_KEY = ResourceKey.createRegistryKey(Identifier.fromNamespaceAndPath("minecraft", "equipment_asset"));
public static final ResourceKey<EquipmentAsset> TURQUOISE_KEY = ResourceKey.create(REGISTRY_KEY, Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "turquoise"));
public static final ArmorMaterial TURQUOISE_ARMOR_MATERIAL = new ArmorMaterial(500, Util.make(new EnumMap<>(ArmorType.class), map -> {
map.put(ArmorType.BOOTS, 4);
map.put(ArmorType.LEGGINGS, 8);
map.put(ArmorType.CHESTPLATE, 15);
map.put(ArmorType.HELMET, 4);
map.put(ArmorType.BODY, 8);
}), 20, SoundEvents.ARMOR_EQUIP_DIAMOND, 0, 0, null, TURQUOISE_KEY);
}

View File

@@ -3,15 +3,16 @@ package de.jottyfan.minecraft.item;
import java.util.function.Function;
import de.jottyfan.minecraft.Quickly;
import de.jottyfan.minecraft.tab.QuicklyTab;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Item.Properties;
import net.minecraft.world.item.equipment.ArmorType;
/**
*
@@ -24,7 +25,34 @@ public class QuicklyItems {
public static final Item TURQUOISEINGOT = registerItem("turquoiseingot");
public static final Item COTTON = registerItem("cotton");
public static final Item COTTONPLANT = registerItem("cottonplant");
public static final Item COTTONSEED = registerItem("cottonseed", properties -> new Plant(properties, "blockcottonplant"));
public static final Item COTTONSEED = registerItem("cottonseed",
properties -> new Plant(properties, "blockcottonplant"));
public static final Item CANOLA = registerItem("canola");
public static final Item CANOLAPLANT = registerItem("canolaplant");
public static final Item CANOLASEED = registerItem("canolaseed",
properties -> new Plant(properties, "blockcanolaplant"));
public static final Item CANOLABOTTLE = registerItem("canolabottle");
public static final Item CANOLABOTTLESTACK = registerItem("canolabottlestack");
public static final Item ROTTENFLESHSTRIPES = registerItem("rotten_flesh_stripes");
public static final Item OXIDIZEDCOPPERPOWDER = registerItem("oxidizedcopperpowder");
public static final Item COPPERSTRING = registerItem("copperstring");
public static final Item COPPERPOWDER = registerItem("copperpowder");
public static final Item COPPERSTUB = registerItem("copperstub");
public static final Item COPPERSTICK = registerItem("copperstick");
public static final Item SPEEDPOWDER = registerItem("speedpowder");
public static final Item QUICKIEPOWDER = registerItem("quickiepowder");
public static final Item SPEEDINGOT = registerItem("speedingot");
public static final Item QUICKIEINGOT = registerItem("quickieingot");
public static final Item ARMOR_TURQUOISE_BOOTS = registerItem("turquoise_boots", ArmorType.BOOTS);
public static final Item ARMOR_TURQUOISE_HELMET = registerItem("turquoise_helmet", ArmorType.HELMET);
public static final Item ARMOR_TURQUOISE_LEGGINGS = registerItem("turquoise_leggings", ArmorType.LEGGINGS);
public static final Item ARMOR_TURQUOISE_CHESTPLATE = registerItem("turquoise_chestplate", ArmorType.CHESTPLATE);
private static final Item registerItem(String name, ArmorType armorType) {
return QuicklyItems.registerItem(name,
new Item.Properties().stacksTo(1).humanoidArmor(ModArmorMaterials.TURQUOISE_ARMOR_MATERIAL, armorType));
}
private static final Item registerItem(String name) {
return QuicklyItems.registerItem(name, new Item.Properties());
@@ -45,13 +73,31 @@ public class QuicklyItems {
return Registry.register(BuiltInRegistries.ITEM, identifier, item);
}
public static void registerModItems() {
ItemGroupEvents.modifyEntriesEvent(CreativeModeTabs.TOOLS_AND_UTILITIES).register(item -> {
public static final void registerModItems() {
ItemGroupEvents.modifyEntriesEvent(QuicklyTab.QUICKLY_TAB).register(item -> {
item.accept(STUB);
item.accept(RAWTURQUOISE);
item.accept(TURQUOISEINGOT);
item.accept(COTTON);
item.accept(COTTONSEED);
item.accept(ROTTENFLESHSTRIPES);
item.accept(CANOLA);
item.accept(CANOLASEED);
item.accept(CANOLABOTTLE);
item.accept(CANOLABOTTLESTACK);
item.accept(RAWTURQUOISE);
item.accept(SPEEDPOWDER);
item.accept(QUICKIEPOWDER);
item.accept(TURQUOISEINGOT);
item.accept(SPEEDINGOT);
item.accept(QUICKIEINGOT);
item.accept(COPPERPOWDER);
item.accept(OXIDIZEDCOPPERPOWDER);
item.accept(COPPERSTRING);
item.accept(COPPERSTICK);
item.accept(COPPERSTUB);
item.accept(ARMOR_TURQUOISE_HELMET);
item.accept(ARMOR_TURQUOISE_CHESTPLATE);
item.accept(ARMOR_TURQUOISE_LEGGINGS);
item.accept(ARMOR_TURQUOISE_BOOTS);
});
}
}

View File

@@ -24,19 +24,16 @@ import net.minecraft.world.level.block.Blocks;
*/
public class Stub extends Item {
// @formatter:off
private static final Map<Block, Item> SLASH_MAP = Map.of(
Blocks.HAY_BLOCK, Items.WHEAT,
Blocks.DRIED_KELP_BLOCK, Items.DRIED_KELP,
QuicklyBlocks.KELPBUNDLE, Items.KELP);
// @formatter:on
public Stub(Properties properties) {
super(properties.stacksTo(64));
}
@Override
public InteractionResult useOn(UseOnContext context) {
Map<Block, Item> SLASH_MAP = Map.of(
Blocks.HAY_BLOCK, Items.WHEAT,
Blocks.DRIED_KELP_BLOCK, Items.DRIED_KELP,
QuicklyBlocks.KELPBUNDLE, Items.KELP);
Level level = context.getLevel();
BlockPos pos = context.getClickedPos();
Block clickedBlock = level.getBlockState(pos).getBlock();

View File

@@ -0,0 +1,37 @@
package de.jottyfan.minecraft.loot;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.fabricmc.fabric.api.loot.v3.LootTableEvents;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
/**
*
* @author jotty
*
*/
public class QuicklyLootTables {
public static final void registerChanges() {
LootTableEvents.MODIFY.register((key, tableBuilder, source, registries) -> {
if (source.isBuiltin()) {
Identifier shortGrass = Identifier.fromNamespaceAndPath("minecraft", "blocks/short_grass");
Identifier tallGrass = Identifier.fromNamespaceAndPath("minecraft", "blocks/tall_grass");
if (key.identifier().equals(shortGrass)) {
tableBuilder.withPool(harvestItemByChance(QuicklyItems.COTTONSEED, 0.05f));
} else if (key.identifier().equals(tallGrass)) {
tableBuilder.withPool(harvestItemByChance(QuicklyItems.CANOLASEED, 0.03f));
}
}
});
}
private static final LootPool.Builder harvestItemByChance(Item item, float chance) {
return LootPool.lootPool().setRolls(ConstantValue.exactly(1f))
.when(LootItemRandomChanceCondition.randomChance(chance)).add(LootItem.lootTableItem(item));
}
}

View File

@@ -0,0 +1,31 @@
package de.jottyfan.minecraft.tab;
import de.jottyfan.minecraft.Quickly;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
/**
*
* @author jotty
*
*/
public class QuicklyTab {
public static final ResourceKey<CreativeModeTab> QUICKLY_TAB = ResourceKey.create(Registries.CREATIVE_MODE_TAB,
Identifier.fromNamespaceAndPath(Quickly.MOD_ID, "itemgroup"));
public static final void registerItemGroup() {
Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, QUICKLY_TAB,
FabricItemGroup.builder().icon(() -> new ItemStack(QuicklyItems.STUB))
.title(Component.translatable("tab." + Quickly.MOD_ID)).build());
}
}

View File

@@ -0,0 +1,12 @@
{
"variants": {
"age=0": { "model": "quickly:block/canolaplant0" },
"age=1": { "model": "quickly:block/canolaplant1" },
"age=2": { "model": "quickly:block/canolaplant2" },
"age=3": { "model": "quickly:block/canolaplant3" },
"age=4": { "model": "quickly:block/canolaplant4" },
"age=5": { "model": "quickly:block/canolaplant5" },
"age=6": { "model": "quickly:block/canolaplant6" },
"age=7": { "model": "quickly:block/canolaplant7" }
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/blockquickiepowder"
}
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/blockspeedpowder"
}
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/emptylavahoarder"
}
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/itemhoarder"
}
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/lavahoarder"
}
}
}

View File

@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "quickly:block/monsterhoarder"
}
}
}

View File

@@ -0,0 +1,14 @@
{
"layers": {
"humanoid": [
{
"texture": "quickly:turquoise"
}
],
"humanoid_leggings": [
{
"texture": "quickly:turquoise"
}
]
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,40 @@
{
"info.block.itemhoarder": "enthält: %s",
"info.block.monsterhoarder": "Radius: %s, Brenndauer: %s Ticks",
"item.quickly.blockcanolaplant": "Rapspflanze",
"item.quickly.blockcottonplant": "Baumwollpflanze",
"item.quickly.blockquickiepowder": "Eilpulverblock",
"item.quickly.blockspeedpowder": "Fluchtpulverblock",
"item.quickly.blockturquoise": "Türkisblock",
"item.quickly.canola": "Raps",
"item.quickly.canolabottle": "Rapsöl",
"item.quickly.canolabottlestack": "Rapsölsammlung",
"item.quickly.canolaseed": "Rapssaat",
"item.quickly.copperpowder": "Kupferpulver",
"item.quickly.copperstick": "Kupferstock",
"item.quickly.copperstring": "Kupferband",
"item.quickly.copperstub": "Kupferstummel",
"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",
"item.quickly.quickieingot": "Eilpulverbarren",
"item.quickly.quickiepowder": "Eilpulver",
"item.quickly.rawturquoise": "rohes Türkis",
"item.quickly.rotten_flesh_stripes": "geschnittenes Gammelfleisch",
"item.quickly.speedingot": "Fluchtpulverbarren",
"item.quickly.speedpowder": "Fluchtpulver",
"item.quickly.stub": "Stummel",
"item.quickly.turquoiseingot": "Türkisbarren"
"item.quickly.turquoise_boots": "Türkisschuhe",
"item.quickly.turquoise_chestplate": "Türkisbrustpanzer",
"item.quickly.turquoise_helmet": "Türkishelm",
"item.quickly.turquoise_leggings": "Türkishose",
"item.quickly.turquoiseingot": "Türkisbarren",
"tab.quickly": "quickly"
}

View File

@@ -1,12 +1,40 @@
{
"info.block.itemhoarder": "contains: %s",
"info.block.monsterhoarder": "radius: %s, burn ticks: %s",
"item.quickly.blockcanolaplant": "canola plant",
"item.quickly.blockcottonplant": "cotton plant",
"item.quickly.blockquickiepowder": "quickie powder block",
"item.quickly.blockspeedpowder": "speed powder block",
"item.quickly.blockturquoise": "block of turquoise",
"item.quickly.canola": "canola",
"item.quickly.canolabottle": "canola oil",
"item.quickly.canolabottlestack": "canola oil collection",
"item.quickly.canolaseed": "canola seed",
"item.quickly.copperpowder": "copper powder",
"item.quickly.copperstick": "copper stick",
"item.quickly.copperstring": "copper string",
"item.quickly.copperstub": "copper stub",
"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",
"item.quickly.quickieingot": "quickie powder ingot",
"item.quickly.quickiepowder": "quickie powder",
"item.quickly.rawturquoise": "raw turquoise",
"item.quickly.rotten_flesh_stripes": "rotton flesh stripes",
"item.quickly.speedingot": "speed powder ingot",
"item.quickly.speedpowder": "speed powder",
"item.quickly.stub": "stub",
"item.quickly.turquoiseingot": "turquoise ingot"
"item.quickly.turquoise_boots": "turquoise boots",
"item.quickly.turquoise_chestplate": "turquoise chestplate",
"item.quickly.turquoise_helmet": "turquoise helmet",
"item.quickly.turquoise_leggings": "turquoise leggings",
"item.quickly.turquoiseingot": "turquoise ingot",
"tab.quickly": "quickly"
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/blockquickiepowder"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/blockspeedpowder"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant0"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant1"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant2"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant3"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant4"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant5"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant6"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent":"block/cross",
"textures":{
"cross":"quickly:block/canolaplant7"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/emptylavahoarder"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/itemhoarder"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/lavahoarder"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "quickly:block/monsterhoarder"
}
}

View File

@@ -0,0 +1,10 @@
{
"parent": "quickly:block/blockquickiepowder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@@ -0,0 +1,10 @@
{
"parent": "quickly:block/blockspeedpowder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,10 @@
{
"parent": "quickly:block/emptylavahoarder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@@ -0,0 +1,10 @@
{
"parent": "quickly:block/itemhoarder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@@ -0,0 +1,10 @@
{
"parent": "quickly:block/lavahoarder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@@ -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 ]
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Some files were not shown because too many files have changed in this diff Show More