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);
+ }
+}