Compare commits

..
7 Commits
Author SHA1 Message Date
YouHaveTrouble b93718cce2 fix minor bugs related to tools enchanted with tunnelling breaking 2026-09-28 21:52:09 +02:00
YouHaveTrouble b3998f8937 more defaults for tunnelling 2026-09-28 20:27:48 +02:00
YouHaveTrouble 7f530a1e87 update workflows 2026-09-28 17:40:57 +02:00
YouHaveTrouble e62bff7c73 update package lock 2026-09-28 17:30:39 +02:00
YouHaveTrouble 9050004dae Revert "don't track package-lock"
This reverts commit 0f20ce8520.
2026-09-28 17:29:28 +02:00
YouHaveTrouble 3f76e0a431 update the docs 2026-09-28 17:28:36 +02:00
YouHaveTrouble 0f20ce8520 don't track package-lock 2026-09-28 17:17:20 +02:00
9 changed files with 2396 additions and 3598 deletions
+3 -3
View File
@@ -10,13 +10,13 @@ jobs:
build-commit: build-commit:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v7
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Set up JDK - name: Set up JDK
uses: actions/setup-java@v4 uses: actions/setup-java@v6
with: with:
java-version: 21 java-version: '21'
distribution: 'temurin' distribution: 'temurin'
- name: Set short commit hash - name: Set short commit hash
run: fullCommit=${{ github.sha }} && echo "SHORT_SHA=${fullCommit:0:8}" >> $GITHUB_ENV run: fullCommit=${{ github.sha }} && echo "SHORT_SHA=${fullCommit:0:8}" >> $GITHUB_ENV
+3 -3
View File
@@ -16,9 +16,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Build Astro page - name: Build Astro page
uses: withastro/action@v4 uses: withastro/action@v6
with: with:
path: ./docs path: ./docs
node-version: '24' node-version: '24'
@@ -31,4 +31,4 @@ jobs:
steps: steps:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deployment id: deployment
uses: actions/deploy-pages@v4 uses: actions/deploy-pages@v5
+1 -1
View File
@@ -11,7 +11,7 @@ export default defineConfig({
sidebar: [ sidebar: [
{ {
label: 'Documentation', label: 'Documentation',
autogenerate: { directory: 'documentation' }, items: [{ autogenerate: { "directory": "documentation" } }]
}, },
{ {
label: 'Configuration', label: 'Configuration',
+2317 -3546
View File
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -10,8 +10,7 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/starlight": "^0.34.3", "@astrojs/starlight": "^0.42.4",
"astro": "^5.6.1", "astro": "^7.2.10"
"sharp": "^0.32.5"
} }
} }
@@ -4,11 +4,41 @@ description: How to specify common input types in configuration
--- ---
## Tags ## Tags
There are 2 types of tags that can be used in the configuration:
- `minecraft:item_name` - For specific items, use namespaced vanilla item id. If namespace is not provided, `minecraft` is assumed. ### Items
- `#minecraft:item_tag_name` - For <a href="https://minecraft.wiki/w/Item_tag_(Java_Edition)" target="_blank">item tags</a>,
use namespaced tag id. If namespace is not provided, `minecraft` is assumed. Custom tags from other plugins and #### Item reference
datapacks are also supported. Example: `minecraft:stick`
For specific items, use namespaced vanilla item id. If namespace is not provided, `minecraft` is assumed.
#### Item tag
Example: `#minecraft:axes`
For <a href="https://minecraft.wiki/w/Item_tag_(Java_Edition)" target="_blank">item tags</a>, use namespaced tag id. If
namespace is not provided, `minecraft` is assumed. Custom tags from other plugins and datapacks are also supported.
### Blocks
#### Block reference
Example: `minecraft:dirt`
For specific items, use namespaced vanilla item id. If namespace is not provided, `minecraft` is assumed.
#### Block tag
Example: `#minecraft:planks`
For <a href="https://minecraft.wiki/w/Block_tag_(Java_Edition)" target="_blank">block tags</a>, use namespaced tag id. If
namespace is not provided, `minecraft` is assumed. Custom tags from other plugins and datapacks are also supported.
### Enchantments
#### Enchantment tag
Example: `#minecraft:in_enchanting_table`
For <a href="https://minecraft.wiki/w/Enchantment_tag_(Java_Edition)" target="_blank">enchantment tags</a>, use namespaced tag id. If
namespace is not provided, `minecraft` is assumed. Custom tags from other plugins and datapacks are also supported.
## Slot types ## Slot types
- `ANY` - Any slot. - `ANY` - Any slot.
@@ -18,8 +18,8 @@ Cost that will be added to the item when adding the enchantment to it in anvil.
- **Type**: `int` - **Type**: `int`
Weight of the enchantment. Used if `canGetFromEnchantingTable` is set to true. Higher numbers mean it will come up more Weight of the enchantment. Higher numbers mean it will come up more frequently in the enchanting table. Used if
frequently in the enchanting table. `#minecraft:in_enchanting_table` is present in enchantment tags.
### minimumCost ### minimumCost
@@ -29,7 +29,7 @@ Minimum cost that will be required for the enchantment to show up in the enchant
- **Type**: `int` - **Type**: `int`
Base cost of the enchant. Base cost of the enchantment.
#### perLevel #### perLevel
@@ -45,7 +45,7 @@ Maximum cost that will be required for the enchantment to show up in the enchant
- **Type**: `int` - **Type**: `int`
Base cost of the enchant. Base cost of the enchantment.
#### perLevel #### perLevel
@@ -55,23 +55,22 @@ Cost to add per level of the enchantment.
### enchantmentTags ### enchantmentTags
- **Type**: `key[]` - **Type**: [`Enchantment Tags`](/configuration/input-types/#enchantment-tag)
This is list of [tags](/configuration/input-types#tags) that the enchantment will be tagged with. This can be used to put the enchantment in enchanting table, This is list of tags that the enchantment will be tagged with. This can be used to put the enchantment in enchanting table,
mark it as a curse, etc. <a href="https://minecraft.wiki/w/Enchantment_tag_(Java_Edition)" target="_blank">All vanilla</a> mark it as a curse, etc.
and custom tags are supported.
### supportedItemTags ### supportedItemTags
- **Type**: `key[]` - **Type**: [`Item Tags`](/configuration/input-types/#items)
[Items and/or item tags](/configuration/input-types#tags) that the enchantment can be applied to. Items and/or item tags that the enchantment can be applied to.
### activeSlots ### activeSlots
- **Type**: `string[]` - **Type**: [`Slot types`](/configuration/input-types/#slot-types)
[Slots](/configuration/input-types#slot-types) that the enchantment will be active in. Inventory slots that the enchantment will be active in.
### enabled ### enabled
@@ -96,9 +95,11 @@ of the enchantment does not support multiple levels.
## Telepathy ## Telepathy
### onlyUserCanPickupItems
- **Type**: `boolean` - **Type**: `boolean`
If set to true, items teleported by the enchant will only be able to be picked up by the player that broke the block. If set to true, items teleported by the enchantment will only be able to be picked up by the player that broke the block.
## Executioner ## Executioner
@@ -149,7 +149,9 @@ public class TunnellingEnchant implements EnchantioEnchant {
"#minecraft:glazed_terracotta", "#minecraft:glazed_terracotta",
"#minecraft:concrete", "#minecraft:concrete",
"#minecraft:stone_bricks", "#minecraft:stone_bricks",
"minecraft:end_stone" "minecraft:end_stone",
"minecraft:cobblestone",
"minecraft:cobbled_deepslate"
) )
)) ))
), ),
@@ -3,7 +3,6 @@ package me.youhavetrouble.enchantio.listeners;
import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryAccess;
import io.papermc.paper.registry.RegistryKey; import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.keys.tags.BlockTypeTagKeys; import io.papermc.paper.registry.keys.tags.BlockTypeTagKeys;
import me.youhavetrouble.enchantio.Enchantio;
import me.youhavetrouble.enchantio.EnchantioConfig; import me.youhavetrouble.enchantio.EnchantioConfig;
import me.youhavetrouble.enchantio.enchants.EnchantioEnchant; import me.youhavetrouble.enchantio.enchants.EnchantioEnchant;
import me.youhavetrouble.enchantio.enchants.TunnellingEnchant; import me.youhavetrouble.enchantio.enchants.TunnellingEnchant;
@@ -22,9 +21,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
@@ -41,7 +38,7 @@ public class TunnellingListener implements Listener {
if (event.getHand() != EquipmentSlot.HAND) return; if (event.getHand() != EquipmentSlot.HAND) return;
if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; if (event.getAction() != Action.LEFT_CLICK_BLOCK) return;
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player.isSneaking() || GameMode.CREATIVE.equals(player.getGameMode())) return; if (GameMode.CREATIVE.equals(player.getGameMode())) return;
ItemStack item = event.getItem(); ItemStack item = event.getItem();
if (item == null) return; if (item == null) return;
if (!item.containsEnchantment(tunnelling)) return; if (!item.containsEnchantment(tunnelling)) return;
@@ -74,31 +71,29 @@ public class TunnellingListener implements Listener {
Set<Block> blocksToBreak = getSquare(block, blockFace, tunnellingEnchant.getBlocksPerLevel() * enchantLevel); Set<Block> blocksToBreak = getSquare(block, blockFace, tunnellingEnchant.getBlocksPerLevel() * enchantLevel);
blockBreakSkips.addAll(blocksToBreak); blockBreakSkips.addAll(blocksToBreak);
for (Block b : blocksToBreak) { for (Block b : blocksToBreak) {
if (player.getInventory().getItemInMainHand().isEmpty()) {
event.setCancelled(true);
blockBreakSkips.removeAll(blocksToBreak);
break;
}
event.getPlayer().breakBlock(b); event.getPlayer().breakBlock(b);
blockBreakSkips.remove(b); blockBreakSkips.remove(b);
} }
} }
private Set<Block> getSquare(Block block, BlockFace face, int range) { private Set<Block> getSquare(Block block, BlockFace face, int range) {
Set<Block> blocks = new HashSet<>();
switch (face) { switch (face) {
case DOWN: case DOWN, UP -> {
case UP: return getBlocksToTunnel(block.getLocation(), range, 0, range);
blocks.addAll(getBlocksToTunnel(block.getLocation(), range, 0, range)); }
break; case EAST, WEST -> {
case EAST: return getBlocksToTunnel(block.getLocation(), 0, range, range);
case WEST: }
blocks.addAll(getBlocksToTunnel(block.getLocation(), 0, range, range)); case NORTH, SOUTH -> {
break; return getBlocksToTunnel(block.getLocation(), range, range, 0);
case NORTH: }
case SOUTH:
blocks.addAll(getBlocksToTunnel(block.getLocation(), range, range, 0));
break;
default:
break;
} }
return blocks; return new HashSet<>();
} }
/** /**
@@ -106,8 +101,8 @@ public class TunnellingListener implements Listener {
* @param base location at the centre of selection * @param base location at the centre of selection
* @return All blocks that will get broken * @return All blocks that will get broken
*/ */
private List<Block> getBlocksToTunnel(Location base, int changeX, int changeY, int changeZ) { private Set<Block> getBlocksToTunnel(Location base, int changeX, int changeY, int changeZ) {
List<Block> blocks = new ArrayList<>(); Set<Block> blocks = new HashSet<>();
for (int x = (base.getBlockX() - changeX); x <= (base.getBlockX() + changeX); x++) { for (int x = (base.getBlockX() - changeX); x <= (base.getBlockX() + changeX); x++) {
for (int y = (base.getBlockY() - changeY); y <= (base.getBlockY() + changeY); y++) { for (int y = (base.getBlockY() - changeY); y <= (base.getBlockY() + changeY); y++) {
for (int z = (base.getBlockZ() - changeZ); z <= (base.getBlockZ() + changeZ); z++) { for (int z = (base.getBlockZ() - changeZ); z <= (base.getBlockZ() + changeZ); z++) {