Feature/1.21.9 (#90)

This commit is contained in:
alexcrea 2025-10-07 04:11:13 +02:00 committed by GitHub
commit 7d9b0f05cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 1438 additions and 39 deletions

View file

@ -100,7 +100,8 @@ For information about the API, please refer to [the Wiki](https://github.com/ale
### 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)\
For 1.21 to 1.21.7 use the [1.21 configurations](https://github.com/alexcrea/CustomAnvil/tree/master/defaultconfigs/1.21)
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.

View file

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

View file

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

View file

@ -0,0 +1,393 @@
#
# 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 "&".
allow_color_code: false
allow_hexadecimal_color: 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
# 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)
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 "&"
allow_color_code: true
allow_hexadecimal_color: 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
# 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
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 "&"
allow_color_code: true
allow_hexadecimal_color: 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
# 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
# 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.11.0
lowMinecraftVersion: 1.21.9

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,382 @@
#
# 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_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.
# ----------------------------------------------------

View file

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

View file

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

1
nms/v1_21R6/.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.9-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_21R6_ExternGuiTester: ExternGuiTester {
override val wesjdAnvilGuiName = "Wrapper1_21_R6"
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_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)
}
}

View file

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

View file

@ -1,42 +1,37 @@
package xyz.alexcrea.cuanvil.update;
import io.delilaheve.CustomAnvil;
import org.bukkit.configuration.file.FileConfiguration;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
// This is a temporary class that aim to handle 1.21 update.
// It will be replaced by a better system later.
public class Update_1_21 {
private static final Version V1_21 = new Version(1, 21);
public static void handleUpdate(){
// Assume if version path is not null then it's 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){
Version version = Version.fromString(oldVersion);
// Test 1.21
if(V1_21.greaterEqual(version)) return;
var version = Version.fromString(oldVersion);
if(V1_21.lesserEqual(version)) return false;
}
Version current = UpdateUtils.currentMinecraftVersion();
// Test 1.21
if(current.greaterEqual(V1_21)){
doUpdate();
}
return true;
}
private static void doUpdate() {
CustomAnvil.instance.getLogger().info("Updating config to support 1.21 ...");
FileConfiguration baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
FileConfiguration groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
FileConfiguration conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
FileConfiguration unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
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();
// Add mace to groups
groupConfig.set("mace.type", "include");
@ -81,7 +76,7 @@ public class Update_1_21 {
unitConfig.set("breeze_rod.mace", 0.25);
// Set version string as 1.21
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, "1.21");
baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, V1_21.toString());
// Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
@ -92,9 +87,6 @@ public class Update_1_21 {
// 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();
CustomAnvil.instance.getLogger().info("Updating Done !");
}
}

View file

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

