diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_01.0_Ertheia/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..a7b1195803
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
index 4acde36f51..2aed7d117a 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
@@ -59,6 +59,7 @@ import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -260,6 +261,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index d048b07a9c..0000000000
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_02.5_Underground/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..a7b1195803
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_02.5_Underground/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
index b0b88aaff1..4feb00d33d 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index d048b07a9c..0000000000
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_03.0_Helios/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..a7b1195803
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_03.0_Helios/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
index b0b88aaff1..4feb00d33d 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index d048b07a9c..0000000000
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..a7b1195803
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
index 5b14b267eb..667c9e9dc6 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
@@ -60,6 +60,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -265,6 +266,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 03eaef5059..0000000000
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_05.0_Salvation/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..2974b6247a
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
index 8cfe1d641e..fc2f9a71e1 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 1f812d4d6d..0000000000
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 15e3f20953..b2e04ef81a 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -304,7 +305,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -315,7 +316,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -323,30 +324,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_05.5_EtinasFate/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..2974b6247a
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
index 8cfe1d641e..fc2f9a71e1 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 1f812d4d6d..0000000000
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 15e3f20953..b2e04ef81a 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -304,7 +305,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -315,7 +316,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -323,30 +324,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_06.0_Fafurion/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..7db53fd427
--- /dev/null
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
index 9279f8e200..fafc620465 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -267,6 +268,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
similarity index 55%
rename from L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Elementals.java
rename to L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
index a7cf426e35..0d710a0252 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.l2jmobius.gameserver.model;
+package org.l2jmobius.gameserver.data.xml;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.w3c.dom.Document;
-public class Elementals
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.items.type.CrystalType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
public static final int FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5;
@@ -94,103 +91,82 @@ public class Elementals
{Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
{Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
{Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
};
/* @formatter:on */
- public enum ElementalItemType
+ protected ElementalAttributeData()
{
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
+ load();
}
- public enum ElementalItems
+ @Override
+ public void load()
{
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
}
- public static byte getItemElement(int itemId)
+ @Override
+ public void parseDocument(Document doc, File f)
{
- final ElementalItems item = TABLE.get(itemId);
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._element;
+ return item.getElement();
}
- return NONE;
+ return AttributeType.NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ELEMENTAL_ITEMS.get(itemId);
}
- public static int getMaxElementLevel(int itemId)
+ public int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._type._maxLevel;
+ return item.getType().getMaxLevel();
}
return -1;
}
- public static boolean isSuccess(ItemInstance item, int stoneId)
+ public boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
+ {
+ if (!targetItem.isElementable())
+ {
+ return false;
+ }
+
+ if ((ELEMENTAL_ITEMS.get(stoneId).getType() == ElementalItemType.JEWEL) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
{
int row = -1;
int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5;
break;
}
+ case R110:
+ {
+ row = 6;
+ break;
+ }
}
- switch (TABLE.get(stoneId)._type)
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
{
- case Stone:
+ case STONE:
{
column = item.isWeapon() ? 0 : 1;
break;
}
- case Crystal:
+ case CRYSTAL:
{
column = item.isWeapon() ? 2 : 3;
break;
}
- case StoneSuper:
+ case STONE_SUPER:
{
column = item.isWeapon() ? 4 : 5;
break;
}
- case CrystalSuper:
+ case CRYSTAL_SUPER:
{
column = item.isWeapon() ? 6 : 7;
break;
}
- case Jewel:
+ case JEWEL:
{
column = item.isWeapon() ? 8 : 9;
break;
@@ -262,4 +243,14 @@ public class Elementals
}
return true;
}
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
}
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 411955e1d2..0000000000
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-import org.l2jmobius.gameserver.model.items.type.CrystalType;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- // jewels are only for R110 grade
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
- {
- if (!targetItem.isElementable())
- {
- return false;
- }
-
- if ((TABLE.get(stoneId)._type == ElementalItemType.Jewel) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
- {
- return false;
- }
-
- return true;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- case R110:
- {
- row = 6;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index e47c6b29fc..44092cfbe0 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
- if (!Elementals.isElementableWithStone(item, stone.getItem().getId()))
+ if (!ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getItem().getId()))
{
client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class);
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index b1fbbded82..7369bcc6b0 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
{
- if (Elementals.isElementableWithStone(item, stone.getId()))
+ if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{
_items.add(item.getObjectId());
}
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..7db53fd427
--- /dev/null
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
index b0d55f5100..9d7e00eafd 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -270,6 +271,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
similarity index 55%
rename from L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Elementals.java
rename to L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
index a7cf426e35..0d710a0252 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.l2jmobius.gameserver.model;
+package org.l2jmobius.gameserver.data.xml;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.w3c.dom.Document;
-public class Elementals
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.items.type.CrystalType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
public static final int FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5;
@@ -94,103 +91,82 @@ public class Elementals
{Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
{Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
{Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
};
/* @formatter:on */
- public enum ElementalItemType
+ protected ElementalAttributeData()
{
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
+ load();
}
- public enum ElementalItems
+ @Override
+ public void load()
{
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
}
- public static byte getItemElement(int itemId)
+ @Override
+ public void parseDocument(Document doc, File f)
{
- final ElementalItems item = TABLE.get(itemId);
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._element;
+ return item.getElement();
}
- return NONE;
+ return AttributeType.NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ELEMENTAL_ITEMS.get(itemId);
}
- public static int getMaxElementLevel(int itemId)
+ public int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._type._maxLevel;
+ return item.getType().getMaxLevel();
}
return -1;
}
- public static boolean isSuccess(ItemInstance item, int stoneId)
+ public boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
+ {
+ if (!targetItem.isElementable())
+ {
+ return false;
+ }
+
+ if ((ELEMENTAL_ITEMS.get(stoneId).getType() == ElementalItemType.JEWEL) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
{
int row = -1;
int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5;
break;
}
+ case R110:
+ {
+ row = 6;
+ break;
+ }
}
- switch (TABLE.get(stoneId)._type)
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
{
- case Stone:
+ case STONE:
{
column = item.isWeapon() ? 0 : 1;
break;
}
- case Crystal:
+ case CRYSTAL:
{
column = item.isWeapon() ? 2 : 3;
break;
}
- case StoneSuper:
+ case STONE_SUPER:
{
column = item.isWeapon() ? 4 : 5;
break;
}
- case CrystalSuper:
+ case CRYSTAL_SUPER:
{
column = item.isWeapon() ? 6 : 7;
break;
}
- case Jewel:
+ case JEWEL:
{
column = item.isWeapon() ? 8 : 9;
break;
@@ -262,4 +243,14 @@ public class Elementals
}
return true;
}
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
}
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 411955e1d2..0000000000
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-import org.l2jmobius.gameserver.model.items.type.CrystalType;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- // jewels are only for R110 grade
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
- {
- if (!targetItem.isElementable())
- {
- return false;
- }
-
- if ((TABLE.get(stoneId)._type == ElementalItemType.Jewel) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
- {
- return false;
- }
-
- return true;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- case R110:
- {
- row = 6;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index e47c6b29fc..44092cfbe0 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
- if (!Elementals.isElementableWithStone(item, stone.getItem().getId()))
+ if (!ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getItem().getId()))
{
client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class);
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index b1fbbded82..7369bcc6b0 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
{
- if (Elementals.isElementableWithStone(item, stone.getId()))
+ if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{
_items.add(item.getObjectId());
}
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_08.2_Homunculus/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..7db53fd427
--- /dev/null
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
index 15079f96f7..f653b10017 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -270,6 +271,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
similarity index 55%
rename from L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Elementals.java
rename to L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
index a7cf426e35..0d710a0252 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.l2jmobius.gameserver.model;
+package org.l2jmobius.gameserver.data.xml;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.w3c.dom.Document;
-public class Elementals
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.items.type.CrystalType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
public static final int FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5;
@@ -94,103 +91,82 @@ public class Elementals
{Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
{Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
{Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
};
/* @formatter:on */
- public enum ElementalItemType
+ protected ElementalAttributeData()
{
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
+ load();
}
- public enum ElementalItems
+ @Override
+ public void load()
{
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
}
- public static byte getItemElement(int itemId)
+ @Override
+ public void parseDocument(Document doc, File f)
{
- final ElementalItems item = TABLE.get(itemId);
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._element;
+ return item.getElement();
}
- return NONE;
+ return AttributeType.NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ELEMENTAL_ITEMS.get(itemId);
}
- public static int getMaxElementLevel(int itemId)
+ public int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._type._maxLevel;
+ return item.getType().getMaxLevel();
}
return -1;
}
- public static boolean isSuccess(ItemInstance item, int stoneId)
+ public boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
+ {
+ if (!targetItem.isElementable())
+ {
+ return false;
+ }
+
+ if ((ELEMENTAL_ITEMS.get(stoneId).getType() == ElementalItemType.JEWEL) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
{
int row = -1;
int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5;
break;
}
+ case R110:
+ {
+ row = 6;
+ break;
+ }
}
- switch (TABLE.get(stoneId)._type)
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
{
- case Stone:
+ case STONE:
{
column = item.isWeapon() ? 0 : 1;
break;
}
- case Crystal:
+ case CRYSTAL:
{
column = item.isWeapon() ? 2 : 3;
break;
}
- case StoneSuper:
+ case STONE_SUPER:
{
column = item.isWeapon() ? 4 : 5;
break;
}
- case CrystalSuper:
+ case CRYSTAL_SUPER:
{
column = item.isWeapon() ? 6 : 7;
break;
}
- case Jewel:
+ case JEWEL:
{
column = item.isWeapon() ? 8 : 9;
break;
@@ -262,4 +243,14 @@ public class Elementals
}
return true;
}
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
}
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 411955e1d2..0000000000
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-import org.l2jmobius.gameserver.model.items.type.CrystalType;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- // jewels are only for R110 grade
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
- {
- if (!targetItem.isElementable())
- {
- return false;
- }
-
- if ((TABLE.get(stoneId)._type == ElementalItemType.Jewel) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
- {
- return false;
- }
-
- return true;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- case R110:
- {
- row = 6;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index e47c6b29fc..44092cfbe0 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
- if (!Elementals.isElementableWithStone(item, stone.getItem().getId()))
+ if (!ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getItem().getId()))
{
client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class);
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index b1fbbded82..7369bcc6b0 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
{
- if (Elementals.isElementableWithStone(item, stone.getId()))
+ if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{
_items.add(item.getObjectId());
}
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..7db53fd427
--- /dev/null
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
index 826309c04d..2a435512a6 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
@@ -63,6 +63,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -271,6 +272,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
similarity index 55%
rename from L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Elementals.java
rename to L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
index a7cf426e35..0d710a0252 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.l2jmobius.gameserver.model;
+package org.l2jmobius.gameserver.data.xml;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.w3c.dom.Document;
-public class Elementals
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.items.type.CrystalType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
public static final int FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5;
@@ -94,103 +91,82 @@ public class Elementals
{Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
{Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
{Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
};
/* @formatter:on */
- public enum ElementalItemType
+ protected ElementalAttributeData()
{
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
+ load();
}
- public enum ElementalItems
+ @Override
+ public void load()
{
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
}
- public static byte getItemElement(int itemId)
+ @Override
+ public void parseDocument(Document doc, File f)
{
- final ElementalItems item = TABLE.get(itemId);
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._element;
+ return item.getElement();
}
- return NONE;
+ return AttributeType.NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ELEMENTAL_ITEMS.get(itemId);
}
- public static int getMaxElementLevel(int itemId)
+ public int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
if (item != null)
{
- return item._type._maxLevel;
+ return item.getType().getMaxLevel();
}
return -1;
}
- public static boolean isSuccess(ItemInstance item, int stoneId)
+ public boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
+ {
+ if (!targetItem.isElementable())
+ {
+ return false;
+ }
+
+ if ((ELEMENTAL_ITEMS.get(stoneId).getType() == ElementalItemType.JEWEL) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
{
int row = -1;
int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5;
break;
}
+ case R110:
+ {
+ row = 6;
+ break;
+ }
}
- switch (TABLE.get(stoneId)._type)
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
{
- case Stone:
+ case STONE:
{
column = item.isWeapon() ? 0 : 1;
break;
}
- case Crystal:
+ case CRYSTAL:
{
column = item.isWeapon() ? 2 : 3;
break;
}
- case StoneSuper:
+ case STONE_SUPER:
{
column = item.isWeapon() ? 4 : 5;
break;
}
- case CrystalSuper:
+ case CRYSTAL_SUPER:
{
column = item.isWeapon() ? 6 : 7;
break;
}
- case Jewel:
+ case JEWEL:
{
column = item.isWeapon() ? 8 : 9;
break;
@@ -262,4 +243,14 @@ public class Elementals
}
return true;
}
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
}
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index 411955e1d2..0000000000
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-import org.l2jmobius.gameserver.model.items.type.CrystalType;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- {Config.R110_WEAPON_STONE, Config.R110_ARMOR_STONE, Config.R110_WEAPON_CRYSTAL, Config.R110_ARMOR_CRYSTAL, Config.R110_WEAPON_STONE_SUPER, Config.R110_ARMOR_STONE_SUPER, Config.R110_WEAPON_CRYSTAL_SUPER, Config.R110_ARMOR_CRYSTAL_SUPER, Config.R110_WEAPON_JEWEL, Config.R110_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- attributePracticeFireStone(FIRE, 48169, ElementalItemType.Stone, 0),
-
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- // jewels are only for R110 grade
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0),
-
- // GoD+ Stones
- GoD_22635(FIRE, 22635, ElementalItemType.Stone, 0),
- GoD_22636(WATER, 22636, ElementalItemType.Stone, 0),
- GoD_22637(EARTH, 22637, ElementalItemType.Stone, 0),
- GoD_22638(WIND, 22638, ElementalItemType.Stone, 0),
- GoD_22639(DARK, 22639, ElementalItemType.Stone, 0),
- GoD_22640(HOLY, 22640, ElementalItemType.Stone, 0),
- GoD_22919(FIRE, 22919, ElementalItemType.Stone, 0),
- GoD_22920(WATER, 22920, ElementalItemType.Stone, 0),
- GoD_22921(EARTH, 22921, ElementalItemType.Stone, 0),
- GoD_22922(WIND, 22922, ElementalItemType.Stone, 0),
- GoD_22923(DARK, 22923, ElementalItemType.Stone, 0),
- GoD_22924(HOLY, 22924, ElementalItemType.Stone, 0),
- GoD_33481(FIRE, 33481, ElementalItemType.StoneSuper, 0),
- GoD_33482(WATER, 33482, ElementalItemType.StoneSuper, 0),
- GoD_33483(EARTH, 33483, ElementalItemType.StoneSuper, 0),
- GoD_33484(WIND, 33484, ElementalItemType.StoneSuper, 0),
- GoD_33485(DARK, 33485, ElementalItemType.StoneSuper, 0),
- GoD_33486(HOLY, 33486, ElementalItemType.StoneSuper, 0),
- GoD_33863(FIRE, 33863, ElementalItemType.StoneSuper, 60),
- GoD_33864(WATER, 33864, ElementalItemType.StoneSuper, 60),
- GoD_33865(EARTH, 33865, ElementalItemType.StoneSuper, 60),
- GoD_33866(WIND, 33866, ElementalItemType.StoneSuper, 60),
- GoD_33867(DARK, 33867, ElementalItemType.StoneSuper, 60),
- GoD_33868(HOLY, 33868, ElementalItemType.StoneSuper, 60),
- GoD_33869(FIRE, 33869, ElementalItemType.StoneSuper, 150),
- GoD_33870(WATER, 33870, ElementalItemType.StoneSuper, 150),
- GoD_33871(EARTH, 33871, ElementalItemType.StoneSuper, 150),
- GoD_33872(WIND, 33872, ElementalItemType.StoneSuper, 150),
- GoD_33873(DARK, 33873, ElementalItemType.StoneSuper, 150),
- GoD_33874(HOLY, 33874, ElementalItemType.StoneSuper, 150),
- GoD_34661(FIRE, 34661, ElementalItemType.StoneSuper, 60),
- GoD_34662(WATER, 34662, ElementalItemType.StoneSuper, 60),
- GoD_34663(EARTH, 34663, ElementalItemType.StoneSuper, 60),
- GoD_34664(WIND, 34664, ElementalItemType.StoneSuper, 60),
- GoD_34665(DARK, 34665, ElementalItemType.StoneSuper, 60),
- GoD_34666(HOLY, 34666, ElementalItemType.StoneSuper, 60),
- GoD_34667(FIRE, 34667, ElementalItemType.StoneSuper, 150),
- GoD_34668(WATER, 34668, ElementalItemType.StoneSuper, 150),
- GoD_34669(EARTH, 34669, ElementalItemType.StoneSuper, 150),
- GoD_34670(WIND, 34670, ElementalItemType.StoneSuper, 150),
- GoD_34671(DARK, 34671, ElementalItemType.StoneSuper, 150),
- GoD_34672(HOLY, 34672, ElementalItemType.StoneSuper, 150),
- GoD_34790(FIRE, 34790, ElementalItemType.Stone, 0),
- GoD_34791(WATER, 34791, ElementalItemType.Stone, 0),
- GoD_34792(EARTH, 34792, ElementalItemType.Stone, 0),
- GoD_34793(WIND, 34793, ElementalItemType.Stone, 0),
- GoD_34794(DARK, 34794, ElementalItemType.Stone, 0),
- GoD_34795(HOLY, 34795, ElementalItemType.Stone, 0),
- GoD_35729(FIRE, 35729, ElementalItemType.StoneSuper, 60),
- GoD_35730(WATER, 35730, ElementalItemType.StoneSuper, 60),
- GoD_35731(EARTH, 35731, ElementalItemType.StoneSuper, 60),
- GoD_35732(WIND, 35732, ElementalItemType.StoneSuper, 60),
- GoD_35733(DARK, 35733, ElementalItemType.StoneSuper, 60),
- GoD_35734(HOLY, 35734, ElementalItemType.StoneSuper, 60),
- GoD_35735(FIRE, 35735, ElementalItemType.StoneSuper, 150),
- GoD_35736(WATER, 35736, ElementalItemType.StoneSuper, 150),
- GoD_35737(EARTH, 35737, ElementalItemType.StoneSuper, 150),
- GoD_35738(WIND, 35738, ElementalItemType.StoneSuper, 150),
- GoD_35739(DARK, 35739, ElementalItemType.StoneSuper, 150),
- GoD_35740(HOLY, 35740, ElementalItemType.StoneSuper, 150),
- GoD_36960(FIRE, 36960, ElementalItemType.StoneSuper, 60),
- GoD_36961(WATER, 36961, ElementalItemType.StoneSuper, 60),
- GoD_36962(EARTH, 36962, ElementalItemType.StoneSuper, 60),
- GoD_36963(WIND, 36963, ElementalItemType.StoneSuper, 60),
- GoD_36964(DARK, 36964, ElementalItemType.StoneSuper, 60),
- GoD_36965(HOLY, 36965, ElementalItemType.StoneSuper, 60),
- GoD_36966(FIRE, 36966, ElementalItemType.StoneSuper, 150),
- GoD_36967(WATER, 36967, ElementalItemType.StoneSuper, 150),
- GoD_36968(EARTH, 36968, ElementalItemType.StoneSuper, 150),
- GoD_36969(WIND, 36969, ElementalItemType.StoneSuper, 150),
- GoD_36970(DARK, 36970, ElementalItemType.StoneSuper, 150),
- GoD_36971(HOLY, 36971, ElementalItemType.StoneSuper, 150),
- GoD_37499(FIRE, 37499, ElementalItemType.Stone, 0),
- GoD_37500(WATER, 37500, ElementalItemType.Stone, 0),
- GoD_37501(EARTH, 37501, ElementalItemType.Stone, 0),
- GoD_37502(WIND, 37502, ElementalItemType.Stone, 0),
- GoD_37503(DARK, 37503, ElementalItemType.Stone, 0),
- GoD_37504(HOLY, 37504, ElementalItemType.Stone, 0),
-
- // GoD+ Crystals
- GoD_22641(FIRE, 22641, ElementalItemType.Crystal, 0),
- GoD_22642(WATER, 22642, ElementalItemType.Crystal, 0),
- GoD_22643(EARTH, 22643, ElementalItemType.Crystal, 0),
- GoD_22644(WIND, 22644, ElementalItemType.Crystal, 0),
- GoD_22645(DARK, 22645, ElementalItemType.Crystal, 0),
- GoD_22646(HOLY, 22646, ElementalItemType.Crystal, 0),
- GoD_22925(FIRE, 22925, ElementalItemType.Crystal, 0),
- GoD_22926(WATER, 22926, ElementalItemType.Crystal, 0),
- GoD_22927(EARTH, 22927, ElementalItemType.Crystal, 0),
- GoD_22928(WIND, 22928, ElementalItemType.Crystal, 0),
- GoD_22929(DARK, 22929, ElementalItemType.Crystal, 0),
- GoD_22930(HOLY, 22930, ElementalItemType.Crystal, 0),
- GoD_33487(FIRE, 33487, ElementalItemType.CrystalSuper, 0),
- GoD_33488(WATER, 33488, ElementalItemType.CrystalSuper, 0),
- GoD_33489(EARTH, 33489, ElementalItemType.CrystalSuper, 0),
- GoD_33490(WIND, 33490, ElementalItemType.CrystalSuper, 0),
- GoD_33491(DARK, 33491, ElementalItemType.CrystalSuper, 0),
- GoD_33492(HOLY, 33492, ElementalItemType.CrystalSuper, 0),
- GoD_34796(FIRE, 34796, ElementalItemType.Crystal, 0),
- GoD_34797(WATER, 34797, ElementalItemType.Crystal, 0),
- GoD_34798(EARTH, 34798, ElementalItemType.Crystal, 0),
- GoD_34799(WIND, 34799, ElementalItemType.Crystal, 0),
- GoD_34800(DARK, 34800, ElementalItemType.Crystal, 0),
- GoD_34801(HOLY, 34801, ElementalItemType.Crystal, 0),
- GoD_36972(FIRE, 36972, ElementalItemType.CrystalSuper, 0),
- GoD_36973(WATER, 36973, ElementalItemType.CrystalSuper, 0),
- GoD_36974(EARTH, 36974, ElementalItemType.CrystalSuper, 0),
- GoD_36975(WIND, 36975, ElementalItemType.CrystalSuper, 0),
- GoD_36976(DARK, 36976, ElementalItemType.CrystalSuper, 0),
- GoD_36977(HOLY, 36977, ElementalItemType.CrystalSuper, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isElementableWithStone(ItemInstance targetItem, int stoneId)
- {
- if (!targetItem.isElementable())
- {
- return false;
- }
-
- if ((TABLE.get(stoneId)._type == ElementalItemType.Jewel) && (targetItem.getItem().getCrystalType() != CrystalType.R110))
- {
- return false;
- }
-
- return true;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- case R110:
- {
- row = 6;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index e47c6b29fc..44092cfbe0 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
- if (!Elementals.isElementableWithStone(item, stone.getItem().getId()))
+ if (!ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getItem().getId()))
{
client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class);
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index b1fbbded82..7369bcc6b0 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
{
- if (Elementals.isElementableWithStone(item, stone.getId()))
+ if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{
_items.add(item.getObjectId());
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..bd8d0f8547
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..60ecf5e38f
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
index 4aa6b7ef14..e9547bbfda 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
@@ -55,6 +55,7 @@ import org.l2jmobius.gameserver.data.xml.BuyListData;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -250,6 +251,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
OptionData.getInstance();
EnchantItemHPBonusData.getInstance();
MerchantPriceConfigTable.getInstance().loadInstances();
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..3b09c0cbb2
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,120 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.Elementals;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ int elementalId = Elementals.NONE;
+ switch (set.getString("elemental"))
+ {
+ case "FIRE":
+ {
+ elementalId = Elementals.FIRE;
+ break;
+ }
+ case "WATER":
+ {
+ elementalId = Elementals.WATER;
+ break;
+ }
+ case "WIND":
+ {
+ elementalId = Elementals.WIND;
+ break;
+ }
+ case "EARTH":
+ {
+ elementalId = Elementals.EARTH;
+ break;
+ }
+ case "HOLY":
+ {
+ elementalId = Elementals.HOLY;
+ break;
+ }
+ case "DARK":
+ {
+ elementalId = Elementals.DARK;
+ break;
+ }
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, elementalId, set.getEnum("type", ElementalItemType.class)));
+ }));
+ }
+
+ public ElementalItemHolder getElementalItem(int itemId)
+ {
+ return ELEMENTAL_ITEMS.getOrDefault(itemId, null);
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+
+}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..e5ffa23a0d
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ ROUGH_ORE(3),
+ CRYSTAL(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Elementals.java
index 8dcbbba809..614fe6177c 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Elementals.java
@@ -16,24 +16,14 @@
*/
package org.l2jmobius.gameserver.model;
-import java.util.HashMap;
-import java.util.Map;
-
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.stats.functions.FuncAdd;
public class Elementals
{
- private static final Map TABLE = new HashMap<>();
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
public static final byte NONE = -1;
public static final byte FIRE = 0;
public static final byte WATER = 1;
@@ -84,87 +74,21 @@ public class Elementals
// TODO: Higher stones
};
- public enum ElementalItemType
- {
- Stone(3),
- Roughore(3),
- Crystal(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- private ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone),
- waterStone(WATER, 9547, ElementalItemType.Stone),
- windStone(WIND, 9549, ElementalItemType.Stone),
- earthStone(EARTH, 9548, ElementalItemType.Stone),
- divineStone(HOLY, 9551, ElementalItemType.Stone),
- darkStone(DARK, 9550, ElementalItemType.Stone),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Roughore),
- waterRoughtore(WATER, 10522, ElementalItemType.Roughore),
- windRoughtore(WIND, 10524, ElementalItemType.Roughore),
- earthRoughtore(EARTH, 10523, ElementalItemType.Roughore),
- divineRoughtore(HOLY, 10526, ElementalItemType.Roughore),
- darkRoughtore(DARK, 10525, ElementalItemType.Roughore),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal),
- windCrystal(WIND, 9555, ElementalItemType.Crystal),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel),
- waterJewel(WATER, 9559, ElementalItemType.Jewel),
- windJewel(WIND, 9561, ElementalItemType.Jewel),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel),
- darkJewel(DARK, 9562, ElementalItemType.Jewel),
-
- // not yet supported by client (Freya pts)
- fireEnergy(FIRE, 9564, ElementalItemType.Energy),
- waterEnergy(WATER, 9565, ElementalItemType.Energy),
- windEnergy(WIND, 9567, ElementalItemType.Energy),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy),
- darkEnergy(DARK, 9568, ElementalItemType.Energy);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
-
- private ElementalItems(byte element, int itemId, ElementalItemType type)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- }
- }
-
public static byte getItemElement(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
- return item != null ? item._element : NONE;
+ final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
+ return item != null ? item.getElementId() : NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public static ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ElementalAttributeData.getInstance().getElementalItem(itemId);
}
public static int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
- return item != null ? item._type._maxLevel : -1;
+ final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
+ return item != null ? item.getType().getMaxLevel() : -1;
}
public static String getElementName(byte element)
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..7627c6480b
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,51 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final byte _elementId;
+ private final ElementalItemType _type;
+
+ public ElementalItemHolder(int itemId, int elementId, ElementalItemType type)
+ {
+ _itemId = itemId;
+ _elementId = (byte) elementId;
+ _type = type;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public byte getElementId()
+ {
+ return _elementId;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index a2ded4dc34..e161188763 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -22,6 +22,7 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -190,25 +191,25 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
boolean success = false;
- switch (Elementals.getItemElemental(stoneId)._type)
+ switch (Elementals.getItemElemental(stoneId).getType())
{
- case Stone:
- case Roughore:
+ case STONE:
+ case ROUGH_ORE:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_STONE;
break;
}
- case Crystal:
+ case CRYSTAL:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_CRYSTAL;
break;
}
- case Jewel:
+ case JEWEL:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_JEWEL;
break;
}
- case Energy:
+ case ENERGY:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_ENERGY;
break;
@@ -278,7 +279,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = Elementals.getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -286,9 +287,9 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return Elementals.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return Elementals.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..bd8d0f8547
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..60ecf5e38f
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
index 419f8f68c6..1885197912 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
@@ -55,6 +55,7 @@ import org.l2jmobius.gameserver.data.xml.BuyListData;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -252,6 +253,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
OptionData.getInstance();
EnchantItemHPBonusData.getInstance();
MerchantPriceConfigTable.getInstance().loadInstances();
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..3b09c0cbb2
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,120 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.Elementals;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ int elementalId = Elementals.NONE;
+ switch (set.getString("elemental"))
+ {
+ case "FIRE":
+ {
+ elementalId = Elementals.FIRE;
+ break;
+ }
+ case "WATER":
+ {
+ elementalId = Elementals.WATER;
+ break;
+ }
+ case "WIND":
+ {
+ elementalId = Elementals.WIND;
+ break;
+ }
+ case "EARTH":
+ {
+ elementalId = Elementals.EARTH;
+ break;
+ }
+ case "HOLY":
+ {
+ elementalId = Elementals.HOLY;
+ break;
+ }
+ case "DARK":
+ {
+ elementalId = Elementals.DARK;
+ break;
+ }
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, elementalId, set.getEnum("type", ElementalItemType.class)));
+ }));
+ }
+
+ public ElementalItemHolder getElementalItem(int itemId)
+ {
+ return ELEMENTAL_ITEMS.getOrDefault(itemId, null);
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+
+}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..e5ffa23a0d
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ ROUGH_ORE(3),
+ CRYSTAL(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Elementals.java
index 8dcbbba809..614fe6177c 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Elementals.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Elementals.java
@@ -16,24 +16,14 @@
*/
package org.l2jmobius.gameserver.model;
-import java.util.HashMap;
-import java.util.Map;
-
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.stats.functions.FuncAdd;
public class Elementals
{
- private static final Map TABLE = new HashMap<>();
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
public static final byte NONE = -1;
public static final byte FIRE = 0;
public static final byte WATER = 1;
@@ -84,87 +74,21 @@ public class Elementals
// TODO: Higher stones
};
- public enum ElementalItemType
- {
- Stone(3),
- Roughore(3),
- Crystal(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- private ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone),
- waterStone(WATER, 9547, ElementalItemType.Stone),
- windStone(WIND, 9549, ElementalItemType.Stone),
- earthStone(EARTH, 9548, ElementalItemType.Stone),
- divineStone(HOLY, 9551, ElementalItemType.Stone),
- darkStone(DARK, 9550, ElementalItemType.Stone),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Roughore),
- waterRoughtore(WATER, 10522, ElementalItemType.Roughore),
- windRoughtore(WIND, 10524, ElementalItemType.Roughore),
- earthRoughtore(EARTH, 10523, ElementalItemType.Roughore),
- divineRoughtore(HOLY, 10526, ElementalItemType.Roughore),
- darkRoughtore(DARK, 10525, ElementalItemType.Roughore),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal),
- windCrystal(WIND, 9555, ElementalItemType.Crystal),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel),
- waterJewel(WATER, 9559, ElementalItemType.Jewel),
- windJewel(WIND, 9561, ElementalItemType.Jewel),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel),
- darkJewel(DARK, 9562, ElementalItemType.Jewel),
-
- // not yet supported by client (Freya pts)
- fireEnergy(FIRE, 9564, ElementalItemType.Energy),
- waterEnergy(WATER, 9565, ElementalItemType.Energy),
- windEnergy(WIND, 9567, ElementalItemType.Energy),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy),
- darkEnergy(DARK, 9568, ElementalItemType.Energy);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
-
- private ElementalItems(byte element, int itemId, ElementalItemType type)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- }
- }
-
public static byte getItemElement(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
- return item != null ? item._element : NONE;
+ final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
+ return item != null ? item.getElementId() : NONE;
}
- public static ElementalItems getItemElemental(int itemId)
+ public static ElementalItemHolder getItemElemental(int itemId)
{
- return TABLE.get(itemId);
+ return ElementalAttributeData.getInstance().getElementalItem(itemId);
}
public static int getMaxElementLevel(int itemId)
{
- final ElementalItems item = TABLE.get(itemId);
- return item != null ? item._type._maxLevel : -1;
+ final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
+ return item != null ? item.getType().getMaxLevel() : -1;
}
public static String getElementName(byte element)
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..7627c6480b
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,51 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final byte _elementId;
+ private final ElementalItemType _type;
+
+ public ElementalItemHolder(int itemId, int elementId, ElementalItemType type)
+ {
+ _itemId = itemId;
+ _elementId = (byte) elementId;
+ _type = type;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public byte getElementId()
+ {
+ return _elementId;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index a7b817bc8a..4035576579 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -22,6 +22,7 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -174,25 +175,25 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return;
}
boolean success = false;
- switch (Elementals.getItemElemental(stoneId)._type)
+ switch (Elementals.getItemElemental(stoneId).getType())
{
- case Stone:
- case Roughore:
+ case STONE:
+ case ROUGH_ORE:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_STONE;
break;
}
- case Crystal:
+ case CRYSTAL:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_CRYSTAL;
break;
}
- case Jewel:
+ case JEWEL:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_JEWEL;
break;
}
- case Energy:
+ case ENERGY:
{
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_ENERGY;
break;
@@ -262,7 +263,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = Elementals.getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -270,9 +271,9 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return Elementals.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return Elementals.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
index b2c2dc0701..6c737ca603 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
@@ -60,6 +60,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -264,6 +265,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
index b2c2dc0701..6c737ca603 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
@@ -60,6 +60,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -264,6 +265,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
index 930732d689..486c60536a 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -265,6 +266,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
index 130f67c84a..9e1d8d7cad 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
@@ -267,6 +268,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
index 178b40411e..fa6b964eae 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
@@ -268,6 +269,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index a7cf426e35..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
index d8ed5cf34e..3188bf4265 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
@@ -271,6 +272,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index a7cf426e35..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Classic_Interlude/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
index 13d394d27f..32b2e8f923 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
@@ -60,6 +60,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -262,6 +263,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index a7cf426e35..0000000000
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index 6be8d70f75..924303471e 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
index bc6f4ff3cb..eadf75a38b 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
@@ -279,6 +280,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index a7cf426e35..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index c28df39a51..a20b42acf9 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/ElementalAttributeData.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/ElementalAttributeData.xml
new file mode 100644
index 0000000000..aac807b64f
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/ElementalAttributeData.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/ElementalAttributeData.xsd b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/ElementalAttributeData.xsd
new file mode 100644
index 0000000000..b3ea44a7b3
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/ElementalAttributeData.xsd
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java
index ab8361d415..d1f56319ad 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java
@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
@@ -287,6 +288,7 @@ public class GameServer
EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance();
+ ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance();
OptionData.getInstance();
VariationData.getInstance();
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
new file mode 100644
index 0000000000..c94cdb55dc
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/ElementalAttributeData.java
@@ -0,0 +1,234 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.data.xml;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+
+/**
+ * @author Mobius
+ */
+public class ElementalAttributeData implements IXmlReader
+{
+ private static final Map ELEMENTAL_ITEMS = new HashMap<>();
+
+ public static final int FIRST_WEAPON_BONUS = 20;
+ public static final int NEXT_WEAPON_BONUS = 5;
+ public static final int ARMOR_BONUS = 6;
+
+ public static final int[] WEAPON_VALUES =
+ {
+ 0, // Level 1
+ 25, // Level 2
+ 75, // Level 3
+ 150, // Level 4
+ 175, // Level 5
+ 225, // Level 6
+ 300, // Level 7
+ 325, // Level 8
+ 375, // Level 9
+ 450, // Level 10
+ 475, // Level 11
+ 525, // Level 12
+ 600, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ public static final int[] ARMOR_VALUES =
+ {
+ 0, // Level 1
+ 12, // Level 2
+ 30, // Level 3
+ 60, // Level 4
+ 72, // Level 5
+ 90, // Level 6
+ 120, // Level 7
+ 132, // Level 8
+ 150, // Level 9
+ 180, // Level 10
+ 192, // Level 11
+ 210, // Level 12
+ 240, // Level 13
+ Integer.MAX_VALUE
+ // TODO: Higher stones
+ };
+
+ /* @formatter:off */
+ private static final int[][] CHANCE_TABLE =
+ {
+ {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
+ {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
+ {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
+ {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
+ {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
+ {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
+ };
+ /* @formatter:on */
+
+ protected ElementalAttributeData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ ELEMENTAL_ITEMS.clear();
+ parseDatapackFile("data/ElementalAttributeData.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ forEach(doc, "list", listNode -> forEach(listNode, "item", itemNode ->
+ {
+ final StatSet set = new StatSet(parseAttributes(itemNode));
+
+ final int id = set.getInt("id");
+ if (ItemTable.getInstance().getTemplate(id) == null)
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Could not find item with id " + id + ".");
+ return;
+ }
+
+ ELEMENTAL_ITEMS.put(id, new ElementalItemHolder(id, set.getEnum("elemental", AttributeType.class), set.getEnum("type", ElementalItemType.class), set.getInt("power", 0)));
+ }));
+ }
+
+ public AttributeType getItemElement(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getElement();
+ }
+ return AttributeType.NONE;
+ }
+
+ public ElementalItemHolder getItemElemental(int itemId)
+ {
+ return ELEMENTAL_ITEMS.get(itemId);
+ }
+
+ public int getMaxElementLevel(int itemId)
+ {
+ final ElementalItemHolder item = ELEMENTAL_ITEMS.get(itemId);
+ if (item != null)
+ {
+ return item.getType().getMaxLevel();
+ }
+ return -1;
+ }
+
+ public boolean isSuccess(ItemInstance item, int stoneId)
+ {
+ int row = -1;
+ int column = -1;
+ switch (item.getItem().getCrystalType())
+ {
+ case S:
+ {
+ row = 0;
+ break;
+ }
+ case S80:
+ {
+ row = 1;
+ break;
+ }
+ case S84:
+ {
+ row = 2;
+ break;
+ }
+ case R:
+ {
+ row = 3;
+ break;
+ }
+ case R95:
+ {
+ row = 4;
+ break;
+ }
+ case R99:
+ {
+ row = 5;
+ break;
+ }
+ }
+
+ switch (ELEMENTAL_ITEMS.get(stoneId).getType())
+ {
+ case STONE:
+ {
+ column = item.isWeapon() ? 0 : 1;
+ break;
+ }
+ case CRYSTAL:
+ {
+ column = item.isWeapon() ? 2 : 3;
+ break;
+ }
+ case STONE_SUPER:
+ {
+ column = item.isWeapon() ? 4 : 5;
+ break;
+ }
+ case CRYSTAL_SUPER:
+ {
+ column = item.isWeapon() ? 6 : 7;
+ break;
+ }
+ case JEWEL:
+ {
+ column = item.isWeapon() ? 8 : 9;
+ break;
+ }
+ }
+ if ((row != -1) && (column != -1))
+ {
+ return Rnd.get(100) < CHANCE_TABLE[row][column];
+ }
+ return true;
+ }
+
+ public static ElementalAttributeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
+ }
+}
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/enums/ElementalItemType.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
new file mode 100644
index 0000000000..4de25131b4
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/enums/ElementalItemType.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.enums;
+
+/**
+ * @author Mobius
+ */
+public enum ElementalItemType
+{
+ STONE(3),
+ STONE_SUPER(3),
+ CRYSTAL(6),
+ CRYSTAL_SUPER(6),
+ JEWEL(9),
+ ENERGY(12);
+
+ private int _maxLevel;
+
+ ElementalItemType(int maxLevel)
+ {
+ _maxLevel = maxLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+}
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Elementals.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Elementals.java
deleted file mode 100644
index a7cf426e35..0000000000
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Elementals.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 org.l2jmobius.gameserver.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
-
-public class Elementals
-{
- private static final Map TABLE = new HashMap<>();
-
- static
- {
- for (ElementalItems item : ElementalItems.values())
- {
- TABLE.put(item._itemId, item);
- }
- }
-
- protected static final byte NONE = -1;
- protected static final byte FIRE = 0;
- protected static final byte WATER = 1;
- protected static final byte WIND = 2;
- protected static final byte EARTH = 3;
- protected static final byte HOLY = 4;
- protected static final byte DARK = 5;
-
- public static final int FIRST_WEAPON_BONUS = 20;
- public static final int NEXT_WEAPON_BONUS = 5;
- public static final int ARMOR_BONUS = 6;
-
- public static final int[] WEAPON_VALUES =
- {
- 0, // Level 1
- 25, // Level 2
- 75, // Level 3
- 150, // Level 4
- 175, // Level 5
- 225, // Level 6
- 300, // Level 7
- 325, // Level 8
- 375, // Level 9
- 450, // Level 10
- 475, // Level 11
- 525, // Level 12
- 600, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- public static final int[] ARMOR_VALUES =
- {
- 0, // Level 1
- 12, // Level 2
- 30, // Level 3
- 60, // Level 4
- 72, // Level 5
- 90, // Level 6
- 120, // Level 7
- 132, // Level 8
- 150, // Level 9
- 180, // Level 10
- 192, // Level 11
- 210, // Level 12
- 240, // Level 13
- Integer.MAX_VALUE
- // TODO: Higher stones
- };
-
- /* @formatter:off */
- private static final int[][] CHANCE_TABLE =
- {
- {Config.S_WEAPON_STONE, Config.S_ARMOR_STONE, Config.S_WEAPON_CRYSTAL, Config.S_ARMOR_CRYSTAL, Config.S_WEAPON_STONE_SUPER, Config.S_ARMOR_STONE_SUPER, Config.S_WEAPON_CRYSTAL_SUPER, Config.S_ARMOR_CRYSTAL_SUPER, Config.S_WEAPON_JEWEL, Config.S_ARMOR_JEWEL},
- {Config.S80_WEAPON_STONE, Config.S80_ARMOR_STONE, Config.S80_WEAPON_CRYSTAL, Config.S80_ARMOR_CRYSTAL, Config.S80_WEAPON_STONE_SUPER, Config.S80_ARMOR_STONE_SUPER, Config.S80_WEAPON_CRYSTAL_SUPER, Config.S80_ARMOR_CRYSTAL_SUPER, Config.S80_WEAPON_JEWEL, Config.S80_ARMOR_JEWEL},
- {Config.S84_WEAPON_STONE, Config.S84_ARMOR_STONE, Config.S84_WEAPON_CRYSTAL, Config.S84_ARMOR_CRYSTAL, Config.S84_WEAPON_STONE_SUPER, Config.S84_ARMOR_STONE_SUPER, Config.S84_WEAPON_CRYSTAL_SUPER, Config.S84_ARMOR_CRYSTAL_SUPER, Config.S84_WEAPON_JEWEL, Config.S84_ARMOR_JEWEL},
- {Config.R_WEAPON_STONE, Config.R_ARMOR_STONE, Config.R_WEAPON_CRYSTAL, Config.R_ARMOR_CRYSTAL, Config.R_WEAPON_STONE_SUPER, Config.R_ARMOR_STONE_SUPER, Config.R_WEAPON_CRYSTAL_SUPER, Config.R_ARMOR_CRYSTAL_SUPER, Config.R_WEAPON_JEWEL, Config.R_ARMOR_JEWEL},
- {Config.R95_WEAPON_STONE, Config.R95_ARMOR_STONE, Config.R95_WEAPON_CRYSTAL, Config.R95_ARMOR_CRYSTAL, Config.R95_WEAPON_STONE_SUPER, Config.R95_ARMOR_STONE_SUPER, Config.R95_WEAPON_CRYSTAL_SUPER, Config.R95_ARMOR_CRYSTAL_SUPER, Config.R95_WEAPON_JEWEL, Config.R95_ARMOR_JEWEL},
- {Config.R99_WEAPON_STONE, Config.R99_ARMOR_STONE, Config.R99_WEAPON_CRYSTAL, Config.R99_ARMOR_CRYSTAL, Config.R99_WEAPON_STONE_SUPER, Config.R99_ARMOR_STONE_SUPER, Config.R99_WEAPON_CRYSTAL_SUPER, Config.R99_ARMOR_CRYSTAL_SUPER, Config.R99_WEAPON_JEWEL, Config.R99_ARMOR_JEWEL},
- };
- /* @formatter:on */
-
- public enum ElementalItemType
- {
- Stone(3),
- StoneSuper(3),
- Crystal(6),
- CrystalSuper(6),
- Jewel(9),
- Energy(12);
-
- public int _maxLevel;
-
- ElementalItemType(int maxLevel)
- {
- _maxLevel = maxLevel;
- }
- }
-
- public enum ElementalItems
- {
- fireStone(FIRE, 9546, ElementalItemType.Stone, 0),
- waterStone(WATER, 9547, ElementalItemType.Stone, 0),
- windStone(WIND, 9549, ElementalItemType.Stone, 0),
- earthStone(EARTH, 9548, ElementalItemType.Stone, 0),
- divineStone(HOLY, 9551, ElementalItemType.Stone, 0),
- darkStone(DARK, 9550, ElementalItemType.Stone, 0),
-
- fireRoughtore(FIRE, 10521, ElementalItemType.Stone, 0),
- waterRoughtore(WATER, 10522, ElementalItemType.Stone, 0),
- windRoughtore(WIND, 10524, ElementalItemType.Stone, 0),
- earthRoughtore(EARTH, 10523, ElementalItemType.Stone, 0),
- divineRoughtore(HOLY, 10526, ElementalItemType.Stone, 0),
- darkRoughtore(DARK, 10525, ElementalItemType.Stone, 0),
-
- fireCrystal(FIRE, 9552, ElementalItemType.Crystal, 0),
- waterCrystal(WATER, 9553, ElementalItemType.Crystal, 0),
- windCrystal(WIND, 9555, ElementalItemType.Crystal, 0),
- earthCrystal(EARTH, 9554, ElementalItemType.Crystal, 0),
- divineCrystal(HOLY, 9557, ElementalItemType.Crystal, 0),
- darkCrystal(DARK, 9556, ElementalItemType.Crystal, 0),
-
- fireJewel(FIRE, 9558, ElementalItemType.Jewel, 0),
- waterJewel(WATER, 9559, ElementalItemType.Jewel, 0),
- windJewel(WIND, 9561, ElementalItemType.Jewel, 0),
- earthJewel(EARTH, 9560, ElementalItemType.Jewel, 0),
- divineJewel(HOLY, 9563, ElementalItemType.Jewel, 0),
- darkJewel(DARK, 9562, ElementalItemType.Jewel, 0),
-
- fireEnergy(FIRE, 9564, ElementalItemType.Energy, 0),
- waterEnergy(WATER, 9565, ElementalItemType.Energy, 0),
- windEnergy(WIND, 9567, ElementalItemType.Energy, 0),
- earthEnergy(EARTH, 9566, ElementalItemType.Energy, 0),
- divineEnergy(HOLY, 9569, ElementalItemType.Energy, 0),
- darkEnergy(DARK, 9568, ElementalItemType.Energy, 0);
-
- public byte _element;
- public int _itemId;
- public ElementalItemType _type;
- public int _fixedPower;
-
- ElementalItems(byte element, int itemId, ElementalItemType type, int fixedPower)
- {
- _element = element;
- _itemId = itemId;
- _type = type;
- _fixedPower = fixedPower;
- }
- }
-
- public static byte getItemElement(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._element;
- }
- return NONE;
- }
-
- public static ElementalItems getItemElemental(int itemId)
- {
- return TABLE.get(itemId);
- }
-
- public static int getMaxElementLevel(int itemId)
- {
- final ElementalItems item = TABLE.get(itemId);
- if (item != null)
- {
- return item._type._maxLevel;
- }
- return -1;
- }
-
- public static boolean isSuccess(ItemInstance item, int stoneId)
- {
- int row = -1;
- int column = -1;
- switch (item.getItem().getCrystalType())
- {
- case S:
- {
- row = 0;
- break;
- }
- case S80:
- {
- row = 1;
- break;
- }
- case S84:
- {
- row = 2;
- break;
- }
- case R:
- {
- row = 3;
- break;
- }
- case R95:
- {
- row = 4;
- break;
- }
- case R99:
- {
- row = 5;
- break;
- }
- }
-
- switch (TABLE.get(stoneId)._type)
- {
- case Stone:
- {
- column = item.isWeapon() ? 0 : 1;
- break;
- }
- case Crystal:
- {
- column = item.isWeapon() ? 2 : 3;
- break;
- }
- case StoneSuper:
- {
- column = item.isWeapon() ? 4 : 5;
- break;
- }
- case CrystalSuper:
- {
- column = item.isWeapon() ? 6 : 7;
- break;
- }
- case Jewel:
- {
- column = item.isWeapon() ? 8 : 9;
- break;
- }
- }
- if ((row != -1) && (column != -1))
- {
- return Rnd.get(100) < CHANCE_TABLE[row][column];
- }
- return true;
- }
-}
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
new file mode 100644
index 0000000000..d9ea6c6b26
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/holders/ElementalItemHolder.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 org.l2jmobius.gameserver.model.holders;
+
+import org.l2jmobius.gameserver.enums.AttributeType;
+import org.l2jmobius.gameserver.enums.ElementalItemType;
+
+/**
+ * @author Mobius
+ */
+public class ElementalItemHolder
+{
+ private final int _itemId;
+ private final AttributeType _element;
+ private final ElementalItemType _type;
+ private final int _power;
+
+ public ElementalItemHolder(int itemId, AttributeType element, ElementalItemType type, int power)
+ {
+ _itemId = itemId;
+ _element = element;
+ _type = type;
+ _power = power;
+ }
+
+ public int getItemId()
+ {
+ return _itemId;
+ }
+
+ public AttributeType getElement()
+ {
+ return _element;
+ }
+
+ public ElementalItemType getType()
+ {
+ return _type;
+ }
+
+ public int getPower()
+ {
+ return _power;
+ }
+}
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
index e3449844b0..ca742313e6 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestExEnchantItemAttribute.java
@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest;
+import org.l2jmobius.gameserver.model.holders.ElementalItemHolder;
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count);
- AttributeType elementToAdd = AttributeType.findByClientId(Elementals.getItemElement(stoneId));
+ AttributeType elementToAdd = ElementalAttributeData.getInstance().getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
{
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1;
}
- final boolean success = Elementals.isSuccess(item, stone.getId());
+ final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success)
{
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId)
{
- final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
+ final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null)
{
return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon())
{
- return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.WEAPON_VALUES[elementItem.getType().getMaxLevel()];
}
- return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
+ return ElementalAttributeData.ARMOR_VALUES[elementItem.getType().getMaxLevel()];
}
public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)
{
- if (Elementals.getItemElement(stoneId) != -1)
+ if (ElementalAttributeData.getInstance().getItemElement(stoneId) != AttributeType.NONE)
{
- if (Elementals.getItemElemental(stoneId)._fixedPower > 0)
+ if (ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower() > 0)
{
- return Elementals.getItemElemental(stoneId)._fixedPower;
+ return ElementalAttributeData.getInstance().getItemElemental(stoneId).getPower();
}
if (item.isWeapon())
{
if (oldValue == 0)
{
- return Elementals.FIRST_WEAPON_BONUS;
+ return ElementalAttributeData.FIRST_WEAPON_BONUS;
}
- return Elementals.NEXT_WEAPON_BONUS;
+ return ElementalAttributeData.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
{
- return Elementals.ARMOR_BONUS;
+ return ElementalAttributeData.ARMOR_BONUS;
}
}
return 0;
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
index 7991730701..8d67cf3e69 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExChooseInventoryAttributeItem.java
@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType;
-import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{
_itemId = stone.getDisplayId();
_count = stone.getCount();
- _atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId));
+ _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE)
{
throw new IllegalArgumentException("Undefined Atribute item: " + stone);
}
- _level = Elementals.getMaxElementLevel(_itemId);
+ _level = ElementalAttributeData.getInstance().getMaxElementLevel(_itemId);
// Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems())