Merge remote-tracking branch 'refs/remotes/origin/v1.x.x' into feature/genericnms

# Conflicts:
#	src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt
This commit is contained in:
alexcrea 2025-12-25 22:09:24 +01:00
commit f5a89fea7c
Signed by: alexcrea
GPG key ID: E346CD16413450E3
25 changed files with 1665 additions and 104 deletions

View file

@ -100,9 +100,7 @@ For information about the API, please refer to [the Wiki](https://github.com/ale
--- ---
### Default Plugin's Configurations ### Default Plugin's Configurations
For 1.18 to 1.20.6 use the [1.18 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.18)\ see [Here](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs)
For 1.21 to 1.21.8 use the [1.21 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21)\
From 1.21.9 use the [1.21.9 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21)
--- ---
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. 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.

View file

@ -18,7 +18,7 @@ plugins {
} }
group = "xyz.alexcrea" group = "xyz.alexcrea"
version = "1.15.5" version = "1.15.7"
val effectiveVersion = "$version" + val effectiveVersion = "$version" +
(if (System.getenv("SMALL_COMMIT_HASH") != null) "-dev-${System.getenv("SMALL_COMMIT_HASH")!!}" else "") (if (System.getenv("SMALL_COMMIT_HASH") != null) "-dev-${System.getenv("SMALL_COMMIT_HASH")!!}" else "")
@ -89,6 +89,7 @@ dependencies {
implementation(project(":nms:v1_21R4", configuration = "reobf")) implementation(project(":nms:v1_21R4", configuration = "reobf"))
implementation(project(":nms:v1_21R5", configuration = "reobf")) implementation(project(":nms:v1_21R5", configuration = "reobf"))
implementation(project(":nms:v1_21R6", configuration = "reobf")) implementation(project(":nms:v1_21R6", configuration = "reobf"))
implementation(project(":nms:v1_21R7", configuration = "reobf"))
// include kotlin for the offline jar // include kotlin for the offline jar
implementation(kotlin("stdlib")) implementation(kotlin("stdlib"))

View file

@ -0,0 +1,6 @@
### 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)

View file

@ -0,0 +1,427 @@
#
# 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 !
#
# 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
# 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
# Default limit to apply to any enchants missing from enchant_limits
#
# Valid values include 1 to 1000
default_limit: 5
# 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 1 - 255 for each enchantment
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)
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
# Whether to show debug logging
debug_log: false
# Whether to show verbose debug logging
debug_log_verbose: false
# 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.15.5
lowMinecraftVersion: 1.21.11

View file

@ -0,0 +1,5 @@
# ----------------------------------------------------
# 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
# ----------------------------------------------------

View file

@ -0,0 +1,398 @@
#
# 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.
# ----------------------------------------------------

View file

@ -0,0 +1,247 @@
#
# 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

View file

@ -0,0 +1,220 @@
#
# 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

View file

@ -1,3 +1,5 @@
### Default Plugin's Configurations ### Default Plugin's Configurations
For 1.18 to 1.20.6 use [1.18 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.18) \ From 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) 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)

1
nms/v1_21R7/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.lastDeploymentsId

View file

@ -0,0 +1,34 @@
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_0)
jvmTarget.set(JvmTarget.JVM_21)
}
}

View file

@ -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_21R7_ExternGuiTester: ExternGuiTester {
override val wesjdAnvilGuiName = "Wrapper1_21_R7"
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
}
}
}

View file

@ -0,0 +1,33 @@
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)
}
}

View file

@ -35,6 +35,8 @@ include("nms:v1_21R5")
findProject(":nms:v1_21R5")?.name = "v1_21R5" findProject(":nms:v1_21R5")?.name = "v1_21R5"
include("nms:v1_21R6") include("nms:v1_21R6")
findProject(":nms:v1_21R6")?.name = "v1_21R6" findProject(":nms:v1_21R6")?.name = "v1_21R6"
include("nms:v1_21R7")
findProject(":nms:v1_21R7")?.name = "v1_21R7"
include(":impl:LegacyEcoEnchant") include(":impl:LegacyEcoEnchant")
findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant" findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant"

View file