@ -1,5 +1,7 @@
package xyz.alexcrea.cuanvil.update;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@ -48,6 +50,7 @@ public record Version(int major, int minor, int patch) {
this.patch <= other.patch)));
}
@NotNull
@Override
public String toString() {
return major + "." + minor + "." + patch;

View file

@ -2,6 +2,9 @@ package xyz.alexcrea.cuanvil.update.plugin;
import io.delilaheve.CustomAnvil;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.update.UpdateUtils;
import xyz.alexcrea.cuanvil.update.Update_1_21;
import xyz.alexcrea.cuanvil.update.Update_1_21_9;
import xyz.alexcrea.cuanvil.update.Version;
import javax.annotation.Nonnull;
@ -12,26 +15,37 @@ public class PluginUpdates {
private static final String CONFIG_VERSION_PATH = "configVersion";
public static void handlePluginUpdate() {
// Handle mc version update then plugin version update
public static void handleUpdates() {
handleMCVersionUpdate();
handlePluginUpdate();
}
private static final Version V1_6_2 = new Version(1, 6, 2);
private static final Version V1_6_7 = new Version(1, 6, 7);
private static final Version V1_8_0 = new Version(1, 8, 0);
private static final Version V1_11_0 = new Version(1, 11, 0);
// Handle only plugin update
private static void handlePluginUpdate() {
String versionString = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(CONFIG_VERSION_PATH);
Version current = versionString == null ? new Version(0) : Version.fromString(versionString);
Set<ConfigHolder> toSave = new HashSet<>();
if (new Version(1, 6, 2).greaterThan(current)) {
if (V1_6_2.greaterThan(current)) {
PUpdate_1_6_2.handleUpdate(toSave);
// We assume 1.6.7 will run. TODO a better system instead of that I guess
}
if (new Version(1, 6, 7).greaterThan(current)) {
if (V1_6_7.greaterThan(current)) {
PUpdate_1_6_7.handleUpdate(toSave);
// We assume 1.8.0 will run.
}
if (new Version(1, 8, 0).greaterThan(current)) {
if (V1_8_0.greaterThan(current)) {
PUpdate_1_8_0.handleUpdate(toSave);
// We assume 1.11.0 will run.
}
if (new Version(1, 11, 0).greaterThan(current)) {
if (V1_11_0.greaterThan(current)) {
PUpdate_1_11_0.handleUpdate(toSave);
finishConfiguration("1.11.0", toSave);
@ -39,6 +53,19 @@ public class PluginUpdates {
}
// Handle minecraft version update (not plugin version update)
public static void handleMCVersionUpdate(){
Version current = UpdateUtils.currentMinecraftVersion();
boolean hadUpdate = false;
hadUpdate |= Update_1_21.handleUpdate(current);
hadUpdate |= Update_1_21_9.handleUpdate(current);
if(hadUpdate){
CustomAnvil.instance.getLogger().info("Updating Done !");
}
}
private static void finishConfiguration(@Nonnull String newVersion, @Nonnull Set<ConfigHolder> toSave) {
CustomAnvil.instance.getLogger().info("Configuration file updated to " + newVersion);
ConfigHolder.DEFAULT_CONFIG.getConfig().set(CONFIG_VERSION_PATH, newVersion);

View file

@ -139,11 +139,8 @@ open class CustomAnvil : JavaPlugin() {
return
}
// temporary: handle 1.21 update
Update_1_21.handleUpdate()
// plugin configuration updates
PluginUpdates.handlePluginUpdate()
// Handle minecraft and plugin updates
PluginUpdates.handleUpdates()
// Register enchantment of compatible plugin and load configuration change.
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.dependency.DependencyManager
import xyz.alexcrea.cuanvil.gui.config.global.*
import xyz.alexcrea.cuanvil.update.Update_1_21
import xyz.alexcrea.cuanvil.update.plugin.PluginUpdates
class ReloadExecutor : CommandExecutor {
override fun onCommand(sender: CommandSender, cmd: Command, cmdstr: String, args: Array<out String>): Boolean {
@ -48,8 +48,8 @@ class ReloadExecutor : CommandExecutor {
UnitRepairConfigGui.getCurrentInstance()?.reloadValues()
CustomRecipeConfigGui.getCurrentInstance()?.reloadValues()
// temporary: handle 1.21 update
Update_1_21.handleUpdate()
// handle minecraft version update
PluginUpdates.handleMCVersionUpdate()
// Handle dependency reload
DependencyManager.handleConfigReload()

View file

@ -45,6 +45,7 @@ object GuiTesterSelector {
4 -> v1_21R3_ExternGuiTester()
5 -> v1_21R4_ExternGuiTester()
6, 7, 8 -> v1_21R5_ExternGuiTester()
9 -> v1_21R6_ExternGuiTester()
else -> null
}

View file

@ -59,6 +59,7 @@ object PacketManagerSelector {
4 -> V1_21R3_PacketManager()
5 -> V1_21R4_PacketManager()
6, 7, 8 -> V1_21R5_PacketManager()
9 -> V1_21R6_PacketManager()
else -> null
}