mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
big cleanup & update legacy code
This commit is contained in:
parent
c8597986a2
commit
39cbc640ef
38 changed files with 285 additions and 314 deletions
|
|
@ -6,14 +6,14 @@ interface ExternGuiTester {
|
|||
|
||||
val wesjdAnvilGuiName: String?
|
||||
|
||||
fun getContainerClass(inventory: InventoryView): Class<Any>?
|
||||
fun getContainerClass(view: InventoryView): Class<Any>?
|
||||
|
||||
fun testIfGui(inventory: InventoryView): Boolean {
|
||||
fun testIfGui(view: InventoryView): Boolean {
|
||||
// this mean we are on test
|
||||
//TODO review why needed knowing previous mitigations should works
|
||||
if(inventory.javaClass.name.endsWith("AnvilViewMock")) return false
|
||||
if(view.javaClass.name.endsWith("AnvilViewMock")) return false
|
||||
|
||||
val clazz = getContainerClass(inventory) ?: return false
|
||||
val clazz = getContainerClass(view) ?: return false
|
||||
|
||||
val clazzName = clazz.name
|
||||
//TODO maybe instead of testing non default, better to be testing we are default ?
|
||||
|
|
|
|||
|
|
@ -2,37 +2,12 @@ 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,10 +4,9 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask
|
|||
import org.bukkit.Bukkit
|
||||
import org.bukkit.entity.Entity
|
||||
import org.bukkit.plugin.Plugin
|
||||
import java.util.function.Consumer
|
||||
|
||||
class FoliaScheduler : TaskScheduler {
|
||||
override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any? {
|
||||
override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any {
|
||||
if (time < 1) {
|
||||
return Bukkit.getGlobalRegionScheduler().run(
|
||||
plugin
|
||||
|
|
|
|||
|
|
@ -7,28 +7,11 @@ import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
|||
class v1_21R2_ExternGuiTester : ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_21_R2"
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
|||
class v1_21R4_ExternGuiTester : ExternGuiTester {
|
||||
override val wesjdAnvilGuiName = "Wrapper1_21_R4"
|
||||
|
||||
var tested = false;
|
||||
var possible = false;
|
||||
var tested = false
|
||||
var possible = false
|
||||
|
||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||
// In case we are in a test environment
|
||||
|
|
@ -22,7 +22,7 @@ class v1_21R4_ExternGuiTester: ExternGuiTester {
|
|||
}
|
||||
|
||||
fun testClassExist() {
|
||||
tested = true;
|
||||
tested = true
|
||||
try {
|
||||
Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView")
|
||||
possible = true
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ public class EnchantmentApi {
|
|||
* @return True if successful.
|
||||
*/
|
||||
public static boolean unregisterEnchantment(@NotNull Enchantment enchantment){
|
||||
return unregisterEnchantment(enchantment.getKey());
|
||||
return unregisterEnchantment(enchantment.getKeyOrThrow());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ public class MaterialGroupApi {
|
|||
}
|
||||
|
||||
public static List<String> materialSetToStringList(@NotNull Set<Material> materials) {
|
||||
return materials.stream().map(material -> material.getKey().getKey().toLowerCase()).toList();
|
||||
return materials.stream().map(material -> material.getKeyOrThrow().getKey().toLowerCase()).toList();
|
||||
}
|
||||
|
||||
public static List<String> materialGroupSetToStringList(@NotNull Set<AbstractMaterialGroup> groups) {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull;
|
|||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager;
|
||||
import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui;
|
||||
import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui;
|
||||
import xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -22,7 +21,8 @@ import java.util.List;
|
|||
@SuppressWarnings("unused")
|
||||
public class UnitRepairApi {
|
||||
|
||||
private UnitRepairApi(){}
|
||||
private UnitRepairApi() {
|
||||
}
|
||||
|
||||
private static Object saveChangeTask = null;
|
||||
|
||||
|
|
@ -174,6 +174,7 @@ public class UnitRepairApi {
|
|||
|
||||
/**
|
||||
* Get every unit repair recipes.
|
||||
*
|
||||
* @return An immutable collection of unit repair recipes.
|
||||
* <p>
|
||||
* Each element of the provided triple represent a part of the recipe
|
||||
|
|
@ -198,6 +199,7 @@ public class UnitRepairApi {
|
|||
|
||||
// Iterate over reparable items
|
||||
ConfigurationSection section = config.getConfigurationSection(unitKey);
|
||||
assert section != null; // We tested config.isConfigurationSection(unitKey)
|
||||
for (String repairableKey : section.getKeys(false)) {
|
||||
// Test if value section exist
|
||||
if (!section.isDouble(repairableKey)) continue;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.api.event;
|
|||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called when the configuration of CustomAnvil is ready.
|
||||
|
|
@ -29,7 +30,7 @@ public class CAConfigReadyEvent extends Event {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.api.event;
|
|||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called when custom anvil is ready to accept registration on custom enchantment.
|
||||
|
|
@ -23,7 +24,7 @@ public class CAEnchantRegistryReadyEvent extends Event {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
return HANDLERS;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Load default configuration.
|
||||
*
|
||||
* @return True if successful.
|
||||
*/
|
||||
public static boolean loadDefaultConfig() {
|
||||
|
|
@ -36,6 +37,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Load non default configuration.
|
||||
*
|
||||
* @return True if successful.
|
||||
*/
|
||||
public static boolean loadNonDefaultConfig() {
|
||||
|
|
@ -122,8 +124,7 @@ public abstract class ConfigHolder {
|
|||
try {
|
||||
config.save(base);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
CustomAnvil.instance.getLogger().severe("Could not save config...");
|
||||
CustomAnvil.instance.getLogger().log(Level.SEVERE, "Could not save config...", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -137,6 +138,7 @@ public abstract class ConfigHolder {
|
|||
boolean sufficientSuccess = false;
|
||||
|
||||
BACKUP_FOLDER.mkdirs();
|
||||
|
||||
// save first backup if do not exist
|
||||
File firstBackup = getFirstBackup();
|
||||
if (!firstBackup.exists()) {
|
||||
|
|
@ -158,7 +160,7 @@ public abstract class ConfigHolder {
|
|||
Files.move(base, lastBackup);
|
||||
sufficientSuccess = true;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
CustomAnvil.instance.getLogger().log(Level.SEVERE, "Exception while moving backup file " + base.getName(), e);
|
||||
}
|
||||
|
||||
return sufficientSuccess;
|
||||
|
|
@ -221,6 +223,7 @@ public abstract class ConfigHolder {
|
|||
private final @NotNull File deletedConfigFile;
|
||||
|
||||
private @Nullable YamlConfiguration deletedListConfig;
|
||||
|
||||
private DeletableResource(String resourceName) {
|
||||
super(resourceName);
|
||||
this.parent = new File(CustomAnvil.instance.getDataFolder(), DELETED_FOLDER_PATH);
|
||||
|
|
@ -242,6 +245,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Test if the provided element was deleted.
|
||||
*
|
||||
* @param objectPath The object path to delete.
|
||||
* @return True if successful.
|
||||
*/
|
||||
|
|
@ -253,6 +257,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Delete a certain object by its path. do not save the config.
|
||||
*
|
||||
* @param objectPath The object path to delete.
|
||||
* @return True if successful.
|
||||
*/
|
||||
|
|
@ -262,6 +267,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Delete a certain object by its path.
|
||||
*
|
||||
* @param objectPath The object path to delete.
|
||||
* @param doSave If we should save the config after deleting.
|
||||
* @param doBackup If we should create a backup.
|
||||
|
|
@ -272,7 +278,9 @@ public abstract class ConfigHolder {
|
|||
if (this.deletedListConfig == null) {
|
||||
this.parent.mkdirs();
|
||||
try {
|
||||
this.deletedConfigFile.createNewFile();
|
||||
if (!this.deletedConfigFile.createNewFile()) {
|
||||
throw new RuntimeException("Could not create \"deleted config\" file");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not create " + this.deletedConfigFile.getPath(), e);
|
||||
}
|
||||
|
|
@ -303,6 +311,7 @@ public abstract class ConfigHolder {
|
|||
|
||||
/**
|
||||
* Save list of deleted elements.
|
||||
*
|
||||
* @return true if successful.
|
||||
*/
|
||||
public boolean saveDeletedList() {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.enchant;
|
|||
|
||||
import io.delilaheve.CustomAnvil;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.Registry;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||
|
|
@ -53,9 +53,9 @@ public class CAEnchantmentRegistry {
|
|||
*/
|
||||
public void registerBukkit() {
|
||||
// Register enchantment
|
||||
for (Enchantment enchantment : Enchantment.values()) {
|
||||
register(new CABukkitEnchantment(enchantment));
|
||||
}
|
||||
Registry.ENCHANTMENT.iterator().forEachRemaining(enchantment ->
|
||||
register(new CABukkitEnchantment(enchantment))
|
||||
);
|
||||
|
||||
// Add bukkit enchantment bulk operation
|
||||
BukkitEnchantBulkOperation bukkitOperation = new BukkitEnchantBulkOperation();
|
||||
|
|
|
|||
|
|
@ -33,9 +33,9 @@ public class BukkitEnchantBulkOperation implements BulkGetEnchantOperation, Bulk
|
|||
}
|
||||
|
||||
public void addEnchantment(@NotNull Map<CAEnchantment, Integer> enchantmentMap, @NotNull Enchantment enchantment, int level) {
|
||||
CAEnchantment enchant = EnchantmentApi.getByKey(enchantment.getKey());
|
||||
CAEnchantment enchant = EnchantmentApi.getByKey(enchantment.getKeyOrThrow());
|
||||
if (enchant == null) {
|
||||
CustomAnvil.instance.getLogger().warning("Enchantment of key " + enchantment.getKey() +
|
||||
CustomAnvil.instance.getLogger().warning("Enchantment of key " + enchantment.getKeyOrThrow() +
|
||||
" somehow not found in CustomAnvil ?");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
|
|||
public final @NotNull Enchantment bukkit;
|
||||
|
||||
public CABukkitEnchantment(@NotNull Enchantment bukkit, @Nullable EnchantmentRarity rarity) {
|
||||
super(bukkit.getKey(),
|
||||
super(bukkit.getKeyOrThrow(),
|
||||
rarity,
|
||||
bukkit.getMaxLevel());
|
||||
this.bukkit = bukkit;
|
||||
|
|
@ -103,8 +103,8 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
|
|||
@NotNull
|
||||
public static EnchantmentRarity getRarity(Enchantment enchantment) {
|
||||
try {
|
||||
return EnchantmentProperties.valueOf(enchantment.getKey().getKey().toUpperCase(Locale.ENGLISH)).getRarity();
|
||||
} catch (IllegalArgumentException ignored) {
|
||||
return EnchantmentProperties.valueOf(enchantment.getKeyOrThrow().getKey().toUpperCase(Locale.ENGLISH)).getRarity();
|
||||
} catch (Exception ignored) {
|
||||
return findRarity(enchantment);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
|||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry;
|
||||
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
||||
import xyz.alexcrea.cuanvil.gui.config.list.SettingGuiListConfigGui;
|
||||
import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui;
|
||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||
|
|
@ -104,6 +103,7 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
|
|||
protected List<String> getCreateItemLore() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Consumer<InventoryClickEvent> getCreateClickConsumer() {
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Global config to edit basic basic settings.
|
||||
|
|
@ -188,7 +189,7 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
|
|||
range = ConfigOptions.ITEM_RENAME_COST_RANGE;
|
||||
this.itemRenameCost = new IntSettingsGui.IntSettingFactory("§8Rename Cost", this,
|
||||
ConfigOptions.ITEM_RENAME_COST, ConfigHolder.DEFAULT_CONFIG,
|
||||
Arrays.asList(
|
||||
List.of(
|
||||
"§7XP Level amount added to the anvil when the item is renamed."
|
||||
),
|
||||
range.getFirst(), range.getLast(),
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||
import org.jetbrains.annotations.Nullable;
|
||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
||||
import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties;
|
||||
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
|
||||
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui;
|
||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ import xyz.alexcrea.cuanvil.group.ItemGroupManager;
|
|||
import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui;
|
||||
import xyz.alexcrea.cuanvil.gui.config.list.elements.GroupConfigSubSettingGui;
|
||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||
import xyz.alexcrea.cuanvil.util.LazyValue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package xyz.alexcrea.cuanvil.gui.config.list.elements;
|
||||
|
||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
|
||||
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||
import io.delilaheve.CustomAnvil;
|
||||
|
|
|
|||
|
|
@ -21,10 +21,7 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class DoubleSettingGui extends AbstractSettingGui {
|
||||
|
|
@ -413,11 +410,7 @@ public class DoubleSettingGui extends AbstractSettingGui {
|
|||
this.steps[i] = BigDecimal.valueOf(steps[i]).setScale(scale, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
if(displayLore == null){
|
||||
this.displayLore = Collections.emptyList();
|
||||
}else {
|
||||
this.displayLore = displayLore;
|
||||
}
|
||||
this.displayLore = Objects.requireNonNullElse(displayLore, Collections.emptyList());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
|||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
|
|
@ -321,11 +322,7 @@ public class IntSettingsGui extends AbstractSettingGui {
|
|||
this.defaultVal = defaultVal;
|
||||
this.steps = steps;
|
||||
|
||||
if(displayLore == null){
|
||||
this.displayLore = Collections.emptyList();
|
||||
}else {
|
||||
this.displayLore = displayLore;
|
||||
}
|
||||
this.displayLore = Objects.requireNonNullElse(displayLore, Collections.emptyList());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -26,25 +26,24 @@ public class PUpdate_1_8_0 {
|
|||
partEnum = new EnumMap<>(ConfigOptions.INSTANCE.getWorkPenaltyType().getPartMap());
|
||||
|
||||
boolean keepIncrease;
|
||||
boolean keepAdditive;
|
||||
|
||||
switch (penaltyTypeValue.toLowerCase()) {
|
||||
case "add_only":
|
||||
boolean keepAdditive = switch (penaltyTypeValue.toLowerCase()) {
|
||||
case "add_only" -> {
|
||||
keepIncrease = false;
|
||||
keepAdditive = true;
|
||||
break;
|
||||
case "increase_only":
|
||||
keepIncrease = true;
|
||||
keepAdditive = false;
|
||||
break;
|
||||
case "disabled":
|
||||
keepIncrease = false;
|
||||
keepAdditive = false;
|
||||
break;
|
||||
default:
|
||||
keepIncrease = true;
|
||||
keepAdditive = true;
|
||||
yield true;
|
||||
}
|
||||
case "increase_only" -> {
|
||||
keepIncrease = true;
|
||||
yield false;
|
||||
}
|
||||
case "disabled" -> {
|
||||
keepIncrease = false;
|
||||
yield false;
|
||||
}
|
||||
default -> {
|
||||
keepIncrease = true;
|
||||
yield true;
|
||||
}
|
||||
};
|
||||
|
||||
for (AnvilUseType type : partEnum.keySet()) {
|
||||
WorkPenaltyType.WorkPenaltyPart part = partEnum.get(type);
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ object ConfigOptions {
|
|||
const val DEFAULT_ITEM_RENAME_COST = 1
|
||||
|
||||
const val DEFAULT_SACRIFICE_ILLEGAL_COST = 1
|
||||
const val DEFAULT_ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT = false;
|
||||
const val DEFAULT_ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT = false
|
||||
|
||||
const val DEFAULT_ENCHANT_COUNT_LIMIT = -1
|
||||
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ import org.bukkit.entity.HumanEntity
|
|||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
import org.bukkit.inventory.AnvilInventory
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import xyz.alexcrea.cuanvil.api.event.listener.CAClickResultBypassEvent
|
||||
import xyz.alexcrea.cuanvil.api.event.listener.CAEarlyPreAnvilBypassEvent
|
||||
import xyz.alexcrea.cuanvil.api.event.listener.CAPreAnvilBypassEvent
|
||||
import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
||||
import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency
|
||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||
|
|
@ -28,23 +28,25 @@ import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT
|
|||
import xyz.alexcrea.cuanvil.util.AnvilUseType
|
||||
import java.util.logging.Level
|
||||
|
||||
|
||||
@Suppress("unstableApiUsage")
|
||||
object DependencyManager {
|
||||
|
||||
var isFolia: Boolean = false
|
||||
lateinit var scheduler: TaskScheduler
|
||||
lateinit var packetManager: PacketManager
|
||||
var externGuiTester: ExternGuiTester? = null
|
||||
private var externGuiTester: ExternGuiTester? = null
|
||||
|
||||
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
|
||||
var ecoEnchantCompatibility: EcoEnchantDependency? = null
|
||||
var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
|
||||
private var ecoEnchantCompatibility: EcoEnchantDependency? = null
|
||||
private var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
|
||||
|
||||
var disenchantmentCompatibility: DisenchantmentDependency? = null
|
||||
var havenBagsCompatibility: HavenBagsDependency? = null
|
||||
private var disenchantmentCompatibility: DisenchantmentDependency? = null
|
||||
private var havenBagsCompatibility: HavenBagsDependency? = null
|
||||
|
||||
var axPlayerWarpsCompatibility: AxPlayerWarpsDependency? = null
|
||||
|
||||
val genericDependencies = ArrayList<GenericPluginDependency>()
|
||||
private val genericDependencies = ArrayList<GenericPluginDependency>()
|
||||
|
||||
fun loadDependency() {
|
||||
val pluginManager = Bukkit.getPluginManager()
|
||||
|
|
@ -128,7 +130,7 @@ object DependencyManager {
|
|||
ecoEnchantCompatibility?.handleConfigReload()
|
||||
}
|
||||
|
||||
// Return true if should bypass (either by a dependency or error)
|
||||
// Return true if we should bypass (either by a dependency or error)
|
||||
// called before immutability test
|
||||
fun earlyTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
|
||||
try {
|
||||
|
|
@ -168,7 +170,7 @@ object DependencyManager {
|
|||
return bypass
|
||||
}
|
||||
|
||||
// Return true if should bypass (either by a dependency or error)
|
||||
// Return true if we should bypass (either by a dependency or error)
|
||||
fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
|
||||
try {
|
||||
return unsafeTryEventPreAnvilBypass(event, player)
|
||||
|
|
@ -247,10 +249,10 @@ object DependencyManager {
|
|||
excellentEnchantsCompatibility?.treatAnvilResult(event)
|
||||
}
|
||||
|
||||
// Return true if should bypass (either by a dependency or error)
|
||||
fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
||||
// Return true if we should bypass (either by a dependency or error)
|
||||
fun tryClickAnvilResultBypass(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||
try {
|
||||
return unsafeTryClickAnvilResultBypass(event, inventory)
|
||||
return unsafeTryClickAnvilResultBypass(event, view)
|
||||
} catch (e: Exception) {
|
||||
CustomAnvil.instance.logger.log(
|
||||
Level.SEVERE,
|
||||
|
|
@ -270,7 +272,7 @@ object DependencyManager {
|
|||
}
|
||||
}
|
||||
|
||||
private fun unsafeTryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
||||
private fun unsafeTryClickAnvilResultBypass(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||
// Run the event
|
||||
val bypassEvent = CAClickResultBypassEvent(event)
|
||||
Bukkit.getPluginManager().callEvent(bypassEvent)
|
||||
|
|
@ -278,10 +280,10 @@ object DependencyManager {
|
|||
var bypass = bypassEvent.isCancelled
|
||||
|
||||
// Test if disenchantment used event click
|
||||
if (!bypass && (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
|
||||
if (!bypass && (disenchantmentCompatibility?.testAnvilResult(event, view) == true)) bypass = true
|
||||
|
||||
// Test if haven bag used event click
|
||||
if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
|
||||
if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, view) == true)) bypass = true
|
||||
|
||||
// Test if disenchantment used event click
|
||||
if (!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true
|
||||
|
|
|
|||
|
|
@ -22,13 +22,13 @@ object DataPackDependency {
|
|||
/**
|
||||
* Map of the latest CustomAnvil update related to the pack
|
||||
*/
|
||||
private val LASTEST_VERSION = mapOf(
|
||||
private val LATEST_VERSION = mapOf(
|
||||
Pair("bracken", Version(1, 11, 0)),
|
||||
Pair("enchantplus", Version(1, 13, 0)),
|
||||
Pair("dungeons_and_taverns", Version(1, 13, 0))
|
||||
)
|
||||
|
||||
val enabledDatapacks: List<String>
|
||||
private val enabledDatapacks: List<String>
|
||||
get() {
|
||||
val version: Version = UpdateUtils.currentMinecraftVersion()
|
||||
if (version.lesserThan(START_DETECT_VERSION)) return emptyList()
|
||||
|
|
@ -71,7 +71,7 @@ object DataPackDependency {
|
|||
|
||||
private fun handlePackInitialConfig(pack: String) {
|
||||
val defConfig = ConfigHolder.DEFAULT_CONFIG
|
||||
val version = LASTEST_VERSION[pack]
|
||||
val version = LATEST_VERSION[pack]
|
||||
if(version == null) {
|
||||
throw RuntimeException("The pack $pack has no latest version hard coded in the plugin")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
package xyz.alexcrea.cuanvil.dependency.packet
|
||||
|
||||
import org.bukkit.Bukkit
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.versions.*
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.versions.V1_21R1_PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.versions.V1_21R2_PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.versions.V1_21R3_PacketManager
|
||||
import xyz.alexcrea.cuanvil.dependency.packet.versions.V1_21R4_PacketManager
|
||||
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
||||
|
||||
object PacketManagerSelector {
|
||||
|
|
|
|||
|
|
@ -9,11 +9,13 @@ import io.delilaheve.CustomAnvil
|
|||
import org.bukkit.entity.HumanEntity
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
import org.bukkit.inventory.AnvilInventory
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
||||
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
||||
|
||||
|
||||
@Suppress("unstableApiUsage")
|
||||
class DisenchantmentDependency {
|
||||
|
||||
init {
|
||||
|
|
@ -33,14 +35,14 @@ class DisenchantmentDependency {
|
|||
DisenchantEvent.onEvent(event)
|
||||
if (event.result != null) {
|
||||
CustomAnvil.log("Detected pre anvil item extract bypass.")
|
||||
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player)
|
||||
return true
|
||||
}
|
||||
|
||||
ShatterEvent.onEvent(event)
|
||||
if (event.result != null) {
|
||||
CustomAnvil.log("Detected pre anvil split enchant bypass.")
|
||||
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player)
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
@ -48,18 +50,18 @@ class DisenchantmentDependency {
|
|||
return false
|
||||
}
|
||||
|
||||
fun testAnvilResult(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
||||
val previousResultSlot = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||
fun testAnvilResult(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||
val previousResultSlot = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||
|
||||
// Test event if change the result
|
||||
DisenchantClickEvent.onEvent(event)
|
||||
if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
|
||||
if (!testAnvilInventoryChange(view, previousResultSlot) || event.isCancelled) {
|
||||
CustomAnvil.log("Detected anvil click item extract bypass.")
|
||||
return true
|
||||
}
|
||||
|
||||
ShatterClickEvent.onEvent(event)
|
||||
if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
|
||||
if (!testAnvilInventoryChange(view, previousResultSlot) || event.isCancelled) {
|
||||
CustomAnvil.log("Detected anvil click split enchant bypass.")
|
||||
return true
|
||||
}
|
||||
|
|
@ -67,8 +69,8 @@ class DisenchantmentDependency {
|
|||
return false
|
||||
}
|
||||
|
||||
private fun testAnvilInventoryChange(inventory: AnvilInventory, previous: ItemStack?): Boolean {
|
||||
val currentResult = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)
|
||||
private fun testAnvilInventoryChange(view: AnvilView, previous: ItemStack?): Boolean {
|
||||
val currentResult = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)
|
||||
|
||||
return currentResult == previous
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class ExcellentEnchantsDependency {
|
|||
|
||||
// As excellent enchants is loaded before custom anvil and register enchantment to registry, we need to unregister old "vanilla" enchant.
|
||||
for (enchantment in V5EnchantRegistry.getRegistered()) {
|
||||
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
|
||||
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.keyOrThrow)
|
||||
EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ abstract class GenericPluginDependency(protected val plugin: Plugin) {
|
|||
if (event.result != null) return true
|
||||
}
|
||||
|
||||
event.result = previousResult;
|
||||
event.result = previousResult
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import io.delilaheve.CustomAnvil
|
|||
import org.bukkit.entity.HumanEntity
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
import org.bukkit.inventory.AnvilInventory
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import org.bukkit.plugin.RegisteredListener
|
||||
import valorless.havenbags.HavenBags
|
||||
import valorless.havenbags.features.BagSkin
|
||||
|
|
@ -12,6 +12,7 @@ import valorless.havenbags.features.BagUpgrade
|
|||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
||||
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
||||
|
||||
@Suppress("unstableApiUsage")
|
||||
class HavenBagsDependency {
|
||||
|
||||
init {
|
||||
|
|
@ -53,14 +54,14 @@ class HavenBagsDependency {
|
|||
bagSkin.onPrepareAnvil(event)
|
||||
if (event.result != null) {
|
||||
CustomAnvil.log("Detected pre anvil heaven bag anvil skin.")
|
||||
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player)
|
||||
return true
|
||||
}
|
||||
|
||||
bagUpgrade.onPrepareAnvil(event)
|
||||
if (event.result != null) {
|
||||
CustomAnvil.log("Detected pre anvil heaven bag anvil upgrade.")
|
||||
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player)
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
@ -68,8 +69,8 @@ class HavenBagsDependency {
|
|||
return false
|
||||
}
|
||||
|
||||
fun testAnvilResult(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
||||
val result = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||
fun testAnvilResult(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||
val result = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||
|
||||
if (HavenBags.IsBag(result)) {
|
||||
CustomAnvil.log("Detected anvil click haven bag bypass.")
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
|
|||
|
||||
// Sadly, getTokens function is private, so I need to do that
|
||||
private val getTokenMethod: Method =
|
||||
ItemChecker::class.java.getDeclaredMethod("getTokens", ItemStack::class.java);
|
||||
ItemChecker::class.java.getDeclaredMethod("getTokens", ItemStack::class.java)
|
||||
|
||||
init {
|
||||
getTokenMethod.trySetAccessible()
|
||||
|
|
@ -38,6 +38,6 @@ class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
|
|||
val leftTokens = itemChecker.getTokenSafe(left)
|
||||
val resultToken = itemChecker.getTokenSafe(result)
|
||||
|
||||
return !leftTokens.contentDeepEquals(resultToken);
|
||||
return !leftTokens.contentDeepEquals(resultToken)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,12 @@ import org.bukkit.plugin.Plugin
|
|||
|
||||
class BukkitScheduler : TaskScheduler {
|
||||
|
||||
override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any? {
|
||||
override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any {
|
||||
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
|
||||
}
|
||||
|
||||
|
||||
override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? {
|
||||
override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any {
|
||||
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ class EnchantConflictManager {
|
|||
// 1.20.5 compatibility TODO better update system
|
||||
private val SWEEPING_EDGE_ENCHANT = Collections.singletonList<CAEnchantment>(
|
||||
CAEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge"))
|
||||
?: CAEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key)
|
||||
?: CAEnchantment.getByKey(Enchantment.SWEEPING_EDGE.keyOrThrow)
|
||||
)
|
||||
|
||||
}
|
||||
|
|
@ -176,7 +176,7 @@ class EnchantConflictManager {
|
|||
newEnchant: CAEnchantment
|
||||
): ConflictType {
|
||||
val mat = item.type
|
||||
CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}")
|
||||
CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.keyOrThrow}")
|
||||
val conflictList = newEnchant.conflicts
|
||||
|
||||
var result = ConflictType.NO_CONFLICT
|
||||
|
|
|
|||
|
|
@ -12,10 +12,9 @@ import org.bukkit.event.EventHandler
|
|||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.inventory.ClickType
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.inventory.AnvilInventory
|
||||
import org.bukkit.inventory.InventoryView
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.BookMeta
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT
|
||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT
|
||||
|
|
@ -32,6 +31,7 @@ import java.util.*
|
|||
import java.util.concurrent.atomic.AtomicInteger
|
||||
import kotlin.math.min
|
||||
|
||||
@Suppress("unstableApiUsage")
|
||||
class AnvilResultListener : Listener {
|
||||
|
||||
companion object {
|
||||
|
|
@ -46,22 +46,22 @@ class AnvilResultListener : Listener {
|
|||
@EventHandler(ignoreCancelled = true)
|
||||
fun anvilExtractionCheck(event: InventoryClickEvent) {
|
||||
val player = event.whoClicked as? Player ?: return
|
||||
val inventory = event.inventory as? AnvilInventory ?: return
|
||||
val view = event.view as? AnvilView ?: return
|
||||
|
||||
if (event.rawSlot != ANVIL_OUTPUT_SLOT) {
|
||||
return
|
||||
}
|
||||
|
||||
// Test if the event should bypass custom anvil.
|
||||
if (DependencyManager.tryClickAnvilResultBypass(event, inventory)) return
|
||||
if (DependencyManager.tryClickAnvilResultBypass(event, view)) return
|
||||
|
||||
if (!player.hasPermission(CustomAnvil.affectedByPluginPermission)) return
|
||||
|
||||
val output = inventory.getItem(ANVIL_OUTPUT_SLOT) ?: return
|
||||
val leftItem = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||
val rightItem = inventory.getItem(ANVIL_INPUT_RIGHT)
|
||||
val output = view.getItem(ANVIL_OUTPUT_SLOT) ?: return
|
||||
val leftItem = view.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||
val rightItem = view.getItem(ANVIL_INPUT_RIGHT)
|
||||
|
||||
if (GameMode.CREATIVE != player.gameMode && inventory.repairCost >= inventory.maximumRepairCost) {
|
||||
if (GameMode.CREATIVE != player.gameMode && view.repairCost >= view.maximumRepairCost) {
|
||||
event.result = Event.Result.DENY
|
||||
return
|
||||
}
|
||||
|
|
@ -72,13 +72,13 @@ class AnvilResultListener : Listener {
|
|||
event.result = Event.Result.ALLOW
|
||||
onCustomCraft(
|
||||
event, recipe, player,
|
||||
leftItem, rightItem, output, inventory
|
||||
leftItem, rightItem, output, view
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
// Do not continue if there was no change
|
||||
if ((output == inventory.getItem(ANVIL_INPUT_LEFT))) {
|
||||
if ((output == view.getItem(ANVIL_INPUT_LEFT))) {
|
||||
event.result = Event.Result.DENY
|
||||
return
|
||||
}
|
||||
|
|
@ -101,15 +101,15 @@ class AnvilResultListener : Listener {
|
|||
if (unitRepairResult != null) {
|
||||
onUnitRepairExtract(
|
||||
leftItem, rightItem, output,
|
||||
unitRepairResult, event, player, inventory
|
||||
unitRepairResult, event, player, view
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
// For lore edit
|
||||
if (handleBookLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
|
||||
if (handleBookLoreEdit(event, view, player, leftItem, rightItem, output)) {
|
||||
return
|
||||
} else if (handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
|
||||
} else if (handlePaperLoreEdit(event, view, player, leftItem, rightItem, output)) {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -124,7 +124,7 @@ class AnvilResultListener : Listener {
|
|||
leftItem: ItemStack,
|
||||
rightItem: ItemStack?,
|
||||
output: ItemStack,
|
||||
inventory: AnvilInventory
|
||||
view: AnvilView
|
||||
) {
|
||||
event.result = Event.Result.DENY
|
||||
|
||||
|
|
@ -154,9 +154,7 @@ class AnvilResultListener : Listener {
|
|||
// Handle not creative middle click...
|
||||
if (event.click != ClickType.MIDDLE &&
|
||||
!handleCustomCraftClick(
|
||||
event,
|
||||
recipe,
|
||||
inventory,
|
||||
recipe, view,
|
||||
player,
|
||||
leftItem,
|
||||
rightItem,
|
||||
|
|
@ -175,8 +173,8 @@ class AnvilResultListener : Listener {
|
|||
}
|
||||
|
||||
private fun handleCustomCraftClick(
|
||||
event: InventoryClickEvent, recipe: AnvilCustomRecipe,
|
||||
inventory: AnvilInventory, player: Player,
|
||||
recipe: AnvilCustomRecipe,
|
||||
view: AnvilView, player: Player,
|
||||
leftItem: ItemStack, rightItem: ItemStack?,
|
||||
amount: Int, xpCost: Int, linearCost: Boolean = false
|
||||
): Boolean {
|
||||
|
|
@ -185,11 +183,11 @@ class AnvilResultListener : Listener {
|
|||
if (recipe.rightItem == null) return false// in case it changed
|
||||
|
||||
rightItem.amount -= amount * recipe.rightItem!!.amount
|
||||
inventory.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
||||
view.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
||||
}
|
||||
|
||||
leftItem.amount -= amount * recipe.leftItem!!.amount
|
||||
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||
view.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||
|
||||
if (player.gameMode != GameMode.CREATIVE) {
|
||||
if (linearCost) {
|
||||
|
|
@ -216,17 +214,16 @@ class AnvilResultListener : Listener {
|
|||
|
||||
CustomAnvil.verboseLog("new amount is $newAmount")
|
||||
if (newAmount <= 0 || recipe.exactCount) {
|
||||
inventory.setItem(ANVIL_OUTPUT_SLOT, null)
|
||||
view.setItem(ANVIL_OUTPUT_SLOT, null)
|
||||
} else {
|
||||
val resultItem: ItemStack = recipe.resultItem!!.clone()
|
||||
resultItem.amount *= newAmount
|
||||
|
||||
val newXp = newAmount * newAmount
|
||||
|
||||
inventory.repairCost = newXp
|
||||
event.view.setProperty(InventoryView.Property.REPAIR_COST, newXp)
|
||||
view.repairCost = newXp
|
||||
|
||||
inventory.setItem(ANVIL_OUTPUT_SLOT, resultItem)
|
||||
view.setItem(ANVIL_OUTPUT_SLOT, resultItem)
|
||||
|
||||
player.updateInventory()
|
||||
}
|
||||
|
|
@ -236,7 +233,7 @@ class AnvilResultListener : Listener {
|
|||
private fun extractAnvilResult(
|
||||
event: InventoryClickEvent,
|
||||
player: Player,
|
||||
inventory: AnvilInventory,
|
||||
view: AnvilView,
|
||||
leftItem: ItemStack?,
|
||||
leftRemoveCount: Int,
|
||||
rightItem: ItemStack?,
|
||||
|
|
@ -259,12 +256,12 @@ class AnvilResultListener : Listener {
|
|||
if (event.click != ClickType.MIDDLE) {
|
||||
// We remove what should be removed
|
||||
if (leftItem != null) leftItem.amount -= leftRemoveCount
|
||||
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||
view.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||
|
||||
if (rightItem != null) rightItem.amount -= rightRemoveCount
|
||||
inventory.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
||||
view.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
||||
|
||||
inventory.setItem(ANVIL_OUTPUT_SLOT, null)
|
||||
view.setItem(ANVIL_OUTPUT_SLOT, null)
|
||||
player.level -= repairCost
|
||||
}
|
||||
|
||||
|
|
@ -286,7 +283,7 @@ class AnvilResultListener : Listener {
|
|||
unitRepairResult: Double,
|
||||
event: InventoryClickEvent,
|
||||
player: Player,
|
||||
inventory: AnvilInventory
|
||||
view: AnvilView
|
||||
) {
|
||||
val resultCopy = leftItem.clone()
|
||||
val resultAmount = resultCopy.unitRepair(
|
||||
|
|
@ -294,11 +291,11 @@ class AnvilResultListener : Listener {
|
|||
)
|
||||
|
||||
// Get repair cost
|
||||
val repairCost = getUnitRepairCost(inventory, player, leftItem, output, resultCopy, resultAmount)
|
||||
val repairCost = getUnitRepairCost(view, player, leftItem, output, resultCopy, resultAmount)
|
||||
|
||||
// And then we give the item manually
|
||||
extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
null, 0,
|
||||
rightItem, resultAmount,
|
||||
resultCopy, repairCost
|
||||
|
|
@ -306,7 +303,7 @@ class AnvilResultListener : Listener {
|
|||
}
|
||||
|
||||
private fun getUnitRepairCost(
|
||||
inventory: AnvilInventory, player: Player,
|
||||
view: AnvilView, player: Player,
|
||||
leftItem: ItemStack, output: ItemStack,
|
||||
resultCopy: ItemStack, resultAmount: Int
|
||||
): Int {
|
||||
|
|
@ -339,7 +336,7 @@ class AnvilResultListener : Listener {
|
|||
repairCost = min(repairCost, ConfigOptions.maxAnvilCost)
|
||||
}
|
||||
|
||||
if ((inventory.maximumRepairCost <= repairCost)
|
||||
if ((view.maximumRepairCost <= repairCost)
|
||||
|| (player.level < repairCost)
|
||||
) return Int.MIN_VALUE
|
||||
|
||||
|
|
@ -349,12 +346,12 @@ class AnvilResultListener : Listener {
|
|||
private fun getFromLoreEditXpCost(
|
||||
xpCost: AtomicInteger,
|
||||
player: Player,
|
||||
inventory: AnvilInventory,
|
||||
view: AnvilView,
|
||||
): Int {
|
||||
if (GameMode.CREATIVE == player.gameMode) return 0
|
||||
|
||||
val repairCost = xpCost.get()
|
||||
return if ((inventory.maximumRepairCost <= repairCost)
|
||||
return if ((view.maximumRepairCost <= repairCost)
|
||||
|| (player.level < repairCost)
|
||||
) Int.MIN_VALUE
|
||||
else repairCost
|
||||
|
|
@ -362,7 +359,7 @@ class AnvilResultListener : Listener {
|
|||
|
||||
private fun handleBookLoreEdit(
|
||||
event: InventoryClickEvent,
|
||||
inventory: AnvilInventory,
|
||||
view: AnvilView,
|
||||
player: Player,
|
||||
leftItem: ItemStack,
|
||||
rightItem: ItemStack,
|
||||
|
|
@ -388,10 +385,10 @@ class AnvilResultListener : Listener {
|
|||
}
|
||||
|
||||
return extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
null, 0,
|
||||
clearedBook, 0,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
} else {
|
||||
if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, xpCost)) return false
|
||||
|
|
@ -424,17 +421,17 @@ class AnvilResultListener : Listener {
|
|||
}
|
||||
|
||||
return extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
null, 0,
|
||||
rightCopy, 0,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handlePaperLoreEdit(
|
||||
event: InventoryClickEvent,
|
||||
inventory: AnvilInventory,
|
||||
view: AnvilView,
|
||||
player: Player,
|
||||
leftItem: ItemStack,
|
||||
rightItem: ItemStack,
|
||||
|
|
@ -462,17 +459,17 @@ class AnvilResultListener : Listener {
|
|||
|
||||
return if (rightItem.amount > 1) {
|
||||
extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
paperCopy, 0,
|
||||
rightItem, 1,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
} else {
|
||||
extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
null, 0,
|
||||
paperCopy, 0,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
}
|
||||
} else {
|
||||
|
|
@ -508,17 +505,17 @@ class AnvilResultListener : Listener {
|
|||
|
||||
return if (rightItem.amount > 1) {
|
||||
extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
rightClone, 0,
|
||||
rightItem, 1,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
} else {
|
||||
extractAnvilResult(
|
||||
event, player, inventory,
|
||||
event, player, view,
|
||||
null, 0,
|
||||
rightClone, 0,
|
||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
||||
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class ChatEventListener : Listener {
|
|||
|
||||
private val playerListenMap: ConcurrentHashMap<UUID, Consumer<String?>> = ConcurrentHashMap()
|
||||
|
||||
fun setListenedCallback(playeruuid: UUID, callback: Consumer<String?>) {
|
||||
private fun setListenedCallback(playeruuid: UUID, callback: Consumer<String?>) {
|
||||
playerListenMap[playeruuid] = callback
|
||||
}
|
||||
|
||||
|
|
@ -41,9 +41,10 @@ class ChatEventListener : Listener {
|
|||
// sync callback with default server thread
|
||||
DependencyManager.scheduler.scheduleOnEntity(
|
||||
CustomAnvil.instance, player,
|
||||
Runnable {
|
||||
{
|
||||
eventCallback.accept(event.message)
|
||||
}, 0L)
|
||||
}, 0L
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
package xyz.alexcrea.cuanvil.listener
|
||||
|
||||
import com.github.stefvanschie.inventoryframework.util.InventoryViewUtil
|
||||
import io.delilaheve.CustomAnvil
|
||||
import io.delilaheve.util.ConfigOptions
|
||||
import io.delilaheve.util.EnchantmentUtil.combineWith
|
||||
|
|
@ -17,10 +16,10 @@ import org.bukkit.event.EventHandler
|
|||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||
import org.bukkit.inventory.AnvilInventory
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta
|
||||
import org.bukkit.inventory.meta.ItemMeta
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
|
||||
import xyz.alexcrea.cuanvil.util.*
|
||||
|
|
@ -30,6 +29,7 @@ import java.util.concurrent.atomic.AtomicInteger
|
|||
/**
|
||||
* Listener for anvil events
|
||||
*/
|
||||
@Suppress("unstableApiUsage")
|
||||
class PrepareAnvilListener : Listener {
|
||||
|
||||
companion object {
|
||||
|
|
@ -46,18 +46,18 @@ class PrepareAnvilListener : Listener {
|
|||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
fun anvilCombineCheck(event: PrepareAnvilEvent) {
|
||||
// Should find player
|
||||
val player: HumanEntity = InventoryViewUtil.getInstance().getPlayer(event.view)
|
||||
val inventory = event.inventory
|
||||
val view = event.view
|
||||
val player: HumanEntity = view.player
|
||||
|
||||
// Test if custom anvil is bypassed before immutability test
|
||||
if (DependencyManager.earlyTryEventPreAnvilBypass(event, player)) {
|
||||
// even if we got bypassed we still want to set price
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, event.inventory.repairCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player, event.inventory.repairCost)
|
||||
return
|
||||
}
|
||||
|
||||
val first = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||
val second = inventory.getItem(ANVIL_INPUT_RIGHT)
|
||||
val first = view.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||
val second = view.getItem(ANVIL_INPUT_RIGHT)
|
||||
|
||||
if (isImmutable(first) || isImmutable(second)) {
|
||||
CustomAnvil.verboseLog("Skipping anvil process as one of the two item is immutable")
|
||||
|
|
@ -76,25 +76,25 @@ class PrepareAnvilListener : Listener {
|
|||
if (!player.hasPermission(CustomAnvil.affectedByPluginPermission)) return
|
||||
|
||||
// Test custom recipe
|
||||
if (testCustomRecipe(event, inventory, player, first, second)) return
|
||||
if (testCustomRecipe(event, player, first, second)) return
|
||||
|
||||
// Test rename lonely item
|
||||
if (second == null) {
|
||||
doRenaming(event, inventory, player, first)
|
||||
doRenaming(event, view, player, first)
|
||||
return
|
||||
}
|
||||
|
||||
// Test for merge
|
||||
if (first.canMergeWith(second)) {
|
||||
doMerge(event, inventory, player, first, second)
|
||||
doMerge(event, view, player, first, second)
|
||||
return
|
||||
}
|
||||
|
||||
// Test for unit repair
|
||||
if (testUnitRepair(event, inventory, player, first, second)) return
|
||||
if (testUnitRepair(event, view, player, first, second)) return
|
||||
|
||||
// Test for lore edit
|
||||
if (testLoreEdit(event, inventory, player, first, second)) return
|
||||
if (testLoreEdit(event, view, player, first, second)) return
|
||||
|
||||
CustomAnvil.log("no anvil fuse type found")
|
||||
event.result = null
|
||||
|
|
@ -113,7 +113,7 @@ class PrepareAnvilListener : Listener {
|
|||
if (!meta.hasEnchants()) return false
|
||||
|
||||
for (enchant in meta.enchants.keys) {
|
||||
if (ConfigOptions.isImmutable(enchant.key)) return true
|
||||
if (ConfigOptions.isImmutable(enchant.keyOrThrow)) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
@ -122,14 +122,14 @@ class PrepareAnvilListener : Listener {
|
|||
if (meta !is EnchantmentStorageMeta || !meta.hasStoredEnchants()) return false
|
||||
|
||||
for (enchant in meta.storedEnchants.keys) {
|
||||
if (ConfigOptions.isImmutable(enchant.key)) return true
|
||||
if (ConfigOptions.isImmutable(enchant.keyOrThrow)) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// return true if a custom recipe exist with these ingredients
|
||||
private fun testCustomRecipe(
|
||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
||||
event: PrepareAnvilEvent,
|
||||
player: HumanEntity,
|
||||
first: ItemStack, second: ItemStack?
|
||||
): Boolean {
|
||||
|
|
@ -155,16 +155,16 @@ class PrepareAnvilListener : Listener {
|
|||
event.result = finalResult.result
|
||||
if (finalResult.result == null) return false
|
||||
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost, true)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player, finalResult.levelCost, true)
|
||||
return true
|
||||
}
|
||||
|
||||
private fun doRenaming(
|
||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
||||
event: PrepareAnvilEvent, view: AnvilView,
|
||||
player: HumanEntity, first: ItemStack
|
||||
) {
|
||||
val resultItem = first.clone()
|
||||
var anvilCost = handleRename(resultItem, inventory, player)
|
||||
var anvilCost = handleRename(resultItem, view, player)
|
||||
|
||||
// Test/stop if nothing changed.
|
||||
if (first == resultItem) {
|
||||
|
|
@ -181,12 +181,12 @@ class PrepareAnvilListener : Listener {
|
|||
event.result = finalResult.result
|
||||
if (finalResult.result == null) return
|
||||
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
|
||||
AnvilXpUtil.setAnvilInvXp(event.view, player, finalResult.levelCost)
|
||||
}
|
||||
|
||||
private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int {
|
||||
private fun handleRename(resultItem: ItemStack, view: AnvilView, player: HumanEntity): Int {
|
||||
// Can be null
|
||||
var inventoryName = ChatColor.stripColor(inventory.renameText)
|
||||
var inventoryName = ChatColor.stripColor(view.renameText)
|
||||
|
||||
var sumCost = 0
|
||||
var useColor = false
|
||||
|
|
@ -227,7 +227,7 @@ class PrepareAnvilListener : Listener {
|
|||
}
|
||||
|
||||
private fun doMerge(
|
||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
||||
event: PrepareAnvilEvent, view: AnvilView,
|
||||
player: HumanEntity,
|
||||
first: ItemStack, second: ItemStack
|
||||
) {
|
||||
|
|
@ -260,7 +260,7 @@ class PrepareAnvilListener : Listener {
|
|||
// As calculatePenalty edit result, we need to calculate penalty after checking equality
|
||||
anvilCost += AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE)
|
||||
// Calculate rename cost
|
||||
anvilCost += handleRename(resultItem, inventory, player)
|
||||
anvilCost += handleRename(resultItem, view, player)
|
||||
|
||||
// Finally, we set result
|
||||
val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost)
|
||||
|
|
@ -269,7 +269,7 @@ class PrepareAnvilListener : Listener {
|
|||
event.result = finalResult.result
|
||||
if (finalResult.result == null) return
|
||||
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
|
||||
AnvilXpUtil.setAnvilInvXp(view, player, finalResult.levelCost)
|
||||
}
|
||||
|
||||
private fun isIdentical(
|
||||
|
|
@ -286,13 +286,13 @@ class PrepareAnvilListener : Listener {
|
|||
|
||||
// return true if there is a valid unit repair with these ingredients
|
||||
private fun testUnitRepair(
|
||||
event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
|
||||
event: PrepareAnvilEvent, view: AnvilView, player: HumanEntity,
|
||||
first: ItemStack, second: ItemStack
|
||||
): Boolean {
|
||||
val unitRepairAmount = first.getRepair(second) ?: return false
|
||||
|
||||
val resultItem = first.clone()
|
||||
var anvilCost = handleRename(resultItem, inventory, player)
|
||||
var anvilCost = handleRename(resultItem, view, player)
|
||||
|
||||
val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount)
|
||||
if (repairAmount > 0) {
|
||||
|
|
@ -314,12 +314,12 @@ class PrepareAnvilListener : Listener {
|
|||
event.result = finalResult.result
|
||||
if (finalResult.result == null) return false
|
||||
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
|
||||
AnvilXpUtil.setAnvilInvXp(view, player, finalResult.levelCost)
|
||||
return true
|
||||
}
|
||||
|
||||
private fun testLoreEdit(
|
||||
event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
|
||||
event: PrepareAnvilEvent, view: AnvilView, player: HumanEntity,
|
||||
first: ItemStack, second: ItemStack
|
||||
): Boolean {
|
||||
val type = second.type
|
||||
|
|
@ -339,7 +339,7 @@ class PrepareAnvilListener : Listener {
|
|||
}
|
||||
|
||||
event.result = result
|
||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, xpCost.get())
|
||||
AnvilXpUtil.setAnvilInvXp(view, player, xpCost.get())
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@ import org.bukkit.inventory.AnvilInventory
|
|||
import org.bukkit.inventory.InventoryView
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.Repairable
|
||||
import org.bukkit.inventory.view.AnvilView
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
||||
|
|
@ -25,10 +26,21 @@ object AnvilXpUtil {
|
|||
|
||||
/**
|
||||
* Display xp needed for the work on the anvil inventory
|
||||
* Use the current view repair cost. used to force our price
|
||||
*/
|
||||
fun setAnvilInvXp(
|
||||
inventory: AnvilInventory,
|
||||
view: InventoryView,
|
||||
view: AnvilView,
|
||||
player: HumanEntity,
|
||||
ignoreRules: Boolean = false
|
||||
) {
|
||||
setAnvilInvXp(view, player, view.repairCost, ignoreRules)
|
||||
}
|
||||
|
||||
/**
|
||||
* Display xp needed for the work on the anvil inventory
|
||||
*/
|
||||
fun setAnvilInvXp(
|
||||
view: AnvilView,
|
||||
player: HumanEntity,
|
||||
anvilCost: Int,
|
||||
ignoreRules: Boolean = false
|
||||
|
|
@ -52,9 +64,8 @@ object AnvilXpUtil {
|
|||
}
|
||||
|
||||
// Try first just in case another plugin, or the test need this
|
||||
inventory.maximumRepairCost = maximumRepairCost
|
||||
inventory.repairCost = finalAnvilCost
|
||||
// TODO for 2.x.x use anvil view & set directly there
|
||||
view.maximumRepairCost = maximumRepairCost
|
||||
view.repairCost = finalAnvilCost
|
||||
|
||||
/* Because Minecraft likes to have the final say in the repair cost displayed
|
||||
* we need to wait for the event to end before overriding it, this ensures that
|
||||
|
|
@ -63,22 +74,20 @@ object AnvilXpUtil {
|
|||
CustomAnvil.instance, player
|
||||
) {
|
||||
// retry after a tick
|
||||
inventory.maximumRepairCost = maximumRepairCost
|
||||
inventory.repairCost = finalAnvilCost
|
||||
// TODO for 2.x.x use anvil view & set directly there
|
||||
view.maximumRepairCost = maximumRepairCost
|
||||
view.repairCost = finalAnvilCost
|
||||
|
||||
if (player !is Player) return@scheduleOnEntity
|
||||
|
||||
if (player.gameMode != GameMode.CREATIVE) {
|
||||
val bypassToExpensive = (ConfigOptions.doReplaceTooExpensive) &&
|
||||
(finalAnvilCost >= 40) &&
|
||||
finalAnvilCost < inventory.maximumRepairCost
|
||||
finalAnvilCost < view.maximumRepairCost
|
||||
|
||||
DependencyManager.packetManager.setInstantBuild(player, bypassToExpensive)
|
||||
}
|
||||
|
||||
player.updateInventory()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue