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?
|
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
|
// this mean we are on test
|
||||||
//TODO review why needed knowing previous mitigations should works
|
//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
|
val clazzName = clazz.name
|
||||||
//TODO maybe instead of testing non default, better to be testing we are default ?
|
//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 io.papermc.paper.datapack.Datapack
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.packs.DataPack
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
object DataPackTester {
|
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>
|
val enabledPacks: List<String>
|
||||||
get() {
|
get() {
|
||||||
try {
|
return Bukkit.getDatapackManager().enabledPacks
|
||||||
// will throw error if do not exist
|
.stream().map { obj: Datapack -> obj.name }
|
||||||
Bukkit::class.java.getDeclaredMethod("getDatapackManager")
|
.toList()
|
||||||
|
|
||||||
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,11 +4,11 @@ import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||||
import org.bukkit.inventory.InventoryView
|
import org.bukkit.inventory.InventoryView
|
||||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||||
|
|
||||||
class v1_21R1_ExternGuiTester: ExternGuiTester {
|
class v1_21R1_ExternGuiTester : ExternGuiTester {
|
||||||
override val wesjdAnvilGuiName = "Wrapper1_21_R1"
|
override val wesjdAnvilGuiName = "Wrapper1_21_R1"
|
||||||
|
|
||||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||||
if(view !is CraftInventoryView<*, *>) return null
|
if (view !is CraftInventoryView<*, *>) return null
|
||||||
val container = view.handle
|
val container = view.handle
|
||||||
|
|
||||||
return container.javaClass
|
return container.javaClass
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,10 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.entity.Entity
|
import org.bukkit.entity.Entity
|
||||||
import org.bukkit.plugin.Plugin
|
import org.bukkit.plugin.Plugin
|
||||||
import java.util.function.Consumer
|
|
||||||
|
|
||||||
class FoliaScheduler : TaskScheduler {
|
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){
|
if (time < 1) {
|
||||||
return Bukkit.getGlobalRegionScheduler().run(
|
return Bukkit.getGlobalRegionScheduler().run(
|
||||||
plugin
|
plugin
|
||||||
) { scheduledTask: ScheduledTask? -> task.run() }
|
) { scheduledTask: ScheduledTask? -> task.run() }
|
||||||
|
|
@ -22,7 +21,7 @@ class FoliaScheduler : TaskScheduler {
|
||||||
|
|
||||||
|
|
||||||
override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? {
|
override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? {
|
||||||
if(time < 1){
|
if (time < 1) {
|
||||||
return entity.scheduler.run(
|
return entity.scheduler.run(
|
||||||
plugin,
|
plugin,
|
||||||
{ scheduledTask: ScheduledTask? -> task.run() },
|
{ scheduledTask: ScheduledTask? -> task.run() },
|
||||||
|
|
|
||||||
|
|
@ -4,31 +4,14 @@ import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||||
import org.bukkit.inventory.InventoryView
|
import org.bukkit.inventory.InventoryView
|
||||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||||
|
|
||||||
class v1_21R2_ExternGuiTester: ExternGuiTester {
|
class v1_21R2_ExternGuiTester : ExternGuiTester {
|
||||||
override val wesjdAnvilGuiName = "Wrapper1_21_R2"
|
override val wesjdAnvilGuiName = "Wrapper1_21_R2"
|
||||||
|
|
||||||
var tested = false;
|
|
||||||
var possible = false;
|
|
||||||
|
|
||||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||||
// In case we are in a test environment
|
if (view !is CraftInventoryView<*, *>) return null
|
||||||
if(!tested) testClassExist()
|
|
||||||
if(!possible) return null
|
|
||||||
|
|
||||||
if(view !is CraftInventoryView<*, *>) return null
|
|
||||||
val container = view.handle
|
val container = view.handle
|
||||||
|
|
||||||
return container.javaClass
|
return container.javaClass
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testClassExist(){
|
|
||||||
tested = true;
|
|
||||||
try {
|
|
||||||
Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView")
|
|
||||||
possible = true
|
|
||||||
} catch (e: ClassNotFoundException){
|
|
||||||
possible = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,29 +4,29 @@ import org.bukkit.craftbukkit.inventory.CraftInventoryView
|
||||||
import org.bukkit.inventory.InventoryView
|
import org.bukkit.inventory.InventoryView
|
||||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
||||||
|
|
||||||
class v1_21R4_ExternGuiTester: ExternGuiTester {
|
class v1_21R4_ExternGuiTester : ExternGuiTester {
|
||||||
override val wesjdAnvilGuiName = "Wrapper1_21_R4"
|
override val wesjdAnvilGuiName = "Wrapper1_21_R4"
|
||||||
|
|
||||||
var tested = false;
|
var tested = false
|
||||||
var possible = false;
|
var possible = false
|
||||||
|
|
||||||
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
override fun getContainerClass(view: InventoryView): Class<Any>? {
|
||||||
// In case we are in a test environment
|
// In case we are in a test environment
|
||||||
if(!tested) testClassExist()
|
if (!tested) testClassExist()
|
||||||
if(!possible) return null
|
if (!possible) return null
|
||||||
|
|
||||||
if(view !is CraftInventoryView<*, *>) return null
|
if (view !is CraftInventoryView<*, *>) return null
|
||||||
val container = view.handle
|
val container = view.handle
|
||||||
|
|
||||||
return container.javaClass
|
return container.javaClass
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testClassExist(){
|
fun testClassExist() {
|
||||||
tested = true;
|
tested = true
|
||||||
try {
|
try {
|
||||||
Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView")
|
Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView")
|
||||||
possible = true
|
possible = true
|
||||||
} catch (e: ClassNotFoundException){
|
} catch (e: ClassNotFoundException) {
|
||||||
possible = false
|
possible = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ public class EnchantmentApi {
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean unregisterEnchantment(@NotNull Enchantment enchantment){
|
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) {
|
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) {
|
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.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager;
|
import xyz.alexcrea.cuanvil.dependency.DependencyManager;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui;
|
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 xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -22,7 +21,8 @@ import java.util.List;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class UnitRepairApi {
|
public class UnitRepairApi {
|
||||||
|
|
||||||
private UnitRepairApi(){}
|
private UnitRepairApi() {
|
||||||
|
}
|
||||||
|
|
||||||
private static Object saveChangeTask = null;
|
private static Object saveChangeTask = null;
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ public class UnitRepairApi {
|
||||||
* @param repairable The item to be repaired.
|
* @param repairable The item to be repaired.
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable){
|
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable) {
|
||||||
return addUnitRepair(unit, repairable, 0.25, false);
|
return addUnitRepair(unit, repairable, 0.25, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ public class UnitRepairApi {
|
||||||
* @param value The amount to be repaired by every unit. (1% = 0.01)
|
* @param value The amount to be repaired by every unit. (1% = 0.01)
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value){
|
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value) {
|
||||||
return addUnitRepair(unit, repairable, value, false);
|
return addUnitRepair(unit, repairable, value, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,12 +62,12 @@ public class UnitRepairApi {
|
||||||
* @param overrideDeleted If we should write even if the recipe was previously deleted.
|
* @param overrideDeleted If we should write even if the recipe was previously deleted.
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value, boolean overrideDeleted){
|
public static boolean addUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value, boolean overrideDeleted) {
|
||||||
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
||||||
String path = unit.name().toLowerCase() + "." + repairable.name().toLowerCase();
|
String path = unit.name().toLowerCase() + "." + repairable.name().toLowerCase();
|
||||||
|
|
||||||
if(!overrideDeleted && ConfigHolder.UNIT_REPAIR_HOLDER.isDeleted(path)) return false;
|
if (!overrideDeleted && ConfigHolder.UNIT_REPAIR_HOLDER.isDeleted(path)) return false;
|
||||||
if(config.contains(path)) return false;
|
if (config.contains(path)) return false;
|
||||||
|
|
||||||
// Set unit repair
|
// Set unit repair
|
||||||
return setUnitRepair(unit, repairable, value);
|
return setUnitRepair(unit, repairable, value);
|
||||||
|
|
@ -82,7 +82,7 @@ public class UnitRepairApi {
|
||||||
* @param value The amount to be repaired by every unit. (1% = 0.01)
|
* @param value The amount to be repaired by every unit. (1% = 0.01)
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean setUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value){
|
public static boolean setUnitRepair(@NotNull Material unit, @NotNull Material repairable, double value) {
|
||||||
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
||||||
|
|
||||||
String repairableName = repairable.name().toLowerCase();
|
String repairableName = repairable.name().toLowerCase();
|
||||||
|
|
@ -94,10 +94,10 @@ public class UnitRepairApi {
|
||||||
|
|
||||||
// Add to gui
|
// Add to gui
|
||||||
UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance();
|
UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance();
|
||||||
if(repairConfigGui != null) {
|
if (repairConfigGui != null) {
|
||||||
UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored();
|
UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored();
|
||||||
|
|
||||||
if(elementGui != null) elementGui.updateValueForGeneric(repairableName, true);
|
if (elementGui != null) elementGui.updateValueForGeneric(repairableName, true);
|
||||||
repairConfigGui.updateValueForGeneric(unit, true);
|
repairConfigGui.updateValueForGeneric(unit, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ public class UnitRepairApi {
|
||||||
* @param repairable The item used to be repaired.
|
* @param repairable The item used to be repaired.
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean removeUnitRepair(@NotNull Material unit, @NotNull Material repairable){
|
public static boolean removeUnitRepair(@NotNull Material unit, @NotNull Material repairable) {
|
||||||
// Delete every possible variation and save to file
|
// Delete every possible variation and save to file
|
||||||
String unitName = unit.name();
|
String unitName = unit.name();
|
||||||
String repairableName = repairable.name();
|
String repairableName = repairable.name();
|
||||||
|
|
@ -124,17 +124,17 @@ public class UnitRepairApi {
|
||||||
|
|
||||||
// Test if it was the last value of this section
|
// Test if it was the last value of this section
|
||||||
boolean lastValue = false;
|
boolean lastValue = false;
|
||||||
if(config.isConfigurationSection(unitName.toLowerCase())) {
|
if (config.isConfigurationSection(unitName.toLowerCase())) {
|
||||||
ConfigurationSection section = config.getConfigurationSection(unitName.toLowerCase());
|
ConfigurationSection section = config.getConfigurationSection(unitName.toLowerCase());
|
||||||
|
|
||||||
if(section != null && section.getKeys(false).isEmpty()) {
|
if (section != null && section.getKeys(false).isEmpty()) {
|
||||||
lastValue = true;
|
lastValue = true;
|
||||||
config.set(unitName.toLowerCase(), null);
|
config.set(unitName.toLowerCase(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (config.isConfigurationSection(unitName.toUpperCase())) {
|
} else if (config.isConfigurationSection(unitName.toUpperCase())) {
|
||||||
ConfigurationSection section = config.getConfigurationSection(unitName.toUpperCase());
|
ConfigurationSection section = config.getConfigurationSection(unitName.toUpperCase());
|
||||||
if(section != null && section.getKeys(false).isEmpty()) {
|
if (section != null && section.getKeys(false).isEmpty()) {
|
||||||
lastValue = true;
|
lastValue = true;
|
||||||
config.set(unitName.toUpperCase(), null);
|
config.set(unitName.toUpperCase(), null);
|
||||||
}
|
}
|
||||||
|
|
@ -148,11 +148,11 @@ public class UnitRepairApi {
|
||||||
|
|
||||||
// Remove from gui
|
// Remove from gui
|
||||||
UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance();
|
UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance();
|
||||||
if(repairConfigGui != null) {
|
if (repairConfigGui != null) {
|
||||||
UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored();
|
UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored();
|
||||||
|
|
||||||
if(elementGui != null) elementGui.removeGeneric(repairableName);
|
if (elementGui != null) elementGui.removeGeneric(repairableName);
|
||||||
if(lastValue){
|
if (lastValue) {
|
||||||
repairConfigGui.removeGeneric(unit);
|
repairConfigGui.removeGeneric(unit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -164,9 +164,9 @@ public class UnitRepairApi {
|
||||||
* Prepare a task to save custom unit repair recipe configuration.
|
* Prepare a task to save custom unit repair recipe configuration.
|
||||||
*/
|
*/
|
||||||
private static void prepareSaveTask() {
|
private static void prepareSaveTask() {
|
||||||
if(saveChangeTask != null) return;
|
if (saveChangeTask != null) return;
|
||||||
|
|
||||||
saveChangeTask = DependencyManager.scheduler.scheduleGlobally(CustomAnvil.instance, ()->{
|
saveChangeTask = DependencyManager.scheduler.scheduleGlobally(CustomAnvil.instance, () -> {
|
||||||
ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
|
ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
|
||||||
saveChangeTask = null;
|
saveChangeTask = null;
|
||||||
});
|
});
|
||||||
|
|
@ -174,6 +174,7 @@ public class UnitRepairApi {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get every unit repair recipes.
|
* Get every unit repair recipes.
|
||||||
|
*
|
||||||
* @return An immutable collection of unit repair recipes.
|
* @return An immutable collection of unit repair recipes.
|
||||||
* <p>
|
* <p>
|
||||||
* Each element of the provided triple represent a part of the recipe
|
* Each element of the provided triple represent a part of the recipe
|
||||||
|
|
@ -184,27 +185,28 @@ public class UnitRepairApi {
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<Triple<Material, Material, Double>> getUnitRepairs(){
|
public static List<Triple<Material, Material, Double>> getUnitRepairs() {
|
||||||
List<Triple<Material, Material, Double>> mutableList = new ArrayList<>();
|
List<Triple<Material, Material, Double>> mutableList = new ArrayList<>();
|
||||||
|
|
||||||
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
FileConfiguration config = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
|
||||||
for (String unitKey : config.getKeys(false)) {
|
for (String unitKey : config.getKeys(false)) {
|
||||||
// Test if config section exist
|
// Test if config section exist
|
||||||
if(!config.isConfigurationSection(unitKey)) continue;
|
if (!config.isConfigurationSection(unitKey)) continue;
|
||||||
|
|
||||||
// Test if unit is a material
|
// Test if unit is a material
|
||||||
Material unit = Material.getMaterial(unitKey.toUpperCase());
|
Material unit = Material.getMaterial(unitKey.toUpperCase());
|
||||||
if(unit == null) continue;
|
if (unit == null) continue;
|
||||||
|
|
||||||
// Iterate over reparable items
|
// Iterate over reparable items
|
||||||
ConfigurationSection section = config.getConfigurationSection(unitKey);
|
ConfigurationSection section = config.getConfigurationSection(unitKey);
|
||||||
|
assert section != null; // We tested config.isConfigurationSection(unitKey)
|
||||||
for (String repairableKey : section.getKeys(false)) {
|
for (String repairableKey : section.getKeys(false)) {
|
||||||
// Test if value section exist
|
// Test if value section exist
|
||||||
if(!section.isDouble(repairableKey)) continue;
|
if (!section.isDouble(repairableKey)) continue;
|
||||||
|
|
||||||
// Test if repairable is valid a material
|
// Test if repairable is valid a material
|
||||||
Material repairable = Material.getMaterial(repairableKey.toUpperCase());
|
Material repairable = Material.getMaterial(repairableKey.toUpperCase());
|
||||||
if(repairable == null) continue;
|
if (repairable == null) continue;
|
||||||
|
|
||||||
// Add the values
|
// Add the values
|
||||||
mutableList.add(new Triple<>(unit, repairable, section.getDouble(repairableKey)));
|
mutableList.add(new Triple<>(unit, repairable, section.getDouble(repairableKey)));
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.api.event;
|
||||||
|
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the configuration of CustomAnvil is ready.
|
* Called when the configuration of CustomAnvil is ready.
|
||||||
|
|
@ -29,7 +30,7 @@ public class CAConfigReadyEvent extends Event {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HandlerList getHandlers() {
|
public @NotNull HandlerList getHandlers() {
|
||||||
return HANDLERS;
|
return HANDLERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.api.event;
|
||||||
|
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when custom anvil is ready to accept registration on custom enchantment.
|
* Called when custom anvil is ready to accept registration on custom enchantment.
|
||||||
|
|
@ -23,7 +24,7 @@ public class CAEnchantRegistryReadyEvent extends Event {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HandlerList getHandlers() {
|
public @NotNull HandlerList getHandlers() {
|
||||||
return HANDLERS;
|
return HANDLERS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load default configuration.
|
* Load default configuration.
|
||||||
|
*
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean loadDefaultConfig() {
|
public static boolean loadDefaultConfig() {
|
||||||
|
|
@ -36,6 +37,7 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load non default configuration.
|
* Load non default configuration.
|
||||||
|
*
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public static boolean loadNonDefaultConfig() {
|
public static boolean loadNonDefaultConfig() {
|
||||||
|
|
@ -54,7 +56,7 @@ public abstract class ConfigHolder {
|
||||||
return removeNonDefaultFromDisk(hardfail);
|
return removeNonDefaultFromDisk(hardfail);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean removeNonDefaultFromDisk(boolean hardfail){
|
private static boolean removeNonDefaultFromDisk(boolean hardfail) {
|
||||||
boolean sucess = ITEM_GROUP_HOLDER.reloadFromDisk(hardfail);
|
boolean sucess = ITEM_GROUP_HOLDER.reloadFromDisk(hardfail);
|
||||||
if (!sucess) return false;
|
if (!sucess) return false;
|
||||||
sucess = CONFLICT_HOLDER.reloadFromDisk(hardfail);
|
sucess = CONFLICT_HOLDER.reloadFromDisk(hardfail);
|
||||||
|
|
@ -105,7 +107,7 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
// Save logic
|
// Save logic
|
||||||
public boolean saveToDisk(boolean doBackup) {
|
public boolean saveToDisk(boolean doBackup) {
|
||||||
CustomAnvil.Companion.log("Saving "+getConfigFileName());
|
CustomAnvil.Companion.log("Saving " + getConfigFileName());
|
||||||
if (doBackup) {
|
if (doBackup) {
|
||||||
if (!saveBackup()) {
|
if (!saveBackup()) {
|
||||||
CustomAnvil.instance.getLogger().severe("Could not save backup. see above.");
|
CustomAnvil.instance.getLogger().severe("Could not save backup. see above.");
|
||||||
|
|
@ -122,12 +124,11 @@ public abstract class ConfigHolder {
|
||||||
try {
|
try {
|
||||||
config.save(base);
|
config.save(base);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
CustomAnvil.instance.getLogger().log(Level.SEVERE, "Could not save config...", e);
|
||||||
CustomAnvil.instance.getLogger().severe("Could not save config...");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomAnvil.Companion.log(getConfigFileName()+" saved successfully");
|
CustomAnvil.Companion.log(getConfigFileName() + " saved successfully");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,6 +138,7 @@ public abstract class ConfigHolder {
|
||||||
boolean sufficientSuccess = false;
|
boolean sufficientSuccess = false;
|
||||||
|
|
||||||
BACKUP_FOLDER.mkdirs();
|
BACKUP_FOLDER.mkdirs();
|
||||||
|
|
||||||
// save first backup if do not exist
|
// save first backup if do not exist
|
||||||
File firstBackup = getFirstBackup();
|
File firstBackup = getFirstBackup();
|
||||||
if (!firstBackup.exists()) {
|
if (!firstBackup.exists()) {
|
||||||
|
|
@ -158,7 +160,7 @@ public abstract class ConfigHolder {
|
||||||
Files.move(base, lastBackup);
|
Files.move(base, lastBackup);
|
||||||
sufficientSuccess = true;
|
sufficientSuccess = true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
CustomAnvil.instance.getLogger().log(Level.SEVERE, "Exception while moving backup file " + base.getName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sufficientSuccess;
|
return sufficientSuccess;
|
||||||
|
|
@ -213,7 +215,7 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class DeletableResource extends ResourceConfigHolder{
|
public abstract static class DeletableResource extends ResourceConfigHolder {
|
||||||
|
|
||||||
private static final String DELETED_FOLDER_PATH = "deleted";
|
private static final String DELETED_FOLDER_PATH = "deleted";
|
||||||
|
|
||||||
|
|
@ -221,6 +223,7 @@ public abstract class ConfigHolder {
|
||||||
private final @NotNull File deletedConfigFile;
|
private final @NotNull File deletedConfigFile;
|
||||||
|
|
||||||
private @Nullable YamlConfiguration deletedListConfig;
|
private @Nullable YamlConfiguration deletedListConfig;
|
||||||
|
|
||||||
private DeletableResource(String resourceName) {
|
private DeletableResource(String resourceName) {
|
||||||
super(resourceName);
|
super(resourceName);
|
||||||
this.parent = new File(CustomAnvil.instance.getDataFolder(), DELETED_FOLDER_PATH);
|
this.parent = new File(CustomAnvil.instance.getDataFolder(), DELETED_FOLDER_PATH);
|
||||||
|
|
@ -229,57 +232,62 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean reloadFromDisk(boolean hardFail) {
|
public boolean reloadFromDisk(boolean hardFail) {
|
||||||
if(!super.reloadFromDisk(hardFail)) return false;
|
if (!super.reloadFromDisk(hardFail)) return false;
|
||||||
loadDeletedListFile(hardFail);
|
loadDeletedListFile(hardFail);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDeletedListFile(boolean hardFail){
|
private void loadDeletedListFile(boolean hardFail) {
|
||||||
this.deletedListConfig = CustomAnvil.instance.reloadResource(this.deletedConfigFile, hardFail);
|
this.deletedListConfig = CustomAnvil.instance.reloadResource(this.deletedConfigFile, hardFail);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if the provided element was deleted.
|
* Test if the provided element was deleted.
|
||||||
|
*
|
||||||
* @param objectPath The object path to delete.
|
* @param objectPath The object path to delete.
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public boolean isDeleted(String objectPath){
|
public boolean isDeleted(String objectPath) {
|
||||||
if(this.deletedListConfig == null) return false;
|
if (this.deletedListConfig == null) return false;
|
||||||
|
|
||||||
return this.deletedListConfig.getBoolean(objectPath, false);
|
return this.deletedListConfig.getBoolean(objectPath, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a certain object by its path. do not save the config.
|
* Delete a certain object by its path. do not save the config.
|
||||||
|
*
|
||||||
* @param objectPath The object path to delete.
|
* @param objectPath The object path to delete.
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public boolean delete(String objectPath){
|
public boolean delete(String objectPath) {
|
||||||
return delete(objectPath, false, false);
|
return delete(objectPath, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a certain object by its path.
|
* Delete a certain object by its path.
|
||||||
|
*
|
||||||
* @param objectPath The object path to delete.
|
* @param objectPath The object path to delete.
|
||||||
* @param doSave If we should save the config after deleting.
|
* @param doSave If we should save the config after deleting.
|
||||||
* @param doBackup If we should create a backup.
|
* @param doBackup If we should create a backup.
|
||||||
* @return True if successful.
|
* @return True if successful.
|
||||||
*/
|
*/
|
||||||
public boolean delete(String objectPath, boolean doSave, boolean doBackup){
|
public boolean delete(String objectPath, boolean doSave, boolean doBackup) {
|
||||||
// Create deleted list if it does not yet exist
|
// Create deleted list if it does not yet exist
|
||||||
if(this.deletedListConfig == null){
|
if (this.deletedListConfig == null) {
|
||||||
this.parent.mkdirs();
|
this.parent.mkdirs();
|
||||||
try {
|
try {
|
||||||
this.deletedConfigFile.createNewFile();
|
if (!this.deletedConfigFile.createNewFile()) {
|
||||||
|
throw new RuntimeException("Could not create \"deleted config\" file");
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not create " + this.deletedConfigFile.getPath(), e);
|
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not create " + this.deletedConfigFile.getPath(), e);
|
||||||
}
|
}
|
||||||
loadDeletedListFile(false);
|
loadDeletedListFile(false);
|
||||||
|
|
||||||
// Something was wrong somehow
|
// Something was wrong somehow
|
||||||
if(this.deletedListConfig == null) return false;
|
if (this.deletedListConfig == null) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to the deleted config
|
// Add to the deleted config
|
||||||
|
|
@ -287,7 +295,7 @@ public abstract class ConfigHolder {
|
||||||
this.getConfig().set(objectPath, null);
|
this.getConfig().set(objectPath, null);
|
||||||
|
|
||||||
// Save the deleted config (may not be the most efficient, but I will handle it later)
|
// Save the deleted config (may not be the most efficient, but I will handle it later)
|
||||||
if(doSave){
|
if (doSave) {
|
||||||
return saveToDisk(doBackup);
|
return saveToDisk(doBackup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -303,10 +311,11 @@ public abstract class ConfigHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save list of deleted elements.
|
* Save list of deleted elements.
|
||||||
|
*
|
||||||
* @return true if successful.
|
* @return true if successful.
|
||||||
*/
|
*/
|
||||||
public boolean saveDeletedList() {
|
public boolean saveDeletedList() {
|
||||||
if(this.deletedListConfig == null) return true;
|
if (this.deletedListConfig == null) return true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.deletedListConfig.save(this.deletedConfigFile);
|
this.deletedListConfig.save(this.deletedConfigFile);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.enchant;
|
||||||
|
|
||||||
import io.delilaheve.CustomAnvil;
|
import io.delilaheve.CustomAnvil;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.Registry;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
|
|
@ -53,9 +53,9 @@ public class CAEnchantmentRegistry {
|
||||||
*/
|
*/
|
||||||
public void registerBukkit() {
|
public void registerBukkit() {
|
||||||
// Register enchantment
|
// Register enchantment
|
||||||
for (Enchantment enchantment : Enchantment.values()) {
|
Registry.ENCHANTMENT.iterator().forEachRemaining(enchantment ->
|
||||||
register(new CABukkitEnchantment(enchantment));
|
register(new CABukkitEnchantment(enchantment))
|
||||||
}
|
);
|
||||||
|
|
||||||
// Add bukkit enchantment bulk operation
|
// Add bukkit enchantment bulk operation
|
||||||
BukkitEnchantBulkOperation bukkitOperation = new BukkitEnchantBulkOperation();
|
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) {
|
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) {
|
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 ?");
|
" somehow not found in CustomAnvil ?");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
|
||||||
public final @NotNull Enchantment bukkit;
|
public final @NotNull Enchantment bukkit;
|
||||||
|
|
||||||
public CABukkitEnchantment(@NotNull Enchantment bukkit, @Nullable EnchantmentRarity rarity) {
|
public CABukkitEnchantment(@NotNull Enchantment bukkit, @Nullable EnchantmentRarity rarity) {
|
||||||
super(bukkit.getKey(),
|
super(bukkit.getKeyOrThrow(),
|
||||||
rarity,
|
rarity,
|
||||||
bukkit.getMaxLevel());
|
bukkit.getMaxLevel());
|
||||||
this.bukkit = bukkit;
|
this.bukkit = bukkit;
|
||||||
|
|
@ -103,8 +103,8 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
|
||||||
@NotNull
|
@NotNull
|
||||||
public static EnchantmentRarity getRarity(Enchantment enchantment) {
|
public static EnchantmentRarity getRarity(Enchantment enchantment) {
|
||||||
try {
|
try {
|
||||||
return EnchantmentProperties.valueOf(enchantment.getKey().getKey().toUpperCase(Locale.ENGLISH)).getRarity();
|
return EnchantmentProperties.valueOf(enchantment.getKeyOrThrow().getKey().toUpperCase(Locale.ENGLISH)).getRarity();
|
||||||
} catch (IllegalArgumentException ignored) {
|
} catch (Exception ignored) {
|
||||||
return findRarity(enchantment);
|
return findRarity(enchantment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry;
|
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.list.SettingGuiListConfigGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
|
@ -20,7 +19,7 @@ import java.util.function.Consumer;
|
||||||
*
|
*
|
||||||
* @param <T> Type of the factory of the type of setting the gui should edit.
|
* @param <T> Type of the factory of the type of setting the gui should edit.
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFactory> extends SettingGuiListConfigGui<CAEnchantment, T>{
|
public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFactory> extends SettingGuiListConfigGui<CAEnchantment, T> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for a gui displaying available enchantment to edit a enchantment setting.
|
* Constructor for a gui displaying available enchantment to edit a enchantment setting.
|
||||||
|
|
@ -42,7 +41,7 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Pattern getBackgroundPattern(){
|
protected Pattern getBackgroundPattern() {
|
||||||
return new Pattern(
|
return new Pattern(
|
||||||
GuiSharedConstant.UPPER_FILLER_FULL_PLANE,
|
GuiSharedConstant.UPPER_FILLER_FULL_PLANE,
|
||||||
GuiSharedConstant.EMPTY_FILLER_FULL_LINE,
|
GuiSharedConstant.EMPTY_FILLER_FULL_LINE,
|
||||||
|
|
@ -59,12 +58,12 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateValueForGeneric(CAEnchantment generic, boolean shouldUpdate, boolean prepareSorting) {
|
public void updateValueForGeneric(CAEnchantment generic, boolean shouldUpdate, boolean prepareSorting) {
|
||||||
if(!prepareSorting) {
|
if (!prepareSorting) {
|
||||||
super.updateValueForGeneric(generic, shouldUpdate);
|
super.updateValueForGeneric(generic, shouldUpdate);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!this.factoryMap.containsKey(generic)){
|
if (!this.factoryMap.containsKey(generic)) {
|
||||||
// We need to sort elements again
|
// We need to sort elements again
|
||||||
super.updateValueForGeneric(generic, false);
|
super.updateValueForGeneric(generic, false);
|
||||||
|
|
||||||
|
|
@ -76,17 +75,17 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
|
||||||
for (CAEnchantment enchantment : getEveryDisplayableInstanceOfGeneric()) {
|
for (CAEnchantment enchantment : getEveryDisplayableInstanceOfGeneric()) {
|
||||||
GuiItem item = this.guiItemMap.get(enchantment);
|
GuiItem item = this.guiItemMap.get(enchantment);
|
||||||
|
|
||||||
if(item == null) {
|
if (item == null) {
|
||||||
updateValueForGeneric(enchantment, false, false);
|
updateValueForGeneric(enchantment, false, false);
|
||||||
}else {
|
} else {
|
||||||
addToPage(item);
|
addToPage(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(shouldUpdate) update();
|
if (shouldUpdate) update();
|
||||||
|
|
||||||
}else{
|
} else {
|
||||||
super.updateValueForGeneric(generic, shouldUpdate);
|
super.updateValueForGeneric(generic, shouldUpdate);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -104,6 +103,7 @@ public abstract class AbstractEnchantConfigGui<T extends SettingGui.SettingGuiFa
|
||||||
protected List<String> getCreateItemLore() {
|
protected List<String> getCreateItemLore() {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Consumer<InventoryClickEvent> getCreateClickConsumer() {
|
protected Consumer<InventoryClickEvent> getCreateClickConsumer() {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global config to edit basic basic settings.
|
* Global config to edit basic basic settings.
|
||||||
|
|
@ -188,7 +189,7 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
|
||||||
range = ConfigOptions.ITEM_RENAME_COST_RANGE;
|
range = ConfigOptions.ITEM_RENAME_COST_RANGE;
|
||||||
this.itemRenameCost = new IntSettingsGui.IntSettingFactory("§8Rename Cost", this,
|
this.itemRenameCost = new IntSettingsGui.IntSettingFactory("§8Rename Cost", this,
|
||||||
ConfigOptions.ITEM_RENAME_COST, ConfigHolder.DEFAULT_CONFIG,
|
ConfigOptions.ITEM_RENAME_COST, ConfigHolder.DEFAULT_CONFIG,
|
||||||
Arrays.asList(
|
List.of(
|
||||||
"§7XP Level amount added to the anvil when the item is renamed."
|
"§7XP Level amount added to the anvil when the item is renamed."
|
||||||
),
|
),
|
||||||
range.getFirst(), range.getLast(),
|
range.getFirst(), range.getLast(),
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,6 @@ import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
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.config.settings.EnchantCostSettingsGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
@ -37,7 +35,7 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui<EnchantCostSe
|
||||||
*/
|
*/
|
||||||
public EnchantCostConfigGui() {
|
public EnchantCostConfigGui() {
|
||||||
super("§8Enchantment Level Cost");
|
super("§8Enchantment Level Cost");
|
||||||
if(INSTANCE == null) INSTANCE = this;
|
if (INSTANCE == null) INSTANCE = this;
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
@ -74,7 +72,7 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui<EnchantCostSe
|
||||||
lore.add("§7Book Cost: §e" + bookCost);
|
lore.add("§7Book Cost: §e" + bookCost);
|
||||||
|
|
||||||
List<String> displayLore = factory.getDisplayLore();
|
List<String> displayLore = factory.getDisplayLore();
|
||||||
if(!displayLore.isEmpty()){
|
if (!displayLore.isEmpty()) {
|
||||||
lore.add("");
|
lore.add("");
|
||||||
lore.addAll(displayLore);
|
lore.addAll(displayLore);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.MappedGuiListConfigGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.list.elements.GroupConfigSubSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.list.elements.GroupConfigSubSettingGui;
|
||||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
import xyz.alexcrea.cuanvil.util.LazyValue;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
@ -26,13 +25,13 @@ public class GroupConfigGui extends MappedGuiListConfigGui<IncludeGroup, MappedG
|
||||||
private static GroupConfigGui INSTANCE;
|
private static GroupConfigGui INSTANCE;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static GroupConfigGui getCurrentInstance(){
|
public static GroupConfigGui getCurrentInstance() {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static GroupConfigGui getInstance(){
|
public static GroupConfigGui getInstance() {
|
||||||
if(INSTANCE == null) INSTANCE = new GroupConfigGui();
|
if (INSTANCE == null) INSTANCE = new GroupConfigGui();
|
||||||
|
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
@ -50,12 +49,12 @@ public class GroupConfigGui extends MappedGuiListConfigGui<IncludeGroup, MappedG
|
||||||
assert meta != null;
|
assert meta != null;
|
||||||
|
|
||||||
meta.addItemFlags(ItemFlag.values());
|
meta.addItemFlags(ItemFlag.values());
|
||||||
meta.setDisplayName("§e" + CasedStringUtil.snakeToUpperSpacedCase(group.getName())+ " §fGroup");
|
meta.setDisplayName("§e" + CasedStringUtil.snakeToUpperSpacedCase(group.getName()) + " §fGroup");
|
||||||
meta.setLore(Arrays.asList(
|
meta.setLore(Arrays.asList(
|
||||||
"§7Number of selected groups : " + group.getGroups().size(),
|
"§7Number of selected groups : " + group.getGroups().size(),
|
||||||
"§7Number of included material : " + group.getNonGroupInheritedMaterials().size(),
|
"§7Number of included material : " + group.getNonGroupInheritedMaterials().size(),
|
||||||
"",
|
"",
|
||||||
"§7Total number of included material "+group.getMaterials().size()));
|
"§7Total number of included material " + group.getMaterials().size()));
|
||||||
|
|
||||||
item.setItemMeta(meta);
|
item.setItemMeta(meta);
|
||||||
return item;
|
return item;
|
||||||
|
|
@ -66,7 +65,7 @@ public class GroupConfigGui extends MappedGuiListConfigGui<IncludeGroup, MappedG
|
||||||
ArrayList<IncludeGroup> includeGroups = new ArrayList<>();
|
ArrayList<IncludeGroup> includeGroups = new ArrayList<>();
|
||||||
|
|
||||||
for (AbstractMaterialGroup group : ConfigHolder.ITEM_GROUP_HOLDER.getItemGroupsManager().getGroupMap().values()) {
|
for (AbstractMaterialGroup group : ConfigHolder.ITEM_GROUP_HOLDER.getItemGroupsManager().getGroupMap().values()) {
|
||||||
if(group instanceof IncludeGroup){
|
if (group instanceof IncludeGroup) {
|
||||||
includeGroups.add((IncludeGroup) group);
|
includeGroups.add((IncludeGroup) group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -86,10 +85,10 @@ public class GroupConfigGui extends MappedGuiListConfigGui<IncludeGroup, MappedG
|
||||||
@Override
|
@Override
|
||||||
protected IncludeGroup createAndSaveNewEmptyGeneric(String name) {
|
protected IncludeGroup createAndSaveNewEmptyGeneric(String name) {
|
||||||
ItemGroupManager manager = ConfigHolder.ITEM_GROUP_HOLDER.getItemGroupsManager();
|
ItemGroupManager manager = ConfigHolder.ITEM_GROUP_HOLDER.getItemGroupsManager();
|
||||||
if(manager.getGroupMap().containsKey(name)) return null;
|
if (manager.getGroupMap().containsKey(name)) return null;
|
||||||
|
|
||||||
ConfigurationSection config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
|
ConfigurationSection config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
|
||||||
config.set(name+"."+ItemGroupManager.GROUP_TYPE_PATH, GroupType.INCLUDE.getGroupID());
|
config.set(name + "." + ItemGroupManager.GROUP_TYPE_PATH, GroupType.INCLUDE.getGroupID());
|
||||||
|
|
||||||
return (IncludeGroup) manager.createGroup(config, name);
|
return (IncludeGroup) manager.createGroup(config, name);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.list.elements;
|
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.ChestGui;
|
||||||
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
import io.delilaheve.CustomAnvil;
|
import io.delilaheve.CustomAnvil;
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,7 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class DoubleSettingGui extends AbstractSettingGui {
|
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);
|
this.steps[i] = BigDecimal.valueOf(steps[i]).setScale(scale, RoundingMode.HALF_UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(displayLore == null){
|
this.displayLore = Objects.requireNonNullElse(displayLore, Collections.emptyList());
|
||||||
this.displayLore = Collections.emptyList();
|
|
||||||
}else {
|
|
||||||
this.displayLore = displayLore;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -321,11 +322,7 @@ public class IntSettingsGui extends AbstractSettingGui {
|
||||||
this.defaultVal = defaultVal;
|
this.defaultVal = defaultVal;
|
||||||
this.steps = steps;
|
this.steps = steps;
|
||||||
|
|
||||||
if(displayLore == null){
|
this.displayLore = Objects.requireNonNullElse(displayLore, Collections.emptyList());
|
||||||
this.displayLore = Collections.emptyList();
|
|
||||||
}else {
|
|
||||||
this.displayLore = displayLore;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -26,25 +26,24 @@ public class PUpdate_1_8_0 {
|
||||||
partEnum = new EnumMap<>(ConfigOptions.INSTANCE.getWorkPenaltyType().getPartMap());
|
partEnum = new EnumMap<>(ConfigOptions.INSTANCE.getWorkPenaltyType().getPartMap());
|
||||||
|
|
||||||
boolean keepIncrease;
|
boolean keepIncrease;
|
||||||
boolean keepAdditive;
|
boolean keepAdditive = switch (penaltyTypeValue.toLowerCase()) {
|
||||||
|
case "add_only" -> {
|
||||||
switch (penaltyTypeValue.toLowerCase()) {
|
|
||||||
case "add_only":
|
|
||||||
keepIncrease = false;
|
keepIncrease = false;
|
||||||
keepAdditive = true;
|
yield true;
|
||||||
break;
|
}
|
||||||
case "increase_only":
|
case "increase_only" -> {
|
||||||
keepIncrease = true;
|
keepIncrease = true;
|
||||||
keepAdditive = false;
|
yield false;
|
||||||
break;
|
}
|
||||||
case "disabled":
|
case "disabled" -> {
|
||||||
keepIncrease = false;
|
keepIncrease = false;
|
||||||
keepAdditive = false;
|
yield false;
|
||||||
break;
|
}
|
||||||
default:
|
default -> {
|
||||||
keepIncrease = true;
|
keepIncrease = true;
|
||||||
keepAdditive = true;
|
yield true;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
for (AnvilUseType type : partEnum.keySet()) {
|
for (AnvilUseType type : partEnum.keySet()) {
|
||||||
WorkPenaltyType.WorkPenaltyPart part = partEnum.get(type);
|
WorkPenaltyType.WorkPenaltyPart part = partEnum.get(type);
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ object ConfigOptions {
|
||||||
const val DEFAULT_ITEM_RENAME_COST = 1
|
const val DEFAULT_ITEM_RENAME_COST = 1
|
||||||
|
|
||||||
const val DEFAULT_SACRIFICE_ILLEGAL_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
|
const val DEFAULT_ENCHANT_COUNT_LIMIT = -1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,12 @@ import org.bukkit.entity.HumanEntity
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent
|
import org.bukkit.event.inventory.InventoryClickEvent
|
||||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||||
import org.bukkit.inventory.AnvilInventory
|
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import xyz.alexcrea.cuanvil.api.event.listener.CAClickResultBypassEvent
|
import xyz.alexcrea.cuanvil.api.event.listener.CAClickResultBypassEvent
|
||||||
import xyz.alexcrea.cuanvil.api.event.listener.CAEarlyPreAnvilBypassEvent
|
import xyz.alexcrea.cuanvil.api.event.listener.CAEarlyPreAnvilBypassEvent
|
||||||
import xyz.alexcrea.cuanvil.api.event.listener.CAPreAnvilBypassEvent
|
import xyz.alexcrea.cuanvil.api.event.listener.CAPreAnvilBypassEvent
|
||||||
import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent
|
import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent
|
||||||
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
||||||
import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency
|
import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency
|
||||||
import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
|
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 xyz.alexcrea.cuanvil.util.AnvilUseType
|
||||||
import java.util.logging.Level
|
import java.util.logging.Level
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("unstableApiUsage")
|
||||||
object DependencyManager {
|
object DependencyManager {
|
||||||
|
|
||||||
var isFolia: Boolean = false
|
var isFolia: Boolean = false
|
||||||
lateinit var scheduler: TaskScheduler
|
lateinit var scheduler: TaskScheduler
|
||||||
lateinit var packetManager: PacketManager
|
lateinit var packetManager: PacketManager
|
||||||
var externGuiTester: ExternGuiTester? = null
|
private var externGuiTester: ExternGuiTester? = null
|
||||||
|
|
||||||
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
|
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
|
||||||
var ecoEnchantCompatibility: EcoEnchantDependency? = null
|
private var ecoEnchantCompatibility: EcoEnchantDependency? = null
|
||||||
var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
|
private var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
|
||||||
|
|
||||||
var disenchantmentCompatibility: DisenchantmentDependency? = null
|
private var disenchantmentCompatibility: DisenchantmentDependency? = null
|
||||||
var havenBagsCompatibility: HavenBagsDependency? = null
|
private var havenBagsCompatibility: HavenBagsDependency? = null
|
||||||
|
|
||||||
var axPlayerWarpsCompatibility: AxPlayerWarpsDependency? = null
|
var axPlayerWarpsCompatibility: AxPlayerWarpsDependency? = null
|
||||||
|
|
||||||
val genericDependencies = ArrayList<GenericPluginDependency>()
|
private val genericDependencies = ArrayList<GenericPluginDependency>()
|
||||||
|
|
||||||
fun loadDependency() {
|
fun loadDependency() {
|
||||||
val pluginManager = Bukkit.getPluginManager()
|
val pluginManager = Bukkit.getPluginManager()
|
||||||
|
|
@ -128,7 +130,7 @@ object DependencyManager {
|
||||||
ecoEnchantCompatibility?.handleConfigReload()
|
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
|
// called before immutability test
|
||||||
fun earlyTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
|
fun earlyTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
|
||||||
try {
|
try {
|
||||||
|
|
@ -168,7 +170,7 @@ object DependencyManager {
|
||||||
return bypass
|
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 {
|
fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
|
||||||
try {
|
try {
|
||||||
return unsafeTryEventPreAnvilBypass(event, player)
|
return unsafeTryEventPreAnvilBypass(event, player)
|
||||||
|
|
@ -247,10 +249,10 @@ object DependencyManager {
|
||||||
excellentEnchantsCompatibility?.treatAnvilResult(event)
|
excellentEnchantsCompatibility?.treatAnvilResult(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true if should bypass (either by a dependency or error)
|
// Return true if we should bypass (either by a dependency or error)
|
||||||
fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
fun tryClickAnvilResultBypass(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||||
try {
|
try {
|
||||||
return unsafeTryClickAnvilResultBypass(event, inventory)
|
return unsafeTryClickAnvilResultBypass(event, view)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
CustomAnvil.instance.logger.log(
|
CustomAnvil.instance.logger.log(
|
||||||
Level.SEVERE,
|
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
|
// Run the event
|
||||||
val bypassEvent = CAClickResultBypassEvent(event)
|
val bypassEvent = CAClickResultBypassEvent(event)
|
||||||
Bukkit.getPluginManager().callEvent(bypassEvent)
|
Bukkit.getPluginManager().callEvent(bypassEvent)
|
||||||
|
|
@ -278,10 +280,10 @@ object DependencyManager {
|
||||||
var bypass = bypassEvent.isCancelled
|
var bypass = bypassEvent.isCancelled
|
||||||
|
|
||||||
// Test if disenchantment used event click
|
// 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
|
// 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
|
// Test if disenchantment used event click
|
||||||
if (!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true
|
if (!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,13 @@ object DataPackDependency {
|
||||||
/**
|
/**
|
||||||
* Map of the latest CustomAnvil update related to the pack
|
* 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("bracken", Version(1, 11, 0)),
|
||||||
Pair("enchantplus", Version(1, 13, 0)),
|
Pair("enchantplus", Version(1, 13, 0)),
|
||||||
Pair("dungeons_and_taverns", Version(1, 13, 0))
|
Pair("dungeons_and_taverns", Version(1, 13, 0))
|
||||||
)
|
)
|
||||||
|
|
||||||
val enabledDatapacks: List<String>
|
private val enabledDatapacks: List<String>
|
||||||
get() {
|
get() {
|
||||||
val version: Version = UpdateUtils.currentMinecraftVersion()
|
val version: Version = UpdateUtils.currentMinecraftVersion()
|
||||||
if (version.lesserThan(START_DETECT_VERSION)) return emptyList()
|
if (version.lesserThan(START_DETECT_VERSION)) return emptyList()
|
||||||
|
|
@ -71,7 +71,7 @@ object DataPackDependency {
|
||||||
|
|
||||||
private fun handlePackInitialConfig(pack: String) {
|
private fun handlePackInitialConfig(pack: String) {
|
||||||
val defConfig = ConfigHolder.DEFAULT_CONFIG
|
val defConfig = ConfigHolder.DEFAULT_CONFIG
|
||||||
val version = LASTEST_VERSION[pack]
|
val version = LATEST_VERSION[pack]
|
||||||
if(version == null) {
|
if(version == null) {
|
||||||
throw RuntimeException("The pack $pack has no latest version hard coded in the plugin")
|
throw RuntimeException("The pack $pack has no latest version hard coded in the plugin")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package xyz.alexcrea.cuanvil.dependency.packet
|
package xyz.alexcrea.cuanvil.dependency.packet
|
||||||
|
|
||||||
import org.bukkit.Bukkit
|
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
|
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
||||||
|
|
||||||
object PacketManagerSelector {
|
object PacketManagerSelector {
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,13 @@ import io.delilaheve.CustomAnvil
|
||||||
import org.bukkit.entity.HumanEntity
|
import org.bukkit.entity.HumanEntity
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent
|
import org.bukkit.event.inventory.InventoryClickEvent
|
||||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||||
import org.bukkit.inventory.AnvilInventory
|
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
||||||
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("unstableApiUsage")
|
||||||
class DisenchantmentDependency {
|
class DisenchantmentDependency {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
@ -31,16 +33,16 @@ class DisenchantmentDependency {
|
||||||
|
|
||||||
// Test if event change the result
|
// Test if event change the result
|
||||||
DisenchantEvent.onEvent(event)
|
DisenchantEvent.onEvent(event)
|
||||||
if(event.result != null) {
|
if (event.result != null) {
|
||||||
CustomAnvil.log("Detected pre anvil item extract bypass.")
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
ShatterEvent.onEvent(event)
|
ShatterEvent.onEvent(event)
|
||||||
if(event.result != null) {
|
if (event.result != null) {
|
||||||
CustomAnvil.log("Detected pre anvil split enchant bypass.")
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,18 +50,18 @@ class DisenchantmentDependency {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testAnvilResult(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
fun testAnvilResult(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||||
val previousResultSlot = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
val previousResultSlot = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||||
|
|
||||||
// Test event if change the result
|
// Test event if change the result
|
||||||
DisenchantClickEvent.onEvent(event)
|
DisenchantClickEvent.onEvent(event)
|
||||||
if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
|
if (!testAnvilInventoryChange(view, previousResultSlot) || event.isCancelled) {
|
||||||
CustomAnvil.log("Detected anvil click item extract bypass.")
|
CustomAnvil.log("Detected anvil click item extract bypass.")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
ShatterClickEvent.onEvent(event)
|
ShatterClickEvent.onEvent(event)
|
||||||
if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
|
if (!testAnvilInventoryChange(view, previousResultSlot) || event.isCancelled) {
|
||||||
CustomAnvil.log("Detected anvil click split enchant bypass.")
|
CustomAnvil.log("Detected anvil click split enchant bypass.")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
@ -67,8 +69,8 @@ class DisenchantmentDependency {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun testAnvilInventoryChange(inventory: AnvilInventory, previous: ItemStack?): Boolean {
|
private fun testAnvilInventoryChange(view: AnvilView, previous: ItemStack?): Boolean {
|
||||||
val currentResult = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)
|
val currentResult = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)
|
||||||
|
|
||||||
return currentResult == previous
|
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.
|
// 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()) {
|
for (enchantment in V5EnchantRegistry.getRegistered()) {
|
||||||
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
|
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.keyOrThrow)
|
||||||
EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
|
EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ abstract class GenericPluginDependency(protected val plugin: Plugin) {
|
||||||
if (event.result != null) return true
|
if (event.result != null) return true
|
||||||
}
|
}
|
||||||
|
|
||||||
event.result = previousResult;
|
event.result = previousResult
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import io.delilaheve.CustomAnvil
|
||||||
import org.bukkit.entity.HumanEntity
|
import org.bukkit.entity.HumanEntity
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent
|
import org.bukkit.event.inventory.InventoryClickEvent
|
||||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||||
import org.bukkit.inventory.AnvilInventory
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import org.bukkit.plugin.RegisteredListener
|
import org.bukkit.plugin.RegisteredListener
|
||||||
import valorless.havenbags.HavenBags
|
import valorless.havenbags.HavenBags
|
||||||
import valorless.havenbags.features.BagSkin
|
import valorless.havenbags.features.BagSkin
|
||||||
|
|
@ -12,6 +12,7 @@ import valorless.havenbags.features.BagUpgrade
|
||||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
|
||||||
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
|
||||||
|
|
||||||
|
@Suppress("unstableApiUsage")
|
||||||
class HavenBagsDependency {
|
class HavenBagsDependency {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
@ -53,14 +54,14 @@ class HavenBagsDependency {
|
||||||
bagSkin.onPrepareAnvil(event)
|
bagSkin.onPrepareAnvil(event)
|
||||||
if (event.result != null) {
|
if (event.result != null) {
|
||||||
CustomAnvil.log("Detected pre anvil heaven bag anvil skin.")
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
bagUpgrade.onPrepareAnvil(event)
|
bagUpgrade.onPrepareAnvil(event)
|
||||||
if (event.result != null) {
|
if (event.result != null) {
|
||||||
CustomAnvil.log("Detected pre anvil heaven bag anvil upgrade.")
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,8 +69,8 @@ class HavenBagsDependency {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testAnvilResult(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
|
fun testAnvilResult(event: InventoryClickEvent, view: AnvilView): Boolean {
|
||||||
val result = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
val result = view.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
|
||||||
|
|
||||||
if (HavenBags.IsBag(result)) {
|
if (HavenBags.IsBag(result)) {
|
||||||
CustomAnvil.log("Detected anvil click haven bag bypass.")
|
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
|
// Sadly, getTokens function is private, so I need to do that
|
||||||
private val getTokenMethod: Method =
|
private val getTokenMethod: Method =
|
||||||
ItemChecker::class.java.getDeclaredMethod("getTokens", ItemStack::class.java);
|
ItemChecker::class.java.getDeclaredMethod("getTokens", ItemStack::class.java)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
getTokenMethod.trySetAccessible()
|
getTokenMethod.trySetAccessible()
|
||||||
|
|
@ -38,6 +38,6 @@ class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
|
||||||
val leftTokens = itemChecker.getTokenSafe(left)
|
val leftTokens = itemChecker.getTokenSafe(left)
|
||||||
val resultToken = itemChecker.getTokenSafe(result)
|
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 {
|
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)
|
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)
|
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ class EnchantConflictManager {
|
||||||
// 1.20.5 compatibility TODO better update system
|
// 1.20.5 compatibility TODO better update system
|
||||||
private val SWEEPING_EDGE_ENCHANT = Collections.singletonList<CAEnchantment>(
|
private val SWEEPING_EDGE_ENCHANT = Collections.singletonList<CAEnchantment>(
|
||||||
CAEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge"))
|
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
|
newEnchant: CAEnchantment
|
||||||
): ConflictType {
|
): ConflictType {
|
||||||
val mat = item.type
|
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
|
val conflictList = newEnchant.conflicts
|
||||||
|
|
||||||
var result = ConflictType.NO_CONFLICT
|
var result = ConflictType.NO_CONFLICT
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,9 @@ import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
import org.bukkit.event.inventory.ClickType
|
import org.bukkit.event.inventory.ClickType
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent
|
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.ItemStack
|
||||||
import org.bukkit.inventory.meta.BookMeta
|
import org.bukkit.inventory.meta.BookMeta
|
||||||
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
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_LEFT
|
||||||
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT
|
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT
|
||||||
|
|
@ -32,6 +31,7 @@ import java.util.*
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
|
@Suppress("unstableApiUsage")
|
||||||
class AnvilResultListener : Listener {
|
class AnvilResultListener : Listener {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
@ -46,22 +46,22 @@ class AnvilResultListener : Listener {
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
fun anvilExtractionCheck(event: InventoryClickEvent) {
|
fun anvilExtractionCheck(event: InventoryClickEvent) {
|
||||||
val player = event.whoClicked as? Player ?: return
|
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) {
|
if (event.rawSlot != ANVIL_OUTPUT_SLOT) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test if the event should bypass custom anvil.
|
// 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
|
if (!player.hasPermission(CustomAnvil.affectedByPluginPermission)) return
|
||||||
|
|
||||||
val output = inventory.getItem(ANVIL_OUTPUT_SLOT) ?: return
|
val output = view.getItem(ANVIL_OUTPUT_SLOT) ?: return
|
||||||
val leftItem = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
|
val leftItem = view.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||||
val rightItem = inventory.getItem(ANVIL_INPUT_RIGHT)
|
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
|
event.result = Event.Result.DENY
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -72,13 +72,13 @@ class AnvilResultListener : Listener {
|
||||||
event.result = Event.Result.ALLOW
|
event.result = Event.Result.ALLOW
|
||||||
onCustomCraft(
|
onCustomCraft(
|
||||||
event, recipe, player,
|
event, recipe, player,
|
||||||
leftItem, rightItem, output, inventory
|
leftItem, rightItem, output, view
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not continue if there was no change
|
// 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
|
event.result = Event.Result.DENY
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -101,15 +101,15 @@ class AnvilResultListener : Listener {
|
||||||
if (unitRepairResult != null) {
|
if (unitRepairResult != null) {
|
||||||
onUnitRepairExtract(
|
onUnitRepairExtract(
|
||||||
leftItem, rightItem, output,
|
leftItem, rightItem, output,
|
||||||
unitRepairResult, event, player, inventory
|
unitRepairResult, event, player, view
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// For lore edit
|
// For lore edit
|
||||||
if (handleBookLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
|
if (handleBookLoreEdit(event, view, player, leftItem, rightItem, output)) {
|
||||||
return
|
return
|
||||||
} else if (handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
|
} else if (handlePaperLoreEdit(event, view, player, leftItem, rightItem, output)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ class AnvilResultListener : Listener {
|
||||||
leftItem: ItemStack,
|
leftItem: ItemStack,
|
||||||
rightItem: ItemStack?,
|
rightItem: ItemStack?,
|
||||||
output: ItemStack,
|
output: ItemStack,
|
||||||
inventory: AnvilInventory
|
view: AnvilView
|
||||||
) {
|
) {
|
||||||
event.result = Event.Result.DENY
|
event.result = Event.Result.DENY
|
||||||
|
|
||||||
|
|
@ -154,9 +154,7 @@ class AnvilResultListener : Listener {
|
||||||
// Handle not creative middle click...
|
// Handle not creative middle click...
|
||||||
if (event.click != ClickType.MIDDLE &&
|
if (event.click != ClickType.MIDDLE &&
|
||||||
!handleCustomCraftClick(
|
!handleCustomCraftClick(
|
||||||
event,
|
recipe, view,
|
||||||
recipe,
|
|
||||||
inventory,
|
|
||||||
player,
|
player,
|
||||||
leftItem,
|
leftItem,
|
||||||
rightItem,
|
rightItem,
|
||||||
|
|
@ -175,8 +173,8 @@ class AnvilResultListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleCustomCraftClick(
|
private fun handleCustomCraftClick(
|
||||||
event: InventoryClickEvent, recipe: AnvilCustomRecipe,
|
recipe: AnvilCustomRecipe,
|
||||||
inventory: AnvilInventory, player: Player,
|
view: AnvilView, player: Player,
|
||||||
leftItem: ItemStack, rightItem: ItemStack?,
|
leftItem: ItemStack, rightItem: ItemStack?,
|
||||||
amount: Int, xpCost: Int, linearCost: Boolean = false
|
amount: Int, xpCost: Int, linearCost: Boolean = false
|
||||||
): Boolean {
|
): Boolean {
|
||||||
|
|
@ -185,11 +183,11 @@ class AnvilResultListener : Listener {
|
||||||
if (recipe.rightItem == null) return false// in case it changed
|
if (recipe.rightItem == null) return false// in case it changed
|
||||||
|
|
||||||
rightItem.amount -= amount * recipe.rightItem!!.amount
|
rightItem.amount -= amount * recipe.rightItem!!.amount
|
||||||
inventory.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
view.setItem(ANVIL_INPUT_RIGHT, rightItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
leftItem.amount -= amount * recipe.leftItem!!.amount
|
leftItem.amount -= amount * recipe.leftItem!!.amount
|
||||||
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
|
view.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||||
|
|
||||||
if (player.gameMode != GameMode.CREATIVE) {
|
if (player.gameMode != GameMode.CREATIVE) {
|
||||||
if (linearCost) {
|
if (linearCost) {
|
||||||
|
|
@ -216,17 +214,16 @@ class AnvilResultListener : Listener {
|
||||||
|
|
||||||
CustomAnvil.verboseLog("new amount is $newAmount")
|
CustomAnvil.verboseLog("new amount is $newAmount")
|
||||||
if (newAmount <= 0 || recipe.exactCount) {
|
if (newAmount <= 0 || recipe.exactCount) {
|
||||||
inventory.setItem(ANVIL_OUTPUT_SLOT, null)
|
view.setItem(ANVIL_OUTPUT_SLOT, null)
|
||||||
} else {
|
} else {
|
||||||
val resultItem: ItemStack = recipe.resultItem!!.clone()
|
val resultItem: ItemStack = recipe.resultItem!!.clone()
|
||||||
resultItem.amount *= newAmount
|
resultItem.amount *= newAmount
|
||||||
|
|
||||||
val newXp = newAmount * newAmount
|
val newXp = newAmount * newAmount
|
||||||
|
|
||||||
inventory.repairCost = newXp
|
view.repairCost = newXp
|
||||||
event.view.setProperty(InventoryView.Property.REPAIR_COST, newXp)
|
|
||||||
|
|
||||||
inventory.setItem(ANVIL_OUTPUT_SLOT, resultItem)
|
view.setItem(ANVIL_OUTPUT_SLOT, resultItem)
|
||||||
|
|
||||||
player.updateInventory()
|
player.updateInventory()
|
||||||
}
|
}
|
||||||
|
|
@ -236,7 +233,7 @@ class AnvilResultListener : Listener {
|
||||||
private fun extractAnvilResult(
|
private fun extractAnvilResult(
|
||||||
event: InventoryClickEvent,
|
event: InventoryClickEvent,
|
||||||
player: Player,
|
player: Player,
|
||||||
inventory: AnvilInventory,
|
view: AnvilView,
|
||||||
leftItem: ItemStack?,
|
leftItem: ItemStack?,
|
||||||
leftRemoveCount: Int,
|
leftRemoveCount: Int,
|
||||||
rightItem: ItemStack?,
|
rightItem: ItemStack?,
|
||||||
|
|
@ -259,12 +256,12 @@ class AnvilResultListener : Listener {
|
||||||
if (event.click != ClickType.MIDDLE) {
|
if (event.click != ClickType.MIDDLE) {
|
||||||
// We remove what should be removed
|
// We remove what should be removed
|
||||||
if (leftItem != null) leftItem.amount -= leftRemoveCount
|
if (leftItem != null) leftItem.amount -= leftRemoveCount
|
||||||
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
|
view.setItem(ANVIL_INPUT_LEFT, leftItem)
|
||||||
|
|
||||||
if (rightItem != null) rightItem.amount -= rightRemoveCount
|
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
|
player.level -= repairCost
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -286,7 +283,7 @@ class AnvilResultListener : Listener {
|
||||||
unitRepairResult: Double,
|
unitRepairResult: Double,
|
||||||
event: InventoryClickEvent,
|
event: InventoryClickEvent,
|
||||||
player: Player,
|
player: Player,
|
||||||
inventory: AnvilInventory
|
view: AnvilView
|
||||||
) {
|
) {
|
||||||
val resultCopy = leftItem.clone()
|
val resultCopy = leftItem.clone()
|
||||||
val resultAmount = resultCopy.unitRepair(
|
val resultAmount = resultCopy.unitRepair(
|
||||||
|
|
@ -294,11 +291,11 @@ class AnvilResultListener : Listener {
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get repair cost
|
// 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
|
// And then we give the item manually
|
||||||
extractAnvilResult(
|
extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
null, 0,
|
null, 0,
|
||||||
rightItem, resultAmount,
|
rightItem, resultAmount,
|
||||||
resultCopy, repairCost
|
resultCopy, repairCost
|
||||||
|
|
@ -306,7 +303,7 @@ class AnvilResultListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getUnitRepairCost(
|
private fun getUnitRepairCost(
|
||||||
inventory: AnvilInventory, player: Player,
|
view: AnvilView, player: Player,
|
||||||
leftItem: ItemStack, output: ItemStack,
|
leftItem: ItemStack, output: ItemStack,
|
||||||
resultCopy: ItemStack, resultAmount: Int
|
resultCopy: ItemStack, resultAmount: Int
|
||||||
): Int {
|
): Int {
|
||||||
|
|
@ -339,7 +336,7 @@ class AnvilResultListener : Listener {
|
||||||
repairCost = min(repairCost, ConfigOptions.maxAnvilCost)
|
repairCost = min(repairCost, ConfigOptions.maxAnvilCost)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((inventory.maximumRepairCost <= repairCost)
|
if ((view.maximumRepairCost <= repairCost)
|
||||||
|| (player.level < repairCost)
|
|| (player.level < repairCost)
|
||||||
) return Int.MIN_VALUE
|
) return Int.MIN_VALUE
|
||||||
|
|
||||||
|
|
@ -349,12 +346,12 @@ class AnvilResultListener : Listener {
|
||||||
private fun getFromLoreEditXpCost(
|
private fun getFromLoreEditXpCost(
|
||||||
xpCost: AtomicInteger,
|
xpCost: AtomicInteger,
|
||||||
player: Player,
|
player: Player,
|
||||||
inventory: AnvilInventory,
|
view: AnvilView,
|
||||||
): Int {
|
): Int {
|
||||||
if (GameMode.CREATIVE == player.gameMode) return 0
|
if (GameMode.CREATIVE == player.gameMode) return 0
|
||||||
|
|
||||||
val repairCost = xpCost.get()
|
val repairCost = xpCost.get()
|
||||||
return if ((inventory.maximumRepairCost <= repairCost)
|
return if ((view.maximumRepairCost <= repairCost)
|
||||||
|| (player.level < repairCost)
|
|| (player.level < repairCost)
|
||||||
) Int.MIN_VALUE
|
) Int.MIN_VALUE
|
||||||
else repairCost
|
else repairCost
|
||||||
|
|
@ -362,7 +359,7 @@ class AnvilResultListener : Listener {
|
||||||
|
|
||||||
private fun handleBookLoreEdit(
|
private fun handleBookLoreEdit(
|
||||||
event: InventoryClickEvent,
|
event: InventoryClickEvent,
|
||||||
inventory: AnvilInventory,
|
view: AnvilView,
|
||||||
player: Player,
|
player: Player,
|
||||||
leftItem: ItemStack,
|
leftItem: ItemStack,
|
||||||
rightItem: ItemStack,
|
rightItem: ItemStack,
|
||||||
|
|
@ -388,10 +385,10 @@ class AnvilResultListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
return extractAnvilResult(
|
return extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
null, 0,
|
null, 0,
|
||||||
clearedBook, 0,
|
clearedBook, 0,
|
||||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, xpCost)) return false
|
if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, xpCost)) return false
|
||||||
|
|
@ -424,17 +421,17 @@ class AnvilResultListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
return extractAnvilResult(
|
return extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
null, 0,
|
null, 0,
|
||||||
rightCopy, 0,
|
rightCopy, 0,
|
||||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handlePaperLoreEdit(
|
private fun handlePaperLoreEdit(
|
||||||
event: InventoryClickEvent,
|
event: InventoryClickEvent,
|
||||||
inventory: AnvilInventory,
|
view: AnvilView,
|
||||||
player: Player,
|
player: Player,
|
||||||
leftItem: ItemStack,
|
leftItem: ItemStack,
|
||||||
rightItem: ItemStack,
|
rightItem: ItemStack,
|
||||||
|
|
@ -462,17 +459,17 @@ class AnvilResultListener : Listener {
|
||||||
|
|
||||||
return if (rightItem.amount > 1) {
|
return if (rightItem.amount > 1) {
|
||||||
extractAnvilResult(
|
extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
paperCopy, 0,
|
paperCopy, 0,
|
||||||
rightItem, 1,
|
rightItem, 1,
|
||||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
extractAnvilResult(
|
extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
null, 0,
|
null, 0,
|
||||||
paperCopy, 0,
|
paperCopy, 0,
|
||||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -508,17 +505,17 @@ class AnvilResultListener : Listener {
|
||||||
|
|
||||||
return if (rightItem.amount > 1) {
|
return if (rightItem.amount > 1) {
|
||||||
extractAnvilResult(
|
extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
rightClone, 0,
|
rightClone, 0,
|
||||||
rightItem, 1,
|
rightItem, 1,
|
||||||
output, getFromLoreEditXpCost(xpCost, player, inventory)
|
output, getFromLoreEditXpCost(xpCost, player, view)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
extractAnvilResult(
|
extractAnvilResult(
|
||||||
event, player, inventory,
|
event, player, view,
|
||||||
null, 0,
|
null, 0,
|
||||||
rightClone, 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()
|
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
|
playerListenMap[playeruuid] = callback
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,9 +41,10 @@ class ChatEventListener : Listener {
|
||||||
// sync callback with default server thread
|
// sync callback with default server thread
|
||||||
DependencyManager.scheduler.scheduleOnEntity(
|
DependencyManager.scheduler.scheduleOnEntity(
|
||||||
CustomAnvil.instance, player,
|
CustomAnvil.instance, player,
|
||||||
Runnable {
|
{
|
||||||
eventCallback.accept(event.message)
|
eventCallback.accept(event.message)
|
||||||
}, 0L)
|
}, 0L
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package xyz.alexcrea.cuanvil.listener
|
package xyz.alexcrea.cuanvil.listener
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.util.InventoryViewUtil
|
|
||||||
import io.delilaheve.CustomAnvil
|
import io.delilaheve.CustomAnvil
|
||||||
import io.delilaheve.util.ConfigOptions
|
import io.delilaheve.util.ConfigOptions
|
||||||
import io.delilaheve.util.EnchantmentUtil.combineWith
|
import io.delilaheve.util.EnchantmentUtil.combineWith
|
||||||
|
|
@ -17,10 +16,10 @@ import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.EventPriority
|
import org.bukkit.event.EventPriority
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
import org.bukkit.event.inventory.PrepareAnvilEvent
|
import org.bukkit.event.inventory.PrepareAnvilEvent
|
||||||
import org.bukkit.inventory.AnvilInventory
|
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta
|
||||||
import org.bukkit.inventory.meta.ItemMeta
|
import org.bukkit.inventory.meta.ItemMeta
|
||||||
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
|
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
|
||||||
import xyz.alexcrea.cuanvil.util.*
|
import xyz.alexcrea.cuanvil.util.*
|
||||||
|
|
@ -30,6 +29,7 @@ import java.util.concurrent.atomic.AtomicInteger
|
||||||
/**
|
/**
|
||||||
* Listener for anvil events
|
* Listener for anvil events
|
||||||
*/
|
*/
|
||||||
|
@Suppress("unstableApiUsage")
|
||||||
class PrepareAnvilListener : Listener {
|
class PrepareAnvilListener : Listener {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
@ -46,18 +46,18 @@ class PrepareAnvilListener : Listener {
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
fun anvilCombineCheck(event: PrepareAnvilEvent) {
|
fun anvilCombineCheck(event: PrepareAnvilEvent) {
|
||||||
// Should find player
|
// Should find player
|
||||||
val player: HumanEntity = InventoryViewUtil.getInstance().getPlayer(event.view)
|
val view = event.view
|
||||||
val inventory = event.inventory
|
val player: HumanEntity = view.player
|
||||||
|
|
||||||
// Test if custom anvil is bypassed before immutability test
|
// Test if custom anvil is bypassed before immutability test
|
||||||
if (DependencyManager.earlyTryEventPreAnvilBypass(event, player)) {
|
if (DependencyManager.earlyTryEventPreAnvilBypass(event, player)) {
|
||||||
// even if we got bypassed we still want to set price
|
// 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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val first = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
|
val first = view.getItem(ANVIL_INPUT_LEFT) ?: return
|
||||||
val second = inventory.getItem(ANVIL_INPUT_RIGHT)
|
val second = view.getItem(ANVIL_INPUT_RIGHT)
|
||||||
|
|
||||||
if (isImmutable(first) || isImmutable(second)) {
|
if (isImmutable(first) || isImmutable(second)) {
|
||||||
CustomAnvil.verboseLog("Skipping anvil process as one of the two item is immutable")
|
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
|
if (!player.hasPermission(CustomAnvil.affectedByPluginPermission)) return
|
||||||
|
|
||||||
// Test custom recipe
|
// Test custom recipe
|
||||||
if (testCustomRecipe(event, inventory, player, first, second)) return
|
if (testCustomRecipe(event, player, first, second)) return
|
||||||
|
|
||||||
// Test rename lonely item
|
// Test rename lonely item
|
||||||
if (second == null) {
|
if (second == null) {
|
||||||
doRenaming(event, inventory, player, first)
|
doRenaming(event, view, player, first)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test for merge
|
// Test for merge
|
||||||
if (first.canMergeWith(second)) {
|
if (first.canMergeWith(second)) {
|
||||||
doMerge(event, inventory, player, first, second)
|
doMerge(event, view, player, first, second)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test for unit repair
|
// Test for unit repair
|
||||||
if (testUnitRepair(event, inventory, player, first, second)) return
|
if (testUnitRepair(event, view, player, first, second)) return
|
||||||
|
|
||||||
// Test for lore edit
|
// 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")
|
CustomAnvil.log("no anvil fuse type found")
|
||||||
event.result = null
|
event.result = null
|
||||||
|
|
@ -113,7 +113,7 @@ class PrepareAnvilListener : Listener {
|
||||||
if (!meta.hasEnchants()) return false
|
if (!meta.hasEnchants()) return false
|
||||||
|
|
||||||
for (enchant in meta.enchants.keys) {
|
for (enchant in meta.enchants.keys) {
|
||||||
if (ConfigOptions.isImmutable(enchant.key)) return true
|
if (ConfigOptions.isImmutable(enchant.keyOrThrow)) return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -122,14 +122,14 @@ class PrepareAnvilListener : Listener {
|
||||||
if (meta !is EnchantmentStorageMeta || !meta.hasStoredEnchants()) return false
|
if (meta !is EnchantmentStorageMeta || !meta.hasStoredEnchants()) return false
|
||||||
|
|
||||||
for (enchant in meta.storedEnchants.keys) {
|
for (enchant in meta.storedEnchants.keys) {
|
||||||
if (ConfigOptions.isImmutable(enchant.key)) return true
|
if (ConfigOptions.isImmutable(enchant.keyOrThrow)) return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if a custom recipe exist with these ingredients
|
// return true if a custom recipe exist with these ingredients
|
||||||
private fun testCustomRecipe(
|
private fun testCustomRecipe(
|
||||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
event: PrepareAnvilEvent,
|
||||||
player: HumanEntity,
|
player: HumanEntity,
|
||||||
first: ItemStack, second: ItemStack?
|
first: ItemStack, second: ItemStack?
|
||||||
): Boolean {
|
): Boolean {
|
||||||
|
|
@ -155,16 +155,16 @@ class PrepareAnvilListener : Listener {
|
||||||
event.result = finalResult.result
|
event.result = finalResult.result
|
||||||
if (finalResult.result == null) return false
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doRenaming(
|
private fun doRenaming(
|
||||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
event: PrepareAnvilEvent, view: AnvilView,
|
||||||
player: HumanEntity, first: ItemStack
|
player: HumanEntity, first: ItemStack
|
||||||
) {
|
) {
|
||||||
val resultItem = first.clone()
|
val resultItem = first.clone()
|
||||||
var anvilCost = handleRename(resultItem, inventory, player)
|
var anvilCost = handleRename(resultItem, view, player)
|
||||||
|
|
||||||
// Test/stop if nothing changed.
|
// Test/stop if nothing changed.
|
||||||
if (first == resultItem) {
|
if (first == resultItem) {
|
||||||
|
|
@ -181,12 +181,12 @@ class PrepareAnvilListener : Listener {
|
||||||
event.result = finalResult.result
|
event.result = finalResult.result
|
||||||
if (finalResult.result == null) return
|
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
|
// Can be null
|
||||||
var inventoryName = ChatColor.stripColor(inventory.renameText)
|
var inventoryName = ChatColor.stripColor(view.renameText)
|
||||||
|
|
||||||
var sumCost = 0
|
var sumCost = 0
|
||||||
var useColor = false
|
var useColor = false
|
||||||
|
|
@ -227,7 +227,7 @@ class PrepareAnvilListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doMerge(
|
private fun doMerge(
|
||||||
event: PrepareAnvilEvent, inventory: AnvilInventory,
|
event: PrepareAnvilEvent, view: AnvilView,
|
||||||
player: HumanEntity,
|
player: HumanEntity,
|
||||||
first: ItemStack, second: ItemStack
|
first: ItemStack, second: ItemStack
|
||||||
) {
|
) {
|
||||||
|
|
@ -260,7 +260,7 @@ class PrepareAnvilListener : Listener {
|
||||||
// As calculatePenalty edit result, we need to calculate penalty after checking equality
|
// As calculatePenalty edit result, we need to calculate penalty after checking equality
|
||||||
anvilCost += AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE)
|
anvilCost += AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE)
|
||||||
// Calculate rename cost
|
// Calculate rename cost
|
||||||
anvilCost += handleRename(resultItem, inventory, player)
|
anvilCost += handleRename(resultItem, view, player)
|
||||||
|
|
||||||
// Finally, we set result
|
// Finally, we set result
|
||||||
val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost)
|
val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost)
|
||||||
|
|
@ -269,7 +269,7 @@ class PrepareAnvilListener : Listener {
|
||||||
event.result = finalResult.result
|
event.result = finalResult.result
|
||||||
if (finalResult.result == null) return
|
if (finalResult.result == null) return
|
||||||
|
|
||||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
|
AnvilXpUtil.setAnvilInvXp(view, player, finalResult.levelCost)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isIdentical(
|
private fun isIdentical(
|
||||||
|
|
@ -286,13 +286,13 @@ class PrepareAnvilListener : Listener {
|
||||||
|
|
||||||
// return true if there is a valid unit repair with these ingredients
|
// return true if there is a valid unit repair with these ingredients
|
||||||
private fun testUnitRepair(
|
private fun testUnitRepair(
|
||||||
event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
|
event: PrepareAnvilEvent, view: AnvilView, player: HumanEntity,
|
||||||
first: ItemStack, second: ItemStack
|
first: ItemStack, second: ItemStack
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val unitRepairAmount = first.getRepair(second) ?: return false
|
val unitRepairAmount = first.getRepair(second) ?: return false
|
||||||
|
|
||||||
val resultItem = first.clone()
|
val resultItem = first.clone()
|
||||||
var anvilCost = handleRename(resultItem, inventory, player)
|
var anvilCost = handleRename(resultItem, view, player)
|
||||||
|
|
||||||
val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount)
|
val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount)
|
||||||
if (repairAmount > 0) {
|
if (repairAmount > 0) {
|
||||||
|
|
@ -314,12 +314,12 @@ class PrepareAnvilListener : Listener {
|
||||||
event.result = finalResult.result
|
event.result = finalResult.result
|
||||||
if (finalResult.result == null) return false
|
if (finalResult.result == null) return false
|
||||||
|
|
||||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
|
AnvilXpUtil.setAnvilInvXp(view, player, finalResult.levelCost)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun testLoreEdit(
|
private fun testLoreEdit(
|
||||||
event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
|
event: PrepareAnvilEvent, view: AnvilView, player: HumanEntity,
|
||||||
first: ItemStack, second: ItemStack
|
first: ItemStack, second: ItemStack
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val type = second.type
|
val type = second.type
|
||||||
|
|
@ -339,7 +339,7 @@ class PrepareAnvilListener : Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
event.result = result
|
event.result = result
|
||||||
AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, xpCost.get())
|
AnvilXpUtil.setAnvilInvXp(view, player, xpCost.get())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -13,6 +13,7 @@ import org.bukkit.inventory.AnvilInventory
|
||||||
import org.bukkit.inventory.InventoryView
|
import org.bukkit.inventory.InventoryView
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.inventory.meta.Repairable
|
import org.bukkit.inventory.meta.Repairable
|
||||||
|
import org.bukkit.inventory.view.AnvilView
|
||||||
import org.bukkit.persistence.PersistentDataType
|
import org.bukkit.persistence.PersistentDataType
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
||||||
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
import xyz.alexcrea.cuanvil.dependency.DependencyManager
|
||||||
|
|
@ -25,10 +26,21 @@ object AnvilXpUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display xp needed for the work on the anvil inventory
|
* Display xp needed for the work on the anvil inventory
|
||||||
|
* Use the current view repair cost. used to force our price
|
||||||
*/
|
*/
|
||||||
fun setAnvilInvXp(
|
fun setAnvilInvXp(
|
||||||
inventory: AnvilInventory,
|
view: AnvilView,
|
||||||
view: InventoryView,
|
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,
|
player: HumanEntity,
|
||||||
anvilCost: Int,
|
anvilCost: Int,
|
||||||
ignoreRules: Boolean = false
|
ignoreRules: Boolean = false
|
||||||
|
|
@ -52,9 +64,8 @@ object AnvilXpUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try first just in case another plugin, or the test need this
|
// Try first just in case another plugin, or the test need this
|
||||||
inventory.maximumRepairCost = maximumRepairCost
|
view.maximumRepairCost = maximumRepairCost
|
||||||
inventory.repairCost = finalAnvilCost
|
view.repairCost = finalAnvilCost
|
||||||
// TODO for 2.x.x use anvil view & set directly there
|
|
||||||
|
|
||||||
/* Because Minecraft likes to have the final say in the repair cost displayed
|
/* 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
|
* we need to wait for the event to end before overriding it, this ensures that
|
||||||
|
|
@ -63,22 +74,20 @@ object AnvilXpUtil {
|
||||||
CustomAnvil.instance, player
|
CustomAnvil.instance, player
|
||||||
) {
|
) {
|
||||||
// retry after a tick
|
// retry after a tick
|
||||||
inventory.maximumRepairCost = maximumRepairCost
|
view.maximumRepairCost = maximumRepairCost
|
||||||
inventory.repairCost = finalAnvilCost
|
view.repairCost = finalAnvilCost
|
||||||
// TODO for 2.x.x use anvil view & set directly there
|
|
||||||
|
|
||||||
if (player !is Player) return@scheduleOnEntity
|
if (player !is Player) return@scheduleOnEntity
|
||||||
|
|
||||||
if (player.gameMode != GameMode.CREATIVE) {
|
if (player.gameMode != GameMode.CREATIVE) {
|
||||||
val bypassToExpensive = (ConfigOptions.doReplaceTooExpensive) &&
|
val bypassToExpensive = (ConfigOptions.doReplaceTooExpensive) &&
|
||||||
(finalAnvilCost >= 40) &&
|
(finalAnvilCost >= 40) &&
|
||||||
finalAnvilCost < inventory.maximumRepairCost
|
finalAnvilCost < view.maximumRepairCost
|
||||||
|
|
||||||
DependencyManager.packetManager.setInstantBuild(player, bypassToExpensive)
|
DependencyManager.packetManager.setInstantBuild(player, bypassToExpensive)
|
||||||
}
|
}
|
||||||
|
|
||||||
player.updateInventory()
|
player.updateInventory()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue