added itemhoarder with block entity
This commit is contained in:
		| @@ -6,6 +6,7 @@ import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import de.jottyfan.quickiemod.block.ModBlocks; | ||||
| import de.jottyfan.quickiemod.blockentity.ModBlockentity; | ||||
| import de.jottyfan.quickiemod.item.ModItems; | ||||
| import de.jottyfan.quickiemod.itemgroup.ModItemGroup; | ||||
| import net.fabricmc.api.ModInitializer; | ||||
| @@ -25,6 +26,7 @@ public class Quickiemod implements ModInitializer { | ||||
| 	public void onInitialize() { | ||||
| 		List<Item> items = ModItems.registerModItems(); | ||||
| 		List<Block> blocks = ModBlocks.registerModBlocks(); | ||||
| 		ModBlockentity.registerModBlockentities(); | ||||
| 		ModItemGroup.registerItemGroup(items, blocks); | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,95 @@ | ||||
| package de.jottyfan.quickiemod.block; | ||||
|  | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
|  | ||||
| import de.jottyfan.quickiemod.blockentity.ModBlockentity; | ||||
| import net.minecraft.block.AbstractBlock; | ||||
| import net.minecraft.block.Block; | ||||
| import net.minecraft.block.BlockEntityProvider; | ||||
| import net.minecraft.block.BlockRenderType; | ||||
| import net.minecraft.block.BlockState; | ||||
| import net.minecraft.block.entity.BlockEntity; | ||||
| import net.minecraft.block.entity.BlockEntityTicker; | ||||
| import net.minecraft.block.entity.BlockEntityType; | ||||
| import net.minecraft.entity.player.PlayerEntity; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.loot.context.LootWorldContext.Builder; | ||||
| import net.minecraft.registry.RegistryKey; | ||||
| import net.minecraft.registry.RegistryKeys; | ||||
| import net.minecraft.text.Style; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.ActionResult; | ||||
| import net.minecraft.util.Formatting; | ||||
| import net.minecraft.util.Identifier; | ||||
| import net.minecraft.util.ItemScatterer; | ||||
| import net.minecraft.util.hit.BlockHitResult; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.World; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| public class BlockItemhoarder extends Block implements BlockEntityProvider { | ||||
|  | ||||
| 	public BlockItemhoarder(Identifier identifier) { | ||||
| 		super(AbstractBlock.Settings.create().hardness(2.5f).registryKey(RegistryKey.of(RegistryKeys.BLOCK, identifier))); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public BlockEntity createBlockEntity(BlockPos pos, BlockState blockState) { | ||||
| 		return ModBlockentity.ITEM_HOARDER_BLOCKENTITY.instantiate(pos, blockState); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public BlockRenderType getRenderType(BlockState state) { | ||||
| 		return BlockRenderType.MODEL; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public <T extends BlockEntity> BlockEntityTicker<T> getTicker(World world, BlockState state, | ||||
| 			BlockEntityType<T> type) { | ||||
| 		return (world1, pos, state1, be) -> ItemHoarderBlockEntity.tick(world1, pos, state1, be); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) { | ||||
| 		List<ItemStack> list = new ArrayList<>(); | ||||
| 		list.add(new ItemStack(ModBlocks.BLOCK_ITEMHOARDER)); | ||||
| 		return list; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public BlockState onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { | ||||
| 		BlockEntity blockEntity = world.getBlockEntity(pos); | ||||
| 		if (blockEntity instanceof ItemHoarderBlockEntity) { | ||||
| 			ItemHoarderBlockEntity ihbe = (ItemHoarderBlockEntity) blockEntity; | ||||
| 			for (ItemStack stack : ihbe.getStacks()) { | ||||
| 				ItemScatterer.spawn(world, pos.getX(), pos.getY(), pos.getZ(), stack); | ||||
| 			} | ||||
| 		} | ||||
| 		return super.onBreak(world, pos, state, player); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { | ||||
| 		if (!world.isClient) { | ||||
| 			BlockEntity blockEntity = world.getBlockEntity(pos); | ||||
| 			if (blockEntity instanceof ItemHoarderBlockEntity) { | ||||
| 				ItemHoarderBlockEntity ihbe = (ItemHoarderBlockEntity) blockEntity; | ||||
| 				player.sendMessage( | ||||
| 						Text.translatable("msg.itemhoarder.summary", new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())) | ||||
| 								.setStyle(Style.EMPTY.withColor(Formatting.BOLD)), | ||||
| 						false); | ||||
| 				for (Text text : ihbe.getSummary()) { | ||||
| 					player.sendMessage(text, false); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		return ActionResult.SUCCESS; | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,155 @@ | ||||
| package de.jottyfan.quickiemod.block; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import de.jottyfan.quickiemod.blockentity.ModBlockentity; | ||||
| import net.minecraft.block.BlockState; | ||||
| import net.minecraft.block.entity.BlockEntity; | ||||
| import net.minecraft.block.entity.LootableContainerBlockEntity; | ||||
| import net.minecraft.entity.Entity; | ||||
| import net.minecraft.entity.Entity.RemovalReason; | ||||
| import net.minecraft.entity.ItemEntity; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.inventory.Inventories; | ||||
| import net.minecraft.item.Item; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.item.Items; | ||||
| import net.minecraft.nbt.NbtCompound; | ||||
| import net.minecraft.registry.RegistryWrapper.WrapperLookup; | ||||
| import net.minecraft.screen.ScreenHandler; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.collection.DefaultedList; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.math.Box; | ||||
| import net.minecraft.world.World; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| public class ItemHoarderBlockEntity extends LootableContainerBlockEntity { | ||||
|  | ||||
|  | ||||
| 	private DefaultedList<ItemStack> stacks; | ||||
| 	private float suckradius; | ||||
|  | ||||
| 	public ItemHoarderBlockEntity(BlockPos pos, BlockState state) { | ||||
| 		super(ModBlockentity.ITEM_HOARDER_BLOCKENTITY, pos, state); | ||||
| 		stacks = DefaultedList.ofSize(54, ItemStack.EMPTY); | ||||
| 		setSuckradius(4f); | ||||
| 	} | ||||
|  | ||||
| 	// TODO: see https://fabricmc.net/wiki/tutorial:containers for a real chest | ||||
|  | ||||
| 	public final static boolean setStackToSlots(ItemStack stack, List<ItemStack> stacks) { | ||||
| 		for (ItemStack slot : stacks) { | ||||
| 			if (slot.getItem().equals(stack.getItem())) { | ||||
| 				slot.increment(stack.getCount()); | ||||
| 				return true; | ||||
| 			} | ||||
| 		} // if not found, seek for an empty stack instead | ||||
| 		for (ItemStack slot : stacks) { | ||||
| 			if (slot.isEmpty()) { | ||||
| 				Integer index = stacks.indexOf(slot); | ||||
| 				stacks.set(index, stack.copy()); | ||||
| 				return true; | ||||
| 			} | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { | ||||
| 		if (be instanceof ItemHoarderBlockEntity) { | ||||
| 			ItemHoarderBlockEntity ihbe = (ItemHoarderBlockEntity) be; | ||||
| 			Box box = new Box(pos).expand(ihbe.getSuckradius()); | ||||
| 			List<Entity> entities = world.getOtherEntities(null, box); | ||||
| 			for (Entity entity : entities) { | ||||
| 				if (entity instanceof ItemEntity) { | ||||
| 					ItemEntity itemEntity = (ItemEntity) entity; | ||||
| 					if (itemEntity.isAlive()) { | ||||
| 						ItemStack stack = itemEntity.getStack(); | ||||
| 						if (stack != null) { | ||||
| 							if (ItemHoarderBlockEntity.setStackToSlots(stack, ihbe.getStacks())) { | ||||
| 								itemEntity.remove(RemovalReason.DISCARDED); | ||||
| 							} // else inventory is full | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected void writeNbt(NbtCompound nbt, WrapperLookup registryLookup) { | ||||
| 		super.writeNbt(nbt, registryLookup); | ||||
| 		if (!this.writeLootTable(nbt)) { | ||||
| 			Inventories.writeNbt(nbt, this.stacks, registryLookup); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected void readNbt(NbtCompound nbt, WrapperLookup registryLookup) { | ||||
| 		super.readNbt(nbt, registryLookup); | ||||
| 		this.stacks = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); | ||||
| 		if (!this.readLootTable(nbt)) { | ||||
| 			Inventories.readNbt(nbt, this.stacks, registryLookup); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public List<ItemStack> getStacks() { | ||||
| 		return stacks; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int size() { | ||||
| 		return 54; // container chest size (9 * 6) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected DefaultedList<ItemStack> getHeldStacks() { | ||||
| 		return stacks; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected void setHeldStacks(DefaultedList<ItemStack> list) { | ||||
| 		this.stacks = list; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { | ||||
| 		// TODO: implement, see https://fabricmc.net/wiki/tutorial:containers | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected Text getContainerName() { | ||||
| 		return Text.translatable("container.itemhoarder"); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * get a summary of content for the chat box | ||||
| 	 * | ||||
| 	 * @return the summary | ||||
| 	 */ | ||||
| 	public List<Text> getSummary() { | ||||
| 		List<Text> list = new ArrayList<>(); | ||||
| 		for (ItemStack stack : stacks) { | ||||
| 			Item item = stack.getItem(); | ||||
| 			if (item != Items.AIR) { | ||||
| 				Text text = Text.of(String.format("%dx %s", stack.getCount(), Text.translatable(stack.getItem().getTranslationKey()))); | ||||
| 				list.add(text); | ||||
| 			} | ||||
| 		} | ||||
| 		return list; | ||||
| 	} | ||||
|  | ||||
| 	public float getSuckradius() { | ||||
| 		return suckradius; | ||||
| 	} | ||||
|  | ||||
| 	public void setSuckradius(float suckradius) { | ||||
| 		this.suckradius = suckradius; | ||||
| 	} | ||||
| } | ||||
| @@ -37,6 +37,8 @@ public class ModBlocks { | ||||
| 			new BlockLavahoarder(ModIdentifiers.BLOCK_LAVAHOARDER)); | ||||
| 	public static final Block BLOCK_EMPTYLAVAHOARDER = registerBlock(ModIdentifiers.BLOCK_EMPTYLAVAHOARDER, | ||||
| 			new BlockEmptyLavahoarder(ModIdentifiers.BLOCK_EMPTYLAVAHOARDER)); | ||||
| 	public static final Block BLOCK_ITEMHOARDER = registerBlock(ModIdentifiers.BLOCK_ITEMHOARDER, | ||||
| 			new BlockItemhoarder(ModIdentifiers.BLOCK_ITEMHOARDER)); | ||||
|  | ||||
| 	private static final Block registerBlock(Identifier identifier, Block block) { | ||||
| 		Registry.register(Registries.ITEM, identifier, new BlockItem(block, new Item.Settings() | ||||
| @@ -55,6 +57,7 @@ public class ModBlocks { | ||||
| 		blocks.add(BLOCK_MONSTERHOARDER); | ||||
| 		blocks.add(BLOCK_EMPTYLAVAHOARDER); | ||||
| 		blocks.add(BLOCK_LAVAHOARDER); | ||||
| 		blocks.add(BLOCK_ITEMHOARDER); | ||||
| 		return blocks; | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,24 @@ | ||||
| package de.jottyfan.quickiemod.blockentity; | ||||
|  | ||||
| import de.jottyfan.quickiemod.Quickiemod; | ||||
| import de.jottyfan.quickiemod.block.ItemHoarderBlockEntity; | ||||
| import de.jottyfan.quickiemod.block.ModBlocks; | ||||
| import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; | ||||
| import net.minecraft.block.entity.BlockEntityType; | ||||
| import net.minecraft.registry.Registries; | ||||
| import net.minecraft.registry.Registry; | ||||
| import net.minecraft.util.Identifier; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| public class ModBlockentity { | ||||
| 	public static final BlockEntityType<ItemHoarderBlockEntity> ITEM_HOARDER_BLOCKENTITY = Registry.register( | ||||
| 			Registries.BLOCK_ENTITY_TYPE, Identifier.of(Quickiemod.MOD_ID, "itemhoarderblockentity"), | ||||
| 			FabricBlockEntityTypeBuilder.create(ItemHoarderBlockEntity::new, ModBlocks.BLOCK_ITEMHOARDER).build()); | ||||
|  | ||||
| 	public static final void registerModBlockentities() { | ||||
| 	}; | ||||
| } | ||||
| @@ -27,4 +27,5 @@ public class ModIdentifiers { | ||||
| 	public static final Identifier BLOCK_MONSTERHOARDER = Identifier.of(Quickiemod.MOD_ID, "monsterhoarder"); | ||||
| 	public static final Identifier BLOCK_LAVAHOARDER = Identifier.of(Quickiemod.MOD_ID, "lavahoarder");; | ||||
| 	public static final Identifier BLOCK_EMPTYLAVAHOARDER = Identifier.of(Quickiemod.MOD_ID, "emptylavahoarder");; | ||||
| 	public static final Identifier BLOCK_ITEMHOARDER = Identifier.of(Quickiemod.MOD_ID, "itemhoarder");; | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"variants": { | ||||
| 		"": { | ||||
| 			"model": "quickiemod:block/itemhoarder" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
| 		"parent": "block/cube_all", | ||||
| 		"textures": { | ||||
| 				"all": "quickiemod:block/itemhoarder" | ||||
| 		} | ||||
| } | ||||
| @@ -0,0 +1,10 @@ | ||||
| { | ||||
| 		"parent": "quickiemod:block/itemhoarder", | ||||
| 		"display": { | ||||
| 				"thirdperson": { | ||||
| 						"rotation": [ 10, -45, 170 ], | ||||
| 						"translation": [ 0, 1.5, -2.75 ], | ||||
| 						"scale": [ 0.375, 0.375, 0.375 ] | ||||
| 				} | ||||
| 		} | ||||
| } | ||||
| @@ -0,0 +1,16 @@ | ||||
| { | ||||
| 	"type": "minecraft:crafting_shaped", | ||||
| 	"pattern": [ | ||||
| 		"ooo", | ||||
| 		"oso", | ||||
| 		"ooo" | ||||
| 	], | ||||
| 	"key": { | ||||
| 		"o": "quickiemod:speedingot", | ||||
| 		"s": "minecraft:barrel" | ||||
| 	}, | ||||
| 	"result": { | ||||
| 		"id": "quickiemod:itemhoarder", | ||||
| 		"count": 1 | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,16 @@ | ||||
| { | ||||
| 	"type": "minecraft:crafting_shaped", | ||||
| 	"pattern": [ | ||||
| 		"ooo", | ||||
| 		"oso", | ||||
| 		"ooo" | ||||
| 	], | ||||
| 	"key": { | ||||
| 		"o": "quickiemod:speedingot", | ||||
| 		"s": "c:chests" | ||||
| 	}, | ||||
| 	"result": { | ||||
| 		"id": "quickiemod:itemhoarder", | ||||
| 		"count": 1 | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user