From c38b542ddab5422924706a87638bf3d20da9a8df Mon Sep 17 00:00:00 2001 From: erlandys56 <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sun, 25 Jan 2015 11:52:47 +0000 Subject: [PATCH] - r101 fixed error for friend memo (SQL). - Fixed Awakening social action. - Implemented configs for awakening to skip or not Seize of Destiny quest and Scroll of Afterlife item. - Fixed mentee getting 2 letters with 2 headphones and fixed skill error, when adding mentee. - Implemented Change Attribute stone engine. --- trunk/dist/game/config/Character.properties | 13 ++ .../npc/AwakeningMaster/AwakeningMaster.java | 44 +++--- .../ai/npc/MentorGuide/MentorGuide.java | 2 +- .../data/scripts/handlers/MasterHandler.java | 2 + .../itemhandlers/ChangeAttribute.java | 55 ++++++++ .../game/data/stats/items/33500-33599.xml | 1 + .../dist/tools/sql/game/character_friends.sql | 1 + trunk/java/com/l2jserver/Config.java | 6 + .../model/actor/instance/L2PcInstance.java | 12 +- .../model/items/instance/L2ItemInstance.java | 30 ++++ .../network/L2GamePacketHandler.java | 6 +- .../RequestChangeAttributeCancel.java | 48 +++++++ .../RequestChangeAttributeItem.java | 133 ++++++++++++++++++ .../SendChangeAttributeTargetItem.java | 59 ++++++++ .../mentoring/ConfirmMenteeAdd.java | 2 +- .../serverpackets/ExChangeAttributeFail.java | 32 +++++ .../serverpackets/ExChangeAttributeInfo.java | 62 ++++++++ .../ExChangeAttributeItemList.java | 62 ++++++++ .../serverpackets/ExChangeAttributeOk.java | 32 +++++ 19 files changed, 573 insertions(+), 29 deletions(-) create mode 100644 trunk/dist/game/data/scripts/handlers/itemhandlers/ChangeAttribute.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeCancel.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeItem.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/clientpackets/SendChangeAttributeTargetItem.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeFail.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeInfo.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeItemList.java create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeOk.java diff --git a/trunk/dist/game/config/Character.properties b/trunk/dist/game/config/Character.properties index 31a0be381a..593a38faa0 100644 --- a/trunk/dist/game/config/Character.properties +++ b/trunk/dist/game/config/Character.properties @@ -218,6 +218,14 @@ FeeDeleteTransferSkills = 10000000 # Default: 10000000 FeeDeleteSubClassSkills = 10000000 +# Need Seize your destiny quest, to awaken +# Default: true +NeedSeizeYourDestinyForAwaken = false + +# Need Scroll of Afterlife item to awaken +# Default: true +NeedScrollOfAfterlifeForAwaken = false + # --------------------------------------------------------------------------- # Summons configuration # --------------------------------------------------------------------------- @@ -389,6 +397,11 @@ EnchantChanceElementCrystal = 30 EnchantChanceElementJewel = 20 EnchantChanceElementEnergy = 10 +# This controls the chance of an change element stone chance. +# This chance is in %, so if you set this to 100%, enchants will always succeed. +# DEFAULT NEEDS TO BE VERIFIED, MUST BE CHANGED HERE AND IN CONFIG.JAVA IF NOT CORRECT +ChangeChanceElement = 60 + # List of non-enchantable items. # Currently apprentice, travelers weapons and Pailaka items # Default: 7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,13293,13294,13296 diff --git a/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java b/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java index 3f599a9fe4..f19b342684 100644 --- a/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java +++ b/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java @@ -21,6 +21,7 @@ package ai.npc.AwakeningMaster; import quests.Q10338_SeizeYourDestiny.Q10338_SeizeYourDestiny; import ai.npc.AbstractNpcAI; +import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.CategoryType; @@ -85,13 +86,14 @@ public final class AwakeningMaster extends AbstractNpcAI { return null; } + String htmltext = null; switch (event) { case "awakening": { final QuestState st2 = player.getQuestState(Q10338_SeizeYourDestiny.class.getSimpleName()); - if (st.hasQuestItems(SCROLL_OF_AFTERLIFE) && (player.getLevel() > 84) && (!player.isSubClassActive() || player.isDualClassActive()) && player.isInCategory(CategoryType.FOURTH_CLASS_GROUP) && (st2 != null) && st2.isCompleted()) + if ((!Config.NEED_SCROLL_OF_AFTERLIFE_FOR_AWAKEN || st.hasQuestItems(SCROLL_OF_AFTERLIFE)) && (player.getLevel() > 84) && (!player.isSubClassActive() || player.isDualClassActive()) && player.isInCategory(CategoryType.FOURTH_CLASS_GROUP) && (!Config.NEED_SEIZE_YOUR_DESTINY_FOR_AWAKEN || ((st2 != null) && st2.isCompleted()))) { switch (npc.getId()) { @@ -192,11 +194,14 @@ public final class AwakeningMaster extends AbstractNpcAI return; } - final QuestState st = player.getQuestState(Q10338_SeizeYourDestiny.class.getSimpleName()); - - if ((st == null) || !st.isCompleted()) + if (Config.NEED_SEIZE_YOUR_DESTINY_FOR_AWAKEN) { - return; + final QuestState st = player.getQuestState(Q10338_SeizeYourDestiny.class.getSimpleName()); + + if ((st == null) || !st.isCompleted()) + { + return; + } } if (player.isHero() || Hero.getInstance().isUnclaimedHero(player.getObjectId())) @@ -217,15 +222,18 @@ public final class AwakeningMaster extends AbstractNpcAI return; } - final L2ItemInstance item = player.getInventory().getItemByItemId(SCROLL_OF_AFTERLIFE); - if (item == null) + if (Config.NEED_SCROLL_OF_AFTERLIFE_FOR_AWAKEN) { - return; - } - - if (!player.destroyItem("Awakening", item, player, true)) - { - return; + final L2ItemInstance item = player.getInventory().getItemByItemId(SCROLL_OF_AFTERLIFE); + if (item == null) + { + return; + } + + if (!player.destroyItem("Awakening", item, player, true)) + { + return; + } } for (ClassId newClass : player.getClassId().getNextClassIds()) @@ -238,44 +246,36 @@ public final class AwakeningMaster extends AbstractNpcAI player.sendPacket(ui); player.broadcastInfo(); - int socialId = 21; // Sigel int itemId = ABELIUS_POWER; // Sigel if (player.isInCategory(CategoryType.TYRR_GROUP)) { - socialId = 22; itemId = SAPYROS_POWER; } else if (player.isInCategory(CategoryType.OTHELL_GROUP)) { - socialId = 23; itemId = ASHAGEN_POWER; } else if (player.isInCategory(CategoryType.YUL_GROUP)) { - socialId = 24; itemId = CRANIGG_POWER; } else if (player.isInCategory(CategoryType.FEOH_GROUP)) { - socialId = 25; itemId = SOLTKREIG_POWER; } else if (player.isInCategory(CategoryType.ISS_GROUP)) { - socialId = 26; itemId = NAVIAROPE_POWER; } else if (player.isInCategory(CategoryType.WYNN_GROUP)) { - socialId = 27; itemId = LEISTER_POWER; } else if (player.isInCategory(CategoryType.AEORE_GROUP)) { - socialId = 28; itemId = LAKCIS_POWER; } - player.broadcastPacket(new SocialAction(player.getObjectId(), socialId)); + player.broadcastPacket(new SocialAction(player.getObjectId(), 20)); giveItems(player, itemId, 1); SkillTreesData.getInstance().cleanSkillUponAwakening(player); diff --git a/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java b/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java index d998e932da..2b66a4eb38 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java +++ b/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java @@ -197,7 +197,7 @@ public class MentorGuide extends AbstractNpcAI implements IXmlReader event.getMentor().sendPacket(new ExMentorList(event.getMentor())); // Add the mentee skill - event.getMentee().addSkill(MENTEE_MENTOR_SUMMON.getSkill(), true); + event.getMentee().addSkill(MENTEE_MENTOR_SUMMON.getSkill(), false); // Send mail with the headphone sendMail(event.getMentee(), MENTEE_ADDED_TITLE, MENTEE_ADDED_BODY, MENTEE_HEADPHONE, 1); diff --git a/trunk/dist/game/data/scripts/handlers/MasterHandler.java b/trunk/dist/game/data/scripts/handlers/MasterHandler.java index 36ea40154d..5a7bfb1fb2 100644 --- a/trunk/dist/game/data/scripts/handlers/MasterHandler.java +++ b/trunk/dist/game/data/scripts/handlers/MasterHandler.java @@ -161,6 +161,7 @@ import handlers.itemhandlers.BlessedSpiritShot; import handlers.itemhandlers.Book; import handlers.itemhandlers.Bypass; import handlers.itemhandlers.Calculator; +import handlers.itemhandlers.ChangeAttribute; import handlers.itemhandlers.CharmOfCourage; import handlers.itemhandlers.Elixir; import handlers.itemhandlers.EnchantAttribute; @@ -464,6 +465,7 @@ public class MasterHandler Book.class, Bypass.class, Calculator.class, + ChangeAttribute.class, CharmOfCourage.class, Elixir.class, EnchantAttribute.class, diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/ChangeAttribute.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/ChangeAttribute.java new file mode 100644 index 0000000000..dd2bbf7dfb --- /dev/null +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/ChangeAttribute.java @@ -0,0 +1,55 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package handlers.itemhandlers; + +import com.l2jserver.gameserver.handler.IItemHandler; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ExChangeAttributeItemList; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author Erlandys + */ +public class ChangeAttribute implements IItemHandler +{ + @Override + public boolean useItem(L2Playable playable, L2ItemInstance item, boolean forceUse) + { + if (!(playable instanceof L2PcInstance)) + { + return false; + } + + final L2PcInstance activeChar = (L2PcInstance) playable; + if (activeChar.isCastingNow()) + { + return false; + } + + if (activeChar.isEnchanting()) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CHANGING_ATTRIBUTES_IS_IN_PROGRESS_PLEASE_TRY_AGAIN_AFTER_ENDING_THE_PREVIOUS_TASK)); + return false; + } + + activeChar.setActiveEnchantAttrItemId(item.getId()); + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CHANGING_ATTRIBUTES_IS_IN_PROGRESS_PLEASE_TRY_AGAIN_AFTER_ENDING_THE_PREVIOUS_TASK)); + activeChar.sendPacket(new ExChangeAttributeItemList(activeChar, item.getObjectId())); + return true; + } +} diff --git a/trunk/dist/game/data/stats/items/33500-33599.xml b/trunk/dist/game/data/stats/items/33500-33599.xml index 90606bebdc..77bf20d99b 100644 --- a/trunk/dist/game/data/stats/items/33500-33599.xml +++ b/trunk/dist/game/data/stats/items/33500-33599.xml @@ -16,6 +16,7 @@ + diff --git a/trunk/dist/tools/sql/game/character_friends.sql b/trunk/dist/tools/sql/game/character_friends.sql index 2b84f8ed1c..d79f6bc720 100644 --- a/trunk/dist/tools/sql/game/character_friends.sql +++ b/trunk/dist/tools/sql/game/character_friends.sql @@ -2,5 +2,6 @@ CREATE TABLE IF NOT EXISTS `character_friends` ( `charId` INT UNSIGNED NOT NULL DEFAULT 0, `friendId` INT UNSIGNED NOT NULL DEFAULT 0, `relation` INT UNSIGNED NOT NULL DEFAULT 0, + `memo` text, PRIMARY KEY (`charId`,`friendId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/trunk/java/com/l2jserver/Config.java b/trunk/java/com/l2jserver/Config.java index d902b0e9a1..8a150673ec 100644 --- a/trunk/java/com/l2jserver/Config.java +++ b/trunk/java/com/l2jserver/Config.java @@ -665,6 +665,8 @@ public final class Config public static String[] BOTREPORT_RESETPOINT_HOUR; public static long BOTREPORT_REPORT_DELAY; public static boolean BOTREPORT_ALLOW_REPORTS_FROM_SAME_CLAN_MEMBERS; + public static boolean NEED_SEIZE_YOUR_DESTINY_FOR_AWAKEN; + public static boolean NEED_SCROLL_OF_AFTERLIFE_FOR_AWAKEN; // -------------------------------------------------- // FloodProtector Settings @@ -1080,6 +1082,7 @@ public final class Config public static double ENCHANT_CHANCE_ELEMENT_CRYSTAL; public static double ENCHANT_CHANCE_ELEMENT_JEWEL; public static double ENCHANT_CHANCE_ELEMENT_ENERGY; + public static int CHANGE_CHANCE_ELEMENT; public static int[] ENCHANT_BLACKLIST; public static int AUGMENTATION_NG_SKILL_CHANCE; public static int AUGMENTATION_NG_GLOW_CHANCE; @@ -1629,6 +1632,7 @@ public final class Config ENCHANT_CHANCE_ELEMENT_CRYSTAL = Character.getDouble("EnchantChanceElementCrystal", 30); ENCHANT_CHANCE_ELEMENT_JEWEL = Character.getDouble("EnchantChanceElementJewel", 20); ENCHANT_CHANCE_ELEMENT_ENERGY = Character.getDouble("EnchantChanceElementEnergy", 10); + CHANGE_CHANCE_ELEMENT = Character.getInt("ChangeChanceElement", 60); String[] notenchantable = Character.getString("EnchantBlackList", "7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,13293,13294,13296").split(","); ENCHANT_BLACKLIST = new int[notenchantable.length]; for (int i = 0; i < notenchantable.length; i++) @@ -1807,6 +1811,8 @@ public final class Config PLAYER_MOVEMENT_BLOCK_TIME = Character.getInt("NpcTalkBlockingTime", 0) * 1000; ABILITY_MAX_POINTS = Character.getInt("AbilityMaxPoints", 16); ABILITY_POINTS_RESET_ADENA = Character.getLong("AbilityPointsResetAdena", 10_000_000); + NEED_SEIZE_YOUR_DESTINY_FOR_AWAKEN = Character.getBoolean("NeedSeizeYourDestinyForAwaken", true); + NEED_SCROLL_OF_AFTERLIFE_FOR_AWAKEN = Character.getBoolean("NeedScrollOfAfterlifeForAwaken", true); // Load Telnet L2Properties file (if exists) final PropertiesParser telnetSettings = new PropertiesParser(TELNET_FILE); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index ee62f554eb..95fa059bf3 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -15044,7 +15044,11 @@ public final class L2PcInstance extends L2Playable { return _vitPoints; } - return getSubClasses().get(getClassIndex()).getVitalityPoints(); + if (getSubClasses().containsKey(getClassIndex())) + { + return getSubClasses().get(getClassIndex()).getVitalityPoints(); + } + return _vitPoints; } public void setVitalityPoints(int points) @@ -15054,6 +15058,10 @@ public final class L2PcInstance extends L2Playable _vitPoints = points; return; } - getSubClasses().get(getClassIndex()).setVitalityPoints(points); + if (getSubClasses().containsKey(getClassIndex())) + { + getSubClasses().get(getClassIndex()).setVitalityPoints(points); + } + _vitPoints = points; } } diff --git a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java index a1c18db922..a82a5d6ada 100644 --- a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java @@ -1153,6 +1153,36 @@ public final class L2ItemInstance extends L2Object } } + public void changeAttribute(byte element, int value) + { + if (_elementals == null) + { + _elementals = new Elementals[1]; + _elementals[0] = new Elementals(element, value); + } + else + { + Elementals elm = getElemental(element); + if (elm != null) + { + elm.setValue(value); + } + else + { + _elementals = new Elementals[1]; + _elementals[0] = new Elementals(element, value); + } + } + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + updateItemElements(con); + } + catch (SQLException e) + { + _log.log(Level.SEVERE, "Could not update elementals for item: " + this + " from DB:", e); + } + } + /** * Add elemental attribute to item and save to db * @param element diff --git a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java index ea7ebfe079..22826cfef8 100644 --- a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java +++ b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java @@ -1401,13 +1401,13 @@ public final class L2GamePacketHandler implements IPacketHandler, // msg = new RequestHardWareInfo(); (SddddddSddddddddddSS) break; case 0xB0: - // msg = new SendChangeAttributeTargetItem(); + msg = new SendChangeAttributeTargetItem(); break; case 0xB1: - // msg = new RequestChangeAttributeItem(); + msg = new RequestChangeAttributeItem(); break; case 0xB2: - // msg = new RequestChangeAttributeCancel(); + msg = new RequestChangeAttributeCancel(); break; case 0xB3: // msg = new RequestBR_PresentBuyProduct(); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeCancel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeCancel.java new file mode 100644 index 0000000000..36a4a17a6f --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeCancel.java @@ -0,0 +1,48 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.clientpackets; + +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author Erlandys + */ +public class RequestChangeAttributeCancel extends L2GameClientPacket +{ + + private static final String _C__D0_B7_SENDCHANGEATTRIBUTETARGETITEM = "[C] D0:B7 RequestChangeAttributeCancel"; + + @Override + protected void readImpl() + { + } + + @Override + protected void runImpl() + { + L2PcInstance player = getClient().getActiveChar(); + if (player == null) + { + return; + } + player.setActiveEnchantAttrItemId(0); + } + + @Override + public String getType() + { + return _C__D0_B7_SENDCHANGEATTRIBUTETARGETITEM; + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeItem.java new file mode 100644 index 0000000000..0b40e9ebc2 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAttributeItem.java @@ -0,0 +1,133 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.clientpackets; + +import com.l2jserver.Config; +import com.l2jserver.gameserver.enums.PrivateStoreType; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ExChangeAttributeFail; +import com.l2jserver.gameserver.network.serverpackets.ExChangeAttributeItemList; +import com.l2jserver.gameserver.network.serverpackets.ExChangeAttributeOk; +import com.l2jserver.gameserver.network.serverpackets.ExStorageMaxCount; +import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.network.serverpackets.UserInfo; +import com.l2jserver.util.Rnd; + +/** + * @author Erlandys + */ +public class RequestChangeAttributeItem extends L2GameClientPacket +{ + + private static final String _C__D0_B7_SENDCHANGEATTRIBUTETARGETITEM = "[C] D0:B7 SendChangeAttributeTargetItem"; + + private int _attributeOID, _itemOID, _newAttributeID; + + @Override + protected void readImpl() + { + _attributeOID = readD(); + _itemOID = readD(); + _newAttributeID = readD(); + } + + @Override + protected void runImpl() + { + L2PcInstance player = getClient().getActiveChar(); + if (player == null) + { + return; + } + + L2ItemInstance item = player.getInventory().getItemByObjectId(_itemOID); + + if (player.getPrivateStoreType() != PrivateStoreType.NONE) + { + player.sendPacket(SystemMessageId.YOU_CANNOT_CHANGE_AN_ATTRIBUTE_WHILE_USING_A_PRIVATE_STORE_OR_WORKSHOP); + return; + } + + if (player.getActiveTradeList() != null) + { + player.sendPacket(SystemMessageId.YOU_CANNOT_CHANGE_ATTRIBUTES_WHILE_EXCHANGING); + return; + } + + if (!item.isWeapon()) + { + player.setActiveEnchantAttrItemId(0); + player.sendPacket(new ExChangeAttributeItemList(player, _attributeOID)); + return; + } + + if (_newAttributeID == -1) + { + player.setActiveEnchantAttrItemId(0); + player.sendPacket(new ExChangeAttributeItemList(player, _attributeOID)); + return; + } + L2ItemInstance attribute = player.getInventory().getItemByObjectId(_attributeOID); + player.getInventory().destroyItem("ChangingAttribute", _attributeOID, 1, player, null); + + if (Rnd.get(100) < Config.CHANGE_CHANCE_ELEMENT) + { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_S_S2_ATTRIBUTE_HAS_SUCCESSFULLY_CHANGED_TO_S3_ATTRIBUTE); + sm.addItemName(item); + sm.addElemental(item.getAttackElementType()); + sm.addElemental(_newAttributeID); + + item.changeAttribute((byte) _newAttributeID, item.getAttackElementPower()); + if (item.isEquipped()) + { + item.updateElementAttrBonus(player); + } + + player.sendPacket(sm); + player.sendPacket(new ExChangeAttributeOk()); + player.sendPacket(new UserInfo(player)); + } + else + { + player.sendPacket(new ExChangeAttributeFail()); + player.sendPacket(SystemMessageId.CHANGING_ATTRIBUTES_HAS_BEEN_FAILED); + } + + // send packets + player.sendPacket(new ExStorageMaxCount(player)); + InventoryUpdate iu = new InventoryUpdate(); + iu.addModifiedItem(item); + if (player.getInventory().getItemByObjectId(_attributeOID) == null) + { + iu.addRemovedItem(attribute); + } + else + { + iu.addModifiedItem(attribute); + } + player.sendPacket(iu); + + player.setActiveEnchantAttrItemId(0); + } + + @Override + public String getType() + { + return _C__D0_B7_SENDCHANGEATTRIBUTETARGETITEM; + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendChangeAttributeTargetItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendChangeAttributeTargetItem.java new file mode 100644 index 0000000000..e2219e36fa --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendChangeAttributeTargetItem.java @@ -0,0 +1,59 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.clientpackets; + +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.network.serverpackets.ExChangeAttributeInfo; + +/** + * @author Erlandys + */ +public class SendChangeAttributeTargetItem extends L2GameClientPacket +{ + + private static final String _C__D0_B0_SENDCHANGEATTRIBUTETARGETITEM = "[C] D0:B0 SendChangeAttributeTargetItem"; + int _elementOID; + int _itemOID; + + @Override + protected void readImpl() + { + _elementOID = readD(); + _itemOID = readD(); + } + + @Override + protected void runImpl() + { + L2PcInstance player = getClient().getActiveChar(); + if (player == null) + { + return; + } + L2ItemInstance item = player.getInventory().getItemByObjectId(_itemOID); + if (item == null) + { + return; + } + player.sendPacket(new ExChangeAttributeInfo(_elementOID, _itemOID, item.getAttackElementType())); + } + + @Override + public String getType() + { + return _C__D0_B0_SENDCHANGEATTRIBUTETARGETITEM; + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/ConfirmMenteeAdd.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/ConfirmMenteeAdd.java index 23226c1d92..0225eed26c 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/ConfirmMenteeAdd.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/ConfirmMenteeAdd.java @@ -85,7 +85,7 @@ public class ConfirmMenteeAdd extends L2GameClientPacket MentorManager.getInstance().addMentor(mentor.getObjectId(), mentee.getObjectId()); // Notify to scripts - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerMenteeAdd(mentor, mentee), mentor, mentee); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerMenteeAdd(mentor, mentee), mentee); mentor.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.FROM_NOW_ON_S1_WILL_BE_YOUR_MENTEE).addCharName(mentee)); mentor.sendPacket(new ExMentorList(mentor)); diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeFail.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeFail.java new file mode 100644 index 0000000000..20e5e753b5 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeFail.java @@ -0,0 +1,32 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +/** + * @author Erlandys + */ +public class ExChangeAttributeFail extends L2GameServerPacket +{ + public ExChangeAttributeFail() + { + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x116); + } +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeInfo.java new file mode 100644 index 0000000000..316908a66a --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeInfo.java @@ -0,0 +1,62 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +/** + * @author Erlandys + */ +public class ExChangeAttributeInfo extends L2GameServerPacket +{ + private final int itemOID; + private final int attributeOID; + private final int attributes; + + public ExChangeAttributeInfo(int _attributeOID, int _itemOID, int _attribute) + { + itemOID = _itemOID; + attributeOID = _attributeOID; + switch (_attribute) + { + case 0: + attributes = -2; + break; + case 1: + attributes = -3; + break; + case 2: + attributes = -5; + break; + case 3: + attributes = -9; + break; + case 4: + attributes = -17; + break; + default: + attributes = -33; + break; + } + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x114); + writeD(attributeOID); + writeD(attributes); + + } +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeItemList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeItemList.java new file mode 100644 index 0000000000..7f3f497b73 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeItemList.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +import java.util.ArrayList; + +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; + +/** + * @author Erlandys + */ +public class ExChangeAttributeItemList extends AbstractItemPacket +{ + private final ArrayList _itemsList; + private final int _itemOID; + + public ExChangeAttributeItemList(L2PcInstance player, int itemOID) + { + _itemsList = new ArrayList<>(); + for (L2ItemInstance item : player.getInventory().getItems()) + { + if (item.isWeapon()) + { + if (item.getAttackElementPower() > 0) + { + _itemsList.add(item); + } + } + } + _itemOID = itemOID; + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x113); + writeD(_itemOID); + writeD(_itemsList.size()); + for (L2ItemInstance item : _itemsList) + { + writeItem(item); + } + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeOk.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeOk.java new file mode 100644 index 0000000000..b210c3bb9b --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExChangeAttributeOk.java @@ -0,0 +1,32 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +/** + * @author Erlandys + */ +public class ExChangeAttributeOk extends L2GameServerPacket +{ + public ExChangeAttributeOk() + { + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x115); + } +}