@ -1,20 +1,22 @@
package xyz.alexcrea.cuanvil.update.plugin; package xyz.alexcrea.cuanvil.update;
import io.delilaheve.CustomAnvil; import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils; import xyz.alexcrea.cuanvil.update.minecraft.MCUpdate;
import xyz.alexcrea.cuanvil.update.Update_1_21; import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21;
import xyz.alexcrea.cuanvil.update.Update_1_21_9; import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_11;
import xyz.alexcrea.cuanvil.update.Version; import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_9;
import xyz.alexcrea.cuanvil.update.plugin.*;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer; import java.util.function.Consumer;
public class PluginUpdates { public class UpdateHandler {
private static final String CONFIG_VERSION_PATH = "configVersion"; private static final String CONFIG_VERSION_PATH = "configVersion";
@ -24,12 +26,19 @@ public class PluginUpdates {
handlePluginUpdate(); handlePluginUpdate();
} }
private static final Map<Version, Consumer<Set<ConfigHolder>>> updateMap = Map.of( private static final Map<Version, Consumer<Set<ConfigHolder>>> pUpdateMap = Map.of(
new Version(1, 6, 2), PUpdate_1_6_2::handleUpdate, new Version(1, 6, 2), PUpdate_1_6_2::handleUpdate,
new Version(1, 6, 7), PUpdate_1_6_7::handleUpdate, new Version(1, 6, 7), PUpdate_1_6_7::handleUpdate,
new Version(1, 8, 0), PUpdate_1_8_0::handleUpdate, new Version(1, 8, 0), PUpdate_1_8_0::handleUpdate,
new Version(1, 11, 0), PUpdate_1_11_0::handleUpdate, new Version(1, 11, 0), PUpdate_1_11_0::handleUpdate,
new Version(1, 15, 5), PUpdate_1_15_5::handleUpdate new Version(1, 15, 5), PUpdate_1_15_5::handleUpdate,
new Version(1, 15, 6), PUpdate_1_15_6::handleUpdate
);
private static final List<MCUpdate> mcUpdateMap = List.of(
new Update_1_21(),
new Update_1_21_9(),
new Update_1_21_11()
); );
// Handle only plugin update // Handle only plugin update
@ -42,7 +51,7 @@ public class PluginUpdates {
AtomicReference<Version> latest = new AtomicReference<>(null); AtomicReference<Version> latest = new AtomicReference<>(null);
// Hopefully, should iterate in the "insertion" order // Hopefully, should iterate in the "insertion" order
updateMap.forEach((ver, consumer) -> { pUpdateMap.forEach((ver, consumer) -> {
if (ver.greaterThan(current)) { if (ver.greaterThan(current)) {
CustomAnvil.log("handling plugin update to " + ver); CustomAnvil.log("handling plugin update to " + ver);
consumer.accept(toSave); consumer.accept(toSave);
@ -61,8 +70,9 @@ public class PluginUpdates {
Version current = UpdateUtils.currentMinecraftVersion(); Version current = UpdateUtils.currentMinecraftVersion();
boolean hadUpdate = false; boolean hadUpdate = false;
hadUpdate |= Update_1_21.handleUpdate(current); for (MCUpdate mcUpdate : mcUpdateMap) {
hadUpdate |= Update_1_21_9.handleUpdate(current); hadUpdate |= mcUpdate.handleUpdate(current, hadUpdate);
}
if (hadUpdate) { if (hadUpdate) {
CustomAnvil.instance.getLogger().info("Updating Done !"); CustomAnvil.instance.getLogger().info("Updating Done !");

View file

@ -1,58 +0,0 @@
package xyz.alexcrea.cuanvil.update;
import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
public class Update_1_21_9 {
private static final Version V1_21_9 = new Version(1, 21, 9);
public static boolean handleUpdate(Version current){
// Test if we are running in 1.21.9 or better
if(V1_21_9.greaterThan(current))
return false;
// if version path is not null then check if its it's before 1.21.9
String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH);
if(oldVersion != null){
var version = Version.fromString(oldVersion);
if(V1_21_9.lesserEqual(version)) return false;
}
doUpdate();
return true;
}
private static void doUpdate() {
CustomAnvil.instance.getLogger().info("Updating config to support 1.21.9 ...");
var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
// Add mace to groups
addAbsentToList(groupConfig, "helmets.items", "copper_helmet");
addAbsentToList(groupConfig, "chestplate.items", "copper_chestplate");
addAbsentToList(groupConfig, "leggings.items", "copper_leggings");
addAbsentToList(groupConfig, "boots.items", "copper_boots");
addAbsentToList(groupConfig, "pickaxes.items", "copper_pickaxe");
addAbsentToList(groupConfig, "shovels.items", "copper_shovel");
addAbsentToList(groupConfig, "hoes.items", "copper_hoe");
addAbsentToList(groupConfig, "axes.items", "copper_axe");
addAbsentToList(groupConfig, "swords.items", "copper_sword");
// Set version string as 1.21
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, V1_21_9.toString());
// Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true);
// imply reload of CONFLICT_HOLDER
// We also do not need to reload base config as there is no object related to it.
ConfigHolder.ITEM_GROUP_HOLDER.reload();
}
}

View file

@ -0,0 +1,38 @@
package xyz.alexcrea.cuanvil.update.minecraft;
import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
public abstract class MCUpdate {
public final Version version;
public MCUpdate(Version version){
this.version = version;
}
public boolean handleUpdate(Version current, boolean hadUpdate){
// Test if we are running in this update version or better
if(version.greaterThan(current))
return false;
// if version path is not null then check if its it's before this update version
String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH);
if(oldVersion != null){
var version = Version.fromString(oldVersion);
if(this.version.lesserEqual(version)) return false;
}
if(!hadUpdate){
CustomAnvil.instance.getLogger().info("Updating config to support minecraft " + current +" ...");
}
doUpdate();
return true;
}
protected abstract void doUpdate();
}

View file

@ -1,33 +1,20 @@
package xyz.alexcrea.cuanvil.update; package xyz.alexcrea.cuanvil.update.minecraft;
import io.delilaheve.CustomAnvil; import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList; import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
public class Update_1_21 { public class Update_1_21 extends MCUpdate {
private static final Version V1_21 = new Version(1, 21); public Update_1_21() {
super(new Version(1, 21));
public static boolean handleUpdate(Version current){
// Test if we are running in 1.21 or better
if(V1_21.greaterThan(current))
return false;
// if version path is not null then check if its it's before 1.21
String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH);
if(oldVersion != null){
var version = Version.fromString(oldVersion);
if(V1_21.lesserEqual(version)) return false;
} }
doUpdate(); @Override
return true; protected void doUpdate() {
}
private static void doUpdate() {
CustomAnvil.instance.getLogger().info("Updating config to support 1.21 ...");
var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig(); var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig(); var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
var conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig(); var conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
@ -75,8 +62,8 @@ public class Update_1_21 {
// Add unit repair for mace // Add unit repair for mace
unitConfig.set("breeze_rod.mace", 0.25); unitConfig.set("breeze_rod.mace", 0.25);
// Set version string as 1.21 // Set version string as current
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, V1_21.toString()); baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
// Save // Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true); ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);

View file

@ -0,0 +1,84 @@
package xyz.alexcrea.cuanvil.update.minecraft;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
public class Update_1_21_11 extends MCUpdate{
public Update_1_21_11() {
super(new Version(1, 21, 11));
}
@Override
protected void doUpdate() {
var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
var conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
// Create spear group
groupConfig.set("spears.type", "include");
addAbsentToList(groupConfig, "spears.items",
"wooden_spear",
"golden_spear",
"stone_spear",
"copper_spear",
"iron_spear",
"diamond_spear",
"netherite_spear");
// Add spear group to super group and enchantments
addAbsentToList(groupConfig, "melee_weapons.groups", "spears");
addAbsentToList(conflictConfig, "restriction_looting.notAffectedGroups", "spears");
addAbsentToList(conflictConfig, "restriction_knockback.notAffectedGroups", "spears");
addAbsentToList(conflictConfig, "restriction_fire_aspect.notAffectedGroups", "spears");
// Unit repair for spears
unitConfig.set("gold_ingot.golden_spear", 0.25);
unitConfig.set("copper_ingot.copper_spear", 0.25);
unitConfig.set("iron_ingot.iron_spear", 0.25);
unitConfig.set("diamond.diamond_spear", 0.25);
unitConfig.set("netherite_ingot.netherite_spear", 0.25);
unitConfig.set("cobblestone.stone_spear", 0.25);
unitConfig.set("cobbled_deepslate.stone_spear", 0.25);
unitConfig.set("oak_planks.wooden_spear", 0.25);
unitConfig.set("spruce_planks.wooden_spear", 0.25);
unitConfig.set("birch_planks.wooden_spear", 0.25);
unitConfig.set("jungle_planks.wooden_spear", 0.25);
unitConfig.set("acacia_planks.wooden_spear", 0.25);
unitConfig.set("dark_oak_planks.wooden_spear", 0.25);
unitConfig.set("mangrove_planks.wooden_spear", 0.25);
unitConfig.set("cherry_planks.wooden_spear", 0.25);
unitConfig.set("bamboo_planks.wooden_spear", 0.25);
unitConfig.set("crimson_planks.wooden_spear", 0.25);
unitConfig.set("warped_planks.wooden_spear", 0.25);
// Create lunge enchant value and group
baseConfig.set("enchant_limits.minecraft:lunge", 3);
baseConfig.set("enchant_values.minecraft:lunge.item", 2);
baseConfig.set("enchant_values.minecraft:lunge.book", 1);
addAbsentToList(conflictConfig, "restriction_lunge.enchantments", "minecraft:lunge");
addAbsentToList(conflictConfig, "restriction_lunge.notAffectedGroups", "spears", "enchanted_book");
// Set version string as current
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
// Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true);
ConfigHolder.CONFLICT_HOLDER.saveToDisk(true);
ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
// imply reload of CONFLICT_HOLDER
// We also do not need to reload base config as there is no object related to it.
ConfigHolder.ITEM_GROUP_HOLDER.reload();
}
}

View file

@ -0,0 +1,64 @@
package xyz.alexcrea.cuanvil.update.minecraft;
import org.bukkit.configuration.file.FileConfiguration;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
public class Update_1_21_9 extends MCUpdate{
public Update_1_21_9() {
super(new Version(1, 21, 9));
}
@Override
protected void doUpdate() {
var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
// Add cooper items to groups
addAbsentToList(groupConfig, "helmets.items", "copper_helmet");
addAbsentToList(groupConfig, "chestplate.items", "copper_chestplate");
addAbsentToList(groupConfig, "leggings.items", "copper_leggings");
addAbsentToList(groupConfig, "boots.items", "copper_boots");
addAbsentToList(groupConfig, "pickaxes.items", "copper_pickaxe");
addAbsentToList(groupConfig, "shovels.items", "copper_shovel");
addAbsentToList(groupConfig, "hoes.items", "copper_hoe");
addAbsentToList(groupConfig, "axes.items", "copper_axe");
addAbsentToList(groupConfig, "swords.items", "copper_sword");
// Add unit repair
addCopperUnitRepair(unitConfig);
// Set version string as current
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
// Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true);
ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
// imply reload of CONFLICT_HOLDER
// We also do not need to reload base config as there is no object related to it.
ConfigHolder.ITEM_GROUP_HOLDER.reload();
}
public static void addCopperUnitRepair(FileConfiguration unitConfig) {
// Add unit repair
unitConfig.set("copper_ingot.copper_helmet", 0.25);
unitConfig.set("copper_ingot.copper_chestplate", 0.25);
unitConfig.set("copper_ingot.copper_leggings", 0.25);
unitConfig.set("copper_ingot.copper_boots", 0.25);
unitConfig.set("copper_ingot.copper_pickaxe", 0.25);
unitConfig.set("copper_ingot.copper_shovel", 0.25);
unitConfig.set("copper_ingot.copper_hoe", 0.25);
unitConfig.set("copper_ingot.copper_axe", 0.25);
unitConfig.set("copper_ingot.copper_sword", 0.25);
}
}

View file

@ -0,0 +1,27 @@
package xyz.alexcrea.cuanvil.update.plugin;
import org.bukkit.configuration.file.FileConfiguration;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Version;
import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_9;
import javax.annotation.Nonnull;
import java.util.Set;
public class PUpdate_1_15_6 {
public static void handleUpdate(@Nonnull Set<ConfigHolder> toSave) {
// fix only needed for 1.21.9 and above
Version current = UpdateUtils.currentMinecraftVersion();
if (new Version(1, 21, 9).greaterThan(current)) return;
FileConfiguration unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
// Add unit repair
Update_1_21_9.addCopperUnitRepair(unitConfig);
toSave.add(ConfigHolder.UNIT_REPAIR_HOLDER);
}
}

View file

@ -19,8 +19,7 @@ import xyz.alexcrea.cuanvil.listener.AnvilResultListener
import xyz.alexcrea.cuanvil.listener.ChatEventListener import xyz.alexcrea.cuanvil.listener.ChatEventListener
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
import xyz.alexcrea.cuanvil.update.PluginSetDefault import xyz.alexcrea.cuanvil.update.PluginSetDefault
import xyz.alexcrea.cuanvil.update.Update_1_21 import xyz.alexcrea.cuanvil.update.UpdateHandler
import xyz.alexcrea.cuanvil.update.plugin.PluginUpdates
import xyz.alexcrea.cuanvil.util.Metrics import xyz.alexcrea.cuanvil.util.Metrics
import java.io.File import java.io.File
import java.io.FileReader import java.io.FileReader
@ -145,7 +144,7 @@ open class CustomAnvil : JavaPlugin() {
} }
// Handle minecraft and plugin updates // Handle minecraft and plugin updates
PluginUpdates.handleUpdates() UpdateHandler.handleUpdates()
// Register enchantment of compatible plugin and load configuration change. // Register enchantment of compatible plugin and load configuration change.
DependencyManager.handleCompatibilityConfig() DependencyManager.handleCompatibilityConfig()

View file

@ -9,7 +9,7 @@ import xyz.alexcrea.cuanvil.api.event.CAConfigReadyEvent
import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.gui.config.global.* import xyz.alexcrea.cuanvil.gui.config.global.*
import xyz.alexcrea.cuanvil.update.plugin.PluginUpdates import xyz.alexcrea.cuanvil.update.UpdateHandler
class ReloadExecutor : CommandExecutor { class ReloadExecutor : CommandExecutor {
override fun onCommand(sender: CommandSender, cmd: Command, cmdstr: String, args: Array<out String>): Boolean { override fun onCommand(sender: CommandSender, cmd: Command, cmdstr: String, args: Array<out String>): Boolean {
@ -49,7 +49,7 @@ class ReloadExecutor : CommandExecutor {
CustomRecipeConfigGui.getCurrentInstance()?.reloadValues() CustomRecipeConfigGui.getCurrentInstance()?.reloadValues()
// handle minecraft version update // handle minecraft version update
PluginUpdates.handleMCVersionUpdate() UpdateHandler.handleMCVersionUpdate()
// Handle dependency reload // Handle dependency reload
DependencyManager.handleConfigReload() DependencyManager.handleConfigReload()

View file

@ -60,6 +60,7 @@ object PacketManagerSelector {
5 -> V1_21R4_PacketManager() 5 -> V1_21R4_PacketManager()
6, 7, 8 -> V1_21R5_PacketManager() 6, 7, 8 -> V1_21R5_PacketManager()
9, 10 -> V1_21R6_PacketManager() 9, 10 -> V1_21R6_PacketManager()
11 -> V1_21R7_PacketManager()
else -> null else -> null
} }

View file

@ -213,7 +213,8 @@ class PrepareAnvilListener : Listener {
else if (useColor) it.displayName else if (useColor) it.displayName
else ChatColor.stripColor(it.displayName) else ChatColor.stripColor(it.displayName)
if (!displayName.contentEquals(renameText)) {
if (!displayName.contentEquals(renameText) && !(displayName == null && renameText == "")) {
it.setDisplayName(renameText) it.setDisplayName(renameText)
resultItem.itemMeta = it resultItem.itemMeta = it