From 02dc38721983a4df6585a833cdd5a073ef665357 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Fri, 23 Apr 2021 14:12:51 +0000 Subject: [PATCH] Fixed item blessing. --- .../dist/game/data/EnchantItemData.xml | 8 -- .../itemhandlers/BlessingScrolls.java | 3 + .../gameserver/data/xml/EnchantItemData.java | 22 +--- .../model/variables/PlayerVariables.java | 1 + .../blessing/RequestBlessOptionEnchant.java | 109 ++++++++---------- 5 files changed, 51 insertions(+), 92 deletions(-) diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/EnchantItemData.xml b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/EnchantItemData.xml index f35fbe1c02..eda3096cc6 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/EnchantItemData.xml +++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/EnchantItemData.xml @@ -20,14 +20,6 @@ - - - - - - - - diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/itemhandlers/BlessingScrolls.java b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/itemhandlers/BlessingScrolls.java index d5ccd855ba..ca8b6cd5b2 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/itemhandlers/BlessingScrolls.java +++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/itemhandlers/BlessingScrolls.java @@ -20,6 +20,7 @@ import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.model.actor.Playable; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance; +import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.blessing.ExOpenBlessOptionScroll; @@ -46,6 +47,8 @@ public class BlessingScrolls implements IItemHandler return false; } + player.getVariables().set(PlayerVariables.USED_BLESS_SCROLL_ID, item.getId()); + player.sendPacket(new ExOpenBlessOptionScroll(item.getId())); return true; } diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/EnchantItemData.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/EnchantItemData.java index d41cbe94d0..2d0ab9c5d9 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/EnchantItemData.java +++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/EnchantItemData.java @@ -17,15 +17,10 @@ package org.l2jmobius.gameserver.data.xml; import java.io.File; -import java.util.AbstractMap; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.logging.Logger; -import java.util.stream.Collectors; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -47,7 +42,6 @@ public class EnchantItemData implements IXmlReader private final Map _scrolls = new HashMap<>(); private final Map _supports = new HashMap<>(); - private final List> _blessingScrolls = new ArrayList<>(); /** * Instantiates a new enchant item data. @@ -62,11 +56,9 @@ public class EnchantItemData implements IXmlReader { _scrolls.clear(); _supports.clear(); - _blessingScrolls.clear(); parseDatapackFile("data/EnchantItemData.xml"); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scrolls.size() + " enchant scrolls."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _supports.size() + " support items."); - LOGGER.info(getClass().getSimpleName() + ": Loaded " + _blessingScrolls.size() + " blessing scrolls."); } @Override @@ -101,14 +93,7 @@ public class EnchantItemData implements IXmlReader item.addItem(parseInteger(cd.getAttributes(), "id")); } } - if (set.contains("isBlessed")) - { - _blessingScrolls.add(new AbstractMap.SimpleEntry<>(item.getId(), item)); - } - else - { - _scrolls.put(item.getId(), item); - } + _scrolls.put(item.getId(), item); } catch (NullPointerException e) { @@ -173,11 +158,6 @@ public class EnchantItemData implements IXmlReader return _supports.get(item.getId()); } - public List> getBlessingScrolls(int itemId) - { - return _blessingScrolls.stream().filter(it -> it.getKey() == itemId).collect(Collectors.toList()); - } - /** * Gets the single instance of EnchantItemData. * @return single instance of EnchantItemData diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index a384d2efb7..1b868b8b97 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -77,6 +77,7 @@ public class PlayerVariables extends AbstractVariables public static final String STAT_INT = "STAT_INT"; public static final String STAT_WIT = "STAT_WIT"; public static final String STAT_MEN = "STAT_MEN"; + public static final String USED_BLESS_SCROLL_ID = "USED_BLESS_SCROLL_ID"; private final int _objectId; diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/blessing/RequestBlessOptionEnchant.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/blessing/RequestBlessOptionEnchant.java index e5eea51ae9..4eb7bf8b96 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/blessing/RequestBlessOptionEnchant.java +++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/blessing/RequestBlessOptionEnchant.java @@ -16,21 +16,17 @@ */ package org.l2jmobius.gameserver.network.clientpackets.blessing; -import java.util.Map; -import java.util.Optional; - import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketReader; -import org.l2jmobius.gameserver.data.xml.EnchantItemData; +import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.request.BlessingItemRequest; import org.l2jmobius.gameserver.model.items.Item; -import org.l2jmobius.gameserver.model.items.enchant.EnchantResultType; -import org.l2jmobius.gameserver.model.items.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.skills.CommonSkill; import org.l2jmobius.gameserver.model.skills.Skill; +import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; @@ -48,7 +44,6 @@ import org.l2jmobius.gameserver.util.Util; */ public class RequestBlessOptionEnchant implements IClientIncomingPacket { - private int _itemObjId; @Override @@ -74,8 +69,16 @@ public class RequestBlessOptionEnchant implements IClientIncomingPacket return; } - final Optional> targetScroll = EnchantItemData.getInstance().getBlessingScrolls(targetInstance.getId()).stream().filter(it -> it.getValue().getGrade() == targetInstance.getItem().getCrystalType()).findFirst(); - if (targetScroll.isEmpty()) + ItemInstance targetScroll = player.getInventory().getItemByItemId(player.getVariables().getInt(PlayerVariables.USED_BLESS_SCROLL_ID, 0)); + if (targetScroll == null) + { + targetScroll = player.getInventory().getItemByItemId(94208); // Scroll of Blessing - Event + } + if (targetScroll == null) + { + targetScroll = player.getInventory().getItemByItemId(94184); // Scroll of Blessing + } + if (targetScroll == null) { player.sendPacket(new ExBlessOptionEnchant(EnchantResult.ERROR)); return; @@ -108,8 +111,7 @@ public class RequestBlessOptionEnchant implements IClientIncomingPacket } final ItemInstance item = request.getBlessingItem(); - final ItemInstance scroll = request.getBlessScroll(); - if ((item == null) || (scroll == null)) + if (item == null) { player.removeRequest(request.getClass()); player.sendPacket(new ExBlessOptionEnchant(EnchantResult.ERROR)); @@ -126,7 +128,7 @@ public class RequestBlessOptionEnchant implements IClientIncomingPacket } // attempting to destroy scroll - if (player.getInventory().destroyItem("Blessing", scroll.getObjectId(), 1, player, item) == null) + if (player.getInventory().destroyItem("Blessing", targetScroll.getObjectId(), 1, player, item) == null) { client.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT_2); Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to bless with a scroll he doesn't have", Config.DEFAULT_PUNISH); @@ -135,66 +137,47 @@ public class RequestBlessOptionEnchant implements IClientIncomingPacket return; } - // last validation check - if ((item.getOwnerId() != player.getObjectId())) + if (Rnd.get(100) < Config.BLESSING_CHANCE) // Success { - client.sendPacket(SystemMessageId.AUGMENTATION_REQUIREMENTS_ARE_NOT_FULFILLED); - player.removeRequest(request.getClass()); - player.sendPacket(new ExBlessOptionEnchant(EnchantResult.ERROR)); - return; - } - - final EnchantResultType resultType = targetScroll.get().getValue().calculateSuccess(player, item); - switch (resultType) - { - case ERROR -> + final Item it = item.getItem(); + // Increase enchant level only if scroll's base template has chance, some armors can success over +20 but they shouldn't have increased. + item.setBlessed(true); + item.updateDatabase(); + player.sendPacket(new ExBlessOptionEnchant(1)); + // Announce the success. + if ((item.getEnchantLevel() >= (item.isArmor() ? Config.MIN_ARMOR_ENCHANT_ANNOUNCE : Config.MIN_WEAPON_ENCHANT_ANNOUNCE)) // + && (item.getEnchantLevel() <= (item.isArmor() ? Config.MAX_ARMOR_ENCHANT_ANNOUNCE : Config.MAX_WEAPON_ENCHANT_ANNOUNCE))) { - player.sendPacket(SystemMessageId.AUGMENTATION_REQUIREMENTS_ARE_NOT_FULFILLED); - player.sendPacket(new ExBlessOptionEnchant(EnchantResult.ERROR)); - } - case SUCCESS -> - { - final Item it = item.getItem(); - // Increase enchant level only if scroll's base template has chance, some armors can success over +20 but they shouldn't have increased. - item.setBlessed(true); - item.updateDatabase(); - player.sendPacket(new ExBlessOptionEnchant(1)); + final SystemMessage sm = new SystemMessage(SystemMessageId.C1_HAS_SUCCESSFULLY_ENCHANTED_A_S2_S3); + sm.addString(player.getName()); + sm.addInt(item.getEnchantLevel()); + sm.addItemName(item); + player.broadcastPacket(sm); + Broadcast.toAllOnlinePlayers(new ExItemAnnounce(player, item, ExItemAnnounce.ENCHANT)); - // announce the success - if ((item.getEnchantLevel() >= (item.isArmor() ? Config.MIN_ARMOR_ENCHANT_ANNOUNCE : Config.MIN_WEAPON_ENCHANT_ANNOUNCE)) // - && (item.getEnchantLevel() <= (item.isArmor() ? Config.MAX_ARMOR_ENCHANT_ANNOUNCE : Config.MAX_WEAPON_ENCHANT_ANNOUNCE))) + final Skill skill = CommonSkill.FIREWORK.getSkill(); + if (skill != null) { - final SystemMessage sm = new SystemMessage(SystemMessageId.C1_HAS_SUCCESSFULLY_ENCHANTED_A_S2_S3); - sm.addString(player.getName()); - sm.addInt(item.getEnchantLevel()); - sm.addItemName(item); - player.broadcastPacket(sm); - Broadcast.toAllOnlinePlayers(new ExItemAnnounce(player, item, ExItemAnnounce.ENCHANT)); - - final Skill skill = CommonSkill.FIREWORK.getSkill(); - if (skill != null) - { - player.broadcastPacket(new MagicSkillUse(player, player, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay())); - } - } - if (item.isEquipped()) - { - if (item.isArmor()) - { - it.forEachSkill(ItemSkillType.ON_BLESSING, holder -> - { - player.addSkill(holder.getSkill(), false); - player.sendSkillList(); - }); - } - player.broadcastUserInfo(); // update user info + player.broadcastPacket(new MagicSkillUse(player, player, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay())); } } - case FAILURE -> + if (item.isEquipped()) { - player.sendPacket(new ExBlessOptionEnchant(0)); + if (item.isArmor()) + { + it.forEachSkill(ItemSkillType.ON_BLESSING, holder -> + { + player.addSkill(holder.getSkill(), false); + player.sendSkillList(); + }); + } + player.broadcastUserInfo(); } } + else // Failure. + { + player.sendPacket(new ExBlessOptionEnchant(0)); + } player.sendItemList();