diff --git a/pom.xml b/pom.xml index 100df3e4..f448a085 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1.1.1-R0.11-SNAPSHOT - 1.0.4-R0.56-SNAPSHOT + 1.0.4-R0.63-SNAPSHOT diff --git a/src/main/java/studio/magemonkey/divinity/config/EngineCfg.java b/src/main/java/studio/magemonkey/divinity/config/EngineCfg.java index 5757107d..ff940ab3 100644 --- a/src/main/java/studio/magemonkey/divinity/config/EngineCfg.java +++ b/src/main/java/studio/magemonkey/divinity/config/EngineCfg.java @@ -48,6 +48,7 @@ public EngineCfg(@NotNull Divinity plugin) throws InvalidConfigurationException public static boolean ATTRIBUTES_ALLOW_HOLD_REQUIREMENTS; public static boolean ATTRIBUTES_DURABILITY_BREAK_ITEMS; + public static boolean ATTRIBUTES_HIDE_FLAGS; public static boolean ATTRIBUTES_DURABILITY_REDUCE_FOR_MOBS; public static Set ATTRIBUTES_DURABILITY_REDUCE_FOR_SKILL_API; @@ -56,6 +57,7 @@ public EngineCfg(@NotNull Divinity plugin) throws InvalidConfigurationException public static double COMBAT_SHIELD_BLOCK_BONUS_DAMAGE_MOD; public static int COMBAT_SHIELD_BLOCK_COOLDOWN; public static boolean LEGACY_COMBAT; + public static boolean FULL_LEGACY; public static boolean COMBAT_DISABLE_VANILLA_SWEEP; public static boolean COMBAT_REDUCE_PLAYER_HEALTH_BAR; public static boolean COMBAT_FISHING_HOOK_DO_DAMAGE; @@ -177,6 +179,7 @@ public void setup() { EngineCfg.ATTRIBUTES_EFFECTIVE_FOR_MOBS = cfg.getBoolean(path + "effective-for-mobs"); EngineCfg.ATTRIBUTES_EFFECTIVE_IN_OFFHAND = cfg.getBoolean(path + "effective-in-offhand"); EngineCfg.ATTRIBUTES_ALLOW_HOLD_REQUIREMENTS = cfg.getBoolean(path + "allow-hold-items-you-cant-use"); + EngineCfg.ATTRIBUTES_HIDE_FLAGS = cfg.getBoolean(path + "hide-flags"); path = "attributes.durability."; EngineCfg.ATTRIBUTES_DURABILITY_BREAK_ITEMS = cfg.getBoolean(path + "break-items-on-zero"); diff --git a/src/main/java/studio/magemonkey/divinity/manager/EntityManager.java b/src/main/java/studio/magemonkey/divinity/manager/EntityManager.java index ddc45f9f..46390700 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/EntityManager.java +++ b/src/main/java/studio/magemonkey/divinity/manager/EntityManager.java @@ -19,6 +19,7 @@ import studio.magemonkey.divinity.api.event.DivinityDamageEvent; import studio.magemonkey.divinity.api.event.EntityDivinityItemPickupEvent; import studio.magemonkey.divinity.api.event.EntityEquipmentChangeEvent; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.modules.api.QModuleDrop; import studio.magemonkey.divinity.stats.EntityStats; import studio.magemonkey.divinity.stats.EntityStatsTask; @@ -90,6 +91,7 @@ public void shutdown() { @EventHandler(priority = EventPriority.MONITOR) public void onStatsDeath(EntityDeathEvent e) { + if(EngineCfg.FULL_LEGACY) return; LivingEntity entity = e.getEntity(); previousEquipment.remove(e.getEntity().getUniqueId()); EntityStats.get(entity).handleDeath(); @@ -98,17 +100,20 @@ public void onStatsDeath(EntityDeathEvent e) { // Clear stats on player exit @EventHandler(priority = EventPriority.HIGHEST) public void onStatsQuit(PlayerQuitEvent e) { + if(EngineCfg.FULL_LEGACY) return; EntityStats.purge(e.getPlayer()); } @EventHandler(priority = EventPriority.HIGHEST) public void onStatsJoin(PlayerJoinEvent e) { + if(EngineCfg.FULL_LEGACY) return; EntityStats.get(e.getPlayer()); this.pushToUpdate(e.getPlayer(), 1D); } @EventHandler public void quit(PlayerQuitEvent event) { + if(EngineCfg.FULL_LEGACY) return; previousEquipment.remove(event.getPlayer().getUniqueId()); } @@ -124,6 +129,7 @@ public void onStatsRegen(EntityRegainHealthEvent e) { @EventHandler(ignoreCancelled = true) public void onPickup(EntityPickupItemEvent e) { + if(EngineCfg.FULL_LEGACY) return; if (!ProjectileStats.isPickable(e.getItem())) { e.setCancelled(true); } @@ -138,6 +144,7 @@ public void onPickup(EntityPickupItemEvent e) { } private final void pushToUpdate(@NotNull LivingEntity entity, double time) { + if(EngineCfg.FULL_LEGACY) return; EntityEquipment equip = new EntityEquipmentSnapshot(entity); previousEquipment.put(entity.getUniqueId(), equip); if (time <= 0D) { @@ -153,6 +160,7 @@ public void run() { } private final void addDuplicatorFixer(@NotNull Entity entity) { + if(EngineCfg.FULL_LEGACY) return; entity.setMetadata(PACKET_DUPLICATOR_FIXER, new FixedMetadataValue(plugin, "fixed")); } diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java b/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java index fa2742e1..94d65295 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/ListenerManager.java @@ -3,6 +3,8 @@ import org.jetbrains.annotations.NotNull; import studio.magemonkey.codex.manager.api.Loadable; import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.config.Config; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.hooks.HookListener; import studio.magemonkey.divinity.manager.listener.object.*; import studio.magemonkey.divinity.stats.items.ItemStats; @@ -45,8 +47,13 @@ public void setup() { this.lisDynamic = new DynamicStatListener(this.plugin); this.lisDynamic.registerListeners(); - this.lisQuantum = new VanillaWrapperListener(this.plugin); - this.lisQuantum.registerListeners(); + if(!EngineCfg.LEGACY_COMBAT) { + this.lisQuantum = new VanillaWrapperListener(this.plugin); + this.lisQuantum.registerListeners(); + Divinity.getInstance().getLogger().info("Loaded " + this.lisQuantum.getClass().getSimpleName()); + } else { + Divinity.getInstance().getLogger().info("Skipped " + VanillaWrapperListener.class.getSimpleName() + " due to legacy combat being enabled."); + } this.updater = new ItemUpdaterListener(this.plugin); this.updater.registerListeners(); diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/DynamicStatListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/DynamicStatListener.java index 2c2f021b..a79bafc8 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/DynamicStatListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/DynamicStatListener.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable; import studio.magemonkey.codex.manager.IListener; import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.stats.items.ItemStats; import studio.magemonkey.divinity.stats.items.api.DynamicStat; @@ -27,6 +28,7 @@ public DynamicStatListener(@NotNull Divinity plugin) { } public static void updateItem(@Nullable Player p, @NotNull ItemStack item) { + if(EngineCfg.FULL_LEGACY) return; for (DynamicStat dynamicStat : ItemStats.getDynamicStats()) { dynamicStat.updateItem(p, item); } @@ -34,12 +36,14 @@ public static void updateItem(@Nullable Player p, @NotNull ItemStack item) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onDrop(PlayerDropItemEvent e) { + if(EngineCfg.FULL_LEGACY) return; ItemStack item = e.getItemDrop().getItemStack(); updateItem(null, item); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPick(EntityPickupItemEvent e) { + if(EngineCfg.FULL_LEGACY) return; LivingEntity entity = e.getEntity(); if (!(entity instanceof Player)) return; @@ -50,6 +54,7 @@ public void onPick(EntityPickupItemEvent e) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInvOpen(InventoryOpenEvent e) { + if(EngineCfg.FULL_LEGACY) return; List list = new ArrayList<>(); Player player = (Player) e.getPlayer(); @@ -64,6 +69,7 @@ public void onInvOpen(InventoryOpenEvent e) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInvClose(InventoryCloseEvent e) { + if(EngineCfg.FULL_LEGACY) return; Player player = (Player) e.getPlayer(); List list = new ArrayList<>(); diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemUpdaterListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemUpdaterListener.java index b21b19e9..7589a4a5 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemUpdaterListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/ItemUpdaterListener.java @@ -25,6 +25,7 @@ import studio.magemonkey.codex.manager.IListener; import studio.magemonkey.codex.util.DataUT; import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.stats.items.ItemStats; public class ItemUpdaterListener extends IListener { @@ -93,6 +94,7 @@ public void join(PlayerJoinEvent event) { } public void update(ItemStack item, @Nullable Player player) { + if(EngineCfg.LEGACY_COMBAT ||EngineCfg.FULL_LEGACY) return; if (item == null || item.getType() == Material.AIR) return; ItemType itemType = CodexEngine.get().getItemManager().getMainItemType(item); diff --git a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java index 5c524868..1aa4790a 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java +++ b/src/main/java/studio/magemonkey/divinity/modules/ModuleItem.java @@ -1,6 +1,7 @@ package studio.magemonkey.divinity.modules; import org.apache.commons.lang3.ArrayUtils; +import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -8,6 +9,7 @@ import org.bukkit.attribute.AttributeModifier; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.*; @@ -135,16 +137,25 @@ public ModuleItem(@NotNull Divinity plugin, @NotNull JYML cfg, @NotNull QModuleD this.attributes = new HashMap<>(); for (String attr : cfg.getSection("attributes")) { - String[] attrData = cfg.getString("attributes." + attr, "").split(":"); - double value = Double.parseDouble(attrData[0]); - String operation = attrData.length > 1 ? attrData[1] : "ADD_NUMBER"; - NBTAttribute nbtAttr = NBTAttribute.valueOf(attr.toUpperCase()); - AttributeModifier attrModifier = VersionManager.getCompat() - .createAttributeModifier(nbtAttr, value, AttributeModifier.Operation.valueOf(operation)); + String[] attrData = cfg.getString("attributes." + attr, "").split(":"); + double value = Double.parseDouble(attrData[0]); + String operation = attrData.length > 1 ? attrData[1] : "ADD_NUMBER"; + String equipmentSlot = attrData.length > 2 ? attrData[2] : null; + NBTAttribute nbtAttr = NBTAttribute.valueOf(attr.toUpperCase()); + + // Check attribute through compat support + AttributeModifier attrModifier = VersionManager.getCompat().createAttributeModifier(nbtAttr, value, AttributeModifier.Operation.valueOf(operation)); if (attrModifier == null) { Codex.warn("Invalid attribute provided: " + attr + " (" + cfg.getFile().getName() + ")"); continue; } + // If everything was fine and equipmentslot != null, recreate the modifier including the equipment slot + if(equipmentSlot != null) { + EquipmentSlot slot = EquipmentSlot.valueOf(equipmentSlot.toUpperCase()); + attrModifier = new AttributeModifier(attrModifier.getUniqueId(), attrModifier.getName(), attrModifier.getAmount(), attrModifier.getOperation(), slot); + // Debug + Bukkit.getLogger().info("Registered attribute " + nbtAttr.name() + " with value " + value + ", operation " + operation + " and equipment slot " + equipmentSlot + " for item " + this.getId()); + } this.attributes.put(nbtAttr.getAttribute(), attrModifier); } @@ -277,6 +288,7 @@ protected ItemStack build(@NotNull ItemStack item) { for (Map.Entry attribute : this.attributes.entrySet()) { if (attribute != null) { + AttributeModifier mod = new AttributeModifier(attribute.getValue().getName(), attribute.getValue().getAmount(), attribute.getValue().getOperation()); meta.addAttributeModifier(attribute.getKey(), attribute.getValue()); } } diff --git a/src/main/java/studio/magemonkey/divinity/stats/EntityStats.java b/src/main/java/studio/magemonkey/divinity/stats/EntityStats.java index 39bb2a54..d7cf3eff 100644 --- a/src/main/java/studio/magemonkey/divinity/stats/EntityStats.java +++ b/src/main/java/studio/magemonkey/divinity/stats/EntityStats.java @@ -435,6 +435,7 @@ private void updateInventory() { } public void updateAll() { + if(EngineCfg.LEGACY_COMBAT) return; if (!EngineCfg.ATTRIBUTES_EFFECTIVE_FOR_MOBS && !this.isPlayer()) { return; } diff --git a/src/main/java/studio/magemonkey/divinity/stats/items/ItemStats.java b/src/main/java/studio/magemonkey/divinity/stats/items/ItemStats.java index 6e052ddb..409d85a5 100644 --- a/src/main/java/studio/magemonkey/divinity/stats/items/ItemStats.java +++ b/src/main/java/studio/magemonkey/divinity/stats/items/ItemStats.java @@ -19,6 +19,7 @@ import studio.magemonkey.codex.modules.IModule; import studio.magemonkey.codex.util.DataUT; import studio.magemonkey.divinity.Divinity; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.modules.api.QModuleDrop; import studio.magemonkey.divinity.stats.items.api.DuplicableItemLoreStat; import studio.magemonkey.divinity.stats.items.api.DynamicStat; @@ -307,6 +308,8 @@ public static boolean hasStat(@NotNull ItemStack item, @Nullable Player player, // ----------------------------------------------------------------- // public static void updateVanillaAttributes(@NotNull ItemStack item, @Nullable Player player) { + if(EngineCfg.FULL_LEGACY || EngineCfg.LEGACY_COMBAT) return; + addAttribute(item, player, NBTAttribute.MAX_HEALTH, getStat(item, player, TypedStat.Type.MAX_HEALTH)); addAttribute(item, player, NBTAttribute.MOVEMENT_SPEED, getStat(item, player, TypedStat.Type.MOVEMENT_SPEED)); addAttribute(item, player, NBTAttribute.ATTACK_SPEED, getStat(item, player, TypedStat.Type.ATTACK_SPEED)); @@ -344,6 +347,7 @@ private static void addAttribute(@NotNull ItemStack item, @Nullable Player player, @NotNull NBTAttribute att, double value) { + //if(EngineCfg.LEGACY_COMBAT) return; ItemMeta meta = item.getItemMeta(); if (meta == null) return; diff --git a/src/main/resources/engine.yml b/src/main/resources/engine.yml index 81ca70bf..8f1ad776 100644 --- a/src/main/resources/engine.yml +++ b/src/main/resources/engine.yml @@ -63,6 +63,8 @@ attributes: # When enabled, allows to hold in hand items with requirements that player don't meet. # Even when this is 'true', item attributes won't be applied to a player until he meet the requirements. allow-hold-items-you-cant-use: false + # When enabled, hides attributes and enchantments by default on all custom items. + hide-flags: true combat: # Whether to use the old combat formula for calculating defenses