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())