mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
Compare commits
1 commit
v1.x.x
...
v1.10.0-be
| Author | SHA1 | Date | |
|---|---|---|---|
| 1debd34431 |
237 changed files with 2696 additions and 12187 deletions
201
.github/workflows/gradle.yml
vendored
201
.github/workflows/gradle.yml
vendored
|
|
@ -9,155 +9,74 @@ name: Java CI with Gradle
|
|||
|
||||
on:
|
||||
push:
|
||||
branches: [ "v1.x.x", "v2.x.x" ]
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "v1.x.x", "v2.x.x" ]
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
branches: [ "master" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDKs
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: |
|
||||
16
|
||||
17
|
||||
20
|
||||
21
|
||||
distribution: 'temurin'
|
||||
cache: 'gradle'
|
||||
|
||||
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
|
||||
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
|
||||
|
||||
- name: Make gradlew executable
|
||||
run: chmod +x ./gradlew
|
||||
- name: Build with Gradle Wrapper
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Summarize tests results
|
||||
uses: jeantessier/test-summary-action@v1
|
||||
if: ${{ always() }}
|
||||
|
||||
# NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
|
||||
# If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
|
||||
#
|
||||
# - name: Setup Gradle
|
||||
# uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
|
||||
# with:
|
||||
# gradle-version: '8.9'
|
||||
#
|
||||
# - name: Build with Gradle 8.9
|
||||
# run: gradle build
|
||||
|
||||
dependency-submission:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
env:
|
||||
MODRINTH_VERSIONS: '["1.18.x", "1.19.x", "1.20.x", "1.21.x", "26.1.x", "26.2.x"]'
|
||||
MODRINTH_PLATFORMS: '["spigot", "paper", "purpur", "folia"]'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDKs
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: |
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDKs
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: |
|
||||
16
|
||||
17
|
||||
20
|
||||
21
|
||||
distribution: 'temurin'
|
||||
cache: gradle
|
||||
|
||||
- name: Cache Gradle root and wrapper
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: gradle-root-${{ runner.os }}-${{ hashFiles('build.gradle*') }}
|
||||
restore-keys: gradle-root-${{ runner.os }}-
|
||||
|
||||
# Setup paperweight cache
|
||||
- name: Cache paperweight
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./nms/*/.gradle/caches/paperweight
|
||||
key: paperweight-submodules-${{ runner.os }}-${{ hashFiles('nms/*/build.gradle*') }}
|
||||
restore-keys: |
|
||||
paperweight-submodules-${{ runner.os }}-
|
||||
|
||||
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
|
||||
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- name: Make gradlew executable
|
||||
run: chmod +x ./gradlew
|
||||
|
||||
- name: Get small commit hash
|
||||
if: ${{ github.event_name != 'release' && success() }}
|
||||
run: echo "SMALL_COMMIT_HASH=$(git rev-parse --short ${{ github.sha }})" >> $GITHUB_ENV
|
||||
|
||||
- name: Build with Gradle Wrapper
|
||||
run: ./gradlew build --parallel --stacktrace
|
||||
|
||||
# only submit dependency on push
|
||||
- name: Generate and submit dependency graph
|
||||
uses: gradle/actions/dependency-submission@v4
|
||||
if: ${{ github.event_name == 'push' && success() }}
|
||||
continue-on-error: true
|
||||
|
||||
# Get the names of the online and offline jars
|
||||
# grep -v "offline" to exclude offline jar as the regex would catch it otherwise
|
||||
- name: Get file name for jars
|
||||
run: |
|
||||
ONLINE_JAR_PATH=$(ls build/libs/CustomAnvil-*.jar | grep -v "offline")
|
||||
OFFLINE_JAR_PATH=$(ls build/libs/CustomAnvil-*-offline.jar)
|
||||
|
||||
echo "ONLINE_JAR_NAME=$(basename $ONLINE_JAR_PATH)" >> $GITHUB_ENV
|
||||
echo "OFFLINE_JAR_NAME=$(basename $OFFLINE_JAR_PATH)" >> $GITHUB_ENV
|
||||
|
||||
# upload the named jars as artifact
|
||||
- name: Upload online JAR artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: CustomAnvil.jar
|
||||
path: build/libs/${{ env.ONLINE_JAR_NAME }}
|
||||
|
||||
- name: Upload offline JAR file
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: CustomAnvil-offline.jar
|
||||
path: build/libs/${{ env.OFFLINE_JAR_NAME }}
|
||||
|
||||
- name: Summarize tests results
|
||||
uses: jeantessier/test-summary-action@v1
|
||||
if: ${{ always() }}
|
||||
|
||||
# upload the jar to release
|
||||
- name: Upload jar to release
|
||||
if: ${{ github.event_name == 'release' && success() }}
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: |
|
||||
build/libs/${{ env.ONLINE_JAR_NAME }}
|
||||
build/libs/${{ env.OFFLINE_JAR_NAME }}
|
||||
|
||||
- name: Hangar release
|
||||
if: ${{ (github.event_name != 'release' || github.event_name != 'push') && github.repository_owner == 'alexcrea' && success() }}
|
||||
env:
|
||||
HANGAR_API_TOKEN: ${{ secrets.HANGAR_API_TOKEN }}
|
||||
RELEASE_CHANGELOG: ${{ github.event.release.body }}
|
||||
run: ./gradlew publishAllPublicationsToHangar --stacktrace
|
||||
|
||||
- name: Modrinth publish alpha
|
||||
if: ${{ github.event_name == 'push' && github.repository_owner == 'alexcrea' && success() }}
|
||||
uses: cloudnode-pro/modrinth-publish@v2
|
||||
with:
|
||||
token: ${{ secrets.MODRINTH_TOKEN }}
|
||||
project: S75Ueiq9
|
||||
name: dev-${{ env.SMALL_COMMIT_HASH }}
|
||||
version: dev-${{ env.SMALL_COMMIT_HASH }}
|
||||
loaders: ${{ env.MODRINTH_PLATFORMS }}
|
||||
game-versions: ${{ env.MODRINTH_VERSIONS }}
|
||||
channel: alpha
|
||||
files: build/libs/${{ env.ONLINE_JAR_NAME }}
|
||||
changelog: ${{ github.event.head_commit.message }}
|
||||
|
||||
- name: Modrinth publish release
|
||||
if: ${{ github.event_name == 'release' && github.repository_owner == 'alexcrea' && success() }}
|
||||
uses: cloudnode-pro/modrinth-publish@v2
|
||||
with:
|
||||
token: ${{ secrets.MODRINTH_TOKEN }}
|
||||
project: S75Ueiq9
|
||||
name: ${{ github.event.release.name }}
|
||||
version: ${{ github.event.release.tag_name }}${{ github.event.release.prerelease && '-pre' || '' }}
|
||||
loaders: ${{ env.MODRINTH_PLATFORMS }}
|
||||
game-versions: ${{ env.MODRINTH_VERSIONS }}
|
||||
channel: ${{ github.event.release.prerelease == false && 'release' || 'beta' }}
|
||||
files: build/libs/${{ env.ONLINE_JAR_NAME }}
|
||||
changelog: ${{ github.event.release.body }}
|
||||
|
||||
- name: Send release note to discord
|
||||
if: ${{ github.event_name == 'release' && github.repository_owner == 'alexcrea' && success() }}
|
||||
uses: tsickert/discord-webhook@v7.0.0
|
||||
with:
|
||||
webhook-url: ${{ secrets.RELEASE_WEBHOOK_URL }}
|
||||
content: |
|
||||
${{ github.event.release.prerelease == false && '<@&1338546156325568642>' || '<@&1352296092989001768>' }}
|
||||
# New ${{ github.event.release.prerelease && 'beta ' || '' }}version of custom anvil ! <:CustomAnvil:1262550667986342001>([Modrinth](https://modrinth.com/plugin/customanvil), [Hangar](https://hangar.papermc.io/alexcrea/CustomAnvil) and [GitHub](${{ github.event.release.html_url }}) links)
|
||||
-# note: automated release. spigot is not uploaded yet.
|
||||
|
||||
${{ github.event.release.body }}
|
||||
# Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies.
|
||||
# See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md
|
||||
- name: Generate and submit dependency graph
|
||||
uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
|
||||
|
|
|
|||
5
.gitignore
vendored
5
.gitignore
vendored
|
|
@ -14,9 +14,6 @@
|
|||
/impl/*/build
|
||||
/impl/*/.gradle
|
||||
|
||||
# run folder
|
||||
/run/
|
||||
|
||||
# other random folders
|
||||
/htmlReport
|
||||
/.kotlin/errors
|
||||
/.kotlin/errors
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Server" type="JarApplication">
|
||||
<option name="JAR_PATH" value="$PROJECT_DIR$/run/server.jar" />
|
||||
<option name="PROGRAM_PARAMETERS" value="-nogui" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/run" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
### Bedrock issue
|
||||
For server using geyser, bedrock player cannot use custom "recipes" in the anvil.
|
||||
This is cannot be fixed on geyser or my side.
|
||||
|
||||
### Plugin Compatibility
|
||||
Here is various plugins that had issues with CustomAnvil
|
||||
where efforts was made for compatibility and should be working right:
|
||||
|
||||
some if not all of them are cool ! I recommend checking them out !
|
||||
|
||||
## Supported By CustomAnvil
|
||||
These plugins have compatibility handled by custom anvil. seek help on custom anvil and do not bother these developers
|
||||
|
||||
#### Enchantment Plugins
|
||||
- [ExcellentEnchants](https://www.spigotmc.org/resources/excellentenchants-%E2%AD%90-75-vanilla-like-enchantments.61693/) by NightExpress:
|
||||
Use ExcellentEnchants item type \
|
||||
Also use ExcellentEnchant max enchant limit
|
||||
|
||||
- [EcoEnchant](https://www.spigotmc.org/resources/ecoenchants-%E2%AD%95-250-enchantments-%E2%9C%85-create-custom-enchants-%E2%9C%A8-essentials-cmi-support.79573/) by Auxilor:
|
||||
Need to use /anvilconfigreload or a server restart to add newly added enchantment.
|
||||
Use EcoEnchant restriction system but new restriction can be added in custom anvil
|
||||
|
||||
- [Enchantment²](https://www.spigotmc.org/resources/enchants-squared-the-enchantsplus-rewrite-custom-enchantments-that-act-like-vanilla-ones.86747/) by Athlaeos:
|
||||
Support by Custom Anvil but still experimental. Automatic configuration. Plugin is not actively developed anymore
|
||||
|
||||
- [SuperEnchants](https://modrinth.com/plugin/superenchants) by Aznos:
|
||||
Use SuperEnchant restrictions system but new restriction can be added in custom anvil
|
||||
|
||||
|
||||
#### Custom Items Plugins
|
||||
Custom Items support is considered unstable. If you find issue please report it !
|
||||
|
||||
- [EcoItem](https://www.spigotmc.org/resources/30-sale%E2%8F%B3-ecoitems-%E2%AD%95-create-custom-items-%E2%9C%85-weapons-armors-tools-charms-%E2%9C%A8-item-levels-rarities.94601/) by Exanthiax:
|
||||
May have some issue. but should partially work I hope
|
||||
|
||||
- [ItemAdder](https://www.spigotmc.org/resources/%E2%9C%A8itemsadder%E2%AD%90emotes-mobs-items-armors-hud-gui-emojis-blocks-wings-hats-liquids.73355/) by LoneDev:
|
||||
Need to fix unit item not working completly correctly as in can't have twice same base item
|
||||
|
||||
#### Anvil Mechanics Plugins
|
||||
- [Disenchantment](https://www.spigotmc.org/resources/disenchantment-1-21-1-1-20-6-new-book-splitting-mechanics.110741/) by H7KZ
|
||||
Partially use Custom Anvil maximum XP settings (>= 6.1.5)
|
||||
|
||||
- [HavenBags](https://www.spigotmc.org/resources/havenbags-shulker-like-player-bound-bags-1-17-1-21-4.110420/) by hyperdefined
|
||||
For bag upgrade and skin via anvil. (version >= 1.31.0)
|
||||
|
||||
- [AxPlayerWarp](https://modrinth.com/project/QDJHDKvi) by ArtillexStudios
|
||||
For its anvil inventory usage
|
||||
|
||||
- [ToolsStats](https://modrinth.com/project/oBZj9E15) by Valorless
|
||||
For token application using anvil
|
||||
|
||||
### Known Partially Incompatible
|
||||
- [UberEnchant](https://modrinth.com/plugin/uberenchant) by coltonj96
|
||||
Anvil handling as they are doing something similar to CustomAnvil.
|
||||
It is by no mean there faults and I recommend checking them out especially if custom anvil do not work for your use case !
|
||||
|
||||
- [AdvencedEnchantments](https://ae.advancedplugins.net/) by Advanced Plugins
|
||||
Paid plugin I do not own as I did not get commissioned for support.
|
||||
may be able to use api but cannot test on my side
|
||||
|
||||
If you like Custom Anvil to support a specific plugin (custom enchant or anvil mechanic).
|
||||
You can ask, but please note implementing compatibility will be considered
|
||||
as low priority as I work for the plugin as an hobby on my free time for free.
|
||||
34
CREDITS.md
34
CREDITS.md
|
|
@ -1,34 +0,0 @@
|
|||
Thanks **DelilahEve** for making [Unsafe Enchants](https://github.com/DelilahEve/UnsafeEnchants). \
|
||||
CustomAnvil was initially a fork of Unsafe Enchants where I wanted to add more and more and here we are now !
|
||||
|
||||
Thanks for all the contributors of bukkit, spigot, the paper team and the adventure API developers \
|
||||
Thanks JetBrain for making IntelliJ
|
||||
|
||||
### Dependencies
|
||||
These dependencies (or a modified version of) are used by custom anvil
|
||||
- [IF](https://github.com/stefvanschie/IF) an inventory framework by stefvanschie
|
||||
- [Mockbukkit](https://github.com/MockBukkit/MockBukkit) for unit testing
|
||||
- [CentralPortalPlus](https://github.com/lalakii/central-portal-plus) by lalakii
|
||||
- [test-summary-action](https://github.com/jeantessier/test-summary-action) by jeantessier
|
||||
- [modrinth-publish](https://github.com/cloudnode-pro/modrinth-publish) by Zefir
|
||||
- [discord-webhook](https://github.com/tsickert/discord-webhook) by tsickert
|
||||
- Thanks [bstats](https://bstats.org/) for keeping me motivated
|
||||
- And [FastStats](https://faststats.dev/) alternative to bstats in beta test
|
||||
- [ModrinthUpdateChecker](https://github.com/Clickism/ModrinthUpdateChecker) by Clickism and thanks to the modrinth team
|
||||
|
||||
### Compatibility
|
||||
Thanks to all the cool creator making the minecraft plugin's ecosystem works ! \
|
||||
See [Compatibility list](https://github.com/alexcrea/CustomAnvil/blob/v1.x.x/COMPATIBILITY.md) for details
|
||||
|
||||
but especially, Big Thanks for H7KZ maker of [Disenchantment](https://github.com/H7KZ/Disenchantment)
|
||||
|
||||
### Special Thanks
|
||||
|
||||
Thanks for all the users trying my plugin for these niche use cases
|
||||
, reporting issues and giving ideas !
|
||||
|
||||
Thanks coltonj96 for [UberEnchant](https://modrinth.com/plugin/uberenchant).
|
||||
we may be incompatible with the anvil, but I do think it is a good alternative ! \
|
||||
I wish one day to work on cross compatibiltiy \
|
||||
* If custom anvil do not work well for you or your use case give it a try ! *
|
||||
|
||||
105
README.md
105
README.md
|
|
@ -1,11 +1,18 @@
|
|||
# Custom Anvil
|
||||
|
||||
**Custom Anvil** is a plugin that allows server administrators to customize every aspect of the anvil's mechanics.
|
||||
It is expected to work on 1.18 to 1.21.3 minecraft servers running spigot or paper.
|
||||
(the plugin support of 1.16.5 to 1.17.1 is experimental and may encounter issues)
|
||||
|
||||
**Custom Anvil** was previously named **Unsafe Enchants+**.
|
||||
It was renamed because it now affects every anvil aspect and not only unsafe enchants\
|
||||
**Custom Anvil** is based on [Unsafe Enchants](https://github.com/DelilahEve/UnsafeEnchants) by DelilahEve.
|
||||
|
||||
### Download Locations:
|
||||
|
||||
the plugin can be downloaded on
|
||||
[Modrinth](https://modrinth.com/plugin/customanvil),
|
||||
[Spigot](https://www.spigotmc.org/resources/custom-anvil.114884),
|
||||
[modrinth](https://modrinth.com/plugin/customanvil),
|
||||
[Hangar](https://hangar.papermc.io/alexcrea/CustomAnvil)
|
||||
or here [on GitHub](https://github.com/alexcrea/CustomAnvil/releases/latest)
|
||||
|
||||
|
|
@ -14,98 +21,94 @@ the plugin can be downloaded on
|
|||
- Vanilla like default configuration.
|
||||
- Custom enchantment level limit.
|
||||
- Custom anvil recipes.
|
||||
- Custom enchant restrictions (allows unsafe enchantment only for a group of item or create new restriction).
|
||||
- Custom enchant restrictions (allow unsafe enchantment only for a group of item or create new restriction).
|
||||
- Custom items of unit repairs (repair damaged with unit of "material", for example the repair of diamond sword by diamonds).
|
||||
- Custom XP cost for every aspect of the anvil.
|
||||
- Permissions to bypass level limit or enchantment restriction.
|
||||
- Display XP cost instead of "too expensive" when above level 40. (see below for more information)
|
||||
- Can handle some custom enchantment plugins (see below for more information)
|
||||
- Gui to configure the plugin in game.
|
||||
- Support use of color code, hexadecimal color and minimessage for color/decoration
|
||||
- Support of color code and hexadecimal color
|
||||
- (Experimental) Folia support (gui do not work)
|
||||
- (Experimental) Dialog rename (allows longer rename)
|
||||
- (Experimental) Anvil with monetary cost (using vault) (require dialog rename)
|
||||
|
||||
And more !
|
||||
|
||||
---
|
||||
### Permissions:
|
||||
Note that for most of them you also need to enable feature and in most case enable use of permission for the specfic feature (indicated with `(toggleable)`)
|
||||
```yml
|
||||
# Generic and bypass permissions
|
||||
ca.affected: Player with this permission will be affected by the plugin
|
||||
ca.bypass.fuse: Allow player to combine every enchantments to every item (no custom limit)
|
||||
ca.bypass.level: Allow player to bypass every level limit (no custom limit)
|
||||
|
||||
# Command permissions
|
||||
ca.command.reload: Allow administrator to reload the plugin's configs
|
||||
ca.command.diagnostic: Allow adminastator to diagnistic some simple problem with the plugin
|
||||
ca.config.edit: Allow administrator to edit the plugin's config in game
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Bellow permissions also require some config change to allow usage of features
|
||||
# Usage of these permission is toggleable in basic config gui or config.yml
|
||||
# -----------------------------------------------------------------------------
|
||||
# Permissions related to use of color and minimessage
|
||||
ca.color.code: Allow player to use color code on rename if enabled (toggleable)
|
||||
ca.color.code.[thecode] (for example ca.color.code.a): Allows usage of only certain color code (toggleable)
|
||||
ca.color.hex: Allow player to use hexadecimal color on rename if enabled (toggleable)
|
||||
ca.rename.minimessage: Allow player to use minimessage formating on rename if enabled (toggleable)
|
||||
# usage of these permission is toggleable in basic config gui or config.yml
|
||||
|
||||
# Permissions related to use of color
|
||||
ca.color.code: Allow player to use color code if enabled (toggleable)
|
||||
ca.color.hex: Allow player to use hexadecimal color if enabled (toggleable)
|
||||
|
||||
# Permissions related to edition of the lore
|
||||
ca.lore_edit.book: Allow player to edit lore via book and quil if enabled (toggleable)
|
||||
ca.lore_edit.paper: Allow player to edit lore via paper if enabled (toggleable)
|
||||
|
||||
# Others
|
||||
ca.rename.dialog: Allow player to use the rename dialog (toggleable)
|
||||
```
|
||||
|
||||
### Commands
|
||||
|
||||
run `/customanvil help` to get information about available commands \
|
||||
this only show subcommands you have permission for
|
||||
|
||||
```yml
|
||||
anvilconfigreload or carl: Reload every config of this plugin
|
||||
customanvilconfig or configanvil: open a menu for administrator to edit plugin's config in game
|
||||
```
|
||||
### Supported Plugins
|
||||
See the [Compatibility list](https://github.com/alexcrea/CustomAnvil/blob/v1.x.x/COMPATIBILITY.md)
|
||||
Custom Anvil can be compatible with some custom enchantments and anvil mechanics plugins.
|
||||
|
||||
Here is a list of supported custom enchantment plugins with support status:
|
||||
- [Enchantment²](https://www.spigotmc.org/resources/enchants-squared-the-enchantsplus-rewrite-custom-enchantments-that-act-like-vanilla-ones.86747/):
|
||||
Support by Custom Anvil but still experimental. Automatic configuration.
|
||||
|
||||
- [EcoEnchant](https://www.spigotmc.org/resources/ecoenchants-%E2%AD%95-250-enchantments-%E2%9C%85-create-custom-enchants-%E2%9C%A8-essentials-cmi-support.79573/):
|
||||
Support by Custom Anvil but still experimental. Need to use /anvilconfigreload or a server restart to add newly added enchantment.
|
||||
Use EcoEnchant restriction system by default.
|
||||
|
||||
- [ExcellentEnchants](https://www.spigotmc.org/resources/excellentenchants-%E2%AD%90-75-vanilla-like-enchantments.61693/):
|
||||
Support by Custom Anvil but still experimental. Use ExcellentEnchants item type.
|
||||
|
||||
- [Superenchants](https://modrinth.com/plugin/superenchants)
|
||||
support by Superenchants. Use CustomAnvil to combine enchantment in anvil in survival.
|
||||
|
||||
Here is a list of supported anvil mechanic plugins with support status:
|
||||
- [Disenchantment](https://www.spigotmc.org/resources/disenchantment-1-21-1-1-20-6-new-book-splitting-mechanics.110741/)
|
||||
support by Custom Anvil but still experimental. Mostly use Custom Anvil basic XP settings. (version >= 6.1.5)
|
||||
|
||||
- [HavenBags](https://www.spigotmc.org/resources/havenbags-shulker-like-player-bound-bags-1-17-1-21-4.110420/)
|
||||
support by Custom Anvil. Not really enchantment related but CustomAnvil should not impact bag upgrade and skin via anvil. (version >= 1.31.0)
|
||||
|
||||
If you like Custom Anvil to support a specific plugin (custom enchant or anvil mechanic).
|
||||
You can ask, but please note implementing compatibility will be considered
|
||||
as low priority as I work for the plugin on my free time for free.
|
||||
|
||||
### Overriding Too Expensive
|
||||
|
||||
One of the configurations allow displaying price about 40 and removing Too Expensive. \
|
||||
By how the minecraft client work: price above 40 can only be displayed green, even if the player does not own enough experience level.
|
||||
spigot version 1.18 to 1.21.11 do not need any ProtocoLib dependency. (26.1.0 or above requires it) \
|
||||
Any recent paper version also are supported for this feature.
|
||||
But you should wait for update for new version containing new enchantable item or new enchantments if any of this got added.
|
||||
Else it is, likely, fine to use the current version you are ussing on a new paper version
|
||||
Minecraft version 1.17 to 1.21.1 do not need any dependency. Other version need ProtocoLib enabled on your server for this feature. \
|
||||
You can also wait for an update of the plugin to support a newer version.
|
||||
|
||||
Please note that 1.16.5 to 1.17.1 are not officially supported. Run at your own risk.
|
||||
|
||||
### For custom enchantment plugin developers
|
||||
For information about the API, please refer to [the Wiki](https://github.com/alexcrea/CustomAnvil/wiki) \
|
||||
(Please note that the wiki is currently incomplete)
|
||||
(Please note that the wiki is currently incomplete)
|
||||
|
||||
---
|
||||
|
||||
### Default Plugin's Configurations
|
||||
see [Here](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs)
|
||||
For 1.18 to 1.20.6 use the [1.18 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.18)\
|
||||
For 1.21 to 1.21.1 use the [1.21 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21)
|
||||
|
||||
---
|
||||
### Metric And Telemetry
|
||||
Custom anvil [use bstat](https://bstats.org/plugin/bukkit/Unsafe%20Enchants%20Plus/20923)
|
||||
and [faststats](https://faststats.dev/project/customanvil/minecraft-plugin) for metric and error reporting.
|
||||
|
||||
You can select specific telemetry or disable all in config.yml. \
|
||||
You can also [disable bstat](https://bstats.org/getting-started) and [faststats](https://faststats.dev/info) in their /plugin folder if you like too.
|
||||
|
||||
faststats is in beta testing please report me or them any error you encounter
|
||||
|
||||
### Credits and Thanks
|
||||
Credits and thanks can be seen [here](https://github.com/alexcrea/CustomAnvil/blob/v1.x.x/CREDITS.md)
|
||||
Custom anvil [use bstat](https://bstats.org/plugin/bukkit/Unsafe%20Enchants%20Plus/20923) for metric. You can [disable it](https://bstats.org/getting-started) if you like.
|
||||
|
||||
### Planned:
|
||||
- Better Folia support (make gui work. fix some dirty handled parts)
|
||||
- Get restriction on unknown enchantments (planned for V2)
|
||||
- Get restriction on unknown enchantments
|
||||
- More features for custom anvil craft
|
||||
|
||||
### Known issue:
|
||||
Most unknown registered enchantments (by unsupported custom enchantment plugin & datapacks) will not have restriction by default. Planned but no eta.
|
||||
|
||||
### Do you need help with the plugin, or have any issue or suggestion?
|
||||
You can ask on the discussion page, create a [GitHub issue](https://github.com/alexcrea/CustomAnvil/issues) or join my [discord](https://discord.gg/KHUNsUfRYJ)
|
||||
|
|
|
|||
309
build.gradle.kts
309
build.gradle.kts
|
|
@ -1,68 +1,33 @@
|
|||
import cn.lalaki.pub.BaseCentralPortalPlusExtension
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import groovy.util.Node
|
||||
import groovy.util.NodeList
|
||||
import io.papermc.hangarpublishplugin.model.HangarPublication
|
||||
import io.papermc.hangarpublishplugin.model.Platforms
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
import java.io.ByteArrayOutputStream
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "2.3.0"
|
||||
kotlin("jvm") version "2.1.0"
|
||||
java
|
||||
id("org.jetbrains.dokka").version("1.9.20")
|
||||
id("com.gradleup.shadow").version("9.3.0")
|
||||
id("com.gradleup.shadow").version("8.3.5")
|
||||
// Maven publish
|
||||
`maven-publish`
|
||||
signing
|
||||
id("cn.lalaki.central").version("1.2.8")
|
||||
id("cn.lalaki.central").version("1.2.5")
|
||||
// Paper
|
||||
id("io.papermc.paperweight.userdev") version "2.0.0-beta.17" apply false
|
||||
id("io.papermc.hangar-publish-plugin") version "0.1.2"
|
||||
id("io.papermc.paperweight.userdev") version "2.0.0-beta.14" apply false
|
||||
}
|
||||
|
||||
group = "xyz.alexcrea"
|
||||
version = "1.17.5"
|
||||
|
||||
val isDevBuild = System.getenv("SMALL_COMMIT_HASH") != null
|
||||
val isPreRelease = System.getenv("IS_GITHUB_PRERELEASE") == "true"
|
||||
|
||||
val effectiveVersion = "$version" +
|
||||
(if (isDevBuild) "-dev-${System.getenv("SMALL_COMMIT_HASH")!!}" else "")
|
||||
version = "1.10.0-beta.3"
|
||||
|
||||
repositories {
|
||||
// EcoEnchants
|
||||
maven(url = "https://repo.auxilor.io/repository/maven-public/")
|
||||
|
||||
// ExcellentEnchants
|
||||
maven(url = "https://repo.nightexpressdev.com/releases")
|
||||
|
||||
// ItemsAdder
|
||||
maven(url = "https://maven.devs.beer/")
|
||||
|
||||
// For fast stats
|
||||
maven {
|
||||
name = "thenextlvlReleases"
|
||||
url = uri("https://repo.thenextlvl.net/releases")
|
||||
}
|
||||
|
||||
// For vault unlocked
|
||||
maven { url = uri("https://repo.codemc.io/repository/creatorfromhell/") }
|
||||
}
|
||||
|
||||
val reobfNMS = providers.gradleProperty("subprojects.reobfnms")
|
||||
.get().split(",")
|
||||
|
||||
dependencies {
|
||||
// Spigot api
|
||||
compileOnly("org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT")
|
||||
|
||||
// fast stats
|
||||
implementation("dev.faststats.metrics:bukkit:0.27.0")
|
||||
|
||||
// minimessage
|
||||
implementation("net.kyori:adventure-text-minimessage:4.25.0")
|
||||
|
||||
// Gui library
|
||||
val inventoryFramework = "xyz.alexcrea.cuanvil.inventoryframework:IF-CustomAnvil:0.10.18.2"
|
||||
implementation(inventoryFramework)
|
||||
|
|
@ -71,22 +36,15 @@ dependencies {
|
|||
// EnchantsSquaredRewritten
|
||||
compileOnly(files("libs/EnchantsSquared.jar"))
|
||||
|
||||
// EcoEnchants & item
|
||||
compileOnly("com.willfp:libreforge:4.79.0:all")
|
||||
compileOnly("com.willfp:eco:6.74.5")
|
||||
|
||||
// EcoEnchants
|
||||
compileOnly("com.willfp:EcoEnchants:12.11.1")
|
||||
compileOnly("com.willfp:eco:6.74.5")
|
||||
compileOnly(project(":impl:LegacyEcoEnchant"))
|
||||
|
||||
compileOnly("com.willfp:EcoItems:5.66.0")
|
||||
|
||||
// ExcellentEnchants
|
||||
implementation(project(":impl:ExcellentEnchant5_4"))
|
||||
compileOnly("su.nightexpress.excellentenchants:Core:5.1.0") {
|
||||
exclude("org.spigotmc")
|
||||
}
|
||||
compileOnly(files("libs/ExcellentEnchants-4.3.3-striped.jar")) // For pre v5 excellent enchants
|
||||
compileOnly(files("libs/ExcellentEnchants-4.1.0-striped.jar")) // For legacy excellent enchants
|
||||
compileOnly(files("libs/nightcore-2.7.3.jar"))
|
||||
compileOnly(files("libs/ExcellentEnchants-4.3.1.jar"))
|
||||
compileOnly(files("libs/ExcellentEnchants 4.1.0-striped.jar")) // For legacy excellent enchants
|
||||
|
||||
// Disenchantment
|
||||
compileOnly(files("libs/Disenchantment-6.1.5.jar"))
|
||||
|
|
@ -94,33 +52,27 @@ dependencies {
|
|||
// HavenBags
|
||||
compileOnly(files("libs/HavenBags-1.31.0.1760.jar"))
|
||||
|
||||
// ToolStats
|
||||
compileOnly(files("libs/toolstats-1.9.6-stripped.jar"))
|
||||
|
||||
// AxPlayerWarps
|
||||
compileOnly(files("libs/AxPlayerWarps-1.10.3.jar"))
|
||||
|
||||
// SuperEnchants
|
||||
compileOnly(files("libs/SuperEnchants-4.6.2-all.jar"))
|
||||
|
||||
// ItemsAdder API
|
||||
compileOnly("dev.lone:api-itemsadder:4.0.10")
|
||||
|
||||
// Vault api
|
||||
compileOnly("net.milkbowl.vault:VaultUnlockedAPI:2.16")
|
||||
|
||||
// Include nms
|
||||
implementation(project(":nms:nms-common"))
|
||||
implementation(project(":nms:nms-paper"))
|
||||
for (nmsPart in reobfNMS) {
|
||||
implementation(project(":nms:$nmsPart", configuration = "reobf"))
|
||||
}
|
||||
implementation(project(":nms:v1_17R1", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_18R1", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_18R2", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_19R1", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_19R2", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_19R3", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_20R1", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_20R2", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_20R3", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_20R4", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_21R1", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_21R2", configuration = "reobf"))
|
||||
implementation(project(":nms:v1_21R3", configuration = "reobf"))
|
||||
|
||||
// include kotlin for the offline jar
|
||||
implementation(kotlin("stdlib"))
|
||||
|
||||
// Test dependency
|
||||
testImplementation("org.mockbukkit.mockbukkit:mockbukkit-v1.21:4.48.0")
|
||||
testImplementation("org.mockbukkit.mockbukkit:mockbukkit-v1.21:4.37.0")
|
||||
testRuntimeOnly("commons-lang:commons-lang:2.6")
|
||||
}
|
||||
|
||||
|
|
@ -142,9 +94,8 @@ allprojects {
|
|||
compileOnly(kotlin("stdlib"))
|
||||
|
||||
// Test dependency
|
||||
testImplementation(platform("org.junit:junit-bom:5.12.2"))
|
||||
testImplementation(platform("org.junit:junit-bom:5.11.3"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
||||
}
|
||||
|
||||
tasks.getByName<Test>("test") {
|
||||
|
|
@ -159,8 +110,7 @@ allprojects {
|
|||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility =
|
||||
"16" // We aim for java 16 for minecraft 1.16.5. even if it not really supported by custom anvil.
|
||||
sourceCompatibility = "16" // We aim for java 16 for minecraft 1.16.5. even if it not really suported by custom anvil.
|
||||
targetCompatibility = "16"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
|
|
@ -168,29 +118,43 @@ allprojects {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_16)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Fat-jar builder
|
||||
val fatJar = tasks.register<Jar>("fatJar") {
|
||||
manifest {
|
||||
attributes.apply { put("Main-Class", "io.delilaheve.CustomAnvil") }
|
||||
}
|
||||
archiveFileName.set("${rootProject.name}-${project.version}.jar")
|
||||
exclude("META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA")
|
||||
duplicatesStrategy = DuplicatesStrategy.WARN
|
||||
from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
|
||||
with(tasks.jar.get() as CopySpec)
|
||||
}
|
||||
|
||||
tasks {
|
||||
// Online jar (use of libraries)
|
||||
shadowJar {
|
||||
// No suffix for this jar
|
||||
archiveClassifier.set("")
|
||||
|
||||
fun ShadowJar.configureBaseShadow(suffix: String, libraries: Array<String>) {
|
||||
val processedSuffix = if(suffix.isEmpty()) "" else "-$suffix"
|
||||
val name = "${rootProject.name}-${effectiveVersion}${processedSuffix}.jar"
|
||||
archiveFileName.set(name)
|
||||
// Exclude kotlin std and its annotation
|
||||
exclude("**/kotlin-stdlib*.jar")
|
||||
exclude("**/annotations*.jar")
|
||||
|
||||
// Shadow necessary dependency
|
||||
relocate("com.github.stefvanschie.inventoryframework", "xyz.alexcrea.cuanvil.inventoryframework")
|
||||
relocate("dev.faststats", "xyz.alexcrea.cuanvil.faststats")
|
||||
relocate("com.github.stefvanschie.inventoryframework", "xyz.alexcrea.inventoryframework")
|
||||
|
||||
// Replace version and example fields in plugin.yml
|
||||
filesMatching("plugin.yml") {
|
||||
expand(
|
||||
"version" to effectiveVersion + processedSuffix,
|
||||
"libraries" to libraries.joinToString(transform = { "\"$it\"" }),
|
||||
"version" to project.version,
|
||||
"libraries" to " \"org.jetbrains.kotlin:kotlin-stdlib:2.1.0\" "
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -198,28 +162,35 @@ tasks {
|
|||
dependsOn(processResources)
|
||||
}
|
||||
|
||||
// Online jar (use of libraries)
|
||||
shadowJar {
|
||||
configureBaseShadow("",
|
||||
arrayOf(
|
||||
"org.jetbrains.kotlin:kotlin-stdlib:2.3.0",
|
||||
"net.kyori:adventure-text-minimessage:4.25.0",
|
||||
"net.kyori:adventure-text-serializer-plain:4.25.0",
|
||||
"net.kyori:adventure-text-serializer-legacy:4.25.0",
|
||||
))
|
||||
// Offline jar (include kotlin std in the final jar fine)
|
||||
val offlineJar by // Shadow necessary dependency
|
||||
registering(
|
||||
|
||||
// Exclude kotlin std, annotations and adventure api
|
||||
exclude("*kotlin/**")
|
||||
exclude("**/annotations/**")
|
||||
exclude("net/kyori/**")
|
||||
}
|
||||
// Include all project other dependencies
|
||||
ShadowJar
|
||||
|
||||
val offlineJar by registering(ShadowJar::class) {
|
||||
configureBaseShadow("offline", emptyArray())
|
||||
// Add custom anvil compiled
|
||||
::class, fun ShadowJar.() {
|
||||
archiveClassifier.set("offline")
|
||||
|
||||
from(sourceSets.main.get().output)
|
||||
configurations = listOf(project.configurations.runtimeClasspath.get())
|
||||
}
|
||||
// Shadow necessary dependency
|
||||
relocate("com.github.stefvanschie.inventoryframework", "xyz.alexcrea.inventoryframework")
|
||||
|
||||
filesMatching("plugin.yml") {
|
||||
expand(
|
||||
"version" to "${project.version}-offline",
|
||||
"libraries" to ""
|
||||
)
|
||||
}
|
||||
|
||||
// Include all project other dependencies
|
||||
from(project.configurations.runtimeClasspath)
|
||||
|
||||
// Add custom anvil compiled
|
||||
from(sourceSets.main.get().output)
|
||||
|
||||
dependsOn(processResources)
|
||||
})
|
||||
|
||||
// Make the online and offline jar on build
|
||||
named("build") {
|
||||
|
|
@ -272,10 +243,6 @@ object Meta {
|
|||
const val snapshot = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
|
||||
}
|
||||
|
||||
val disallowedDependency = HashSet<String>()
|
||||
disallowedDependency.addAll(reobfNMS)
|
||||
disallowedDependency.addAll(listOf("nms-common", "nms-paper", "kotlin-stdlib"))
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
maven {
|
||||
|
|
@ -291,16 +258,6 @@ publishing {
|
|||
from(components["kotlin"])
|
||||
artifact(tasks["sourcesJar"])
|
||||
artifact(tasks["javadocJar"])
|
||||
|
||||
versionMapping {
|
||||
usage("java-api") {
|
||||
fromResolutionOf("runtimeClasspath")
|
||||
}
|
||||
usage("java-runtime") {
|
||||
fromResolutionResult()
|
||||
}
|
||||
}
|
||||
|
||||
pom {
|
||||
name.set(project.name)
|
||||
description.set(Meta.desc)
|
||||
|
|
@ -333,123 +290,7 @@ publishing {
|
|||
issueManagement {
|
||||
url.set("https://github.com/${Meta.githubRepo}/issues")
|
||||
}
|
||||
|
||||
withXml {
|
||||
val dependenciesNode = (asNode().get("dependencies") as NodeList)[0] as Node
|
||||
|
||||
val toRemove = ArrayList<Node>()
|
||||
for (child in dependenciesNode.children()) {
|
||||
val artifactNode = ((child as Node).get("artifactId") as NodeList)[0] as Node
|
||||
val artifactID = artifactNode.value() as String
|
||||
|
||||
if(disallowedDependency.contains(artifactID)) {
|
||||
toRemove.add(child)
|
||||
}
|
||||
}
|
||||
|
||||
for (node in toRemove) {
|
||||
dependenciesNode.remove(node)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// hangar publish
|
||||
|
||||
fun executeGitCommand(vararg command: String): String {
|
||||
val byteOut = ByteArrayOutputStream()
|
||||
exec {
|
||||
commandLine = listOf("git", *command)
|
||||
standardOutput = byteOut
|
||||
}
|
||||
return byteOut.toString(Charsets.UTF_8.name()).trim()
|
||||
}
|
||||
|
||||
|
||||
fun latestCommitMessage(): String {
|
||||
return executeGitCommand("log", "-1", "--pretty=%B")
|
||||
}
|
||||
|
||||
fun changelog(isOnline: Boolean): String {
|
||||
var changelog = if(isDevBuild) latestCommitMessage()
|
||||
else System.getenv("RELEASE_CHANGELOG")
|
||||
|
||||
if(!isOnline) {
|
||||
changelog = "This is an offline version of the plugin. \\\n" +
|
||||
"This mean that this plugin libraries are shaded into this plugin \\\n" +
|
||||
"You likely want to use the normal version of this plugin\n\n" + changelog
|
||||
}
|
||||
|
||||
if(changelog == null || changelog.isEmpty()) {
|
||||
changelog = "empty changelog"
|
||||
}
|
||||
|
||||
return changelog
|
||||
}
|
||||
|
||||
hangarPublish {
|
||||
|
||||
fun HangarPublication.configure(isOnline: Boolean, devChannel: String, releaseChannel: String) {
|
||||
var versionName = effectiveVersion
|
||||
if(isPreRelease) versionName+= "-pre"
|
||||
if(!isOnline) versionName+= "-offline"
|
||||
|
||||
version.set(versionName)
|
||||
channel.set(if (isDevBuild || isPreRelease) devChannel else releaseChannel)
|
||||
|
||||
changelog.set(changelog(isOnline))
|
||||
id.set("CustomAnvil")
|
||||
apiKey.set(System.getenv("HANGAR_API_TOKEN"))
|
||||
|
||||
platforms {
|
||||
register(Platforms.PAPER) {
|
||||
// Set the JAR file to upload
|
||||
var task = if(isOnline) tasks.shadowJar
|
||||
else tasks.named<ShadowJar>("offlineJar")
|
||||
|
||||
jar.set(task.flatMap { it.archiveFile })
|
||||
|
||||
// Set platform versions from gradle.properties file
|
||||
val versions: List<String> = (property("paperVersion") as String)
|
||||
.split(",")
|
||||
.map { it.trim() }
|
||||
platformVersions.set(versions)
|
||||
|
||||
dependencies {
|
||||
hangar("ProtocolLib") {
|
||||
required.set(false)
|
||||
}
|
||||
url("Disenchantment", "https://modrinth.com/plugin/disenchantment") {
|
||||
required.set(false)
|
||||
}
|
||||
url("ToolStats", "https://modrinth.com/plugin/toolstats") {
|
||||
required.set(false)
|
||||
}
|
||||
url("HavenBags", "https://www.spigotmc.org/resources/havenbags-shulker-like-player-bound-bags-1-17-1-21-4.110420/") {
|
||||
required.set(false)
|
||||
}
|
||||
url("EcoEnchants", "https://www.spigotmc.org/resources/ecoenchants-%E2%AD%95-250-enchantments-%E2%9C%85-create-custom-enchants-%E2%9C%A8-essentials-cmi-support.79573/") {
|
||||
required.set(false)
|
||||
}
|
||||
hangar("EnchantsSquared") {
|
||||
required.set(false)
|
||||
}
|
||||
url("ExcellentEnchants", "https://www.spigotmc.org/resources/excellentenchants-%E2%AD%90-75-vanilla-like-enchantments.61693/") {
|
||||
required.set(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
publications.register("plugin") {
|
||||
configure(true, "DevSnapshot", "Release")
|
||||
}
|
||||
|
||||
publications.register("offline") {
|
||||
configure(false, "OfflineSnapshot", "OfflineRelease")
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,19 +3,6 @@
|
|||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# What service of metric should custom anvil use
|
||||
# Custom anvil collect generic information like server minecraft version, type, etc...
|
||||
# It can also collect error information if error is happening (currently faststats only)
|
||||
# It can also be disabled
|
||||
# Please refer to README for public metric link
|
||||
# Possible options: auto, bstat, faststats, disabled (auto by default)
|
||||
metric_type: auto
|
||||
|
||||
# Allow to report errors made caused by this plugin (only for faststats)
|
||||
# This allows me to fix potentials issue that I'm not aware of
|
||||
# Accept true or false (true by default)
|
||||
metric_collect_errors: true
|
||||
|
||||
# All anvil cost will be capped to limit_repair_value if enabled.
|
||||
#
|
||||
# In other words:
|
||||
|
|
@ -72,22 +59,8 @@ sacrifice_illegal_enchant_cost: 1
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#".
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&".
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: false
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: false
|
||||
|
||||
# This enables restricting color code for player having specific permission
|
||||
# It requires allow_color_code enabled for... obvious reasons
|
||||
#
|
||||
# For example: if player want to use "&aHello" it will be required that the player has
|
||||
# the permission "ca.color.code.a" as he used the color code "a"
|
||||
# In general permission to give to the player is "ca.color.code.[code]"
|
||||
# where [code] is the color code you wish to allow the player
|
||||
#
|
||||
# It is kinda of useless when minimessage is supported as players would be able to bypass
|
||||
# that using the equivalent minimessage tag
|
||||
per_color_code_permission: false
|
||||
|
||||
# Toggle if color should only be applicable if the player a certain permission.
|
||||
#
|
||||
|
|
@ -99,23 +72,10 @@ permission_needed_for_color: true
|
|||
# Valid values include 0 to 1000.
|
||||
use_of_color_cost: 0
|
||||
|
||||
# Dialogue rename menu make use of dialog menu to allow bigger rename
|
||||
# You can also change the maximum size and set it to -1 or less for maximum
|
||||
# Default limit to apply to any enchants missing from enchant_limits
|
||||
#
|
||||
# This feature only work on paper 1.21.7 or later
|
||||
#
|
||||
# At the moment only english is available for this menu... sorry !
|
||||
#
|
||||
# CustomAnvil use "ca.rename.dialog" when permission
|
||||
enable_dialog_rename: false
|
||||
dialog_rename_max_size: 256
|
||||
permission_needed_for_dialog_rename: false
|
||||
|
||||
# This allows custom anvil to not "guess" the text used for rename but store it in the item
|
||||
# It will make item stackable only and only if it had used the same rename text
|
||||
#
|
||||
# For practical reason. this only work when dialog rename is enabled
|
||||
dialog_rename_keep_user_text: true
|
||||
# Valid values include 1 to 1000
|
||||
default_limit: 5
|
||||
|
||||
# Override limits for specific enchants
|
||||
#
|
||||
|
|
@ -123,8 +83,7 @@ dialog_rename_keep_user_text: true
|
|||
#
|
||||
# Overrides provided default from aqua_affinity to depth_strider won't change effect with extra levels
|
||||
#
|
||||
# Valid range of 0 - 255 for each enchantment
|
||||
# -1 mean keep default
|
||||
# Valid range of 1 - 255 for each enchantment
|
||||
enchant_limits:
|
||||
minecraft:aqua_affinity: 1
|
||||
minecraft:binding_curse: 1
|
||||
|
|
@ -306,20 +265,11 @@ enchant_values:
|
|||
# Even if disable-merge-over of unbreaking is set to 2
|
||||
# -1 mean enchantment merge for this enchantment is not disabled. default to -1 if absent.
|
||||
disable-merge-over:
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla on default configuration)
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla)
|
||||
minecraft:sharpness: -1
|
||||
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
|
||||
#minecraft:unbreaking: 2
|
||||
|
||||
# The maximum number of enchantment an item can get. -1 for infinity
|
||||
# Use eco enchant enchant_limit if present by default unless "default" is not equal to -1
|
||||
enchantment_count_limit:
|
||||
default: -1
|
||||
# Limit for specific items. example bellow is an example with stick
|
||||
# Per item enchantment limit override eco enchant enchant_limit and default limit
|
||||
items:
|
||||
stick: -1
|
||||
|
||||
# Settings for lore modification
|
||||
lore_edit:
|
||||
book_and_quil:
|
||||
|
|
@ -342,12 +292,9 @@ lore_edit:
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
allow_hexadecimal_color: true
|
||||
use_cost: 0
|
||||
|
||||
remove:
|
||||
# If removing lore using book & quil is enabled
|
||||
|
|
@ -362,25 +309,16 @@ lore_edit:
|
|||
shared_additive: false
|
||||
# If removing the lore consume the book & quil
|
||||
do_consume: false
|
||||
# If the color should get back to color code or hex format
|
||||
remove_color_on_remove: true
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this book should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
paper:
|
||||
# Permission is ca.lore_edit.paper
|
||||
use_permission: true
|
||||
# what order should the lines should get added/removed (start/end, if invalid or not present will be end)
|
||||
order: end
|
||||
order: "end"
|
||||
|
||||
append_line:
|
||||
# If adding lore line using paper is enabled
|
||||
|
|
@ -397,12 +335,8 @@ lore_edit:
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
allow_hexadecimal_color: true
|
||||
color_use_cost: 0
|
||||
|
||||
remove_line:
|
||||
|
|
@ -416,46 +350,10 @@ lore_edit:
|
|||
shared_additive: false
|
||||
# If removing the lore line consume the paper
|
||||
do_consume: false
|
||||
# If the color should get back to color code or hex format
|
||||
remove_color_on_remove: true
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this paper should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
# Allow to replace the xp cost by a monetary cost
|
||||
# If enabled it will not be bound to the experience level limits
|
||||
#
|
||||
# It also requires to enable dialog rename (set "enable_dialog_rename: false" a bit higher)
|
||||
# If dialog rename permission is enabled and player do not have the permission merge will fall back to vanilla xp cost
|
||||
#
|
||||
# If you are using custom craft I recommend using Linear Xp Cost with Exact Linear Xp as normal Xp Cost will act "weird"
|
||||
# But Linear Xp will act as 1$ time global multiplier. In other word: like you expect
|
||||
#
|
||||
# As this feature require dialog rename, it can only be enabled starting with paper 1.21.6 and later
|
||||
monetary_cost:
|
||||
enabled: false
|
||||
# If using vault unlocked this allow to specify what currency should be used for anvil usage
|
||||
# default being the default currency
|
||||
currency: default
|
||||
# multiply the anvil cost by a value to allow to have price a big bigger than like 40
|
||||
multipliers:
|
||||
# global multipliers. all usage type will be multiplied by this value
|
||||
global: 1.0
|
||||
# usage specific type. it will only apply for specific xp "reason"
|
||||
enchantment: 1.0 # related to enchantments level
|
||||
repair: 1.0 # for repairing via unit repair (per unit)
|
||||
rename: 1.0 # for renaming the item
|
||||
lore_edit: 1.0 # for changing the lore of the item (only if lore edit is enabled)
|
||||
work_penalty: 1.0 # for work penalty (aka use penalty)
|
||||
recipe: 1.0 # for custom anvil recipe cost
|
||||
|
||||
# Whether to show debug logging
|
||||
debug_log: false
|
||||
|
|
@ -463,4 +361,10 @@ debug_log: false
|
|||
# Whether to show verbose debug logging
|
||||
debug_log_verbose: false
|
||||
|
||||
configVersion: 1.11.0
|
||||
# In case something when wrong with CustomAnvil packet manager.
|
||||
# If you see "missing class exception" or similar you may test this.
|
||||
# If enabled and Protocolib absent or disabled "Replace to expensive" will not work.
|
||||
# ProtocoLib may also be used if the server is in an "unsupported" version even if this option is disabled.
|
||||
force_protocolib: false
|
||||
|
||||
configVersion: 1.8.0
|
||||
|
|
|
|||
|
|
@ -92,10 +92,6 @@ restriction_loyalty:
|
|||
enchantments: [ minecraft:loyalty ]
|
||||
notAffectedGroups: [ enchanted_book, trident ]
|
||||
|
||||
restriction_luck_of_the_sea:
|
||||
enchantments: [ minecraft:luck_of_the_sea ]
|
||||
notAffectedGroups: [ enchanted_book, fishing_rod ]
|
||||
|
||||
restriction_lure:
|
||||
enchantments: [ minecraft:lure ]
|
||||
notAffectedGroups: [ enchanted_book, fishing_rod ]
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
### Default Plugin's Configurations For 1.21.11
|
||||
- [config.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11/config.yml)
|
||||
- [enchant_conflict.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11/enchant_conflict.yml)
|
||||
- [item_groups.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11/item_groups.yml)
|
||||
- [unit_repair_item.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11/unit_repair_item.yml)
|
||||
- [custom_recipes.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11/custom_recipes.yml)
|
||||
|
|
@ -1,487 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# What service of metric should custom anvil use
|
||||
# Custom anvil collect generic information like server minecraft version, type, etc...
|
||||
# It can also collect error information if error is happening (currently faststats only)
|
||||
# It can also be disabled
|
||||
# Please refer to README for public metric link
|
||||
# Possible options: auto, bstat, faststats, disabled (auto by default)
|
||||
metric_type: auto
|
||||
|
||||
# Allow to report errors made caused by this plugin (only for faststats)
|
||||
# This allows me to fix potentials issue that I'm not aware of
|
||||
# Accept true or false (true by default)
|
||||
metric_collect_errors: true
|
||||
|
||||
# All anvil cost will be capped to limit_repair_value if enabled.
|
||||
#
|
||||
# In other words:
|
||||
# For any anvil cost greater than limit_repair_value, Cost will be set to limit_repair_value.
|
||||
limit_repair_cost: false
|
||||
|
||||
# Max cost value the Anvil can get to.
|
||||
#
|
||||
# Valid values include 0 to 1000.
|
||||
# Cost will be displayed as "Too Expensive":
|
||||
# - If Cost is above 39
|
||||
# - And replace_too_expensive is disabled (false)
|
||||
limit_repair_value: 39
|
||||
|
||||
# Whether the anvil's cost limit should be removed entirely.
|
||||
#
|
||||
# The anvil will still visually display "Too Expensive" if "replace_too_expensive" is disabled
|
||||
# However, the action will be completable if xp requirement is meet.
|
||||
remove_repair_limit: false
|
||||
|
||||
# Whenever anvil cost is above 39 should display the true price and not "Too Expensive".
|
||||
#
|
||||
# However, when bypassing "Too Expensive", anvil price will be displayed as Green.
|
||||
# If the action is not completable, the cost will still be displayed as "Too expensive".
|
||||
# That mean you also need to change other settings like remove_repair_limit or limit_repair_cost.
|
||||
#
|
||||
# Require ProtocoLib.
|
||||
replace_too_expensive: false
|
||||
|
||||
# XP Level amount added to the anvil when the item is repaired by another item of the same type
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
item_repair_cost: 2
|
||||
|
||||
# XP Level amount added to the anvil when the item is renamed
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
item_rename_cost: 1
|
||||
|
||||
# XP Level amount added to the anvil when the item is repaired by an "unit"
|
||||
# For example: a Diamond on a Diamond Sword
|
||||
# What's considered unit for what can be edited on the unit repair configuration.
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
unit_repair_cost: 1
|
||||
|
||||
# XP Level amount added to the anvil when a sacrifice enchantment
|
||||
# conflict with one of the left item enchantment
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
sacrifice_illegal_enchant_cost: 1
|
||||
|
||||
# Allow using color code and hexadecimal color.
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#".
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&".
|
||||
# For minimessage search for minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
# Note that only color and decoration tags are allowed for minimisage in the v1 version of this plugin
|
||||
# but any global tag will be allowed later when v2 release
|
||||
allow_color_code: false
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: false
|
||||
|
||||
# This enables restricting color code for player having specific permission
|
||||
# It requires allow_color_code enabled for... obvious reasons
|
||||
#
|
||||
# For example: if player want to use "&aHello" it will be required that the player has
|
||||
# the permission "ca.color.code.a" as he used the color code "a"
|
||||
# In general permission to give to the player is "ca.color.code.[code]"
|
||||
# where [code] is the color code you wish to allow the player
|
||||
#
|
||||
# It is kinda of useless when minimessage is supported as players would be able to bypass
|
||||
# that using the equivalent minimessage tag
|
||||
per_color_code_permission: false
|
||||
|
||||
# Toggle if color should only be applicable if the player a certain permission.
|
||||
#
|
||||
# permission are "ca.color.code" for use of color code and "ca.color.hex" for use of hexadecimal color.
|
||||
permission_needed_for_color: true
|
||||
|
||||
# Xp cost if the player use color in the items name on rename.
|
||||
#
|
||||
# Valid values include 0 to 1000.
|
||||
use_of_color_cost: 0
|
||||
|
||||
# Dialogue rename menu make use of dialog menu to allow bigger rename
|
||||
# You can also change the maximum size and set it to -1 or less for maximum
|
||||
#
|
||||
# This feature only work on paper 1.21.7 or later
|
||||
#
|
||||
# At the moment only english is available for this menu... sorry !
|
||||
#
|
||||
# CustomAnvil use "ca.rename.dialog" when permission
|
||||
enable_dialog_rename: false
|
||||
dialog_rename_max_size: 256
|
||||
permission_needed_for_dialog_rename: false
|
||||
|
||||
# This allows custom anvil to not "guess" the text used for rename but store it in the item
|
||||
# It will make item stackable only and only if it had used the same rename text
|
||||
#
|
||||
# For practical reason. this only work when dialog rename is enabled
|
||||
dialog_rename_keep_user_text: true
|
||||
|
||||
# Override limits for specific enchants
|
||||
#
|
||||
# Enchantments not listed here will use the value of default_limit
|
||||
#
|
||||
# Overrides provided default from aqua_affinity to depth_strider won't change effect with extra levels
|
||||
#
|
||||
# Valid range of 0 - 255 for each enchantment
|
||||
# -1 mean keep default
|
||||
enchant_limits:
|
||||
minecraft:aqua_affinity: 1
|
||||
minecraft:binding_curse: 1
|
||||
minecraft:channeling: 1
|
||||
minecraft:flame: 1
|
||||
minecraft:infinity: 1
|
||||
minecraft:mending: 1
|
||||
minecraft:multishot: 1
|
||||
minecraft:silk_touch: 1
|
||||
minecraft:vanishing_curse: 1
|
||||
minecraft:depth_strider: 3 # anything more than 3 is treated as 3 by the game
|
||||
minecraft:protection: 4
|
||||
minecraft:fire_protection: 4
|
||||
minecraft:blast_protection: 4
|
||||
minecraft:projectile_protection: 4
|
||||
minecraft:feather_falling: 4
|
||||
minecraft:thorns: 3
|
||||
minecraft:respiration: 3
|
||||
minecraft:sharpness: 5
|
||||
minecraft:smite: 5
|
||||
minecraft:bane_of_arthropods: 5
|
||||
minecraft:knockback: 2
|
||||
minecraft:fire_aspect: 2
|
||||
minecraft:looting: 3
|
||||
minecraft:sweeping: 3
|
||||
minecraft:sweeping_edge: 3
|
||||
minecraft:efficiency: 5
|
||||
minecraft:unbreaking: 3
|
||||
minecraft:fortune: 3
|
||||
minecraft:power: 5
|
||||
minecraft:punch: 2
|
||||
minecraft:luck_of_the_sea: 3
|
||||
minecraft:lure: 3
|
||||
minecraft:frost_walker: 2
|
||||
minecraft:impaling: 5
|
||||
minecraft:riptide: 3
|
||||
minecraft:loyalty: 3
|
||||
minecraft:piercing: 4
|
||||
minecraft:quick_charge: 3
|
||||
minecraft:soul_speed: 3
|
||||
minecraft:swift_sneak: 3
|
||||
minecraft:density: 5
|
||||
minecraft:breach: 4
|
||||
minecraft:wind_burst: 3
|
||||
minecraft:lunge: 3
|
||||
|
||||
# Multipliers used to calculate the enchantment's value in repair/combining
|
||||
#
|
||||
# Values here are pulled from the fandom wiki:
|
||||
# https://minecraft.fandom.com/wiki/Anvil_mechanics#Costs_for_combining_enchantments
|
||||
#
|
||||
# If an enchantment is missing values here, or is less than 0, it will default to 0
|
||||
#
|
||||
# Calculated as: [Enchantment lvl] * [multiplier]
|
||||
#
|
||||
# With default values protection 4 would have a value of 4 when
|
||||
# coming from either a book (4 * 1) or an item (4 * 1)
|
||||
enchant_values:
|
||||
minecraft:aqua_affinity:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:bane_of_arthropods:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:binding_curse:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:blast_protection:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:channeling:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:depth_strider:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:efficiency:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:flame:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:feather_falling:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:fire_aspect:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:fire_protection:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:fortune:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:frost_walker:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:impaling:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:infinity:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:knockback:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:looting:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:loyalty:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:luck_of_the_sea:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:lure:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:mending:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:multishot:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:piercing:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:power:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:projectile_protection:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:protection:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:punch:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:quick_charge:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:respiration:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:riptide:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:silk_touch:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:sharpness:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:smite:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:soul_speed:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:swift_sneak:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:sweeping:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:sweeping_edge:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:thorns:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:unbreaking:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:vanishing_curse:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:density:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:breach:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:wind_burst:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:lunge:
|
||||
item: 2
|
||||
book: 1
|
||||
|
||||
# Disable enchantment merging for level above the set value
|
||||
# Enchantment merging is when, for example, 2 unbreaking II book combine to give sharpness III
|
||||
# But Enchantment above this value can still be applied. following the previous example, we could still apply a unbreaking III book to a sword
|
||||
# Even if disable-merge-over of unbreaking is set to 2
|
||||
# -1 mean enchantment merge for this enchantment is not disabled. default to -1 if absent.
|
||||
disable-merge-over:
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla on default configuration)
|
||||
minecraft:sharpness: -1
|
||||
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
|
||||
# minecraft:unbreaking: 2
|
||||
|
||||
# The maximum number of enchantment an item can get. -1 for infinity
|
||||
# Use eco enchant enchant_limit if present by default unless "default" is not equal to -1
|
||||
enchantment_count_limit:
|
||||
default: -1
|
||||
# Limit for specific items. example bellow is an example with stick
|
||||
# Per item enchantment limit override eco enchant enchant_limit and default limit
|
||||
items:
|
||||
stick: -1
|
||||
|
||||
# Settings for lore modification
|
||||
lore_edit:
|
||||
book_and_quil:
|
||||
# Permission is ca.lore_edit.book
|
||||
use_permission: true
|
||||
append:
|
||||
# If adding lore using book & quil is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Cost used for every lore line added
|
||||
per_line_cost: 0
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If adding the lore consume the book & quil
|
||||
do_consume: false
|
||||
# Allow using color code and hexadecimal color when editing lore via book & quil
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
use_cost: 0
|
||||
|
||||
remove:
|
||||
# If removing lore using book & quil is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Cost used for every lore line removed
|
||||
per_line_cost: 0
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If removing the lore consume the book & quil
|
||||
do_consume: false
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this book should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
paper:
|
||||
# Permission is ca.lore_edit.paper
|
||||
use_permission: true
|
||||
# what order should the lines should get added/removed (start/end, if invalid or not present will be end)
|
||||
order: end
|
||||
|
||||
append_line:
|
||||
# If adding lore line using paper is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If adding the lore line consume the paper
|
||||
do_consume: false
|
||||
# Allow using color code and hexadecimal color when editing lore via book & quil
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
color_use_cost: 0
|
||||
use_cost: 0
|
||||
|
||||
remove_line:
|
||||
# If removing lore line using paper is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If removing the lore line consume the paper
|
||||
do_consume: false
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this paper should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
# Allow to replace the xp cost by a monetary cost
|
||||
# If enabled it will not be bound to the experience level limits
|
||||
#
|
||||
# It also requires to enable dialog rename (set "enable_dialog_rename: false" a bit higher)
|
||||
# If dialog rename permission is enabled and player do not have the permission merge will fall back to vanilla xp cost
|
||||
#
|
||||
# If you are using custom craft I recommend using Linear Xp Cost with Exact Linear Xp as normal Xp Cost will act "weird"
|
||||
# But Linear Xp will act as 1$ time global multiplier. In other word: like you expect
|
||||
#
|
||||
# As this feature require dialog rename, it can only be enabled starting with paper 1.21.6 and later
|
||||
monetary_cost:
|
||||
enabled: false
|
||||
# If using vault unlocked this allow to specify what currency should be used for anvil usage
|
||||
# default being the default currency
|
||||
currency: default
|
||||
# multiply the anvil cost by a value to allow to have price a big bigger than like 40
|
||||
multipliers:
|
||||
# global multipliers. all usage type will be multiplied by this value
|
||||
global: 1.0
|
||||
# usage specific type. it will only apply for specific xp "reason"
|
||||
enchantment: 1.0 # related to enchantments level
|
||||
repair: 1.0 # for repairing via unit repair (per unit)
|
||||
rename: 1.0 # for renaming the item
|
||||
lore_edit: 1.0 # for changing the lore of the item (only if lore edit is enabled)
|
||||
work_penalty: 1.0 # for work penalty (aka use penalty)
|
||||
recipe: 1.0 # for custom anvil recipe cost
|
||||
|
||||
# Whether to show debug logging
|
||||
debug_log: false
|
||||
|
||||
# Whether to show verbose debug logging
|
||||
debug_log_verbose: false
|
||||
|
||||
configVersion: 1.15.5
|
||||
lowMinecraftVersion: 1.21.11
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
# ----------------------------------------------------
|
||||
# This config file is to store custom craft
|
||||
# It is recommended to use the in game config editor for this configuration.
|
||||
# /customanvilconfig With ca.config.edit permission
|
||||
# ----------------------------------------------------
|
||||
|
|
@ -1,398 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# material conflicts
|
||||
#
|
||||
# If you want to edit this file:
|
||||
# - A conflict will apply to every item except if in one of the notAffectedGroups group
|
||||
# - the conflict will count only if the user try to combine at least as
|
||||
# many conflicting enchantment as "maxEnchantmentBeforeConflict"
|
||||
#
|
||||
#
|
||||
# ----------------------------------------------------
|
||||
# These restriction are about not allowing enchantment
|
||||
# on illegal items
|
||||
# ----------------------------------------------------
|
||||
|
||||
restriction_aqua_affinity:
|
||||
enchantments:
|
||||
- minecraft:aqua_affinity
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- helmets
|
||||
|
||||
restriction_bane_of_arthropods:
|
||||
enchantments:
|
||||
- minecraft:bane_of_arthropods
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
- mace
|
||||
|
||||
restriction_blast_protection:
|
||||
enchantments:
|
||||
- minecraft:blast_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_channeling:
|
||||
enchantments:
|
||||
- minecraft:channeling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_binding_curse:
|
||||
enchantments:
|
||||
- minecraft:binding_curse
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- wearable
|
||||
|
||||
restriction_vanishing_curse:
|
||||
enchantments:
|
||||
- minecraft:vanishing_curse
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_vanish
|
||||
|
||||
restriction_depth_strider:
|
||||
enchantments:
|
||||
- minecraft:depth_strider
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_efficiency:
|
||||
enchantments:
|
||||
- minecraft:efficiency
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
- shears
|
||||
|
||||
restriction_feather_falling:
|
||||
enchantments:
|
||||
- minecraft:feather_falling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_fire_aspect:
|
||||
enchantments:
|
||||
- minecraft:fire_aspect
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
- mace
|
||||
- spears
|
||||
|
||||
restriction_fire_protection:
|
||||
enchantments:
|
||||
- minecraft:fire_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_flame:
|
||||
enchantments:
|
||||
- minecraft:flame
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_fortune:
|
||||
enchantments:
|
||||
- minecraft:fortune
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
|
||||
restriction_frost_walker:
|
||||
enchantments:
|
||||
- minecraft:frost_walker
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_impaling:
|
||||
enchantments:
|
||||
- minecraft:impaling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_infinity:
|
||||
enchantments:
|
||||
- minecraft:infinity
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_knockback:
|
||||
enchantments:
|
||||
- minecraft:knockback
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
- spears
|
||||
|
||||
restriction_looting:
|
||||
enchantments:
|
||||
- minecraft:looting
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
- spears
|
||||
|
||||
restriction_loyalty:
|
||||
enchantments:
|
||||
- minecraft:loyalty
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_luck_of_the_sea:
|
||||
enchantments:
|
||||
- minecraft:luck_of_the_sea
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- fishing_rod
|
||||
|
||||
restriction_lure:
|
||||
enchantments:
|
||||
- minecraft:lure
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- fishing_rod
|
||||
|
||||
restriction_mending:
|
||||
enchantments:
|
||||
- minecraft:mending
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_unbreak
|
||||
|
||||
restriction_minecraft_multishot:
|
||||
enchantments:
|
||||
- minecraft:multishot
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_piercing:
|
||||
enchantments:
|
||||
- minecraft:piercing
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_power:
|
||||
enchantments:
|
||||
- minecraft:power
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_projectile_protection:
|
||||
enchantments:
|
||||
- minecraft:projectile_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_protection:
|
||||
enchantments:
|
||||
- minecraft:protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_punch:
|
||||
enchantments:
|
||||
- minecraft:punch
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_quick_charge:
|
||||
enchantments:
|
||||
- minecraft:quick_charge
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_respiration:
|
||||
enchantments:
|
||||
- minecraft:respiration
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- helmets
|
||||
|
||||
restriction_riptide:
|
||||
enchantments:
|
||||
- minecraft:riptide
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_sharpness:
|
||||
enchantments:
|
||||
- minecraft:sharpness
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
|
||||
restriction__silk_touch:
|
||||
enchantments:
|
||||
- minecraft:silk_touch
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
|
||||
restriction_smite:
|
||||
enchantments:
|
||||
- minecraft:smite
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
- mace
|
||||
|
||||
restriction_soul_speed:
|
||||
enchantments:
|
||||
- minecraft:soul_speed
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_sweeping_edge:
|
||||
enchantments:
|
||||
- minecraft:sweeping
|
||||
- minecraft:sweeping_edge
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
|
||||
# Do not exist in 1.18, that mean useInFuture will be set to true
|
||||
# useInFuture set to true also mean it will not warn if there is an issue
|
||||
restriction_swift_sneak:
|
||||
useInFuture: true
|
||||
enchantments:
|
||||
- minecraft:swift_sneak
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- leggings
|
||||
|
||||
restriction_thorns:
|
||||
enchantments:
|
||||
- minecraft:thorns
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction__unbreaking:
|
||||
enchantments:
|
||||
- minecraft:unbreaking
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_unbreak
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Now we have conflicts about enchantment Incompatibility
|
||||
# We just filtered what item enchantments can be applied
|
||||
# notAffectedGroups is empty as we don't want anything to not respect theses rules
|
||||
# maxEnchantmentBeforeConflict is set to 1 to only have 1 on those enchantment available
|
||||
# ----------------------------------------------------
|
||||
|
||||
sword_enchant_conflict:
|
||||
enchantments:
|
||||
- minecraft:bane_of_arthropods
|
||||
- minecraft:smite
|
||||
- minecraft:sharpness
|
||||
- minecraft:density
|
||||
- minecraft:breach
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
protection_enchant_conflict:
|
||||
enchantments:
|
||||
- minecraft:blast_protection
|
||||
- minecraft:fire_protection
|
||||
- minecraft:projectile_protection
|
||||
- minecraft:protection
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
trident_conflict1:
|
||||
enchantments:
|
||||
- minecraft:channeling
|
||||
- minecraft:riptide
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
trident_conflict2:
|
||||
enchantments:
|
||||
- minecraft:loyalty
|
||||
- minecraft:riptide
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
boot_conflict:
|
||||
enchantments:
|
||||
- minecraft:depth_strider
|
||||
- minecraft:frost_walker
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
tool_conflict:
|
||||
enchantments:
|
||||
- minecraft:fortune
|
||||
- minecraft:silk_touch
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
bow_conflict:
|
||||
enchantments:
|
||||
- minecraft:mending
|
||||
- minecraft:infinity
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
crossbow_conflict:
|
||||
enchantments:
|
||||
- minecraft:multishot
|
||||
- minecraft:piercing
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
restriction_density:
|
||||
enchantments:
|
||||
- minecraft:density
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
restriction_breach:
|
||||
enchantments:
|
||||
- minecraft:breach
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
restriction_wind_burst:
|
||||
enchantments:
|
||||
- minecraft:wind_burst
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
restriction_lunge:
|
||||
enchantments:
|
||||
- minecraft:lunge
|
||||
notAffectedGroups:
|
||||
- spears
|
||||
- enchanted_book
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Bellow is for custom conflicts.
|
||||
# This is also where conflict create from the gui will be placed.
|
||||
# ----------------------------------------------------
|
||||
|
|
@ -1,247 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# Please note this config use spigot material names.
|
||||
# It should match minecraft name in most case, maybe every case, but I can't be sure
|
||||
# In case there an issue with material name, you can found them here:
|
||||
# https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html
|
||||
|
||||
# An empty Exclude group exclude nothing, so it contain everything
|
||||
everything:
|
||||
type: exclude
|
||||
|
||||
# An empty include group will include nothing
|
||||
nothing:
|
||||
type: include
|
||||
|
||||
# This group is an example of a group including only stone and polished granite
|
||||
example_include:
|
||||
type: include
|
||||
items:
|
||||
- stone
|
||||
- polished_granite
|
||||
|
||||
# This group contain everything except polished granite and elements of example_include
|
||||
example_exclude:
|
||||
type: exclude
|
||||
items:
|
||||
- polished_granite
|
||||
groups:
|
||||
- example_include
|
||||
|
||||
# Default configuration should be vanilla enchantment conflict group
|
||||
# there may have error, if you find one you can fix it !
|
||||
# https://minecraft.fandom.com/wiki/Enchanting
|
||||
|
||||
swords:
|
||||
type: include
|
||||
items:
|
||||
- wooden_sword
|
||||
- stone_sword
|
||||
- iron_sword
|
||||
- diamond_sword
|
||||
- golden_sword
|
||||
- netherite_sword
|
||||
- copper_sword
|
||||
|
||||
axes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_axe
|
||||
- stone_axe
|
||||
- iron_axe
|
||||
- diamond_axe
|
||||
- golden_axe
|
||||
- netherite_axe
|
||||
- copper_axe
|
||||
|
||||
melee_weapons:
|
||||
type: include
|
||||
groups:
|
||||
- swords
|
||||
- axes
|
||||
- spears
|
||||
|
||||
helmets:
|
||||
type: include
|
||||
items:
|
||||
- leather_helmet
|
||||
- chainmail_helmet
|
||||
- iron_helmet
|
||||
- diamond_helmet
|
||||
- golden_helmet
|
||||
- netherite_helmet
|
||||
- turtle_helmet
|
||||
- copper_helmet
|
||||
|
||||
chestplate:
|
||||
type: include
|
||||
items:
|
||||
- leather_chestplate
|
||||
- chainmail_chestplate
|
||||
- iron_chestplate
|
||||
- diamond_chestplate
|
||||
- golden_chestplate
|
||||
- netherite_chestplate
|
||||
- copper_chestplate
|
||||
|
||||
leggings:
|
||||
type: include
|
||||
items:
|
||||
- leather_leggings
|
||||
- chainmail_leggings
|
||||
- iron_leggings
|
||||
- diamond_leggings
|
||||
- golden_leggings
|
||||
- netherite_leggings
|
||||
- copper_leggings
|
||||
|
||||
boots:
|
||||
type: include
|
||||
items:
|
||||
- leather_boots
|
||||
- chainmail_boots
|
||||
- iron_boots
|
||||
- diamond_boots
|
||||
- golden_boots
|
||||
- netherite_boots
|
||||
- copper_boots
|
||||
|
||||
armors:
|
||||
type: include
|
||||
groups:
|
||||
- helmets
|
||||
- chestplate
|
||||
- leggings
|
||||
- boots
|
||||
|
||||
wearable:
|
||||
type: include
|
||||
items:
|
||||
- elytra
|
||||
- carved_pumpkin
|
||||
- skeleton_skull
|
||||
- wither_skeleton_skull
|
||||
- zombie_head
|
||||
- player_head
|
||||
- creeper_head
|
||||
- dragon_head
|
||||
- piglin_head
|
||||
groups:
|
||||
- armors
|
||||
|
||||
pickaxes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_pickaxe
|
||||
- stone_pickaxe
|
||||
- iron_pickaxe
|
||||
- diamond_pickaxe
|
||||
- golden_pickaxe
|
||||
- netherite_pickaxe
|
||||
- copper_pickaxe
|
||||
|
||||
shovels:
|
||||
type: include
|
||||
items:
|
||||
- wooden_shovel
|
||||
- stone_shovel
|
||||
- iron_shovel
|
||||
- diamond_shovel
|
||||
- golden_shovel
|
||||
- netherite_shovel
|
||||
- copper_shovel
|
||||
|
||||
hoes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_hoe
|
||||
- stone_hoe
|
||||
- iron_hoe
|
||||
- diamond_hoe
|
||||
- golden_hoe
|
||||
- netherite_hoe
|
||||
- copper_hoe
|
||||
|
||||
tools:
|
||||
type: include
|
||||
groups:
|
||||
- pickaxes
|
||||
- shovels
|
||||
- hoes
|
||||
- axes
|
||||
|
||||
enchanted_book:
|
||||
type: include
|
||||
items:
|
||||
- enchanted_book
|
||||
|
||||
trident:
|
||||
type: include
|
||||
items:
|
||||
- trident
|
||||
|
||||
bow:
|
||||
type: include
|
||||
items:
|
||||
- bow
|
||||
|
||||
crossbow:
|
||||
type: include
|
||||
items:
|
||||
- crossbow
|
||||
|
||||
fishing_rod:
|
||||
type: include
|
||||
items:
|
||||
- fishing_rod
|
||||
|
||||
shears:
|
||||
type: include
|
||||
items:
|
||||
- shears
|
||||
|
||||
can_unbreak:
|
||||
type: include
|
||||
items:
|
||||
- elytra
|
||||
- flint_and_steel
|
||||
- shield
|
||||
- carrot_on_a_stick
|
||||
- warped_fungus_on_a_stick
|
||||
- brush
|
||||
groups:
|
||||
- melee_weapons
|
||||
- tools
|
||||
- armors
|
||||
- trident
|
||||
- bow
|
||||
- crossbow
|
||||
- fishing_rod
|
||||
- shears
|
||||
- mace
|
||||
|
||||
can_vanish:
|
||||
type: include
|
||||
items:
|
||||
- compass
|
||||
groups:
|
||||
- wearable
|
||||
- can_unbreak
|
||||
mace:
|
||||
type: include
|
||||
items:
|
||||
- mace
|
||||
spears:
|
||||
type: include
|
||||
items:
|
||||
- wooden_spear
|
||||
- golden_spear
|
||||
- stone_spear
|
||||
- copper_spear
|
||||
- iron_spear
|
||||
- diamond_spear
|
||||
- netherite_spear
|
||||
|
||||
|
|
@ -1,220 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# Unit repair configuration
|
||||
#
|
||||
# This configuration is to make custom unit repair
|
||||
# A unit repair is, for example, a diamond to repair a diamond sword
|
||||
# In vanilla, a unit repair 25% of object durability
|
||||
# you can make a custom value here
|
||||
#
|
||||
# Item name should NOT combine caps and no caps (example: Stone)
|
||||
|
||||
# Default value if the config is an invalid value (value <= 0 )
|
||||
# If value > 1 it will be treated as being = 1
|
||||
default_repair_amount: 0.25
|
||||
|
||||
# You can add custom unit repair
|
||||
# The example bellow make a shield repaired by 10% by sticks
|
||||
|
||||
# stick:
|
||||
# shield: 0.10
|
||||
|
||||
|
||||
# Vanilla unit repair group is bellow
|
||||
diamond:
|
||||
diamond_helmet: 0.25
|
||||
diamond_chestplate: 0.25
|
||||
diamond_leggings: 0.25
|
||||
diamond_boots: 0.25
|
||||
diamond_sword: 0.25
|
||||
diamond_pickaxe: 0.25
|
||||
diamond_axe: 0.25
|
||||
diamond_shovel: 0.25
|
||||
diamond_hoe: 0.25
|
||||
diamond_spear: 0.25
|
||||
|
||||
netherite_ingot:
|
||||
netherite_helmet: 0.25
|
||||
netherite_chestplate: 0.25
|
||||
netherite_leggings: 0.25
|
||||
netherite_boots: 0.25
|
||||
netherite_sword: 0.25
|
||||
netherite_pickaxe: 0.25
|
||||
netherite_axe: 0.25
|
||||
netherite_shovel: 0.25
|
||||
netherite_hoe: 0.25
|
||||
netherite_spear: 0.25
|
||||
|
||||
gold_ingot:
|
||||
golden_helmet: 0.25
|
||||
golden_chestplate: 0.25
|
||||
golden_leggings: 0.25
|
||||
golden_boots: 0.25
|
||||
golden_sword: 0.25
|
||||
golden_pickaxe: 0.25
|
||||
golden_axe: 0.25
|
||||
golden_shovel: 0.25
|
||||
golden_hoe: 0.25
|
||||
golden_spear: 0.25
|
||||
|
||||
iron_ingot:
|
||||
iron_helmet: 0.25
|
||||
iron_chestplate: 0.25
|
||||
iron_leggings: 0.25
|
||||
iron_boots: 0.25
|
||||
iron_sword: 0.25
|
||||
iron_pickaxe: 0.25
|
||||
iron_axe: 0.25
|
||||
iron_shovel: 0.25
|
||||
iron_hoe: 0.25
|
||||
iron_spear: 0.25
|
||||
|
||||
cobblestone:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
stone_spear: 0.25
|
||||
|
||||
cobbled_deepslate:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
stone_spear: 0.25
|
||||
|
||||
blackstone:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
|
||||
leather:
|
||||
leather_helmet: 0.25
|
||||
leather_chestplate: 0.25
|
||||
leather_leggings: 0.25
|
||||
leather_boots: 0.25
|
||||
|
||||
phantom_membrane:
|
||||
elytra: 0.25
|
||||
|
||||
scute:
|
||||
turtle_helmet: 0.25
|
||||
|
||||
oak_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
spruce_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
birch_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
jungle_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
acacia_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
dark_oak_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
mangrove_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
cherry_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
bamboo_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
crimson_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
|
||||
warped_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
wooden_spear: 0.25
|
||||
breeze_rod:
|
||||
mace: 0.25
|
||||
copper_ingot:
|
||||
copper_helmet: 0.25
|
||||
copper_chestplate: 0.25
|
||||
copper_leggings: 0.25
|
||||
copper_boots: 0.25
|
||||
copper_pickaxe: 0.25
|
||||
copper_shovel: 0.25
|
||||
copper_hoe: 0.25
|
||||
copper_axe: 0.25
|
||||
copper_sword: 0.25
|
||||
copper_spear: 0.25
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
### Default Plugin's Configurations For 1.21.9
|
||||
- [config.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9/config.yml)
|
||||
- [enchant_conflict.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9/enchant_conflict.yml)
|
||||
- [item_groups.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9/item_groups.yml)
|
||||
- [unit_repair_item.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9/unit_repair_item.yml)
|
||||
- [custom_recipes.yml](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9/custom_recipes.yml)
|
||||
|
|
@ -1,479 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# What service of metric should custom anvil use
|
||||
# Custom anvil collect generic information like server minecraft version, type, etc...
|
||||
# It can also collect error information if error is happening (currently faststats only)
|
||||
# It can also be disabled
|
||||
# Please refer to README for public metric link
|
||||
# Possible options: auto, bstat, faststats, disabled (auto by default)
|
||||
metric_type: auto
|
||||
|
||||
# Allow to report errors made caused by this plugin (only for faststats)
|
||||
# This allows me to fix potentials issue that I'm not aware of
|
||||
# Accept true or false (true by default)
|
||||
metric_collect_errors: true
|
||||
|
||||
# All anvil cost will be capped to limit_repair_value if enabled.
|
||||
#
|
||||
# In other words:
|
||||
# For any anvil cost greater than limit_repair_value, Cost will be set to limit_repair_value.
|
||||
limit_repair_cost: false
|
||||
|
||||
# Max cost value the Anvil can get to.
|
||||
#
|
||||
# Valid values include 0 to 1000.
|
||||
# Cost will be displayed as "Too Expensive":
|
||||
# - If Cost is above 39
|
||||
# - And replace_too_expensive is disabled (false)
|
||||
limit_repair_value: 39
|
||||
|
||||
# Whether the anvil's cost limit should be removed entirely.
|
||||
#
|
||||
# The anvil will still visually display "Too Expensive" if "replace_too_expensive" is disabled
|
||||
# However, the action will be completable if xp requirement is meet.
|
||||
remove_repair_limit: false
|
||||
|
||||
# Whenever anvil cost is above 39 should display the true price and not "Too Expensive".
|
||||
#
|
||||
# However, when bypassing "Too Expensive", anvil price will be displayed as Green.
|
||||
# If the action is not completable, the cost will still be displayed as "Too expensive".
|
||||
# That mean you also need to change other settings like remove_repair_limit or limit_repair_cost.
|
||||
#
|
||||
# Require ProtocoLib.
|
||||
replace_too_expensive: false
|
||||
|
||||
# XP Level amount added to the anvil when the item is repaired by another item of the same type
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
item_repair_cost: 2
|
||||
|
||||
# XP Level amount added to the anvil when the item is renamed
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
item_rename_cost: 1
|
||||
|
||||
# XP Level amount added to the anvil when the item is repaired by an "unit"
|
||||
# For example: a Diamond on a Diamond Sword
|
||||
# What's considered unit for what can be edited on the unit repair configuration.
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
unit_repair_cost: 1
|
||||
|
||||
# XP Level amount added to the anvil when a sacrifice enchantment
|
||||
# conflict with one of the left item enchantment
|
||||
#
|
||||
# Valid values include 0 to 1000
|
||||
sacrifice_illegal_enchant_cost: 1
|
||||
|
||||
# Allow using color code and hexadecimal color.
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#".
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&".
|
||||
# For minimessage search for minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: false
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: false
|
||||
|
||||
# This enables restricting color code for player having specific permission
|
||||
# It requires allow_color_code enabled for... obvious reasons
|
||||
#
|
||||
# For example: if player want to use "&aHello" it will be required that the player has
|
||||
# the permission "ca.color.code.a" as he used the color code "a"
|
||||
# In general permission to give to the player is "ca.color.code.[code]"
|
||||
# where [code] is the color code you wish to allow the player
|
||||
#
|
||||
# It is kinda of useless when minimessage is supported as players would be able to bypass
|
||||
# that using the equivalent minimessage tag
|
||||
per_color_code_permission: false
|
||||
|
||||
# Toggle if color should only be applicable if the player a certain permission.
|
||||
#
|
||||
# permission are "ca.color.code" for use of color code and "ca.color.hex" for use of hexadecimal color.
|
||||
permission_needed_for_color: true
|
||||
|
||||
# Xp cost if the player use color in the items name on rename.
|
||||
#
|
||||
# Valid values include 0 to 1000.
|
||||
use_of_color_cost: 0
|
||||
|
||||
# Dialogue rename menu make use of dialog menu to allow bigger rename
|
||||
# You can also change the maximum size and set it to -1 or less for maximum
|
||||
#
|
||||
# This feature only work on paper 1.21.7 or later
|
||||
#
|
||||
# At the moment only english is available for this menu... sorry !
|
||||
#
|
||||
# CustomAnvil use "ca.rename.dialog" when permission
|
||||
enable_dialog_rename: false
|
||||
dialog_rename_max_size: 256
|
||||
permission_needed_for_dialog_rename: false
|
||||
|
||||
# This allows custom anvil to not "guess" the text used for rename but store it in the item
|
||||
# It will make item stackable only and only if it had used the same rename text
|
||||
#
|
||||
# For practical reason. this only work when dialog rename is enabled
|
||||
dialog_rename_keep_user_text: true
|
||||
|
||||
# Override limits for specific enchants
|
||||
#
|
||||
# Enchantments not listed here will use the value of default_limit
|
||||
#
|
||||
# Overrides provided default from aqua_affinity to depth_strider won't change effect with extra levels
|
||||
#
|
||||
# Valid range of 0 - 255 for each enchantment
|
||||
# -1 mean keep default
|
||||
enchant_limits:
|
||||
minecraft:aqua_affinity: 1
|
||||
minecraft:binding_curse: 1
|
||||
minecraft:channeling: 1
|
||||
minecraft:flame: 1
|
||||
minecraft:infinity: 1
|
||||
minecraft:mending: 1
|
||||
minecraft:multishot: 1
|
||||
minecraft:silk_touch: 1
|
||||
minecraft:vanishing_curse: 1
|
||||
minecraft:depth_strider: 3 # anything more than 3 is treated as 3 by the game
|
||||
minecraft:protection: 4
|
||||
minecraft:fire_protection: 4
|
||||
minecraft:blast_protection: 4
|
||||
minecraft:projectile_protection: 4
|
||||
minecraft:feather_falling: 4
|
||||
minecraft:thorns: 3
|
||||
minecraft:respiration: 3
|
||||
minecraft:sharpness: 5
|
||||
minecraft:smite: 5
|
||||
minecraft:bane_of_arthropods: 5
|
||||
minecraft:knockback: 2
|
||||
minecraft:fire_aspect: 2
|
||||
minecraft:looting: 3
|
||||
minecraft:sweeping: 3
|
||||
minecraft:sweeping_edge: 3
|
||||
minecraft:efficiency: 5
|
||||
minecraft:unbreaking: 3
|
||||
minecraft:fortune: 3
|
||||
minecraft:power: 5
|
||||
minecraft:punch: 2
|
||||
minecraft:luck_of_the_sea: 3
|
||||
minecraft:lure: 3
|
||||
minecraft:frost_walker: 2
|
||||
minecraft:impaling: 5
|
||||
minecraft:riptide: 3
|
||||
minecraft:loyalty: 3
|
||||
minecraft:piercing: 4
|
||||
minecraft:quick_charge: 3
|
||||
minecraft:soul_speed: 3
|
||||
minecraft:swift_sneak: 3
|
||||
minecraft:density: 5
|
||||
minecraft:breach: 4
|
||||
minecraft:wind_burst: 3
|
||||
|
||||
# Multipliers used to calculate the enchantment's value in repair/combining
|
||||
#
|
||||
# Values here are pulled from the fandom wiki:
|
||||
# https://minecraft.fandom.com/wiki/Anvil_mechanics#Costs_for_combining_enchantments
|
||||
#
|
||||
# If an enchantment is missing values here, or is less than 0, it will default to 0
|
||||
#
|
||||
# Calculated as: [Enchantment lvl] * [multiplier]
|
||||
#
|
||||
# With default values protection 4 would have a value of 4 when
|
||||
# coming from either a book (4 * 1) or an item (4 * 1)
|
||||
enchant_values:
|
||||
minecraft:aqua_affinity:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:bane_of_arthropods:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:binding_curse:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:blast_protection:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:channeling:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:depth_strider:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:efficiency:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:flame:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:feather_falling:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:fire_aspect:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:fire_protection:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:fortune:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:frost_walker:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:impaling:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:infinity:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:knockback:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:looting:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:loyalty:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:luck_of_the_sea:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:lure:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:mending:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:multishot:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:piercing:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:power:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:projectile_protection:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:protection:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:punch:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:quick_charge:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:respiration:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:riptide:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:silk_touch:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:sharpness:
|
||||
item: 1
|
||||
book: 1
|
||||
minecraft:smite:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:soul_speed:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:swift_sneak:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:sweeping:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:sweeping_edge:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:thorns:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:unbreaking:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:vanishing_curse:
|
||||
item: 8
|
||||
book: 4
|
||||
minecraft:density:
|
||||
item: 2
|
||||
book: 1
|
||||
minecraft:breach:
|
||||
item: 4
|
||||
book: 2
|
||||
minecraft:wind_burst:
|
||||
item: 4
|
||||
book: 2
|
||||
|
||||
# Disable enchantment merging for level above the set value
|
||||
# Enchantment merging is when, for example, 2 unbreaking II book combine to give sharpness III
|
||||
# But Enchantment above this value can still be applied. following the previous example, we could still apply a unbreaking III book to a sword
|
||||
# Even if disable-merge-over of unbreaking is set to 2
|
||||
# -1 mean enchantment merge for this enchantment is not disabled. default to -1 if absent.
|
||||
disable-merge-over:
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla on default configuration)
|
||||
minecraft:sharpness: -1
|
||||
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
|
||||
# minecraft:unbreaking: 2
|
||||
|
||||
# The maximum number of enchantment an item can get. -1 for infinity
|
||||
# Use eco enchant enchant_limit if present by default unless "default" is not equal to -1
|
||||
enchantment_count_limit:
|
||||
default: -1
|
||||
# Limit for specific items. example bellow is an example with stick
|
||||
# Per item enchantment limit override eco enchant enchant_limit and default limit
|
||||
items:
|
||||
stick: -1
|
||||
|
||||
# Settings for lore modification
|
||||
lore_edit:
|
||||
book_and_quil:
|
||||
# Permission is ca.lore_edit.book
|
||||
use_permission: true
|
||||
append:
|
||||
# If adding lore using book & quil is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Cost used for every lore line added
|
||||
per_line_cost: 0
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If adding the lore consume the book & quil
|
||||
do_consume: false
|
||||
# Allow using color code and hexadecimal color when editing lore via book & quil
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
remove:
|
||||
# If removing lore using book & quil is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Cost used for every lore line removed
|
||||
per_line_cost: 0
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If removing the lore consume the book & quil
|
||||
do_consume: false
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this book should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
paper:
|
||||
# Permission is ca.lore_edit.paper
|
||||
use_permission: true
|
||||
# what order should the lines should get added/removed (start/end, if invalid or not present will be end)
|
||||
order: end
|
||||
|
||||
append_line:
|
||||
# If adding lore line using paper is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If adding the lore line consume the paper
|
||||
do_consume: false
|
||||
# Allow using color code and hexadecimal color when editing lore via book & quil
|
||||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
color_use_cost: 0
|
||||
|
||||
remove_line:
|
||||
# If removing lore line using paper is enabled
|
||||
enabled: false
|
||||
# Cost used every time
|
||||
fixed_cost: 1
|
||||
# Use left item vanilla cost penalty if any
|
||||
shared_increase: false
|
||||
# Increase shared left item cost penalty
|
||||
shared_additive: false
|
||||
# If removing the lore line consume the paper
|
||||
do_consume: false
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this paper should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
# Allow to replace the xp cost by a monetary cost
|
||||
# If enabled it will not be bound to the experience level limits
|
||||
#
|
||||
# It also requires to enable dialog rename (set "enable_dialog_rename: false" a bit higher)
|
||||
# If dialog rename permission is enabled and player do not have the permission merge will fall back to vanilla xp cost
|
||||
#
|
||||
# If you are using custom craft I recommend using Linear Xp Cost with Exact Linear Xp as normal Xp Cost will act "weird"
|
||||
# But Linear Xp will act as 1$ time global multiplier. In other word: like you expect
|
||||
#
|
||||
# As this feature require dialog rename, it can only be enabled starting with paper 1.21.6 and later
|
||||
monetary_cost:
|
||||
enabled: false
|
||||
# If using vault unlocked this allow to specify what currency should be used for anvil usage
|
||||
# default being the default currency
|
||||
currency: default
|
||||
# multiply the anvil cost by a value to allow to have price a big bigger than like 40
|
||||
multipliers:
|
||||
# global multipliers. all usage type will be multiplied by this value
|
||||
global: 1.0
|
||||
# usage specific type. it will only apply for specific xp "reason"
|
||||
enchantment: 1.0 # related to enchantments level
|
||||
repair: 1.0 # for repairing via unit repair (per unit)
|
||||
rename: 1.0 # for renaming the item
|
||||
lore_edit: 1.0 # for changing the lore of the item (only if lore edit is enabled)
|
||||
work_penalty: 1.0 # for work penalty (aka use penalty)
|
||||
recipe: 1.0 # for custom anvil recipe cost
|
||||
|
||||
# Whether to show debug logging
|
||||
debug_log: false
|
||||
|
||||
# Whether to show verbose debug logging
|
||||
debug_log_verbose: false
|
||||
|
||||
configVersion: 1.11.0
|
||||
lowMinecraftVersion: 1.21.9
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
# ----------------------------------------------------
|
||||
# This config file is to store custom craft
|
||||
# It is recommended to use the in game config editor for this configuration.
|
||||
# /customanvilconfig With ca.config.edit permission
|
||||
# ----------------------------------------------------
|
||||
|
|
@ -1,389 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# material conflicts
|
||||
#
|
||||
# If you want to edit this file:
|
||||
# - A conflict will apply to every item except if in one of the notAffectedGroups group
|
||||
# - the conflict will count only if the user try to combine at least as
|
||||
# many conflicting enchantment as "maxEnchantmentBeforeConflict"
|
||||
#
|
||||
#
|
||||
# ----------------------------------------------------
|
||||
# These restriction are about not allowing enchantment
|
||||
# on illegal items
|
||||
# ----------------------------------------------------
|
||||
|
||||
restriction_aqua_affinity:
|
||||
enchantments:
|
||||
- minecraft:aqua_affinity
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- helmets
|
||||
|
||||
restriction_bane_of_arthropods:
|
||||
enchantments:
|
||||
- minecraft:bane_of_arthropods
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
- mace
|
||||
|
||||
restriction_blast_protection:
|
||||
enchantments:
|
||||
- minecraft:blast_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_channeling:
|
||||
enchantments:
|
||||
- minecraft:channeling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_binding_curse:
|
||||
enchantments:
|
||||
- minecraft:binding_curse
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- wearable
|
||||
|
||||
restriction_vanishing_curse:
|
||||
enchantments:
|
||||
- minecraft:vanishing_curse
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_vanish
|
||||
|
||||
restriction_depth_strider:
|
||||
enchantments:
|
||||
- minecraft:depth_strider
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_efficiency:
|
||||
enchantments:
|
||||
- minecraft:efficiency
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
- shears
|
||||
|
||||
restriction_feather_falling:
|
||||
enchantments:
|
||||
- minecraft:feather_falling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_fire_aspect:
|
||||
enchantments:
|
||||
- minecraft:fire_aspect
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
- mace
|
||||
|
||||
restriction_fire_protection:
|
||||
enchantments:
|
||||
- minecraft:fire_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_flame:
|
||||
enchantments:
|
||||
- minecraft:flame
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_fortune:
|
||||
enchantments:
|
||||
- minecraft:fortune
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
|
||||
restriction_frost_walker:
|
||||
enchantments:
|
||||
- minecraft:frost_walker
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_impaling:
|
||||
enchantments:
|
||||
- minecraft:impaling
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_infinity:
|
||||
enchantments:
|
||||
- minecraft:infinity
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_knockback:
|
||||
enchantments:
|
||||
- minecraft:knockback
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
|
||||
restriction_looting:
|
||||
enchantments:
|
||||
- minecraft:looting
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
|
||||
restriction_loyalty:
|
||||
enchantments:
|
||||
- minecraft:loyalty
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_luck_of_the_sea:
|
||||
enchantments:
|
||||
- minecraft:luck_of_the_sea
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- fishing_rod
|
||||
|
||||
restriction_lure:
|
||||
enchantments:
|
||||
- minecraft:lure
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- fishing_rod
|
||||
|
||||
restriction_mending:
|
||||
enchantments:
|
||||
- minecraft:mending
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_unbreak
|
||||
|
||||
restriction_minecraft_multishot:
|
||||
enchantments:
|
||||
- minecraft:multishot
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_piercing:
|
||||
enchantments:
|
||||
- minecraft:piercing
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_power:
|
||||
enchantments:
|
||||
- minecraft:power
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_projectile_protection:
|
||||
enchantments:
|
||||
- minecraft:projectile_protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_protection:
|
||||
enchantments:
|
||||
- minecraft:protection
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction_punch:
|
||||
enchantments:
|
||||
- minecraft:punch
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- bow
|
||||
|
||||
restriction_quick_charge:
|
||||
enchantments:
|
||||
- minecraft:quick_charge
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- crossbow
|
||||
|
||||
restriction_respiration:
|
||||
enchantments:
|
||||
- minecraft:respiration
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- helmets
|
||||
|
||||
restriction_riptide:
|
||||
enchantments:
|
||||
- minecraft:riptide
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- trident
|
||||
|
||||
restriction_sharpness:
|
||||
enchantments:
|
||||
- minecraft:sharpness
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
|
||||
restriction__silk_touch:
|
||||
enchantments:
|
||||
- minecraft:silk_touch
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- tools
|
||||
|
||||
restriction_smite:
|
||||
enchantments:
|
||||
- minecraft:smite
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- melee_weapons
|
||||
- mace
|
||||
|
||||
restriction_soul_speed:
|
||||
enchantments:
|
||||
- minecraft:soul_speed
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- boots
|
||||
|
||||
restriction_sweeping_edge:
|
||||
enchantments:
|
||||
- minecraft:sweeping
|
||||
- minecraft:sweeping_edge
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- swords
|
||||
|
||||
# Do not exist in 1.18, that mean useInFuture will be set to true
|
||||
# useInFuture set to true also mean it will not warn if there is an issue
|
||||
restriction_swift_sneak:
|
||||
useInFuture: true
|
||||
enchantments:
|
||||
- minecraft:swift_sneak
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- leggings
|
||||
|
||||
restriction_thorns:
|
||||
enchantments:
|
||||
- minecraft:thorns
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- armors
|
||||
|
||||
restriction__unbreaking:
|
||||
enchantments:
|
||||
- minecraft:unbreaking
|
||||
notAffectedGroups:
|
||||
- enchanted_book
|
||||
- can_unbreak
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Now we have conflicts about enchantment Incompatibility
|
||||
# We just filtered what item enchantments can be applied
|
||||
# notAffectedGroups is empty as we don't want anything to not respect theses rules
|
||||
# maxEnchantmentBeforeConflict is set to 1 to only have 1 on those enchantment available
|
||||
# ----------------------------------------------------
|
||||
|
||||
sword_enchant_conflict:
|
||||
enchantments:
|
||||
- minecraft:bane_of_arthropods
|
||||
- minecraft:smite
|
||||
- minecraft:sharpness
|
||||
- minecraft:density
|
||||
- minecraft:breach
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
protection_enchant_conflict:
|
||||
enchantments:
|
||||
- minecraft:blast_protection
|
||||
- minecraft:fire_protection
|
||||
- minecraft:projectile_protection
|
||||
- minecraft:protection
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
trident_conflict1:
|
||||
enchantments:
|
||||
- minecraft:channeling
|
||||
- minecraft:riptide
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
trident_conflict2:
|
||||
enchantments:
|
||||
- minecraft:loyalty
|
||||
- minecraft:riptide
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
boot_conflict:
|
||||
enchantments:
|
||||
- minecraft:depth_strider
|
||||
- minecraft:frost_walker
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
tool_conflict:
|
||||
enchantments:
|
||||
- minecraft:fortune
|
||||
- minecraft:silk_touch
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
bow_conflict:
|
||||
enchantments:
|
||||
- minecraft:mending
|
||||
- minecraft:infinity
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
|
||||
crossbow_conflict:
|
||||
enchantments:
|
||||
- minecraft:multishot
|
||||
- minecraft:piercing
|
||||
notAffectedGroups: []
|
||||
maxEnchantmentBeforeConflict: 1
|
||||
restriction_density:
|
||||
enchantments:
|
||||
- minecraft:density
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
restriction_breach:
|
||||
enchantments:
|
||||
- minecraft:breach
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
restriction_wind_burst:
|
||||
enchantments:
|
||||
- minecraft:wind_burst
|
||||
notAffectedGroups:
|
||||
- mace
|
||||
- enchanted_book
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Bellow is for custom conflicts.
|
||||
# This is also where conflict create from the gui will be placed.
|
||||
# ----------------------------------------------------
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# Please note this config use spigot material names.
|
||||
# It should match minecraft name in most case, maybe every case, but I can't be sure
|
||||
# In case there an issue with material name, you can found them here:
|
||||
# https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html
|
||||
|
||||
# An empty Exclude group exclude nothing, so it contain everything
|
||||
everything:
|
||||
type: exclude
|
||||
|
||||
# An empty include group will include nothing
|
||||
nothing:
|
||||
type: include
|
||||
|
||||
# This group is an example of a group including only stone and polished granite
|
||||
example_include:
|
||||
type: include
|
||||
items:
|
||||
- stone
|
||||
- polished_granite
|
||||
|
||||
# This group contain everything except polished granite and elements of example_include
|
||||
example_exclude:
|
||||
type: exclude
|
||||
items:
|
||||
- polished_granite
|
||||
groups:
|
||||
- example_include
|
||||
|
||||
# Default configuration should be vanilla enchantment conflict group
|
||||
# there may have error, if you find one you can fix it !
|
||||
# https://minecraft.fandom.com/wiki/Enchanting
|
||||
|
||||
swords:
|
||||
type: include
|
||||
items:
|
||||
- wooden_sword
|
||||
- stone_sword
|
||||
- iron_sword
|
||||
- diamond_sword
|
||||
- golden_sword
|
||||
- netherite_sword
|
||||
- copper_sword
|
||||
|
||||
axes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_axe
|
||||
- stone_axe
|
||||
- iron_axe
|
||||
- diamond_axe
|
||||
- golden_axe
|
||||
- netherite_axe
|
||||
- copper_axe
|
||||
|
||||
melee_weapons:
|
||||
type: include
|
||||
groups:
|
||||
- swords
|
||||
- axes
|
||||
|
||||
helmets:
|
||||
type: include
|
||||
items:
|
||||
- leather_helmet
|
||||
- chainmail_helmet
|
||||
- iron_helmet
|
||||
- diamond_helmet
|
||||
- golden_helmet
|
||||
- netherite_helmet
|
||||
- turtle_helmet
|
||||
- copper_helmet
|
||||
|
||||
chestplate:
|
||||
type: include
|
||||
items:
|
||||
- leather_chestplate
|
||||
- chainmail_chestplate
|
||||
- iron_chestplate
|
||||
- diamond_chestplate
|
||||
- golden_chestplate
|
||||
- netherite_chestplate
|
||||
- copper_chestplate
|
||||
|
||||
leggings:
|
||||
type: include
|
||||
items:
|
||||
- leather_leggings
|
||||
- chainmail_leggings
|
||||
- iron_leggings
|
||||
- diamond_leggings
|
||||
- golden_leggings
|
||||
- netherite_leggings
|
||||
- copper_leggings
|
||||
|
||||
boots:
|
||||
type: include
|
||||
items:
|
||||
- leather_boots
|
||||
- chainmail_boots
|
||||
- iron_boots
|
||||
- diamond_boots
|
||||
- golden_boots
|
||||
- netherite_boots
|
||||
- copper_boots
|
||||
|
||||
armors:
|
||||
type: include
|
||||
groups:
|
||||
- helmets
|
||||
- chestplate
|
||||
- leggings
|
||||
- boots
|
||||
|
||||
wearable:
|
||||
type: include
|
||||
items:
|
||||
- elytra
|
||||
- carved_pumpkin
|
||||
- skeleton_skull
|
||||
- wither_skeleton_skull
|
||||
- zombie_head
|
||||
- player_head
|
||||
- creeper_head
|
||||
- dragon_head
|
||||
- piglin_head
|
||||
groups:
|
||||
- armors
|
||||
|
||||
pickaxes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_pickaxe
|
||||
- stone_pickaxe
|
||||
- iron_pickaxe
|
||||
- diamond_pickaxe
|
||||
- golden_pickaxe
|
||||
- netherite_pickaxe
|
||||
- copper_pickaxe
|
||||
|
||||
shovels:
|
||||
type: include
|
||||
items:
|
||||
- wooden_shovel
|
||||
- stone_shovel
|
||||
- iron_shovel
|
||||
- diamond_shovel
|
||||
- golden_shovel
|
||||
- netherite_shovel
|
||||
- copper_shovel
|
||||
|
||||
hoes:
|
||||
type: include
|
||||
items:
|
||||
- wooden_hoe
|
||||
- stone_hoe
|
||||
- iron_hoe
|
||||
- diamond_hoe
|
||||
- golden_hoe
|
||||
- netherite_hoe
|
||||
- copper_hoe
|
||||
|
||||
tools:
|
||||
type: include
|
||||
groups:
|
||||
- pickaxes
|
||||
- shovels
|
||||
- hoes
|
||||
- axes
|
||||
|
||||
enchanted_book:
|
||||
type: include
|
||||
items:
|
||||
- enchanted_book
|
||||
|
||||
trident:
|
||||
type: include
|
||||
items:
|
||||
- trident
|
||||
|
||||
bow:
|
||||
type: include
|
||||
items:
|
||||
- bow
|
||||
|
||||
crossbow:
|
||||
type: include
|
||||
items:
|
||||
- crossbow
|
||||
|
||||
fishing_rod:
|
||||
type: include
|
||||
items:
|
||||
- fishing_rod
|
||||
|
||||
shears:
|
||||
type: include
|
||||
items:
|
||||
- shears
|
||||
|
||||
can_unbreak:
|
||||
type: include
|
||||
items:
|
||||
- elytra
|
||||
- flint_and_steel
|
||||
- shield
|
||||
- carrot_on_a_stick
|
||||
- warped_fungus_on_a_stick
|
||||
- brush
|
||||
groups:
|
||||
- melee_weapons
|
||||
- tools
|
||||
- armors
|
||||
- trident
|
||||
- bow
|
||||
- crossbow
|
||||
- fishing_rod
|
||||
- shears
|
||||
- mace
|
||||
|
||||
can_vanish:
|
||||
type: include
|
||||
items:
|
||||
- compass
|
||||
groups:
|
||||
- wearable
|
||||
- can_unbreak
|
||||
mace:
|
||||
type: include
|
||||
items:
|
||||
- mace
|
||||
|
||||
|
|
@ -1,192 +0,0 @@
|
|||
#
|
||||
# It is recommended that you use /configanvil to edit theses config.
|
||||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# Unit repair configuration
|
||||
#
|
||||
# This configuration is to make custom unit repair
|
||||
# A unit repair is, for example, a diamond to repair a diamond sword
|
||||
# In vanilla, a unit repair 25% of object durability
|
||||
# you can make a custom value here
|
||||
#
|
||||
# Item name should NOT combine caps and no caps (example: Stone)
|
||||
|
||||
# Default value if the config is an invalid value (value <= 0 )
|
||||
# If value > 1 it will be treated as being = 1
|
||||
default_repair_amount: 0.25
|
||||
|
||||
# You can add custom unit repair
|
||||
# The example bellow make a shield repaired by 10% by sticks
|
||||
|
||||
# stick:
|
||||
# shield: 0.10
|
||||
|
||||
|
||||
# Vanilla unit repair group is bellow
|
||||
diamond:
|
||||
diamond_helmet: 0.25
|
||||
diamond_chestplate: 0.25
|
||||
diamond_leggings: 0.25
|
||||
diamond_boots: 0.25
|
||||
diamond_sword: 0.25
|
||||
diamond_pickaxe: 0.25
|
||||
diamond_axe: 0.25
|
||||
diamond_shovel: 0.25
|
||||
diamond_hoe: 0.25
|
||||
|
||||
netherite_ingot:
|
||||
netherite_helmet: 0.25
|
||||
netherite_chestplate: 0.25
|
||||
netherite_leggings: 0.25
|
||||
netherite_boots: 0.25
|
||||
netherite_sword: 0.25
|
||||
netherite_pickaxe: 0.25
|
||||
netherite_axe: 0.25
|
||||
netherite_shovel: 0.25
|
||||
netherite_hoe: 0.25
|
||||
|
||||
gold_ingot:
|
||||
golden_helmet: 0.25
|
||||
golden_chestplate: 0.25
|
||||
golden_leggings: 0.25
|
||||
golden_boots: 0.25
|
||||
golden_sword: 0.25
|
||||
golden_pickaxe: 0.25
|
||||
golden_axe: 0.25
|
||||
golden_shovel: 0.25
|
||||
golden_hoe: 0.25
|
||||
|
||||
iron_ingot:
|
||||
iron_helmet: 0.25
|
||||
iron_chestplate: 0.25
|
||||
iron_leggings: 0.25
|
||||
iron_boots: 0.25
|
||||
iron_sword: 0.25
|
||||
iron_pickaxe: 0.25
|
||||
iron_axe: 0.25
|
||||
iron_shovel: 0.25
|
||||
iron_hoe: 0.25
|
||||
|
||||
cobblestone:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
|
||||
cobbled_deepslate:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
|
||||
blackstone:
|
||||
stone_sword: 0.25
|
||||
stone_pickaxe: 0.25
|
||||
stone_axe: 0.25
|
||||
stone_shovel: 0.25
|
||||
stone_hoe: 0.25
|
||||
|
||||
leather:
|
||||
leather_helmet: 0.25
|
||||
leather_chestplate: 0.25
|
||||
leather_leggings: 0.25
|
||||
leather_boots: 0.25
|
||||
|
||||
phantom_membrane:
|
||||
elytra: 0.25
|
||||
|
||||
scute:
|
||||
turtle_helmet: 0.25
|
||||
|
||||
oak_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
spruce_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
birch_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
jungle_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
acacia_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
dark_oak_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
mangrove_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
cherry_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
bamboo_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
crimson_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
|
||||
warped_planks:
|
||||
wooden_sword: 0.25
|
||||
wooden_pickaxe: 0.25
|
||||
wooden_axe: 0.25
|
||||
wooden_shovel: 0.25
|
||||
wooden_hoe: 0.25
|
||||
shield: 0.25
|
||||
breeze_rod:
|
||||
mace: 0.25
|
||||
|
|
@ -3,19 +3,6 @@
|
|||
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
|
||||
#
|
||||
|
||||
# What service of metric should custom anvil use
|
||||
# Custom anvil collect generic information like server minecraft version, type, etc...
|
||||
# It can also collect error information if error is happening (currently faststats only)
|
||||
# It can also be disabled
|
||||
# Please refer to README for public metric link
|
||||
# Possible options: auto, bstat, faststats, disabled (auto by default)
|
||||
metric_type: auto
|
||||
|
||||
# Allow to report errors made caused by this plugin (only for faststats)
|
||||
# This allows me to fix potentials issue that I'm not aware of
|
||||
# Accept true or false (true by default)
|
||||
metric_collect_errors: true
|
||||
|
||||
# All anvil cost will be capped to limit_repair_value if enabled.
|
||||
#
|
||||
# In other words:
|
||||
|
|
@ -72,22 +59,8 @@ sacrifice_illegal_enchant_cost: 1
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#".
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&".
|
||||
# For minimessage search for minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: false
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: false
|
||||
|
||||
# This enables restricting color code for player having specific permission
|
||||
# It requires allow_color_code enabled for... obvious reasons
|
||||
#
|
||||
# For example: if player want to use "&aHello" it will be required that the player has
|
||||
# the permission "ca.color.code.a" as he used the color code "a"
|
||||
# In general permission to give to the player is "ca.color.code.[code]"
|
||||
# where [code] is the color code you wish to allow the player
|
||||
#
|
||||
# It is kinda of useless when minimessage is supported as players would be able to bypass
|
||||
# that using the equivalent minimessage tag
|
||||
per_color_code_permission: false
|
||||
|
||||
# Toggle if color should only be applicable if the player a certain permission.
|
||||
#
|
||||
|
|
@ -99,23 +72,10 @@ permission_needed_for_color: true
|
|||
# Valid values include 0 to 1000.
|
||||
use_of_color_cost: 0
|
||||
|
||||
# Dialogue rename menu make use of dialog menu to allow bigger rename
|
||||
# You can also change the maximum size and set it to -1 or less for maximum
|
||||
# Default limit to apply to any enchants missing from enchant_limits
|
||||
#
|
||||
# This feature only work on paper 1.21.7 or later
|
||||
#
|
||||
# At the moment only english is available for this menu... sorry !
|
||||
#
|
||||
# CustomAnvil use "ca.rename.dialog" when permission
|
||||
enable_dialog_rename: false
|
||||
dialog_rename_max_size: 256
|
||||
permission_needed_for_dialog_rename: false
|
||||
|
||||
# This allows custom anvil to not "guess" the text used for rename but store it in the item
|
||||
# It will make item stackable only and only if it had used the same rename text
|
||||
#
|
||||
# For practical reason. this only work when dialog rename is enabled
|
||||
dialog_rename_keep_user_text: true
|
||||
# Valid values include 1 to 1000
|
||||
default_limit: 5
|
||||
|
||||
# Override limits for specific enchants
|
||||
#
|
||||
|
|
@ -123,8 +83,7 @@ dialog_rename_keep_user_text: true
|
|||
#
|
||||
# Overrides provided default from aqua_affinity to depth_strider won't change effect with extra levels
|
||||
#
|
||||
# Valid range of 0 - 255 for each enchantment
|
||||
# -1 mean keep default
|
||||
# Valid range of 1 - 255 for each enchantment
|
||||
enchant_limits:
|
||||
minecraft:aqua_affinity: 1
|
||||
minecraft:binding_curse: 1
|
||||
|
|
@ -306,19 +265,10 @@ enchant_values:
|
|||
# Even if disable-merge-over of unbreaking is set to 2
|
||||
# -1 mean enchantment merge for this enchantment is not disabled. default to -1 if absent.
|
||||
disable-merge-over:
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla on default configuration)
|
||||
# Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla)
|
||||
minecraft:sharpness: -1
|
||||
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
|
||||
# minecraft:unbreaking: 2
|
||||
|
||||
# The maximum number of enchantment an item can get. -1 for infinity
|
||||
# Use eco enchant enchant_limit if present by default unless "default" is not equal to -1
|
||||
enchantment_count_limit:
|
||||
default: -1
|
||||
# Limit for specific items. example bellow is an example with stick
|
||||
# Per item enchantment limit override eco enchant enchant_limit and default limit
|
||||
items:
|
||||
stick: -1
|
||||
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
|
||||
#minecraft:unbreaking: 2
|
||||
|
||||
# Settings for lore modification
|
||||
lore_edit:
|
||||
|
|
@ -342,12 +292,9 @@ lore_edit:
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
allow_hexadecimal_color: true
|
||||
use_cost: 0
|
||||
|
||||
remove:
|
||||
# If removing lore using book & quil is enabled
|
||||
|
|
@ -362,25 +309,16 @@ lore_edit:
|
|||
shared_additive: false
|
||||
# If removing the lore consume the book & quil
|
||||
do_consume: false
|
||||
# If the color should get back to color code or hex format
|
||||
remove_color_on_remove: true
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this book should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
paper:
|
||||
# Permission is ca.lore_edit.paper
|
||||
use_permission: true
|
||||
# what order should the lines should get added/removed (start/end, if invalid or not present will be end)
|
||||
order: end
|
||||
order: "end"
|
||||
|
||||
append_line:
|
||||
# If adding lore line using paper is enabled
|
||||
|
|
@ -397,12 +335,8 @@ lore_edit:
|
|||
#
|
||||
# Color code are prefixed by "&" and hexadecimal color by "#"
|
||||
# Color code will not be applied if it colors nothing. "&&" can be used to write "&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
#
|
||||
# Note that currently minimessage would disable hex code when adding color
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
allow_hexadecimal_color: true
|
||||
color_use_cost: 0
|
||||
|
||||
remove_line:
|
||||
|
|
@ -416,46 +350,10 @@ lore_edit:
|
|||
shared_additive: false
|
||||
# If removing the lore line consume the paper
|
||||
do_consume: false
|
||||
# If the color should get back to color code or hex format
|
||||
remove_color_on_remove: true
|
||||
# Cost of replacing colors
|
||||
remove_color_cost: 0
|
||||
# Allowed some color and tags to be reverted to plain text
|
||||
# Custom anvil will prioritise format that result is a smaller resulting text
|
||||
# Note that not allowing certain format will lead to some lost of color or tags.
|
||||
# If configuration are exact as append appending this paper should result in the exact same color
|
||||
#
|
||||
# Color code will be prefixed by "&" and hexadecimal color by "#".
|
||||
# If color code is allowed, "&" in the text will get converted to "&&"
|
||||
# For minimessage see minimessage formating https://docs.papermc.io/adventure/minimessage/format/
|
||||
allow_color_code: true
|
||||
allow_hexadecimal_color: false
|
||||
allow_minimessage: true
|
||||
|
||||
# Allow to replace the xp cost by a monetary cost
|
||||
# If enabled it will not be bound to the experience level limits
|
||||
#
|
||||
# It also requires to enable dialog rename (set "enable_dialog_rename: false" a bit higher)
|
||||
# If dialog rename permission is enabled and player do not have the permission merge will fall back to vanilla xp cost
|
||||
#
|
||||
# If you are using custom craft I recommend using Linear Xp Cost with Exact Linear Xp as normal Xp Cost will act "weird"
|
||||
# But Linear Xp will act as 1$ time global multiplier. In other word: like you expect
|
||||
#
|
||||
# As this feature require dialog rename, it can only be enabled starting with paper 1.21.6 and later
|
||||
monetary_cost:
|
||||
enabled: false
|
||||
# If using vault unlocked this allow to specify what currency should be used for anvil usage
|
||||
# default being the default currency
|
||||
currency: default
|
||||
# multiply the anvil cost by a value to allow to have price a big bigger than like 40
|
||||
multipliers:
|
||||
# global multipliers. all usage type will be multiplied by this value
|
||||
global: 1.0
|
||||
# usage specific type. it will only apply for specific xp "reason"
|
||||
enchantment: 1.0 # related to enchantments level
|
||||
repair: 1.0 # for repairing via unit repair (per unit)
|
||||
rename: 1.0 # for renaming the item
|
||||
lore_edit: 1.0 # for changing the lore of the item (only if lore edit is enabled)
|
||||
work_penalty: 1.0 # for work penalty (aka use penalty)
|
||||
recipe: 1.0 # for custom anvil recipe cost
|
||||
|
||||
# Whether to show debug logging
|
||||
debug_log: false
|
||||
|
|
@ -463,4 +361,10 @@ debug_log: false
|
|||
# Whether to show verbose debug logging
|
||||
debug_log_verbose: false
|
||||
|
||||
configVersion: 1.11.0
|
||||
# In case something when wrong with CustomAnvil packet manager.
|
||||
# If you see "missing class exception" or similar you may test this.
|
||||
# If enabled and Protocolib absent or disabled "Replace to expensive" will not work.
|
||||
# ProtocoLib may also be used if the server is in an "unsupported" version even if this option is disabled.
|
||||
force_protocolib: false
|
||||
|
||||
configVersion: 1.8.0
|
||||
|
|
|
|||
|
|
@ -92,10 +92,6 @@ restriction_loyalty:
|
|||
enchantments: [ minecraft:loyalty ]
|
||||
notAffectedGroups: [ enchanted_book, trident ]
|
||||
|
||||
restriction_luck_of_the_sea:
|
||||
enchantments: [ minecraft:luck_of_the_sea ]
|
||||
notAffectedGroups: [ enchanted_book, fishing_rod ]
|
||||
|
||||
restriction_lure:
|
||||
enchantments: [ minecraft:lure ]
|
||||
notAffectedGroups: [ enchanted_book, fishing_rod ]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
### Default Plugin's Configurations
|
||||
From 1.18 to 1.20.6 use [1.18 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.18) \
|
||||
From 1.21 to 1.21.8 use [1.21 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21) \
|
||||
From 1.21.9 to 1.21.10 use [1.21.9 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.9) \
|
||||
From 1.21.11 use [1.21.11 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21.11)
|
||||
For 1.18 to 1.20.6 use [1.18 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.18) \
|
||||
For 1.21 use [1.21 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21)
|
||||
|
|
@ -1,13 +1,8 @@
|
|||
kotlin.code.style=official
|
||||
|
||||
# Signing
|
||||
signing.secretKeyRingFile=~/.gnupg/secring.gpg
|
||||
|
||||
kotlin.daemon.jvmargs=-Xmx8G
|
||||
|
||||
# list of nms
|
||||
subprojects.reobfnms=v1_17R1,v1_18R1,v1_18R2,v1_19R1,v1_19R2,v1_19R3,v1_20R1,v1_20R2,v1_20R3,v1_20R4,v1_21R1,v1_21R2,v1_21R3,v1_21R4,v1_21R5,v1_21R6,v1_21R7
|
||||
|
||||
# list of version for hangar release
|
||||
paperVersion=1.18-26.2
|
||||
signing.gnupg.executable=gpg
|
||||
signing.gnupg.useLegacyGpg=true
|
||||
signing.gnupg.keyName=B0DBF91F
|
||||
|
||||
kotlin.daemon.jvmargs=-Xmx8G
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
|
|||
0
gradlew
vendored
Executable file → Normal file
0
gradlew
vendored
Executable file → Normal file
|
|
@ -1,17 +0,0 @@
|
|||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "2.3.0"
|
||||
}
|
||||
|
||||
repositories {
|
||||
// ExcellentEnchants
|
||||
maven(url = "https://repo.nightexpressdev.com/releases")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Excellent Enchant
|
||||
compileOnly("su.nightexpress.excellentenchants:Core:5.4.3")
|
||||
compileOnly("su.nightexpress.nightcore:main:2.16.2")
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.plugins;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import su.nightexpress.excellentenchants.api.enchantment.CustomEnchantment;
|
||||
import su.nightexpress.excellentenchants.enchantment.EnchantRegistry;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class ExcellentEnchant5_3Registry {
|
||||
|
||||
public static @NotNull Set<CustomEnchantment> getRegistered(){
|
||||
return EnchantRegistry.getRegistered();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.plugins;
|
||||
|
||||
import su.nightexpress.excellentenchants.EnchantsAPI;
|
||||
|
||||
public class ExcellentEnchant5_4EnchantSettings {
|
||||
|
||||
|
||||
public static int anvilLimit() {
|
||||
return EnchantsAPI.getEnchantManager().getSettings().getAnvilEnchantsLimit();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ group = rootProject.group
|
|||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "2.3.0"
|
||||
kotlin("jvm") version "2.1.0"
|
||||
}
|
||||
|
||||
// Imitate needed class and method to support legacy version of EcoEnchant
|
||||
|
|
@ -10,4 +10,6 @@ dependencies {
|
|||
// Spigot api
|
||||
compileOnly("org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT")
|
||||
|
||||
|
||||
|
||||
}
|
||||
Binary file not shown.
BIN
libs/ExcellentEnchants-4.3.1.jar
Normal file
BIN
libs/ExcellentEnchants-4.3.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,35 +1,16 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
repositories {
|
||||
// ProtocoLib
|
||||
maven (url = "https://repo.dmulloy2.net/repository/public/" )
|
||||
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.10-R0.1-SNAPSHOT")
|
||||
// Spigot api
|
||||
compileOnly("org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT")
|
||||
|
||||
// Protocolib
|
||||
compileOnly("net.dmulloy2:ProtocolLib:5.4.0")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "16"
|
||||
targetCompatibility = "16"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_16)
|
||||
}
|
||||
}
|
||||
compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0")
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui
|
||||
|
||||
import org.bukkit.inventory.InventoryView
|
||||
|
||||
interface ExternGuiTester {
|
||||
|
||||
val wesjdAnvilGuiName: String?
|
||||
|
||||
fun getContainerClass(inventory: InventoryView): Class<Any>?
|
||||
|
||||
fun testIfGui(inventory: InventoryView): Boolean {
|
||||
val clazz = getContainerClass(inventory)
|
||||
if(clazz == null) return false
|
||||
|
||||
val expectedWesjdGuiPath = "anvilgui.version.$wesjdAnvilGuiName"
|
||||
|
||||
val clazzName = clazz.name
|
||||
val isWejdsGui = clazzName.contains(expectedWesjdGuiPath)
|
||||
|
||||
return isWejdsGui
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.util
|
||||
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.ItemMeta
|
||||
|
||||
// Mostly made for paper, spigot and folia support
|
||||
@Suppress("DEPRECATION")
|
||||
object PlatformUtil {
|
||||
|
||||
private fun hasClass(className: String): Boolean {
|
||||
try {
|
||||
Class.forName(className)
|
||||
return true
|
||||
} catch (_: ClassNotFoundException) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
private fun hasMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>): Boolean {
|
||||
try {
|
||||
clazz.getDeclaredMethod(name, *parameterTypes)
|
||||
return true
|
||||
} catch (_: NoSuchMethodException) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
val isPaper = hasClass("com.destroystokyo.paper.PaperConfig") ||
|
||||
hasClass("io.papermc.paper.configuration.Configuration")
|
||||
|
||||
val isFolia = hasClass("io.papermc.paper.threadedregions.RegionizedServer")
|
||||
|
||||
private val legacy_mm = LegacyComponentSerializer.legacySection()
|
||||
|
||||
// Lore
|
||||
fun ItemMeta.componentLore(): MutableList<Component> {
|
||||
val lore: List<Component>?
|
||||
if(isPaper){
|
||||
lore = this.lore()
|
||||
} else {
|
||||
val legacyLores = this.lore ?: return ArrayList()
|
||||
|
||||
lore = ArrayList(legacyLores.size)
|
||||
for (legacyLore in legacyLores) {
|
||||
lore.add(legacy_mm.deserialize(legacyLore))
|
||||
}
|
||||
}
|
||||
|
||||
return lore ?: ArrayList()
|
||||
}
|
||||
|
||||
fun ItemMeta.setComponentLore(lore: List<Component?>) {
|
||||
if(isPaper){
|
||||
this.lore(lore)
|
||||
} else {
|
||||
val legacyLore = ArrayList<String?>(lore.size)
|
||||
for (component in lore) {
|
||||
legacyLore.add(if(component == null) null
|
||||
else legacy_mm.serialize(component))
|
||||
}
|
||||
|
||||
this.lore = legacyLore
|
||||
}
|
||||
}
|
||||
|
||||
// Display name
|
||||
private val useCustomName = hasMethod(ItemStack::class.java, "customName")
|
||||
|
||||
fun ItemMeta.componentDisplayName(): Component? {
|
||||
if(useCustomName){
|
||||
if(!this.hasCustomName()) return null
|
||||
return this.customName()
|
||||
}else if(isPaper){
|
||||
if(!this.hasDisplayName()) return null
|
||||
return this.displayName()
|
||||
} else {
|
||||
if(!this.hasDisplayName()) return null
|
||||
|
||||
val legacy = this.displayName
|
||||
return legacy_mm.deserialize(legacy)
|
||||
}
|
||||
}
|
||||
|
||||
fun ItemMeta.setComponentDisplayName(component: Component?) {
|
||||
if(useCustomName){
|
||||
this.customName(component)
|
||||
}else if(isPaper){
|
||||
this.displayName(component)
|
||||
} else {
|
||||
if(component == null){
|
||||
this.setDisplayName(null)
|
||||
return
|
||||
}
|
||||
|
||||
val legacy = legacy_mm.serialize(component)
|
||||
this.setDisplayName(legacy)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dialog
|
||||
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.entity.HumanEntity
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
|
||||
interface AnvilRenameDialog {
|
||||
|
||||
companion object {
|
||||
val PCD_KEEP_RENAME_TEXT_KEY = NamespacedKey.fromString("customanvil:last_rename_text")!!
|
||||
}
|
||||
|
||||
fun canSendDialog(): Boolean
|
||||
|
||||
fun tryShowDialog(player: HumanEntity, event: PrepareAnvilEvent)
|
||||
|
||||
fun closeInventory(player: HumanEntity)
|
||||
|
||||
fun currentText(player: HumanEntity): String?
|
||||
|
||||
fun isOpenFor(player: HumanEntity): Boolean
|
||||
|
||||
}
|
||||
1
nms/nms-paper/.gitignore
vendored
1
nms/nms-paper/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
.lastDeploymentsId
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":nms:nms-common"))
|
||||
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.7-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "18"
|
||||
targetCompatibility = "18"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_18)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.datapack
|
||||
|
||||
import io.papermc.paper.datapack.Datapack
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.packs.DataPack
|
||||
import java.util.*
|
||||
|
||||
object DataPackTester {
|
||||
val legacyNames: List<String>
|
||||
get() = Bukkit.getDataPackManager().dataPacks
|
||||
.stream().filter { obj -> obj.isEnabled }
|
||||
.map { pack -> pack.key.key }
|
||||
.toList()
|
||||
|
||||
val enabledPacks: List<String>
|
||||
get() {
|
||||
try {
|
||||
// will throw error if do not exist
|
||||
Bukkit::class.java.getDeclaredMethod("getDatapackManager")
|
||||
|
||||
return Bukkit.getDatapackManager().enabledPacks
|
||||
.stream().map { obj: Datapack -> obj.name }
|
||||
.toList()
|
||||
} catch (e: NoSuchMethodException) {
|
||||
try {
|
||||
DataPack::class.java.getDeclaredMethod("getKey")
|
||||
} catch (e: NoSuchMethodException) {
|
||||
System.err.println("Could not find compatible datapack manager")
|
||||
System.err.println("If you are using a datapack that should be compatible with CustomAnvil. It will not get detected...")
|
||||
return emptyList()
|
||||
}
|
||||
return legacyNames
|
||||
} catch (e: Exception){
|
||||
// Assume cause UnimplementedOperationException on mock server
|
||||
return Collections.emptyList()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet.versions
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
|
||||
import net.minecraft.world.entity.player.Abilities
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
|
||||
|
||||
class PaperPacketManager : PacketManagerBase(), PacketManager {
|
||||
override val canSetInstantBuild: Boolean
|
||||
get() = true
|
||||
|
||||
override fun setInstantBuild(player: Player, instantBuild: Boolean) {
|
||||
val nmsPlayer = (player as CraftPlayer).handle
|
||||
val playerAbilities = nmsPlayer.abilities
|
||||
val sendedAbilities: Abilities
|
||||
if (playerAbilities.instabuild == instantBuild) {
|
||||
sendedAbilities = playerAbilities
|
||||
} else {
|
||||
sendedAbilities = Abilities()
|
||||
sendedAbilities.invulnerable = playerAbilities.invulnerable
|
||||
sendedAbilities.flying = playerAbilities.flying
|
||||
sendedAbilities.mayfly = playerAbilities.mayfly
|
||||
sendedAbilities.instabuild = instantBuild
|
||||
sendedAbilities.mayBuild = playerAbilities.mayBuild
|
||||
sendedAbilities.setFlyingSpeed(playerAbilities.getFlyingSpeed())
|
||||
sendedAbilities.setWalkingSpeed(playerAbilities.getWalkingSpeed())
|
||||
}
|
||||
val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
|
||||
nmsPlayer.connection.send(packet)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dialog
|
||||
|
||||
import io.papermc.paper.dialog.Dialog
|
||||
import io.papermc.paper.registry.data.dialog.ActionButton
|
||||
import io.papermc.paper.registry.data.dialog.DialogBase
|
||||
import io.papermc.paper.registry.data.dialog.action.DialogAction
|
||||
import io.papermc.paper.registry.data.dialog.body.DialogBody
|
||||
import io.papermc.paper.registry.data.dialog.input.DialogInput
|
||||
import io.papermc.paper.registry.data.dialog.type.DialogType
|
||||
import io.papermc.paper.threadedregions.scheduler.ScheduledTask
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.event.ClickCallback
|
||||
import net.kyori.adventure.text.format.TextColor
|
||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer
|
||||
import net.minecraft.world.inventory.AnvilMenu
|
||||
import org.bukkit.craftbukkit.event.CraftEventFactory
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||
import org.bukkit.craftbukkit.inventory.view.CraftAnvilView
|
||||
import org.bukkit.entity.HumanEntity
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
import org.bukkit.plugin.Plugin
|
||||
import java.util.*
|
||||
import java.util.function.BiFunction
|
||||
import java.util.function.Consumer
|
||||
import java.util.function.Supplier
|
||||
|
||||
@Suppress("UnstableApiUsage")
|
||||
class AnvilRenameDialogImpl(
|
||||
val fromFormated: BiFunction<HumanEntity, Component?, String?>,
|
||||
val keepUserPreviousDialog: Supplier<Boolean>,
|
||||
val maxLength: Supplier<Int>,
|
||||
val plugin: Plugin,
|
||||
) : AnvilRenameDialog {
|
||||
|
||||
companion object {
|
||||
private const val RENAME_TEXT_KEY = "rename"
|
||||
|
||||
private const val MAX_WIDTH = 512
|
||||
|
||||
private val PLAIN_TEXT_SERIALIZER = PlainTextComponentSerializer.plainText()
|
||||
|
||||
// Need to be able to translate it later !
|
||||
private val USER_FACING_RENAME_TITLE = Component.text("Rename Your Item")
|
||||
private val USER_FACING_WARNING = Component.text(
|
||||
"Note that the repair text will appear blank after Confirm\n" +
|
||||
"But the name will be correctly applied"
|
||||
)
|
||||
private val USER_FACING_CONFIRM = Component.text("Confirm").color(TextColor.fromHexString("#40FF40"))
|
||||
private val USER_FACING_CANCEL = Component.text("Cancel").color(TextColor.fromHexString("#FF4040"))
|
||||
|
||||
fun itemDefaultName(item: ItemStack?): String? {
|
||||
return PLAIN_TEXT_SERIALIZER.serializeOrNull(item?.effectiveName())
|
||||
}
|
||||
}
|
||||
|
||||
private val lastNames = HashMap<UUID, String>()
|
||||
private val lastRenames = HashMap<UUID, String>()
|
||||
|
||||
|
||||
private val lastLeftItem = HashMap<UUID, String>()
|
||||
private val runTaskMap = HashMap<UUID, ScheduledTask>()
|
||||
|
||||
// For monetary cost
|
||||
val hasUiOpen = HashSet<UUID>()
|
||||
|
||||
private val containerField = CraftInventoryView::class.java.getDeclaredField("container")
|
||||
|
||||
init {
|
||||
containerField.setAccessible(true)
|
||||
}
|
||||
|
||||
override fun canSendDialog(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
fun makeDialog(playerID: UUID, initial: String?, callback: Consumer<String?>): Dialog {
|
||||
val maxLength = this.maxLength.get()
|
||||
val initialFinal = initial?.take(maxLength)
|
||||
|
||||
val baseBuilder = DialogBase.builder(USER_FACING_RENAME_TITLE)
|
||||
.canCloseWithEscape(true)
|
||||
.afterAction(DialogBase.DialogAfterAction.CLOSE)
|
||||
.inputs(
|
||||
listOf(
|
||||
DialogInput.text(RENAME_TEXT_KEY, Component.text("Rename text"))
|
||||
.maxLength(maxLength)
|
||||
.initial(initialFinal ?: "")
|
||||
.labelVisible(false)
|
||||
.width(MAX_WIDTH)
|
||||
.build(),
|
||||
),
|
||||
)
|
||||
baseBuilder.body(
|
||||
listOf(
|
||||
DialogBody.plainMessage(USER_FACING_WARNING, MAX_WIDTH)
|
||||
)
|
||||
)
|
||||
|
||||
return Dialog.create { builder ->
|
||||
builder.empty()
|
||||
.base(baseBuilder.build())
|
||||
.type(
|
||||
DialogType.confirmation(
|
||||
ActionButton.builder(USER_FACING_CONFIRM)
|
||||
.action(DialogAction.customClick({ response, _ ->
|
||||
hasUiOpen.remove(playerID)
|
||||
val text = response.getText(RENAME_TEXT_KEY)!!
|
||||
callback.accept(text)
|
||||
}, ClickCallback.Options.builder().build()))
|
||||
.build(),
|
||||
ActionButton.builder(USER_FACING_CANCEL)
|
||||
.action(DialogAction.customClick({ response, _ ->
|
||||
hasUiOpen.remove(playerID)
|
||||
}, ClickCallback.Options.builder().build()))
|
||||
.build(),
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setResult(player: HumanEntity, view: InventoryView, result: String?) {
|
||||
val defaultName = itemDefaultName(view.getItem(0))
|
||||
if (defaultName == result) {
|
||||
setName(player, view, "", null)
|
||||
if (defaultName != null) lastNames[player.uniqueId] = defaultName
|
||||
} else setName(player, view, result, result)
|
||||
}
|
||||
|
||||
private fun setName(player: HumanEntity, view: InventoryView, name: String?, rename: String?) {
|
||||
val menu = (containerField.get(view) as AnvilMenu)
|
||||
val isSameName = menu.itemName == name
|
||||
menu.itemName = rename
|
||||
|
||||
if (name == null)
|
||||
lastNames.remove(player.uniqueId)
|
||||
else
|
||||
lastNames[player.uniqueId] = name
|
||||
|
||||
if (rename == null)
|
||||
lastRenames.remove(player.uniqueId)
|
||||
else
|
||||
lastRenames[player.uniqueId] = rename
|
||||
|
||||
if (!isSameName)
|
||||
CraftEventFactory.callPrepareResultEvent(menu, 2);
|
||||
}
|
||||
|
||||
private fun nameFromItem(player: HumanEntity, item: ItemStack?): String? {
|
||||
// Already has text
|
||||
if (item?.hasItemMeta() != true || !item.itemMeta.hasCustomName())
|
||||
return PLAIN_TEXT_SERIALIZER.serializeOrNull(item?.effectiveName())
|
||||
|
||||
if (keepUserPreviousDialog.get() && item.hasItemMeta()) {
|
||||
val lastName = item.itemMeta.persistentDataContainer.get(
|
||||
AnvilRenameDialog.PCD_KEEP_RENAME_TEXT_KEY,
|
||||
PersistentDataType.STRING
|
||||
)
|
||||
|
||||
if (lastName != null) return lastName
|
||||
}
|
||||
|
||||
return fromFormated.apply(player, item.effectiveName())
|
||||
}
|
||||
|
||||
private fun tryShowDialogScheduled(player: HumanEntity, event: PrepareAnvilEvent) {
|
||||
val view = event.view
|
||||
if (view !is CraftAnvilView) return
|
||||
|
||||
val renameText = view.renameText
|
||||
val leftItem = view.getItem(0)
|
||||
val leftItemStr = leftItem?.toString()
|
||||
|
||||
val lastName = lastNames.getOrDefault(player.uniqueId, null)
|
||||
val lastRename = lastRenames.getOrDefault(player.uniqueId, null)
|
||||
|
||||
if (lastLeftItem.getOrDefault(player.uniqueId, null) != leftItemStr) {
|
||||
if (leftItemStr == null)
|
||||
lastLeftItem.remove(player.uniqueId)
|
||||
else lastLeftItem[player.uniqueId] = leftItemStr
|
||||
|
||||
setName(player, view, renameText, nameFromItem(player, leftItem))
|
||||
return
|
||||
}
|
||||
|
||||
if (lastName == renameText || lastRename == renameText)
|
||||
return
|
||||
|
||||
if (renameText?.isBlank() == true || renameText == itemDefaultName(leftItem)) {
|
||||
setName(player, view, lastName, lastRename)
|
||||
return
|
||||
}
|
||||
|
||||
val dialog = makeDialog(player.uniqueId, lastRename)
|
||||
{ result -> setResult(player, view, result) }
|
||||
player.showDialog(dialog)
|
||||
|
||||
hasUiOpen.add(player.uniqueId)
|
||||
}
|
||||
|
||||
// We need to wait for a short time as changing item will change the name BEFORE the item change
|
||||
// no guaranty both of them came in the same tick too so let's wait 2 tick....
|
||||
override fun tryShowDialog(player: HumanEntity, event: PrepareAnvilEvent) {
|
||||
runTaskMap.remove(player.uniqueId)?.cancel()
|
||||
|
||||
val task = player.scheduler.runDelayed(
|
||||
plugin,
|
||||
{ _ ->
|
||||
run { tryShowDialogScheduled(player, event) }
|
||||
},
|
||||
{},
|
||||
2
|
||||
)
|
||||
if (task == null) return
|
||||
|
||||
runTaskMap[player.uniqueId] = task
|
||||
}
|
||||
|
||||
override fun closeInventory(player: HumanEntity) {
|
||||
lastNames.remove(player.uniqueId)
|
||||
lastRenames.remove(player.uniqueId)
|
||||
lastLeftItem.remove(player.uniqueId)
|
||||
runTaskMap.remove(player.uniqueId)?.cancel()
|
||||
}
|
||||
|
||||
override fun currentText(player: HumanEntity): String? {
|
||||
return lastNames[player.uniqueId]
|
||||
}
|
||||
|
||||
override fun isOpenFor(player: HumanEntity): Boolean {
|
||||
return hasUiOpen.contains(player.uniqueId)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.util
|
||||
|
||||
import io.papermc.paper.threadedregions.scheduler.ScheduledTask
|
||||
import org.bukkit.entity.HumanEntity
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import org.bukkit.plugin.Plugin
|
||||
import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialog
|
||||
import java.util.HashMap
|
||||
import java.util.UUID
|
||||
|
||||
object AnvilTitleUtil {
|
||||
|
||||
private val runTaskMap = HashMap<UUID, ScheduledTask>()
|
||||
|
||||
private fun actualRename(view: InventoryView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog) {
|
||||
runTaskMap.remove(player.uniqueId)
|
||||
if (view.title == name) return
|
||||
|
||||
// We assume rename impl is used
|
||||
if (anvilDialog.isOpenFor(player)) return
|
||||
|
||||
view.title = name
|
||||
}
|
||||
|
||||
// We don't want to rename instantly it is causing issue with rename text
|
||||
// especially as it can "override" current ui when it is rename ui time but rename ui also need some delay
|
||||
fun rename(view: InventoryView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog, plugin: Plugin) {
|
||||
runTaskMap.remove(player.uniqueId)?.cancel()
|
||||
|
||||
val task = player.scheduler.runDelayed(
|
||||
plugin,
|
||||
{ _ ->
|
||||
run { actualRename(view, name, player, anvilDialog) }
|
||||
},
|
||||
{
|
||||
runTaskMap.remove(player.uniqueId)
|
||||
},
|
||||
2
|
||||
)
|
||||
|
||||
if (task == null) return
|
||||
runTaskMap[player.uniqueId] = task
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// As minecraft 1.17 recommended java version is 1.16. we set language version to 1.16
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "16"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_16)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_17R1_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_17_R1"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// As minecraft 1.18 work with java 1.17 or above. we set language version to 1.17
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "17"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_18R1_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_18_R1"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// As minecraft 1.18 work with java 1.17 or above. we set language version to 1.17
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "17"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_18R2_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_18_R2"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// I do not know minecraft 1.19 recommended java version. assumed 17 is good enough
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "17"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_19R1_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_19_R1"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// I do not know minecraft 1.19 recommended java version. assumed 17 is good enough
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "17"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_19R2_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_19_R2"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// I do not know minecraft 1.19 recommended java version. assumed 17 is good enough
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "17"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_19R3_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_19_R3"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,17 +19,25 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.20 recommended java version is 18. but we assume 17 is good enough as lts
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "18"
|
||||
targetCompatibility = "18"
|
||||
sourceCompatibility = "17"
|
||||
targetCompatibility = "17"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_18)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_20R1_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_20_R1"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,17 +19,25 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.20 recommended java version is 18. but we assume 17 is good enough as lts
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "18"
|
||||
targetCompatibility = "18"
|
||||
sourceCompatibility = "17"
|
||||
targetCompatibility = "17"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_18)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
import kotlin.jvm.javaClass
|
||||
|
||||
class v1_20R2_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_20_R2"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,17 +19,25 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.20 recommended java version is 18. but we assume 17 is good enough as lts
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "18"
|
||||
targetCompatibility = "18"
|
||||
sourceCompatibility = "17"
|
||||
targetCompatibility = "17"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_18)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
import kotlin.jvm.javaClass
|
||||
|
||||
class v1_20R3_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_20_R3"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -19,10 +19,18 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.20 recommended java version is 18. but we assume 17 is good enough as lts
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "18"
|
||||
targetCompatibility = "18"
|
||||
sourceCompatibility = "17"
|
||||
targetCompatibility = "17"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
|
@ -30,6 +38,6 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_18)
|
||||
jvmTarget.set(JvmTarget.JVM_17)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
import kotlin.jvm.javaClass
|
||||
|
||||
class v1_20R4_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_20_R4"
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
if (view !is CraftInventoryView) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.util
|
||||
|
||||
import org.bukkit.inventory.meta.Damageable
|
||||
|
||||
// I LOVE support of old versions and needing to do modules like that
|
||||
// That truly is my favorite activity
|
||||
// TODO clean this one of legacy removal branch
|
||||
object MaxDamageCheckerUtil {
|
||||
|
||||
/**
|
||||
* @return max damage or int max if not set
|
||||
*/
|
||||
fun getMaxDamage(meta: Damageable): Int {
|
||||
if(!meta.hasMaxDamage()) return Integer.MAX_VALUE
|
||||
return meta.maxDamage
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.21 java version is 21.
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.gui.version
|
||||
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
||||
class v1_21R1_ExternGuiTester: ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_21_R1"
|
||||
|
||||
var tested = false;
|
||||
var possible = false;
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
// In case we are in a test environment
|
||||
if(!tested) testClassExist()
|
||||
if(!possible) return null
|
||||
|
||||
if(view !is CraftInventoryView<*, *>) return null
|
||||
val container = view.handle
|
||||
|
||||
return container.javaClass
|
||||
}
|
||||
|
||||
fun testClassExist(){
|
||||
tested = true;
|
||||
try {
|
||||
Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView")
|
||||
possible = true
|
||||
} catch (e: ClassNotFoundException){
|
||||
possible = false
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.21 java version is 21.
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,14 @@ repositories {
|
|||
|
||||
}
|
||||
|
||||
// minecraft 1.21 java version is 21.
|
||||
|
||||
// Configure used version of kotlin and java
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
|
|
@ -29,7 +37,7 @@ tasks.withType<JavaCompile>().configureEach {
|
|||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
1
nms/v1_21R4/.gitignore
vendored
1
nms/v1_21R4/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
.lastDeploymentsId
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":nms:nms-common"))
|
||||
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.5-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
targetCompatibility = "21"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet.versions
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
|
||||
import net.minecraft.world.entity.player.Abilities
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
|
||||
|
||||
class V1_21R4_PacketManager : PacketManagerBase(), PacketManager {
|
||||
override val canSetInstantBuild: Boolean
|
||||
get() = true
|
||||
|
||||
override fun setInstantBuild(player: Player, instantBuild: Boolean) {
|
||||
val nmsPlayer = (player as CraftPlayer).handle
|
||||
val playerAbilities = nmsPlayer.abilities
|
||||
val sendedAbilities: Abilities
|
||||
if (playerAbilities.instabuild == instantBuild) {
|
||||
sendedAbilities = playerAbilities
|
||||
} else {
|
||||
sendedAbilities = Abilities()
|
||||
sendedAbilities.invulnerable = playerAbilities.invulnerable
|
||||
sendedAbilities.flying = playerAbilities.flying
|
||||
sendedAbilities.mayfly = playerAbilities.mayfly
|
||||
sendedAbilities.instabuild = instantBuild
|
||||
sendedAbilities.mayBuild = playerAbilities.mayBuild
|
||||
sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed
|
||||
sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed
|
||||
}
|
||||
val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
|
||||
nmsPlayer.connection.send(packet)
|
||||
}
|
||||
}
|
||||
1
nms/v1_21R5/.gitignore
vendored
1
nms/v1_21R5/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
.lastDeploymentsId
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":nms:nms-common"))
|
||||
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.6-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
targetCompatibility = "21"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet.versions
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
|
||||
import net.minecraft.world.entity.player.Abilities
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
|
||||
|
||||
class V1_21R5_PacketManager : PacketManagerBase(), PacketManager {
|
||||
override val canSetInstantBuild: Boolean
|
||||
get() = true
|
||||
|
||||
override fun setInstantBuild(player: Player, instantBuild: Boolean) {
|
||||
val nmsPlayer = (player as CraftPlayer).handle
|
||||
val playerAbilities = nmsPlayer.abilities
|
||||
val sendedAbilities: Abilities
|
||||
if (playerAbilities.instabuild == instantBuild) {
|
||||
sendedAbilities = playerAbilities
|
||||
} else {
|
||||
sendedAbilities = Abilities()
|
||||
sendedAbilities.invulnerable = playerAbilities.invulnerable
|
||||
sendedAbilities.flying = playerAbilities.flying
|
||||
sendedAbilities.mayfly = playerAbilities.mayfly
|
||||
sendedAbilities.instabuild = instantBuild
|
||||
sendedAbilities.mayBuild = playerAbilities.mayBuild
|
||||
sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed
|
||||
sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed
|
||||
}
|
||||
val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
|
||||
nmsPlayer.connection.send(packet)
|
||||
}
|
||||
}
|
||||
1
nms/v1_21R6/.gitignore
vendored
1
nms/v1_21R6/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
.lastDeploymentsId
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":nms:nms-common"))
|
||||
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.10-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
targetCompatibility = "21"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet.versions
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
|
||||
import net.minecraft.world.entity.player.Abilities
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
|
||||
|
||||
class V1_21R6_PacketManager : PacketManagerBase(), PacketManager {
|
||||
override val canSetInstantBuild: Boolean
|
||||
get() = true
|
||||
|
||||
override fun setInstantBuild(player: Player, instantBuild: Boolean) {
|
||||
val nmsPlayer = (player as CraftPlayer).handle
|
||||
val playerAbilities = nmsPlayer.abilities
|
||||
val sendedAbilities: Abilities
|
||||
if (playerAbilities.instabuild == instantBuild) {
|
||||
sendedAbilities = playerAbilities
|
||||
} else {
|
||||
sendedAbilities = Abilities()
|
||||
sendedAbilities.invulnerable = playerAbilities.invulnerable
|
||||
sendedAbilities.flying = playerAbilities.flying
|
||||
sendedAbilities.mayfly = playerAbilities.mayfly
|
||||
sendedAbilities.instabuild = instantBuild
|
||||
sendedAbilities.mayBuild = playerAbilities.mayBuild
|
||||
sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed
|
||||
sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed
|
||||
}
|
||||
val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
|
||||
nmsPlayer.connection.send(packet)
|
||||
}
|
||||
}
|
||||
1
nms/v1_21R7/.gitignore
vendored
1
nms/v1_21R7/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
.lastDeploymentsId
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":nms:nms-common"))
|
||||
|
||||
// Used for nms
|
||||
paperweight.paperDevBundle("1.21.11-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
// Set target version
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
sourceCompatibility = "21"
|
||||
targetCompatibility = "21"
|
||||
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet.versions
|
||||
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
|
||||
import net.minecraft.world.entity.player.Abilities
|
||||
import org.bukkit.craftbukkit.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
|
||||
|
||||
class V1_21R7_PacketManager : PacketManagerBase(), PacketManager {
|
||||
override val canSetInstantBuild: Boolean
|
||||
get() = true
|
||||
|
||||
override fun setInstantBuild(player: Player, instantBuild: Boolean) {
|
||||
val nmsPlayer = (player as CraftPlayer).handle
|
||||
val playerAbilities = nmsPlayer.abilities
|
||||
val sendedAbilities: Abilities
|
||||
if (playerAbilities.instabuild == instantBuild) {
|
||||
sendedAbilities = playerAbilities
|
||||
} else {
|
||||
sendedAbilities = Abilities()
|
||||
sendedAbilities.invulnerable = playerAbilities.invulnerable
|
||||
sendedAbilities.flying = playerAbilities.flying
|
||||
sendedAbilities.mayfly = playerAbilities.mayfly
|
||||
sendedAbilities.instabuild = instantBuild
|
||||
sendedAbilities.mayBuild = playerAbilities.mayBuild
|
||||
sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed
|
||||
sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed
|
||||
}
|
||||
val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
|
||||
nmsPlayer.connection.send(packet)
|
||||
}
|
||||
}
|
||||
|
|
@ -3,20 +3,32 @@ rootProject.name = "CustomAnvil"
|
|||
// NMS subproject
|
||||
include("nms:nms-common")
|
||||
findProject(":nms:nms-common")?.name = "nms-common"
|
||||
include("nms:nms-paper")
|
||||
findProject(":nms:nms-paper")?.name = "nms-paper"
|
||||
include("nms:v1_17R1")
|
||||
findProject(":nms:v1_17R1")?.name = "v1_17R1"
|
||||
include("nms:v1_18R1")
|
||||
findProject(":nms:v1_18R1")?.name = "v1_18R1"
|
||||
include("nms:v1_18R2")
|
||||
findProject(":nms:v1_18R2")?.name = "v1_18R2"
|
||||
include("nms:v1_19R1")
|
||||
findProject(":nms:v1_19R1")?.name = "v1_19R1"
|
||||
include("nms:v1_19R2")
|
||||
findProject(":nms:v1_19R2")?.name = "v1_19R2"
|
||||
include("nms:v1_19R3")
|
||||
findProject(":nms:v1_19R3")?.name = "v1_19R3"
|
||||
include("nms:v1_20R1")
|
||||
findProject(":nms:v1_20R1")?.name = "v1_20R1"
|
||||
include("nms:v1_20R2")
|
||||
findProject(":nms:v1_20R2")?.name = "v1_20R2"
|
||||
include("nms:v1_20R3")
|
||||
findProject(":nms:v1_20R3")?.name = "v1_20R3"
|
||||
include("nms:v1_20R4")
|
||||
findProject(":nms:v1_20R4")?.name = "v1_20R4"
|
||||
include("nms:v1_21R1")
|
||||
findProject(":nms:v1_21R1")?.name = "v1_21R1"
|
||||
include("nms:v1_21R2")
|
||||
findProject(":nms:v1_21R2")?.name = "v1_21R2"
|
||||
include("nms:v1_21R3")
|
||||
findProject(":nms:v1_21R3")?.name = "v1_21R3"
|
||||
|
||||
|
||||
val reobfNMS = providers.gradleProperty("subprojects.reobfnms")
|
||||
.get().split(",")
|
||||
|
||||
for (nmsPart in reobfNMS) {
|
||||
include("nms:$nmsPart")
|
||||
findProject(":nms:$nmsPart")?.name = nmsPart
|
||||
}
|
||||
|
||||
// compatibility subprojects
|
||||
include(":impl:LegacyEcoEnchant")
|
||||
findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant"
|
||||
include("impl:ExcellentEnchant5_4")
|
||||
findProject(":impl:ExcellentEnchant5_4")?.name = "ExcellentEnchant5_4"
|
||||
findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant"
|
||||
|
|
@ -14,10 +14,7 @@ public class AnvilRecipeBuilder {
|
|||
private @NotNull String name;
|
||||
private boolean exactCount;
|
||||
|
||||
private int levelCostPerCraft;
|
||||
private int linearXpCostPerCraft;
|
||||
|
||||
private boolean removeExactLinearXp;
|
||||
private int xpCostPerCraft;
|
||||
|
||||
private @Nullable ItemStack leftItem;
|
||||
private @Nullable ItemStack rightItem;
|
||||
|
|
@ -26,7 +23,7 @@ public class AnvilRecipeBuilder {
|
|||
/**
|
||||
* Instantiates a new Anvil recipe builder.
|
||||
* exact count default to true.
|
||||
* xp level and linear cost per craft default to 0.
|
||||
* xp cost per craft default to 1.
|
||||
*
|
||||
* @param name The recipe name
|
||||
*/
|
||||
|
|
@ -34,9 +31,7 @@ public class AnvilRecipeBuilder {
|
|||
this.name = name;
|
||||
|
||||
this.exactCount = true;
|
||||
this.levelCostPerCraft = 0;
|
||||
this.linearXpCostPerCraft = 0;
|
||||
this.removeExactLinearXp = false;
|
||||
this.xpCostPerCraft = 1;
|
||||
|
||||
this.leftItem = null;
|
||||
this.rightItem = null;
|
||||
|
|
@ -65,7 +60,7 @@ public class AnvilRecipeBuilder {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get if the recipe is exact count. (default 0)
|
||||
* Get if the recipe is exact count.
|
||||
* <p>
|
||||
* Exact count mean the recipe can only be crafted 1 by 1.
|
||||
* If set to false, then it will craft as much as possible in 1 go and will keep unused material onto the anvil inventory.
|
||||
|
|
@ -91,14 +86,12 @@ public class AnvilRecipeBuilder {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the xp level cost per craft. (default 0)
|
||||
* Get the xp level cost per craft.
|
||||
*
|
||||
* @return The xp level cost per craft
|
||||
* @deprecated use {@link #getLevelCostPerCraft() getLevelCostPerCraft} instead
|
||||
*/
|
||||
@Deprecated(since = "1.13.0")
|
||||
public int getXpCostPerCraft() {
|
||||
return getLevelCostPerCraft();
|
||||
return xpCostPerCraft;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -106,78 +99,9 @@ public class AnvilRecipeBuilder {
|
|||
*
|
||||
* @param xpCostPerCraft The xp level cost per craft
|
||||
* @return This recipe builder instance.
|
||||
* @deprecated use {@link #setLevelCostPerCraft(int) setLevelCostPerCraft} instead
|
||||
*/
|
||||
@Deprecated(since = "1.13.0")
|
||||
public AnvilRecipeBuilder setXpCostPerCraft(int xpCostPerCraft) {
|
||||
return setLevelCostPerCraft(xpCostPerCraft);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the xp level cost per craft. (default 0)
|
||||
*
|
||||
* @return The xp level cost per craft
|
||||
*/
|
||||
public int getLevelCostPerCraft() {
|
||||
return levelCostPerCraft;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the xp level cost per craft.
|
||||
*
|
||||
* @param levelCostPerCraft The xp level cost per craft
|
||||
* @return This recipe builder instance.
|
||||
*/
|
||||
public AnvilRecipeBuilder setLevelCostPerCraft(int levelCostPerCraft) {
|
||||
this.levelCostPerCraft = levelCostPerCraft;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the linear xp cost (not xp level cost) per craft.
|
||||
*
|
||||
* @return The xp level cost per craft
|
||||
*/
|
||||
public int getLinearXpCostPerCraft() {
|
||||
return linearXpCostPerCraft;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the linear xp cost (not xp level cost) per craft.
|
||||
*
|
||||
* @param linearXpCostPerCraft The linear xp cost per craft
|
||||
* @return This recipe builder instance.
|
||||
*/
|
||||
public AnvilRecipeBuilder setLinearXpCostPerCraft(int linearXpCostPerCraft) {
|
||||
this.linearXpCostPerCraft = linearXpCostPerCraft;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if the linear xp should get removed by an exact amount.
|
||||
* <p>
|
||||
* If false (default) level cost will be the level that would be reached by a player with this amount of xp.
|
||||
* If true will require the level that has at least the specified level of xp then on click remove only the necessary xp
|
||||
* <p>
|
||||
* linear xp cost are applied after level cost
|
||||
* @return if we should remove the exact amount of linear xp
|
||||
*/
|
||||
public boolean isRemoveExactLinearXp() {
|
||||
return removeExactLinearXp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the linear xp should get removed by an exact amount.
|
||||
* <p>
|
||||
* If false (default) level cost will be the level that would be reached by a player with this amount of xp.
|
||||
* If true will require the level that has at least the specified level of xp then on click remove only the necessary xp
|
||||
* <p>
|
||||
* linear xp cost are applied after level cost
|
||||
* @param removeExactLinearXp if we should remove the exact amount of linear xp
|
||||
* @return This recipe builder instance.
|
||||
*/
|
||||
public AnvilRecipeBuilder setRemoveExactLinearXp(boolean removeExactLinearXp) {
|
||||
this.removeExactLinearXp = removeExactLinearXp;
|
||||
this.xpCostPerCraft = xpCostPerCraft;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
@ -258,14 +182,12 @@ public class AnvilRecipeBuilder {
|
|||
*/
|
||||
@Nullable // null if missing argument
|
||||
public AnvilCustomRecipe build() {
|
||||
if (leftItem == null || resultItem == null) return null;
|
||||
if(leftItem == null || resultItem == null) return null;
|
||||
|
||||
return new AnvilCustomRecipe(
|
||||
this.name,
|
||||
this.exactCount,
|
||||
this.levelCostPerCraft,
|
||||
this.linearXpCostPerCraft,
|
||||
this.removeExactLinearXp,
|
||||
this.xpCostPerCraft,
|
||||
this.leftItem, this.rightItem, this.resultItem
|
||||
);
|
||||
}
|
||||
|
|
@ -276,7 +198,7 @@ public class AnvilRecipeBuilder {
|
|||
*
|
||||
* @return True if successful.
|
||||
*/
|
||||
public boolean registerIfAbsent() {
|
||||
public boolean registerIfAbsent(){
|
||||
return CustomAnvilRecipeApi.addRecipe(this);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import java.util.HashSet;
|
|||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
//TODO add conflict after level
|
||||
/**
|
||||
* A Builder for material conflict.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package xyz.alexcrea.cuanvil.api;
|
||||
|
||||
import io.delilaheve.CustomAnvil;
|
||||
import io.delilaheve.util.ConfigOptions;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
|
|
@ -181,13 +180,13 @@ public class EnchantmentApi {
|
|||
private static boolean tryWriteDefaultConfig(FileConfiguration defaultConfig, CAEnchantment enchantment, boolean override) {
|
||||
boolean hasChange = false;
|
||||
|
||||
String levelPath = ConfigOptions.ENCHANT_LIMIT_ROOT + "." + enchantment.getKey();
|
||||
String levelPath = "enchant_limits." + enchantment.getKey();
|
||||
if(override || !defaultConfig.isSet(levelPath)){
|
||||
defaultConfig.set(levelPath, enchantment.defaultMaxLevel());
|
||||
hasChange = true;
|
||||
}
|
||||
|
||||
String basePath = ConfigOptions.ENCHANT_VALUES_ROOT + "." + enchantment.getKey();
|
||||
String basePath = "enchant_values." + enchantment.getKey();
|
||||
EnchantmentRarity rarity = enchantment.defaultRarity();
|
||||
|
||||
String itemPath = basePath + ".item";
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package xyz.alexcrea.cuanvil.api;
|
|||
import io.delilaheve.CustomAnvil;
|
||||
import io.delilaheve.util.ConfigOptions;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
|
@ -106,9 +105,7 @@ public class MaterialGroupApi {
|
|||
if (group instanceof IncludeGroup includeGroup) {
|
||||
changed = writeKnownGroup("include", includeGroup);
|
||||
} else if (group instanceof ExcludeGroup excludeGroup) {
|
||||
throw new UnsupportedOperationException("exclude group is temporarily disable for the time being. sorry");
|
||||
// This code do not do what is intended ? idk why do it exist
|
||||
//changed = writeKnownGroup("exclude", excludeGroup);
|
||||
changed = writeKnownGroup("exclude", excludeGroup);
|
||||
} else {
|
||||
changed = writeUnknownGroup(group);
|
||||
}
|
||||
|
|
@ -124,27 +121,16 @@ public class MaterialGroupApi {
|
|||
FileConfiguration config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
|
||||
|
||||
String basePath = group.getName() + ".";
|
||||
Set<NamespacedKey> materialSet = group.getNonGroupInheritedMaterials();
|
||||
Set<Material> materialSet = group.getNonGroupInheritedMaterials();
|
||||
Set<AbstractMaterialGroup> groupSet = group.getGroups();
|
||||
|
||||
boolean empty = true;
|
||||
if (!materialSet.isEmpty()) {
|
||||
config.set(basePath + ItemGroupManager.MATERIAL_LIST_PATH, materialSetToStringList(materialSet));
|
||||
empty = false;
|
||||
} else {
|
||||
config.set(basePath + ItemGroupManager.MATERIAL_LIST_PATH, null);
|
||||
}
|
||||
if (!groupSet.isEmpty()) {
|
||||
config.set(basePath + ItemGroupManager.GROUP_LIST_PATH, materialGroupSetToStringList(groupSet));
|
||||
empty = false;
|
||||
} else {
|
||||
config.set(basePath + ItemGroupManager.GROUP_LIST_PATH, null);
|
||||
}
|
||||
|
||||
if (empty) {
|
||||
config.set(basePath + ItemGroupManager.GROUP_TYPE_PATH, null);
|
||||
return false;
|
||||
}
|
||||
if (!config.isConfigurationSection(group.getName())) return false;
|
||||
|
||||
config.set(basePath + ItemGroupManager.GROUP_TYPE_PATH, groupType);
|
||||
return true;
|
||||
|
|
@ -154,7 +140,7 @@ public class MaterialGroupApi {
|
|||
FileConfiguration config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
|
||||
|
||||
String basePath = group.getName() + ".";
|
||||
Set<NamespacedKey> materials = group.getMaterials();
|
||||
EnumSet<Material> materials = group.getMaterials();
|
||||
|
||||
if (materials.isEmpty()) return false;
|
||||
|
||||
|
|
@ -164,8 +150,8 @@ public class MaterialGroupApi {
|
|||
return true;
|
||||
}
|
||||
|
||||
public static List<String> materialSetToStringList(@NotNull Set<NamespacedKey> materials) {
|
||||
return materials.stream().map(NamespacedKey::toString).toList();
|
||||
public static List<String> materialSetToStringList(@NotNull Set<Material> materials) {
|
||||
return materials.stream().map(material -> material.getKey().getKey().toLowerCase()).toList();
|
||||
}
|
||||
|
||||
public static List<String> materialGroupSetToStringList(@NotNull Set<AbstractMaterialGroup> groups) {
|
||||
|
|
|
|||
|
|
@ -3,23 +3,6 @@ package xyz.alexcrea.cuanvil.api.event;
|
|||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
/**
|
||||
* Called when the configuration of CustomAnvil is ready.
|
||||
* It is called either on the plugin startup or on the plugin config reload.
|
||||
* <p>
|
||||
* If you want to listen to the first trigger of this event (first configuration load. aka plugin load)
|
||||
* you will need to register the listener on your plugin onEnable or earlier
|
||||
* <p>
|
||||
* This event indicate that can start to register your recipes, item groups and conflicts.
|
||||
* The vanilla and custom enchantments should already have been provided to CustomAnvil.
|
||||
* Configuration can be changed any time after this event is triggered but never before.
|
||||
* <p>
|
||||
* use {@link xyz.alexcrea.cuanvil.api.ConflictAPI ConflictApi},
|
||||
* {@link xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui CustomRecipeConfigGui},
|
||||
* {@link xyz.alexcrea.cuanvil.api.MaterialGroupApi MaterialGroupApi}
|
||||
* and {@link xyz.alexcrea.cuanvil.api.UnitRepairApi UnitRepairApi}
|
||||
* to add/remove/edit configurations
|
||||
*/
|
||||
public class CAConfigReadyEvent extends Event {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
|
|
|||
|
|
@ -3,17 +3,6 @@ package xyz.alexcrea.cuanvil.api.event;
|
|||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
/**
|
||||
* Called when custom anvil is ready to accept registration on custom enchantment.
|
||||
* <p>
|
||||
* If you want to listen this event
|
||||
* you will need to register the listener on your plugin onEnable or earlier
|
||||
* <p>
|
||||
* Custom enchantments may be registered later but may cause issue if registered too later
|
||||
* (after configuration loading phase. see {@link CAConfigReadyEvent})
|
||||
* <p>
|
||||
* use {@link xyz.alexcrea.cuanvil.api.EnchantmentApi EnchantmentApi} to register and unregister your custom enchantments
|
||||
*/
|
||||
public class CAEnchantRegistryReadyEvent extends Event {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.api.event.listener;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called before custom anvil process the click on the result on the anvil inventory.
|
||||
* <p>
|
||||
* This event is called after checking that the inventory is an anvil inventory and that the click is on the result slot
|
||||
* but before checking if the player has the custom anvil affected permission.
|
||||
* <p>
|
||||
* This event being cancelled will make CustomAnvil abort the click on result process.
|
||||
* <p>
|
||||
* Most of the time you would likely need {@link CAPreAnvilBypassEvent} or {@link CAEarlyPreAnvilBypassEvent}
|
||||
* for this event to be useful.
|
||||
* <p>
|
||||
* There is also {@link CATreatAnvilResult2Event} that may be better for some use case.
|
||||
*/
|
||||
public class CAClickResultBypassEvent extends Event implements Cancellable {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
private boolean cancelled = false;
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final InventoryClickEvent event;
|
||||
|
||||
/**
|
||||
* Get the bukkit inventory click event causing to this event
|
||||
*
|
||||
* @return The click event causing to this event
|
||||
*/
|
||||
@NotNull
|
||||
public InventoryClickEvent getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
public CAClickResultBypassEvent(@NotNull InventoryClickEvent event) {
|
||||
this.event = event;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.api.event.listener;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called before custom anvil process the prepare anvil event.
|
||||
* <p>
|
||||
* This event will always get called when CustomAnvil need to handle
|
||||
* <p>
|
||||
* This event being cancelled will make CustomAnvil abort the anvil process.
|
||||
* <p>
|
||||
* You should also use {@link CAClickResultBypassEvent} if you want to use this event for something useful.
|
||||
* <p>
|
||||
* It is also recommended that you read about {@link CAPreAnvilBypassEvent} and {@link CATreatAnvilResult2Event}
|
||||
* as your use case may be more prone to use theses.
|
||||
*/
|
||||
public class CAEarlyPreAnvilBypassEvent extends Event implements Cancellable {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
private boolean cancelled = false;
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final PrepareAnvilEvent event;
|
||||
|
||||
/**
|
||||
* Get the bukkit pre anvil event causing this event
|
||||
*
|
||||
* @return The pre anvil event causing to this event
|
||||
*/
|
||||
@NotNull
|
||||
public PrepareAnvilEvent getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
public CAEarlyPreAnvilBypassEvent(@NotNull PrepareAnvilEvent event) {
|
||||
this.event = event;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.api.event.listener;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called before custom anvil process the prepare anvil event.
|
||||
* <p>
|
||||
* This event is called after {@link CAEarlyPreAnvilBypassEvent},
|
||||
* after checking that there is at least an item on the left slot
|
||||
* and after checking if any of the 2 item is marked as immutable
|
||||
* but before checking if the player has the custom anvil affected permission.
|
||||
* <p>
|
||||
* This event being cancelled will make CustomAnvil abort the anvil process.
|
||||
* <p>
|
||||
* You should also use {@link CAClickResultBypassEvent} if you want to use this event for something useful.
|
||||
* <p>
|
||||
* It is also recommended that you read about {@link CAEarlyPreAnvilBypassEvent} and {@link CATreatAnvilResult2Event}
|
||||
* as your use case may be more prone to use theses.
|
||||
*/
|
||||
public class CAPreAnvilBypassEvent extends Event implements Cancellable {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
private boolean cancelled = false;
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final PrepareAnvilEvent event;
|
||||
|
||||
/**
|
||||
* Get the bukkit pre anvil event causing this event
|
||||
*
|
||||
* @return The pre anvil event causing this event
|
||||
*/
|
||||
@NotNull
|
||||
public PrepareAnvilEvent getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
public CAPreAnvilBypassEvent(@NotNull PrepareAnvilEvent event) {
|
||||
this.event = event;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,196 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.api.event.listener;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryView;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.alexcrea.cuanvil.anvil.AnvilCost;
|
||||
import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
|
||||
|
||||
/**
|
||||
* Called after custom anvil processed the click on the result on the anvil inventory.
|
||||
* This event should be used to modify the result of an anvil use.
|
||||
* <p>
|
||||
* You may also want to check {@link CAClickResultBypassEvent},
|
||||
* {@link CAPreAnvilBypassEvent}
|
||||
* and {@link CAEarlyPreAnvilBypassEvent} for your use case
|
||||
* <p>
|
||||
* A null result will cancel this event
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class CATreatAnvilResult2Event extends Event {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final InventoryView view;
|
||||
|
||||
private final AnvilUseType useType;
|
||||
|
||||
@Nullable
|
||||
private final ItemStack left;
|
||||
@Nullable
|
||||
private final ItemStack right;
|
||||
|
||||
@Nullable
|
||||
private ItemStack result;
|
||||
|
||||
private final AnvilCost cost;
|
||||
|
||||
@ApiStatus.Internal
|
||||
public CATreatAnvilResult2Event(
|
||||
@NotNull InventoryView view,
|
||||
Inventory inv,
|
||||
AnvilUseType useType,
|
||||
@Nullable ItemStack result,
|
||||
AnvilCost cost) {
|
||||
this.view = view;
|
||||
this.useType = useType;
|
||||
|
||||
this.left = inv.getItem(0); // TODO use view here
|
||||
this.right = inv.getItem(1);
|
||||
this.result = result;
|
||||
this.cost = cost;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the bukkit inventory view.
|
||||
* <p>
|
||||
* Temporarily marked as internal as it will get changed to anvil view on legacy removal
|
||||
* so signature will change
|
||||
*
|
||||
* @return The inventory view of this event.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public @NotNull InventoryView getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the type of use source of the result.
|
||||
*
|
||||
* @return The craft use type.
|
||||
*/
|
||||
public AnvilUseType getUseType() {
|
||||
return useType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the left item of the anvil use
|
||||
*
|
||||
* @return the left item
|
||||
*/
|
||||
public @Nullable ItemStack getLeftItem() {
|
||||
return left;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the right item of the anvil use
|
||||
*
|
||||
* @return the right item
|
||||
*/
|
||||
public @Nullable ItemStack getRightItem() {
|
||||
return right;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current result
|
||||
* <p>
|
||||
* note that it will not be null unless another listener previously set it to null.
|
||||
*
|
||||
* @return The current result.
|
||||
*/
|
||||
public @Nullable ItemStack getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current result
|
||||
* <p>
|
||||
* note that a null result will cancel this anvil use.
|
||||
*
|
||||
* @param result The new result
|
||||
*/
|
||||
public void setResult(@Nullable ItemStack result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level cost displayed on the anvil.
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
* </ul>
|
||||
*
|
||||
* @return The current cost.
|
||||
* @deprecated use #{@link #getCost()} instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "1.17.0")
|
||||
public int getLevelCost() {
|
||||
return cost.asXpCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the level cost displayed on the anvil.
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param levelCost The new cost.
|
||||
* @deprecated use #{@link #getCost()} and set value on this instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "1.17.0")
|
||||
public void setLevelCost(int levelCost) {
|
||||
cost.setGeneric(levelCost - cost.getGeneric() - cost.asXpCost());
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow access to the current cost of the event
|
||||
* Note that modifying this object will change the event resulting cost
|
||||
*
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
*
|
||||
* @return the current anvil cost
|
||||
*/
|
||||
public AnvilCost getCost() {
|
||||
return cost;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,162 +0,0 @@
|
|||
package xyz.alexcrea.cuanvil.api.event.listener;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.alexcrea.cuanvil.anvil.AnvilCost;
|
||||
import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
|
||||
|
||||
/**
|
||||
* Called after custom anvil processed the click on the result on the anvil inventory.
|
||||
* This event should be used to modify the result of an anvil use.
|
||||
* <p>
|
||||
* You may also want to check {@link CAClickResultBypassEvent},
|
||||
* {@link CAPreAnvilBypassEvent}
|
||||
* and {@link CAEarlyPreAnvilBypassEvent} for your use case
|
||||
* <p>
|
||||
* A null result will cancel this pre anvil event
|
||||
*
|
||||
* @deprecated Prepare anvil Event cannot be provided as it can be called on result and therefore not have prepared anvil event
|
||||
* use {@link CATreatAnvilResult2Event} instead
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@Deprecated(forRemoval = true, since = "1.17.0")
|
||||
public class CATreatAnvilResultEvent extends Event {
|
||||
|
||||
private static final HandlerList HANDLERS = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final PrepareAnvilEvent event;
|
||||
|
||||
private final AnvilUseType useType;
|
||||
|
||||
@Nullable
|
||||
private ItemStack result;
|
||||
|
||||
private final AnvilCost cost;
|
||||
|
||||
public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, AnvilCost cost) {
|
||||
this.event = event;
|
||||
this.useType = useType;
|
||||
this.result = result;
|
||||
this.cost = cost;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the bukkit inventory click event causing to this event.
|
||||
*
|
||||
* @return The click event causing to this event.
|
||||
*/
|
||||
public @NotNull PrepareAnvilEvent getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of use source of the result.
|
||||
*
|
||||
* @return The craft use type.
|
||||
*/
|
||||
public AnvilUseType getUseType() {
|
||||
return useType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current result
|
||||
* <p>
|
||||
* note that it will not be null unless another listener previously set it to null.
|
||||
*
|
||||
* @return The current result.
|
||||
*/
|
||||
public @Nullable ItemStack getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current result
|
||||
* <p>
|
||||
* note that a null result will cancel this anvil use.
|
||||
*
|
||||
* @param result The new result
|
||||
*/
|
||||
public void setResult(@Nullable ItemStack result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level cost displayed on the anvil.
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
* </ul>
|
||||
*
|
||||
* @return The current cost.
|
||||
* @deprecated use #{@link #getCost()} instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "1.17.0")
|
||||
public int getLevelCost() {
|
||||
return cost.asXpCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the level cost displayed on the anvil.
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
* </ul>
|
||||
*
|
||||
* @param levelCost The new cost.
|
||||
* @deprecated use #{@link #getCost()} and set value on this instead
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "1.17.0")
|
||||
public void setLevelCost(int levelCost) {
|
||||
cost.setGeneric(levelCost - cost.getGeneric() - cost.asXpCost());
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow access to the current cost of the event
|
||||
* Note that modifying this object will change the event resulting cost
|
||||
*
|
||||
* <h3>Important note:</h3>
|
||||
* the final price are re calculated on click for the following use case:
|
||||
* <ul>
|
||||
* <li>Custom craft</li>
|
||||
* <li>Unit repair</li>
|
||||
* <li>Lore edit</li>
|
||||
* </ul>
|
||||
* This value will be used as final price for:
|
||||
* <li>Item merge</li>
|
||||
* <li>Item rename</li>
|
||||
*
|
||||
* @return the current anvil cost
|
||||
*/
|
||||
public AnvilCost getCost() {
|
||||
return cost;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -9,7 +9,6 @@ import org.jetbrains.annotations.Nullable;
|
|||
import xyz.alexcrea.cuanvil.group.EnchantConflictManager;
|
||||
import xyz.alexcrea.cuanvil.group.ItemGroupManager;
|
||||
import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager;
|
||||
import xyz.alexcrea.cuanvil.util.MetricsUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
|
@ -146,7 +145,6 @@ public abstract class ConfigHolder {
|
|||
sufficientSuccess = true;
|
||||
} catch (IOException e) {
|
||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not copy backup saving config " + base.getName(), e);
|
||||
MetricsUtil.INSTANCE.trackError(e);
|
||||
}
|
||||
}
|
||||
// save last backup
|
||||
|
|
@ -277,7 +275,6 @@ public abstract class ConfigHolder {
|
|||
this.deletedConfigFile.createNewFile();
|
||||
} catch (IOException e) {
|
||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not create " + this.deletedConfigFile.getPath(), e);
|
||||
MetricsUtil.INSTANCE.trackError(e);
|
||||
}
|
||||
loadDeletedListFile(false);
|
||||
|
||||
|
|
@ -315,7 +312,6 @@ public abstract class ConfigHolder {
|
|||
this.deletedListConfig.save(this.deletedConfigFile);
|
||||
} catch (IOException e) {
|
||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not save " + this.deletedConfigFile.getPath(), e);
|
||||
MetricsUtil.INSTANCE.trackError(e);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.config;
|
|||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
|
||||
import xyz.alexcrea.cuanvil.util.AnvilUseType;
|
||||
|
||||
import java.util.EnumMap;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package xyz.alexcrea.cuanvil.enchant;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
|
@ -12,23 +11,24 @@ public interface AdditionalTestEnchantment {
|
|||
/**
|
||||
* Test if the provided enchantments can be compatible with this enchantment. only non-Custom Anvil conflict.
|
||||
* @param enchantments Immutable map of validated enchantments for the item.
|
||||
* @param itemType Material namespaced key of the tested item.
|
||||
* @param itemMat Material of the tested item.
|
||||
* @return If there is a conflict with the enchantments.
|
||||
*/
|
||||
boolean isEnchantConflict(
|
||||
@NotNull Map<CAEnchantment, Integer> enchantments,
|
||||
@NotNull NamespacedKey itemType);
|
||||
@NotNull Material itemMat);
|
||||
|
||||
|
||||
/**
|
||||
* Test if the provided item can be compatible with this enchantment. only non-Custom Anvil conflict.
|
||||
* @param enchantments Immutable map of validated enchantments for the item.
|
||||
* @param itemType Material namespaced key of the tested item.
|
||||
* @param itemMat Material of the tested item.
|
||||
* @param item Provide a new instance of the used item stack with the partial enchantment applied.
|
||||
* @return If there is a conflict with the enchantment and the item.
|
||||
*/
|
||||
boolean isItemConflict(
|
||||
@NotNull Map<CAEnchantment, Integer> enchantments,
|
||||
@NotNull NamespacedKey itemType,
|
||||
@NotNull Material itemMat,
|
||||
@NotNull ItemStack item);
|
||||
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue